From: nobody <> Date: Sun, 9 Apr 2000 14:37:29 +0000 (+0000) Subject: This commit was manufactured by cvs2svn to create branch X-Git-Tag: gdb_5_0-2000-04-10-branchpoint X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e15042df387b0b9ca7a71846c77bf784432b0d03;p=thirdparty%2Fbinutils-gdb.git This commit was manufactured by cvs2svn to create branch 'gdb_5_0-2000-04-10-branch'. Sprout from master 2000-04-09 14:37:28 UTC Andrew Cagney 'Rename gdbarch-utils.[hc] to arch-utils.[hc]' Cherrypick from cygnus 2000-02-22 16:18:13 UTC Ian Lance Taylor 'import libiberty from egcs': .cvsignore COPYING COPYING.LIB README bfd/COPYING bfd/ChangeLog-9193 bfd/ChangeLog-9495 bfd/ChangeLog-9697 bfd/PORTING bfd/README bfd/TODO bfd/aout-encap.c bfd/aout-sparcle.c bfd/aout0.c bfd/aout32.c bfd/aout64.c bfd/aoutf1.h bfd/cf-i386lynx.c bfd/cf-m68klynx.c bfd/cf-sparclynx.c bfd/coff-aux.c bfd/coff-pmac.c bfd/coff-svm68k.c bfd/coff-u68k.c bfd/configure.com bfd/corefile.c bfd/cpu-a29k.c bfd/cpu-alpha.c bfd/cpu-arc.c bfd/cpu-d30v.c bfd/cpu-fr30.c bfd/cpu-h8300.c bfd/cpu-i386.c bfd/cpu-i860.c bfd/cpu-i960.c bfd/cpu-m10200.c bfd/cpu-m68k.c bfd/cpu-m88k.c bfd/cpu-mips.c bfd/cpu-powerpc.c bfd/cpu-rs6000.c bfd/cpu-sparc.c bfd/cpu-tic30.c bfd/cpu-tic80.c bfd/cpu-v850.c bfd/cpu-vax.c bfd/cpu-we32k.c bfd/cpu-z8k.c bfd/demo64.c bfd/dep-in.sed bfd/doc/Makefile.am bfd/doc/bfd.texinfo bfd/doc/bfdint.texi bfd/doc/bfdsumm.texi bfd/doc/chew.c bfd/doc/doc.str bfd/doc/makefile.vms bfd/doc/proto.str bfd/ecoffswap.h bfd/elf32.c bfd/elf64.c bfd/format.c bfd/gen-aout.c bfd/genlink.h bfd/go32stub.h bfd/host-aout.c bfd/hosts/alphavms.h bfd/hosts/decstation.h bfd/hosts/delta68.h bfd/hosts/dpx2.h bfd/hosts/hp300bsd.h bfd/hosts/i386bsd.h bfd/hosts/i386linux.h bfd/hosts/i386mach3.h bfd/hosts/i386sco.h bfd/hosts/i860mach3.h bfd/hosts/m68kaux.h bfd/hosts/m68klinux.h bfd/hosts/m88kmach3.h bfd/hosts/mipsbsd.h bfd/hosts/mipsmach3.h bfd/hosts/news-mips.h bfd/hosts/news.h bfd/hosts/pc532mach.h bfd/hosts/riscos.h bfd/hosts/symmetry.h bfd/hosts/tahoe.h bfd/hosts/vaxbsd.h bfd/hosts/vaxult.h bfd/hosts/vaxult2.h bfd/hp300bsd.c bfd/hppa_stubs.h bfd/i386aout.c bfd/i386bsd.c bfd/i386dynix.c bfd/i386freebsd.c bfd/i386mach3.c bfd/i386netbsd.c bfd/init.c bfd/libaout.h bfd/libieee.h bfd/libnlm.h bfd/liboasys.h bfd/lynx-core.c bfd/m68k4knetbsd.c bfd/m68klynx.c bfd/m68knetbsd.c bfd/m88kmach3.c bfd/makefile.vms bfd/mpw-config.in bfd/mpw-make.sed bfd/newsos3.c bfd/nlm.c bfd/nlm32-alpha.c bfd/nlm32-i386.c bfd/nlm32.c bfd/nlm64.c bfd/nlmswap.h bfd/ns32k.h bfd/ns32knetbsd.c bfd/opncls.c bfd/pe-mcore.c bfd/po/Make-in bfd/som.h bfd/sparclynx.c bfd/sparcnetbsd.c bfd/stab-syms.c bfd/stamp-h.in bfd/sysdep.h bfd/targmatch.sed bfd/vaxnetbsd.c config-ml.in config.if config/acinclude.m4 config/mh-a68bsd config/mh-aix386 config/mh-apollo68 config/mh-armpic config/mh-cxux config/mh-cygwin config/mh-decstation config/mh-delta88 config/mh-dgux config/mh-dgux386 config/mh-djgpp config/mh-elfalphapic config/mh-hp300 config/mh-hpux config/mh-hpux8 config/mh-interix config/mh-irix4 config/mh-irix5 config/mh-irix6 config/mh-lynxos config/mh-lynxrs6k config/mh-m68kpic config/mh-mingw32 config/mh-ncr3000 config/mh-ncrsvr43 config/mh-necv4 config/mh-papic config/mh-ppcpic config/mh-riscos config/mh-sco config/mh-solaris config/mh-sparcpic config/mh-sun3 config/mh-sysv config/mh-sysv4 config/mh-sysv5 config/mh-vaxult2 config/mh-x86pic config/mpw-mh-mpw config/mpw/ChangeLog config/mpw/MoveIfChange config/mpw/README config/mpw/forward-include config/mpw/g-mpw-make.sed config/mpw/mpw-touch config/mpw/mpw-true config/mpw/null-command config/mpw/open-brace config/mpw/tr-7to8-src config/mpw/true config/mt-armpic config/mt-d30v config/mt-elfalphapic config/mt-linux config/mt-m68kpic config/mt-netware config/mt-ospace config/mt-papic config/mt-ppcpic config/mt-sparcpic config/mt-v810 config/mt-x86pic etc/ChangeLog etc/Makefile.in etc/add-log.el etc/add-log.vi etc/configbuild.ein etc/configbuild.fig etc/configbuild.jin etc/configbuild.tin etc/configdev.ein etc/configdev.fig etc/configdev.jin etc/configdev.tin etc/configure etc/configure.in etc/configure.texi etc/make-stds.texi etc/standards.texi include/COPYING include/aout/adobe.h include/aout/ar.h include/aout/dynix3.h include/aout/encap.h include/aout/host.h include/aout/hp.h include/aout/hp300hpux.h include/aout/hppa.h include/aout/ranlib.h include/aout/reloc.h include/aout/stab.def include/aout/stab_gnu.h include/aout/sun4.h include/bout.h include/callback.h include/coff/a29k.h include/coff/alpha.h include/coff/apollo.h include/coff/aux-coff.h include/coff/ecoff.h include/coff/go32exe.h include/coff/h8300.h include/coff/h8500.h include/coff/i386.h include/coff/i860.h include/coff/i960.h include/coff/m68k.h include/coff/m88k.h include/coff/mips.h include/coff/powerpc.h include/coff/rs6000.h include/coff/sparc.h include/coff/sym.h include/coff/symconst.h include/coff/tic30.h include/coff/tic80.h include/coff/w65.h include/coff/we32k.h include/coff/z8k.h include/demangle.h include/elf/alpha.h include/elf/arc.h include/elf/d10v.h include/elf/d30v.h include/elf/external.h include/elf/fr30.h include/elf/internal.h include/elf/mn10200.h include/elf/ppc.h include/elf/v850.h include/floatformat.h include/fnmatch.h include/fopen-bin.h include/fopen-same.h include/fopen-vms.h include/gdbm.h include/getopt.h include/ieee.h include/libiberty.h include/mpw/ChangeLog include/mpw/README include/mpw/dir.h include/mpw/dirent.h include/mpw/fcntl.h include/mpw/grp.h include/mpw/mpw.h include/mpw/pwd.h include/mpw/spin.h include/mpw/stat.h include/mpw/sys/file.h include/mpw/sys/param.h include/mpw/sys/resource.h include/mpw/sys/stat.h include/mpw/sys/time.h include/mpw/sys/types.h include/mpw/utime.h include/mpw/varargs.h include/nlm/ChangeLog include/nlm/alpha-ext.h include/nlm/common.h include/nlm/external.h include/nlm/i386-ext.h include/nlm/internal.h include/nlm/ppc-ext.h include/nlm/sparc32-ext.h include/oasys.h include/objalloc.h include/obstack.h include/opcode/a29k.h include/opcode/arc.h include/opcode/arm.h include/opcode/convex.h include/opcode/h8300.h include/opcode/i860.h include/opcode/i960.h include/opcode/m88k.h include/opcode/mn10200.h include/opcode/np1.h include/opcode/ns32k.h include/opcode/pn.h include/opcode/pyr.h include/opcode/sparc.h include/opcode/tahoe.h include/opcode/tic30.h include/opcode/tic80.h include/opcode/v850.h include/opcode/vax.h include/os9k.h include/progress.h include/regs/ChangeLog include/symcat.h install-sh intl/ChangeLog intl/Makefile.in intl/acconfig.h intl/aclocal.m4 intl/bindtextdom.c intl/cat-compat.c intl/config.in intl/configure intl/configure.in intl/dcgettext.c intl/dgettext.c intl/explodename.c intl/finddomain.c intl/gettext.c intl/gettext.h intl/gettextP.h intl/hash-string.h intl/intl-compat.c intl/intlh.inst.in intl/l10nflist.c intl/libgettext.h intl/libintl.glibc intl/linux-msg.sed intl/loadinfo.h intl/loadmsgcat.c intl/localealias.c intl/po2tbl.sed.in intl/textdomain.c intl/xopen-msg.sed libiberty/COPYING.LIB libiberty/README libiberty/acconfig.h libiberty/alloca-conf.h libiberty/alloca.c libiberty/asprintf.c libiberty/atexit.c libiberty/basename.c libiberty/bcmp.c libiberty/bcopy.c libiberty/bzero.c libiberty/calloc.c libiberty/clock.c libiberty/concat.c libiberty/config.h-vms libiberty/config.table libiberty/config/mh-aix libiberty/config/mh-beos libiberty/config/mh-cxux7 libiberty/config/mh-fbsd21 libiberty/config/mh-openedition libiberty/config/mh-windows libiberty/copysign.c libiberty/fdmatch.c libiberty/fnmatch.c libiberty/getcwd.c libiberty/getopt.c libiberty/getopt1.c libiberty/getpagesize.c libiberty/getpwd.c libiberty/hex.c libiberty/index.c libiberty/insque.c libiberty/makefile.vms libiberty/memchr.c libiberty/memcmp.c libiberty/memcpy.c libiberty/memmove.c libiberty/memset.c libiberty/mkstemps.c libiberty/mpw-config.in libiberty/mpw-make.sed libiberty/mpw.c libiberty/msdos.c libiberty/objalloc.c libiberty/obstack.c libiberty/putenv.c libiberty/random.c libiberty/rename.c libiberty/rindex.c libiberty/setenv.c libiberty/sigsetmask.c libiberty/spaces.c libiberty/strcasecmp.c libiberty/strchr.c libiberty/strdup.c libiberty/strerror.c libiberty/strncasecmp.c libiberty/strrchr.c libiberty/strsignal.c libiberty/strstr.c libiberty/strtod.c libiberty/strtol.c libiberty/strtoul.c libiberty/testsuite/Makefile.in libiberty/testsuite/demangle-expected libiberty/testsuite/regress-demangle libiberty/tmpnam.c libiberty/vfork.c libiberty/vfprintf.c libiberty/vmsbuild.com libiberty/vprintf.c libiberty/vsprintf.c libiberty/waitpid.c libiberty/xatexit.c libiberty/xexit.c libiberty/xmemdup.c libiberty/xstrdup.c libiberty/xstrerror.c makefile.vms missing mkinstalldirs move-if-change mpw-README mpw-build.in mpw-config.in mpw-configure mpw-install opcodes/a29k-dis.c opcodes/acinclude.m4 opcodes/arc-dis.c opcodes/arc-opc.c opcodes/cgen-asm.c opcodes/cgen-dis.c opcodes/config.in opcodes/d10v-dis.c opcodes/dep-in.sed opcodes/fr30-desc.c opcodes/fr30-opc.h opcodes/h8300-dis.c opcodes/h8500-dis.c opcodes/h8500-opc.h opcodes/i960-dis.c opcodes/m10200-dis.c opcodes/m10200-opc.c opcodes/m88k-dis.c opcodes/makefile.vms opcodes/mips16-opc.c opcodes/mpw-config.in opcodes/mpw-make.sed opcodes/ns32k-dis.c opcodes/opintl.h opcodes/po/Make-in opcodes/ppc-dis.c opcodes/stamp-h.in opcodes/sysdep.h opcodes/tic80-dis.c opcodes/tic80-opc.c opcodes/v850-dis.c opcodes/v850-opc.c opcodes/vax-dis.c opcodes/w65-dis.c opcodes/w65-opc.h opcodes/z8k-dis.c opcodes/z8k-opc.h opcodes/z8kgen.c setup.com symlink-tree ylwrap Cherrypick from FSF 1999-08-16 19:57:18 UTC Jason Molenda 'import gdb-1999-08-16 snapshot': readline/CHANGELOG readline/CHANGES readline/COPYING readline/INSTALL readline/MANIFEST readline/Makefile.in readline/README readline/acconfig.h readline/aclocal.m4 readline/ansi_stdlib.h readline/callback.c readline/chardefs.h readline/config.h.in readline/configure readline/configure.in readline/doc/Makefile.in readline/doc/hist.texinfo readline/doc/hstech.texinfo readline/doc/hsuser.texinfo readline/doc/manvers.texinfo readline/doc/readline.0 readline/doc/readline.3 readline/doc/rlman.texinfo readline/doc/rltech.texinfo readline/doc/texi2dvi readline/doc/texi2html readline/emacs_keymap.c readline/examples/Inputrc readline/examples/Makefile.in readline/examples/fileman.c readline/examples/histexamp.c readline/examples/manexamp.c readline/examples/rl.c readline/examples/rltest.c readline/examples/rlversion.c readline/funmap.c readline/histexpand.c readline/histlib.h readline/history.c readline/history.h readline/histsearch.c readline/isearch.c readline/keymaps.c readline/keymaps.h readline/kill.c readline/macro.c readline/nls.c readline/parens.c readline/posixdir.h readline/posixjmp.h readline/posixstat.h readline/readline.h readline/rlconf.h readline/rldefs.h readline/rlstdc.h readline/rltty.h readline/rlwinsize.h readline/savestring.c readline/search.c readline/shell.c readline/shlib/Makefile.in readline/support/config.guess readline/support/config.sub readline/support/install.sh readline/support/mkdirs readline/support/mkdist readline/support/shlib-install readline/tcap.h readline/tilde.c readline/tilde.h readline/undo.c readline/util.c readline/vi_keymap.c readline/vi_mode.c readline/xmalloc.c Delete: binutils/ChangeLog binutils/Makefile.am binutils/Makefile.in binutils/NEWS binutils/README binutils/acinclude.m4 binutils/aclocal.m4 binutils/addr2line.1 binutils/addr2line.c binutils/ar.1 binutils/ar.c binutils/arlex.l binutils/arparse.y binutils/arsup.c binutils/arsup.h binutils/binutils.texi binutils/bucomm.c binutils/bucomm.h binutils/budbg.h binutils/coffdump.c binutils/coffgrok.c binutils/coffgrok.h binutils/config.in binutils/configure binutils/configure.com binutils/configure.in binutils/cxxfilt.man binutils/debug.c binutils/debug.h binutils/deflex.l binutils/defparse.y binutils/dep-in.sed binutils/dlltool.c binutils/dlltool.h binutils/dllwrap.c binutils/dyn-string.c binutils/dyn-string.h binutils/filemode.c binutils/ieee.c binutils/is-ranlib.c binutils/is-strip.c binutils/mac-binutils.r binutils/makefile.vms-in binutils/maybe-ranlib.c binutils/maybe-strip.c binutils/mpw-config.in binutils/mpw-make.sed binutils/nlmconv.1 binutils/nlmconv.c binutils/nlmconv.h binutils/nlmheader.y binutils/nm.1 binutils/nm.c binutils/not-ranlib.c binutils/not-strip.c binutils/objcopy.1 binutils/objcopy.c binutils/objdump.1 binutils/objdump.c binutils/po/Make-in binutils/po/POTFILES.in binutils/po/binutils.pot binutils/prdbg.c binutils/ranlib.1 binutils/ranlib.sh binutils/rclex.l binutils/rcparse.y binutils/rdcoff.c binutils/rddbg.c binutils/readelf.c binutils/rename.c binutils/resbin.c binutils/rescoff.c binutils/resrc.c binutils/resres.c binutils/sanity.sh binutils/size.1 binutils/size.c binutils/srconv.c binutils/stabs.c binutils/stamp-h.in binutils/strings.1 binutils/strings.c binutils/strip.1 binutils/sysdump.c binutils/sysinfo.y binutils/syslex.l binutils/sysroff.info binutils/testsuite/ChangeLog binutils/testsuite/binutils-all/ar.exp binutils/testsuite/binutils-all/bintest.s binutils/testsuite/binutils-all/hppa/addendbug.s binutils/testsuite/binutils-all/hppa/freg.s binutils/testsuite/binutils-all/hppa/objdump.exp binutils/testsuite/binutils-all/nm.exp binutils/testsuite/binutils-all/objcopy.exp binutils/testsuite/binutils-all/objdump.exp binutils/testsuite/binutils-all/readelf.exp binutils/testsuite/binutils-all/readelf.h binutils/testsuite/binutils-all/readelf.r binutils/testsuite/binutils-all/readelf.s binutils/testsuite/binutils-all/readelf.ss binutils/testsuite/binutils-all/readelf.wi binutils/testsuite/binutils-all/size.exp binutils/testsuite/binutils-all/testprog.c binutils/testsuite/config/default.exp binutils/testsuite/config/hppa.sed binutils/testsuite/lib/utils-lib.exp binutils/version.c binutils/windres.c binutils/windres.h binutils/winduni.c binutils/winduni.h binutils/wrstabs.c gas/CONTRIBUTORS gas/COPYING gas/ChangeLog gas/ChangeLog-9295 gas/ChangeLog-9697 gas/Makefile.am gas/Makefile.in gas/NEWS gas/README gas/README-vms gas/acinclude.m4 gas/aclocal.m4 gas/app.c gas/as.c gas/as.h gas/asintl.h gas/atof-generic.c gas/bignum-copy.c gas/bignum.h gas/bit_fix.h gas/cgen.c gas/cgen.h gas/cond.c gas/config-gas.com gas/config.in gas/config/aout_gnu.h gas/config/atof-ieee.c gas/config/atof-tahoe.c gas/config/atof-vax.c gas/config/e-i386aout.c gas/config/e-i386coff.c gas/config/e-i386elf.c gas/config/e-mipsecoff.c gas/config/e-mipself.c gas/config/itbl-mips.h gas/config/m68k-parse.h gas/config/m68k-parse.y gas/config/m88k-opcode.h gas/config/obj-aout.c gas/config/obj-aout.h gas/config/obj-bout.c gas/config/obj-bout.h gas/config/obj-coff.c gas/config/obj-coff.h gas/config/obj-ecoff.c gas/config/obj-ecoff.h gas/config/obj-elf.c gas/config/obj-elf.h gas/config/obj-evax.c gas/config/obj-evax.h gas/config/obj-generic.c gas/config/obj-generic.h gas/config/obj-hp300.c gas/config/obj-hp300.h gas/config/obj-ieee.c gas/config/obj-ieee.h gas/config/obj-multi.c gas/config/obj-multi.h gas/config/obj-som.c gas/config/obj-som.h gas/config/obj-vms.c gas/config/obj-vms.h gas/config/tc-a29k.c gas/config/tc-a29k.h gas/config/tc-alpha.c gas/config/tc-alpha.h gas/config/tc-arc.c gas/config/tc-arc.h gas/config/tc-arm.c gas/config/tc-arm.h gas/config/tc-avr.c gas/config/tc-avr.h gas/config/tc-d10v.c gas/config/tc-d10v.h gas/config/tc-d30v.c gas/config/tc-d30v.h gas/config/tc-fr30.c gas/config/tc-fr30.h gas/config/tc-generic.c gas/config/tc-generic.h gas/config/tc-h8300.c gas/config/tc-h8300.h gas/config/tc-h8500.c gas/config/tc-h8500.h gas/config/tc-hppa.c gas/config/tc-hppa.h gas/config/tc-i370.c gas/config/tc-i370.h gas/config/tc-i386.c gas/config/tc-i386.h gas/config/tc-i860.c gas/config/tc-i860.h gas/config/tc-i960.c gas/config/tc-i960.h gas/config/tc-m32r.c gas/config/tc-m32r.h gas/config/tc-m68851.h gas/config/tc-m68k.c gas/config/tc-m68k.h gas/config/tc-m88k.c gas/config/tc-m88k.h gas/config/tc-mcore.c gas/config/tc-mcore.h gas/config/tc-mips.c gas/config/tc-mips.h gas/config/tc-mn10200.c gas/config/tc-mn10200.h gas/config/tc-mn10300.c gas/config/tc-mn10300.h gas/config/tc-ns32k.c gas/config/tc-ns32k.h gas/config/tc-pj.c gas/config/tc-pj.h gas/config/tc-ppc.c gas/config/tc-ppc.h gas/config/tc-sh.c gas/config/tc-sh.h gas/config/tc-sparc.c gas/config/tc-sparc.h gas/config/tc-tahoe.c gas/config/tc-tahoe.h gas/config/tc-tic30.c gas/config/tc-tic30.h gas/config/tc-tic80.c gas/config/tc-tic80.h gas/config/tc-v850.c gas/config/tc-v850.h gas/config/tc-vax.c gas/config/tc-vax.h gas/config/tc-w65.c gas/config/tc-w65.h gas/config/tc-z8k.c gas/config/tc-z8k.h gas/config/te-386bsd.h gas/config/te-aux.h gas/config/te-delt88.h gas/config/te-delta.h gas/config/te-dpx2.h gas/config/te-dynix.h gas/config/te-epoc-pe.h gas/config/te-generic.h gas/config/te-go32.h gas/config/te-hp300.h gas/config/te-hppa.h gas/config/te-i386aix.h gas/config/te-ic960.h gas/config/te-interix.h gas/config/te-linux.h gas/config/te-lnews.h gas/config/te-lynx.h gas/config/te-mach.h gas/config/te-macos.h gas/config/te-nbsd.h gas/config/te-nbsd532.h gas/config/te-pc532mach.h gas/config/te-pe.h gas/config/te-ppcnw.h gas/config/te-psos.h gas/config/te-riscix.h gas/config/te-sparcaout.h gas/config/te-sun3.h gas/config/te-svr4.h gas/config/te-sysv32.h gas/config/te-wince-pe.h gas/config/vax-inst.h gas/config/vms-a-conf.h gas/config/vms-conf.h gas/configure gas/configure.in gas/debug.c gas/dep-in.sed gas/depend.c gas/doc/Makefile.am gas/doc/Makefile.in gas/doc/all.texi gas/doc/as.1 gas/doc/as.texinfo gas/doc/c-a29k.texi gas/doc/c-arm.texi gas/doc/c-d10v.texi gas/doc/c-d30v.texi gas/doc/c-h8300.texi gas/doc/c-h8500.texi gas/doc/c-hppa.texi gas/doc/c-i370.texi gas/doc/c-i386.texi gas/doc/c-i960.texi gas/doc/c-m32r.texi gas/doc/c-m68k.texi gas/doc/c-mips.texi gas/doc/c-ns32k.texi gas/doc/c-pj.texi gas/doc/c-sh.texi gas/doc/c-sparc.texi gas/doc/c-v850.texi gas/doc/c-vax.texi gas/doc/c-z8k.texi gas/doc/gasp.texi gas/doc/h8.texi gas/doc/internals.texi gas/dwarf2dbg.c gas/dwarf2dbg.h gas/ecoff.c gas/ecoff.h gas/ehopt.c gas/emul-target.h gas/emul.h gas/expr.c gas/expr.h gas/flonum-copy.c gas/flonum-konst.c gas/flonum-mult.c gas/flonum.h gas/frags.c gas/frags.h gas/gasp.c gas/gdbinit.in gas/hash.c gas/hash.h gas/input-file.c gas/input-file.h gas/input-scrub.c gas/itbl-lex.l gas/itbl-ops.c gas/itbl-ops.h gas/itbl-parse.y gas/link.cmd gas/listing.c gas/listing.h gas/literal.c gas/mac-as.r gas/macro.c gas/macro.h gas/makefile.vms gas/messages.c gas/mpw-config.in gas/mpw-make.sed gas/obj.h gas/output-file.c gas/output-file.h gas/po/Make-in gas/po/POTFILES.in gas/po/gas.pot gas/read.c gas/read.h gas/sb.c gas/sb.h gas/stabs.c gas/stamp-h.in gas/struc-symbol.h gas/subsegs.c gas/subsegs.h gas/symbols.c gas/symbols.h gas/tc.h gas/testsuite/ChangeLog gas/testsuite/config/default.exp gas/testsuite/gas/all/align.d gas/testsuite/gas/all/align.s gas/testsuite/gas/all/cofftag.d gas/testsuite/gas/all/cofftag.s gas/testsuite/gas/all/comment.s gas/testsuite/gas/all/cond.d gas/testsuite/gas/all/cond.s gas/testsuite/gas/all/diff1.s gas/testsuite/gas/all/float.s gas/testsuite/gas/all/gas.exp gas/testsuite/gas/all/itbl gas/testsuite/gas/all/itbl-test.c gas/testsuite/gas/all/itbl.s gas/testsuite/gas/all/p1480.s gas/testsuite/gas/all/p2425.s gas/testsuite/gas/all/struct.d gas/testsuite/gas/all/struct.s gas/testsuite/gas/all/x930509.s gas/testsuite/gas/alpha/fp.d gas/testsuite/gas/alpha/fp.exp gas/testsuite/gas/alpha/fp.s gas/testsuite/gas/arc/alias.d gas/testsuite/gas/arc/alias.s gas/testsuite/gas/arc/arc.exp gas/testsuite/gas/arc/branch.d gas/testsuite/gas/arc/branch.s gas/testsuite/gas/arc/flag.d gas/testsuite/gas/arc/flag.s gas/testsuite/gas/arc/insn3.d gas/testsuite/gas/arc/insn3.s gas/testsuite/gas/arc/j.d gas/testsuite/gas/arc/j.s gas/testsuite/gas/arc/ld.d gas/testsuite/gas/arc/ld.s gas/testsuite/gas/arc/math.d gas/testsuite/gas/arc/math.s gas/testsuite/gas/arc/sshift.d gas/testsuite/gas/arc/sshift.s gas/testsuite/gas/arc/st.d gas/testsuite/gas/arc/st.s gas/testsuite/gas/arc/warn.exp gas/testsuite/gas/arc/warn.s gas/testsuite/gas/arm/arch4t.s gas/testsuite/gas/arm/arm.exp gas/testsuite/gas/arm/arm3.s gas/testsuite/gas/arm/arm6.s gas/testsuite/gas/arm/arm7dm.s gas/testsuite/gas/arm/arm7t.d gas/testsuite/gas/arm/arm7t.s gas/testsuite/gas/arm/copro.s gas/testsuite/gas/arm/float.s gas/testsuite/gas/arm/immed.s gas/testsuite/gas/arm/inst.d gas/testsuite/gas/arm/inst.s gas/testsuite/gas/arm/le-fpconst.d gas/testsuite/gas/arm/le-fpconst.s gas/testsuite/gas/arm/thumb.s gas/testsuite/gas/d10v/d10.exp gas/testsuite/gas/d10v/inst.d gas/testsuite/gas/d10v/inst.s gas/testsuite/gas/d30v/align.d gas/testsuite/gas/d30v/align.s gas/testsuite/gas/d30v/array.d gas/testsuite/gas/d30v/array.s gas/testsuite/gas/d30v/bittest.d gas/testsuite/gas/d30v/bittest.l gas/testsuite/gas/d30v/bittest.s gas/testsuite/gas/d30v/d30.exp gas/testsuite/gas/d30v/guard-debug.d gas/testsuite/gas/d30v/guard-debug.s gas/testsuite/gas/d30v/guard.d gas/testsuite/gas/d30v/guard.s gas/testsuite/gas/d30v/inst.d gas/testsuite/gas/d30v/inst.s gas/testsuite/gas/d30v/label-debug.d gas/testsuite/gas/d30v/label-debug.s gas/testsuite/gas/d30v/label.d gas/testsuite/gas/d30v/label.s gas/testsuite/gas/d30v/mul.d gas/testsuite/gas/d30v/mul.s gas/testsuite/gas/d30v/opt.d gas/testsuite/gas/d30v/opt.s gas/testsuite/gas/d30v/reloc.d gas/testsuite/gas/d30v/reloc.s gas/testsuite/gas/d30v/serial.l gas/testsuite/gas/d30v/serial.s gas/testsuite/gas/d30v/serial2.l gas/testsuite/gas/d30v/serial2.s gas/testsuite/gas/d30v/serial2O.l gas/testsuite/gas/d30v/serial2O.s gas/testsuite/gas/d30v/warn_oddreg.l gas/testsuite/gas/d30v/warn_oddreg.s gas/testsuite/gas/elf/elf.exp gas/testsuite/gas/elf/section0.d gas/testsuite/gas/elf/section0.s gas/testsuite/gas/elf/section1.d gas/testsuite/gas/elf/section1.s gas/testsuite/gas/fr30/allinsn.d gas/testsuite/gas/fr30/allinsn.exp gas/testsuite/gas/fr30/allinsn.s gas/testsuite/gas/fr30/fr30.exp gas/testsuite/gas/h8300/addsub.s gas/testsuite/gas/h8300/addsubh.s gas/testsuite/gas/h8300/addsubs.s gas/testsuite/gas/h8300/bitops1.s gas/testsuite/gas/h8300/bitops1h.s gas/testsuite/gas/h8300/bitops1s.s gas/testsuite/gas/h8300/bitops2.s gas/testsuite/gas/h8300/bitops2h.s gas/testsuite/gas/h8300/bitops2s.s gas/testsuite/gas/h8300/bitops3.s gas/testsuite/gas/h8300/bitops3h.s gas/testsuite/gas/h8300/bitops3s.s gas/testsuite/gas/h8300/bitops4.s gas/testsuite/gas/h8300/bitops4h.s gas/testsuite/gas/h8300/bitops4s.s gas/testsuite/gas/h8300/branch.s gas/testsuite/gas/h8300/branchh.s gas/testsuite/gas/h8300/branchs.s gas/testsuite/gas/h8300/cbranch.s gas/testsuite/gas/h8300/cbranchh.s gas/testsuite/gas/h8300/cbranchs.s gas/testsuite/gas/h8300/cmpsi2.s gas/testsuite/gas/h8300/compare.s gas/testsuite/gas/h8300/compareh.s gas/testsuite/gas/h8300/compares.s gas/testsuite/gas/h8300/decimal.s gas/testsuite/gas/h8300/decimalh.s gas/testsuite/gas/h8300/decimals.s gas/testsuite/gas/h8300/divmul.s gas/testsuite/gas/h8300/divmulh.s gas/testsuite/gas/h8300/divmuls.s gas/testsuite/gas/h8300/extendh.s gas/testsuite/gas/h8300/extends.s gas/testsuite/gas/h8300/ffxx1.d gas/testsuite/gas/h8300/ffxx1.s gas/testsuite/gas/h8300/h8300.exp gas/testsuite/gas/h8300/incdec.s gas/testsuite/gas/h8300/incdech.s gas/testsuite/gas/h8300/incdecs.s gas/testsuite/gas/h8300/logical.s gas/testsuite/gas/h8300/logicalh.s gas/testsuite/gas/h8300/logicals.s gas/testsuite/gas/h8300/macs.s gas/testsuite/gas/h8300/misc.s gas/testsuite/gas/h8300/misch.s gas/testsuite/gas/h8300/miscs.s gas/testsuite/gas/h8300/mov32bug.s gas/testsuite/gas/h8300/movb.s gas/testsuite/gas/h8300/movbh.s gas/testsuite/gas/h8300/movbs.s gas/testsuite/gas/h8300/movlh.s gas/testsuite/gas/h8300/movls.s gas/testsuite/gas/h8300/movw.s gas/testsuite/gas/h8300/movwh.s gas/testsuite/gas/h8300/movws.s gas/testsuite/gas/h8300/multiples.s gas/testsuite/gas/h8300/pushpop.s gas/testsuite/gas/h8300/pushpoph.s gas/testsuite/gas/h8300/pushpops.s gas/testsuite/gas/h8300/rotsh.s gas/testsuite/gas/h8300/rotshh.s gas/testsuite/gas/h8300/rotshs.s gas/testsuite/gas/hppa/README gas/testsuite/gas/hppa/basic/add.s gas/testsuite/gas/hppa/basic/add2.s gas/testsuite/gas/hppa/basic/addi.s gas/testsuite/gas/hppa/basic/basic.exp gas/testsuite/gas/hppa/basic/branch.s gas/testsuite/gas/hppa/basic/branch2.s gas/testsuite/gas/hppa/basic/comclr.s gas/testsuite/gas/hppa/basic/copr.s gas/testsuite/gas/hppa/basic/coprmem.s gas/testsuite/gas/hppa/basic/dcor.s gas/testsuite/gas/hppa/basic/dcor2.s gas/testsuite/gas/hppa/basic/deposit.s gas/testsuite/gas/hppa/basic/deposit2.s gas/testsuite/gas/hppa/basic/deposit3.s gas/testsuite/gas/hppa/basic/ds.s gas/testsuite/gas/hppa/basic/extract.s gas/testsuite/gas/hppa/basic/extract2.s gas/testsuite/gas/hppa/basic/extract3.s gas/testsuite/gas/hppa/basic/fmem.s gas/testsuite/gas/hppa/basic/fmemLRbug.s gas/testsuite/gas/hppa/basic/fp_comp.s gas/testsuite/gas/hppa/basic/fp_comp2.s gas/testsuite/gas/hppa/basic/fp_conv.s gas/testsuite/gas/hppa/basic/fp_fcmp.s gas/testsuite/gas/hppa/basic/fp_misc.s gas/testsuite/gas/hppa/basic/imem.s gas/testsuite/gas/hppa/basic/immed.s gas/testsuite/gas/hppa/basic/logical.s gas/testsuite/gas/hppa/basic/media.s gas/testsuite/gas/hppa/basic/perf.s gas/testsuite/gas/hppa/basic/purge.s gas/testsuite/gas/hppa/basic/purge2.s gas/testsuite/gas/hppa/basic/sh1add.s gas/testsuite/gas/hppa/basic/sh2add.s gas/testsuite/gas/hppa/basic/sh3add.s gas/testsuite/gas/hppa/basic/shift.s gas/testsuite/gas/hppa/basic/shift2.s gas/testsuite/gas/hppa/basic/shift3.s gas/testsuite/gas/hppa/basic/shladd.s gas/testsuite/gas/hppa/basic/shladd2.s gas/testsuite/gas/hppa/basic/special.s gas/testsuite/gas/hppa/basic/spop.s gas/testsuite/gas/hppa/basic/sub.s gas/testsuite/gas/hppa/basic/sub2.s gas/testsuite/gas/hppa/basic/subi.s gas/testsuite/gas/hppa/basic/system.s gas/testsuite/gas/hppa/basic/system2.s gas/testsuite/gas/hppa/basic/unit.s gas/testsuite/gas/hppa/basic/unit2.s gas/testsuite/gas/hppa/basic/weird.s gas/testsuite/gas/hppa/parse/align1.s gas/testsuite/gas/hppa/parse/align2.s gas/testsuite/gas/hppa/parse/appbug.s gas/testsuite/gas/hppa/parse/badfmpyadd.s gas/testsuite/gas/hppa/parse/block1.s gas/testsuite/gas/hppa/parse/block2.s gas/testsuite/gas/hppa/parse/calldatabug.s gas/testsuite/gas/hppa/parse/callinfobug.s gas/testsuite/gas/hppa/parse/defbug.s gas/testsuite/gas/hppa/parse/entrybug.s gas/testsuite/gas/hppa/parse/exportbug.s gas/testsuite/gas/hppa/parse/exprbug.s gas/testsuite/gas/hppa/parse/fixup7bug.s gas/testsuite/gas/hppa/parse/global.s gas/testsuite/gas/hppa/parse/labelbug.s gas/testsuite/gas/hppa/parse/linesepbug.s gas/testsuite/gas/hppa/parse/lselbug.s gas/testsuite/gas/hppa/parse/nosubspace.s gas/testsuite/gas/hppa/parse/parse.exp gas/testsuite/gas/hppa/parse/procbug.s gas/testsuite/gas/hppa/parse/regpopbug.s gas/testsuite/gas/hppa/parse/spacebug.s gas/testsuite/gas/hppa/parse/ssbug.s gas/testsuite/gas/hppa/parse/stdreg.s gas/testsuite/gas/hppa/parse/stringer.s gas/testsuite/gas/hppa/parse/undefbug.s gas/testsuite/gas/hppa/parse/versionbug.s gas/testsuite/gas/hppa/parse/xmpyubug.s gas/testsuite/gas/hppa/reloc/applybug.s gas/testsuite/gas/hppa/reloc/blebug.s gas/testsuite/gas/hppa/reloc/blebug2.s gas/testsuite/gas/hppa/reloc/blebug3.s gas/testsuite/gas/hppa/reloc/exitbug.s gas/testsuite/gas/hppa/reloc/fixupbug.s gas/testsuite/gas/hppa/reloc/funcrelocbug.s gas/testsuite/gas/hppa/reloc/labelopbug.s gas/testsuite/gas/hppa/reloc/longcall.s gas/testsuite/gas/hppa/reloc/picreloc.s gas/testsuite/gas/hppa/reloc/plabelbug.s gas/testsuite/gas/hppa/reloc/r_no_reloc.s gas/testsuite/gas/hppa/reloc/reduce.s gas/testsuite/gas/hppa/reloc/reduce2.s gas/testsuite/gas/hppa/reloc/reduce3.s gas/testsuite/gas/hppa/reloc/reloc.exp gas/testsuite/gas/hppa/reloc/roundmode.s gas/testsuite/gas/hppa/reloc/selectorbug.s gas/testsuite/gas/hppa/unsorted/align3.s gas/testsuite/gas/hppa/unsorted/align4.s gas/testsuite/gas/hppa/unsorted/brlenbug.s gas/testsuite/gas/hppa/unsorted/common.s gas/testsuite/gas/hppa/unsorted/fragbug.s gas/testsuite/gas/hppa/unsorted/globalbug.s gas/testsuite/gas/hppa/unsorted/importbug.s gas/testsuite/gas/hppa/unsorted/labeldiffs.s gas/testsuite/gas/hppa/unsorted/locallabel.s gas/testsuite/gas/hppa/unsorted/ss_align.s gas/testsuite/gas/hppa/unsorted/unsorted.exp gas/testsuite/gas/i386/amd.d gas/testsuite/gas/i386/amd.s gas/testsuite/gas/i386/float.l gas/testsuite/gas/i386/float.s gas/testsuite/gas/i386/general.l gas/testsuite/gas/i386/general.s gas/testsuite/gas/i386/i386.exp gas/testsuite/gas/i386/intel.d gas/testsuite/gas/i386/intel.s gas/testsuite/gas/i386/inval.l gas/testsuite/gas/i386/inval.s gas/testsuite/gas/i386/jump.d gas/testsuite/gas/i386/jump.s gas/testsuite/gas/i386/jump16.d gas/testsuite/gas/i386/jump16.s gas/testsuite/gas/i386/katmai.d gas/testsuite/gas/i386/katmai.s gas/testsuite/gas/i386/modrm.l gas/testsuite/gas/i386/modrm.s gas/testsuite/gas/i386/naked.d gas/testsuite/gas/i386/naked.s gas/testsuite/gas/i386/opcode.d gas/testsuite/gas/i386/opcode.s gas/testsuite/gas/i386/prefix.d gas/testsuite/gas/i386/prefix.s gas/testsuite/gas/i386/reloc.d gas/testsuite/gas/i386/reloc.s gas/testsuite/gas/i386/white.l gas/testsuite/gas/i386/white.s gas/testsuite/gas/ieee-fp/x930509a.exp gas/testsuite/gas/ieee-fp/x930509a.s gas/testsuite/gas/m32r/allinsn.d gas/testsuite/gas/m32r/allinsn.exp gas/testsuite/gas/m32r/allinsn.s gas/testsuite/gas/m32r/error.exp gas/testsuite/gas/m32r/fslot.d gas/testsuite/gas/m32r/fslot.s gas/testsuite/gas/m32r/fslotx.d gas/testsuite/gas/m32r/fslotx.s gas/testsuite/gas/m32r/high-1.d gas/testsuite/gas/m32r/high-1.s gas/testsuite/gas/m32r/interfere.s gas/testsuite/gas/m32r/m32r.exp gas/testsuite/gas/m32r/m32rx.d gas/testsuite/gas/m32r/m32rx.exp gas/testsuite/gas/m32r/m32rx.s gas/testsuite/gas/m32r/outofrange.s gas/testsuite/gas/m32r/relax-1.d gas/testsuite/gas/m32r/relax-1.s gas/testsuite/gas/m32r/relax-2.d gas/testsuite/gas/m32r/relax-2.s gas/testsuite/gas/m32r/uppercase.d gas/testsuite/gas/m32r/uppercase.s gas/testsuite/gas/m32r/wrongsize.s gas/testsuite/gas/m68k-coff/gas.exp gas/testsuite/gas/m68k-coff/p2389.s gas/testsuite/gas/m68k-coff/p2389a.s gas/testsuite/gas/m68k-coff/p2430.s gas/testsuite/gas/m68k-coff/p2430a.s gas/testsuite/gas/m68k-coff/t1.s gas/testsuite/gas/m68k/all.exp gas/testsuite/gas/m68k/bitfield.d gas/testsuite/gas/m68k/bitfield.s gas/testsuite/gas/m68k/cas.d gas/testsuite/gas/m68k/cas.s gas/testsuite/gas/m68k/disperr.s gas/testsuite/gas/m68k/fmoveml.d gas/testsuite/gas/m68k/fmoveml.s gas/testsuite/gas/m68k/link.d gas/testsuite/gas/m68k/link.s gas/testsuite/gas/m68k/op68000.d gas/testsuite/gas/m68k/operands.d gas/testsuite/gas/m68k/operands.s gas/testsuite/gas/m68k/p2410.s gas/testsuite/gas/m68k/p2663.s gas/testsuite/gas/m68k/pcrel.d gas/testsuite/gas/m68k/pcrel.s gas/testsuite/gas/m68k/pic1.s gas/testsuite/gas/m68k/t2.d gas/testsuite/gas/m68k/t2.s gas/testsuite/gas/m88k/init.d gas/testsuite/gas/m88k/init.s gas/testsuite/gas/m88k/m88k.exp gas/testsuite/gas/macros/err.s gas/testsuite/gas/macros/irp.d gas/testsuite/gas/macros/irp.s gas/testsuite/gas/macros/macros.exp gas/testsuite/gas/macros/rept.d gas/testsuite/gas/macros/rept.s gas/testsuite/gas/macros/semi.d gas/testsuite/gas/macros/semi.s gas/testsuite/gas/macros/test1.d gas/testsuite/gas/macros/test1.s gas/testsuite/gas/macros/test2.d gas/testsuite/gas/macros/test2.s gas/testsuite/gas/macros/test3.d gas/testsuite/gas/macros/test3.s gas/testsuite/gas/mcore/allinsn.d gas/testsuite/gas/mcore/allinsn.exp gas/testsuite/gas/mcore/allinsn.s gas/testsuite/gas/mips/abs.d gas/testsuite/gas/mips/abs.s gas/testsuite/gas/mips/add.d gas/testsuite/gas/mips/add.s gas/testsuite/gas/mips/and.d gas/testsuite/gas/mips/and.s gas/testsuite/gas/mips/beq.d gas/testsuite/gas/mips/beq.s gas/testsuite/gas/mips/bge.d gas/testsuite/gas/mips/bge.s gas/testsuite/gas/mips/bgeu.d gas/testsuite/gas/mips/bgeu.s gas/testsuite/gas/mips/blt.d gas/testsuite/gas/mips/blt.s gas/testsuite/gas/mips/bltu.d gas/testsuite/gas/mips/bltu.s gas/testsuite/gas/mips/break20.d gas/testsuite/gas/mips/break20.s gas/testsuite/gas/mips/delay.d gas/testsuite/gas/mips/delay.s gas/testsuite/gas/mips/div-ilocks.d gas/testsuite/gas/mips/div.d gas/testsuite/gas/mips/div.s gas/testsuite/gas/mips/dli.d gas/testsuite/gas/mips/dli.s gas/testsuite/gas/mips/e32-rel2.d gas/testsuite/gas/mips/elf-rel.d gas/testsuite/gas/mips/elf-rel.s gas/testsuite/gas/mips/elf-rel2.d gas/testsuite/gas/mips/elf-rel2.s gas/testsuite/gas/mips/elf_e_flags.c gas/testsuite/gas/mips/elf_e_flags.s gas/testsuite/gas/mips/elf_e_flags1.d gas/testsuite/gas/mips/elf_e_flags2.d gas/testsuite/gas/mips/elf_e_flags3.d gas/testsuite/gas/mips/elf_e_flags4.d gas/testsuite/gas/mips/empic.d gas/testsuite/gas/mips/empic.s gas/testsuite/gas/mips/itbl gas/testsuite/gas/mips/itbl.s gas/testsuite/gas/mips/jal-empic.d gas/testsuite/gas/mips/jal-svr4pic.d gas/testsuite/gas/mips/jal-svr4pic.s gas/testsuite/gas/mips/jal-xgot.d gas/testsuite/gas/mips/jal.d gas/testsuite/gas/mips/jal.s gas/testsuite/gas/mips/la-empic.d gas/testsuite/gas/mips/la-empic.s gas/testsuite/gas/mips/la-svr4pic.d gas/testsuite/gas/mips/la-xgot.d gas/testsuite/gas/mips/la.d gas/testsuite/gas/mips/la.s gas/testsuite/gas/mips/lb-empic.d gas/testsuite/gas/mips/lb-pic.s gas/testsuite/gas/mips/lb-svr4pic.d gas/testsuite/gas/mips/lb-xgot-ilocks.d gas/testsuite/gas/mips/lb-xgot.d gas/testsuite/gas/mips/lb.d gas/testsuite/gas/mips/lb.s gas/testsuite/gas/mips/ld-empic.d gas/testsuite/gas/mips/ld-ilocks-addr32.d gas/testsuite/gas/mips/ld-ilocks.d gas/testsuite/gas/mips/ld-pic.s gas/testsuite/gas/mips/ld-svr4pic.d gas/testsuite/gas/mips/ld-xgot.d gas/testsuite/gas/mips/ld.d gas/testsuite/gas/mips/ld.s gas/testsuite/gas/mips/li.d gas/testsuite/gas/mips/li.s gas/testsuite/gas/mips/lif-empic.d gas/testsuite/gas/mips/lif-svr4pic.d gas/testsuite/gas/mips/lif-xgot.d gas/testsuite/gas/mips/lifloat.d gas/testsuite/gas/mips/lifloat.s gas/testsuite/gas/mips/lineno.d gas/testsuite/gas/mips/lineno.s gas/testsuite/gas/mips/mips.exp gas/testsuite/gas/mips/mips16-e.d gas/testsuite/gas/mips/mips16-e.s gas/testsuite/gas/mips/mips16-f.d gas/testsuite/gas/mips/mips16-f.s gas/testsuite/gas/mips/mips16.d gas/testsuite/gas/mips/mips16.s gas/testsuite/gas/mips/mips4.d gas/testsuite/gas/mips/mips4.s gas/testsuite/gas/mips/mips4010.d gas/testsuite/gas/mips/mips4010.s gas/testsuite/gas/mips/mips4100.d gas/testsuite/gas/mips/mips4100.s gas/testsuite/gas/mips/mips4650.d gas/testsuite/gas/mips/mips4650.s gas/testsuite/gas/mips/mul-ilocks.d gas/testsuite/gas/mips/mul.d gas/testsuite/gas/mips/mul.s gas/testsuite/gas/mips/nodelay.d gas/testsuite/gas/mips/rol.d gas/testsuite/gas/mips/rol.s gas/testsuite/gas/mips/sb.d gas/testsuite/gas/mips/sb.s gas/testsuite/gas/mips/sync.d gas/testsuite/gas/mips/sync.s gas/testsuite/gas/mips/trap20.d gas/testsuite/gas/mips/trap20.s gas/testsuite/gas/mips/trunc.d gas/testsuite/gas/mips/trunc.s gas/testsuite/gas/mips/uld.d gas/testsuite/gas/mips/uld.s gas/testsuite/gas/mips/ulh-empic.d gas/testsuite/gas/mips/ulh-pic.s gas/testsuite/gas/mips/ulh-svr4pic.d gas/testsuite/gas/mips/ulh-xgot.d gas/testsuite/gas/mips/ulh.d gas/testsuite/gas/mips/ulh.s gas/testsuite/gas/mips/ulw.d gas/testsuite/gas/mips/ulw.s gas/testsuite/gas/mips/usd.d gas/testsuite/gas/mips/usd.s gas/testsuite/gas/mips/ush.d gas/testsuite/gas/mips/ush.s gas/testsuite/gas/mips/usw.d gas/testsuite/gas/mips/usw.s gas/testsuite/gas/mn10200/add.s gas/testsuite/gas/mn10200/basic.exp gas/testsuite/gas/mn10200/bcc.s gas/testsuite/gas/mn10200/bccx.s gas/testsuite/gas/mn10200/bit.s gas/testsuite/gas/mn10200/cmp.s gas/testsuite/gas/mn10200/ext.s gas/testsuite/gas/mn10200/logical.s gas/testsuite/gas/mn10200/mov1.s gas/testsuite/gas/mn10200/mov2.s gas/testsuite/gas/mn10200/mov3.s gas/testsuite/gas/mn10200/mov4.s gas/testsuite/gas/mn10200/movb.s gas/testsuite/gas/mn10200/movbu.s gas/testsuite/gas/mn10200/movx.s gas/testsuite/gas/mn10200/muldiv.s gas/testsuite/gas/mn10200/other.s gas/testsuite/gas/mn10200/shift.s gas/testsuite/gas/mn10200/sub.s gas/testsuite/gas/mn10300/add.s gas/testsuite/gas/mn10300/am33.s gas/testsuite/gas/mn10300/am33_2.s gas/testsuite/gas/mn10300/am33_3.s gas/testsuite/gas/mn10300/am33_4.s gas/testsuite/gas/mn10300/am33_5.s gas/testsuite/gas/mn10300/am33_6.s gas/testsuite/gas/mn10300/am33_7.s gas/testsuite/gas/mn10300/am33_8.s gas/testsuite/gas/mn10300/basic.exp gas/testsuite/gas/mn10300/bcc.s gas/testsuite/gas/mn10300/bit.s gas/testsuite/gas/mn10300/cmp.s gas/testsuite/gas/mn10300/ext.s gas/testsuite/gas/mn10300/extend.s gas/testsuite/gas/mn10300/logical.s gas/testsuite/gas/mn10300/loop.s gas/testsuite/gas/mn10300/mov1.s gas/testsuite/gas/mn10300/mov2.s gas/testsuite/gas/mn10300/mov3.s gas/testsuite/gas/mn10300/mov4.s gas/testsuite/gas/mn10300/movbu.s gas/testsuite/gas/mn10300/movhu.s gas/testsuite/gas/mn10300/movm.s gas/testsuite/gas/mn10300/muldiv.s gas/testsuite/gas/mn10300/other.s gas/testsuite/gas/mn10300/shift.s gas/testsuite/gas/mn10300/sub.s gas/testsuite/gas/mn10300/udf.s gas/testsuite/gas/mri/char.d gas/testsuite/gas/mri/char.s gas/testsuite/gas/mri/comment.d gas/testsuite/gas/mri/comment.s gas/testsuite/gas/mri/common.d gas/testsuite/gas/mri/common.s gas/testsuite/gas/mri/constants.d gas/testsuite/gas/mri/constants.s gas/testsuite/gas/mri/empty.s gas/testsuite/gas/mri/equ.d gas/testsuite/gas/mri/equ.s gas/testsuite/gas/mri/expr.d gas/testsuite/gas/mri/expr.s gas/testsuite/gas/mri/float.d gas/testsuite/gas/mri/float.s gas/testsuite/gas/mri/for.d gas/testsuite/gas/mri/for.s gas/testsuite/gas/mri/if.d gas/testsuite/gas/mri/if.s gas/testsuite/gas/mri/immconst.d gas/testsuite/gas/mri/label.d gas/testsuite/gas/mri/label.s gas/testsuite/gas/mri/moveml.d gas/testsuite/gas/mri/moveml.s gas/testsuite/gas/mri/mri.exp gas/testsuite/gas/mri/repeat.d gas/testsuite/gas/mri/repeat.s gas/testsuite/gas/mri/semi.d gas/testsuite/gas/mri/semi.s gas/testsuite/gas/mri/while.d gas/testsuite/gas/mri/while.s gas/testsuite/gas/pj/ops.d gas/testsuite/gas/pj/ops.s gas/testsuite/gas/pj/pj.exp gas/testsuite/gas/ppc/astest.d gas/testsuite/gas/ppc/astest.s gas/testsuite/gas/ppc/astest2.d gas/testsuite/gas/ppc/astest2.s gas/testsuite/gas/ppc/ppc.exp gas/testsuite/gas/ppc/simpshft.d gas/testsuite/gas/ppc/simpshft.s gas/testsuite/gas/sh/basic.exp gas/testsuite/gas/sh/fp.s gas/testsuite/gas/sparc-solaris/addend.exp gas/testsuite/gas/sparc-solaris/addend.s gas/testsuite/gas/sparc-solaris/gas.exp gas/testsuite/gas/sparc-solaris/sol-cc.s gas/testsuite/gas/sparc-solaris/sol-gcc.s gas/testsuite/gas/sparc/asi.d gas/testsuite/gas/sparc/asi.s gas/testsuite/gas/sparc/membar.d gas/testsuite/gas/sparc/membar.s gas/testsuite/gas/sparc/mism-1.s gas/testsuite/gas/sparc/mismatch.exp gas/testsuite/gas/sparc/prefetch.d gas/testsuite/gas/sparc/prefetch.s gas/testsuite/gas/sparc/rdpr.d gas/testsuite/gas/sparc/rdpr.s gas/testsuite/gas/sparc/reloc64.d gas/testsuite/gas/sparc/reloc64.s gas/testsuite/gas/sparc/set64.d gas/testsuite/gas/sparc/set64.s gas/testsuite/gas/sparc/sparc.exp gas/testsuite/gas/sparc/splet-2.d gas/testsuite/gas/sparc/splet-2.s gas/testsuite/gas/sparc/splet.d gas/testsuite/gas/sparc/splet.s gas/testsuite/gas/sparc/synth.d gas/testsuite/gas/sparc/synth.s gas/testsuite/gas/sparc/synth64.d gas/testsuite/gas/sparc/synth64.s gas/testsuite/gas/sparc/wrpr.d gas/testsuite/gas/sparc/wrpr.s gas/testsuite/gas/sun4/addend.d gas/testsuite/gas/sun4/addend.exp gas/testsuite/gas/sun4/addend.s gas/testsuite/gas/template gas/testsuite/gas/tic80/add.d gas/testsuite/gas/tic80/add.lst gas/testsuite/gas/tic80/add.s gas/testsuite/gas/tic80/align.d gas/testsuite/gas/tic80/align.lst gas/testsuite/gas/tic80/align.s gas/testsuite/gas/tic80/bitnum.d gas/testsuite/gas/tic80/bitnum.lst gas/testsuite/gas/tic80/bitnum.s gas/testsuite/gas/tic80/ccode.d gas/testsuite/gas/tic80/ccode.lst gas/testsuite/gas/tic80/ccode.s gas/testsuite/gas/tic80/cregops.d gas/testsuite/gas/tic80/cregops.lst gas/testsuite/gas/tic80/cregops.s gas/testsuite/gas/tic80/endmask.d gas/testsuite/gas/tic80/endmask.lst gas/testsuite/gas/tic80/endmask.s gas/testsuite/gas/tic80/float.d gas/testsuite/gas/tic80/float.lst gas/testsuite/gas/tic80/float.s gas/testsuite/gas/tic80/regops.d gas/testsuite/gas/tic80/regops.lst gas/testsuite/gas/tic80/regops.s gas/testsuite/gas/tic80/regops2.d gas/testsuite/gas/tic80/regops2.lst gas/testsuite/gas/tic80/regops2.s gas/testsuite/gas/tic80/regops3.d gas/testsuite/gas/tic80/regops3.lst gas/testsuite/gas/tic80/regops3.s gas/testsuite/gas/tic80/regops4.d gas/testsuite/gas/tic80/regops4.lst gas/testsuite/gas/tic80/regops4.s gas/testsuite/gas/tic80/relocs1.c gas/testsuite/gas/tic80/relocs1.d gas/testsuite/gas/tic80/relocs1.lst gas/testsuite/gas/tic80/relocs1.s gas/testsuite/gas/tic80/relocs1b.d gas/testsuite/gas/tic80/relocs2.c gas/testsuite/gas/tic80/relocs2.d gas/testsuite/gas/tic80/relocs2.lst gas/testsuite/gas/tic80/relocs2.s gas/testsuite/gas/tic80/relocs2b.d gas/testsuite/gas/tic80/tic80.exp gas/testsuite/gas/v850/arith.s gas/testsuite/gas/v850/basic.exp gas/testsuite/gas/v850/bit.s gas/testsuite/gas/v850/branch.s gas/testsuite/gas/v850/compare.s gas/testsuite/gas/v850/fepsw.s gas/testsuite/gas/v850/hilo.s gas/testsuite/gas/v850/hilo2.s gas/testsuite/gas/v850/jumps.s gas/testsuite/gas/v850/logical.s gas/testsuite/gas/v850/mem.s gas/testsuite/gas/v850/misc.s gas/testsuite/gas/v850/move.s gas/testsuite/gas/v850/range.s gas/testsuite/gas/v850/reloc.s gas/testsuite/gas/vax/quad.exp gas/testsuite/gas/vax/quad.s gas/testsuite/gas/vtable/entry0.d gas/testsuite/gas/vtable/entry0.s gas/testsuite/gas/vtable/entry1.d gas/testsuite/gas/vtable/entry1.s gas/testsuite/gas/vtable/inherit0.d gas/testsuite/gas/vtable/inherit0.s gas/testsuite/gas/vtable/inherit1.l gas/testsuite/gas/vtable/inherit1.s gas/testsuite/gas/vtable/vtable.exp gas/testsuite/gasp/INC1.H gas/testsuite/gasp/INC2.H gas/testsuite/gasp/assign.asm gas/testsuite/gasp/assign.err gas/testsuite/gasp/assign.out gas/testsuite/gasp/condass.asm gas/testsuite/gasp/condass.err gas/testsuite/gasp/condass.out gas/testsuite/gasp/crash.asm gas/testsuite/gasp/crash.err gas/testsuite/gasp/crash.out gas/testsuite/gasp/crash1.asm gas/testsuite/gasp/crash1.err gas/testsuite/gasp/crash1.out gas/testsuite/gasp/crash2.asm gas/testsuite/gasp/crash2.err gas/testsuite/gasp/crash2.out gas/testsuite/gasp/data.asm gas/testsuite/gasp/data.err gas/testsuite/gasp/data.out gas/testsuite/gasp/exp.asm gas/testsuite/gasp/exp.err gas/testsuite/gasp/exp.out gas/testsuite/gasp/gasp.exp gas/testsuite/gasp/include.asm gas/testsuite/gasp/include.err gas/testsuite/gasp/include.out gas/testsuite/gasp/listing.asm gas/testsuite/gasp/listing.err gas/testsuite/gasp/listing.out gas/testsuite/gasp/macro.asm gas/testsuite/gasp/macro.err gas/testsuite/gasp/macro.out gas/testsuite/gasp/mdouble.asm gas/testsuite/gasp/mdouble.err gas/testsuite/gasp/mdouble.out gas/testsuite/gasp/mri/embed.asm gas/testsuite/gasp/mri/embed.out gas/testsuite/gasp/mri/exists.asm gas/testsuite/gasp/mri/exists.out gas/testsuite/gasp/mri/irp.asm gas/testsuite/gasp/mri/irp.out gas/testsuite/gasp/mri/irpc.asm gas/testsuite/gasp/mri/irpc.out gas/testsuite/gasp/mri/macro.asm gas/testsuite/gasp/mri/macro.out gas/testsuite/gasp/mri/narg.asm gas/testsuite/gasp/mri/narg.out gas/testsuite/gasp/mri/rept.asm gas/testsuite/gasp/mri/rept.out gas/testsuite/gasp/pl1.asm gas/testsuite/gasp/pl1.err gas/testsuite/gasp/pl1.out gas/testsuite/gasp/pl2.asm gas/testsuite/gasp/pl2.err gas/testsuite/gasp/pl2.out gas/testsuite/gasp/pl3.asm gas/testsuite/gasp/pl3.err gas/testsuite/gasp/pl3.out gas/testsuite/gasp/pl4.asm gas/testsuite/gasp/pl4.err gas/testsuite/gasp/pl4.out gas/testsuite/gasp/pl5.asm gas/testsuite/gasp/pl5.err gas/testsuite/gasp/pl5.out gas/testsuite/gasp/pl6.asm gas/testsuite/gasp/pl6.err gas/testsuite/gasp/pl6.out gas/testsuite/gasp/pl7.asm gas/testsuite/gasp/pl7.err gas/testsuite/gasp/pl7.out gas/testsuite/gasp/pl8.asm gas/testsuite/gasp/pl8.err gas/testsuite/gasp/pl8.out gas/testsuite/gasp/pr7583.asm gas/testsuite/gasp/pr7583.err gas/testsuite/gasp/pr7583.out gas/testsuite/gasp/reg.asm gas/testsuite/gasp/reg.err gas/testsuite/gasp/reg.out gas/testsuite/gasp/rep.asm gas/testsuite/gasp/rep.err gas/testsuite/gasp/rep.out gas/testsuite/gasp/repeat.asm gas/testsuite/gasp/repeat.err gas/testsuite/gasp/repeat.out gas/testsuite/gasp/reperr.asm gas/testsuite/gasp/reperr.err gas/testsuite/gasp/reperr.out gas/testsuite/gasp/reperr1.asm gas/testsuite/gasp/reperr1.err gas/testsuite/gasp/reperr1.out gas/testsuite/gasp/reperr2.asm gas/testsuite/gasp/reperr2.err gas/testsuite/gasp/reperr2.out gas/testsuite/gasp/reperr3.asm gas/testsuite/gasp/reperr3.err gas/testsuite/gasp/reperr3.out gas/testsuite/gasp/sdata.asm gas/testsuite/gasp/sdata.err gas/testsuite/gasp/sdata.out gas/testsuite/gasp/sfunc.asm gas/testsuite/gasp/sfunc.err gas/testsuite/gasp/sfunc.out gas/testsuite/gasp/t1.asm gas/testsuite/gasp/t1.err gas/testsuite/gasp/t1.out gas/testsuite/gasp/t2.asm gas/testsuite/gasp/t2.err gas/testsuite/gasp/t2.out gas/testsuite/gasp/t3.asm gas/testsuite/gasp/t3.err gas/testsuite/gasp/t3.out gas/testsuite/gasp/while.asm gas/testsuite/gasp/while.err gas/testsuite/gasp/while.out gas/testsuite/lib/doboth gas/testsuite/lib/doobjcmp gas/testsuite/lib/dostriptest gas/testsuite/lib/dotest gas/testsuite/lib/dounsreloc gas/testsuite/lib/dounssym gas/testsuite/lib/gas-defs.exp gas/testsuite/lib/gas-dg.exp gas/testsuite/lib/run gas/vmsconf.sh gas/write.c gas/write.h gdb/windows-nat.c gprof/.gdbinit gprof/ChangeLog gprof/Makefile.am gprof/Makefile.in gprof/NOTES gprof/TEST gprof/TODO gprof/aclocal.m4 gprof/alpha.c gprof/basic_blocks.c gprof/basic_blocks.h gprof/bb_exit_func.c gprof/bbconv.pl gprof/bsd_callg_bl.m gprof/call_graph.c gprof/call_graph.h gprof/cg_arcs.c gprof/cg_arcs.h gprof/cg_dfn.c gprof/cg_dfn.h gprof/cg_print.c gprof/cg_print.h gprof/configure gprof/configure.in gprof/corefile.c gprof/corefile.h gprof/flat_bl.m gprof/fsf_callg_bl.m gprof/gconfig.in gprof/gen-c-prog.awk gprof/gmon.h gprof/gmon_io.c gprof/gmon_io.h gprof/gmon_out.h gprof/gprof.1 gprof/gprof.c gprof/gprof.h gprof/gprof.texi gprof/hertz.c gprof/hertz.h gprof/hist.c gprof/hist.h gprof/i386.c gprof/po/Make-in gprof/po/POTFILES.in gprof/po/gprof.pot gprof/search_list.c gprof/search_list.h gprof/source.c gprof/source.h gprof/sparc.c gprof/stamp-h.in gprof/sym_ids.c gprof/sym_ids.h gprof/symtab.c gprof/symtab.h gprof/tahoe.c gprof/utils.c gprof/utils.h gprof/vax.c ld/ChangeLog ld/Makefile.am ld/Makefile.in ld/NEWS ld/README ld/TODO ld/acinclude.m4 ld/aclocal.m4 ld/config.in ld/configure ld/configure.host ld/configure.in ld/configure.tgt ld/deffile.h ld/deffilep.y ld/dep-in.sed ld/emulparams/README ld/emulparams/a29k.sh ld/emulparams/aixppc.sh ld/emulparams/aixrs6.sh ld/emulparams/alpha.sh ld/emulparams/arcelf.sh ld/emulparams/arm_epoc_pe.sh ld/emulparams/armaoutb.sh ld/emulparams/armaoutl.sh ld/emulparams/armcoff.sh ld/emulparams/armelf.sh ld/emulparams/armelf_linux.sh ld/emulparams/armelf_linux26.sh ld/emulparams/armelf_oabi.sh ld/emulparams/armnbsd.sh ld/emulparams/armpe.sh ld/emulparams/avr1200.sh ld/emulparams/avr23xx.sh ld/emulparams/avr4433.sh ld/emulparams/avr44x4.sh ld/emulparams/avr85xx.sh ld/emulparams/avrmega103.sh ld/emulparams/avrmega161.sh ld/emulparams/avrmega603.sh ld/emulparams/coff_sparc.sh ld/emulparams/d10velf.sh ld/emulparams/d30v_e.sh ld/emulparams/d30v_o.sh ld/emulparams/d30velf.sh ld/emulparams/delta68.sh ld/emulparams/ebmon29k.sh ld/emulparams/elf32_i960.sh ld/emulparams/elf32_sparc.sh ld/emulparams/elf32b4300.sh ld/emulparams/elf32bmip.sh ld/emulparams/elf32bmipn32.sh ld/emulparams/elf32bsmip.sh ld/emulparams/elf32ebmip.sh ld/emulparams/elf32elmip.sh ld/emulparams/elf32fr30.sh ld/emulparams/elf32i370.sh ld/emulparams/elf32l4300.sh ld/emulparams/elf32lmip.sh ld/emulparams/elf32lppc.sh ld/emulparams/elf32lsmip.sh ld/emulparams/elf32mcore.sh ld/emulparams/elf32ppc.sh ld/emulparams/elf32ppclinux.sh ld/emulparams/elf64_sparc.sh ld/emulparams/elf64alpha.sh ld/emulparams/elf64bmip.sh ld/emulparams/elf64hppa.sh ld/emulparams/elf_i386.sh ld/emulparams/elf_i386_be.sh ld/emulparams/gld960.sh ld/emulparams/gld960coff.sh ld/emulparams/h8300.sh ld/emulparams/h8300h.sh ld/emulparams/h8300s.sh ld/emulparams/h8500.sh ld/emulparams/h8500b.sh ld/emulparams/h8500c.sh ld/emulparams/h8500m.sh ld/emulparams/h8500s.sh ld/emulparams/hp300bsd.sh ld/emulparams/hp3hpux.sh ld/emulparams/hppaelf.sh ld/emulparams/i386aout.sh ld/emulparams/i386beos.sh ld/emulparams/i386bsd.sh ld/emulparams/i386coff.sh ld/emulparams/i386go32.sh ld/emulparams/i386linux.sh ld/emulparams/i386lynx.sh ld/emulparams/i386mach.sh ld/emulparams/i386moss.sh ld/emulparams/i386msdos.sh ld/emulparams/i386nbsd.sh ld/emulparams/i386nw.sh ld/emulparams/i386pe.sh ld/emulparams/i386pe_posix.sh ld/emulparams/lnk960.sh ld/emulparams/m32relf.sh ld/emulparams/m68k4knbsd.sh ld/emulparams/m68kaout.sh ld/emulparams/m68kaux.sh ld/emulparams/m68kcoff.sh ld/emulparams/m68kelf.sh ld/emulparams/m68klinux.sh ld/emulparams/m68klynx.sh ld/emulparams/m68knbsd.sh ld/emulparams/m68kpsos.sh ld/emulparams/m88kbcs.sh ld/emulparams/mcorepe.sh ld/emulparams/mipsbig.sh ld/emulparams/mipsbsd.sh ld/emulparams/mipsidt.sh ld/emulparams/mipsidtl.sh ld/emulparams/mipslit.sh ld/emulparams/mipslnews.sh ld/emulparams/mipspe.sh ld/emulparams/mn10200.sh ld/emulparams/mn10300.sh ld/emulparams/news.sh ld/emulparams/ns32knbsd.sh ld/emulparams/pc532macha.sh ld/emulparams/pjelf.sh ld/emulparams/pjlelf.sh ld/emulparams/ppcmacos.sh ld/emulparams/ppcnw.sh ld/emulparams/ppcpe.sh ld/emulparams/riscix.sh ld/emulparams/sa29200.sh ld/emulparams/sh.sh ld/emulparams/shelf.sh ld/emulparams/shl.sh ld/emulparams/shlelf.sh ld/emulparams/shpe.sh ld/emulparams/sparcaout.sh ld/emulparams/sparclinux.sh ld/emulparams/sparclynx.sh ld/emulparams/sparcnbsd.sh ld/emulparams/st2000.sh ld/emulparams/sun3.sh ld/emulparams/sun4.sh ld/emulparams/tic30aout.sh ld/emulparams/tic30coff.sh ld/emulparams/tic80coff.sh ld/emulparams/v850.sh ld/emulparams/vanilla.sh ld/emulparams/vax.sh ld/emulparams/vsta.sh ld/emulparams/w65.sh ld/emulparams/z8001.sh ld/emulparams/z8002.sh ld/emultempl/README ld/emultempl/aix.em ld/emultempl/armcoff.em ld/emultempl/armelf.em ld/emultempl/armelf_oabi.em ld/emultempl/astring.sed ld/emultempl/beos.em ld/emultempl/elf32.em ld/emultempl/generic.em ld/emultempl/gld960.em ld/emultempl/gld960c.em ld/emultempl/hppaelf.em ld/emultempl/linux.em ld/emultempl/lnk960.em ld/emultempl/mipsecoff.em ld/emultempl/ostring.sed ld/emultempl/pe.em ld/emultempl/sunos.em ld/emultempl/vanilla.em ld/gen-doc.texi ld/genscripts.sh ld/h8-doc.texi ld/ld.1 ld/ld.h ld/ld.texinfo ld/ldcref.c ld/ldctor.c ld/ldctor.h ld/ldemul.c ld/ldemul.h ld/ldexp.c ld/ldexp.h ld/ldfile.c ld/ldfile.h ld/ldgram.y ld/ldint.texinfo ld/ldlang.c ld/ldlang.h ld/ldlex.h ld/ldlex.l ld/ldmain.c ld/ldmain.h ld/ldmisc.c ld/ldmisc.h ld/ldver.c ld/ldver.h ld/ldwrite.c ld/ldwrite.h ld/lexsup.c ld/mac-ld.r ld/mpw-config.in ld/mpw-elfmips.c ld/mpw-eppcmac.c ld/mpw-esh.c ld/mpw-idtmips.c ld/mpw-make.sed ld/mri.c ld/mri.h ld/pe-dll.c ld/pe-dll.h ld/po/Make-in ld/po/POTFILES.in ld/po/ld.pot ld/scripttempl/README ld/scripttempl/a29k.sc ld/scripttempl/aix.sc ld/scripttempl/alpha.sc ld/scripttempl/aout.sc ld/scripttempl/armaout.sc ld/scripttempl/armcoff.sc ld/scripttempl/delta68.sc ld/scripttempl/ebmon29k.sc ld/scripttempl/elf.sc ld/scripttempl/elf32avr.sc ld/scripttempl/elfd10v.sc ld/scripttempl/elfd30v.sc ld/scripttempl/elfi370.sc ld/scripttempl/elfppc.sc ld/scripttempl/epocpe.sc ld/scripttempl/h8300.sc ld/scripttempl/h8300h.sc ld/scripttempl/h8300s.sc ld/scripttempl/h8500.sc ld/scripttempl/h8500b.sc ld/scripttempl/h8500c.sc ld/scripttempl/h8500m.sc ld/scripttempl/h8500s.sc ld/scripttempl/hppaelf.sc ld/scripttempl/i386beos.sc ld/scripttempl/i386coff.sc ld/scripttempl/i386go32.sc ld/scripttempl/i386lynx.sc ld/scripttempl/i386msdos.sc ld/scripttempl/i960.sc ld/scripttempl/m68kaux.sc ld/scripttempl/m68kcoff.sc ld/scripttempl/m68klynx.sc ld/scripttempl/m88kbcs.sc ld/scripttempl/mcorepe.sc ld/scripttempl/mips.sc ld/scripttempl/mipsbsd.sc ld/scripttempl/nw.sc ld/scripttempl/pe.sc ld/scripttempl/pj.sc ld/scripttempl/ppcpe.sc ld/scripttempl/psos.sc ld/scripttempl/riscix.sc ld/scripttempl/sa29200.sc ld/scripttempl/sh.sc ld/scripttempl/sparccoff.sc ld/scripttempl/sparclynx.sc ld/scripttempl/st2000.sc ld/scripttempl/tic30aout.sc ld/scripttempl/tic30coff.sc ld/scripttempl/tic80coff.sc ld/scripttempl/v850.sc ld/scripttempl/vanilla.sc ld/scripttempl/w65.sc ld/scripttempl/z8000.sc ld/stamp-h.in ld/sysdep.h ld/testsuite/ChangeLog ld/testsuite/config/default.exp ld/testsuite/ld-bootstrap/bootstrap.exp ld/testsuite/ld-cdtest/cdtest-bar.cc ld/testsuite/ld-cdtest/cdtest-foo.cc ld/testsuite/ld-cdtest/cdtest-foo.h ld/testsuite/ld-cdtest/cdtest-main.cc ld/testsuite/ld-cdtest/cdtest.dat ld/testsuite/ld-cdtest/cdtest.exp ld/testsuite/ld-checks/asm.s ld/testsuite/ld-checks/checks.exp ld/testsuite/ld-checks/script ld/testsuite/ld-elfvers/vers.exp ld/testsuite/ld-elfvers/vers1.c ld/testsuite/ld-elfvers/vers1.dsym ld/testsuite/ld-elfvers/vers1.map ld/testsuite/ld-elfvers/vers1.sym ld/testsuite/ld-elfvers/vers1.ver ld/testsuite/ld-elfvers/vers13.asym ld/testsuite/ld-elfvers/vers15.c ld/testsuite/ld-elfvers/vers15.dsym ld/testsuite/ld-elfvers/vers15.sym ld/testsuite/ld-elfvers/vers15.ver ld/testsuite/ld-elfvers/vers16.c ld/testsuite/ld-elfvers/vers16.dsym ld/testsuite/ld-elfvers/vers16.map ld/testsuite/ld-elfvers/vers16a.c ld/testsuite/ld-elfvers/vers16a.dsym ld/testsuite/ld-elfvers/vers16a.ver ld/testsuite/ld-elfvers/vers17.c ld/testsuite/ld-elfvers/vers17.dsym ld/testsuite/ld-elfvers/vers17.map ld/testsuite/ld-elfvers/vers17.ver ld/testsuite/ld-elfvers/vers18.c ld/testsuite/ld-elfvers/vers18.dsym ld/testsuite/ld-elfvers/vers18.map ld/testsuite/ld-elfvers/vers18.sym ld/testsuite/ld-elfvers/vers18.ver ld/testsuite/ld-elfvers/vers19.c ld/testsuite/ld-elfvers/vers19.dsym ld/testsuite/ld-elfvers/vers19.ver ld/testsuite/ld-elfvers/vers2.c ld/testsuite/ld-elfvers/vers2.dsym ld/testsuite/ld-elfvers/vers2.map ld/testsuite/ld-elfvers/vers2.ver ld/testsuite/ld-elfvers/vers3.c ld/testsuite/ld-elfvers/vers3.dsym ld/testsuite/ld-elfvers/vers3.ver ld/testsuite/ld-elfvers/vers4.c ld/testsuite/ld-elfvers/vers4.sym ld/testsuite/ld-elfvers/vers4a.dsym ld/testsuite/ld-elfvers/vers4a.sym ld/testsuite/ld-elfvers/vers4a.ver ld/testsuite/ld-elfvers/vers5.c ld/testsuite/ld-elfvers/vers6.c ld/testsuite/ld-elfvers/vers6.dsym ld/testsuite/ld-elfvers/vers6.sym ld/testsuite/ld-elfvers/vers6.ver ld/testsuite/ld-elfvers/vers7.c ld/testsuite/ld-elfvers/vers7.map ld/testsuite/ld-elfvers/vers7a.c ld/testsuite/ld-elfvers/vers7a.dsym ld/testsuite/ld-elfvers/vers7a.sym ld/testsuite/ld-elfvers/vers7a.ver ld/testsuite/ld-elfvers/vers8.c ld/testsuite/ld-elfvers/vers8.map ld/testsuite/ld-elfvers/vers8.ver ld/testsuite/ld-elfvers/vers9.c ld/testsuite/ld-elfvers/vers9.dsym ld/testsuite/ld-elfvers/vers9.sym ld/testsuite/ld-elfvers/vers9.ver ld/testsuite/ld-empic/empic.exp ld/testsuite/ld-empic/relax.t ld/testsuite/ld-empic/relax1.c ld/testsuite/ld-empic/relax2.c ld/testsuite/ld-empic/relax3.c ld/testsuite/ld-empic/relax4.c ld/testsuite/ld-empic/run.c ld/testsuite/ld-empic/runtest1.c ld/testsuite/ld-empic/runtest2.c ld/testsuite/ld-empic/runtesti.s ld/testsuite/ld-scripts/cross1.c ld/testsuite/ld-scripts/cross1.t ld/testsuite/ld-scripts/cross2.c ld/testsuite/ld-scripts/cross2.t ld/testsuite/ld-scripts/cross3.c ld/testsuite/ld-scripts/crossref.exp ld/testsuite/ld-scripts/defined.exp ld/testsuite/ld-scripts/defined.s ld/testsuite/ld-scripts/defined.t ld/testsuite/ld-scripts/phdrs.exp ld/testsuite/ld-scripts/phdrs.s ld/testsuite/ld-scripts/phdrs.t ld/testsuite/ld-scripts/script.exp ld/testsuite/ld-scripts/script.s ld/testsuite/ld-scripts/script.t ld/testsuite/ld-scripts/scriptm.t ld/testsuite/ld-scripts/sizeof.exp ld/testsuite/ld-scripts/sizeof.s ld/testsuite/ld-scripts/sizeof.t ld/testsuite/ld-scripts/weak.exp ld/testsuite/ld-scripts/weak.t ld/testsuite/ld-scripts/weak1.s ld/testsuite/ld-scripts/weak2.s ld/testsuite/ld-selective/1.c ld/testsuite/ld-selective/2.c ld/testsuite/ld-selective/3.cc ld/testsuite/ld-selective/4.cc ld/testsuite/ld-selective/selective.exp ld/testsuite/ld-sh/sh.exp ld/testsuite/ld-sh/sh1.s ld/testsuite/ld-sh/sh2.c ld/testsuite/ld-sh/start.s ld/testsuite/ld-shared/elf-offset.ld ld/testsuite/ld-shared/main.c ld/testsuite/ld-shared/sh1.c ld/testsuite/ld-shared/sh2.c ld/testsuite/ld-shared/shared.dat ld/testsuite/ld-shared/shared.exp ld/testsuite/ld-shared/sun4.dat ld/testsuite/ld-shared/xcoff.dat ld/testsuite/ld-srec/sr1.c ld/testsuite/ld-srec/sr2.c ld/testsuite/ld-srec/sr3.cc ld/testsuite/ld-srec/srec.exp ld/testsuite/ld-undefined/undefined.c ld/testsuite/ld-undefined/undefined.exp ld/testsuite/ld-versados/t1-1.ro ld/testsuite/ld-versados/t1-2.ro ld/testsuite/ld-versados/t1.ld ld/testsuite/ld-versados/t1.ook ld/testsuite/ld-versados/t2-1.ro ld/testsuite/ld-versados/t2-2.ro ld/testsuite/ld-versados/t2-3.ro ld/testsuite/ld-versados/t2.ld ld/testsuite/ld-versados/t2.ook ld/testsuite/ld-versados/versados.exp ld/testsuite/lib/ld-lib.exp --- diff --git a/binutils/ChangeLog b/binutils/ChangeLog deleted file mode 100644 index 79436b3c8e1..00000000000 --- a/binutils/ChangeLog +++ /dev/null @@ -1,7506 +0,0 @@ -Fri Apr 7 15:56:57 2000 Andrew Cagney - - * configure.in (WARN_CFLAGS): Set to -W -Wall by default. Add - --enable-build-warnings option. - * Makefile.am (AM_CFLAGS, WARN_CFLAGS): Add definitions. - * Makefile.in, configure: Re-generate. - -2000-04-06 Alan Modra - - * addr2line.c: Update copyright. - * objcopy.1: Likewise, and title. - * strings.1: Likewise. - - * version.c (print_version): Add 2000. - - * rddbg.c (read_section_stabs_debugging_info): Don't use - bfd_size_type for strx to avoid printf problems if BFD64. - - * bucomm.c: (report): Remove `static'. - Move inclusion of stdarg.h/vararg.h from here. - * bucomm.h: To here. - (CONST): Change all occurences to const. - (report): Declare it. - (bfd_fatal): Add ATTRIBUTE_NORETURN. - (fatal): Add ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN. - (non_fatal): Add ATTRIBUTE_PRINTF_1. - - * ar.c (main): Use fatal or non_fatal instead of fprintf. - Correct a typo in an error message. - (do_quick_append): Use non_fatal instead of fprintf. - (move_members): Use fatal instead of fprintf, exit. - * coffdump.c (main): Same here. - - * dlltool.c (display): Delete. - (warn): Delete. - (inform): Use `report' instead of `display'. - (rvaafter): Remove trailing \n from fatal error msg. - (rvabefore): Ditto. - (asm_prefix): Ditto. - (yyerror): Replace `warn' with `non_fatal', and remove \n. - (def_name): Likewise. - (run): Likewise. - (scan_all_symbols): Likewise. - (gen_lib_file): Likewise. - (def_library): Likewise. Remove extra program_name too. - (run): Remove \n from inform strings. - (scan_drectve_symbols): Likewise. - (add_excludes): Likewise. - (scan_open_obj_file): Likewise. - (gen_exp_file): Likewise. - (gen_lib_file): Likewise. - (process_duplicates): Likewise. - - * Makefile.am (dllwrap_SOURCES): Add version.c. - * dllwrap.c (program_version): Delete. - (print_version): Delete. - (display): Always print trailing \n. - (warn): New. - (delete_temp_files): Use warn instead of fprintf. Use gettext. - (run): Here too. - (main): And here. - (usage): gettext'ify. - (long_options): Add missing initialisers. - - * nlmconv.c (main): Use fatal/non_fatal instead of fprintf. - (select_output_format): Likewise. - (powerpc_mangle_relocs): Likewise. - (link_inputs): Likewise. - - * nm.c (set_print_radix): Use fatal instead of fprintf, exit. - (set_output_format): Likewise. - (main): Use non_fatal instead of fprintf. - (display_rel_file): Likewise. - - * objdump.c (slurp_symtab): Use non_fatal instead of fprintf. - (slurp_dynamic_symtab): Same here. - (disassemble_data): And here. - (read_section_stabs): And here. - (read_section_stabs): And here. - (dump_bfd): And here. - (main): And here. - (objdump_sprintf): Use fatal instead of fprintf, exit. - (disassemble_data): Same here. - - * rdcoff.c (parse_coff_type): Use non_fatal instead of fprintf. - (parse_coff_struct_type): Same here. - (parse_coff_enum_type): And here. - (parse_coff): And here. - * rddbg.c (read_debugging_info): And here. - * size.c (main): And here. - * windres.c (format_from_name): And here. - * wrstabs.c (stab_write_symbol): Here too. - (write_stabs_in_sections_debugging_info): And here. - (stab_int_type): And here. - (stab_struct_field): And here. - (stab_typdef): And here. - - * rescoff.c (read_coff_rsrc): Use fatal instead of fprintf, exit. - * srconv.c (main): Same here. - * strings.c (main): And here. - (integer_arg): And here. - * sysdump.c (main): And here. - -2000-04-06 Timothy Wall - - * objdump.c (dump_section_header): Print CLINK and BLOCK flags. - -2000-04-06 Jason Merrill - - * readelf.c (decode_location_expression): Loop through multiple - operations. - (read_and_display_attr): Pass in length. - - * readelf.c (read_and_display_attr): Add CU offset to references. - (display_debug_info): Pass it in. - -2000-04-06 Nick Clifton - - * readelf.c (decode_ARM_machine_flags): New function. - (get_machine_flags): Call decode_ARM_machine_flags for ARM - targets. - - (get_machine_name): Catch EM_AVR - -2000-04-05 Alan Modra - - * binutils.texi: Remove optional `=' from long options that have - an `=' in the argument. - * objcopy.1: Here too. Remove extra space on discard-all. - - * binutils.texi (objcopy): Mention --redefine-sym. - * objcopy.1: Here too. - * NEWS: And here. - - * objcopy.c (parse_flags): Split off flag names from error message - gettext as they are not translated. - (copy_main): Similarly split off option name for --add-section, - --set-section-flags, --change-section-vma, --change-section-lma - error messages. - Some white space changes. - - from Matthew Benjamin - * objcopy.c (struct redefine_node): New. - (redefine_sym_list): New. - (redefine_list_append): New. - (lookup_sym_redefinition): New. - (OPTION_REDEFINE_SYM): New. - (copy_options): Add --redefine-sym option. - (copy_usage): Mention it. - (filter_symbols): Rename symbols on redefine_sym_list. - (copy_object): Call filter_symbols if redefine_sym_list != NULL. - (copy_main): Handle OPTION_REDEFINE_SYM. - -2000-04-04 H.J. Lu - - * readelf.c (process_symbol_table): Correctly read in symbol - versioning information. - -2000-04-04 Alan Modra - - * po/binutils.pot: Regenerate. - - * addr2line.c (usage): Restore translated part of bug string. - * ar.c (usage): Likewise. - * nlmconv.c (show_usage): Likewise. - * nm.c (usage): Likewise. - * objcopy.c (copy_usage): Likewise. - (strip_usage): Likewise. - * objdump.c (usage): Likewise. - * readelf.c (usage): Likewise. - * size.c (usage): Likewise. - * strings.c (usage): Likewise. - * windres.c (usage): Likewise. - - * Makefile.am (MKDEP): Use gcc -MM rather than mkdep. - (DEP): Quote when passing vars to sub-make. Add warning - message to end. - (DEP1): Rewrite for "gcc -MM". - (CLEANFILES): Add DEP2. - Update dependencies. - * Makefile.in: Regenerate. - -2000-04-04 H.J. Lu - - * Makefile.am (GENERATED_HFILES): Add rcparse.h - (arparse.h): Depend on arparse.c - (defparse.h, nlmheader.h, rcparse.h, sysinfo.h): Similarly. - -2000-04-03 H.J. Lu (hjl@gnu.org) - - * size.c (usage): Use REPORT_BUGS_TO. - -2000-04-03 Alan Modra - - * bucomm.h: #include "bin-bugs.h" - * addr2line.c (usage): Use REPORT_BUGS_TO. - * ar.c (usage): Likewise. - * nlmconv.c (show_usage): Likewise. - * nm.c (usage): Likewise. - (OPTION_TARGET): Define. - (long_options): Use OPTION_TARGET rather than 200. - (main): Likewise. - - * objcopy.c (copy_usage): Use REPORT_BUGS_TO. - (strip_usage): Likewise. - * objdump.c (usage): Likewise. - * readelf.c (usage): Likewise. - * strings.c (usage): Likewise. - * windres.c (usage): Likewise. - -2000-03-31 John David Anglin - - * readelf.c: Include sys/types.h before sys/stat.h for ultrix. - -2000-03-27 Nick Clifton - - * rddbg.c (read_section_stabs_debugging_info): Catch out of range - string offsets in corrupt stabs entries. - -2000-03-27 Alan Modra - - * readelf.c: Include elf/avr.h - (dump_relocations): Add EM_AVR case. - -2000-03-09 Tim Waugh - - * strings.1: Correct '-bytes' to '--bytes'. - -2000-03-08 H.J. Lu - - * Makefile.am (install-exec-local): Depend on - install-binPROGRAMS for parallel make. - * Makefile.in: Regenerated. - -2000-02-27 Ian Lance Taylor - - From Brad Lucier : - * readelf.c (process_dynamic_segment): Add cast to make sure - argument to %* is int. - -2000-02-25 H.J. Lu - - * configure.in (AC_SEARCH_LIBS): Pass m, not -lm. - -2000-02-24 Nick Clifton - - * configure.in: Add arm-wince, mips-pe and sh-pe targets. - * configure: Regenerate. - - * dlltoolc.: Add support for sh-pe and mips-pe targets. - * rescoff.c: Add support for sh-pe and mips-pe targets. - -2000-02-23 H.J. Lu - - * readelf.c (get_osabi_name): Handle ELFOSABI_LINUX. - -2000-02-22 Nick Clifton - - * readelf.c (process_symbol_table): Remove use of ELF_ST_OTHER. - -2000-02-22 Ian Lance Taylor - - From Brad Lucier : - * readelf.c (process_version_sections): Add casts to make sure - argument to %* is an int. - (process_mips_specific): Add casts to make printf arguments match - format. - -2000-02-21 Alan Modra - - * objdump.c (dump_section_header): Change `opb' to unsigned. - (find_symbol_for_address): Same here. - (disassemble_data): And here. Change `addr_offset', - `stop_offset', `nextstop_offset' to unsigned long. - (dump_data): Change opb to unsigned. - -2000-02-18 Frank Ch. Eigler - - * resrc.c: Remove unmatched #if for cygwin. - -2000-02-14 Fernando Nasser - - * binutils.texi: Document the change of flavor name from atpcs-special - to special-atpcs to prevent name conflict in gdb. - -2000-02-08 Timothy Wall - - * objdump.c (show_line): Fix bug preventing printing of the very - first line (line zero) of a file when interlisting source and - assembly. Added option to print entire context from start of file - when the first line from that file is encountered. - -2000-02-03 Timothy Wall - - * binutils/objdump.c (dump_section_header, find_symbol_for_address, - show_line, disassemble_bytes, disassemble_data, dump_data): - distinguish between octets and bytes. - -2000-01-27 Thomas de Lellis - - * nm.c (print_symbol_info_bsd): Use bfd_is_undefined_symclass to - check to unresolved symbols. - (print_symbol_info_sysv): Ditto. - (print_symbol_info_posix): Ditto. - - * binutils.texi: Document new 'V' symclass flag for nm. - -2000-01-27 Nick Clifton - - * binutils.texi (objdump): Document new ARM specific - disassembler options. - - * objdump.c (usage): Call disassembler_usage(). - -2000-01-27 Alan Modra - - * readelf.c (get_dynamic_flags): Return buff. - (process_dynamic_segment): Don't pass error strings to printf - as format arg. - (read_and_display_attr): Use lx and ld to print longs. - (process_corefile_note_segment): Cast bfd_vma to unsigned long - before printing. - Update copyright. - -2000-01-17 Nick Clifton - - * readelf.c (get_osabi_name): Recognise ELFOSABI_ARM. - -2000-01-15 Alan Modra - - * debug.c (debug_name_type): Return DEBUG_TYPE_NULL rather than - false. - (debug_tag_type): Here too. - * ieee.c (ieee_builtin_type): And here. - * stabs.c (parse_stab_type, parse_stab_array_type): And here. - -2000-01-13 Nick Clifton - - * readelf.c (get_machine_name): Change EM_S370 to return "IBM - System/370". - -2000-01-11 Nick Clifton - - * readelf.c (get_dynamic_type): Remove DT_ENCODING. - -2000-01-10 Nick Clifton - - * readelf.c (get_note_type): Display NT_WIN32PSTATUS notes. - -2000-01-07 Mumit Khan - - * windres.c (long_options): Add --use-temp-file and - --no-use-temp-file options. - (usage): Document. - (main): Handle. - - * windres.h: Update read_rc_file prototype. - - * resrc.c (cpp_temp_file): New static variable. - (istream_type): New static variable. - (close_pipe): Delete function. - (run_cmd): New static function. - (open_input_stream): New static function. - (close_input_stream): New static function. - (look_for_default): Handle DOS directory separator. Use - open_input_stream instead of popen. - (read_rc_file): Likewise. - - * binutils.texi: Document --use-temp-file, --no-use-temp-file - options. - -2000-01-04 Mumit Khan - - * dlltool.c (create_compat_implib): New variable. - (gen_exp_file): Use. - (make_one_lib_file): Use. - (long_options): Add --compat-implib option. - (usage): Handle. - (main): Handle. - - * dllwrap.c (enum target_type): Rename MINGW32_TARGET to MINGW_TARGET. - (main): Use. Don't look for "32" in cygwin and mingw target names. - -2000-01-03 Nick Clifton - - * binutils.texi: Document new, ARM specific disassembler - command line switch "-M force-thumb". - -1999-12-28 Nick Clifton - - * readelf.c: Update with new constants added by Oct 4, 1999 - ELF ABI draft. - (guess_is_rela): Add new machine codes, but leave - rel type undetermined. - (get_machine_name): Add new machine codes. - (get_section_type_name): Add new section types. - (get_elf_section_flags): New funciton: Decode section flags. - (process_section_headers): Call get_elf_section_flags() in - order to decode flags in section header. - (get_dynamic_flags): New function: Decode dynamic section - flags. - (process_dynamic_section): Display flags (if present). - (get_symbol_type): Add STT_COMMON. - (get_symbol_visibility): New function: Decode a symbol's - visibility. - (process_symbol_table): Call get_symbol_visibility(). - (get_note_type): Add NT_PRXFPREGS. - -1999-12-26 Ian Lance Taylor - - * strings.c (main): Correct handling of numeric argument. - -1999-12-23 Andrew Haley - - * dlltool.c (mtable): mcore how_jtab_roff is 4 bytes into the - jtab; was 8. - -1999-12-17 Nick Clifton - - * dlltool.c (mtable): Stop compile time warnings about missing - initialisers. - (yyerror): Stop compile time warnings about unused paramater. - (INIT_SEC_DATA): New macro: initialise an entry in the secdata - array. - (secdata): Stop ccompile time warnings about uninitialised - fields. - (dtab): Stop compile time warnings about unused parameter. - (long_options): Stop compile time warning about missing - initialiser. - -1999-12-10 Nick Clifton - - * readelf.c (print_vma): Support native 64bit ELF systems. - -1999-12-09 Nick Clifton - - * dlltool.c (mtable): Add epoc-arm specific entry. - Make default arm entry pass -mpacs-26 to assembler. - (flush_page): Do not mangle null entries. - -1999-12-07 H . J . Lu hjl@valinux.com - - * readelf.c: Fix compile time warnings. Support more than 999 - symbols. - -1999-12-03 Nick Clifton - - * readelf.c (enum print_mode): New type. - (print_vma): New function. - (dump_relocations): Use print_vma to display bfd_vma values. - (process_file_header): Use print_vma to display bfd_vma values. - (process_program_headers): Use print_vma to display bfd_vma values. - (process_section_headers): Use print_vma to display bfd_vma values. - (dynamic_segment_parisc_val): Use print_vma to display bfd_vma values. - (process_dynamic_segment): Use print_vma to display bfd_vma values. - (process_symbol_table): Use print_vma to display bfd_vma values. - (process_mips_specific): Use print_vma to display bfd_vma values. - -1999-11-25 Fred Fish - - * readelf.c (process_note): Change arg from Elf_External_Note - to Elf32_Internal_Note, which also turns the function body - into little more than a call to printf. - (process_corefile_note_segment): Substantially rewritten - to properly handle case where target and host are different - endianness, handle note sections with padding, and add some - cruft to handle notes with unterminated name data. - -1999-11-22 Nick Clifton - - * objcopy.c (copy_usage): Reformat. - (strip_usage): Reformat. - -1999-11-21 Nick Clifton - - * objdump.c (usage): Overhaul output: One line per switch. - Textual description of each switch. Distinguish between - optional switches and required switches. - (long_options): Add 'g', 'G' and 'z' short options. - (main): Distinguish between optional switches and required - switches. - - * binutils.texi: Add -g -G and -z short options for - --debugging, --stabs and --disassemble-zeroes. - -1999-11-03 Nick Clifton - - * dlltool.c (flush_page): Clip short values to prevent warnings - from the assembler. - Change default mcore machine name to 'mcore-le' and rename - big-endian version to 'mcore-be'. - -1999-10-27 Fred Fish - - * objdump.c (display_bfd): Break into two functions. The - actual dumping code moves to dump_bfd. If bfd is not - unambiguously recognized as a bfd_object, attempt to dump - it as a bfd_core. - (dump_bfd): New function. - -1999-10-26 Nick Clifton - - * dlltool.c (assemble_file): Remove spurious test of exp_name. - -1999-10-22 Nick Clifton - - * dlltool.c (struct mac): Add new field 'how_default_as_switches'. - (mtable): Initialise new field. Some machines have a non empty - string for this field. - (HOW_BFD_TARGET): Undefine and replace with... - (HOW_BFD_READ_TARGET): New macro: bfd target to use when opening a - file for reading. This is set to 0 so that any recognisable bfd - format can be read. - (HOW_BFD_WRITE_TARGET): New macro: bfd target to use when opening - a file for writing. This is set to the target machine type. - (ASM_SWITCHES): New macro: default switches to use when assembling - a file. - (assemble_file): New function: Assemble a source file into a - destination object file. - (gen_exp_file): Use assemble_file to create the exp file. - (make_one_lib_file): Use assemble_file to create the lib file. - Open output file use HOW_BFD_WRITE_TARGET and input files using - HOW_BFD_READ_TARGET. - (make_head): Use assemble_file to create the head file. - (make_tail): Use assemble_file to create the tail file. - (gen_lib_file): Open output file use HOW_BFD_WRITE_TARGET. - -1999-10-15 Ian Lance Taylor - - * ar.c (normalize): Fix full_pathname code. - -1999-10-08 Ben Elliston - - * binutils.texi: Some rewording and clarifications. - -1999-09-15 Ulrich Drepper - - * readelf.c (dynamic_segment_parisc_val): Print 0 for DLD_FLAGS if - the value is zero. - (process_symbol_table): Don't print histogram if hash table is empty. - -1999-09-15 Ulrich Drepper - - * readelf.c (get_parisc_dynamic_type): Handle DT_HP_GST_* values. - -1999-09-02 Ulrich Drepper - - * readelf.c (get_symbol_type): Add support for HPUX and PARISC - specific symbol types. - - * readelf.c: Add HPUX and PARISC extensions to dynamic and program - header table printing. - - * readelf.c (get_machine_flags): Add handling of PARISC. - -1999-09-29 Mumit Khan - - * dlltool.c (scan_drectve_symbols): Handle type tags in exported - symbols. - (scan_filtered_symbols): Likewise. - -1999-09-19 Ian Lance Taylor - - * resrc.c (write_rc_rcdata): Fix local variable shadowing - problem. If RCDATA_BUFFER data can be read as strings, modify - code to print the strings as comments. - * resres.c: Add casts to avoid warnings. - (write_res_data, read_res_data): Don't put the program name in the - error message; fatal already puts it there. - -1999-09-14 Michael Meissner - - * configure.in (Canonicalization of target names): Remove adding - ${CONFIG_SHELL} in front of $ac_config_sub, since autoconfig 2.14 - generates $ac_config_sub with a ${CONFIG_SHELL} already. - * configure: Regenerate. - -1999-09-12 Ian Lance Taylor - - * ar.c (main): Clear output_file if we don't change the archive. - (delete_members, replace_members): Likewise. - -1999-09-12 Donn Terry - - * objdump.c (dump_headers): If wide_output, print Flags header. - - * objdump.c (dump_section_header): Print any comdat information. - - * objcopy.c (parse_flags): Handle "noload", "debug", and "share". - * binutils.texi, objcopy.1: Document new flags. - - * ar.c (counted_name_mode): New static variable. - (counted_name_counter): New static variable. - (map_over_members): Handle counted mode. - (usage): Mention N modifier. - (main): Handle N modifier. - (delete_members): Handle counted mode. - * binutils.texi, ar.1: Document N modifier. - - * ar.c (print_contents): Change printing of member name for - POSIX.2 conformance. - - * ar.c (output_filename): Make const. - (open_inarch): If creating a new empty archive, set - output_filename. - -1999-09-12 Ian Lance Taylor - - * ar.c (full_pathname): New static variable. - (map_over_members): Call normalize on command line parameter. - (usage): Mention P modifier. - (normalize): If full_pathname is true, don't do anything. - (main): Accept P modifier. - (delete_members): Call normalize on command line parameter. - * binutils.texi, ar.1: Document P modifier. - -1999-09-09 Andreas Schwab - - * binutils.texi: Add info dir entries for all programs described - here. Fix arguments of @var to not contain punctuation. - -1999-09-06 Donn Terry - - * nm.c (print_symbol_info_bsd): Check for 'w' as well as 'U'. - (print_symbol_info_sysv): Likewise. - (print_symbol_info_posix): Likewise. - -1999-09-04 Steve Chamberlain - - * readelf.c: Include "elf/pj.h". - (dump_relocations): Handle EM_PJ. - (get_machine_name): Likewise. - (get_machine_flags): Likewise. - -1999-08-31 Scott Bambrough - - * readelf.c (get_note_type): New function: Decode the e_type - value of a note. - (process_note): New function: Display the contents of a core note. - (process_corefile_note_segment): New function. - (process_corefile_note_segments): New function. - (process_corefile_contents): New function. - (process_file): Add call to process_corefile_contents. - (parse_args): Add parsing of -n/--notes command line switch. - (usage): Document new command line switch. - - * binutils.texi: Documemnt new command line switch to readelf. - -1999-08-31 Ian Lance Taylor - - * binutils.texi (Bug Reporting): Clarify that large files should - not be sent to bug-gnu-utils. - -1999-08-28 Stephane Carrez - - * readelf.c (process_extended_line_op): New parameter pointer_size, - read the address according to pointer_size. - (debug_line_pointer_size): New global to indicate the - size of address in .debug_line section. - (debug_displays, prescan_debug_info): Prescan the .debug_info section - to record the size of address in `debug_line_pointer_size'. - (process_section_contents): Before dumping any section, execute - the pre-scan operation defined for some debug sections. - -1999-08-27 Jim Wilson - - * readelf.c (display_debug_lines): Use i-1 not i in standard_opcodes - access. - (display_debug_aranges): New local excess. Use for calculating padding - and add that into ranges. Break from loop only if length is also 0. - -1999-08-27 Jim Wilson - - * readelf.c (display_debug_lines, case DW_LNS_const_add_pc): Multiply - adv by info.li_min_insn_length. - -1999-08-26 Jakub Jelinek - - * readelf.c (get_sparc64_dynamic_type): New function. - (get_dynamic_type): Use it. - -1999-08-26 Jim Wilson - - * readelf.c (display_debug_lines, case default): Change second line - setting adv to use = not +=. - -1999-08-19 Nick Clifton - - * dlltool.c: Added more examples to the comment at the start. - -1999-08-18 Nick Clifton - - * dlltool.c (make_head): Only emit interworking directive if - necessary. - -Thu Jul 15 22:44:21 1999 Hans-Peter Nilsson - - * readelf.c (process_abbrev_section): Handle standard-conforming - single zero at the end of the section. - -1999-08-09 Ian Lance Taylor - - * objdump.c (exit_status): New static variable. - (nonfatal): New static function. - (disassemble_data): Set exit_status on error. - (read_section_stabs): Likewise. - (display_bfd): Likewise. Call nonfatal rather than bfd_nonfatal. - (display_file): Call nonfatal rather than bfd_nonfatal. - (display_target_list, display_info_table): Likewise. - (main): Return exit_status rather than 0. - -1999-08-08 Ian Lance Taylor - - * objdump.c (dump_section_header): Update for renaming of - SEC_SHORT to SEC_SMALL_DATA. Print SEC_SHARED flag. - - From Eli Zaretskii : - * binutils.texi: Document cxxfilt as MS-DOS name for c++filt. - - * configure.in: Define and substitute DEMANGLER_NAME. - * Makefile.am (DEMANGLER_PROG): Set to cxxfilt. - (man_MANS): Use DEMANGLER_NAME rather than DEMANGLER_PROG. - (bin_PROGRAMS): Remove $(DEMANGLER_PROG). - (noinst_PROGRAMS): Add $(DEMANGLER_PROG). - (cxxfilt_SOURCES): Rename from c__filt_SOURCES. - (cxxfilt_LDADD): Rename from c__filt_LDADD. - ($(DEMANGLER_NAME).1): Rename from $(DEMANGLER_PROG).1. Use - DEMANGLER_NAME rather than DEMANGLER_PROG in substitution. - (MOSTLYCLEANFILES): Use DEMANGLER_NAME rather than - DEMANGLER_PROG. - (install-exec-local): When installing noinst_PROGRAMS, change - cxxfilt to $(DEMANGLER_NAME). - * configure, Makefile.in: Rebuild. - - * Makefile.am: Rename .dep* files to DEP*. Change DEP variable to - MKDEP. - * Makefile.in: Rebuild. - -1999-08-05 Donn Terry - - * Makefile.am (YACC): If bison is not in the source tree, use - @YACC@ rather than bison -y. - (LEX): If flex is not in the source tree, use @LEX@ rather than - flex. - * configure.in: Build dlltool for i[3-6]86-*-interix. - * Makefile.in, configure: Rebuild. - -1999-07-21 Ian Lance Taylor - - From Mark Elbrecht: - * configure.bat: Remove; obsolete. - -1999-07-16 Jakub Jelinek - - * readelf.c (get_machine_flags): Print EF_SPARC_SUN_US3. - -1999-07-15 Ian Lance Taylor - - * configure.in: Bump version number to 2.9.5. - * configure: Rebuild. - -1999-07-14 Richard Henderson - - * objdump.c (dump_section_header): Print SEC_SHORT. - -1999-07-11 Ian Lance Taylor - - * Many files: Changes to avoid gcc warnings: Add ATTRIBUTE_UNUSED - as appropriate. Add variable initializations. Add casts. - * objdump.c (disassemble_bytes): Change j to bfd_vma. - * readelf.c (process_syminfo): Change i to unsigned int. - (display_debug_info): Change abbrev_number to unsigned long. - (process_mips_specific): Change fcnt to size_t. - -1999-07-09 Nick Clifton - - * readelf.c: Only support decoding 64bit ELF files if the compiler - supports a 64 bit data type. - Add -I equivalent for --histogram. - Add -A command-line option to display architecture specific information. - -1999-07-08 Jakub Jelinek - - * readelf.c (guess_is_rela): Sparcv9 and v8plus use rela. - (dump_relocations): Use ELF64_R_TYPE_ID for Sparc, for R_SPARC_OLO10 - print the secondary addend. - (get_machine_flags): Print Sparc machine flags. - (get_symbol_type): Print STT_REGISTER. - -1999-07-08 Ian Lance Taylor - - * stabs.c (parse_stab_type): Fix handling of template names with - template parameters containing `::'. - (stab_demangle_type): Handle a qualified name in a pointer to - member. - -1999-06-23 Ian Lance Taylor - - * Makefile.am (dlltool_SOURCES): Add dyn-string.c. - * Makefile.in: Rebuild. - -1999-06-23 Mumit Khan - - * configure.in (HAVE_EXECUTABLE_SUFFIX): Define. - * dlltool.c (look_for_prog): Use HAVE_EXECUTABLE_SUFFIX. - * dllwrap.c (look_for_prog): Likewise. - * resrc.c (look_for_default): Likewise. - * configure, config.in: Rebuild. - -1999-06-22 Ian Lance Taylor - - Based on patches from Mumit Khan : - * configure.in: Define EXECUTABLE_SUFFIX. - * dlltool.c: Include "dyn-string.h". Include based on - ANSI_PROTOTYPES, not __STDC__. - (outfile): Remove. - (gen_exp_file): Change uses of outfile to use alloca. - (make_one_lib_file, make_head, make_tail): Likewise. - (gen_lib_file): Likewise. - (look_for_prog): New static function. - (deduce_name): Rewrite to use look_for_prog. - (mcore_elf_gen_out_file): Use dyn_string_t rather than outfile. - * dllwrap.c: Don't include , , , - , or . Include and either - or . - (driver_name): Initialize to NULL, not "gcc". - (dlltool_name): Initialize to NULL, not "dlltool". - (display, inform, look_for_prog, deduce_name): New static - functions. - (usage): Mention -mno-cygwin. - (OPTION_MNO_CYGWIN): Define. - (main): Handle -mno-cygwin. Deduce driver_name and dlltool_name. - * resrc.c (look_for_default): Make static. Remove unused local - path. Check using EXECUTABLE_SUFFIX. - (read_rc_file): Allocate enough space to hold EXECUTABLE_SUFFIX. - * Makefile.am: Rebuild dependencies. - (dllwrap_LDADD): Add $(INTLLIBS). - * configure, Makefile.in, config.in: Rebuild. - -Mon Jun 21 16:49:11 1999 Jeffrey A Law (law@cygnus.com) - - * readelf.c (dump_relocations): Use elf_hppa_reloc_type instead of - elf32_hppa_reloc_type. - -1999-06-17 Nick Clifton - - * dlltool.c (mcore_elf_gen_out_file): Link object files with the - .exp file, not the .lib file. - -Fri Jun 18 20:17:51 1999 Mumit Khan - - * deflex.l: Accept single-character symbol names. - -1999-06-16 Nick Clifton - - * readelf.c (get_symbol_type): Detect ARM symbols typed as Thumb - functions. - -1999-06-14 Nick Clifton - - * objdump.c (disassembler_options): New variable. - (usage): Document new -M/--disassembler-options option. - (long_options): Add --disassembler-options. - (disassemble_data): Initialise disassembler_options field of - disassembler_info structure. - (main): Add parsing of -M option. - - * binutils.texi: Document new command line switch to objdump. - - * NEWS: Describe new command line switch to objdump. - - -Mon Jun 14 10:27:54 1999 Andreas Schwab - - * binutils.texi: Fix typos. - -1999-06-13 Ian Lance Taylor - - * objdump.c (disassemble_bytes): If the disassembler returns an - error, print out anything it may have printed to the buffer. From - H.J. Lu . - - * defparse.y (explist): Remove separate expline to eliminate - shift/reduce conflict. - - From Kai-Uwe Rommel : - * defparse.y: Add tokens NONSHARED, SINGLE, MULTIPLE, - INITINSTANCE, INITGLOBAL, TERMINSTANCE, and TERMGLOBAL. - (command): Add option_list after LIBRARY. - (attr): Accept and ignore NONSHARED, SINGLE, and MULTIPLE. - (option_list, option): New nonterminals. - * deflex.l: Recognize NONSHARED, SINGLE, MULTIPLE, INITINSTANCE, - INITGLOBAL, TERMINSTANCE, and TERMGLOBAL. - -1999-06-12 Ian Lance Taylor - - * ar.c (O_BINARY): Define as 0 if not defined. - (ranlib_touch): Open file with O_BINARY. - - * rename.c (O_BINARY): Define as 0 if not defined. - (simple_copy): Open files with O_BINARY. - - Based on patch from H. Peter Anvin : - * objcopy.c (struct section_list): Add copy field. - (sections_copied): New static variable. - (copy_options): Add "only-section". - (copy_usage): Mention -j and --only-section. - (find_section_list): Initialize copy field. - (is_strip_section): Check for copying sections. - (copy_object): Check sections_copied when calling filter_symbols. - (setup_section): Check for copying sections. - (copy_section): Likewise. - (copy_main): Handle -j/--only-section. - * binutils.texi, objcopy.1: Document -j/--only-section. - - * configure.in: If frexp is not available, check in -lm. - * configure: Rebuild. - - * readelf.c (get_elf_class): Use correct printf format for type. - (get_data_encoding): Likewise. - (get_osabi_name): Likewise. - (process_file_header): Don't pass an extra argument to printf. - (process_dynamic_segment): Cast dynamic_size to long before - printing. - (decode_location_expression): Cast byte_get to long before - printing. - -Wed Jun 9 11:40:16 1999 Andreas Schwab - - * readelf.c (dump_section): Cast values from byte_get to - [unsigned] long for printing, in case it is wider than long. - (display_block): Likewise. - (read_and_display_attr): Likewise. - (decode_location_expression): Likewise. Don't depend on - evaluation order. - -Mon Jun 7 12:14:57 1999 Andreas Schwab - - * windres.c (usage): Fix typo. - -1999-06-04 Nick Clifton - - * readelf.c: Use 64bit wide fields in internal strcutures even if - targetting a 32bit architecture. - (dump_relocations): Take a new parameter - the number of symbols - in the symbol table. - -1999-06-04 Nick Clifton - - * readelf.c: Add support for 64bit ELF files. - -1999-06-03 Nick Clifton - - * dlltool.c (mcore_elf_gen_out_file): Use constants for temporary - file names. - -Wed Jun 2 12:34:36 1999 Richard Henderson - - * dlltool.c (gen_exp_file): Revert 19990411 change. - -Mon May 31 09:56:22 1999 Andreas Schwab - - * readelf.c (process_relocs): Determine type of reloc from - DT_PLTREL and from section type. - -1999-05-29 Nick Clifton - - * readelf.c (get_elf_class): Display unknown class number. - (get_data_encoding): Display unknown encoding number. - (get_osabi_name): Display unknown ABI number. - (process_file_header): Display unknown version number. - -1999-05-29 Nick Clifton - - * readelf.c (dump_relocations): Fix typo. - -1999-05-28 Nick Clifton - - * readelf.c (dump_relocations): Add extra parameter: is_rela to - specify the kind of relocations to be dumped. Call guess_is_rela - if this parameter has a value of UNKNOWN. - (guess_is_rela): New function: Guess the kind of reloc being used - baced on the machine number. - (process_relocs): Determine type of reloc before calling - dump_relocations. - -1999-05-28 Ian Lance Taylor - - * readelf.c: Include "elf/i960.h". - (dump_relocations): Handle EM_960. - -Thu May 27 11:58:33 1999 Andreas Schwab - - * objcopy.c (copy_archive): Preserve dates of archive members if - requested. - - * readelf.c (dump_relocations): Always print the addend on RELA - systems even if there is no symbol. - (process_program_headers): Reset dynamic_size before looping - through the program headers. - (process_version_sections): Cast sh_offset to unsigned long for - printing in case bfd_vma is wider. - (process_symbol_table): Use get_symbol_index_type when printing - st_shndx. - -1999-05-17 DJ Delorie - - * windres.c: add verbose option - (main): process verbose option - * resrc.c (look_for_default): new. Look for the default - preprocessor in a given location. - (read_rc_file): for foo/bar-windres, look for foo/bar-gcc, - foo/gcc (in case of foo/windres), and then gcc (the old default). - -1999-05-16 Nick Clifton - - * dlltool.c (deduce_name): New function: Deduce name of program to - run. - (mcore_elf_out_file): New variable: Name of mcore-elf output file. - (mcore_elf_linker): New variable: Name of linker to use. - (mcore_elf_linker_flags): New variable: Linker flags to pass. - (scan_obj_file): Cache filenames if necessary. - (usage): Document new command line options. - (main): Support new command line options: -M (generate an - mcore-elf output file) -L (name of linker to use) -F (flags to - pass to linker). - (mcore_elf_cache_filename): Store a filename in a cache. - (mcore_elf_gen_out_file): New function: Generate an output file - per the mcore-elf spec. - -1999-05-15 Nick Clifton - - * configure.in (BUILD_MISC): Build dlltool for mcore - * configure: Regenerate. - * dlltool.c: Update example in comment. - (DLLTOOL_MCORE): Define. - (DLLTOOL_MCORE_ELF): Define. - (DRECTVE_SECTION_NAME): Define. - (mcore_be_jtab, mcore_le_jtab): Binary for performing an mcore - jump to address. - (mtable): Add entries for mcore variants. - (rvaafter, rvabefore, asm_prefix): Add mcore suppport. - (scan_drectve_symbols): Use DRECTVE_SECTION_NAME. - (make_head, make_tail): Cope if file cannot be created. - (usage): Improve layout. - -1999-05-13 DJ Delorie - - * rclex.l: add code to suppress certain output from cpp, replace - all returns with MAYBE_RETURN - (MAYBE_RETURN): new, implement the suppression by returning - IGNORED_TOKEN as needed. - (cpp_line): remember which file we're in, mark data from included - *.h files for suppression. - * rcparse.y (input): allow IGNORED_TOKEN outside of known constructs - -1999-05-10 DJ Delorie - - * windres.c (quot): Quote shell metacharacters in a string - (main): quote parameters to cpp that might have metacharacters in - them. Allow -D as an alias for --define to allow for sharing make - macros with gcc. - - * objdump.c (dump_reloc_set): don't core if howto->name is NULL - - * Makefile.am: Give rescoff.c a cpu-specific -D so it can set - the correct BFD. - * Makefile.in: ditto - * rescoff.c (write_coff_file): Set the correct BFD - -1999-05-06 Ian Lance Taylor - - * rename.c (smart_rename): Fix test of whether file exists. - -1999-05-06 Nick Clifton - - * objdump.c (disassemble_data): Set display_endian based on target - endianism. - -1999-05-05 Catherine Moore - - * dlltool.c (interwork): Remove. - (arm_interwork_jtab): Use bx insn. - (thumb_jtab): Likewise. - (MARM_INTERWORK): New machine type. - (rvaafter): Handle it. - (rvabefore) Likewise. - (asm_prefix): Likewise. - (gen_exp_type): Check machine type instead of - interwork flag. - (make_one_lib_file): Likewise. - (make_head): Likewise. - (make_tail): Likewise. - (usage): Update machine types. - (main): Remove -interwork support. - -1999-05-05 Catherine Moore - - * readelf.c (get_machine_flags): Check for EF_CPU32. - (get_data_encoding): Fix typo. - -1999-04-26 Tom Tromey - - * aclocal.m4, configure: Updated for new version of libtool. - -1999-04-18 Ian Lance Taylor - - * stabs.c (parse_stab_range_type): Correct parenthesization in - BFD64 case. - - * readelf.c (get_section_type_name): Use correct types in printf - formats. - (process_relocs): Likewise. - (process_dynamic_segment): Likewise. - (process_symbol_table): Likewise. - (process_mips_specific): Likewise. - -Tue Apr 13 21:22:00 1999 Catherine Moore - - * dlltool.c (make_one_lib_file): Mark thumb functions as - C_THUMBEXTFUNC. - -1999-04-11 Richard Henderson - - * bucomm.h (environ): Declare it, if needed. - (alloca) [C_ALLOCA]: Don't use gcc's builtin or . - * configure.in (environ): Detect declaration. - * nm.c (main): Don't declare environ. - * configure, config.in: Rebuild. - - * dlltool.c (gen_exp_file): Pad out the .reloc section to a - 32-byte boundary with dummy relocations, to make the BeOS loader - happy. Patch from Bob Manson . - -1999-04-08 Tom Tromey - - * binutils.texi (c++filt): Updated for -j/--java, and hp/edg - formats. - -1999-04-08 Nick Clifton - - * readelf.c: Add ability to decode new constants found in April 25 - 1998 Draft of System V ABI spec. - -1999-04-06 Ian Lance Taylor - - * bucomm.h (LC_MESSAGES): Never define. - * addr2line.c (main): Don't pass LC_MESSAGES to setlocale if the - system does not define it. - * ar.c (main): Likewise. - * coffdump.c (main): Likewise. - * dlltool.c (main): Likewise. - * nlmconv.c (main): Likewise. - * nm.c (main): Likewise. - * objcopy.c (main): Likewise. - * objdump.c (main): Likewise. - * size.c (main): Likewise. - * srconv.c (main): Likewise. - * strings.c (main): Likewise. - * sysdump.c (main): Likewise. - * windres.c (main): Likewise. - * readelf.c (main): Call locale setting functions. - -1999-04-05 Nick Clifton - - * readelf.c (decode_location_expression): Fix DW_OP_const8{s|u} - decodes. - -1999-04-04 Ian Lance Taylor - - * rename.c: New file, copied out of objcopy.c with a few changes. - * bucomm.h (set_times, smart_rename): Declare. - * ar.c: Don't include . - (extract_file): Call set_times rather than utime. - (write_archive): Call smart_rename rather than unlink and rename. - * objcopy.c: Don't include . - (simple_copy, smart_rename, set_times): Move to rename.c. - (strip_main): Update smart_rename call for new parameter. - (copy_main): Likewise. - * Makefile.am: Rebuild dependencies. - (CFILES): Add rename.c. - (objcopy_SOURCES, strip_new_SOURCES): Add rename.c. - (ar_SOURCES, ranlib_SOURCES): Add rename.c. - * Makefile.in: Rebuild. - - * Makefile.am: Rebuild dependencies. - (EXTRA_PROGRAMS): Remove backslash which troubles current version - of automake. - * Makefile.in: Rebuild. - - * dllwrap.c (main): Expect correct type in format string. - * resres.c: Include "bfd.h", "bucomm.h", "libiberty.h", and - . Don't include and . - (write_res_file): Remove unused locals e and i. - (read_resource_entry): Remove unused locals rtype and n. - (read_unistring): Remove unused local n. - -1999-04-03 Ian Lance Taylor - - * arparse.y: Declare yylex. - * objdump.c (disassemble_bytes): Initialize bytes. Add comment - for incorrect use of bytes. - * readelf.c: Change many formats to avoid warnings. - -1999-04-01 Nick Clifton - - * readelf.c (reset_state_machine): New function. Resets the - registers of the source line number state machine. - (process_extended_line_op): Use state machine. - (display_debug_lines): Use state machine. Handle multiple line - number blocks within the same section. - -1999-03-29 Jason Merrill - - * readelf.c (process_extended_line_op): end_sequence also resets - the line number. - (display_debug_lines): advance_line takes a signed operand. - (read_and_display_attr): Print refs as <%x>, addresses as %#x, - others as %d. Handle other location expression attributes. - (display_debug_info): Handle nesting. Always print the offset. - -1999-03-23 Ian Lance Taylor - - * objcopy.c (filter_symbols): When checking whether to keep a - symbol, check the BFD section symbol for a symbol with - BSF_SECTION_SYM set. - -1999-03-10 Ulrich Drepper - - * readelf.c (process_dynamic_segment): Print new Solaris dynamic - section entries. Correct printing of DT_POSFLAG_1 and DT_FLAGS_1. - -1999-03-10 Nick Clifton - - * readelf.c (request_dump): New function. - Removed arbitary limit on the number of sections that can be - dumped. - -Wed Mar 10 15:10:14 1999 Stan Cox - - * dlltool.c (make_one_lib_file): Use %05d to output the stub name so - order in the import library is preserved. - -1999-02-19 Nick Clifton - - * readelf.c: Fix compile time warings. - -1999-02-17 DJ Delorie - - * resbin.c (res_to_bin_versioninfo): Instead of entering a value - length of zero in a version info string, enter the appropriate - length. - -Tue Feb 16 16:00:33 1999 Ian Lance Taylor - - * configure.in: Require autoconf 2.13. Change AM_PROG_INSTALL to - AC_PROG_INSTALL. Add comments for AC_DEFINE calls. - * acconfig.h: Remove. - * aclocal.m4: Rebuild. - * configure: Rebuild. - * Makefile.in: Rebuild. - * config.in: Rebuild. - -1999-02-02 Nick Clifton - - * readelf.c (read_and_display_attr): Add display of basic type - encodings. - (display_debug_aranges): New function: Display the contents of a - .debug_aranges section. - (display_debug_info): Dump tags found after compunit entry. - - * binutils.texi: Fixed bug in readelf documentation. - -Mon Feb 1 12:38:01 1999 Catherine Moore - - * readelf.c (dump_relocations): Handle EM_ARM as REL. - -1999-01-29 Nick Clifton - - * readelf.c (process_symbol_table): Do not produce a histogram of - bucket chains if none were found. - -1999-01-27 Nick Clifton - - * version.c: Add 1999 copyright. - - * binutils.texi (readelf): Document new command line options - --debug-dump and --histogram. - - * readelf.c: Add ability to display contents of some or all of the - Dwarf2 debug sections. {Work only partially completed}. - (display_debug_section): New function. - (display_debug_info): New function. - (display_debug_not_supported): New function. - (display_debug_line): New function. - (display_debug_abbrev): New function. - (process_abbrev_section): New function. - (read_leb128): New function. - (process_extended_line_op): New function. - (get_TAG_name): New function. - (get_AT_name): New function. - (get_FORM_name): New function. - (free_abbrevs): New function. - (add_abbrev): New function. - (add_abbrev_attr): New function. - (read_and_display_attr): New function. - (display_block): New function. - -Thu Jan 14 23:36:11 1999 Jeffrey A Law (law@cygnus.com) - - * coffdump.c (xcalloc): Remove, in libiberty now. - * srconv.c (xcalloc): Likewise. - * sysdump.c (xcalloc): Likewise. - -1999-01-14 Nick Clifton - - * readelf.c (process_section_headers): Omit trailing space at end - of section header contents line. - -Wed Dec 16 17:20:05 1998 Doug Evans - - * aclocal.m4: Regenerate. - -Mon Dec 14 12:55:36 1998 Jim Wilson - - * dllwrap.c: Include bfd.h and bucomm.h. Move getopt.h include - after libiberty.h include. - -Tue Dec 8 16:29:43 1998 Ian Lance Taylor - - * objdump.1: Fix typo (-d to -D). From Nokubi Hirotaka - . - -Sun Dec 6 13:28:09 1998 Ian Lance Taylor - - * objdump.c (SFILE): Add size field. - (objdump_sprintf): Merge both versions into one. Increase buffer - size as needed to avoid overflow. - (disassemble_bytes): Change buf from 1000 bytes to 50. Change - initialization and use of sfile to match changes to - objdump_sprintf. - - * strip.1: Fix typo (-V to -v). From Issei Hirayama - . - -1998-12-03 Ulrich Drepper - - * readelf.c (process_dynamic_segment): Improve output format for - various DT_* values. - -1998-12-02 Ulrich Drepper - - * readelf.c (process_mips_specific): Print .conflict section - content. - - * readelf.c (process_mips_specific): Print l_flags in liblist in - textual form. - -1998-11-30 Nick Clifton - - * ar.c (extract_file): Add some paranoia checks for negatively - sized files. - -Tue Nov 24 09:39:24 1998 Nick Clifton - - * stabs.c (DIR_SEPARATOR): Define as '\\' if WIN32 is defined. - -Tue Nov 17 10:25:26 1998 Nick Clifton - - * Makefile.in: Regenerate. - -Mon Nov 16 19:17:23 1998 Dave Brolley - - * po/binutils.pot: Regenerate. - -Mon Nov 16 10:18:53 1998 Nick Clifton - - * Makefile.am: Regernated dependencies. - * aclocal.m4: Regenerated. - * configure: Regenerated. - -Sat Nov 14 14:50:56 1998 Ian Lance Taylor - - * debug.c (debug_name_type): Correct return type from false to - DEBUG_TYPE_NULL. - -Sat Nov 14 14:48:21 1998 Andreas Schwab - - * objdump.c (disassemble_data): Skip over relocs below start - address. - -Tue Nov 10 15:31:52 1998 Nick Clifton - - * Makefile.am: Add dependency of readelf.c on elf/fr30.h - * Makefile.in: Regenerate. - -Wed Nov 4 16:25:55 1998 Nick Clifton - - * readelf.c: Add support for the FR30. - -Mon Nov 2 14:59:33 1998 Geoffrey Noer - - * configure.in: detect cygwin* instead of cygwin32* - * configure: regenerate - -Fri Oct 30 15:14:49 1998 Geoffrey Noer - - * dllwrap.c: change all references to cygwin32_ to cygwin_, - change Cygwin target def to CYGWIN. - -Wed Oct 28 10:31:19 1998 Nick Clifton - - * objdump.c (disassemble_data): Replace 'unsigned long' with - 'bfd_vma'. - -Tue Oct 27 14:39:00 1998 Nick Clifton - - * objdump.c (disassemble_bytes): Applied this patch from Philip - Blundell : Make address variables unsigned to - avoid problems when disassembling code at high-bit-set addresses. - -Mon Oct 26 14:07:59 1998 Mumit Khan - - * dllwrap.c (strhash): New function. - (main): Use it to supply image base if not supplied by user. - (program_version): Up to 0.2.4. - -Mon Oct 26 14:07:59 1998 Mumit Khan - - * dlltool.c (add_stdcall_alias): New global. - (long_options): Add --add-stdcall-alias option. - (main): Handle it. - (scan_drectve_symbols): Add alias if --add-stdcall-alias is - specified. - (scan_filtered_symbols): Likewise. - (gen_def_file): Output alias for stdcall syms if appropriate. - - * binutils.texi (dlltool): Document --add-stdcall-alias option. - - * dllwrap.c (long_options): Add --add-stdcall-alias option. - (main): Handle it. - - * defparse.y (opt_name): Allow "." in name. - * dlltool.c (def_name): Set dll_name from NAME entry in def file. - (def_library): Set dll_name from LIBRARY entry in def file. - -Mon Oct 26 14:07:59 1998 Mumit Khan - - * dllwrap.c (long_options): --implib synonym for --output-lib. - (main): Pass --export-all to dlltool only if specified. - (program_version): Up to 0.2.3. - -Mon Oct 26 14:07:59 1998 Mumit Khan - - * dllwrap.c (mybasename): New function. - (main): Run dlltool to create export definition file and import - library file if necessary. - Change exp_file_name so that it's based on the dll name. - -Sun Oct 25 10:37:45 1998 Mumit Khan - - * dlltool.c (scan_all_symbols): Fix patch error. - -Fri Oct 16 22:56:20 1998 Felix Lee - - * nm.c (display_rel_file): fix "no symbols" messages. - * objdump.c (slurp_symtab): ditto. - * po/POTFILES.in, po/binutils.pot: rebuilt - -Mon Oct 12 14:28:03 1998 Nick Clifton - - * readelf.c (dump_relocations): Rename field from Value to Info to - match name of field in ELF structures. - -Thu Oct 8 15:33:08 1998 Geoffrey Noer - - * configure.in: call AC_EXEEXT instead of AM_EXEEXT and - AM_CYGWIN32. - * aclocal.m4: remove local AM_EXEEXT/AM_CYGWIN32 macros. - * configure: regenerate - -Thu Oct 8 15:33:08 1998 Geoffrey Noer - - From Mumit Khan : - * dlltool.c (scan_all_symbols): Don't re-export symbols exported - by other DLLs. - -Thu Oct 8 15:33:08 1998 Geoffrey Noer - - * Makefile.am (BUILD_DLLWRAP): Add. - (BUILD_DLLWRAP, DLLWRAP_PROG): Add. - (bin_PROGRAMS): Add dllwrap. - * Makefile.in: regenerate with automake - - From Mumit Khan : - * dllwrap.c: New file from dllhelpers v0.2.1. - (print_version): New function. - (long_options): Add --version. - (main): Handle. - * dyn-string.h, dyn-string.c: New files from egcs-1.1/gcc. - * configure.in (BUILD_DLLWRAP): Add. - * configure: Regenerate. - -Tue Oct 6 18:20:10 1998 Geoffrey Noer - - * Makefile.am (windres_SOURCES): Add resres.c. - (windres_OBJECTS): Add resres.o. - * Makefile.in: regenerate with automake - - From Anders Norlander . - * resres.c: New file. Implementation of read_res_file and - write_res_file functions for windres. - * rcparse.y: Handle CONTROL's with named classes. - * resbin.c: Bug in res_to_bin_dialog and bin_to_res_dialog - when dialog is extended: The version and signature fields should - be reversed (despite what the docs say). Id is 32 bits long in - extended dialogs. - * resrc.c (write_rc_dialog): properly print controls with named - classes. - * windres.c (read_res_file, write_res_file): Remove stubs. - * resres.c (write_res): Rename RT_ACCELERATORS to RT_ACCELERATOR. - -Sun Oct 4 20:34:42 1998 Ian Lance Taylor - - From Nokubi Hirotaka : - * objcopy.1: Fix typo in --remove-leading-char docs. - * objdump.1: Fix formatting in --stabs docs. - -Sat Sep 19 23:33:56 1998 Ian Lance Taylor - - * rcparse.y (memflags_move): Correct recursion. - -1998-09-10 Ulrich Drepper - - * readelf.c (process_symbol_table): Print in histogram how many - symbols are covered by the current chain length. - -Sun Sep 6 16:15:47 1998 Nick Clifton - - * readelf.c (process_section_contents): Do not try to dump empty - sections. - -Sat Sep 5 19:17:10 1998 Mumit Khan - - * dlltool.c (scan_all_symbols): Don't re-export symbols exported - by other DLLs. - -1998-09-02 14:50 Ulrich Drepper - - * readelf.c (process_dynamic_segment): Print DT_* value only if - do_dynamic. - (do_histogram): New variable. - (options): New long option histogram. Set do_histogram if this - option is used. - (usage): Document --histogram. - (parse_args): Handle 0 return value from getopt_long. Enable - do_histogram for -a. - (process_symbol_table): Read hash table also if only do_histogram. - Add code to print hash table histogram. - -1998-08-25 16:45 Ulrich Drepper - - * readelf.c (process_dynamic_segment): Read syminfo section if - available. - (process_syminfo): New function. Print syminfo information. - (process_file): Call process_syminfo and free syminfo data at the end. - -Wed Aug 19 16:19:51 1998 Ian Lance Taylor - - * dlltool.c (usage): Add file parameter. Change all callers. - (main): Don't treat '?' as a special case in getopt return. - - * binutils.texi (dlltool): Document new options. Add some uses of - @var. - -Wed Aug 19 16:19:07 1998 Mumit Khan - - * dlltool.c (gen_def_file): Plug memory leak. Don't print - demangled name if it is NULL. - - Support for exporting all symbols to an output export def file: - * dlltool.c ({export_all_symbols, no_default_excludes, - no_default_excludes, excludes}): New file static variables. - (struct string_list): Type to hold list of symbols to exclude. - (scan_drectve_symbols): Renamed from scan_open_obj_file. - (scan_filtered_symbols): New static function. - (add_excludes): New static function. - (match_exclude): New static function. - (set_default_excludes): New static function. - (filter_symbols): New static function. - (scan_all_symbols): New static function. - (scan_open_obj_file): New static function. - (usage): Document new options. - (long_options): Add new options. - (main): Handle new options. - -1998-07-31 21:24 Ulrich Drepper - - * readelf.c (process_program_headers): Print p_offset value with - six hex digits. - (dynamic_segment_mips_val): Add support for DT_MIPS_FLAGS, - DT_MIPS_IVERSION, and DT_MIPS_TIME_STAMP. - (process_mips_specific): Also print seconds of time stamp. - -Fri Jul 31 10:04:23 1998 Catherine Moore - - * readelf.c (dump_relocations): EM_ARM uses rela relocs. - -1998-07-30 16:25 Ulrich Drepper - - * readelf.c (get_dynamic_type): Don't used gettext on the names. - Add new DT_* values from Solaris. Don't print nuemric value in - case of an unknown entry. - (process_dynamic_segment): Handle new DT_* entries. Print numeric - values in decimal, not hex. - -Fri Jul 24 16:28:57 1998 Jeff Holcomb - - * readelf.c (get_dynamic_type): Remove empty default from switch - statement. - -Fri Jul 24 16:28:12 1998 Ian Lance Taylor - - * Makefile.am (install-exec-local): Don't remove the file before - checking whether $(bindir) == $(tooldir)/bin. From Maciej - W. Rozycki . - * Makefile.in: Rebuild. - -Fri Jul 24 09:38:59 1998 Nick Clifton - - * objcopy.c: Removed spurious inclusion of elf/internal.h and - elf-bfd.h. - -1998-07-22 Ulrich Drepper - - * readelf.c: Consistantly use elf_ prefix for *_reloc_type - functions. - -Wed Jul 22 16:29:12 1998 Nick Clifton - - * readelf.c (dump_relocations): Add dumps of HPPA and ARC - relocations. - - (process_relocs): Do not abort if no string table can be found. - -1998-07-22 14:58 Ulrich Drepper - - * readelf.c: Remove definition of functions to return relocation - symbol strings. They now get implicitly defined when include the - system specific ELF header. - -1998-07-22 13:51 Ulrich Drepper - - * readelf.c: Before include system specific ELF header define - START_RELOC_NUMBERS, RELOC_NUMBER, and END_RELOC_NUMBERS. For now - used for ppc, mips, and mn10300. - -Wed Jul 22 10:26:32 1998 Nick Clifton - - * readelf.c (dump_relocations): Display number of unrecognised - relocations. - -1998-07-21 13:13 Ulrich Drepper - - * readelf.c: Use symbolic names of relocation entries for the various - architectures. Correct more layout details. - Print names of MIPS specific section types. Print Alpha, ARM, and - MIPS relocation type names. - -1998-07-20 Vladimir N. Makarov - - * objcopy.c (filter_symbols): Add code for strip all symbols case. - (copy_objects): Strip all case is now processed also through - filter_symbols. No marking symbols used in relocations when strip - all symbols case. - (copy_section): When strip all symbols case, remove relocations - which are not in keep strip specific list. - (strip_main): Remove guard `strip_specific_list == NULL' for - setting up strip all symbols by default. - -Mon Jul 20 12:51:16 1998 Andreas Schwab - - * addr2line.c (find_address_in_section): Only consider a section - if the pc value is completely contained within it. - (translate_addresses): Don't crash if functionname or filename are - null. - -1998-07-20 07:45 Ulrich Drepper - - * readelf.c (process_symbol_table): Fix little alignment problem - in printed table header. - -1998-07-20 07:14 Ulrich Drepper - - * readelf.c: Correct reading of .dynamic section. - (dynamic_section): Now a global variable. - (process_mips_fpe_exception, process_mips_specific, - process_arch_specific): New functions. - (get_file_header): Call process_arch_specific. - -1998-07-19 15:15 Ulrich Drepper - - * readelf.c: Fix several versioning related bugs. Produce nicer - output. - Add support for processor specific information on MIPS. - -Fri Jul 10 15:57:58 1998 Nick Clifton - - * readelf.c: Switch prototypes from unsigned short to unsigned - int. - -Fri Jul 10 16:17:50 1998 Ian Lance Taylor - - From Christian Holland : - * ieee.c (parse_ieee): Initialize info.global_vars and - info.global_types. - (parse_ieee_atn): Ignore register lifetime information reportedly - emitted by MRI compiler. - -Thu Jul 9 13:08:01 1998 Ian Lance Taylor - - * Makefile.am (MAINTAINERCLEANFILES): Define. - * Makefile.in: Rebuild. - -Tue Jul 7 21:48:54 1998 Jeffrey A Law (law@cygnus.com) - - * readelf.c (byte_get): Use PARAMS in prototype. - (error): Make it work with non-ANSI compilers. - (warn): Likewise. - (get_ver_flags): Don't use an ANSI prototype in the definition. - -Tue Jul 7 13:26:13 1998 Ian Lance Taylor - - * objcopy.c (filter_bytes): Set size correctly if the size of the - section is not an even multiple of the interleave. Based on patch - from Brion Stone . - -Thu Jul 2 14:01:34 1998 Klaus Kaempf - - * configure.com: Add vax/vms support. - * makefile.vms-in: Renamed from makefile.vms. Add substitutions - now done by configure.com. - -Wed Jul 1 20:43:52 1998 Ian Lance Taylor - - * stabs.c (parse_stab_range_type): Handle 4 and 8 byte signed - integers with real upper bounds. Handle a lower bound one larger - than the upper bound as a signed integer. Handle 8 byte signed - integers. - (stab_demangle_template): Optionally return the demangled name of - the template. - (stab_demangle_qualified): Treat a template name as a tagged - type. - (stab_demangle_fund_type): Likewise. - -Wed Jul 1 16:29:50 1998 Nick Clifton - - * objcopy.c: Minor formatting improvements. - * readelf.c: Minor output formatting improvement. - -Wed Jul 1 14:23:48 1998 Ian Lance Taylor - - * rclex.l: Add casts and change types to avoid warnings. - * rcparse.y: Likewise. - * resbin.c: Likewise. - * rescoff.c: Likewise. - * resrc.c: Likewise. - - * Makefile.am: Rebuild dependencies. - (HFILES): Remove readelf.h. - * Makefile.in: Rebuild. - - Based on patches from Andrew Kozin - : - * winduni.h: New file, from windres.h. - * winduni.c: New file, from windres.c. - * windres.c: Move Unicode functions into winduni.c. - * windres.h: Move Unicode declarations into winduni.h. Include - winduni.h. - (RT_ACCELERATOR): Rename from RT_ACCELERATORS to match Windows - macro. Change all uses. - (RT_PLUGPLAY, RT_VXD): Correct values. - * Makefile.am (HFILES): Add windres.h. - (CFILES): Add winduni.c. - (windres_SOURCES): Add winduni.c. - -Mon Jun 29 17:01:21 1998 Nick Clifton - - * readelf.c: Use BFD Internal and External Elf structures. - * readelf.h: Removed - no longer needed. - * Makefile.in: Remove readelf.c's dependency upon readelf.h. - -1998-06-26 Vladimir N. Makarov - - * objcopy.c (strip_main): keep_specific_list == NULL as additional - condition to set up strip all symbols by default. - (copy_archive): don't change archive when error in object files of - the archive. - -Wed Jun 24 17:53:47 1998 Ian Lance Taylor - - * stabs.c (parse_number): Sign extend negative values correctly if - bfd_vma is larger than unsigned long. - -Tue Jun 23 14:55:05 1998 Mike Stump - - * Makefile.am (install-exec-local): Don't let EXEEXT interfere - with the program transform name. - * Makefile.in: Rebuild. - -Tue Jun 23 11:08:53 1998 Nick Clifton - - * readelf.c: Rewrite to use fopen/fread ratehr than mmap. - - Add --section-headers command line switch, which is an alias for - --sections. - - Incorporate improvemnts made by Andreas Schwab - including output - formatting and version info display. - - * binutils.texi: Document --section-headers switch to readelf. - -Mon Jun 22 18:28:19 1998 Ian Lance Taylor - - * readelf.c: Include bfd.h and bucomm.h before system header - files. - (parse_args): Change type of c from char to int. - -Sun Jun 14 14:26:28 1998 Nick Clifton - - * readelf.c (usage): Write to stdout, not stderr. - -Fri Jun 12 13:33:51 1998 Tom Tromey - - * po/Make-in (all-yes): Depend on .pot file if maintainer mode - enabled. - ($(PACKAGE).pot): Unconditionally depend on POTFILES. - -Fri Jun 12 16:06:15 1998 Michael Meissner - - * readelf.c (get_ppc_rel_type): New PowerPC support. - (dump_relocations): PowerPC uses RELA relocations. - (get_machine_name): Spell PowerPC correctly. - (get_file_type): Change unsigned short parameter to unsigned. - (get_machine_name): Ditto. - (get_machine_data): Return whether big endian or little endian. - (get_machine_flags): Interpret PowerPC, M32R, and MIPS flags. - (process_elf_header): Print endian-ess. Convert all numeric - formats to long or unsigned long. Print out machine specific flag - bits. - (process_section_headers): Increase name by 3 columns and decrease - type by the same so that .gcc_except_table fits in the space. - - * readelf.h: Include elf/ppc.h, elf/mips.h, and elf/m32r.h to get - machine specific flag bits. - -Thu Jun 11 17:54:26 1998 Nick Clifton - - * readelf.c: Remove extraneous #includes. Fix warnings produced - by -Wall when compiling under Linux. - - * Makefile.am (readelf_LDADD): Add $(LIBIBERTY). - -Thu Jun 11 18:30:20 1998 Ian Lance Taylor - - * stabs.c (struct stab_handle): Add self_crossref field. - (parse_stab_string): If a tag is a cross reference to itself, - don't define it in the tags list. - (parse_stab_type): Set info->self_crossref. - - * debug.c (struct debug_type_real_list): Define. - (debug_get_real_type): Add list parameter. Change all callers. - Check for circularity to avoid crashing when it occurs. - -Thu Jun 11 14:48:32 1998 Nick Clifton - - * readelf.c: New file: Display contents of ELF format file. - * readelf.h: New file: Header file for readelf.c - * Makefile.am: Add rules to build readelf. - * Makefile.in: Rebuilt. - * binutils.texi: Document readelf. - * NEWS: Mention inclusion of readelf into binutils. - * po/POTFILES.in; Rebuilt. - -Fri Jun 5 18:43:40 1998 Ian Lance Taylor - - * objcopy.c (setup_section): Adjust the section size if copy_byte - is >= 0. - (copy_section): Do not call bfd_set_section_size. - -Thu Jun 4 09:12:27 1998 Nick Clifton - - * objcopy.c (copy_usage): Add missing \n\ from help description. - -Wed Jun 3 19:31:33 1998 Ian Lance Taylor - - * Makefile.am (YACC): Correct bison -L option. - * Makefile.in: Rebuild. - - * binutils.texi, objdump.1: Document -p/--private-headers. - -Wed Jun 3 12:09:40 1998 Nick Clifton - - * objcopy.c: Add new command line options: --change-section-lma - and --change-section-vma. Rename old command line option - --adjust-section-vma to --change-section-address. Rename - --adjust-vma to --change-addresses and --adjust-start to - --change-start. Provide aliases to support the old versions of - these command line options. - - Change the names of macros and enum elements to upper case to - match the GNU coding standard. - - Replace calls to fprintf (stderr,...) with calls to fatal () or - non_fatal () as appropriate. - - * objcopy.1: Document command line option changes. - * binutils.texi: Document command line option changes. - - * bucomm.h: New exported funtion from bucomm.c: non_fatal(). - * bucomm.c (non_fatal): New exported function. Just like fatal() - except that it returns rather than calling xexit(). - - (bfd_check_format_matches): Call fatal() rather than bfd_fatal(). - - (check_matching_formats): Fix C formating. - - (parse_vma): Call fatal(). - -Mon Jun 1 18:26:40 1998 Ian Lance Taylor - - From Yuli Barcohen : - * debug.c (debug_type_samep): Avoid endless loops comparing - function and method parameter types. - -Fri May 22 14:02:42 1998 Ian Lance Taylor - - * dlltool.c (dump_iat): Comment out; not used. - (display): Rename from tell. Change all callers. - -Thu May 14 14:00:56 1998 Nick Clifton - - * dlltool.c: Add support for Thumb DLLs. Add support for - interworking between ARM and Thumb programs and DLLs. Tidy the - code. - - * binutils.texi: Document dlltool. - - * configure: Build dlltool for thumb-pe targets. - - * version.c (print_version): Include 1998 in copyright strings. - - * stabs.c (parse_stab): Support Win32 style directory separators. - -Sun May 10 22:34:44 1998 Jeffrey A Law (law@cygnus.com) - - * po/Make-in (install-info): New target. - -Fri May 8 10:33:13 1998 Nick Clifton - - * ar.c (usage): Extend information provided about command line - options. - -Wed May 6 15:28:51 1998 Klaus Kaempf - - * makefile.vms: Run dec c with /nodebug. Pass CC value when - calling make. - -Tue May 5 15:19:00 1998 Nick Clifton - - * configure: Build dlltool for thumb-pe target. - * configure.in: Build dlltool for thumb-pe target. - -Sun May 3 22:04:49 1998 Ian Lance Taylor - - * Makefile.am (EXTRA_PROGRAMS): Change $(SRCONV_PROG) to sysconf - sysdump coffdump to avoid extra $(EXEEXT). - * Makefile.in: Rebuild. - -Wed Apr 29 22:22:55 1998 Geoffrey Noer - - * configure.in: Stop appending EXEEXT to the end of - SRCONV_PROG (wrong because that variable may contain multiple - programs) - * Makefile.am: instead, add EXEEXTs to each SRCONV_PROG - program - * Makefile.in: regenerate - * configure: regenerate - -Tue Apr 28 19:14:34 1998 Tom Tromey - - * addr2line.c (main): Conditionally call setlocale. - * windres.c (main): Likewise. - * sysdump.c (main): Likewise. - * strings.c (main): Likewise. - * srconv.c (main): Likewise. - * size.c (main): Likewise. - * objdump.c (main): Likewise. - * objcopy.c (main): Likewise. - * nm.c (main): Likewise. - * nlmconv.c (main): Likewise. - * dlltool.c (main): Likewise. - * coffdump.c (main): Likewise. - * ar.c (main): Likewise. - * bucomm.h: Include if HAVE_LOCALE_H. - (LC_MESSAGES): Now can be defined even when ENABLE_NLS. - -Tue Apr 28 10:33:07 1998 Bill Moyer - - Add support for IMPORTS: - * defparse.y (impline): Add IMPORTS syntaxes. - * dlltool.c (ifunctype, iheadtype): New typedefs. - (import_list): New static variable. - (append_import): New static function. - (def_import): Add an entry to import_list. - (generate_idata_ofile): New static function. - (gen_exp_file): Call generate_idata_ofile. - * dlltool.h (def_import): Update declaration. - -Mon Apr 27 16:39:22 1998 Ian Lance Taylor - - * configure.in: Change version number to 2.9.4 - * configure: Rebuild. - -Wed Apr 22 16:00:35 1998 Tom Tromey - - * po/Make-in (MKINSTALLDIRS): Don't look in $(top_srcdir). - -Wed Apr 22 00:33:56 1998 Tom Tromey - - * Makefile.am (INCLUDES): Search intl dirs for headers; define - LOCALEDIR. - * addr2line.c (main): Call setlocale, bindtextdomain, textdomain. - * ar.c (main): Likewise. - * coffdump.c (main): Likewise. - * dlltool.c (main): Likewise. - * nlmconv.c (main): Likewise. - * nm.c (main): Likewise. - * objcopy.c (main): Likewise. - * objdump.c (main): Likewise. - * size.c (main): Likewise. - * srconv.c (main): Likewise. - * strings.c (main): Likewise. - * sysdump.c (main): Likewise. - * windres.c (main): Likewise. - -Tue Apr 21 22:13:08 1998 Tom Tromey - - * Many files: Added gettext invocations around user-visible - strings. - * bucomm.h: Added gettext-related includes and defines. - * acconfig.h (ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT, HAVE_STPCPY, - HAVE_LC_MESSAGES): Define. - * configure.in: Call CY_GNU_GETTEXT. Create po/Makefile.in and - po/Makefile. Use AM_PROG_LEX. - * Makefile.am (SUBDIRS): New macro. - (POTFILES): Likewise. - (po/POTFILES.in): New target. - (LDADD): Added INTLLIBS. - (objdump_LDADD): Likewise. - (c__filt_LDADD): Likewise. - (ar_LDADD): Likewise. - (ranlib_LDADD): Likewise. - (dlltool_LDADD): Likewise. - (windres_LDADD): Likewise. - * po/Make-in, po/POTFILES.in, po/binutils.pot: New files. - -Tue Apr 21 16:07:18 1998 Stanislav Brabec - - * objcopy.c (preserve_dates): New file static variable. - (smart_rename): If preserve_dates, call set_times when copying. - (strip_main): Remove preserve_dates local variable. - (copy_main): Likewise. - -Tue Apr 7 15:41:15 1998 Ian Lance Taylor - - * Makefile.am (DISTSTUFF): Add defparse.h, defparse.c, rclex.c, - rcparse.h, and rcparse.c - * Makefile.in: Rebuild. - -Mon Apr 6 16:24:35 1998 Ian Lance Taylor - - * Makefile.am (PROGS): Move $(ADDR2LINE_PROG) to end, so that - Makefile.in doesn't have an empty continuation line. - (bin_PROGRAMS): Likewise. - * Makefile.in: Rebuild. - -Fri Apr 3 14:48:42 1998 Ian Lance Taylor - - * Makefile.am (DISTCLEANFILES): Add site.exp and site.bak. - (MOSTLYCLEANFILES): Add binutils.log, binutils.sum, and abcdefgh*. - (mostlyclean-local): New target. - * Makefile.in: Rebuild. - -Wed Apr 1 15:54:16 1998 Ian Lance Taylor - - From Zack Weinberg and H.J. Lu - : - * ar.c (usage): Mention S modifier. - (main): Add S modifier. - * ar.1, binutils.texi: Document S modifier. - -Wed Apr 1 13:11:23 1998 Andreas Schwab - - * binutils.texi: Use @itemx for a secondary item in a table. - -Tue Mar 31 18:44:13 1998 Ian Lance Taylor - - * dep-in.sed: Add rule to remove @OBJDIR@. - * Makefile.am (dep.sed): Substitute for @OBJDIR@. - * Makefile.in: Rebuild. - -Mon Mar 30 12:47:18 1998 Ian Lance Taylor - - * configure.in: Set version to 2.9.1. - * configure: Rebuild. - - * Branched binutils 2.9. - - * Makefile.am (DISTCLEANFILES): Remove defparse.h, arparse.h, - rcparse.h, and nlmheader.h. - * Makefile.in: Rebuild. - -Sat Mar 28 17:39:27 1998 Ian Lance Taylor - - * Makefile.am (MOSTLYCLEANFILES): Define. - * Makefile.in: Rebuild. - - Fix some gcc -Wall warnings: - * nlmconv.c (main): Add casts to avoid warnings. - (alpha_mangle_relocs): Likewise. - * objdump.c (dump_section_stabs): Likewise. - * size.c (print_sysv_format): Likewise. - * srcconv.c (wr_ob): Likewise. - * wrstabs.c (stab_modify_type): Likewise. - (stab_variable): Likewise. - * nlmconv.c (main): Initialize variables to avoid warnings. - * nm.c (sort_symbols_by_size): Likewise. - * objdump.c (disassemble_bytes): Likewise. - * wrstabs.c (stab_end_class_type): Likewise. - * coffgrok.c (do_sections_p2): Change j to unsigned int. - (do_lines): Change l to unsigned int. - * nlmheader.y (yylex): Change i to unsigned int. - * nm.c (print_symbol): Change j to long. - * size.c (lprint_number): Comment out. - * srconv.c (wr_ob): Change i to bfd_size_type. - * sysdump.c (unit_info_list): Comment out. - (object_body_list, program_structure, debug_list): Likewise. - * sysinfo.y (yyerror): Return value. - -Thu Mar 26 17:06:51 1998 Richard Henderson - - * defparse.y (explist): Allow epsilon. - Suggestion from Jonathan-Harris@psion.com. - -Thu Mar 26 16:59:09 1998 Richard Henderson - - * coffgrok.c (do_sections_p1): Use the section's lma instead of vma - for the benefit of prom loaders. - -Wed Mar 25 13:05:39 1998 Ian Lance Taylor - - Based on patch from H.J. Lu : - * Makefile.am (DISTSTUFF): New variable. - (diststuff): New target. - (DISTCLEANFILES): New variable. - * Makefile.in: Rebuild. - -Tue Mar 24 19:33:08 1998 Ian Lance Taylor - - * rclex.l: Accept { and } as synonyms for BEGIN and END. - -Fri Mar 20 19:18:08 1998 Ian Lance Taylor - - * aclocal.m4, configure: Rebuild with libtool 1.2. - -Tue Feb 24 13:07:50 1998 Doug Evans - - * objdump.c (disassemble_data): Delete "++place" after call to - find_symbol_for_address. Set disasm_info.symbols to array of - symbols at the current address. - -Wed Feb 18 23:39:46 1998 Richard Henderson - - * Makefile.am (install-exec-local): Install properly when ln - fails or tooldir == prefix. - -Tue Feb 17 18:40:55 1998 Richard Henderson - - * objcopy.c (compare_section_lma): Rename from _vma. - (copy_object): Gap fill based on LMA not VMA. - * binutils.texi: Update and clarify. - * objcopy.1: Likewise. - -Tue Feb 17 20:34:11 1998 Ian Lance Taylor - - * dlltool.c (gen_exp_file): Generate _imp__%s as well as __imp_%s, - for Microsoft compatibility. - (make_one_lib_file): Likewise. - - * dlltool.c (make_one_lib_file): Don't add 1 to hint. - -Fri Feb 13 16:37:44 1998 Ian Lance Taylor - - * Makefile.am (AUTOMAKE_OPTIONS): Define. - * configure, Makefile.in, aclocal.m4: Rebuild with automake 1.2e. - -Thu Feb 12 14:13:46 1998 Ian Lance Taylor - - * deflex.l: Accept '?' in symbol names, for VC++ mangled names. - From Mikey . - - * addr2line.c (usage): Update bug-gnu-utils address. - * ar.c (usage): Likewise. - * nlmconv.c (show_usage): Likewise. - * nm.c (usage): Likewise. - * objcopy.c (copy_usage): Likewise. - (strip_usage): Likewise. - * objdump.c (usage): Likewise. - * size.c (usage): Likewise. - * strings.c (usage): Likewise. - * windres.c (usage): Likewise. - * binutils.texi (Bug Reporting): Likewise. - -Sat Feb 7 15:36:24 1998 Ian Lance Taylor - - * configure, aclocal.m4: Rebuild with new libtool. - -Thu Feb 5 12:21:13 1998 Ian Lance Taylor - - * configure, Makefile.in, aclocal.m4: Rebuild with new libtool. - -Fri Jan 30 19:16:28 1998 Doug Evans - - * Makefile.am (CC_FOR_TARGET,nlmcomv.o): Change program_transform_name - to transform. - * Makefile.in: Regenerate. - -Thu Jan 29 16:24:04 1998 Mumit Khan - - * dlltool.c: Define exit status macros for _WIN32 but not - __CYGWIN32__. - (gen_lib_file): Check for exit status of unlink. - * resrc.c: Define popen and pclose if _WIN32 but not - __CYGWIN32__. - -Wed Jan 28 17:45:46 1998 Ian Lance Taylor - - * configure.in: Remove vfork check. - * nlmconv.c: Never include vfork.h. - * aclocal.m4, configure, Makefile.in, config.in: Rebuild. - -Wed Jan 28 17:43:02 1998 J.J. van der Heijden - - * objcopy.c (copy_archive): Only pass one argument to mkdir if - _WIN32 but not __CYGWIN32__. - (smart_rename): Add code for _WIN32 (not __CYGWIN32__), to cope - with different rename behaviour and lack of chown. - - * configure.in: Check for mingw32 when deciding whether to build - dlltool. - * dlltool.c: Never include vfork.h. - (run): Use pexecute rather than vfork. - (gen_lib_file): Check for errors from bfd_set_archive_head and - bfd_close. Close all the BFDs in the archive before deleting the - temporary files. - -Thu Jan 22 16:22:55 1998 Fred Fish - - * objdump.c (disassemble_bytes): Add flag INSN_HAS_RELOC to tell - disassembly function there is a reloc on this line. - -Wed Jan 14 15:29:43 1998 Richard Henderson - - * srconv.c (sh, h8300): Delete variables. - (addrsize, toolname, rnames): New variables. - (writeINT): Use addrsize. - (wr_un): Use toolname. - (wr_hd): Set up addrsize et al properly for h8300[hs]. - (walk_tree_symbol): Zero dsy. Use rnames. - (wr_un, wr_hd, wr_ob, wr_du): Use proper bfd access macros. - * sysdump.c (sh, h8300): Delete variables. - (addrsize): New variable. - (getINT): Use it. - (getone): Initialize it. - (getBITS): Range check on MAX. - -Mon Dec 29 16:58:05 1997 Ian Lance Taylor - - From Matthew Bellantoni : - * ar.c (get_pos_bfd): Add default_posname parameter. Change all - callers. - (replace_members): Default to replacing in the same position. - -Mon Dec 22 11:27:22 1997 Ian Lance Taylor - - * rclex.l: Don't permit a comma in a STRING. - * rcparse.y (acc_entry): Warn if an inappropriate modifier is used - with a non VIRTKEY. - (acc_event): For a control character, set VIRTKEY, and force the - character to uppercase. - (acc_options): Don't require a comma separator. - -Tue Dec 9 13:25:42 1997 Michael Meissner - - * size.c (size_number): New function to provide size of field. - ({l,r}print_number): For octal and hex fields, print field using - '0' and '0x' suffixes. Do not include following tab. - (sysv_internal_sizer): Size section name, section size, and vma - address fields. - (sysv_internal_printer): Use calculated sizes for the columns. - (print_sysv_format): Size columns before printing. - (print_berkeley_format): Print tabs between numbers now that - {l,r}print_number doesn't. Print fields right justified. - -Mon Dec 8 11:22:04 1997 Nick Clifton - - * objdump.c (objdump_print_addr_with_sym): Remove call to - disasm_symaddr() as this function no longer exists. - -Tue Dec 2 10:23:50 1997 Nick Clifton - - * objdump.c (objdump_print_addr_with_sym): Call disasm_symaddr() - to allow backend to know which symbol has just been displayed. - -Tue Dec 2 13:06:46 1997 Ian Lance Taylor - - * windres.h (ESCAPE_*): Define standard escape sequences. - * rclex.l (handle_quotes): Handle standard escape sequences. Warn - about an unrecognized escape character. - * windres.c (unicode_print): Print standard escape sequences. - * rcparse.y (acc_event): Initialize $$.next. - * resbin.c (bin_to_res_menuitems): Don't set MENUITEM_POPUP or - MENUITEM_ENDMENU in the menu item flags. - (bin_to_res_accelerators): Allocate a structure (the old code - never worked). - (res_to_bin_accelerator): Correct the test for setting ACC_LAST. - (res_to_bin_dialog): Save the extended style rather than saving - the style twice. Remove useless shadowing length variable. Set - the length of control data correctly. - * resrc.c (write_rc_dialog): Don't print the class or menu if the - string length is zero. - -Mon Nov 24 18:52:43 1997 Andreas Schwab - - * stabs.c (parse_stab_argtypes): Don't try to parse the name of a - destructor as mangled argument types. - -Mon Nov 10 17:51:41 1997 Gavin Koch - - * addr2line.c (translate_addresses): Use bfd_scan_vma rather - than strtol to scan addresses. - -Sun Nov 9 11:01:31 1997 Jeffrey A Law (law@cygnus.com) - - * Makefile.am (bin_PROGRAMS): Don't use line continuations here. - -Tue Nov 4 11:56:14 1997 Ian Lance Taylor - - * objcopy.c (copy_section): Don't crash if there is no particular - information for a section. - -Mon Nov 3 12:36:19 1997 Ian Lance Taylor - - * objcopy.c (parse_flags): Make flag check case insensitive. - Check for `contents' flag. Give an error for unrecognized flags. - (copy_section): If the contents flag was set for a section that - had no contents, zero out the new contents. - * binutils.texi (objcopy): Document contents section flag. - -Sun Nov 2 14:49:56 1997 Ian Lance Taylor - - * objcopy.c: Move new struct and variable definitions to top of - file. Remove obsolete add_strip_symbol and is_strip_symbol - declarations. Add prototype declarations for add_specific_symbol - and is_specified_symbol. - -Mon Oct 20 15:31:43 1997 Klaus K"ampf - - * configure.com (HAVE_SBRK): Undefine. - -Tue Oct 14 16:14:35 1997 Nick Clifton - - * objdump.c (objdump_symbol_at_address): New function. Returns - true if a symbol can be found at the address passed in. - (disassemble_data): Set the symbol_at_address_func field to point - to objdump_symbol_at_address. - -Fri Oct 10 14:13:09 1997 Richard Henderson - - * objcopy.c, objcopy.1, binutils.texi: "localize" is a better name - than "privatize". Update all references. - -Thu Oct 9 15:57:29 1997 Ian Lance Taylor - - * binutils.texi (strip): Remove duplicate --target. From Marty - Leisner . - - * nm.c (lineno_cache_bfd): New file static variable. - (lineno_cache_rel_bfd): New file static variable. - (display_archive): Clear lineno_cache_bfd and lineno_cache_rel_bfd - when closing a BFD. - (display_file): Likewise. - (print_symbol): Use lineno_cache_bfd and lineno_cache_rel_bfd - instead of cache_bfd and cache_rel_bfd. Make seccount static, and - only set it when setting relocs. - -Wed Oct 8 21:19:11 1997 Richard Henderson - - * objcopy.c (keep_specific_list, privatize_specific_list, - weaken_specific_list): New variables. - (keep_symbols): Removed. - (add_specific_symbol): New function from the carcas of - add_strip_symbol. Takes a list as an argument. - (is_specified_symbol): Likewise from is_strip_symbol. - (filter_symbols): Honor the new privatize and weaken lists. - Optimize bfd_asymbol_name handling. - (copy_object, copy_options, copy_usage): Add privatize-symbol & - weaken-symbol options. - - * objcopy.1, binutils.texi: Update docs. - -Sun Oct 5 09:05:44 1997 Frank Ch. Eigler - - * objdump.c (disassemble_data): Make "--prefix-addresses" - disassembly adjust to mixed-length instructions. - (objdump_print_addr_with_sym): Add "0x" prefix for hexadecimal - symbol-offsets in disassembly. - -Fri Oct 3 12:04:25 1997 Ian Lance Taylor - - * objcopy.c (set_times): New static function, replacing - make_same_dates. - (strip_main): If preserve_dates, stat the input file before - copying it, and call set_times afterward. - (copy_main): Likewise. - - * wrstabs.c (write_stabs_in_sections_debugging_info): Cast p to - char * when calling strcpy and strlen. - -Wed Sep 24 11:34:05 1997 Ian Lance Taylor - - * binutils.texi (ar cmdline): Document that q now works like r. - From Marty Leisner . - - * binutils.texi (size): The object file argument is optional. - From Marty Leisner . - - * aclocal.m4: Rebuild with new libtool. - * configure: Rebuild. - -Tue Aug 26 17:48:34 1997 Ian Lance Taylor - - * Makefile.am (EXEEXT_FOR_BUILD): New variable. Use it in all - references to the sysinfo program. - * configure.in: Rebuild with new bfd/acinclude.m4. - * Makefile.in: Rebuild. - -Fri Aug 8 15:32:49 1997 Ian Lance Taylor - - * windres.c: Include . - (define_resource): Set a timestamp for the resource. - -Wed Aug 6 13:37:58 1997 Ian Lance Taylor - - * configure.in: Define TARGET in header file. - * acconfig.h (TARGET): Add #undef. - * Makefile.am (version.o, bucomm.o): Remove special targets. - * bucomm.c (target): Remove. - * nm.c (program_name): Don't declare. - (target): Make static. - * size.c (target): Make static. - * configure, config.in, Makefile.in: Rebuild. - -Tue Aug 5 00:01:41 1997 Ian Lance Taylor - - * Makefile.am (check-DEJAGNU): Export r. - (.dep1): Use $(INCLUDES) rather than $(ALL_CFLAGS). - * Makefile.in: Rebuild. - - * nlmheader.y: Use VERSIONK rather than VERSION. - - * Makefile.am (STRIP_PROG): Change from strip.new to strip-new. - (NM_PROG): Change from nm.new to nm-new. - (TOOL_PROGS, install-exec-local): Adjust accordingly. - * Makefile.in: Rebuild. - -Mon Aug 4 11:47:31 1997 Ian Lance Taylor - - * configure.in: Remove AC_ARG_PROGRAM; it's invoked by - AM_INIT_AUTOMAKE. - * configure: Rebuild. - - * Makefile.am (install-exec-local): Create $(tooldir)/bin before - trying to install anything into it. - * Makefile.in: Rebuild. - - * Makefile.am (TOOL_PROGS): Use an explicit $(EXEEXT). - (install-exec-local): When handling $(noinst_PROGRAMS), only use - $(EXEEXT) on the installed file. When handling $(TOOL_PROGS), - handle $(EXEEXT) correctly. - * configure.in: Add an explicit $(EXEEXT) when substituting for - the name of a program to build. - * Makefile.in, configure: Rebuild. - - * aclocal.m4, configure, Makefile.in: Rebuild with new automake - patches. - - * deflex.l, defparse.y: Use VERSIONK rather than VERSION. - * rclex.l, rcparse.y: Likewise. - * Makefile.am (windres_SOURCES): Add $(BULIBS). - * Makefile.in: Rebuild. - -Fri Aug 1 13:08:39 1997 Ian Lance Taylor - - * acinclude.m4: Include bfd/acinclude.m4, not bfd/acmacros.m4. - * aclocal.m4, configure: Rebuild with new libtool. - -Thu Jul 31 11:51:35 1997 Ian Lance Taylor - - * Makefile.am: New file, based on old Makefile.in. - * acinclude.m4: New file, from old aclocal.m4. - * configure.in: Call AM_INIT_AUTOMAKE and AM_PROG_LIBTOOL. Remove - shared library handling; now handled by libtool. Replace - AC_CONFIG_HEADER with AM_CONFIG_HEADER. Call AC_PROG_YACC, - AC_PROG_LEX, AC_DECL_YYTEST, AM_MAINTAINER_MODE, AM_CYGWIN32, and - AM_EXEEXT. Replace AC_PROG_INSTALL with AM_PROG_INSTALL. Remove - stamp-h handling in AC_OUTPUT. - * acconfig.h: Mention PACKAGE and VERSION. - * stamp-h.in: New file. - * Makefile.in: Now built with automake. - * aclocal.m4: Now built with aclocal. - * config.in, configure: Rebuild. - - From Ton van Overbeek : - * rcparse.y (dialog): Default menu and class to be named. - (styles): If FONT is seen, set DS_SETFONT in dialog style. - * resbin.c (res_to_bin_dialog): Correct computation of font - information length. - -Wed Jul 30 11:21:06 1997 Ian Lance Taylor - - From Ton van Overbeek : - * resbin.c (res_to_bin_menu): Correct computation of menu - vs. menuex length. - * resrc.c (define_stringtable): Add 1 to resource ID. - -Tue Jul 29 11:06:03 1997 Ian Lance Taylor - - * resbin.c (bin_to_res_string): Correct adjustment of data and - length. From Ton van Overbeek . - -Tue Jul 22 18:01:23 1997 Ian Lance Taylor - - * nlmconv.c (link_inputs): Call libiberty pexecute function. - (pexecute) [multiple versions]: Remove. - -Tue Jul 22 16:19:34 1997 Robert Hoehne - - * bucomm.c (make_tempname): If we might be using a DOS filesystem, - check for a backslash as well as a slash. - -Thu Jun 26 13:53:17 1997 Ian Lance Taylor - - * windres.c (main): Quit if we didn't get any resources. - (usage): Fix --yydebug usage message. - * rescoff.c (write_coff_file): Don't free the relocation array - until after we've closed the BFD. - (read_coff_rsrc): Quit rather than try to read standard input. - (write_coff_file): Quit rather than try to write to standard - output. - * rcparse.y: Add a couple of missing semicolons (accepted by bison - but not byacc). - * binutils.texi: Document windres. - -Wed Jun 25 20:57:06 1997 Ian Lance Taylor - - * resbin.c: New file. - * rclex.l, rcparse.y, rescoff.c, resrc.c, windres.c, windres.h: - Numerous fixes and improvements. - * Makefile.in: Rebuild dependencies. - (CFILES): Add resbin.c. - (WINDRES_OBJS): Add resbin.o. - -Sun Jun 22 17:29:41 1997 Ian Lance Taylor - - First stab at Windows resource compiler: - * windres.h: New file. - * windres.c: New file. - * resrc.c: New file. - * rcparse.y: New file. - * rclex.l: New file. - * rescoff.c: New file. - * configure.in: Define and substitute BUILD_WINDRES. - * configure: Rebuild. - * Makefile.in: Rebuild dependencies. - (WINDRES_PROG): New variable. - (PROGS): Add @BUILD_WINDRES@. - (HFILES): Add dlltool.h and windres.h. - (CFILES): Add windres.c and resrc.c. - (GENERATED_CFILES): Add rcparse.c and rclex.c. - (WINDRES_OBJS): New variable. - $(WINDRES_PROG): New target. - (rcparse.c, rcparse.h, rclex.c): New targets. - -Thu Jun 12 12:27:51 1997 Ian Lance Taylor - - * dlltool.c (export_type): Add data field. - (def_exports): Add data parameter. Change all callers. - (dump_def_info): Print data field. - (gen_def_file): Likewise. - (make_one_lib_file): Handle data field by not emitting simple - label and not emitting anything in SEC_TEXT. - (dtab): Print data field. - (process_duplicates): Merge data field. - * dlltool.h (def_exports): Update declaration. - * defparse.y (expline): Accept opt_DATA. Pass it to def_exports. - (opt_DATA): New non-terminal. - -Wed Jun 11 17:15:47 1997 Ian Lance Taylor - - * dlltool.h: New file. - * deflex.l: Include dlltool.h and libiberty.h. Don't declare - strdup. Use xstrdup rather than strdup. - * defparse.y: Include bfd.h, bucomm.h, and dlltool.h. - * dlltool.c: Include dlltool.h and time.h. Make a lot of - variables and functions static. Make a lot of char * variables - and parameters const. Add declarations for static functions. Do - some reindenting. Hide more PowerPC stuff inside DLLTOOL_PPC. - -Wed Jun 11 12:05:52 1997 H.J. Lu - - * ar.c (bfd_special_undocumented_glue): Add const. - -Mon May 12 22:09:35 1997 Bob Manson - - * Makefile.in (check): Pass CC_FOR_TARGET and CFLAGS_FOR_TARGET - to runtest. - -Mon May 12 13:14:22 1997 Ian Lance Taylor - - * configure.in: Don't clear OPCODES when --enable-commonbfdlib is - used on HP/UX. - * configure: Rebuild. - -Fri Apr 25 14:22:08 1997 H.J. Lu - - * Makefile.in (maintainer-clean realclean): Change *.info* - to binutils.info* to save sysroff.info. - -Tue Apr 15 13:42:22 1997 Ian Lance Taylor - - * Makefile.in (INSTALL): Set to @INSTALL@. - (INSTALL_XFORM, INSTALL_XFORM1): Remove. - (install): Depend upon installdirs. Use $(program_transform_name) - directly, rather than using $(INSTALL_XFORM) and - $(INSTALL_XFORM1). - (installdirs): New target. - (install-info): Run mkinstalldirs. - -Mon Apr 14 11:52:39 1997 Ian Lance Taylor - - * Makefile.in (INSTALL): Change install.sh to install-sh. - - From Thomas Graichen : - * Makefile.in: Always use $(SHELL) when running move-if-change. - * configure.in: Use ${CONFIG_SHELL} when running $ac_config_sub. - * configure: Rebuild. - -Fri Apr 4 13:28:02 1997 Ian Lance Taylor - - * configure.in: Add AC_FUNC_ALLOCA. - * configure, config.in: Rebuild. - * bucomm.h: Add alloca handling, copied from gas/as.h. - * dlltool.c: Add #pragma alloca for AIX to start of file. - * nlmconv.c: Likewise. - - * Makefile.in (distclean): Remove site.exp and site.bak. Remove - everything that clean removes. - -Thu Apr 3 13:18:39 1997 Ian Lance Taylor - - * Makefile.in (VERSION): Set to 2.8.1. - - * Branched binutils 2.8. - -Tue Apr 1 16:21:44 1997 Klaus Kaempf - - * configure.com: New file. - * config.h-vms: Remove file. - * makefile.vms: Update for new configure scheme. - -Mon Mar 31 15:30:43 1997 Philippe De Muyter - - * objcopy.c (make_same_dates): Use statbuf, not buf, if not - HAVE_GOOD_UTIME_H. - -Fri Mar 28 17:57:53 1997 Alan Modra - - * Makefile.in ($(OBJDUMP_PROG)): Don't link against BFDLIB twice. - * configure.in: Add AC_ARG_ENABLE for commonbfdlib. If it is set, - set OPCODES to empty. - * configure: Rebuild. - -Thu Mar 27 16:03:02 1997 Ian Lance Taylor - - Based on patch from Marty Leisner : - * objcopy.c: Include or . - (strip_options): Add "preserve-dates". - (copy_options): Likewise. - (copy_usage): Mention -p and --preserve-dates. - (strip_usage): Likewise. - (make_same_dates): New static function. - (strip_main): Handle -p. - (copy_main): Likewise. - * binutils.texi, strip.1, objcopy.1: Document new option. - - addr2line.c contributed by Ulrich Lauther - : - * addr2line.c: New file. - * Makefile.in: Rebuild dependencies. - (ADDR2LINE_PROG): New variable. - (MANPAGES): Add addr2line. - (PROGS): Add $(ADDR2LINE_PROG). - (CFILES): Add addr2line.c. - ($(ADDR2LINE_PROG)): New target. - * binutils.texi: Document addr2line. - * addr2line.1: New file. - - * version.c (print_version): Update copyright date. - -Mon Mar 24 10:52:45 1997 Andreas Schwab - - * objdump.c (disassemble_data): Don't exit if a file cannot be - disassembled, instead just return. - -Thu Mar 20 21:16:51 1997 Jeffrey A Law (law@cygnus.com) - - * size.c (usage): Make definition match its prototype. - (display_bfd, lprint_number, rprint_number): Likewise. - (print_berkeley_format, sysv_internal_printer): Likewise. - (print_sysv_format): Likewise. - * nm.c (set_print_radix, set_output_format): Likewise. - * objcopy.c (filter_bytes): Likewise. - -Tue Mar 18 16:39:55 1997 H.J. Lu - - * Many files: Add function prototypes. - * ar.c (mri_emul, get_pos_bfd): Make static. - * arlex.l: Include "libiberty.h". Don't declare strdup. Use - xstrdup rather than strdup. - * arparse.y (yyerror): Make argument const. Correct typo. - * arsup.c (strdup): Don't declare. - (ar_save): Use xstrdup rather than strdup. - * filemode.c: Include "bucomm.h". - * nm.c (usage): Make static. - (print_symname): Make format and name const. - * objcopy.c (cat): Remove. - (copy_archive): Make output_target const. Use concat, not cat. - (copy_file, simple_copy, smart_rename): Make arguments const. - * objdump.c (read_section_stabs): Likewise. - (print_section_stabs): Likewise. - (display_target_tables): Don't declare getenv. - * strings.c (strings_object_file): Change file to const. - (print_strings): Change filename to const. - * Makefile.in: Rebuild dependencies. - -Tue Mar 18 11:37:24 1997 Ian Lance Taylor - - * configure.in: Add BFD_NEED_DECLARATION(getenv). - * acconfig.h: Add NEED_DECLARATION_GETENV. - * bucomm.h (getenv): Declare if NEED_DECLARATION_GETENV. - * configure, config.in: Rebuild. - * nlmconv.c (getenv): Don't declare. - - * Makefile.in: Rebuild dependencies. - -Sat Mar 15 15:35:56 1997 Ian Lance Taylor - - Based on patches from Jamie Lokier : - * objdump.c: Include "demangle.h". - (do_demangle): New static variable. - (usage): Mention -C/--demangle. - (long_options): Add "demangle". - (objdump_print_symname): New static function. - (objdump_print_addr_with_sym): Use objdump_print_symname. - (disassemble_bytes): Likewise. - (dump_reloc_set): Likewise. - (dump_symbols): Demangle symbol name. - (main): Handle -C. - * binutils.texi, objdump.1: Document -C/--demangle. - - * objdump.c (usage): Mention --no-show-raw-insn. - (long_options): Add "no-show-raw-insn". - (disassemble_bytes): Handle --no-show-raw-insn. - * binutils.texi, objdump.1: Document --no-show-raw-insn. - -Wed Mar 12 11:42:00 1997 Andreas Schwab - - * rddbg.c (free_saved_stabs): Set the strings to NULL after being - freed. - -Fri Feb 28 17:18:45 1997 Ian Lance Taylor - - * bucomm.c (set_default_bfd_target): New function. - * bucomm.h (set_default_bfd_target): Declare. - * ar.c (main): Call set_default_bfd_target. - * nlmconv.c (main): Likewise. - * nm.c (main): Likewise. - * objcopy.c (main): Likewise. - * objdump.c (main): Likewise. - * size.c (main): Likewise. - * strings.c (main): Likewise. - * Makefile.in (bucomm.o): New target, to define TARGET. - -Tue Feb 25 21:28:38 1997 Ian Lance Taylor - - * objdump.c (adjust_section_vma): New static variable. - (usage): Mention --adjust-section-vma. - (OPTION_ADJUST_VMA): Define. - (long_options): Add "addjust-vma". - (display_bfd): If adjust_section_vma is not 0, add it to all the - section addresses. - (main): Handle OPTION_ADJUST_VMA. - * binutils.texi, objdump.1: Document --adjust-vma. - -Fri Feb 14 18:46:47 1997 Ian Lance Taylor - - * nm.c (print_symbol): Cache the BFD as well as the symbols and - relocs, and don't try to use the symbols or relocs with a - different BFD. - -Thu Feb 13 21:34:43 1997 Klaus Kaempf (kkaempf@progis.de) - - * config.h-vms: sbrk() is provided on openVMS/Alpha. - * makefile.vms: allow compiling with current gcc snapshot. - -Thu Feb 13 20:14:40 1997 Ian Lance Taylor - - * arsup.c, coffgrok.c, dlltool.c, nlmconv.c: Use xmalloc rather - than malloc. - -Wed Feb 12 16:12:02 1997 Ian Lance Taylor - - * objdump.c (disassemble_data): Correct VMA argument to - find_symbol_for_address. Improve handling of code with no symbol - followed by code with a symbol. - -Wed Feb 12 12:16:47 1997 Andreas Schwab - - * objdump.c (disassemble_bytes): Make output of raw instructions - work better for non-standard values of bytes_per_chunk and - bytes_per_line. - -Thu Feb 6 14:14:59 1997 Martin M. Hunt - - * objdump.c (disassemble_bytes): Added code to allow some control - over the way raw instructions are displayed. - -Thu Feb 6 12:36:03 1997 Ian Lance Taylor - - * stabs.c (struct bincl_file): Add next_stack field. - (push_bincl): Put the new file on both bincl_list and - bincl_stack. Clear the file_types field. - (pop_bincl): Use the next_stack field when popping the stack. - Don't put the file on bincl_list. - (find_excl): Include the file name when warning about an unfound - N_EXCL. - - * debug.c (debug_type_samep): Don't crash if we are passed NULL. - -Thu Feb 6 11:54:24 1997 Alan Modra - - * objcopy.1: Add missing space after .B. - -Fri Jan 31 10:33:07 1997 Andreas Schwab - - * objdump.c (disassemble_data): Initialize `aux.require_sec'. - -Wed Jan 29 13:21:21 1997 Ian Lance Taylor - - * objdump.c (objdump_print_value): Add skip_zeroes parameter. - Change all callers. - (objdump_print_addr_with_sym): Likewise. Call objdump_print_value - to print address. - (objdump_print_addr): New static function. - (objdump_print_address): Just call objdump_print_addr. - (disassemble_bytes): Print real address, not function offset. - Skip a certain number of leading zeroes. - - * objdump.c (disassemble_zeroes): New static variable. - (usage): Mention --disassemble-zeroes. - (long_options): Add "disassemble-zeroes". - (disassemble_bytes): Check disassemble_zeroes. - -Tue Jan 28 16:47:26 1997 Ian Lance Taylor - - * objdump.c (disassemble_bytes): Don't skip zeroes if the - disassembler has told us that we are in a branch delay slot. - -Mon Jan 20 14:24:04 1997 Ian Lance Taylor - - * size.c (berkeley_sum): Rewrite. Skip sections which are not - SEC_ALLOC. Count SEC_READONLY sections as text. - -Tue Jan 14 15:14:14 1997 Ian Lance Taylor - - * Makefile.in (maintainer-clean realclean): Remove *.info*, not - just *.info. From H.J. Lu . - -Tue Dec 31 15:42:54 1996 Ian Lance Taylor - - * Makefile.in (ALL_CFLAGS): Add -D_GNU_SOURCE. - -Fri Dec 27 11:19:26 1996 Ian Lance Taylor - - * configure.in: Work around bug in AC_FUNC_VFORK in autoconf 2.12. - * configure: Rebuild. - -Thu Dec 19 13:11:20 1996 Ian Lance Taylor - - Based on patch from Andrew J Klossner : - * objcopy.c (OPTION_WEAKEN): Define. - (copy_options): Add "weaken". - (copy_usage): Mention --weaken. - (weaken): New static variable. - (filter_symbols): Handle weaken. - (copy_object): Call filter_symbols if weaken. - (copy_main): Handle OPTION_WEAKEN. - * binutils.texi, objcopy.1: Document --weaken. - -Wed Dec 18 22:49:13 1996 Stan Shebs - - * mpw-make.sed: Use NewFolderRecursive for installation. - -Sat Dec 7 10:17:25 1996 Jeffrey A Law (law@cygnus.com) - - * Makefile.in (install): Add "else true" clause to cater to - broken "make" on some systems. - -Fri Dec 6 17:21:41 1996 Ian Lance Taylor - - * ieee.c (parse_ieee_bb): Always initialize namcopy to avoid gcc - warning about uninitialized variable. - (ieee_read_cxx_class): Likewise, for pf. - (ieee_enum_type): Likewise, for i. - -Tue Nov 26 17:01:25 1996 Ian Lance Taylor - - * wrstabs.c (stab_array_type): Add casts when printing - bfd_signed_vma values. - - * configure: Rebuild with autoconf 2.12. - -Mon Nov 25 16:53:18 1996 Ian Lance Taylor - - * objdump.c (disassemble_data): Don't crash if there is no - symbol. - -Fri Nov 22 17:29:14 1996 Andreas Schwab - - * ar.c (open_inarch): Don't call bfd_openr with a null name. - -Fri Nov 1 12:08:13 1996 Ian Lance Taylor - - * binutils.texi: Add section on reporting bugs. - -Thu Oct 31 18:20:53 1996 Ian Lance Taylor - - * stabs.c (struct stab_handle): Add bincl_list field. - (parse_stab): Pass value to push_bincl. Call find_excl for - N_EXCL. - (struct bincl_file): Add hash, file and file_types fields. - (push_bincl): Add hash parameter. Save it in the new hash field. - Save the file number in the new file field. - (pop_bincl): Put the bincl_file on bincl_list, rather than freeing - it. Save the file types in the new file_types field. - (find_excl): New static function. - - * ieee.c (ieee_lineno): Don't compare line number addresses to - info->highaddr (undo part of October 28 patch). - -Tue Oct 29 16:40:22 1996 Ian Lance Taylor - - * objdump.c (objdump_print_value): Don't print the empty string - for zero. - -Mon Oct 28 16:58:14 1996 Ian Lance Taylor - - * stabs.c (struct stab_handle): Add function_end field. - (start_stab): Initialize function_end. - (finish_stab): Pass info->function_end to debug_end_function. - (parse_stab): If info->function_end is set, use it as the address - which ends a function. - - * ieee.c (ieee_array_type): Remember the correct size. - - * ieee.c (ieee_finish_compilation_unit): Permit coalescing ranges - that are up to 0x1000 bytes apart, not just 64. - (ieee_add_bb11_blocks): Don't bother to emit a BB11 that is less - than 0x100 bytes. - (ieee_lineno): Only emit line numbers that are less than - info->highaddr. - -Fri Oct 25 12:12:17 1996 Ian Lance Taylor - - * ieee.c (struct ieee_defined_enum): Add defined field. - (ieee_enum_type): If the enum tag has been seen before but not - defined, reuse the same type index, and define it. - (ieee_tag_type): If this enum has not been defined, add an - undefined entry to the list of enums. - - * objdump.c (disassemble_bytes): Let the disassembler override the - number of bytes printed on a line. - -Thu Oct 24 16:42:10 1996 Ian Lance Taylor - - * objdump.c (prefix_addresses): New static variable. - (long_options): Add "prefix-addresses". - (compare_symbols): Sort BSF_FUNCTION symbols before other - symbols. - (find_symbol_for_address): New static function, broken out of - objdump_print_address. - (objdump_print_addr_with_sym): New static function, broken out of - objdump_print_address. - (objdump_print_address): Call new functions. - (disassemble_bytes): New static function, broken out of - disassemble_data. Change disassembly format, unless - prefix_addresses is set. - (disassemble_data): Call disassemble_bytes. Unless - prefix_addresses is set, disassemble in chunks headed by a - symbol. - * binutils.texi, objdump.1: Document --prefix-addresses. - - * rddbg.c (read_section_stabs_debugging_info): Preserve the - backslash when concatenating multiple stabs strings. - -Thu Oct 10 11:36:31 1996 Doug Evans - - * dlltool.c (scan_open_obj_file): Fix loop exit test. - Add missing parameter to def_exports. - -Tue Oct 8 12:06:17 1996 Ian Lance Taylor - - * Makefile.in (LEX_OPTIONS): Set to empty string. -I -Cem is the - default for flex, and is not recognized by lex. - -Thu Oct 3 17:41:23 1996 Ian Lance Taylor - - * binutils.texi (Target Selection): Document that you can now - specify targets using configuration triplets. - - * ar.c (usage): Declare. Make sure all callers pass an argument. - -Thu Oct 3 15:39:42 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) - - * Makefile.in (clean): Remove config.log. - -Wed Oct 2 15:49:16 1996 Klaus Kaempf - - * makefile.vms: Bump version date. - -Tue Oct 1 15:00:59 1996 Ian Lance Taylor - - * version.c (print_version): New function. - * bucomm.h (print_version): Declare. - * ar.c (program_version): Don't declare. - (do_show_version): Remove. - (usage): Add help parameter. Print bug report address. - (main): Set is_ranlib at start. Check for --help and --version. - Call print_version, not do_show_version. - * nlmconv.c (program_version): Don't declare. - (main): Call print_version. - (show_usage): Print bug report address. - * nm.c (program_version, print_version): Don't declare. - (usage): Print bug report address. - (main): Call print_version. - * objcopy.c (program_version): Don't declare. - (copy_usage): Print bug report address. - (strip_usage): Likewise. - (strip_main): Call print_version. - (copy_main): Likewise. - * objdump.c (program_version): Don't declare. - (usage): Print bug report address. - (main): Call print_version. - * size.c (program_version): Don't declare. - (usage): Print bug report address. - (main): Call print_version. - * strings.c (program_version): Don't declare. - (main): Call print_version. - (usage): Print bug report address. - * Makefile.in: Update dependencies. - -Thu Sep 19 14:53:15 1996 Ian Lance Taylor - - * ieee.c: Revert Monday's reflocalp patch, and apply this patch - instead: - (write_ieee_debugging_info): Write a dummy type at the end of the - global type block. - -Mon Sep 16 15:30:54 1996 Ian Lance Taylor - - * ieee.c (struct ieee_write_type): Add reflocalp field. - (ieee_pointer_type): Set reflocalp after pushing type. - (ieee_function_type): If reflocalp is set, make this type local. - (ieee_range_type, ieee_array_type, ieee_set_type): Likewise. - (ieee_const_type, ieee_volatile_type): Likewise. - (ieee_struct_field, ieee_class_baseclass): Likewise. - - * ieee.c (struct ieee_info): Add global_types field. - (parse_ieee_bb): When starting a BB1, initialize the types field - to the global_types field. - (parse_ieee_be): When ending a BB2, copy the types field to the - global_types field. - -Fri Sep 13 17:32:21 1996 Ian Lance Taylor - - * objcopy.c (change_leading_char): New static variable. - (OPTION_CHANGE_LEADING_CHAR): Define. - (copy_options): Add "change-leading-char". - (copy_usage): Mention --change-leading-char. - (filter_symbols): Add obfd parameter. Change all callers. - Implement change_leading_char. - (copy_object): Call filter_symbols if change_leading_char. - (copy_main): Handle OPTION_CHANGE_LEADING_CHAR. - * binutils.texi, objcopy.1: Document --change-leading-char. - -Tue Sep 3 14:05:29 1996 Ian Lance Taylor - - * ieee.c (ieee_enum_type): Don't check index into a NULL names - array. - * nm.c (sort_symbols_by_size): Always initialize next. - * rdcoff.c (parse_coff_type): Warn about an incomprehensible - type rather than crashing. - * rddbg.c (read_symbol_stabs_debugging_info): Initialize f. - * stabs.c (parse_stab_members): Set context in all cases. - -Thu Aug 29 16:56:52 1996 Michael Meissner - - * configure.in (i[345]86-*-*): Recognize i686 for pentium pro. - * configure: Regenerate. - -Thu Aug 29 11:29:20 1996 Ian Lance Taylor - - * objdump.c (L_tmpnam): Never define. - (display_target_list): Use choose_temp_base instead of tmpnam. - (display_info_table): Likewise. - -Tue Aug 27 18:15:01 1996 Ian Lance Taylor - - * stabs.c (parse_stab): An N_FUN symbol with an empty string - indicates the end of a function. - -Thu Aug 22 17:08:00 1996 Ian Lance Taylor - - * wrstabs.c (struct string_hash_entry): Add next field. - (struct stab_write_handle): Change strings to a pointer to - string_hash_entry. Add last_strings field. Remove strings_alloc - field. - (string_hash_newfunc): Initialize next field. - (stab_write_symbol): Copy string into hash table rather than into - buffer. Keep a list of hash table entries. - (write_stabs_in_sections_debugging_info): Initialize last_string. - Copy strings from list of hash table entries in memory. - (stab_modify_type): If the entry on the stack is a definition, - make a new definition rather than failing an assert. - (stab_array_type): The size is only zero if high is strictly less - than low. - - * ieee.c (struct ieee_info): Add saw_filename field. - (parse_ieee): Initialize saw_filename. - (parse_ieee_bb): Set saw_filename for a BB1 or BB2. In a BB1, - discard the current variables and types. In a BB10, if no - filename has been seen, call debug_set_filename. - (parse_ieee_ty): In case 'g', the type is optional. - - * prdbg.c (pr_fix_visibility): Don't abort on - DEBUG_VISIBILITY_IGNORE. - - * debug.c (debug_name_type): Correct error message. - - * configure.in: Substitute HLDENV. - * configure: Rebuild. - * Makefile.in (HLDENV): New variable. Use it whenever linking a - program. - -Thu Aug 15 19:30:41 1996 Stan Shebs - - * mpw-make.sed: Add symbolic doublequotes around the version - number. - -Thu Aug 8 12:27:52 1996 Klaus Kaempf - - * makefile.vms: Add better support for DEC C compilation. - Add new macros as in Makefile.in. - -Wed Aug 7 14:27:33 1996 Philippe De Muyter - - * configure.in: Call BFD_NEED_DECLARATION on strstr and sbrk. - * acconfig.h (NEED_DECLARATION_STRSTR): New macro. - (NEED_DECLARATION_SBRK): New macro. - * configure, config.in: Rebuild. - * bucomm.h (strstr): Declare if NEED_DECLARATION_STRSTR. - (sbrk): Declare if HAVE_SBRK and NEED_DECLARATION_SBRK. - - * prdbg.c (pr_end_struct_type): Avoid using a string constant in - assert, for the benefit of broken assert macros. - -Fri Jul 26 14:06:50 1996 Ian Lance Taylor - - * objdump.c (disassemble_data): Set disasm_info.flavour from - abfd. - -Tue Jul 23 13:59:54 1996 Ian Lance Taylor - - * dlltool.c (secdata): In non DLLTOOL_PPC case, change alignment - of .text section to 2. - -Mon Jul 22 08:46:15 1996 Stu Grossman (grossman@lisa.cygnus.com) - - * objdump.c (dump_section_stabs): Fix test for stabs sections - ending with numbers. This fixes a problem with .stab being - confused with .stab.index. - -Wed Jul 10 13:32:28 1996 Ian Lance Taylor - - * stabs.c (stab_demangle_fund_type): Return a void * for a - template, rather than simply aborting. - -Mon Jul 8 15:28:05 1996 Ian Lance Taylor - - * ar.c (open_inarch): Add file parameter. Change all callers. If - this is a newly created archive, set the target based on the - file. - * arsup.h (open_inarch): Update declaration. - -Thu Jul 4 12:00:55 1996 Ian Lance Taylor - - * Makefile.in (VERSION): Set to cygnus-2.7.1. - - * Released binutils 2.7. - - * rdcoff.c (parse_coff): Get address to pass to debug_end_function - from function size, not value of .ef symbol. From Ning - Mosberger-Tang . - -Sat Jun 29 21:18:09 1996 Ian Lance Taylor - - * objcopy.c (strip_main): Add -o option, and handle it. - (strip_usage): Mention -o. - * binutils.texi, strip.1: Mention -o. - -Mon Jun 24 17:19:02 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) - - * Makefile.in (bindir, libdir, datadir, mandir, infodir, includedir, - INSTALL_PROGRAM, INSTALL_DATA): Use autoconf set values. - (docdir): Removed. - * configure.in (AC_PREREQ): Autoconf 2.5 or higher. - -Mon Jun 24 11:59:13 1996 Ian Lance Taylor - - * objdump.c (endian): New static variable. - (usage): Mention -EB/-EL/--endian. - (long_options): Add "endian". - (disassemble_data): If endianness was specified, replace - abfd->xvec with a copy of itself with the given endianness. - (main): Handle -EB/-EL/--endian. - * binutils.texi, objdump.1: Mention -EB/-EL/--endian. - - * objdump.c: Make most variables and functions static. - - * configure.in: On alpha*-*-osf*, link against libbfd.a if not - using shared libraries. - * configure: Rebuild with autoconf 2.10. - -Sun Jun 23 14:47:36 1996 Kim Knuttila - - * dlltool.c (secdata): Changed .rdata to .reldata so .reloc will work. - (make_one_lib_file): Removed cruft. (#if 1) - -Wed Jun 19 14:46:38 1996 Ian Lance Taylor - - * objdump.c (stabs): Change from struct internal_nlist * to - bfd_byte *. - (print_section_stabs): Fetch stabs information directly, rather - than assuming that struct internal_nlist is the right size. - - * binutils.texi: Document change to binary format: file position - based on load address, not section VMA. - - * bucomm.h: Define SEEK_SET, SEEK_CUR, and SEEK_END if they are - not already defined. - -Tue Jun 18 18:25:00 1996 Ian Lance Taylor - - * Makefile.in (DISTSTUFF): Add deflex.c. - -Tue Jun 18 15:03:44 1996 Klaus Kaempf - - * config.h-vms, makefile.vms: New files. - -Mon Jun 17 09:47:31 1996 Ian Lance Taylor - - * dlltool.c (make_one_lib_file): Use BFD_RELOC_RVA rather than - BFD_RELOC_32 in IDATA7. - -Wed Jun 12 11:52:06 1996 Ian Lance Taylor - - * nm.c (struct get_relocs_info): Define. - (line_numbers): New static variable. - (long_options): Add "line-numbers". - (usage): Mention -l and --line-numbers. - (main): Handle -l. - (print_symbol): Print line numbers if requested. - (get_relocs): New static function. - * binutils.texi, nm.1: Document -l/--line-numbers. - -Tue Jun 11 20:12:15 1996 Ian Lance Taylor - - * objdump.c (dump_reloc_set): Add sec parameter. Change all - callers. If with_line_numbers is set, display line numbers of - relocation entries. - * binutils.texi, objdump.1: Document -l with -r. - -Mon Jun 10 23:42:59 1996 Ian Lance Taylor - - * ar.c (open_inarch): Report BFD error message if an archive can - not be recognized. List matching formats if the file is - ambiguously recognized. - (ranlib_touch): Likewise. - -Thu Jun 6 13:56:14 1996 Ian Lance Taylor - - * README: Add notes on how to build if you don't have ar. - - * Makefile.in: Remove old incorrect setting of CC. - -Tue Jun 4 10:52:49 1996 Tom Tromey - - * Makefile.in (install): Don't check to see if tooldir exists. - Make $(tooldir) and $(tooldir)/bin. - -Mon Jun 3 17:40:23 1996 Michael Meissner - - * strings.c (main): Make main an int function, not void. - -Fri May 31 13:59:24 1996 Ian Lance Taylor - - * nm.c (filter_symbols): Check for BSF_WEAK as well as - BSF_GLOBAL. - * objcopy.c (filter_symbols): Likewise. - -Wed May 8 16:57:20 1996 Ian Lance Taylor - - * objcopy.c (copy_object): Make clear that it is only a warning - when the output file can not represent the architecture. - -Fri May 3 11:30:17 1996 Ian Lance Taylor - - * objdump.c (disassemble_data): Don't refer to bytes past the end - of data. - -Wed Apr 24 14:10:21 1996 Ian Lance Taylor - - * rddbg.c (read_symbol_stabs_debugging_info): Move call to - free_saved_stabs outside the loop over the symbols. - -Tue Apr 23 12:56:11 1996 Ian Lance Taylor - - * objdump.c (compare_symbols): Sort symbols whose names start with - `.' after other symbols. If no other decision can be made, sort - symbols by name. - -Thu Apr 18 16:02:11 1996 Ian Lance Taylor - - * dep-in.sed: Substitute $(BFDDIR) for @BFDDIR@. - * Makefile.in: Rebuild dependencies. - (dep.sed): Substitute $(BFDDIR) for @BFDDIR@. - -Tue Apr 16 13:50:22 1996 Ian Lance Taylor - - * rdcoff.c: New file. - * rddbg.c (read_debugging_info): Read COFF symbols if COFF flavour - and no stabs were found. - * budbg.h (parse_coff): Declare. - * Makefile.in: Rebuild dependencies. - (CFILES): Add rdcoff.c. - (DEBUG_OBJS): Add rdcoff.o. - -Mon Apr 15 15:55:01 1996 Doug Evans - - * nlmconv.c (choose_temp_base{,_try}): Delete, in libiberty now. - (link_inputs): Update call to choose_temp_base. - -Mon Apr 8 14:40:05 1996 Ian Lance Taylor - - * configure.in: Permit --enable-shared to specify a list of - directories. - * configure: Rebuild. - -Fri Mar 29 16:11:33 1996 Ian Lance Taylor - - * objdump.c (dump_section_header): Print the SEC_LINK_ONCE flag - and the SEC_LINK_DUPLICATES field. - -Fri Mar 29 11:35:55 1996 J.T. Conklin (jtc@lisa.cygnus.com) - - * nlmconv.1: Changed to be recognized by catman -w on Solaris. - -Thu Mar 28 14:17:02 1996 Ian Lance Taylor - - * wrstabs.c (stab_enum_type): Set buf before using it. - -Fri Mar 22 15:49:08 1996 Ian Lance Taylor - - * stabs.c (struct stab_handle): Add field abfd. - (start_stab): Add abfd parameter. - (parse_stab_string): Skip the symbol leading char when searching - for the value of a global symbol. - * budbg.h (start_stab): Update declaration. - * rddbg.c (read_section_stabs_debugging_info): Pass abfd to - start_stab. - (read_symbol_stabs_debugging_info): Likewise. - -Thu Mar 21 12:40:48 1996 Ian Lance Taylor - - * wrstabs.c (stab_function_type): Output an empty typedef for an - unused argument, rather than making up a meaningless name. - (stab_variable): Use N_RSYM for a DEBUG_REGISTER variable. - - * ieee.c (struct ieee_info): Add global_vars field. - (parse_ieee_be): When ending the global typedef block, copy the - variables into info->global_vars. - (parse_ieee_atn): Don't require an NN record for a pmisc ATN. - (ieee_read_reference): Search the global variables after the local - variables. - -Wed Mar 20 18:08:19 1996 Andreas Schwab - - * objdump.c (disassemble_data): Make sure sym_name is always set. - (dump_section_header): Always put a space after the section name. - (dump_bfd_header): Terminate output with newline. - -Wed Mar 20 16:35:20 1996 Ian Lance Taylor - - * wrstabs.c: New file. - * budbg.h (write_stabs_in_sections_debugging_info): Declare. - * objcopy.c (write_debugging_info): For COFF or ELF, output stabs - in sections. - * Makefile.in: Rebuild dependencies. - (CFILES): Add wrstabs.c. - (WRITE_DEBUG_OBJS): New variable. - ($(OBJCOPY_PROG)): Use $(WRITE_DEBUG_OBJS), not $(DEBUG_OBJS). - ($(STRIP_PROG)): Likewise. - - * stabs.c (parse_stab_members): Make type stub detection more like - gdb. - - * ieee.c (struct ieee_handle): Add fields complex_float_index and - complex_double_index. - (ieee_complex_type): Cache type index in complex_float_index and - complex_double_index, depending upon size. Set size on type stack - to size * 2. - - * ieee.c (ieee_empty_type): Use builtin_unknown, not 0. - (ieee_void_type): Use builtin_void, not 1. - - * ieee.c (parse_ieee_ty): Handle 'V' type code. - (parse_ieee_atn): Don't require two numbers for type 10. - - * ieee.c (parse_ieee_be): Add one to offset at end of function or - block. - - * ieee.c (struct ieee_block): Add field skip. - (parse_ieee_bb): Don't call debug_record_function for __XRYCPP - function, and set skip field. - (parse_ieee_be): Don't call debug_end_function if skip is set. - - * debug.c (struct debug_handle): Add fields current_write_lineno - and current_write_lineno_index. - (debug_write): Initialize current_write_lineno and - current_write_lineno_index for each unit. Call - debug_write_linenos rather than writing out the line numbers - directly. - (debug_write_function): Call debug_write_linenos. - (debug_write_block): Likewise. - (debug_write_linenos): New static function. - - * debug.c (debug_write_type): For DEBUG_KIND_FUNCTION, push return - type before arguments. - -Mon Mar 18 18:05:33 1996 Ian Lance Taylor - - * configure.in: Add AC_FUNC_VFORK. - * configure, config.in: Rebuild. - * dlltool.c, nlmconv.c: Include if HAVE_VFORK_H is - defined. - - * stabs.c (parse_stab_range_type): A complex type is defined as a - subrange of itself with the high bound zero. - * ieee.c (ieee_complex_type): Don't crash on sizes of 12 or 16. - -Tue Mar 12 12:09:43 1996 Ian Lance Taylor - - * ieee.c (ieee_write_undefined_tag): Switch to global_types even - if it is not empty. - (ieee_tag_type): For an enum, look through info->enums. - - * configure: Rebuild with autoconf 2.8. - - * debug.c (debug_type_samep): Don't loop endlessly in - DEBUG_KIND_ENUM case. From Eric Baur . - -Mon Mar 11 12:35:03 1996 Ian Lance Taylor - - * rddbg.c (read_section_stabs_debugging_info): Call save_stab for - each stab entry, call stab_context on an error, and call - free_saved_stabs before rturning. - (read_symbol_stabs_debugging_info): Likewise. - (SAVE_STABS_COUNT): Define. - (struct saved_stab): Define. - (saved_stabs, saved_stabs_index): New static variables. - (save_stab, stab_context, free_saved_stabs): New static functios. - - * objdump.c (stab_name): Remove. - (struct stab_print): Remove. - (stab_print): Remove. - (dump_stabs): Don't initialize stab_name. - (print_section_stabs): Call bfd_get_stab_name rather than using - the stab_name array. - -Tue Feb 27 19:52:01 1996 Ian Lance Taylor - - * prdbg.c (pr_int_constant): Initialize info correctly. - (pr_float_constant): Likewise. - -Mon Feb 26 18:11:37 1996 Stan Shebs - - * mpw-make.sed: Update to handle shared library support. - -Sat Feb 24 11:21:49 1996 Alan Modra : - - * Makefile.in ($(OBJDUMP_PROG)): Search $(BFDLIB) before - $(OPCODES). - -Thu Feb 15 12:44:45 1996 Ian Lance Taylor - - * configure.in: Don't tamper with LDFLAGS. Call AC_PROG_CC before - configure.host. - * configure: Rebuild. - - * configure.in: Substitute RPATH_ENVVAR. - * configure: Rebuild. - * Makefile.in (RPATH_ENVVAR): New variable. - (check): Use $(RPATH_ENVVAR) rather than LD_LIBRARY_PATH. - - * objcopy.c (smart_rename): Rather than doing chmod then chown, do - chmod without setuid, then chown, then chmod with setuid. - -Wed Feb 14 16:46:42 1996 Martin Anantharaman - - * arsup.c (map_over_list): Reindent. Don't assume that the - function does not delete the BFD. - (ar_addlib_doer): Don't set prev->next if prev is NULL. - -Wed Feb 14 15:12:17 1996 Ian Lance Taylor - - * ieee.c (ieee_regno_to_genreg): Convert register numbers for m68k - and i960. - (ieee_genreg_to_regno): Likewise. - -Mon Feb 12 14:19:59 1996 Ian Lance Taylor - - * ieee.c: Extensive changes to write code to put types in the - global type block when possible, to output ranges for all memory - occupied by the module, and to improve efficiency. - - * debug.c (struct debug_handle): Remove class_mark field. Add - id_list and compare_list fields. - (struct debug_class_id): Define. - (struct debug_type_compare_list): Define. - (debug_write): Initialize info->id_list - (debug_write_name): Remove reference to info->class_mark. - (debug_write_type): Get id for all structs and classes. Simplify - test for whether struct has already been written. - (debug_write_class_type): Get id for all classes. Simplify test - for whether class has already been written. - (debug_write_block): Don't write out blocks other than the top - level block if they have no local variables. - (debug_set_class_id): New static function. - (debug_type_samep): New static function. - (debug_class_type_samep): New static function. - * prdbg.c (pr_start_struct_type): Always print id. - (pr_start_class_type): Likewise. - (pr_tag_type): Likewise. - - * stabs.c (struct stab_handle): Add syms and symcount fields. - (start_stab): Add syms and symcount parameters. Change all - callers. - (parse_stab_string): Look up global variables in the symbol table - to get the right value. - * budbg.h (start_stab): Update declaration. - * rddbg.c (read_section_stabs_debugging_info): Add syms and - symcount parameters. Change all callers. - - * stabs.c (parse_stab_array_type): If the index type is 0, use - int. - -Wed Feb 7 14:17:45 1996 Ian Lance Taylor - - * ieee.c (ieee_start_compilation_unit): Clear modified and - modified_alloc fields of info. - - * configure.in: Check for --enable-shared. Substitute new - variables BFDLIB and OPCODES. - * configure: Rebuild. - * Makefile.in (BFDLIB): Set to @BFDLIB@. - (OPCODES): Set to @OPCODES@. - -Mon Feb 5 16:18:42 1996 Ian Lance Taylor - - Support for building bfd and opcodes as shared libraries, based on - patches from Alan Modra : - * configure.in (HLDFLAGS): New substitution. - * configure: Rebuild. - * Makefile.in (HLDFLAGS): New variable. Make all links use - $(HLDFLAGS) before $(CFLAGS) and $(LDFLAGS). - (BFDLIB_DEP): New variable. Replace all occurrences of $(BFD) as - a dependency with $(BFDLIB_DEP). Remove $(BFD) as a dependency if - there is also a dependency on $(ADDL_DEPS). - (BFDLIB): Rename from BFD; change all uses; set to -L../bfd -lbfd. - (OPCODES_DEP): New variable. Replace all occurrends of $(OPCODES) - as a dependency with $(OPCODES_DEP). - (OPCODES): Set to -L../opcodes -lopcodes. - (ADDL_DEPS): New variable. Replace all occurrences of - $(ADDL_LIBS) as a dependency with $(ADDL_DEPS). - (check): Set LD_LIBRARY_PATH in the environment. - (config.status): Depend upon BFD configure.host and config.bfd. - -Fri Feb 2 17:02:59 1996 Doug Evans - - * objdump.c: #include stdarg.h or varargs.h. - (objdump_print_value): Change FILE* arg to struct disassemble_info*. - All callers updated. Use fprintf_func. - (objdump_print_address): Consistently use fprintf_func. - (objdump_sprintf): New function. - (disassemble_data): Print insn into a buffer, print raw insn ourselves, - then print insn mnemonic. - -Fri Feb 2 16:48:55 1996 Ian Lance Taylor - - * configure: Regenerate. - -Thu Feb 1 09:38:18 1996 Steve Chamberlain - - * configure.in (i[3-6]86-*-win32): Becomes i[3-6]86-*-cygwin32. - (powerpc*-*-cygwin32): New. - * configure: Regenerated. - -Wed Jan 31 13:22:03 1996 Richard Henderson - - * Makefile.in (distclean): Remove $(DEMANGLER_PROG).1. - -Mon Jan 29 17:36:29 1996 Ian Lance Taylor - - Based on patches from H J Lu : - * objcopy.c (remove_leading_char): New static variable. - (OPTION_REMOVE_LEADING_CHAR): Define. - (copy_usage): Mention --remove-leading-char. - (filter_symbols): If remove_leading_char, and the first character - of a global symbol matches the symbol leading char of the BFD, - remove the first character. - (copy_object): Filter the symbols if remove_leading_char is set. - (copy_main): Handle --remove-leading-char. - * binutils.texi, objcopy.1: Document --remove-leading-char. - -Sat Jan 27 15:40:13 1996 Michael Meissner - - * objdump.c (fprintf): Add prototype to avoid compiler warning on - SunOS. - -Fri Jan 26 11:53:42 1996 Ian Lance Taylor - - * binutils.texi (nm): Improve documentation on symbol types. - (objdump): Reference the stabs manual from the discussion of the - --stabs option. - -Thu Jan 25 11:21:46 1996 Raymond Jou - - * mpw-make.sed: Add a "stamps" target. - -Thu Jan 25 13:51:44 1996 Ian Lance Taylor - - * objdump.c (dump_headers, dump_section_header): Change objdump -h - output to be simpler and to include section file offsets. - -Wed Jan 24 12:06:05 1996 Ian Lance Taylor - - * stabs.c (parse_stab_members): Don't adjust voffset. - - * ieee.c (ieee_read_cxx_class): Don't multiply voffset by 4. - (struct ieee_write_type): Add name field. - (struct ieee_type_class): Remove name field. Change all uses to - use new name field in type instead. - (struct ieee_name_type): Likewise. - (ieee_start_struct_type): Initialize name field of type. - (ieee_start_class_type): Don't initialize classdef entry of tag. - (ieee_class_method_var): Don't adjust voffset. - (ieee_end_class_type): Likewise. - (ieee_tag_type): Initialize new name field of type. - (ieee_typdef): Set name after copying in type information. - - * debug.c (VOFFSET_STATIC_METHOD): Define as -1, not 1. - - * ieee.c (struct ieee_modified_type): Define. - (struct ieee_handle): Add modified and modified_alloc fields. - (ieee_get_modified_info): New static function. - (ieee_pointer_type): Cache type index. - (ieee_const_type): Likewise. - (ieee_volatile_type): Likewise. - - * ieee.c (ieee_define_named_type): When creating a tag for an - anonymous struct, copy the name into memory. - (ieee_tag_type): Likewise. - * debug.c (debug_write_type): Only check and set id field for an - unnamed object. - (debug_write_class_type): Likewise. - - * ieee.c: Various changes to write out types for functions and - references, and to not write out unnecessary function types. - - * ieee.c (struct ieee_var): Remove variable field. Add kind - field, and define some enum constants for it. - (parse_ieee_ty): Set kind field of variable for 'x' and 'X' types. - (parse_ieee_atn): Make an indirect slot for an external variable, - although we otherwise don't record it. Set kind field rather than - variable field of pvar. - (ieee_read_cxx_class): Try to get the type of a static member. - (ieee_read_reference): Check kind field rather than variable - field. - -Tue Jan 23 15:54:18 1996 Ian Lance Taylor - - * ieee.c: Various changes to handle reading C++ reference type - information. - - * debug.h (enum debug_var_kind): Add DEBUG_VAR_ILLEGAL. - (enum debug_parm_kind): Add DEBUG_PARM_ILLEGAL. - * debug.c (debug_get_parameter_types): Handle DEBUG_KIND_FUNCTION. - - * ieee.c: Various changes to write out definitions of C++ classes. - - * debug.c (debug_append_filename): Remove. - * debug.h (debug_append_filename): Don't declare. - - * stabs.c (struct stab_handle): Remove last_type field. Add - so_string and so_value fields. - (finish_stab): Call stab_emit_pending_vars before calling - debug_end_function. Don't warn about pending variables. - (parse_stab): Accumulate N_SO strings until a non N_SO symbol is - seen, rather than calling debug_append_filename. Call - stab_emit_pending_vars before calling debug_end_function. Don't - set info->last_type. - -Tue Jan 23 09:53:54 1996 Doug Evans - - * objdump.c (disassemble_data): Handle unknown endianness. - Pass fprintf to INIT_DISASSEMBLE_INFO. - -Mon Jan 22 16:46:43 1996 Doug Evans - - Add new option --show-raw-insn. - * objdump.c (show_raw_insn): New global. - (usage): Update. - (long_options): Update. - (disassemble_data): Set disasm_info.flags if --show-raw-insn. - - * objdump.c (disassemble_data): Set new arch,mach,endian fields in - disasm_info. - -Mon Jan 22 19:29:36 1996 Ian Lance Taylor - - * ieee.c: Extensive changes to pass a single info argument around - in the reading routines, rather than several arguments. Add code - to read C++ debugging records. - - * debug.h (debug_get_type_size): Declare. - (debug_get_field_name): Declare. - (debug_get_field_bitpos): Declare. - (debug_get_field_bitsize): Declare. - (debug_get_field_visibility): Declare. - (debug_get_field_physname): Declare. - * debug.c (debug_get_real_type): Handle DEBUG_KIND_TAGGED. - (debug_get_type_size): New function. - (debug_get_field_name): New function. - (debug_get_field_bitpos): New function. - (debug_get_field_bitsize): New function. - (debug_get_field_visibility): New function. - (debug_get_field_physname): New function. - (debug_write_type): Make sure we pass the real kind, not INDIRECT, - to tag_type. Pass the name recursively for INDIRECT. - -Fri Jan 19 12:31:57 1996 Ian Lance Taylor - - * debug.h (struct debug_write_fns): Remove ellipsis_type. Add int - and boolean parameters to function_type. Add boolean parameter to - method_type. - (debug_make_ellipsis_type): Don't declare. - (debug_make_function_type): Add debug_type * and boolean - parameters. Change all callers. - (debug_make_method_type): Add boolean parameter. Change all - callers. - (debug_get_parameter_types): Add boolean * parameter. Change all - callers. - (debug_get_target_type): Declare. - * debug.c (struct debug_function_type): Add fields arg_types and - varargs. - (struct debug_method_type): Add field varargs. - (debug_ellipsis_type, ELLIPSIS_P): Remove. - (debug_make_ellipsis_type): Remove. - (debug_make_function_type): Add arg_types and varargs parameters. - (debug_make_method_type): Add varargs parameter. - (debug_get_parameter_types): Add pvarargs parameter. - (debug_get_target_type): New function. - (debug_write_type): In case DEBUG_KIND_FUNCTION, push argument - types and pass count to function_type. In DEBUG_KIND_METHOD, use - a signed int for the count, don't call ellipsis_type, and pass - varargs to method_type. - * stabs.c (struct stab_demangle_info): Add varargs field. - (stab_demangle_argtypes): Add pvarargs parameter. Change all - callers. - (stab_demangle_args): Likewise. - (stab_demangle_type): In case 'F', pick up argument types. - * prdbg.c (pr_ellipsis_type): Remove. - (pr_function_type): Add argcount and varargs parameters. - (pr_method_type): Add varargs parameter. - * ieee.c (ieee_ellipsis_type): Remove. - (ieee_function_type): Add argcount and varargs parameters. - (ieee_method_type): Add varargs parameter. Remove most of - function body, and just call ieee_function_type. - - * stabs.c: Include "demangle.h". Added several new static - functions not listed below to demangle argument types; they are - all called via stab_demangle_argtypes. - (finish_stab): If the kind of an undefined tag is - DEBUG_KIND_ILLEGAL, use DEBUG_KIND_STRUCT instead. Warn if there - are any pending variable. - (parse_stab): Don't close the function when the block depth goes - to zero. Pass value to debug_end_function. - (parse_stab_string): In case 'T', pass the name to - parse_stab_type. - (parse_stab_type): In case 'x', use stab_find_tagged_type. In - case '#', handle functions with variable numbers of arguments. - (parse_stab_struct_type): Add tagname parameter. Change all - callers. - (parse_stab_members): Add tagname and typenums parameters. Change - all callers. If the type of a method is a stub, call - parse_stab_argtypes to demangle the argument types and get the - physical name of the function. - (parse_stab_argtypes): New static function. - (stab_record_variable): For a DEBUG_GLOBAL or DEBUG_STATIC - variable, call debug_record_variable immediately. - (stab_find_tagged_type): New static function. - - * debug.h (enum debug_type_kind): Add DEBUG_KIND_ILLEGAL. - (struct debug_write_fns): Add field ellipsis_type. Add id - parameter to start_struct_type, start_class_type, and tag_type. - (debug_make_ellipsis_type): Declare. - (debug_find_named_type): Declare. - (debug_get_type_kind): Declare. - (debug_get_return_type): Declare. - (debug_get_parameter_types): Declare. - (debug_get_fields): Declare. - (debug_get_field_type): Declare. - * debug.c (struct debug_handle): Add fields class_id and base_id. - (struct debug_class_type): Add field id. - (struct debug_method_variant): Rename argtypes to physname. - Change all uses. - (debug_ellipsis_type): New static variable. - (ELLIPSIS_P): New macro. - (debug_make_ellipsis_type): New function. - (debug_make_method_variant): Rename argtypes to physname. - (debug_make_static_method_variant): Likewise. - (debug_name_type): Always put types in the global namespace. - (debug_find_named_type): New function. - (debug_find_tagged_type): Treat DEBUG_KIND_ILLEGAL specially, - rather than DEBUG_KIND_VOID. - (debug_get_real_type): New static function. - (debug_get_type_kind): New function. - (debug_get_return_type): New function. - (debug_get_parameter_types): New function. - (debug_get_fields): New function. - (debug_get_field_type): New function. - (debug_write): Initialize base_id. - (debug_write_type): Pass new id argument to tag_type. Handle - DEBUG_KIND_ILLEGAL. Use id for DEBUG_KIND_STRUCT and - DEBUG_KIND_UNION. Handle ellipsis for method arguments. - (debug_write_class_type): Don't dereference kclass if it is NULL. - Use id. - * prdbg.c (pr_fns): Add pr_ellipsis_type. - (pr_ellipsis_type): New static function. - (pr_pointer_type): If this is a pointer to an array, parenthesize - it correctly. - (pr_start_struct_type): Add id parameter. - (pr_start_class_type): Likewise. - (pr_tag_type): Likewise. - (pr_fix_visibility): Add the visibility to the top of the stack, - not the second element on the stack. - (pr_struct_field): Pop the stack before calling pr_fix_visibility. - (pr_class_static_member): Likewise. - (pr_class_start_method): Don't push a type, just set the method - name in the type on the top of the stack. - (pr_class_end_method): Don't pop the stack. - (pr_class_method_variant): Rename argtypes parameter to physname. - Append const and volatile rather than prepending them. Add a - space after the physname. - (pr_class_static_method_variant): Likewise. - * ieee.c (ieee_fns): Add ieee_ellipsis_type. - (ieee_define_named_type): Use DEBUG_KIND_ILLEGAL rather than - DEBUG_KIND_VOID. - (write_ieee_debugging_info): Likewise. - (ieee_typdef): Likewise. - (ieee_ellipsis_type): New static function. - (ieee_start_struct_type): Add id parameter. - (ieee_start_class_type): Likewise. - (ieee_tag_type): Likewise. - (ieee_class_method_variant): Rename name to physname. - (ieee_class_static_method_variant): Likewise. - - * Makefile.in (DEBUG_OBJS): Remove prdbg.o. - ($(OBJDUMP_PROG)): Depend upon, and link against, prdbg.o. - -Thu Jan 18 17:35:06 1996 Kim Knuttila - - * dlltool.c (make_tail): Changed the order of the sections to avoid - an alignment problem. - -Wed Jan 17 14:23:00 1996 J.T. Conklin - - * srconv.c (wr_du): Set du.stackfrmt to 0. - (wr_un, wr_sc): Emit all sections, even those with 0 size. - -Tue Jan 16 16:15:49 1996 J.T. Conklin - - * srconv.c (wr_hd): Space size within segment was being - stored in segment identifier field. - -Tue Jan 16 12:07:25 1996 Stan Shebs - - * mpw-config.in (BUILD_NLMCONV, BUILD_SRCONV, SYSINFO_PROG, - BUILD_DLLTOOL): Put definitions for these into makefile when - configuring, instead of always clearing in mpw-make.sed. - * mpw-make.sed: Edit out any host_alias or target_alias settings, - fix pathname to BFD internal include files, remove dependency - calculation rules. - -Thu Jan 11 17:31:38 1996 Michael Meissner - - * objdump.c (dump_section_header): Add new section flags - SEC_{EXCLUDE,SORT_ENTRIES}. - -Thu Jan 11 11:45:34 1996 Ian Lance Taylor - - * objcopy.c (filter_symbols): NULL terminate the output symbols. - (copy_object): Allocate space for a possible extra NULL pointer. - - * debug.c (debug_make_undefined_tagged_type): Make sure we are - given a kind of type we can handle. - (debug_write_type): Handle undefined enums and structs. - (debug_write_class_type): Handle undefined classes. - * prdbg.c (pr_enum_type): Handle an undefined enum. - * ieee.c (ieee_enum_type): Likewise. - -Wed Jan 10 15:33:18 1996 Ian Lance Taylor - - * Makefile.in: Updated dependencies. - (ALLOCA, MALLOC): Remove variables. - (ADDL_LIBS): Remove $(MALLOC) from definition. - * alloca.c, gmalloc.c: Remove. - -Mon Jan 8 18:02:29 1996 Ian Lance Taylor - - * ieee.c: Add global function write_ieee_debugging_info and a - bunch of static functions and structs used to write out IEEE - debugging information. - * budbg.h (write_ieee_debugging_info): Declare. - - * ieee.c (struct ieee_type): Add pslot field. - (enum builtin_types): Define. - (ieee_builtin_type): For a pointer, return a pointer to the named - type. Use enum values rather than numbers. - (ieee_alloc_type): New static function. - (ieee_read_type_index): Use ieee_alloc_type. - (parse_ieee_bb): Likewise. - (parse_ieee_ty): Likewise. Use ieee_builtin_type for array range, - rather than making a new integer type. Store the new type in the - slot, if there is one. - (parse_ieee_atn): Treat ATN10 as defining a register variable. - (ieee_regno_to_genreg): Rename from ieee_regno_to_gen. Change all - callers. - (ieee_genreg_to_regno): New static function. - - * stabs.c (parse_stab_type): Add new typename parameter. Change - all callers. - (parse_stab_range_type): Add new typename parameter. Change all - callers. - - * debug.h (struct debug_write_fns): Add tag parameter to - enum_type, start_struct_type, and start_class_type. - * debug.c (debug_write_type): Pass any tag name to - start_struct_type, debug_write_class_type, and enum_type. If - DEBUG_KIND_TAGGED, pass the name in the recursive call. - (debug_write_class_type): Accept a new tag parameter, and pass it - to start_class_type. - * prdbg.c (pop_type): Don't remove '+' character. - (pr_enum_type): Accept and use tag parameter. - (pr_start_struct_type): Likewise. - (pr_start_class_type): Likewise. - (pr_class_baseclass): Adjust algorithm used to find where to put - the baseclass name. - (pr_tag): Don't bother to insert the tag name. - - * objcopy.c: Include budbg.h. - (convert_debugging): New static variable. - (OPTION_DEBUGGING): Define. - (copy_options): Add "debugging". - (copy_usage): Mention --debugging. - (is_strip_section): Skip debugging sections if convert_debugging. - (setup_section, copy_section): Likewise. - (filter_symbols): Skip debugging symbols if convert_debugging. - (copy_object): If convert_debugging, read and write debugging - information. - (write_debugging_info): New static function. - (copy_main): Handle --debugging. - * Makefile.in (DEBUG_OBJS): New variable. - ($(OBJCOPY_PROG)): Depend upon and link against $(DEBUG_OBJS). - ($(STRIP_PROG)): Likewise. - (OBJDUMP_OBJS): Remove variable. - ($(OBJDUMP_PROG)): Use objdump.o $(DEBUG_OBJS) rather than - $(OBJDUMP_OBJS). - * binutils.texi, objcopy.1: Document --debugging. - -Thu Jan 4 16:31:21 1996 Ian Lance Taylor - - * ieee.c: New file with code to read IEEE debugging information. - * budbg.h (parse_ieee): Declare. - * rddbg.c (read_debugging_info): Handle IEEE flavour files. - (read_ieee_debugging_info): New static function. - * Makefile.in: Rebuild dependencies. - (CFILES): Add ieee.c. - (OBJDUMP_OBJS): Add ieee.o. - - * bucomm.h (xrealloc): Change type of first parameter from char * - to PTR. - -Tue Jan 2 17:44:07 1996 Ian Lance Taylor - - * Makefile.in: Add targets to automatically rebuild dependencies. - Remove targets which just listed dependencies of .o files. - (DEP): New variable. - (HFILES, GENERATED_HFILES): New variables. - (CFILES, GENERATED_CFILES): New variables. - (underscore.c): Don't do anything, just depend upon stamp-under. - (stamp-under): New target; do what underscore.c used to do. - (nlmconv.o): Depend upon sym.h and ecoff.h. - (.dep, .dep1, dep.sed, dep, dep-in): New targets. - (stage1, stage2, stage3, against, comparison): Remove. - (de-stage1, de-stage2, de-stage3): Remove. - (clean, distclean): Remove stamp-under and dep.sed. - * dep-in.sed: New file. - - Implement generic debugging support. Implement a stabs reader and - a generic printer. - * budbg.h, debug.c, debug.h, prdbg.c, rddbg.c, stabs.c: New files. - * objdump.c: Include "debug.h" and "budbg.h". - (dump_debugging): New global variable. - (usage): Mention --debugging. - (long_options): Add "debugging". - (display_bfd): Handle --debugging. - * Makefile.in (OBJDUMP_OBJS): New variable. - ($(OBJDUMP_PROG)): Use $(OBJDUMP_OBJS). - * binutils.texi, objdump.1: Document --debugging. - -Sat Dec 30 09:59:51 1995 Jeffrey A Law (law@cygnus.com) - - * nm.c ( long_options): Add "--defined-only" option. - (usage): Update for new "--defined-only" option. - (filter_symbols): Handle "--defined-only". - -Fri Dec 29 16:04:56 1995 Ian Lance Taylor - - * arparse.y: Include "bucomm.h", not . - * nlmheader.y: Don't include "sysdep.h". - -Tue Dec 26 18:23:18 1995 Ian Lance Taylor - - * nm.c (print_symdef_entry): Check return value of - bfd_get_elt_at_index. - -Sat Dec 23 11:03:16 1995 Michael Meissner - - * configure.in (DLLTOOL_DEFS): Build dlltool for PowerPC if target - is powerpc*-*-win* in addition to powerpc*-*-*pe*. - -Fri Dec 15 16:30:57 1995 Ian Lance Taylor - - * objdump.c (endian_string): New static function. - (display_target_list): Use it. - * nlmconv.c (main): Use new bfd_big_endian macro. - -Fri Dec 15 07:51:34 1995 steve chamberlain - - * dlltool.c (fill_ordinals): Start from 1 if no other instructions - given. - -Tue Dec 12 12:05:21 1995 Ian Lance Taylor - - * Makefile.in (clean): Remove $(DEMANGLER_PROG).1. From Ronald - F. Guilmette . - -Mon Dec 11 14:33:05 1995 Stan Shebs - - * mac-binutils.r: Fix copyright and version strings. - - * Makefile.in (version): Remove, no longer used. - -Fri Dec 1 14:41:56 1995 Stan Shebs - - * mpw-make.sed (install, install-only): Edit in Mac-specific - install procedure. - -Thu Nov 30 20:26:02 1995 Kim Knuttila - - * dlltool.c (ppc_jtab): The binary glue for PowerPC dll linkage, - including the return instruction. - sinfo: added a preferred alignment field. - (secdata): section data for the PowerPC version. - (make_one_lib_file): More symbols, More sections (pdata, rdata) - (make_tail): Use idata$6 instead of idata$7 for ppc. Also added a - NULL idata$3 descriptor (temporary). - -Tue Nov 28 17:23:44 1995 Doug Evans - - * dlltool.c (fill_ordinals): Don't reference d_export_vec if - there are no exported functions. - -Mon Nov 27 13:05:59 1995 Ian Lance Taylor - - * configure: Regenerate with autoconf 2.7. - -Wed Nov 22 13:17:15 1995 Ian Lance Taylor - - * dlltool.c (fill_ordinals): Start assigning ordinals at 1. - - * Makefile.in (EXPECT): Use $$r, not $${rootme}. - (check): Set r, not rootme. - -Tue Nov 21 18:04:09 1995 Ian Lance Taylor - - * configure.in: Use BFD_NEED_DECLARATION. - * acconfig.h: Put NEED_DECLARATION_FPRINTF in @TOP@ section. - * configure, config.in: Rebuild with autoconf 2.6. - -Fri Nov 17 10:34:37 1995 Ian Lance Taylor - - * Makefile.in (CC_FOR_TARGET): Use @host@ and @target@, not - $(host_canonical) and $(target_canonical). - -Thu Nov 16 03:39:20 1995 Ken Raeburn - - Version 2.6 released. - * Makefile.in (VERSION): Update to 2.6. - -Wed Nov 15 12:14:17 1995 Ian Lance Taylor - - * Makefile.in (CC_FOR_TARGET): Define. - (check): Pass CC and CFLAGS to runtest. - - * nm.c (display_rel_file): Don't require a DYNAMIC object when - dumping the dynamic symbol table. - - * objdump.c (compare_symbols): Sort global symbols before local - symbols before debugging symbols. - (objdump_print_address): Don't futz around looking for a global - symbol with the same value. - -Tue Nov 14 17:19:11 1995 Ian Lance Taylor - - * dlltool.c: Use FOPEN_* macros rather than "r" or "w". - - * dlltool.c (fill_ordinals): Correct memset call. - -Sun Nov 12 12:56:05 1995 Stan Shebs - - * mpw-make.sed (DEMANGLER_PROG): Edit out attempts to do anything - with the man page. - -Fri Nov 10 11:41:22 1995 Ian Lance Taylor - - * objcopy.c (setup_section): Copy the section lma independently of - the vma. - -Wed Nov 8 11:33:00 1995 Ian Lance Taylor - - * arsup.c (ar_open): Cast malloc return value. - -Tue Nov 7 09:01:26 1995 Kim Knuttila - - * configure.in, configure (DLLTOOL_DEFS): Added ppc target. - * dlltool.c (MPPC): Added basic PPC definitions. - -Tue Nov 7 14:02:57 1995 Ian Lance Taylor - - * configure.in: Don't treat rs6000-*-lynx* specially. - * configure: Rebuild. - * config/rslynx: Remove. - * Makefile.in: Remove @target_makefile_fragment@. - -Mon Nov 6 15:00:50 1995 Ian Lance Taylor - - * bucomm.h: Include . - * ar.c: Don't include or . - * bucomm.c, dlltool.c, nlmconv.c, objcopy.c, objdump.c: Likewise. - -Fri Nov 3 12:38:09 1995 Ian Lance Taylor - - * objdump.c: Include . - - Permit user to override DEMANGLER_PROG from command line. From - Manfred Hollstein . - * Makefile.in ($(DEMANGLER_PROG)): Depend upon - $(DEMANGLER_PROG).1. - (install): Don't depend upon $(DEMANGLER_PROG).1. Only install - $(DEMANGLER_PROG).1 if $(DEMANGLER_PROG) is not empty. - -Wed Nov 1 15:04:57 1995 Manfred Hollstein KS/EF4A 60/1F/110 #40283 - - * Makefile.in (syslex.o): add -I$(srcdir) if compiling in a - separate directory. - -Mon Oct 30 14:24:18 1995 Ian Lance Taylor - - * objdump.c (objdump_print_value): New static function. - (objdump_print_address): Use it. If we need the right section for - the symbol, and we can't find it, print an offset from the section - rather than using a symbol from some other section. - -Thu Oct 26 10:23:14 1995 steve chamberlain - - * dlltool.c (no_idata4, no_idata5): New. - (arm_jtab): Use correct encoding of jump instruction. - (usage, main, make_head, make_tail): Act on no_idata4, no_idata5. - -Wed Oct 25 12:10:07 1995 Stan Shebs - - * mpw-make.sed: Edit paths to generated y.tab.[ch] files. - -Fri Oct 20 18:40:34 1995 Ian Lance Taylor - - * binutils.texi: Change --with-targets to --enable-targets. - -Thu Oct 19 17:47:41 1995 Fred Fish - - * Makefile.in: Remove extraneous tab on otherwise empty line, - which confuses many non-GNU versions of "make". - -Wed Oct 18 16:31:58 1995 steve chamberlain - - * dlltool.c (i386_jtab, arm_jtab): New - (gen_lib_file): Rewritten to use bfd. - -Fri Oct 13 16:10:07 1995 Michael Meissner - - * Makefile.in (install): Don't give error message if dlltool - wasn't built. - -Fri Oct 13 11:04:37 1995 steve chamberlain - - * deflex.l: Allow quoting of IDs. - * defparse.y (%union): string deleted. - (command): DESCRIPTION takes ID. - * dlltool.c (gen_def_file): Quote outgoing name if - necessary. Preserve NONAME. - (gen_lib_file): Run ranlib. - (workout_prefix): Deleted. - (main, usage, long_options): Add --as, --ranlib, --ar options. - -Wed Oct 11 13:36:13 1995 steve chamberlain - - * dlltool.c (mtable): HOW_ALIGN_LONG, new. - (d_ord): Deleted. - (d_low_ord, d_high_ord, d_named_funcs): New. - (gen_exp_file): Create noname entries correctly. - (gen_lib_file): Dump exports alphabetically. - (process_duplicates): Count nonamed functions. - (fill_ordinals): Keep track of highest ord too. - (mangle_defs): Create alphabetically ordered list of names. - -Tue Oct 10 09:39:09 1995 steve chamberlain - - * Makefile.in (TOOL_PROGS): Include DLLTOOL_PROG. - -Mon Oct 9 13:06:31 1995 steve chamberlain - - * dlltool.c (add_underscore): New. - (xlate): Use new name. - (main, usage): Update. - -Fri Oct 6 14:08:51 1995 Ken Raeburn - - * sysinfo.y: Eliminate unused terminals "[" and "]" and unused - nonterminal "name". One s/r conflict remains. - - Mon Sep 25 22:49:32 1995 Andreas Schwab - - * nm.c (print_symname): Don't try to demangle an empty - name. - * objdump.c (slurp_symtab): Reset symcount if there are - no symbols. - (slurp_dynamic_symtab): Likewise, for dynsymcount. - (disassemble_data): Fix memory leak: free sorted_syms when done. - (display_bfd): Likewise, for syms and dynsyms. - (dump_relocs): Don't print header before possibly generating an - error message. - (dump_dynamic_relocs): Likewise. - - * ar.1, nm.1, objdump.1, size.1, strings.1, strip.1: Fix typos and - formatting bugs. - -Fri Oct 6 12:00:25 1995 Ian Lance Taylor - - * ar.c (do_quick_append): Comment out. - (replace_members): Add quick argument. - (main): Don't call do_quick_append. - (open_inarch): Don't call quick_append to create an empty archive. - Instead call bfd_openw/bfd_set_format/bfd_close. - -Thu Oct 5 20:53:08 1995 Ken Raeburn - - * bucomm.c: Always include time.h. - -Thu Oct 5 17:25:21 1995 Ian Lance Taylor - - * objdump.c (compare_symbols): Sort gnu_compiled and gcc2_compiled - symbols after other symbols with the same value. Likewise for - symbols which look like file names. - (objdump_print_address): Always chose the first reasonable symbol - with a given value. - -Tue Oct 3 22:38:55 1995 Ian Lance Taylor - - * arsup.c (ar_save): Use rename, not unlink/link/unlink. - -Mon Oct 2 12:10:25 1995 Ian Lance Taylor - - * strings.c (main): Exit with zero status if no files are given - and standard input is read. - -Thu Sep 28 20:03:07 1995 Stan Shebs - - * mpw-config.in: Calculate underscore and put into makefile - fragment, generate config.h. - * mpw-make.sed: New file, sed commands to edit Unix makefile - into MPW syntax. - * mpw-make.in: Remove. - * mac-binutils.r: New file, Mac resources. - -Thu Sep 28 15:49:00 1995 steve chamberlain - - * dlltool.c: (gen_exp_file): Always emit a .reloc section if - relocatable. - (imp_name_lab): New. - (gen_def_file): New. - (gen_lib_file): Use imp_name_lab. - (main): Initialize imp_name_lab. - -Mon Sep 25 12:05:34 1995 Ian Lance Taylor - - * configure.in: Call AC_HEADER_SYS_WAIT. - * configure: Rebuild. - * config.in: Rebuild. - * dlltool.c: Include "libiberty.h" and "bucomm.h". Don't include - , , or . Don't include . - Include . Use HAVE_SYS_WAIT_H to control whether to - include or define the wait macros by hand. Don't - declare xmalloc. - (gen_lib_file): Don't assume that sprintf returns the number of - characters; use strlen instead. - -Fri Sep 22 17:16:41 1995 Ian Lance Taylor - - * objdump.c (disassemble_data): Don't use the old BFD based - disassembler interface. Make info a const pointer. - -Wed Sep 13 18:33:44 1995 Ian Lance Taylor - - * objdump.c (start_address): New variable. - (stop_address): New variable. - (usage): Mention --start-address and --stop-address. - (OPTION_START_ADDRESS, OPTION_STOP_ADDRESS): Define. - (long_options): Add "start-address" and "stop-address". - (disassemble_data): Handle start_address and stop_address. - (dump_data, dump_reloc_set): Likewise. - (main): Don't set seenflag for -l. Handle OPTION_START_ADDRESS - and OPTION_STOP_ADDRESS. - * objcopy.c (parse_vma): Move to bucomm.c. - * bucomm.c (parse_vma): New function, moved in from objcopy.c. - * bucomm.h (parse_vma): Declare. - * binutils.texi, objdump.1: Document new objdump options. - -Tue Sep 12 12:37:39 1995 Ian Lance Taylor - - * Makefile.in (maintainer-clean): New target. - - * ar.c (replace_members): Don't call write_archive if nothing - changed. - - * objdump.c (disassemble_data): Add casts to avoid gcc warnings. - -Thu Sep 7 12:12:17 1995 Ian Lance Taylor - - * config.in: Rename from config.h.in. - * configure.in: Call AC_CONFIG_HEADER with config.h:config.in. - Check for config.h:config.in when creating stamp-h. - * configure: Rebuild. - * Makefile.in (stamp-h): Depend upon config.in rather than - config.h.in. Set CONFIG_HEADERS to config.h:config.in when - calling config.status. - - * Makefile.in (distclean): Remove config.h, stamp-h, and - config.log. - - * nm.c (value_format): Initialize based on BFD64 and - BFD_HOST_64BIT_LONG. - (print_radix): New static variable. - (set_print_radix): Set print_radix. Adjust changes to - value_format. - (print_value): New static function, to print 64 bit octal and - decimal values correctly. - (print_symbol_info_bsd): Check BFD64, not BFD_HOST_64_BIT. Use - print_value. - (print_symbol_info_sysv): Use print_value. - (print_symbol_info_posix): Likewise. - -Wed Sep 6 15:02:55 1995 Ian Lance Taylor - - * Makefile.in (*.o): Remove incorrect dependencies on - $(BFDDIR)/hosts/std-host.h. - - * Makefile.in (INSTALL_DATA): Add -m 644. - (INSTALL_XFORM1): Likewise. - (CC_FOR_BUILD): Set to @CC_FOR_BUILD@ rather than $(CC). - (mostlyclean): Remove config.log. - (distclean): Remove config.cache. - - * configure.in: Call BFD_CC_FOR_BUILD and BFD_BINARY_FOPEN. - * configure: Rebuild. - -Tue Sep 5 20:22:42 1995 Ian Lance Taylor - - * configure.in: Rewrite to use autoconf. - * aclocal.m4: New file. - * configure: New file, built by autoconf. - * acconfig.h: New file. - * config.h.in: New file, built by autoheader. - * Makefile.in: Various changes for new configure script. Also: - (PROGS): Remove $(SYSINFO_PROG). - (ALL_CFLAGS): Remove $(TDEFINES). - (version.o): Use $(ALL_CFLAGS). - (cplus-dem.o, dlltool.o, nlmconv.o): Likewise. - (sysdump.o): Depend upon bucomm.h and config.h. - (srconv.o, arsup.o, strings.o): Depend upon config.h. - (filemode.o): Don't depend upon ../bfd/sysdep.h. - (bucomm.o): Depend upon config.h, not ../bfd/sysdep.h. - (size.o, objdump.o, nm.o, ar.o, objcopy.o): Likewise. - (nlmheader.o, nlmconv.o): Likewise. - (distclean): Don't remove sysdep.h. - * bucomm.h: Include "ansidecl.h", , and "config.h". - Include "fopen-same.h" or "fopen-bin.h", based on - USE_BINARY_FOPEN. Include , and declare errno if it is - not a macro. Include , , , - , and if they are present. Declare strchr, - strrchr, and strstr if no string header file exists. Include - if it exists and does not. Define - O_RDONLY and O_RDWR if necessary. - * ar.c: Don't include "sysdep.h". Do include and - . Use HAVE_GOOD_UTIME_H rather than POSIX_UTIME. Use - HAVE_UTIMES rather than !USE_UTIME. Don't include , and - don't declare errno. - * arsup.c: Don't include . - * bucomm.c: Don't include "sysdep.h". Include , - , and . Include if it defines - time_t. Define time_t if necessary. - * coffdump.c: Don't include "sysdep.h". - * coffgrok.c, filemode.c, nlmconv.c, size.c: Likewise. - * srconv.c, strings.c: Likewise. - * nm.c: Don't include "sysdep.h". Don't try to define HAVE_SBRK. - * objcopy.c: Don't include "sysdep.h". Include and - . - (simple_copy): Use creat rather than assuming that O_CREAT is - defined. - * objdump.c: Don't include "sysdep.h". Use - NEED_DECLARATION_PRINTF rather than !FPRINTF_ALREADY_DECLARED. - * sysdump.c: Include "bfd.h" and "bucomm.h". Don't include - "sysdep.h" or . - (dump_symbol_info): Rename from symbol_info. Change all callers. - -Mon Sep 4 14:30:00 1995 Ian Lance Taylor - - * configure.in (host_makefile_frag): Don't set. Substitute for - @CC@, @CFLAGS@, @HDEFINES@ and @LDFLAGS@ in Makefile. - * Makefile.in (AR_FLAGS): Set to rc rather than qv. - (CC): Define as @CC@. - (CFLAGS): Set to @CFLAGS@. - (LDFLAGS): Define as @LDFLAGS@. - (ALL_CFLAGS): Use @HDEFINES@ rather than $(HDEFINES). - - * configure.in: Don't bother to call config.bfd for each target. - Just call it for the default target, and use the shell variable to - decide whether underscores are used. - -Thu Aug 31 19:21:48 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * configure.in: match i[3-6]86-*-win32, not just i386-*-win32. - -Thu Aug 31 16:30:22 1995 steve chamberlain - - * dlltool.c (add_indirect): New. - (asm_prefix): New - (gen_exp_file): Timestamp should be 0. Insert prefix when - needed. New code for indirection. - (gen_lib_file): Timestamp should be 0. Insert prefix - when needed. - (usage): Document --add-indirect. - (main): Cope with new option. - - * objdump.c (dump_private_headers): New. - (usage): Document new option. - (long_option): Add private-headers. - (dump_bfd_private_header): New. - (main): Cope with new option. - -Thu Aug 31 04:09:16 1995 Doug Evans - - * dlltool.c (run): Add missing 3rd arg to waitpid. - -Wed Aug 30 11:02:11 1995 steve chamberlain - - * Makefile.in (TOOL_PROGS): Include dlltool if needed. - -Tue Aug 29 13:25:21 1995 steve chamberlain - - * dlltool.c (rva): Deleted. - (rvaafter, rva_before): Use new assembler pseudo. - (flush_page, gen_exp_file, gen_lib_file): Use new way of RVAing. - (gen_exp_file): Don't generate .edata if no need. - (gen_lib_file): Don't make timestamp. - Put _iname in idata$7. - (workout_prefix): Fix memory initialization bug. - (usage): Tidy up, delete many single char options. - (main): rva option is gone. - -Mon Aug 21 18:41:28 1995 steve chamberlain - - * dlltool.c (options): image-base is a synonym for rva. - (gen_lib_file): Put dll name into ibase$7. - -Sun Aug 20 09:59:00 1995 steve chamberlain - - Modified to generate archives and objects rather than .s files. - * dlltool.c (run) New function. - (gen_exp_file, gen_lib_file): Use run. - (workout_prefix): New. - (usage): Document new options. - (main): Parse new options. - -Wed Aug 16 16:26:52 1995 steve chamberlain - - * dlltool.c (gen_exp_file): Fix RVA handling. - (rva_s, rva_n): Delete. - -Fri Aug 11 18:27:18 1995 Ian Lance Taylor - - * nm.c (main): Ignore -e. - -Thu Aug 10 17:35:00 1995 Ken Raeburn - - * Makefile.in (config.texi): New target. Write out a setting for - texinfo variable VERSION. - (binutils.dvi, binutils.info): Depend on it. - * binutils.texi: Include it, and reference @value{VERSION} instead - of explicitly specifying 2.2(!). - -Thu Aug 10 16:07:53 1995 Ian Lance Taylor - - * coffgrok.c (do_type): Handle array dimensions the same way gdb - does. - -Tue Aug 8 17:10:42 1995 steve chamberlain - - * dlltool.c (mtable): New fields. - (ASM_RVA_BEFORE, ASM_RVA_AFTER): New. - (flush_page): Use new macros. - -Sat Aug 5 00:16:37 1995 Jeff Law (law@snake.cs.utah.edu) - - * objcopy.c (mark_symbols_used_in_relocations): Handle sections - with no relocations. - * coffgrok.c (do_sections_p1): Likewise. - -Mon Jul 31 12:51:06 1995 Ian Lance Taylor - - * strings.c (print_strings): For compatibility with existing - strings programs, print strings which are not terminated with a - null byte or a newline. - * binutils.texi, strings.1: Update documentation accordingly. - - * ar.c (replace_members): For compatibility with existing ar - programs, permit users to add the same file multiple times. - -Tue Jul 25 11:21:53 1995 Ian Lance Taylor - - * strings.c (DATA_FLAGS): Remove SEC_DATA. - (main): If no file names are given, scan standard input. - * binutils.texi, strings.1: strings now scans non-data sections by - default. - -Mon Jul 24 13:52:28 1995 J.T. Conklin - - * srconv.c (wr_hd): Set afl field to 4 for bfd_arch_sh. - (writeINT): When size == -2, use 2 bytes for the h8300 and 4 bytes - for the sh. - - * sysdump.c (fillup): Return size - 1, the last byte is a checksum - and shouldn't be counted. - * sysroff.info (hd): Changed segment identifier from a byte to a 1 - bit field. The sysroff 2.0-01 specification seems to be in error - here. Reduce width of following "spare" field from 4 to 3 bits. - (rl): Changed order and width of first 4 bitfields to correspond - to sysroff specification. - (dln_head, dln_inside, dln_tail): Removed. - -Tue Jul 18 23:00:03 1995 Fred Fish - - * nm.c (sort_symbols_by_size): Enclose expression being casted - in parens so result is casted, not just first operand. Can't - do pointer arithmetic on void* pointers. - -Fri Jul 14 13:42:42 1995 J.T. Conklin - - * sysdump.c (dh): Changed format of output to be 16 hex digits - followed by 16 ascii characters, similar to Emacs' hexl-mode, - to make it easier to read. - (xcalloc): fix typo. - -Thu Jul 13 15:27:44 1995 J.T. Conklin - - * srconv.c (wr_tr): Write out handcrafted tr block. - (walk_tree_symbol): Use evallen and evalue instead of - vallen & value because of corresponding changes in - sysroff.info. - - * sysdump.c (sysroff_swap_tr_in, sysroff_print_tr_out): New - functions. - - * sysroff.info (tr): the tr block is a special case --- a block - without contents --- which can't be handled by generated code. - (den, dpp): only first byte is present for DENend, DPPend. - (dsy): describe a conditional portion of block, rename some fields. - (dps): describe a conditional portion of block. - (dfl): removed. - - * sysinfo.y (yyerror): write error message to standard error. - -Thu Jul 13 10:43:59 1995 Ian Lance Taylor - - * Makefile.in (DISTSTUFF): Add arparse.h and sysinfo.h. - (mostlyclean): Remove y.output. - (clean): Remove sysroff, sysroff.c, sysroff.h, and sysinfo. - - * nlmconv.c (powerpc_mangle_relocs): Cast memset arg to size_t. - * objcopy.c (copy_object): Likewise. - - * nm.c (HAVE_SBRK): Define execpt on amigados and WINDOWS_NT. - (struct size_sym): Define. - (show_stats): New static variable. - (long_options): Add undocumented option "stats". - (main): Print memory stats if requested. - (sort_bfd, sort_dynamic, sort_x, sort_y): New static variables. - (numeric_forward): Use minisymbols rather than asymbols. - (non_numeric_forward): Likewise. - (size_forward1): Rename from size_forward. Use minisymbols. - (size_forward2): New static function. - (sort_symbols_by_size): Take new arguments dynamic, size, and - symsizep. Use minisymbols. Don't store the size back in the - symbol; store in a newly allocate struct size_sym array. - (display_rel_file): Read minisymbols rather than asymbols. Set - sort_* variables. Call print_size_symbols if sorting by size. - (filter_symbols): Take new arguments dynamic and size. Use - minisymbols. - (print_symbols): Likewise. Call print_symbol for actual printing. - (print_size_symbols): New static function. - (print_symbol): New static function. - -Wed Jul 12 10:43:05 1995 Ian Lance Taylor - - * objdump.c (dump_section_stabs): Only print each stabs section - once. - (compare_relocs): Make it clear to gcc that this always returns a - value. - -Wed Jul 12 10:40:23 1995 H.J. Lu - - * objcopy.c (simple_copy): Preserve errno on failure. - (smart_rename): Print error mesage if simple_copy fails. - -Tue Jul 11 13:10:52 1995 J.T. Conklin - - * sysdump.c: re-indented file. - (module): read blocks sequentially instead of trying to parse - them, as that would require changing the parser recognize the - difference between a DPSstart and DPSend block. - (getone): Add break's between switch blocks as appropriate. - (object_body_list): parse blocks according to sysroff spec. - -Mon Jul 10 12:37:25 1995 J.T. Conklin - - * sysroff.info: re-indented file, prior formatting was confusing - because it was indentation did not reflect nesting of conditional - records. Change "space size within segment" record in hd record - from bit to byte. - - * sysinfo.y (cond_it_field): Use xcalloc instead of calloc. - - * srconv.c (wr_cs): Reformatted cs header array, tag each byte - with a comment describing the field. - (wr_unit_info): Use SEEK_SET macro instead of constant 0. - (main): Use FOPEN_WB macro instead of literal "wb". - * sysroff.info: Remove fdl (dfl) field from cs block. Compare - ptr->type with ED_TYPE_CONST instead of constant 2 in ed block. - -Tue Jul 4 14:48:42 1995 Ian Lance Taylor - - * nm.c (size_forward): Check yf against yn, not xn. - - * objcopy.c (copy_archive): Record all output BFD's, and close - them before unlinking them and removing the temporary directory, - to avoid NFS problems. - - * ar.c (replace_members): In verbose messages, use 'r' when - replacing a member, and 'a' when adding one. - - * ar.c (ar_truncate): New static variable. - (normalize): Change return type to const char *. Add abfd - argument. Change all callers. If ar_truncate, chop the filename - to abfd->ar_max_namelen. - (main): For the 'f' modifier, set ar_truncate to true. Don't - change quick_append to replace if ar_truncate is true. - (do_quick_append): If ar_truncate, set BFD_TRADITIONAL_FORMAT. - (write_archive): Likewise. - * binutils.texi, ar.1: Document 'f' modifier. - - * objcopy.c (enum strip_action): Define strip_unneeded. - (OPTION_STRIP_UNNEEDED): Define. - (strip_options): Add "strip-unneeded". - (copy_options): Likewise. - (copy_usage): Mention --strip-unneeded. - (strip_usage): Likewise. - (is_strip_section): Strip debugging sections if strip_unneeded. - (filter_symbols): If strip_unneeded, only keep BSF_KEEP symbols. - (copy_object): If strip_all, discard symbols without checking - discard_locals. - (copy_object): Call filter_symbols if strip_unneeded. - (setup_section): Strip debugging sections if strip_unneeded. - (copy_section): Likewise. - (strip_main): Handle OPTION_STRIP_UNNEEDED. - (copy_main): Likewise. - * binutils.texi, objcopy.1, strip.1: Document --strip-unneeded. - -Mon Jul 3 14:16:47 1995 Steve Chamberlain - - * configure.in (i386-*-win32): New configuration. - * dlltool.c (killat, xlate, usage, long_options, main): - Understand and cope with -k option. - -Sat Jul 1 12:25:15 1995 Fred Fish - - * ar.c: (extract_file): Change "#if POSIX_UTIME" to - "#ifdef POSIX_UTIME" to match other tests of POSIX_UTIME - and avoid lossage when POSIX_UTIME is not defined at all. - -Wed Jun 28 17:51:24 1995 Steve Chamberlain - - * ar.c: (print_contents.c, extract_file, do_quick_append): - Malloc buffers rather than allocate on stack (so it works - on NT). - * deflex.l: Names can have an @ in them. - * dlltool.c: Loads of stuff. Can now generate .imp files which - work with NT .dlls. - -Thu Jun 22 19:10:50 1995 Stan Shebs - - * mpw-make.in (demangle.c.o): Remove. - (arparse.h): Depend on arparse.c instead of arparse.y. - -Wed Jun 21 17:32:45 1995 Ken Raeburn - - * Makefile.in (DISTSTUFF): Don't include info here. - (diststuff): Include it here. - (realclean): Remove *.info. - - * objdump.c (compare_relocs): If relocation entries have the same - address, keep them in file order. - -Mon Jun 19 09:06:49 1995 Steve Chamberlain - - * dlltool.c: Change names of generated files. .*.s-> -*.s - - * objdump.c (dump_section_stabs): Check for names - which are supersets of selected names. - -Wed Jun 14 19:43:52 1995 Doug Evans - - * dlltool.c (mtable, ARM jump): Must redirect via pc offsetable ptr. - -Wed Jun 14 13:27:22 1995 Steve Chamberlain - - * deflex.l, defparse.y, dlltool.c: New files. - * Makefile.in, configure.in: Support for them. - -Mon Jun 12 11:27:54 1995 Steve Chamberlain - - * sysdump.c: Include sysdep.h - (main): Open input with FOPEN_RB. - -Fri Jun 9 17:26:11 1995 Michael Meissner - - * objdump.c (wide_output): New flag variable. - (usage): Print new -w, --wide options. - (long_options): Add --wide support. - (dump_section_header): If --wide, don't print a newline between - the section's first line and the flags. - (objdump_print_address): Use unsigned comparisons for the binary - search, not signed. - (disassemble_data): If --wide, don't put a \n between the - disassembly output and relocation information. - (main): Support -w option being the same as --wide. - -Thu Jun 1 17:09:27 1995 Ken Raeburn - - Sat May 6 08:52:24 1995 H.J. Lu (hjl@nynexst.com) - - * objcopy.c (smart_rename): make it smarter, clean up - if rename () fails. - -Tue May 30 14:24:15 1995 Ken Raeburn - - * Makefile.in: Delete lines with lots of #### because four or more - indicate a point for makefile fragment substitution. - -Tue May 9 17:17:05 1995 Michael Meissner - - * configure.in: Don't build nlmconv on PowerPC eabi any more, it - is not needed. - -Thu Apr 27 20:21:24 1995 Doug Evans - - * Makefile.in (EXPECT): Define. - (RUNTEST): Use one in source tree if present. - (check): Set `rootme' for $(EXPECT). - -Wed Apr 26 18:26:21 1995 Steve Chamberlain - - * srconv.c (main): Add support for -n option which disables - prescan of common symbols. - (wr_ob): If reading past the end of a section, fill with zeros. - -Tue Apr 25 19:14:37 1995 Ken Raeburn - - * objdump.c (dump_section_header): Display load address after - virtual memory (run-time) address. - -Wed Apr 19 09:44:06 1995 Jason Merrill - - * Makefile.in (cplus-dem.o): Pass -DVERSION='"$(VERSION)"' to the - compile. - (DEMANGLER_PROG): No longer uses version.o. - -Mon Apr 10 13:29:49 1995 Stan Shebs - - Merge in support for Mac MPW as a host. - (Old change descriptions retained for informational value.) - - * mpw-config.in (TDEFINES): Define as empty in makefile frag. - - * mpw-config.in: Create mk.tmp, define ARCHDEFS in it. - - * mpw-config.in: New file, MPW configure fragment for binutils. - * mpw-make.in (install-only): New target. - (install): Also depend on install-only. - - * mpw-make.in (cplusfilt): Renamed from c++filt. - (INCLUDES): Add more paths. - - * mpw-make.in: New file, MPW makefile fragment for binutils. - (Normally automatically generated from Makefile.in.) - -Mon Mar 27 11:52:57 1995 Ian Lance Taylor - - * ar.c (write_archive): Call make_tempname to get output file - name, rather than using a fixed name based on the input file. - - * objcopy.c (make_tempname): Copy from here... - * bucomm.c (make_tempname): ...to here, and make global. - * bucomm.h (make_tempname): Declare. - -Fri Mar 24 11:47:42 1995 Ian Lance Taylor - - * strings.c: Include "bfd.h" before other headers. Include - "sysdep.h". - * bucomm.c (print_arelt_descr): Cast st_uid and st_gid to long, - and print them with %ld. - -Fri Mar 10 13:09:42 1995 Ian Lance Taylor - - * objcopy.c (strip_options): Add --keep-symbol. - (copy_options): Likewise. - (copy_usage): Mention --keep-symbol and -K. - (strip_usage): Likewise. - (keep_symbols): New static variable. - (is_strip_symbol): Adjust the return value according to - keep_symbols. - (strip_main): Handle -K. For -N, check that -K was not given. - (copy_main): Likewise. - * binutils.texi, objcopy.1, strip.1: Document -K. - -Mon Mar 6 13:33:47 1995 Stan Shebs - - * objcopy.c (copy_archive): Check result of mkdir. - (copy_main): Cast an xmalloc result. - - * objdump.c (usage): Break long format string into shorter ones. - -Mon Mar 6 13:46:12 1995 Ian Lance Taylor - - * bucomm.c (list_supported_targets): New function. - * bucomm.h (list_supported_targets): Declare. - * ar.c (usage): Call list_supported_targets. - * nm.c (usage): Likewise. - * objcopy.c (copy_usage, strip_usage): Likewise. - * objdump.c (usage): Likewise. - * size.c (usage): Likewise. - * strings.c (usage): Likewise. - -Tue Feb 28 15:13:58 1995 Ian Lance Taylor - - * bucomm.c (print_arelt_descr): Cast st_size to long before - passing it to fprintf. - -Fri Feb 17 13:36:45 1995 Ian Lance Taylor - - * objcopy.c (struct section_list): Add fields remove, set_flags, - and flags. Change adjust from boolean to enum. - (remove_sections): Remove static variable. - (sections_removed): New static variable. - (copy_options): Add --set-section-flags. - (copy_usage): Mention --set-section-flags. - (parse_flags): New static function. - (find_section_list): New static function. - (is_strip_symbol): Change return type from int to boolean. - (is_strip_section): New static function. - (filter_symbols): Call is_strip_section. - (copy_object): When adding sections, check for specified flags or - VMA. Call filter_symbols if any sections are being removed. - (setup_section): Use find_section_list function rather than - looking through remove_sections and adjust_sections. Handle - --set-section-flags. - (copy_section): Use find_section_list rather than looking through - remove_sections. - (strip_main): Use find_section_list instead of adding items to - sections_removed. - (copy_main): Use find_section_list instead of adding items to - sections_removed and adjust_sections. Handle --set-section-flags. - * binutils.texi, objcopy.1: Document --set-section-flags. - -Tue Feb 14 18:03:03 1995 Ian Lance Taylor - - * objdump.c (with_source_code): New global variable. - (usage): Mention -S/--source. - (long_options): Add --source. - (prev_functionname, prev_line): New static variables. - (struct print_file_list): Define. - (print_files): New static variable. - (skip_to_line, show_line): New static functions. - (disassemble_data): Call show_line to handle -l and -S. - (main): Handle -S. - * binutils.texi, objdump.1: Document -S/--source. - -Thu Feb 9 16:11:53 1995 Ian Lance Taylor - - * objcopy.c (copy_usage): Rename parameter to avoid shadowing. - (strip_usage): Likewise. - - * objcopy.c (struct section_add): Define. - (add_sections): New static variable. - (copy_options): Accept --add-section. - (copy_usage): Mention --add-section. - (copy_object): Add sections from the add_sections list. - (copy_main): Handle --add-section. - * binutils.texi, objcopy.1: Document --add-section. - -Wed Feb 1 15:04:57 1995 Ken Raeburn - - * objdump.c (disassemble_data): Pass section offset, not absolute - address, to bfd_find_nearest_line. - - * nlmconv.c (powerpc_mangle_relocs): Don't use const with - reloc_howto_type. - -Thu Jan 26 18:50:06 1995 Ian Lance Taylor - - * objdump.c (compare_symbols): Use bfd_asymbol_value (VAR) rather - than VAR->value. - (objdump_print_address): Likewise. - (disassemble_data): Don't change the symbol values. It can - confuse bfd_canonicalize_reloc. - -Thu Jan 26 12:03:56 1995 Michael Meissner - - * configure.in: Add support for powerpc-*-ebai. - -Wed Jan 18 10:02:12 1995 Steve Chamberlain - - * coffdump.c: Include sysdep.h. - (dump_coff_type): Handle coff_secdef_type. - * coffgrok.c : Include sysdep.h. - * srconv.c: Include libiberty.h - (absolute_p, dty_start, dty_end, dump_tree_structure): Remove. - -Wed Jan 18 12:24:14 1995 Ian Lance Taylor - - * coffdump.c (dump_coff_scope): Cast pointer to unsigned long for - printf. - * coffgrok.c: Include bucomm.h. Don't declare xmalloc. - (push_scope): Declare type of parameter link. - * size.c: Include libiberty.h. - * srconv.c: Include bucomm.h. - (find_base): Declare at top of file. - (wr_hd): Add default case to architecture switch. - (wr_dps_start): Declare type of parameter nest. - (wr_du): Comment out variables used only in commented out blocks. - (wr_dus): Remove unused variable i. - (wr_sc): Remove unused variables myinfo, low, and high. - * strings.c: Include libiberty.h. - * sysdump.c: Include . - -Tue Dec 20 19:13:44 1994 Ian Lance Taylor - - * ar.c (main): Ignore 'f' modifier used on HP/UX 9. - -Thu Dec 15 17:34:12 1994 Stan Shebs - - * ar.c, nm.c, objcopy.c, objdump.c: Include progress.h. - * ar.c, nm.c, objcopy.c, objdump.c (main): Add START_PROGRESS - and END_PROGRESS. - * ar.c (map_over_members, open_inarch): Call PROGRESS. - * nm.c (main, display_archive, filter_symbols, print_symbols): - Call PROGRESS. - - * objcopy.c (copy_usage): Break up long usage string. - -Wed Dec 14 15:51:56 1994 Ken Raeburn - - * objcopy.c (copy_object): Don't bother setting status after - nonfatal() "call", because it won't return. - -Fri Dec 9 00:22:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (powerpc_mangle_relocs): Don't switch a reloc to use - the section symbol if the symbol is undefined. - -Thu Dec 8 14:45:50 1994 Ken Raeburn - - * objcopy.c (add_strip_symbol): Cast return value of xmalloc. - -Wed Nov 30 11:05:43 1994 Ian Lance Taylor - - * ar.c (replace_members): Pass current->filename to normalize when - checking for duplicates, because the filename of a newly added - file will not have been normalized yet. - -Thu Nov 17 15:00:13 1994 Ian Lance Taylor - - * ar.c (main): Don't call do_quick_append if any of the archive - names are longer than 14 characters. - - * objcopy.c (main): Fix is_strip test. From - pirker@eiunix.tuwien.ac.at (Martin Pirker). - -Thu Nov 17 15:37:19 1994 Mark W. Eichin - - * objcopy.c (add_strip_symbol): New function, adds a name to an - explicit list of symbols to strip. - (is_strip_symbol): New function, reports whether the name argument - is in the explicit list. - (filter_symbols): Check against is_strip_symbol above all. - (strip_main): Recognize -N option. If used, don't default to - strip_all. - (copy_main): Recognize -N option. - (strip_usage): Document -N and --strip-symbol options. - (copy_usage): Ditto. - * objcopy.1, strip.1, binutils.texi: Document -N and - --strip-symbol options. - -Tue Nov 8 13:12:54 1994 Ian Lance Taylor - - * objdump.c (display_target_list, display_info_table): Pass an - array to tmparg, rather than NULL, since some systems can't handle - NULL. - - * objcopy.c (copy_archive): Keep a list of the names of the - temporary files we created. Close each input BFD after we open - its successor. - -Mon Nov 7 15:48:39 1994 Ken Raeburn - - * Makefile.in (VERSION): Bump to 2.5.3. - -Thu Nov 3 19:04:34 1994 Ken Raeburn - - * Makefile.in (install-info): Install info files from whatever - directory they were found in. - - Patch from DJ Delorie: - * configure.bat: do c++filt -> cxxfilt right - - * sysinfo.y: Include system header files early, so any potential - declaration of abort() occurs before its use. - - * strings.c (strings_file): Try opening the file in binary mode - first. - -Wed Nov 2 15:44:13 1994 Ian Lance Taylor - - * ar.c (main): Treat ar qs like ar rs. - -Tue Oct 25 16:19:25 1994 Ian Lance Taylor - - * objcopy.c (gap_fill): Explicitly initialize, for clarity. - (pad_to_set, pad_to): New static variables. - (copy_options): Accept --pad-to. - (copy_usage): Mention --pad-to. - (copy_object): Support --pad-to. - (compare_section_vma): Sort non loadable sections to the front. - Sort sections with the same VMA by size. - (copy_main): Handle --pad-to. - * binutils.texi, objcopy.1: Document --pad-to. - -Thu Oct 20 13:51:31 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objcopy.c (gap_fill_set, gap_fill): New static variables. - (copy_options): Accept --gap-fill. - (copy_usage): Mention --gap-fill. - (copy_object): Support --gap-fill. - (get_sections, compare_section_vma): New static functions. - (copy_main): Handle --gap-fill. - * binutils.texi, objcopy.1: Document --gap-fill. - -Wed Oct 19 14:09:16 1994 Ian Lance Taylor - - * Makefile.in (check): Add a dummy else clause to the if - statement. - - * objcopy.c (copy_object): Revert yesterday's change. - * binutils.texi, objcopy.1: Remove special mention of --set-start - and `binary' output format. - -Tue Oct 18 11:12:01 1994 Ian Lance Taylor - - * objcopy.c (copy_object): If the output file format is `binary', - and the start address was not set using --set-start, default the - start address to zero. This hack is because the `binary' output - file format uses the start address to set the virtual address of - the first byte in the file. - * binutils.texi, objcopy.1: Add some notes on generating S-records - and binary files. - - * nm.c (print_symdef_entry): Call print_symname to print the - symbol name, so that --demangle works. - - * Makefile.in (mostlyclean): Remove tmpdir. - - * objcopy.c (struct section_list): Add fields used, adjust, val. - (adjust_start, set_start_set, set_start): New static variables. - (adjust_section_vma, adjust_sections): New static variables. - (copy_options): Add --adjust-start, --adjust-vma, - --adjust-section-vma, --adjust-warnings, --no-adjust-warnings, - --set-start. - (parse_vma): New static function. - (copy_usage): Mention new options. - (copy_object): Handle --set-start and --adjust-start. - (setup_section): Correct type of last argument to PTR. Set used - field if section is removed. Handle --adjust-vma and - --adjust-section-vma. - (copy_section): Correct type of last argument to PTR. - (mark_symbols_used_in_relocations): Likewise. - (strip_main): Clear used field when handling -R. - (copy_main): Handle new options. - * binutils.texi (objcopy): Document new options. - * objcopy.1: Document new options. - -Fri Oct 14 14:38:13 1994 Ian Lance Taylor - - * configure.in (configdirs): Remove definition--testsuite is no - longer configured. - * Makefile.in (testsuite): Remove target. - (site.exp): New target. - (check): Rewrite. - (clean, distclean): Don't recur into testsuite directory. - -Thu Oct 13 19:24:09 1994 Ken Raeburn - - * Makefile.in (VERSION): Updated to 2.5. - * Version 2.5 released. - -Tue Oct 11 15:26:42 1994 Ian Lance Taylor - - * Makefile.in (sysdump.o): Depends upon sysroff.c. - -Mon Oct 10 13:50:30 1994 J.T. Conklin (jtc@rtl.cygnus.com) - - * nlmconv.c (link_inputs): Pass -Ur flag to ld so that the - ctor/dtor tables needed by C++ programs are built. - -Sun Oct 9 18:04:00 1994 Jim Wilson (wilson@sphagnum.cygnus.com) - - * Makefile.in (srconv.o): Add dependence on sysroff.c. - -Tue Oct 4 12:19:51 1994 Ian Lance Taylor - - * configure.in: Use ${config_shell} when running config.bfd. - - * Makefile.in (sysroff.h): Split target away from sysroff.c. - (srconv.o, sysdump.o): New targets. - (srconv, sysdump): Don't depend upon sysroff.c. - -Wed Sep 28 13:04:34 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * Makefile.in (arparse.c): Don't ignore errors from mv. - (sysinfo.c): Likewise. Also, depend upon arparse.c, to prevent a - parallel make from trying to build both arparse.c and sysinfo.c - simultaneously. - (nlmheader.c): Similar change. - (arparse.h): Separate target from arparse.c, so that a parallel - make does not try to build both at once. Depend upon arparse.c. - (sysinfo.h): Similar change. - - * objdump.c (disassemble_data): Pass the reloc buffer to free, not - the pointer used to loop over the relocs. - -Sat Sep 24 16:16:57 1994 Stan Shebs (shebs@andros.cygnus.com) - - * objdump.c (disassemble_data): Cast result of xmalloc. - -Wed Sep 21 19:30:35 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * objdump.c (sorted_syms, sorted_symcount): New global variables. - (objdump_print_address): Use sorted_syms and sorted_symcount - instead of syms and symcount. - (disassemble_data): Don't bother to get the relocs before looping - over the sections. Before filtering and sorting the symbol table, - copy it into sorted_syms. - -Fri Sep 16 11:27:39 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * objdump.c (struct objdump_disasm_info): Add field require_sec. - (objdump_print_address): If aux->require_sec, require that the - symbol be in aux->sec even if HAS_RELOC is not set. If we can't - find a smaller symbol in the right section, look for a larger one. - (disassemble_data): Set aux.require_sec around the - objdump_print_address call for the instruction address. - -Thu Sep 15 21:43:17 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ar.c: Call xexit rather than exit. - (output_filename, output_file, output_bfd): New static variables. - (remove_output): New static function. - (main): Call xatexit (remove_output). Call xexit rather than - returning. - (extract_file): Set output_filename and output_file while output - file is open. - (write_archive): Likewise, but use output_bfd, not output_file. - * arsup.c: Include libiberty.h. Call xexit rather than exit. - * bucomm.c: Likewise. - - * objdump.c (disassemble_all): New global variable. - (usage): Document --disassemble-all. - (long_options): Add disassemble-all as a synonym for -D. - (compare_symbols): Make pointers const. - (compare_relocs): New static function. - (disassemble_data): Rename disassemble to disassemble_fn to avoid - shadowing. If dump_reloc_info, print relocs along with - disassembly. Skip sections which are not SEC_CODE unless - disassemble_all or only is set. - (display_bfd): Don't call dump_relocs if disassemble is set. - (main): Accept and handle -D. - * binutils.texi: Document -D/--disassemble-all. - * objdump.1: Likewise. - -Wed Sep 14 12:19:07 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * objdump.c (disassemble_data): Initialize prevline to 0. Make - prev_function non const. Copy functionname into an malloc buffer - when setting prev_function, instead of assuming that the string - will last forever. - - * nm.c: Include libiberty.h. - (sort_by_size): New static variable. - (long_options): Add --size-sort. - (usage): Mention --size-sort. - (numeric_forward): Make static. Change from void * to PTR. - (numeric_reverse): Likewise. - (non_numeric_forward, non_numeric_reverse): Likewise. - (sorters): Change declaration from void * to PTR. - (size_forward, sort_symbol_by_size): New static functions. - (display_rel_file): Handle sort_by_size. - (filter_symbols): If sort_by_size, discard absolute and undefined - symbols. - * binutils.texi (nm): Document --size-sort. - * nm.1: Document --size-sort. - -Tue Sep 13 21:06:06 1994 Jeff Law (law@snake.cs.utah.edu) - - * objcopy.c (copy_main): Initialize input_filename and - output_filename to NULL. - -Tue Sep 13 14:17:24 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * Makefile.in (version.o): Depend upon Makefile, so that version.o - gets rebuilt when make variable VERSION is changed. - - * objdump.c (dump_section_header): Print the SEC_NEVER_LOAD flag. - -Wed Aug 24 12:40:09 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * configure.in: Change i[34]86 to i[345]86. - -Tue Aug 23 11:00:40 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * ar.c (ranlib_touch): Don't update the archive map if there isn't - one. - -Mon Aug 22 16:02:18 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * ar.c: Include libiberty.h. - (inarch): Remove variable. - (map_over_members): Make static. Add arch argument, and use it - instead of inarch. Change all callers. - (main): Treat --version as -v. Accept -t argument. Accept any - number of archive arguments. Catch and use open_inarch return - value, rather than using inarch. - (open_inarch): Return newly opened BFD, rather than using inarch. - (do_quick_append): Make archive_filename const. - (write_archive): Add iarch argument, and use it instead of inarch. - Change all callers. - (delete_members, move_members, replace_members): Likewise. - (ranlib_only): Don't exit on success. Catch and use open_inarch - return value. - (ranlib_touch): New function. - * arsup.h (map_over_members): Don't declare. - (ar_end, ar_extract): Declare. - (open_inarch): Change return value in declaration to bfd *. - * arsup.c (map_over_list): Make static. Always pass two arguments - to function. Add arch argument, and use it instead of inarch. - Change all callers. - (ar_directory_doer): Make static. Add ignored second argument. - Change all callers. - (ar_directory): Use open_inarch return value rather than inarch. - (ar_addlib_doer): Make static. - (ar_addlib): Use open_inarch return value rather than inarch. - (ar_extract): Remove unused local variable abfd. - -Thu Aug 11 14:55:57 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - Add support for removing named sections to objcopy and strip. - * objcopy.c (struct section_list): Define. - (remove_sections): New static variable. - (strip_options, copy_options): Add remove-section. - (copy_usage, strip_usage): Mention -R and --remove-section. - (setup_section): If section is in remove_sections list, ignore it. - (copy_section): Likewise. - (strip_main, copy_main): Handle -R. - * binutils.texi, objcopy.1, strip.1: Document new options. - -Wed Aug 10 10:19:55 1994 Stan Shebs (shebs@andros.cygnus.com) - - * nlmconv.c (powerpc_mangle_relocs): Rename symvalue to sym_value, - so as not to conflict with the symvalue typedef in bfd.h. - -Mon Aug 1 13:19:09 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * nlmheader.y: Per current NetWare docs, accept a revision number - of 0 and treat a revision number greater than 26 as 0. - -Mon Jul 25 12:58:36 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * objdump.c (objdump_print_address): Correct handling of end of - symbols when looking for next symbol with a different value. - -Fri Jul 22 16:48:34 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * nm.c (numeric_forward): Treat undefined symbols as "less than" - defined symbols with zero values. If numeric values are equal, or - both symbols are undefined, sort alphabetically. Don't assume - that the difference of two bfd_vma values will truncate to "int" - and still have the same sign. - (numeric_reverse): Call numeric_forward and negate the result. - (print_symbol_info_bsd): For undefined symbols, print leading - spaces equivalent to the width of a printed bfd_vma, rather than - assuming that 8 will look right. - -Fri Jul 22 10:36:50 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * coffgrok.c (doit): Zero all fields of new structure. - * srconv.c (sysroff_swap_*_out): Remove redundant trailing arg. - * sysinfo.y: Generate sysroff_swap_*_out without requiring extra - arg. - -Fri Jul 22 10:09:53 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * nlmheader.y: Make "stack" and "stacksize" synonyms in the lexer - rather than the parser. - -Thu Jul 21 10:25:09 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/mh-alphaosf, config/mh-apollo68v, config/mh-delta88: - Remove; obsolete. - -Sat Jul 16 22:34:39 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * objdump.c (slurp_dynamic_symtab): Try to get the dynamic symbols - even if the bfd is not marked DYNAMIC. ELF executables are not - marked DYNAMIC, but do have dynamic symbols. - -Fri Jul 15 01:41:35 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * coffgrok.c (do_where): Make data with no type 'int'. - (do_define): Keep info on source file of a symbol. - * coffgrok.h (coff_symbol): New field. - * srconv.c (PROGRAM_VERSION): Now 1.3 - (wr_rl): Use external ref number for symbol. - (wr_dus): Only keep one source file per debug unit. - (wr_dln): Always emit line numbers for first source file, - (wr_globals): Emit globals in the du of their owning source file. - -Mon Jul 11 15:59:03 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * nlmheader.y: Null terminate var_hdr->threadName. - -Fri Jul 8 17:33:22 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * Makefile.in (syslex.o, sysinfo.o): Permit C source files to be - in $(srcdir), as they will be for FSF releases. - -Wed Jul 6 01:13:14 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (setup_sections): Preserve existing section flags when - copying in flags from a new section. - -Tue Jul 5 15:56:01 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * objcopy.c: Include libiberty.h. - (copy_file): If output_target is NULL, set it to the target of the - input file. - -Wed Jun 29 17:17:14 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * nlmconv.c (link_inputs): Fixed memory allocation bug. - -Thu Jun 23 12:52:46 1994 David J. Mackenzie (djm@rtl.cygnus.com) - - * configure.in: Change --with-targets to --enable-targets. - -Tue Jun 21 12:53:21 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * Makefile.in (sysinfo): Does not depend upon $(ADDL_LIBS). - - * nlmconv.c (powerpc_build_stubs): Don't generate the PowerPC - NetWare custom header; no longer needed. - (powerpc_mangle_relocs): Convert relocs against the uninitialized - data section into relocs against the data section. - - * configure.in: Set nlmconv_defs to -DNLMCONV_cputype for all the - netware targets. Write it into Makefile as NLMCONV_DEFS. - * Makefile.in (nlmconv.o): Pass $(NLMCONV_DEFS) to $(CC). - * nlmconv.c: Only compile code for specific CPU types if - NLMCONV_cputype is defined. - - * nlmconv.c (main): Change uses of bfd_abs_section, etc., to use - bfd_abs_section_ptr or bfd_is_abs_section, etc. - (i386_mangle_relocs, alpha_mangle_relocs): Likewise. - (powerpc_build_stubs): Likewise. - * nm.c (filter_symbols, print_symbols): Likewise. - * objcopy.c (filter_symbols): Likewise. - (mark_symbols_used_in_relocations): Likewise. - * objdump.c (remove_useless_symbols, dump_relocs): Likewise. - * size.c (sysv_internal_printer): Likewise. - -Mon Jun 20 16:43:03 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * Makefile.in (MANPAGES): Remove $(DEMANGLER_PROG). - (install): Install it explicitly, from build dir, not srcdir. - -Mon Jun 20 16:29:54 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * objdump.c: Don't include elf/internal.h. - (bfd_elf_find_section): Don't declare. - (read_section_stabs): No special handling for ELF. Always read - using BFD sections. - -Thu Jun 16 17:25:20 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * configure.in: Set UNDERSCORE in Makefile based on result of - invoking config.bfd with a second argument of ``_''. - * Makefile.in (underscore.c): Depend upon Makefile. Don't try to - run $(CC) and $(NM), just use $(UNDERSCORE). Create via temporary - file. - (demangle.o): Remove target. - ($(NM_PROG)): Don't depend upon demangle.o, and don't link against - demangle.o. It's in libiberty anyhow. - (cplus-dem.o): Don't depend upon demangle.o. - * binutils.texi: Mention -n and --no-strip-underscores arguments - to c++filt. - -Wed Jun 15 12:10:31 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nm.c (long_options): Add --no-demangle to turn off --demangle, - and --no-cplus for Linux compatibility. - (usage): Mention --no-demangle. - * binutils.texi: Document --no-demangle. - -Fri Jun 10 15:41:25 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nm.c: HOST_64_BIT was renamed to BFD_HOST_64_BIT. - - * objcopy.c (copy_archive): Make the temporary directory in the - same directory as the output BFD, since we may not have write - permission on the current directory. Set the permissions of the - new directory to 0700, not 0777. - -Mon Jun 6 21:36:43 1994 D. V. Henkel-Wallace (gumby@cygnus.com) - - * configure.in: if this is an rs6000 (and we're not building for - any other bfd targets) then build only nm (collect needs it on - rs6000-lynx). - - * Makefile.in: define TOOL_PROGS which the list of programes to - install in $tooldir -- replaces a hard-coded list. - -Fri Jun 3 10:59:18 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objdump.c (display_target_list): Remove unused local ok. - -Thu May 26 18:05:52 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/mh-alphaosf (CFLAGS): Don't specify both -g and -O; - they're not compatible under native cc. Use -O1 instead. - - * Makefile.in (VERSION): Updated to cygnus-2.4.1. - - Changes from binutils-2.4 net release: - - * Makefile.in (MANPAGES): Use $(DEMANGLER_PROG). - ($(DEMANGLER_PROG).1): Build from cxxfilt.man, using sed. - * cxxfilt.man: Renamed from c++filt.1, replaced "c++filt" with - magic token to be replaced by sed. - - Wed May 11 22:32:00 1994 DJ Delorie (dj@ctron.com) - - * configure.bat: update for latest makefile.in - -Fri May 13 23:25:13 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bucomm.c: Check ANSI_PROTOTYPES rather than __STDC__. - -Tue May 10 18:22:06 1994 Jason Molenda (crash@sendai.cygnus.com) - - * objcopy.c (copy_section): Set section size correctly if using - interleave. - -Sat May 7 16:49:36 1994 Steve Chamberlain (sac@cygnus.com) - - * Makefile.in: Add rule for sysinfo.h - -Fri May 6 12:18:33 1994 Steve Chamberlain (sac@cygnus.com) - - * Makefile.in (SRCONV_PROG): Define. - (PROGS): Use $(SRCONV_PROG) too. - -Thu May 5 19:41:43 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * Makefile.in (DISTSTUFF): Add sysinfo.c, syslex.c, in case - someone configures with `targets=all'. - (distclean): Remove y.*. - (syslex.o): Depend on sysinfo.h. - (sysinfo.c): Rename y.tab.h to sysinfo.h. - (install-info): Don't try to install into $(infodir)/$(srcdir). - * syslex.l: Include sysinfo.h, not y.tab.h. - -Thu May 5 11:50:55 1994 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * syslex.l (yywrap): Define as function if not defined as a macro. - - * Makefile.in (objdump.o): Deleted special rule. - * configure.in: Don't bother building ARCHDEFS variable for - Makefile. - * objdump.c (ARCH_*): Deleted handling. - (disassemble_data): Call `disassembler' from opcodes library. - -Thu May 5 13:28:42 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (install): Correct handling of $(tooldir) and - $(bindir) being on different devices. - -Fri Apr 29 09:50:38 1994 Steve Chamberlain (sac@cygnus.com) - - * sysdump.c (h8300, sh): Add declarations. - -Wed Apr 27 11:25:18 1994 Steve Chamberlain (sac@cygnus.com) - - * Makefile.in (syslex, sysinfo): Use CC_FOR_BUILD. - * coffdump.c, coffgroc.c, coffgrog.h, srconv.c, sysdump.c, - sysroff.info: Major changes. - -Tue Apr 26 18:18:24 1994 Stan Shebs (shebs@andros.cygnus.com) - - * objdump.c (print_section_stabs): Indicate the stab header symbol - more clearly, print numbers of unrecognized stab n_type values. - -Tue Apr 26 16:22:55 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (copy_sections): Copy arelent pointers, not arelents. - -Mon Apr 25 16:14:32 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (distclean): Remove $(PROGS) and underscore.c. - -Fri Apr 22 11:14:19 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (setup_sections): Remove special handling of .reginfo - section. - (copy_sections): Likewise. - (alpha_mangle_relocs): Use bfd_ecoff_get_gp_value rather than the - special ECOFF .reginfo section. - - * objcopy.c (copy_object): Call bfd_copy_private_bfd_data after - copying everything else, to let it fiddle with the file in its - final state. - - * objdump.c: Include libiberty.h. - (display_target_list): If a format fails, just go on to the next - one. Check return value of bfd_set_format. - (display_info_table): Likewise. Don't increment loop variable in - for loop test, since that skips the first element. - (display_target_tables): Rewrite loop for clarity. Ensure that it - always prints at least one element. - - * nlmconv.c (main): Use CyGnUsEx rather than CyGnUsSeCs for - sections header. Rename from cygnus_sections to cygnus_ext. - -Thu Apr 21 12:12:26 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objdump.c (_DUMMY_NAME_): Don't define. - (display_target_list): Use tmpnam to get a file name rather than - using _DUMMY_NAME_. Unlink it when done. - (display_info_table): Likewise. - - * nlmconv.c (secsec): New static variable. - (main): Create .nlmsections section in output BFD. Store - information about it in sections header. - (setup_sections): Allocate space in sections header. - (copy_sections): Copy zero sized sections. Put information about - each section in the sections header. - -Wed Apr 20 14:34:51 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (powerpc_build_stubs): Take new outbfd argument. - Change caller. Create custom header for new PowerPC NetWare - format. - - * Makefile.in (nlmheader.o, nlmconv.o): Update dependencies. - * nlmconv.c: Include bfd.h and libiberty.h with "", not <>. - * nlmheader.y: Include bfd.h with "", not <>. - -Wed Apr 13 10:52:50 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objdump.c: Do an ifdef on __GO32__, not unix. - -Wed Apr 6 21:54:49 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - Added -D (--dynamic) option to nm and -T (--dynamic-syms) and -R - (--dynamic-reloc) arguments to objdump. - * nm.c (dynamic): New static variable. - (long_options): Added "dynamic". - (usage): Mention -D and --dynamic. - (main): Add D to getopt string. Handle -D by setting dynamic. - (display_rel_file): If dynamic is non-zero, read dynamic symbols - rather than normal symbols. - * nm.1: Updated for -D (--dynamic) option. - * objdump.c (dump_dynamic_symtab): New global variable. - (dump_dynamic_reloc_info): New global variable. - (dynsyms, dynsymcount): New global variables. - (usage): Mention -R, -T, --dynamic-syms and --dynamic-reloc. - (long_options): Added "dynamic-reloc" and "dynamic-syms". - (slurp_symtab): If no symbols, return rather than exit. - (slurp_dynamic_symtab): New function. - (display_bfd): Handle dump_dynamic_symtab and - dump_dynamic_reloc_info. - (dump_symbols): Take new dynamic argument, indicating whether to - display dynamic symbols. - (dump_relocs): Move most printing into dump_reloc_set. - (dump_dynamic_relocs): New function. - (dump_reloc_set): New function, extracted from dump_relocs. - (main): Add R and T to getopt string. Handle -T by setting - dump_dynamic_symtab and -R by setting dump_dynamic_reloc_info. - * objdump.1: Updated for -R (--dynamic-reloc) and -T - (--dynamic-syms) options. - * binutils.texi: Updated for new nm and objdump options. - -Wed Mar 30 15:52:40 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - Update for recent BFD changes to symbol and reloc reading. Rename - all uses of get_symtab_upper_bound to bfd_get_symtab_upper_bound. - Also: - * coffgrok.c (symcount): Change to long. - (do_sections_p1): Check for error return from - bfd_get_reloc_upper_bound. Change relcount to long, and check for - error from bfd_canonicalize_reloc. - (coff_grok): Change storage to long. Check for error from - bfd_get_symtab_upper_bound and bfd_canonicalize_symtab. - * nlmconv.c (main): Change symcount, newsymalloc, newsymcount, and - i to long. Check for error from bfd_get_symtab_upper_bound and - bfd_canonicalize_symtab. - (copy_sections): Change reloc_size and reloc_count to long. Check - for error from bfd_get_reloc_upper_bound and - bfd_canonicalize_reloc. - (mangle_relocs, i386_mangle_relocs, alpha_mangle_relocs): Change - reloc_count_ptr argument to long *. Make corresponding changes to - variables loaded from *reloc_count_ptr. - * nm.c (display_rel_file): Change storage and symcount to long. - Check for errors from bfd_get_symtab_upper_bound and - bfd_canonicalize_symtab. - * objcopy.c (filter_symbols): Change symcount, src_count and - dst_count to long. - (copy_object): Change symcount to long. Pass another argument to - fprintf. Check for errors from bfd_get_symtab_upper_bound and - bfd_canonicalize_symtab. - (copy_section): Change relcount to long. Check for errors from - bfd_get_reloc_upper_bound and bfd_canonicalize_reloc. - (mark_symbols_used_in_relocations): Change relcount and i to long. - Check for errors form bfd_get_reloc_upper_bound and - bfd_canonicalize_reloc. - * objdump.c (storage): Remove global variable. - (symcount): Changed to long. - (slurp_symtab): New local variable storage. Check for errors from - bfd_get_symtab_upper_bound and bfd_canonicalize_symtab. - (remove_useless_symbols): Change return value and count to long. - (objdump_print_address): Change min, max, thisplace and i to long. - (disassemble_data): Change i to long. - (dump_symbols): Change count to long. - (dump_relocs): Change relcount to long. Check for errors from - bfd_ret_reloc_upper_bound and bfd_canonicalize_reloc. - (display_info_table): Add casts when passing LONGEST_ARCH for - printf %* argument. - -Tue Mar 29 14:59:04 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nm.c (display_archive): Close each archive element after it has - been displayed. - * objdump.c (display_file): Likewise. - -Mon Mar 28 13:04:08 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * configure.in: Change error message to refer to bfd/config.bfd - rather than bfd/configure.in. - -Sun Mar 27 16:23:39 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * More fixes for object formats which allow multiple sections - with the same name: - * objcopy.c (setup_section): Make a new output section even if - one already exists with the given name. - (copy_section): Use isection->output_section rather than trying - to look the output section up by its (possibly non-unique) name. - - * Makefile.in (install-info): Look for binutils.info in the - current directory, then in $(srcdir). Don't use $<. - -Mon Mar 21 12:55:45 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objdump.c (objdump_print_address): Make static. Declare with - prototype. Change vardiff from int to bfd_signed_vma. Correct - binary search termination condition. When looking for same - section symbol in relocatable file, handle final symbol correctly. - -Sun Mar 20 11:26:36 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * Makefile.in: Avoid bug in hpux sed. - - * objcopy.c: Changes to keep it from stripping symbols used - in output relocations. - (mark_symbols_used_in_relocations): New function. Mark symbols - used in output relocations with BSF_KEEP. - (filter_symbols): Do not strip symbols marked with BSF_KEEP. - (copy_object): Reorder actions. First setup sections, then - build the output symbol table, then copy the section contents. - -Fri Mar 18 10:53:55 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ar.c (write_archive): Allocate space for the null byte. From - Robert Lipe . - -Thu Mar 17 16:20:28 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in: Built nm.new and strip.new to avoid problems with - collect when . is in PATH. - (STRIP_PROG): Change from strip to strip.new. - (NM_PROG): Change from nm to nm.new. - (install): Remove the .new when installing. - -Wed Mar 16 16:27:05 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (powerpc_build_stubs): Set BSF_DYNAMIC flag for each - symbol for which we build a stub. - (powerpc_mangle_relocs): Only reset TOC pointer for a call to a - symbol with BSF_DYNAMIC flag set. - -Tue Mar 15 23:04:13 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * objcopy.c (filter_symbols): Use bfd_is_local_label to determine - if a symbol represents a compiler-generated local label. - (copy_object): Give the BFD backends a chance to copy any private - bfd data from the input BFD to the output BFD. - (setup_section): Give the BFD backends a chance to copy any private - section data from the input section to the output section. - -Mon Mar 14 11:15:58 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * objcopy.c (mangle_section): Delete unused function. - (setup_section): Set osection here instead of calling - mangle section to do it. - -Mon Mar 14 12:11:01 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ar.c (write_archive): Close inarch before unlinking it. - -Fri Mar 11 22:20:48 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (main): For PowerPC, call powerpc_build_stubs and - powerpc_resolve_stubs. Use __GOT0, not __toc_start. Handle it if - the start and end symbols are not in the text section. - (struct powerpc_stub): New struct definition. - (powerpc_stubs, powerpc_stub_insns): New static variables. - (powerpc_initial_got_size): New static variable. - (powerpc_build_stubs): New function. - (powerpc_resolve_stubs): New function. - (powerpc_mangle_relocs): Clear extraneous data in .got section. - Rearrange reloc handling to handle ELF relocs that are not - partial_inplace. Resolve PC relative relocs. - -Wed Mar 9 13:48:11 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * ar.c (move_members): Fix it so that the abi positional modifiers - don't delete all archive members following the insert point. - -Tue Mar 8 13:14:43 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * coffgrok.[ch]: New files, understand coff objects. - * coffdump.c: Uses coffgrok to dump out the debug info of a coff - file. - * sysroff.info: Description of a SYSROFF object file. - * sysinfo.y, syslex.l: Parse info file, generate a reader, writer, - header files and a printer. - * srconv.c: Uses coffgrok.c and sysroff.info to convert a coff - file to a SYSROFF file. - -Sat Feb 26 13:35:26 1994 Stan Shebs (shebs@andros.cygnus.com) - - * ar.c (do_quick_append): Pad with a genuine character 10, - rather than whatever '\n' might happen to be. - -Tue Feb 22 18:25:52 1994 Ian Lance Taylor (ian@cygnus.com) - - * nlmconv.c (main): Ignore debugging symbols when looking for - special symbols by name. - -Sun Feb 20 18:47:42 1994 Ian Lance Taylor (ian@lisa.cygnus.com) - - * nlmconv.c: Include libiberty.h. - - Support for PowerPC NetWare. - * nlmconv.c (main): For PowerPC NetWare, automatically define the - special symbols __toc_start. - (select_output_format): Handle bfd_arch_powerpc. - (mangle_relocs): Likewise. - (powerpc_mangle_relocs): New function. - -Thu Feb 17 09:28:23 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * ar.c, bucomm.c, nlmconv.c, nm.c, objcopy.c, objdump.c, - size.c: Use bfd_get_error and bfd_set_error and new error names. - -Fri Feb 11 15:54:51 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * objcopy.c (strip_main, copy_main): Add missing 'break' in switch. - -Mon Feb 7 19:45:52 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objdump.c (disassemble_data): Handle bfd_arch_powerpc. - -Sun Feb 6 22:08:20 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * strings.c objdump.c nlmconv.c objcopy.c nm.c ar.c size.c (main): - Call xmalloc_set_program_name. - -Fri Feb 4 10:46:01 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * objcopy.c (filter_bytes): Make MEMHUNK a char *, not PTR, so we - can do arithmetic on it. - -Thu Feb 3 14:06:41 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * objdump.c (dump_section_stabs, read_section_stabs, - print_section_stabs): Functions broken out of dump_stabs_1. - Free the stabs and strings when done with them. - -Wed Feb 2 13:42:23 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * nlmconv.c (main): Use bfd_get_flavour instead of struct member. - * ar.c (print_contents, extract_file), size.c - (print_berkeley_format, print_sysv_format): Use bfd_get_filename and - bfd_my_archive instead of dereferencing the structs directly. - - * ar.c: Use bfd_fatal and bfd_nonfatal instead of bfd_perror and exit. - Indent. Remove DEFUNs. - - * nlmconv.c (main), objcopy.c (copy_file): Print matching formats - if ambiguous match. - * nm.c (display_file, display_archive), size.c (display_bfd): - Eliminate gotos. - Print matching formats if there is an ambiguous match. Use - bfd_nonfatal instead of hardcoded error message if nothing matches. - - * arsup.c, ar.c, objdump.c: Use bfd_get_filename instead of - abfd->filename. - - * nm.c (display_archive): New function, from code in display_file. - (display_rel_file): Renamed from do_one_rel_file. - - * size.c: Indent. - (display_archive): New function from code in display_file. - (display_file): Check bfd_close error return. - - * strings.c (strings_object_file): Check bfd_check_format - error return. - - * strings.c, objdump.c, size.c: Use bfd_nonfatal instead of bfd_perror. - - * bucomm.c: Delete references to exit_handler. It wasn't set - anywhere, and now that we're using the libiberty xmalloc, it - wouldn't always get called before exiting. - (list_matching_formats): Function moved from objdump.c. - * bucomm.h: Declare it. - - * objdump.c (disassemble_data): Move some variable decls closer to - their use. Add some comments. Replace a nested block with a - return. - -Mon Jan 31 18:50:41 1994 Stan Shebs (shebs@andros.cygnus.com) - - * objdump.c (display_target_list, display_info_table): Check that - the bfd of the dummy output file is not null. - -Wed Jan 26 13:13:18 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * objcopy.c (filter_bytes): New function. - (copy_section): Call it. - (copy_options, copy_usage, copy_main): Add --byte option to - activate it. Appropriate the -b option (which was an undocumented - synonym for -F) for it, also. Add --interleave, -i option for - additional control. - (setup_section, copy_section, mangle_section): Renamed with no `s' - on the end. - * objcopy.1, binutils.texi: Document the new options. - - * objdump.c (display_target_tables, display_target_list): - New functions broken out of display_info. - Eliminate some magic constants. Use more meaningful variable names. - (dump_bfd_header): New function broken out of display_bfd. - (dump_section_header): New function broken out of dump_headers. - (remove_useless_symbols): Don't shadow global variable name with - parameter. - (objdump_print_address): Fix backward test. - -Tue Jan 25 19:40:54 1994 Stan Shebs (shebs@andros.cygnus.com) - - * bucomm.c (print_arelt_descr): Change decl of `when' to time_t. - * objdump.h: Removed. - -Mon Jan 24 13:29:02 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * objdump.c (display_file): Remove call to list_matching_formats. - It would never be called. - (list_matching_formats): Take an arg giving the list of matching - formats. - (display_bfd): Pass the arg, and get it filled in by calling - bfd_check_format_matches instead of bfd_check_format. - (display_info, display_info_table): target_vector was renamed to - bfd_target_vector. - - * binutils.texi (objdump): Note some limitations of -h section - address printing. - -Sat Jan 22 16:20:46 1994 Stan Shebs (shebs@andros.cygnus.com) - - * Makefile.in (MALLOC): Set to emptiness by default. - (ALL_CFLAGS): Add and use. - (arparse.h): Make it depend on arparse.y. - * ar.c (libbfd.h): Don't require to be in ../bfd. - * objdump.c (comp): Rename to compare_symbols. - -Fri Jan 21 20:22:30 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * objdump.c (list_matching_formats): If the file format is ambiguous, - print the matching names so the user can choose one. - (display_bfd): Call it. - (display_file): Call it. - -Fri Jan 21 19:17:25 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objdump.c (disassemble_data): Support bfd_arch_rs6000. - -Mon Jan 17 13:57:25 1994 Stan Shebs (shebs@andros.cygnus.com) - - * objdump.c (stab_name): Allocate dynamically. - (stab_print): Use pointers to strings instead of char arrays. - (dump_stabs): Change alloc and init of arrays appropriately. - (dump_stabs_1): Always decide whether to print stab_name or - the stab's type number, if unnamed. - -Fri Jan 14 14:42:48 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objcopy.c (strip_main, copy_main): Don't clobber the input file - if copy_file fails. - - * nlmconv.c (main): Warn about an attempt to use a shared library - with uninitialized data. - - * nlmconv.c (setup_sections): Make sure that we align the - output_offset of each input section appropriately. - -Thu Jan 13 17:32:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objdump.c (dump_relocs): Don't crash if section name is NULL. - -Tue Jan 11 19:46:33 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * filemode.c (filemodestring): Commented out; not used. - (mode_string): Use POSIX definitions. - (ftypelet): Likewise. - (rwx): Removed; no longer used. - * bucomm.c: Include bucomm.h. - (bfd_nonfatal, bfd_fatal): Argument is const. - (fatal): Make __STDC__ version. - * bucomm.h (mode_string): Declare. - * Makefile.in (bucomm.o): Depend upon bucomm.h - -Sun Jan 9 12:03:20 1994 Ken Raeburn (raeburn@rtl.cygnus.com) - - * bucomm.c (xmalloc, xrealloc): Deleted. - * bucomm.h (xmalloc, xrealloc): Fix prototypes, to correspond to - libiberty version of functions. - -Thu Jan 6 06:18:15 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * binutils.texi: Add a chapter summarizing the ways to select - aspects of the target for each program. - - * objdump.c (long_options, usage): Add long equivalents for all - remaining short options that lacked them. - * binutils.texi objdump.1: Document them. - - * size.c (usage): Tweak usage message. - * size.1: Add missing `=' in examples. - - * binutils.texi strip.1 objcopy.1 nlmconv.1 objcopy.c nlmconv.c: - Use "--target=bfdname" as the option to select the BFD target, - like nm and size already do. - Reserve "--format=format" for textual output selection options, but - for now keep old option names as obsolete for backward compatibility. - - * strings.c (main, strings_object_file, usage): Add --target option. - * binutils.texi strings.1: Document it. - -Sat Jan 1 13:58:24 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * ar.c (main): Add \n in error message. - -Thu Dec 23 12:23:11 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - gcc -Wall lint: - * ar.c (main): Put parens around assignment used as truth value. - * objcopy.c (strip_main): Remove unused variables. Return 0. - (copy_main): Remove unused variables. Return 0. - * objdump.c (display_bfd): Declare return value as void. - (stab_print): Use "" instead of 0 to initialize array. - (dump_stabs_1): Print vma using printf_vma. - (display_info): Put parens around assignment used as truth value. - * strings.c (print_strings): Cast printf arguments. - - * objcopy.c (copy_main): Use copy_options, not strip_options. - - * nlmheader.y (command): Warn about illegal date values. - -Wed Dec 15 11:18:03 1993 David J. MacKenzie (djm@frosty.eng.umd.edu) - - * bucomm.c bucomm.h: Run through indent. De-ansidecl-ify. - (bfd_nonfatal): New function. - (bfd_fatal): Call it. - - * objcopy.c (smart_rename): Do a copy if the dest file has - multiple hard links. Remove source file on successful copy. - Try to preserve mode and owner on successful rename. - - * objcopy.c: Run through indent. Clean up a bit. - Make global variables static. - Make {input,output}_{target,filename}, show_version local - to various functions. - New global variable `status' for exit status. - (strip_main, copy_main): New functions with code from main. - (nonfatal): New macro. Use it globally instead of bfd_perror and - bfd_fatal. - - (copy_object): Call mangle_sections with bfd_map_over_sections. - (mangle_sections): Adjust for new calling convention. - -Fri Dec 10 11:28:11 1993 Ian Lance Taylor (ian@deneb.cygnus.com) - - * nlmheader.y (command): Accept MAP and FULLMAP without arguments. - * nlmconv.c (main): Change error message for MAP and FULLMAP. - -Thu Dec 9 17:47:19 1993 Ian Lance Taylor (ian@deneb.cygnus.com) - - * nlmconv.c (main): Warn about imported symbols that are not in - the IMPORT list even if the IMPORT keyword is not used. - - * nlmconv.c (debug, unlink_on_exit): New static variables. - (long_options): Add "debug" and "linker". - (main): Handle -d and -l arguments. Make command line input and - output files optional. Parse the command file before opening the - BFD's, which requires storing more information in local variables. - If INPUT names multiple files, link them together. Use OUTPUT for - the output file name if not named on command line. - (show_usage): Changed for new options. - (link_inputs): New function to automatically invoke linker to - handle multiple INPUT files. - (choose_temp_base_try, choose_temp_base, pexecute): New functions, - mostly copied from gcc/gcc.c. - * nlmconv.h (input_files, output_file): Declare. - * nlmheader.y (input_files, output_file): Define. - (command): Support INPUT with a string_list argument. Support - OUTPUT. - (string_list): Renamed from module_list. - * Makefile.in (nlmconv.o): Define LD_NAME based on - program_transform_name. - -Wed Dec 8 10:09:04 1993 Ian Lance Taylor (ian@deneb.cygnus.com) - - * nlmheader.y (nlmheader_identify): New function. Use it to print - the program name just once, instead of with every error message. - -Mon Dec 6 16:11:32 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (long_options): Changed --header-info to --header-file - to match documentation and usage message. - -Sun Dec 5 01:31:01 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * objdump.c (dump_relocs): Avoid dereferencing a NULL sym_ptr_ptr - in a relocation. - -Thu Dec 2 16:00:06 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (main): Change various types from bfd_size_type to - size_t, since they have to be arguments to fread and fwrite. - Change set from char * to unsigned char *. - (select_output_format): Make mach argument unsigned. Handle - bfd_arch_alpha. - (setup_sections): Don't copy the .reginfo section of an ECOFF - file. Call bfd_set_reloc to initialize the relocation fields. - (copy_sections): Don't copy the .reginfo section of an ECOFF file. - Combine all relocs for a section. - (mangle_relocs): Change type of relocs to permit specific - functions to change it. Call alpha_mangle_relocs for alpha, - default_mangle_relocs for other architectures. - (default_mangle_relocs): New function. Adjust the address of all - relocs by the output_offset. - (i386_mangle_relocs): Change type of relocs argument. Cast length - argument to memmove to size_t. - (alpha_mangle_relocs): New function. - -Wed Nov 17 17:38:58 1993 Sean Eric Fagan (sef@cygnus.com) - - * nlmconv.c (select_output_format): Use nlm32-sparc for - bfd_arch_sparc. - -Wed Nov 17 14:41:35 1993 Jeffrey Osier (jeffrey@thepub.cygnus.com) - - * nlmconv.1: added man page - * objcopy.1: fixed format errors - -Wed Nov 17 12:03:41 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in: Use CFLAGS as well as LDFLAGS when linking. - -Wed Nov 17 04:50:55 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * strings.1: Fix typo. - -Mon Nov 15 12:03:20 1993 Ken Raeburn (raeburn@rtl.cygnus.com) - - * Makefile.in (DISTSTUFF): Build "info". - (VERSION): Updated to cygnus-2.3.1; 2.3 has gone out. - -Sun Nov 14 00:27:24 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * objdump.c (dump_stabs): Handle stabs-in-som as implemented - by the new BFD SOM assembler. - -Sat Nov 13 07:14:05 1993 David J. Mackenzie (djm@rtl.cygnus.com) - - * ar.1 c++filt.1 nm.1 objcopy.1 objdump.1 ranlib.1 size.1 - strings.1 strip.1: Replace \(em in NAME section with \- so - makewhatis can grok it. - -Tue Nov 9 15:22:12 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (i386_mangle_relocs): Adjust reloc address by - section output_offset. - -Fri Nov 5 12:11:52 1993 Jeffrey Osier (jeffrey@thepub.cygnus.com) - - * binutils.texi: added nlmconv chapter - -Wed Nov 3 16:10:50 1993 Jeffrey Wheat (cassidy@cygnus.com) - - * Makefile.in: Change RUNTESTFLAGS to RUNTEST_FLAGS - -Wed Nov 3 15:09:23 1993 Ken Raeburn (raeburn@rover.cygnus.com) - - * Makefile.in (distclean): Don't get rid of dvi or info files. - -Tue Nov 2 13:29:59 1993 David J. Mackenzie (djm@rtl.cygnus.com) - - * objcopy.c (S_ISLNK): Define as 0 if there's no S_IFLNK. - -Fri Oct 29 16:02:34 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * binutils.texi: Move objcopy docs into alphabetical order. - - * objdump.c: Use xmalloc instead of malloc. - -Fri Oct 29 11:11:14 1993 Stan Shebs (shebs@rtl.cygnus.com) - - * objdump.c (info): Rename to formats_info. - (dump_stabs_1): Better comments and formatting. - -Thu Oct 28 19:43:16 1993 Stan Shebs (shebs@rtl.cygnus.com) - - * ar.c (main): Always create the archive when quick appending, - even if no input files have been given. - -Wed Oct 27 12:03:06 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (main): Set sharedDebugRecordOffset and - sharedDebugRecordCount fields in extended header. - - * nlmconv.c (main): Force moduleName field to upper case. - -Mon Oct 25 16:45:42 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objcopy.c (main): Give a usage message if there are too many - arguments. - -Mon Oct 25 10:37:08 1993 Ken Raeburn (raeburn@rover.cygnus.com) - - * Makefile.in (install-info): Rewrite to take advantage of VPATH, - so FSF distributions (with info files in $(srcdir)) install - properly. - (DISTSTUFF): Build nlmheader.c too. - -Fri Oct 22 11:43:23 1993 Ken Raeburn (raeburn@rover.cygnus.com) - - * ar.c (program_name): Don't define here. - * objdump.c: Include "bucomm.h". - (xmalloc): Don't declare here. - (program_name): Don't define here. - (program_version): Fixed type in declaration. - * size.c: Include "bucomm.h". - (program_name): Don't declare here. - -Fri Oct 22 14:10:41 1993 Mark Eichin (eichin@cygnus.com) - - * objdump.c (fprintf): hide declaration in FPRINTF_ALREADY_DECLARED - -Fri Oct 1 12:43:00 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (i386_mangle_relocs): Resolve and remove PC relative - relocs against defined symbols in the same section. - -Thu Sep 30 16:46:26 1993 Roland H. Pesch (pesch@fowanton.cygnus.com) - - * Makefile.in (binutils.dvi): use TEXIDIR to find texinfo.tex - -Sat Sep 25 18:09:29 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * objcopy.c (simple_copy, smart_rename): New functions. - (main): Use them. - -Fri Sep 24 15:38:29 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (clean, distclean): Recurse into testsuite. - -Thu Sep 23 01:05:06 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objcopy.c (setup_sections, copy_sections): If stripping, don't - copy SEC_DEBUGGING sections. - * objdump.c (dump_headers): Print SEC_DEBUGGING flag. - - * objdump.c (usage): Mention --stabs. - - * objcopy.c (copy_object): Copy all applicable file flags. - (copy_file): Don't copy EXEC_P specially here. - -Mon Sep 20 19:28:57 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (main): Adjust data section size to correspond to bss - alignment adjustment. Clear BSF_SECTION_SYM if symbol is moved to - a different section. Use time_t for time variable. - (setup_sections): Only put sections with contents in output NLM. - (i386_mangle_relocs): No symbols are common at this point. Add - casts to avoid warnings. - -Fri Sep 10 11:00:40 1993 Stan Shebs (shebs@rtl.cygnus.com) - - * objdump.c: Made the --stabs option work for stabs-in-coff. - (ELF_STAB_DISPLAY): Removed. - (dump_elf_stabs): Renamed to dump_stabs, changed to run for - any object file format. - (dump_elf_stabs_1): Renamed to dump_stabs_1, added calls to - generic BFD routines for non-ELF case, changed format of message - for no-section-found case. - (display_bfd): Always call dump_stabs if requested. - (dump_data): Call bfd_section_size to get section size. - -Fri Sep 10 08:12:23 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * Makefile.in (install): Don't put strings in tooldir/bin. - -Mon Sep 6 15:39:04 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (total_bss_size): Removed. - (main): Set the bss vma to always follow the data section. Move - symbols into new sections, and adjust values by output_offset. - (setup_sections): Don't copy all sections, but instead point all - text sections to .text, all data sections to .data, and all bss - sections to .bss. - (copy_sections): Adjust accordingly. - -Thu Sep 2 12:34:03 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - Only build nlmconv if configured for a NetWare target. - * configure.in: If we have some *-*-netware* target, or are using - all targets, set BUILD_NLMCONV to $(NLMCONV_PROG) in Makefile. - * Makefile.in (PROGS): Use $(BUILD_NLMCONV) rather than - $(NLMCONV_PROG). - -Tue Aug 31 14:13:35 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * objdump.c (ARCH_all): Define ARCH_hppa too. - (dump_headers): Don't test for SEC_BALIGN if it's not defined by - bfd.h. - -Tue Aug 31 13:29:12 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * nlmconv.c (main): Force creation of .bss section. Set up the - sections before looking at the symbols. Move all common symbols - into .bss section. Automatically define _edata and _end. Only - export symbols in the export list, with multiple prefixes if - necessary. Warn if no version. Always create extended header. - Set date automatically if not already set. - (setup_sections): Count size of bss sections. - (mangle_relocs, i386_mangle_relocs): Accept section argument, and - take reloc_count as a changeable pointer; changed callers. - (i386_mangle_relocs): Remove PC relative relocs within a section, - as they require no adjustment. - * nlmheader.y: Fixed memory allocation throughout: token STRING is - now allocated on the heap, and freed if not needed. Null - terminated copyright message. Accept version with only two - strings. - (symbol_list_opt): New nonterminal, either symbol_list or empty. - (symbol_list): Use left recursion to avoid overflowing parser - stack. - (yylex): Rearranged beginning of line check. Accept quoted - strings using single quotes. End generic argument at comment - character or parentheses. - (string_list_append): Fixed. - (string_list_append1): New function. - - * bucomm.h: The first argument to xrealloc is PTR, not char *. - * bucomm.c (xrealloc): Use PTR rather than char *. - * Makefile.in (objdump.o): Depend upon config.status to notice - --with-targets changes. - (nlmconv.o): Depend upon bucomm.h. - -Tue Aug 17 09:46:01 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * configure.in: Don't pass cpu to config.bfd. - -Thu Aug 12 16:43:04 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * Makefile.in ($(NM_PROG)): Depend on demangle.o. - (demangle.o): New target. - (cplus-dem.o): Depend on it, to force compilation order when doing - parallel compiles. - - * nm.c (print_symbol_info_{bsd,sysv,posix}): Take a bfd arg. - (struct output_fns print_symbol_info): Ditto. - (long_options, usage, main): Add -C --demangle option. - (print_symname): New function, demangling if requested. - (print_symbols, print_symbol_info_{bsd,sysv,posix}): Use it. - -Wed Aug 11 22:57:23 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * Makefile.in: Put CFLAGS last in compilation rules and omit from - linking rules. Use ARCHDEFS to compile objdump.c. - Update dependencies. - * configure.in: Construct ARCHDEFS based on the BFD target makefile - fragments. - * objdump.c: Conditionalize calls to the print_insn_ARCH functions - according to ARCHDEFS. - -Thu Aug 12 08:06:15 1993 Ian Lance Taylor (ian@cygnus.com) - - * ar.c: Removed obsolete and non-functional GNU960 code. - -Wed Aug 11 13:08:26 1993 Ian Lance Taylor (ian@cygnus.com) - - * size.c (berkeley_sum): New function. - (bsssize, datasize, textsize): New global variables. - (bss_section_name, data_section_name, text_section_name): Removed. - (print_berkeley_format): Map berkeley_sum over all the sections, - rather than only reporting sizes of specifically named sections. - * Makefile.in ($(OBJDUMP_PROG)): Removed dependency on size.o. - -Tue Aug 10 10:46:01 1993 Ian Lance Taylor (ian@cygnus.com) - - * nlmconv.c, nlmconv.h, nlmheader.y: New files for program to - convert object files into NetWare Loadable Modules. - * Makefile.in (NLMCONV_PROG): New macro, define to be nlmconv. - (PROGS): Add NLMCONV_PROG. - (nlmheader.c, nlmheader.o, nlmconv.o, $(NLMCONV_PROG)): New - targets. - -Thu Aug 5 15:48:32 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * Makefile.in: define MAKEOVERRIDES to an empty string - -Wed Aug 4 17:08:08 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * objcopy.c (copy_file): Make failures to process a file nonfatal. - -Mon Aug 2 11:28:23 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * nm.c: Add -B option, like --format=bsd. - -Tue Jul 27 16:29:54 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objcopy.c (copy_file): If the file is neither an object nor an - archive, give an error rather than returning success. - -Mon Jul 19 16:13:40 1993 Ken Raeburn (raeburn@rtl.cygnus.com) - - * objdump.c (objdump_print_address): Prefer non-local symbols over - local ones, and especially discriminate against debugging symbols. - Also, for relocateable files, try to find a symbol in the current - section, instead of picking one from some random section with a - convenient value (read, section offset). - (disassemble_data): Cast argument to malloc to size_t first. - (dump_data): Likewise. - (dump_relocs): If a single section name is specified, show relocs - only for that section. Otherwise, silently omit sections without - relocs. Format table nicely even if values are printed using 16 - digits instead of 8. - -Fri Jul 16 15:19:59 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * nm.c: Changes for final version of POSIX.2. - (print_symbol_filename_{bsd,sysv,posix}): New functions. - (formats): Add an element for a pointer to them. - (print_symbols): Call it. - (print_object_filename_posix, print_archive_member_posix): Produce - output according to new POSIX.2 spec. - - * strings.c (print_strings): Handle STREAM being NULL. - (strings_a_section): Pass a NULL. - (main): Don't open /dev/null. - -Thu Jul 15 12:44:09 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objdump.c (disassemble_data): Handle the m88k. - (display_bfd): Use bfd_errmsg, rather than just claiming that the - bfd is not an object file. - -Mon Jul 12 17:55:34 1993 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in (TAGS): make work again by naming directories - explicitly rather than depending on undefined macros. - (INSTALL_XFORM): correct bad install target. - -Fri Jul 2 16:58:34 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * strings.c: Doc fixes. - -Sun Jun 27 13:35:24 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * Makefile.in: Note dependencies on bucomm.h. - (cplus-dem.o): Link c++filt with version.o. - - * strings.c: Include bucomm.h and add prototypes to other decls. - Remove -h option. - - * bucomm.h: Declare xrealloc. - - * nm.c, objcopy.c, objdump.c, size.c, strings.c (main, usage): Add - --help option. Put "GNU" in the version message. - (usage): Take stream and exit status as args. - (main): Pass new args to usage. - -Fri Jun 25 23:12:12 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * strings.c, strings.1: New files. - * binutils.texi: Document strings. - * Makefile.in: Add rules for it. - -Fri Jun 25 20:44:43 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) - - * objdump.c: Use size-independent bfd elf section names. - -Sun Jun 20 23:09:06 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) - - * objdump.c (objdump_print_address): Handle wide offsets by - calling sprintf_vma. - -Fri Jun 18 14:29:12 1993 Per Bothner (bothner@deneb.cygnus.com) - - * objdump.c (syms2): Removed unused variable. - * objdump.c (remove_useless_symbols): New function. - * objdump.c (comp): Simplify. - * objdump.c (dis-assemble_data): Make simpler and more - efficient how we filter out useless symbols: Just filter - BEFORE the sort (using remove_useless_symbols). - * objdump.c (objdump_print_address): Simplify. - Change output syntax to match gdb. - -Thu Jun 17 16:53:56 1993 david d `zoo' zuhn (zoo@cygnus.com) - - * Makefile.in: canonicalize install.sh; for use within - this directory (and subdirs) - -Mon Jun 14 12:13:22 1993 david d `zoo' zuhn (zoo at rtl.cygnus.com) - - * Makefile.in (install, install-info): remove parentdir support, - use INSTALL_XFORM; define INSTALL_XFORM - -Thu Jun 10 17:29:21 1993 Per Bothner (bothner@cygnus.com) - - * objcopy.c (copy_object): Fix bad size passed to xmalloc(). - -Mon Jun 7 12:41:12 1993 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in (INCLUDES): Add -I../bfd for sysdep.h and bfd.h. - * configure.in: No longer need to configure to get sysdep.h. - * objcopy.c (copy_object): Fix symbol table handling. - -Fri Jun 4 17:20:03 1993 Per Bothner (bothner@cygnus.com) - - * objcopy.c (filter_symbols): Cannot filter the symbols - in place, because that confuses the relocs, so take separate - parameter for output array. - * objcopy.c (sympp): Make two variables: isympp and osympp. - * objcopy.c (copy_object): Allocate separate array (osympp) - for filtered symbols. - -Fri Jun 4 10:51:44 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: change recursion test to presence of a configured - testsuite directory - -Thu Jun 3 14:05:57 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (underscore.c): Hack the backquoted command so it - doesn't cause Solaris make to bomb. - -Thu Jun 3 10:40:19 1993 Jeffrey Osier (jeffrey@cygnus.com) - - * Makefile.in: added c++filt and objcopy to MANPAGES variable - -Thu Jun 3 00:32:52 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: rename LOADLIBES to EXTRALIBS - -Wed Jun 2 18:30:24 1993 Jeffrey Osier (jeffrey@cygnus.com) - - * c++filt.1, objcopy.1: new man pages - -Fri May 28 15:01:24 1993 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in (install): Also install ar and ranlib in - $(tooldir)/bin; needed for building libgcc.a. - * objdump.c (objdump_print_address): Fix the check - "coincidental" label matches by dis-allowing undefined - or com symbols. - -Thu May 27 16:58:31 1993 Jeffrey Osier (jeffrey@cygnus.com) - - * biutils.texi: revised c++filt chapter - -Wed May 26 17:24:17 1993 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (FLAGS_TO_PASS): Pass down CC and CFLAGS. - -Tue May 25 00:26:47 1993 Ken Raeburn (raeburn@cygnus.com) - - * objdump.c (slurp_symtab): Print warning for bad symbol table. - (bfd_elf32_find_section, Elf32_Internal_Shdr): Updated - declarations and uses. - - * Makefile.in (DISTSTUFF): Don't build binutils.mm. - -Fri May 21 10:51:19 1993 David J. Mackenzie (djm@rtl.cygnus.com) - - * nm.c: Add -f/--format, -P/--portability, -t/--radix options. - Make global variables static. - (main): Make -v like -n, not -V, and make -A like -o, for POSIX.2. - (set_print_radix, set_output_format, - print_{object_filename,archive_filename,archive_member,symbol_info} - {bsd,sysv,posix}): New functions. - (display_file, print_symbols): Call them. - - * ar.c: Improve error messages. - - * nm.c (main): Handle long options that just set a flag. - - * nm.c (main), ar.c (do_show_version), objcopy.c (main), size.c - (main): Exit after printing the version number, per the GNU coding - standards. - -Mon May 17 13:20:25 1993 Per Bothner (bothner@cygnus.com) - - * README, Makefile.in: Minor updates for 2.2. - -Fri May 14 11:12:26 1993 Per Bothner (bothner@cygnus.com) - - * Makefile.in (underscore.c): Automatically generate - (using nm) a file with the variable prepends_underscore. - * Makefile.in (c++filt): Link underscore.o with cplus-dem.o - so that initial underscores get removed iff appropriate. - * binutils.texi: Preliminary documentation for c++filt. - * Makefile.in, binutils.texi: Set to version 2.2. - - * NEWS: Mention copy->objcopy renaming and new c++filt program. - -Wed May 12 12:05:36 1993 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (cplus-dem.o, $(DEMANGLER_PROG)): Build the - demangler via cplus-dem.o, rather than directly from the .c file. - - * objcopy.c: Renamed from copy.c, updated comments accordingly. - * Makefile.in, binutils.texi: Renamed copy to objcopy. - * is-strip.c, maybe-strip.c, not-strip.c: Updated comments for - rename of copy to objcopy. - -Mon May 10 17:20:18 1993 Per Bothner (bothner@cygnus.com) - - * binutils.texi (strip, -v option): Fix typo. - -Fri May 7 13:57:50 1993 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (RUNTEST): Define. - (FLAGS_TO_PASS): Pass down RUNTEST. - -Tue May 4 10:06:50 1993 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (DEMANGLER_PROG): Name it c++filt. - (PROG): Also build and install COPY_PROG. - -Mon May 3 19:11:48 1993 Per Bothner (bothner@cygnus.com) - - * Makefile.in: Change definition of $(tooldir) to match FSF. - -Wed Apr 28 23:41:32 1993 David J. Mackenzie (djm@rtl.cygnus.com) - - * size.c (usage): Add missing options. - (main): Clean up option parser. - - * objdump.c (usage): Add missing options. - (display_file): Print program name before calling - bdf_perror. - - * nm.c (usage): Add missing options. - (main): Clean up option parser. - (display_file): Print program name before calling - bdf_perror. - - * copy.c (copy_usage, strip_usage): Add missing options. - - * ar.c (usage): New function. - (main): Call it. - (open_inarch, do_quick_append): Print program name before calling - bdf_perror. - -Thu Apr 22 15:01:35 1993 Ian Lance Taylor (ian@cygnus.com) - - * nm.c (main): Accept and ignore -A and -B for MIPS compatibility. - -Mon Apr 19 14:06:59 1993 Rob Savoye (rob@cygnus.com) - - * Makefile.in: Added FLAGS_TO_PASS so tests get run on freshly - built binaries if they exist. (otherwise the path) - -Wed Apr 7 22:22:50 1993 Rob Savoye (rob@cygnus.com) - - * Makefile.in: Changed check target to use DejaGnu. - -Thu Apr 1 12:37:13 1993 Jim Kingdon (kingdon@cygnus.com) - - * Makefile.in: Remove am29k-pinsn.c, i960-pinsn.c. - objdump.c: a29k and i960 are `disassemble' not `print'. - - * objdump.c: Rename print_address to objdump_print_address - and change parameters. - (disassemble_data): Use objdump_print_address. - -Wed Mar 31 10:25:29 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * objdump.c (disassemble_data): print_insn_sparc is now a - `disassemble' not a `print'. - Makefile.in: Remove sparc-pinsn.c (now in libopcodes.a). - - * objdump.c (disassemble_data): Use new read_memory_func stuff. - -Thu Mar 25 10:38:11 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * objdump.c (fprintf): Declaration of variadic function had better - be a prototype for ANSI C systems. - -Mon Mar 22 23:19:46 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: rename test-install to install-check - -Fri Mar 19 14:40:08 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * objdump.c (disassemble_data): Add H8500. - -Fri Mar 19 10:56:51 1993 Jim Kingdon (kingdon@cygnus.com) - - * objdump.c (usage): Mention long options. - -Thu Mar 18 14:22:17 1993 Per Bothner (bothner@rtl.cygnus.com) - - * nm.c: Modify behavior of -o flag for archives to match - BSD4.4 and Sunos 4: Prefix archive name before each line. - - * m68k-pinsn.c: Removed. Subsumed by ../opcodes/m68k-dis.c. - * i386-pinsn.c: Removed. Subsumed by ../opcodes/i386-dis.c. - * Makefile.in: Adjust accordingly. - * objdump.c: Support new-style disassemblers (ones that use - the interface of ../include/dis-asm.h). - -Thu Feb 25 15:57:00 1993 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: When making tar file, remove texinfo/*, - except for texinfo/texinfo.tex. - * ardup.c: Add extern declaration of strdup. - * Makefile.in (testsuite): Add 'else true' since otherwise - Ultrix /bin/sh complains. - -Wed Feb 24 19:44:18 1993 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: Set VERSION to 2.1. - * README, NEWS: Updates. - * nm.c: Add -v as a synonym for -V. - -Tue Feb 23 19:00:50 1993 Mike Werner (mtw@poseidon.cygnus.com) - - * configure.in: added testsuite to configdirs. - * Makefile.in: added support for building testsuite. - -Mon Feb 22 22:52:10 1993 Per Bothner (bothner@rtl.cygnus.com) - - * objdump.c (disassemble_data): Print function names when - given by bfd_find_nearest_line. If not - still print - line numbers. - -Mon Feb 22 07:54:03 1993 Mike Werner (mtw@poseidon.cygnus.com) - - * binutils/testsuite: made modifications to testcases, etc., to allow - them to work properly given the reorganization of deja-gnu and the - relocation of the testcases from deja-gnu to a "tool" subdirectory. - -Mon Feb 22 10:27:24 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * objdump.c (dump_data): Free up section contents each time - through the loop. Reported by minyard@bnr.ca. - -Sun Feb 21 10:55:55 1993 Mike Werner (mtw@poseidon.cygnus.com) - - * binutils/testsuite: Initial creation of binutils/testsuite. - Migrated dejagnu testcases and support files for testing nm to - binutils/testsuite from deja-gnu. These files were moved "as is" - with no modifications. This migration is part of a major overhaul - of dejagnu. The modifications to these testcases, etc., which - will allow them to work with the new version of dejagnu will be - made in a future update. - -Fri Feb 12 10:05:20 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (LIBIBERTY_SRC_DIR, LIBIBERTY_BIN_DIR): New macros. - * Makefile.in (LIBIBERTY): Use LIBIBERTY_BIN_DIR. - * Makefile.in (DEMANGLER_PROG): New program to build. Add macro - and rule. - * Makefile.in (PROGS): Add DEMANGLER_PROG. - -Tue Jan 26 11:56:33 1993 Ian Lance Taylor (ian@cygnus.com) - - * copy.c, nm.c, objdump.c, size.c: Use new bfd_is_com_section - macro rather than checking for equality to bfd_com_section. - -Fri Jan 8 15:50:05 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objdump.c (disassemble_data): Fix code to find first useless - symbol. - -Thu Jan 7 13:13:31 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * objdump.c (disassemble_data): Use mips_print_insn for MIPS. - Don't core dump if bfd_find_nearest_line returns false. - -Wed Jan 6 17:14:01 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * objdump.c (disassemble_data): know how to disassemble z8000s - too. - -Wed Jan 6 15:16:27 1993 Per Bothner (bothner@cygnus.com) - - * arsup.h (interactive), bucomm.h (program_name): Prefix - with 'extern', to avoid warnings from some compilers. - -Wed Jan 6 15:14:11 1993 Per Bothner (bothner@rtl.cygnus.com) - - * arparse.y: fix unnecessary shift/reduce - -Tue Dec 22 15:46:56 1992 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: Make check depend on all. - * Makefile.in (distclean): Remove sysdep.h. - * size.c: Use %u format where appropriate. - * objdump.c: Standardize: L_SET -> SEEK_SET. - * objdump.c: Use new macro bfd_asymbol_bfd. - * configure.in: Allow std-host as the default ${mys_host}. - -Thu Dec 17 19:38:19 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: added dvi target, define and use TEXI2DVI - -Tue Dec 15 18:05:07 1992 Per Bothner (bothner@cygnus.com) - - * Makefile.in (dist): Fix permissions before release. - * size.c: Use bfd_size_type (and long) where appropriate. - * ar.c: Make writing a map the default, to be compatible - with SYSV and Posix.2. Remove some bogus kludges that - handled __.SYMDEF directly. - * NEWS: New file. - -Mon Nov 9 13:36:53 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: flex no longer needs the -S flag - -Sat Nov 7 15:06:13 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * ar.c (extract_file): utime needs a pointer to a utimbuf - - * Makefile.in: handle -I includes better, adding $(BASEDIR)/bfd to - the list (since some of the bfd/hosts/*.h files include other - files from that directory) - -Fri Nov 6 00:12:51 1992 John Gilmore (gnu@cygnus.com) - - * i960-pinsn.c (MEM_MAX, MEM_SIZ): Set upper bound properly. - -Thu Nov 5 03:37:15 1992 John Gilmore (gnu@cygnus.com) - - Clean up some old BFD ansification macros. - - * arsup.h, bucomm.h, objdump.h: Remove EXFUN from binutils. - It still remains as a local macro in gmalloc.c, which is derived - from some other copy of GNU Malloc somewhere (FIXME). - - * ar.c, objdump.c, size.c: Replace EXFUN with PROTO. Make static - fns really static. - * arsup.h: Declare extract_files. - -Mon Nov 2 12:42:11 1992 Ian Lance Taylor (ian@cygnus.com) - - * ar.c (extract_file): instead of checking USG: if POSIX_UTIME, - use utime and utimbuf structure, otherwise if USE_UTIME use utime - and array of two longs, otherwise use utimes. - -Thu Oct 15 13:57:35 1992 Per Bothner (bothner@cygnus.com) - - * binutils.tex: Document yesterday's changes to strip and copy. - -Wed Oct 14 13:22:14 1992 Per Bothner (bothner@cygnus.com) - - * copy.c: Re-do command-line parsing to use getopt_long(). - Add long option names. Re-think option letters to be more - consistent. - * copy.c: New function filter_symbols() for stripping only - debug-symbols and/or local symbols. Use these to support - the previously-missing options of the old FSF strip. - -Tue Oct 13 01:24:20 1992 John Gilmore (gnu@cygnus.com) - - * configure.in (host): Use ${srcdir}/../bfd/configure.host rather - than repeating a copy of it here. - -Wed Oct 7 12:53:52 1992 Ken Raeburn (raeburn@cygnus.com) - - * copy.c (main): Even if is_strip, accept -d argument indicating - alternate output format. Needed by gdb for Nindy. - - * m68k-pinsn.c (print_insn_arg): Handle new "`" operand type. - -Tue Oct 6 16:33:56 1992 Jeffrey Osier (jeffrey@cygnus.com) - - * binutils.texi: added documentation for "copy" - -Tue Oct 6 14:22:56 1992 Per Bothner (bothner at PersSony) - - * Makefile.in (*clean rules): Some cleaning up. - * Makefile.in (dist): Make diststuff in gprof for a dist. - - * ar.c (do_show_version): New function. - * ar.c (main): Fix so "ar -V" works. - -Thu Oct 1 22:44:45 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: now uses the cpu-vendor-os triple instead of - nested cases. - -Fri Sep 25 22:41:08 1992 John Gilmore (gnu@cygnus.com) - - * i960-pinsn.c: Change bzero to memset. - * sparc-pinsn.c: Change index to strchr. - -Mon Sep 21 14:39:56 1992 Ian Lance Taylor (ian@cygnus.com) - - * m68k-pinsn (print_insn_arg, fetch_arg): added support for - operands to memory management instructions, from WRS. - -Tue Sep 15 15:26:38 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (install): if $(tooldir) exists, install nm and - strip in $(tooldir)/bin. - -Thu Sep 3 11:57:40 1992 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: Let's call it version 2.0. - -Wed Sep 2 00:25:13 1992 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: Bump to version 0.98. - * TODO, README: Minor updates. - - * Makefile.in: Added mostlyclean, distclean rules, - and cleaned up clean, realclean. - -Sun Aug 30 21:18:59 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: map program names through program_transform_name - when installing. - -Sun Aug 30 18:09:03 1992 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: Bump to versions 1.97.90. - * cplus-dem.c: Removed. Was nowhere used - and if some - programs are changed to to demangling should now use the - versions in libiberty. - -Thu Aug 27 12:58:09 1992 Brendan Kehoe (brendan@cygnus.com) - - * configure.in: add we32k - -Mon Aug 24 14:53:42 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * ar.c (map_over_members): if the element of the archive has a - null name, fill it in. - - * nm.c (do_one_rel_file): only warn if a bfd's flags say there - will be symbols and there aren't any. - -Wed Aug 19 11:20:25 1992 Ian Lance Taylor (ian@cygnus.com) - - * m68k-pinsn.c: handle new operand type 'r', introduced for cas2. - -Tue Aug 18 20:45:48 1992 Rob Savoye (rob@cygnus.com) - - * nm.c objdump.c: Added support for a +version (-V) - to print the version number. - - * ar.c, copy.c: Added support for a -V option to print - the version number. - -Tue Aug 18 13:28:44 1992 Ian Lance Taylor (ian@cygnus.com) - - * config/mh-apollo68v: removed -g from CC definition. - - * Makefile.in: always create installation directories. - -Mon Aug 17 18:33:41 1992 Per Bothner (bothner@rtl.cygnus.com) - - * m68k-pinsn.c: Minor fix in style of output (don't use - range to indicate floating point control registers). - -Tue Aug 11 23:42:21 1992 Per Bothner (bothner@cygnus.com) - - * ar.c (main): Don't *always* set the verbose flag! - -Wed Aug 5 11:25:27 1992 Per Bothner (bothner@rtl.cygnus.com) - - * copy.c: When is_strip (because it is invoked as the strip - program), follow traditional argv processing: - 'strip file1 file2' now strips file1 and file2, rather - than stripping file1 (as input), leaving output in file2. - -Mon Jul 27 16:28:08 1992 Per Bothner (bothner@rtl.cygnus.com) - - * objdump.c (display_info, display_info_table): Call - bfd_set_format() on dummy bfd before using it (twice). - * ar.c: Make sure archive is created on command 'r' - even when no elements are inserted. (Clean up and - simplify some non-working related code.) - -Mon Jul 20 02:48:38 1992 D. V. Henkel-Wallace (gumby@cygnus.com) - - * configure.in: hppa support doesn't assume hp OS (from sef). - -Sat Jul 18 14:35:22 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: recognize hppa hosts (bsd & hpux), error messages - to stderr, not stdout - -Fri Jul 17 18:39:44 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * ar.1, binutils.texi, i960-pinsn.c, nm.1, objdump.1, ranlib.1, - size.1, sparc-pinsn.c, strip.1: removed rcsid's. - -Thu Jul 16 16:55:24 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * Makefile.dos: removed rcsid. - -Thu Jul 16 08:23:07 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * objdump.c (display_bfd): print state of BFD_IS_RELAXABLE too - -Tue Jun 30 20:26:15 1992 D. V. Henkel-Wallace (gumby@cygnus.com) - - * Makefile.in: Add program_suffix (parallel to program_prefix) - -Thu Jun 25 04:52:45 1992 John Gilmore (gnu at cygnus.com) - - * nm.c (sorters): Lint. Remove excess whitespace. - -Wed Jun 24 13:48:07 1992 Per Bothner (bothner@cygnus.com) - - * nm.c (valueof macro): Add missing parentheses. - (Their lack screwed up numeric_forward().) - -Sun Jun 14 10:33:27 1992 John Gilmore (gnu at cygnus.com) - - * objdump.c (dump_elf_stabs): Also dump .stab.index and - .stab.excl sections. - (dump_elf_stabs_1): Split out main body of old dump_elf_stabs. - * objdump.1, binutils.texi: Document new sections dumped. - -Fri Jun 12 22:23:35 1992 John Gilmore (gnu at cygnus.com) - - * size.c, objdump.c, bucomm.c: Lint. - -Thu Jun 11 01:19:06 1992 John Gilmore (gnu at cygnus.com) - - * objdump.c (dump_elf_stabs): New feature: --stabs prints out a - .stab section from an ELF file. Installed under #ifdef - ELF_STAB_DISPLAY so it can be easily disabled, since it requires - bfd-internals header files and such. - * objdump.1, binutils.texi: Update for --stabs. Also fix - objdump's doc to use -- rather than + for long options. - (FIXME: Not yet fixed everywhere in binutils.texinfo.) - -Wed Jun 10 07:53:24 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * objdump.c(display_info), patches from - mohring@informatik.tu-muenchen.de to print the table much more - nicely. - -Thu May 28 13:36:16 1992 Per Bothner (bothner@rtl.cygnus.com) - - * objdump.c: Add another enum->int cast, for the sake of - old compilers (such as PCC). - -Wed May 27 13:01:44 1992 Per Bothner (bothner@rtl.cygnus.com) - - * arlex.l: Don't include (unneeded conflicts). - Add declaration of strdup(). - -Fri May 22 13:40:37 1992 Per Bothner (bothner@cygnus.com) - - * Makefile.in: Use srcdir instead of VPATH in ldgram/ldlex - rules, since these are used when building a distribution. - * Makefile.in (arlex.c): Don't re-direct output, since that - leaves a bogus output files if it fails. - - * arlex.l: Make work with lex, for what it's worth. - * Makefile.in: Better lex support. - * Makefile.in (dist): Generate flex and bison outputs - for distribution. - -Thu May 14 17:17:59 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * Makefile.in: get BISON definition right. - -Fri May 8 07:47:08 1992 K. Richard Pixley (rich@cygnus.com) - - * sanity.sh: default TMPDIR to ".". - -Thu May 7 12:34:50 1992 Roland H. Pesch (pesch@fowanton.cygnus.com) - - * binutils.texi: add doc for ar command language. - -Wed May 6 18:05:36 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * arparse.y: make END call ar_end - * arsup.c (ar_end): added, deletes temp file if archive session - aborted. - - -Wed May 6 11:08:53 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * Makefile.in: use bison & flex from ../ if they exist. Also, - FLEX->LEX. - - * sanity.sh: remove temporary directory when finished. - -Tue May 5 12:00:58 1992 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: Bump to version 1.97. - * ar.c: Declare errno for machines that need it. - -Mon May 4 23:29:51 1992 John Gilmore (gnu@cygnus.com) - - * objdump.c (display_info): Handle error cases without coredump. - Close the dummy temporary file we open in the loop. - * Makefile.in (arsup.o): Add kludge to build with Sun Make. - -Fri May 1 16:20:23 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in: added test-install target. - - * sanity.sh: new file. - - * Makefile.in: use sanity test on make check. - -Tue Apr 21 13:38:37 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in: rework CFLAGS so that they can be passed on the - command line to make. Remove MINUS_G. Default CFLAGS to -g. - -Wed Apr 15 14:33:07 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * arsup.c, arsup.h, arparse.y, arlex.l: support for archive - scripting language. - -Fri Mar 6 21:54:53 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in: added check target. - -Thu Mar 5 21:35:49 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in: added clean-info target. - -Tue Mar 3 15:36:37 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * Makefile.in: remove $(COPY_PROG) from PROGS. It shouldn't be - installed. added tooldir and program_prefix. - -Wed Feb 26 18:04:40 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in, configure.in: removed traces of namesubdir, - -subdirs, $(subdir), $(unsubdir), some rcs triggers. Forced - copyrights to '92, changed some from Cygnus to FSF. - -Sun Feb 16 12:53:02 1992 Per Bothner (bothner at cygnus.com) - - * Makefile.in: Bump version to 1.96, and remove -beta - suffix from distribution name. - * m68k-pinsn.c: New macro COERCE_SIGNED_CHAR to extract - the signed value of a character (even if chars are unsigned). - * sparc-pinsn.c: Add new operand types. - -Thu Feb 6 12:14:19 1992 Steve Chamberlain (sac at rtl.cygnus.com) - - * objdump.c (disassemble_data): don't print a section's contents - if it's not loadable (eg bss) - -Tue Jan 28 11:11:06 1992 Steve Chamberlain (sac at rtl.cygnus.com) - - * m68k-pinsn.c (print_insn_arg): fixed so that -ve branch - displacements don't get printed as large +ve ones. - -Fri Jan 24 14:47:53 1992 Steve Chamberlain (sac at rtl.cygnus.com) - - * copy.c, nm.c, objdump.c, size.c : changed to use the - new reloc scheme. - - -Mon Dec 30 18:34:41 1991 Per Bothner (bothner at cygnus.com) - - * bucomm.c (print_arelt_descr): Tweek the output format - so that 'ar tv' output follows Posix 1003.2/D11. - Output is now also identical to Sun's (except __.SYMDEF). - -Mon Dec 30 06:09:53 1991 John Gilmore (gnu at cygnus.com) - - * Makefile.in: Make `make' output more readable. - -Wed Dec 18 15:04:45 1991 Per Bothner (bothner at cygnus.com) - - * Makefile.in: Bump to version 1.94. - -Wed Dec 11 16:48:09 1991 Steve Chamberlain (sac at cygnus.com) - - * ar.c: added "b" to fopens for dos - * configdj.bat, makefile.dos new files from DJ - -Tue Dec 10 04:07:26 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * Makefile.in: infodir belongs in datadir. - -Sat Dec 7 17:09:37 1991 Steve Chamberlain (sac at rtl.cygnus.com) - - * bucomm.h: created to hold prototypes of bucomm.c - * objdump.h: created to hold prototyes of objdump.c - * am29k-pinsn.c: include objdump.h - * ar.c: include bucomm.h, get ar.h from the right place and - include libbfd.h - * bucomm.c: defunize bfd_fatal - * copy.c: include bucomm.h, lint. - * i960-pinsn.h: include bucomm.h - * m68k-pinsn.h: lint - * nm.c: include bucomm.h, lint - * objdump.c: lint - * sparc-pinsn.c: include objdump.h - - - -Fri Dec 6 23:02:14 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * Makefile.in: added standards.text support. install using - INSTALL_PROGRAM and INSTALL_DATA. - - * configure.in: configure now does all of it's work from objdir so - make file existence tests against ${srcdir}. - -Thu Dec 5 22:46:22 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * Makefile.in: idestdir and ddestdir go away. Added copyrights - and shift gpl to v2. Added ChangeLog if it didn't exist. docdir - and mandir now keyed off datadir by default. - -Wed Dec 4 22:42:03 1991 Per Bothner (bothner at cygnus.com) - - * Makefile.in: Bump to version 1.93. - * Makefile.in: Add make-strip.o:maybe-strip.c dependency - for make versions that provide half-baked VPATH-support (e.g. Sun's). - * size.c: Improvements suggested by - "david d [zoo] zuhn" : - - Don't emit (Berkeley) headers if no files were found. - - Return a non-zero return code on failure. - -Sat Nov 30 21:34:19 1991 Steve Chamberlain (sac at rtl.cygnus.com) - - Changes due to include file renaming: - * am29k-pinsn.c: a29k-opcode.h -> opcode/a29k.h - * sparc-pinsn.c: sparc-opcode.h -> opcode/sparc.h - * m68k-pinsn.c: m68k-opcode.h -> opcode/m68k.h - * nm.c: stab.gnu.h -> aout/stab_gnu.h - -Tue Nov 19 19:20:43 1991 Per Bothner (bothner at cygnus.com) - - * README: Mention MINIMIZE flag for bfd's make. - -Mon Nov 18 12:05:37 1991 Per Bothner (bothner at cygnus.com) - - * README: Various improvements. - -Sun Nov 17 23:40:59 1991 Per Bothner (bothner at cygnus.com) - - * Makefile.in: Bump to version 1.92. - * version.c, Makefile.in: Get version string from Makefile. - * copy.c, is-strip.c, not-strip.c, maybe-strip.c, Makefile.in: - Make the same change that we earlier did for ar/ranlib: - Generate two different binaries for strip and copy and use - a global variable with different values to distinguish - ostrip from copy. (-1 means to use argv[0] to decide, - so you can get the old behavior, but it is no longer the default). - * copy.c (copy_file): Set EXEC_P of output bfd if input is so. - * copy.c (main): If is_strip==-1, compare last 5 chars - of argv[0], not the whole path. - * copy.c (main): Return 0, not 1. - * copy.c (setup_sections): Fix due to change in bfd_make_section - now failing if asked for a duplicate section. - * strip.c, ostrip.c: Removed obsolete files. - * ar.c, not-ranlib.c, maybe-ranlib.c: - Change encoding of is_ranlib variable to be consistent - with is_strip for strip.copy (i.e -1 to means use argv[0]). - -Thu Nov 14 20:11:02 1991 Per Bothner (bothner at cygnus.com) - - * version.c (program_version): Update to version 1.92. - -Tue Nov 12 16:17:53 1991 Per Bothner (bothner at cygnus.com) - - * ar.c (get_pos_bfd): Previous fix was missing a "break". - -Thu Nov 7 08:55:56 1991 Steve Chamberlain (sac at cygnus.com) - - * am29k-pinsn.c: Fixed bug in mtacc, dmac and fmac instruction - encodings. (Thaks to David Wood) - -Sun Nov 3 14:50:23 1991 Per Bothner (bothner at cygnus.com) - - * Makefile.in ($(DIST_NAME).tar.Z), TODO: Various fixes. - * ar.c (get_pos_bfd): Fix to handling of before/after - positioning options. - * bucomm.c (fatal): MISSING_VFPRINTF is no longer an issue, - since libiberty contains vfprintf etc if otherwise missing. - * m68k-pinsn.c (print_insn_arg): Support BB/BW/BL - type operands, as used by branch instructions. - * nm.c: Delegate printing of symbols to BFD, - by using bfd_print_symbol to do the formatting. - -Mon Oct 28 11:20:47 1991 Steve Chamberlain (steve at cygnus.com) - - * ar.c (write_archive.c): added unlink before rename since some - systems can't rename onto an existant file. - -Mon Oct 21 09:47:23 1991 Steve Chamberlain (steve at rtl.cygnus.com) - - * nm.c: now doesn't crash if a symbol with no section and no - SEC_ABS appears. - -Thu Oct 17 15:25:50 1991 Per Bothner (bothner at cygnus.com) - - * Makefile.in, version.c: Bump to version 1.91. - -Wed Oct 16 11:45:36 1991 Per Bothner (bothner at cygnus.com) - - * Makefile.in, ar.c, bucomm.c, copy.c, cplus-dem.c, filemode.c, - i960-pinsn.c, m68k-pinsn.c, nm.c, objdump.c, size.c, sparc-pinsn.c, - * strip.c: Add or update Copyright notice. - * TODO: Add note on 'nm -a'. - * version.c: Update version number to 1.90. - * Makefile.in: Fix making of documentation for dist. - -Tue Oct 15 00:17:17 1991 Per Bothner (bothner at cygnus.com) - - * README: New file. - * Makefile.in: New kludgy rules for making a tarfile. - * Makefile.in: Fix bindir path. - -Mon Oct 14 17:34:29 1991 Roland H. Pesch (pesch at cygnus.com) - - * Makefile.in: add targets binutils.mm, binutils.me - -Fri Oct 11 22:44:21 1991 John Gilmore (gnu at cygnus.com) - - * Makefile.in: Avoid Sun Make VPATH bugs by adding dependencies. - -Fri Oct 11 12:51:33 1991 Roland H. Pesch (pesch at cygnus.com) - - * Makefile.in: add target "binutils.ms" - - * binutils.texinfo: minor restructuring for texi2roff comfort. - -Fri Oct 11 04:12:28 1991 John Gilmore (gnu at cygnus.com) - - Restructure configuration scheme for bfd, binutils, ld. - - * include/sys/h-*.h: Move to bfd/hosts/h-*.h. - * configure.in: Revise to symlink sysdep.h to ../bfd/hosts/h-xxx.h. - Change some config names to match other dirs. - * *.c: Include bfd.h before sysdep.h, so ansidecl and PROTO() - get defined first. - * Makefile.in: Use -I. to get sysdep.h. - -Wed Oct 9 22:42:56 1991 Per Bothner (bothner at cygnus.com) - - * nm.c (print_symbols): Handle NULL name field of symbol. - * Makefile.in: Removed spurious comment. - -Tue Oct 8 16:55:03 1991 Roland H. Pesch (pesch at cygnus.com) - - * binutils.texinfo: minor typos, phrasing, formatting fixes. - -Tue Oct 8 15:13:20 1991 Per Bothner (bothner at cygnus.com) - - * configure.in: Get host file from ../bfd/config, not config. - * config/*: Remove config directory and its files. - -Tue Oct 8 13:58:59 1991 Roland H. Pesch (pesch at cygnus.com) - - * Makefile.in: new targets binutils.dvi, binutils.info - - * binutils.texinfo: remove most remaining FIXME's, delete - references to __.SYMDEF by name - - -Tue Oct 8 10:23:44 1991 Steve Chamberlain (steve at cygnus.com) - - * objdump.c (print_address) Print addresses nicely. - -Mon Oct 7 11:31:05 1991 Per Bothner (bothner at cygnus.com) - - * ar.c, Makefile.in, new files {is,not,maybe}-ranlib.c: - Make two different binaries for ar and ranlib, instead of - distinguishing them at run time using argv[0]. - (Old behavior is still available if you "make ar_with_ranlib", - but it is not the default.) - * ranlib.sh (new): An alternative one-line - shell implementation of ranlib. - -Fri Oct 4 21:49:44 1991 John Gilmore (gnu at cygnus.com) - - * objdump.c: Cope with renames of a few BFD types & enums. - -Fri Oct 4 19:08:09 1991 Roland H. Pesch (pesch at cygnus.com) - - * binutils.texinfo: add new file (rudimentary docn) - -Mon Sep 30 12:30:39 1991 Per Bothner (bothner at cygnus.com) - - * config/hmake-news: Add new file (for Sony NEWSOS3). - * bucomm.c (fatal): Conditionally compile fatal() depending on - MISSING_VFPRINTF, and don't confuse the issue with NO_VARARGS. - * objdump.c (dump_headers): Trivial output format change. - * objdump.c (display_info): Loop over integers, not enums, - to appease old compilers. - -Mon May 20 16:14:07 1991 Steve Chamberlain (steve at cygint.cygnus.com) - - *objdump.c *nm.c *copy.c: Changed some types to work with 64 bit - object files. - -Thu May 16 16:06:55 1991 Steve Chamberlain (steve at cygint.cygnus.com) - from bother - * objdump.c (print_address): Make disasembled output more - consistent with gdb and as: Add 0x when printing hex. - Don't print extra leading zeros. - Attempt to not print "filename.o". - * objdump.c: Add some enum-to-int casts to accomodate old compilers. - - -Fri May 3 22:21:44 1991 John Gilmore (gnu at cygint.cygnus.com) - - * copy.c: Change =& constructs to = &, since they confuse older - C compilers. - - -Local Variables: -mode: change-log -left-margin: 8 -fill-column: 74 -version-control: never -End: diff --git a/binutils/Makefile.am b/binutils/Makefile.am deleted file mode 100644 index c8d730201a7..00000000000 --- a/binutils/Makefile.am +++ /dev/null @@ -1,519 +0,0 @@ -## Process this file with automake to generate Makefile.in - -## FIXME: Work around apparent bug in automake. -INTLLIBS = @INTLLIBS@ - -AUTOMAKE_OPTIONS = cygnus dejagnu - -SUBDIRS = po - -tooldir = $(exec_prefix)/$(target_alias) - -## These aren't set by automake, because they appear in -## bfd/acinclude.m4, which is included by binutils/acinclude.m4, and -## thus is not seen by automake. -CC_FOR_BUILD = @CC_FOR_BUILD@ -EXEEXT_FOR_BUILD = @EXEEXT_FOR_BUILD@ - -YACC = `if [ -f ../bison/bison ]; then echo ../bison/bison -y -L$(srcdir)/../bison/; else echo @YACC@; fi` -YFLAGS = -d -LEX = `if [ -f ../flex/flex ]; then echo ../flex/flex; else echo @LEX@; fi` - -WARN_CFLAGS = @WARN_CFLAGS@ -AM_CFLAGS = $(WARN_CFLAGS) - -# these two are almost the same program -AR_PROG=ar -RANLIB_PROG=ranlib - -# objcopy and strip should be the same program -OBJCOPY_PROG=objcopy -STRIP_PROG=strip-new - -STRINGS_PROG=strings - -READELF_PROG=readelf - -# These should all be the same program too. -SIZE_PROG=size -NM_PROG=nm-new -OBJDUMP_PROG=objdump - -# This is the demangler, as a standalone program. -# Note: This one is used as the installed name too, unlike the above. -DEMANGLER_PROG=cxxfilt - -ADDR2LINE_PROG=addr2line - -NLMCONV_PROG=nlmconv -DLLTOOL_PROG=dlltool -WINDRES_PROG=windres -DLLWRAP_PROG=dllwrap - -SRCONV_PROG=srconv$(EXEEXT) sysdump$(EXEEXT) coffdump$(EXEEXT) - -man_MANS = ar.1 nm.1 objdump.1 ranlib.1 size.1 strings.1 strip.1 objcopy.1 \ - addr2line.1 nlmconv.1 $(DEMANGLER_NAME).1 - -PROGS = $(SIZE_PROG) $(OBJDUMP_PROG) $(NM_PROG) $(AR_PROG) $(STRINGS_PROG) $(STRIP_PROG) $(RANLIB_PROG) $(DEMANGLER_PROG) $(OBJCOPY_PROG) @BUILD_NLMCONV@ @BUILD_SRCONV@ @BUILD_DLLTOOL@ @BUILD_WINDRES@ $(ADDR2LINE_PROG) $(READELF_PROG) @BUILD_DLLWRAP@ @BUILD_MISC@ - -bin_PROGRAMS = $(SIZE_PROG) $(OBJDUMP_PROG) $(AR_PROG) $(STRINGS_PROG) $(RANLIB_PROG) $(OBJCOPY_PROG) @BUILD_NLMCONV@ @BUILD_SRCONV@ @BUILD_DLLTOOL@ @BUILD_WINDRES@ $(ADDR2LINE_PROG) $(READELF_PROG) @BUILD_DLLWRAP@ @BUILD_MISC@ - -## We need a special rule to install the programs which are built with -## -new, and to rename cxxfilt to c++filt. -noinst_PROGRAMS = $(NM_PROG) $(STRIP_PROG) $(DEMANGLER_PROG) - -EXTRA_PROGRAMS = $(NLMCONV_PROG) srconv sysdump coffdump $(DLLTOOL_PROG) $(WINDRES_PROG) $(DLLWRAP_PROG) - -# Stuff that goes in tooldir/ if appropriate -TOOL_PROGS = nm-new strip-new ar ranlib dlltool - -BASEDIR = $(srcdir)/.. -BFDDIR = $(BASEDIR)/bfd -INCDIR = $(BASEDIR)/include - -MKDEP = gcc -MM - -INCLUDES = -D_GNU_SOURCE -I. -I$(srcdir) -I../bfd -I$(BFDDIR) -I$(INCDIR) @HDEFINES@ -I$(srcdir)/../intl -I../intl -DLOCALEDIR="\"$(prefix)/share/locale\"" - -HFILES = arsup.h bucomm.h budbg.h coffgrok.h debug.h nlmconv.h dlltool.h \ - windres.h winduni.h dyn-string.h - -GENERATED_HFILES = arparse.h sysroff.h sysinfo.h defparse.h rcparse.h - -CFILES = addr2line.c ar.c arsup.c bucomm.c coffdump.c coffgrok.c debug.c \ - dlltool.c filemode.c ieee.c is-ranlib.c is-strip.c maybe-ranlib.c \ - maybe-strip.c nlmconv.c nm.c not-ranlib.c not-strip.c \ - objcopy.c objdump.c prdbg.c rdcoff.c rddbg.c size.c srconv.c \ - stabs.c strings.c sysdump.c version.c wrstabs.c \ - windres.c resrc.c rescoff.c resbin.c winduni.c readelf.c \ - resres.c dyn-string.c dllwrap.c rename.c - -GENERATED_CFILES = \ - underscore.c arparse.c arlex.c sysroff.c sysinfo.c syslex.c \ - defparse.c deflex.c nlmheader.c rcparse.c rclex.c - -DEBUG_SRCS = rddbg.c debug.c stabs.c ieee.c rdcoff.c -WRITE_DEBUG_SRCS = $(DEBUG_SRCS) wrstabs.c - -# Code shared by all the binutils. -BULIBS = bucomm.c version.c filemode.c - -BFDLIB = ../bfd/libbfd.la - -OPCODES = ../opcodes/libopcodes.la - -LIBIBERTY = ../libiberty/libiberty.a - -POTFILES = $(CFILES) $(DEBUG_SRCS) $(HFILES) -po/POTFILES.in: @MAINT@ Makefile - for file in $(POTFILES); do echo $$file; done | sort > tmp \ - && mv tmp $(srcdir)/po/POTFILES.in - -EXPECT = `if [ -f $$r/../expect/expect ] ; then \ - echo $$r/../expect/expect ; \ - else echo expect ; fi` -RUNTEST = `if [ -f ${srcdir}/../dejagnu/runtest ] ; then \ - echo ${srcdir}/../dejagnu/runtest ; \ - else echo runtest ; fi` - -CC_FOR_TARGET = ` \ - if [ -f $$r/../gcc/xgcc ] ; then \ - if [ -f $$r/../newlib/Makefile ] ; then \ - echo $$r/../gcc/xgcc -B$$r/../gcc/ -idirafter $$r/../newlib/targ-include -idirafter $${srcroot}/../newlib/libc/include -nostdinc; \ - else \ - echo $$r/../gcc/xgcc -B$$r/../gcc/; \ - fi; \ - else \ - if [ "@host@" = "@target@" ] ; then \ - echo $(CC); \ - else \ - echo gcc | sed '$(transform)'; \ - fi; \ - fi` - -check-DEJAGNU: site.exp - srcdir=`cd $(srcdir) && pwd`; export srcdir; \ - r=`pwd`; export r; \ - EXPECT=$(EXPECT); export EXPECT; \ - if [ -f $(top_builddir)/../expect/expect ]; then \ - TCL_LIBRARY=`cd $(top_srcdir)/../tcl/library && pwd`; \ - export TCL_LIBRARY; \ - fi; \ - runtest=$(RUNTEST); \ - if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ - $$runtest --tool $(DEJATOOL) --srcdir $${srcdir}/testsuite \ - CC_FOR_TARGET="$(CC_FOR_TARGET)" \ - CFLAGS_FOR_TARGET="$(CFLAGS)" $(RUNTESTFLAGS); \ - else echo "WARNING: could not find \`runtest'" 1>&2; :;\ - fi - -installcheck: - /bin/sh $(srcdir)/sanity.sh $(bindir) - -info_TEXINFOS = binutils.texi - -LDADD = $(BFDLIB) $(LIBIBERTY) $(INTLLIBS) - -size_SOURCES = size.c $(BULIBS) - -objcopy_SOURCES = objcopy.c not-strip.c rename.c $(WRITE_DEBUG_SRCS) $(BULIBS) - -strings_SOURCES = strings.c $(BULIBS) - -readelf_SOURCES = readelf.c version.c -readelf_LDADD = $(INTLLIBS) $(LIBIBERTY) - -strip_new_SOURCES = objcopy.c is-strip.c rename.c $(WRITE_DEBUG_SRCS) $(BULIBS) - -nm_new_SOURCES = nm.c $(BULIBS) - -objdump_SOURCES = objdump.c prdbg.c $(DEBUG_SRCS) $(BULIBS) -objdump_LDADD = $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(INTLLIBS) - -underscore.c: stamp-under ; @true - -stamp-under: Makefile - echo '/*WARNING: This file is automatically generated!*/' >underscore.t - echo "int prepends_underscore = @UNDERSCORE@;" >>underscore.t - $(SHELL) $(srcdir)/../move-if-change underscore.t underscore.c - touch stamp-under - -cplus-dem.o: $(BASEDIR)/libiberty/cplus-dem.c $(INCDIR)/getopt.h - $(COMPILE) -c -DMAIN -DVERSION='"$(VERSION)"' $(BASEDIR)/libiberty/cplus-dem.c - -cxxfilt_SOURCES = -cxxfilt_LDADD = cplus-dem.o underscore.o $(LIBIBERTY) $(INTLLIBS) - -ar_SOURCES = arparse.y arlex.l ar.c not-ranlib.c arsup.c rename.c $(BULIBS) -ar_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS) - -ranlib_SOURCES = ar.c is-ranlib.c arparse.y arlex.l arsup.c rename.c $(BULIBS) -ranlib_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS) - -addr2line_SOURCES = addr2line.c $(BULIBS) - -# The following is commented out for the conversion to automake. -# This rule creates a single binary that switches between ar and ranlib -# by looking at argv[0]. Use this kludge to save some disk space. -# However, you have to install things by hand. -# (That is after 'make install', replace the installed ranlib by a link to ar.) -# Alternatively, you can install ranlib.sh as ranlib. -# ar_with_ranlib: $(ADDL_DEPS) ar.o maybe-ranlib.o -# $(HLDENV) $(CC) $(HLDFLAGS) $(CFLAGS) $(LDFLAGS) -o $(AR_PROG) ar.o maybe-ranlib.o $(ADDL_LIBS) $(EXTRALIBS) -# -rm -f $(RANLIB_PROG) -# -ln $(AR_PROG) $(RANLIB_PROG) -# -# objcopy and strip in one binary that uses argv[0] to decide its action. -# -#objcopy_with_strip: $(ADDL_DEPS) objcopy.o maybe-strip.o -# $(HLDENV) $(CC) $(HLDFLAGS) $(CFLAGS) $(LDFLAGS) -o $(OBJCOPY_PROG) objcopy.o maybe-strip.o $(ADDL_LIBS) $(EXTRALIBS) -# -rm -f $(STRIP_PROG) -# -ln $(OBJCOPY_PROG) $(STRIP_PROG) - -sysroff.c: sysinfo$(EXEEXT_FOR_BUILD) sysroff.info - ./sysinfo$(EXEEXT_FOR_BUILD) -c <$(srcdir)/sysroff.info >sysroff.c - ./sysinfo$(EXEEXT_FOR_BUILD) -i <$(srcdir)/sysroff.info >>sysroff.c - ./sysinfo$(EXEEXT_FOR_BUILD) -g <$(srcdir)/sysroff.info >>sysroff.c - -sysroff.h: sysinfo$(EXEEXT_FOR_BUILD) sysroff.info - ./sysinfo$(EXEEXT_FOR_BUILD) -d <$(srcdir)/sysroff.info >sysroff.h - -sysinfo$(EXEEXT_FOR_BUILD): sysinfo.o syslex.o - $(CC_FOR_BUILD) $(CFLAGS) $(LDFLAGS) -o $@ sysinfo.o syslex.o - -syslex.o: syslex.c sysinfo.h - if [ -r syslex.c ]; then \ - $(CC_FOR_BUILD) -c -I. $(CFLAGS) syslex.c ; \ - else \ - $(CC_FOR_BUILD) -c -I. -I$(srcdir) $(CFLAGS) $(srcdir)/syslex.c ;\ - fi - -sysinfo.o: sysinfo.c - if [ -r sysinfo.c ]; then \ - $(CC_FOR_BUILD) -c -I. $(CFLAGS) sysinfo.c ; \ - else \ - $(CC_FOR_BUILD) -c -I. $(CFLAGS) $(srcdir)/sysinfo.c ; \ - fi - -# We need these for parallel make. -arparse.h: arparse.c -defparse.h: defparse.c -nlmheader.h: nlmheader.c -rcparse.h: rcparse.c -sysinfo.h: sysinfo.c - -srconv_SOURCES = srconv.c coffgrok.c $(BULIBS) - -dlltool_SOURCES = dlltool.c defparse.y deflex.l dyn-string.c $(BULIBS) -dlltool_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS) - -dlltool.o:dlltool.c - $(COMPILE) -c $(DLLTOOL_DEFS) $(srcdir)/dlltool.c - -rescoff.o:rescoff.c - $(COMPILE) -c $(DLLTOOL_DEFS) $(srcdir)/rescoff.c - -coffdump_SOURCES = coffdump.c coffgrok.c $(BULIBS) - -sysdump_SOURCES = sysdump.c $(BULIBS) - -# coff/sym.h and coff/ecoff.h won't be found by the automatic dependency -# scripts, since they are only included conditionally. -nlmconv.o: nlmconv.c $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h - ldname=`echo ld | sed '$(transform)'`; \ - $(COMPILE) -c -DLD_NAME="\"$${ldname}\"" @NLMCONV_DEFS@ $(srcdir)/nlmconv.c - -nlmconv_SOURCES = nlmconv.c nlmheader.y $(BULIBS) - -windres_SOURCES = windres.c resrc.c rescoff.c resbin.c rcparse.y rclex.l \ - winduni.c resres.c $(BULIBS) -windres_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS) - -dllwrap_SOURCES = dllwrap.c dyn-string.c version.c -dllwrap_LDADD = $(LIBIBERTY) $(INTLLIBS) - - -DISTSTUFF = arparse.c arparse.h arlex.c nlmheader.c sysinfo.c sysinfo.h \ - syslex.c deflex.c defparse.h defparse.c rclex.c rcparse.h rcparse.c - -diststuff: $(DISTSTUFF) info - -DISTCLEANFILES = stamp-under sysinfo underscore.c sysroff.c sysroff.h \ - site.exp site.bak - -# Targets to rebuild dependencies in this Makefile. -# Have to get rid of DEP1 here so that "$?" later includes all of $(CFILES). -DEP: dep.sed $(CFILES) $(HFILES) $(GENERATED_CFILES) $(GENERATED_HFILES) config.h - rm -f DEP1 - $(MAKE) MKDEP="$(MKDEP)" DEP1 - sed -f dep.sed < DEP1 > $@ - echo '# IF YOU PUT ANYTHING HERE IT WILL GO AWAY' >> $@ - -DEP1: $(CFILES) $(GENERATED_CFILES) - echo '# DO NOT DELETE THIS LINE -- mkdep uses it.' > DEP2 - echo '# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.' >> DEP2 - $(MKDEP) $(INCLUDES) $(CFLAGS) $? >> DEP2 - mv -f DEP2 $@ - -dep.sed: dep-in.sed config.status - objdir=`pwd`; \ - sed <$(srcdir)/dep-in.sed >dep.sed \ - -e 's!@INCDIR@!$(INCDIR)!' \ - -e 's!@BFDDIR@!$(BFDDIR)!' \ - -e 's!@SRCDIR@!$(srcdir)!' \ - -e "s!@OBJDIR@!$${objdir}!" - -dep: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < Makefile > tmp-Makefile - cat DEP >> tmp-Makefile - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile Makefile - -dep-in: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < $(srcdir)/Makefile.in > tmp-Makefile.in - cat DEP >> tmp-Makefile.in - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile.in $(srcdir)/Makefile.in - -dep-am: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < $(srcdir)/Makefile.am > tmp-Makefile.am - cat DEP >> tmp-Makefile.am - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile.am $(srcdir)/Makefile.am - -.PHONY: dep dep-in dep-am - -### -# DOCUMENTATION TARGETS -config.texi: Makefile - rm -f config.texi - echo '@set VERSION $(VERSION)' > config.texi - -binutils.dvi: $(srcdir)/binutils.texi config.texi - -binutils.info: $(srcdir)/binutils.texi config.texi - -MAINTAINERCLEANFILES = config.texi - -$(DEMANGLER_NAME).1: cxxfilt.man Makefile - sed -e 's/@PROGRAM@/$(DEMANGLER_NAME)/' < $(srcdir)/cxxfilt.man \ - > $(DEMANGLER_NAME).1 - -MOSTLYCLEANFILES = sysinfo $(DEMANGLER_NAME).1 binutils.log binutils.sum \ - abcdefgh* -mostlyclean-local: - -rm -rf tmpdir - -CLEANFILES = dep.sed DEP DEP1 DEP2 - -.PHONY: install-exec-local - -install-exec-local: install-binPROGRAMS $(bin_PROGRAMS) $(noinst_PROGRAMS) - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed -e 's/$(EXEEXT)$$//' -e 's/-new//' -e 's/cxxfilt/$(DEMANGLER_NAME)/'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed -e 's/$(EXEEXT)$$//' -e 's/-new//' -e 's/cxxfilt/$(DEMANGLER_NAME)/'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - else :; fi; \ - done - $(mkinstalldirs) $(tooldir)/bin - for i in $(TOOL_PROGS); do \ - if [ -f $$i$(EXEEXT) ]; then \ - j=`echo $$i | sed -e 's/-new//'`; \ - k=`echo $$j | sed '$(transform)'`; \ - if [ "$(bindir)/$$k$(EXEEXT)" != "$(tooldir)/bin/$$j$(EXEEXT)" ]; then \ - rm -f $(tooldir)/bin/$$j$(EXEEXT); \ - ln $(bindir)/$$k$(EXEEXT) $(tooldir)/bin/$$j$(EXEEXT) >/dev/null 2>/dev/null \ - || $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$i$(EXEEXT) $(tooldir)/bin/$$j$(EXEEXT); \ - fi; \ - else true; \ - fi; \ - done - -# What appears below is generated by a hacked mkdep using gcc -MM. - -# DO NOT DELETE THIS LINE -- mkdep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. -addr2line.o: addr2line.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/getopt.h $(INCDIR)/libiberty.h $(INCDIR)/demangle.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -ar.o: ar.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h \ - $(INCDIR)/progress.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/aout/ar.h $(BFDDIR)/libbfd.h \ - arsup.h -arsup.o: arsup.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - arsup.h $(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h -bucomm.o: bucomm.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h -coffdump.o: coffdump.c coffgrok.h bucomm.h config.h \ - $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -coffgrok.o: coffgrok.c bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h coffgrok.h -debug.o: debug.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h debug.h -dlltool.o: dlltool.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/demangle.h dyn-string.h \ - dlltool.h -filemode.o: filemode.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -ieee.o: ieee.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/ieee.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h debug.h budbg.h -is-ranlib.o: is-ranlib.c -is-strip.o: is-strip.c -maybe-ranlib.o: maybe-ranlib.c -maybe-strip.o: maybe-strip.c -nlmconv.o: nlmconv.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(BFDDIR)/libnlm.h $(INCDIR)/nlm/common.h \ - $(INCDIR)/nlm/internal.h $(INCDIR)/nlm/external.h nlmconv.h -nm.o: nm.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/progress.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/aout/ranlib.h \ - $(INCDIR)/demangle.h $(INCDIR)/libiberty.h -not-ranlib.o: not-ranlib.c -not-strip.o: not-strip.c -objcopy.o: objcopy.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/progress.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h budbg.h -objdump.o: objdump.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/getopt.h $(INCDIR)/progress.h bucomm.h config.h \ - $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h $(INCDIR)/dis-asm.h \ - $(INCDIR)/libiberty.h $(INCDIR)/demangle.h debug.h \ - budbg.h $(INCDIR)/aout/aout64.h -prdbg.o: prdbg.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h debug.h budbg.h -rdcoff.o: rdcoff.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/coff/internal.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h $(INCDIR)/demangle.h \ - debug.h budbg.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -rddbg.o: rddbg.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h debug.h budbg.h -size.o: size.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/getopt.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h -srconv.o: srconv.c bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h sysroff.h coffgrok.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h sysroff.c -stabs.o: stabs.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h $(INCDIR)/demangle.h debug.h \ - budbg.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def -strings.o: strings.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h -sysdump.o: sysdump.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - sysroff.h sysroff.c -version.o: version.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -wrstabs.o: wrstabs.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h debug.h budbg.h $(INCDIR)/aout/aout64.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def -windres.o: windres.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/getopt.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h $(INCDIR)/obstack.h \ - windres.h winduni.h -resrc.o: resrc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h -rescoff.o: rescoff.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -resbin.o: resbin.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h -winduni.o: winduni.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - winduni.h -readelf.o: readelf.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/dwarf2.h $(INCDIR)/elf/i386.h $(INCDIR)/elf/reloc-macros.h \ - $(INCDIR)/elf/v850.h $(INCDIR)/elf/ppc.h $(INCDIR)/elf/mips.h \ - $(INCDIR)/elf/alpha.h $(INCDIR)/elf/arm.h $(INCDIR)/elf/m68k.h \ - $(INCDIR)/elf/sparc.h $(INCDIR)/elf/m32r.h $(INCDIR)/elf/d10v.h \ - $(INCDIR)/elf/d30v.h $(INCDIR)/elf/sh.h $(INCDIR)/elf/mn10200.h \ - $(INCDIR)/elf/mn10300.h $(INCDIR)/elf/hppa.h $(INCDIR)/elf/arc.h \ - $(INCDIR)/elf/fr30.h $(INCDIR)/elf/mcore.h $(INCDIR)/elf/i960.h \ - $(INCDIR)/elf/pj.h $(INCDIR)/elf/avr.h bucomm.h config.h \ - $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -resres.o: resres.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h -dyn-string.o: dyn-string.c config.h $(INCDIR)/ansidecl.h \ - dyn-string.h -dllwrap.o: dllwrap.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h dyn-string.h -rename.o: rename.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -underscore.o: underscore.c -arparse.o: arparse.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - arsup.h -arlex.o: arlex.c $(INCDIR)/libiberty.h arparse.h -sysroff.o: sysroff.c -sysinfo.o: sysinfo.c -syslex.o: syslex.c sysinfo.h -defparse.o: defparse.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - dlltool.h -deflex.o: deflex.c $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \ - defparse.h dlltool.h -nlmheader.o: nlmheader.c ../bfd/bfd.h bucomm.h config.h \ - $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h $(INCDIR)/nlm/common.h \ - $(INCDIR)/nlm/internal.h nlmconv.h -rcparse.o: rcparse.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h -rclex.o: rclex.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h rcparse.h -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/binutils/Makefile.in b/binutils/Makefile.in deleted file mode 100644 index 22216339419..00000000000 --- a/binutils/Makefile.in +++ /dev/null @@ -1,1379 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = . - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_alias = @build_alias@ -build_triplet = @build@ -host_alias = @host_alias@ -host_triplet = @host@ -target_alias = @target_alias@ -target_triplet = @target@ -AR = @AR@ -AS = @AS@ -BUILD_DLLTOOL = @BUILD_DLLTOOL@ -BUILD_DLLWRAP = @BUILD_DLLWRAP@ -BUILD_MISC = @BUILD_MISC@ -BUILD_NLMCONV = @BUILD_NLMCONV@ -BUILD_SRCONV = @BUILD_SRCONV@ -BUILD_WINDRES = @BUILD_WINDRES@ -CATALOGS = @CATALOGS@ -CATOBJEXT = @CATOBJEXT@ -CC = @CC@ -DATADIRNAME = @DATADIRNAME@ -DEMANGLER_NAME = @DEMANGLER_NAME@ -DLLTOOL = @DLLTOOL@ -DLLTOOL_DEFS = @DLLTOOL_DEFS@ -EXEEXT = @EXEEXT@ -GMOFILES = @GMOFILES@ -GMSGFMT = @GMSGFMT@ -GT_NO = @GT_NO@ -GT_YES = @GT_YES@ -HDEFINES = @HDEFINES@ -INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ -INSTOBJEXT = @INSTOBJEXT@ -INTLDEPS = @INTLDEPS@ -INTLOBJS = @INTLOBJS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKINSTALLDIRS = @MKINSTALLDIRS@ -MSGFMT = @MSGFMT@ -NLMCONV_DEFS = @NLMCONV_DEFS@ -OBJDUMP = @OBJDUMP@ -PACKAGE = @PACKAGE@ -POFILES = @POFILES@ -POSUB = @POSUB@ -RANLIB = @RANLIB@ -UNDERSCORE = @UNDERSCORE@ -USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ -USE_NLS = @USE_NLS@ -VERSION = @VERSION@ -l = @l@ - -INTLLIBS = @INTLLIBS@ - -AUTOMAKE_OPTIONS = cygnus dejagnu - -SUBDIRS = po - -tooldir = $(exec_prefix)/$(target_alias) - -CC_FOR_BUILD = @CC_FOR_BUILD@ -EXEEXT_FOR_BUILD = @EXEEXT_FOR_BUILD@ - -YACC = `if [ -f ../bison/bison ]; then echo ../bison/bison -y -L$(srcdir)/../bison/; else echo @YACC@; fi` -YFLAGS = -d -LEX = `if [ -f ../flex/flex ]; then echo ../flex/flex; else echo @LEX@; fi` - -WARN_CFLAGS = @WARN_CFLAGS@ -AM_CFLAGS = $(WARN_CFLAGS) - -# these two are almost the same program -AR_PROG = ar -RANLIB_PROG = ranlib - -# objcopy and strip should be the same program -OBJCOPY_PROG = objcopy -STRIP_PROG = strip-new - -STRINGS_PROG = strings - -READELF_PROG = readelf - -# These should all be the same program too. -SIZE_PROG = size -NM_PROG = nm-new -OBJDUMP_PROG = objdump - -# This is the demangler, as a standalone program. -# Note: This one is used as the installed name too, unlike the above. -DEMANGLER_PROG = cxxfilt - -ADDR2LINE_PROG = addr2line - -NLMCONV_PROG = nlmconv -DLLTOOL_PROG = dlltool -WINDRES_PROG = windres -DLLWRAP_PROG = dllwrap - -SRCONV_PROG = srconv$(EXEEXT) sysdump$(EXEEXT) coffdump$(EXEEXT) - -man_MANS = ar.1 nm.1 objdump.1 ranlib.1 size.1 strings.1 strip.1 objcopy.1 \ - addr2line.1 nlmconv.1 $(DEMANGLER_NAME).1 - - -PROGS = $(SIZE_PROG) $(OBJDUMP_PROG) $(NM_PROG) $(AR_PROG) $(STRINGS_PROG) $(STRIP_PROG) $(RANLIB_PROG) $(DEMANGLER_PROG) $(OBJCOPY_PROG) @BUILD_NLMCONV@ @BUILD_SRCONV@ @BUILD_DLLTOOL@ @BUILD_WINDRES@ $(ADDR2LINE_PROG) $(READELF_PROG) @BUILD_DLLWRAP@ @BUILD_MISC@ - -bin_PROGRAMS = $(SIZE_PROG) $(OBJDUMP_PROG) $(AR_PROG) $(STRINGS_PROG) $(RANLIB_PROG) $(OBJCOPY_PROG) @BUILD_NLMCONV@ @BUILD_SRCONV@ @BUILD_DLLTOOL@ @BUILD_WINDRES@ $(ADDR2LINE_PROG) $(READELF_PROG) @BUILD_DLLWRAP@ @BUILD_MISC@ - -noinst_PROGRAMS = $(NM_PROG) $(STRIP_PROG) $(DEMANGLER_PROG) - -EXTRA_PROGRAMS = $(NLMCONV_PROG) srconv sysdump coffdump $(DLLTOOL_PROG) $(WINDRES_PROG) $(DLLWRAP_PROG) - -# Stuff that goes in tooldir/ if appropriate -TOOL_PROGS = nm-new strip-new ar ranlib dlltool - -BASEDIR = $(srcdir)/.. -BFDDIR = $(BASEDIR)/bfd -INCDIR = $(BASEDIR)/include - -MKDEP = gcc -MM - -INCLUDES = -D_GNU_SOURCE -I. -I$(srcdir) -I../bfd -I$(BFDDIR) -I$(INCDIR) @HDEFINES@ -I$(srcdir)/../intl -I../intl -DLOCALEDIR="\"$(prefix)/share/locale\"" - -HFILES = arsup.h bucomm.h budbg.h coffgrok.h debug.h nlmconv.h dlltool.h \ - windres.h winduni.h dyn-string.h - - -GENERATED_HFILES = arparse.h sysroff.h sysinfo.h defparse.h rcparse.h - -CFILES = addr2line.c ar.c arsup.c bucomm.c coffdump.c coffgrok.c debug.c \ - dlltool.c filemode.c ieee.c is-ranlib.c is-strip.c maybe-ranlib.c \ - maybe-strip.c nlmconv.c nm.c not-ranlib.c not-strip.c \ - objcopy.c objdump.c prdbg.c rdcoff.c rddbg.c size.c srconv.c \ - stabs.c strings.c sysdump.c version.c wrstabs.c \ - windres.c resrc.c rescoff.c resbin.c winduni.c readelf.c \ - resres.c dyn-string.c dllwrap.c rename.c - - -GENERATED_CFILES = \ - underscore.c arparse.c arlex.c sysroff.c sysinfo.c syslex.c \ - defparse.c deflex.c nlmheader.c rcparse.c rclex.c - - -DEBUG_SRCS = rddbg.c debug.c stabs.c ieee.c rdcoff.c -WRITE_DEBUG_SRCS = $(DEBUG_SRCS) wrstabs.c - -# Code shared by all the binutils. -BULIBS = bucomm.c version.c filemode.c - -BFDLIB = ../bfd/libbfd.la - -OPCODES = ../opcodes/libopcodes.la - -LIBIBERTY = ../libiberty/libiberty.a - -POTFILES = $(CFILES) $(DEBUG_SRCS) $(HFILES) - -EXPECT = `if [ -f $$r/../expect/expect ] ; then \ - echo $$r/../expect/expect ; \ - else echo expect ; fi` - -RUNTEST = `if [ -f ${srcdir}/../dejagnu/runtest ] ; then \ - echo ${srcdir}/../dejagnu/runtest ; \ - else echo runtest ; fi` - - -CC_FOR_TARGET = ` \ - if [ -f $$r/../gcc/xgcc ] ; then \ - if [ -f $$r/../newlib/Makefile ] ; then \ - echo $$r/../gcc/xgcc -B$$r/../gcc/ -idirafter $$r/../newlib/targ-include -idirafter $${srcroot}/../newlib/libc/include -nostdinc; \ - else \ - echo $$r/../gcc/xgcc -B$$r/../gcc/; \ - fi; \ - else \ - if [ "@host@" = "@target@" ] ; then \ - echo $(CC); \ - else \ - echo gcc | sed '$(transform)'; \ - fi; \ - fi` - - -info_TEXINFOS = binutils.texi - -LDADD = $(BFDLIB) $(LIBIBERTY) $(INTLLIBS) - -size_SOURCES = size.c $(BULIBS) - -objcopy_SOURCES = objcopy.c not-strip.c rename.c $(WRITE_DEBUG_SRCS) $(BULIBS) - -strings_SOURCES = strings.c $(BULIBS) - -readelf_SOURCES = readelf.c version.c -readelf_LDADD = $(INTLLIBS) $(LIBIBERTY) - -strip_new_SOURCES = objcopy.c is-strip.c rename.c $(WRITE_DEBUG_SRCS) $(BULIBS) - -nm_new_SOURCES = nm.c $(BULIBS) - -objdump_SOURCES = objdump.c prdbg.c $(DEBUG_SRCS) $(BULIBS) -objdump_LDADD = $(OPCODES) $(BFDLIB) $(LIBIBERTY) $(INTLLIBS) - -cxxfilt_SOURCES = -cxxfilt_LDADD = cplus-dem.o underscore.o $(LIBIBERTY) $(INTLLIBS) - -ar_SOURCES = arparse.y arlex.l ar.c not-ranlib.c arsup.c rename.c $(BULIBS) -ar_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS) - -ranlib_SOURCES = ar.c is-ranlib.c arparse.y arlex.l arsup.c rename.c $(BULIBS) -ranlib_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS) - -addr2line_SOURCES = addr2line.c $(BULIBS) - -srconv_SOURCES = srconv.c coffgrok.c $(BULIBS) - -dlltool_SOURCES = dlltool.c defparse.y deflex.l dyn-string.c $(BULIBS) -dlltool_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS) - -coffdump_SOURCES = coffdump.c coffgrok.c $(BULIBS) - -sysdump_SOURCES = sysdump.c $(BULIBS) - -nlmconv_SOURCES = nlmconv.c nlmheader.y $(BULIBS) - -windres_SOURCES = windres.c resrc.c rescoff.c resbin.c rcparse.y rclex.l \ - winduni.c resres.c $(BULIBS) - -windres_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS) - -dllwrap_SOURCES = dllwrap.c dyn-string.c version.c -dllwrap_LDADD = $(LIBIBERTY) $(INTLLIBS) - -DISTSTUFF = arparse.c arparse.h arlex.c nlmheader.c sysinfo.c sysinfo.h \ - syslex.c deflex.c defparse.h defparse.c rclex.c rcparse.h rcparse.c - - -DISTCLEANFILES = stamp-under sysinfo underscore.c sysroff.c sysroff.h \ - site.exp site.bak - - -MAINTAINERCLEANFILES = config.texi - -MOSTLYCLEANFILES = sysinfo $(DEMANGLER_NAME).1 binutils.log binutils.sum \ - abcdefgh* - - -CLEANFILES = dep.sed DEP DEP1 DEP2 -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = -bin_PROGRAMS = size$(EXEEXT) objdump$(EXEEXT) ar$(EXEEXT) \ -strings$(EXEEXT) ranlib$(EXEEXT) objcopy$(EXEEXT) @BUILD_NLMCONV@ \ -@BUILD_SRCONV@ @BUILD_DLLTOOL@ @BUILD_WINDRES@ addr2line$(EXEEXT) \ -readelf$(EXEEXT) @BUILD_DLLWRAP@ @BUILD_MISC@ -noinst_PROGRAMS = nm-new$(EXEEXT) strip-new$(EXEEXT) cxxfilt$(EXEEXT) -PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) - - -DEFS = @DEFS@ -I. -I$(srcdir) -I. -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -nlmconv_OBJECTS = nlmconv.o nlmheader.o bucomm.o version.o filemode.o -nlmconv_LDADD = $(LDADD) -nlmconv_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -nlmconv_LDFLAGS = -srconv_OBJECTS = srconv.o coffgrok.o bucomm.o version.o filemode.o -srconv_LDADD = $(LDADD) -srconv_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -srconv_LDFLAGS = -sysdump_OBJECTS = sysdump.o bucomm.o version.o filemode.o -sysdump_LDADD = $(LDADD) -sysdump_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -sysdump_LDFLAGS = -coffdump_OBJECTS = coffdump.o coffgrok.o bucomm.o version.o filemode.o -coffdump_LDADD = $(LDADD) -coffdump_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -coffdump_LDFLAGS = -dlltool_OBJECTS = dlltool.o defparse.o deflex.o dyn-string.o bucomm.o \ -version.o filemode.o -dlltool_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -dlltool_LDFLAGS = -windres_OBJECTS = windres.o resrc.o rescoff.o resbin.o rcparse.o \ -rclex.o winduni.o resres.o bucomm.o version.o filemode.o -windres_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -windres_LDFLAGS = -dllwrap_OBJECTS = dllwrap.o dyn-string.o version.o -dllwrap_DEPENDENCIES = ../libiberty/libiberty.a -dllwrap_LDFLAGS = -size_OBJECTS = size.o bucomm.o version.o filemode.o -size_LDADD = $(LDADD) -size_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -size_LDFLAGS = -objdump_OBJECTS = objdump.o prdbg.o rddbg.o debug.o stabs.o ieee.o \ -rdcoff.o bucomm.o version.o filemode.o -objdump_DEPENDENCIES = ../opcodes/libopcodes.la ../bfd/libbfd.la \ -../libiberty/libiberty.a -objdump_LDFLAGS = -ar_OBJECTS = arparse.o arlex.o ar.o not-ranlib.o arsup.o rename.o \ -bucomm.o version.o filemode.o -ar_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -ar_LDFLAGS = -strings_OBJECTS = strings.o bucomm.o version.o filemode.o -strings_LDADD = $(LDADD) -strings_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -strings_LDFLAGS = -ranlib_OBJECTS = ar.o is-ranlib.o arparse.o arlex.o arsup.o rename.o \ -bucomm.o version.o filemode.o -ranlib_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -ranlib_LDFLAGS = -objcopy_OBJECTS = objcopy.o not-strip.o rename.o rddbg.o debug.o \ -stabs.o ieee.o rdcoff.o wrstabs.o bucomm.o version.o filemode.o -objcopy_LDADD = $(LDADD) -objcopy_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -objcopy_LDFLAGS = -addr2line_OBJECTS = addr2line.o bucomm.o version.o filemode.o -addr2line_LDADD = $(LDADD) -addr2line_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -addr2line_LDFLAGS = -readelf_OBJECTS = readelf.o version.o -readelf_DEPENDENCIES = ../libiberty/libiberty.a -readelf_LDFLAGS = -nm_new_OBJECTS = nm.o bucomm.o version.o filemode.o -nm_new_LDADD = $(LDADD) -nm_new_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -nm_new_LDFLAGS = -strip_new_OBJECTS = objcopy.o is-strip.o rename.o rddbg.o debug.o \ -stabs.o ieee.o rdcoff.o wrstabs.o bucomm.o version.o filemode.o -strip_new_LDADD = $(LDADD) -strip_new_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a -strip_new_LDFLAGS = -cxxfilt_OBJECTS = -cxxfilt_DEPENDENCIES = cplus-dem.o underscore.o \ -../libiberty/libiberty.a -cxxfilt_LDFLAGS = -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LEXLIB = @LEXLIB@ -YLWRAP = $(top_srcdir)/../ylwrap -CFLAGS = @CFLAGS@ -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ -TEXI2DVI = `if test -f $(top_srcdir)/../texinfo/util/texi2dvi; then echo $(top_srcdir)/../texinfo/util/texi2dvi; else echo texi2dvi; fi` -TEXINFO_TEX = $(top_srcdir)/../texinfo/texinfo.tex -INFO_DEPS = binutils.info -DVIS = binutils.dvi -TEXINFOS = binutils.texi -man1dir = $(mandir)/man1 -MANS = $(man_MANS) - -NROFF = nroff -DIST_COMMON = README ./stamp-h.in ChangeLog Makefile.am Makefile.in \ -NEWS acinclude.m4 aclocal.m4 arlex.c arparse.c config.in configure \ -configure.in deflex.c defparse.c nlmheader.c rclex.c rcparse.c - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -SOURCES = $(nlmconv_SOURCES) $(srconv_SOURCES) $(sysdump_SOURCES) $(coffdump_SOURCES) $(dlltool_SOURCES) $(windres_SOURCES) $(dllwrap_SOURCES) $(size_SOURCES) $(objdump_SOURCES) $(ar_SOURCES) $(strings_SOURCES) $(ranlib_SOURCES) $(objcopy_SOURCES) $(addr2line_SOURCES) $(readelf_SOURCES) $(nm_new_SOURCES) $(strip_new_SOURCES) $(cxxfilt_SOURCES) -OBJECTS = $(nlmconv_OBJECTS) $(srconv_OBJECTS) $(sysdump_OBJECTS) $(coffdump_OBJECTS) $(dlltool_OBJECTS) $(windres_OBJECTS) $(dllwrap_OBJECTS) $(size_OBJECTS) $(objdump_OBJECTS) $(ar_OBJECTS) $(strings_OBJECTS) $(ranlib_OBJECTS) $(objcopy_OBJECTS) $(addr2line_OBJECTS) $(readelf_OBJECTS) $(nm_new_OBJECTS) $(strip_new_OBJECTS) $(cxxfilt_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .S .c .dvi .info .l .lo .o .ps .s .texi .texinfo .txi .y -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in acinclude.m4 - cd $(srcdir) && $(ACLOCAL) - -config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck -$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) - cd $(srcdir) && $(AUTOCONF) - -config.h: stamp-h - @if test ! -f $@; then \ - rm -f stamp-h; \ - $(MAKE) stamp-h; \ - else :; fi -stamp-h: $(srcdir)/config.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES= CONFIG_HEADERS=config.h:config.in \ - $(SHELL) ./config.status - @echo timestamp > stamp-h 2> /dev/null -$(srcdir)/config.in: @MAINTAINER_MODE_TRUE@$(srcdir)/stamp-h.in - @if test ! -f $@; then \ - rm -f $(srcdir)/stamp-h.in; \ - $(MAKE) $(srcdir)/stamp-h.in; \ - else :; fi -$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOHEADER) - @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null - -mostlyclean-hdr: - -clean-hdr: - -distclean-hdr: - -rm -f config.h - -maintainer-clean-hdr: - -mostlyclean-binPROGRAMS: - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) - -distclean-binPROGRAMS: - -maintainer-clean-binPROGRAMS: - -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(bindir) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - list='$(bin_PROGRAMS)'; for p in $$list; do \ - rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - done - -mostlyclean-noinstPROGRAMS: - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) - -distclean-noinstPROGRAMS: - -maintainer-clean-noinstPROGRAMS: - -.c.o: - $(COMPILE) -c $< - -.s.o: - $(COMPILE) -c $< - -.S.o: - $(COMPILE) -c $< - -mostlyclean-compile: - -rm -f *.o core *.core - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -.c.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -.s.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -.S.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -maintainer-clean-libtool: - -nlmconv$(EXEEXT): $(nlmconv_OBJECTS) $(nlmconv_DEPENDENCIES) - @rm -f nlmconv$(EXEEXT) - $(LINK) $(nlmconv_LDFLAGS) $(nlmconv_OBJECTS) $(nlmconv_LDADD) $(LIBS) - -srconv$(EXEEXT): $(srconv_OBJECTS) $(srconv_DEPENDENCIES) - @rm -f srconv$(EXEEXT) - $(LINK) $(srconv_LDFLAGS) $(srconv_OBJECTS) $(srconv_LDADD) $(LIBS) - -sysdump$(EXEEXT): $(sysdump_OBJECTS) $(sysdump_DEPENDENCIES) - @rm -f sysdump$(EXEEXT) - $(LINK) $(sysdump_LDFLAGS) $(sysdump_OBJECTS) $(sysdump_LDADD) $(LIBS) - -coffdump$(EXEEXT): $(coffdump_OBJECTS) $(coffdump_DEPENDENCIES) - @rm -f coffdump$(EXEEXT) - $(LINK) $(coffdump_LDFLAGS) $(coffdump_OBJECTS) $(coffdump_LDADD) $(LIBS) - -dlltool$(EXEEXT): $(dlltool_OBJECTS) $(dlltool_DEPENDENCIES) - @rm -f dlltool$(EXEEXT) - $(LINK) $(dlltool_LDFLAGS) $(dlltool_OBJECTS) $(dlltool_LDADD) $(LIBS) - -windres$(EXEEXT): $(windres_OBJECTS) $(windres_DEPENDENCIES) - @rm -f windres$(EXEEXT) - $(LINK) $(windres_LDFLAGS) $(windres_OBJECTS) $(windres_LDADD) $(LIBS) - -dllwrap$(EXEEXT): $(dllwrap_OBJECTS) $(dllwrap_DEPENDENCIES) - @rm -f dllwrap$(EXEEXT) - $(LINK) $(dllwrap_LDFLAGS) $(dllwrap_OBJECTS) $(dllwrap_LDADD) $(LIBS) - -size$(EXEEXT): $(size_OBJECTS) $(size_DEPENDENCIES) - @rm -f size$(EXEEXT) - $(LINK) $(size_LDFLAGS) $(size_OBJECTS) $(size_LDADD) $(LIBS) - -objdump$(EXEEXT): $(objdump_OBJECTS) $(objdump_DEPENDENCIES) - @rm -f objdump$(EXEEXT) - $(LINK) $(objdump_LDFLAGS) $(objdump_OBJECTS) $(objdump_LDADD) $(LIBS) - -ar$(EXEEXT): $(ar_OBJECTS) $(ar_DEPENDENCIES) - @rm -f ar$(EXEEXT) - $(LINK) $(ar_LDFLAGS) $(ar_OBJECTS) $(ar_LDADD) $(LIBS) - -strings$(EXEEXT): $(strings_OBJECTS) $(strings_DEPENDENCIES) - @rm -f strings$(EXEEXT) - $(LINK) $(strings_LDFLAGS) $(strings_OBJECTS) $(strings_LDADD) $(LIBS) - -ranlib$(EXEEXT): $(ranlib_OBJECTS) $(ranlib_DEPENDENCIES) - @rm -f ranlib$(EXEEXT) - $(LINK) $(ranlib_LDFLAGS) $(ranlib_OBJECTS) $(ranlib_LDADD) $(LIBS) - -objcopy$(EXEEXT): $(objcopy_OBJECTS) $(objcopy_DEPENDENCIES) - @rm -f objcopy$(EXEEXT) - $(LINK) $(objcopy_LDFLAGS) $(objcopy_OBJECTS) $(objcopy_LDADD) $(LIBS) - -addr2line$(EXEEXT): $(addr2line_OBJECTS) $(addr2line_DEPENDENCIES) - @rm -f addr2line$(EXEEXT) - $(LINK) $(addr2line_LDFLAGS) $(addr2line_OBJECTS) $(addr2line_LDADD) $(LIBS) - -readelf$(EXEEXT): $(readelf_OBJECTS) $(readelf_DEPENDENCIES) - @rm -f readelf$(EXEEXT) - $(LINK) $(readelf_LDFLAGS) $(readelf_OBJECTS) $(readelf_LDADD) $(LIBS) - -nm-new$(EXEEXT): $(nm_new_OBJECTS) $(nm_new_DEPENDENCIES) - @rm -f nm-new$(EXEEXT) - $(LINK) $(nm_new_LDFLAGS) $(nm_new_OBJECTS) $(nm_new_LDADD) $(LIBS) - -strip-new$(EXEEXT): $(strip_new_OBJECTS) $(strip_new_DEPENDENCIES) - @rm -f strip-new$(EXEEXT) - $(LINK) $(strip_new_LDFLAGS) $(strip_new_OBJECTS) $(strip_new_LDADD) $(LIBS) - -cxxfilt$(EXEEXT): $(cxxfilt_OBJECTS) $(cxxfilt_DEPENDENCIES) - @rm -f cxxfilt$(EXEEXT) - $(LINK) $(cxxfilt_LDFLAGS) $(cxxfilt_OBJECTS) $(cxxfilt_LDADD) $(LIBS) -.l.c: - $(SHELL) $(YLWRAP) "$(LEX)" $< $(LEX_OUTPUT_ROOT).c $@ -- $(AM_LFLAGS) $(LFLAGS) -.y.c: - $(SHELL) $(YLWRAP) "$(YACC)" $< y.tab.c $*.c y.tab.h $*.h -- $(AM_YFLAGS) $(YFLAGS) -arparse.h: arparse.c -defparse.h: defparse.c -nlmheader.h: nlmheader.c -rcparse.h: rcparse.c - - -binutils.info: binutils.texi -binutils.dvi: binutils.texi - - -DVIPS = dvips - -.texi.info: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< - -.texi.dvi: - TEXINPUTS=$(top_srcdir)/../texinfo/texinfo.tex:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.texi: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< - -.texinfo.info: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< - -.texinfo: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< - -.texinfo.dvi: - TEXINPUTS=$(top_srcdir)/../texinfo/texinfo.tex:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.txi.info: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< - -.txi.dvi: - TEXINPUTS=$(top_srcdir)/../texinfo/texinfo.tex:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.txi: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< -.dvi.ps: - $(DVIPS) $< -o $@ - -install-info-am: $(INFO_DEPS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(infodir) - @list='$(INFO_DEPS)'; \ - for file in $$list; do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ - for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \ - if test -f $$d/$$ifile; then \ - echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \ - $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \ - else : ; fi; \ - done; \ - done - @$(POST_INSTALL) - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\ - install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\ - done; \ - else : ; fi - -uninstall-info: - $(PRE_UNINSTALL) - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - ii=yes; \ - else ii=; fi; \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - test -z "$ii" \ - || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \ - done - @$(NORMAL_UNINSTALL) - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - (cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \ - done - -dist-info: $(INFO_DEPS) - list='$(INFO_DEPS)'; \ - for base in $$list; do \ - if test -f $$base; then d=.; else d=$(srcdir); fi; \ - for file in `cd $$d && eval echo $$base*`; do \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file; \ - done; \ - done - -mostlyclean-aminfo: - -rm -f binutils.aux binutils.cp binutils.cps binutils.dvi binutils.fn \ - binutils.fns binutils.ky binutils.kys binutils.ps \ - binutils.log binutils.pg binutils.toc binutils.tp \ - binutils.tps binutils.vr binutils.vrs binutils.op binutils.tr \ - binutils.cv binutils.cn - -clean-aminfo: - -distclean-aminfo: - -maintainer-clean-aminfo: - for i in $(INFO_DEPS); do \ - rm -f $$i; \ - if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \ - rm -f $$i-[0-9]*; \ - fi; \ - done -clean-info: mostlyclean-aminfo - -install-man1: - $(mkinstalldirs) $(DESTDIR)$(man1dir) - @list='$(man1_MANS)'; \ - l2='$(man_MANS)'; for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ - $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ - done - -uninstall-man1: - @list='$(man1_MANS)'; \ - l2='$(man_MANS)'; for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ - rm -f $(DESTDIR)$(man1dir)/$$inst; \ - done -install-man: $(MANS) - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-man1 -uninstall-man: - @$(NORMAL_UNINSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. - -@SET_MAKE@ - -all-recursive install-data-recursive install-exec-recursive \ -installdirs-recursive install-recursive uninstall-recursive install-info-recursive \ -check-recursive installcheck-recursive info-recursive dvi-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ - rev="$$subdir $$rev"; \ - test "$$subdir" = "." && dot_seen=yes; \ - done; \ - test "$$dot_seen" = "no" && rev=". $$rev"; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: tags-recursive $(HEADERS) $(SOURCES) config.in $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)config.in$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.in $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - -rm -rf $(distdir) - GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz - mkdir $(distdir)/=build - mkdir $(distdir)/=inst - dc_install_base=`cd $(distdir)/=inst && pwd`; \ - cd $(distdir)/=build \ - && ../configure --srcdir=.. --prefix=$$dc_install_base \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) dist - -rm -rf $(distdir) - @banner="$(distdir).tar.gz is ready for distribution"; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes" -dist: distdir - -chmod -R a+r $(distdir) - GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) - -rm -rf $(distdir) -dist-all: distdir - -chmod -R a+r $(distdir) - GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) - -rm -rf $(distdir) -distdir: $(DISTFILES) - -rm -rf $(distdir) - mkdir $(distdir) - -chmod 777 $(distdir) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - cp -pr $$d/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done - for subdir in $(SUBDIRS); do \ - if test "$$subdir" = .; then :; else \ - test -d $(distdir)/$$subdir \ - || mkdir $(distdir)/$$subdir \ - || exit 1; \ - chmod 777 $(distdir)/$$subdir; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ - || exit 1; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info - -RUNTESTFLAGS = - -DEJATOOL = $(PACKAGE) - -RUNTESTDEFAULTFLAGS = --tool $(DEJATOOL) --srcdir $$srcdir -site.exp: Makefile - @echo 'Making a new site.exp file...' - @test ! -f site.bak || rm -f site.bak - @echo '## these variables are automatically generated by make ##' > $@-t - @echo '# Do not edit here. If you wish to override these values' >> $@-t - @echo '# edit the last section' >> $@-t - @echo 'set tool $(DEJATOOL)' >> $@-t - @echo 'set srcdir $(srcdir)' >> $@-t - @echo 'set objdir' `pwd` >> $@-t - @echo 'set host_alias $(host_alias)' >> $@-t - @echo 'set host_triplet $(host_triplet)' >> $@-t - @echo 'set target_alias $(target_alias)' >> $@-t - @echo 'set target_triplet $(target_triplet)' >> $@-t - @echo 'set build_alias $(build_alias)' >> $@-t - @echo 'set build_triplet $(build_triplet)' >> $@-t - @echo '## All variables above are generated by configure. Do Not Edit ##' >> $@-t - @test ! -f site.exp || sed '1,/^## All variables above are.*##/ d' site.exp >> $@-t - @test ! -f site.exp || mv site.exp site.bak - @mv $@-t site.exp -info-am: $(INFO_DEPS) -info: info-recursive -dvi-am: $(DVIS) -dvi: dvi-recursive -check-am: - $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU -check: check-recursive -installcheck-am: -installcheck: installcheck-recursive -install-info-am: -install-info: install-info-recursive -all-recursive-am: config.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -install-exec-am: install-binPROGRAMS install-exec-local -install-exec: install-exec-recursive - -install-data-am: install-man -install-data: install-data-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-recursive -uninstall-am: uninstall-binPROGRAMS uninstall-man -uninstall: uninstall-recursive -all-am: Makefile $(PROGRAMS) $(MANS) config.h -all-redirect: all-recursive-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: installdirs-recursive -installdirs-am: - $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(mandir)/man1 - - -mostlyclean-generic: - -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - -test -z "arlexldeflexlrclexlarparseharparsecdefparsehdefparsecnlmheaderhnlmheadercrcparsehrcparsec$(MAINTAINERCLEANFILES)" || rm -f arlexl deflexl rclexl arparseh arparsec defparseh defparsec nlmheaderh nlmheaderc rcparseh rcparsec $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \ - mostlyclean-noinstPROGRAMS mostlyclean-compile \ - mostlyclean-libtool mostlyclean-aminfo mostlyclean-tags \ - mostlyclean-generic mostlyclean-local - -mostlyclean: mostlyclean-recursive - -clean-am: clean-hdr clean-binPROGRAMS clean-noinstPROGRAMS \ - clean-compile clean-libtool clean-aminfo clean-tags \ - clean-generic mostlyclean-am - -clean: clean-recursive - -distclean-am: distclean-hdr distclean-binPROGRAMS \ - distclean-noinstPROGRAMS distclean-compile \ - distclean-libtool distclean-aminfo distclean-tags \ - distclean-generic clean-am - -rm -f libtool - -distclean: distclean-recursive - -rm -f config.status - -maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \ - maintainer-clean-noinstPROGRAMS \ - maintainer-clean-compile maintainer-clean-libtool \ - maintainer-clean-aminfo maintainer-clean-tags \ - maintainer-clean-generic distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-recursive - -rm -f config.status - -.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ -mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ -maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ -mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \ -clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile mostlyclean-libtool distclean-libtool \ -clean-libtool maintainer-clean-libtool install-info-am uninstall-info \ -mostlyclean-aminfo distclean-aminfo clean-aminfo \ -maintainer-clean-aminfo install-man1 uninstall-man1 install-man \ -uninstall-man install-data-recursive uninstall-data-recursive \ -install-exec-recursive uninstall-exec-recursive installdirs-recursive \ -uninstalldirs-recursive all-recursive check-recursive \ -installcheck-recursive info-recursive dvi-recursive \ -mostlyclean-recursive distclean-recursive clean-recursive \ -maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ -distclean-tags clean-tags maintainer-clean-tags distdir check-DEJAGNU \ -info-am info dvi-am dvi check check-am installcheck-am installcheck \ -install-info-am install-info all-recursive-am install-exec-local \ -install-exec-am install-exec install-data-am install-data install-am \ -install uninstall-am uninstall all-redirect all-am all installdirs-am \ -installdirs mostlyclean-generic distclean-generic clean-generic \ -maintainer-clean-generic clean mostlyclean distclean maintainer-clean - -po/POTFILES.in: @MAINT@ Makefile - for file in $(POTFILES); do echo $$file; done | sort > tmp \ - && mv tmp $(srcdir)/po/POTFILES.in - -check-DEJAGNU: site.exp - srcdir=`cd $(srcdir) && pwd`; export srcdir; \ - r=`pwd`; export r; \ - EXPECT=$(EXPECT); export EXPECT; \ - if [ -f $(top_builddir)/../expect/expect ]; then \ - TCL_LIBRARY=`cd $(top_srcdir)/../tcl/library && pwd`; \ - export TCL_LIBRARY; \ - fi; \ - runtest=$(RUNTEST); \ - if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ - $$runtest --tool $(DEJATOOL) --srcdir $${srcdir}/testsuite \ - CC_FOR_TARGET="$(CC_FOR_TARGET)" \ - CFLAGS_FOR_TARGET="$(CFLAGS)" $(RUNTESTFLAGS); \ - else echo "WARNING: could not find \`runtest'" 1>&2; :;\ - fi - -installcheck: - /bin/sh $(srcdir)/sanity.sh $(bindir) - -underscore.c: stamp-under ; @true - -stamp-under: Makefile - echo '/*WARNING: This file is automatically generated!*/' >underscore.t - echo "int prepends_underscore = @UNDERSCORE@;" >>underscore.t - $(SHELL) $(srcdir)/../move-if-change underscore.t underscore.c - touch stamp-under - -cplus-dem.o: $(BASEDIR)/libiberty/cplus-dem.c $(INCDIR)/getopt.h - $(COMPILE) -c -DMAIN -DVERSION='"$(VERSION)"' $(BASEDIR)/libiberty/cplus-dem.c - -# The following is commented out for the conversion to automake. -# This rule creates a single binary that switches between ar and ranlib -# by looking at argv[0]. Use this kludge to save some disk space. -# However, you have to install things by hand. -# (That is after 'make install', replace the installed ranlib by a link to ar.) -# Alternatively, you can install ranlib.sh as ranlib. -# ar_with_ranlib: $(ADDL_DEPS) ar.o maybe-ranlib.o -# $(HLDENV) $(CC) $(HLDFLAGS) $(CFLAGS) $(LDFLAGS) -o $(AR_PROG) ar.o maybe-ranlib.o $(ADDL_LIBS) $(EXTRALIBS) -# -rm -f $(RANLIB_PROG) -# -ln $(AR_PROG) $(RANLIB_PROG) -# -# objcopy and strip in one binary that uses argv[0] to decide its action. -# -#objcopy_with_strip: $(ADDL_DEPS) objcopy.o maybe-strip.o -# $(HLDENV) $(CC) $(HLDFLAGS) $(CFLAGS) $(LDFLAGS) -o $(OBJCOPY_PROG) objcopy.o maybe-strip.o $(ADDL_LIBS) $(EXTRALIBS) -# -rm -f $(STRIP_PROG) -# -ln $(OBJCOPY_PROG) $(STRIP_PROG) - -sysroff.c: sysinfo$(EXEEXT_FOR_BUILD) sysroff.info - ./sysinfo$(EXEEXT_FOR_BUILD) -c <$(srcdir)/sysroff.info >sysroff.c - ./sysinfo$(EXEEXT_FOR_BUILD) -i <$(srcdir)/sysroff.info >>sysroff.c - ./sysinfo$(EXEEXT_FOR_BUILD) -g <$(srcdir)/sysroff.info >>sysroff.c - -sysroff.h: sysinfo$(EXEEXT_FOR_BUILD) sysroff.info - ./sysinfo$(EXEEXT_FOR_BUILD) -d <$(srcdir)/sysroff.info >sysroff.h - -sysinfo$(EXEEXT_FOR_BUILD): sysinfo.o syslex.o - $(CC_FOR_BUILD) $(CFLAGS) $(LDFLAGS) -o $@ sysinfo.o syslex.o - -syslex.o: syslex.c sysinfo.h - if [ -r syslex.c ]; then \ - $(CC_FOR_BUILD) -c -I. $(CFLAGS) syslex.c ; \ - else \ - $(CC_FOR_BUILD) -c -I. -I$(srcdir) $(CFLAGS) $(srcdir)/syslex.c ;\ - fi - -sysinfo.o: sysinfo.c - if [ -r sysinfo.c ]; then \ - $(CC_FOR_BUILD) -c -I. $(CFLAGS) sysinfo.c ; \ - else \ - $(CC_FOR_BUILD) -c -I. $(CFLAGS) $(srcdir)/sysinfo.c ; \ - fi - -# We need these for parallel make. -arparse.h: arparse.c -defparse.h: defparse.c -nlmheader.h: nlmheader.c -rcparse.h: rcparse.c -sysinfo.h: sysinfo.c - -dlltool.o:dlltool.c - $(COMPILE) -c $(DLLTOOL_DEFS) $(srcdir)/dlltool.c - -rescoff.o:rescoff.c - $(COMPILE) -c $(DLLTOOL_DEFS) $(srcdir)/rescoff.c - -# coff/sym.h and coff/ecoff.h won't be found by the automatic dependency -# scripts, since they are only included conditionally. -nlmconv.o: nlmconv.c $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h - ldname=`echo ld | sed '$(transform)'`; \ - $(COMPILE) -c -DLD_NAME="\"$${ldname}\"" @NLMCONV_DEFS@ $(srcdir)/nlmconv.c - -diststuff: $(DISTSTUFF) info - -# Targets to rebuild dependencies in this Makefile. -# Have to get rid of DEP1 here so that "$?" later includes all of $(CFILES). -DEP: dep.sed $(CFILES) $(HFILES) $(GENERATED_CFILES) $(GENERATED_HFILES) config.h - rm -f DEP1 - $(MAKE) MKDEP="$(MKDEP)" DEP1 - sed -f dep.sed < DEP1 > $@ - echo '# IF YOU PUT ANYTHING HERE IT WILL GO AWAY' >> $@ - -DEP1: $(CFILES) $(GENERATED_CFILES) - echo '# DO NOT DELETE THIS LINE -- mkdep uses it.' > DEP2 - echo '# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.' >> DEP2 - $(MKDEP) $(INCLUDES) $(CFLAGS) $? >> DEP2 - mv -f DEP2 $@ - -dep.sed: dep-in.sed config.status - objdir=`pwd`; \ - sed <$(srcdir)/dep-in.sed >dep.sed \ - -e 's!@INCDIR@!$(INCDIR)!' \ - -e 's!@BFDDIR@!$(BFDDIR)!' \ - -e 's!@SRCDIR@!$(srcdir)!' \ - -e "s!@OBJDIR@!$${objdir}!" - -dep: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < Makefile > tmp-Makefile - cat DEP >> tmp-Makefile - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile Makefile - -dep-in: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < $(srcdir)/Makefile.in > tmp-Makefile.in - cat DEP >> tmp-Makefile.in - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile.in $(srcdir)/Makefile.in - -dep-am: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < $(srcdir)/Makefile.am > tmp-Makefile.am - cat DEP >> tmp-Makefile.am - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile.am $(srcdir)/Makefile.am - -.PHONY: dep dep-in dep-am - -### -# DOCUMENTATION TARGETS -config.texi: Makefile - rm -f config.texi - echo '@set VERSION $(VERSION)' > config.texi - -binutils.dvi: $(srcdir)/binutils.texi config.texi - -binutils.info: $(srcdir)/binutils.texi config.texi - -$(DEMANGLER_NAME).1: cxxfilt.man Makefile - sed -e 's/@PROGRAM@/$(DEMANGLER_NAME)/' < $(srcdir)/cxxfilt.man \ - > $(DEMANGLER_NAME).1 -mostlyclean-local: - -rm -rf tmpdir - -.PHONY: install-exec-local - -install-exec-local: install-binPROGRAMS $(bin_PROGRAMS) $(noinst_PROGRAMS) - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed -e 's/$(EXEEXT)$$//' -e 's/-new//' -e 's/cxxfilt/$(DEMANGLER_NAME)/'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed -e 's/$(EXEEXT)$$//' -e 's/-new//' -e 's/cxxfilt/$(DEMANGLER_NAME)/'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - else :; fi; \ - done - $(mkinstalldirs) $(tooldir)/bin - for i in $(TOOL_PROGS); do \ - if [ -f $$i$(EXEEXT) ]; then \ - j=`echo $$i | sed -e 's/-new//'`; \ - k=`echo $$j | sed '$(transform)'`; \ - if [ "$(bindir)/$$k$(EXEEXT)" != "$(tooldir)/bin/$$j$(EXEEXT)" ]; then \ - rm -f $(tooldir)/bin/$$j$(EXEEXT); \ - ln $(bindir)/$$k$(EXEEXT) $(tooldir)/bin/$$j$(EXEEXT) >/dev/null 2>/dev/null \ - || $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$i$(EXEEXT) $(tooldir)/bin/$$j$(EXEEXT); \ - fi; \ - else true; \ - fi; \ - done - -# What appears below is generated by a hacked mkdep using gcc -MM. - -# DO NOT DELETE THIS LINE -- mkdep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. -addr2line.o: addr2line.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/getopt.h $(INCDIR)/libiberty.h $(INCDIR)/demangle.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -ar.o: ar.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h \ - $(INCDIR)/progress.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/aout/ar.h $(BFDDIR)/libbfd.h \ - arsup.h -arsup.o: arsup.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - arsup.h $(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h -bucomm.o: bucomm.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h -coffdump.o: coffdump.c coffgrok.h bucomm.h config.h \ - $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -coffgrok.o: coffgrok.c bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h coffgrok.h -debug.o: debug.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h debug.h -dlltool.o: dlltool.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/demangle.h dyn-string.h \ - dlltool.h -filemode.o: filemode.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -ieee.o: ieee.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/ieee.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h debug.h budbg.h -is-ranlib.o: is-ranlib.c -is-strip.o: is-strip.c -maybe-ranlib.o: maybe-ranlib.c -maybe-strip.o: maybe-strip.c -nlmconv.o: nlmconv.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(BFDDIR)/libnlm.h $(INCDIR)/nlm/common.h \ - $(INCDIR)/nlm/internal.h $(INCDIR)/nlm/external.h nlmconv.h -nm.o: nm.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/progress.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/aout/ranlib.h \ - $(INCDIR)/demangle.h $(INCDIR)/libiberty.h -not-ranlib.o: not-ranlib.c -not-strip.o: not-strip.c -objcopy.o: objcopy.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/progress.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h budbg.h -objdump.o: objdump.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/getopt.h $(INCDIR)/progress.h bucomm.h config.h \ - $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h $(INCDIR)/dis-asm.h \ - $(INCDIR)/libiberty.h $(INCDIR)/demangle.h debug.h \ - budbg.h $(INCDIR)/aout/aout64.h -prdbg.o: prdbg.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h debug.h budbg.h -rdcoff.o: rdcoff.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/coff/internal.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h $(INCDIR)/demangle.h \ - debug.h budbg.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -rddbg.o: rddbg.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h debug.h budbg.h -size.o: size.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/getopt.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h -srconv.o: srconv.c bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h sysroff.h coffgrok.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h sysroff.c -stabs.o: stabs.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h $(INCDIR)/demangle.h debug.h \ - budbg.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def -strings.o: strings.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h -sysdump.o: sysdump.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - sysroff.h sysroff.c -version.o: version.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -wrstabs.o: wrstabs.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h debug.h budbg.h $(INCDIR)/aout/aout64.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def -windres.o: windres.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/getopt.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h $(INCDIR)/obstack.h \ - windres.h winduni.h -resrc.o: resrc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h -rescoff.o: rescoff.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -resbin.o: resbin.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h -winduni.o: winduni.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - winduni.h -readelf.o: readelf.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/dwarf2.h $(INCDIR)/elf/i386.h $(INCDIR)/elf/reloc-macros.h \ - $(INCDIR)/elf/v850.h $(INCDIR)/elf/ppc.h $(INCDIR)/elf/mips.h \ - $(INCDIR)/elf/alpha.h $(INCDIR)/elf/arm.h $(INCDIR)/elf/m68k.h \ - $(INCDIR)/elf/sparc.h $(INCDIR)/elf/m32r.h $(INCDIR)/elf/d10v.h \ - $(INCDIR)/elf/d30v.h $(INCDIR)/elf/sh.h $(INCDIR)/elf/mn10200.h \ - $(INCDIR)/elf/mn10300.h $(INCDIR)/elf/hppa.h $(INCDIR)/elf/arc.h \ - $(INCDIR)/elf/fr30.h $(INCDIR)/elf/mcore.h $(INCDIR)/elf/i960.h \ - $(INCDIR)/elf/pj.h $(INCDIR)/elf/avr.h bucomm.h config.h \ - $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -resres.o: resres.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h -dyn-string.o: dyn-string.c config.h $(INCDIR)/ansidecl.h \ - dyn-string.h -dllwrap.o: dllwrap.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - $(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/bin-bugs.h \ - $(INCDIR)/fopen-same.h dyn-string.h -rename.o: rename.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h -underscore.o: underscore.c -arparse.o: arparse.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - arsup.h -arlex.o: arlex.c $(INCDIR)/libiberty.h arparse.h -sysroff.o: sysroff.c -sysinfo.o: sysinfo.c -syslex.o: syslex.c sysinfo.h -defparse.o: defparse.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - dlltool.h -deflex.o: deflex.c $(INCDIR)/libiberty.h $(INCDIR)/ansidecl.h \ - defparse.h dlltool.h -nlmheader.o: nlmheader.c ../bfd/bfd.h bucomm.h config.h \ - $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h $(INCDIR)/nlm/common.h \ - $(INCDIR)/nlm/internal.h nlmconv.h -rcparse.o: rcparse.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h -rclex.o: rclex.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \ - bucomm.h config.h $(INCDIR)/bin-bugs.h $(INCDIR)/fopen-same.h \ - $(INCDIR)/libiberty.h windres.h winduni.h rcparse.h -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/binutils/NEWS b/binutils/NEWS deleted file mode 100644 index 746c2cc3d4c..00000000000 --- a/binutils/NEWS +++ /dev/null @@ -1,177 +0,0 @@ --*- text -*- - -Changes in binutils 2.10: - -* New command line switch to objdump --file-start-context which shows the - entire file contents up to the source line first encountered for a given - file. - -* New command line switch to objdump -M (or --disassembler-options) which takes - a parameter which can then be interpreted on a per-target basis by the - disassembler. Used by ARM targets to select register name sets, ISA, APCS or - raw verions. - -* objdump support for -mi386:intel which causes disassembly to be displayed - with intel syntax. - -* New program: readelf. This displays the contents of ELF format files, - regardless of target machine. - -* objcopy now takes --change-section-lma, --change-section-vma, and - --change-section-address options. The old --adjust-section-vma option is - equivalent to --change-section-address. The other --adjust-* options are now - renamed to --change-*, although --adjust-* continues to work. - -* objcopy has a --redefine-sym option that lets you rename symbols. - -* objcopy now takes a -j/--only-section option to copy only the specified - sections. - -* dlltool now supports the IMPORTS command. - -* dlltool now takes --export-all-symbols, --no-export-all-symbols, - --exclude-symbols, and --no-default-excludes options. - -Changes in binutils 2.9: - -* Added windres program, which can be used to manipulate resources in WIN32 - files as used on Windows 95 and Windows NT. - -* The objcopy --gap-fill and --pad-to options operate on the LMA rather than - the VMA of the sections. - -* Added S modifier to ar to not build a symbol table. - -Changes in binutils 2.8: - -* The objdump disassembly format has been changed, and hopefully improved. Use - the new --prefix-addresses option to get the old format. There are also new - --disassemble-zeroes and --no-show-raw-insn options which affect disassembler - output. - -* Formats may now be specified as configuration triplets. For example, - objdump -b i386-pc-linux. The triplets are not passed through config.sub, - so they must be in canonical form. - -* Added new addr2line program. This uses the debugging information to convert - an address into a file name and line number within a program. - -* Added --change-leading-char argument to objcopy. - -* Added --weaken argument to objcopy. - -* objdump --dynamic-reloc now works on ELF executables and shared libraries. - -* Added --adjust-vma option to objdump. - -* Added -C/--demangle option to objdump. - -* Added -p/--preserve-dates option to strip and objcopy. - -Changes in binutils 2.7: - -* Added --enable-shared and --enable-commonbfdlib options to configure. - -* Added --debugging argument to objdump and objcopy. - -* Added --defined-only argument to nm. - -* Added --remove-leading-char argument to objcopy. - -* The objdump --line-numbers option is now meaningful with --reloc. - -* Added --line-numbers option to nm. - -* Added --endian/-EB/-EL option to objdump. - -* Added support for Alpha OpenVMS/AXP. - -Changes in binutils 2.6: - -* Added -N/--strip-symbol and -K/--keep-symbol arguments to strip and objcopy. - -* Added several arguments to objcopy to provide some control over how the new - file is laid out in memory. Also added binary output format to BFD to permit - generating plain binary files. - -* Added --start-address and --stop-address options to objdump. - -* ar and ranlib now work on AIX. The tools are now built by default on AIX. - -Changes in binutils 2.5: - -* Changed objdump -dr to dump the relocs interspersed with the assembly - listing, for a more useful listing of relocateable files. - -* Changed objdump -d/--disassemble to only disassemble SEC_CODE sections. - Added -D/--disassemble-all option to disassemble all sections. - -* Added --size-sort option to nm. - -* strip and objcopy should now be able to handle dynamically linked ELF - executables. - -Changes in binutils 2.4: - -* Support for HP-PA (by Jeff Law), i386 Mach (by David Mackenzie), RS/6000 and - PowerPC (except ar and ranlib; by Ian Taylor). - -* Support for Irix 5. - -* Programs `strip' and `objcopy' will not attempt to write dynamically linked - ELF output files, since BFD currently can't create them properly. - -Changes in binutils 2.3: - -* A new --stabs argument has been added to objdump to dump stabs sections in - ELF and COFF files. - -* A new program, nlmconv, has been added. It can convert object files into - Novell NetWare Loadable Modules. - -* The strings program has been added. - -Changes in binutils 2.2: - -* The 'copy' program has been renamed to 'objcopy', for consistency with - 'objdump', and because 'copy' might more plausibly be used as a synonym for - 'cp'. - -* The new stand-alone program c++filt is a filter that converts encoded - (mangled) C++ assembly-level identifiers to user-level names. (Note: This - may get moved to the gcc distribution.) - -* nm -o on an archive now prefixes each line with the archive name, matching - the output from BSD nm. - -* ar (and ld) can now read (but not write) BSD4.4-style archives. - -* New support for H8500, Z8000, and the Hitach SH. - -* Dis-assembler interface changed to allow sharing with gdb. - -* There is new Elf code, but it is not yet ready for general use. - -* There is the beginnings of a test suite. - -Changes in binutils 2.1: - -* There is now support for writing ECOFF files, so ld and the other utilities - should work on Risc/Ultrix and Irix. Please let us know how well this works. - -* ar now automatically creates a symbol table (a __.SYMDEF member, in the BSD - version), if there are any object files in the archive. So running ranlib is - now redundant (unless the non-standard q command is used). This is required - for Posix.2 conformance. - -* The archive-reading code now reads both BSD-style and SYSV-style archives - independently of the selected target format. This is to encourage people to - switch to SYSV-format, which has a number of advantages. - -* The strip and copy programs now have options to remove debug-symbols only - and/or local symbols only. They now also support long options. - - -Local variables: -fill-column: 79 -End: diff --git a/binutils/README b/binutils/README deleted file mode 100644 index 4b2d2772449..00000000000 --- a/binutils/README +++ /dev/null @@ -1,189 +0,0 @@ -These are the GNU binutils. These are utilities of use when dealing -with object files. - -The linker (ld) is in a separate directory, which should be ../ld. -Linker-specific notes are in ../ld/README. - -As of version 2.5, the assembler (as) is also included in this package, in -../gas. Assembler-specific notes can be found in ../gas/README. - -Recent changes are in ./NEWS, ../ld/NEWS, and ../gas/NEWS. - -Unpacking and Installation -- quick overview -============================================ - -When you unpack the binutils-2.9.tar.gz file, you'll get a directory -called something like `binutils-2.9', which contains various files and -directories. Most of the files in the top directory are for -information and for configuration. The actual source code is in -subdirectories. - -To build binutils, you can just do: - - cd binutils-2.9 - ./configure [options] - make - make install # copies the programs files into /usr/local/bin - # by default. - -This will configure and build all the libraries as well as the -assembler, the binutils, and the linker. - -If you have GNU make, we recommend building in a different directory: - - mkdir objdir - cd objdir - ../binutils-2.9/configure [options] - make - make install - -This relies on the VPATH feature of GNU make. - -By default, the binutils will be configured to support the system on -which they are built. When doing cross development, use the --target -configure option to specify a different target. - -The --enable-targets option adds support for more binary file formats -besides the default. List them as the argument to --enable-targets, -separated by commas. For example: - - ./configure --enable-targets=sun3,rs6000-aix,decstation - -The name 'all' compiles in support for all valid BFD targets (this was -the default in releases before 2.3): - - ./configure --enable-targets=all - -You can also specify the --enable-shared option when you run -configure. This will build the BFD and opcodes libraries as shared -libraries. You can use arguments with the --enable-shared option to -indicate that only certain libraries should be built shared; for -example, --enable-shared=bfd. The only potential shared libraries in -a binutils release are bfd and opcodes. - -The binutils will be linked against the shared libraries. The build -step will attempt to place the correct library in the runtime search -path for the binaries. However, in some cases, after you install the -binaries, you may have to set an environment variable, normally -LD_LIBRARY_PATH, so that the system can find the installed libbfd -shared library. - -To build under openVMS/AXP, see the file makefile.vms in the top level -directory. - -If you don't have ar -==================== - -If your system does not already have an ar program, the normal -binutils build process will not work. In this case, run configure as -usual. Before running make, run this script: - -#!/bin/sh -MAKE_PROG="${MAKE-make}" -MAKE="${MAKE_PROG} AR=true LINK=true" -export MAKE -${MAKE} $* all-libiberty -${MAKE} $* all-intl -${MAKE} $* all-bfd -cd binutils -MAKE="${MAKE_PROG}" -export MAKE -${MAKE} $* ar_DEPENDENCIES= ar_LDADD='../bfd/*.o `cat ../libiberty/required-list ../libiberty/needed-list | sed -e "s,\([^ ][^ ]*\),../libiberty/\1,g"` `if test -f ../intl/gettext.o; then echo '../intl/*.o'; fi`' ar - -This script will build an ar program in binutils/ar. Move binutils/ar -into a directory on your PATH. After doing this, you can run make as -usual to build the complete binutils distribution. You do not need -the ranlib program in order to build the distribution. - -Porting -======= - -Binutils-2.9 supports many different architectures, but there -are many more not supported, including some that were supported -by earlier versions. We are hoping for volunteers to -improve this situation. - -The major effort in porting binutils to a new host and/or target -architecture involves the BFD library. There is some documentation -in ../bfd/doc. The file ../gdb/doc/gdbint.texinfo (distributed -with gdb-4.x) may also be of help. - -Reporting bugs -============== - -Send bug reports and patches to bug-gnu-utils@gnu.org. Always mention -the version number you are running; this is printed by running any of -the binutils with the --version option. We appreciate reports about -bugs, but we do not promise to fix them. - -VMS -=== - -This section was written by Klaus K"ampf . It -describes how to build and install the binutils on openVMS (Alpha and -Vax). (The BFD library only supports reading Vax object files.) - -Compiling the release: - -To compile the gnu binary utilities and the gnu assembler, you'll -need DEC C or GNU C for openVMS/Alpha. You'll need *both* compilers -on openVMS/Vax. - -Compiling with either DEC C or GNU C works on openVMS/Alpha only. Some -of the opcodes and binutils files trap a bug in the DEC C optimizer, -so these files must be compiled with /noopt. - -Compiling on openVMS/Vax is a bit complicated, as the bfd library traps -a bug in GNU C and the gnu assembler a bug in (my version of) DEC C. - -I never tried compiling with VAX C. - - -You further need GNU Make Version 3.76 or later. This is available -at ftp.progis.de or any GNU archive site. The makefiles assume that -gmake starts gnu make as a foreign command. - -If you're compiling with DEC C or VAX C, you must run - - $ @setup - -before starting gnu-make. This isn't needed with GNU C. - -On the Alpha you can choose the compiler by editing the toplevel -makefile.vms. Either select CC=cc (for DEC C) or CC=gcc (for GNU C) - - -Installing the release - -Provided that your directory setup conforms to the GNU on openVMS -standard, you already have a concealed deviced named 'GNU_ROOT'. -In this case, a simple - - $ gmake install - -suffices to copy all programs and libraries to the proper directories. - -Define the programs as foreign commands by adding these lines to your -login.com: - - $ gas :== $GNU_ROOT:[bin]as.exe - $ size :== $GNU_ROOT:[bin]size.exe - $ nm :== $GNU_ROOT:[bin]nm.exe - $ objdump :== $GNU_ROOT:[bin]objdump.exe - $ strings :== $GNU_ROOT:[bin]strings.exe - -If you have a different directory setup, copy the binary utilities -([.binutils]size.exe, [.binutils]nm.exe, [.binutils]objdump.exe, -and [.binutils]strings.exe) and the gnu assembler and preprocessor -([.gas]as.exe and [.gas]gasp.exe]) to a directory of your choice -and define all programs as foreign commands. - - -If you're satiesfied with the compilation, you may want to remove -unneeded objects and libraries: - - $ gmake clean - - -If you have any problems or questions about the binutils on VMS, feel -free to mail me at kkaempf@rmi.de. diff --git a/binutils/acinclude.m4 b/binutils/acinclude.m4 deleted file mode 100644 index 71b09b9f6ac..00000000000 --- a/binutils/acinclude.m4 +++ /dev/null @@ -1 +0,0 @@ -sinclude(../bfd/acinclude.m4) diff --git a/binutils/aclocal.m4 b/binutils/aclocal.m4 deleted file mode 100644 index 2d62d712078..00000000000 --- a/binutils/aclocal.m4 +++ /dev/null @@ -1,925 +0,0 @@ -dnl aclocal.m4 generated automatically by aclocal 1.4 - -dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without -dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. - -sinclude(../bfd/acinclude.m4) - -# Do all the work for Automake. This macro actually does too much -- -# some checks are only needed if your package does certain things. -# But this isn't really a big deal. - -# serial 1 - -dnl Usage: -dnl AM_INIT_AUTOMAKE(package,version, [no-define]) - -AC_DEFUN(AM_INIT_AUTOMAKE, -[AC_REQUIRE([AC_PROG_INSTALL]) -PACKAGE=[$1] -AC_SUBST(PACKAGE) -VERSION=[$2] -AC_SUBST(VERSION) -dnl test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi -ifelse([$3],, -AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) -AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) -AC_REQUIRE([AM_SANITY_CHECK]) -AC_REQUIRE([AC_ARG_PROGRAM]) -dnl FIXME This is truly gross. -missing_dir=`cd $ac_aux_dir && pwd` -AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) -AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) -AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) -AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) -AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) -AC_REQUIRE([AC_PROG_MAKE_SET])]) - -# -# Check to make sure that the build environment is sane. -# - -AC_DEFUN(AM_SANITY_CHECK, -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "[$]*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "[$]*" != "X $srcdir/configure conftestfile" \ - && test "[$]*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "[$]2" = conftestfile - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -rm -f conftest* -AC_MSG_RESULT(yes)]) - -dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) -dnl The program must properly implement --version. -AC_DEFUN(AM_MISSING_PROG, -[AC_MSG_CHECKING(for working $2) -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if ($2 --version) < /dev/null > /dev/null 2>&1; then - $1=$2 - AC_MSG_RESULT(found) -else - $1="$3/missing $2" - AC_MSG_RESULT(missing) -fi -AC_SUBST($1)]) - - -# serial 40 AC_PROG_LIBTOOL -AC_DEFUN(AC_PROG_LIBTOOL, -[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl - -# Save cache, so that ltconfig can load it -AC_CACHE_SAVE - -# Actually configure libtool. ac_aux_dir is where install-sh is found. -CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ -LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ -LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ -DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ -${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ -$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ -|| AC_MSG_ERROR([libtool configure failed]) - -# Reload cache, that may have been modified by ltconfig -AC_CACHE_LOAD - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -# Redirect the config.log output again, so that the ltconfig log is not -# clobbered by the next message. -exec 5>>./config.log -]) - -AC_DEFUN(AC_LIBTOOL_SETUP, -[AC_PREREQ(2.13)dnl -AC_REQUIRE([AC_ENABLE_SHARED])dnl -AC_REQUIRE([AC_ENABLE_STATIC])dnl -AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([AC_PROG_RANLIB])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_LD])dnl -AC_REQUIRE([AC_PROG_NM])dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -dnl - -case "$target" in -NONE) lt_target="$host" ;; -*) lt_target="$target" ;; -esac - -# Check for any special flags to pass to ltconfig. -libtool_flags="--cache-file=$cache_file" -test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" -test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" -test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" -test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" -test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" -ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], -[libtool_flags="$libtool_flags --enable-dlopen"]) -ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], -[libtool_flags="$libtool_flags --enable-win32-dll"]) -AC_ARG_ENABLE(libtool-lock, - [ --disable-libtool-lock avoid locking (might break parallel builds)]) -test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" -test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case "$lt_target" in -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; - -ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], -[*-*-cygwin* | *-*-mingw*) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -]) -esac -]) - -# AC_LIBTOOL_DLOPEN - enable checks for dlopen support -AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) - -# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's -AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) - -# AC_ENABLE_SHARED - implement the --enable-shared flag -# Usage: AC_ENABLE_SHARED[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_SHARED, [dnl -define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(shared, -changequote(<<, >>)dnl -<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl -]) - -# AC_DISABLE_SHARED - set the default shared flag to --disable-shared -AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_SHARED(no)]) - -# AC_ENABLE_STATIC - implement the --enable-static flag -# Usage: AC_ENABLE_STATIC[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_STATIC, [dnl -define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(static, -changequote(<<, >>)dnl -<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_static=AC_ENABLE_STATIC_DEFAULT)dnl -]) - -# AC_DISABLE_STATIC - set the default static flag to --disable-static -AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_STATIC(no)]) - - -# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag -# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl -define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(fast-install, -changequote(<<, >>)dnl -<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_fast_install=yes ;; -no) enable_fast_install=no ;; -*) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl -]) - -# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install -AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_FAST_INSTALL(no)]) - -# AC_PROG_LD - find the path to the GNU or non-GNU linker -AC_DEFUN(AC_PROG_LD, -[AC_ARG_WITH(gnu-ld, -[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], -test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -ac_prog=ld -if test "$ac_cv_prog_gcc" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by GCC]) - ac_prog=`($CC -print-prog-name=ld) 2>&5` - case "$ac_prog" in - # Accept absolute paths. -changequote(,)dnl - [\\/]* | [A-Za-z]:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' -changequote([,])dnl - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(ac_cv_path_LD, -[if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - ac_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - ac_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$ac_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) -else - AC_MSG_RESULT(no) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -AC_PROG_LD_GNU -]) - -AC_DEFUN(AC_PROG_LD_GNU, -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi]) -]) - -# AC_PROG_NM - find the path to a BSD-compatible name lister -AC_DEFUN(AC_PROG_NM, -[AC_MSG_CHECKING([for BSD-compatible nm]) -AC_CACHE_VAL(ac_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - ac_cv_path_NM="$NM" -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -B" - break - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -p" - break - else - ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm -fi]) -NM="$ac_cv_path_NM" -AC_MSG_RESULT([$NM]) -]) - -# AC_CHECK_LIBM - check for math library -AC_DEFUN(AC_CHECK_LIBM, -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case "$lt_target" in -*-*-beos* | *-*-cygwin*) - # These system don't have libm - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, main, LIBM="-lm") - ;; -esac -]) - -# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for -# the libltdl convenience library, adds --enable-ltdl-convenience to -# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor -# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed -# to be `${top_builddir}/libltdl'. Make sure you start DIR with -# '${top_builddir}/' (note the single quotes!) if your package is not -# flat, and, if you're not using automake, define top_builddir as -# appropriate in the Makefiles. -AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - case "$enable_ltdl_convenience" in - no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; - "") enable_ltdl_convenience=yes - ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; - esac - LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la - INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) -]) - -# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for -# the libltdl installable library, and adds --enable-ltdl-install to -# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor -# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed -# to be `${top_builddir}/libltdl'. Make sure you start DIR with -# '${top_builddir}/' (note the single quotes!) if your package is not -# flat, and, if you're not using automake, define top_builddir as -# appropriate in the Makefiles. -# In the future, this macro may have to be called after AC_PROG_LIBTOOL. -AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - AC_CHECK_LIB(ltdl, main, - [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], - [if test x"$enable_ltdl_install" = xno; then - AC_MSG_WARN([libltdl not installed, but installation disabled]) - else - enable_ltdl_install=yes - fi - ]) - if test x"$enable_ltdl_install" = x"yes"; then - ac_configure_args="$ac_configure_args --enable-ltdl-install" - LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la - INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) - else - ac_configure_args="$ac_configure_args --enable-ltdl-install=no" - LIBLTDL="-lltdl" - INCLTDL= - fi -]) - -dnl old names -AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl -AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl -AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl -AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl -AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl -AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl -AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl - -dnl This is just to silence aclocal about the macro not being used -ifelse([AC_DISABLE_FAST_INSTALL])dnl - -# Like AC_CONFIG_HEADER, but automatically create stamp file. - -AC_DEFUN(AM_CONFIG_HEADER, -[AC_PREREQ([2.12]) -AC_CONFIG_HEADER([$1]) -dnl When config.status generates a header, we must update the stamp-h file. -dnl This file resides in the same directory as the config header -dnl that is generated. We must strip everything past the first ":", -dnl and everything past the last "/". -AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl -ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, -<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, -<>; do - case " <<$>>CONFIG_HEADERS " in - *" <<$>>am_file "*<<)>> - echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx - ;; - esac - am_indx=`expr "<<$>>am_indx" + 1` -done<<>>dnl>>) -changequote([,]))]) - - -dnl AM_PROG_LEX -dnl Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT -AC_DEFUN(AM_PROG_LEX, -[missing_dir=ifelse([$1],,`cd $ac_aux_dir && pwd`,$1) -AC_CHECK_PROGS(LEX, flex lex, "$missing_dir/missing flex") -AC_PROG_LEX -AC_DECL_YYTEXT]) - -# This file is derived from `gettext.m4'. The difference is that the -# included macros assume Cygnus-style source and build trees. - -# Macro to add for using GNU gettext. -# Ulrich Drepper , 1995. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 3 - -AC_DEFUN(CY_WITH_NLS, - [AC_MSG_CHECKING([whether NLS is requested]) - dnl Default is enabled NLS - AC_ARG_ENABLE(nls, - [ --disable-nls do not use Native Language Support], - USE_NLS=$enableval, USE_NLS=yes) - AC_MSG_RESULT($USE_NLS) - AC_SUBST(USE_NLS) - - USE_INCLUDED_LIBINTL=no - - dnl If we use NLS figure out what method - if test "$USE_NLS" = "yes"; then - AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if NLS is requested]) - AC_MSG_CHECKING([whether included gettext is requested]) - AC_ARG_WITH(included-gettext, - [ --with-included-gettext use the GNU gettext library included here], - nls_cv_force_use_gnu_gettext=$withval, - nls_cv_force_use_gnu_gettext=no) - AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) - - nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" - if test "$nls_cv_force_use_gnu_gettext" != "yes"; then - dnl User does not insist on using GNU NLS library. Figure out what - dnl to use. If gettext or catgets are available (in this order) we - dnl use this. Else we have to fall back to GNU NLS library. - dnl catgets is only used if permitted by option --with-catgets. - nls_cv_header_intl= - nls_cv_header_libgt= - CATOBJEXT=NONE - - AC_CHECK_HEADER(libintl.h, - [AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc, - [AC_TRY_LINK([#include ], [return (int) gettext ("")], - gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)]) - - if test "$gt_cv_func_gettext_libc" != "yes"; then - AC_CHECK_LIB(intl, bindtextdomain, - [AC_CACHE_CHECK([for gettext in libintl], - gt_cv_func_gettext_libintl, - [AC_TRY_LINK([], [return (int) gettext ("")], - gt_cv_func_gettext_libintl=yes, - gt_cv_func_gettext_libintl=no)])]) - fi - - if test "$gt_cv_func_gettext_libc" = "yes" \ - || test "$gt_cv_func_gettext_libintl" = "yes"; then - AC_DEFINE(HAVE_GETTEXT, 1, - [Define as 1 if you have gettext and don't want to use GNU gettext.]) - AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl - if test "$MSGFMT" != "no"; then - AC_CHECK_FUNCS(dcgettext) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; - return _nl_msg_cat_cntr], - [CATOBJEXT=.gmo - DATADIRNAME=share], - [CATOBJEXT=.mo - DATADIRNAME=lib]) - INSTOBJEXT=.mo - fi - fi - ]) - - dnl In the standard gettext, we would now check for catgets. - dnl However, we never want to use catgets for our releases. - - if test "$CATOBJEXT" = "NONE"; then - dnl Neither gettext nor catgets in included in the C library. - dnl Fall back on GNU gettext library. - nls_cv_use_gnu_gettext=yes - fi - fi - - if test "$nls_cv_use_gnu_gettext" = "yes"; then - dnl Mark actions used to generate GNU NLS library. - INTLOBJS="\$(GETTOBJS)" - AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - AC_SUBST(MSGFMT) - USE_INCLUDED_LIBINTL=yes - CATOBJEXT=.gmo - INSTOBJEXT=.mo - DATADIRNAME=share - INTLDEPS='$(top_builddir)/../intl/libintl.a' - INTLLIBS=$INTLDEPS - LIBS=`echo $LIBS | sed -e 's/-lintl//'` - nls_cv_header_intl=libintl.h - nls_cv_header_libgt=libgettext.h - fi - - dnl Test whether we really found GNU xgettext. - if test "$XGETTEXT" != ":"; then - dnl If it is no GNU xgettext we define it as : so that the - dnl Makefiles still can work. - if $XGETTEXT --omit-header /dev/null 2> /dev/null; then - : ; - else - AC_MSG_RESULT( - [found xgettext programs is not GNU xgettext; ignore it]) - XGETTEXT=":" - fi - fi - - # We need to process the po/ directory. - POSUB=po - else - DATADIRNAME=share - nls_cv_header_intl=libintl.h - nls_cv_header_libgt=libgettext.h - fi - - # If this is used in GNU gettext we have to set USE_NLS to `yes' - # because some of the sources are only built for this goal. - if test "$PACKAGE" = gettext; then - USE_NLS=yes - USE_INCLUDED_LIBINTL=yes - fi - - dnl These rules are solely for the distribution goal. While doing this - dnl we only have to keep exactly one list of the available catalogs - dnl in configure.in. - for lang in $ALL_LINGUAS; do - GMOFILES="$GMOFILES $lang.gmo" - POFILES="$POFILES $lang.po" - done - - dnl Make all variables we use known to autoconf. - AC_SUBST(USE_INCLUDED_LIBINTL) - AC_SUBST(CATALOGS) - AC_SUBST(CATOBJEXT) - AC_SUBST(DATADIRNAME) - AC_SUBST(GMOFILES) - AC_SUBST(INSTOBJEXT) - AC_SUBST(INTLDEPS) - AC_SUBST(INTLLIBS) - AC_SUBST(INTLOBJS) - AC_SUBST(POFILES) - AC_SUBST(POSUB) - ]) - -AC_DEFUN(CY_GNU_GETTEXT, - [AC_REQUIRE([AC_PROG_MAKE_SET])dnl - AC_REQUIRE([AC_PROG_CC])dnl - AC_REQUIRE([AC_PROG_RANLIB])dnl - AC_REQUIRE([AC_ISC_POSIX])dnl - AC_REQUIRE([AC_HEADER_STDC])dnl - AC_REQUIRE([AC_C_CONST])dnl - AC_REQUIRE([AC_C_INLINE])dnl - AC_REQUIRE([AC_TYPE_OFF_T])dnl - AC_REQUIRE([AC_TYPE_SIZE_T])dnl - AC_REQUIRE([AC_FUNC_ALLOCA])dnl - AC_REQUIRE([AC_FUNC_MMAP])dnl - - AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \ -unistd.h values.h sys/param.h]) - AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \ -__argz_count __argz_stringify __argz_next]) - - if test "${ac_cv_func_stpcpy+set}" != "set"; then - AC_CHECK_FUNCS(stpcpy) - fi - if test "${ac_cv_func_stpcpy}" = "yes"; then - AC_DEFINE(HAVE_STPCPY, 1, [Define if you have the stpcpy function]) - fi - - AM_LC_MESSAGES - CY_WITH_NLS - - if test "x$CATOBJEXT" != "x"; then - if test "x$ALL_LINGUAS" = "x"; then - LINGUAS= - else - AC_MSG_CHECKING(for catalogs to be installed) - NEW_LINGUAS= - for lang in ${LINGUAS=$ALL_LINGUAS}; do - case "$ALL_LINGUAS" in - *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; - esac - done - LINGUAS=$NEW_LINGUAS - AC_MSG_RESULT($LINGUAS) - fi - - dnl Construct list of names of catalog files to be constructed. - if test -n "$LINGUAS"; then - for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done - fi - fi - - dnl The reference to in the installed file - dnl must be resolved because we cannot expect the users of this - dnl to define HAVE_LOCALE_H. - if test $ac_cv_header_locale_h = yes; then - INCLUDE_LOCALE_H="#include " - else - INCLUDE_LOCALE_H="\ -/* The system does not provide the header . Take care yourself. */" - fi - AC_SUBST(INCLUDE_LOCALE_H) - - dnl Determine which catalog format we have (if any is needed) - dnl For now we know about two different formats: - dnl Linux libc-5 and the normal X/Open format - if test -f $srcdir/po2tbl.sed.in; then - if test "$CATOBJEXT" = ".cat"; then - AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen) - - dnl Transform the SED scripts while copying because some dumb SEDs - dnl cannot handle comments. - sed -e '/^#/d' $srcdir/$msgformat-msg.sed > po2msg.sed - fi - dnl po2tbl.sed is always needed. - sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ - $srcdir/po2tbl.sed.in > po2tbl.sed - fi - - dnl In the intl/Makefile.in we have a special dependency which makes - dnl only sense for gettext. We comment this out for non-gettext - dnl packages. - if test "$PACKAGE" = "gettext"; then - GT_NO="#NO#" - GT_YES= - else - GT_NO= - GT_YES="#YES#" - fi - AC_SUBST(GT_NO) - AC_SUBST(GT_YES) - - MKINSTALLDIRS="\$(srcdir)/../../mkinstalldirs" - AC_SUBST(MKINSTALLDIRS) - - dnl *** For now the libtool support in intl/Makefile is not for real. - l= - AC_SUBST(l) - - dnl Generate list of files to be processed by xgettext which will - dnl be included in po/Makefile. But only do this if the po directory - dnl exists in srcdir. - if test -d $srcdir/po; then - test -d po || mkdir po - if test "x$srcdir" != "x."; then - if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then - posrcprefix="$srcdir/" - else - posrcprefix="../$srcdir/" - fi - else - posrcprefix="../" - fi - rm -f po/POTFILES - sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ - < $srcdir/po/POTFILES.in > po/POTFILES - fi - ]) - -# Search path for a program which passes the given test. -# Ulrich Drepper , 1996. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 1 - -dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, -dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) -AC_DEFUN(AM_PATH_PROG_WITH_TEST, -[# Extract the first word of "$2", so it can be a program name with args. -set dummy $2; ac_word=[$]2 -AC_MSG_CHECKING([for $ac_word]) -AC_CACHE_VAL(ac_cv_path_$1, -[case "[$]$1" in - /*) - ac_cv_path_$1="[$]$1" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in ifelse([$5], , $PATH, [$5]); do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if [$3]; then - ac_cv_path_$1="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" -dnl If no 4th arg is given, leave the cache variable unset, -dnl so AC_PATH_PROGS will keep looking. -ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" -])dnl - ;; -esac])dnl -$1="$ac_cv_path_$1" -if test -n "[$]$1"; then - AC_MSG_RESULT([$]$1) -else - AC_MSG_RESULT(no) -fi -AC_SUBST($1)dnl -]) - -# Check whether LC_MESSAGES is available in . -# Ulrich Drepper , 1995. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 1 - -AC_DEFUN(AM_LC_MESSAGES, - [if test $ac_cv_header_locale_h = yes; then - AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, - [AC_TRY_LINK([#include ], [return LC_MESSAGES], - am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) - if test $am_cv_val_LC_MESSAGES = yes; then - AC_DEFINE(HAVE_LC_MESSAGES, 1, - [Define if your locale.h file contains LC_MESSAGES.]) - fi - fi]) - -# Add --enable-maintainer-mode option to configure. -# From Jim Meyering - -# serial 1 - -AC_DEFUN(AM_MAINTAINER_MODE, -[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) - dnl maintainer-mode is disabled by default - AC_ARG_ENABLE(maintainer-mode, -[ --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer], - USE_MAINTAINER_MODE=$enableval, - USE_MAINTAINER_MODE=no) - AC_MSG_RESULT($USE_MAINTAINER_MODE) - AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes) - MAINT=$MAINTAINER_MODE_TRUE - AC_SUBST(MAINT)dnl -] -) - -# Define a conditional. - -AC_DEFUN(AM_CONDITIONAL, -[AC_SUBST($1_TRUE) -AC_SUBST($1_FALSE) -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi]) - diff --git a/binutils/addr2line.1 b/binutils/addr2line.1 deleted file mode 100644 index 87ce103f8e3..00000000000 --- a/binutils/addr2line.1 +++ /dev/null @@ -1,127 +0,0 @@ -.\" Copyright (c) 1997 Free Software Foundation -.\" See COPYING for conditions for redistribution -.TH addr2line 1 "27 March 1997" "Cygnus Solutions" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -addr2line \- convert addresses into file names and line numbers - -.SH SYNOPSIS -.hy 0 -.na -.TP -.B addr2line -.RB "[\|" "\-b\ "\c -.I bfdname\c -.RB " | " "\-\-target="\c -.I bfdname\c -\&\|] -.RB "[\|" \-C | \-\-demangle "\|]" -.RB "[\|" "\-e\ "\c -.I filename\c -.RB " | " "\-\-exe="\c -.I filename\c -\&\|] -.RB "[\|" \-f | \-\-functions "\|]" -.RB "[\|" \-s | \-\-basenames "\|]" -.RB "[\|" \-H | \-\-help "\|]" -.RB "[\|" \-V | \-\-version "\|]" -.RB "[\|" addr addr ... "\|]" -.ad b -.hy 1 -.SH DESCRIPTION -\c -.B addr2line -translates program addresses into file names and line numbers. Given -an address and an executable, it uses the debugging information in the -executable to figure out which file name and line number are -associated with a given address. - -The executable to use is specified with the -.B \-e -option. The default is -.B a.out\c -\&. - -.B addr2line -has two modes of operation. - -In the first, hexadecimal addresses are specified on the command line, -and -.B addr2line -displays the file name and line number for each address. - -In the second, -.B addr2line -reads hexadecimal addresses from standard input, and prints the file -name and line number for each address on standard output. In this -mode, -.B 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 address is printed on a separate line. If the -.B \-f -option is used, then each FILENAME:LINENO line is preceded by a -FUNCTIONNAME line which is the name of the function containing the -address. - -If the file name or function name can not be determined, -.B addr2line -will print two question marks in their place. If the line number can -not be determined, -.B addr2line -will print 0. - -.SH OPTIONS -.TP -.BI "\-b " "bfdname"\c -.TP -.BI "\-\-target=" "bfdname" -Specify the object-code format for the object files to be -\c -.I bfdname\c -\&. - -.TP -.B \-C -.TP -.B \-\-demangle -Decode (\fIdemangle\fP) low-level symbol names into user-level names. -Besides removing any initial underscore prepended by the system, this -makes C++ function names readable. - -.TP -.BI "\-e " "filename"\c -.TP -.BI "\-\-exe=" "filename" -Specify the name of the executable for which addresses should be -translated. The default file is -.B a.out\c -\&. - -.TP -.B \-f -.TP -.B \-\-functions -Display function names as well as file and line number information. - -.TP -.B \-s -.TP -.B \-\-basenames -Display only the base of each file name. - -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.B -info\c -\&; -.I -The GNU Binary Utilities\c -\&, Roland H. Pesch (October 1991). diff --git a/binutils/addr2line.c b/binutils/addr2line.c deleted file mode 100644 index 20c7eef437c..00000000000 --- a/binutils/addr2line.c +++ /dev/null @@ -1,335 +0,0 @@ -/* addr2line.c -- convert addresses to line number and function name - Copyright 1997, 98, 99, 2000 Free Software Foundation, Inc. - Contributed by Ulrich Lauther - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Derived from objdump.c and nm.c by Ulrich.Lauther@zfe.siemens.de - - Usage: - addr2line [options] addr addr ... - or - addr2line [options] - - both forms write results to stdout, the second form reads addresses - to be converted from stdin. */ - -#include -#include - -#include "bfd.h" -#include "getopt.h" -#include "libiberty.h" -#include "demangle.h" -#include "bucomm.h" - -extern char *program_version; - -static boolean with_functions; /* -f, show function names. */ -static boolean do_demangle; /* -C, demangle names. */ -static boolean base_names; /* -s, strip directory names. */ - -static int naddr; /* Number of addresses to process. */ -static char **addr; /* Hex addresses to process. */ - -static asymbol **syms; /* Symbol table. */ - -static struct option long_options[] = -{ - {"basenames", no_argument, NULL, 's'}, - {"demangle", no_argument, NULL, 'C'}, - {"exe", required_argument, NULL, 'e'}, - {"functions", no_argument, NULL, 'f'}, - {"target", required_argument, NULL, 'b'}, - {"help", no_argument, NULL, 'H'}, - {"version", no_argument, NULL, 'V'}, - {0, no_argument, 0, 0} -}; - -static void usage PARAMS ((FILE *, int)); -static void slurp_symtab PARAMS ((bfd *)); -static void find_address_in_section PARAMS ((bfd *, asection *, PTR)); -static void translate_addresses PARAMS ((bfd *)); -static void process_file PARAMS ((const char *, const char *)); - -/* Print a usage message to STREAM and exit with STATUS. */ - -static void -usage (stream, status) - FILE *stream; - int status; -{ - fprintf (stream, _("\ -Usage: %s [-CfsHV] [-b bfdname] [--target=bfdname]\n\ - [-e executable] [--exe=executable] [--demangle]\n\ - [--basenames] [--functions] [addr addr ...]\n"), - program_name); - list_supported_targets (program_name, stream); - if (status == 0) - fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); - exit (status); -} - -/* Read in the symbol table. */ - -static void -slurp_symtab (abfd) - bfd *abfd; -{ - long storage; - long symcount; - - if ((bfd_get_file_flags (abfd) & HAS_SYMS) == 0) - return; - - storage = bfd_get_symtab_upper_bound (abfd); - if (storage < 0) - bfd_fatal (bfd_get_filename (abfd)); - - syms = (asymbol **) xmalloc (storage); - - symcount = bfd_canonicalize_symtab (abfd, syms); - if (symcount < 0) - bfd_fatal (bfd_get_filename (abfd)); -} - -/* These global variables are used to pass information between - translate_addresses and find_address_in_section. */ - -static bfd_vma pc; -static const char *filename; -static const char *functionname; -static unsigned int line; -static boolean found; - -/* Look for an address in a section. This is called via - bfd_map_over_sections. */ - -static void -find_address_in_section (abfd, section, data) - bfd *abfd; - asection *section; - PTR data ATTRIBUTE_UNUSED; -{ - bfd_vma vma; - bfd_size_type size; - - if (found) - return; - - if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0) - return; - - vma = bfd_get_section_vma (abfd, section); - if (pc < vma) - return; - - size = bfd_get_section_size_before_reloc (section); - if (pc >= vma + size) - return; - - found = bfd_find_nearest_line (abfd, section, syms, pc - vma, - &filename, &functionname, &line); -} - -/* Read hexadecimal addresses from stdin, translate into - file_name:line_number and optionally function name. */ - -static void -translate_addresses (abfd) - bfd *abfd; -{ - int read_stdin = (naddr == 0); - - for (;;) - { - if (read_stdin) - { - char addr_hex[100]; - - if (fgets (addr_hex, sizeof addr_hex, stdin) == NULL) - break; - pc = bfd_scan_vma (addr_hex, NULL, 16); - } - else - { - if (naddr <= 0) - break; - --naddr; - pc = bfd_scan_vma (*addr++, NULL, 16); - } - - found = false; - bfd_map_over_sections (abfd, find_address_in_section, (PTR) NULL); - - if (! found) - { - if (with_functions) - printf ("??\n"); - printf ("??:0\n"); - } - else - { - if (with_functions) - { - if (functionname == NULL || *functionname == '\0') - printf ("??\n"); - else if (! do_demangle) - printf ("%s\n", functionname); - else - { - char *res; - - res = cplus_demangle (functionname, DMGL_ANSI | DMGL_PARAMS); - if (res == NULL) - printf ("%s\n", functionname); - else - { - printf ("%s\n", res); - free (res); - } - } - } - - if (base_names && filename != NULL) - { - char *h; - - h = strrchr (filename, '/'); - if (h != NULL) - filename = h + 1; - } - - printf ("%s:%u\n", filename ? filename : "??", line); - } - - /* fflush() is essential for using this command as a server - child process that reads addresses from a pipe and responds - with line number information, processing one address at a - time. */ - fflush (stdout); - } -} - -/* Process a file. */ - -static void -process_file (filename, target) - const char *filename; - const char *target; -{ - bfd *abfd; - char **matching; - - abfd = bfd_openr (filename, target); - if (abfd == NULL) - bfd_fatal (filename); - - if (bfd_check_format (abfd, bfd_archive)) - fatal (_("%s: can not get addresses from archive"), filename); - - if (! bfd_check_format_matches (abfd, bfd_object, &matching)) - { - bfd_nonfatal (bfd_get_filename (abfd)); - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } - xexit (1); - } - - slurp_symtab (abfd); - - translate_addresses (abfd); - - if (syms != NULL) - { - free (syms); - syms = NULL; - } - - bfd_close (abfd); -} - -int -main (argc, argv) - int argc; - char **argv; -{ - char *filename; - char *target; - int c; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = *argv; - xmalloc_set_program_name (program_name); - - bfd_init (); - set_default_bfd_target (); - - filename = NULL; - target = NULL; - while ((c = getopt_long (argc, argv, "b:Ce:sfHV", long_options, (int *) 0)) - != EOF) - { - switch (c) - { - case 0: - break; /* we've been given a long option */ - case 'b': - target = optarg; - break; - case 'C': - do_demangle = true; - break; - case 'e': - filename = optarg; - break; - case 's': - base_names = true; - break; - case 'f': - with_functions = true; - break; - case 'V': - print_version ("addr2line"); - break; - case 'H': - usage (stdout, 0); - break; - default: - usage (stderr, 1); - break; - } - } - - if (filename == NULL) - filename = "a.out"; - - addr = argv + optind; - naddr = argc - optind; - - process_file (filename, target); - - return 0; -} diff --git a/binutils/ar.1 b/binutils/ar.1 deleted file mode 100644 index cd71a407b37..00000000000 --- a/binutils/ar.1 +++ /dev/null @@ -1,533 +0,0 @@ -.\" Copyright (c) 1991, 1992, 1993, 1995, 1998, 1999 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH ar 1 "1999" "Cygnus Solutions" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -ar \- create, modify, and extract from archives. - -.SH SYNOPSIS -.hy 0 -.na -.BR ar " [\|" "-" "\|]"\c -.I {dmpqrtx}[abcfilNoPsSuvV] \c -[\|\c -.I membername\c -\&\|] \c -[\|\c -.I count\c -\&\|] \c -.I archive\c -\& \c -.I files\c -\&.\|.\|. - -.ad b -.hy 1 -.SH DESCRIPTION -The GNU \c -.B ar\c -\& program creates, modifies, and extracts from -archives. An \c -.I archive\c -\& is a single file holding a collection of -other files in a structure that makes it possible to retrieve -the original individual files (called \c -.I members\c -\& of the archive). - -The original files' contents, mode (permissions), timestamp, owner, and -group are preserved in the archive, and may be reconstituted on -extraction. - -GNU \c -.B ar\c -\& can maintain archives whose members have names of any -length; however, depending on how \c -.B ar\c -\& 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). - -\c -.B ar\c -\& is considered a binary utility because archives of this sort -are most often used as \c -.I libraries\c -\& holding commonly needed -subroutines. - -\c -.B ar\c -\& will create an index to the symbols defined in relocatable -object modules in the archive when you specify the modifier `\|\c -.B s\c -\|'. -Once created, this index is updated in the archive whenever \c -.B ar\c -\& -makes a change to its contents (save for the `\|\c -.B q\c -\|' 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. - -You may use `\|\c -.B nm \-s\c -\|' or `\|\c -.B nm \-\-print\-armap\c -\|' to list this index -table. If an archive lacks the table, another form of \c -.B ar\c -\& called -\c -.B ranlib\c -\& can be used to add just the table. - -\c -.B ar\c -\& insists on at least two arguments to execute: one -keyletter specifying the \c -.I operation\c -\& (optionally accompanied by other -keyletters specifying \c -.I modifiers\c -\&), and the archive name to act on. - -Most operations can also accept further \c -.I files\c -\& arguments, -specifying particular files to operate on. - -.SH OPTIONS -GNU \c -.B ar\c -\& allows you to mix the operation code \c -.I p\c -\& and modifier -flags \c -.I mod\c -\& in any order, within the first command-line argument. - -If you wish, you may begin the first command-line argument with a -dash. - -The \c -.I p\c -\& keyletter specifies what operation to execute; it may be -any of the following, but you must specify only one of them: - -.TP -.B d -\c -.I Delete\c -\& modules from the archive. Specify the names of modules to -be deleted as \c -.I files\c -\&; the archive is untouched if you -specify no files to delete. - -If you specify the `\|\c -.B v\c -\|' modifier, \c -.B ar\c -\& will list each module -as it is deleted. - -.TP -.B m -Use this operation to \c -.I move\c -\& members in an archive. - -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. - -If no modifiers are used with \c -.B m\c -\&, any members you name in the -\c -.I files\c -\& arguments are moved to the \c -.I end\c -\& of the archive; -you can use the `\|\c -.B a\c -\|', `\|\c -.B b\c -\|', or `\|\c -.B i\c -\|' modifiers to move them to a -specified place instead. - -.TP -.B p -\c -.I Print\c -\& the specified members of the archive, to the standard -output file. If the `\|\c -.B v\c -\|' modifier is specified, show the member -name before copying its contents to standard output. - -If you specify no \c -.I files\c -\&, all the files in the archive are printed. - -.TP -.B q -\c -.I Quick append\c -\&; add \c -.I files\c -\& to the end of \c -.I archive\c -\&, -without checking for replacement. - -The modifiers `\|\c -.B a\c -\|', `\|\c -.B b\c -\|', and `\|\c -.B i\c -\|' do \c -.I not\c -\& affect this -operation; new members are always placed at the end of the archive. - -The modifier `\|\c -.B v\c -\|' makes \c -.B ar\c -\& list each file as it is appended. - -Since the point of this operation is speed, the archive's symbol table -index is not updated, even if it already existed; you can use `\|\c -.B ar s\c -\|' or -\c -.B ranlib\c -\& explicitly to update the symbol table index. - -However, too many different systems assume quick append rebuilds the -index, so GNU -.B ar -implements `\|\c -.B q\c -\|' as a synonym for `\|\c -.B r\c -\|'. - -.TP -.B r -Insert \c -.I files\c -\& into \c -.I archive\c -\& (with \c -.I replacement\c -\&). This -operation differs from `\|\c -.B q\c -\|' in that any previously existing members -are deleted if their names match those being added. - -If one of the files named in \c -.I files\c -\& doesn't exist, \c -.B ar\c -\& -displays an error message, and leaves undisturbed any existing members -of the archive matching that name. - -By default, new members are added at the end of the file; but you may -use one of the modifiers `\|\c -.B a\c -\|', `\|\c -.B b\c -\|', or `\|\c -.B i\c -\|' to request -placement relative to some existing member. - -The modifier `\|\c -.B v\c -\|' used with this operation elicits a line of -output for each file inserted, along with one of the letters `\|\c -.B a\c -\|' or -`\|\c -.B r\c -\|' to indicate whether the file was appended (no old member -deleted) or replaced. - -.TP -.B t -Display a \c -.I table\c -\& listing the contents of \c -.I archive\c -\&, or those -of the files listed in \c -.I files\c -\& 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 `\|\c -.B v\c -\|' modifier. - -If you do not specify any \c -.I files\c -\&, all files in the archive -are listed. - -If there is more than one file with the same name (say, `\|\c -.B fie\c -\|') in -an archive (say `\|\c -.B b.a\c -\|'), `\|\c -.B ar t b.a fie\c -\|' will list only the -first instance; to see them all, you must ask for a complete -listing\(em\&in our example, `\|\c -.B ar t b.a\c -\|'. - -.TP -.B x -\c -.I Extract\c -\& members (named \c -.I files\c -\&) from the archive. You can -use the `\|\c -.B v\c -\|' modifier with this operation, to request that -\c -.B ar\c -\& list each name as it extracts it. - -If you do not specify any \c -.I files\c -\&, all files in the archive -are extracted. - -.PP - -A number of modifiers (\c -.I mod\c -\&) may immediately follow the \c -.I p\c -\& -keyletter, to specify variations on an operation's behavior: - -.TP -.B a -Add new files \c -.I after\c -\& an existing member of the -archive. If you use the modifier \c -.B a\c -\&, the name of an existing archive -member must be present as the \c -.I membername\c -\& argument, before the -\c -.I archive\c -\& specification. - -.TP -.B b -Add new files \c -.I before\c -\& an existing member of the -archive. If you use the modifier \c -.B b\c -\&, the name of an existing archive -member must be present as the \c -.I membername\c -\& argument, before the -\c -.I archive\c -\& specification. (same as `\|\c -.B i\c -\|'). - -.TP -.B c -\c -.I Create\c -\& the archive. The specified \c -.I archive\c -\& is always -created if it didn't 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. - -.TP -.B f -Truncate names in the archive. -.B ar -will normally permit file names of any length. This will cause it to -create archives which are not compatible with the native -.B ar -program on some systems. If this is a concern, the -.B f -modifier may be used to truncate file names when putting them in the -archive. - -.TP -.B i -Insert new files \c -.I before\c -\& an existing member of the -archive. If you use the modifier \c -.B i\c -\&, the name of an existing archive -member must be present as the \c -.I membername\c -\& argument, before the -\c -.I archive\c -\& specification. (same as `\|\c -.B b\c -\|'). - -.TP -.B l -This modifier is accepted but not used. - -.TP -.B N -Uses the -.I count -parameter. This is used if there are multiple entries in the archive -with the same name. Extract or delete instance -.I count -of the given name from the archive. - -.TP -.B o -Preserve the \c -.I original\c -\& dates of members when extracting them. If -you do not specify this modifier, files extracted from the archive -will be stamped with the time of extraction. - -.TP -.B P -Use the full path name when matching names in the archive. -.B ar -can not create an archive with a full path name (such archives are not -POSIX complaint), but other archive creators can. This option will -cause -.B ar -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. - -.TP -.B 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 `\|\c -.B ar s\c -\|' on an -archive is equivalent to running `\|\c -.B ranlib\c -\|' on it. - -.TP -.B 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 -`\|\c -.B S\c -\|' modifier on the last execution of `\|\c -.B ar\c -\|', or you must run `\|\c -.B ranlib\c -\|' on the archive. - -.TP -.B u -Normally, \c -.B ar r\c -\&.\|.\|. inserts all files -listed into the archive. If you would like to insert \c -.I only\c -\& those -of the files you list that are newer than existing members of the same -names, use this modifier. The `\|\c -.B u\c -\|' modifier is allowed only for the -operation `\|\c -.B r\c -\|' (replace). In particular, the combination `\|\c -.B qu\c -\|' is -not allowed, since checking the timestamps would lose any speed -advantage from the operation `\|\c -.B q\c -\|'. - -.TP -.B v -This modifier requests the \c -.I verbose\c -\& version of an operation. Many -operations display additional information, such as filenames processed, -when the modifier `\|\c -.B v\c -\|' is appended. - -.TP -.B V -This modifier shows the version number of -.BR ar . - -.PP - -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.B -info\c -\&; -.I -The GNU Binary Utilities\c -, Roland H. Pesch (October 1991). -.BR nm ( 1 )\c -\&, -.BR ranlib ( 1 )\c -\&. - -.SH COPYING -Copyright (c) 1991, 1992, 1993, 1995, 1998, 1999 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/binutils/ar.c b/binutils/ar.c deleted file mode 100644 index 17388a49901..00000000000 --- a/binutils/ar.c +++ /dev/null @@ -1,1407 +0,0 @@ -/* ar.c - Archive modify and extract. - Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000 - 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* - Bugs: should use getopt the way tar does (complete w/optional -) and - should have long options too. GNU ar used to check file against filesystem - in quick_update and replace operations (would check mtime). Doesn't warn - when name truncated. No way to specify pos_end. Error messages should be - more consistant. -*/ -#include "bfd.h" -#include "libiberty.h" -#include "progress.h" -#include "bucomm.h" -#include "aout/ar.h" -#include "libbfd.h" -#include "arsup.h" -#include - -#ifdef __GO32___ -#define EXT_NAME_LEN 3 /* bufflen of addition to name if it's MS-DOS */ -#else -#define EXT_NAME_LEN 6 /* ditto for *NIX */ -#endif - -/* We need to open files in binary modes on system where that makes a - difference. */ -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -#define BUFSIZE 8192 - -/* Kludge declaration from BFD! This is ugly! FIXME! XXX */ - -struct ar_hdr * - bfd_special_undocumented_glue PARAMS ((bfd * abfd, const char *filename)); - -/* Static declarations */ - -static void -mri_emul PARAMS ((void)); - -static const char * -normalize PARAMS ((const char *, bfd *)); - -static void -remove_output PARAMS ((void)); - -static void -map_over_members PARAMS ((bfd *, void (*)(bfd *), char **, int)); - -static void -print_contents PARAMS ((bfd * member)); - -static void -delete_members PARAMS ((bfd *, char **files_to_delete)); - -#if 0 -static void -do_quick_append PARAMS ((const char *archive_filename, - char **files_to_append)); -#endif - -static void -move_members PARAMS ((bfd *, char **files_to_move)); - -static void -replace_members PARAMS ((bfd *, char **files_to_replace, boolean quick)); - -static void -print_descr PARAMS ((bfd * abfd)); - -static void -write_archive PARAMS ((bfd *)); - -static void -ranlib_only PARAMS ((const char *archname)); - -static void -ranlib_touch PARAMS ((const char *archname)); - -static void -usage PARAMS ((int)); - -/** Globals and flags */ - -int mri_mode; - -/* This flag distinguishes between ar and ranlib: - 1 means this is 'ranlib'; 0 means this is 'ar'. - -1 means if we should use argv[0] to decide. */ -extern int is_ranlib; - -/* Nonzero means don't warn about creating the archive file if necessary. */ -int silent_create = 0; - -/* Nonzero means describe each action performed. */ -int verbose = 0; - -/* Nonzero means preserve dates of members when extracting them. */ -int preserve_dates = 0; - -/* Nonzero means don't replace existing members whose dates are more recent - than the corresponding files. */ -int newer_only = 0; - -/* Controls the writing of an archive symbol table (in BSD: a __.SYMDEF - member). -1 means we've been explicitly asked to not write a symbol table; - +1 means we've been explictly asked to write it; - 0 is the default. - Traditionally, the default in BSD has been to not write the table. - However, for POSIX.2 compliance the default is now to write a symbol table - if any of the members are object files. */ -int write_armap = 0; - -/* Nonzero means it's the name of an existing member; position new or moved - files with respect to this one. */ -char *posname = NULL; - -/* Sez how to use `posname': pos_before means position before that member. - pos_after means position after that member. pos_end means always at end. - pos_default means default appropriately. For the latter two, `posname' - should also be zero. */ -enum pos - { - pos_default, pos_before, pos_after, pos_end - } postype = pos_default; - -static bfd ** -get_pos_bfd PARAMS ((bfd **, enum pos, const char *)); - -/* For extract/delete only. If COUNTED_NAME_MODE is true, we only - extract the COUNTED_NAME_COUNTER instance of that name. */ -static boolean counted_name_mode = 0; -static int counted_name_counter = 0; - -/* Whether to truncate names of files stored in the archive. */ -static boolean ar_truncate = false; - -/* Whether to use a full file name match when searching an archive. - This is convenient for archives created by the Microsoft lib - program. */ -static boolean full_pathname = false; - -int interactive = 0; - -static void -mri_emul () -{ - interactive = isatty (fileno (stdin)); - yyparse (); -} - -/* If COUNT is 0, then FUNCTION is called once on each entry. If nonzero, - COUNT is the length of the FILES chain; FUNCTION is called on each entry - whose name matches one in FILES. */ - -static void -map_over_members (arch, function, files, count) - bfd *arch; - void (*function) PARAMS ((bfd *)); - char **files; - int count; -{ - bfd *head; - int match_count; - - if (count == 0) - { - for (head = arch->next; head; head = head->next) - { - PROGRESS (1); - function (head); - } - return; - } - - /* This may appear to be a baroque way of accomplishing what we want. - However we have to iterate over the filenames in order to notice where - a filename is requested but does not exist in the archive. Ditto - mapping over each file each time -- we want to hack multiple - references. */ - - for (; count > 0; files++, count--) - { - boolean found = false; - - match_count = 0; - for (head = arch->next; head; head = head->next) - { - PROGRESS (1); - if (head->filename == NULL) - { - /* Some archive formats don't get the filenames filled in - until the elements are opened. */ - struct stat buf; - bfd_stat_arch_elt (head, &buf); - } - if ((head->filename != NULL) && - (!strcmp (normalize (*files, arch), head->filename))) - { - ++match_count; - if (counted_name_mode - && match_count != counted_name_counter) - { - /* Counting, and didn't match on count; go on to the - next one. */ - continue; - } - - found = true; - function (head); - } - } - if (!found) - /* xgettext:c-format */ - fprintf (stderr, _("no entry %s in archive\n"), *files); - } -} - -boolean operation_alters_arch = false; - -static void -usage (help) - int help; -{ - FILE *s; - - s = help ? stdout : stderr; - - if (! is_ranlib) - { - /* xgettext:c-format */ - fprintf (s, _("Usage: %s [-]{dmpqrstx}[abcfilNoPsSuvV] [member-name] [count] archive-file file...\n"), - program_name); - /* xgettext:c-format */ - fprintf (s, _(" %s -M [ abfd->xvec->ar_max_namelen) - { - char *s; - - /* Space leak. */ - s = (char *) xmalloc (abfd->xvec->ar_max_namelen + 1); - memcpy (s, filename, abfd->xvec->ar_max_namelen); - s[abfd->xvec->ar_max_namelen] = '\0'; - filename = s; - } - - return filename; -} - -/* Remove any output file. This is only called via xatexit. */ - -static const char *output_filename = NULL; -static FILE *output_file = NULL; -static bfd *output_bfd = NULL; - -static void -remove_output () -{ - if (output_filename != NULL) - { - if (output_bfd != NULL && output_bfd->iostream != NULL) - fclose ((FILE *) (output_bfd->iostream)); - if (output_file != NULL) - fclose (output_file); - unlink (output_filename); - } -} - -/* The option parsing should be in its own function. - It will be when I have getopt working. */ - -int -main (argc, argv) - int argc; - char **argv; -{ - char *arg_ptr; - char c; - enum - { - none = 0, delete, replace, print_table, - print_files, extract, move, quick_append - } operation = none; - int arg_index; - char **files; - int file_count; - char *inarch_filename; - int show_version; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = argv[0]; - xmalloc_set_program_name (program_name); - - if (is_ranlib < 0) - { - char *temp; - - temp = strrchr (program_name, '/'); - if (temp == NULL) - temp = program_name; - else - ++temp; - if (strlen (temp) >= 6 - && strcmp (temp + strlen (temp) - 6, "ranlib") == 0) - is_ranlib = 1; - else - is_ranlib = 0; - } - - if (argc > 1 && argv[1][0] == '-') - { - if (strcmp (argv[1], "--help") == 0) - usage (1); - else if (strcmp (argv[1], "--version") == 0) - { - if (is_ranlib) - print_version ("ranlib"); - else - print_version ("ar"); - } - } - - START_PROGRESS (program_name, 0); - - bfd_init (); - set_default_bfd_target (); - - show_version = 0; - - xatexit (remove_output); - - if (is_ranlib) - { - boolean touch = false; - - if (argc < 2 || strcmp (argv[1], "--help") == 0) - usage (0); - if (strcmp (argv[1], "-V") == 0 - || strcmp (argv[1], "-v") == 0 - || strncmp (argv[1], "--v", 3) == 0) - print_version ("ranlib"); - arg_index = 1; - if (strcmp (argv[1], "-t") == 0) - { - ++arg_index; - touch = true; - } - while (arg_index < argc) - { - if (! touch) - ranlib_only (argv[arg_index]); - else - ranlib_touch (argv[arg_index]); - ++arg_index; - } - xexit (0); - } - - if (argc == 2 && strcmp (argv[1], "-M") == 0) - { - mri_emul (); - xexit (0); - } - - if (argc < 2) - usage (0); - - arg_ptr = argv[1]; - - if (*arg_ptr == '-') - ++arg_ptr; /* compatibility */ - - while ((c = *arg_ptr++) != '\0') - { - switch (c) - { - case 'd': - case 'm': - case 'p': - case 'q': - case 'r': - case 't': - case 'x': - if (operation != none) - fatal (_("two different operation options specified")); - switch (c) - { - case 'd': - operation = delete; - operation_alters_arch = true; - break; - case 'm': - operation = move; - operation_alters_arch = true; - break; - case 'p': - operation = print_files; - break; - case 'q': - operation = quick_append; - operation_alters_arch = true; - break; - case 'r': - operation = replace; - operation_alters_arch = true; - break; - case 't': - operation = print_table; - break; - case 'x': - operation = extract; - break; - } - case 'l': - break; - case 'c': - silent_create = 1; - break; - case 'o': - preserve_dates = 1; - break; - case 'V': - show_version = true; - break; - case 's': - write_armap = 1; - break; - case 'S': - write_armap = -1; - break; - case 'u': - newer_only = 1; - break; - case 'v': - verbose = 1; - break; - case 'a': - postype = pos_after; - break; - case 'b': - postype = pos_before; - break; - case 'i': - postype = pos_before; - break; - case 'M': - mri_mode = 1; - break; - case 'N': - counted_name_mode = true; - break; - case 'f': - ar_truncate = true; - break; - case 'P': - full_pathname = true; - break; - default: - /* xgettext:c-format */ - non_fatal (_("illegal option -- %c"), c); - usage (0); - } - } - - if (show_version) - print_version ("ar"); - - if (argc < 3) - usage (0); - - if (mri_mode) - { - mri_emul (); - } - else - { - bfd *arch; - - /* We can't write an armap when using ar q, so just do ar r - instead. */ - if (operation == quick_append && write_armap) - operation = replace; - - if ((operation == none || operation == print_table) - && write_armap == 1) - { - ranlib_only (argv[2]); - xexit (0); - } - - if (operation == none) - fatal (_("no operation specified")); - - if (newer_only && operation != replace) - fatal (_("`u' is only meaningful with the `r' option.")); - - arg_index = 2; - - if (postype != pos_default) - posname = argv[arg_index++]; - - if (counted_name_mode) - { - if (operation != extract && operation != delete) - fatal (_("`N' is only meaningful with the `x' and `d' options.")); - counted_name_counter = atoi (argv[arg_index++]); - if (counted_name_counter <= 0) - fatal (_("Value for `N' must be positive.")); - } - - inarch_filename = argv[arg_index++]; - - files = arg_index < argc ? argv + arg_index : NULL; - file_count = argc - arg_index; - -#if 0 - /* We don't use do_quick_append any more. Too many systems - expect ar to always rebuild the symbol table even when q is - used. */ - - /* We can't do a quick append if we need to construct an - extended name table, because do_quick_append won't be able to - rebuild the name table. Unfortunately, at this point we - don't actually know the maximum name length permitted by this - object file format. So, we guess. FIXME. */ - if (operation == quick_append && ! ar_truncate) - { - char **chk; - - for (chk = files; chk != NULL && *chk != '\0'; chk++) - { - if (strlen (normalize (*chk, (bfd *) NULL)) > 14) - { - operation = replace; - break; - } - } - } - - if (operation == quick_append) - { - /* Note that quick appending to a non-existent archive creates it, - even if there are no files to append. */ - do_quick_append (inarch_filename, files); - xexit (0); - } -#endif - - arch = open_inarch (inarch_filename, - files == NULL ? (char *) NULL : files[0]); - - switch (operation) - { - case print_table: - map_over_members (arch, print_descr, files, file_count); - break; - - case print_files: - map_over_members (arch, print_contents, files, file_count); - break; - - case extract: - map_over_members (arch, extract_file, files, file_count); - break; - - case delete: - if (files != NULL) - delete_members (arch, files); - else - output_filename = NULL; - break; - - case move: - if (files != NULL) - move_members (arch, files); - else - output_filename = NULL; - break; - - case replace: - case quick_append: - if (files != NULL || write_armap > 0) - replace_members (arch, files, operation == quick_append); - else - output_filename = NULL; - break; - - /* Shouldn't happen! */ - default: - /* xgettext:c-format */ - fatal (_("internal error -- this option not implemented")); - } - } - - END_PROGRESS (program_name); - - xexit (0); - return 0; -} - -bfd * -open_inarch (archive_filename, file) - const char *archive_filename; - const char *file; -{ - const char *target; - bfd **last_one; - bfd *next_one; - struct stat sbuf; - bfd *arch; - char **matching; - - bfd_set_error (bfd_error_no_error); - - target = NULL; - - if (stat (archive_filename, &sbuf) != 0) - { -#ifndef __GO32__ - -/* KLUDGE ALERT! Temporary fix until I figger why - * stat() is wrong ... think it's buried in GO32's IDT - * - Jax - */ - if (errno != ENOENT) - bfd_fatal (archive_filename); -#endif - - if (!operation_alters_arch) - { - fprintf (stderr, "%s: ", program_name); - perror (archive_filename); - maybequit (); - return NULL; - } - - /* Try to figure out the target to use for the archive from the - first object on the list. */ - if (file != NULL) - { - bfd *obj; - - obj = bfd_openr (file, NULL); - if (obj != NULL) - { - if (bfd_check_format (obj, bfd_object)) - target = bfd_get_target (obj); - (void) bfd_close (obj); - } - } - - /* Create an empty archive. */ - arch = bfd_openw (archive_filename, target); - if (arch == NULL - || ! bfd_set_format (arch, bfd_archive) - || ! bfd_close (arch)) - bfd_fatal (archive_filename); - - /* If we die creating a new archive, don't leave it around. */ - output_filename = archive_filename; - } - - arch = bfd_openr (archive_filename, target); - if (arch == NULL) - { - bloser: - bfd_fatal (archive_filename); - } - - if (! bfd_check_format_matches (arch, bfd_archive, &matching)) - { - bfd_nonfatal (archive_filename); - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } - xexit (1); - } - - last_one = &(arch->next); - /* Read all the contents right away, regardless. */ - for (next_one = bfd_openr_next_archived_file (arch, NULL); - next_one; - next_one = bfd_openr_next_archived_file (arch, next_one)) - { - PROGRESS (1); - *last_one = next_one; - last_one = &next_one->next; - } - *last_one = (bfd *) NULL; - if (bfd_get_error () != bfd_error_no_more_archived_files) - goto bloser; - return arch; -} - -static void -print_contents (abfd) - bfd *abfd; -{ - int ncopied = 0; - char *cbuf = xmalloc (BUFSIZE); - struct stat buf; - long size; - if (bfd_stat_arch_elt (abfd, &buf) != 0) - /* xgettext:c-format */ - fatal (_("internal stat error on %s"), bfd_get_filename (abfd)); - - if (verbose) - printf ("\n<%s>\n\n", bfd_get_filename (abfd)); - - bfd_seek (abfd, 0, SEEK_SET); - - size = buf.st_size; - while (ncopied < size) - { - - int nread; - int tocopy = size - ncopied; - if (tocopy > BUFSIZE) - tocopy = BUFSIZE; - - nread = bfd_read (cbuf, 1, tocopy, abfd); /* oops -- broke - abstraction! */ - if (nread != tocopy) - /* xgettext:c-format */ - fatal (_("%s is not a valid archive"), - bfd_get_filename (bfd_my_archive (abfd))); - fwrite (cbuf, 1, nread, stdout); - ncopied += tocopy; - } - free (cbuf); -} - -/* Extract a member of the archive into its own file. - - We defer opening the new file until after we have read a BUFSIZ chunk of the - old one, since we know we have just read the archive header for the old - one. Since most members are shorter than BUFSIZ, this means we will read - the old header, read the old data, write a new inode for the new file, and - write the new data, and be done. This 'optimization' is what comes from - sitting next to a bare disk and hearing it every time it seeks. -- Gnu - Gilmore */ - -void -extract_file (abfd) - bfd *abfd; -{ - FILE *ostream; - char *cbuf = xmalloc (BUFSIZE); - int nread, tocopy; - long ncopied = 0; - long size; - struct stat buf; - - if (bfd_stat_arch_elt (abfd, &buf) != 0) - /* xgettext:c-format */ - fatal (_("internal stat error on %s"), bfd_get_filename (abfd)); - size = buf.st_size; - - if (size < 0) - /* xgettext:c-format */ - fatal (_("stat returns negative size for %s"), bfd_get_filename (abfd)); - - if (verbose) - printf ("x - %s\n", bfd_get_filename (abfd)); - - bfd_seek (abfd, 0, SEEK_SET); - - ostream = NULL; - if (size == 0) - { - /* Seems like an abstraction violation, eh? Well it's OK! */ - output_filename = bfd_get_filename (abfd); - - ostream = fopen (bfd_get_filename (abfd), FOPEN_WB); - if (ostream == NULL) - { - perror (bfd_get_filename (abfd)); - xexit (1); - } - - output_file = ostream; - } - else - while (ncopied < size) - { - tocopy = size - ncopied; - if (tocopy > BUFSIZE) - tocopy = BUFSIZE; - - nread = bfd_read (cbuf, 1, tocopy, abfd); - if (nread != tocopy) - /* xgettext:c-format */ - fatal (_("%s is not a valid archive"), - bfd_get_filename (bfd_my_archive (abfd))); - - /* See comment above; this saves disk arm motion */ - if (ostream == NULL) - { - /* Seems like an abstraction violation, eh? Well it's OK! */ - output_filename = bfd_get_filename (abfd); - - ostream = fopen (bfd_get_filename (abfd), FOPEN_WB); - if (ostream == NULL) - { - perror (bfd_get_filename (abfd)); - xexit (1); - } - - output_file = ostream; - } - fwrite (cbuf, 1, nread, ostream); - ncopied += tocopy; - } - - if (ostream != NULL) - fclose (ostream); - - output_file = NULL; - output_filename = NULL; - - chmod (bfd_get_filename (abfd), buf.st_mode); - - if (preserve_dates) - set_times (bfd_get_filename (abfd), &buf); - - free (cbuf); -} - -#if 0 - -/* We don't use this anymore. Too many systems expect ar to rebuild - the symbol table even when q is used. */ - -/* Just do it quickly; don't worry about dups, armap, or anything like that */ - -static void -do_quick_append (archive_filename, files_to_append) - const char *archive_filename; - char **files_to_append; -{ - FILE *ofile, *ifile; - char *buf = xmalloc (BUFSIZE); - long tocopy, thistime; - bfd *temp; - struct stat sbuf; - boolean newfile = false; - bfd_set_error (bfd_error_no_error); - - if (stat (archive_filename, &sbuf) != 0) - { - -#ifndef __GO32__ - -/* KLUDGE ALERT! Temporary fix until I figger why - * stat() is wrong ... think it's buried in GO32's IDT - * - Jax - */ - - if (errno != ENOENT) - bfd_fatal (archive_filename); -#endif - - newfile = true; - } - - ofile = fopen (archive_filename, FOPEN_AUB); - if (ofile == NULL) - { - perror (program_name); - xexit (1); - } - - temp = bfd_openr (archive_filename, NULL); - if (temp == NULL) - { - bfd_fatal (archive_filename); - } - if (newfile == false) - { - if (bfd_check_format (temp, bfd_archive) != true) - /* xgettext:c-format */ - fatal (_("%s is not an archive"), archive_filename); - } - else - { - fwrite (ARMAG, 1, SARMAG, ofile); - if (!silent_create) - /* xgettext:c-format */ - non_fatal (_("creating %s"), archive_filename); - } - - if (ar_truncate) - temp->flags |= BFD_TRADITIONAL_FORMAT; - - /* assume it's an achive, go straight to the end, sans $200 */ - fseek (ofile, 0, 2); - - for (; files_to_append && *files_to_append; ++files_to_append) - { - struct ar_hdr *hdr = bfd_special_undocumented_glue (temp, *files_to_append); - if (hdr == NULL) - { - bfd_fatal (*files_to_append); - } - - BFD_SEND (temp, _bfd_truncate_arname, (temp, *files_to_append, (char *) hdr)); - - ifile = fopen (*files_to_append, FOPEN_RB); - if (ifile == NULL) - { - bfd_nonfatal (*files_to_append); - } - - if (stat (*files_to_append, &sbuf) != 0) - { - bfd_nonfatal (*files_to_append); - } - - tocopy = sbuf.st_size; - - /* XXX should do error-checking! */ - fwrite (hdr, 1, sizeof (struct ar_hdr), ofile); - - while (tocopy > 0) - { - thistime = tocopy; - if (thistime > BUFSIZE) - thistime = BUFSIZE; - fread (buf, 1, thistime, ifile); - fwrite (buf, 1, thistime, ofile); - tocopy -= thistime; - } - fclose (ifile); - if ((sbuf.st_size % 2) == 1) - putc ('\012', ofile); - } - fclose (ofile); - bfd_close (temp); - free (buf); -} - -#endif /* 0 */ - -static void -write_archive (iarch) - bfd *iarch; -{ - bfd *obfd; - char *old_name, *new_name; - bfd *contents_head = iarch->next; - - old_name = xmalloc (strlen (bfd_get_filename (iarch)) + 1); - strcpy (old_name, bfd_get_filename (iarch)); - new_name = make_tempname (old_name); - - output_filename = new_name; - - obfd = bfd_openw (new_name, bfd_get_target (iarch)); - - if (obfd == NULL) - bfd_fatal (old_name); - - output_bfd = obfd; - - bfd_set_format (obfd, bfd_archive); - - /* Request writing the archive symbol table unless we've - been explicitly requested not to. */ - obfd->has_armap = write_armap >= 0; - - if (ar_truncate) - { - /* This should really use bfd_set_file_flags, but that rejects - archives. */ - obfd->flags |= BFD_TRADITIONAL_FORMAT; - } - - if (bfd_set_archive_head (obfd, contents_head) != true) - bfd_fatal (old_name); - - if (!bfd_close (obfd)) - bfd_fatal (old_name); - - output_bfd = NULL; - output_filename = NULL; - - /* We don't care if this fails; we might be creating the archive. */ - bfd_close (iarch); - - if (smart_rename (new_name, old_name, 0) != 0) - xexit (1); -} - -/* Return a pointer to the pointer to the entry which should be rplacd'd - into when altering. DEFAULT_POS should be how to interpret pos_default, - and should be a pos value. */ - -static bfd ** -get_pos_bfd (contents, default_pos, default_posname) - bfd **contents; - enum pos default_pos; - const char *default_posname; -{ - bfd **after_bfd = contents; - enum pos realpos; - const char *realposname; - - if (postype == pos_default) - { - realpos = default_pos; - realposname = default_posname; - } - else - { - realpos = postype; - realposname = posname; - } - - if (realpos == pos_end) - { - while (*after_bfd) - after_bfd = &((*after_bfd)->next); - } - else - { - for (; *after_bfd; after_bfd = &(*after_bfd)->next) - if (strcmp ((*after_bfd)->filename, realposname) == 0) - { - if (realpos == pos_after) - after_bfd = &(*after_bfd)->next; - break; - } - } - return after_bfd; -} - -static void -delete_members (arch, files_to_delete) - bfd *arch; - char **files_to_delete; -{ - bfd **current_ptr_ptr; - boolean found; - boolean something_changed = false; - int match_count; - - for (; *files_to_delete != NULL; ++files_to_delete) - { - /* In a.out systems, the armap is optional. It's also called - __.SYMDEF. So if the user asked to delete it, we should remember - that fact. This isn't quite right for COFF systems (where - __.SYMDEF might be regular member), but it's very unlikely - to be a problem. FIXME */ - - if (!strcmp (*files_to_delete, "__.SYMDEF")) - { - arch->has_armap = false; - write_armap = -1; - continue; - } - - found = false; - match_count = 0; - current_ptr_ptr = &(arch->next); - while (*current_ptr_ptr) - { - if (strcmp (normalize (*files_to_delete, arch), - (*current_ptr_ptr)->filename) == 0) - { - ++match_count; - if (counted_name_mode - && match_count != counted_name_counter) - { - /* Counting, and didn't match on count; go on to the - next one. */ - } - else - { - found = true; - something_changed = true; - if (verbose) - printf ("d - %s\n", - *files_to_delete); - *current_ptr_ptr = ((*current_ptr_ptr)->next); - goto next_file; - } - } - - current_ptr_ptr = &((*current_ptr_ptr)->next); - } - - if (verbose && found == false) - { - /* xgettext:c-format */ - printf (_("No member named `%s'\n"), *files_to_delete); - } - next_file: - ; - } - - if (something_changed == true) - write_archive (arch); - else - output_filename = NULL; -} - - -/* Reposition existing members within an archive */ - -static void -move_members (arch, files_to_move) - bfd *arch; - char **files_to_move; -{ - bfd **after_bfd; /* New entries go after this one */ - bfd **current_ptr_ptr; /* cdr pointer into contents */ - - for (; *files_to_move; ++files_to_move) - { - current_ptr_ptr = &(arch->next); - while (*current_ptr_ptr) - { - bfd *current_ptr = *current_ptr_ptr; - if (strcmp (normalize (*files_to_move, arch), - current_ptr->filename) == 0) - { - /* Move this file to the end of the list - first cut from - where it is. */ - bfd *link; - *current_ptr_ptr = current_ptr->next; - - /* Now glue to end */ - after_bfd = get_pos_bfd (&arch->next, pos_end, NULL); - link = *after_bfd; - *after_bfd = current_ptr; - current_ptr->next = link; - - if (verbose) - printf ("m - %s\n", *files_to_move); - - goto next_file; - } - - current_ptr_ptr = &((*current_ptr_ptr)->next); - } - /* xgettext:c-format */ - fatal (_("no entry %s in archive %s!"), *files_to_move, arch->filename); - - next_file:; - } - - write_archive (arch); -} - -/* Ought to default to replacing in place, but this is existing practice! */ - -static void -replace_members (arch, files_to_move, quick) - bfd *arch; - char **files_to_move; - boolean quick; -{ - boolean changed = false; - bfd **after_bfd; /* New entries go after this one */ - bfd *current; - bfd **current_ptr; - bfd *temp; - - while (files_to_move && *files_to_move) - { - if (! quick) - { - current_ptr = &arch->next; - while (*current_ptr) - { - current = *current_ptr; - - /* For compatibility with existing ar programs, we - permit the same file to be added multiple times. */ - if (strcmp (normalize (*files_to_move, arch), - normalize (current->filename, arch)) == 0 - && current->arelt_data != NULL) - { - if (newer_only) - { - struct stat fsbuf, asbuf; - - if (stat (*files_to_move, &fsbuf) != 0) - { - if (errno != ENOENT) - bfd_fatal (*files_to_move); - goto next_file; - } - if (bfd_stat_arch_elt (current, &asbuf) != 0) - /* xgettext:c-format */ - fatal (_("internal stat error on %s"), current->filename); - - if (fsbuf.st_mtime <= asbuf.st_mtime) - goto next_file; - } - - after_bfd = get_pos_bfd (&arch->next, pos_after, - current->filename); - temp = *after_bfd; - - *after_bfd = bfd_openr (*files_to_move, NULL); - if (*after_bfd == (bfd *) NULL) - { - bfd_fatal (*files_to_move); - } - (*after_bfd)->next = temp; - - /* snip out this entry from the chain */ - *current_ptr = (*current_ptr)->next; - - if (verbose) - { - printf ("r - %s\n", *files_to_move); - } - - changed = true; - - goto next_file; - } - current_ptr = &(current->next); - } - } - - /* Add to the end of the archive. */ - - after_bfd = get_pos_bfd (&arch->next, pos_end, NULL); - temp = *after_bfd; - *after_bfd = bfd_openr (*files_to_move, NULL); - if (*after_bfd == (bfd *) NULL) - { - bfd_fatal (*files_to_move); - } - if (verbose) - { - printf ("a - %s\n", *files_to_move); - } - - (*after_bfd)->next = temp; - - changed = true; - - next_file:; - - files_to_move++; - } - - if (changed) - write_archive (arch); - else - output_filename = NULL; -} - -static void -ranlib_only (archname) - const char *archname; -{ - bfd *arch; - - write_armap = 1; - arch = open_inarch (archname, (char *) NULL); - if (arch == NULL) - xexit (1); - write_archive (arch); -} - -/* Update the timestamp of the symbol map of an archive. */ - -static void -ranlib_touch (archname) - const char *archname; -{ -#ifdef __GO32__ - /* I don't think updating works on go32. */ - ranlib_only (archname); -#else - int f; - bfd *arch; - char **matching; - - f = open (archname, O_RDWR | O_BINARY, 0); - if (f < 0) - { - bfd_set_error (bfd_error_system_call); - bfd_fatal (archname); - } - - arch = bfd_fdopenr (archname, (const char *) NULL, f); - if (arch == NULL) - bfd_fatal (archname); - if (! bfd_check_format_matches (arch, bfd_archive, &matching)) - { - bfd_nonfatal (archname); - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } - xexit (1); - } - - if (! bfd_has_map (arch)) - /* xgettext:c-format */ - fatal (_("%s: no archive map to update"), archname); - - bfd_update_armap_timestamp (arch); - - if (! bfd_close (arch)) - bfd_fatal (archname); -#endif -} - -/* Things which are interesting to map over all or some of the files: */ - -static void -print_descr (abfd) - bfd *abfd; -{ - print_arelt_descr (stdout, abfd, verbose); -} diff --git a/binutils/arlex.l b/binutils/arlex.l deleted file mode 100644 index 74e13d13dfe..00000000000 --- a/binutils/arlex.l +++ /dev/null @@ -1,83 +0,0 @@ -%{ -/* arlex.l - Strange script language lexer */ - -/* Copyright (C) 1992, 95, 1997 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* Contributed by Steve Chamberlain - sac@cygnus.com - -*/ -#define DONTDECLARE_MALLOC -#include -#include "libiberty.h" -#include "arparse.h" - -int linenumber; -%} -%% - -"ADDLIB" { return ADDLIB; } -"ADDMOD" { return ADDMOD; } -"CLEAR" { return CLEAR; } -"CREATE" { return CREATE; } -"DELETE" { return DELETE; } -"DIRECTORY" { return DIRECTORY; } -"END" { return END; } -"EXTRACT" { return EXTRACT; } -"FULLDIR" { return FULLDIR; } -"HELP" { return HELP; } -"LIST" { return LIST; } -"OPEN" { return OPEN; } -"REPLACE" { return REPLACE; } -"VERBOSE" { return VERBOSE; } -"SAVE" { return SAVE; } -"addlib" { return ADDLIB; } -"addmod" { return ADDMOD; } -"clear" { return CLEAR; } -"create" { return CREATE; } -"delete" { return DELETE; } -"directory" { return DIRECTORY; } -"end" { return END; } -"extract" { return EXTRACT; } -"fulldir" { return FULLDIR; } -"help" { return HELP; } -"list" { return LIST; } -"open" { return OPEN; } -"replace" { return REPLACE; } -"verbose" { return VERBOSE; } -"save" { return SAVE; } -"+\n" { linenumber ++; } -"(" { return '('; } -")" { return ')'; } -"," { return ','; } -[A-Za-z0-9/$:.\-\_]+ { - yylval.name = xstrdup (yytext); - return FILENAME; - } -"*".* { } -";".* { } -" " { } -"\n" { linenumber ++; return NEWLINE; } - -%% -#ifndef yywrap -/* Needed for lex, though not flex. */ -int yywrap() { return 1; } -#endif diff --git a/binutils/arparse.y b/binutils/arparse.y deleted file mode 100644 index a5e90faeb1b..00000000000 --- a/binutils/arparse.y +++ /dev/null @@ -1,202 +0,0 @@ -%{ -/* arparse.y - Stange script language parser */ - -/* Copyright (C) 1992, 93, 95, 97, 98, 1999 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* Contributed by Steve Chamberlain - sac@cygnus.com - -*/ -#define DONTDECLARE_MALLOC -#include "bfd.h" -#include "bucomm.h" -#include "arsup.h" -extern int verbose; -extern int yylex PARAMS ((void)); -static int yyerror PARAMS ((const char *)); -%} - -%union { - char *name; -struct list *list ; - -}; - -%token NEWLINE -%token VERBOSE -%token FILENAME -%token ADDLIB -%token LIST -%token ADDMOD -%token CLEAR -%token CREATE -%token DELETE -%token DIRECTORY -%token END -%token EXTRACT -%token FULLDIR -%token HELP -%token QUIT -%token REPLACE -%token SAVE -%token OPEN - -%type modulelist -%type modulename -%type optional_filename -%% - -start: - { prompt(); } session - ; - -session: - session command_line - | - ; - -command_line: - command NEWLINE { prompt(); } - -command: - open_command - | create_command - | verbose_command - | directory_command - | addlib_command - | clear_command - | addmod_command - | save_command - | extract_command - | replace_command - | delete_command - | list_command - | END { ar_end(); return 0; } - | error - | FILENAME { yyerror("foo"); } - | - ; - - -extract_command: - EXTRACT modulename - { ar_extract($2); } - ; - -replace_command: - REPLACE modulename - { ar_replace($2); } - ; - -clear_command: - CLEAR - { ar_clear(); } - ; - -delete_command: - DELETE modulename - { ar_delete($2); } - ; -addmod_command: - ADDMOD modulename - { ar_addmod($2); } - ; - -list_command: - LIST - { ar_list(); } - ; - -save_command: - SAVE - { ar_save(); } - ; - - - -open_command: - OPEN FILENAME - { ar_open($2,0); } - ; - -create_command: - CREATE FILENAME - { ar_open($2,1); } - ; - - -addlib_command: - ADDLIB FILENAME modulelist - { ar_addlib($2,$3); } - ; -directory_command: - DIRECTORY FILENAME modulelist optional_filename - { ar_directory($2, $3, $4); } - ; - - - -optional_filename: - FILENAME - { $$ = $1; } - | { $$ = 0; } - ; - -modulelist: - '(' modulename ')' - { $$ = $2; } - | - { $$ = 0; } - ; - -modulename: - modulename optcomma FILENAME - { struct list *n = (struct list *) malloc(sizeof(struct list)); - n->next = $1; - n->name = $3; - $$ = n; - } - | { $$ = 0; } - ; - - -optcomma: - ',' - | - ; - - -verbose_command: - VERBOSE - { verbose = !verbose; } - ; - - -%% - -static int -yyerror (x) - const char *x ATTRIBUTE_UNUSED; -{ - extern int linenumber; - - printf (_("Syntax error in archive script, line %d\n"), linenumber + 1); - return 0; -} diff --git a/binutils/arsup.c b/binutils/arsup.c deleted file mode 100644 index d6809fc4749..00000000000 --- a/binutils/arsup.c +++ /dev/null @@ -1,457 +0,0 @@ -/* arsup.c - Archive support for MRI compatibility - Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 1999 - 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* Contributed by Steve Chamberlain - sac@cygnus.com - -This file looks after requests from arparse.y, to provide the MRI -style librarian command syntax + 1 word LIST - -*/ - -#include "bfd.h" -#include "arsup.h" -#include "libiberty.h" -#include "bucomm.h" - -static void map_over_list - PARAMS ((bfd *, void (*function) (bfd *, bfd *), struct list *)); -static void ar_directory_doer PARAMS ((bfd *, bfd *)); -static void ar_addlib_doer PARAMS ((bfd *, bfd *)); - -extern int verbose; - -static void -map_over_list (arch, function, list) - bfd *arch; - void (*function) PARAMS ((bfd *, bfd *)); - struct list *list; -{ - bfd *head; - - if (list == NULL) - { - bfd *next; - - head = arch->next; - while (head != NULL) - { - next = head->next; - function (head, (bfd *) NULL); - head = next; - } - } - else - { - struct list *ptr; - - /* This may appear to be a baroque way of accomplishing what we - want. however we have to iterate over the filenames in order - to notice where a filename is requested but does not exist in - the archive. Ditto mapping over each file each time -- we - want to hack multiple references. */ - for (ptr = list; ptr; ptr = ptr->next) - { - boolean found = false; - bfd *prev = arch; - - for (head = arch->next; head; head = head->next) - { - if (head->filename != NULL - && strcmp (ptr->name, head->filename) == 0) - { - found = true; - function (head, prev); - } - prev = head; - } - if (! found) - fprintf (stderr, _("No entry %s in archive.\n"), ptr->name); - } - } -} - - -FILE *outfile; - -/*ARGSUSED*/ -static void -ar_directory_doer (abfd, ignore) - bfd *abfd; - bfd *ignore ATTRIBUTE_UNUSED; -{ - print_arelt_descr(outfile, abfd, verbose); -} - -void -ar_directory (ar_name, list, output) - char *ar_name; - struct list *list; - char *output; -{ - bfd *arch; - - arch = open_inarch (ar_name, (char *) NULL); - if (output) - { - outfile = fopen(output,"w"); - if (outfile == 0) - { - outfile = stdout; - fprintf (stderr,_("Can't open file %s\n"), output); - output = 0; - } - } - else - outfile = stdout; - - map_over_list (arch, ar_directory_doer, list); - - bfd_close (arch); - - if (output) - fclose (outfile); -} - -void -DEFUN_VOID(prompt) -{ - extern int interactive; - if (interactive) - { - printf("AR >"); - fflush(stdout); - } -} - -void -maybequit () -{ - if (! interactive) - xexit (9); -} - - -bfd *obfd; -char *real_name ; -void -DEFUN(ar_open,(name, t), - char *name AND - int t) - -{ - char *tname = (char *) xmalloc (strlen (name) + 10); - real_name = name; - sprintf(tname, "%s-tmp", name); - obfd = bfd_openw(tname, NULL); - - if (!obfd) { - fprintf(stderr,_("%s: Can't open output archive %s\n"), program_name, - tname); - - maybequit(); - } - else { - if (!t) { - bfd **ptr; - bfd *element; - bfd *ibfd; - ibfd = bfd_openr(name, NULL); - if (!ibfd) { - fprintf(stderr,_("%s: Can't open input archive %s\n"), - program_name, name); - maybequit(); - return; - } - if (bfd_check_format(ibfd, bfd_archive) != true) { - fprintf(stderr,_("%s: file %s is not an archive\n"), program_name, - name); - maybequit(); - return; - } - ptr = &(obfd->archive_head); - element = bfd_openr_next_archived_file(ibfd, NULL); - - while (element) { - *ptr = element; - ptr = &element->next; - element = bfd_openr_next_archived_file(ibfd, element); - } - } - - bfd_set_format(obfd, bfd_archive); - - obfd->has_armap = 1; - } -} - - -static void -ar_addlib_doer (abfd, prev) - bfd *abfd; - bfd *prev; -{ - /* Add this module to the output bfd */ - if (prev != NULL) - prev->next = abfd->next; - abfd->next = obfd->archive_head; - obfd->archive_head = abfd; -} - -void -ar_addlib (name, list) - char *name; - struct list *list; -{ - if (obfd == NULL) - { - fprintf (stderr, _("%s: no output archive specified yet\n"), program_name); - maybequit (); - } - else - { - bfd *arch; - - arch = open_inarch (name, (char *) NULL); - if (arch != NULL) - map_over_list (arch, ar_addlib_doer, list); - - /* Don't close the bfd, since it will make the elements disasppear */ - } -} - -void -DEFUN(ar_addmod, (list), - struct list *list) -{ - if (!obfd) { - fprintf(stderr, _("%s: no open output archive\n"), program_name); - maybequit(); - } - else - { - while (list) { - bfd *abfd = bfd_openr(list->name, NULL); - if (!abfd) { - fprintf(stderr,_("%s: can't open file %s\n"), program_name, - list->name); - maybequit(); - } - else { - abfd->next = obfd->archive_head; - obfd->archive_head = abfd; - } - list = list->next; - } - } -} - - - -void -DEFUN_VOID(ar_clear) -{ -if (obfd) - obfd->archive_head = 0; -} - -void -DEFUN(ar_delete, (list), - struct list *list) -{ - if (!obfd) { - fprintf(stderr, _("%s: no open output archive\n"), program_name); - maybequit(); - } - else - { - while (list) { - /* Find this name in the archive */ - bfd *member = obfd->archive_head; - bfd **prev = &(obfd->archive_head); - int found = 0; - while (member) { - if (strcmp(member->filename, list->name) == 0) { - *prev = member->next; - found = 1; - } - else { - prev = &(member->next); - } - member = member->next; - } - if (!found) { - fprintf(stderr,_("%s: can't find module file %s\n"), program_name, - list->name); - maybequit(); - } - list = list->next; - } - } -} - - -void -DEFUN_VOID(ar_save) -{ - - if (!obfd) { - fprintf(stderr, _("%s: no open output archive\n"), program_name); - maybequit(); - } - else { - char *ofilename = xstrdup (bfd_get_filename (obfd)); - bfd_close(obfd); - - rename (ofilename, real_name); - obfd = 0; - free(ofilename); - } -} - - - -void -DEFUN(ar_replace, (list), - struct list *list) -{ - if (!obfd) { - fprintf(stderr, _("%s: no open output archive\n"), program_name); - maybequit(); - } - else - { - while (list) { - /* Find this name in the archive */ - bfd *member = obfd->archive_head; - bfd **prev = &(obfd->archive_head); - int found = 0; - while (member) - { - if (strcmp(member->filename, list->name) == 0) - { - /* Found the one to replace */ - bfd *abfd = bfd_openr(list->name, 0); - if (!abfd) - { - fprintf(stderr, _("%s: can't open file %s\n"), program_name, list->name); - maybequit(); - } - else { - *prev = abfd; - abfd->next = member->next; - found = 1; - } - } - else { - prev = &(member->next); - } - member = member->next; - } - if (!found) { - bfd *abfd = bfd_openr(list->name, 0); - fprintf(stderr,_("%s: can't find module file %s\n"), program_name, - list->name); - if (!abfd) - { - fprintf(stderr, _("%s: can't open file %s\n"), program_name, list->name); - maybequit(); - } - else - { - *prev = abfd; - } - } - - list = list->next; - } - } -} - -/* And I added this one */ -void -DEFUN_VOID(ar_list) -{ - if (!obfd) - { - fprintf(stderr, _("%s: no open output archive\n"), program_name); - maybequit(); - } - else { - bfd *abfd; - outfile = stdout; - verbose =1 ; - printf(_("Current open archive is %s\n"), bfd_get_filename (obfd)); - for (abfd = obfd->archive_head; - abfd != (bfd *)NULL; - abfd = abfd->next) - { - ar_directory_doer (abfd, (bfd *) NULL); - } - } -} - - -void -DEFUN_VOID(ar_end) -{ - if (obfd) - { - fclose((FILE *)(obfd->iostream)); - unlink(bfd_get_filename (obfd)); - } -} -void -DEFUN(ar_extract,(list), - struct list *list) -{ - if (!obfd) - { - - fprintf(stderr, _("%s: no open archive\n"), program_name); - maybequit(); - } - else - { - while (list) { - /* Find this name in the archive */ - bfd *member = obfd->archive_head; - int found = 0; - while (member && !found) - { - if (strcmp(member->filename, list->name) == 0) - { - extract_file(member); - found = 1; - } - - member = member->next; - } - if (!found) { - bfd_openr(list->name, 0); - fprintf(stderr,_("%s: can't find module file %s\n"), program_name, - list->name); - - } - list = list->next; - } - } -} diff --git a/binutils/arsup.h b/binutils/arsup.h deleted file mode 100644 index f54a34bcf35..00000000000 --- a/binutils/arsup.h +++ /dev/null @@ -1,75 +0,0 @@ -/* arsup.h - archive support header file - Copyright 1992 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -struct list { - char *name; - struct list *next; -}; - -void -maybequit PARAMS ((void)); - -void -prompt PARAMS ((void)); - -void -ar_clear PARAMS ((void)); - -void -ar_replace PARAMS ((struct list *)); - -void -ar_delete PARAMS ((struct list *)); - -void -ar_save PARAMS ((void)); - -void -ar_list PARAMS ((void)); - -void -ar_open PARAMS ((char *, int)); - -void -ar_directory PARAMS ((char *, struct list *, char *)); - -void -ar_addmod PARAMS ((struct list *)); - -void -ar_addlib PARAMS ((char *, struct list *)); - -void -ar_end PARAMS ((void)); - -void -ar_extract PARAMS ((struct list *)); - -bfd * -open_inarch PARAMS ((const char *archive_filename, const char *)); - -int -yyparse PARAMS ((void)); - -/* Functions from ar.c */ - -void -extract_file PARAMS ((bfd * abfd)); - -extern int interactive; diff --git a/binutils/binutils.texi b/binutils/binutils.texi deleted file mode 100644 index 1820d661587..00000000000 --- a/binutils/binutils.texi +++ /dev/null @@ -1,3029 +0,0 @@ -\input texinfo @c -*- Texinfo -*- -@setfilename binutils.info -@include config.texi - -@ifinfo -@format -START-INFO-DIR-ENTRY -* Binutils: (binutils). The GNU binary utilities. -* ar: (binutils)ar. Create, modify, and extract from archives -* 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 -* c++filt: (binutils)c++filt. Filter to demangle encoded C++ symbols -* cxxfilt: (binutils)c++filt. MS-DOS name for c++filt -* addr2line: (binutils)addr2line. Convert addresses to file and line -* nlmconv: (binutils)nlmconv. Converts object code into an NLM -* windres: (binutils)windres. Manipulate Windows resources -* dlltool: (binutils)dlltool. Create files needed to build and use DLLs -END-INFO-DIR-ENTRY -@end format -@end ifinfo - -@ifinfo -Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries a copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ifinfo - -@synindex ky cp -@c -@c This file documents the GNU binary utilities "ar", "ld", "objcopy", -@c "objdump", "nm", "size", "strings", "strip", "readelf" and "ranlib". -@c -@c Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. -@c -@c This text may be freely distributed under the terms of the GNU -@c General Public License. -@c - -@setchapternewpage odd -@settitle @sc{gnu} Binary Utilities -@titlepage -@finalout -@title The @sc{gnu} Binary Utilities -@subtitle Version @value{VERSION} -@sp 1 -@subtitle May 1993 -@author Roland H. Pesch -@author Jeffrey M. Osier -@author Cygnus Support -@page - -@tex -{\parskip=0pt \hfill Cygnus Support\par \hfill -\TeX{}info \texinfoversion\par } -@end tex - -@vskip 0pt plus 1filll -Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end titlepage - -@node Top -@top Introduction - -@cindex version -This brief manual contains preliminary documentation for the @sc{gnu} binary -utilities (collectively version @value{VERSION}): - -@iftex -@table @code -@item ar -Create, modify, and extract from archives - -@item nm -List symbols from object files - -@item objcopy -Copy and translate object files - -@item objdump -Display information from object files - -@item ranlib -Generate index to archive contents - -@item readelf -Display the contents of ELF format files. - -@item size -List file section sizes and total size - -@item strings -List printable strings from files - -@item strip -Discard symbols - -@item c++filt -Demangle encoded C++ symbols (on MS-DOS, this program is named -@code{cxxfilt}) - -@item addr2line -Convert addresses into file names and line numbers - -@item nlmconv -Convert object code into a Netware Loadable Module - -@item windres -Manipulate Windows resources - -@item dlltool -Create the files needed to build and use Dynamic Link Libraries -@end table -@end iftex - -@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 -* readelf:: Display the contents of ELF format files. -* 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 -* windres:: Manipulate Windows resources -* dlltool:: Create files needed to build and use DLLs -* Selecting The Target System:: How these utilities determine the target. -* Reporting Bugs:: Reporting Bugs -* Index:: Index -@end menu - -@node ar -@chapter ar - -@kindex ar -@cindex archives -@cindex collections of files -@smallexample -ar [-]@var{p}[@var{mod} [@var{relpos}] [@var{count}]] @var{archive} [@var{member}@dots{}] -ar -M [ }), and continues executing even after -errors. If you redirect standard input to a script file, no prompts are -issued, and @code{ar} abandons execution (with a nonzero exit code) -on any error. - -The @code{ar} command language is @emph{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 @sc{gnu} @code{ar} for developers who already have scripts -written for the MRI ``librarian'' program. - -The syntax for the @code{ar} command language is straightforward: -@itemize @bullet -@item -commands are recognized in upper or lower case; for example, @code{LIST} -is the same as @code{list}. In the following descriptions, commands are -shown in upper case for clarity. - -@item -a single command may appear on each line; it is the first word on the -line. - -@item -empty lines are allowed, and have no effect. - -@item -comments are allowed; text after either of the characters @samp{*} -or @samp{;} is ignored. - -@item -Whenever you use a list of names as part of the argument to an @code{ar} -command, you can separate the individual names with either commas or -blanks. Commas are shown in the explanations below, for clarity. - -@item -@samp{+} is used as a line continuation character; if @samp{+} appears -at the end of a line, the text on the following line is considered part -of the current command. -@end itemize - -Here are the commands you can use in @code{ar} scripts, or when using -@code{ar} interactively. Three of them have special significance: - -@code{OPEN} or @code{CREATE} specify a @dfn{current archive}, which is -a temporary file required for most of the other commands. - -@code{SAVE} commits the changes so far specified by the script. Prior -to @code{SAVE}, commands affect only the temporary copy of the current -archive. - -@table @code -@item ADDLIB @var{archive} -@itemx ADDLIB @var{archive} (@var{module}, @var{module}, @dots{} @var{module}) -Add all the contents of @var{archive} (or, if specified, each named -@var{module} from @var{archive}) to the current archive. - -Requires prior use of @code{OPEN} or @code{CREATE}. - -@item ADDMOD @var{member}, @var{member}, @dots{} @var{member} -@c FIXME! w/Replacement?? If so, like "ar r @var{archive} @var{names}" -@c else like "ar q..." -Add each named @var{member} as a module in the current archive. - -Requires prior use of @code{OPEN} or @code{CREATE}. - -@item CLEAR -Discard the contents of the current archive, canceling the effect of -any operations since the last @code{SAVE}. May be executed (with no -effect) even if no current archive is specified. - -@item CREATE @var{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 @var{archive} until you use @code{SAVE}. -You can overwrite existing archives; similarly, the contents of any -existing file named @var{archive} will not be destroyed until @code{SAVE}. - -@item DELETE @var{module}, @var{module}, @dots{} @var{module} -Delete each listed @var{module} from the current archive; equivalent to -@samp{ar -d @var{archive} @var{module} @dots{} @var{module}}. - -Requires prior use of @code{OPEN} or @code{CREATE}. - -@item DIRECTORY @var{archive} (@var{module}, @dots{} @var{module}) -@itemx DIRECTORY @var{archive} (@var{module}, @dots{} @var{module}) @var{outputfile} -List each named @var{module} present in @var{archive}. The separate -command @code{VERBOSE} specifies the form of the output: when verbose -output is off, output is like that of @samp{ar -t @var{archive} -@var{module}@dots{}}. When verbose output is on, the listing is like -@samp{ar -tv @var{archive} @var{module}@dots{}}. - -Output normally goes to the standard output stream; however, if you -specify @var{outputfile} as a final argument, @code{ar} directs the -output to that file. - -@item END -Exit from @code{ar}, with a @code{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 @code{SAVE} command, those -changes are lost. - -@item EXTRACT @var{module}, @var{module}, @dots{} @var{module} -Extract each named @var{module} from the current archive, writing them -into the current directory as separate files. Equivalent to @samp{ar -x -@var{archive} @var{module}@dots{}}. - -Requires prior use of @code{OPEN} or @code{CREATE}. - -@ignore -@c FIXME Tokens but no commands??? -@item FULLDIR - -@item HELP -@end ignore - -@item LIST -Display full contents of the current archive, in ``verbose'' style -regardless of the state of @code{VERBOSE}. The effect is like @samp{ar -tv @var{archive}}. (This single command is a @sc{gnu} @code{ar} -enhancement, rather than present for MRI compatibility.) - -Requires prior use of @code{OPEN} or @code{CREATE}. - -@item OPEN @var{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 @var{archive} until you next use @code{SAVE}. - -@item REPLACE @var{module}, @var{module}, @dots{} @var{module} -In the current archive, replace each existing @var{module} (named in -the @code{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 @code{OPEN} or @code{CREATE}. - -@item VERBOSE -Toggle an internal flag governing the output from @code{DIRECTORY}. -When the flag is on, @code{DIRECTORY} output matches output from -@samp{ar -tv }@dots{}. - -@item SAVE -Commit your changes to the current archive, and actually save it as a -file with the name specified in the last @code{CREATE} or @code{OPEN} -command. - -Requires prior use of @code{OPEN} or @code{CREATE}. - -@end table - -@iftex -@node ld -@chapter ld -@cindex linker -@kindex ld -The @sc{gnu} linker @code{ld} is now described in a separate manual. -@xref{Top,, Overview,, Using LD: the @sc{gnu} linker}. -@end iftex - -@node nm -@chapter nm -@cindex symbols -@kindex nm - -@smallexample -nm [ -a | --debug-syms ] [ -g | --extern-only ] - [ -B ] [ -C | --demangle ] [ -D | --dynamic ] - [ -s | --print-armap ] [ -A | -o | --print-file-name ] - [ -n | -v | --numeric-sort ] [ -p | --no-sort ] - [ -r | --reverse-sort ] [ --size-sort ] [ -u | --undefined-only ] - [ -t @var{radix} | --radix=@var{radix} ] [ -P | --portability ] - [ --target=@var{bfdname} ] [ -f @var{format} | --format=@var{format} ] - [ --defined-only ] [-l | --line-numbers ] - [ --no-demangle ] [ -V | --version ] [ --help ] [ @var{objfile}@dots{} ] -@end smallexample - -@sc{gnu} @code{nm} lists the symbols from object files @var{objfile}@dots{}. -If no object files are listed as arguments, @code{nm} assumes the file -@file{a.out}. - -For each symbol, @code{nm} shows: - -@itemize @bullet -@item -The symbol value, in the radix selected by options (see below), or -hexadecimal by default. - -@item -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 -local; if uppercase, the symbol is global (external). - -@c Some more detail on exactly what these symbol types are used for -@c would be nice. -@table @code -@item A -The symbol's value is absolute, and will not be changed by further -linking. - -@item B -The symbol is in the uninitialized data section (known as BSS). - -@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. For more details on common symbols, see the discussion of ---warn-common in @ref{Options,,Linker options,ld.info,The GNU linker}. - -@item D -The symbol is in the initialized data section. - -@item 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. - -@item I -The symbol is an indirect reference to another symbol. This is a GNU -extension to the a.out object file format which is rarely used. - -@item N -The symbol is a debugging symbol. - -@item R -The symbol is in a read only data section. - -@item S -The symbol is in an uninitialized data section for small objects. - -@item T -The symbol is in the text (code) section. - -@item U -The symbol is undefined. - -@item 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. - -@item 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 weak symbol becomes zero with no error. - -@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; -for more information, see @ref{Top,Stabs,Stabs Overview,stabs.info, The -``stabs'' debug format}. - -@item ? -The symbol type is unknown, or object file format specific. -@end table - -@item -The symbol name. -@end itemize - -The long and short forms of options, shown here as alternatives, are -equivalent. - -@table @code -@item -A -@itemx -o -@itemx --print-file-name -@cindex input file name -@cindex file name -@cindex source 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. - -@item -a -@itemx --debug-syms -@cindex debugging symbols -Display all symbols, even debugger-only symbols; normally these are not -listed. - -@item -B -@cindex @code{nm} format -@cindex @code{nm} compatibility -The same as @samp{--format=bsd} (for compatibility with the MIPS @code{nm}). - -@item -C -@itemx --demangle -@cindex demangling in nm -Decode (@dfn{demangle}) low-level symbol names into user-level names. -Besides removing any initial underscore prepended by the system, this -makes C++ function names readable. @xref{c++filt}, for more information -on demangling. - -@item --no-demangle -Do not demangle low-level symbol names. This is the default. - -@item -D -@itemx --dynamic -@cindex dynamic symbols -Display the dynamic symbols rather than the normal symbols. This is -only meaningful for dynamic objects, such as certain types of shared -libraries. - -@item -f @var{format} -@itemx --format=@var{format} -@cindex @code{nm} format -@cindex @code{nm} compatibility -Use the output format @var{format}, which can be @code{bsd}, -@code{sysv}, or @code{posix}. The default is @code{bsd}. -Only the first character of @var{format} is significant; it can be -either upper or lower case. - -@item -g -@itemx --extern-only -@cindex external symbols -Display only external symbols. - -@item -l -@itemx --line-numbers -@cindex symbol 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. - -@item -n -@itemx -v -@itemx --numeric-sort -Sort symbols numerically by their addresses, rather than alphabetically -by their names. - -@item -p -@itemx --no-sort -@cindex sorting symbols -Do not bother to sort the symbols in any order; print them in the order -encountered. - -@item -P -@itemx --portability -Use the POSIX.2 standard output format instead of the default format. -Equivalent to @samp{-f posix}. - -@item -s -@itemx --print-armap -@cindex symbol index, listing -When listing symbols from archive members, include the index: a mapping -(stored in the archive by @code{ar} or @code{ranlib}) of which modules -contain definitions for which names. - -@item -r -@itemx --reverse-sort -Reverse the order of the sort (whether numeric or alphabetic); let the -last come first. - -@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. The size of the symbol is printed, rather than the value. - -@item -t @var{radix} -@itemx --radix=@var{radix} -Use @var{radix} as the radix for printing the symbol values. It must be -@samp{d} for decimal, @samp{o} for octal, or @samp{x} for hexadecimal. - -@item --target=@var{bfdname} -@cindex object code format -Specify an object code format other than your system's default format. -@xref{Target Selection}, for more information. - -@item -u -@itemx --undefined-only -@cindex external symbols -@cindex undefined symbols -Display only undefined symbols (those external to each object file). - -@item --defined-only -@cindex external symbols -@cindex undefined symbols -Display only defined symbols for each object file. - -@item -V -@itemx --version -Show the version number of @code{nm} and exit. - -@item --help -Show a summary of the options to @code{nm} and exit. -@end table - -@node objcopy -@chapter objcopy - -@smallexample -objcopy [ -F @var{bfdname} | --target=@var{bfdname} ] - [ -I @var{bfdname} | --input-target=@var{bfdname} ] - [ -O @var{bfdname} | --output-target=@var{bfdname} ] - [ -S | --strip-all ] [ -g | --strip-debug ] - [ -K @var{symbolname} | --keep-symbol=@var{symbolname} ] - [ -N @var{symbolname} | --strip-symbol=@var{symbolname} ] - [ -L @var{symbolname} | --localize-symbol=@var{symbolname} ] - [ -W @var{symbolname} | --weaken-symbol=@var{symbolname} ] - [ -x | --discard-all ] [ -X | --discard-locals ] - [ -b @var{byte} | --byte=@var{byte} ] - [ -i @var{interleave} | --interleave=@var{interleave} ] - [ -j @var{sectionname} | --only-section=@var{sectionname} ] - [ -R @var{sectionname} | --remove-section=@var{sectionname} ] - [ -p | --preserve-dates ] [ --debugging ] - [ --gap-fill=@var{val} ] [ --pad-to=@var{address} ] - [ --set-start=@var{val} ] [ --adjust-start=@var{incr} ] - [ --change-addresses=@var{incr} ] - [ --change-section-address @var{section}@{=,+,-@}@var{val} ] - [ --change-section-lma @var{section}@{=,+,-@}@var{val} ] - [ --change-section-vma @var{section}@{=,+,-@}@var{val} ] - [ --change-warnings ] [ --no-change-warnings ] - [ --set-section-flags @var{section}=@var{flags} ] - [ --add-section @var{sectionname}=@var{filename} ] - [ --change-leading-char ] [ --remove-leading-char ] - [ --redefine-sym @var{old}=@var{new} ] [ --weaken ] - [ -v | --verbose ] [ -V | --version ] [ --help ] - @var{infile} [@var{outfile}] -@end smallexample - -The @sc{gnu} @code{objcopy} utility copies the contents of an object -file to another. @code{objcopy} uses the @sc{gnu} @sc{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 @code{objcopy} is controlled by command-line options. - -@code{objcopy} creates temporary files to do its translations and -deletes them afterward. @code{objcopy} uses @sc{bfd} to do all its -translation work; it has access to all the formats described in @sc{bfd} -and thus is able to recognize most formats without being told -explicitly. @xref{BFD,,BFD,ld.info,Using LD}. - -@code{objcopy} can be used to generate S-records by using an output -target of @samp{srec} (e.g., use @samp{-O srec}). - -@code{objcopy} can be used to generate a raw binary file by using an -output target of @samp{binary} (e.g., use @samp{-O binary}). When -@code{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 @samp{-S} to remove sections containing debugging information. In -some cases @samp{-R} will be useful to remove sections which contain -information that is not needed by the binary file. - -@table @code -@item @var{infile} -@itemx @var{outfile} -The input and output files, respectively. -If you do not specify @var{outfile}, @code{objcopy} creates a -temporary file and destructively renames the result with -the name of @var{infile}. - -@item -I @var{bfdname} -@itemx --input-target=@var{bfdname} -Consider the source file's object format to be @var{bfdname}, rather than -attempting to deduce it. @xref{Target Selection}, for more information. - -@item -O @var{bfdname} -@itemx --output-target=@var{bfdname} -Write the output file using the object format @var{bfdname}. -@xref{Target Selection}, for more information. - -@item -F @var{bfdname} -@itemx --target=@var{bfdname} -Use @var{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. @xref{Target Selection}, for more information. - -@item -j @var{sectionname} -@itemx --only-section=@var{sectionname} -Copy only the named section 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. - -@item -R @var{sectionname} -@itemx --remove-section=@var{sectionname} -Remove any section named @var{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. - -@item -S -@itemx --strip-all -Do not copy relocation and symbol information from the source file. - -@item -g -@itemx --strip-debug -Do not copy debugging symbols from the source file. - -@item --strip-unneeded -Strip all symbols that are not needed for relocation processing. - -@item -K @var{symbolname} -@itemx --keep-symbol=@var{symbolname} -Copy only symbol @var{symbolname} from the source file. This option may -be given more than once. - -@item -N @var{symbolname} -@itemx --strip-symbol=@var{symbolname} -Do not copy symbol @var{symbolname} from the source file. This option -may be given more than once. - -@item -L @var{symbolname} -@itemx --localize-symbol=@var{symbolname} -Make symbol @var{symbolname} local to the file, so that it is not -visible externally. This option may be given more than once. - -@item -W @var{symbolname} -@itemx --weaken-symbol=@var{symbolname} -Make symbol @var{symbolname} weak. This option may be given more than once. - -@item -x -@itemx --discard-all -Do not copy non-global symbols from the source file. -@c FIXME any reason to prefer "non-global" to "local" here? - -@item -X -@itemx --discard-locals -Do not copy compiler-generated local symbols. -(These usually start with @samp{L} or @samp{.}.) - -@item -b @var{byte} -@itemx --byte=@var{byte} -Keep only every @var{byte}th byte of the input file (header data is not -affected). @var{byte} can be in the range from 0 to @var{interleave}-1, -where @var{interleave} is given by the @samp{-i} or @samp{--interleave} -option, or the default of 4. This option is useful for creating files -to program @sc{rom}. It is typically used with an @code{srec} output -target. - -@item -i @var{interleave} -@itemx --interleave=@var{interleave} -Only copy one out of every @var{interleave} bytes. Select which byte to -copy with the @var{-b} or @samp{--byte} option. The default is 4. -@code{objcopy} ignores this option if you do not specify either @samp{-b} or -@samp{--byte}. - -@item -p -@itemx --preserve-dates -Set the access and modification dates of the output file to be the same -as those of the input file. - -@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. - -@item --gap-fill @var{val} -Fill gaps between sections with @var{val}. This operation applies to -the @emph{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 @var{val}. - -@item --pad-to @var{address} -Pad the output file up to the load address @var{address}. This is -done by increasing the size of the last section. The extra space is -filled in with the value specified by @samp{--gap-fill} (default zero). - -@item --set-start @var{val} -Set the start address of the new file to @var{val}. Not all object file -formats support setting the start address. - -@item --change-start @var{incr} -@itemx --adjust-start @var{incr} -@cindex changing start address -Change the start address by adding @var{incr}. Not all object file -formats support setting the start address. - -@item --change-addresses @var{incr} -@itemx --adjust-vma @var{incr} -@cindex changing object addresses -Change the VMA and LMA addresses of all sections, as well as the start -address, by adding @var{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. - -@item --change-section-address @var{section}@{=,+,-@}@var{val} -@itemx --adjust-section-vma @var{section}@{=,+,-@}@var{val} -@cindex changing section address -Set or change both the VMA address and the LMA address of the named -@var{section}. If @samp{=} is used, the section address is set to -@var{val}. Otherwise, @var{val} is added to or subtracted from the -section address. See the comments under @samp{--change-addresses}, -above. If @var{section} does not exist in the input file, a warning will -be issued, unless @samp{--no-change-warnings} is used. - -@item --change-section-lma @var{section}@{=,+,-@}@var{val} -@cindex changing section LMA -Set or change the LMA address of the named @var{section}. 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 @samp{=} is used, the section address is set to -@var{val}. Otherwise, @var{val} is added to or subtracted from the -section address. See the comments under @samp{--change-addresses}, -above. If @var{section} does not exist in the input file, a warning -will be issued, unless @samp{--no-change-warnings} is used. - -@item --change-section-vma @var{section}@{=,+,-@}@var{val} -@cindex changing section VMA -Set or change the VMA address of the named @var{section}. 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 @samp{=} is used, the section address -is set to @var{val}. Otherwise, @var{val} is added to or subtracted -from the section address. See the comments under -@samp{--change-addresses}, above. If @var{section} does not exist in -the input file, a warning will be issued, unless -@samp{--no-change-warnings} is used. - -@item --change-warnings -@itemx --adjust-warnings -If @samp{--change-section-address} or @samp{--change-section-lma} or -@samp{--change-section-vma} is used, and the named section does not -exist, issue a warning. This is the default. - -@item --no-change-warnings -@itemx --no-adjust-warnings -Do not issue a warning if @samp{--change-section-address} or -@samp{--adjust-section-lma} or @samp{--adjust-section-vma} is used, even -if the named section does not exist. - -@item --set-section-flags @var{section}=@var{flags} -Set the flags for the named section. The @var{flags} argument is a -comma separated string of flag names. The recognized names are -@samp{alloc}, @samp{contents}, @samp{load}, @samp{noload}, -@samp{readonly}, @samp{code}, @samp{data}, @samp{rom}, @samp{share}, and -@samp{debug}. You can set the @samp{contents} flag for a section which -does not have contents, but it is not meaningful to clear the -@samp{contents} flag of a section which does have contents--just remove -the section instead. Not all flags are meaningful for all object file -formats. - -@item --add-section @var{sectionname}=@var{filename} -Add a new section named @var{sectionname} while copying the file. The -contents of the new section are taken from the file @var{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. - -@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 @code{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. - -@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 -@code{--change-leading-char} because it always changes the symbol name -when appropriate, regardless of the object file format of the output -file. - -@item --redefine-sym @var{old}=@var{new} -Change the name of a symbol @var{old}, to @var{new}. This can be useful -when one is trying link two things together for which you have no -source, and there are name collisions. - -@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 @code{-R} option to the linker. This option is only effective when -using an object file format which supports weak symbols. - -@item -V -@itemx --version -Show the version number of @code{objcopy}. - -@item -v -@itemx --verbose -Verbose output: list all object files modified. In the case of -archives, @samp{objcopy -V} lists all members of the archive. - -@item --help -Show a summary of the options to @code{objcopy}. -@end table - -@node objdump -@chapter objdump - -@cindex object file information -@kindex objdump - -@smallexample -objdump [ -a | --archive-headers ] - [ -b @var{bfdname} | --target=@var{bfdname} ] - [ -C | --demangle ] - [ -d | --disassemble ] - [ -D | --disassemble-all ] - [ -z | --disassemble-zeroes ] - [ -EB | -EL | --endian=@{big | little @} ] - [ -f | --file-headers ] - [ --file-start-context ] - [ -g | --debugging ] - [ -h | --section-headers | --headers ] - [ -i | --info ] - [ -j @var{section} | --section=@var{section} ] - [ -l | --line-numbers ] - [ -S | --source ] - [ -m @var{machine} | --architecture=@var{machine} ] - [ -M @var{options} | --disassembler-options=@var{options}] - [ -p | --private-headers ] - [ -r | --reloc ] - [ -R | --dynamic-reloc ] - [ -s | --full-contents ] - [ -G | --stabs ] - [ -t | --syms ] - [ -T | --dynamic-syms ] - [ -x | --all-headers ] - [ -w | --wide ] - [ --start-address=@var{address} ] - [ --stop-address=@var{address} ] - [ --prefix-addresses] - [ --[no-]show-raw-insn ] - [ --adjust-vma=@var{offset} ] - [ -V | --version ] - [ -H | --help ] - @var{objfile}@dots{} -@end smallexample - -@code{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. - -@var{objfile}@dots{} are the object files to be examined. When you -specify archives, @code{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 -@samp{-a,-d,-D,-f,-g,-G,-h,-H,-p,-r,-R,-S,-t,-T,-V,-x} must be given. - -@table @code -@item -a -@itemx --archive-header -@cindex archive headers -If any of the @var{objfile} files are archives, display the archive -header information (in a format similar to @samp{ls -l}). Besides the -information you could list with @samp{ar tv}, @samp{objdump -a} shows -the object file format of each archive member. - -@item --adjust-vma=@var{offset} -@cindex section addresses in objdump -@cindex VMA in objdump -When dumping information, first add @var{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. - -@item -b @var{bfdname} -@itemx --target=@var{bfdname} -@cindex object code format -Specify that the object-code format for the object files is -@var{bfdname}. This option may not be necessary; @var{objdump} can -automatically recognize many formats. - -For example, -@example -objdump -b oasys -m vax -h fu.o -@end example -@noindent -displays summary information from the section headers (@samp{-h}) of -@file{fu.o}, which is explicitly identified (@samp{-m}) as a VAX object -file in the format produced by Oasys compilers. You can list the -formats available with the @samp{-i} option. -@xref{Target Selection}, for more information. - -@item -C -@itemx --demangle -@cindex demangling in objdump -Decode (@dfn{demangle}) low-level symbol names into user-level names. -Besides removing any initial underscore prepended by the system, this -makes C++ function names readable. @xref{c++filt}, for more information -on demangling. - -@item -G -@item --debugging -Display debugging information. This attempts to parse debugging -information stored in the file and print it out using a C like syntax. -Only certain types of debugging information have been implemented. - -@item -d -@itemx --disassemble -@cindex disassembling object code -@cindex machine instructions -Display the assembler mnemonics for the machine instructions from -@var{objfile}. This option only disassembles those sections which are -expected to contain instructions. - -@item -D -@itemx --disassemble-all -Like @samp{-d}, but disassemble the contents of all sections, not just -those expected to contain instructions. - -@item --prefix-addresses -When disassembling, print the complete address on each line. This is -the older disassembly format. - -@item --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. - -@item -EB -@itemx -EL -@itemx --endian=@{big|little@} -@cindex endianness -@cindex disassembly endianness -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. - -@item -f -@itemx --file-header -@cindex object file header -Display summary information from the overall header of -each of the @var{objfile} files. - -@item --file-start-context -@cindex source code 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. - -@item -h -@itemx --section-header -@itemx --header -@cindex section 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 @samp{-Ttext}, @samp{-Tdata}, or @samp{-Tbss} options to -@code{ld}. However, some object file formats, such as a.out, do not -store the starting address of the file segments. In those situations, -although @code{ld} relocates the sections correctly, using @samp{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. - -@item --help -Print a summary of the options to @code{objdump} and exit. - -@item -i -@itemx --info -@cindex architectures available -@cindex object formats available -Display a list showing all architectures and object formats available -for specification with @samp{-b} or @samp{-m}. - -@item -j @var{name} -@itemx --section=@var{name} -@cindex section information -Display information only for section @var{name}. - -@item -l -@itemx --line-numbers -@cindex source filenames for object files -Label the display (using debugging information) with the filename and -source line numbers corresponding to the object code or relocs shown. -Only useful with @samp{-d}, @samp{-D}, or @samp{-r}. - -@item -m @var{machine} -@itemx --architecture=@var{machine} -@cindex architecture -@cindex disassembly architecture -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 @samp{-i} option. - -@item -M @var{options} -@itemx --disassembler-options=@var{options} -Pass target specific information to the disassembler. Only supported on -some targets. - -If the target is an ARM architecture then this switch can be used to -select which register name set is used during disassembler. Specifying -@samp{-M reg-name-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 -@samp{-M reg-names-apcs} will select the name set used by the ARM -Procedure Call Standard, whilst specifying @samp{-M reg-names-raw} will -just use @samp{r} followed by the register number. - -There are also two variants on the APCS register naming scheme enabled -by @samp{-M reg-names-atpcs} and @samp{-M reg-names-special-atpcs} which -use the ARM/Thumb Procedure Call Standard naming conventions. (Eiuther -with the normal register name sor 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 @samp{--disassembler-options=force-thumb}. This can be -useful when attempting to disassemble thumb code produced by other -compilers. - -@item -p -@itemx --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. - -@item -r -@itemx --reloc -@cindex relocation entries, in object file -Print the relocation entries of the file. If used with @samp{-d} or -@samp{-D}, the relocations are printed interspersed with the -disassembly. - -@item -R -@itemx --dynamic-reloc -@cindex dynamic relocation entries, in object file -Print the dynamic relocation entries of the file. This is only -meaningful for dynamic objects, such as certain types of shared -libraries. - -@item -s -@itemx --full-contents -@cindex sections, full contents -@cindex object file sections -Display the full contents of any sections requested. - -@item -S -@itemx --source -@cindex source disassembly -@cindex disassembly, with source -Display source code intermixed with disassembly, if possible. Implies -@samp{-d}. - -@item --show-raw-insn -When disassembling instructions, print the instruction in hex as well as -in symbolic form. This is the default except when -@code{--prefix-addresses} is used. - -@item --no-show-raw-insn -When disassembling instructions, do not print the instruction bytes. -This is the default when @code{--prefix-addresses} is used. - -@item -G -@item --stabs -@cindex stab -@cindex .stab -@cindex debug symbols -@cindex ELF object file format -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 -@code{.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 @samp{--syms} -output. For more information on stabs symbols, see @ref{Top,Stabs,Stabs -Overview,stabs.info, The ``stabs'' debug format}. - -@item --start-address=@var{address} -@cindex start-address -Start displaying data at the specified address. This affects the output -of the @code{-d}, @code{-r} and @code{-s} options. - -@item --stop-address=@var{address} -@cindex stop-address -Stop displaying data at the specified address. This affects the output -of the @code{-d}, @code{-r} and @code{-s} options. - -@item -t -@itemx --syms -@cindex symbol table entries, printing -Print the symbol table entries of the file. -This is similar to the information provided by the @samp{nm} program. - -@item -T -@itemx --dynamic-syms -@cindex dynamic symbol table entries, printing -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 @samp{nm} -program when given the @samp{-D} (@samp{--dynamic}) option. - -@item --version -Print the version number of @code{objdump} and exit. - -@item -x -@itemx --all-header -@cindex all header information, object file -@cindex header information, all -Display all available header information, including the symbol table and -relocation entries. Using @samp{-x} is equivalent to specifying all of -@samp{-a -f -h -r -t}. - -@item -w -@itemx --wide -@cindex wide output, printing -Format some lines for output devices that have more than 80 columns. -@end table - -@node ranlib -@chapter ranlib - -@kindex ranlib -@cindex archive contents -@cindex symbol index - -@smallexample -ranlib [-vV] @var{archive} -@end smallexample - -@code{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 @samp{nm -s} or @samp{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 @sc{gnu} @code{ranlib} program is another form of @sc{gnu} @code{ar}; running -@code{ranlib} is completely equivalent to executing @samp{ar -s}. -@xref{ar}. - -@table @code -@item -v -@itemx -V -@itemx --version -Show the version number of @code{ranlib}. -@end table - -@node size -@chapter size - -@kindex size -@cindex section sizes - -@smallexample -size [ -A | -B | --format=@var{compatibility} ] - [ --help ] [ -d | -o | -x | --radix=@var{number} ] - [ --target=@var{bfdname} ] [ -V | --version ] - [ @var{objfile}@dots{} ] -@end smallexample - -The @sc{gnu} @code{size} utility lists the section sizes---and the total -size---for each of the object or archive files @var{objfile} in its -argument list. By default, one line of output is generated for each -object file or each module in an archive. - -@var{objfile}@dots{} are the object files to be examined. -If none are specified, the file @code{a.out} will be used. - -The command line options have the following meanings: - -@table @code -@item -A -@itemx -B -@itemx --format=@var{compatibility} -@cindex @code{size} display format -Using one of these options, you can choose whether the output from @sc{gnu} -@code{size} resembles output from System V @code{size} (using @samp{-A}, -or @samp{--format=sysv}), or Berkeley @code{size} (using @samp{-B}, or -@samp{--format=berkeley}). The default is the one-line format similar to -Berkeley's. -@c Bonus for doc-source readers: you can also say --format=strange (or -@c anything else that starts with 's') for sysv, and --format=boring (or -@c anything else that starts with 'b') for Berkeley. - -Here is an example of the Berkeley (default) format of output from -@code{size}: -@smallexample -$ size --format=Berkeley ranlib size -text data bss dec hex filename -294880 81920 11592 388392 5ed28 ranlib -294880 81920 11888 388688 5ee50 size -@end smallexample - -@noindent -This is the same data, but displayed closer to System V conventions: - -@smallexample -$ 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 -@end smallexample - -@item --help -Show a summary of acceptable arguments and options. - -@item -d -@itemx -o -@itemx -x -@itemx --radix=@var{number} -@cindex @code{size} number format -@cindex radix for section sizes -Using one of these options, you can control whether the size of each -section is given in decimal (@samp{-d}, or @samp{--radix=10}); octal -(@samp{-o}, or @samp{--radix=8}); or hexadecimal (@samp{-x}, or -@samp{--radix=16}). In @samp{--radix=@var{number}}, only the three -values (8, 10, 16) are supported. The total size is always given in two -radices; decimal and hexadecimal for @samp{-d} or @samp{-x} output, or -octal and hexadecimal if you're using @samp{-o}. - -@item --target=@var{bfdname} -@cindex object code format -Specify that the object-code format for @var{objfile} is -@var{bfdname}. This option may not be necessary; @code{size} can -automatically recognize many formats. -@xref{Target Selection}, for more information. - -@item -V -@itemx --version -Display the version number of @code{size}. -@end table - -@node strings -@chapter strings -@kindex strings -@cindex listings strings -@cindex printing strings -@cindex strings, printing - -@smallexample -strings [-afov] [-@var{min-len}] [-n @var{min-len}] [-t @var{radix}] [-] - [--all] [--print-file-name] [--bytes=@var{min-len}] - [--radix=@var{radix}] [--target=@var{bfdname}] - [--help] [--version] @var{file}@dots{} -@end smallexample - -For each @var{file} given, @sc{gnu} @code{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. - -@code{strings} is mainly useful for determining the contents of non-text -files. - -@table @code -@item -a -@itemx --all -@itemx - -Do not scan only the initialized and loaded sections of object files; -scan the whole files. - -@item -f -@itemx --print-file-name -Print the name of the file before each string. - -@item --help -Print a summary of the program usage on the standard output and exit. - -@item -@var{min-len} -@itemx -n @var{min-len} -@itemx --bytes=@var{min-len} -Print sequences of characters that are at least @var{min-len} characters -long, instead of the default 4. - -@item -o -Like @samp{-t o}. Some other versions of @code{strings} have @samp{-o} -act like @samp{-t d} instead. Since we can not be compatible with both -ways, we simply chose one. - -@item -t @var{radix} -@itemx --radix=@var{radix} -Print the offset within the file before each string. The single -character argument specifies the radix of the offset---@samp{o} for -octal, @samp{x} for hexadecimal, or @samp{d} for decimal. - -@item --target=@var{bfdname} -@cindex object code format -Specify an object code format other than your system's default format. -@xref{Target Selection}, for more information. - -@item -v -@itemx --version -Print the program version number on the standard output and exit. -@end table - -@node strip -@chapter strip - -@kindex strip -@cindex removing symbols -@cindex discarding symbols -@cindex symbols, discarding - -@smallexample -strip [ -F @var{bfdname} | --target=@var{bfdname} ] - [ -I @var{bfdname} | --input-target=@var{bfdname} ] - [ -O @var{bfdname} | --output-target=@var{bfdname} ] - [ -s | --strip-all ] [ -S | -g | --strip-debug ] - [ -K @var{symbolname} | --keep-symbol=@var{symbolname} ] - [ -N @var{symbolname} | --strip-symbol=@var{symbolname} ] - [ -x | --discard-all ] [ -X | --discard-locals ] - [ -R @var{sectionname} | --remove-section=@var{sectionname} ] - [ -o @var{file} ] [ -p | --preserve-dates ] - [ -v | --verbose ] [ -V | --version ] [ --help ] - @var{objfile}@dots{} -@end smallexample - -@sc{gnu} @code{strip} discards all symbols from object files -@var{objfile}. The list of object files may include archives. -At least one object file must be given. - -@code{strip} modifies the files named in its argument, -rather than writing modified copies under different names. - -@table @code -@item -F @var{bfdname} -@itemx --target=@var{bfdname} -Treat the original @var{objfile} as a file with the object -code format @var{bfdname}, and rewrite it in the same format. -@xref{Target Selection}, for more information. - -@item --help -Show a summary of the options to @code{strip} and exit. - -@item -I @var{bfdname} -@itemx --input-target=@var{bfdname} -Treat the original @var{objfile} as a file with the object -code format @var{bfdname}. -@xref{Target Selection}, for more information. - -@item -O @var{bfdname} -@itemx --output-target=@var{bfdname} -Replace @var{objfile} with a file in the output format @var{bfdname}. -@xref{Target Selection}, for more information. - -@item -R @var{sectionname} -@itemx --remove-section=@var{sectionname} -Remove any section named @var{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. - -@item -s -@itemx --strip-all -Remove all symbols. - -@item -g -@itemx -S -@itemx --strip-debug -Remove debugging symbols only. - -@item --strip-unneeded -Remove all symbols that are not needed for relocation processing. - -@item -K @var{symbolname} -@itemx --keep-symbol=@var{symbolname} -Keep only symbol @var{symbolname} from the source file. This option may -be given more than once. - -@item -N @var{symbolname} -@itemx --strip-symbol=@var{symbolname} -Remove symbol @var{symbolname} from the source file. This option may be -given more than once, and may be combined with strip options other than -@code{-K}. - -@item -o @var{file} -Put the stripped output in @var{file}, rather than replacing the -existing file. When this argument is used, only one @var{objfile} -argument may be specified. - -@item -p -@itemx --preserve-dates -Preserve the access and modification dates of the file. - -@item -x -@itemx --discard-all -Remove non-global symbols. - -@item -X -@itemx --discard-locals -Remove compiler-generated local symbols. -(These usually start with @samp{L} or @samp{.}.) - -@item -V -@itemx --version -Show the version number for @code{strip}. - -@item -v -@itemx --verbose -Verbose output: list all object files modified. In the case of -archives, @samp{strip -v} lists all members of the archive. -@end table - -@node c++filt, addr2line, strip, Top -@chapter c++filt - -@kindex c++filt -@cindex demangling C++ symbols - -@smallexample -c++filt [ -_ | --strip-underscores ] - [ -j | --java ] - [ -n | --no-strip-underscores ] - [ -s @var{format} | --format=@var{format} ] - [ --help ] [ --version ] [ @var{symbol}@dots{} ] -@end smallexample - -@kindex cxxfilt -The C++ and Java languages provides function overloading, which means -that you can write many functions with the same name (providing each -takes parameters of different types). All C++ and Java function names -are encoded into a low-level assembly label (this process is known as -@dfn{mangling}). The @code{c++filt} -@footnote{MS-DOS does not allow @kbd{+} characters in file names, so on -MS-DOS this program is named @code{cxxfilt}.} -program does the inverse mapping: it decodes (@dfn{demangles}) low-level -names into user-level names so that the linker can keep these overloaded -functions from clashing. - -Every alphanumeric word (consisting of letters, digits, underscores, -dollars, or periods) seen in the input is a potential label. If the -label decodes into a C++ name, the C++ name replaces the low-level -name in the output. - -You can use @code{c++filt} to decipher individual symbols: - -@example -c++filt @var{symbol} -@end example - -If no @var{symbol} arguments are given, @code{c++filt} reads symbol -names from the standard input and writes the demangled names to the -standard output. All results are printed on the standard output. - -@table @code -@item -_ -@itemx --strip-underscores -On some systems, both the C and C++ compilers put an underscore in front -of every name. For example, the C name @code{foo} gets the low-level -name @code{_foo}. This option removes the initial underscore. Whether -@code{c++filt} removes the underscore by default is target dependent. - -@item -j -@itemx --java -Prints demangled names using Java syntax. The default is to use C++ -syntax. - -@item -n -@itemx --no-strip-underscores -Do not remove the initial underscore. - -@item -s @var{format} -@itemx --format=@var{format} -@sc{gnu} @code{nm} can decode three different methods of mangling, used by -different C++ compilers. The argument to this option selects which -method it uses: - -@table @code -@item gnu -the one used by the @sc{gnu} compiler (the default method) -@item lucid -the one used by the Lucid compiler -@item arm -the one specified by the C++ Annotated Reference Manual -@item hp -the one used by the HP compiler -@item edg -the one used by the EDG compiler -@end table - -@item --help -Print a summary of the options to @code{c++filt} and exit. - -@item --version -Print the version number of @code{c++filt} and exit. -@end table - -@quotation -@emph{Warning:} @code{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 the future to decode a name -passed as an argument on the command line; in other words, - -@example -c++filt @var{symbol} -@end example - -@noindent -may in a future release become - -@example -c++filt @var{option} @var{symbol} -@end example -@end quotation - -@node addr2line -@chapter addr2line - -@kindex addr2line -@cindex address to file name and line number - -@smallexample -addr2line [ -b @var{bfdname} | --target=@var{bfdname} ] - [ -C | --demangle ] - [ -e @var{filename} | --exe=@var{filename} ] - [ -f | --functions ] [ -s | --basename ] - [ -H | --help ] [ -V | --version ] - [ addr addr ... ] -@end smallexample - -@code{addr2line} translates program addresses into file names and line -numbers. Given an address and an executable, it uses the debugging -information in the executable to figure out which file name and line -number are associated with a given address. - -The executable to use is specified with the @code{-e} option. The -default is the file @file{a.out}. - -@code{addr2line} has two modes of operation. - -In the first, hexadecimal addresses are specified on the command line, -and @code{addr2line} displays the file name and line number for each -address. - -In the second, @code{addr2line} reads hexadecimal addresses from -standard input, and prints the file name and line number for each -address on standard output. In this mode, @code{addr2line} may be used -in a pipe to convert dynamically chosen addresses. - -The format of the output is @samp{FILENAME:LINENO}. The file name and -line number for each address is printed on a separate line. If the -@code{-f} option is used, then each @samp{FILENAME:LINENO} line is -preceded by a @samp{FUNCTIONNAME} line which is the name of the function -containing the address. - -If the file name or function name can not be determined, -@code{addr2line} will print two question marks in their place. If the -line number can not be determined, @code{addr2line} will print 0. - -The long and short forms of options, shown here as alternatives, are -equivalent. - -@table @code -@item -b @var{bfdname} -@itemx --target=@var{bfdname} -@cindex object code format -Specify that the object-code format for the object files is -@var{bfdname}. - -@item -C -@itemx --demangle -@cindex demangling in objdump -Decode (@dfn{demangle}) low-level symbol names into user-level names. -Besides removing any initial underscore prepended by the system, this -makes C++ function names readable. @xref{c++filt}, for more information -on demangling. - -@item -e @var{filename} -@itemx --exe=@var{filename} -Specify the name of the executable for which addresses should be -translated. The default file is @file{a.out}. - -@item -f -@itemx --functions -Display function names as well as file and line number information. - -@item -s -@itemx --basenames -Display only the base of each file name. -@end table - -@node nlmconv -@chapter nlmconv - -@code{nlmconv} converts a relocatable object file into a NetWare -Loadable Module. - -@ignore -@code{nlmconv} currently works with @samp{i386} object -files in @code{coff}, @sc{elf}, or @code{a.out} format, and @sc{SPARC} -object files in @sc{elf}, or @code{a.out} format@footnote{ -@code{nlmconv} should work with any @samp{i386} or @sc{sparc} object -format in the Binary File Descriptor library. It has only been tested -with the above formats.}. -@end ignore - -@quotation -@emph{Warning:} @code{nlmconv} is not always built as part of the binary -utilities, since it is only useful for NLM targets. -@end quotation - -@smallexample -nlmconv [ -I @var{bfdname} | --input-target=@var{bfdname} ] - [ -O @var{bfdname} | --output-target=@var{bfdname} ] - [ -T @var{headerfile} | --header-file=@var{headerfile} ] - [ -d | --debug] [ -l @var{linker} | --linker=@var{linker} ] - [ -h | --help ] [ -V | --version ] - @var{infile} @var{outfile} -@end smallexample - -@code{nlmconv} converts the relocatable @samp{i386} object file -@var{infile} into the NetWare Loadable Module @var{outfile}, optionally -reading @var{headerfile} for NLM header information. For instructions -on writing the NLM command file language used in header files, see the -@samp{linkers} section, @samp{NLMLINK} in particular, of the @cite{NLM -Development and Tools Overview}, which is part of the NLM Software -Developer's Kit (``NLM SDK''), available from Novell, Inc. -@code{nlmconv} uses the @sc{gnu} Binary File Descriptor library to read -@var{infile}; see @ref{BFD,,BFD,ld.info,Using LD}, for -more information. - -@code{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, @code{nlmconv} calls the linker for you. - -@table @code -@item -I @var{bfdname} -@itemx --input-target=@var{bfdname} -Object format of the input file. @code{nlmconv} can usually determine -the format of a given file (so no default is necessary). -@xref{Target Selection}, for more information. - -@item -O @var{bfdname} -@itemx --output-target=@var{bfdname} -Object format of the output file. @code{nlmconv} infers the output -format based on the input format, e.g. for a @samp{i386} input file the -output format is @samp{nlm32-i386}. -@xref{Target Selection}, for more information. - -@item -T @var{headerfile} -@itemx --header-file=@var{headerfile} -Reads @var{headerfile} for NLM header information. For instructions on -writing the NLM command file language used in header files, see@ see the -@samp{linkers} section, of the @cite{NLM Development and Tools -Overview}, which is part of the NLM Software Developer's Kit, available -from Novell, Inc. - -@item -d -@itemx --debug -Displays (on standard error) the linker command line used by @code{nlmconv}. - -@item -l @var{linker} -@itemx --linker=@var{linker} -Use @var{linker} for any linking. @var{linker} can be an absolute or a -relative pathname. - -@item -h -@itemx --help -Prints a usage summary. - -@item -V -@itemx --version -Prints the version number for @code{nlmconv}. -@end table - -@node windres -@chapter windres - -@code{windres} may be used to manipulate Windows resources. - -@quotation -@emph{Warning:} @code{windres} is not always built as part of the binary -utilities, since it is only useful for Windows targets. -@end quotation - -@smallexample -windres [options] [input-file] [output-file] -@end smallexample - -@code{windres} reads resources from an input file and copies them into -an output file. Either file may be in one of three formats: - -@table @code -@item rc -A text format read by the Resource Compiler. - -@item res -A binary format generated by the Resource Compiler. - -@item coff -A COFF object or executable. -@end table - -The exact description of these different formats is available in -documentation from Microsoft. - -When @code{windres} converts from the @code{rc} format to the @code{res} -format, it is acting like the Windows Resource Compiler. When -@code{windres} converts from the @code{res} format to the @code{coff} -format, it is acting like the Windows @code{CVTRES} program. - -When @code{windres} generates an @code{rc} file, the output is similar -but not identical to the format expected for the input. When an input -@code{rc} file refers to an external filename, an output @code{rc} file -will instead include the file contents. - -If the input or output format is not specified, @code{windres} will -guess based on the file name, or, for the input file, the file contents. -A file with an extension of @file{.rc} will be treated as an @code{rc} -file, a file with an extension of @file{.res} will be treated as a -@code{res} file, and a file with an extension of @file{.o} or -@file{.exe} will be treated as a @code{coff} file. - -If no output file is specified, @code{windres} will print the resources -in @code{rc} format to standard output. - -The normal use is for you to write an @code{rc} file, use @code{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 -@code{rc} file available to Windows. - -@table @code -@item -i @var{filename} -@itemx --input @var{filename} -The name of the input file. If this option is not used, then -@code{windres} will use the first non-option argument as the input file -name. If there are no non-option arguments, then @code{windres} will -read from standard input. @code{windres} can not read a COFF file from -standard input. - -@item -o @var{filename} -@itemx --output @var{filename} -The name of the output file. If this option is not used, then -@code{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 @code{windres} will write to standard output. -@code{windres} can not write a COFF file to standard output. - -@item -I @var{format} -@itemx --input-format @var{format} -The input format to read. @var{format} may be @samp{res}, @samp{rc}, or -@samp{coff}. If no input format is specified, @code{windres} will -guess, as described above. - -@item -O @var{format} -@itemx --output-format @var{format} -The output format to generate. @var{format} may be @samp{res}, -@samp{rc}, or @samp{coff}. If no output format is specified, -@code{windres} will guess, as described above. - -@item -F @var{target} -@itemx --target @var{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 @code{--help} option to see a list -of supported targets. Normally @code{windres} will use the default -format, which is the first one listed by the @code{--help} option. -@ref{Target Selection}. - -@item --preprocessor @var{program} -When @code{windres} reads an @code{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 @code{gcc -E -xc-header -DRC_INVOKED}. - -@item --include-dir @var{directory} -Specify an include directory to use when reading an @code{rc} file. -@code{windres} will pass this to the preprocessor as an @code{-I} -option. @code{windres} will also search this directory when looking for -files named in the @code{rc} file. - -@item -D @var{target} -@itemx --define @var{sym}[=@var{val}] -Specify a @code{-D} option to pass to the preprocessor when reading an -@code{rc} file. - -@item -v -Enable verbose mode. This tells you what the preprocessor is if you -didn't specify one. - -@item --language @var{val} -Specify the default language to use when reading an @code{rc} file. -@var{val} should be a hexadecimal language code. The low eight bits are -the language, and the high eight bits are the sublanguage. - -@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). - -@item --no-use-temp-file -Use popen, not a temporary file, to read the output of the preprocessor. -This is the default behaviour. - -@item --help -Prints a usage summary. - -@item --version -Prints the version number for @code{windres}. - -@item --yydebug -If @code{windres} is compiled with @code{YYDEBUG} defined as @code{1}, -this will turn on parser debugging. -@end table - - -@node dlltool -@chapter Create files needed to build and use DLLs -@cindex DLL -@kindex dlltool - -@code{dlltool} may be used to create the files needed to build and use -dynamic link libraries (DLLs). - -@quotation -@emph{Warning:} @code{dlltool} is not always built as part of the binary -utilities, since it is only useful for those targets which support DLLs. -@end quotation - -@smallexample -dlltool [-d|--input-def @var{def-file-name}] - [-b|--base-file @var{base-file-name}] - [-e|--output-exp @var{exports-file-name}] - [-z|--output-def @var{def-file-name}] - [-l|--output-lib @var{library-file-name}] - [--export-all-symbols] [--no-export-all-symbols] - [--exclude-symbols @var{list}] - [--no-default-excludes] - [-S|--as @var{path-to-assembler}] [-f|--as-flags @var{options}] - [-D|--dllname @var{name}] [-m|--machine @var{machine}] - [-a|--add-indirect] [-U|--add-underscore] [-k|--kill-at] - [-A|--add-stdcall-alias] - [-x|--no-idata4] [-c|--no-idata5] [-i|--interwork] - [-n|--nodelete] [-v|--verbose] [-h|--help] [-V|--version] - [object-file @dots{}] -@end smallexample - -@code{dlltool} reads its inputs, which can come from the @samp{-d} and -@samp{-b} options as well as object files specified on the command -line. It then processes these inputs and if the @samp{-e} option has -been specified it creates a exports file. If the @samp{-l} option -has been specified it creates a library file and if the @samp{-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. @code{dlltool} can help with the creation of -these files. - -The first file is a @samp{.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 @code{dlltool} can be used -to create it using the @samp{-z} option. In this case @code{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 @samp{-export:} entry in the @samp{.drectve} -section of the object file. This can be done in C by using the -asm() operator: - -@smallexample - asm (".section .drectve"); - asm (".ascii \"-export:my_func\""); - - int my_func (void) @{ @dots{} @} -@end smallexample - -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 @samp{-e} option to -@code{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. This file -can be created by giving the @samp{-l} option to dlltool when it -is creating or reading in a .def file. - -@code{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 @samp{-S} command line option can be -used to specify the path to the assembler that dlltool will use, -and the @samp{-f} option can be used to pass specific flags to that -assembler. The @samp{-n} can be used to prevent dlltool from deleting -these temporary assembler files when it is done, and if @samp{-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 @samp{dll.c} and -also creating a program (from an object file called @samp{program.o}) -that uses that DLL: - -@smallexample - 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 -@end smallexample - -The command line options have the following meanings: - -@table @code - -@item -d @var{filename} -@itemx --input-def @var{filename} -@cindex input .def file -Specifies the name of a .def file to be read in and processed. - -@item -b @var{filename} -@itemx --base-file @var{filename} -@cindex base files -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. - -@item -e @var{filename} -@itemx --output-exp @var{filename} -Specifies the name of the export file to be created by dlltool. - -@item -z @var{filename} -@itemx --output-def @var{filename} -Specifies the name of the .def file to be created by dlltool. - -@item -l @var{filename} -@itemx --output-lib @var{filename} -Specifies the name of the library file to be created by dlltool. - -@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 @code{--no-default-excludes} -option. You may add to the list of symbols to not export by using the -@code{--exclude-symbols} option. - -@item --no-export-all-symbols -Only export symbols explicitly listed in an input .def file or in -@samp{.drectve} sections in the input object files. This is the default -behaviour. The @samp{.drectve} sections are created by @samp{dllexport} -attributes in the source code. - -@item --exclude-symbols @var{list} -Do not export the symbols in @var{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 -@code{--export-all-symbols} is used. - -@item --no-default-excludes -When @code{--export-all-symbols} is used, it will by default avoid -exporting certain special symbols. The current list of symbols to avoid -exporting is @samp{DllMain@@12}, @samp{DllEntryPoint@@0}, -@samp{impure_ptr}. You may use the @code{--no-default-excludes} option -to go ahead and export these special symbols. This is only meaningful -when @code{--export-all-symbols} is used. - -@item -S @var{path} -@itemx --as @var{path} -Specifies the path, including the filename, of the assembler to be used -to create the exports file. - -@item -f @var{switches} -@itemx --as-flags @var{switches} -Specifies any specific command line switches to be passed to the -assembler when building the exports file. This option will work even if -the @samp{-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 switches to the assembler they should be enclosed in -double quotes. - -@item -D @var{name} -@itemx --dll-name @var{name} -Specifies the name to be stored in the .def file as the name of the DLL -when the @samp{-e} option is used. If this option is not present, then -the filename given to the @samp{-e} option will be used as the name of -the DLL. - -@item -m @var{machine} -@itemx -machine @var{machine} -Specifies the type of machine for which the library file should be -built. @code{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. - -@item -a -@itemx --add-indirect -Specifies that when @code{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! - -@item -U -@itemx --add-underscore -Specifies that when @code{dlltool} is creating the exports file it -should prepend an underscore to the names of the exported functions. - -@item -k -@itemx --kill-at -Specifies that when @code{dlltool} is creating the exports file it -should not append the string @samp{@@ }. These numbers are -called ordinal numbers and they represent another way of accessing the -function in a DLL, other than by name. - -@item -A -@itemx --add-stdcall-alias -Specifies that when @code{dlltool} is creating the exports file it -should add aliases for stdcall symbols without @samp{@@ } -in addition to the symbols with @samp{@@ }. - -@item -x -@itemx --no-idata4 -Specifies that when @code{dlltool} is creating the exports and library -files it should omit the .idata4 section. This is for compatibility -with certain operating systems. - -@item -c -@itemx --no-idata5 -Specifies that when @code{dlltool} is creating the exports and library -files it should omit the .idata5 section. This is for compatibility -with certain operating systems. - -@item -i -@itemx --interwork -Specifies that @code{dlltool} should mark the objects in the library -file and exports file that it produces as supporting interworking -between ARM and THUMB code. - -@item -n -@itemx --nodelete -Makes @code{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. - -@item -v -@itemx --verbose -Make dlltool describe what it is doing. - -@item -h -@itemx --help -Displays a list of command line options and then exits. - -@item -V -@itemx --version -Displays dlltool's version number and then exits. - -@end table - -@node readelf -@chapter readelf - -@cindex ELF file information -@kindex readelf - -@smallexample -readelf [ -a | --all ] - [ -h | --file-header] - [ -l | --program-headers | --segments] - [ -S | --section-headers | --sections] - [ -e | --headers] - [ -s | --syms | --symbols] - [ -n | --notes] - [ -r | --relocs] - [ -d | --dynamic] - [ -V | --version-info] - [ -D | --use-dynamic] - [ -x | --hex-dump=] - [ -w[liapr] | --debug-dump[=info,=line,=abbrev,=pubnames,=ranges]] - [ --histogram] - [ -v | --version] - [ -H | --help] - @var{elffile}@dots{} -@end smallexample - -@code{readelf} displays information about one or more ELF format object -files. The options control what particular information to display. - -@var{elffile}@dots{} are the object files to be examined. At the -moment, @code{readelf} does not support examining archives, nor does it -support examing 64 bit ELF files. - -The long and short forms of options, shown here as alternatives, are -equivalent. At least one option besides @samp{-v} or @samp{-H} must be -given. - -@table @code -@item -a -@itemx --all -Equivalent to specifiying @samp{--file-header}, -@samp{--program-headers}, @samp{--sections}, @samp{--symbols}, -@samp{--relocs}, @samp{--dynamic}, @samp{--notes} and -@samp{--version-info}. - -@item -h -@itemx --file-header -@cindex ELF file header information -Displays the information contained in the ELF header at the start of the -file. - -@item -l -@itemx --program-headers -@itemx --segments -@cindex ELF program header information -@cindex ELF segment information -Displays the information contained in the file's segment headers, if it -has any. - -@item -S -@itemx --sections -@itemx --section-headers -@cindex ELF section information -Displays the information contained in the file's section headers, if it -has any. - -@item -s -@itemx --symbols -@itemx --syms -@cindex ELF symbol table information -Displays the entries in symbol table section of the file, if it has one. - -@item -e -@itemx --headers -Display all the headers in the file. Equivalent to @samp{-h -l -S}. - -@item -n -@itemx --notes -@cindex ELF core notes -Displays the contents of the NOTE segment, if it exists. - -@item -r -@itemx --relocs -@cindex ELF reloc information -Displays the contents of the file's relocation section, if it ha one. - -@item -d -@itemx --dynamic -@cindex ELF dynamic section information -Displays the contents of the file's dynamic section, if it has one. - -@item -V -@itemx --version-info -@cindex ELF version sections informations -Displays the contents of the version sections in the file, it they -exist. - -@item -D -@itemx --use-dynamic -When displaying symbols, this option makes @code{readelf} use the -symblol table in the file's dynamic section, rather than the one in the -symbols section. - -@item -x -@itemx --hex-dump= -Displays the contents of the indicated section as a hexadecimal dump. - -@item -w[liapr] -@itemx --debug-dump[=line,=info,=abbrev,=pubnames,=ranges] -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. - -@item --histogram -Display a histogram of bucket list lengths when displaying the contents -of the symbol tables. - -@item -v -@itemx --version -Display the version number of readelf. - -@item -H -@itemx --help -Display the command line options understood by @code{readelf}. - -@end table - - -@node Selecting The Target System -@chapter Selecting the target system - -You can specify three aspects of the target system to the @sc{gnu} -binary file utilities, each in several ways: - -@itemize @bullet -@item -the target - -@item -the architecture - -@item -the linker emulation (which applies to the linker only) -@end itemize - -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 -@samp{--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 @dfn{native} (on hosts -with the same type as the target system). - -@menu -* Target Selection:: -* Architecture Selection:: -* Linker Emulation Selection:: -@end menu - -@node Target Selection -@section Target Selection - -A @dfn{target} is an object file format. A given target may be -supported for multiple architectures (@pxref{Architecture Selection}). -A target selection may also have variations for different operating -systems or architectures. - -The command to list valid target values is @samp{objdump -i} -(the first column of output contains the relevant information). - -Some sample values are: @samp{a.out-hp300bsd}, @samp{ecoff-littlemips}, -@samp{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 @file{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 @file{config.sub} which is included with the -sources. - -Some sample configuration triplets are: @samp{m68k-hp-bsd}, -@samp{mips-dec-ultrix}, @samp{sparc-sun-sunos}. - -@subheading @code{objdump} Target - -Ways to specify: - -@enumerate -@item -command line option: @samp{-b} or @samp{--target} - -@item -environment variable @code{GNUTARGET} - -@item -deduced from the input file -@end enumerate - -@subheading @code{objcopy} and @code{strip} Input Target - -Ways to specify: - -@enumerate -@item -command line options: @samp{-I} or @samp{--input-target}, or @samp{-F} or @samp{--target} - -@item -environment variable @code{GNUTARGET} - -@item -deduced from the input file -@end enumerate - -@subheading @code{objcopy} and @code{strip} Output Target - -Ways to specify: - -@enumerate -@item -command line options: @samp{-O} or @samp{--output-target}, or @samp{-F} or @samp{--target} - -@item -the input target (see ``@code{objcopy} and @code{strip} Input Target'' above) - -@item -environment variable @code{GNUTARGET} - -@item -deduced from the input file -@end enumerate - -@subheading @code{nm}, @code{size}, and @code{strings} Target - -Ways to specify: - -@enumerate -@item -command line option: @samp{--target} - -@item -environment variable @code{GNUTARGET} - -@item -deduced from the input file -@end enumerate - -@subheading Linker Input Target - -Ways to specify: - -@enumerate -@item -command line option: @samp{-b} or @samp{--format} -(@pxref{Options,,Options,ld.info,Using LD}) - -@item -script command @code{TARGET} -(@pxref{Option Commands,,Option Commands,ld.info,Using LD}) - -@item -environment variable @code{GNUTARGET} -(@pxref{Environment,,Environment,ld.info,Using LD}) - -@item -the default target of the selected linker emulation -(@pxref{Linker Emulation Selection}) -@end enumerate - -@subheading Linker Output Target - -Ways to specify: - -@enumerate -@item -command line option: @samp{-oformat} -(@pxref{Options,,Options,ld.info,Using LD}) - -@item -script command @code{OUTPUT_FORMAT} -(@pxref{Option Commands,,Option Commands,ld.info,Using LD}) - -@item -the linker input target (see ``Linker Input Target'' above) -@end enumerate - -@node Architecture Selection -@section Architecture selection - -An @dfn{architecture} is a type of @sc{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 @sc{cpu}. - -The command to list valid architecture values is @samp{objdump -i} (the -second column contains the relevant information). - -Sample values: @samp{m68k:68020}, @samp{mips:3000}, @samp{sparc}. - -@subheading @code{objdump} Architecture - -Ways to specify: - -@enumerate -@item -command line option: @samp{-m} or @samp{--architecture} - -@item -deduced from the input file -@end enumerate - -@subheading @code{objcopy}, @code{nm}, @code{size}, @code{strings} Architecture - -Ways to specify: - -@enumerate -@item -deduced from the input file -@end enumerate - -@subheading Linker Input Architecture - -Ways to specify: - -@enumerate -@item -deduced from the input file -@end enumerate - -@subheading Linker Output Architecture - -Ways to specify: - -@enumerate -@item -script command @code{OUTPUT_ARCH} -(@pxref{Option Commands,,Option Commands,ld.info,Using LD}) - -@item -the default architecture from the linker output target -(@pxref{Target Selection}) -@end enumerate - -@node Linker Emulation Selection -@section Linker emulation selection - -A linker @dfn{emulation} is a ``personality'' of the linker, which gives -the linker default values for the other aspects of the target system. -In particular, it consists of - -@itemize @bullet -@item -the linker script - -@item -the target - -@item -several ``hook'' functions that are run at certain stages of the linking -process to do special things that some targets require -@end itemize - -The command to list valid linker emulation values is @samp{ld -V}. - -Sample values: @samp{hp300bsd}, @samp{mipslit}, @samp{sun4}. - -Ways to specify: - -@enumerate -@item -command line option: @samp{-m} -(@pxref{Options,,Options,ld.info,Using LD}) - -@item -environment variable @code{LDEMULATION} - -@item -compiled-in @code{DEFAULT_EMULATION} from @file{Makefile}, -which comes from @code{EMUL} in @file{config/@var{target}.mt} -@end enumerate - -@node Reporting Bugs -@chapter Reporting Bugs -@cindex bugs -@cindex 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 -@end menu - -@node Bug Criteria -@section Have you found a bug? -@cindex bug criteria - -If you are not sure whether you have found a bug, here are some guidelines: - -@itemize @bullet -@cindex fatal signal -@cindex crash -@item -If a binary utility gets a fatal signal, for any input whatever, that is -a bug. Reliable utilities never crash. - -@cindex error on valid input -@item -If a binary utility produces an error message for valid input, that is a -bug. - -@item -If you are an experienced user of binary utilities, your suggestions for -improvement are welcome in any case. -@end itemize - -@node Bug Reporting -@section How to report bugs -@cindex bug reports -@cindex bugs, reporting - -A number of companies and individuals offer support for @sc{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 @file{etc/SERVICE} in the @sc{gnu} Emacs -distribution. - -In any event, we also recommend that you send bug reports for the binary -utilities to @samp{bug-gnu-utils@@gnu.org}. - -The fundamental principle of reporting bugs usefully is this: -@strong{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?'' Those bug reports are useless, and we urge everyone to -@emph{refuse to respond to them} except to chide the sender to report -bugs properly. - -To enable us to fix the bug, you should include all these things: - -@itemize @bullet -@item -The version of the utility. Each utility announces it if you start it -with the @samp{--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. - -@item -Any patches you may have applied to the source, including any patches -made to the @code{BFD} library. - -@item -The type of machine you are using, and the operating system name and -version number. - -@item -What compiler (and its version) was used to compile the utilities---e.g. -``@code{gcc-2.7}''. - -@item -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. - -@item -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, uuencoded if -necessary to get them through the mail system. Note that -@samp{bug-gnu-utils@@gnu.org} is a mailing list, so you should avoid -sending very large files to it. Making the files available for -anonymous FTP is OK. - -If the source files were produced exclusively using @sc{gnu} programs -(e.g., @code{gcc}, @code{gas}, and/or the @sc{gnu} @code{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 @code{gcc}, or -whatever, was used to produce the object files. Also say how -@code{gcc}, or whatever, was configured. - -@item -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 synch, 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. - -@item -If you wish to suggest changes to the source, send us context diffs, as -generated by @code{diff} with the @samp{-u}, @samp{-c}, or @samp{-p} -option. Always send diffs from the old file to the new file. If you -wish to discuss something in the @code{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. -@end itemize - -Here are some things that are not necessary: - -@itemize @bullet -@item -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 @emph{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. - -@item -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. - -@item -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. -@end itemize - -@node Index -@unnumbered Index - -@printindex cp - -@contents -@bye diff --git a/binutils/bucomm.c b/binutils/bucomm.c deleted file mode 100644 index 3406e1d6e60..00000000000 --- a/binutils/bucomm.c +++ /dev/null @@ -1,261 +0,0 @@ -/* bucomm.c -- Bin Utils COMmon code. - Copyright (C) 1991, 92, 93, 94, 95, 97, 98, 2000 - 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 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* We might put this in a library someday so it could be dynamically - loaded, but for now it's not necessary. */ - -#include "bfd.h" -#include "libiberty.h" -#include "bucomm.h" - -#include -#include /* ctime, maybe time_t */ - -#ifndef HAVE_TIME_T_IN_TIME_H -#ifndef HAVE_TIME_T_IN_TYPES_H -typedef long time_t; -#endif -#endif - -/* Error reporting */ - -char *program_name; - -void -bfd_nonfatal (string) - CONST char *string; -{ - CONST char *errmsg = bfd_errmsg (bfd_get_error ()); - - if (string) - fprintf (stderr, "%s: %s: %s\n", program_name, string, errmsg); - else - fprintf (stderr, "%s: %s\n", program_name, errmsg); -} - -void -bfd_fatal (string) - CONST char *string; -{ - bfd_nonfatal (string); - xexit (1); -} - -void -report (format, args) - const char * format; - va_list args; -{ - fprintf (stderr, "%s: ", program_name); - vfprintf (stderr, format, args); - putc ('\n', stderr); -} - -#ifdef ANSI_PROTOTYPES -void -fatal (const char *format, ...) -{ - va_list args; - - va_start (args, format); - report (format, args); - va_end (args); - xexit (1); -} - -void -non_fatal (const char *format, ...) -{ - va_list args; - - va_start (args, format); - report (format, args); - va_end (args); -} -#else -void -fatal (va_alist) - va_dcl -{ - char *Format; - va_list args; - - va_start (args); - Format = va_arg (args, char *); - report (Format, args); - va_end (args); - xexit (1); -} - -void -non_fatal (va_alist) - va_dcl -{ - char *Format; - va_list args; - - va_start (args); - Format = va_arg (args, char *); - report (Format, args); - va_end (args); -} -#endif - -/* Set the default BFD target based on the configured target. Doing - this permits the binutils to be configured for a particular target, - and linked against a shared BFD library which was configured for a - different target. */ - -void -set_default_bfd_target () -{ - /* The macro TARGET is defined by Makefile. */ - const char *target = TARGET; - - if (! bfd_set_default_target (target)) - fatal (_("can't set BFD default target to `%s': %s"), - target, bfd_errmsg (bfd_get_error ())); -} - -/* After a false return from bfd_check_format_matches with - bfd_get_error () == bfd_error_file_ambiguously_recognized, print - the possible matching targets. */ - -void -list_matching_formats (p) - char **p; -{ - fprintf (stderr, _("%s: Matching formats:"), program_name); - while (*p) - fprintf (stderr, " %s", *p++); - fputc ('\n', stderr); -} - -/* List the supported targets. */ - -void -list_supported_targets (name, f) - const char *name; - FILE *f; -{ - extern bfd_target *bfd_target_vector[]; - int t; - - if (name == NULL) - fprintf (f, _("Supported targets:")); - else - fprintf (f, _("%s: supported targets:"), name); - for (t = 0; bfd_target_vector[t] != NULL; t++) - fprintf (f, " %s", bfd_target_vector[t]->name); - fprintf (f, "\n"); -} - -/* Display the archive header for an element as if it were an ls -l listing: - - Mode User\tGroup\tSize\tDate Name */ - -void -print_arelt_descr (file, abfd, verbose) - FILE *file; - bfd *abfd; - boolean verbose; -{ - struct stat buf; - - if (verbose) - { - if (bfd_stat_arch_elt (abfd, &buf) == 0) - { - char modebuf[11]; - char timebuf[40]; - time_t when = buf.st_mtime; - CONST char *ctime_result = (CONST char *) ctime (&when); - - /* POSIX format: skip weekday and seconds from ctime output. */ - sprintf (timebuf, "%.12s %.4s", ctime_result + 4, ctime_result + 20); - - mode_string (buf.st_mode, modebuf); - modebuf[10] = '\0'; - /* POSIX 1003.2/D11 says to skip first character (entry type). */ - fprintf (file, "%s %ld/%ld %6ld %s ", modebuf + 1, - (long) buf.st_uid, (long) buf.st_gid, - (long) buf.st_size, timebuf); - } - } - - fprintf (file, "%s\n", bfd_get_filename (abfd)); -} - -/* Return the name of a temporary file in the same directory as FILENAME. */ - -char * -make_tempname (filename) - char *filename; -{ - static char template[] = "stXXXXXX"; - char *tmpname; - char *slash = strrchr (filename, '/'); - -#if defined (__DJGPP__) || defined (__GO32__) || defined (_WIN32) - if (slash == NULL) - slash = strrchr (filename, '\\'); -#endif - - if (slash != (char *) NULL) - { - char c; - - c = *slash; - *slash = 0; - tmpname = xmalloc (strlen (filename) + sizeof (template) + 1); - strcpy (tmpname, filename); - strcat (tmpname, "/"); - strcat (tmpname, template); - mktemp (tmpname); - *slash = c; - } - else - { - tmpname = xmalloc (sizeof (template)); - strcpy (tmpname, template); - mktemp (tmpname); - } - return tmpname; -} - -/* Parse a string into a VMA, with a fatal error if it can't be - parsed. */ - -bfd_vma -parse_vma (s, arg) - const char *s; - const char *arg; -{ - bfd_vma ret; - const char *end; - - ret = bfd_scan_vma (s, &end, 0); - - if (*end != '\0') - fatal (_("%s: bad number: %s"), arg, s); - - return ret; -} diff --git a/binutils/bucomm.h b/binutils/bucomm.h deleted file mode 100644 index c6dc26a1f09..00000000000 --- a/binutils/bucomm.h +++ /dev/null @@ -1,192 +0,0 @@ -/* bucomm.h -- binutils common include file. - Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000 - 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _BUCOMM_H -#define _BUCOMM_H - -#include "ansidecl.h" -#include -#include - -#include "config.h" -#include "bin-bugs.h" - -#ifdef ANSI_PROTOTYPES -#include -#else -#include -#endif - -#ifdef USE_BINARY_FOPEN -#include "fopen-bin.h" -#else -#include "fopen-same.h" -#endif - -#include -#ifndef errno -extern int errno; -#endif - -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#else -extern char *strchr (); -extern char *strrchr (); -#endif -#endif - -#ifdef HAVE_STDLIB_H -#include -#endif - -#ifdef HAVE_FCNTL_H -#include -#else -#ifdef HAVE_SYS_FILE_H -#include -#endif -#endif - -#ifdef NEED_DECLARATION_STRSTR -extern char *strstr (); -#endif - -#ifdef HAVE_SBRK -#ifdef NEED_DECLARATION_SBRK -extern char *sbrk (); -#endif -#endif - -#ifdef NEED_DECLARATION_GETENV -extern char *getenv (); -#endif - -#ifdef NEED_DECLARATION_ENVIRON -extern char **environ; -#endif - -#ifndef O_RDONLY -#define O_RDONLY 0 -#endif - -#ifndef O_RDWR -#define O_RDWR 2 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#if defined(__GNUC__) && !defined(C_ALLOCA) -# undef alloca -# define alloca __builtin_alloca -#else -# if defined(HAVE_ALLOCA_H) && !defined(C_ALLOCA) -# include -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -# if !defined (__STDC__) && !defined (__hpux) -char *alloca (); -# else -void *alloca (); -# endif /* __STDC__, __hpux */ -# endif /* alloca */ -# endif /* HAVE_ALLOCA_H */ -#endif - -#ifdef HAVE_LOCALE_H -# include -#endif - -#ifdef ENABLE_NLS -# include -# define _(String) gettext (String) -# ifdef gettext_noop -# define N_(String) gettext_noop (String) -# else -# define N_(String) (String) -# endif -#else -/* Stubs that do something close enough. */ -# define textdomain(String) (String) -# define gettext(String) (String) -# define dgettext(Domain,Message) (Message) -# define dcgettext(Domain,Message,Type) (Message) -# define bindtextdomain(Domain,Directory) (Domain) -# define _(String) (String) -# define N_(String) (String) -#endif - -/* bucomm.c */ -void bfd_nonfatal PARAMS ((const char *)); - -void bfd_fatal PARAMS ((const char *)) ATTRIBUTE_NORETURN; - -void report PARAMS ((const char *, va_list)); - -void fatal PARAMS ((const char *, ...)) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; - -void non_fatal PARAMS ((const char *, ...)) ATTRIBUTE_PRINTF_1; - -void set_default_bfd_target PARAMS ((void)); - -void list_matching_formats PARAMS ((char **p)); - -void list_supported_targets PARAMS ((const char *, FILE *)); - -void print_arelt_descr PARAMS ((FILE *file, bfd *abfd, boolean verbose)); - -char *make_tempname PARAMS ((char *)); - -bfd_vma parse_vma PARAMS ((const char *, const char *)); - -extern char *program_name; - -/* filemode.c */ -void mode_string PARAMS ((unsigned long mode, char *buf)); - -/* version.c */ -extern void print_version PARAMS ((const char *)); - -/* rename.c */ -extern void set_times PARAMS ((const char *, const struct stat *)); - -extern int smart_rename PARAMS ((const char *, const char *, int)); - -/* libiberty */ -PTR xmalloc PARAMS ((size_t)); - -PTR xrealloc PARAMS ((PTR, size_t)); - -#endif /* _BUCOMM_H */ diff --git a/binutils/budbg.h b/binutils/budbg.h deleted file mode 100644 index d8ee8895e76..00000000000 --- a/binutils/budbg.h +++ /dev/null @@ -1,58 +0,0 @@ -/* budbg.c -- Interfaces to the generic debugging information routines. - Copyright (C) 1995, 1996 Free Software Foundation, Inc. - Written by Ian Lance Taylor . - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef BUDBG_H -#define BUDBG_H - -#include - -/* Routine used to read generic debugging information. */ - -extern PTR read_debugging_info PARAMS ((bfd *, asymbol **, long)); - -/* Routine used to print generic debugging information. */ - -extern boolean print_debugging_info PARAMS ((FILE *, PTR)); - -/* Routines used to read and write stabs information. */ - -extern PTR start_stab PARAMS ((PTR, bfd *, boolean, asymbol **, long)); - -extern boolean finish_stab PARAMS ((PTR, PTR)); - -extern boolean parse_stab PARAMS ((PTR, PTR, int, int, bfd_vma, const char *)); - -extern boolean write_stabs_in_sections_debugging_info - PARAMS ((bfd *, PTR, bfd_byte **, bfd_size_type *, bfd_byte **, - bfd_size_type *)); - -/* Routines used to read and write IEEE debugging information. */ - -extern boolean parse_ieee - PARAMS ((PTR, bfd *, const bfd_byte *, bfd_size_type)); - -extern boolean write_ieee_debugging_info PARAMS ((bfd *, PTR)); - -/* Routine used to read COFF debugging information. */ - -extern boolean parse_coff PARAMS ((bfd *, asymbol **, long, PTR)); - -#endif diff --git a/binutils/coffdump.c b/binutils/coffdump.c deleted file mode 100644 index 77dbd33276d..00000000000 --- a/binutils/coffdump.c +++ /dev/null @@ -1,539 +0,0 @@ -/* Coff file dumper. - Copyright (C) 1994, 95, 98, 99, 2000 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Written by Steve Chamberlain - - This module reads a type tree generated by coffgrok and prints - it out so we can test the grokker. -*/ - -#include -#include -#include - -#include "coffgrok.h" -#include "bucomm.h" - -#define PROGRAM_VERSION "1.0" - -static int atnl; -static void dump_coff_scope (); - -static void -tab (x) -int x; -{ - static int indent; - int i; - - if (atnl) - { - if (x < 0) - { - printf (")"); - indent += x; - - return; - } - else - { - printf ("\n"); - atnl = 0; - } - } - - if (x == -1) - { - for (i = 0; i < indent; i++) - printf (" "); - - indent += x; - printf (")"); - return; - } - - indent += x; - - for (i = 0; i < indent; i++) - printf (" "); - - if (x) - { - printf ("("); - } -} - -static void nl () -{ - atnl = 1; -} - -static void -dump_coff_lines (p) - struct coff_line *p; -{ - int i; - int online = 0; - tab(1); - printf(_("#lines %d "),p->nlines); - for (i = 0; i < p->nlines; i++) - { - printf("(%d 0x%x)", p->lines[i], p->addresses[i]); - online++; - if (online > 6) - { - nl(); - tab(0); - online = 0; - } - } - nl(); - tab(-1); -} - -static void -dump_coff_type (p) - struct coff_type *p; -{ - tab (1); - printf ("size %d ", p->size); - switch (p->type) - { - case coff_secdef_type: - printf ("section definition at %x size %x\n", - p->u.asecdef.address, - p->u.asecdef.size); - nl(); - break; - case coff_pointer_type: - printf ("pointer to"); - nl (); - dump_coff_type (p->u.pointer.points_to); - break; - case coff_array_type: - printf ("array [%d] of", p->u.array.dim); - nl (); - dump_coff_type (p->u.array.array_of); - break; - case coff_function_type: - printf ("function returning"); - nl (); - dump_coff_type (p->u.function.function_returns); - dump_coff_lines (p->u.function.lines); - printf ("arguments"); - nl (); - dump_coff_scope (p->u.function.parameters); - tab (0); - printf ("code"); - nl (); - dump_coff_scope (p->u.function.code); - tab(0); - break; - case coff_structdef_type: - printf ("structure definition"); - nl (); - dump_coff_scope (p->u.astructdef.elements); - break; - case coff_structref_type: - if (!p->u.aenumref.ref) - printf ("structure ref to UNKNOWN struct"); - else - printf ("structure ref to %s", p->u.aenumref.ref->name); - break; - case coff_enumref_type: - printf ("enum ref to %s", p->u.astructref.ref->name); - break; - case coff_enumdef_type: - printf ("enum definition"); - nl (); - dump_coff_scope (p->u.aenumdef.elements); - break; - case coff_basic_type: - switch (p->u.basic) - { - case T_NULL: - printf ("NULL"); - break; - case T_VOID: - printf ("VOID"); - break; - case T_CHAR: - printf ("CHAR"); - break; - case T_SHORT: - printf ("SHORT"); - break; - case T_INT: - printf ("INT "); - break; - case T_LONG: - printf ("LONG"); - break; - case T_FLOAT: - printf ("FLOAT"); - break; - case T_DOUBLE: - printf ("DOUBLE"); - break; - case T_STRUCT: - printf ("STRUCT"); - break; - case T_UNION: - printf ("UNION"); - break; - case T_ENUM: - printf ("ENUM"); - break; - case T_MOE: - printf ("MOE "); - break; - case T_UCHAR: - printf ("UCHAR"); - break; - case T_USHORT: - printf ("USHORT"); - break; - case T_UINT: - printf ("UINT"); - break; - case T_ULONG: - printf ("ULONG"); - break; - case T_LNGDBL: - printf ("LNGDBL"); - break; - default: - abort (); - } - } - nl (); - tab (-1); -} - -static void -dump_coff_where (p) - struct coff_where *p; -{ - tab (1); - switch (p->where) - { - case coff_where_stack: - printf ("Stack offset %x", p->offset); - break; - case coff_where_memory: - printf ("Memory section %s+%x", p->section->name, p->offset); - break; - case coff_where_register: - printf ("Register %d", p->offset); - break; - case coff_where_member_of_struct: - printf ("Struct Member offset %x", p->offset); - break; - case coff_where_member_of_enum: - printf ("Enum Member offset %x", p->offset); - break; - case coff_where_unknown: - printf ("Undefined symbol"); - break; - case coff_where_strtag: - printf ("STRTAG"); - case coff_where_entag: - printf ("ENTAG"); - break; - case coff_where_typedef: - printf ("TYPEDEF"); - break; - default: - abort (); - } - nl (); - tab (-1); -} - -static void -dump_coff_visible (p) - struct coff_visible *p; -{ - tab (1); - switch (p->type) - { - case coff_vis_ext_def: - printf ("coff_vis_ext_def"); - break; - case coff_vis_ext_ref: - printf ("coff_vis_ext_ref"); - break; - case coff_vis_int_def: - printf ("coff_vis_int_def"); - break; - case coff_vis_common: - printf ("coff_vis_common"); - break; - case coff_vis_auto: - printf ("coff_vis_auto"); - break; - case coff_vis_autoparam: - printf ("coff_vis_autoparam"); - break; - case coff_vis_regparam: - printf ("coff_vis_regparam"); - break; - case coff_vis_register: - printf ("coff_vis_register"); - break; - case coff_vis_tag: - printf ("coff_vis_tag"); - break; - case coff_vis_member_of_struct: - printf ("coff_vis_member_of_struct"); - break; - case coff_vis_member_of_enum: - printf ("coff_vis_member_of_enum"); - break; - default: - abort (); - } - nl (); - tab (-1); -} - - -void -dump_coff_symbol (p) - struct coff_symbol *p; -{ - tab (1); - printf ("List of symbols"); - nl (); - while (p) - { - tab (1); - tab (1); - printf ("Symbol %s, tag %d, number %d", p->name, p->tag, p->number); - nl (); - tab (-1); - tab (1); - printf ("Type"); - nl (); - dump_coff_type (p->type); - tab (-1); - tab (1); - printf ("Where"); - dump_coff_where (p->where); - tab (-1); - tab (1); - printf ("Visible"); - dump_coff_visible (p->visible); - tab (-1); - p = p->next; - tab (-1); - } - tab (-1); -} - -static void -dump_coff_scope (p) - struct coff_scope *p; -{ -if (p) { - tab (1); - printf ("List of blocks %lx ",(unsigned long) p); - - if (p->sec) { - printf( " %s %x..%x", p->sec->name,p->offset, p->offset + p->size -1); - } - nl (); - tab (0); - printf ("*****************"); - nl (); - while (p) - { - tab (0); - printf ("vars %d", p->nvars); - nl (); - dump_coff_symbol (p->vars_head); - printf ("blocks"); - nl (); - dump_coff_scope (p->list_head); - nl (); - p = p->next; - } - - tab (0); - printf ("*****************"); - nl (); - tab (-1); -} -} - -static void -dump_coff_sfile (p) - struct coff_sfile *p; -{ - tab (1); - printf ("List of source files"); - nl (); - while (p) - { - tab (0); - printf ("Source file %s", p->name); - nl (); - dump_coff_scope (p->scope); - p = p->next; - } - tab (-1); -} - -static void -dump_coff_section(ptr) -struct coff_section *ptr; -{ - int i; - tab(1); - printf("section %s %d %d address %x size %x number %d nrelocs %d", - ptr->name, ptr->code, ptr->data, ptr->address,ptr->size, ptr->number, ptr->nrelocs); - nl(); - - for (i = 0; i < ptr->nrelocs; i++) - { - tab(0); - printf("(%x %s %x)", - ptr->relocs[i].offset, - ptr->relocs[i].symbol->name, - ptr->relocs[i].addend); - nl(); - } - tab(-1); - -} - -void -coff_dump (ptr) - struct coff_ofile *ptr; -{ - int i; - printf ("Coff dump"); - nl (); - printf ("#souces %d", ptr->nsources); - nl (); - dump_coff_sfile (ptr->source_head); - for (i = 0; i < ptr->nsections; i++) - dump_coff_section(ptr->sections + i); -} - - - -char * program_name; - -static void -show_usage (file, status) - FILE *file; - int status; -{ - fprintf (file, "Usage: %s [-hV] in-file\n", program_name); - exit (status); -} - -static void -show_help () -{ - printf (_("%s: Print a human readable interpretation of a SYSROFF object file\n"), - program_name); - show_usage (stdout, 0); -} - - -int -main (ac, av) - int ac; - char *av[]; -{ - bfd *abfd; - struct coff_ofile *tree; - char **matching; - char *input_file = NULL; - int opt; - static struct option long_options[] = - { - { "help", no_argument, 0, 'h' }, - { "version", no_argument, 0, 'V' }, - { NULL, no_argument, 0, 0 } - }; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = av[0]; - xmalloc_set_program_name (program_name); - - while ((opt = getopt_long (ac, av, "hV", long_options, - (int *) NULL)) - != EOF) - { - switch (opt) - { - case 'h': - show_help (); - /*NOTREACHED*/ - case 'V': - printf (_("GNU %s version %s\n"), program_name, PROGRAM_VERSION); - exit (0); - /*NOTREACHED*/ - case 0: - break; - default: - show_usage (stderr, 1); - /*NOTREACHED*/ - } - } - - if (optind < ac) - { - input_file = av[optind]; - } - - if (!input_file) - { - fatal (_("no input file specified")); - } - abfd = bfd_openr (input_file, 0); - - if (!abfd) - bfd_fatal (input_file); - - if (! bfd_check_format_matches (abfd, bfd_object, &matching)) - { - bfd_nonfatal (input_file); - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } - exit (1); - } - - tree = coff_grok (abfd); - - coff_dump(tree); - printf("\n"); - return 0; -} diff --git a/binutils/coffgrok.c b/binutils/coffgrok.c deleted file mode 100644 index 8c4e6c9c98e..00000000000 --- a/binutils/coffgrok.c +++ /dev/null @@ -1,737 +0,0 @@ -/* coffgrok.c - Copyright (C) 1994, 95, 97, 1998 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Written by Steve Chamberlain (sac@cygnus.com) - - This module reads a coff file and builds a really simple type tree - which can be read by other programs. The first application is a - coff->sysroff converter. It can be tested with coffdump.c. - -*/ - -#include -#include "bucomm.h" - -#include "coff/internal.h" -#include "../bfd/libcoff.h" -#include "coffgrok.h" -int lofile = 1; -static struct coff_scope *top_scope; -static struct coff_scope *file_scope; -static struct coff_ofile *ofile; - -struct coff_symbol *last_function_symbol; -struct coff_type *last_function_type; -struct coff_type *last_struct; -struct coff_type *last_enum; -struct coff_sfile *cur_sfile; - -static struct coff_symbol **tindex; - - -static asymbol **syms; -static long symcount; - -#define N(x) ((x)->_n._n_nptr[1]) - -static struct coff_ptr_struct *rawsyms; -static int rawcount; -static bfd *abfd; -extern char *xcalloc (); -#define PTR_SIZE 4 -#define SHORT_SIZE 2 -#define INT_SIZE 4 -#define LONG_SIZE 4 -#define FLOAT_SIZE 4 -#define DOUBLE_SIZE 8 - -#define INDEXOF(p) ((struct coff_ptr_struct *)(p)-(rawsyms)) - -static struct coff_scope * -empty_scope () -{ - struct coff_scope *l; - l = (struct coff_scope *) (xcalloc (sizeof (struct coff_scope), 1)); - return l; -} - -static struct coff_symbol * -empty_symbol () -{ - return (struct coff_symbol *) (xcalloc (sizeof (struct coff_symbol), 1)); -} - -/*int l;*/ -static void -push_scope (link) - int link; -{ - struct coff_scope *n = empty_scope (); - if (link) - { - if (top_scope) - { - if (top_scope->list_tail) - { - top_scope->list_tail->next = n; - } - else - { - top_scope->list_head = n; - } - top_scope->list_tail = n; - } - } - n->parent = top_scope; - - top_scope = n; -} - -static void -pop_scope () -{ - top_scope = top_scope->parent; -} - -static void -do_sections_p1 (head) - struct coff_ofile *head; -{ - asection *section; - int idx; - struct coff_section *all = (struct coff_section *) (xcalloc (abfd->section_count + 1, - sizeof (struct coff_section))); - head->nsections = abfd->section_count + 1; - head->sections = all; - - for (idx = 0, section = abfd->sections; section; section = section->next, idx++) - { - long relsize; - int i = section->target_index; - arelent **relpp; - long relcount; - - relsize = bfd_get_reloc_upper_bound (abfd, section); - if (relsize < 0) - bfd_fatal (bfd_get_filename (abfd)); - if (relsize == 0) - continue; - relpp = (arelent **) xmalloc (relsize); - relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms); - if (relcount < 0) - bfd_fatal (bfd_get_filename (abfd)); - - head->sections[i].name = (char *) (section->name); - head->sections[i].code = section->flags & SEC_CODE; - head->sections[i].data = section->flags & SEC_DATA; - if (strcmp (section->name, ".bss") == 0) - head->sections[i].data = 1; - head->sections[i].address = section->lma; - head->sections[i].size = section->_raw_size; - head->sections[i].number = idx; - head->sections[i].nrelocs = section->reloc_count; - head->sections[i].relocs = - (struct coff_reloc *) (xcalloc (section->reloc_count, - sizeof (struct coff_reloc))); - head->sections[i].bfd_section = section; - } - head->sections[0].name = "ABSOLUTE"; - head->sections[0].code = 0; - head->sections[0].data = 0; - head->sections[0].address = 0; - head->sections[0].size = 0; - head->sections[0].number = 0; -} - -static void -do_sections_p2 (head) - struct coff_ofile *head; -{ - asection *section; - for (section = abfd->sections; section; section = section->next) - { - unsigned int j; - - for (j = 0; j < section->reloc_count; j++) - { - int idx; - int i = section->target_index; - struct coff_reloc *r = head->sections[i].relocs + j; - arelent *sr = section->relocation + j; - r->offset = sr->address; - r->addend = sr->addend; - idx = ((coff_symbol_type *) (sr->sym_ptr_ptr[0]))->native - rawsyms; - r->symbol = tindex[idx]; - } - } -} - -static struct coff_where * -do_where (i) - int i; -{ - struct internal_syment *sym = &rawsyms[i].u.syment; - struct coff_where *where = - (struct coff_where *) (xmalloc (sizeof (struct coff_where))); - where->offset = sym->n_value; - - if (sym->n_scnum == -1) - sym->n_scnum = 0; - - switch (sym->n_sclass) - { - case C_FIELD: - where->where = coff_where_member_of_struct; - where->offset = sym->n_value / 8; - where->bitoffset = sym->n_value % 8; - where->bitsize = rawsyms[i + 1].u.auxent.x_sym.x_misc.x_lnsz.x_size; - break; - case C_MOE: - where->where = coff_where_member_of_enum; - break; - case C_MOS: - case C_MOU: - where->where = coff_where_member_of_struct; - break; - case C_AUTO: - case C_ARG: - where->where = coff_where_stack; - break; - case C_EXT: - case C_STAT: - case C_EXTDEF: - case C_LABEL: - where->where = coff_where_memory; - where->section = &ofile->sections[sym->n_scnum]; - break; - case C_REG: - case C_REGPARM: - where->where = coff_where_register; - break; - case C_ENTAG: - where->where = coff_where_entag; - break; - case C_STRTAG: - case C_UNTAG: - where->where = coff_where_strtag; - break; - case C_TPDEF: - where->where = coff_where_typedef; - break; - default: - abort (); - break; - } - return where; -} - -static -struct coff_line * -do_lines (i, name) - int i; - char *name; -{ - struct coff_line *res = (struct coff_line *) xcalloc (sizeof (struct coff_line), 1); - asection *s; - unsigned int l; - - /* Find out if this function has any line numbers in the table */ - for (s = abfd->sections; s; s = s->next) - { - for (l = 0; l < s->lineno_count; l++) - { - if (s->lineno[l].line_number == 0) - { - if (rawsyms + i == ((coff_symbol_type *) (&(s->lineno[l].u.sym[0])))->native) - { - /* These lines are for this function - so count them and stick them on */ - int c = 0; - /* Find the linenumber of the top of the function, since coff linenumbers - are relative to the start of the function. */ - int start_line = rawsyms[i + 3].u.auxent.x_sym.x_misc.x_lnsz.x_lnno; - - l++; - for (c = 0; s->lineno[l + c + 1].line_number; c++) - ; - - /* Add two extra records, one for the prologue and one for the epilogue */ - c += 1; - res->nlines = c; - res->lines = (int *) (xcalloc (sizeof (int), c)); - res->addresses = (int *) (xcalloc (sizeof (int), c)); - res->lines[0] = start_line; - res->addresses[0] = rawsyms[i].u.syment.n_value - s->vma; - for (c = 0; s->lineno[l + c + 1].line_number; c++) - { - res->lines[c + 1] = s->lineno[l + c].line_number + start_line - 1; - res->addresses[c + 1] = s->lineno[l + c].u.offset; - } - return res; - } - } - } - } - return res; -} - -static -struct coff_type * -do_type (i) - int i; -{ - struct internal_syment *sym = &rawsyms[i].u.syment; - union internal_auxent *aux = &rawsyms[i + 1].u.auxent; - struct coff_type *res = - (struct coff_type *) xmalloc (sizeof (struct coff_type)); - int type = sym->n_type; - int which_dt = 0; - int dimind = 0; - - res->type = coff_basic_type; - res->u.basic = type & 0xf; - - switch (type & 0xf) - { - case T_NULL: - case T_VOID: - if (sym->n_numaux && sym->n_sclass == C_STAT) - { - /* This is probably a section definition */ - res->type = coff_secdef_type; - res->size = aux->x_scn.x_scnlen; - } - else - { - if (type == 0) - { - /* Don't know what this is, let's make it a simple int */ - res->size = INT_SIZE; - res->u.basic = T_UINT; - } - else - { - /* Else it could be a function or pointer to void */ - res->size = 0; - } - } - break; - - - break; - case T_UCHAR: - case T_CHAR: - res->size = 1; - break; - case T_USHORT: - case T_SHORT: - res->size = SHORT_SIZE; - break; - case T_UINT: - case T_INT: - res->size = INT_SIZE; - break; - case T_ULONG: - case T_LONG: - res->size = LONG_SIZE; - break; - case T_FLOAT: - res->size = FLOAT_SIZE; - break; - case T_DOUBLE: - res->size = DOUBLE_SIZE; - break; - case T_STRUCT: - case T_UNION: - if (sym->n_numaux) - { - if (aux->x_sym.x_tagndx.p) - { - /* Refering to a struct defined elsewhere */ - res->type = coff_structref_type; - res->u.astructref.ref = tindex[INDEXOF (aux->x_sym.x_tagndx.p)]; - res->size = res->u.astructref.ref ? - res->u.astructref.ref->type->size : 0; - } - else - { - /* A definition of a struct */ - last_struct = res; - res->type = coff_structdef_type; - res->u.astructdef.elements = empty_scope (); - res->u.astructdef.idx = 0; - res->u.astructdef.isstruct = (type & 0xf) == T_STRUCT; - res->size = aux->x_sym.x_misc.x_lnsz.x_size; - } - } - else - { - /* No auxents - it's anonynmous */ - res->type = coff_structref_type; - res->u.astructref.ref = 0; - res->size = 0; - } - break; - case T_ENUM: - if (aux->x_sym.x_tagndx.p) - { - /* Refering to a enum defined elsewhere */ - res->type = coff_enumref_type; - res->u.aenumref.ref = tindex[INDEXOF (aux->x_sym.x_tagndx.p)]; - res->size = res->u.aenumref.ref->type->size; - } - else - { - /* A definition of an enum */ - last_enum = res; - res->type = coff_enumdef_type; - res->u.aenumdef.elements = empty_scope (); - res->size = aux->x_sym.x_misc.x_lnsz.x_size; - } - break; - case T_MOE: - break; - } - - for (which_dt = 5; which_dt >= 0; which_dt--) - { - switch ((type >> ((which_dt * 2) + 4)) & 0x3) - { - case 0: - break; - case DT_ARY: - { - struct coff_type *ptr = ((struct coff_type *) - xmalloc (sizeof (struct coff_type))); - int els = (dimind < DIMNUM - ? aux->x_sym.x_fcnary.x_ary.x_dimen[dimind] - : 0); - ++dimind; - ptr->type = coff_array_type; - ptr->size = els * res->size; - ptr->u.array.dim = els; - ptr->u.array.array_of = res; - res = ptr; - break; - } - case DT_PTR: - { - struct coff_type *ptr = - (struct coff_type *) xmalloc (sizeof (struct coff_type)); - ptr->size = PTR_SIZE; - ptr->type = coff_pointer_type; - ptr->u.pointer.points_to = res; - res = ptr; - break; - } - case DT_FCN: - { - struct coff_type *ptr - = (struct coff_type *) xmalloc (sizeof (struct coff_type)); - ptr->size = 0; - ptr->type = coff_function_type; - ptr->u.function.function_returns = res; - ptr->u.function.parameters = empty_scope (); - ptr->u.function.lines = do_lines (i, sym->_n._n_nptr[1]); - ptr->u.function.code = 0; - last_function_type = ptr; - res = ptr; - break; - } - } - } - return res; -} - -static struct coff_visible * -do_visible (i) - int i; -{ - struct internal_syment *sym = &rawsyms[i].u.syment; - struct coff_visible *visible = - (struct coff_visible *) (xmalloc (sizeof (struct coff_visible))); - enum coff_vis_type t; - switch (sym->n_sclass) - { - case C_MOS: - case C_MOU: - case C_FIELD: - t = coff_vis_member_of_struct; - break; - case C_MOE: - t = coff_vis_member_of_enum; - break; - - case C_REGPARM: - t = coff_vis_regparam; - break; - - case C_REG: - t = coff_vis_register; - break; - case C_STRTAG: - case C_UNTAG: - case C_ENTAG: - case C_TPDEF: - t = coff_vis_tag; - break; - case C_AUTOARG: - case C_ARG: - t = coff_vis_autoparam; - break; - case C_AUTO: - - - t = coff_vis_auto; - break; - case C_LABEL: - case C_STAT: - t = coff_vis_int_def; - break; - case C_EXT: - if (sym->n_scnum == N_UNDEF) - { - if (sym->n_value) - t = coff_vis_common; - else - t = coff_vis_ext_ref; - } - else - t = coff_vis_ext_def; - break; - default: - abort (); - break; - - } - visible->type = t; - return visible; -} - -static int -do_define (i, b) - int i; - struct coff_scope *b; -{ - static int symbol_index; - struct internal_syment *sym = &rawsyms[i].u.syment; - - /* Define a symbol and attach to block b */ - struct coff_symbol *s = empty_symbol (); - - s->number = ++symbol_index; - s->name = sym->_n._n_nptr[1]; - s->sfile = cur_sfile; - /* Glue onto the ofile list */ - if (lofile >= 0) - { - if (ofile->symbol_list_tail) - ofile->symbol_list_tail->next_in_ofile_list = s; - else - ofile->symbol_list_head = s; - ofile->symbol_list_tail = s; - /* And the block list */ - } - if (b->vars_tail) - b->vars_tail->next = s; - else - b->vars_head = s; - - b->vars_tail = s; - b->nvars++; - s->type = do_type (i); - s->where = do_where (i); - s->visible = do_visible (i); - - tindex[i] = s; - - /* We remember the lowest address in each section for each source file */ - - if (s->where->where == coff_where_memory - && s->type->type == coff_secdef_type) - { - struct coff_isection *is = cur_sfile->section + s->where->section->number; - - if (!is->init) - { - is->low = s->where->offset; - is->high = s->where->offset + s->type->size; - is->init = 1; - is->parent = s->where->section; - } - - } - - if (s->type->type == coff_function_type) - last_function_symbol = s; - - return i + sym->n_numaux + 1; -} - - -static -struct coff_ofile * -doit () -{ - int i; - int infile = 0; - struct coff_ofile *head = - (struct coff_ofile *) xmalloc (sizeof (struct coff_ofile)); - ofile = head; - head->source_head = 0; - head->source_tail = 0; - head->nsources = 0; - head->symbol_list_tail = 0; - head->symbol_list_head = 0; - do_sections_p1 (head); - push_scope (1); - - for (i = 0; i < rawcount;) - { - struct internal_syment *sym = &rawsyms[i].u.syment; - switch (sym->n_sclass) - { - case C_FILE: - { - /* new source file announced */ - struct coff_sfile *n = - (struct coff_sfile *) xmalloc (sizeof (struct coff_sfile)); - n->section = (struct coff_isection *) xcalloc (sizeof (struct coff_isection), abfd->section_count + 1); - cur_sfile = n; - n->name = sym->_n._n_nptr[1]; - n->next = 0; - - if (infile) - { - pop_scope (); - } - infile = 1; - push_scope (1); - file_scope = n->scope = top_scope; - - if (head->source_tail) - head->source_tail->next = n; - else - head->source_head = n; - head->source_tail = n; - head->nsources++; - i += sym->n_numaux + 1; - } - break; - case C_FCN: - { - char *name = sym->_n._n_nptr[1]; - if (name[1] == 'b') - { - /* Function start */ - push_scope (0); - last_function_type->u.function.code = top_scope; - top_scope->sec = ofile->sections + sym->n_scnum; - top_scope->offset = sym->n_value; - } - else - { - top_scope->size = sym->n_value - top_scope->offset + 1; - pop_scope (); - - } - i += sym->n_numaux + 1; - } - break; - - case C_BLOCK: - { - char *name = sym->_n._n_nptr[1]; - if (name[1] == 'b') - { - /* Block start */ - push_scope (1); - top_scope->sec = ofile->sections + sym->n_scnum; - top_scope->offset = sym->n_value; - - } - else - { - top_scope->size = sym->n_value - top_scope->offset + 1; - pop_scope (); - } - i += sym->n_numaux + 1; - } - break; - case C_REGPARM: - case C_ARG: - i = do_define (i, last_function_symbol->type->u.function.parameters); - break; - case C_MOS: - case C_MOU: - case C_FIELD: - i = do_define (i, last_struct->u.astructdef.elements); - break; - case C_MOE: - i = do_define (i, last_enum->u.aenumdef.elements); - break; - case C_STRTAG: - case C_ENTAG: - case C_UNTAG: - /* Various definition */ - i = do_define (i, top_scope); - break; - case C_EXT: - case C_LABEL: - i = do_define (i, file_scope); - break; - case C_STAT: - case C_TPDEF: - case C_AUTO: - case C_REG: - i = do_define (i, top_scope); - break; - default: - abort (); - case C_EOS: - i += sym->n_numaux + 1; - break; - } - } - do_sections_p2 (head); - return head; -} - -struct coff_ofile * -coff_grok (inabfd) - bfd *inabfd; -{ - long storage; - struct coff_ofile *p; - abfd = inabfd; - storage = bfd_get_symtab_upper_bound (abfd); - - if (storage < 0) - bfd_fatal (abfd->filename); - - syms = (asymbol **) xmalloc (storage); - symcount = bfd_canonicalize_symtab (abfd, syms); - if (symcount < 0) - bfd_fatal (abfd->filename); - rawsyms = obj_raw_syments (abfd); - rawcount = obj_raw_syment_count (abfd);; - tindex = (struct coff_symbol **) (xcalloc (sizeof (struct coff_symbol *), rawcount)); - - p = doit (); - return p; -} diff --git a/binutils/coffgrok.h b/binutils/coffgrok.h deleted file mode 100644 index c0ade42a61f..00000000000 --- a/binutils/coffgrok.h +++ /dev/null @@ -1,206 +0,0 @@ -#define T_NULL 0 -#define T_VOID 1 /* function argument (only used by compiler) */ -#define T_CHAR 2 /* character */ -#define T_SHORT 3 /* short integer */ -#define T_INT 4 /* integer */ -#define T_LONG 5 /* long integer */ -#define T_FLOAT 6 /* floating point */ -#define T_DOUBLE 7 /* double word */ -#define T_STRUCT 8 /* structure */ -#define T_UNION 9 /* union */ -#define T_ENUM 10 /* enumeration */ -#define T_MOE 11 /* member of enumeration*/ -#define T_UCHAR 12 /* unsigned character */ -#define T_USHORT 13 /* unsigned short */ -#define T_UINT 14 /* unsigned integer */ -#define T_ULONG 15 /* unsigned long */ -#define T_LNGDBL 16 /* long double */ - - - struct coff_reloc - { - int offset; - struct coff_symbol *symbol; - int addend; - }; - - struct coff_section - { - char *name; - int code; - int data; - int address; - int number; /* 0..n, .text = 0 */ - int nrelocs; - int size; - struct coff_reloc *relocs; - struct sec *bfd_section; - }; - -struct coff_ofile -{ - int nsources; - struct coff_sfile *source_head; - struct coff_sfile *source_tail; - int nsections; - struct coff_section *sections; - struct coff_symbol *symbol_list_head; - struct coff_symbol *symbol_list_tail; -}; - -struct coff_isection { - int low; - int high; - int init; - struct coff_section *parent; -}; - -struct coff_sfile -{ - char *name; - struct coff_scope *scope; - struct coff_sfile *next; - - /* Vector which maps where in each output section - the input file has it's data */ - struct coff_isection *section; - -}; - - - struct coff_type -{ - int size; - enum - { - coff_pointer_type, coff_function_type, coff_array_type, coff_structdef_type, coff_basic_type, - coff_structref_type, coff_enumref_type, coff_enumdef_type, coff_secdef_type - } type; - union - { - struct - { - int address; - int size; - } asecdef; - - struct - { - int isstruct; - struct coff_scope *elements; - int idx; - } - astructdef; - struct - { - struct coff_symbol *ref; - } astructref; - - struct - { - struct coff_scope *elements; - int idx; - } aenumdef; - struct - { - struct coff_symbol *ref; - } aenumref; - - struct - { - struct coff_type *points_to; - } pointer; - struct - { - int dim; - struct coff_type *array_of; - } array; - - struct - { - struct coff_type *function_returns; - struct coff_scope *parameters; - struct coff_scope *code; - struct coff_line *lines; - } function; - int basic; /* One of T_VOID.. T_UINT */ - } u; -}; - - - struct coff_line - { - int nlines; - int *lines; - int *addresses; - }; - - - struct coff_scope - { - struct coff_section *sec; /* What section */ - int offset; /* where */ - int size; /* How big */ - struct coff_scope *parent; /* one up */ - - struct coff_scope *next; /*next along */ - - int nvars; - - struct coff_symbol *vars_head; /* symbols */ - struct coff_symbol *vars_tail; - - struct coff_scope *list_head; /* children */ - struct coff_scope *list_tail; - - }; - - - struct coff_visible - { - enum coff_vis_type - { - coff_vis_ext_def, - coff_vis_ext_ref, - coff_vis_int_def, - coff_vis_common, - coff_vis_auto, - coff_vis_register, - coff_vis_tag, - coff_vis_member_of_struct, - coff_vis_member_of_enum, - coff_vis_autoparam, - coff_vis_regparam, - } type; - }; - - struct coff_where - { - enum - { - coff_where_stack, coff_where_memory, coff_where_register, coff_where_unknown, - coff_where_strtag, coff_where_member_of_struct, - coff_where_member_of_enum, coff_where_entag, coff_where_typedef - - } where; - int offset; - int bitoffset; - int bitsize; - struct coff_section *section; - }; - - struct coff_symbol - { - char *name; - int tag; - struct coff_type *type; - struct coff_where *where; - struct coff_visible *visible; - struct coff_symbol *next; - struct coff_symbol *next_in_ofile_list; /* For the ofile list */ - int number; - int er_number; - struct coff_sfile *sfile; - }; - -struct coff_ofile *coff_grok(); diff --git a/binutils/config.in b/binutils/config.in deleted file mode 100644 index 3c26c5c509b..00000000000 --- a/binutils/config.in +++ /dev/null @@ -1,189 +0,0 @@ -/* config.in. Generated automatically from configure.in by autoheader. */ - -/* Define if using alloca.c. */ -#undef C_ALLOCA - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. - This function is required for alloca.c support on those systems. */ -#undef CRAY_STACKSEG_END - -/* Define if you have alloca, as a function or macro. */ -#undef HAVE_ALLOCA - -/* Define if you have and it should be used (not on Ultrix). */ -#undef HAVE_ALLOCA_H - -/* Define if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define if you have that is POSIX.1 compatible. */ -#undef HAVE_SYS_WAIT_H - -/* Define as __inline if that's what the C compiler calls it. */ -#undef inline - -/* Define to `long' if doesn't define. */ -#undef off_t - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - -/* Define to `unsigned' if doesn't define. */ -#undef size_t - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown - */ -#undef STACK_DIRECTION - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if lex declares yytext as a char * by default, not a char[]. */ -#undef YYTEXT_POINTER - -/* Define if you have the __argz_count function. */ -#undef HAVE___ARGZ_COUNT - -/* Define if you have the __argz_next function. */ -#undef HAVE___ARGZ_NEXT - -/* Define if you have the __argz_stringify function. */ -#undef HAVE___ARGZ_STRINGIFY - -/* Define if you have the dcgettext function. */ -#undef HAVE_DCGETTEXT - -/* Define if you have the getcwd function. */ -#undef HAVE_GETCWD - -/* Define if you have the getpagesize function. */ -#undef HAVE_GETPAGESIZE - -/* Define if you have the munmap function. */ -#undef HAVE_MUNMAP - -/* Define if you have the putenv function. */ -#undef HAVE_PUTENV - -/* Define if you have the sbrk function. */ -#undef HAVE_SBRK - -/* Define if you have the setenv function. */ -#undef HAVE_SETENV - -/* Define if you have the setlocale function. */ -#undef HAVE_SETLOCALE - -/* Define if you have the stpcpy function. */ -#undef HAVE_STPCPY - -/* Define if you have the strcasecmp function. */ -#undef HAVE_STRCASECMP - -/* Define if you have the strchr function. */ -#undef HAVE_STRCHR - -/* Define if you have the utimes function. */ -#undef HAVE_UTIMES - -/* Define if you have the header file. */ -#undef HAVE_ARGZ_H - -/* Define if you have the header file. */ -#undef HAVE_FCNTL_H - -/* Define if you have the header file. */ -#undef HAVE_LIMITS_H - -/* Define if you have the header file. */ -#undef HAVE_LOCALE_H - -/* Define if you have the header file. */ -#undef HAVE_MALLOC_H - -/* Define if you have the header file. */ -#undef HAVE_NL_TYPES_H - -/* Define if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define if you have the header file. */ -#undef HAVE_STRING_H - -/* Define if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_FILE_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define if you have the header file. */ -#undef HAVE_VALUES_H - -/* Name of package */ -#undef PACKAGE - -/* Version number of package */ -#undef VERSION - -/* Define if you have the stpcpy function */ -#undef HAVE_STPCPY - -/* Define if your locale.h file contains LC_MESSAGES. */ -#undef HAVE_LC_MESSAGES - -/* Define to 1 if NLS is requested */ -#undef ENABLE_NLS - -/* Define as 1 if you have gettext and don't want to use GNU gettext. */ -#undef HAVE_GETTEXT - -/* Does the platform use an executable suffix? */ -#undef HAVE_EXECUTABLE_SUFFIX - -/* Suffix used for executables, if any. */ -#undef EXECUTABLE_SUFFIX - -/* Is the type time_t defined in ? */ -#undef HAVE_TIME_T_IN_TIME_H - -/* Is the type time_t defined in ? */ -#undef HAVE_TIME_T_IN_TYPES_H - -/* Does define struct utimbuf? */ -#undef HAVE_GOOD_UTIME_H - -/* Define if fprintf is not declared in system header files. */ -#undef NEED_DECLARATION_FPRINTF - -/* Define if strstr is not declared in system header files. */ -#undef NEED_DECLARATION_STRSTR - -/* Define if sbrk is not declared in system header files. */ -#undef NEED_DECLARATION_SBRK - -/* Define if getenv is not declared in system header files. */ -#undef NEED_DECLARATION_GETENV - -/* Define if environ is not declared in system header files. */ -#undef NEED_DECLARATION_ENVIRON - -/* Use b modifier when opening binary files? */ -#undef USE_BINARY_FOPEN - -/* Configured target name. */ -#undef TARGET - diff --git a/binutils/configure b/binutils/configure deleted file mode 100755 index 43fe8a69ceb..00000000000 --- a/binutils/configure +++ /dev/null @@ -1,5357 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --enable-shared[=PKGS] build shared libraries [default=yes]" -ac_help="$ac_help - --enable-static[=PKGS] build static libraries [default=yes]" -ac_help="$ac_help - --enable-fast-install[=PKGS] optimize for fast installation [default=yes]" -ac_help="$ac_help - --with-gnu-ld assume the C compiler uses GNU ld [default=no]" -ac_help="$ac_help - --disable-libtool-lock avoid locking (might break parallel builds)" -ac_help="$ac_help - --enable-targets alternative target configurations" -ac_help="$ac_help - --enable-commonbfdlib build shared BFD/opcodes/libiberty library" -ac_help="$ac_help - --enable-build-warnings Enable build-time compiler warnings if gcc is used" -ac_help="$ac_help - --disable-nls do not use Native Language Support" -ac_help="$ac_help - --with-included-gettext use the GNU gettext library included here" -ac_help="$ac_help - --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -sitefile= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --site-file=FILE use FILE as the site file - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -site-file | --site-file | --site-fil | --site-fi | --site-f) - ac_prev=sitefile ;; - -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) - sitefile="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=ar.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$sitefile"; then - if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi - fi -else - CONFIG_SITE="$sitefile" -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - - -# Do some error checking and defaulting for the host and target type. -# The inputs are: -# configure --host=HOST --target=TARGET --build=BUILD NONOPT -# -# The rules are: -# 1. You are not allowed to specify --host, --target, and nonopt at the -# same time. -# 2. Host defaults to nonopt. -# 3. If nonopt is not specified, then host defaults to the current host, -# as determined by config.guess. -# 4. Target and build default to nonopt. -# 5. If nonopt is not specified, then target and build default to host. - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -case $host---$target---$nonopt in -NONE---*---* | *---NONE---* | *---*---NONE) ;; -*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; -esac - - -# Make sure we can run config.sub. -if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : -else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } -fi - -echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:607: checking host system type" >&5 - -host_alias=$host -case "$host_alias" in -NONE) - case $nonopt in - NONE) - if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : - else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } - fi ;; - *) host_alias=$nonopt ;; - esac ;; -esac - -host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` -host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$host" 1>&6 - -echo $ac_n "checking target system type""... $ac_c" 1>&6 -echo "configure:628: checking target system type" >&5 - -target_alias=$target -case "$target_alias" in -NONE) - case $nonopt in - NONE) target_alias=$host_alias ;; - *) target_alias=$nonopt ;; - esac ;; -esac - -target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias` -target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$target" 1>&6 - -echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:646: checking build system type" >&5 - -build_alias=$build -case "$build_alias" in -NONE) - case $nonopt in - NONE) build_alias=$host_alias ;; - *) build_alias=$nonopt ;; - esac ;; -esac - -build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` -build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$build" 1>&6 - -test "$host_alias" != "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:681: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:734: checking whether build environment is sane" >&5 -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "$*" != "X $srcdir/configure conftestfile" \ - && test "$*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { echo "configure: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" 1>&2; exit 1; } - fi - - test "$2" = conftestfile - ) -then - # Ok. - : -else - { echo "configure: error: newly created file is older than distributed files! -Check your system clock" 1>&2; exit 1; } -fi -rm -f conftest* -echo "$ac_t""yes" 1>&6 -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:791: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - - -PACKAGE=binutils - -VERSION=2.9.5 - -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } -fi -cat >> confdefs.h <> confdefs.h <&6 -echo "configure:837: checking for working aclocal" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (aclocal --version) < /dev/null > /dev/null 2>&1; then - ACLOCAL=aclocal - echo "$ac_t""found" 1>&6 -else - ACLOCAL="$missing_dir/missing aclocal" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:850: checking for working autoconf" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (autoconf --version) < /dev/null > /dev/null 2>&1; then - AUTOCONF=autoconf - echo "$ac_t""found" 1>&6 -else - AUTOCONF="$missing_dir/missing autoconf" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:863: checking for working automake" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (automake --version) < /dev/null > /dev/null 2>&1; then - AUTOMAKE=automake - echo "$ac_t""found" 1>&6 -else - AUTOMAKE="$missing_dir/missing automake" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:876: checking for working autoheader" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (autoheader --version) < /dev/null > /dev/null 2>&1; then - AUTOHEADER=autoheader - echo "$ac_t""found" 1>&6 -else - AUTOHEADER="$missing_dir/missing autoheader" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:889: checking for working makeinfo" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (makeinfo --version) < /dev/null > /dev/null 2>&1; then - MAKEINFO=makeinfo - echo "$ac_t""found" 1>&6 -else - MAKEINFO="$missing_dir/missing makeinfo" - echo "$ac_t""missing" 1>&6 -fi - - - -# Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_shared=yes -fi - -# Check whether --enable-static or --disable-static was given. -if test "${enable_static+set}" = set; then - enableval="$enable_static" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_static=yes -fi - -# Check whether --enable-fast-install or --disable-fast-install was given. -if test "${enable_fast_install+set}" = set; then - enableval="$enable_fast_install" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_fast_install=yes ;; -no) enable_fast_install=no ;; -*) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_fast_install=yes -fi - -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:975: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1005: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1035: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1086: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1118: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 1129 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:1134: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1160: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1165: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1193: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - -# Check whether --with-gnu-ld or --without-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test "$ac_cv_prog_gcc" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 -echo "configure:1236: checking for ld used by GCC" >&5 - ac_prog=`($CC -print-prog-name=ld) 2>&5` - case "$ac_prog" in - # Accept absolute paths. - [\\/]* | [A-Za-z]:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 -echo "configure:1260: checking for GNU ld" >&5 -else - echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 -echo "configure:1263: checking for non-GNU ld" >&5 -fi -if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - ac_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - ac_cv_path_LD="$LD" # Let the user override the test with a path. -fi -fi - -LD="$ac_cv_path_LD" -if test -n "$LD"; then - echo "$ac_t""$LD" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi -test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } -echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 -echo "configure:1298: checking if the linker ($LD) is GNU ld" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6 - - -echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 -echo "configure:1314: checking for BSD-compatible nm" >&5 -if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$NM"; then - # Let the user override the test. - ac_cv_path_NM="$NM" -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -B" - break - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -p" - break - else - ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm -fi -fi - -NM="$ac_cv_path_NM" -echo "$ac_t""$NM" 1>&6 - -echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 -echo "configure:1350: checking whether ln -s works" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - rm -f conftestdata -if ln -s X conftestdata 2>/dev/null -then - rm -f conftestdata - ac_cv_prog_LN_S="ln -s" -else - ac_cv_prog_LN_S=ln -fi -fi -LN_S="$ac_cv_prog_LN_S" -if test "$ac_cv_prog_LN_S" = "ln -s"; then - echo "$ac_t""yes" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -case "$target" in -NONE) lt_target="$host" ;; -*) lt_target="$target" ;; -esac - -# Check for any special flags to pass to ltconfig. -libtool_flags="--cache-file=$cache_file" -test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" -test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" -test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" -test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" -test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" - - -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" - : -fi - -test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" -test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case "$lt_target" in -*-*-irix6*) - # Find out which ABI we are using. - echo '#line 1399 "configure"' > conftest.$ac_ext - if { (eval echo configure:1400: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 -echo "configure:1421: checking whether the C compiler needs -belf" >&5 -if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - lt_cv_cc_needs_belf=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - lt_cv_cc_needs_belf=no -fi -rm -f conftest* -fi - -echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6 - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; - - -esac - - -# Save cache, so that ltconfig can load it -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - - -# Actually configure libtool. ac_aux_dir is where install-sh is found. -CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ -LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ -LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ -DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ -${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ -$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ -|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; } - -# Reload cache, that may have been modified by ltconfig -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - -# Redirect the config.log output again, so that the ltconfig log is not -# clobbered by the next message. -exec 5>>./config.log - - -# Check whether --enable-targets or --disable-targets was given. -if test "${enable_targets+set}" = set; then - enableval="$enable_targets" - case "${enableval}" in - yes | "") { echo "configure: error: enable-targets option must specify target names or 'all'" 1>&2; exit 1; } - ;; - no) enable_targets= ;; - *) enable_targets=$enableval ;; -esac -fi -# Check whether --enable-commonbfdlib or --disable-commonbfdlib was given. -if test "${enable_commonbfdlib+set}" = set; then - enableval="$enable_commonbfdlib" - case "${enableval}" in - yes) commonbfdlib=true ;; - no) commonbfdlib=false ;; - *) { echo "configure: error: bad value ${enableval} for BFD commonbfdlib option" 1>&2; exit 1; } ;; -esac -fi - -build_warnings="-W -Wall" -# Check whether --enable-build-warnings or --disable-build-warnings was given. -if test "${enable_build_warnings+set}" = set; then - enableval="$enable_build_warnings" - case "${enableval}" in - yes) ;; - no) build_warnings="-w";; - ,*) t=`echo "${enableval}" | sed -e "s/,/ /g"` - build_warnings="${build_warnings} ${t}";; - *,) t=`echo "${enableval}" | sed -e "s/,/ /g"` - build_warnings="${t} ${build_warnings}";; - *) build_warnings=`echo "${enableval}" | sed -e "s/,/ /g"`;; -esac -if test x"$silent" != x"yes" && test x"$build_warnings" != x""; then - echo "Setting warning flags = $build_warnings" 6>&1 -fi -fi -WARN_CFLAGS="" -if test "x${build_warnings}" != x -a "x$GCC" = xyes ; then - WARN_CFLAGS="${build_warnings}" -fi - - - - - - -if test -z "$target" ; then - { echo "configure: error: Unrecognized target system type; please check config.sub." 1>&2; exit 1; } -fi -if test -z "$host" ; then - { echo "configure: error: Unrecognized host system type; please check config.sub." 1>&2; exit 1; } -fi - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1592: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1622: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1673: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1705: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 1716 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:1721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1747: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1752: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1780: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - - -for ac_prog in 'bison -y' byacc -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1817: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$YACC"; then - ac_cv_prog_YACC="$YACC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_YACC="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -YACC="$ac_cv_prog_YACC" -if test -n "$YACC"; then - echo "$ac_t""$YACC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$YACC" && break -done -test -n "$YACC" || YACC="yacc" - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1848: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1869: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1886: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -nologo -E" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1903: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -missing_dir=`cd $ac_aux_dir && pwd` -for ac_prog in flex lex -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1933: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$LEX"; then - ac_cv_prog_LEX="$LEX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_LEX="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -LEX="$ac_cv_prog_LEX" -if test -n "$LEX"; then - echo "$ac_t""$LEX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$LEX" && break -done -test -n "$LEX" || LEX=""$missing_dir/missing flex"" - -# Extract the first word of "flex", so it can be a program name with args. -set dummy flex; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1966: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$LEX"; then - ac_cv_prog_LEX="$LEX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_LEX="flex" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_LEX" && ac_cv_prog_LEX="lex" -fi -fi -LEX="$ac_cv_prog_LEX" -if test -n "$LEX"; then - echo "$ac_t""$LEX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$LEXLIB" -then - case "$LEX" in - flex*) ac_lib=fl ;; - *) ac_lib=l ;; - esac - echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6 -echo "configure:2000: checking for yywrap in -l$ac_lib" >&5 -ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-l$ac_lib $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LEXLIB="-l$ac_lib" -else - echo "$ac_t""no" 1>&6 -fi - -fi - -echo $ac_n "checking lex output file root""... $ac_c" 1>&6 -echo "configure:2042: checking lex output file root" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_lex_root'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # The minimal lex program is just a single line: %%. But some broken lexes -# (Solaris, I think it was) want two %% lines, so accommodate them. -echo '%% -%%' | $LEX -if test -f lex.yy.c; then - ac_cv_prog_lex_root=lex.yy -elif test -f lexyy.c; then - ac_cv_prog_lex_root=lexyy -else - { echo "configure: error: cannot find output from $LEX; giving up" 1>&2; exit 1; } -fi -fi - -echo "$ac_t""$ac_cv_prog_lex_root" 1>&6 -LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root - -echo $ac_n "checking whether yytext is a pointer""... $ac_c" 1>&6 -echo "configure:2063: checking whether yytext is a pointer" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_lex_yytext_pointer'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # POSIX says lex can declare yytext either as a pointer or an array; the -# default is implementation-dependent. Figure out which it is, since -# not all implementations provide the %pointer and %array declarations. -ac_cv_prog_lex_yytext_pointer=no -echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c -ac_save_LIBS="$LIBS" -LIBS="$LIBS $LEXLIB" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_prog_lex_yytext_pointer=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -LIBS="$ac_save_LIBS" -rm -f "${LEX_OUTPUT_ROOT}.c" - -fi - -echo "$ac_t""$ac_cv_prog_lex_yytext_pointer" 1>&6 -if test $ac_cv_prog_lex_yytext_pointer = yes; then - cat >> confdefs.h <<\EOF -#define YYTEXT_POINTER 1 -EOF - -fi - - -ALL_LINGUAS= -echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 -echo "configure:2106: checking for POSIXized ISC" >&5 -if test -d /etc/conf/kconfig.d && - grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 -then - echo "$ac_t""yes" 1>&6 - ISC=yes # If later tests want to check for ISC. - cat >> confdefs.h <<\EOF -#define _POSIX_SOURCE 1 -EOF - - if test "$GCC" = yes; then - CC="$CC -posix" - else - CC="$CC -Xp" - fi -else - echo "$ac_t""no" 1>&6 - ISC= -fi - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:2127: checking for ANSI C header files" >&5 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -#include -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2140: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat > conftest.$ac_ext < -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -if { (eval echo configure:2207: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* -fi - -fi -fi - -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:2231: checking for working const" >&5 -if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <j = 5; -} -{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -} - -; return 0; } -EOF -if { (eval echo configure:2285: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_c_const=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_c_const=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_c_const" 1>&6 -if test $ac_cv_c_const = no; then - cat >> confdefs.h <<\EOF -#define const -EOF - -fi - -echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:2306: checking for inline" >&5 -if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_c_inline=$ac_kw; break -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -done - -fi - -echo "$ac_t""$ac_cv_c_inline" 1>&6 -case "$ac_cv_c_inline" in - inline | yes) ;; - no) cat >> confdefs.h <<\EOF -#define inline -EOF - ;; - *) cat >> confdefs.h <&6 -echo "configure:2346: checking for off_t" >&5 -if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_off_t=yes -else - rm -rf conftest* - ac_cv_type_off_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_off_t" 1>&6 -if test $ac_cv_type_off_t = no; then - cat >> confdefs.h <<\EOF -#define off_t long -EOF - -fi - -echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:2379: checking for size_t" >&5 -if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_size_t=yes -else - rm -rf conftest* - ac_cv_type_size_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_size_t" 1>&6 -if test $ac_cv_type_size_t = no; then - cat >> confdefs.h <<\EOF -#define size_t unsigned -EOF - -fi - -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:2414: checking for working alloca.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { -char *p = alloca(2 * sizeof(int)); -; return 0; } -EOF -if { (eval echo configure:2426: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_header_alloca_h=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_alloca_h=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 -if test $ac_cv_header_alloca_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA_H 1 -EOF - -fi - -echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:2447: checking for alloca" >&5 -if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -# define alloca _alloca -# else -# if HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -int main() { -char *p = (char *) alloca(1); -; return 0; } -EOF -if { (eval echo configure:2480: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_func_alloca_works=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_func_alloca_works=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_func_alloca_works" 1>&6 -if test $ac_cv_func_alloca_works = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA 1 -EOF - -fi - -if test $ac_cv_func_alloca_works = no; then - # The SVR3 libPW and SVR4 libucb both contain incompatible functions - # that cause trouble. Some versions do not even contain alloca or - # contain a buggy version. If you still want to use their alloca, - # use ar to extract alloca.o from them instead of compiling alloca.c. - ALLOCA=alloca.${ac_objext} - cat >> confdefs.h <<\EOF -#define C_ALLOCA 1 -EOF - - -echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:2512: checking whether alloca needs Cray hooks" >&5 -if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5 | - egrep "webecray" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_os_cray=yes -else - rm -rf conftest* - ac_cv_os_cray=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_os_cray" 1>&6 -if test $ac_cv_os_cray = yes; then -for ac_func in _getb67 GETB67 getb67; do - echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2542: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2570: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <&6 -fi - -done -fi - -echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:2597: checking stack direction for C alloca" >&5 -if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_stack_direction=0 -else - cat > conftest.$ac_ext < addr) ? 1 : -1; -} -main () -{ - exit (find_stack_direction() < 0); -} -EOF -if { (eval echo configure:2624: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_c_stack_direction=1 -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_c_stack_direction=-1 -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 -cat >> confdefs.h <&6 -echo "configure:2649: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2659: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <&6 -fi -done - -for ac_func in getpagesize -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2688: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2716: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - -echo $ac_n "checking for working mmap""... $ac_c" 1>&6 -echo "configure:2741: checking for working mmap" >&5 -if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_mmap_fixed_mapped=no -else - cat > conftest.$ac_ext < -#include -#include - -/* This mess was copied from the GNU getpagesize.h. */ -#ifndef HAVE_GETPAGESIZE -# ifdef HAVE_UNISTD_H -# include -# endif - -/* Assume that all systems that can run configure have sys/param.h. */ -# ifndef HAVE_SYS_PARAM_H -# define HAVE_SYS_PARAM_H 1 -# endif - -# ifdef _SC_PAGESIZE -# define getpagesize() sysconf(_SC_PAGESIZE) -# else /* no _SC_PAGESIZE */ -# ifdef HAVE_SYS_PARAM_H -# include -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else /* no EXEC_PAGESIZE */ -# ifdef NBPG -# define getpagesize() NBPG * CLSIZE -# ifndef CLSIZE -# define CLSIZE 1 -# endif /* no CLSIZE */ -# else /* no NBPG */ -# ifdef NBPC -# define getpagesize() NBPC -# else /* no NBPC */ -# ifdef PAGESIZE -# define getpagesize() PAGESIZE -# endif /* PAGESIZE */ -# endif /* no NBPC */ -# endif /* no NBPG */ -# endif /* no EXEC_PAGESIZE */ -# else /* no HAVE_SYS_PARAM_H */ -# define getpagesize() 8192 /* punt totally */ -# endif /* no HAVE_SYS_PARAM_H */ -# endif /* no _SC_PAGESIZE */ - -#endif /* no HAVE_GETPAGESIZE */ - -#ifdef __cplusplus -extern "C" { void *malloc(unsigned); } -#else -char *malloc(); -#endif - -int -main() -{ - char *data, *data2, *data3; - int i, pagesize; - int fd; - - pagesize = getpagesize(); - - /* - * First, make a file with some known garbage in it. - */ - data = malloc(pagesize); - if (!data) - exit(1); - for (i = 0; i < pagesize; ++i) - *(data + i) = rand(); - umask(0); - fd = creat("conftestmmap", 0600); - if (fd < 0) - exit(1); - if (write(fd, data, pagesize) != pagesize) - exit(1); - close(fd); - - /* - * Next, try to mmap the file at a fixed address which - * already has something else allocated at it. If we can, - * also make sure that we see the same garbage. - */ - fd = open("conftestmmap", O_RDWR); - if (fd < 0) - exit(1); - data2 = malloc(2 * pagesize); - if (!data2) - exit(1); - data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); - if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED, fd, 0L)) - exit(1); - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data2 + i)) - exit(1); - - /* - * Finally, make sure that changes to the mapped area - * do not percolate back to the file as seen by read(). - * (This is a bug on some variants of i386 svr4.0.) - */ - for (i = 0; i < pagesize; ++i) - *(data2 + i) = *(data2 + i) + 1; - data3 = malloc(pagesize); - if (!data3) - exit(1); - if (read(fd, data3, pagesize) != pagesize) - exit(1); - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data3 + i)) - exit(1); - close(fd); - unlink("conftestmmap"); - exit(0); -} - -EOF -if { (eval echo configure:2889: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_func_mmap_fixed_mapped=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_func_mmap_fixed_mapped=no -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 -if test $ac_cv_func_mmap_fixed_mapped = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_MMAP 1 -EOF - -fi - - - for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h string.h \ -unistd.h values.h sys/param.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2917: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2927: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <&6 -fi -done - - for ac_func in getcwd munmap putenv setenv setlocale strchr strcasecmp \ -__argz_count __argz_stringify __argz_next -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2957: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2985: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - - - if test "${ac_cv_func_stpcpy+set}" != "set"; then - for ac_func in stpcpy -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3014: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - - fi - if test "${ac_cv_func_stpcpy}" = "yes"; then - cat >> confdefs.h <<\EOF -#define HAVE_STPCPY 1 -EOF - - fi - - if test $ac_cv_header_locale_h = yes; then - echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6 -echo "configure:3076: checking for LC_MESSAGES" >&5 -if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { -return LC_MESSAGES -; return 0; } -EOF -if { (eval echo configure:3088: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - am_cv_val_LC_MESSAGES=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - am_cv_val_LC_MESSAGES=no -fi -rm -f conftest* -fi - -echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6 - if test $am_cv_val_LC_MESSAGES = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_LC_MESSAGES 1 -EOF - - fi - fi - echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6 -echo "configure:3109: checking whether NLS is requested" >&5 - # Check whether --enable-nls or --disable-nls was given. -if test "${enable_nls+set}" = set; then - enableval="$enable_nls" - USE_NLS=$enableval -else - USE_NLS=yes -fi - - echo "$ac_t""$USE_NLS" 1>&6 - - - USE_INCLUDED_LIBINTL=no - - if test "$USE_NLS" = "yes"; then - cat >> confdefs.h <<\EOF -#define ENABLE_NLS 1 -EOF - - echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6 -echo "configure:3129: checking whether included gettext is requested" >&5 - # Check whether --with-included-gettext or --without-included-gettext was given. -if test "${with_included_gettext+set}" = set; then - withval="$with_included_gettext" - nls_cv_force_use_gnu_gettext=$withval -else - nls_cv_force_use_gnu_gettext=no -fi - - echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6 - - nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" - if test "$nls_cv_force_use_gnu_gettext" != "yes"; then - nls_cv_header_intl= - nls_cv_header_libgt= - CATOBJEXT=NONE - - ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for libintl.h""... $ac_c" 1>&6 -echo "configure:3148: checking for libintl.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3158: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6 -echo "configure:3175: checking for gettext in libc" >&5 -if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { -return (int) gettext ("") -; return 0; } -EOF -if { (eval echo configure:3187: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - gt_cv_func_gettext_libc=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - gt_cv_func_gettext_libc=no -fi -rm -f conftest* -fi - -echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6 - - if test "$gt_cv_func_gettext_libc" != "yes"; then - echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6 -echo "configure:3203: checking for bindtextdomain in -lintl" >&5 -ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lintl $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6 -echo "configure:3238: checking for gettext in libintl" >&5 -if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - gt_cv_func_gettext_libintl=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - gt_cv_func_gettext_libintl=no -fi -rm -f conftest* -fi - -echo "$ac_t""$gt_cv_func_gettext_libintl" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - fi - - if test "$gt_cv_func_gettext_libc" = "yes" \ - || test "$gt_cv_func_gettext_libintl" = "yes"; then - cat >> confdefs.h <<\EOF -#define HAVE_GETTEXT 1 -EOF - - # Extract the first word of "msgfmt", so it can be a program name with args. -set dummy msgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3278: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$MSGFMT" in - /*) - ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then - ac_cv_path_MSGFMT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" - ;; -esac -fi -MSGFMT="$ac_cv_path_MSGFMT" -if test -n "$MSGFMT"; then - echo "$ac_t""$MSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - if test "$MSGFMT" != "no"; then - for ac_func in dcgettext -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3312: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3340: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - - # Extract the first word of "gmsgfmt", so it can be a program name with args. -set dummy gmsgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3367: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$GMSGFMT" in - /*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_GMSGFMT="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" - ;; -esac -fi -GMSGFMT="$ac_cv_path_GMSGFMT" -if test -n "$GMSGFMT"; then - echo "$ac_t""$GMSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - # Extract the first word of "xgettext", so it can be a program name with args. -set dummy xgettext; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3403: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$XGETTEXT" in - /*) - ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then - ac_cv_path_XGETTEXT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" - ;; -esac -fi -XGETTEXT="$ac_cv_path_XGETTEXT" -if test -n "$XGETTEXT"; then - echo "$ac_t""$XGETTEXT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - CATOBJEXT=.gmo - DATADIRNAME=share -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CATOBJEXT=.mo - DATADIRNAME=lib -fi -rm -f conftest* - INSTOBJEXT=.mo - fi - fi - -else - echo "$ac_t""no" 1>&6 -fi - - - - if test "$CATOBJEXT" = "NONE"; then - nls_cv_use_gnu_gettext=yes - fi - fi - - if test "$nls_cv_use_gnu_gettext" = "yes"; then - INTLOBJS="\$(GETTOBJS)" - # Extract the first word of "msgfmt", so it can be a program name with args. -set dummy msgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3475: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$MSGFMT" in - /*) - ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then - ac_cv_path_MSGFMT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="msgfmt" - ;; -esac -fi -MSGFMT="$ac_cv_path_MSGFMT" -if test -n "$MSGFMT"; then - echo "$ac_t""$MSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - # Extract the first word of "gmsgfmt", so it can be a program name with args. -set dummy gmsgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3509: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$GMSGFMT" in - /*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_GMSGFMT="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" - ;; -esac -fi -GMSGFMT="$ac_cv_path_GMSGFMT" -if test -n "$GMSGFMT"; then - echo "$ac_t""$GMSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - # Extract the first word of "xgettext", so it can be a program name with args. -set dummy xgettext; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3545: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$XGETTEXT" in - /*) - ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then - ac_cv_path_XGETTEXT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" - ;; -esac -fi -XGETTEXT="$ac_cv_path_XGETTEXT" -if test -n "$XGETTEXT"; then - echo "$ac_t""$XGETTEXT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - - USE_INCLUDED_LIBINTL=yes - CATOBJEXT=.gmo - INSTOBJEXT=.mo - DATADIRNAME=share - INTLDEPS='$(top_builddir)/../intl/libintl.a' - INTLLIBS=$INTLDEPS - LIBS=`echo $LIBS | sed -e 's/-lintl//'` - nls_cv_header_intl=libintl.h - nls_cv_header_libgt=libgettext.h - fi - - if test "$XGETTEXT" != ":"; then - if $XGETTEXT --omit-header /dev/null 2> /dev/null; then - : ; - else - echo "$ac_t""found xgettext programs is not GNU xgettext; ignore it" 1>&6 - XGETTEXT=":" - fi - fi - - # We need to process the po/ directory. - POSUB=po - else - DATADIRNAME=share - nls_cv_header_intl=libintl.h - nls_cv_header_libgt=libgettext.h - fi - - # If this is used in GNU gettext we have to set USE_NLS to `yes' - # because some of the sources are only built for this goal. - if test "$PACKAGE" = gettext; then - USE_NLS=yes - USE_INCLUDED_LIBINTL=yes - fi - - for lang in $ALL_LINGUAS; do - GMOFILES="$GMOFILES $lang.gmo" - POFILES="$POFILES $lang.po" - done - - - - - - - - - - - - - - - if test "x$CATOBJEXT" != "x"; then - if test "x$ALL_LINGUAS" = "x"; then - LINGUAS= - else - echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6 -echo "configure:3635: checking for catalogs to be installed" >&5 - NEW_LINGUAS= - for lang in ${LINGUAS=$ALL_LINGUAS}; do - case "$ALL_LINGUAS" in - *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; - esac - done - LINGUAS=$NEW_LINGUAS - echo "$ac_t""$LINGUAS" 1>&6 - fi - - if test -n "$LINGUAS"; then - for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done - fi - fi - - if test $ac_cv_header_locale_h = yes; then - INCLUDE_LOCALE_H="#include " - else - INCLUDE_LOCALE_H="\ -/* The system does not provide the header . Take care yourself. */" - fi - - - if test -f $srcdir/po2tbl.sed.in; then - if test "$CATOBJEXT" = ".cat"; then - ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6 -echo "configure:3663: checking for linux/version.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3673: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - msgformat=linux -else - echo "$ac_t""no" 1>&6 -msgformat=xopen -fi - - - sed -e '/^#/d' $srcdir/$msgformat-msg.sed > po2msg.sed - fi - sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ - $srcdir/po2tbl.sed.in > po2tbl.sed - fi - - if test "$PACKAGE" = "gettext"; then - GT_NO="#NO#" - GT_YES= - else - GT_NO= - GT_YES="#YES#" - fi - - - - MKINSTALLDIRS="\$(srcdir)/../../mkinstalldirs" - - - l= - - - if test -d $srcdir/po; then - test -d po || mkdir po - if test "x$srcdir" != "x."; then - if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then - posrcprefix="$srcdir/" - else - posrcprefix="../$srcdir/" - fi - else - posrcprefix="../" - fi - rm -f po/POTFILES - sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ - < $srcdir/po/POTFILES.in > po/POTFILES - fi - - -echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 -echo "configure:3736: checking whether to enable maintainer-specific portions of Makefiles" >&5 - # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. -if test "${enable_maintainer_mode+set}" = set; then - enableval="$enable_maintainer_mode" - USE_MAINTAINER_MODE=$enableval -else - USE_MAINTAINER_MODE=no -fi - - echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6 - - -if test $USE_MAINTAINER_MODE = yes; then - MAINTAINER_MODE_TRUE= - MAINTAINER_MODE_FALSE='#' -else - MAINTAINER_MODE_TRUE='#' - MAINTAINER_MODE_FALSE= -fi - MAINT=$MAINTAINER_MODE_TRUE - - -echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 -echo "configure:3759: checking for Cygwin environment" >&5 -if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_cygwin=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_cygwin=no -fi -rm -f conftest* -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_cygwin" 1>&6 -CYGWIN= -test "$ac_cv_cygwin" = yes && CYGWIN=yes -echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 -echo "configure:3792: checking for mingw32 environment" >&5 -if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_mingw32=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_mingw32=no -fi -rm -f conftest* -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_mingw32" 1>&6 -MINGW32= -test "$ac_cv_mingw32" = yes && MINGW32=yes - - -echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:3823: checking for executable suffix" >&5 -if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$CYGWIN" = yes || test "$MINGW32" = yes; then - ac_cv_exeext=.exe -else - rm -f conftest* - echo 'int main () { return 0; }' > conftest.$ac_ext - ac_cv_exeext= - if { (eval echo configure:3833: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then - for file in conftest.*; do - case $file in - *.c | *.o | *.obj | *.ilk | *.pdb) ;; - *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; - esac - done - else - { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; } - fi - rm -f conftest* - test x"${ac_cv_exeext}" = x && ac_cv_exeext=no -fi -fi - -EXEEXT="" -test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext} -echo "$ac_t""${ac_cv_exeext}" 1>&6 -ac_exeext=$EXEEXT - -if test -n "$EXEEXT"; then - cat >> confdefs.h <<\EOF -#define HAVE_EXECUTABLE_SUFFIX 1 -EOF - -fi -cat >> confdefs.h <&6 -echo "configure:3876: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:3915: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - -# Put a plausible default for CC_FOR_BUILD in Makefile. -if test -z "$CC_FOR_BUILD"; then - if test "x$cross_compiling" = "xno"; then - CC_FOR_BUILD='$(CC)' - else - CC_FOR_BUILD=gcc - fi -fi - -# Also set EXEEXT_FOR_BUILD. -if test "x$cross_compiling" = "xno"; then - EXEEXT_FOR_BUILD='$(EXEEXT)' -else - echo $ac_n "checking for build system executable suffix""... $ac_c" 1>&6 -echo "configure:3982: checking for build system executable suffix" >&5 -if eval "test \"`echo '$''{'bfd_cv_build_exeext'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - rm -f conftest* - echo 'int main () { return 0; }' > conftest.c - bfd_cv_build_exeext= - ${CC_FOR_BUILD} -o conftest conftest.c 1>&5 2>&5 - for file in conftest.*; do - case $file in - *.c | *.o | *.obj | *.ilk | *.pdb) ;; - *) bfd_cv_build_exeext=`echo $file | sed -e s/conftest//` ;; - esac - done - rm -f conftest* - test x"${bfd_cv_build_exeext}" = x && bfd_cv_build_exeext=no -fi - -echo "$ac_t""$bfd_cv_build_exeext" 1>&6 - EXEEXT_FOR_BUILD="" - test x"${bfd_cv_build_exeext}" != xno && EXEEXT_FOR_BUILD=${bfd_cv_build_exeext} -fi - - -DEMANGLER_NAME=c++filt -case "${host}" in - *-*-go32* | *-*-msdos*) - DEMANGLER_NAME=cxxfilt -esac - - -for ac_hdr in string.h strings.h stdlib.h unistd.h fcntl.h sys/file.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:4017: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:4027: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <&6 -fi -done - -echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6 -echo "configure:4054: checking for sys/wait.h that is POSIX.1 compatible" >&5 -if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#ifndef WEXITSTATUS -#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) -#endif -#ifndef WIFEXITED -#define WIFEXITED(stat_val) (((stat_val) & 255) == 0) -#endif -int main() { -int s; -wait (&s); -s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; -; return 0; } -EOF -if { (eval echo configure:4075: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_header_sys_wait_h=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_sys_wait_h=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6 -if test $ac_cv_header_sys_wait_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_SYS_WAIT_H 1 -EOF - -fi - -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:4098: checking for working alloca.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { -char *p = alloca(2 * sizeof(int)); -; return 0; } -EOF -if { (eval echo configure:4110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_header_alloca_h=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_alloca_h=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 -if test $ac_cv_header_alloca_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA_H 1 -EOF - -fi - -echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:4131: checking for alloca" >&5 -if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -# define alloca _alloca -# else -# if HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -int main() { -char *p = (char *) alloca(1); -; return 0; } -EOF -if { (eval echo configure:4164: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_func_alloca_works=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_func_alloca_works=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_func_alloca_works" 1>&6 -if test $ac_cv_func_alloca_works = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA 1 -EOF - -fi - -if test $ac_cv_func_alloca_works = no; then - # The SVR3 libPW and SVR4 libucb both contain incompatible functions - # that cause trouble. Some versions do not even contain alloca or - # contain a buggy version. If you still want to use their alloca, - # use ar to extract alloca.o from them instead of compiling alloca.c. - ALLOCA=alloca.${ac_objext} - cat >> confdefs.h <<\EOF -#define C_ALLOCA 1 -EOF - - -echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:4196: checking whether alloca needs Cray hooks" >&5 -if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5 | - egrep "webecray" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_os_cray=yes -else - rm -rf conftest* - ac_cv_os_cray=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_os_cray" 1>&6 -if test $ac_cv_os_cray = yes; then -for ac_func in _getb67 GETB67 getb67; do - echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:4226: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:4254: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <&6 -fi - -done -fi - -echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:4281: checking stack direction for C alloca" >&5 -if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_stack_direction=0 -else - cat > conftest.$ac_ext < addr) ? 1 : -1; -} -main () -{ - exit (find_stack_direction() < 0); -} -EOF -if { (eval echo configure:4308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_c_stack_direction=1 -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_c_stack_direction=-1 -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 -cat >> confdefs.h <&6 -echo "configure:4332: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:4360: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - - -# Some systems have frexp only in -lm, not in -lc. - -echo $ac_n "checking for library containing frexp""... $ac_c" 1>&6 -echo "configure:4388: checking for library containing frexp" >&5 -if eval "test \"`echo '$''{'ac_cv_search_frexp'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_func_search_save_LIBS="$LIBS" -ac_cv_search_frexp="no" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_search_frexp="none required" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -test "$ac_cv_search_frexp" = "no" && for i in m; do -LIBS="-l$i $ac_func_search_save_LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_search_frexp="-l$i" -break -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -done -LIBS="$ac_func_search_save_LIBS" -fi - -echo "$ac_t""$ac_cv_search_frexp" 1>&6 -if test "$ac_cv_search_frexp" != "no"; then - test "$ac_cv_search_frexp" = "none required" || LIBS="$ac_cv_search_frexp $LIBS" - -else : - -fi - -echo $ac_n "checking for time_t in time.h""... $ac_c" 1>&6 -echo "configure:4450: checking for time_t in time.h" >&5 -if eval "test \"`echo '$''{'bu_cv_decl_time_t_time_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { -time_t i; -; return 0; } -EOF -if { (eval echo configure:4462: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bu_cv_decl_time_t_time_h=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - bu_cv_decl_time_t_time_h=no -fi -rm -f conftest* -fi - -echo "$ac_t""$bu_cv_decl_time_t_time_h" 1>&6 -if test $bu_cv_decl_time_t_time_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_TIME_T_IN_TIME_H 1 -EOF - -fi - -echo $ac_n "checking for time_t in sys/types.h""... $ac_c" 1>&6 -echo "configure:4483: checking for time_t in sys/types.h" >&5 -if eval "test \"`echo '$''{'bu_cv_decl_time_t_types_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { -time_t i; -; return 0; } -EOF -if { (eval echo configure:4495: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bu_cv_decl_time_t_types_h=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - bu_cv_decl_time_t_types_h=no -fi -rm -f conftest* -fi - -echo "$ac_t""$bu_cv_decl_time_t_types_h" 1>&6 -if test $bu_cv_decl_time_t_types_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_TIME_T_IN_TYPES_H 1 -EOF - -fi - -# Under Next 3.2 apparently does not define struct utimbuf -# by default. -echo $ac_n "checking for utime.h""... $ac_c" 1>&6 -echo "configure:4518: checking for utime.h" >&5 -if eval "test \"`echo '$''{'bu_cv_header_utime_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#ifdef HAVE_TIME_H -#include -#endif -#include -int main() { -struct utimbuf s; -; return 0; } -EOF -if { (eval echo configure:4534: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bu_cv_header_utime_h=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - bu_cv_header_utime_h=no -fi -rm -f conftest* -fi - -echo "$ac_t""$bu_cv_header_utime_h" 1>&6 -if test $bu_cv_header_utime_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_GOOD_UTIME_H 1 -EOF - -fi - -echo $ac_n "checking whether fprintf must be declared""... $ac_c" 1>&6 -echo "configure:4555: checking whether fprintf must be declared" >&5 -if eval "test \"`echo '$''{'bfd_cv_decl_needed_fprintf'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif -#ifdef HAVE_STDLIB_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -int main() { -char *(*pfn) = (char *(*)) fprintf -; return 0; } -EOF -if { (eval echo configure:4581: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bfd_cv_decl_needed_fprintf=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - bfd_cv_decl_needed_fprintf=yes -fi -rm -f conftest* -fi - -echo "$ac_t""$bfd_cv_decl_needed_fprintf" 1>&6 -if test $bfd_cv_decl_needed_fprintf = yes; then - cat >> confdefs.h <<\EOF -#define NEED_DECLARATION_FPRINTF 1 -EOF - -fi - -echo $ac_n "checking whether strstr must be declared""... $ac_c" 1>&6 -echo "configure:4602: checking whether strstr must be declared" >&5 -if eval "test \"`echo '$''{'bfd_cv_decl_needed_strstr'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif -#ifdef HAVE_STDLIB_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -int main() { -char *(*pfn) = (char *(*)) strstr -; return 0; } -EOF -if { (eval echo configure:4628: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bfd_cv_decl_needed_strstr=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - bfd_cv_decl_needed_strstr=yes -fi -rm -f conftest* -fi - -echo "$ac_t""$bfd_cv_decl_needed_strstr" 1>&6 -if test $bfd_cv_decl_needed_strstr = yes; then - cat >> confdefs.h <<\EOF -#define NEED_DECLARATION_STRSTR 1 -EOF - -fi - -echo $ac_n "checking whether sbrk must be declared""... $ac_c" 1>&6 -echo "configure:4649: checking whether sbrk must be declared" >&5 -if eval "test \"`echo '$''{'bfd_cv_decl_needed_sbrk'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif -#ifdef HAVE_STDLIB_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -int main() { -char *(*pfn) = (char *(*)) sbrk -; return 0; } -EOF -if { (eval echo configure:4675: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bfd_cv_decl_needed_sbrk=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - bfd_cv_decl_needed_sbrk=yes -fi -rm -f conftest* -fi - -echo "$ac_t""$bfd_cv_decl_needed_sbrk" 1>&6 -if test $bfd_cv_decl_needed_sbrk = yes; then - cat >> confdefs.h <<\EOF -#define NEED_DECLARATION_SBRK 1 -EOF - -fi - -echo $ac_n "checking whether getenv must be declared""... $ac_c" 1>&6 -echo "configure:4696: checking whether getenv must be declared" >&5 -if eval "test \"`echo '$''{'bfd_cv_decl_needed_getenv'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif -#ifdef HAVE_STDLIB_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -int main() { -char *(*pfn) = (char *(*)) getenv -; return 0; } -EOF -if { (eval echo configure:4722: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bfd_cv_decl_needed_getenv=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - bfd_cv_decl_needed_getenv=yes -fi -rm -f conftest* -fi - -echo "$ac_t""$bfd_cv_decl_needed_getenv" 1>&6 -if test $bfd_cv_decl_needed_getenv = yes; then - cat >> confdefs.h <<\EOF -#define NEED_DECLARATION_GETENV 1 -EOF - -fi - -echo $ac_n "checking whether environ must be declared""... $ac_c" 1>&6 -echo "configure:4743: checking whether environ must be declared" >&5 -if eval "test \"`echo '$''{'bfd_cv_decl_needed_environ'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif -#ifdef HAVE_STDLIB_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -int main() { -char *(*pfn) = (char *(*)) environ -; return 0; } -EOF -if { (eval echo configure:4769: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bfd_cv_decl_needed_environ=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - bfd_cv_decl_needed_environ=yes -fi -rm -f conftest* -fi - -echo "$ac_t""$bfd_cv_decl_needed_environ" 1>&6 -if test $bfd_cv_decl_needed_environ = yes; then - cat >> confdefs.h <<\EOF -#define NEED_DECLARATION_ENVIRON 1 -EOF - -fi - - - -case "${host}" in -*-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*) - cat >> confdefs.h <<\EOF -#define USE_BINARY_FOPEN 1 -EOF - ;; -esac - -# target-specific stuff: - -# Canonicalize the secondary target names. -if test -n "$enable_targets"; then - for targ in `echo $enable_targets | sed 's/,/ /g'` - do - result=`$ac_config_sub $targ 2>/dev/null` - if test -n "$result"; then - canon_targets="$canon_targets $result" - else - # Allow targets that config.sub doesn't recognize, like "all". - canon_targets="$canon_targets $targ" - fi - done -fi - -all_targets=false -BUILD_NLMCONV= -NLMCONV_DEFS= -BUILD_SRCONV= -BUILD_DLLTOOL= -DLLTOOL_DEFS= -BUILD_WINDRES= -BUILD_DLLWRAP= -BUILD_MISC= - -for targ in $target $canon_targets -do - if test "x$targ" = "xall"; then - all_targets=true - BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' - BUILD_SRCONV='$(SRCONV_PROG)' - NLMCONV_DEFS="-DNLMCONV_I386 -DNLMCONV_ALPHA -DNLMCONV_POWERPC -DNLMCONV_SPARC" - else - case $targ in - i[3456]86*-*-netware*) - BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' - NLMCONV_DEFS="$NLMCONV_DEFS -DNLMCONV_I386" - ;; - alpha*-*-netware*) - BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' - NLMCONV_DEFS="$NLMCONV_DEFS -DNLMCONV_ALPHA" - ;; - powerpc*-*-netware*) - BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' - NLMCONV_DEFS="$NLMCONV_DEFS -DNLMCONV_POWERPC" - ;; - sparc*-*-netware*) - BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' - NLMCONV_DEFS="$NLMCONV_DEFS -DNLMCONV_SPARC" - ;; - esac - case $targ in - *-*-hms*) BUILD_SRCONV='$(SRCONV_PROG)' ;; - esac - case $targ in - arm-*pe* | arm-*-wince) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_ARM" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - thumb-*pe*) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_ARM" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - i[3-6]86-*pe* | i[3-6]86-*-cygwin* | i[3-6]86-*-mingw32*) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_I386" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - BUILD_DLLWRAP='$(DLLWRAP_PROG)$(EXEEXT)' - ;; - i3-686-*-interix) - BUILD_DLLTOOL='$(DLLTOOL_PROG)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_I386" - ;; - powerpc*-*-*pe* | powerpc*-*-cygwin*) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_PPC" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - sh*-*-*pe) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_SH" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - mips*-*-*pe) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MIPS" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - mcore-*pe) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MCORE" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - mcore-*elf) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MCORE_ELF" - ;; - esac - fi -done - - - - - - - - - - -cat >> confdefs.h < confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile po/Makefile.in:po/Make-in config.h:config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@host@%$host%g -s%@host_alias@%$host_alias%g -s%@host_cpu@%$host_cpu%g -s%@host_vendor@%$host_vendor%g -s%@host_os@%$host_os%g -s%@target@%$target%g -s%@target_alias@%$target_alias%g -s%@target_cpu@%$target_cpu%g -s%@target_vendor@%$target_vendor%g -s%@target_os@%$target_os%g -s%@build@%$build%g -s%@build_alias@%$build_alias%g -s%@build_cpu@%$build_cpu%g -s%@build_vendor@%$build_vendor%g -s%@build_os@%$build_os%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@PACKAGE@%$PACKAGE%g -s%@VERSION@%$VERSION%g -s%@ACLOCAL@%$ACLOCAL%g -s%@AUTOCONF@%$AUTOCONF%g -s%@AUTOMAKE@%$AUTOMAKE%g -s%@AUTOHEADER@%$AUTOHEADER%g -s%@MAKEINFO@%$MAKEINFO%g -s%@SET_MAKE@%$SET_MAKE%g -s%@RANLIB@%$RANLIB%g -s%@CC@%$CC%g -s%@LN_S@%$LN_S%g -s%@LIBTOOL@%$LIBTOOL%g -s%@WARN_CFLAGS@%$WARN_CFLAGS%g -s%@YACC@%$YACC%g -s%@LEX@%$LEX%g -s%@LEXLIB@%$LEXLIB%g -s%@CPP@%$CPP%g -s%@LEX_OUTPUT_ROOT@%$LEX_OUTPUT_ROOT%g -s%@ALLOCA@%$ALLOCA%g -s%@USE_NLS@%$USE_NLS%g -s%@MSGFMT@%$MSGFMT%g -s%@GMSGFMT@%$GMSGFMT%g -s%@XGETTEXT@%$XGETTEXT%g -s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g -s%@CATALOGS@%$CATALOGS%g -s%@CATOBJEXT@%$CATOBJEXT%g -s%@DATADIRNAME@%$DATADIRNAME%g -s%@GMOFILES@%$GMOFILES%g -s%@INSTOBJEXT@%$INSTOBJEXT%g -s%@INTLDEPS@%$INTLDEPS%g -s%@INTLLIBS@%$INTLLIBS%g -s%@INTLOBJS@%$INTLOBJS%g -s%@POFILES@%$POFILES%g -s%@POSUB@%$POSUB%g -s%@INCLUDE_LOCALE_H@%$INCLUDE_LOCALE_H%g -s%@GT_NO@%$GT_NO%g -s%@GT_YES@%$GT_YES%g -s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g -s%@l@%$l%g -s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g -s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g -s%@MAINT@%$MAINT%g -s%@EXEEXT@%$EXEEXT%g -s%@HDEFINES@%$HDEFINES%g -s%@AR@%$AR%g -s%@CC_FOR_BUILD@%$CC_FOR_BUILD%g -s%@EXEEXT_FOR_BUILD@%$EXEEXT_FOR_BUILD%g -s%@DEMANGLER_NAME@%$DEMANGLER_NAME%g -s%@NLMCONV_DEFS@%$NLMCONV_DEFS%g -s%@BUILD_NLMCONV@%$BUILD_NLMCONV%g -s%@BUILD_SRCONV@%$BUILD_SRCONV%g -s%@BUILD_DLLTOOL@%$BUILD_DLLTOOL%g -s%@DLLTOOL_DEFS@%$DLLTOOL_DEFS%g -s%@BUILD_WINDRES@%$BUILD_WINDRES%g -s%@BUILD_DLLWRAP@%$BUILD_DLLWRAP%g -s%@BUILD_MISC@%$BUILD_MISC%g -s%@UNDERSCORE@%$UNDERSCORE%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -if test "${CONFIG_HEADERS+set}" != set; then -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -fi -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - cat $ac_file_inputs > conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - fi - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h - -case "x$CONFIG_FILES" in -*) sed -e '/POTFILES =/r po/POTFILES' po/Makefile.in > po/Makefile ;; -esac - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/binutils/configure.com b/binutils/configure.com deleted file mode 100644 index 99463d5ecdb..00000000000 --- a/binutils/configure.com +++ /dev/null @@ -1,76 +0,0 @@ -$! -$! This file configures binutils for use with openVMS/Alpha -$! We do not use the configure script, since we do not have /bin/sh -$! to execute it. -$! -$! Written by Klaus K"ampf (kkaempf@rmi.de) -$! -$arch_indx = 1 + ((f$getsyi("CPU").ge.128).and.1) ! vax==1, alpha==2 -$arch = f$element(arch_indx,"|","|VAX|Alpha|") -$! -$! -$! Generate config.h -$! -$ create []config.h -/* config.h. Generated automatically by configure. */ -/* config.in. Generated automatically from configure.in by autoheader. */ -/* Is the type time_t defined in ? */ -#define HAVE_TIME_T_IN_TIME_H 1 -/* Is the type time_t defined in ? */ -#define HAVE_TIME_T_IN_TYPES_H 1 -/* Does define struct utimbuf? */ -#define HAVE_GOOD_UTIME_H 1 -/* Whether fprintf must be declared even if is included. */ -#define NEED_DECLARATION_FPRINTF 1 -/* Whether sbrk must be declared even if is included. */ -#undef NEED_DECLARATION_SBRK -/* Do we need to use the b modifier when opening binary files? */ -/* #undef USE_BINARY_FOPEN */ -/* Define if you have the sbrk function. */ -/* #undef HAVE_SBRK 1 */ -/* Define if you have the utimes function. */ -#define HAVE_UTIMES 1 -/* Define if you have the header file. */ -#define HAVE_FCNTL_H 1 -/* Define if you have the header file. */ -#define HAVE_STDLIB_H 1 -/* Define if you have the header file. */ -#define HAVE_STRING_H 1 -/* Define if you have the header file. */ -#define HAVE_STRINGS_H 1 -/* Define if you have the header file. */ -#define HAVE_SYS_FILE_H 1 -/* Define if you have the header file. */ -#define HAVE_UNISTD_H 1 -$ write sys$output "Generated `config.h'" -$! -$! -$! Edit VERSION in makefile.vms-in -$! -$ edit/tpu/nojournal/nosection/nodisplay/command=sys$input - - []makefile.vms-in /output=[]makefile.vms -$DECK -! -! Get VERSION from configure.in -! - mfile := CREATE_BUFFER("mfile", "CONFIGURE.IN"); - rang := CREATE_RANGE(BEGINNING_OF(mfile), END_OF(mfile)); - match_pos := SEARCH_QUIETLY('AM_INIT_AUTOMAKE(binutils, ', FORWARD, EXACT, rang); - IF match_pos <> 0 THEN; - POSITION(BEGINNING_OF(match_pos)); - ERASE(match_pos); - vers := CURRENT_LINE-")"; - ELSE; - vers := "unknown"; - ENDIF; - - file := CREATE_BUFFER("file", GET_INFO(COMMAND_LINE, "file_name")); - rang := CREATE_RANGE(BEGINNING_OF(file), END_OF(file)); - match_pos := SEARCH_QUIETLY('@VERSION@', FORWARD, EXACT, rang); - POSITION(BEGINNING_OF(match_pos)); - ERASE(match_pos); - COPY_TEXT(vers); - WRITE_FILE(file, GET_INFO(COMMAND_LINE, "output_file")); - QUIT -$ EOD -$ write sys$output "Created `makefile.vms'" diff --git a/binutils/configure.in b/binutils/configure.in deleted file mode 100644 index 27a14866adc..00000000000 --- a/binutils/configure.in +++ /dev/null @@ -1,281 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -dnl -AC_PREREQ(2.13) -AC_INIT(ar.c) - -AC_CANONICAL_SYSTEM - -AM_INIT_AUTOMAKE(binutils, 2.9.5) - -AM_PROG_LIBTOOL - -AC_ARG_ENABLE(targets, -[ --enable-targets alternative target configurations], -[case "${enableval}" in - yes | "") AC_ERROR(enable-targets option must specify target names or 'all') - ;; - no) enable_targets= ;; - *) enable_targets=$enableval ;; -esac])dnl -AC_ARG_ENABLE(commonbfdlib, -[ --enable-commonbfdlib build shared BFD/opcodes/libiberty library], -[case "${enableval}" in - yes) commonbfdlib=true ;; - no) commonbfdlib=false ;; - *) AC_MSG_ERROR([bad value ${enableval} for BFD commonbfdlib option]) ;; -esac])dnl - -build_warnings="-W -Wall" -AC_ARG_ENABLE(build-warnings, -[ --enable-build-warnings Enable build-time compiler warnings if gcc is used], -[case "${enableval}" in - yes) ;; - no) build_warnings="-w";; - ,*) t=`echo "${enableval}" | sed -e "s/,/ /g"` - build_warnings="${build_warnings} ${t}";; - *,) t=`echo "${enableval}" | sed -e "s/,/ /g"` - build_warnings="${t} ${build_warnings}";; - *) build_warnings=`echo "${enableval}" | sed -e "s/,/ /g"`;; -esac -if test x"$silent" != x"yes" && test x"$build_warnings" != x""; then - echo "Setting warning flags = $build_warnings" 6>&1 -fi])dnl -WARN_CFLAGS="" -if test "x${build_warnings}" != x -a "x$GCC" = xyes ; then - WARN_CFLAGS="${build_warnings}" -fi -AC_SUBST(WARN_CFLAGS) - -AM_CONFIG_HEADER(config.h:config.in) - -if test -z "$target" ; then - AC_MSG_ERROR(Unrecognized target system type; please check config.sub.) -fi -if test -z "$host" ; then - AC_MSG_ERROR(Unrecognized host system type; please check config.sub.) -fi - -AC_PROG_CC - -AC_PROG_YACC -AM_PROG_LEX - -ALL_LINGUAS= -CY_GNU_GETTEXT - -AM_MAINTAINER_MODE -AC_EXEEXT -if test -n "$EXEEXT"; then - AC_DEFINE(HAVE_EXECUTABLE_SUFFIX, 1, - [Does the platform use an executable suffix?]) -fi -AC_DEFINE_UNQUOTED(EXECUTABLE_SUFFIX, "${EXEEXT}", - [Suffix used for executables, if any.]) - -# host-specific stuff: - -HDEFINES= - -. ${srcdir}/../bfd/configure.host - -AC_SUBST(HDEFINES) -AR=${AR-ar} -AC_SUBST(AR) -AC_PROG_RANLIB -AC_PROG_INSTALL - -BFD_CC_FOR_BUILD - -DEMANGLER_NAME=c++filt -case "${host}" in - *-*-go32* | *-*-msdos*) - DEMANGLER_NAME=cxxfilt -esac -AC_SUBST(DEMANGLER_NAME) - -AC_CHECK_HEADERS(string.h strings.h stdlib.h unistd.h fcntl.h sys/file.h) -AC_HEADER_SYS_WAIT -AC_FUNC_ALLOCA -AC_CHECK_FUNCS(sbrk utimes) - -# Some systems have frexp only in -lm, not in -lc. -AC_SEARCH_LIBS(frexp, m) - -AC_MSG_CHECKING(for time_t in time.h) -AC_CACHE_VAL(bu_cv_decl_time_t_time_h, -[AC_TRY_COMPILE([#include ], [time_t i;], -bu_cv_decl_time_t_time_h=yes, bu_cv_decl_time_t_time_h=no)]) -AC_MSG_RESULT($bu_cv_decl_time_t_time_h) -if test $bu_cv_decl_time_t_time_h = yes; then - AC_DEFINE([HAVE_TIME_T_IN_TIME_H], 1, - [Is the type time_t defined in ?]) -fi - -AC_MSG_CHECKING(for time_t in sys/types.h) -AC_CACHE_VAL(bu_cv_decl_time_t_types_h, -[AC_TRY_COMPILE([#include ], [time_t i;], -bu_cv_decl_time_t_types_h=yes, bu_cv_decl_time_t_types_h=no)]) -AC_MSG_RESULT($bu_cv_decl_time_t_types_h) -if test $bu_cv_decl_time_t_types_h = yes; then - AC_DEFINE([HAVE_TIME_T_IN_TYPES_H], 1, - [Is the type time_t defined in ?]) -fi - -# Under Next 3.2 apparently does not define struct utimbuf -# by default. -AC_MSG_CHECKING([for utime.h]) -AC_CACHE_VAL(bu_cv_header_utime_h, -[AC_TRY_COMPILE([#include -#ifdef HAVE_TIME_H -#include -#endif -#include ], -[struct utimbuf s;], -bu_cv_header_utime_h=yes, bu_cv_header_utime_h=no)]) -AC_MSG_RESULT($bu_cv_header_utime_h) -if test $bu_cv_header_utime_h = yes; then - AC_DEFINE(HAVE_GOOD_UTIME_H, 1, [Does define struct utimbuf?]) -fi - -BFD_NEED_DECLARATION(fprintf) -BFD_NEED_DECLARATION(strstr) -BFD_NEED_DECLARATION(sbrk) -BFD_NEED_DECLARATION(getenv) -BFD_NEED_DECLARATION(environ) - -BFD_BINARY_FOPEN - -# target-specific stuff: - -# Canonicalize the secondary target names. -if test -n "$enable_targets"; then - for targ in `echo $enable_targets | sed 's/,/ /g'` - do - result=`$ac_config_sub $targ 2>/dev/null` - if test -n "$result"; then - canon_targets="$canon_targets $result" - else - # Allow targets that config.sub doesn't recognize, like "all". - canon_targets="$canon_targets $targ" - fi - done -fi - -all_targets=false -BUILD_NLMCONV= -NLMCONV_DEFS= -BUILD_SRCONV= -BUILD_DLLTOOL= -DLLTOOL_DEFS= -BUILD_WINDRES= -BUILD_DLLWRAP= -BUILD_MISC= - -for targ in $target $canon_targets -do - if test "x$targ" = "xall"; then - all_targets=true - BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' - BUILD_SRCONV='$(SRCONV_PROG)' - NLMCONV_DEFS="-DNLMCONV_I386 -DNLMCONV_ALPHA -DNLMCONV_POWERPC -DNLMCONV_SPARC" - else - case $targ in -changequote(,)dnl - i[3456]86*-*-netware*) -changequote([,])dnl - BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' - NLMCONV_DEFS="$NLMCONV_DEFS -DNLMCONV_I386" - ;; - alpha*-*-netware*) - BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' - NLMCONV_DEFS="$NLMCONV_DEFS -DNLMCONV_ALPHA" - ;; - powerpc*-*-netware*) - BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' - NLMCONV_DEFS="$NLMCONV_DEFS -DNLMCONV_POWERPC" - ;; - sparc*-*-netware*) - BUILD_NLMCONV='$(NLMCONV_PROG)$(EXEEXT)' - NLMCONV_DEFS="$NLMCONV_DEFS -DNLMCONV_SPARC" - ;; - esac - case $targ in - *-*-hms*) BUILD_SRCONV='$(SRCONV_PROG)' ;; - esac - case $targ in - arm-*pe* | arm-*-wince) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_ARM" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - thumb-*pe*) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_ARM" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; -changequote(,)dnl - i[3-6]86-*pe* | i[3-6]86-*-cygwin* | i[3-6]86-*-mingw32*) -changequote([,])dnl - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_I386" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - BUILD_DLLWRAP='$(DLLWRAP_PROG)$(EXEEXT)' - ;; - i[3-6]86-*-interix) - BUILD_DLLTOOL='$(DLLTOOL_PROG)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_I386" - ;; - powerpc*-*-*pe* | powerpc*-*-cygwin*) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_PPC" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - sh*-*-*pe) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_SH" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - mips*-*-*pe) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MIPS" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - mcore-*pe) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MCORE" - BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)' - ;; - mcore-*elf) - BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)' - DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MCORE_ELF" - ;; - esac - fi -done - -AC_SUBST(NLMCONV_DEFS) -AC_SUBST(BUILD_NLMCONV) -AC_SUBST(BUILD_SRCONV) -AC_SUBST(BUILD_DLLTOOL) -AC_SUBST(DLLTOOL_DEFS) -AC_SUBST(BUILD_WINDRES) -AC_SUBST(BUILD_DLLWRAP) -AC_SUBST(BUILD_MISC) - -AC_DEFINE_UNQUOTED(TARGET, "${target}", [Configured target name.]) - -targ=$target -. $srcdir/../bfd/config.bfd -if test "x$targ_underscore" = "xyes"; then - UNDERSCORE=1 -else - UNDERSCORE=0 -fi -AC_SUBST(UNDERSCORE) - -AC_OUTPUT(Makefile po/Makefile.in:po/Make-in, -[ -case "x$CONFIG_FILES" in -*) sed -e '/POTFILES =/r po/POTFILES' po/Makefile.in > po/Makefile ;; -esac -]) diff --git a/binutils/cxxfilt.man b/binutils/cxxfilt.man deleted file mode 100644 index a4d5d45106b..00000000000 --- a/binutils/cxxfilt.man +++ /dev/null @@ -1,114 +0,0 @@ -.\" Copyright (c) 1991 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH @PROGRAM@ 1 "June 1993" "cygnus support" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -@PROGRAM@ \- demangle C++ symbols - -.SH SYNOPSIS -.hy 0 -.na -.TP -.B @PROGRAM@ -.RB "[\|" \-_ | \-\-strip-underscores "\|]" -.RB "[\|" "\-s {gnu,lucid,arm} " | " \-\-format={gnu,lucid,arm}" "\|]" -.RB "[\|" \-\-help "\|]" -.RB "[\|" \-\-version "\|]" -.RB "[\|" symbol "...\|]" -.SH DESCRIPTION -The C++ language provides function overloading, which means that you can -write many functions with the same name (providing each takes parameters -of different types). All C++ function names are encoded into a -low-level assembly label (this process is known as -.I mangling\c -). The -.B @PROGRAM@ -program does the inverse mapping: it decodes (\fIdemangles\fR) -low-level names into user-level names so that the linker can keep -these overloaded functions from clashing. -.PP -Every alphanumeric word (consisting of letters, digits, underscores, -dollars, or periods) seen in the input is a potential label. If the -label decodes into a C++ name, the C++ name replaces the low-level -name in the output. -.PP -You can use -.B @PROGRAM@ -to decipher individual symbols by specifying these symbols on the -command line. -.PP -If no -.B symbol -arguments are given, -.B @PROGRAM@ -reads symbol names from the standard input and writes the demangled -names to the standard output. All results are printed on the standard -output. -.SH OPTIONS -.TP -.B \-_ -.TP -.B \-\-strip\-underscores -On some systems, both the C and C++ compilers put an -underscore in front of every name. For example, the C name -.B foo -gets the low-level name -.BR _foo . -This option removes the leading underscore. - -.TP -.B "\-s {gnu,lucid,arm}" -.TP -.B \-\-format={gnu,lucid,arm} -GNU -.B nm -can decode three different methods of mangling, used by different C++ -compilers. This option selects which method it uses: the one used by -the GNU compiler, the one used by the Lucid compiler, or the one -specified by the C++ Annotated Reference Manual. The default is the -GNU style. - -.TP -.B \-\-help -Print a summary of the options to -.B @PROGRAM@ -and exit. - -.TP -.B \-\-version -Print the version number of -.B @PROGRAM@ -and exit. - -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.B -info\c -\&; -.I -The GNU Binary Utilities\c -\&, Roland H. Pesch (June 1993). - -.SH COPYING -Copyright (c) 1993 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/binutils/debug.c b/binutils/debug.c deleted file mode 100644 index 82a9094a07c..00000000000 --- a/binutils/debug.c +++ /dev/null @@ -1,3567 +0,0 @@ -/* debug.c -- Handle generic debugging information. - Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. - Written by Ian Lance Taylor . - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file implements a generic debugging format. We may eventually - have readers which convert different formats into this generic - format, and writers which write it out. The initial impetus for - this was writing a convertor from stabs to HP IEEE-695 debugging - format. */ - -#include -#include - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "debug.h" - -/* Global information we keep for debugging. A pointer to this - structure is the debugging handle passed to all the routines. */ - -struct debug_handle -{ - /* A linked list of compilation units. */ - struct debug_unit *units; - /* The current compilation unit. */ - struct debug_unit *current_unit; - /* The current source file. */ - struct debug_file *current_file; - /* The current function. */ - struct debug_function *current_function; - /* The current block. */ - struct debug_block *current_block; - /* The current line number information for the current unit. */ - struct debug_lineno *current_lineno; - /* Mark. This is used by debug_write. */ - unsigned int mark; - /* A struct/class ID used by debug_write. */ - unsigned int class_id; - /* The base for class_id for this call to debug_write. */ - unsigned int base_id; - /* The current line number in debug_write. */ - struct debug_lineno *current_write_lineno; - unsigned int current_write_lineno_index; - /* A list of classes which have assigned ID's during debug_write. - This is linked through the next_id field of debug_class_type. */ - struct debug_class_id *id_list; - /* A list used to avoid recursion during debug_type_samep. */ - struct debug_type_compare_list *compare_list; -}; - -/* Information we keep for a single compilation unit. */ - -struct debug_unit -{ - /* The next compilation unit. */ - struct debug_unit *next; - /* A list of files included in this compilation unit. The first - file is always the main one, and that is where the main file name - is stored. */ - struct debug_file *files; - /* Line number information for this compilation unit. This is not - stored by function, because assembler code may have line number - information without function information. */ - struct debug_lineno *linenos; -}; - -/* Information kept for a single source file. */ - -struct debug_file -{ - /* The next source file in this compilation unit. */ - struct debug_file *next; - /* The name of the source file. */ - const char *filename; - /* Global functions, variables, types, etc. */ - struct debug_namespace *globals; -}; - -/* A type. */ - -struct debug_type -{ - /* Kind of type. */ - enum debug_type_kind kind; - /* Size of type (0 if not known). */ - unsigned int size; - /* Type which is a pointer to this type. */ - debug_type pointer; - /* Tagged union with additional information about the type. */ - union - { - /* DEBUG_KIND_INDIRECT. */ - struct debug_indirect_type *kindirect; - /* DEBUG_KIND_INT. */ - /* Whether the integer is unsigned. */ - boolean kint; - /* DEBUG_KIND_STRUCT, DEBUG_KIND_UNION, DEBUG_KIND_CLASS, - DEBUG_KIND_UNION_CLASS. */ - struct debug_class_type *kclass; - /* DEBUG_KIND_ENUM. */ - struct debug_enum_type *kenum; - /* DEBUG_KIND_POINTER. */ - struct debug_type *kpointer; - /* DEBUG_KIND_FUNCTION. */ - struct debug_function_type *kfunction; - /* DEBUG_KIND_REFERENCE. */ - struct debug_type *kreference; - /* DEBUG_KIND_RANGE. */ - struct debug_range_type *krange; - /* DEBUG_KIND_ARRAY. */ - struct debug_array_type *karray; - /* DEBUG_KIND_SET. */ - struct debug_set_type *kset; - /* DEBUG_KIND_OFFSET. */ - struct debug_offset_type *koffset; - /* DEBUG_KIND_METHOD. */ - struct debug_method_type *kmethod; - /* DEBUG_KIND_CONST. */ - struct debug_type *kconst; - /* DEBUG_KIND_VOLATILE. */ - struct debug_type *kvolatile; - /* DEBUG_KIND_NAMED, DEBUG_KIND_TAGGED. */ - struct debug_named_type *knamed; - } u; -}; - -/* Information kept for an indirect type. */ - -struct debug_indirect_type -{ - /* Slot where the final type will appear. */ - debug_type *slot; - /* Tag. */ - const char *tag; -}; - -/* Information kept for a struct, union, or class. */ - -struct debug_class_type -{ - /* NULL terminated array of fields. */ - debug_field *fields; - /* A mark field which indicates whether the struct has already been - printed. */ - unsigned int mark; - /* This is used to uniquely identify unnamed structs when printing. */ - unsigned int id; - /* The remaining fields are only used for DEBUG_KIND_CLASS and - DEBUG_KIND_UNION_CLASS. */ - /* NULL terminated array of base classes. */ - debug_baseclass *baseclasses; - /* NULL terminated array of methods. */ - debug_method *methods; - /* The type of the class providing the virtual function table for - this class. This may point to the type itself. */ - debug_type vptrbase; -}; - -/* Information kept for an enum. */ - -struct debug_enum_type -{ - /* NULL terminated array of names. */ - const char **names; - /* Array of corresponding values. */ - bfd_signed_vma *values; -}; - -/* Information kept for a function. FIXME: We should be able to - record the parameter types. */ - -struct debug_function_type -{ - /* Return type. */ - debug_type return_type; - /* NULL terminated array of argument types. */ - debug_type *arg_types; - /* Whether the function takes a variable number of arguments. */ - boolean varargs; -}; - -/* Information kept for a range. */ - -struct debug_range_type -{ - /* Range base type. */ - debug_type type; - /* Lower bound. */ - bfd_signed_vma lower; - /* Upper bound. */ - bfd_signed_vma upper; -}; - -/* Information kept for an array. */ - -struct debug_array_type -{ - /* Element type. */ - debug_type element_type; - /* Range type. */ - debug_type range_type; - /* Lower bound. */ - bfd_signed_vma lower; - /* Upper bound. */ - bfd_signed_vma upper; - /* Whether this array is really a string. */ - boolean stringp; -}; - -/* Information kept for a set. */ - -struct debug_set_type -{ - /* Base type. */ - debug_type type; - /* Whether this set is really a bitstring. */ - boolean bitstringp; -}; - -/* Information kept for an offset type (a based pointer). */ - -struct debug_offset_type -{ - /* The type the pointer is an offset from. */ - debug_type base_type; - /* The type the pointer points to. */ - debug_type target_type; -}; - -/* Information kept for a method type. */ - -struct debug_method_type -{ - /* The return type. */ - debug_type return_type; - /* The object type which this method is for. */ - debug_type domain_type; - /* A NULL terminated array of argument types. */ - debug_type *arg_types; - /* Whether the method takes a variable number of arguments. */ - boolean varargs; -}; - -/* Information kept for a named type. */ - -struct debug_named_type -{ - /* Name. */ - struct debug_name *name; - /* Real type. */ - debug_type type; -}; - -/* A field in a struct or union. */ - -struct debug_field -{ - /* Name of the field. */ - const char *name; - /* Type of the field. */ - struct debug_type *type; - /* Visibility of the field. */ - enum debug_visibility visibility; - /* Whether this is a static member. */ - boolean static_member; - union - { - /* If static_member is false. */ - struct - { - /* Bit position of the field in the struct. */ - unsigned int bitpos; - /* Size of the field in bits. */ - unsigned int bitsize; - } f; - /* If static_member is true. */ - struct - { - const char *physname; - } s; - } u; -}; - -/* A base class for an object. */ - -struct debug_baseclass -{ - /* Type of the base class. */ - struct debug_type *type; - /* Bit position of the base class in the object. */ - unsigned int bitpos; - /* Whether the base class is virtual. */ - boolean virtual; - /* Visibility of the base class. */ - enum debug_visibility visibility; -}; - -/* A method of an object. */ - -struct debug_method -{ - /* The name of the method. */ - const char *name; - /* A NULL terminated array of different types of variants. */ - struct debug_method_variant **variants; -}; - -/* The variants of a method function of an object. These indicate - which method to run. */ - -struct debug_method_variant -{ - /* The physical name of the function. */ - const char *physname; - /* The type of the function. */ - struct debug_type *type; - /* The visibility of the function. */ - enum debug_visibility visibility; - /* Whether the function is const. */ - boolean constp; - /* Whether the function is volatile. */ - boolean volatilep; - /* The offset to the function in the virtual function table. */ - bfd_vma voffset; - /* If voffset is VOFFSET_STATIC_METHOD, this is a static method. */ -#define VOFFSET_STATIC_METHOD ((bfd_vma) -1) - /* Context of a virtual method function. */ - struct debug_type *context; -}; - -/* A variable. This is the information we keep for a variable object. - This has no name; a name is associated with a variable in a - debug_name structure. */ - -struct debug_variable -{ - /* Kind of variable. */ - enum debug_var_kind kind; - /* Type. */ - debug_type type; - /* Value. The interpretation of the value depends upon kind. */ - bfd_vma val; -}; - -/* A function. This has no name; a name is associated with a function - in a debug_name structure. */ - -struct debug_function -{ - /* Return type. */ - debug_type return_type; - /* Parameter information. */ - struct debug_parameter *parameters; - /* Block information. The first structure on the list is the main - block of the function, and describes function local variables. */ - struct debug_block *blocks; -}; - -/* A function parameter. */ - -struct debug_parameter -{ - /* Next parameter. */ - struct debug_parameter *next; - /* Name. */ - const char *name; - /* Type. */ - debug_type type; - /* Kind. */ - enum debug_parm_kind kind; - /* Value (meaning depends upon kind). */ - bfd_vma val; -}; - -/* A typed constant. */ - -struct debug_typed_constant -{ - /* Type. */ - debug_type type; - /* Value. FIXME: We may eventually need to support non-integral - values. */ - bfd_vma val; -}; - -/* Information about a block within a function. */ - -struct debug_block -{ - /* Next block with the same parent. */ - struct debug_block *next; - /* Parent block. */ - struct debug_block *parent; - /* List of child blocks. */ - struct debug_block *children; - /* Start address of the block. */ - bfd_vma start; - /* End address of the block. */ - bfd_vma end; - /* Local variables. */ - struct debug_namespace *locals; -}; - -/* Line number information we keep for a compilation unit. FIXME: - This structure is easy to create, but can be very space - inefficient. */ - -struct debug_lineno -{ - /* More line number information for this block. */ - struct debug_lineno *next; - /* Source file. */ - struct debug_file *file; - /* Line numbers, terminated by a -1 or the end of the array. */ -#define DEBUG_LINENO_COUNT 10 - unsigned long linenos[DEBUG_LINENO_COUNT]; - /* Addresses for the line numbers. */ - bfd_vma addrs[DEBUG_LINENO_COUNT]; -}; - -/* A namespace. This is a mapping from names to objects. FIXME: This - should be implemented as a hash table. */ - -struct debug_namespace -{ - /* List of items in this namespace. */ - struct debug_name *list; - /* Pointer to where the next item in this namespace should go. */ - struct debug_name **tail; -}; - -/* Kinds of objects that appear in a namespace. */ - -enum debug_object_kind -{ - /* A type. */ - DEBUG_OBJECT_TYPE, - /* A tagged type (really a different sort of namespace). */ - DEBUG_OBJECT_TAG, - /* A variable. */ - DEBUG_OBJECT_VARIABLE, - /* A function. */ - DEBUG_OBJECT_FUNCTION, - /* An integer constant. */ - DEBUG_OBJECT_INT_CONSTANT, - /* A floating point constant. */ - DEBUG_OBJECT_FLOAT_CONSTANT, - /* A typed constant. */ - DEBUG_OBJECT_TYPED_CONSTANT -}; - -/* Linkage of an object that appears in a namespace. */ - -enum debug_object_linkage -{ - /* Local variable. */ - DEBUG_LINKAGE_AUTOMATIC, - /* Static--either file static or function static, depending upon the - namespace is. */ - DEBUG_LINKAGE_STATIC, - /* Global. */ - DEBUG_LINKAGE_GLOBAL, - /* No linkage. */ - DEBUG_LINKAGE_NONE -}; - -/* A name in a namespace. */ - -struct debug_name -{ - /* Next name in this namespace. */ - struct debug_name *next; - /* Name. */ - const char *name; - /* Mark. This is used by debug_write. */ - unsigned int mark; - /* Kind of object. */ - enum debug_object_kind kind; - /* Linkage of object. */ - enum debug_object_linkage linkage; - /* Tagged union with additional information about the object. */ - union - { - /* DEBUG_OBJECT_TYPE. */ - struct debug_type *type; - /* DEBUG_OBJECT_TAG. */ - struct debug_type *tag; - /* DEBUG_OBJECT_VARIABLE. */ - struct debug_variable *variable; - /* DEBUG_OBJECT_FUNCTION. */ - struct debug_function *function; - /* DEBUG_OBJECT_INT_CONSTANT. */ - bfd_vma int_constant; - /* DEBUG_OBJECT_FLOAT_CONSTANT. */ - double float_constant; - /* DEBUG_OBJECT_TYPED_CONSTANT. */ - struct debug_typed_constant *typed_constant; - } u; -}; - -/* During debug_write, a linked list of these structures is used to - keep track of ID numbers that have been assigned to classes. */ - -struct debug_class_id -{ - /* Next ID number. */ - struct debug_class_id *next; - /* The type with the ID. */ - struct debug_type *type; - /* The tag; NULL if no tag. */ - const char *tag; -}; - -/* During debug_type_samep, a linked list of these structures is kept - on the stack to avoid infinite recursion. */ - -struct debug_type_compare_list -{ - /* Next type on list. */ - struct debug_type_compare_list *next; - /* The types we are comparing. */ - struct debug_type *t1; - struct debug_type *t2; -}; - -/* During debug_get_real_type, a linked list of these structures is - kept on the stack to avoid infinite recursion. */ - -struct debug_type_real_list -{ - /* Next type on list. */ - struct debug_type_real_list *next; - /* The type we are checking. */ - struct debug_type *t; -}; - -/* Local functions. */ - -static void debug_error PARAMS ((const char *)); -static struct debug_name *debug_add_to_namespace - PARAMS ((struct debug_handle *, struct debug_namespace **, const char *, - enum debug_object_kind, enum debug_object_linkage)); -static struct debug_name *debug_add_to_current_namespace - PARAMS ((struct debug_handle *, const char *, enum debug_object_kind, - enum debug_object_linkage)); -static struct debug_type *debug_make_type - PARAMS ((struct debug_handle *, enum debug_type_kind, unsigned int)); -static struct debug_type *debug_get_real_type - PARAMS ((PTR, debug_type, struct debug_type_real_list *)); -static boolean debug_write_name - PARAMS ((struct debug_handle *, const struct debug_write_fns *, PTR, - struct debug_name *)); -static boolean debug_write_type - PARAMS ((struct debug_handle *, const struct debug_write_fns *, PTR, - struct debug_type *, struct debug_name *)); -static boolean debug_write_class_type - PARAMS ((struct debug_handle *, const struct debug_write_fns *, PTR, - struct debug_type *, const char *)); -static boolean debug_write_function - PARAMS ((struct debug_handle *, const struct debug_write_fns *, PTR, - const char *, enum debug_object_linkage, struct debug_function *)); -static boolean debug_write_block - PARAMS ((struct debug_handle *, const struct debug_write_fns *, PTR, - struct debug_block *)); -static boolean debug_write_linenos - PARAMS ((struct debug_handle *, const struct debug_write_fns *, PTR, - bfd_vma)); -static boolean debug_set_class_id - PARAMS ((struct debug_handle *, const char *, struct debug_type *)); -static boolean debug_type_samep - PARAMS ((struct debug_handle *, struct debug_type *, struct debug_type *)); -static boolean debug_class_type_samep - PARAMS ((struct debug_handle *, struct debug_type *, struct debug_type *)); - -/* Issue an error message. */ - -static void -debug_error (message) - const char *message; -{ - fprintf (stderr, "%s\n", message); -} - -/* Add an object to a namespace. */ - -static struct debug_name * -debug_add_to_namespace (info, nsp, name, kind, linkage) - struct debug_handle *info ATTRIBUTE_UNUSED; - struct debug_namespace **nsp; - const char *name; - enum debug_object_kind kind; - enum debug_object_linkage linkage; -{ - struct debug_name *n; - struct debug_namespace *ns; - - n = (struct debug_name *) xmalloc (sizeof *n); - memset (n, 0, sizeof *n); - - n->name = name; - n->kind = kind; - n->linkage = linkage; - - ns = *nsp; - if (ns == NULL) - { - ns = (struct debug_namespace *) xmalloc (sizeof *ns); - memset (ns, 0, sizeof *ns); - - ns->tail = &ns->list; - - *nsp = ns; - } - - *ns->tail = n; - ns->tail = &n->next; - - return n; -} - -/* Add an object to the current namespace. */ - -static struct debug_name * -debug_add_to_current_namespace (info, name, kind, linkage) - struct debug_handle *info; - const char *name; - enum debug_object_kind kind; - enum debug_object_linkage linkage; -{ - struct debug_namespace **nsp; - - if (info->current_unit == NULL - || info->current_file == NULL) - { - debug_error (_("debug_add_to_current_namespace: no current file")); - return NULL; - } - - if (info->current_block != NULL) - nsp = &info->current_block->locals; - else - nsp = &info->current_file->globals; - - return debug_add_to_namespace (info, nsp, name, kind, linkage); -} - -/* Return a handle for debugging information. */ - -PTR -debug_init () -{ - struct debug_handle *ret; - - ret = (struct debug_handle *) xmalloc (sizeof *ret); - memset (ret, 0, sizeof *ret); - return (PTR) ret; -} - -/* Set the source filename. This implicitly starts a new compilation - unit. */ - -boolean -debug_set_filename (handle, name) - PTR handle; - const char *name; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_file *nfile; - struct debug_unit *nunit; - - if (name == NULL) - name = ""; - - nfile = (struct debug_file *) xmalloc (sizeof *nfile); - memset (nfile, 0, sizeof *nfile); - - nfile->filename = name; - - nunit = (struct debug_unit *) xmalloc (sizeof *nunit); - memset (nunit, 0, sizeof *nunit); - - nunit->files = nfile; - info->current_file = nfile; - - if (info->current_unit != NULL) - info->current_unit->next = nunit; - else - { - assert (info->units == NULL); - info->units = nunit; - } - - info->current_unit = nunit; - - info->current_function = NULL; - info->current_block = NULL; - info->current_lineno = NULL; - - return true; -} - -/* Change source files to the given file name. This is used for - include files in a single compilation unit. */ - -boolean -debug_start_source (handle, name) - PTR handle; - const char *name; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_file *f, **pf; - - if (name == NULL) - name = ""; - - if (info->current_unit == NULL) - { - debug_error (_("debug_start_source: no debug_set_filename call")); - return false; - } - - for (f = info->current_unit->files; f != NULL; f = f->next) - { - if (f->filename[0] == name[0] - && f->filename[1] == name[1] - && strcmp (f->filename, name) == 0) - { - info->current_file = f; - return true; - } - } - - f = (struct debug_file *) xmalloc (sizeof *f); - memset (f, 0, sizeof *f); - - f->filename = name; - - for (pf = &info->current_file->next; - *pf != NULL; - pf = &(*pf)->next) - ; - *pf = f; - - info->current_file = f; - - return true; -} - -/* Record a function definition. This implicitly starts a function - block. The debug_type argument is the type of the return value. - The boolean indicates whether the function is globally visible. - The bfd_vma is the address of the start of the function. Currently - the parameter types are specified by calls to - debug_record_parameter. FIXME: There is no way to specify nested - functions. */ - -boolean -debug_record_function (handle, name, return_type, global, addr) - PTR handle; - const char *name; - debug_type return_type; - boolean global; - bfd_vma addr; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_function *f; - struct debug_block *b; - struct debug_name *n; - - if (name == NULL) - name = ""; - if (return_type == NULL) - return false; - - if (info->current_unit == NULL) - { - debug_error (_("debug_record_function: no debug_set_filename call")); - return false; - } - - f = (struct debug_function *) xmalloc (sizeof *f); - memset (f, 0, sizeof *f); - - f->return_type = return_type; - - b = (struct debug_block *) xmalloc (sizeof *b); - memset (b, 0, sizeof *b); - - b->start = addr; - b->end = (bfd_vma) -1; - - f->blocks = b; - - info->current_function = f; - info->current_block = b; - - /* FIXME: If we could handle nested functions, this would be the - place: we would want to use a different namespace. */ - n = debug_add_to_namespace (info, - &info->current_file->globals, - name, - DEBUG_OBJECT_FUNCTION, - (global - ? DEBUG_LINKAGE_GLOBAL - : DEBUG_LINKAGE_STATIC)); - if (n == NULL) - return false; - - n->u.function = f; - - return true; -} - -/* Record a parameter for the current function. */ - -boolean -debug_record_parameter (handle, name, type, kind, val) - PTR handle; - const char *name; - debug_type type; - enum debug_parm_kind kind; - bfd_vma val; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_parameter *p, **pp; - - if (name == NULL || type == NULL) - return false; - - if (info->current_unit == NULL - || info->current_function == NULL) - { - debug_error (_("debug_record_parameter: no current function")); - return false; - } - - p = (struct debug_parameter *) xmalloc (sizeof *p); - memset (p, 0, sizeof *p); - - p->name = name; - p->type = type; - p->kind = kind; - p->val = val; - - for (pp = &info->current_function->parameters; - *pp != NULL; - pp = &(*pp)->next) - ; - *pp = p; - - return true; -} - -/* End a function. FIXME: This should handle function nesting. */ - -boolean -debug_end_function (handle, addr) - PTR handle; - bfd_vma addr; -{ - struct debug_handle *info = (struct debug_handle *) handle; - - if (info->current_unit == NULL - || info->current_block == NULL - || info->current_function == NULL) - { - debug_error (_("debug_end_function: no current function")); - return false; - } - - if (info->current_block->parent != NULL) - { - debug_error (_("debug_end_function: some blocks were not closed")); - return false; - } - - info->current_block->end = addr; - - info->current_function = NULL; - info->current_block = NULL; - - return true; -} - -/* Start a block in a function. All local information will be - recorded in this block, until the matching call to debug_end_block. - debug_start_block and debug_end_block may be nested. The bfd_vma - argument is the address at which this block starts. */ - -boolean -debug_start_block (handle, addr) - PTR handle; - bfd_vma addr; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_block *b, **pb; - - /* We must always have a current block: debug_record_function sets - one up. */ - if (info->current_unit == NULL - || info->current_block == NULL) - { - debug_error (_("debug_start_block: no current block")); - return false; - } - - b = (struct debug_block *) xmalloc (sizeof *b); - memset (b, 0, sizeof *b); - - b->parent = info->current_block; - b->start = addr; - b->end = (bfd_vma) -1; - - /* This new block is a child of the current block. */ - for (pb = &info->current_block->children; - *pb != NULL; - pb = &(*pb)->next) - ; - *pb = b; - - info->current_block = b; - - return true; -} - -/* Finish a block in a function. This matches the call to - debug_start_block. The argument is the address at which this block - ends. */ - -boolean -debug_end_block (handle, addr) - PTR handle; - bfd_vma addr; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_block *parent; - - if (info->current_unit == NULL - || info->current_block == NULL) - { - debug_error (_("debug_end_block: no current block")); - return false; - } - - parent = info->current_block->parent; - if (parent == NULL) - { - debug_error (_("debug_end_block: attempt to close top level block")); - return false; - } - - info->current_block->end = addr; - - info->current_block = parent; - - return true; -} - -/* Associate a line number in the current source file and function - with a given address. */ - -boolean -debug_record_line (handle, lineno, addr) - PTR handle; - unsigned long lineno; - bfd_vma addr; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_lineno *l; - unsigned int i; - - if (info->current_unit == NULL) - { - debug_error (_("debug_record_line: no current unit")); - return false; - } - - l = info->current_lineno; - if (l != NULL && l->file == info->current_file) - { - for (i = 0; i < DEBUG_LINENO_COUNT; i++) - { - if (l->linenos[i] == (unsigned long) -1) - { - l->linenos[i] = lineno; - l->addrs[i] = addr; - return true; - } - } - } - - /* If we get here, then either 1) there is no current_lineno - structure, which means this is the first line number in this - compilation unit, 2) the current_lineno structure is for a - different file, or 3) the current_lineno structure is full. - Regardless, we want to allocate a new debug_lineno structure, put - it in the right place, and make it the new current_lineno - structure. */ - - l = (struct debug_lineno *) xmalloc (sizeof *l); - memset (l, 0, sizeof *l); - - l->file = info->current_file; - l->linenos[0] = lineno; - l->addrs[0] = addr; - for (i = 1; i < DEBUG_LINENO_COUNT; i++) - l->linenos[i] = (unsigned long) -1; - - if (info->current_lineno != NULL) - info->current_lineno->next = l; - else - info->current_unit->linenos = l; - - info->current_lineno = l; - - return true; -} - -/* Start a named common block. This is a block of variables that may - move in memory. */ - -boolean -debug_start_common_block (handle, name) - PTR handle ATTRIBUTE_UNUSED; - const char *name ATTRIBUTE_UNUSED; -{ - /* FIXME */ - debug_error (_("debug_start_common_block: not implemented")); - return false; -} - -/* End a named common block. */ - -boolean -debug_end_common_block (handle, name) - PTR handle ATTRIBUTE_UNUSED; - const char *name ATTRIBUTE_UNUSED; -{ - /* FIXME */ - debug_error (_("debug_end_common_block: not implemented")); - return false; -} - -/* Record a named integer constant. */ - -boolean -debug_record_int_const (handle, name, val) - PTR handle; - const char *name; - bfd_vma val; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_name *n; - - if (name == NULL) - return false; - - n = debug_add_to_current_namespace (info, name, DEBUG_OBJECT_INT_CONSTANT, - DEBUG_LINKAGE_NONE); - if (n == NULL) - return false; - - n->u.int_constant = val; - - return true; -} - -/* Record a named floating point constant. */ - -boolean -debug_record_float_const (handle, name, val) - PTR handle; - const char *name; - double val; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_name *n; - - if (name == NULL) - return false; - - n = debug_add_to_current_namespace (info, name, DEBUG_OBJECT_FLOAT_CONSTANT, - DEBUG_LINKAGE_NONE); - if (n == NULL) - return false; - - n->u.float_constant = val; - - return true; -} - -/* Record a typed constant with an integral value. */ - -boolean -debug_record_typed_const (handle, name, type, val) - PTR handle; - const char *name; - debug_type type; - bfd_vma val; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_name *n; - struct debug_typed_constant *tc; - - if (name == NULL || type == NULL) - return false; - - n = debug_add_to_current_namespace (info, name, DEBUG_OBJECT_TYPED_CONSTANT, - DEBUG_LINKAGE_NONE); - if (n == NULL) - return false; - - tc = (struct debug_typed_constant *) xmalloc (sizeof *tc); - memset (tc, 0, sizeof *tc); - - tc->type = type; - tc->val = val; - - n->u.typed_constant = tc; - - return true; -} - -/* Record a label. */ - -boolean -debug_record_label (handle, name, type, addr) - PTR handle ATTRIBUTE_UNUSED; - const char *name ATTRIBUTE_UNUSED; - debug_type type ATTRIBUTE_UNUSED; - bfd_vma addr ATTRIBUTE_UNUSED; -{ - /* FIXME. */ - debug_error (_("debug_record_label not implemented")); - return false; -} - -/* Record a variable. */ - -boolean -debug_record_variable (handle, name, type, kind, val) - PTR handle; - const char *name; - debug_type type; - enum debug_var_kind kind; - bfd_vma val; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_namespace **nsp; - enum debug_object_linkage linkage; - struct debug_name *n; - struct debug_variable *v; - - if (name == NULL || type == NULL) - return false; - - if (info->current_unit == NULL - || info->current_file == NULL) - { - debug_error (_("debug_record_variable: no current file")); - return false; - } - - if (kind == DEBUG_GLOBAL || kind == DEBUG_STATIC) - { - nsp = &info->current_file->globals; - if (kind == DEBUG_GLOBAL) - linkage = DEBUG_LINKAGE_GLOBAL; - else - linkage = DEBUG_LINKAGE_STATIC; - } - else - { - if (info->current_block == NULL) - { - debug_error (_("debug_record_variable: no current block")); - return false; - } - nsp = &info->current_block->locals; - linkage = DEBUG_LINKAGE_AUTOMATIC; - } - - n = debug_add_to_namespace (info, nsp, name, DEBUG_OBJECT_VARIABLE, linkage); - if (n == NULL) - return false; - - v = (struct debug_variable *) xmalloc (sizeof *v); - memset (v, 0, sizeof *v); - - v->kind = kind; - v->type = type; - v->val = val; - - n->u.variable = v; - - return true; -} - -/* Make a type with a given kind and size. */ - -/*ARGSUSED*/ -static struct debug_type * -debug_make_type (info, kind, size) - struct debug_handle *info ATTRIBUTE_UNUSED; - enum debug_type_kind kind; - unsigned int size; -{ - struct debug_type *t; - - t = (struct debug_type *) xmalloc (sizeof *t); - memset (t, 0, sizeof *t); - - t->kind = kind; - t->size = size; - - return t; -} - -/* Make an indirect type which may be used as a placeholder for a type - which is referenced before it is defined. */ - -debug_type -debug_make_indirect_type (handle, slot, tag) - PTR handle; - debug_type *slot; - const char *tag; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_indirect_type *i; - - t = debug_make_type (info, DEBUG_KIND_INDIRECT, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - i = (struct debug_indirect_type *) xmalloc (sizeof *i); - memset (i, 0, sizeof *i); - - i->slot = slot; - i->tag = tag; - - t->u.kindirect = i; - - return t; -} - -/* Make a void type. There is only one of these. */ - -debug_type -debug_make_void_type (handle) - PTR handle; -{ - struct debug_handle *info = (struct debug_handle *) handle; - - return debug_make_type (info, DEBUG_KIND_VOID, 0); -} - -/* Make an integer type of a given size. The boolean argument is true - if the integer is unsigned. */ - -debug_type -debug_make_int_type (handle, size, unsignedp) - PTR handle; - unsigned int size; - boolean unsignedp; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - - t = debug_make_type (info, DEBUG_KIND_INT, size); - if (t == NULL) - return DEBUG_TYPE_NULL; - - t->u.kint = unsignedp; - - return t; -} - -/* Make a floating point type of a given size. FIXME: On some - platforms, like an Alpha, you probably need to be able to specify - the format. */ - -debug_type -debug_make_float_type (handle, size) - PTR handle; - unsigned int size; -{ - struct debug_handle *info = (struct debug_handle *) handle; - - return debug_make_type (info, DEBUG_KIND_FLOAT, size); -} - -/* Make a boolean type of a given size. */ - -debug_type -debug_make_bool_type (handle, size) - PTR handle; - unsigned int size; -{ - struct debug_handle *info = (struct debug_handle *) handle; - - return debug_make_type (info, DEBUG_KIND_BOOL, size); -} - -/* Make a complex type of a given size. */ - -debug_type -debug_make_complex_type (handle, size) - PTR handle; - unsigned int size; -{ - struct debug_handle *info = (struct debug_handle *) handle; - - return debug_make_type (info, DEBUG_KIND_COMPLEX, size); -} - -/* Make a structure type. The second argument is true for a struct, - false for a union. The third argument is the size of the struct. - The fourth argument is a NULL terminated array of fields. */ - -debug_type -debug_make_struct_type (handle, structp, size, fields) - PTR handle; - boolean structp; - bfd_vma size; - debug_field *fields; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_class_type *c; - - t = debug_make_type (info, - structp ? DEBUG_KIND_STRUCT : DEBUG_KIND_UNION, - size); - if (t == NULL) - return DEBUG_TYPE_NULL; - - c = (struct debug_class_type *) xmalloc (sizeof *c); - memset (c, 0, sizeof *c); - - c->fields = fields; - - t->u.kclass = c; - - return t; -} - -/* Make an object type. The first three arguments after the handle - are the same as for debug_make_struct_type. The next arguments are - a NULL terminated array of base classes, a NULL terminated array of - methods, the type of the object holding the virtual function table - if it is not this object, and a boolean which is true if this - object has its own virtual function table. */ - -debug_type -debug_make_object_type (handle, structp, size, fields, baseclasses, - methods, vptrbase, ownvptr) - PTR handle; - boolean structp; - bfd_vma size; - debug_field *fields; - debug_baseclass *baseclasses; - debug_method *methods; - debug_type vptrbase; - boolean ownvptr; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_class_type *c; - - t = debug_make_type (info, - structp ? DEBUG_KIND_CLASS : DEBUG_KIND_UNION_CLASS, - size); - if (t == NULL) - return DEBUG_TYPE_NULL; - - c = (struct debug_class_type *) xmalloc (sizeof *c); - memset (c, 0, sizeof *c); - - c->fields = fields; - c->baseclasses = baseclasses; - c->methods = methods; - if (ownvptr) - c->vptrbase = t; - else - c->vptrbase = vptrbase; - - t->u.kclass = c; - - return t; -} - -/* Make an enumeration type. The arguments are a null terminated - array of strings, and an array of corresponding values. */ - -debug_type -debug_make_enum_type (handle, names, values) - PTR handle; - const char **names; - bfd_signed_vma *values; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_enum_type *e; - - t = debug_make_type (info, DEBUG_KIND_ENUM, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - e = (struct debug_enum_type *) xmalloc (sizeof *e); - memset (e, 0, sizeof *e); - - e->names = names; - e->values = values; - - t->u.kenum = e; - - return t; -} - -/* Make a pointer to a given type. */ - -debug_type -debug_make_pointer_type (handle, type) - PTR handle; - debug_type type; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - - if (type == NULL) - return DEBUG_TYPE_NULL; - - if (type->pointer != DEBUG_TYPE_NULL) - return type->pointer; - - t = debug_make_type (info, DEBUG_KIND_POINTER, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - t->u.kpointer = type; - - type->pointer = t; - - return t; -} - -/* Make a function returning a given type. FIXME: We should be able - to record the parameter types. */ - -debug_type -debug_make_function_type (handle, type, arg_types, varargs) - PTR handle; - debug_type type; - debug_type *arg_types; - boolean varargs; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_function_type *f; - - if (type == NULL) - return DEBUG_TYPE_NULL; - - t = debug_make_type (info, DEBUG_KIND_FUNCTION, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - f = (struct debug_function_type *) xmalloc (sizeof *f); - memset (f, 0, sizeof *f); - - f->return_type = type; - f->arg_types = arg_types; - f->varargs = varargs; - - t->u.kfunction = f; - - return t; -} - -/* Make a reference to a given type. */ - -debug_type -debug_make_reference_type (handle, type) - PTR handle; - debug_type type; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - - if (type == NULL) - return DEBUG_TYPE_NULL; - - t = debug_make_type (info, DEBUG_KIND_REFERENCE, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - t->u.kreference = type; - - return t; -} - -/* Make a range of a given type from a lower to an upper bound. */ - -debug_type -debug_make_range_type (handle, type, lower, upper) - PTR handle; - debug_type type; - bfd_signed_vma lower; - bfd_signed_vma upper; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_range_type *r; - - if (type == NULL) - return DEBUG_TYPE_NULL; - - t = debug_make_type (info, DEBUG_KIND_RANGE, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - r = (struct debug_range_type *) xmalloc (sizeof *r); - memset (r, 0, sizeof *r); - - r->type = type; - r->lower = lower; - r->upper = upper; - - t->u.krange = r; - - return t; -} - -/* Make an array type. The second argument is the type of an element - of the array. The third argument is the type of a range of the - array. The fourth and fifth argument are the lower and upper - bounds, respectively. The sixth argument is true if this array is - actually a string, as in C. */ - -debug_type -debug_make_array_type (handle, element_type, range_type, lower, upper, - stringp) - PTR handle; - debug_type element_type; - debug_type range_type; - bfd_signed_vma lower; - bfd_signed_vma upper; - boolean stringp; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_array_type *a; - - if (element_type == NULL || range_type == NULL) - return DEBUG_TYPE_NULL; - - t = debug_make_type (info, DEBUG_KIND_ARRAY, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - a = (struct debug_array_type *) xmalloc (sizeof *a); - memset (a, 0, sizeof *a); - - a->element_type = element_type; - a->range_type = range_type; - a->lower = lower; - a->upper = upper; - a->stringp = stringp; - - t->u.karray = a; - - return t; -} - -/* Make a set of a given type. For example, a Pascal set type. The - boolean argument is true if this set is actually a bitstring, as in - CHILL. */ - -debug_type -debug_make_set_type (handle, type, bitstringp) - PTR handle; - debug_type type; - boolean bitstringp; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_set_type *s; - - if (type == NULL) - return DEBUG_TYPE_NULL; - - t = debug_make_type (info, DEBUG_KIND_SET, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - s = (struct debug_set_type *) xmalloc (sizeof *s); - memset (s, 0, sizeof *s); - - s->type = type; - s->bitstringp = bitstringp; - - t->u.kset = s; - - return t; -} - -/* Make a type for a pointer which is relative to an object. The - second argument is the type of the object to which the pointer is - relative. The third argument is the type that the pointer points - to. */ - -debug_type -debug_make_offset_type (handle, base_type, target_type) - PTR handle; - debug_type base_type; - debug_type target_type; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_offset_type *o; - - if (base_type == NULL || target_type == NULL) - return DEBUG_TYPE_NULL; - - t = debug_make_type (info, DEBUG_KIND_OFFSET, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - o = (struct debug_offset_type *) xmalloc (sizeof *o); - memset (o, 0, sizeof *o); - - o->base_type = base_type; - o->target_type = target_type; - - t->u.koffset = o; - - return t; -} - -/* Make a type for a method function. The second argument is the - return type, the third argument is the domain, and the fourth - argument is a NULL terminated array of argument types. */ - -debug_type -debug_make_method_type (handle, return_type, domain_type, arg_types, varargs) - PTR handle; - debug_type return_type; - debug_type domain_type; - debug_type *arg_types; - boolean varargs; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_method_type *m; - - if (return_type == NULL) - return DEBUG_TYPE_NULL; - - t = debug_make_type (info, DEBUG_KIND_METHOD, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - m = (struct debug_method_type *) xmalloc (sizeof *m); - memset (m, 0, sizeof *m); - - m->return_type = return_type; - m->domain_type = domain_type; - m->arg_types = arg_types; - m->varargs = varargs; - - t->u.kmethod = m; - - return t; -} - -/* Make a const qualified version of a given type. */ - -debug_type -debug_make_const_type (handle, type) - PTR handle; - debug_type type; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - - if (type == NULL) - return DEBUG_TYPE_NULL; - - t = debug_make_type (info, DEBUG_KIND_CONST, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - t->u.kconst = type; - - return t; -} - -/* Make a volatile qualified version of a given type. */ - -debug_type -debug_make_volatile_type (handle, type) - PTR handle; - debug_type type; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - - if (type == NULL) - return DEBUG_TYPE_NULL; - - t = debug_make_type (info, DEBUG_KIND_VOLATILE, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - t->u.kvolatile = type; - - return t; -} - -/* Make an undefined tagged type. For example, a struct which has - been mentioned, but not defined. */ - -debug_type -debug_make_undefined_tagged_type (handle, name, kind) - PTR handle; - const char *name; - enum debug_type_kind kind; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - - if (name == NULL) - return DEBUG_TYPE_NULL; - - switch (kind) - { - case DEBUG_KIND_STRUCT: - case DEBUG_KIND_UNION: - case DEBUG_KIND_CLASS: - case DEBUG_KIND_UNION_CLASS: - case DEBUG_KIND_ENUM: - break; - - default: - debug_error (_("debug_make_undefined_type: unsupported kind")); - return DEBUG_TYPE_NULL; - } - - t = debug_make_type (info, kind, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - return debug_tag_type (handle, name, t); -} - -/* Make a base class for an object. The second argument is the base - class type. The third argument is the bit position of this base - class in the object (always 0 unless doing multiple inheritance). - The fourth argument is whether this is a virtual class. The fifth - argument is the visibility of the base class. */ - -/*ARGSUSED*/ -debug_baseclass -debug_make_baseclass (handle, type, bitpos, virtual, visibility) - PTR handle ATTRIBUTE_UNUSED; - debug_type type; - bfd_vma bitpos; - boolean virtual; - enum debug_visibility visibility; -{ - struct debug_baseclass *b; - - b = (struct debug_baseclass *) xmalloc (sizeof *b); - memset (b, 0, sizeof *b); - - b->type = type; - b->bitpos = bitpos; - b->virtual = virtual; - b->visibility = visibility; - - return b; -} - -/* Make a field for a struct. The second argument is the name. The - third argument is the type of the field. The fourth argument is - the bit position of the field. The fifth argument is the size of - the field (it may be zero). The sixth argument is the visibility - of the field. */ - -/*ARGSUSED*/ -debug_field -debug_make_field (handle, name, type, bitpos, bitsize, visibility) - PTR handle ATTRIBUTE_UNUSED; - const char *name; - debug_type type; - bfd_vma bitpos; - bfd_vma bitsize; - enum debug_visibility visibility; -{ - struct debug_field *f; - - f = (struct debug_field *) xmalloc (sizeof *f); - memset (f, 0, sizeof *f); - - f->name = name; - f->type = type; - f->static_member = false; - f->u.f.bitpos = bitpos; - f->u.f.bitsize = bitsize; - f->visibility = visibility; - - return f; -} - -/* Make a static member of an object. The second argument is the - name. The third argument is the type of the member. The fourth - argument is the physical name of the member (i.e., the name as a - global variable). The fifth argument is the visibility of the - member. */ - -/*ARGSUSED*/ -debug_field -debug_make_static_member (handle, name, type, physname, visibility) - PTR handle ATTRIBUTE_UNUSED; - const char *name; - debug_type type; - const char *physname; - enum debug_visibility visibility; -{ - struct debug_field *f; - - f = (struct debug_field *) xmalloc (sizeof *f); - memset (f, 0, sizeof *f); - - f->name = name; - f->type = type; - f->static_member = true; - f->u.s.physname = physname; - f->visibility = visibility; - - return f; -} - -/* Make a method. The second argument is the name, and the third - argument is a NULL terminated array of method variants. */ - -/*ARGSUSED*/ -debug_method -debug_make_method (handle, name, variants) - PTR handle ATTRIBUTE_UNUSED; - const char *name; - debug_method_variant *variants; -{ - struct debug_method *m; - - m = (struct debug_method *) xmalloc (sizeof *m); - memset (m, 0, sizeof *m); - - m->name = name; - m->variants = variants; - - return m; -} - -/* Make a method argument. The second argument is the real name of - the function. The third argument is the type of the function. The - fourth argument is the visibility. The fifth argument is whether - this is a const function. The sixth argument is whether this is a - volatile function. The seventh argument is the offset in the - virtual function table, if any. The eighth argument is the virtual - function context. FIXME: Are the const and volatile arguments - necessary? Could we just use debug_make_const_type? */ - -/*ARGSUSED*/ -debug_method_variant -debug_make_method_variant (handle, physname, type, visibility, constp, - volatilep, voffset, context) - PTR handle ATTRIBUTE_UNUSED; - const char *physname; - debug_type type; - enum debug_visibility visibility; - boolean constp; - boolean volatilep; - bfd_vma voffset; - debug_type context; -{ - struct debug_method_variant *m; - - m = (struct debug_method_variant *) xmalloc (sizeof *m); - memset (m, 0, sizeof *m); - - m->physname = physname; - m->type = type; - m->visibility = visibility; - m->constp = constp; - m->volatilep = volatilep; - m->voffset = voffset; - m->context = context; - - return m; -} - -/* Make a static method argument. The arguments are the same as for - debug_make_method_variant, except that the last two are omitted - since a static method can not also be virtual. */ - -debug_method_variant -debug_make_static_method_variant (handle, physname, type, visibility, - constp, volatilep) - PTR handle ATTRIBUTE_UNUSED; - const char *physname; - debug_type type; - enum debug_visibility visibility; - boolean constp; - boolean volatilep; -{ - struct debug_method_variant *m; - - m = (struct debug_method_variant *) xmalloc (sizeof *m); - memset (m, 0, sizeof *m); - - m->physname = physname; - m->type = type; - m->visibility = visibility; - m->constp = constp; - m->volatilep = volatilep; - m->voffset = VOFFSET_STATIC_METHOD; - - return m; -} - -/* Name a type. */ - -debug_type -debug_name_type (handle, name, type) - PTR handle; - const char *name; - debug_type type; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_named_type *n; - struct debug_name *nm; - - if (name == NULL || type == NULL) - return DEBUG_TYPE_NULL; - - if (info->current_unit == NULL - || info->current_file == NULL) - { - debug_error (_("debug_name_type: no current file")); - return DEBUG_TYPE_NULL; - } - - t = debug_make_type (info, DEBUG_KIND_NAMED, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - n = (struct debug_named_type *) xmalloc (sizeof *n); - memset (n, 0, sizeof *n); - - n->type = type; - - t->u.knamed = n; - - /* We always add the name to the global namespace. This is probably - wrong in some cases, but it seems to be right for stabs. FIXME. */ - - nm = debug_add_to_namespace (info, &info->current_file->globals, name, - DEBUG_OBJECT_TYPE, DEBUG_LINKAGE_NONE); - if (nm == NULL) - return DEBUG_TYPE_NULL; - - nm->u.type = t; - - n->name = nm; - - return t; -} - -/* Tag a type. */ - -debug_type -debug_tag_type (handle, name, type) - PTR handle; - const char *name; - debug_type type; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_type *t; - struct debug_named_type *n; - struct debug_name *nm; - - if (name == NULL || type == NULL) - return DEBUG_TYPE_NULL; - - if (info->current_file == NULL) - { - debug_error (_("debug_tag_type: no current file")); - return DEBUG_TYPE_NULL; - } - - if (type->kind == DEBUG_KIND_TAGGED) - { - if (strcmp (type->u.knamed->name->name, name) == 0) - return type; - debug_error (_("debug_tag_type: extra tag attempted")); - return DEBUG_TYPE_NULL; - } - - t = debug_make_type (info, DEBUG_KIND_TAGGED, 0); - if (t == NULL) - return DEBUG_TYPE_NULL; - - n = (struct debug_named_type *) xmalloc (sizeof *n); - memset (n, 0, sizeof *n); - - n->type = type; - - t->u.knamed = n; - - /* We keep a global namespace of tags for each compilation unit. I - don't know if that is the right thing to do. */ - - nm = debug_add_to_namespace (info, &info->current_file->globals, name, - DEBUG_OBJECT_TAG, DEBUG_LINKAGE_NONE); - if (nm == NULL) - return DEBUG_TYPE_NULL; - - nm->u.tag = t; - - n->name = nm; - - return t; -} - -/* Record the size of a given type. */ - -/*ARGSUSED*/ -boolean -debug_record_type_size (handle, type, size) - PTR handle ATTRIBUTE_UNUSED; - debug_type type; - unsigned int size; -{ - if (type->size != 0 && type->size != size) - fprintf (stderr, _("Warning: changing type size from %d to %d\n"), - type->size, size); - - type->size = size; - - return true; -} - -/* Find a named type. */ - -debug_type -debug_find_named_type (handle, name) - PTR handle; - const char *name; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_block *b; - struct debug_file *f; - - /* We only search the current compilation unit. I don't know if - this is right or not. */ - - if (info->current_unit == NULL) - { - debug_error (_("debug_find_named_type: no current compilation unit")); - return DEBUG_TYPE_NULL; - } - - for (b = info->current_block; b != NULL; b = b->parent) - { - if (b->locals != NULL) - { - struct debug_name *n; - - for (n = b->locals->list; n != NULL; n = n->next) - { - if (n->kind == DEBUG_OBJECT_TYPE - && n->name[0] == name[0] - && strcmp (n->name, name) == 0) - return n->u.type; - } - } - } - - for (f = info->current_unit->files; f != NULL; f = f->next) - { - if (f->globals != NULL) - { - struct debug_name *n; - - for (n = f->globals->list; n != NULL; n = n->next) - { - if (n->kind == DEBUG_OBJECT_TYPE - && n->name[0] == name[0] - && strcmp (n->name, name) == 0) - return n->u.type; - } - } - } - - return DEBUG_TYPE_NULL; -} - -/* Find a tagged type. */ - -debug_type -debug_find_tagged_type (handle, name, kind) - PTR handle; - const char *name; - enum debug_type_kind kind; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_unit *u; - - /* We search the globals of all the compilation units. I don't know - if this is correct or not. It would be easy to change. */ - - for (u = info->units; u != NULL; u = u->next) - { - struct debug_file *f; - - for (f = u->files; f != NULL; f = f->next) - { - struct debug_name *n; - - if (f->globals != NULL) - { - for (n = f->globals->list; n != NULL; n = n->next) - { - if (n->kind == DEBUG_OBJECT_TAG - && (kind == DEBUG_KIND_ILLEGAL - || n->u.tag->kind == kind) - && n->name[0] == name[0] - && strcmp (n->name, name) == 0) - return n->u.tag; - } - } - } - } - - return DEBUG_TYPE_NULL; -} - -/* Get a base type. We build a linked list on the stack to avoid - crashing if the type is defined circularly. */ - -static struct debug_type * -debug_get_real_type (handle, type, list) - PTR handle; - debug_type type; - struct debug_type_real_list *list; -{ - struct debug_type_real_list *l; - struct debug_type_real_list rl; - - switch (type->kind) - { - default: - return type; - - case DEBUG_KIND_INDIRECT: - case DEBUG_KIND_NAMED: - case DEBUG_KIND_TAGGED: - break; - } - - for (l = list; l != NULL; l = l->next) - { - if (l->t == type) - { - fprintf (stderr, - _("debug_get_real_type: circular debug information for %s\n"), - debug_get_type_name (handle, type)); - return NULL; - } - } - - rl.next = list; - rl.t = type; - - switch (type->kind) - { - /* The default case is just here to avoid warnings. */ - default: - case DEBUG_KIND_INDIRECT: - if (*type->u.kindirect->slot != NULL) - return debug_get_real_type (handle, *type->u.kindirect->slot, &rl); - return type; - case DEBUG_KIND_NAMED: - case DEBUG_KIND_TAGGED: - return debug_get_real_type (handle, type->u.knamed->type, &rl); - } - /*NOTREACHED*/ -} - -/* Get the kind of a type. */ - -enum debug_type_kind -debug_get_type_kind (handle, type) - PTR handle; - debug_type type; -{ - if (type == NULL) - return DEBUG_KIND_ILLEGAL; - type = debug_get_real_type (handle, type, NULL); - if (type == NULL) - return DEBUG_KIND_ILLEGAL; - return type->kind; -} - -/* Get the name of a type. */ - -const char * -debug_get_type_name (handle, type) - PTR handle; - debug_type type; -{ - if (type->kind == DEBUG_KIND_INDIRECT) - { - if (*type->u.kindirect->slot != NULL) - return debug_get_type_name (handle, *type->u.kindirect->slot); - return type->u.kindirect->tag; - } - if (type->kind == DEBUG_KIND_NAMED - || type->kind == DEBUG_KIND_TAGGED) - return type->u.knamed->name->name; - return NULL; -} - -/* Get the size of a type. */ - -bfd_vma -debug_get_type_size (handle, type) - PTR handle; - debug_type type; -{ - if (type == NULL) - return 0; - - /* We don't call debug_get_real_type, because somebody might have - called debug_record_type_size on a named or indirect type. */ - - if (type->size != 0) - return type->size; - - switch (type->kind) - { - default: - return 0; - case DEBUG_KIND_INDIRECT: - if (*type->u.kindirect->slot != NULL) - return debug_get_type_size (handle, *type->u.kindirect->slot); - return 0; - case DEBUG_KIND_NAMED: - case DEBUG_KIND_TAGGED: - return debug_get_type_size (handle, type->u.knamed->type); - } - /*NOTREACHED*/ -} - -/* Get the return type of a function or method type. */ - -debug_type -debug_get_return_type (handle, type) - PTR handle; - debug_type type; -{ - if (type == NULL) - return DEBUG_TYPE_NULL; - type = debug_get_real_type (handle, type, NULL); - if (type == NULL) - return DEBUG_TYPE_NULL; - switch (type->kind) - { - default: - return DEBUG_TYPE_NULL; - case DEBUG_KIND_FUNCTION: - return type->u.kfunction->return_type; - case DEBUG_KIND_METHOD: - return type->u.kmethod->return_type; - } - /*NOTREACHED*/ -} - -/* Get the parameter types of a function or method type (except that - we don't currently store the parameter types of a function). */ - -const debug_type * -debug_get_parameter_types (handle, type, pvarargs) - PTR handle; - debug_type type; - boolean *pvarargs; -{ - if (type == NULL) - return NULL; - type = debug_get_real_type (handle, type, NULL); - if (type == NULL) - return NULL; - switch (type->kind) - { - default: - return NULL; - case DEBUG_KIND_FUNCTION: - *pvarargs = type->u.kfunction->varargs; - return type->u.kfunction->arg_types; - case DEBUG_KIND_METHOD: - *pvarargs = type->u.kmethod->varargs; - return type->u.kmethod->arg_types; - } - /*NOTREACHED*/ -} - -/* Get the target type of a type. */ - -debug_type -debug_get_target_type (handle, type) - PTR handle; - debug_type type; -{ - if (type == NULL) - return NULL; - type = debug_get_real_type (handle, type, NULL); - if (type == NULL) - return NULL; - switch (type->kind) - { - default: - return NULL; - case DEBUG_KIND_POINTER: - return type->u.kpointer; - case DEBUG_KIND_REFERENCE: - return type->u.kreference; - case DEBUG_KIND_CONST: - return type->u.kconst; - case DEBUG_KIND_VOLATILE: - return type->u.kvolatile; - } - /*NOTREACHED*/ -} - -/* Get the NULL terminated array of fields for a struct, union, or - class. */ - -const debug_field * -debug_get_fields (handle, type) - PTR handle; - debug_type type; -{ - if (type == NULL) - return NULL; - type = debug_get_real_type (handle, type, NULL); - if (type == NULL) - return NULL; - switch (type->kind) - { - default: - return NULL; - case DEBUG_KIND_STRUCT: - case DEBUG_KIND_UNION: - case DEBUG_KIND_CLASS: - case DEBUG_KIND_UNION_CLASS: - return type->u.kclass->fields; - } - /*NOTREACHED*/ -} - -/* Get the type of a field. */ - -/*ARGSUSED*/ -debug_type -debug_get_field_type (handle, field) - PTR handle ATTRIBUTE_UNUSED; - debug_field field; -{ - if (field == NULL) - return NULL; - return field->type; -} - -/* Get the name of a field. */ - -/*ARGSUSED*/ -const char * -debug_get_field_name (handle, field) - PTR handle ATTRIBUTE_UNUSED; - debug_field field; -{ - if (field == NULL) - return NULL; - return field->name; -} - -/* Get the bit position of a field. */ - -/*ARGSUSED*/ -bfd_vma -debug_get_field_bitpos (handle, field) - PTR handle ATTRIBUTE_UNUSED; - debug_field field; -{ - if (field == NULL || field->static_member) - return (bfd_vma) -1; - return field->u.f.bitpos; -} - -/* Get the bit size of a field. */ - -/*ARGSUSED*/ -bfd_vma -debug_get_field_bitsize (handle, field) - PTR handle ATTRIBUTE_UNUSED; - debug_field field; -{ - if (field == NULL || field->static_member) - return (bfd_vma) -1; - return field->u.f.bitsize; -} - -/* Get the visibility of a field. */ - -/*ARGSUSED*/ -enum debug_visibility -debug_get_field_visibility (handle, field) - PTR handle ATTRIBUTE_UNUSED; - debug_field field; -{ - if (field == NULL) - return DEBUG_VISIBILITY_IGNORE; - return field->visibility; -} - -/* Get the physical name of a field. */ - -const char * -debug_get_field_physname (handle, field) - PTR handle ATTRIBUTE_UNUSED; - debug_field field; -{ - if (field == NULL || ! field->static_member) - return NULL; - return field->u.s.physname; -} - -/* Write out the debugging information. This is given a handle to - debugging information, and a set of function pointers to call. */ - -boolean -debug_write (handle, fns, fhandle) - PTR handle; - const struct debug_write_fns *fns; - PTR fhandle; -{ - struct debug_handle *info = (struct debug_handle *) handle; - struct debug_unit *u; - - /* We use a mark to tell whether we have already written out a - particular name. We use an integer, so that we don't have to - clear the mark fields if we happen to write out the same - information more than once. */ - ++info->mark; - - /* The base_id field holds an ID value which will never be used, so - that we can tell whether we have assigned an ID during this call - to debug_write. */ - info->base_id = info->class_id; - - /* We keep a linked list of classes for which was have assigned ID's - during this call to debug_write. */ - info->id_list = NULL; - - for (u = info->units; u != NULL; u = u->next) - { - struct debug_file *f; - boolean first_file; - - info->current_write_lineno = u->linenos; - info->current_write_lineno_index = 0; - - if (! (*fns->start_compilation_unit) (fhandle, u->files->filename)) - return false; - - first_file = true; - for (f = u->files; f != NULL; f = f->next) - { - struct debug_name *n; - - if (first_file) - first_file = false; - else - { - if (! (*fns->start_source) (fhandle, f->filename)) - return false; - } - - if (f->globals != NULL) - { - for (n = f->globals->list; n != NULL; n = n->next) - { - if (! debug_write_name (info, fns, fhandle, n)) - return false; - } - } - } - - /* Output any line number information which hasn't already been - handled. */ - if (! debug_write_linenos (info, fns, fhandle, (bfd_vma) -1)) - return false; - } - - return true; -} - -/* Write out an element in a namespace. */ - -static boolean -debug_write_name (info, fns, fhandle, n) - struct debug_handle *info; - const struct debug_write_fns *fns; - PTR fhandle; - struct debug_name *n; -{ - switch (n->kind) - { - case DEBUG_OBJECT_TYPE: - if (! debug_write_type (info, fns, fhandle, n->u.type, n) - || ! (*fns->typdef) (fhandle, n->name)) - return false; - return true; - case DEBUG_OBJECT_TAG: - if (! debug_write_type (info, fns, fhandle, n->u.tag, n)) - return false; - return (*fns->tag) (fhandle, n->name); - case DEBUG_OBJECT_VARIABLE: - if (! debug_write_type (info, fns, fhandle, n->u.variable->type, - (struct debug_name *) NULL)) - return false; - return (*fns->variable) (fhandle, n->name, n->u.variable->kind, - n->u.variable->val); - case DEBUG_OBJECT_FUNCTION: - return debug_write_function (info, fns, fhandle, n->name, - n->linkage, n->u.function); - case DEBUG_OBJECT_INT_CONSTANT: - return (*fns->int_constant) (fhandle, n->name, n->u.int_constant); - case DEBUG_OBJECT_FLOAT_CONSTANT: - return (*fns->float_constant) (fhandle, n->name, n->u.float_constant); - case DEBUG_OBJECT_TYPED_CONSTANT: - if (! debug_write_type (info, fns, fhandle, n->u.typed_constant->type, - (struct debug_name *) NULL)) - return false; - return (*fns->typed_constant) (fhandle, n->name, - n->u.typed_constant->val); - default: - abort (); - return false; - } - /*NOTREACHED*/ -} - -/* Write out a type. If the type is DEBUG_KIND_NAMED or - DEBUG_KIND_TAGGED, then the name argument is the name for which we - are about to call typedef or tag. If the type is anything else, - then the name argument is a tag from a DEBUG_KIND_TAGGED type which - points to this one. */ - -static boolean -debug_write_type (info, fns, fhandle, type, name) - struct debug_handle *info; - const struct debug_write_fns *fns; - PTR fhandle; - struct debug_type *type; - struct debug_name *name; -{ - unsigned int i; - int is; - const char *tag = NULL; - - /* If we have a name for this type, just output it. We only output - typedef names after they have been defined. We output type tags - whenever we are not actually defining them. */ - if ((type->kind == DEBUG_KIND_NAMED - || type->kind == DEBUG_KIND_TAGGED) - && (type->u.knamed->name->mark == info->mark - || (type->kind == DEBUG_KIND_TAGGED - && type->u.knamed->name != name))) - { - if (type->kind == DEBUG_KIND_NAMED) - return (*fns->typedef_type) (fhandle, type->u.knamed->name->name); - else - { - struct debug_type *real; - unsigned int id; - - real = debug_get_real_type ((PTR) info, type, NULL); - if (real == NULL) - return (*fns->empty_type) (fhandle); - id = 0; - if ((real->kind == DEBUG_KIND_STRUCT - || real->kind == DEBUG_KIND_UNION - || real->kind == DEBUG_KIND_CLASS - || real->kind == DEBUG_KIND_UNION_CLASS) - && real->u.kclass != NULL) - { - if (real->u.kclass->id <= info->base_id) - { - if (! debug_set_class_id (info, - type->u.knamed->name->name, - real)) - return false; - } - id = real->u.kclass->id; - } - - return (*fns->tag_type) (fhandle, type->u.knamed->name->name, id, - real->kind); - } - } - - /* Mark the name after we have already looked for a known name, so - that we don't just define a type in terms of itself. We need to - mark the name here so that a struct containing a pointer to - itself will work. */ - if (name != NULL) - name->mark = info->mark; - - if (name != NULL - && type->kind != DEBUG_KIND_NAMED - && type->kind != DEBUG_KIND_TAGGED) - { - assert (name->kind == DEBUG_OBJECT_TAG); - tag = name->name; - } - - switch (type->kind) - { - case DEBUG_KIND_ILLEGAL: - debug_error (_("debug_write_type: illegal type encountered")); - return false; - case DEBUG_KIND_INDIRECT: - if (*type->u.kindirect->slot == DEBUG_TYPE_NULL) - return (*fns->empty_type) (fhandle); - return debug_write_type (info, fns, fhandle, *type->u.kindirect->slot, - name); - case DEBUG_KIND_VOID: - return (*fns->void_type) (fhandle); - case DEBUG_KIND_INT: - return (*fns->int_type) (fhandle, type->size, type->u.kint); - case DEBUG_KIND_FLOAT: - return (*fns->float_type) (fhandle, type->size); - case DEBUG_KIND_COMPLEX: - return (*fns->complex_type) (fhandle, type->size); - case DEBUG_KIND_BOOL: - return (*fns->bool_type) (fhandle, type->size); - case DEBUG_KIND_STRUCT: - case DEBUG_KIND_UNION: - if (type->u.kclass != NULL) - { - if (type->u.kclass->id <= info->base_id) - { - if (! debug_set_class_id (info, tag, type)) - return false; - } - - if (info->mark == type->u.kclass->mark) - { - /* We are currently outputting this struct, or we have - already output it. I don't know if this can happen, - but it can happen for a class. */ - assert (type->u.kclass->id > info->base_id); - return (*fns->tag_type) (fhandle, tag, type->u.kclass->id, - type->kind); - } - type->u.kclass->mark = info->mark; - } - - if (! (*fns->start_struct_type) (fhandle, tag, - (type->u.kclass != NULL - ? type->u.kclass->id - : 0), - type->kind == DEBUG_KIND_STRUCT, - type->size)) - return false; - if (type->u.kclass != NULL - && type->u.kclass->fields != NULL) - { - for (i = 0; type->u.kclass->fields[i] != NULL; i++) - { - struct debug_field *f; - - f = type->u.kclass->fields[i]; - if (! debug_write_type (info, fns, fhandle, f->type, - (struct debug_name *) NULL) - || ! (*fns->struct_field) (fhandle, f->name, f->u.f.bitpos, - f->u.f.bitsize, f->visibility)) - return false; - } - } - return (*fns->end_struct_type) (fhandle); - case DEBUG_KIND_CLASS: - case DEBUG_KIND_UNION_CLASS: - return debug_write_class_type (info, fns, fhandle, type, tag); - case DEBUG_KIND_ENUM: - if (type->u.kenum == NULL) - return (*fns->enum_type) (fhandle, tag, (const char **) NULL, - (bfd_signed_vma *) NULL); - return (*fns->enum_type) (fhandle, tag, type->u.kenum->names, - type->u.kenum->values); - case DEBUG_KIND_POINTER: - if (! debug_write_type (info, fns, fhandle, type->u.kpointer, - (struct debug_name *) NULL)) - return false; - return (*fns->pointer_type) (fhandle); - case DEBUG_KIND_FUNCTION: - if (! debug_write_type (info, fns, fhandle, - type->u.kfunction->return_type, - (struct debug_name *) NULL)) - return false; - if (type->u.kfunction->arg_types == NULL) - is = -1; - else - { - for (is = 0; type->u.kfunction->arg_types[is] != NULL; is++) - if (! debug_write_type (info, fns, fhandle, - type->u.kfunction->arg_types[is], - (struct debug_name *) NULL)) - return false; - } - return (*fns->function_type) (fhandle, is, - type->u.kfunction->varargs); - case DEBUG_KIND_REFERENCE: - if (! debug_write_type (info, fns, fhandle, type->u.kreference, - (struct debug_name *) NULL)) - return false; - return (*fns->reference_type) (fhandle); - case DEBUG_KIND_RANGE: - if (! debug_write_type (info, fns, fhandle, type->u.krange->type, - (struct debug_name *) NULL)) - return false; - return (*fns->range_type) (fhandle, type->u.krange->lower, - type->u.krange->upper); - case DEBUG_KIND_ARRAY: - if (! debug_write_type (info, fns, fhandle, type->u.karray->element_type, - (struct debug_name *) NULL) - || ! debug_write_type (info, fns, fhandle, - type->u.karray->range_type, - (struct debug_name *) NULL)) - return false; - return (*fns->array_type) (fhandle, type->u.karray->lower, - type->u.karray->upper, - type->u.karray->stringp); - case DEBUG_KIND_SET: - if (! debug_write_type (info, fns, fhandle, type->u.kset->type, - (struct debug_name *) NULL)) - return false; - return (*fns->set_type) (fhandle, type->u.kset->bitstringp); - case DEBUG_KIND_OFFSET: - if (! debug_write_type (info, fns, fhandle, type->u.koffset->base_type, - (struct debug_name *) NULL) - || ! debug_write_type (info, fns, fhandle, - type->u.koffset->target_type, - (struct debug_name *) NULL)) - return false; - return (*fns->offset_type) (fhandle); - case DEBUG_KIND_METHOD: - if (! debug_write_type (info, fns, fhandle, - type->u.kmethod->return_type, - (struct debug_name *) NULL)) - return false; - if (type->u.kmethod->arg_types == NULL) - is = -1; - else - { - for (is = 0; type->u.kmethod->arg_types[is] != NULL; is++) - if (! debug_write_type (info, fns, fhandle, - type->u.kmethod->arg_types[is], - (struct debug_name *) NULL)) - return false; - } - if (type->u.kmethod->domain_type != NULL) - { - if (! debug_write_type (info, fns, fhandle, - type->u.kmethod->domain_type, - (struct debug_name *) NULL)) - return false; - } - return (*fns->method_type) (fhandle, - type->u.kmethod->domain_type != NULL, - is, - type->u.kmethod->varargs); - case DEBUG_KIND_CONST: - if (! debug_write_type (info, fns, fhandle, type->u.kconst, - (struct debug_name *) NULL)) - return false; - return (*fns->const_type) (fhandle); - case DEBUG_KIND_VOLATILE: - if (! debug_write_type (info, fns, fhandle, type->u.kvolatile, - (struct debug_name *) NULL)) - return false; - return (*fns->volatile_type) (fhandle); - case DEBUG_KIND_NAMED: - return debug_write_type (info, fns, fhandle, type->u.knamed->type, - (struct debug_name *) NULL); - case DEBUG_KIND_TAGGED: - return debug_write_type (info, fns, fhandle, type->u.knamed->type, - type->u.knamed->name); - default: - abort (); - return false; - } -} - -/* Write out a class type. */ - -static boolean -debug_write_class_type (info, fns, fhandle, type, tag) - struct debug_handle *info; - const struct debug_write_fns *fns; - PTR fhandle; - struct debug_type *type; - const char *tag; -{ - unsigned int i; - unsigned int id; - struct debug_type *vptrbase; - - if (type->u.kclass == NULL) - { - id = 0; - vptrbase = NULL; - } - else - { - if (type->u.kclass->id <= info->base_id) - { - if (! debug_set_class_id (info, tag, type)) - return false; - } - - if (info->mark == type->u.kclass->mark) - { - /* We are currently outputting this class, or we have - already output it. This can happen when there are - methods for an anonymous class. */ - assert (type->u.kclass->id > info->base_id); - return (*fns->tag_type) (fhandle, tag, type->u.kclass->id, - type->kind); - } - type->u.kclass->mark = info->mark; - id = type->u.kclass->id; - - vptrbase = type->u.kclass->vptrbase; - if (vptrbase != NULL && vptrbase != type) - { - if (! debug_write_type (info, fns, fhandle, vptrbase, - (struct debug_name *) NULL)) - return false; - } - } - - if (! (*fns->start_class_type) (fhandle, tag, id, - type->kind == DEBUG_KIND_CLASS, - type->size, - vptrbase != NULL, - vptrbase == type)) - return false; - - if (type->u.kclass != NULL) - { - if (type->u.kclass->fields != NULL) - { - for (i = 0; type->u.kclass->fields[i] != NULL; i++) - { - struct debug_field *f; - - f = type->u.kclass->fields[i]; - if (! debug_write_type (info, fns, fhandle, f->type, - (struct debug_name *) NULL)) - return false; - if (f->static_member) - { - if (! (*fns->class_static_member) (fhandle, f->name, - f->u.s.physname, - f->visibility)) - return false; - } - else - { - if (! (*fns->struct_field) (fhandle, f->name, f->u.f.bitpos, - f->u.f.bitsize, f->visibility)) - return false; - } - } - } - - if (type->u.kclass->baseclasses != NULL) - { - for (i = 0; type->u.kclass->baseclasses[i] != NULL; i++) - { - struct debug_baseclass *b; - - b = type->u.kclass->baseclasses[i]; - if (! debug_write_type (info, fns, fhandle, b->type, - (struct debug_name *) NULL)) - return false; - if (! (*fns->class_baseclass) (fhandle, b->bitpos, b->virtual, - b->visibility)) - return false; - } - } - - if (type->u.kclass->methods != NULL) - { - for (i = 0; type->u.kclass->methods[i] != NULL; i++) - { - struct debug_method *m; - unsigned int j; - - m = type->u.kclass->methods[i]; - if (! (*fns->class_start_method) (fhandle, m->name)) - return false; - for (j = 0; m->variants[j] != NULL; j++) - { - struct debug_method_variant *v; - - v = m->variants[j]; - if (v->context != NULL) - { - if (! debug_write_type (info, fns, fhandle, v->context, - (struct debug_name *) NULL)) - return false; - } - if (! debug_write_type (info, fns, fhandle, v->type, - (struct debug_name *) NULL)) - return false; - if (v->voffset != VOFFSET_STATIC_METHOD) - { - if (! (*fns->class_method_variant) (fhandle, v->physname, - v->visibility, - v->constp, - v->volatilep, - v->voffset, - v->context != NULL)) - return false; - } - else - { - if (! (*fns->class_static_method_variant) (fhandle, - v->physname, - v->visibility, - v->constp, - v->volatilep)) - return false; - } - } - if (! (*fns->class_end_method) (fhandle)) - return false; - } - } - } - - return (*fns->end_class_type) (fhandle); -} - -/* Write out information for a function. */ - -static boolean -debug_write_function (info, fns, fhandle, name, linkage, function) - struct debug_handle *info; - const struct debug_write_fns *fns; - PTR fhandle; - const char *name; - enum debug_object_linkage linkage; - struct debug_function *function; -{ - struct debug_parameter *p; - struct debug_block *b; - - if (! debug_write_linenos (info, fns, fhandle, function->blocks->start)) - return false; - - if (! debug_write_type (info, fns, fhandle, function->return_type, - (struct debug_name *) NULL)) - return false; - - if (! (*fns->start_function) (fhandle, name, - linkage == DEBUG_LINKAGE_GLOBAL)) - return false; - - for (p = function->parameters; p != NULL; p = p->next) - { - if (! debug_write_type (info, fns, fhandle, p->type, - (struct debug_name *) NULL) - || ! (*fns->function_parameter) (fhandle, p->name, p->kind, p->val)) - return false; - } - - for (b = function->blocks; b != NULL; b = b->next) - { - if (! debug_write_block (info, fns, fhandle, b)) - return false; - } - - return (*fns->end_function) (fhandle); -} - -/* Write out information for a block. */ - -static boolean -debug_write_block (info, fns, fhandle, block) - struct debug_handle *info; - const struct debug_write_fns *fns; - PTR fhandle; - struct debug_block *block; -{ - struct debug_name *n; - struct debug_block *b; - - if (! debug_write_linenos (info, fns, fhandle, block->start)) - return false; - - /* I can't see any point to writing out a block with no local - variables, so we don't bother, except for the top level block. */ - if (block->locals != NULL || block->parent == NULL) - { - if (! (*fns->start_block) (fhandle, block->start)) - return false; - } - - if (block->locals != NULL) - { - for (n = block->locals->list; n != NULL; n = n->next) - { - if (! debug_write_name (info, fns, fhandle, n)) - return false; - } - } - - for (b = block->children; b != NULL; b = b->next) - { - if (! debug_write_block (info, fns, fhandle, b)) - return false; - } - - if (! debug_write_linenos (info, fns, fhandle, block->end)) - return false; - - if (block->locals != NULL || block->parent == NULL) - { - if (! (*fns->end_block) (fhandle, block->end)) - return false; - } - - return true; -} - -/* Write out line number information up to ADDRESS. */ - -static boolean -debug_write_linenos (info, fns, fhandle, address) - struct debug_handle *info; - const struct debug_write_fns *fns; - PTR fhandle; - bfd_vma address; -{ - while (info->current_write_lineno != NULL) - { - struct debug_lineno *l; - - l = info->current_write_lineno; - - while (info->current_write_lineno_index < DEBUG_LINENO_COUNT) - { - if (l->linenos[info->current_write_lineno_index] - == (unsigned long) -1) - break; - - if (l->addrs[info->current_write_lineno_index] >= address) - return true; - - if (! (*fns->lineno) (fhandle, l->file->filename, - l->linenos[info->current_write_lineno_index], - l->addrs[info->current_write_lineno_index])) - return false; - - ++info->current_write_lineno_index; - } - - info->current_write_lineno = l->next; - info->current_write_lineno_index = 0; - } - - return true; -} - -/* Get the ID number for a class. If during the same call to - debug_write we find a struct with the same definition with the same - name, we use the same ID. This type of things happens because the - same struct will be defined by multiple compilation units. */ - -static boolean -debug_set_class_id (info, tag, type) - struct debug_handle *info; - const char *tag; - struct debug_type *type; -{ - struct debug_class_type *c; - struct debug_class_id *l; - - assert (type->kind == DEBUG_KIND_STRUCT - || type->kind == DEBUG_KIND_UNION - || type->kind == DEBUG_KIND_CLASS - || type->kind == DEBUG_KIND_UNION_CLASS); - - c = type->u.kclass; - - if (c->id > info->base_id) - return true; - - for (l = info->id_list; l != NULL; l = l->next) - { - if (l->type->kind != type->kind) - continue; - - if (tag == NULL) - { - if (l->tag != NULL) - continue; - } - else - { - if (l->tag == NULL - || l->tag[0] != tag[0] - || strcmp (l->tag, tag) != 0) - continue; - } - - if (debug_type_samep (info, l->type, type)) - { - c->id = l->type->u.kclass->id; - return true; - } - } - - /* There are no identical types. Use a new ID, and add it to the - list. */ - ++info->class_id; - c->id = info->class_id; - - l = (struct debug_class_id *) xmalloc (sizeof *l); - memset (l, 0, sizeof *l); - - l->type = type; - l->tag = tag; - - l->next = info->id_list; - info->id_list = l; - - return true; -} - -/* See if two types are the same. At this point, we don't care about - tags and the like. */ - -static boolean -debug_type_samep (info, t1, t2) - struct debug_handle *info; - struct debug_type *t1; - struct debug_type *t2; -{ - struct debug_type_compare_list *l; - struct debug_type_compare_list top; - boolean ret; - - if (t1 == NULL) - return t2 == NULL; - if (t2 == NULL) - return false; - - while (t1->kind == DEBUG_KIND_INDIRECT) - { - t1 = *t1->u.kindirect->slot; - if (t1 == NULL) - return false; - } - while (t2->kind == DEBUG_KIND_INDIRECT) - { - t2 = *t2->u.kindirect->slot; - if (t2 == NULL) - return false; - } - - if (t1 == t2) - return true; - - /* As a special case, permit a typedef to match a tag, since C++ - debugging output will sometimes add a typedef where C debugging - output will not. */ - if (t1->kind == DEBUG_KIND_NAMED - && t2->kind == DEBUG_KIND_TAGGED) - return debug_type_samep (info, t1->u.knamed->type, t2); - else if (t1->kind == DEBUG_KIND_TAGGED - && t2->kind == DEBUG_KIND_NAMED) - return debug_type_samep (info, t1, t2->u.knamed->type); - - if (t1->kind != t2->kind - || t1->size != t2->size) - return false; - - /* Get rid of the trivial cases first. */ - switch (t1->kind) - { - default: - break; - case DEBUG_KIND_VOID: - case DEBUG_KIND_FLOAT: - case DEBUG_KIND_COMPLEX: - case DEBUG_KIND_BOOL: - return true; - case DEBUG_KIND_INT: - return t1->u.kint == t2->u.kint; - } - - /* We have to avoid an infinite recursion. We do this by keeping a - list of types which we are comparing. We just keep the list on - the stack. If we encounter a pair of types we are currently - comparing, we just assume that they are equal. */ - for (l = info->compare_list; l != NULL; l = l->next) - { - if (l->t1 == t1 && l->t2 == t2) - return true; - } - - top.t1 = t1; - top.t2 = t2; - top.next = info->compare_list; - info->compare_list = ⊤ - - switch (t1->kind) - { - default: - abort (); - ret = false; - break; - - case DEBUG_KIND_STRUCT: - case DEBUG_KIND_UNION: - case DEBUG_KIND_CLASS: - case DEBUG_KIND_UNION_CLASS: - if (t1->u.kclass == NULL) - ret = t2->u.kclass == NULL; - else if (t2->u.kclass == NULL) - ret = false; - else if (t1->u.kclass->id > info->base_id - && t1->u.kclass->id == t2->u.kclass->id) - ret = true; - else - ret = debug_class_type_samep (info, t1, t2); - break; - - case DEBUG_KIND_ENUM: - if (t1->u.kenum == NULL) - ret = t2->u.kenum == NULL; - else if (t2->u.kenum == NULL) - ret = false; - else - { - const char **pn1, **pn2; - bfd_signed_vma *pv1, *pv2; - - pn1 = t1->u.kenum->names; - pn2 = t2->u.kenum->names; - pv1 = t1->u.kenum->values; - pv2 = t2->u.kenum->values; - while (*pn1 != NULL && *pn2 != NULL) - { - if (**pn1 != **pn2 - || *pv1 != *pv2 - || strcmp (*pn1, *pn2) != 0) - break; - ++pn1; - ++pn2; - ++pv1; - ++pv2; - } - ret = *pn1 == NULL && *pn2 == NULL; - } - break; - - case DEBUG_KIND_POINTER: - ret = debug_type_samep (info, t1->u.kpointer, t2->u.kpointer); - break; - - case DEBUG_KIND_FUNCTION: - if (t1->u.kfunction->varargs != t2->u.kfunction->varargs - || ! debug_type_samep (info, t1->u.kfunction->return_type, - t2->u.kfunction->return_type) - || ((t1->u.kfunction->arg_types == NULL) - != (t2->u.kfunction->arg_types == NULL))) - ret = false; - else if (t1->u.kfunction->arg_types == NULL) - ret = true; - else - { - struct debug_type **a1, **a2; - - a1 = t1->u.kfunction->arg_types; - a2 = t2->u.kfunction->arg_types; - while (*a1 != NULL && *a2 != NULL) - { - if (! debug_type_samep (info, *a1, *a2)) - break; - ++a1; - ++a2; - } - ret = *a1 == NULL && *a2 == NULL; - } - break; - - case DEBUG_KIND_REFERENCE: - ret = debug_type_samep (info, t1->u.kreference, t2->u.kreference); - break; - - case DEBUG_KIND_RANGE: - ret = (t1->u.krange->lower == t2->u.krange->lower - && t1->u.krange->upper == t2->u.krange->upper - && debug_type_samep (info, t1->u.krange->type, - t2->u.krange->type)); - - case DEBUG_KIND_ARRAY: - ret = (t1->u.karray->lower == t2->u.karray->lower - && t1->u.karray->upper == t2->u.karray->upper - && t1->u.karray->stringp == t2->u.karray->stringp - && debug_type_samep (info, t1->u.karray->element_type, - t2->u.karray->element_type)); - break; - - case DEBUG_KIND_SET: - ret = (t1->u.kset->bitstringp == t2->u.kset->bitstringp - && debug_type_samep (info, t1->u.kset->type, t2->u.kset->type)); - break; - - case DEBUG_KIND_OFFSET: - ret = (debug_type_samep (info, t1->u.koffset->base_type, - t2->u.koffset->base_type) - && debug_type_samep (info, t1->u.koffset->target_type, - t2->u.koffset->target_type)); - break; - - case DEBUG_KIND_METHOD: - if (t1->u.kmethod->varargs != t2->u.kmethod->varargs - || ! debug_type_samep (info, t1->u.kmethod->return_type, - t2->u.kmethod->return_type) - || ! debug_type_samep (info, t1->u.kmethod->domain_type, - t2->u.kmethod->domain_type) - || ((t1->u.kmethod->arg_types == NULL) - != (t2->u.kmethod->arg_types == NULL))) - ret = false; - else if (t1->u.kmethod->arg_types == NULL) - ret = true; - else - { - struct debug_type **a1, **a2; - - a1 = t1->u.kmethod->arg_types; - a2 = t2->u.kmethod->arg_types; - while (*a1 != NULL && *a2 != NULL) - { - if (! debug_type_samep (info, *a1, *a2)) - break; - ++a1; - ++a2; - } - ret = *a1 == NULL && *a2 == NULL; - } - break; - - case DEBUG_KIND_CONST: - ret = debug_type_samep (info, t1->u.kconst, t2->u.kconst); - break; - - case DEBUG_KIND_VOLATILE: - ret = debug_type_samep (info, t1->u.kvolatile, t2->u.kvolatile); - break; - - case DEBUG_KIND_NAMED: - case DEBUG_KIND_TAGGED: - ret = (strcmp (t1->u.knamed->name->name, t2->u.knamed->name->name) == 0 - && debug_type_samep (info, t1->u.knamed->type, - t2->u.knamed->type)); - break; - } - - info->compare_list = top.next; - - return ret; -} - -/* See if two classes are the same. This is a subroutine of - debug_type_samep. */ - -static boolean -debug_class_type_samep (info, t1, t2) - struct debug_handle *info; - struct debug_type *t1; - struct debug_type *t2; -{ - struct debug_class_type *c1, *c2; - - c1 = t1->u.kclass; - c2 = t2->u.kclass; - - if ((c1->fields == NULL) != (c2->fields == NULL) - || (c1->baseclasses == NULL) != (c2->baseclasses == NULL) - || (c1->methods == NULL) != (c2->methods == NULL) - || (c1->vptrbase == NULL) != (c2->vptrbase == NULL)) - return false; - - if (c1->fields != NULL) - { - struct debug_field **pf1, **pf2; - - for (pf1 = c1->fields, pf2 = c2->fields; - *pf1 != NULL && *pf2 != NULL; - pf1++, pf2++) - { - struct debug_field *f1, *f2; - - f1 = *pf1; - f2 = *pf2; - if (f1->name[0] != f2->name[0] - || f1->visibility != f2->visibility - || f1->static_member != f2->static_member) - return false; - if (f1->static_member) - { - if (strcmp (f1->u.s.physname, f2->u.s.physname) != 0) - return false; - } - else - { - if (f1->u.f.bitpos != f2->u.f.bitpos - || f1->u.f.bitsize != f2->u.f.bitsize) - return false; - } - /* We do the checks which require function calls last. We - don't require that the types of fields have the same - names, since that sometimes fails in the presence of - typedefs and we really don't care. */ - if (strcmp (f1->name, f2->name) != 0 - || ! debug_type_samep (info, - debug_get_real_type ((PTR) info, - f1->type, NULL), - debug_get_real_type ((PTR) info, - f2->type, NULL))) - return false; - } - if (*pf1 != NULL || *pf2 != NULL) - return false; - } - - if (c1->vptrbase != NULL) - { - if (! debug_type_samep (info, c1->vptrbase, c2->vptrbase)) - return false; - } - - if (c1->baseclasses != NULL) - { - struct debug_baseclass **pb1, **pb2; - - for (pb1 = c1->baseclasses, pb2 = c2->baseclasses; - *pb1 != NULL && *pb2 != NULL; - ++pb1, ++pb2) - { - struct debug_baseclass *b1, *b2; - - b1 = *pb1; - b2 = *pb2; - if (b1->bitpos != b2->bitpos - || b1->virtual != b2->virtual - || b1->visibility != b2->visibility - || ! debug_type_samep (info, b1->type, b2->type)) - return false; - } - if (*pb1 != NULL || *pb2 != NULL) - return false; - } - - if (c1->methods != NULL) - { - struct debug_method **pm1, **pm2; - - for (pm1 = c1->methods, pm2 = c2->methods; - *pm1 != NULL && *pm2 != NULL; - ++pm1, ++pm2) - { - struct debug_method *m1, *m2; - - m1 = *pm1; - m2 = *pm2; - if (m1->name[0] != m2->name[0] - || strcmp (m1->name, m2->name) != 0 - || (m1->variants == NULL) != (m2->variants == NULL)) - return false; - if (m1->variants == NULL) - { - struct debug_method_variant **pv1, **pv2; - - for (pv1 = m1->variants, pv2 = m2->variants; - *pv1 != NULL && *pv2 != NULL; - ++pv1, ++pv2) - { - struct debug_method_variant *v1, *v2; - - v1 = *pv1; - v2 = *pv2; - if (v1->physname[0] != v2->physname[0] - || v1->visibility != v2->visibility - || v1->constp != v2->constp - || v1->volatilep != v2->volatilep - || v1->voffset != v2->voffset - || (v1->context == NULL) != (v2->context == NULL) - || strcmp (v1->physname, v2->physname) != 0 - || ! debug_type_samep (info, v1->type, v2->type)) - return false; - if (v1->context != NULL) - { - if (! debug_type_samep (info, v1->context, - v2->context)) - return false; - } - } - if (*pv1 != NULL || *pv2 != NULL) - return false; - } - } - if (*pm1 != NULL || *pm2 != NULL) - return false; - } - - return true; -} diff --git a/binutils/debug.h b/binutils/debug.h deleted file mode 100644 index 1b890b234f1..00000000000 --- a/binutils/debug.h +++ /dev/null @@ -1,798 +0,0 @@ -/* debug.h -- Describe generic debugging information. - Copyright (C) 1995, 1996 Free Software Foundation, Inc. - Written by Ian Lance Taylor . - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef DEBUG_H -#define DEBUG_H - -/* This header file describes a generic debugging information format. - We may eventually have readers which convert different formats into - this generic format, and writers which write it out. The initial - impetus for this was writing a convertor from stabs to HP IEEE-695 - debugging format. */ - -/* Different kinds of types. */ - -enum debug_type_kind -{ - /* Not used. */ - DEBUG_KIND_ILLEGAL, - /* Indirect via a pointer. */ - DEBUG_KIND_INDIRECT, - /* Void. */ - DEBUG_KIND_VOID, - /* Integer. */ - DEBUG_KIND_INT, - /* Floating point. */ - DEBUG_KIND_FLOAT, - /* Complex. */ - DEBUG_KIND_COMPLEX, - /* Boolean. */ - DEBUG_KIND_BOOL, - /* Struct. */ - DEBUG_KIND_STRUCT, - /* Union. */ - DEBUG_KIND_UNION, - /* Class. */ - DEBUG_KIND_CLASS, - /* Union class (can this really happen?). */ - DEBUG_KIND_UNION_CLASS, - /* Enumeration type. */ - DEBUG_KIND_ENUM, - /* Pointer. */ - DEBUG_KIND_POINTER, - /* Function. */ - DEBUG_KIND_FUNCTION, - /* Reference. */ - DEBUG_KIND_REFERENCE, - /* Range. */ - DEBUG_KIND_RANGE, - /* Array. */ - DEBUG_KIND_ARRAY, - /* Set. */ - DEBUG_KIND_SET, - /* Based pointer. */ - DEBUG_KIND_OFFSET, - /* Method. */ - DEBUG_KIND_METHOD, - /* Const qualified type. */ - DEBUG_KIND_CONST, - /* Volatile qualified type. */ - DEBUG_KIND_VOLATILE, - /* Named type. */ - DEBUG_KIND_NAMED, - /* Tagged type. */ - DEBUG_KIND_TAGGED -}; - -/* Different kinds of variables. */ - -enum debug_var_kind -{ - /* Not used. */ - DEBUG_VAR_ILLEGAL, - /* A global variable. */ - DEBUG_GLOBAL, - /* A static variable. */ - DEBUG_STATIC, - /* A local static variable. */ - DEBUG_LOCAL_STATIC, - /* A local variable. */ - DEBUG_LOCAL, - /* A register variable. */ - DEBUG_REGISTER -}; - -/* Different kinds of function parameters. */ - -enum debug_parm_kind -{ - /* Not used. */ - DEBUG_PARM_ILLEGAL, - /* A stack based parameter. */ - DEBUG_PARM_STACK, - /* A register parameter. */ - DEBUG_PARM_REG, - /* A stack based reference parameter. */ - DEBUG_PARM_REFERENCE, - /* A register reference parameter. */ - DEBUG_PARM_REF_REG -}; - -/* Different kinds of visibility. */ - -enum debug_visibility -{ - /* A public field (e.g., a field in a C struct). */ - DEBUG_VISIBILITY_PUBLIC, - /* A protected field. */ - DEBUG_VISIBILITY_PROTECTED, - /* A private field. */ - DEBUG_VISIBILITY_PRIVATE, - /* A field which should be ignored. */ - DEBUG_VISIBILITY_IGNORE -}; - -/* A type. */ - -typedef struct debug_type *debug_type; - -#define DEBUG_TYPE_NULL ((debug_type) NULL) - -/* A field in a struct or union. */ - -typedef struct debug_field *debug_field; - -#define DEBUG_FIELD_NULL ((debug_field) NULL) - -/* A base class for an object. */ - -typedef struct debug_baseclass *debug_baseclass; - -#define DEBUG_BASECLASS_NULL ((debug_baseclass) NULL) - -/* A method of an object. */ - -typedef struct debug_method *debug_method; - -#define DEBUG_METHOD_NULL ((debug_method) NULL) - -/* The arguments to a method function of an object. These indicate - which method to run. */ - -typedef struct debug_method_variant *debug_method_variant; - -#define DEBUG_METHOD_VARIANT_NULL ((debug_method_variant) NULL) - -/* This structure is passed to debug_write. It holds function - pointers that debug_write will call based on the accumulated - debugging information. */ - -struct debug_write_fns -{ - /* This is called at the start of each new compilation unit with the - name of the main file in the new unit. */ - boolean (*start_compilation_unit) PARAMS ((PTR, const char *)); - - /* This is called at the start of each source file within a - compilation unit, before outputting any global information for - that file. The argument is the name of the file. */ - boolean (*start_source) PARAMS ((PTR, const char *)); - - /* Each writer must keep a stack of types. */ - - /* Push an empty type onto the type stack. This type can appear if - there is a reference to a type which is never defined. */ - boolean (*empty_type) PARAMS ((PTR)); - - /* Push a void type onto the type stack. */ - boolean (*void_type) PARAMS ((PTR)); - - /* Push an integer type onto the type stack, given the size and - whether it is unsigned. */ - boolean (*int_type) PARAMS ((PTR, unsigned int, boolean)); - - /* Push a floating type onto the type stack, given the size. */ - boolean (*float_type) PARAMS ((PTR, unsigned int)); - - /* Push a complex type onto the type stack, given the size. */ - boolean (*complex_type) PARAMS ((PTR, unsigned int)); - - /* Push a boolean type onto the type stack, given the size. */ - boolean (*bool_type) PARAMS ((PTR, unsigned int)); - - /* Push an enum type onto the type stack, given the tag, a NULL - terminated array of names and the associated values. If there is - no tag, the tag argument will be NULL. If this is an undefined - enum, the names and values arguments will be NULL. */ - boolean (*enum_type) PARAMS ((PTR, const char *, const char **, - bfd_signed_vma *)); - - /* Pop the top type on the type stack, and push a pointer to that - type onto the type stack. */ - boolean (*pointer_type) PARAMS ((PTR)); - - /* Push a function type onto the type stack. The second argument - indicates the number of argument types that have been pushed onto - the stack. If the number of argument types is passed as -1, then - the argument types of the function are unknown, and no types have - been pushed onto the stack. The third argument is true if the - function takes a variable number of arguments. The return type - of the function is pushed onto the type stack below the argument - types, if any. */ - boolean (*function_type) PARAMS ((PTR, int, boolean)); - - /* Pop the top type on the type stack, and push a reference to that - type onto the type stack. */ - boolean (*reference_type) PARAMS ((PTR)); - - /* Pop the top type on the type stack, and push a range of that type - with the given lower and upper bounds onto the type stack. */ - boolean (*range_type) PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma)); - - /* Push an array type onto the type stack. The top type on the type - stack is the range, and the next type on the type stack is the - element type. These should be popped before the array type is - pushed. The arguments are the lower bound, the upper bound, and - whether the array is a string. */ - boolean (*array_type) PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, - boolean)); - - /* Pop the top type on the type stack, and push a set of that type - onto the type stack. The argument indicates whether this set is - a bitstring. */ - boolean (*set_type) PARAMS ((PTR, boolean)); - - /* Push an offset type onto the type stack. The top type on the - type stack is the target type, and the next type on the type - stack is the base type. These should be popped before the offset - type is pushed. */ - boolean (*offset_type) PARAMS ((PTR)); - - /* Push a method type onto the type stack. If the second argument - is true, the top type on the stack is the class to which the - method belongs; otherwise, the class must be determined by the - class to which the method is attached. The third argument is the - number of argument types; these are pushed onto the type stack in - reverse order (the first type popped is the last argument to the - method). A value of -1 for the third argument means that no - argument information is available. The fourth argument is true - if the function takes a variable number of arguments. The next - type on the type stack below the domain and the argument types is - the return type of the method. All these types must be popped, - and then the method type must be pushed. */ - boolean (*method_type) PARAMS ((PTR, boolean, int, boolean)); - - /* Pop the top type off the type stack, and push a const qualified - version of that type onto the type stack. */ - boolean (*const_type) PARAMS ((PTR)); - - /* Pop the top type off the type stack, and push a volatile - qualified version of that type onto the type stack. */ - boolean (*volatile_type) PARAMS ((PTR)); - - /* Start building a struct. This is followed by calls to the - struct_field function, and finished by a call to the - end_struct_type function. The second argument is the tag; this - will be NULL if there isn't one. If the second argument is NULL, - the third argument is a constant identifying this struct for use - with tag_type. The fourth argument is true for a struct, false - for a union. The fifth argument is the size. If this is an - undefined struct or union, the size will be 0 and struct_field - will not be called before end_struct_type is called. */ - boolean (*start_struct_type) PARAMS ((PTR, const char *, unsigned int, - boolean, unsigned int)); - - /* Add a field to the struct type currently being built. The type - of the field should be popped off the type stack. The arguments - are the name, the bit position, the bit size (may be zero if the - field is not packed), and the visibility. */ - boolean (*struct_field) PARAMS ((PTR, const char *, bfd_vma, bfd_vma, - enum debug_visibility)); - - /* Finish building a struct, and push it onto the type stack. */ - boolean (*end_struct_type) PARAMS ((PTR)); - - /* Start building a class. This is followed by calls to several - functions: struct_field, class_static_member, class_baseclass, - class_start_method, class_method_variant, - class_static_method_variant, and class_end_method. The class is - finished by a call to end_class_type. The first five arguments - are the same as for start_struct_type. The sixth argument is - true if there is a virtual function table; if there is, the - seventh argument is true if the virtual function table can be - found in the type itself, and is false if the type of the object - holding the virtual function table should be popped from the type - stack. */ - boolean (*start_class_type) PARAMS ((PTR, const char *, unsigned int, - boolean, unsigned int, boolean, - boolean)); - - /* Add a static member to the class currently being built. The - arguments are the field name, the physical name, and the - visibility. The type must be popped off the type stack. */ - boolean (*class_static_member) PARAMS ((PTR, const char *, const char *, - enum debug_visibility)); - - /* Add a baseclass to the class currently being built. The type of - the baseclass must be popped off the type stack. The arguments - are the bit position, whether the class is virtual, and the - visibility. */ - boolean (*class_baseclass) PARAMS ((PTR, bfd_vma, boolean, - enum debug_visibility)); - - /* Start adding a method to the class currently being built. This - is followed by calls to class_method_variant and - class_static_method_variant to describe different variants of the - method which take different arguments. The method is finished - with a call to class_end_method. The argument is the method - name. */ - boolean (*class_start_method) PARAMS ((PTR, const char *)); - - /* Describe a variant to the class method currently being built. - The type of the variant must be popped off the type stack. The - second argument is the physical name of the function. The - following arguments are the visibility, whether the variant is - const, whether the variant is volatile, the offset in the virtual - function table, and whether the context is on the type stack - (below the variant type). */ - boolean (*class_method_variant) PARAMS ((PTR, const char *, - enum debug_visibility, - boolean, boolean, - bfd_vma, boolean)); - - /* Describe a static variant to the class method currently being - built. The arguments are the same as for class_method_variant, - except that the last two arguments are omitted. The type of the - variant must be popped off the type stack. */ - boolean (*class_static_method_variant) PARAMS ((PTR, const char *, - enum debug_visibility, - boolean, boolean)); - - /* Finish describing a class method. */ - boolean (*class_end_method) PARAMS ((PTR)); - - /* Finish describing a class, and push it onto the type stack. */ - boolean (*end_class_type) PARAMS ((PTR)); - - /* Push a type on the stack which was given a name by an earlier - call to typdef. */ - boolean (*typedef_type) PARAMS ((PTR, const char *)); - - /* Push a tagged type on the stack which was defined earlier. If - the second argument is not NULL, the type was defined by a call - to tag. If the second argument is NULL, the type was defined by - a call to start_struct_type or start_class_type with a tag of - NULL and the number of the third argument. Either way, the - fourth argument is the tag kind. Note that this may be called - for a struct (class) being defined, in between the call to - start_struct_type (start_class_type) and the call to - end_struct_type (end_class_type). */ - boolean (*tag_type) PARAMS ((PTR, const char *, unsigned int, - enum debug_type_kind)); - - /* Pop the type stack, and typedef it to the given name. */ - boolean (*typdef) PARAMS ((PTR, const char *)); - - /* Pop the type stack, and declare it as a tagged struct or union or - enum or whatever. The tag passed down here is redundant, since - was also passed when enum_type, start_struct_type, or - start_class_type was called. */ - boolean (*tag) PARAMS ((PTR, const char *)); - - /* This is called to record a named integer constant. */ - boolean (*int_constant) PARAMS ((PTR, const char *, bfd_vma)); - - /* This is called to record a named floating point constant. */ - boolean (*float_constant) PARAMS ((PTR, const char *, double)); - - /* This is called to record a typed integer constant. The type is - popped off the type stack. */ - boolean (*typed_constant) PARAMS ((PTR, const char *, bfd_vma)); - - /* This is called to record a variable. The type is popped off the - type stack. */ - boolean (*variable) PARAMS ((PTR, const char *, enum debug_var_kind, - bfd_vma)); - - /* Start writing out a function. The return type must be popped off - the stack. The boolean is true if the function is global. This - is followed by calls to function_parameter, followed by block - information. */ - boolean (*start_function) PARAMS ((PTR, const char *, boolean)); - - /* Record a function parameter for the current function. The type - must be popped off the stack. */ - boolean (*function_parameter) PARAMS ((PTR, const char *, - enum debug_parm_kind, bfd_vma)); - - /* Start writing out a block. There is at least one top level block - per function. Blocks may be nested. The argument is the - starting address of the block. */ - boolean (*start_block) PARAMS ((PTR, bfd_vma)); - - /* Finish writing out a block. The argument is the ending address - of the block. */ - boolean (*end_block) PARAMS ((PTR, bfd_vma)); - - /* Finish writing out a function. */ - boolean (*end_function) PARAMS ((PTR)); - - /* Record line number information for the current compilation unit. */ - boolean (*lineno) PARAMS ((PTR, const char *, unsigned long, bfd_vma)); -}; - -/* Exported functions. */ - -/* The first argument to most of these functions is a handle. This - handle is returned by the debug_init function. The purpose of the - handle is to permit the debugging routines to not use static - variables, and hence to be reentrant. This would be useful for a - program which wanted to handle two executables simultaneously. */ - -/* Return a debugging handle. */ - -extern PTR debug_init PARAMS ((void)); - -/* Set the source filename. This implicitly starts a new compilation - unit. */ - -extern boolean debug_set_filename PARAMS ((PTR, const char *)); - -/* Change source files to the given file name. This is used for - include files in a single compilation unit. */ - -extern boolean debug_start_source PARAMS ((PTR, const char *)); - -/* Record a function definition. This implicitly starts a function - block. The debug_type argument is the type of the return value. - The boolean indicates whether the function is globally visible. - The bfd_vma is the address of the start of the function. Currently - the parameter types are specified by calls to - debug_record_parameter. */ - -extern boolean debug_record_function - PARAMS ((PTR, const char *, debug_type, boolean, bfd_vma)); - -/* Record a parameter for the current function. */ - -extern boolean debug_record_parameter - PARAMS ((PTR, const char *, debug_type, enum debug_parm_kind, bfd_vma)); - -/* End a function definition. The argument is the address where the - function ends. */ - -extern boolean debug_end_function PARAMS ((PTR, bfd_vma)); - -/* Start a block in a function. All local information will be - recorded in this block, until the matching call to debug_end_block. - debug_start_block and debug_end_block may be nested. The argument - is the address at which this block starts. */ - -extern boolean debug_start_block PARAMS ((PTR, bfd_vma)); - -/* Finish a block in a function. This matches the call to - debug_start_block. The argument is the address at which this block - ends. */ - -extern boolean debug_end_block PARAMS ((PTR, bfd_vma)); - -/* Associate a line number in the current source file with a given - address. */ - -extern boolean debug_record_line PARAMS ((PTR, unsigned long, bfd_vma)); - -/* Start a named common block. This is a block of variables that may - move in memory. */ - -extern boolean debug_start_common_block PARAMS ((PTR, const char *)); - -/* End a named common block. */ - -extern boolean debug_end_common_block PARAMS ((PTR, const char *)); - -/* Record a named integer constant. */ - -extern boolean debug_record_int_const PARAMS ((PTR, const char *, bfd_vma)); - -/* Record a named floating point constant. */ - -extern boolean debug_record_float_const PARAMS ((PTR, const char *, double)); - -/* Record a typed constant with an integral value. */ - -extern boolean debug_record_typed_const - PARAMS ((PTR, const char *, debug_type, bfd_vma)); - -/* Record a label. */ - -extern boolean debug_record_label - PARAMS ((PTR, const char *, debug_type, bfd_vma)); - -/* Record a variable. */ - -extern boolean debug_record_variable - PARAMS ((PTR, const char *, debug_type, enum debug_var_kind, bfd_vma)); - -/* Make an indirect type. The first argument is a pointer to the - location where the real type will be placed. The second argument - is the type tag, if there is one; this may be NULL; the only - purpose of this argument is so that debug_get_type_name can return - something useful. This function may be used when a type is - referenced before it is defined. */ - -extern debug_type debug_make_indirect_type - PARAMS ((PTR, debug_type *, const char *)); - -/* Make a void type. */ - -extern debug_type debug_make_void_type PARAMS ((PTR)); - -/* Make an integer type of a given size. The boolean argument is true - if the integer is unsigned. */ - -extern debug_type debug_make_int_type PARAMS ((PTR, unsigned int, boolean)); - -/* Make a floating point type of a given size. FIXME: On some - platforms, like an Alpha, you probably need to be able to specify - the format. */ - -extern debug_type debug_make_float_type PARAMS ((PTR, unsigned int)); - -/* Make a boolean type of a given size. */ - -extern debug_type debug_make_bool_type PARAMS ((PTR, unsigned int)); - -/* Make a complex type of a given size. */ - -extern debug_type debug_make_complex_type PARAMS ((PTR, unsigned int)); - -/* Make a structure type. The second argument is true for a struct, - false for a union. The third argument is the size of the struct. - The fourth argument is a NULL terminated array of fields. */ - -extern debug_type debug_make_struct_type - PARAMS ((PTR, boolean, bfd_vma, debug_field *)); - -/* Make an object type. The first three arguments after the handle - are the same as for debug_make_struct_type. The next arguments are - a NULL terminated array of base classes, a NULL terminated array of - methods, the type of the object holding the virtual function table - if it is not this object, and a boolean which is true if this - object has its own virtual function table. */ - -extern debug_type debug_make_object_type - PARAMS ((PTR, boolean, bfd_vma, debug_field *, debug_baseclass *, - debug_method *, debug_type, boolean)); - -/* Make an enumeration type. The arguments are a null terminated - array of strings, and an array of corresponding values. */ - -extern debug_type debug_make_enum_type - PARAMS ((PTR, const char **, bfd_signed_vma *)); - -/* Make a pointer to a given type. */ - -extern debug_type debug_make_pointer_type - PARAMS ((PTR, debug_type)); - -/* Make a function type. The second argument is the return type. The - third argument is a NULL terminated array of argument types. The - fourth argument is true if the function takes a variable number of - arguments. If the third argument is NULL, then the argument types - are unknown. */ - -extern debug_type debug_make_function_type - PARAMS ((PTR, debug_type, debug_type *, boolean)); - -/* Make a reference to a given type. */ - -extern debug_type debug_make_reference_type PARAMS ((PTR, debug_type)); - -/* Make a range of a given type from a lower to an upper bound. */ - -extern debug_type debug_make_range_type - PARAMS ((PTR, debug_type, bfd_signed_vma, bfd_signed_vma)); - -/* Make an array type. The second argument is the type of an element - of the array. The third argument is the type of a range of the - array. The fourth and fifth argument are the lower and upper - bounds, respectively (if the bounds are not known, lower should be - 0 and upper should be -1). The sixth argument is true if this - array is actually a string, as in C. */ - -extern debug_type debug_make_array_type - PARAMS ((PTR, debug_type, debug_type, bfd_signed_vma, bfd_signed_vma, - boolean)); - -/* Make a set of a given type. For example, a Pascal set type. The - boolean argument is true if this set is actually a bitstring, as in - CHILL. */ - -extern debug_type debug_make_set_type PARAMS ((PTR, debug_type, boolean)); - -/* Make a type for a pointer which is relative to an object. The - second argument is the type of the object to which the pointer is - relative. The third argument is the type that the pointer points - to. */ - -extern debug_type debug_make_offset_type - PARAMS ((PTR, debug_type, debug_type)); - -/* Make a type for a method function. The second argument is the - return type. The third argument is the domain. The fourth - argument is a NULL terminated array of argument types. The fifth - argument is true if the function takes a variable number of - arguments, in which case the array of argument types indicates the - types of the first arguments. The domain and the argument array - may be NULL, in which case this is a stub method and that - information is not available. Stabs debugging uses this, and gets - the argument types from the mangled name. */ - -extern debug_type debug_make_method_type - PARAMS ((PTR, debug_type, debug_type, debug_type *, boolean)); - -/* Make a const qualified version of a given type. */ - -extern debug_type debug_make_const_type PARAMS ((PTR, debug_type)); - -/* Make a volatile qualified version of a given type. */ - -extern debug_type debug_make_volatile_type PARAMS ((PTR, debug_type)); - -/* Make an undefined tagged type. For example, a struct which has - been mentioned, but not defined. */ - -extern debug_type debug_make_undefined_tagged_type - PARAMS ((PTR, const char *, enum debug_type_kind)); - -/* Make a base class for an object. The second argument is the base - class type. The third argument is the bit position of this base - class in the object. The fourth argument is whether this is a - virtual class. The fifth argument is the visibility of the base - class. */ - -extern debug_baseclass debug_make_baseclass - PARAMS ((PTR, debug_type, bfd_vma, boolean, enum debug_visibility)); - -/* Make a field for a struct. The second argument is the name. The - third argument is the type of the field. The fourth argument is - the bit position of the field. The fifth argument is the size of - the field (it may be zero). The sixth argument is the visibility - of the field. */ - -extern debug_field debug_make_field - PARAMS ((PTR, const char *, debug_type, bfd_vma, bfd_vma, - enum debug_visibility)); - -/* Make a static member of an object. The second argument is the - name. The third argument is the type of the member. The fourth - argument is the physical name of the member (i.e., the name as a - global variable). The fifth argument is the visibility of the - member. */ - -extern debug_field debug_make_static_member - PARAMS ((PTR, const char *, debug_type, const char *, - enum debug_visibility)); - -/* Make a method. The second argument is the name, and the third - argument is a NULL terminated array of method variants. Each - method variant is a method with this name but with different - argument types. */ - -extern debug_method debug_make_method - PARAMS ((PTR, const char *, debug_method_variant *)); - -/* Make a method variant. The second argument is the physical name of - the function. The third argument is the type of the function, - probably constructed by debug_make_method_type. The fourth - argument is the visibility. The fifth argument is whether this is - a const function. The sixth argument is whether this is a volatile - function. The seventh argument is the index in the virtual - function table, if any. The eighth argument is the virtual - function context. */ - -extern debug_method_variant debug_make_method_variant - PARAMS ((PTR, const char *, debug_type, enum debug_visibility, boolean, - boolean, bfd_vma, debug_type)); - -/* Make a static method argument. The arguments are the same as for - debug_make_method_variant, except that the last two are omitted - since a static method can not also be virtual. */ - -extern debug_method_variant debug_make_static_method_variant - PARAMS ((PTR, const char *, debug_type, enum debug_visibility, boolean, - boolean)); - -/* Name a type. This returns a new type with an attached name. */ - -extern debug_type debug_name_type PARAMS ((PTR, const char *, debug_type)); - -/* Give a tag to a type, such as a struct or union. This returns a - new type with an attached tag. */ - -extern debug_type debug_tag_type PARAMS ((PTR, const char *, debug_type)); - -/* Record the size of a given type. */ - -extern boolean debug_record_type_size PARAMS ((PTR, debug_type, unsigned int)); - -/* Find a named type. */ - -extern debug_type debug_find_named_type PARAMS ((PTR, const char *)); - -/* Find a tagged type. */ - -extern debug_type debug_find_tagged_type - PARAMS ((PTR, const char *, enum debug_type_kind)); - -/* Get the kind of a type. */ - -extern enum debug_type_kind debug_get_type_kind PARAMS ((PTR, debug_type)); - -/* Get the name of a type. */ - -extern const char *debug_get_type_name PARAMS ((PTR, debug_type)); - -/* Get the size of a type. */ - -extern bfd_vma debug_get_type_size PARAMS ((PTR, debug_type)); - -/* Get the return type of a function or method type. */ - -extern debug_type debug_get_return_type PARAMS ((PTR, debug_type)); - -/* Get the NULL terminated array of parameter types for a function or - method type (actually, parameter types are not currently stored for - function types). This may be used to determine whether a method - type is a stub method or not. The last argument points to a - boolean which is set to true if the function takes a variable - number of arguments. */ - -extern const debug_type *debug_get_parameter_types PARAMS ((PTR, - debug_type, - boolean *)); - -/* Get the target type of a pointer or reference or const or volatile - type. */ - -extern debug_type debug_get_target_type PARAMS ((PTR, debug_type)); - -/* Get the NULL terminated array of fields for a struct, union, or - class. */ - -extern const debug_field *debug_get_fields PARAMS ((PTR, debug_type)); - -/* Get the type of a field. */ - -extern debug_type debug_get_field_type PARAMS ((PTR, debug_field)); - -/* Get the name of a field. */ - -extern const char *debug_get_field_name PARAMS ((PTR, debug_field)); - -/* Get the bit position of a field within the containing structure. - If the field is a static member, this will return (bfd_vma) -1. */ - -extern bfd_vma debug_get_field_bitpos PARAMS ((PTR, debug_field)); - -/* Get the bit size of a field. If the field is a static member, this - will return (bfd_vma) -1. */ - -extern bfd_vma debug_get_field_bitsize PARAMS ((PTR, debug_field)); - -/* Get the visibility of a field. */ - -extern enum debug_visibility debug_get_field_visibility - PARAMS ((PTR, debug_field)); - -/* Get the physical name of a field, if it is a static member. If the - field is not a static member, this will return NULL. */ - -extern const char *debug_get_field_physname PARAMS ((PTR, debug_field)); - -/* Write out the recorded debugging information. This takes a set of - function pointers which are called to do the actual writing. The - first PTR is the debugging handle. The second PTR is a handle - which is passed to the functions. */ - -extern boolean debug_write PARAMS ((PTR, const struct debug_write_fns *, PTR)); - -#endif /* DEBUG_H */ diff --git a/binutils/deflex.l b/binutils/deflex.l deleted file mode 100644 index 15a43c04f40..00000000000 --- a/binutils/deflex.l +++ /dev/null @@ -1,93 +0,0 @@ -%{/* deflex.l - Lexer for .def files */ - -/* Copyright (C) 1995, 1997, 1998, 1999 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* Contributed by Steve Chamberlain - sac@cygnus.com - -*/ -#define DONTDECLARE_MALLOC -#include "libiberty.h" -#include "defparse.h" -#include "dlltool.h" - -int linenumber; - -%} -%% -"NAME" { return NAME;} -"LIBRARY" { return LIBRARY;} -"DESCRIPTION" { return DESCRIPTION;} -"STACKSIZE" { return STACKSIZE;} -"HEAPSIZE" { return HEAPSIZE;} -"CODE" { return CODE;} -"DATA" { return DATA;} -"SECTIONS" { return SECTIONS;} -"EXPORTS" { return EXPORTS;} -"IMPORTS" { return IMPORTS;} -"VERSION" { return VERSIONK;} -"BASE" { return BASE;} -"CONSTANT" { return CONSTANT; } -"NONAME" { return NONAME; } -"READ" { return READ;} -"WRITE" { return WRITE;} -"EXECUTE" { return EXECUTE;} -"SHARED" { return SHARED;} -"NONSHARED" { return NONSHARED;} -"SINGLE" { return SINGLE;} -"MULTIPLE" { return MULTIPLE;} -"INITINSTANCE" { return INITINSTANCE;} -"INITGLOBAL" { return INITGLOBAL;} -"TERMINSTANCE" { return TERMINSTANCE;} -"TERMGLOBAL" { return TERMGLOBAL;} - -[0-9][x0-9A-Fa-f]* { yylval.number = strtol (yytext,0,0); - return NUMBER; } - -[A-Za-z$:\-\_?][A-Za-z0-9/$:\-\_@?]* { - yylval.id = xstrdup (yytext); - return ID; - } - -"\""[^\"]*"\"" { - yylval.id = xstrdup (yytext+1); - yylval.id[yyleng-2] = 0; - return ID; - } - -"\'"[^\']*"\'" { - yylval.id = xstrdup (yytext+1); - yylval.id[yyleng-2] = 0; - return ID; - } -"*".* { } -";".* { } -" " { } -"\t" { } -"\n" { linenumber ++ ;} -"=" { return '=';} -"." { return '.';} -"@" { return '@';} -"," { return ',';} -%% -#ifndef yywrap -/* Needed for lex, though not flex. */ -int yywrap() { return 1; } -#endif diff --git a/binutils/defparse.y b/binutils/defparse.y deleted file mode 100644 index 5718d461443..00000000000 --- a/binutils/defparse.y +++ /dev/null @@ -1,169 +0,0 @@ -%{ /* defparse.y - parser for .def files */ - -/* Copyright (C) 1995, 1997, 1998, 1999 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "bucomm.h" -#include "dlltool.h" -%} - -%union { - char *id; - int number; -}; - -%token NAME, LIBRARY, DESCRIPTION, STACKSIZE, HEAPSIZE, CODE, DATA -%token SECTIONS, EXPORTS, IMPORTS, VERSIONK, BASE, CONSTANT -%token READ WRITE EXECUTE SHARED NONSHARED NONAME -%token SINGLE MULTIPLE INITINSTANCE INITGLOBAL TERMINSTANCE TERMGLOBAL -%token ID -%token NUMBER -%type opt_base opt_ordinal opt_NONAME opt_CONSTANT opt_DATA -%type attr attr_list opt_number -%type opt_name opt_equal_name - -%% - -start: start command - | command - ; - -command: - NAME opt_name opt_base { def_name ($2, $3); } - | LIBRARY opt_name opt_base option_list { def_library ($2, $3); } - | EXPORTS explist - | DESCRIPTION ID { def_description ($2);} - | STACKSIZE NUMBER opt_number { def_stacksize ($2, $3);} - | HEAPSIZE NUMBER opt_number { def_heapsize ($2, $3);} - | CODE attr_list { def_code ($2);} - | DATA attr_list { def_data ($2);} - | SECTIONS seclist - | IMPORTS implist - | VERSIONK NUMBER { def_version ($2,0);} - | VERSIONK NUMBER '.' NUMBER { def_version ($2,$4);} - ; - - -explist: - /* EMPTY */ - | explist expline - ; - -expline: - ID opt_equal_name opt_ordinal opt_NONAME opt_CONSTANT opt_DATA - { def_exports ($1, $2, $3, $4, $5, $6);} - ; -implist: - implist impline - | impline - ; - -impline: - ID '=' ID '.' ID '.' ID { def_import ($1,$3,$5,$7, 0); } - | ID '=' ID '.' ID '.' NUMBER { def_import ($1,$3,$5, 0,$7); } - | ID '=' ID '.' ID { def_import ($1,$3, 0,$5, 0); } - | ID '=' ID '.' NUMBER { def_import ($1,$3, 0, 0,$5); } - | ID '.' ID '.' ID { def_import ( 0,$1,$3,$5, 0); } - | ID '.' ID '.' NUMBER { def_import ( 0,$1,$3, 0,$5); } - | ID '.' ID { def_import ( 0,$1, 0,$3, 0); } - | ID '.' NUMBER { def_import ( 0,$1, 0, 0,$3); } -; - -seclist: - seclist secline - | secline - ; - -secline: - ID attr_list { def_section ($1,$2);} - ; - -attr_list: - attr_list opt_comma attr - | attr - ; - -opt_comma: - ',' - | - ; -opt_number: ',' NUMBER { $$=$2;} - | { $$=-1;} - ; - -attr: - READ { $$ = 1; } - | WRITE { $$ = 2; } - | EXECUTE { $$ = 4; } - | SHARED { $$ = 8; } - | NONSHARED { $$ = 0; } - | SINGLE { $$ = 0; } - | MULTIPLE { $$ = 0; } - ; - -opt_CONSTANT: - CONSTANT {$$=1;} - | {$$=0;} - ; - -opt_NONAME: - NONAME {$$=1;} - | {$$=0;} - ; - -opt_DATA: - DATA { $$ = 1; } - | { $$ = 0; } - ; - -opt_name: ID { $$ =$1; } - | ID '.' ID - { - char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1); - sprintf (name, "%s.%s", $1, $3); - $$ = name; - } - | { $$=""; } - ; - -opt_ordinal: - '@' NUMBER { $$=$2;} - | { $$=-1;} - ; - -opt_equal_name: - '=' ID { $$ = $2; } - | { $$ = 0; } - ; - -opt_base: BASE '=' NUMBER { $$= $3;} - | { $$=-1;} - ; - -option_list: - /* empty */ - | option_list opt_comma option - ; - -option: - INITINSTANCE - | INITGLOBAL - | TERMINSTANCE - | TERMGLOBAL - ; diff --git a/binutils/dep-in.sed b/binutils/dep-in.sed deleted file mode 100644 index f61921a4828..00000000000 --- a/binutils/dep-in.sed +++ /dev/null @@ -1,17 +0,0 @@ -:loop -/\\$/N -/\\$/b loop - -s!@INCDIR@!$(INCDIR)!g -s!@BFDDIR@!$(BFDDIR)!g -s!@SRCDIR@/!!g -s!@OBJDIR@/!!g - -s/\\\n */ /g - -s/ *$// -s/ */ /g -/:$/d - -s/\(.\{50\}[^ ]*\) /\1 \\\ - /g diff --git a/binutils/dlltool.c b/binutils/dlltool.c deleted file mode 100644 index b618b969946..00000000000 --- a/binutils/dlltool.c +++ /dev/null @@ -1,3611 +0,0 @@ -/* dlltool.c -- tool to generate stuff for PE style DLLs - Copyright (C) 1995, 96, 97, 98, 99, 2000 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 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - - -/* - This program allows you to build the files necessary to create - DLLs to run on a system which understands PE format image files. - (eg, Windows NT) - - See "Peering Inside the PE: A Tour of the Win32 Portable Executable - File Format", MSJ 1994, Volume 9 for more information. - Also see "Microsoft Portable Executable and Common Object File Format, - Specification 4.1" for more information. - - A DLL contains an export table which contains the information - which the runtime loader needs to tie up 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. - - A DEF file contains any number of the following commands: - - - NAME [ , ] - The result is going to be .EXE - - LIBRARY [ , ] - The result is going to be .DLL - - EXPORTS ( [ = ] [ @ ] [ NONAME ] [CONSTANT] [DATA] ) * - Declares name1 as an exported symbol from the - DLL, with optional ordinal number - - IMPORTS ( ( = . ) - | ( [ = ] . )) * - Declares that or the exported function whoes ordinal number - is is to be imported from the file . If - is specified then this is the name that the imported - function will be refered to in the body of the DLL. - - DESCRIPTION - Puts into output .exp file in the .rdata section - - [STACKSIZE|HEAPSIZE] [ , ] - Generates --stack|--heap , - in the output .drectve section. The linker will - see this and act upon it. - - [CODE|DATA] + - SECTIONS ( + )* - = READ | WRITE | EXECUTE | SHARED - Generates --attr in the output - .drectve section. The linker will see this and act - upon it. - - - A -export: in a .drectve section in an input .o or .a - file to this program is equivalent to a EXPORTS - in a .DEF file. - - - - The program generates output files with the prefix supplied - on the command line, or in the def file, or taken from the first - supplied argument. - - The .exp.s file contains the information necessary to export - the routines in the DLL. The .lib.s file contains the information - necessary to use the DLL's routines from a referencing program. - - - - Example: - - file1.c: - asm (".section .drectve"); - asm (".ascii \"-export:adef\""); - - void adef (char * s) - { - printf ("hello from the dll %s\n", s); - } - - void bdef (char * s) - { - printf ("hello from the dll and the other entry point %s\n", s); - } - - file2.c: - asm (".section .drectve"); - asm (".ascii \"-export:cdef\""); - asm (".ascii \"-export:ddef\""); - - void cdef (char * s) - { - printf ("hello from the dll %s\n", s); - } - - void ddef (char * s) - { - printf ("hello from the dll and the other entry point %s\n", s); - } - - int printf (void) - { - return 9; - } - - themain.c: - int main (void) - { - cdef (); - return 0; - } - - thedll.def - - LIBRARY thedll - HEAPSIZE 0x40000, 0x2000 - EXPORTS bdef @ 20 - cdef @ 30 NONAME - - SECTIONS donkey READ WRITE - aardvark EXECUTE - - # Compile up the parts of the dll and the program - - gcc -c file1.c file2.c themain.c - - # Optional: put the dll objects into a library - # (you don't have to, you could name all the object - # files on the dlltool line) - - ar qcv thedll.in file1.o file2.o - ranlib thedll.in - - # Run this tool over the DLL's .def file and generate an exports - # file (thedll.o) and an imports file (thedll.a). - # (You may have to use -S to tell dlltool where to find the assembler). - - dlltool --def thedll.def --output-exp thedll.o --output-lib thedll.a - - # Build the dll with the library and the export table - - ld -o thedll.dll thedll.o thedll.in - - # Link the executable with the import library - - gcc -o themain.exe themain.o thedll.a - - This example can be extended if relocations are needed in the DLL: - - # Compile up the parts of the dll and the program - - gcc -c file1.c file2.c themain.c - - # Run this tool over the DLL's .def file and generate an imports file. - - dlltool --def thedll.def --output-lib thedll.lib - - # Link the executable with the import library and generate a base file - # at the same time - - gcc -o themain.exe themain.o thedll.lib -Wl,--base-file -Wl,themain.base - - # Run this tool over the DLL's .def file and generate an exports file - # which includes the relocations from the base file. - - dlltool --def thedll.def --base-file themain.base --output-exp thedll.exp - - # Build the dll with file1.o, file2.o and the export table - - ld -o thedll.dll thedll.exp file1.o file2.o - */ - -/* .idata section description - - The .idata section is the import table. It is a collection of several - subsections used to keep the pieces for each dll together: .idata$[234567]. - IE: Each dll's .idata$2's are catenated together, each .idata$3's, etc. - - .idata$2 = Import Directory Table - = array of IMAGE_IMPORT_DESCRIPTOR's. - - DWORD Import Lookup Table; - pointer to .idata$4 - DWORD TimeDateStamp; - currently always 0 - DWORD ForwarderChain; - currently always 0 - DWORD Name; - pointer to dll's name - PIMAGE_THUNK_DATA FirstThunk; - pointer to .idata$5 - - .idata$3 = null terminating entry for .idata$2. - - .idata$4 = Import Lookup Table - = array of array of pointers to hint name table. - There is one for each dll being imported from, and each dll's set is - terminated by a trailing NULL. - - .idata$5 = Import Address Table - = array of array of pointers to hint name table. - There is one for each dll being imported from, and each dll's set is - terminated by a trailing NULL. - Initially, this table is identical to the Import Lookup Table. However, - at load time, the loader overwrites the entries with the address of the - function. - - .idata$6 = Hint Name Table - = Array of { short, asciz } entries, one for each imported function. - The `short' is the function's ordinal number. - - .idata$7 = dll name (eg: "kernel32.dll"). (.idata$6 for ppc) -*/ - -/* AIX requires this to be the first thing in the file. */ -#ifndef __GNUC__ -# ifdef _AIX - #pragma alloca -#endif -#endif - -#define show_allnames 0 - -#define PAGE_SIZE 4096 -#define PAGE_MASK (-PAGE_SIZE) -#include "bfd.h" -#include "libiberty.h" -#include "bucomm.h" -#include "getopt.h" -#include "demangle.h" -#include "dyn-string.h" -#include "dlltool.h" - -#include -#include -#include - -#ifdef ANSI_PROTOTYPES -#include -#else -#include -#endif - -#ifdef DLLTOOL_ARM -#include "coff/arm.h" -#include "coff/internal.h" -#endif - -/* Forward references. */ -static char *look_for_prog PARAMS ((const char *, const char *, int)); -static char *deduce_name PARAMS ((const char *)); - -#ifdef DLLTOOL_MCORE_ELF -static void mcore_elf_cache_filename (char *); -static void mcore_elf_gen_out_file (void); -#endif - -#ifdef HAVE_SYS_WAIT_H -#include -#else /* ! HAVE_SYS_WAIT_H */ -#if ! defined (_WIN32) || defined (__CYGWIN32__) -#ifndef WIFEXITED -#define WIFEXITED(w) (((w)&0377) == 0) -#endif -#ifndef WIFSIGNALED -#define WIFSIGNALED(w) (((w)&0377) != 0177 && ((w)&~0377) == 0) -#endif -#ifndef WTERMSIG -#define WTERMSIG(w) ((w) & 0177) -#endif -#ifndef WEXITSTATUS -#define WEXITSTATUS(w) (((w) >> 8) & 0377) -#endif -#else /* defined (_WIN32) && ! defined (__CYGWIN32__) */ -#ifndef WIFEXITED -#define WIFEXITED(w) (((w) & 0xff) == 0) -#endif -#ifndef WIFSIGNALED -#define WIFSIGNALED(w) (((w) & 0xff) != 0 && ((w) & 0xff) != 0x7f) -#endif -#ifndef WTERMSIG -#define WTERMSIG(w) ((w) & 0x7f) -#endif -#ifndef WEXITSTATUS -#define WEXITSTATUS(w) (((w) & 0xff00) >> 8) -#endif -#endif /* defined (_WIN32) && ! defined (__CYGWIN32__) */ -#endif /* ! HAVE_SYS_WAIT_H */ - -/* ifunc and ihead data structures: ttk@cygnus.com 1997 - - When IMPORT declarations are encountered in a .def file the - function import information is stored in a structure referenced by - the global variable IMPORT_LIST. The structure is a linked list - containing the names of the dll files each function is imported - from and a linked list of functions being imported from that dll - file. This roughly parallels the structure of the .idata section - in the PE object file. - - The contents of .def file are interpreted from within the - process_def_file function. Every time an IMPORT declaration is - encountered, it is broken up into its component parts and passed to - def_import. IMPORT_LIST is initialized to NULL in function main. */ - -typedef struct ifunct -{ - char *name; /* name of function being imported */ - int ord; /* two-byte ordinal value associated with function */ - struct ifunct *next; -} ifunctype; - -typedef struct iheadt -{ - char *dllname; /* name of dll file imported from */ - long nfuncs; /* number of functions in list */ - struct ifunct *funchead; /* first function in list */ - struct ifunct *functail; /* last function in list */ - struct iheadt *next; /* next dll file in list */ -} iheadtype; - -/* Structure containing all import information as defined in .def file - (qv "ihead structure"). */ - -static iheadtype *import_list = NULL; - -static char *as_name = NULL; -static char * as_flags = ""; - -static int no_idata4; -static int no_idata5; -static char *exp_name; -static char *imp_name; -static char *head_label; -static char *imp_name_lab; -static char *dll_name; - -static int add_indirect = 0; -static int add_underscore = 0; -static int dontdeltemps = 0; - -/* True if we should export all symbols. Otherwise, we only export - symbols listed in .drectve sections or in the def file. */ -static boolean export_all_symbols; - -/* True if we should exclude the symbols in DEFAULT_EXCLUDES when - exporting all symbols. */ -static boolean do_default_excludes; - -/* Default symbols to exclude when exporting all the symbols. */ -static const char *default_excludes = "DllMain@12,DllEntryPoint@0,impure_ptr"; - -/* True if we should add __imp_ to import libraries for backward - compatibility to old Cygwin releases. */ -static boolean create_compat_implib; - -static char *def_file; - -extern char * program_name; - -static int machine; -static int killat; -static int add_stdcall_alias; -static int verbose; -static FILE *output_def; -static FILE *base_file; - -#ifdef DLLTOOL_ARM -static const char *mname = "arm"; -#endif - -#ifdef DLLTOOL_I386 -static const char *mname = "i386"; -#endif - -#ifdef DLLTOOL_PPC -static const char *mname = "ppc"; -#endif - -#ifdef DLLTOOL_SH -static const char *mname = "sh"; -#endif - -#ifdef DLLTOOL_MIPS -static const char *mname = "mips"; -#endif - -#ifdef DLLTOOL_MCORE -static const char * mname = "mcore-le"; -#endif - -#ifdef DLLTOOL_MCORE_ELF -static const char * mname = "mcore-elf"; -static char * mcore_elf_out_file = NULL; -static char * mcore_elf_linker = NULL; -static char * mcore_elf_linker_flags = NULL; - -#define DRECTVE_SECTION_NAME ((machine == MMCORE_ELF || machine == MMCORE_ELF_LE) ? ".exports" : ".drectve") -#endif - -#ifndef DRECTVE_SECTION_NAME -#define DRECTVE_SECTION_NAME ".drectve" -#endif - -#define PATHMAX 250 /* What's the right name for this ? */ - -#define TMP_ASM "dc.s" -#define TMP_HEAD_S "dh.s" -#define TMP_HEAD_O "dh.o" -#define TMP_TAIL_S "dt.s" -#define TMP_TAIL_O "dt.o" -#define TMP_STUB "ds" - -/* This bit of assemly does jmp * .... */ -static const unsigned char i386_jtab[] = -{ - 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 -}; - -static const unsigned char arm_jtab[] = -{ - 0x00, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */ - 0x00, 0xf0, 0x9c, 0xe5, /* ldr pc, [ip] */ - 0, 0, 0, 0 -}; - -static const unsigned char arm_interwork_jtab[] = -{ - 0x04, 0xc0, 0x9f, 0xe5, /* ldr ip, [pc] */ - 0x00, 0xc0, 0x9c, 0xe5, /* ldr ip, [ip] */ - 0x1c, 0xff, 0x2f, 0xe1, /* bx ip */ - 0, 0, 0, 0 -}; - -static const unsigned char thumb_jtab[] = -{ - 0x40, 0xb4, /* push {r6} */ - 0x02, 0x4e, /* ldr r6, [pc, #8] */ - 0x36, 0x68, /* ldr r6, [r6] */ - 0xb4, 0x46, /* mov ip, r6 */ - 0x40, 0xbc, /* pop {r6} */ - 0x60, 0x47, /* bx ip */ - 0, 0, 0, 0 -}; - -static const unsigned char mcore_be_jtab[] = -{ - 0x71, 0x02, /* lrw r1,2 */ - 0x81, 0x01, /* ld.w r1,(r1,0) */ - 0x00, 0xC1, /* jmp r1 */ - 0x12, 0x00, /* nop */ - 0x00, 0x00, 0x00, 0x00 /*
*/ -}; - -static const unsigned char mcore_le_jtab[] = -{ - 0x02, 0x71, /* lrw r1,2 */ - 0x01, 0x81, /* ld.w r1,(r1,0) */ - 0xC1, 0x00, /* jmp r1 */ - 0x00, 0x12, /* nop */ - 0x00, 0x00, 0x00, 0x00 /*
*/ -}; - -/* This is the glue sequence for PowerPC PE. There is a */ -/* tocrel16-tocdefn reloc against the first instruction. */ -/* We also need a IMGLUE reloc against the glue function */ -/* to restore the toc saved by the third instruction in */ -/* the glue. */ -static const unsigned char ppc_jtab[] = -{ - 0x00, 0x00, 0x62, 0x81, /* lwz r11,0(r2) */ - /* Reloc TOCREL16 __imp_xxx */ - 0x00, 0x00, 0x8B, 0x81, /* lwz r12,0(r11) */ - 0x04, 0x00, 0x41, 0x90, /* stw r2,4(r1) */ - 0xA6, 0x03, 0x89, 0x7D, /* mtctr r12 */ - 0x04, 0x00, 0x4B, 0x80, /* lwz r2,4(r11) */ - 0x20, 0x04, 0x80, 0x4E /* bctr */ -}; - -#ifdef DLLTOOL_PPC -/* the glue instruction, picks up the toc from the stw in */ -/* the above code: "lwz r2,4(r1)" */ -static bfd_vma ppc_glue_insn = 0x80410004; -#endif - -struct mac - { - const char *type; - const char *how_byte; - const char *how_short; - const char *how_long; - const char *how_asciz; - const char *how_comment; - const char *how_jump; - const char *how_global; - const char *how_space; - const char *how_align_short; - const char *how_align_long; - const char *how_default_as_switches; - const char *how_bfd_target; - enum bfd_architecture how_bfd_arch; - const unsigned char *how_jtab; - int how_jtab_size; /* size of the jtab entry */ - int how_jtab_roff; /* offset into it for the ind 32 reloc into idata 5 */ - }; - -static const struct mac -mtable[] = -{ - { -#define MARM 0 - "arm", ".byte", ".short", ".long", ".asciz", "@", - "ldr\tip,[pc]\n\tldr\tpc,[ip]\n\t.long", - ".global", ".space", ".align\t2",".align\t4", "-mapcs-32", - "pe-arm-little", bfd_arch_arm, - arm_jtab, sizeof (arm_jtab), 8 - } - , - { -#define M386 1 - "i386", ".byte", ".short", ".long", ".asciz", "#", - "jmp *", ".global", ".space", ".align\t2",".align\t4", "", - "pe-i386",bfd_arch_i386, - i386_jtab, sizeof (i386_jtab), 2 - } - , - { -#define MPPC 2 - "ppc", ".byte", ".short", ".long", ".asciz", "#", - "jmp *", ".global", ".space", ".align\t2",".align\t4", "", - "pe-powerpcle",bfd_arch_powerpc, - ppc_jtab, sizeof (ppc_jtab), 0 - } - , - { -#define MTHUMB 3 - "thumb", ".byte", ".short", ".long", ".asciz", "@", - "push\t{r6}\n\tldr\tr6, [pc, #8]\n\tldr\tr6, [r6]\n\tmov\tip, r6\n\tpop\t{r6}\n\tbx\tip", - ".global", ".space", ".align\t2",".align\t4", "-mthumb-interwork", - "pe-arm-little", bfd_arch_arm, - thumb_jtab, sizeof (thumb_jtab), 12 - } - , -#define MARM_INTERWORK 4 - { - "arm_interwork", ".byte", ".short", ".long", ".asciz", "@", - "ldr\tip,[pc]\n\tldr\tip,[ip]\n\tbx\tip\n\t.long", - ".global", ".space", ".align\t2",".align\t4", "-mthumb-interwork", - "pe-arm-little", bfd_arch_arm, - arm_interwork_jtab, sizeof (arm_interwork_jtab), 12 - } - , - { -#define MMCORE_BE 5 - "mcore-be", ".byte", ".short", ".long", ".asciz", "//", - "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long", - ".global", ".space", ".align\t2",".align\t4", "", - "pe-mcore-big", bfd_arch_mcore, - mcore_be_jtab, sizeof (mcore_be_jtab), 8 - } - , - { -#define MMCORE_LE 6 - "mcore-le", ".byte", ".short", ".long", ".asciz", "//", - "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long", - ".global", ".space", ".align\t2",".align\t4", "-EL", - "pe-mcore-little", bfd_arch_mcore, - mcore_le_jtab, sizeof (mcore_le_jtab), 8 - } - , - { -#define MMCORE_ELF 7 - "mcore-elf-be", ".byte", ".short", ".long", ".asciz", "//", - "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long", - ".global", ".space", ".align\t2",".align\t4", "", - "elf32-mcore-big", bfd_arch_mcore, - mcore_be_jtab, sizeof (mcore_be_jtab), 8 - } - , - { -#define MMCORE_ELF_LE 8 - "mcore-elf-le", ".byte", ".short", ".long", ".asciz", "//", - "lrw r1,[1f]\n\tld.w r1,(r1,0)\n\tjmp r1\n\tnop\n1:.long", - ".global", ".space", ".align\t2",".align\t4", "-EL", - "elf32-mcore-little", bfd_arch_mcore, - mcore_le_jtab, sizeof (mcore_le_jtab), 8 - } - , - { -#define MARM_EPOC 9 - "arm", ".byte", ".short", ".long", ".asciz", "@", - "ldr\tip,[pc]\n\tldr\tpc,[ip]\n\t.long", - ".global", ".space", ".align\t2",".align\t4", "", - "epoc-pe-arm-little", bfd_arch_arm, - arm_jtab, sizeof (arm_jtab), 8 - } - , - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } -}; - -typedef struct dlist -{ - char *text; - struct dlist *next; -} -dlist_type; - -typedef struct export - { - const char *name; - const char *internal_name; - int ordinal; - int constant; - int noname; - int data; - int hint; - struct export *next; - } -export_type; - -/* A list of symbols which we should not export. */ - -struct string_list -{ - struct string_list *next; - char *string; -}; - -static struct string_list *excludes; - -static const char *rvaafter PARAMS ((int)); -static const char *rvabefore PARAMS ((int)); -static const char *asm_prefix PARAMS ((int)); -static void append_import PARAMS ((const char *, const char *, int)); -static void run PARAMS ((const char *, char *)); -static void scan_drectve_symbols PARAMS ((bfd *)); -static void scan_filtered_symbols PARAMS ((bfd *, PTR, long, unsigned int)); -static void add_excludes PARAMS ((const char *)); -static boolean match_exclude PARAMS ((const char *)); -static void set_default_excludes PARAMS ((void)); -static long filter_symbols PARAMS ((bfd *, PTR, long, unsigned int)); -static void scan_all_symbols PARAMS ((bfd *)); -static void scan_open_obj_file PARAMS ((bfd *)); -static void scan_obj_file PARAMS ((const char *)); -static void dump_def_info PARAMS ((FILE *)); -static int sfunc PARAMS ((const void *, const void *)); -static void flush_page PARAMS ((FILE *, long *, int, int)); -static void gen_def_file PARAMS ((void)); -static void generate_idata_ofile PARAMS ((FILE *)); -static void gen_exp_file PARAMS ((void)); -static const char *xlate PARAMS ((const char *)); -#if 0 -static void dump_iat PARAMS ((FILE *, export_type *)); -#endif -static char *make_label PARAMS ((const char *, const char *)); -static bfd *make_one_lib_file PARAMS ((export_type *, int)); -static bfd *make_head PARAMS ((void)); -static bfd *make_tail PARAMS ((void)); -static void gen_lib_file PARAMS ((void)); -static int pfunc PARAMS ((const void *, const void *)); -static int nfunc PARAMS ((const void *, const void *)); -static void remove_null_names PARAMS ((export_type **)); -static void dtab PARAMS ((export_type **)); -static void process_duplicates PARAMS ((export_type **)); -static void fill_ordinals PARAMS ((export_type **)); -static int alphafunc PARAMS ((const void *, const void *)); -static void mangle_defs PARAMS ((void)); -static void usage PARAMS ((FILE *, int)); -static void inform PARAMS ((const char *, ...)); - - -static void -#ifdef __STDC__ -inform (const char * message, ...) -#else -inform (message, va_alist) - const char * message; - va_dcl -#endif -{ - va_list args; - - if (!verbose) - return; - -#ifdef __STDC__ - va_start (args, message); -#else - va_start (args); -#endif - - report (message, args); - - va_end (args); -} - -static const char * -rvaafter (machine) - int machine; -{ - switch (machine) - { - case MARM: - case M386: - case MPPC: - case MTHUMB: - case MARM_INTERWORK: - case MMCORE_BE: - case MMCORE_LE: - case MMCORE_ELF: - case MMCORE_ELF_LE: - break; - default: - /* xgettext:c-format */ - fatal (_("Internal error: Unknown machine type: %d"), machine); - break; - } - return ""; -} - -static const char * -rvabefore (machine) - int machine; -{ - switch (machine) - { - case MARM: - case M386: - case MPPC: - case MTHUMB: - case MARM_INTERWORK: - case MMCORE_BE: - case MMCORE_LE: - case MMCORE_ELF: - case MMCORE_ELF_LE: - return ".rva\t"; - default: - /* xgettext:c-format */ - fatal (_("Internal error: Unknown machine type: %d"), machine); - break; - } - return ""; -} - -static const char * -asm_prefix (machine) - int machine; -{ - switch (machine) - { - case MARM: - case MPPC: - case MTHUMB: - case MARM_INTERWORK: - case MMCORE_BE: - case MMCORE_LE: - case MMCORE_ELF: - case MMCORE_ELF_LE: - break; - case M386: - return "_"; - default: - /* xgettext:c-format */ - fatal (_("Internal error: Unknown machine type: %d"), machine); - break; - } - return ""; -} - -#define ASM_BYTE mtable[machine].how_byte -#define ASM_SHORT mtable[machine].how_short -#define ASM_LONG mtable[machine].how_long -#define ASM_TEXT mtable[machine].how_asciz -#define ASM_C mtable[machine].how_comment -#define ASM_JUMP mtable[machine].how_jump -#define ASM_GLOBAL mtable[machine].how_global -#define ASM_SPACE mtable[machine].how_space -#define ASM_ALIGN_SHORT mtable[machine].how_align_short -#define ASM_RVA_BEFORE rvabefore(machine) -#define ASM_RVA_AFTER rvaafter(machine) -#define ASM_PREFIX asm_prefix(machine) -#define ASM_ALIGN_LONG mtable[machine].how_align_long -#define HOW_BFD_READ_TARGET 0 /* always default*/ -#define HOW_BFD_WRITE_TARGET mtable[machine].how_bfd_target -#define HOW_BFD_ARCH mtable[machine].how_bfd_arch -#define HOW_JTAB mtable[machine].how_jtab -#define HOW_JTAB_SIZE mtable[machine].how_jtab_size -#define HOW_JTAB_ROFF mtable[machine].how_jtab_roff -#define ASM_SWITCHES mtable[machine].how_default_as_switches - -static char **oav; - -void -process_def_file (name) - const char *name; -{ - FILE *f = fopen (name, FOPEN_RT); - - if (!f) - /* xgettext:c-format */ - fatal (_("Can't open def file: %s"), name); - - yyin = f; - - /* xgettext:c-format */ - inform (_("Processing def file: %s"), name); - - yyparse (); - - inform (_("Processed def file")); -} - -/**********************************************************************/ - -/* Communications with the parser */ - -static const char *d_name; /* Arg to NAME or LIBRARY */ -static int d_nfuncs; /* Number of functions exported */ -static int d_named_nfuncs; /* Number of named functions exported */ -static int d_low_ord; /* Lowest ordinal index */ -static int d_high_ord; /* Highest ordinal index */ -static export_type *d_exports; /*list of exported functions */ -static export_type **d_exports_lexically; /* vector of exported functions in alpha order */ -static dlist_type *d_list; /* Descriptions */ -static dlist_type *a_list; /* Stuff to go in directives */ - -static int d_is_dll; -static int d_is_exe; - -int -yyerror (err) - const char * err ATTRIBUTE_UNUSED; -{ - /* xgettext:c-format */ - non_fatal (_("Syntax error in def file %s:%d"), def_file, linenumber); - - return 0; -} - -void -def_exports (name, internal_name, ordinal, noname, constant, data) - const char *name; - const char *internal_name; - int ordinal; - int noname; - int constant; - int data; -{ - struct export *p = (struct export *) xmalloc (sizeof (*p)); - - p->name = name; - p->internal_name = internal_name ? internal_name : name; - p->ordinal = ordinal; - p->constant = constant; - p->noname = noname; - p->data = data; - p->next = d_exports; - d_exports = p; - d_nfuncs++; -} - -void -def_name (name, base) - const char *name; - int base; -{ - /* xgettext:c-format */ - inform (_("NAME: %s base: %x"), name, base); - - if (d_is_dll) - non_fatal (_("Can't have LIBRARY and NAME")); - - d_name = name; - /* if --dllname not provided, use the one in the DEF file. - FIXME: Is this appropriate for executables? */ - if (! dll_name) - dll_name = xstrdup (name); - d_is_exe = 1; -} - -void -def_library (name, base) - const char *name; - int base; -{ - /* xgettext:c-format */ - inform (_("LIBRARY: %s base: %x"), name, base); - - if (d_is_exe) - non_fatal (_("Can't have LIBRARY and NAME")); - - d_name = name; - /* if --dllname not provided, use the one in the DEF file. */ - if (! dll_name) - dll_name = xstrdup (name); - d_is_dll = 1; -} - -void -def_description (desc) - const char *desc; -{ - dlist_type *d = (dlist_type *) xmalloc (sizeof (dlist_type)); - d->text = xstrdup (desc); - d->next = d_list; - d_list = d; -} - -void -new_directive (dir) - char *dir; -{ - dlist_type *d = (dlist_type *) xmalloc (sizeof (dlist_type)); - d->text = xstrdup (dir); - d->next = a_list; - a_list = d; -} - -void -def_heapsize (reserve, commit) - int reserve; - int commit; -{ - char b[200]; - if (commit > 0) - sprintf (b, "-heap 0x%x,0x%x ", reserve, commit); - else - sprintf (b, "-heap 0x%x ", reserve); - new_directive (xstrdup (b)); -} - -void -def_stacksize (reserve, commit) - int reserve; - int commit; -{ - char b[200]; - if (commit > 0) - sprintf (b, "-stack 0x%x,0x%x ", reserve, commit); - else - sprintf (b, "-stack 0x%x ", reserve); - new_directive (xstrdup (b)); -} - -/* append_import simply adds the given import definition to the global - import_list. It is used by def_import. */ - -static void -append_import (symbol_name, dll_name, func_ordinal) - const char *symbol_name; - const char *dll_name; - int func_ordinal; -{ - iheadtype **pq; - iheadtype *q; - - for (pq = &import_list; *pq != NULL; pq = &(*pq)->next) - { - if (strcmp ((*pq)->dllname, dll_name) == 0) - { - q = *pq; - q->functail->next = xmalloc (sizeof (ifunctype)); - q->functail = q->functail->next; - q->functail->ord = func_ordinal; - q->functail->name = xstrdup (symbol_name); - q->functail->next = NULL; - q->nfuncs++; - return; - } - } - - q = xmalloc (sizeof (iheadtype)); - q->dllname = xstrdup (dll_name); - q->nfuncs = 1; - q->funchead = xmalloc (sizeof (ifunctype)); - q->functail = q->funchead; - q->next = NULL; - q->functail->name = xstrdup (symbol_name); - q->functail->ord = func_ordinal; - q->functail->next = NULL; - - *pq = q; -} - -/* def_import is called from within defparse.y when an IMPORT - declaration is encountered. Depending on the form of the - declaration, the module name may or may not need ".dll" to be - appended to it, the name of the function may be stored in internal - or entry, and there may or may not be an ordinal value associated - with it. */ - -/* A note regarding the parse modes: - In defparse.y we have to accept import declarations which follow - any one of the following forms: - = . - = . - . - . - Furthermore, the dll's name may or may not end with ".dll", which - complicates the parsing a little. Normally the dll's name is - passed to def_import() in the "module" parameter, but when it ends - with ".dll" it gets passed in "module" sans ".dll" and that needs - to be reappended. - - def_import gets five parameters: - APP_NAME - the name of the function in the application, if - present, or NULL if not present. - MODULE - the name of the dll, possibly sans extension (ie, '.dll'). - DLLEXT - the extension of the dll, if present, NULL if not present. - ENTRY - the name of the function in the dll, if present, or NULL. - ORD_VAL - the numerical tag of the function in the dll, if present, - or NULL. Exactly one of or must be - present (i.e., not NULL). */ - -void -def_import (app_name, module, dllext, entry, ord_val) - const char *app_name; - const char *module; - const char *dllext; - const char *entry; - int ord_val; -{ - const char *application_name; - char *buf; - - if (entry != NULL) - application_name = entry; - else - { - if (app_name != NULL) - application_name = app_name; - else - application_name = ""; - } - - if (dllext != NULL) - { - buf = (char *) alloca (strlen (module) + strlen (dllext) + 2); - sprintf (buf, "%s.%s", module, dllext); - module = buf; - } - - append_import (application_name, module, ord_val); -} - -void -def_version (major, minor) - int major; - int minor; -{ - printf ("VERSION %d.%d\n", major, minor); -} - -void -def_section (name, attr) - const char *name; - int attr; -{ - char buf[200]; - char atts[5]; - char *d = atts; - if (attr & 1) - *d++ = 'R'; - - if (attr & 2) - *d++ = 'W'; - if (attr & 4) - *d++ = 'X'; - if (attr & 8) - *d++ = 'S'; - *d++ = 0; - sprintf (buf, "-attr %s %s", name, atts); - new_directive (xstrdup (buf)); -} - -void -def_code (attr) - int attr; -{ - - def_section ("CODE", attr); -} - -void -def_data (attr) - int attr; -{ - def_section ("DATA", attr); -} - -/**********************************************************************/ - -static void -run (what, args) - const char *what; - char *args; -{ - char *s; - int pid, wait_status; - int i; - const char **argv; - char *errmsg_fmt, *errmsg_arg; - char *temp_base = choose_temp_base (); - - inform ("run: %s %s", what, args); - - /* Count the args */ - i = 0; - for (s = args; *s; s++) - if (*s == ' ') - i++; - i++; - argv = alloca (sizeof (char *) * (i + 3)); - i = 0; - argv[i++] = what; - s = args; - while (1) - { - while (*s == ' ') - ++s; - argv[i++] = s; - while (*s != ' ' && *s != 0) - s++; - if (*s == 0) - break; - *s++ = 0; - } - argv[i++] = NULL; - - pid = pexecute (argv[0], (char * const *) argv, program_name, temp_base, - &errmsg_fmt, &errmsg_arg, PEXECUTE_ONE | PEXECUTE_SEARCH); - - if (pid == -1) - { - inform (strerror (errno)); - - fatal (errmsg_fmt, errmsg_arg); - } - - pid = pwait (pid, & wait_status, 0); - - if (pid == -1) - { - /* xgettext:c-format */ - fatal (_("wait: %s"), strerror (errno)); - } - else if (WIFSIGNALED (wait_status)) - { - /* xgettext:c-format */ - fatal (_("subprocess got fatal signal %d"), WTERMSIG (wait_status)); - } - else if (WIFEXITED (wait_status)) - { - if (WEXITSTATUS (wait_status) != 0) - /* xgettext:c-format */ - non_fatal (_("%s exited with status %d"), - what, WEXITSTATUS (wait_status)); - } - else - abort (); -} - -/* Look for a list of symbols to export in the .drectve section of - ABFD. Pass each one to def_exports. */ - -static void -scan_drectve_symbols (abfd) - bfd *abfd; -{ - asection * s; - int size; - char * buf; - char * p; - char * e; - - /* Look for .drectve's */ - s = bfd_get_section_by_name (abfd, DRECTVE_SECTION_NAME); - - if (s == NULL) - return; - - size = bfd_get_section_size_before_reloc (s); - buf = xmalloc (size); - - bfd_get_section_contents (abfd, s, buf, 0, size); - - /* xgettext:c-format */ - inform (_("Sucking in info from %s section in %s"), - DRECTVE_SECTION_NAME, bfd_get_filename (abfd)); - - /* Search for -export: strings. The exported symbols can optionally - have type tags (eg., -export:foo,data), so handle those as well. - Currently only data tag is supported. */ - p = buf; - e = buf + size; - while (p < e) - { - if (p[0] == '-' - && strncmp (p, "-export:", 8) == 0) - { - char * name; - char * c; - flagword flags = BSF_FUNCTION; - - p += 8; - name = p; - while (p < e && *p != ',' && *p != ' ' && *p != '-') - p++; - c = xmalloc (p - name + 1); - memcpy (c, name, p - name); - c[p - name] = 0; - if (p < e && *p == ',') /* found type tag. */ - { - char *tag_start = ++p; - while (p < e && *p != ' ' && *p != '-') - p++; - if (strncmp (tag_start, "data", 4) == 0) - flags &= ~BSF_FUNCTION; - } - - /* FIXME: The 5th arg is for the `constant' field. - What should it be? Not that it matters since it's not - currently useful. */ - def_exports (c, 0, -1, 0, 0, ! (flags & BSF_FUNCTION)); - - if (add_stdcall_alias && strchr (c, '@')) - { - char *exported_name = xstrdup (c); - char *atsym = strchr (exported_name, '@'); - *atsym = '\0'; - /* Note: stdcall alias symbols can never be data. */ - def_exports (exported_name, xstrdup (c), -1, 0, 0, 0); - } - } - else - p++; - } - free (buf); -} - -/* Look through the symbols in MINISYMS, and add each one to list of - symbols to export. */ - -static void -scan_filtered_symbols (abfd, minisyms, symcount, size) - bfd *abfd; - PTR minisyms; - long symcount; - unsigned int size; -{ - asymbol *store; - bfd_byte *from, *fromend; - - store = bfd_make_empty_symbol (abfd); - if (store == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - from = (bfd_byte *) minisyms; - fromend = from + symcount * size; - for (; from < fromend; from += size) - { - asymbol *sym; - const char *symbol_name; - - sym = bfd_minisymbol_to_symbol (abfd, false, from, store); - if (sym == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - symbol_name = bfd_asymbol_name (sym); - if (bfd_get_symbol_leading_char (abfd) == symbol_name[0]) - ++symbol_name; - - def_exports (xstrdup (symbol_name) , 0, -1, 0, 0, - ! (sym->flags & BSF_FUNCTION)); - - if (add_stdcall_alias && strchr (symbol_name, '@')) - { - char *exported_name = xstrdup (symbol_name); - char *atsym = strchr (exported_name, '@'); - *atsym = '\0'; - /* Note: stdcall alias symbols can never be data. */ - def_exports (exported_name, xstrdup (symbol_name), -1, 0, 0, 0); - } - } -} - -/* Add a list of symbols to exclude. */ - -static void -add_excludes (new_excludes) - const char *new_excludes; -{ - char *local_copy; - char *exclude_string; - - local_copy = xstrdup (new_excludes); - - exclude_string = strtok (local_copy, ",:"); - for (; exclude_string; exclude_string = strtok (NULL, ",:")) - { - struct string_list *new_exclude; - - new_exclude = ((struct string_list *) - xmalloc (sizeof (struct string_list))); - new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 2); - /* FIXME: Is it always right to add a leading underscore? */ - sprintf (new_exclude->string, "_%s", exclude_string); - new_exclude->next = excludes; - excludes = new_exclude; - - /* xgettext:c-format */ - inform (_("Excluding symbol: %s"), exclude_string); - } - - free (local_copy); -} - -/* See if STRING is on the list of symbols to exclude. */ - -static boolean -match_exclude (string) - const char *string; -{ - struct string_list *excl_item; - - for (excl_item = excludes; excl_item; excl_item = excl_item->next) - if (strcmp (string, excl_item->string) == 0) - return true; - return false; -} - -/* Add the default list of symbols to exclude. */ - -static void -set_default_excludes (void) -{ - add_excludes (default_excludes); -} - -/* Choose which symbols to export. */ - -static long -filter_symbols (abfd, minisyms, symcount, size) - bfd *abfd; - PTR minisyms; - long symcount; - unsigned int size; -{ - bfd_byte *from, *fromend, *to; - asymbol *store; - - store = bfd_make_empty_symbol (abfd); - if (store == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - from = (bfd_byte *) minisyms; - fromend = from + symcount * size; - to = (bfd_byte *) minisyms; - - for (; from < fromend; from += size) - { - int keep = 0; - asymbol *sym; - - sym = bfd_minisymbol_to_symbol (abfd, false, (const PTR) from, store); - if (sym == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - /* Check for external and defined only symbols. */ - keep = (((sym->flags & BSF_GLOBAL) != 0 - || (sym->flags & BSF_WEAK) != 0 - || bfd_is_com_section (sym->section)) - && ! bfd_is_und_section (sym->section)); - - keep = keep && ! match_exclude (sym->name); - - if (keep) - { - memcpy (to, from, size); - to += size; - } - } - - return (to - (bfd_byte *) minisyms) / size; -} - -/* Export all symbols in ABFD, except for ones we were told not to - export. */ - -static void -scan_all_symbols (abfd) - bfd *abfd; -{ - long symcount; - PTR minisyms; - unsigned int size; - - /* Ignore bfds with an import descriptor table. We assume that any - such BFD contains symbols which are exported from another DLL, - and we don't want to reexport them from here. */ - if (bfd_get_section_by_name (abfd, ".idata$4")) - return; - - if (! (bfd_get_file_flags (abfd) & HAS_SYMS)) - { - /* xgettext:c-format */ - non_fatal (_("%s: no symbols"), bfd_get_filename (abfd)); - return; - } - - symcount = bfd_read_minisymbols (abfd, false, &minisyms, &size); - if (symcount < 0) - bfd_fatal (bfd_get_filename (abfd)); - - if (symcount == 0) - { - /* xgettext:c-format */ - non_fatal (_("%s: no symbols"), bfd_get_filename (abfd)); - return; - } - - /* Discard the symbols we don't want to export. It's OK to do this - in place; we'll free the storage anyway. */ - - symcount = filter_symbols (abfd, minisyms, symcount, size); - scan_filtered_symbols (abfd, minisyms, symcount, size); - - free (minisyms); -} - -/* Look at the object file to decide which symbols to export. */ - -static void -scan_open_obj_file (abfd) - bfd *abfd; -{ - if (export_all_symbols) - scan_all_symbols (abfd); - else - scan_drectve_symbols (abfd); - - /* FIXME: we ought to read in and block out the base relocations */ - - /* xgettext:c-format */ - inform (_("Done reading %s"), bfd_get_filename (abfd)); -} - -static void -scan_obj_file (filename) - const char *filename; -{ - bfd * f = bfd_openr (filename, 0); - - if (!f) - /* xgettext:c-format */ - fatal (_("Unable to open object file: %s"), filename); - - /* xgettext:c-format */ - inform (_("Scanning object file %s"), filename); - - if (bfd_check_format (f, bfd_archive)) - { - bfd *arfile = bfd_openr_next_archived_file (f, 0); - while (arfile) - { - if (bfd_check_format (arfile, bfd_object)) - scan_open_obj_file (arfile); - bfd_close (arfile); - arfile = bfd_openr_next_archived_file (f, arfile); - } - -#ifdef DLLTOOL_MCORE_ELF - if (mcore_elf_out_file) - inform (_("Cannot produce mcore-elf dll from archive file: %s"), filename); -#endif - } - else if (bfd_check_format (f, bfd_object)) - { - scan_open_obj_file (f); - -#ifdef DLLTOOL_MCORE_ELF - if (mcore_elf_out_file) - mcore_elf_cache_filename ((char *) filename); -#endif - } - - bfd_close (f); -} - -/**********************************************************************/ - -static void -dump_def_info (f) - FILE *f; -{ - int i; - export_type *exp; - fprintf (f, "%s ", ASM_C); - for (i = 0; oav[i]; i++) - fprintf (f, "%s ", oav[i]); - fprintf (f, "\n"); - for (i = 0, exp = d_exports; exp; i++, exp = exp->next) - { - fprintf (f, "%s %d = %s %s @ %d %s%s%s\n", - ASM_C, - i, - exp->name, - exp->internal_name, - exp->ordinal, - exp->noname ? "NONAME " : "", - exp->constant ? "CONSTANT" : "", - exp->data ? "DATA" : ""); - } -} - -/* Generate the .exp file */ - -static int -sfunc (a, b) - const void *a; - const void *b; -{ - return *(const long *) a - *(const long *) b; -} - -static void -flush_page (f, need, page_addr, on_page) - FILE *f; - long *need; - int page_addr; - int on_page; -{ - int i; - - /* Flush this page */ - fprintf (f, "\t%s\t0x%08x\t%s Starting RVA for chunk\n", - ASM_LONG, - page_addr, - ASM_C); - fprintf (f, "\t%s\t0x%x\t%s Size of block\n", - ASM_LONG, - (on_page * 2) + (on_page & 1) * 2 + 8, - ASM_C); - - for (i = 0; i < on_page; i++) - { - long needed = need[i]; - - if (needed) - needed = ((needed - page_addr) | 0x3000) & 0xffff; - - fprintf (f, "\t%s\t0x%lx\n", ASM_SHORT, needed); - } - - /* And padding */ - if (on_page & 1) - fprintf (f, "\t%s\t0x%x\n", ASM_SHORT, 0 | 0x0000); -} - -static void -gen_def_file () -{ - int i; - export_type *exp; - - inform (_("Adding exports to output file")); - - fprintf (output_def, ";"); - for (i = 0; oav[i]; i++) - fprintf (output_def, " %s", oav[i]); - - fprintf (output_def, "\nEXPORTS\n"); - - for (i = 0, exp = d_exports; exp; i++, exp = exp->next) - { - char *quote = strchr (exp->name, '.') ? "\"" : ""; - char *res = cplus_demangle (exp->internal_name, DMGL_ANSI | DMGL_PARAMS); - - if (strcmp (exp->name, exp->internal_name) == 0) - { - - fprintf (output_def, "\t%s%s%s @ %d%s%s ; %s\n", - quote, - exp->name, - quote, - exp->ordinal, - exp->noname ? " NONAME" : "", - exp->data ? " DATA" : "", - res ? res : ""); - } - else - { - char *quote1 = strchr (exp->internal_name, '.') ? "\"" : ""; - /* char *alias = */ - fprintf (output_def, "\t%s%s%s = %s%s%s @ %d%s%s ; %s\n", - quote, - exp->name, - quote, - quote1, - exp->internal_name, - quote1, - exp->ordinal, - exp->noname ? " NONAME" : "", - exp->data ? " DATA" : "", - res ? res : ""); - } - if (res) - free (res); - } - - inform (_("Added exports to output file")); -} - -/* generate_idata_ofile generates the portable assembly source code - for the idata sections. It appends the source code to the end of - the file. */ - -static void -generate_idata_ofile (filvar) - FILE *filvar; -{ - iheadtype *headptr; - ifunctype *funcptr; - int headindex; - int funcindex; - int nheads; - - if (import_list == NULL) - return; - - fprintf (filvar, "%s Import data sections\n", ASM_C); - fprintf (filvar, "\n\t.section\t.idata$2\n"); - fprintf (filvar, "\t%s\tdoi_idata\n", ASM_GLOBAL); - fprintf (filvar, "doi_idata:\n"); - - nheads = 0; - for (headptr = import_list; headptr != NULL; headptr = headptr->next) - { - fprintf (filvar, "\t%slistone%d%s\t%s %s\n", - ASM_RVA_BEFORE, nheads, ASM_RVA_AFTER, - ASM_C, headptr->dllname); - fprintf (filvar, "\t%s\t0\n", ASM_LONG); - fprintf (filvar, "\t%s\t0\n", ASM_LONG); - fprintf (filvar, "\t%sdllname%d%s\n", - ASM_RVA_BEFORE, nheads, ASM_RVA_AFTER); - fprintf (filvar, "\t%slisttwo%d%s\n\n", - ASM_RVA_BEFORE, nheads, ASM_RVA_AFTER); - nheads++; - } - - fprintf (filvar, "\t%s\t0\n", ASM_LONG); /* NULL record at */ - fprintf (filvar, "\t%s\t0\n", ASM_LONG); /* end of idata$2 */ - fprintf (filvar, "\t%s\t0\n", ASM_LONG); /* section */ - fprintf (filvar, "\t%s\t0\n", ASM_LONG); - fprintf (filvar, "\t%s\t0\n", ASM_LONG); - - fprintf (filvar, "\n\t.section\t.idata$4\n"); - headindex = 0; - for (headptr = import_list; headptr != NULL; headptr = headptr->next) - { - fprintf (filvar, "listone%d:\n", headindex); - for ( funcindex = 0; funcindex < headptr->nfuncs; funcindex++ ) - fprintf (filvar, "\t%sfuncptr%d_%d%s\n", - ASM_RVA_BEFORE, headindex, funcindex, ASM_RVA_AFTER); - fprintf (filvar,"\t%s\t0\n", ASM_LONG); /* NULL terminating list */ - headindex++; - } - - fprintf (filvar, "\n\t.section\t.idata$5\n"); - headindex = 0; - for (headptr = import_list; headptr != NULL; headptr = headptr->next) - { - fprintf (filvar, "listtwo%d:\n", headindex); - for ( funcindex = 0; funcindex < headptr->nfuncs; funcindex++ ) - fprintf (filvar, "\t%sfuncptr%d_%d%s\n", - ASM_RVA_BEFORE, headindex, funcindex, ASM_RVA_AFTER); - fprintf (filvar, "\t%s\t0\n", ASM_LONG); /* NULL terminating list */ - headindex++; - } - - fprintf (filvar, "\n\t.section\t.idata$6\n"); - headindex = 0; - for (headptr = import_list; headptr != NULL; headptr = headptr->next) - { - funcindex = 0; - for (funcptr = headptr->funchead; funcptr != NULL; - funcptr = funcptr->next) - { - fprintf (filvar,"funcptr%d_%d:\n", headindex, funcindex); - fprintf (filvar,"\t%s\t%d\n", ASM_SHORT, - ((funcptr->ord) & 0xFFFF)); - fprintf (filvar,"\t%s\t\"%s\"\n", ASM_TEXT, funcptr->name); - fprintf (filvar,"\t%s\t0\n", ASM_BYTE); - funcindex++; - } - headindex++; - } - - fprintf (filvar, "\n\t.section\t.idata$7\n"); - headindex = 0; - for (headptr = import_list; headptr != NULL; headptr = headptr->next) - { - fprintf (filvar,"dllname%d:\n", headindex); - fprintf (filvar,"\t%s\t\"%s\"\n", ASM_TEXT, headptr->dllname); - fprintf (filvar,"\t%s\t0\n", ASM_BYTE); - headindex++; - } -} - -/* Assemble the specified file. */ -static void -assemble_file (source, dest) - const char * source; - const char * dest; -{ - char * cmd; - - cmd = (char *) alloca (strlen (ASM_SWITCHES) + strlen (as_flags) - + strlen (source) + strlen (dest) + 50); - - sprintf (cmd, "%s %s -o %s %s", ASM_SWITCHES, as_flags, dest, source); - - run (as_name, cmd); -} - -static void -gen_exp_file () -{ - FILE *f; - int i; - export_type *exp; - dlist_type *dl; - - /* xgettext:c-format */ - inform (_("Generating export file: %s"), exp_name); - - f = fopen (TMP_ASM, FOPEN_WT); - if (!f) - /* xgettext:c-format */ - fatal (_("Unable to open temporary assembler file: %s"), TMP_ASM); - - /* xgettext:c-format */ - inform (_("Opened temporary file: %s"), TMP_ASM); - - dump_def_info (f); - - if (d_exports) - { - fprintf (f, "\t.section .edata\n\n"); - fprintf (f, "\t%s 0 %s Allways 0\n", ASM_LONG, ASM_C); - fprintf (f, "\t%s 0x%lx %s Time and date\n", ASM_LONG, (long) time(0), - ASM_C); - fprintf (f, "\t%s 0 %s Major and Minor version\n", ASM_LONG, ASM_C); - fprintf (f, "\t%sname%s %s Ptr to name of dll\n", ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C); - fprintf (f, "\t%s %d %s Starting ordinal of exports\n", ASM_LONG, d_low_ord, ASM_C); - - - fprintf (f, "\t%s %d %s Number of functions\n", ASM_LONG, d_high_ord - d_low_ord + 1, ASM_C); - fprintf(f,"\t%s named funcs %d, low ord %d, high ord %d\n", - ASM_C, - d_named_nfuncs, d_low_ord, d_high_ord); - fprintf (f, "\t%s %d %s Number of names\n", ASM_LONG, - show_allnames ? d_high_ord - d_low_ord + 1 : d_named_nfuncs, ASM_C); - fprintf (f, "\t%safuncs%s %s Address of functions\n", ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C); - - fprintf (f, "\t%sanames%s %s Address of Name Pointer Table\n", - ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C); - - fprintf (f, "\t%sanords%s %s Address of ordinals\n", ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C); - - fprintf (f, "name: %s \"%s\"\n", ASM_TEXT, dll_name); - - - fprintf(f,"%s Export address Table\n", ASM_C); - fprintf(f,"\t%s\n", ASM_ALIGN_LONG); - fprintf (f, "afuncs:\n"); - i = d_low_ord; - - for (exp = d_exports; exp; exp = exp->next) - { - if (exp->ordinal != i) - { -#if 0 - fprintf (f, "\t%s\t%d\t%s %d..%d missing\n", - ASM_SPACE, - (exp->ordinal - i) * 4, - ASM_C, - i, exp->ordinal - 1); - i = exp->ordinal; -#endif - while (i < exp->ordinal) - { - fprintf(f,"\t%s\t0\n", ASM_LONG); - i++; - } - } - fprintf (f, "\t%s%s%s%s\t%s %d\n", ASM_RVA_BEFORE, - ASM_PREFIX, - exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal); - i++; - } - - fprintf (f,"%s Export Name Pointer Table\n", ASM_C); - fprintf (f, "anames:\n"); - - for (i = 0; (exp = d_exports_lexically[i]); i++) - { - if (!exp->noname || show_allnames) - fprintf (f, "\t%sn%d%s\n", - ASM_RVA_BEFORE, exp->ordinal, ASM_RVA_AFTER); - } - - fprintf (f,"%s Export Oridinal Table\n", ASM_C); - fprintf (f, "anords:\n"); - for (i = 0; (exp = d_exports_lexically[i]); i++) - { - if (!exp->noname || show_allnames) - fprintf (f, "\t%s %d\n", ASM_SHORT, exp->ordinal - d_low_ord); - } - - fprintf(f,"%s Export Name Table\n", ASM_C); - for (i = 0; (exp = d_exports_lexically[i]); i++) - if (!exp->noname || show_allnames) - fprintf (f, "n%d: %s \"%s\"\n", - exp->ordinal, ASM_TEXT, exp->name); - - if (a_list) - { - fprintf (f, "\t.section %s\n", DRECTVE_SECTION_NAME); - for (dl = a_list; dl; dl = dl->next) - { - fprintf (f, "\t%s\t\"%s\"\n", ASM_TEXT, dl->text); - } - } - - if (d_list) - { - fprintf (f, "\t.section .rdata\n"); - for (dl = d_list; dl; dl = dl->next) - { - char *p; - int l; - - /* We don't output as ascii because there can - be quote characters in the string. */ - l = 0; - for (p = dl->text; *p; p++) - { - if (l == 0) - fprintf (f, "\t%s\t", ASM_BYTE); - else - fprintf (f, ","); - fprintf (f, "%d", *p); - if (p[1] == 0) - { - fprintf (f, ",0\n"); - break; - } - if (++l == 10) - { - fprintf (f, "\n"); - l = 0; - } - } - } - } - } - - - /* Add to the output file a way of getting to the exported names - without using the import library. */ - if (add_indirect) - { - fprintf (f, "\t.section\t.rdata\n"); - for (i = 0, exp = d_exports; exp; i++, exp = exp->next) - if (!exp->noname || show_allnames) - { - /* We use a single underscore for MS compatibility, and a - double underscore for backward compatibility with old - cygwin releases. */ - if (create_compat_implib) - fprintf (f, "\t%s\t__imp_%s\n", ASM_GLOBAL, exp->name); - fprintf (f, "\t%s\t_imp__%s\n", ASM_GLOBAL, exp->name); - if (create_compat_implib) - fprintf (f, "__imp_%s:\n", exp->name); - fprintf (f, "_imp__%s:\n", exp->name); - fprintf (f, "\t%s\t%s\n", ASM_LONG, exp->name); - } - } - - /* Dump the reloc section if a base file is provided */ - if (base_file) - { - int addr; - long need[PAGE_SIZE]; - long page_addr; - int numbytes; - int num_entries; - long *copy; - int j; - int on_page; - fprintf (f, "\t.section\t.init\n"); - fprintf (f, "lab:\n"); - - fseek (base_file, 0, SEEK_END); - numbytes = ftell (base_file); - fseek (base_file, 0, SEEK_SET); - copy = xmalloc (numbytes); - fread (copy, 1, numbytes, base_file); - num_entries = numbytes / sizeof (long); - - - fprintf (f, "\t.section\t.reloc\n"); - if (num_entries) - { - int src; - int dst = 0; - int last = -1; - qsort (copy, num_entries, sizeof (long), sfunc); - /* Delete duplcates */ - for (src = 0; src < num_entries; src++) - { - if (last != copy[src]) - last = copy[dst++] = copy[src]; - } - num_entries = dst; - addr = copy[0]; - page_addr = addr & PAGE_MASK; /* work out the page addr */ - on_page = 0; - for (j = 0; j < num_entries; j++) - { - addr = copy[j]; - if ((addr & PAGE_MASK) != page_addr) - { - flush_page (f, need, page_addr, on_page); - on_page = 0; - page_addr = addr & PAGE_MASK; - } - need[on_page++] = addr; - } - flush_page (f, need, page_addr, on_page); - -/* fprintf (f, "\t%s\t0,0\t%s End\n", ASM_LONG, ASM_C);*/ - } - } - - generate_idata_ofile (f); - - fclose (f); - - /* assemble the file */ - assemble_file (TMP_ASM, exp_name); - - if (dontdeltemps == 0) - unlink (TMP_ASM); - - inform (_("Generated exports file")); -} - -static const char * -xlate (name) - const char *name; -{ - if (add_underscore) - { - char *copy = xmalloc (strlen (name) + 2); - copy[0] = '_'; - strcpy (copy + 1, name); - name = copy; - } - - if (killat) - { - char *p; - p = strchr (name, '@'); - if (p) - *p = 0; - } - return name; -} - -/**********************************************************************/ - -#if 0 - -static void -dump_iat (f, exp) - FILE *f; - export_type *exp; -{ - if (exp->noname && !show_allnames ) - { - fprintf (f, "\t%s\t0x%08x\n", - ASM_LONG, - exp->ordinal | 0x80000000); /* hint or orindal ?? */ - } - else - { - fprintf (f, "\t%sID%d%s\n", ASM_RVA_BEFORE, - exp->ordinal, - ASM_RVA_AFTER); - } -} - -#endif - -typedef struct -{ - int id; - const char *name; - int flags; - int align; - asection *sec; - asymbol *sym; - asymbol **sympp; - int size; - unsigned char *data; -} sinfo; - -#ifndef DLLTOOL_PPC - -#define TEXT 0 -#define DATA 1 -#define BSS 2 -#define IDATA7 3 -#define IDATA5 4 -#define IDATA4 5 -#define IDATA6 6 - -#define NSECS 7 - -#define INIT_SEC_DATA(id, name, flags, align) { id, name, flags, align, NULL, NULL, NULL, 0, NULL } -static sinfo secdata[NSECS] = -{ - INIT_SEC_DATA (TEXT, ".text", SEC_CODE | SEC_HAS_CONTENTS, 2), - INIT_SEC_DATA (DATA, ".data", SEC_DATA, 2), - INIT_SEC_DATA (BSS, ".bss", 0, 2), - INIT_SEC_DATA (IDATA7, ".idata$7", SEC_HAS_CONTENTS, 2), - INIT_SEC_DATA (IDATA5, ".idata$5", SEC_HAS_CONTENTS, 2), - INIT_SEC_DATA (IDATA4, ".idata$4", SEC_HAS_CONTENTS, 2), - INIT_SEC_DATA (IDATA6, ".idata$6", SEC_HAS_CONTENTS, 1) -}; - -#else - -/* Sections numbered to make the order the same as other PowerPC NT */ -/* compilers. This also keeps funny alignment thingies from happening. */ -#define TEXT 0 -#define PDATA 1 -#define RDATA 2 -#define IDATA5 3 -#define IDATA4 4 -#define IDATA6 5 -#define IDATA7 6 -#define DATA 7 -#define BSS 8 - -#define NSECS 9 - -static sinfo secdata[NSECS] = -{ - { TEXT, ".text", SEC_CODE | SEC_HAS_CONTENTS, 3}, - { PDATA, ".pdata", SEC_HAS_CONTENTS, 2}, - { RDATA, ".reldata", SEC_HAS_CONTENTS, 2}, - { IDATA5, ".idata$5", SEC_HAS_CONTENTS, 2}, - { IDATA4, ".idata$4", SEC_HAS_CONTENTS, 2}, - { IDATA6, ".idata$6", SEC_HAS_CONTENTS, 1}, - { IDATA7, ".idata$7", SEC_HAS_CONTENTS, 2}, - { DATA, ".data", SEC_DATA, 2}, - { BSS, ".bss", 0, 2} -}; - -#endif - -/* -This is what we're trying to make. We generate the imp symbols with -both single and double underscores, for compatibility. - - .text - .global _GetFileVersionInfoSizeW@8 - .global __imp_GetFileVersionInfoSizeW@8 -_GetFileVersionInfoSizeW@8: - jmp * __imp_GetFileVersionInfoSizeW@8 - .section .idata$7 # To force loading of head - .long __version_a_head -# Import Address Table - .section .idata$5 -__imp_GetFileVersionInfoSizeW@8: - .rva ID2 - -# Import Lookup Table - .section .idata$4 - .rva ID2 -# Hint/Name table - .section .idata$6 -ID2: .short 2 - .asciz "GetFileVersionInfoSizeW" - - -For the PowerPC, here's the variation on the above scheme: - -# Rather than a simple "jmp *", the code to get to the dll function -# looks like: - .text - lwz r11,[tocv]__imp_function_name(r2) -# RELOC: 00000000 TOCREL16,TOCDEFN __imp_function_name - lwz r12,0(r11) - stw r2,4(r1) - mtctr r12 - lwz r2,4(r11) - bctr -*/ - -static char * -make_label (prefix, name) - const char *prefix; - const char *name; -{ - int len = strlen (ASM_PREFIX) + strlen (prefix) + strlen (name); - char *copy = xmalloc (len +1 ); - strcpy (copy, ASM_PREFIX); - strcat (copy, prefix); - strcat (copy, name); - return copy; -} - -static bfd * -make_one_lib_file (exp, i) - export_type *exp; - int i; -{ -#if 0 - { - char *name; - FILE *f; - const char *prefix = "d"; - char *dest; - - name = (char *) alloca (strlen (prefix) + 10); - sprintf (name, "%ss%05d.s", prefix, i); - f = fopen (name, FOPEN_WT); - fprintf (f, "\t.text\n"); - fprintf (f, "\t%s\t%s%s\n", ASM_GLOBAL, ASM_PREFIX, exp->name); - if (create_compat_implib) - fprintf (f, "\t%s\t__imp_%s\n", ASM_GLOBAL, exp->name); - fprintf (f, "\t%s\t_imp__%s\n", ASM_GLOBAL, exp->name); - if (create_compat_implib) - fprintf (f, "%s%s:\n\t%s\t__imp_%s\n", ASM_PREFIX, - exp->name, ASM_JUMP, exp->name); - - fprintf (f, "\t.section\t.idata$7\t%s To force loading of head\n", ASM_C); - fprintf (f, "\t%s\t%s\n", ASM_LONG, head_label); - - - fprintf (f,"%s Import Address Table\n", ASM_C); - - fprintf (f, "\t.section .idata$5\n"); - if (create_compat_implib) - fprintf (f, "__imp_%s:\n", exp->name); - fprintf (f, "_imp__%s:\n", exp->name); - - dump_iat (f, exp); - - fprintf (f, "\n%s Import Lookup Table\n", ASM_C); - fprintf (f, "\t.section .idata$4\n"); - - dump_iat (f, exp); - - if(!exp->noname || show_allnames) - { - fprintf (f, "%s Hint/Name table\n", ASM_C); - fprintf (f, "\t.section .idata$6\n"); - fprintf (f, "ID%d:\t%s\t%d\n", exp->ordinal, ASM_SHORT, exp->hint); - fprintf (f, "\t%s\t\"%s\"\n", ASM_TEXT, xlate (exp->name)); - } - - fclose (f); - - dest = (char *) alloca (strlen (prefix) + 10); - sprintf (dest, "%ss%05d.o", prefix, i); - assemble_file (name, dest); - } -#else /* if 0 */ - { - bfd * abfd; - asymbol * exp_label; - asymbol * iname; - asymbol * iname2; - asymbol * iname_lab; - asymbol ** iname_lab_pp; - asymbol ** iname_pp; -#ifdef DLLTOOL_PPC - asymbol ** fn_pp; - asymbol ** toc_pp; -#define EXTRA 2 -#endif -#ifndef EXTRA -#define EXTRA 0 -#endif - asymbol * ptrs[NSECS + 4 + EXTRA + 1]; - - char * outname = xmalloc (10); - int oidx = 0; - - - sprintf (outname, "%s%05d.o", TMP_STUB, i); - - abfd = bfd_openw (outname, HOW_BFD_WRITE_TARGET); - - if (!abfd) - /* xgettext:c-format */ - fatal (_("bfd_open failed open stub file: %s"), outname); - - /* xgettext:c-format */ - inform (_("Creating stub file: %s"), outname); - - bfd_set_format (abfd, bfd_object); - bfd_set_arch_mach (abfd, HOW_BFD_ARCH, 0); - -#ifdef DLLTOOL_ARM - if (machine == MARM_INTERWORK || machine == MTHUMB) - bfd_set_private_flags (abfd, F_INTERWORK); -#endif - - /* First make symbols for the sections */ - for (i = 0; i < NSECS; i++) - { - sinfo *si = secdata + i; - if (si->id != i) - abort(); - si->sec = bfd_make_section_old_way (abfd, si->name); - bfd_set_section_flags (abfd, - si->sec, - si->flags); - - bfd_set_section_alignment(abfd, si->sec, si->align); - si->sec->output_section = si->sec; - si->sym = bfd_make_empty_symbol(abfd); - si->sym->name = si->sec->name; - si->sym->section = si->sec; - si->sym->flags = BSF_LOCAL; - si->sym->value = 0; - ptrs[oidx] = si->sym; - si->sympp = ptrs + oidx; - si->size = 0; - si->data = NULL; - - oidx++; - } - - if (! exp->data) - { - exp_label = bfd_make_empty_symbol (abfd); - exp_label->name = make_label ("", exp->name); - - /* On PowerPC, the function name points to a descriptor in - the rdata section, the first element of which is a - pointer to the code (..function_name), and the second - points to the .toc */ -#ifdef DLLTOOL_PPC - if (machine == MPPC) - exp_label->section = secdata[RDATA].sec; - else -#endif - exp_label->section = secdata[TEXT].sec; - - exp_label->flags = BSF_GLOBAL; - exp_label->value = 0; - -#ifdef DLLTOOL_ARM - if (machine == MTHUMB) - bfd_coff_set_symbol_class (abfd, exp_label, C_THUMBEXTFUNC); -#endif - ptrs[oidx++] = exp_label; - } - - /* Generate imp symbols with one underscore for Microsoft - compatibility, and with two underscores for backward - compatibility with old versions of cygwin. */ - if (create_compat_implib) - { - iname = bfd_make_empty_symbol (abfd); - iname->name = make_label ("__imp_", exp->name); - iname->section = secdata[IDATA5].sec; - iname->flags = BSF_GLOBAL; - iname->value = 0; - } - - iname2 = bfd_make_empty_symbol (abfd); - iname2->name = make_label ("_imp__", exp->name); - iname2->section = secdata[IDATA5].sec; - iname2->flags = BSF_GLOBAL; - iname2->value = 0; - - iname_lab = bfd_make_empty_symbol(abfd); - - iname_lab->name = head_label; - iname_lab->section = (asection *)&bfd_und_section; - iname_lab->flags = 0; - iname_lab->value = 0; - - - iname_pp = ptrs + oidx; - if (create_compat_implib) - ptrs[oidx++] = iname; - ptrs[oidx++] = iname2; - - iname_lab_pp = ptrs + oidx; - ptrs[oidx++] = iname_lab; - -#ifdef DLLTOOL_PPC - /* The symbol refering to the code (.text) */ - { - asymbol *function_name; - - function_name = bfd_make_empty_symbol(abfd); - function_name->name = make_label ("..", exp->name); - function_name->section = secdata[TEXT].sec; - function_name->flags = BSF_GLOBAL; - function_name->value = 0; - - fn_pp = ptrs + oidx; - ptrs[oidx++] = function_name; - } - - /* The .toc symbol */ - { - asymbol *toc_symbol; /* The .toc symbol */ - - toc_symbol = bfd_make_empty_symbol (abfd); - toc_symbol->name = make_label (".", "toc"); - toc_symbol->section = (asection *)&bfd_und_section; - toc_symbol->flags = BSF_GLOBAL; - toc_symbol->value = 0; - - toc_pp = ptrs + oidx; - ptrs[oidx++] = toc_symbol; - } -#endif - - ptrs[oidx] = 0; - - for (i = 0; i < NSECS; i++) - { - sinfo *si = secdata + i; - asection *sec = si->sec; - arelent *rel; - arelent **rpp; - - switch (i) - { - case TEXT: - if (! exp->data) - { - si->size = HOW_JTAB_SIZE; - si->data = xmalloc (HOW_JTAB_SIZE); - memcpy (si->data, HOW_JTAB, HOW_JTAB_SIZE); - - /* add the reloc into idata$5 */ - rel = xmalloc (sizeof (arelent)); - - rpp = xmalloc (sizeof (arelent *) * 2); - rpp[0] = rel; - rpp[1] = 0; - - rel->address = HOW_JTAB_ROFF; - rel->addend = 0; - - if (machine == MPPC) - { - rel->howto = bfd_reloc_type_lookup (abfd, - BFD_RELOC_16_GOTOFF); - rel->sym_ptr_ptr = iname_pp; - } - else - { - rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - rel->sym_ptr_ptr = secdata[IDATA5].sympp; - } - sec->orelocation = rpp; - sec->reloc_count = 1; - } - break; - case IDATA4: - case IDATA5: - /* An idata$4 or idata$5 is one word long, and has an - rva to idata$6 */ - - si->data = xmalloc (4); - si->size = 4; - - if (exp->noname) - { - si->data[0] = exp->ordinal ; - si->data[1] = exp->ordinal >> 8; - si->data[2] = exp->ordinal >> 16; - si->data[3] = 0x80; - } - else - { - sec->reloc_count = 1; - memset (si->data, 0, si->size); - rel = xmalloc (sizeof (arelent)); - rpp = xmalloc (sizeof (arelent *) * 2); - rpp[0] = rel; - rpp[1] = 0; - rel->address = 0; - rel->addend = 0; - rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_RVA); - rel->sym_ptr_ptr = secdata[IDATA6].sympp; - sec->orelocation = rpp; - } - - break; - - case IDATA6: - if (!exp->noname) - { - /* This used to add 1 to exp->hint. I don't know - why it did that, and it does not match what I see - in programs compiled with the MS tools. */ - int idx = exp->hint; - si->size = strlen (xlate (exp->name)) + 3; - si->data = xmalloc (si->size); - si->data[0] = idx & 0xff; - si->data[1] = idx >> 8; - strcpy (si->data + 2, xlate (exp->name)); - } - break; - case IDATA7: - si->size = 4; - si->data =xmalloc(4); - memset (si->data, 0, si->size); - rel = xmalloc (sizeof (arelent)); - rpp = xmalloc (sizeof (arelent *) * 2); - rpp[0] = rel; - rel->address = 0; - rel->addend = 0; - rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_RVA); - rel->sym_ptr_ptr = iname_lab_pp; - sec->orelocation = rpp; - sec->reloc_count = 1; - break; - -#ifdef DLLTOOL_PPC - case PDATA: - { - /* The .pdata section is 5 words long. */ - /* Think of it as: */ - /* struct */ - /* { */ - /* bfd_vma BeginAddress, [0x00] */ - /* EndAddress, [0x04] */ - /* ExceptionHandler, [0x08] */ - /* HandlerData, [0x0c] */ - /* PrologEndAddress; [0x10] */ - /* }; */ - - /* So this pdata section setups up this as a glue linkage to - a dll routine. There are a number of house keeping things - we need to do: - - 1. In the name of glue trickery, the ADDR32 relocs for 0, - 4, and 0x10 are set to point to the same place: - "..function_name". - 2. There is one more reloc needed in the pdata section. - The actual glue instruction to restore the toc on - return is saved as the offset in an IMGLUE reloc. - So we need a total of four relocs for this section. - - 3. Lastly, the HandlerData field is set to 0x03, to indicate - that this is a glue routine. - */ - arelent *imglue, *ba_rel, *ea_rel, *pea_rel; - - /* alignment must be set to 2**2 or you get extra stuff */ - bfd_set_section_alignment(abfd, sec, 2); - - si->size = 4 * 5; - si->data =xmalloc(4 * 5); - memset (si->data, 0, si->size); - rpp = xmalloc (sizeof (arelent *) * 5); - rpp[0] = imglue = xmalloc (sizeof (arelent)); - rpp[1] = ba_rel = xmalloc (sizeof (arelent)); - rpp[2] = ea_rel = xmalloc (sizeof (arelent)); - rpp[3] = pea_rel = xmalloc (sizeof (arelent)); - rpp[4] = 0; - - /* stick the toc reload instruction in the glue reloc */ - bfd_put_32(abfd, ppc_glue_insn, (char *) &imglue->address); - - imglue->addend = 0; - imglue->howto = bfd_reloc_type_lookup (abfd, - BFD_RELOC_32_GOTOFF); - imglue->sym_ptr_ptr = fn_pp; - - ba_rel->address = 0; - ba_rel->addend = 0; - ba_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - ba_rel->sym_ptr_ptr = fn_pp; - - bfd_put_32(abfd, 0x18, si->data + 0x04); - ea_rel->address = 4; - ea_rel->addend = 0; - ea_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - ea_rel->sym_ptr_ptr = fn_pp; - - /* mark it as glue */ - bfd_put_32(abfd, 0x03, si->data + 0x0c); - - /* mark the prolog end address */ - bfd_put_32(abfd, 0x0D, si->data + 0x10); - pea_rel->address = 0x10; - pea_rel->addend = 0; - pea_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - pea_rel->sym_ptr_ptr = fn_pp; - - sec->orelocation = rpp; - sec->reloc_count = 4; - break; - } - case RDATA: - /* Each external function in a PowerPC PE file has a two word - descriptor consisting of: - 1. The address of the code. - 2. The address of the appropriate .toc - We use relocs to build this. - */ - - si->size = 8; - si->data = xmalloc (8); - memset (si->data, 0, si->size); - - rpp = xmalloc (sizeof (arelent *) * 3); - rpp[0] = rel = xmalloc (sizeof (arelent)); - rpp[1] = xmalloc (sizeof (arelent)); - rpp[2] = 0; - - rel->address = 0; - rel->addend = 0; - rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - rel->sym_ptr_ptr = fn_pp; - - rel = rpp[1]; - - rel->address = 4; - rel->addend = 0; - rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32); - rel->sym_ptr_ptr = toc_pp; - - sec->orelocation = rpp; - sec->reloc_count = 2; - break; -#endif /* DLLTOOL_PPC */ - } - } - - { - bfd_vma vma = 0; - /* Size up all the sections */ - for (i = 0; i < NSECS; i++) - { - sinfo *si = secdata + i; - - bfd_set_section_size (abfd, si->sec, si->size); - bfd_set_section_vma (abfd, si->sec, vma); - -/* vma += si->size;*/ - } - } - /* Write them out */ - for (i = 0; i < NSECS; i++) - { - sinfo *si = secdata + i; - - if (i == IDATA5 && no_idata5) - continue; - - if (i == IDATA4 && no_idata4) - continue; - - bfd_set_section_contents (abfd, si->sec, - si->data, 0, - si->size); - } - - bfd_set_symtab (abfd, ptrs, oidx); - bfd_close (abfd); - abfd = bfd_openr (outname, HOW_BFD_READ_TARGET); - return abfd; - } -#endif -} - -static bfd * -make_head () -{ - FILE *f = fopen (TMP_HEAD_S, FOPEN_WT); - - if (f == NULL) - { - fatal (_("failed to open temporary head file: %s"), TMP_HEAD_S); - return NULL; - } - - fprintf (f, "%s IMAGE_IMPORT_DESCRIPTOR\n", ASM_C); - fprintf (f, "\t.section .idata$2\n"); - - fprintf(f,"\t%s\t%s\n", ASM_GLOBAL,head_label); - - fprintf (f, "%s:\n", head_label); - - fprintf (f, "\t%shname%s\t%sPtr to image import by name list\n", - ASM_RVA_BEFORE, ASM_RVA_AFTER, ASM_C); - - fprintf (f, "\t%sthis should be the timestamp, but NT sometimes\n", ASM_C); - fprintf (f, "\t%sdoesn't load DLLs when this is set.\n", ASM_C); - fprintf (f, "\t%s\t0\t%s loaded time\n", ASM_LONG, ASM_C); - fprintf (f, "\t%s\t0\t%s Forwarder chain\n", ASM_LONG, ASM_C); - fprintf (f, "\t%s__%s_iname%s\t%s imported dll's name\n", - ASM_RVA_BEFORE, - imp_name_lab, - ASM_RVA_AFTER, - ASM_C); - fprintf (f, "\t%sfthunk%s\t%s pointer to firstthunk\n", - ASM_RVA_BEFORE, - ASM_RVA_AFTER, ASM_C); - - fprintf (f, "%sStuff for compatibility\n", ASM_C); - - if (!no_idata5) - { - fprintf (f, "\t.section\t.idata$5\n"); - fprintf (f, "\t%s\t0\n", ASM_LONG); - fprintf (f, "fthunk:\n"); - } - - if (!no_idata4) - { - fprintf (f, "\t.section\t.idata$4\n"); - - fprintf (f, "\t%s\t0\n", ASM_LONG); - fprintf (f, "\t.section .idata$4\n"); - fprintf (f, "hname:\n"); - } - - fclose (f); - - assemble_file (TMP_HEAD_S, TMP_HEAD_O); - - return bfd_openr (TMP_HEAD_O, HOW_BFD_READ_TARGET); -} - -static bfd * -make_tail () -{ - FILE *f = fopen (TMP_TAIL_S, FOPEN_WT); - - if (f == NULL) - { - fatal (_("failed to open temporary tail file: %s"), TMP_TAIL_S); - return NULL; - } - - if (!no_idata4) - { - fprintf (f, "\t.section .idata$4\n"); - fprintf (f, "\t%s\t0\n", ASM_LONG); - } - - if (!no_idata5) - { - fprintf (f, "\t.section .idata$5\n"); - fprintf (f, "\t%s\t0\n", ASM_LONG); - } - -#ifdef DLLTOOL_PPC - /* Normally, we need to see a null descriptor built in idata$3 to - act as the terminator for the list. The ideal way, I suppose, - would be to mark this section as a comdat type 2 section, so - only one would appear in the final .exe (if our linker supported - comdat, that is) or cause it to be inserted by something else (say - crt0) - */ - - fprintf (f, "\t.section .idata$3\n"); - fprintf (f, "\t%s\t0\n", ASM_LONG); - fprintf (f, "\t%s\t0\n", ASM_LONG); - fprintf (f, "\t%s\t0\n", ASM_LONG); - fprintf (f, "\t%s\t0\n", ASM_LONG); - fprintf (f, "\t%s\t0\n", ASM_LONG); -#endif - -#ifdef DLLTOOL_PPC - /* Other PowerPC NT compilers use idata$6 for the dllname, so I - do too. Original, huh? */ - fprintf (f, "\t.section .idata$6\n"); -#else - fprintf (f, "\t.section .idata$7\n"); -#endif - - fprintf (f, "\t%s\t__%s_iname\n", ASM_GLOBAL, imp_name_lab); - fprintf (f, "__%s_iname:\t%s\t\"%s\"\n", - imp_name_lab, ASM_TEXT, dll_name); - - fclose (f); - - assemble_file (TMP_TAIL_S, TMP_TAIL_O); - - return bfd_openr (TMP_TAIL_O, HOW_BFD_READ_TARGET); -} - -static void -gen_lib_file () -{ - int i; - export_type *exp; - bfd *ar_head; - bfd *ar_tail; - bfd *outarch; - bfd * head = 0; - - unlink (imp_name); - - outarch = bfd_openw (imp_name, HOW_BFD_WRITE_TARGET); - - if (!outarch) - /* xgettext:c-format */ - fatal (_("Can't open .lib file: %s"), imp_name); - - /* xgettext:c-format */ - inform (_("Creating library file: %s"), imp_name); - - bfd_set_format (outarch, bfd_archive); - outarch->has_armap = 1; - - /* Work out a reasonable size of things to put onto one line. */ - - ar_head = make_head (); - ar_tail = make_tail(); - - if (ar_head == NULL || ar_tail == NULL) - return; - - for (i = 0; (exp = d_exports_lexically[i]); i++) - { - bfd *n = make_one_lib_file (exp, i); - n->next = head; - head = n; - } - - /* Now stick them all into the archive */ - - ar_head->next = head; - ar_tail->next = ar_head; - head = ar_tail; - - if (! bfd_set_archive_head (outarch, head)) - bfd_fatal ("bfd_set_archive_head"); - - if (! bfd_close (outarch)) - bfd_fatal (imp_name); - - while (head != NULL) - { - bfd *n = head->next; - bfd_close (head); - head = n; - } - - /* Delete all the temp files */ - - if (dontdeltemps == 0) - { - unlink (TMP_HEAD_O); - unlink (TMP_HEAD_S); - unlink (TMP_TAIL_O); - unlink (TMP_TAIL_S); - } - - if (dontdeltemps < 2) - { - char *name; - - name = (char *) alloca (sizeof TMP_STUB + 10); - for (i = 0, exp = d_exports; exp; i++, exp = exp->next) - { - sprintf (name, "%s%05d.o", TMP_STUB, i); - if (unlink (name) < 0) - /* xgettext:c-format */ - non_fatal (_("cannot delete %s: %s"), name, strerror (errno)); - } - } - - inform (_("Created lib file")); -} - -/**********************************************************************/ - -/* Run through the information gathered from the .o files and the - .def file and work out the best stuff */ -static int -pfunc (a, b) - const void *a; - const void *b; -{ - export_type *ap = *(export_type **) a; - export_type *bp = *(export_type **) b; - if (ap->ordinal == bp->ordinal) - return 0; - - /* unset ordinals go to the bottom */ - if (ap->ordinal == -1) - return 1; - if (bp->ordinal == -1) - return -1; - return (ap->ordinal - bp->ordinal); -} - -static int -nfunc (a, b) - const void *a; - const void *b; -{ - export_type *ap = *(export_type **) a; - export_type *bp = *(export_type **) b; - - return (strcmp (ap->name, bp->name)); -} - -static void -remove_null_names (ptr) - export_type **ptr; -{ - int src; - int dst; - for (dst = src = 0; src < d_nfuncs; src++) - { - if (ptr[src]) - { - ptr[dst] = ptr[src]; - dst++; - } - } - d_nfuncs = dst; -} - -static void -dtab (ptr) - export_type ** ptr -#ifndef SACDEBUG -ATTRIBUTE_UNUSED -#endif - ; -{ -#ifdef SACDEBUG - int i; - for (i = 0; i < d_nfuncs; i++) - { - if (ptr[i]) - { - printf ("%d %s @ %d %s%s%s\n", - i, ptr[i]->name, ptr[i]->ordinal, - ptr[i]->noname ? "NONAME " : "", - ptr[i]->constant ? "CONSTANT" : "", - ptr[i]->data ? "DATA" : ""); - } - else - printf ("empty\n"); - } -#endif -} - -static void -process_duplicates (d_export_vec) - export_type **d_export_vec; -{ - int more = 1; - int i; - while (more) - { - - more = 0; - /* Remove duplicates */ - qsort (d_export_vec, d_nfuncs, sizeof (export_type *), nfunc); - - dtab (d_export_vec); - for (i = 0; i < d_nfuncs - 1; i++) - { - if (strcmp (d_export_vec[i]->name, - d_export_vec[i + 1]->name) == 0) - { - - export_type *a = d_export_vec[i]; - export_type *b = d_export_vec[i + 1]; - - more = 1; - - /* xgettext:c-format */ - inform (_("Warning, ignoring duplicate EXPORT %s %d,%d"), - a->name, a->ordinal, b->ordinal); - - if (a->ordinal != -1 - && b->ordinal != -1) - /* xgettext:c-format */ - fatal (_("Error, duplicate EXPORT with oridinals: %s"), - a->name); - - /* Merge attributes */ - b->ordinal = a->ordinal > 0 ? a->ordinal : b->ordinal; - b->constant |= a->constant; - b->noname |= a->noname; - b->data |= a->data; - d_export_vec[i] = 0; - } - - dtab (d_export_vec); - remove_null_names (d_export_vec); - dtab (d_export_vec); - } - } - - - /* Count the names */ - for (i = 0; i < d_nfuncs; i++) - { - if (!d_export_vec[i]->noname) - d_named_nfuncs++; - } -} - -static void -fill_ordinals (d_export_vec) - export_type **d_export_vec; -{ - int lowest = -1; - int i; - char *ptr; - int size = 65536; - - qsort (d_export_vec, d_nfuncs, sizeof (export_type *), pfunc); - - /* fill in the unset ordinals with ones from our range */ - - ptr = (char *) xmalloc (size); - - memset (ptr, 0, size); - - /* Mark in our large vector all the numbers that are taken */ - for (i = 0; i < d_nfuncs; i++) - { - if (d_export_vec[i]->ordinal != -1) - { - ptr[d_export_vec[i]->ordinal] = 1; - if (lowest == -1 || d_export_vec[i]->ordinal < lowest) - { - lowest = d_export_vec[i]->ordinal; - } - } - } - - /* Start at 1 for compatibility with MS toolchain. */ - if (lowest == -1) - lowest = 1; - - /* Now fill in ordinals where the user wants us to choose. */ - for (i = 0; i < d_nfuncs; i++) - { - if (d_export_vec[i]->ordinal == -1) - { - register int j; - - /* First try within or after any user supplied range. */ - for (j = lowest; j < size; j++) - if (ptr[j] == 0) - { - ptr[j] = 1; - d_export_vec[i]->ordinal = j; - goto done; - } - - /* Then try before the range. */ - for (j = lowest; j >0; j--) - if (ptr[j] == 0) - { - ptr[j] = 1; - d_export_vec[i]->ordinal = j; - goto done; - } - done:; - } - } - - free (ptr); - - /* And resort */ - - qsort (d_export_vec, d_nfuncs, sizeof (export_type *), pfunc); - - /* Work out the lowest and highest ordinal numbers. */ - if (d_nfuncs) - { - if (d_export_vec[0]) - d_low_ord = d_export_vec[0]->ordinal; - if (d_export_vec[d_nfuncs-1]) - d_high_ord = d_export_vec[d_nfuncs-1]->ordinal; - } -} - -static int -alphafunc (av,bv) - const void *av; - const void *bv; -{ - const export_type **a = (const export_type **) av; - const export_type **b = (const export_type **) bv; - - return strcmp ((*a)->name, (*b)->name); -} - -static void -mangle_defs () -{ - /* First work out the minimum ordinal chosen */ - - export_type *exp; - - int i; - int hint = 0; - export_type **d_export_vec - = (export_type **) xmalloc (sizeof (export_type *) * d_nfuncs); - - inform (_("Processing definitions")); - - for (i = 0, exp = d_exports; exp; i++, exp = exp->next) - { - d_export_vec[i] = exp; - } - - process_duplicates (d_export_vec); - fill_ordinals (d_export_vec); - - /* Put back the list in the new order */ - d_exports = 0; - for (i = d_nfuncs - 1; i >= 0; i--) - { - d_export_vec[i]->next = d_exports; - d_exports = d_export_vec[i]; - } - - /* Build list in alpha order */ - d_exports_lexically = (export_type **) - xmalloc (sizeof (export_type *) * (d_nfuncs + 1)); - - for (i = 0, exp = d_exports; exp; i++, exp = exp->next) - { - d_exports_lexically[i] = exp; - } - d_exports_lexically[i] = 0; - - qsort (d_exports_lexically, i, sizeof (export_type *), alphafunc); - - /* Fill exp entries with their hint values */ - - for (i = 0; i < d_nfuncs; i++) - { - if (!d_exports_lexically[i]->noname || show_allnames) - d_exports_lexically[i]->hint = hint++; - } - - inform (_("Processed definitions")); -} - -/**********************************************************************/ - -static void -usage (file, status) - FILE *file; - int status; -{ - /* xgetext:c-format */ - fprintf (file, _("Usage %s \n"), program_name); - /* xgetext:c-format */ - fprintf (file, _(" -m --machine Create as DLL for . [default: %s]\n"), mname); - fprintf (file, _(" possible : arm[_interwork], i386, mcore[-elf]{-le|-be}, ppc, thumb\n")); - fprintf (file, _(" -e --output-exp Generate an export file.\n")); - fprintf (file, _(" -l --output-lib Generate an interface library.\n")); - fprintf (file, _(" -a --add-indirect Add dll indirects to export file.\n")); - fprintf (file, _(" -D --dllname Name of input dll to put into interface lib.\n")); - fprintf (file, _(" -d --input-def Name of .def file to be read in.\n")); - fprintf (file, _(" -z --output-def Name of .def file to be created.\n")); - fprintf (file, _(" --export-all-symbols Export all symbols to .def\n")); - fprintf (file, _(" --no-export-all-symbols Only export listed symbols\n")); - fprintf (file, _(" --exclude-symbols Don't export \n")); - fprintf (file, _(" --no-default-excludes Clear default exclude symbols\n")); - fprintf (file, _(" -b --base-file Read linker generated base file.\n")); - fprintf (file, _(" -x --no-idata4 Don't generate idata$4 section.\n")); - fprintf (file, _(" -c --no-idata5 Don't generate idata$5 section.\n")); - fprintf (file, _(" -U --add-underscore Add underscores to symbols in interface library.\n")); - fprintf (file, _(" -k --kill-at Kill @ from exported names.\n")); - fprintf (file, _(" -A --add-stdcall-alias Add aliases without @.\n")); - fprintf (file, _(" -S --as Use for assembler.\n")); - fprintf (file, _(" -f --as-flags Pass to the assembler.\n")); - fprintf (file, _(" -C --compat-implib Create backward compatible import library.\n")); - fprintf (file, _(" -n --no-delete Keep temp files (repeat for extra preservation).\n")); - fprintf (file, _(" -v --verbose Be verbose.\n")); - fprintf (file, _(" -V --version Display the program version.\n")); - fprintf (file, _(" -h --help Display this information.\n")); -#ifdef DLLTOOL_MCORE_ELF - fprintf (file, _(" -M --mcore-elf Process mcore-elf object files into .\n")); - fprintf (file, _(" -L --linker Use as the linker.\n")); - fprintf (file, _(" -F --linker-flags Pass to the linker.\n")); -#endif - exit (status); -} - -#define OPTION_EXPORT_ALL_SYMS 150 -#define OPTION_NO_EXPORT_ALL_SYMS (OPTION_EXPORT_ALL_SYMS + 1) -#define OPTION_EXCLUDE_SYMS (OPTION_NO_EXPORT_ALL_SYMS + 1) -#define OPTION_NO_DEFAULT_EXCLUDES (OPTION_EXCLUDE_SYMS + 1) - -static const struct option long_options[] = -{ - {"no-delete", no_argument, NULL, 'n'}, - {"dllname", required_argument, NULL, 'D'}, - {"no-idata4", no_argument, NULL, 'x'}, - {"no-idata5", no_argument, NULL, 'c'}, - {"output-exp", required_argument, NULL, 'e'}, - {"output-def", required_argument, NULL, 'z'}, - {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL_SYMS}, - {"no-export-all-symbols", no_argument, NULL, OPTION_NO_EXPORT_ALL_SYMS}, - {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMS}, - {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES}, - {"output-lib", required_argument, NULL, 'l'}, - {"def", required_argument, NULL, 'd'}, /* for compatiblity with older versions */ - {"input-def", required_argument, NULL, 'd'}, - {"add-underscore", no_argument, NULL, 'U'}, - {"kill-at", no_argument, NULL, 'k'}, - {"add-stdcall-alias", no_argument, NULL, 'A'}, - {"verbose", no_argument, NULL, 'v'}, - {"version", no_argument, NULL, 'V'}, - {"help", no_argument, NULL, 'h'}, - {"machine", required_argument, NULL, 'm'}, - {"add-indirect", no_argument, NULL, 'a'}, - {"base-file", required_argument, NULL, 'b'}, - {"as", required_argument, NULL, 'S'}, - {"as-flags", required_argument, NULL, 'f'}, - {"mcore-elf", required_argument, NULL, 'M'}, - {"compat-implib", no_argument, NULL, 'C'}, - {NULL,0,NULL,0} -}; - -int -main (ac, av) - int ac; - char **av; -{ - int c; - int i; - char *firstarg = 0; - program_name = av[0]; - oav = av; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - while ((c = getopt_long (ac, av, -#ifdef DLLTOOL_MCORE_ELF - "m:e:l:aD:d:z:b:xcCuUkAS:f:nvVhM:L:F:", -#else - "m:e:l:aD:d:z:b:xcCuUkAS:f:nvVh", -#endif - long_options, 0)) - != EOF) - { - switch (c) - { - case OPTION_EXPORT_ALL_SYMS: - export_all_symbols = true; - break; - case OPTION_NO_EXPORT_ALL_SYMS: - export_all_symbols = false; - break; - case OPTION_EXCLUDE_SYMS: - add_excludes (optarg); - break; - case OPTION_NO_DEFAULT_EXCLUDES: - do_default_excludes = false; - break; - case 'x': - no_idata4 = 1; - break; - case 'c': - no_idata5 = 1; - break; - case 'S': - as_name = optarg; - break; - case 'f': - as_flags = optarg; - break; - - /* ignored for compatibility */ - case 'u': - break; - case 'a': - add_indirect = 1; - break; - case 'z': - output_def = fopen (optarg, FOPEN_WT); - break; - case 'D': - dll_name = optarg; - break; - case 'l': - imp_name = optarg; - break; - case 'e': - exp_name = optarg; - break; - case 'h': - usage (stdout, 0); - break; - case 'm': - mname = optarg; - break; - case 'v': - verbose = 1; - break; - case 'V': - print_version (program_name); - break; - case 'U': - add_underscore = 1; - break; - case 'k': - killat = 1; - break; - case 'A': - add_stdcall_alias = 1; - break; - case 'd': - def_file = optarg; - break; - case 'n': - dontdeltemps++; - break; - case 'b': - base_file = fopen (optarg, FOPEN_RB); - - if (!base_file) - /* xgettext:c-format */ - fatal (_("Unable to open base-file: %s"), optarg); - - break; -#ifdef DLLTOOL_MCORE_ELF - case 'M': - mcore_elf_out_file = optarg; - break; - case 'L': - mcore_elf_linker = optarg; - break; - case 'F': - mcore_elf_linker_flags = optarg; - break; -#endif - case 'C': - create_compat_implib = 1; - break; - default: - usage (stderr, 1); - break; - } - } - - for (i = 0; mtable[i].type; i++) - if (strcmp (mtable[i].type, mname) == 0) - break; - - if (!mtable[i].type) - /* xgettext:c-format */ - fatal (_("Machine '%s' not supported"), mname); - - machine = i; - - if (!dll_name && exp_name) - { - int len = strlen (exp_name) + 5; - dll_name = xmalloc (len); - strcpy (dll_name, exp_name); - strcat (dll_name, ".dll"); - } - - if (as_name == NULL) - as_name = deduce_name ("as"); - - /* Don't use the default exclude list if we're reading only the - symbols in the .drectve section. The default excludes are meant - to avoid exporting DLL entry point and Cygwin32 impure_ptr. */ - if (! export_all_symbols) - do_default_excludes = false; - - if (do_default_excludes) - set_default_excludes (); - - if (def_file) - process_def_file (def_file); - - while (optind < ac) - { - if (!firstarg) - firstarg = av[optind]; - scan_obj_file (av[optind]); - optind++; - } - - mangle_defs (); - - if (exp_name) - gen_exp_file (); - - if (imp_name) - { - /* Make imp_name safe for use as a label. */ - char *p; - - imp_name_lab = xstrdup (imp_name); - for (p = imp_name_lab; *p; p++) - { - if (!isalpha ((unsigned char) *p) && !isdigit ((unsigned char) *p)) - *p = '_'; - } - head_label = make_label("_head_", imp_name_lab); - gen_lib_file (); - } - - if (output_def) - gen_def_file (); - -#ifdef DLLTOOL_MCORE_ELF - if (mcore_elf_out_file) - mcore_elf_gen_out_file (); -#endif - - return 0; -} - -/* Look for the program formed by concatenating PROG_NAME and the - string running from PREFIX to END_PREFIX. If the concatenated - string contains a '/', try appending EXECUTABLE_SUFFIX if it is - appropriate. */ - -static char * -look_for_prog (prog_name, prefix, end_prefix) - const char *prog_name; - const char *prefix; - int end_prefix; -{ - struct stat s; - char *cmd; - - cmd = xmalloc (strlen (prefix) - + strlen (prog_name) -#ifdef HAVE_EXECUTABLE_SUFFIX - + strlen (EXECUTABLE_SUFFIX) -#endif - + 10); - strcpy (cmd, prefix); - - sprintf (cmd + end_prefix, "%s", prog_name); - - if (strchr (cmd, '/') != NULL) - { - int found; - - found = (stat (cmd, &s) == 0 -#ifdef HAVE_EXECUTABLE_SUFFIX - || stat (strcat (cmd, EXECUTABLE_SUFFIX), &s) == 0 -#endif - ); - - if (! found) - { - /* xgettext:c-format */ - inform (_("Tried file: %s"), cmd); - free (cmd); - return NULL; - } - } - - /* xgettext:c-format */ - inform (_("Using file: %s"), cmd); - - return cmd; -} - -/* Deduce the name of the program we are want to invoke. - PROG_NAME is the basic name of the program we want to run, - eg "as" or "ld". The catch is that we might want actually - run "i386-pe-as" or "ppc-pe-ld". - - If argv[0] contains the full path, then try to find the program - in the same place, with and then without a target-like prefix. - - Given, argv[0] = /usr/local/bin/i586-cygwin32-dlltool, - deduce_name("as") uses the following search order: - - /usr/local/bin/i586-cygwin32-as - /usr/local/bin/as - as - - If there's an EXECUTABLE_SUFFIX, it'll use that as well; for each - name, it'll try without and then with EXECUTABLE_SUFFIX. - - Given, argv[0] = i586-cygwin32-dlltool, it will not even try "as" - as the fallback, but rather return i586-cygwin32-as. - - Oh, and given, argv[0] = dlltool, it'll return "as". - - Returns a dynamically allocated string. */ - -static char * -deduce_name (prog_name) - const char *prog_name; -{ - char *cmd; - char *dash, *slash, *cp; - - dash = NULL; - slash = NULL; - for (cp = program_name; *cp != '\0'; ++cp) - { - if (*cp == '-') - dash = cp; - if ( -#if defined(__DJGPP__) || defined (__CYGWIN__) || defined(__WIN32__) - *cp == ':' || *cp == '\\' || -#endif - *cp == '/') - { - slash = cp; - dash = NULL; - } - } - - cmd = NULL; - - if (dash != NULL) - { - /* First, try looking for a prefixed PROG_NAME in the - PROGRAM_NAME directory, with the same prefix as PROGRAM_NAME. */ - cmd = look_for_prog (prog_name, program_name, dash - program_name + 1); - } - - if (slash != NULL && cmd == NULL) - { - /* Next, try looking for a PROG_NAME in the same directory as - that of this program. */ - cmd = look_for_prog (prog_name, program_name, slash - program_name + 1); - } - - if (cmd == NULL) - { - /* Just return PROG_NAME as is. */ - cmd = xstrdup (prog_name); - } - - return cmd; -} - -#ifdef DLLTOOL_MCORE_ELF -typedef struct fname_cache -{ - char * filename; - struct fname_cache * next; -} -fname_cache; - -static fname_cache fnames; - -static void -mcore_elf_cache_filename (char * filename) -{ - fname_cache * ptr; - - ptr = & fnames; - - while (ptr->next != NULL) - ptr = ptr->next; - - ptr->filename = filename; - ptr->next = (fname_cache *) malloc (sizeof (fname_cache)); - if (ptr->next != NULL) - ptr->next->next = NULL; -} - -#define MCORE_ELF_TMP_OBJ "mcoreelf.o" -#define MCORE_ELF_TMP_EXP "mcoreelf.exp" -#define MCORE_ELF_TMP_LIB "mcoreelf.lib" - -static void -mcore_elf_gen_out_file (void) -{ - fname_cache * ptr; - dyn_string_t ds; - - /* Step one. Run 'ld -r' on the input object files in order to resolve - any internal references and to generate a single .exports section. */ - ptr = & fnames; - - ds = dyn_string_new (100); - dyn_string_append (ds, "-r "); - - if (mcore_elf_linker_flags != NULL) - dyn_string_append (ds, mcore_elf_linker_flags); - - while (ptr->next != NULL) - { - dyn_string_append (ds, ptr->filename); - dyn_string_append (ds, " "); - - ptr = ptr->next; - } - - dyn_string_append (ds, "-o "); - dyn_string_append (ds, MCORE_ELF_TMP_OBJ); - - if (mcore_elf_linker == NULL) - mcore_elf_linker = deduce_name ("ld"); - - run (mcore_elf_linker, ds->s); - - dyn_string_delete (ds); - - /* Step two. Create a .exp file and a .lib file from the temporary file. - Do this by recursively invoking dlltool....*/ - ds = dyn_string_new (100); - - dyn_string_append (ds, "-S "); - dyn_string_append (ds, as_name); - - dyn_string_append (ds, " -e "); - dyn_string_append (ds, MCORE_ELF_TMP_EXP); - dyn_string_append (ds, " -l "); - dyn_string_append (ds, MCORE_ELF_TMP_LIB); - dyn_string_append (ds, " " ); - dyn_string_append (ds, MCORE_ELF_TMP_OBJ); - - if (verbose) - dyn_string_append (ds, " -v"); - - if (dontdeltemps) - { - dyn_string_append (ds, " -n"); - - if (dontdeltemps > 1) - dyn_string_append (ds, " -n"); - } - - /* XXX - FIME: ought to check/copy other command line options as well. */ - - run (program_name, ds->s); - - dyn_string_delete (ds); - - /* Step four. Feed the .exp and object files to ld -shared to create the dll. */ - ds = dyn_string_new (100); - - dyn_string_append (ds, "-shared "); - - if (mcore_elf_linker_flags) - dyn_string_append (ds, mcore_elf_linker_flags); - - dyn_string_append (ds, " "); - dyn_string_append (ds, MCORE_ELF_TMP_EXP); - dyn_string_append (ds, " "); - dyn_string_append (ds, MCORE_ELF_TMP_OBJ); - dyn_string_append (ds, " -o "); - dyn_string_append (ds, mcore_elf_out_file); - - run (mcore_elf_linker, ds->s); - - dyn_string_delete (ds); - - if (dontdeltemps == 0) - unlink (MCORE_ELF_TMP_EXP); - - if (dontdeltemps < 2) - unlink (MCORE_ELF_TMP_OBJ); -} -#endif /* DLLTOOL_MCORE_ELF */ diff --git a/binutils/dlltool.h b/binutils/dlltool.h deleted file mode 100644 index b4167c897f3..00000000000 --- a/binutils/dlltool.h +++ /dev/null @@ -1,42 +0,0 @@ -/* dlltool.h -- header file for dlltool - Copyright (C) 1997, 1998 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 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include "ansidecl.h" -#include - -extern void def_code PARAMS ((int)); -extern void def_data PARAMS ((int)); -extern void def_description PARAMS ((const char *)); -extern void def_exports - PARAMS ((const char *, const char *, int, int, int, int)); -extern void def_heapsize PARAMS ((int, int)); -extern void def_import - PARAMS ((const char *, const char *, const char *, const char *, int)); -extern void def_library PARAMS ((const char *, int)); -extern void def_name PARAMS ((const char *, int)); -extern void def_section PARAMS ((const char *, int)); -extern void def_stacksize PARAMS ((int, int)); -extern void def_version PARAMS ((int, int)); -extern int yyparse PARAMS ((void)); -extern int yyerror PARAMS ((const char *)); -extern int yydebug; -extern int yylex PARAMS ((void)); -extern FILE *yyin; -extern int linenumber; diff --git a/binutils/dllwrap.c b/binutils/dllwrap.c deleted file mode 100644 index 637fa52fc17..00000000000 --- a/binutils/dllwrap.c +++ /dev/null @@ -1,1249 +0,0 @@ -/* dllwrap.c -- wrapper for DLLTOOL and GCC to generate PE style DLLs - Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - Contributed by Mumit Khan (khan@xraylith.wisc.edu). - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* AIX requires this to be the first thing in the file. */ -#ifndef __GNUC__ -# ifdef _AIX - #pragma alloca -#endif -#endif - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "bfd.h" -#include "libiberty.h" -#include "bucomm.h" -#include "getopt.h" -#include "dyn-string.h" - -#include -#include -#include - -#ifdef ANSI_PROTOTYPES -#include -#else -#include -#endif - -#ifdef HAVE_SYS_WAIT_H -#include -#else /* ! HAVE_SYS_WAIT_H */ -#if ! defined (_WIN32) || defined (__CYGWIN32__) -#ifndef WIFEXITED -#define WIFEXITED(w) (((w)&0377) == 0) -#endif -#ifndef WIFSIGNALED -#define WIFSIGNALED(w) (((w)&0377) != 0177 && ((w)&~0377) == 0) -#endif -#ifndef WTERMSIG -#define WTERMSIG(w) ((w) & 0177) -#endif -#ifndef WEXITSTATUS -#define WEXITSTATUS(w) (((w) >> 8) & 0377) -#endif -#else /* defined (_WIN32) && ! defined (__CYGWIN32__) */ -#ifndef WIFEXITED -#define WIFEXITED(w) (((w) & 0xff) == 0) -#endif -#ifndef WIFSIGNALED -#define WIFSIGNALED(w) (((w) & 0xff) != 0 && ((w) & 0xff) != 0x7f) -#endif -#ifndef WTERMSIG -#define WTERMSIG(w) ((w) & 0x7f) -#endif -#ifndef WEXITSTATUS -#define WEXITSTATUS(w) (((w) & 0xff00) >> 8) -#endif -#endif /* defined (_WIN32) && ! defined (__CYGWIN32__) */ -#endif /* ! HAVE_SYS_WAIT_H */ - -static char *driver_name = NULL; -static char *cygwin_driver_flags = - "-Wl,--dll -nostartfiles"; -static char *mingw32_driver_flags = "-mdll"; -static char *generic_driver_flags = "-Wl,--dll"; - -static char *entry_point; - -static char *dlltool_name = NULL; - -static char *target = TARGET; - -typedef enum { - UNKNOWN_TARGET, - CYGWIN_TARGET, - MINGW_TARGET -} -target_type; - -static target_type which_target = UNKNOWN_TARGET; - -static int dontdeltemps = 0; -static int dry_run = 0; - -static char *program_name; - -static int verbose = 0; - -static char *dll_file_name; -static char *dll_name; -static char *base_file_name; -static char *exp_file_name; -static char *def_file_name; -static int delete_base_file = 1; -static int delete_exp_file = 1; -static int delete_def_file = 1; - -static int run PARAMS ((const char *, char *)); -static void usage PARAMS ((FILE *, int)); -static void display PARAMS ((const char *, va_list)); -static void inform PARAMS ((const char *, ...)); -static void warn PARAMS ((const char *format, ...)); -static char *look_for_prog PARAMS ((const char *, const char *, int)); -static char *deduce_name PARAMS ((const char *)); -static void delete_temp_files PARAMS ((void)); -static void cleanup_and_exit PARAMS ((int status)); - -/**********************************************************************/ - -/* Please keep the following 4 routines in sync with dlltool.c: - display () - inform () - look_for_prog () - deduce_name () - It's not worth the hassle to break these out since dllwrap will - (hopefully) soon be retired in favor of `ld --shared. */ - -static void -display (message, args) - const char * message; - va_list args; -{ - if (program_name != NULL) - fprintf (stderr, "%s: ", program_name); - - vfprintf (stderr, message, args); - fputc ('\n', stderr); -} - - -#ifdef __STDC__ -static void -inform (const char * message, ...) -{ - va_list args; - - if (!verbose) - return; - - va_start (args, message); - display (message, args); - va_end (args); -} - -static void -warn (const char *format, ...) -{ - va_list args; - - va_start (args, format); - display (format, args); - va_end (args); -} -#else - -static void -inform (message, va_alist) - const char * message; - va_dcl -{ - va_list args; - - if (!verbose) - return; - - va_start (args); - display (message, args); - va_end (args); -} - -static void -warn (format, va_alist) - const char *format; - va_dcl -{ - va_list args; - - va_start (args); - display (format, args); - va_end (args); -} -#endif - -/* Look for the program formed by concatenating PROG_NAME and the - string running from PREFIX to END_PREFIX. If the concatenated - string contains a '/', try appending EXECUTABLE_SUFFIX if it is - appropriate. */ - -static char * -look_for_prog (prog_name, prefix, end_prefix) - const char *prog_name; - const char *prefix; - int end_prefix; -{ - struct stat s; - char *cmd; - - cmd = xmalloc (strlen (prefix) - + strlen (prog_name) -#ifdef HAVE_EXECUTABLE_SUFFIX - + strlen (EXECUTABLE_SUFFIX) -#endif - + 10); - strcpy (cmd, prefix); - - sprintf (cmd + end_prefix, "%s", prog_name); - - if (strchr (cmd, '/') != NULL) - { - int found; - - found = (stat (cmd, &s) == 0 -#ifdef HAVE_EXECUTABLE_SUFFIX - || stat (strcat (cmd, EXECUTABLE_SUFFIX), &s) == 0 -#endif - ); - - if (! found) - { - /* xgettext:c-format */ - inform (_("Tried file: %s"), cmd); - free (cmd); - return NULL; - } - } - - /* xgettext:c-format */ - inform (_("Using file: %s"), cmd); - - return cmd; -} - -/* Deduce the name of the program we are want to invoke. - PROG_NAME is the basic name of the program we want to run, - eg "as" or "ld". The catch is that we might want actually - run "i386-pe-as" or "ppc-pe-ld". - - If argv[0] contains the full path, then try to find the program - in the same place, with and then without a target-like prefix. - - Given, argv[0] = /usr/local/bin/i586-cygwin32-dlltool, - deduce_name("as") uses the following search order: - - /usr/local/bin/i586-cygwin32-as - /usr/local/bin/as - as - - If there's an EXECUTABLE_SUFFIX, it'll use that as well; for each - name, it'll try without and then with EXECUTABLE_SUFFIX. - - Given, argv[0] = i586-cygwin32-dlltool, it will not even try "as" - as the fallback, but rather return i586-cygwin32-as. - - Oh, and given, argv[0] = dlltool, it'll return "as". - - Returns a dynamically allocated string. */ - -static char * -deduce_name (prog_name) - const char *prog_name; -{ - char *cmd; - char *dash, *slash, *cp; - - dash = NULL; - slash = NULL; - for (cp = program_name; *cp != '\0'; ++cp) - { - if (*cp == '-') - dash = cp; - if ( -#if defined(__DJGPP__) || defined (__CYGWIN__) || defined(__WIN32__) - *cp == ':' || *cp == '\\' || -#endif - *cp == '/') - { - slash = cp; - dash = NULL; - } - } - - cmd = NULL; - - if (dash != NULL) - { - /* First, try looking for a prefixed PROG_NAME in the - PROGRAM_NAME directory, with the same prefix as PROGRAM_NAME. */ - cmd = look_for_prog (prog_name, program_name, dash - program_name + 1); - } - - if (slash != NULL && cmd == NULL) - { - /* Next, try looking for a PROG_NAME in the same directory as - that of this program. */ - cmd = look_for_prog (prog_name, program_name, slash - program_name + 1); - } - - if (cmd == NULL) - { - /* Just return PROG_NAME as is. */ - cmd = xstrdup (prog_name); - } - - return cmd; -} - -static void -delete_temp_files () -{ - if (delete_base_file && base_file_name) - { - if (verbose) - { - if (dontdeltemps) - warn (_("Keeping temporary base file %s"), base_file_name); - else - warn (_("Deleting temporary base file %s"), base_file_name); - } - if (! dontdeltemps) - { - unlink (base_file_name); - free (base_file_name); - } - } - - if (delete_exp_file && exp_file_name) - { - if (verbose) - { - if (dontdeltemps) - warn (_("Keeping temporary exp file %s"), exp_file_name); - else - warn (_("Deleting temporary exp file %s"), exp_file_name); - } - if (! dontdeltemps) - { - unlink (exp_file_name); - free (exp_file_name); - } - } - if (delete_def_file && def_file_name) - { - if (verbose) - { - if (dontdeltemps) - warn (_("Keeping temporary def file %s"), def_file_name); - else - warn (_("Deleting temporary def file %s"), def_file_name); - } - if (! dontdeltemps) - { - unlink (def_file_name); - free (def_file_name); - } - } -} - -static void -cleanup_and_exit (int status) -{ - delete_temp_files (); - exit (status); -} - -static int -run (what, args) - const char *what; - char *args; -{ - char *s; - int pid, wait_status, retcode; - int i; - const char **argv; - char *errmsg_fmt, *errmsg_arg; - char *temp_base = choose_temp_base (); - int in_quote; - char sep; - - if (verbose || dry_run) - fprintf (stderr, "%s %s\n", what, args); - - /* Count the args */ - i = 0; - for (s = args; *s; s++) - if (*s == ' ') - i++; - i++; - argv = alloca (sizeof (char *) * (i + 3)); - i = 0; - argv[i++] = what; - s = args; - while (1) - { - while (*s == ' ' && *s != 0) - s++; - if (*s == 0) - break; - in_quote = (*s == '\'' || *s == '"'); - sep = (in_quote) ? *s++ : ' '; - argv[i++] = s; - while (*s != sep && *s != 0) - s++; - if (*s == 0) - break; - *s++ = 0; - if (in_quote) - s++; - } - argv[i++] = NULL; - - if (dry_run) - return 0; - - pid = pexecute (argv[0], (char * const *) argv, program_name, temp_base, - &errmsg_fmt, &errmsg_arg, PEXECUTE_ONE | PEXECUTE_SEARCH); - - if (pid == -1) - { - int errno_val = errno; - - fprintf (stderr, "%s: ", program_name); - fprintf (stderr, errmsg_fmt, errmsg_arg); - fprintf (stderr, ": %s\n", strerror (errno_val)); - return 1; - } - - retcode = 0; - pid = pwait (pid, &wait_status, 0); - if (pid == -1) - { - warn ("wait: %s", strerror (errno)); - retcode = 1; - } - else if (WIFSIGNALED (wait_status)) - { - warn (_("subprocess got fatal signal %d"), WTERMSIG (wait_status)); - retcode = 1; - } - else if (WIFEXITED (wait_status)) - { - if (WEXITSTATUS (wait_status) != 0) - { - warn (_("%s exited with status %d"), what, WEXITSTATUS (wait_status)); - retcode = 1; - } - } - else - retcode = 1; - - return retcode; -} - -static char * -mybasename (name) - const char *name; -{ - const char *base = name; - - while (*name) - { - if (*name == '/' || *name == '\\') - { - base = name + 1; - } - ++name; - } - return (char *) base; -} - -static int -strhash (const char *str) -{ - const unsigned char *s; - unsigned long hash; - unsigned int c; - unsigned int len; - - hash = 0; - len = 0; - s = (const unsigned char *) str; - while ((c = *s++) != '\0') - { - hash += c + (c << 17); - hash ^= hash >> 2; - ++len; - } - hash += len + (len << 17); - hash ^= hash >> 2; - - return hash; -} - -/**********************************************************************/ - -static void -usage (file, status) - FILE *file; - int status; -{ - fprintf (file, _("Usage %s \n"), program_name); - fprintf (file, _(" Generic options:\n")); - fprintf (file, _(" --quiet, -q Work quietly\n")); - fprintf (file, _(" --verbose, -v Verbose\n")); - fprintf (file, _(" --version Print dllwrap version\n")); - fprintf (file, _(" --implib Synonym for --output-lib\n")); - fprintf (file, _(" Options for %s:\n"), program_name); - fprintf (file, _(" --driver-name Defaults to \"gcc\"\n")); - fprintf (file, _(" --driver-flags Override default ld flags\n")); - fprintf (file, _(" --dlltool-name Defaults to \"dlltool\"\n")); - fprintf (file, _(" --entry Specify alternate DLL entry point\n")); - fprintf (file, _(" --image-base Specify image base address\n")); - fprintf (file, _(" --target i386-cygwin32 or i386-mingw32\n")); - fprintf (file, _(" --dry-run Show what needs to be run\n")); - fprintf (file, _(" --mno-cygwin Create Mingw DLL\n")); - fprintf (file, _(" Options passed to DLLTOOL:\n")); - fprintf (file, _(" --machine \n")); - fprintf (file, _(" --output-exp Generate export file.\n")); - fprintf (file, _(" --output-lib Generate input library.\n")); - fprintf (file, _(" --add-indirect Add dll indirects to export file.\n")); - fprintf (file, _(" --dllname Name of input dll to put into output lib.\n")); - fprintf (file, _(" --def Name input .def file\n")); - fprintf (file, _(" --output-def Name output .def file\n")); - fprintf (file, _(" --export-all-symbols Export all symbols to .def\n")); - fprintf (file, _(" --no-export-all-symbols Only export .drectve symbols\n")); - fprintf (file, _(" --exclude-symbols Exclude from .def\n")); - fprintf (file, _(" --no-default-excludes Zap default exclude symbols\n")); - fprintf (file, _(" --base-file Read linker generated base file\n")); - fprintf (file, _(" --no-idata4 Don't generate idata$4 section\n")); - fprintf (file, _(" --no-idata5 Don't generate idata$5 section\n")); - fprintf (file, _(" -U Add underscores to .lib\n")); - fprintf (file, _(" -k Kill @ from exported names\n")); - fprintf (file, _(" --add-stdcall-alias Add aliases without @\n")); - fprintf (file, _(" --as Use for assembler\n")); - fprintf (file, _(" --nodelete Keep temp files.\n")); - fprintf (file, _(" Rest are passed unmodified to the language driver\n")); - fprintf (file, "\n\n"); - exit (status); -} - -#define OPTION_START 149 - -/* GENERIC options. */ -#define OPTION_QUIET (OPTION_START + 1) -#define OPTION_VERBOSE (OPTION_QUIET + 1) -#define OPTION_VERSION (OPTION_VERBOSE + 1) - -/* DLLWRAP options. */ -#define OPTION_DRY_RUN (OPTION_VERSION + 1) -#define OPTION_DRIVER_NAME (OPTION_DRY_RUN + 1) -#define OPTION_DRIVER_FLAGS (OPTION_DRIVER_NAME + 1) -#define OPTION_DLLTOOL_NAME (OPTION_DRIVER_FLAGS + 1) -#define OPTION_ENTRY (OPTION_DLLTOOL_NAME + 1) -#define OPTION_IMAGE_BASE (OPTION_ENTRY + 1) -#define OPTION_TARGET (OPTION_IMAGE_BASE + 1) -#define OPTION_MNO_CYGWIN (OPTION_TARGET + 1) - -/* DLLTOOL options. */ -#define OPTION_NODELETE (OPTION_MNO_CYGWIN + 1) -#define OPTION_DLLNAME (OPTION_NODELETE + 1) -#define OPTION_NO_IDATA4 (OPTION_DLLNAME + 1) -#define OPTION_NO_IDATA5 (OPTION_NO_IDATA4 + 1) -#define OPTION_OUTPUT_EXP (OPTION_NO_IDATA5 + 1) -#define OPTION_OUTPUT_DEF (OPTION_OUTPUT_EXP + 1) -#define OPTION_EXPORT_ALL_SYMS (OPTION_OUTPUT_DEF + 1) -#define OPTION_NO_EXPORT_ALL_SYMS (OPTION_EXPORT_ALL_SYMS + 1) -#define OPTION_EXCLUDE_SYMS (OPTION_NO_EXPORT_ALL_SYMS + 1) -#define OPTION_NO_DEFAULT_EXCLUDES (OPTION_EXCLUDE_SYMS + 1) -#define OPTION_OUTPUT_LIB (OPTION_NO_DEFAULT_EXCLUDES + 1) -#define OPTION_DEF (OPTION_OUTPUT_LIB + 1) -#define OPTION_ADD_UNDERSCORE (OPTION_DEF + 1) -#define OPTION_KILLAT (OPTION_ADD_UNDERSCORE + 1) -#define OPTION_HELP (OPTION_KILLAT + 1) -#define OPTION_MACHINE (OPTION_HELP + 1) -#define OPTION_ADD_INDIRECT (OPTION_MACHINE + 1) -#define OPTION_BASE_FILE (OPTION_ADD_INDIRECT + 1) -#define OPTION_AS (OPTION_BASE_FILE + 1) - -static const struct option long_options[] = -{ - /* generic options. */ - {"quiet", no_argument, NULL, 'q'}, - {"verbose", no_argument, NULL, 'v'}, - {"version", no_argument, NULL, OPTION_VERSION}, - {"implib", required_argument, NULL, OPTION_OUTPUT_LIB}, - - /* dllwrap options. */ - {"dry-run", no_argument, NULL, OPTION_DRY_RUN}, - {"driver-name", required_argument, NULL, OPTION_DRIVER_NAME}, - {"driver-flags", required_argument, NULL, OPTION_DRIVER_FLAGS}, - {"dlltool-name", required_argument, NULL, OPTION_DLLTOOL_NAME}, - {"entry", required_argument, NULL, 'e'}, - {"image-base", required_argument, NULL, OPTION_IMAGE_BASE}, - {"target", required_argument, NULL, OPTION_TARGET}, - - /* dlltool options. */ - {"no-delete", no_argument, NULL, 'n'}, - {"dllname", required_argument, NULL, OPTION_DLLNAME}, - {"no-idata4", no_argument, NULL, OPTION_NO_IDATA4}, - {"no-idata5", no_argument, NULL, OPTION_NO_IDATA5}, - {"output-exp", required_argument, NULL, OPTION_OUTPUT_EXP}, - {"output-def", required_argument, NULL, OPTION_OUTPUT_DEF}, - {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL_SYMS}, - {"no-export-all-symbols", no_argument, NULL, OPTION_NO_EXPORT_ALL_SYMS}, - {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMS}, - {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES}, - {"output-lib", required_argument, NULL, OPTION_OUTPUT_LIB}, - {"def", required_argument, NULL, OPTION_DEF}, - {"add-underscore", no_argument, NULL, 'U'}, - {"killat", no_argument, NULL, 'k'}, - {"add-stdcall-alias", no_argument, NULL, 'A'}, - {"help", no_argument, NULL, 'h'}, - {"machine", required_argument, NULL, OPTION_MACHINE}, - {"add-indirect", no_argument, NULL, OPTION_ADD_INDIRECT}, - {"base-file", required_argument, NULL, OPTION_BASE_FILE}, - {"as", required_argument, NULL, OPTION_AS}, - {0, 0, 0, 0} -}; - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int i; - - char **saved_argv = 0; - int cmdline_len = 0; - - int export_all = 0; - - int *dlltool_arg_indices; - int *driver_arg_indices; - - char *driver_flags = 0; - char *output_lib_file_name = 0; - - dyn_string_t dlltool_cmdline; - dyn_string_t driver_cmdline; - - int def_file_seen = 0; - - char *image_base_str = 0; - - program_name = argv[0]; - - saved_argv = (char **) xmalloc (argc * sizeof (char*)); - dlltool_arg_indices = (int *) xmalloc (argc * sizeof (int)); - driver_arg_indices = (int *) xmalloc (argc * sizeof (int)); - for (i = 0; i < argc; ++i) - { - size_t len = strlen (argv[i]); - char *arg = (char *) xmalloc (len + 1); - strcpy (arg, argv[i]); - cmdline_len += len; - saved_argv[i] = arg; - dlltool_arg_indices[i] = 0; - driver_arg_indices[i] = 1; - } - cmdline_len++; - - /* We recognize dllwrap and dlltool options, and everything else is - passed onto the language driver (eg., to GCC). We collect options - to dlltool and driver in dlltool_args and driver_args. */ - - opterr = 0; - while ((c = getopt_long_only (argc, argv, "nkAqve:Uho:l:L:I:", - long_options, (int *) 0)) != EOF) - { - int dlltool_arg; - int driver_arg; - int single_word_option_value_pair; - - dlltool_arg = 0; - driver_arg = 1; - single_word_option_value_pair = 0; - - if (c != '?') - { - /* We recognize this option, so it has to be either dllwrap or - dlltool option. Do not pass to driver unless it's one of the - generic options that are passed to all the tools (such as -v) - which are dealt with later. */ - driver_arg = 0; - } - - /* deal with generic and dllwrap options first. */ - switch (c) - { - case 'h': - usage (stdout, 0); - break; - case 'q': - verbose = 0; - break; - case 'v': - verbose = 1; - break; - case OPTION_VERSION: - print_version (program_name); - break; - case 'e': - entry_point = optarg; - break; - case OPTION_IMAGE_BASE: - image_base_str = optarg; - break; - case OPTION_DEF: - def_file_name = optarg; - def_file_seen = 1; - delete_def_file = 0; - break; - case 'n': - dontdeltemps = 1; - dlltool_arg = 1; - break; - case 'o': - dll_file_name = optarg; - break; - case 'I': - case 'l': - case 'L': - driver_arg = 1; - break; - case OPTION_DLLNAME: - dll_name = optarg; - break; - case OPTION_DRY_RUN: - dry_run = 1; - break; - case OPTION_DRIVER_NAME: - driver_name = optarg; - break; - case OPTION_DRIVER_FLAGS: - driver_flags = optarg; - break; - case OPTION_DLLTOOL_NAME: - dlltool_name = optarg; - break; - case OPTION_TARGET: - target = optarg; - break; - case OPTION_MNO_CYGWIN: - target = "i386-mingw32"; - break; - case OPTION_BASE_FILE: - base_file_name = optarg; - delete_base_file = 0; - break; - case OPTION_OUTPUT_EXP: - exp_file_name = optarg; - delete_exp_file = 0; - break; - case OPTION_EXPORT_ALL_SYMS: - export_all = 1; - break; - case OPTION_OUTPUT_LIB: - output_lib_file_name = optarg; - break; - case '?': - break; - default: - dlltool_arg = 1; - break; - } - - /* Handle passing through --option=value case. */ - if (optarg - && saved_argv[optind-1][0] == '-' - && saved_argv[optind-1][1] == '-' - && strchr (saved_argv[optind-1], '=')) - single_word_option_value_pair = 1; - - if (dlltool_arg) - { - dlltool_arg_indices[optind-1] = 1; - if (optarg && ! single_word_option_value_pair) - { - dlltool_arg_indices[optind-2] = 1; - } - } - - if (! driver_arg) - { - driver_arg_indices[optind-1] = 0; - if (optarg && ! single_word_option_value_pair) - { - driver_arg_indices[optind-2] = 0; - } - } - } - - /* sanity checks. */ - if (! dll_name && ! dll_file_name) - { - warn (_("Must provide at least one of -o or --dllname options")); - exit (1); - } - else if (! dll_name) - { - dll_name = xstrdup (mybasename (dll_file_name)); - } - else if (! dll_file_name) - { - dll_file_name = xstrdup (dll_name); - } - - /* Deduce driver-name and dlltool-name from our own. */ - if (driver_name == NULL) - driver_name = deduce_name ("gcc"); - - if (dlltool_name == NULL) - dlltool_name = deduce_name ("dlltool"); - - if (! def_file_seen) - { - char *fileprefix = choose_temp_base (); - def_file_name = (char *) xmalloc (strlen (fileprefix) + 5); - sprintf (def_file_name, "%s.def", - (dontdeltemps) ? mybasename (fileprefix) : fileprefix); - delete_def_file = 1; - free (fileprefix); - delete_def_file = 1; - warn (_("no export definition file provided")); - warn (_("creating one, but that may not be what you want")); - } - - /* set the target platform. */ - if (strstr (target, "cygwin")) - which_target = CYGWIN_TARGET; - else if (strstr (target, "mingw")) - which_target = MINGW_TARGET; - else - which_target = UNKNOWN_TARGET; - - /* re-create the command lines as a string, taking care to quote stuff. */ - dlltool_cmdline = dyn_string_new (cmdline_len); - if (verbose) - { - dyn_string_append (dlltool_cmdline, " -v"); - } - dyn_string_append (dlltool_cmdline, " --dllname "); - dyn_string_append (dlltool_cmdline, dll_name); - - for (i = 1; i < argc; ++i) - { - if (dlltool_arg_indices[i]) - { - char *arg = saved_argv[i]; - int quote = (strchr (arg, ' ') || strchr (arg, '\t')); - dyn_string_append (dlltool_cmdline, - (quote) ? " \"" : " "); - dyn_string_append (dlltool_cmdline, arg); - dyn_string_append (dlltool_cmdline, - (quote) ? "\"" : ""); - } - } - - driver_cmdline = dyn_string_new (cmdline_len); - if (! driver_flags || strlen (driver_flags) == 0) - { - switch (which_target) - { - case CYGWIN_TARGET: - driver_flags = cygwin_driver_flags; - break; - - case MINGW_TARGET: - driver_flags = mingw32_driver_flags; - break; - - default: - driver_flags = generic_driver_flags; - break; - } - } - dyn_string_append (driver_cmdline, driver_flags); - dyn_string_append (driver_cmdline, " -o "); - dyn_string_append (driver_cmdline, dll_file_name); - - if (! entry_point || strlen (entry_point) == 0) - { - switch (which_target) - { - case CYGWIN_TARGET: - entry_point = "__cygwin_dll_entry@12"; - break; - - case MINGW_TARGET: - entry_point = "_DllMainCRTStartup@12"; - break; - - default: - entry_point = "_DllMain@12"; - break; - } - } - dyn_string_append (driver_cmdline, " -Wl,-e,"); - dyn_string_append (driver_cmdline, entry_point); - dyn_string_append (dlltool_cmdline, " --exclude-symbol="); - dyn_string_append (dlltool_cmdline, - (entry_point[0] == '_') ? entry_point+1 : entry_point); - - if (! image_base_str || strlen (image_base_str) == 0) - { - char *tmpbuf = (char *) xmalloc (sizeof ("0x12345678") + 1); - unsigned long hash = strhash (dll_file_name); - sprintf (tmpbuf, "0x%.8lX", 0x60000000|((hash<<16)&0xFFC0000)); - image_base_str = tmpbuf; - } - - dyn_string_append (driver_cmdline, " -Wl,--image-base,"); - dyn_string_append (driver_cmdline, image_base_str); - - if (verbose) - { - dyn_string_append (driver_cmdline, " -v"); - } - - for (i = 1; i < argc; ++i) - { - if (driver_arg_indices[i]) - { - char *arg = saved_argv[i]; - int quote = (strchr (arg, ' ') || strchr (arg, '\t')); - dyn_string_append (driver_cmdline, - (quote) ? " \"" : " "); - dyn_string_append (driver_cmdline, arg); - dyn_string_append (driver_cmdline, - (quote) ? "\"" : ""); - } - } - - /* - * Step pre-1. If no --def is specified, then create it - * and then pass it on. - */ - - if (! def_file_seen) - { - int i; - dyn_string_t step_pre1; - - step_pre1 = dyn_string_new (1024); - - dyn_string_append (step_pre1, dlltool_cmdline->s); - if (export_all) - { - dyn_string_append (step_pre1, " --export-all --exclude-symbol="); - dyn_string_append (step_pre1, - "_cygwin_dll_entry@12,DllMainCRTStartup@12,DllMain@12,DllEntryPoint@12"); - } - dyn_string_append (step_pre1, " --output-def "); - dyn_string_append (step_pre1, def_file_name); - - for (i = 1; i < argc; ++i) - { - if (driver_arg_indices[i]) - { - char *arg = saved_argv[i]; - size_t len = strlen (arg); - if (len >= 2 && arg[len-2] == '.' - && (arg[len-1] == 'o' || arg[len-1] == 'a')) - { - int quote = (strchr (arg, ' ') || strchr (arg, '\t')); - dyn_string_append (step_pre1, - (quote) ? " \"" : " "); - dyn_string_append (step_pre1, arg); - dyn_string_append (step_pre1, - (quote) ? "\"" : ""); - } - } - } - - if (run (dlltool_name, step_pre1->s)) - cleanup_and_exit (1); - - dyn_string_delete (step_pre1); - } - - dyn_string_append (dlltool_cmdline, " --def "); - dyn_string_append (dlltool_cmdline, def_file_name); - - if (verbose) - { - fprintf (stderr, _("DLLTOOL name : %s\n"), dlltool_name); - fprintf (stderr, _("DLLTOOL options : %s\n"), dlltool_cmdline->s); - fprintf (stderr, _("DRIVER name : %s\n"), driver_name); - fprintf (stderr, _("DRIVER options : %s\n"), driver_cmdline->s); - } - - /* - * Step 1. Call GCC/LD to create base relocation file. If using GCC, the - * driver command line will look like the following: - * - * % gcc -Wl,--dll --Wl,--base-file,foo.base [rest of command line] - * - * If the user does not specify a base name, create temporary one that - * is deleted at exit. - * - */ - - if (! base_file_name) - { - char *fileprefix = choose_temp_base (); - base_file_name = (char *) xmalloc (strlen (fileprefix) + 6); - sprintf (base_file_name, "%s.base", - (dontdeltemps) ? mybasename (fileprefix) : fileprefix); - delete_base_file = 1; - free (fileprefix); - } - - { - int quote; - - dyn_string_t step1 = dyn_string_new (driver_cmdline->length - + strlen (base_file_name) - + 20); - dyn_string_append (step1, "-Wl,--base-file,"); - quote = (strchr (base_file_name, ' ') - || strchr (base_file_name, '\t')); - dyn_string_append (step1, - (quote) ? "\"" : ""); - dyn_string_append (step1, base_file_name); - dyn_string_append (step1, - (quote) ? "\"" : ""); - if (driver_cmdline->length) - { - dyn_string_append (step1, " "); - dyn_string_append (step1, driver_cmdline->s); - } - - if (run (driver_name, step1->s)) - cleanup_and_exit (1); - - dyn_string_delete (step1); - } - - - - /* - * Step 2. generate the exp file by running dlltool. - * dlltool command line will look like the following: - * - * % dlltool -Wl,--dll --Wl,--base-file,foo.base [rest of command line] - * - * If the user does not specify a base name, create temporary one that - * is deleted at exit. - * - */ - - if (! exp_file_name) - { - char *p = strrchr (dll_name, '.'); - size_t prefix_len = (p) ? p - dll_name : strlen (dll_name); - exp_file_name = (char *) xmalloc (prefix_len + 4 + 1); - strncpy (exp_file_name, dll_name, prefix_len); - exp_file_name[prefix_len] = '\0'; - strcat (exp_file_name, ".exp"); - delete_exp_file = 1; - } - - { - int quote; - dyn_string_t step2 = dyn_string_new (dlltool_cmdline->length - + strlen (base_file_name) - + strlen (exp_file_name) - + 20); - - dyn_string_append (step2, "--base-file "); - quote = (strchr (base_file_name, ' ') - || strchr (base_file_name, '\t')); - dyn_string_append (step2, - (quote) ? "\"" : ""); - dyn_string_append (step2, base_file_name); - dyn_string_append (step2, - (quote) ? "\" " : " "); - - dyn_string_append (step2, "--output-exp "); - quote = (strchr (exp_file_name, ' ') - || strchr (exp_file_name, '\t')); - dyn_string_append (step2, - (quote) ? "\"" : ""); - dyn_string_append (step2, exp_file_name); - dyn_string_append (step2, - (quote) ? "\"" : ""); - - if (dlltool_cmdline->length) - { - dyn_string_append (step2, " "); - dyn_string_append (step2, dlltool_cmdline->s); - } - - if (run (dlltool_name, step2->s)) - cleanup_and_exit (1); - - dyn_string_delete (step2); - } - - /* - * Step 3. Call GCC/LD to again, adding the exp file this time. - * driver command line will look like the following: - * - * % gcc -Wl,--dll --Wl,--base-file,foo.base foo.exp [rest ...] - */ - - { - int quote; - - dyn_string_t step3 = dyn_string_new (driver_cmdline->length - + strlen (exp_file_name) - + strlen (base_file_name) - + 20); - dyn_string_append (step3, "-Wl,--base-file,"); - quote = (strchr (base_file_name, ' ') - || strchr (base_file_name, '\t')); - dyn_string_append (step3, - (quote) ? "\"" : ""); - dyn_string_append (step3, base_file_name); - dyn_string_append (step3, - (quote) ? "\" " : " "); - - quote = (strchr (exp_file_name, ' ') - || strchr (exp_file_name, '\t')); - dyn_string_append (step3, - (quote) ? "\"" : ""); - dyn_string_append (step3, exp_file_name); - dyn_string_append (step3, - (quote) ? "\"" : ""); - - if (driver_cmdline->length) - { - dyn_string_append (step3, " "); - dyn_string_append (step3, driver_cmdline->s); - } - - if (run (driver_name, step3->s)) - cleanup_and_exit (1); - - dyn_string_delete (step3); - } - - - /* - * Step 4. Run DLLTOOL again using the same command line. - */ - - { - int quote; - dyn_string_t step4 = dyn_string_new (dlltool_cmdline->length - + strlen (base_file_name) - + strlen (exp_file_name) - + 20); - - dyn_string_append (step4, "--base-file "); - quote = (strchr (base_file_name, ' ') - || strchr (base_file_name, '\t')); - dyn_string_append (step4, - (quote) ? "\"" : ""); - dyn_string_append (step4, base_file_name); - dyn_string_append (step4, - (quote) ? "\" " : " "); - - dyn_string_append (step4, "--output-exp "); - quote = (strchr (exp_file_name, ' ') - || strchr (exp_file_name, '\t')); - dyn_string_append (step4, - (quote) ? "\"" : ""); - dyn_string_append (step4, exp_file_name); - dyn_string_append (step4, - (quote) ? "\"" : ""); - - if (dlltool_cmdline->length) - { - dyn_string_append (step4, " "); - dyn_string_append (step4, dlltool_cmdline->s); - } - - if (output_lib_file_name) - { - dyn_string_append (step4, " --output-lib "); - dyn_string_append (step4, output_lib_file_name); - } - - if (run (dlltool_name, step4->s)) - cleanup_and_exit (1); - - dyn_string_delete (step4); - } - - - /* - * Step 5. Link it all together and be done with it. - * driver command line will look like the following: - * - * % gcc -Wl,--dll foo.exp [rest ...] - * - */ - - { - int quote; - - dyn_string_t step5 = dyn_string_new (driver_cmdline->length - + strlen (exp_file_name) - + 20); - quote = (strchr (exp_file_name, ' ') - || strchr (exp_file_name, '\t')); - dyn_string_append (step5, - (quote) ? "\"" : ""); - dyn_string_append (step5, exp_file_name); - dyn_string_append (step5, - (quote) ? "\"" : ""); - - if (driver_cmdline->length) - { - dyn_string_append (step5, " "); - dyn_string_append (step5, driver_cmdline->s); - } - - if (run (driver_name, step5->s)) - cleanup_and_exit (1); - - dyn_string_delete (step5); - } - - cleanup_and_exit (0); - - return 0; -} diff --git a/binutils/dyn-string.c b/binutils/dyn-string.c deleted file mode 100644 index a1640182765..00000000000 --- a/binutils/dyn-string.c +++ /dev/null @@ -1,107 +0,0 @@ -/* An abstract string datatype. - Copyright (C) 1998 Free Software Foundation, Inc. - Contributed by Mark Mitchell (mark@markmitchell.com). - - This file is part of GNU CC. - - GNU CC is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GNU CC is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file lives in at least two places: binutils and gcc. - Don't change one without the other. */ - -#include "config.h" -#ifdef IN_GCC -#include "system.h" -#include "gansidecl.h" -#else -#include "ansidecl.h" -#endif -#include "dyn-string.h" - -extern char *xmalloc (); -extern char *xrealloc (); - -/* Create a new dynamic string capable of holding at least SPACE - characters, including the terminating NUL. If SPACE is 0, it - will be silently increased to 1. */ - -dyn_string_t -dyn_string_new (space) - int space; -{ - dyn_string_t result = (dyn_string_t) xmalloc (sizeof (struct dyn_string)); - - if (space == 0) - /* We need at least one byte in which to store the terminating - NUL. */ - space = 1; - - result->allocated = space; - result->s = (char*) xmalloc (space); - result->length = 0; - result->s[0] = '\0'; - - return result; -} - -/* Free the memory used by DS. */ - -void -dyn_string_delete (ds) - dyn_string_t ds; -{ - free (ds->s); - free (ds); -} - -/* Append the NUL-terminated string S to DS, resizing DS if - necessary. */ - -dyn_string_t -dyn_string_append (ds, s) - dyn_string_t ds; - char *s; -{ - int len = strlen (s); - dyn_string_resize (ds, ds->length + len + 1 /* '\0' */); - strcpy (ds->s + ds->length, s); - ds->length += len; - - return ds; -} - -/* Increase the capacity of DS so that it can hold at least SPACE - characters, including the terminating NUL. This function will not - (at present) reduce the capacity of DS. */ - -dyn_string_t -dyn_string_resize (ds, space) - dyn_string_t ds; - int space; -{ - int new_allocated = ds->allocated; - - while (space > new_allocated) - new_allocated *= 2; - - if (new_allocated != ds->allocated) - { - /* We actually need more space. */ - ds->allocated = new_allocated; - ds->s = (char*) xrealloc (ds->s, ds->allocated); - } - - return ds; -} diff --git a/binutils/dyn-string.h b/binutils/dyn-string.h deleted file mode 100644 index cbd25c34734..00000000000 --- a/binutils/dyn-string.h +++ /dev/null @@ -1,34 +0,0 @@ -/* An abstract string datatype. - Copyright (C) 1998 Free Software Foundation, Inc. - Contributed by Mark Mitchell (mark@markmitchell.com). - - This file is part of GNU CC. - - GNU CC is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GNU CC is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file lives in at least two places: binutils and gcc. - Don't change one without the other. */ - -typedef struct dyn_string -{ - int allocated; /* The amount of space allocated for the string. */ - int length; /* The actual length of the string. */ - char *s; /* The string itself, NUL-terminated. */ -}* dyn_string_t; - -extern dyn_string_t dyn_string_new PARAMS((int)); -extern void dyn_string_delete PARAMS((dyn_string_t)); -extern dyn_string_t dyn_string_append PARAMS((dyn_string_t, char*)); -extern dyn_string_t dyn_string_resize PARAMS((dyn_string_t, int)); diff --git a/binutils/filemode.c b/binutils/filemode.c deleted file mode 100644 index f9811bc4926..00000000000 --- a/binutils/filemode.c +++ /dev/null @@ -1,266 +0,0 @@ -/* filemode.c -- make a string describing file modes - Copyright (C) 1985, 90, 91, 94, 95, 97, 1999 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include "bfd.h" -#include "bucomm.h" - -static char ftypelet PARAMS ((unsigned long)); -static void setst PARAMS ((unsigned long, char *)); - -/* filemodestring - fill in string STR with an ls-style ASCII - representation of the st_mode field of file stats block STATP. - 10 characters are stored in STR; no terminating null is added. - The characters stored in STR are: - - 0 File type. 'd' for directory, 'c' for character - special, 'b' for block special, 'm' for multiplex, - 'l' for symbolic link, 's' for socket, 'p' for fifo, - '-' for any other file type - - 1 'r' if the owner may read, '-' otherwise. - - 2 'w' if the owner may write, '-' otherwise. - - 3 'x' if the owner may execute, 's' if the file is - set-user-id, '-' otherwise. - 'S' if the file is set-user-id, but the execute - bit isn't set. - - 4 'r' if group members may read, '-' otherwise. - - 5 'w' if group members may write, '-' otherwise. - - 6 'x' if group members may execute, 's' if the file is - set-group-id, '-' otherwise. - 'S' if it is set-group-id but not executable. - - 7 'r' if any user may read, '-' otherwise. - - 8 'w' if any user may write, '-' otherwise. - - 9 'x' if any user may execute, 't' if the file is "sticky" - (will be retained in swap space after execution), '-' - otherwise. - 'T' if the file is sticky but not executable. */ - -#if 0 - -/* This is not used; only mode_string is used. */ - -void -filemodestring (statp, str) - struct stat *statp; - char *str; -{ - mode_string ((unsigned long) statp->st_mode, str); -} - -#endif - -/* Get definitions for the file permission bits. */ - -#ifndef S_IRWXU -#define S_IRWXU 0700 -#endif -#ifndef S_IRUSR -#define S_IRUSR 0400 -#endif -#ifndef S_IWUSR -#define S_IWUSR 0200 -#endif -#ifndef S_IXUSR -#define S_IXUSR 0100 -#endif - -#ifndef S_IRWXG -#define S_IRWXG 0070 -#endif -#ifndef S_IRGRP -#define S_IRGRP 0040 -#endif -#ifndef S_IWGRP -#define S_IWGRP 0020 -#endif -#ifndef S_IXGRP -#define S_IXGRP 0010 -#endif - -#ifndef S_IRWXO -#define S_IRWXO 0007 -#endif -#ifndef S_IROTH -#define S_IROTH 0004 -#endif -#ifndef S_IWOTH -#define S_IWOTH 0002 -#endif -#ifndef S_IXOTH -#define S_IXOTH 0001 -#endif - -/* Like filemodestring, but only the relevant part of the `struct stat' - is given as an argument. */ - -void -mode_string (mode, str) - unsigned long mode; - char *str; -{ - str[0] = ftypelet ((unsigned long) mode); - str[1] = (mode & S_IRUSR) != 0 ? 'r' : '-'; - str[2] = (mode & S_IWUSR) != 0 ? 'w' : '-'; - str[3] = (mode & S_IXUSR) != 0 ? 'x' : '-'; - str[4] = (mode & S_IRGRP) != 0 ? 'r' : '-'; - str[5] = (mode & S_IWGRP) != 0 ? 'w' : '-'; - str[6] = (mode & S_IXGRP) != 0 ? 'x' : '-'; - str[7] = (mode & S_IROTH) != 0 ? 'r' : '-'; - str[8] = (mode & S_IWOTH) != 0 ? 'w' : '-'; - str[9] = (mode & S_IXOTH) != 0 ? 'x' : '-'; - setst ((unsigned long) mode, str); -} - -/* Return a character indicating the type of file described by - file mode BITS: - 'd' for directories - 'b' for block special files - 'c' for character special files - 'm' for multiplexor files - 'l' for symbolic links - 's' for sockets - 'p' for fifos - '-' for any other file type. */ - -#ifndef S_ISDIR -#ifdef S_IFDIR -#define S_ISDIR(i) (((i) & S_IFMT) == S_IFDIR) -#else /* ! defined (S_IFDIR) */ -#define S_ISDIR(i) (((i) & 0170000) == 040000) -#endif /* ! defined (S_IFDIR) */ -#endif /* ! defined (S_ISDIR) */ - -#ifndef S_ISBLK -#ifdef S_IFBLK -#define S_ISBLK(i) (((i) & S_IFMT) == S_IFBLK) -#else /* ! defined (S_IFBLK) */ -#define S_ISBLK(i) 0 -#endif /* ! defined (S_IFBLK) */ -#endif /* ! defined (S_ISBLK) */ - -#ifndef S_ISCHR -#ifdef S_IFCHR -#define S_ISCHR(i) (((i) & S_IFMT) == S_IFCHR) -#else /* ! defined (S_IFCHR) */ -#define S_ISCHR(i) 0 -#endif /* ! defined (S_IFCHR) */ -#endif /* ! defined (S_ISCHR) */ - -#ifndef S_ISFIFO -#ifdef S_IFIFO -#define S_ISFIFO(i) (((i) & S_IFMT) == S_IFIFO) -#else /* ! defined (S_IFIFO) */ -#define S_ISFIFO(i) 0 -#endif /* ! defined (S_IFIFO) */ -#endif /* ! defined (S_ISFIFO) */ - -#ifndef S_ISSOCK -#ifdef S_IFSOCK -#define S_ISSOCK(i) (((i) & S_IFMT) == S_IFSOCK) -#else /* ! defined (S_IFSOCK) */ -#define S_ISSOCK(i) 0 -#endif /* ! defined (S_IFSOCK) */ -#endif /* ! defined (S_ISSOCK) */ - -#ifndef S_ISLNK -#ifdef S_IFLNK -#define S_ISLNK(i) (((i) & S_IFMT) == S_IFLNK) -#else /* ! defined (S_IFLNK) */ -#define S_ISLNK(i) 0 -#endif /* ! defined (S_IFLNK) */ -#endif /* ! defined (S_ISLNK) */ - -static char -ftypelet (bits) - unsigned long bits; -{ - if (S_ISDIR (bits)) - return 'd'; - if (S_ISLNK (bits)) - return 'l'; - if (S_ISBLK (bits)) - return 'b'; - if (S_ISCHR (bits)) - return 'c'; - if (S_ISSOCK (bits)) - return 's'; - if (S_ISFIFO (bits)) - return 'p'; - -#ifdef S_IFMT -#ifdef S_IFMPC - if ((bits & S_IFMT) == S_IFMPC - || (bits & S_IFMT) == S_IFMPB) - return 'm'; -#endif -#ifdef S_IFNWK - if ((bits & S_IFMT) == S_IFNWK) - return 'n'; -#endif -#endif - - return '-'; -} - -/* Set the 's' and 't' flags in file attributes string CHARS, - according to the file mode BITS. */ - -static void -setst (bits, chars) - unsigned long bits ATTRIBUTE_UNUSED; - char *chars ATTRIBUTE_UNUSED; -{ -#ifdef S_ISUID - if (bits & S_ISUID) - { - if (chars[3] != 'x') - /* Set-uid, but not executable by owner. */ - chars[3] = 'S'; - else - chars[3] = 's'; - } -#endif -#ifdef S_ISGID - if (bits & S_ISGID) - { - if (chars[6] != 'x') - /* Set-gid, but not executable by group. */ - chars[6] = 'S'; - else - chars[6] = 's'; - } -#endif -#ifdef S_ISVTX - if (bits & S_ISVTX) - { - if (chars[9] != 'x') - /* Sticky, but not executable by others. */ - chars[9] = 'T'; - else - chars[9] = 't'; - } -#endif -} diff --git a/binutils/ieee.c b/binutils/ieee.c deleted file mode 100644 index a3bb93b8d7f..00000000000 --- a/binutils/ieee.c +++ /dev/null @@ -1,7609 +0,0 @@ -/* ieee.c -- Read and write IEEE-695 debugging information. - Copyright (C) 1996, 1998, 1999 Free Software Foundation, Inc. - Written by Ian Lance Taylor . - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file reads and writes IEEE-695 debugging information. */ - -#include -#include - -#include "bfd.h" -#include "ieee.h" -#include "bucomm.h" -#include "libiberty.h" -#include "debug.h" -#include "budbg.h" - -/* This structure holds an entry on the block stack. */ - -struct ieee_block -{ - /* The kind of block. */ - int kind; - /* The source file name, for a BB5 block. */ - const char *filename; - /* The index of the function type, for a BB4 or BB6 block. */ - unsigned int fnindx; - /* True if this function is being skipped. */ - boolean skip; -}; - -/* This structure is the block stack. */ - -#define BLOCKSTACK_SIZE (16) - -struct ieee_blockstack -{ - /* The stack pointer. */ - struct ieee_block *bsp; - /* The stack. */ - struct ieee_block stack[BLOCKSTACK_SIZE]; -}; - -/* This structure holds information for a variable. */ - -struct ieee_var -{ - /* Start of name. */ - const char *name; - /* Length of name. */ - unsigned long namlen; - /* Type. */ - debug_type type; - /* Slot if we make an indirect type. */ - debug_type *pslot; - /* Kind of variable or function. */ - enum - { - IEEE_UNKNOWN, - IEEE_EXTERNAL, - IEEE_GLOBAL, - IEEE_STATIC, - IEEE_LOCAL, - IEEE_FUNCTION - } kind; -}; - -/* This structure holds all the variables. */ - -struct ieee_vars -{ - /* Number of slots allocated. */ - unsigned int alloc; - /* Variables. */ - struct ieee_var *vars; -}; - -/* This structure holds information for a type. We need this because - we don't want to represent bitfields as real types. */ - -struct ieee_type -{ - /* Type. */ - debug_type type; - /* Slot if this is type is referenced before it is defined. */ - debug_type *pslot; - /* Slots for arguments if we make indirect types for them. */ - debug_type *arg_slots; - /* If this is a bitfield, this is the size in bits. If this is not - a bitfield, this is zero. */ - unsigned long bitsize; -}; - -/* This structure holds all the type information. */ - -struct ieee_types -{ - /* Number of slots allocated. */ - unsigned int alloc; - /* Types. */ - struct ieee_type *types; - /* Builtin types. */ -#define BUILTIN_TYPE_COUNT (60) - debug_type builtins[BUILTIN_TYPE_COUNT]; -}; - -/* This structure holds a linked last of structs with their tag names, - so that we can convert them to C++ classes if necessary. */ - -struct ieee_tag -{ - /* Next tag. */ - struct ieee_tag *next; - /* This tag name. */ - const char *name; - /* The type of the tag. */ - debug_type type; - /* The tagged type is an indirect type pointing at this slot. */ - debug_type slot; - /* This is an array of slots used when a field type is converted - into a indirect type, in case it needs to be later converted into - a reference type. */ - debug_type *fslots; -}; - -/* This structure holds the information we pass around to the parsing - functions. */ - -struct ieee_info -{ - /* The debugging handle. */ - PTR dhandle; - /* The BFD. */ - bfd *abfd; - /* The start of the bytes to be parsed. */ - const bfd_byte *bytes; - /* The end of the bytes to be parsed. */ - const bfd_byte *pend; - /* The block stack. */ - struct ieee_blockstack blockstack; - /* Whether we have seen a BB1 or BB2. */ - boolean saw_filename; - /* The variables. */ - struct ieee_vars vars; - /* The global variables, after a global typedef block. */ - struct ieee_vars *global_vars; - /* The types. */ - struct ieee_types types; - /* The global types, after a global typedef block. */ - struct ieee_types *global_types; - /* The list of tagged structs. */ - struct ieee_tag *tags; -}; - -/* Basic builtin types, not including the pointers. */ - -enum builtin_types -{ - builtin_unknown = 0, - builtin_void = 1, - builtin_signed_char = 2, - builtin_unsigned_char = 3, - builtin_signed_short_int = 4, - builtin_unsigned_short_int = 5, - builtin_signed_long = 6, - builtin_unsigned_long = 7, - builtin_signed_long_long = 8, - builtin_unsigned_long_long = 9, - builtin_float = 10, - builtin_double = 11, - builtin_long_double = 12, - builtin_long_long_double = 13, - builtin_quoted_string = 14, - builtin_instruction_address = 15, - builtin_int = 16, - builtin_unsigned = 17, - builtin_unsigned_int = 18, - builtin_char = 19, - builtin_long = 20, - builtin_short = 21, - builtin_unsigned_short = 22, - builtin_short_int = 23, - builtin_signed_short = 24, - builtin_bcd_float = 25 -}; - -/* These are the values found in the derivation flags of a 'b' - component record of a 'T' type extension record in a C++ pmisc - record. These are bitmasks. */ - -/* Set for a private base class, clear for a public base class. - Protected base classes are not supported. */ -#define BASEFLAGS_PRIVATE (0x1) -/* Set for a virtual base class. */ -#define BASEFLAGS_VIRTUAL (0x2) -/* Set for a friend class, clear for a base class. */ -#define BASEFLAGS_FRIEND (0x10) - -/* These are the values found in the specs flags of a 'd', 'm', or 'v' - component record of a 'T' type extension record in a C++ pmisc - record. The same flags are used for a 'M' record in a C++ pmisc - record. */ - -/* The lower two bits hold visibility information. */ -#define CXXFLAGS_VISIBILITY (0x3) -/* This value in the lower two bits indicates a public member. */ -#define CXXFLAGS_VISIBILITY_PUBLIC (0x0) -/* This value in the lower two bits indicates a private member. */ -#define CXXFLAGS_VISIBILITY_PRIVATE (0x1) -/* This value in the lower two bits indicates a protected member. */ -#define CXXFLAGS_VISIBILITY_PROTECTED (0x2) -/* Set for a static member. */ -#define CXXFLAGS_STATIC (0x4) -/* Set for a virtual override. */ -#define CXXFLAGS_OVERRIDE (0x8) -/* Set for a friend function. */ -#define CXXFLAGS_FRIEND (0x10) -/* Set for a const function. */ -#define CXXFLAGS_CONST (0x20) -/* Set for a volatile function. */ -#define CXXFLAGS_VOLATILE (0x40) -/* Set for an overloaded function. */ -#define CXXFLAGS_OVERLOADED (0x80) -/* Set for an operator function. */ -#define CXXFLAGS_OPERATOR (0x100) -/* Set for a constructor or destructor. */ -#define CXXFLAGS_CTORDTOR (0x400) -/* Set for a constructor. */ -#define CXXFLAGS_CTOR (0x200) -/* Set for an inline function. */ -#define CXXFLAGS_INLINE (0x800) - -/* Local functions. */ - -static void ieee_error - PARAMS ((struct ieee_info *, const bfd_byte *, const char *)); -static void ieee_eof PARAMS ((struct ieee_info *)); -static char *savestring PARAMS ((const char *, unsigned long)); -static boolean ieee_read_number - PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *)); -static boolean ieee_read_optional_number - PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *, boolean *)); -static boolean ieee_read_id - PARAMS ((struct ieee_info *, const bfd_byte **, const char **, - unsigned long *)); -static boolean ieee_read_optional_id - PARAMS ((struct ieee_info *, const bfd_byte **, const char **, - unsigned long *, boolean *)); -static boolean ieee_read_expression - PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *)); -static debug_type ieee_builtin_type - PARAMS ((struct ieee_info *, const bfd_byte *, unsigned int)); -static boolean ieee_alloc_type - PARAMS ((struct ieee_info *, unsigned int, boolean)); -static boolean ieee_read_type_index - PARAMS ((struct ieee_info *, const bfd_byte **, debug_type *)); -static int ieee_regno_to_genreg PARAMS ((bfd *, int)); -static int ieee_genreg_to_regno PARAMS ((bfd *, int)); -static boolean parse_ieee_bb PARAMS ((struct ieee_info *, const bfd_byte **)); -static boolean parse_ieee_be PARAMS ((struct ieee_info *, const bfd_byte **)); -static boolean parse_ieee_nn PARAMS ((struct ieee_info *, const bfd_byte **)); -static boolean parse_ieee_ty PARAMS ((struct ieee_info *, const bfd_byte **)); -static boolean parse_ieee_atn PARAMS ((struct ieee_info *, const bfd_byte **)); -static boolean ieee_read_cxx_misc - PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long)); -static boolean ieee_read_cxx_class - PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long)); -static boolean ieee_read_cxx_defaults - PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long)); -static boolean ieee_read_reference - PARAMS ((struct ieee_info *, const bfd_byte **)); -static boolean ieee_require_asn - PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *)); -static boolean ieee_require_atn65 - PARAMS ((struct ieee_info *, const bfd_byte **, const char **, - unsigned long *)); - -/* Report an error in the IEEE debugging information. */ - -static void -ieee_error (info, p, s) - struct ieee_info *info; - const bfd_byte *p; - const char *s; -{ - if (p != NULL) - fprintf (stderr, "%s: 0x%lx: %s (0x%x)\n", bfd_get_filename (info->abfd), - (unsigned long) (p - info->bytes), s, *p); - else - fprintf (stderr, "%s: %s\n", bfd_get_filename (info->abfd), s); -} - -/* Report an unexpected EOF in the IEEE debugging information. */ - -static void -ieee_eof (info) - struct ieee_info *info; -{ - ieee_error (info, (const bfd_byte *) NULL, - _("unexpected end of debugging information")); -} - -/* Save a string in memory. */ - -static char * -savestring (start, len) - const char *start; - unsigned long len; -{ - char *ret; - - ret = (char *) xmalloc (len + 1); - memcpy (ret, start, len); - ret[len] = '\0'; - return ret; -} - -/* Read a number which must be present in an IEEE file. */ - -static boolean -ieee_read_number (info, pp, pv) - struct ieee_info *info; - const bfd_byte **pp; - bfd_vma *pv; -{ - return ieee_read_optional_number (info, pp, pv, (boolean *) NULL); -} - -/* Read a number in an IEEE file. If ppresent is not NULL, the number - need not be there. */ - -static boolean -ieee_read_optional_number (info, pp, pv, ppresent) - struct ieee_info *info; - const bfd_byte **pp; - bfd_vma *pv; - boolean *ppresent; -{ - ieee_record_enum_type b; - - if (*pp >= info->pend) - { - if (ppresent != NULL) - { - *ppresent = false; - return true; - } - ieee_eof (info); - return false; - } - - b = (ieee_record_enum_type) **pp; - ++*pp; - - if (b <= ieee_number_end_enum) - { - *pv = (bfd_vma) b; - if (ppresent != NULL) - *ppresent = true; - return true; - } - - if (b >= ieee_number_repeat_start_enum && b <= ieee_number_repeat_end_enum) - { - unsigned int i; - - i = (int) b - (int) ieee_number_repeat_start_enum; - if (*pp + i - 1 >= info->pend) - { - ieee_eof (info); - return false; - } - - *pv = 0; - for (; i > 0; i--) - { - *pv <<= 8; - *pv += **pp; - ++*pp; - } - - if (ppresent != NULL) - *ppresent = true; - - return true; - } - - if (ppresent != NULL) - { - --*pp; - *ppresent = false; - return true; - } - - ieee_error (info, *pp - 1, _("invalid number")); - return false; -} - -/* Read a required string from an IEEE file. */ - -static boolean -ieee_read_id (info, pp, pname, pnamlen) - struct ieee_info *info; - const bfd_byte **pp; - const char **pname; - unsigned long *pnamlen; -{ - return ieee_read_optional_id (info, pp, pname, pnamlen, (boolean *) NULL); -} - -/* Read a string from an IEEE file. If ppresent is not NULL, the - string is optional. */ - -static boolean -ieee_read_optional_id (info, pp, pname, pnamlen, ppresent) - struct ieee_info *info; - const bfd_byte **pp; - const char **pname; - unsigned long *pnamlen; - boolean *ppresent; -{ - bfd_byte b; - unsigned long len; - - if (*pp >= info->pend) - { - ieee_eof (info); - return false; - } - - b = **pp; - ++*pp; - - if (b <= 0x7f) - len = b; - else if ((ieee_record_enum_type) b == ieee_extension_length_1_enum) - { - len = **pp; - ++*pp; - } - else if ((ieee_record_enum_type) b == ieee_extension_length_2_enum) - { - len = (**pp << 8) + (*pp)[1]; - *pp += 2; - } - else - { - if (ppresent != NULL) - { - --*pp; - *ppresent = false; - return true; - } - ieee_error (info, *pp - 1, _("invalid string length")); - return false; - } - - if ((unsigned long) (info->pend - *pp) < len) - { - ieee_eof (info); - return false; - } - - *pname = (const char *) *pp; - *pnamlen = len; - *pp += len; - - if (ppresent != NULL) - *ppresent = true; - - return true; -} - -/* Read an expression from an IEEE file. Since this code is only used - to parse debugging information, I haven't bothered to write a full - blown IEEE expression parser. I've only thrown in the things I've - seen in debugging information. This can be easily extended if - necessary. */ - -static boolean -ieee_read_expression (info, pp, pv) - struct ieee_info *info; - const bfd_byte **pp; - bfd_vma *pv; -{ - const bfd_byte *expr_start; -#define EXPR_STACK_SIZE (10) - bfd_vma expr_stack[EXPR_STACK_SIZE]; - bfd_vma *esp; - - expr_start = *pp; - - esp = expr_stack; - - while (1) - { - const bfd_byte *start; - bfd_vma val; - boolean present; - ieee_record_enum_type c; - - start = *pp; - - if (! ieee_read_optional_number (info, pp, &val, &present)) - return false; - - if (present) - { - if (esp - expr_stack >= EXPR_STACK_SIZE) - { - ieee_error (info, start, _("expression stack overflow")); - return false; - } - *esp++ = val; - continue; - } - - c = (ieee_record_enum_type) **pp; - - if (c >= ieee_module_beginning_enum) - break; - - ++*pp; - - if (c == ieee_comma) - break; - - switch (c) - { - default: - ieee_error (info, start, _("unsupported IEEE expression operator")); - break; - - case ieee_variable_R_enum: - { - bfd_vma indx; - asection *s; - - if (! ieee_read_number (info, pp, &indx)) - return false; - for (s = info->abfd->sections; s != NULL; s = s->next) - if ((bfd_vma) s->target_index == indx) - break; - if (s == NULL) - { - ieee_error (info, start, _("unknown section")); - return false; - } - - if (esp - expr_stack >= EXPR_STACK_SIZE) - { - ieee_error (info, start, _("expression stack overflow")); - return false; - } - - *esp++ = bfd_get_section_vma (info->abfd, s); - } - break; - - case ieee_function_plus_enum: - case ieee_function_minus_enum: - { - bfd_vma v1, v2; - - if (esp - expr_stack < 2) - { - ieee_error (info, start, _("expression stack underflow")); - return false; - } - - v1 = *--esp; - v2 = *--esp; - *esp++ = v1 + v2; - } - break; - } - } - - if (esp - 1 != expr_stack) - { - ieee_error (info, expr_start, _("expression stack mismatch")); - return false; - } - - *pv = *--esp; - - return true; -} - -/* Return an IEEE builtin type. */ - -static debug_type -ieee_builtin_type (info, p, indx) - struct ieee_info *info; - const bfd_byte *p; - unsigned int indx; -{ - PTR dhandle; - debug_type type; - const char *name; - - if (indx < BUILTIN_TYPE_COUNT - && info->types.builtins[indx] != DEBUG_TYPE_NULL) - return info->types.builtins[indx]; - - dhandle = info->dhandle; - - if (indx >= 32 && indx < 64) - { - type = debug_make_pointer_type (dhandle, - ieee_builtin_type (info, p, indx - 32)); - assert (indx < BUILTIN_TYPE_COUNT); - info->types.builtins[indx] = type; - return type; - } - - switch ((enum builtin_types) indx) - { - default: - ieee_error (info, p, _("unknown builtin type")); - return NULL; - - case builtin_unknown: - type = debug_make_void_type (dhandle); - name = NULL; - break; - - case builtin_void: - type = debug_make_void_type (dhandle); - name = "void"; - break; - - case builtin_signed_char: - type = debug_make_int_type (dhandle, 1, false); - name = "signed char"; - break; - - case builtin_unsigned_char: - type = debug_make_int_type (dhandle, 1, true); - name = "unsigned char"; - break; - - case builtin_signed_short_int: - type = debug_make_int_type (dhandle, 2, false); - name = "signed short int"; - break; - - case builtin_unsigned_short_int: - type = debug_make_int_type (dhandle, 2, true); - name = "unsigned short int"; - break; - - case builtin_signed_long: - type = debug_make_int_type (dhandle, 4, false); - name = "signed long"; - break; - - case builtin_unsigned_long: - type = debug_make_int_type (dhandle, 4, true); - name = "unsigned long"; - break; - - case builtin_signed_long_long: - type = debug_make_int_type (dhandle, 8, false); - name = "signed long long"; - break; - - case builtin_unsigned_long_long: - type = debug_make_int_type (dhandle, 8, true); - name = "unsigned long long"; - break; - - case builtin_float: - type = debug_make_float_type (dhandle, 4); - name = "float"; - break; - - case builtin_double: - type = debug_make_float_type (dhandle, 8); - name = "double"; - break; - - case builtin_long_double: - /* FIXME: The size for this type should depend upon the - processor. */ - type = debug_make_float_type (dhandle, 12); - name = "long double"; - break; - - case builtin_long_long_double: - type = debug_make_float_type (dhandle, 16); - name = "long long double"; - break; - - case builtin_quoted_string: - type = debug_make_array_type (dhandle, - ieee_builtin_type (info, p, - ((unsigned int) - builtin_char)), - ieee_builtin_type (info, p, - ((unsigned int) - builtin_int)), - 0, -1, true); - name = "QUOTED STRING"; - break; - - case builtin_instruction_address: - /* FIXME: This should be a code address. */ - type = debug_make_int_type (dhandle, 4, true); - name = "instruction address"; - break; - - case builtin_int: - /* FIXME: The size for this type should depend upon the - processor. */ - type = debug_make_int_type (dhandle, 4, false); - name = "int"; - break; - - case builtin_unsigned: - /* FIXME: The size for this type should depend upon the - processor. */ - type = debug_make_int_type (dhandle, 4, true); - name = "unsigned"; - break; - - case builtin_unsigned_int: - /* FIXME: The size for this type should depend upon the - processor. */ - type = debug_make_int_type (dhandle, 4, true); - name = "unsigned int"; - break; - - case builtin_char: - type = debug_make_int_type (dhandle, 1, false); - name = "char"; - break; - - case builtin_long: - type = debug_make_int_type (dhandle, 4, false); - name = "long"; - break; - - case builtin_short: - type = debug_make_int_type (dhandle, 2, false); - name = "short"; - break; - - case builtin_unsigned_short: - type = debug_make_int_type (dhandle, 2, true); - name = "unsigned short"; - break; - - case builtin_short_int: - type = debug_make_int_type (dhandle, 2, false); - name = "short int"; - break; - - case builtin_signed_short: - type = debug_make_int_type (dhandle, 2, false); - name = "signed short"; - break; - - case builtin_bcd_float: - ieee_error (info, p, _("BCD float type not supported")); - return DEBUG_TYPE_NULL; - } - - if (name != NULL) - type = debug_name_type (dhandle, name, type); - - assert (indx < BUILTIN_TYPE_COUNT); - - info->types.builtins[indx] = type; - - return type; -} - -/* Allocate more space in the type table. If ref is true, this is a - reference to the type; if it is not already defined, we should set - up an indirect type. */ - -static boolean -ieee_alloc_type (info, indx, ref) - struct ieee_info *info; - unsigned int indx; - boolean ref; -{ - unsigned int nalloc; - register struct ieee_type *t; - struct ieee_type *tend; - - if (indx >= info->types.alloc) - { - nalloc = info->types.alloc; - if (nalloc == 0) - nalloc = 4; - while (indx >= nalloc) - nalloc *= 2; - - info->types.types = ((struct ieee_type *) - xrealloc (info->types.types, - nalloc * sizeof *info->types.types)); - - memset (info->types.types + info->types.alloc, 0, - (nalloc - info->types.alloc) * sizeof *info->types.types); - - tend = info->types.types + nalloc; - for (t = info->types.types + info->types.alloc; t < tend; t++) - t->type = DEBUG_TYPE_NULL; - - info->types.alloc = nalloc; - } - - if (ref) - { - t = info->types.types + indx; - if (t->type == NULL) - { - t->pslot = (debug_type *) xmalloc (sizeof *t->pslot); - *t->pslot = DEBUG_TYPE_NULL; - t->type = debug_make_indirect_type (info->dhandle, t->pslot, - (const char *) NULL); - if (t->type == NULL) - return false; - } - } - - return true; -} - -/* Read a type index and return the corresponding type. */ - -static boolean -ieee_read_type_index (info, pp, ptype) - struct ieee_info *info; - const bfd_byte **pp; - debug_type *ptype; -{ - const bfd_byte *start; - bfd_vma indx; - - start = *pp; - - if (! ieee_read_number (info, pp, &indx)) - return false; - - if (indx < 256) - { - *ptype = ieee_builtin_type (info, start, indx); - if (*ptype == NULL) - return false; - return true; - } - - indx -= 256; - if (! ieee_alloc_type (info, indx, true)) - return false; - - *ptype = info->types.types[indx].type; - - return true; -} - -/* Parse IEEE debugging information for a file. This is passed the - bytes which compose the Debug Information Part of an IEEE file. */ - -boolean -parse_ieee (dhandle, abfd, bytes, len) - PTR dhandle; - bfd *abfd; - const bfd_byte *bytes; - bfd_size_type len; -{ - struct ieee_info info; - unsigned int i; - const bfd_byte *p, *pend; - - info.dhandle = dhandle; - info.abfd = abfd; - info.bytes = bytes; - info.pend = bytes + len; - info.blockstack.bsp = info.blockstack.stack; - info.saw_filename = false; - info.vars.alloc = 0; - info.vars.vars = NULL; - info.global_vars = NULL; - info.types.alloc = 0; - info.types.types = NULL; - info.global_types = NULL; - info.tags = NULL; - for (i = 0; i < BUILTIN_TYPE_COUNT; i++) - info.types.builtins[i] = DEBUG_TYPE_NULL; - - p = bytes; - pend = info.pend; - while (p < pend) - { - const bfd_byte *record_start; - ieee_record_enum_type c; - - record_start = p; - - c = (ieee_record_enum_type) *p++; - - if (c == ieee_at_record_enum) - c = (ieee_record_enum_type) (((unsigned int) c << 8) | *p++); - - if (c <= ieee_number_repeat_end_enum) - { - ieee_error (&info, record_start, _("unexpected number")); - return false; - } - - switch (c) - { - default: - ieee_error (&info, record_start, _("unexpected record type")); - return false; - - case ieee_bb_record_enum: - if (! parse_ieee_bb (&info, &p)) - return false; - break; - - case ieee_be_record_enum: - if (! parse_ieee_be (&info, &p)) - return false; - break; - - case ieee_nn_record: - if (! parse_ieee_nn (&info, &p)) - return false; - break; - - case ieee_ty_record_enum: - if (! parse_ieee_ty (&info, &p)) - return false; - break; - - case ieee_atn_record_enum: - if (! parse_ieee_atn (&info, &p)) - return false; - break; - } - } - - if (info.blockstack.bsp != info.blockstack.stack) - { - ieee_error (&info, (const bfd_byte *) NULL, - _("blocks left on stack at end")); - return false; - } - - return true; -} - -/* Handle an IEEE BB record. */ - -static boolean -parse_ieee_bb (info, pp) - struct ieee_info *info; - const bfd_byte **pp; -{ - const bfd_byte *block_start; - bfd_byte b; - bfd_vma size; - const char *name; - unsigned long namlen; - char *namcopy = NULL; - unsigned int fnindx; - boolean skip; - - block_start = *pp; - - b = **pp; - ++*pp; - - if (! ieee_read_number (info, pp, &size) - || ! ieee_read_id (info, pp, &name, &namlen)) - return false; - - fnindx = (unsigned int) -1; - skip = false; - - switch (b) - { - case 1: - /* BB1: Type definitions local to a module. */ - namcopy = savestring (name, namlen); - if (namcopy == NULL) - return false; - if (! debug_set_filename (info->dhandle, namcopy)) - return false; - info->saw_filename = true; - - /* Discard any variables or types we may have seen before. */ - if (info->vars.vars != NULL) - free (info->vars.vars); - info->vars.vars = NULL; - info->vars.alloc = 0; - if (info->types.types != NULL) - free (info->types.types); - info->types.types = NULL; - info->types.alloc = 0; - - /* Initialize the types to the global types. */ - if (info->global_types != NULL) - { - info->types.alloc = info->global_types->alloc; - info->types.types = ((struct ieee_type *) - xmalloc (info->types.alloc - * sizeof (*info->types.types))); - memcpy (info->types.types, info->global_types->types, - info->types.alloc * sizeof (*info->types.types)); - } - - break; - - case 2: - /* BB2: Global type definitions. The name is supposed to be - empty, but we don't check. */ - if (! debug_set_filename (info->dhandle, "*global*")) - return false; - info->saw_filename = true; - break; - - case 3: - /* BB3: High level module block begin. We don't have to do - anything here. The name is supposed to be the same as for - the BB1, but we don't check. */ - break; - - case 4: - /* BB4: Global function. */ - { - bfd_vma stackspace, typindx, offset; - debug_type return_type; - - if (! ieee_read_number (info, pp, &stackspace) - || ! ieee_read_number (info, pp, &typindx) - || ! ieee_read_expression (info, pp, &offset)) - return false; - - /* We have no way to record the stack space. FIXME. */ - - if (typindx < 256) - { - return_type = ieee_builtin_type (info, block_start, typindx); - if (return_type == DEBUG_TYPE_NULL) - return false; - } - else - { - typindx -= 256; - if (! ieee_alloc_type (info, typindx, true)) - return false; - fnindx = typindx; - return_type = info->types.types[typindx].type; - if (debug_get_type_kind (info->dhandle, return_type) - == DEBUG_KIND_FUNCTION) - return_type = debug_get_return_type (info->dhandle, - return_type); - } - - namcopy = savestring (name, namlen); - if (namcopy == NULL) - return false; - if (! debug_record_function (info->dhandle, namcopy, return_type, - true, offset)) - return false; - } - break; - - case 5: - /* BB5: File name for source line numbers. */ - { - unsigned int i; - - /* We ignore the date and time. FIXME. */ - for (i = 0; i < 6; i++) - { - bfd_vma ignore; - boolean present; - - if (! ieee_read_optional_number (info, pp, &ignore, &present)) - return false; - if (! present) - break; - } - - namcopy = savestring (name, namlen); - if (namcopy == NULL) - return false; - if (! debug_start_source (info->dhandle, namcopy)) - return false; - } - break; - - case 6: - /* BB6: Local function or block. */ - { - bfd_vma stackspace, typindx, offset; - - if (! ieee_read_number (info, pp, &stackspace) - || ! ieee_read_number (info, pp, &typindx) - || ! ieee_read_expression (info, pp, &offset)) - return false; - - /* We have no way to record the stack space. FIXME. */ - - if (namlen == 0) - { - if (! debug_start_block (info->dhandle, offset)) - return false; - /* Change b to indicate that this is a block - rather than a function. */ - b = 0x86; - } - else - { - /* The MRI C++ compiler will output a fake function named - __XRYCPP to hold C++ debugging information. We skip - that function. This is not crucial, but it makes - converting from IEEE to other debug formats work - better. */ - if (strncmp (name, "__XRYCPP", namlen) == 0) - skip = true; - else - { - debug_type return_type; - - if (typindx < 256) - { - return_type = ieee_builtin_type (info, block_start, - typindx); - if (return_type == NULL) - return false; - } - else - { - typindx -= 256; - if (! ieee_alloc_type (info, typindx, true)) - return false; - fnindx = typindx; - return_type = info->types.types[typindx].type; - if (debug_get_type_kind (info->dhandle, return_type) - == DEBUG_KIND_FUNCTION) - return_type = debug_get_return_type (info->dhandle, - return_type); - } - - namcopy = savestring (name, namlen); - if (namcopy == NULL) - return false; - if (! debug_record_function (info->dhandle, namcopy, - return_type, false, offset)) - return false; - } - } - } - break; - - case 10: - /* BB10: Assembler module scope. In the normal case, we - completely ignore all this information. FIXME. */ - { - const char *inam, *vstr; - unsigned long inamlen, vstrlen; - bfd_vma tool_type; - boolean present; - unsigned int i; - - if (! info->saw_filename) - { - namcopy = savestring (name, namlen); - if (namcopy == NULL) - return false; - if (! debug_set_filename (info->dhandle, namcopy)) - return false; - info->saw_filename = true; - } - - if (! ieee_read_id (info, pp, &inam, &inamlen) - || ! ieee_read_number (info, pp, &tool_type) - || ! ieee_read_optional_id (info, pp, &vstr, &vstrlen, &present)) - return false; - for (i = 0; i < 6; i++) - { - bfd_vma ignore; - - if (! ieee_read_optional_number (info, pp, &ignore, &present)) - return false; - if (! present) - break; - } - } - break; - - case 11: - /* BB11: Module section. We completely ignore all this - information. FIXME. */ - { - bfd_vma sectype, secindx, offset, map; - boolean present; - - if (! ieee_read_number (info, pp, §ype) - || ! ieee_read_number (info, pp, &secindx) - || ! ieee_read_expression (info, pp, &offset) - || ! ieee_read_optional_number (info, pp, &map, &present)) - return false; - } - break; - - default: - ieee_error (info, block_start, _("unknown BB type")); - return false; - } - - - /* Push this block on the block stack. */ - - if (info->blockstack.bsp >= info->blockstack.stack + BLOCKSTACK_SIZE) - { - ieee_error (info, (const bfd_byte *) NULL, _("stack overflow")); - return false; - } - - info->blockstack.bsp->kind = b; - if (b == 5) - info->blockstack.bsp->filename = namcopy; - info->blockstack.bsp->fnindx = fnindx; - info->blockstack.bsp->skip = skip; - ++info->blockstack.bsp; - - return true; -} - -/* Handle an IEEE BE record. */ - -static boolean -parse_ieee_be (info, pp) - struct ieee_info *info; - const bfd_byte **pp; -{ - bfd_vma offset; - - if (info->blockstack.bsp <= info->blockstack.stack) - { - ieee_error (info, *pp, _("stack underflow")); - return false; - } - --info->blockstack.bsp; - - switch (info->blockstack.bsp->kind) - { - case 2: - /* When we end the global typedefs block, we copy out the the - contents of info->vars. This is because the variable indices - may be reused in the local blocks. However, we need to - preserve them so that we can locate a function returning a - reference variable whose type is named in the global typedef - block. */ - info->global_vars = ((struct ieee_vars *) - xmalloc (sizeof *info->global_vars)); - info->global_vars->alloc = info->vars.alloc; - info->global_vars->vars = ((struct ieee_var *) - xmalloc (info->vars.alloc - * sizeof (*info->vars.vars))); - memcpy (info->global_vars->vars, info->vars.vars, - info->vars.alloc * sizeof (*info->vars.vars)); - - /* We also copy out the non builtin parts of info->types, since - the types are discarded when we start a new block. */ - info->global_types = ((struct ieee_types *) - xmalloc (sizeof *info->global_types)); - info->global_types->alloc = info->types.alloc; - info->global_types->types = ((struct ieee_type *) - xmalloc (info->types.alloc - * sizeof (*info->types.types))); - memcpy (info->global_types->types, info->types.types, - info->types.alloc * sizeof (*info->types.types)); - memset (info->global_types->builtins, 0, - sizeof (info->global_types->builtins)); - - break; - - case 4: - case 6: - if (! ieee_read_expression (info, pp, &offset)) - return false; - if (! info->blockstack.bsp->skip) - { - if (! debug_end_function (info->dhandle, offset + 1)) - return false; - } - break; - - case 0x86: - /* This is BE6 when BB6 started a block rather than a local - function. */ - if (! ieee_read_expression (info, pp, &offset)) - return false; - if (! debug_end_block (info->dhandle, offset + 1)) - return false; - break; - - case 5: - /* When we end a BB5, we look up the stack for the last BB5, if - there is one, so that we can call debug_start_source. */ - if (info->blockstack.bsp > info->blockstack.stack) - { - struct ieee_block *bl; - - bl = info->blockstack.bsp; - do - { - --bl; - if (bl->kind == 5) - { - if (! debug_start_source (info->dhandle, bl->filename)) - return false; - break; - } - } - while (bl != info->blockstack.stack); - } - break; - - case 11: - if (! ieee_read_expression (info, pp, &offset)) - return false; - /* We just ignore the module size. FIXME. */ - break; - - default: - /* Other block types do not have any trailing information. */ - break; - } - - return true; -} - -/* Parse an NN record. */ - -static boolean -parse_ieee_nn (info, pp) - struct ieee_info *info; - const bfd_byte **pp; -{ - const bfd_byte *nn_start; - bfd_vma varindx; - const char *name; - unsigned long namlen; - - nn_start = *pp; - - if (! ieee_read_number (info, pp, &varindx) - || ! ieee_read_id (info, pp, &name, &namlen)) - return false; - - if (varindx < 32) - { - ieee_error (info, nn_start, _("illegal variable index")); - return false; - } - varindx -= 32; - - if (varindx >= info->vars.alloc) - { - unsigned int alloc; - - alloc = info->vars.alloc; - if (alloc == 0) - alloc = 4; - while (varindx >= alloc) - alloc *= 2; - info->vars.vars = ((struct ieee_var *) - xrealloc (info->vars.vars, - alloc * sizeof *info->vars.vars)); - memset (info->vars.vars + info->vars.alloc, 0, - (alloc - info->vars.alloc) * sizeof *info->vars.vars); - info->vars.alloc = alloc; - } - - info->vars.vars[varindx].name = name; - info->vars.vars[varindx].namlen = namlen; - - return true; -} - -/* Parse a TY record. */ - -static boolean -parse_ieee_ty (info, pp) - struct ieee_info *info; - const bfd_byte **pp; -{ - const bfd_byte *ty_start, *ty_var_start, *ty_code_start; - bfd_vma typeindx, varindx, tc; - PTR dhandle; - boolean tag, typdef; - debug_type *arg_slots; - unsigned long type_bitsize; - debug_type type; - - ty_start = *pp; - - if (! ieee_read_number (info, pp, &typeindx)) - return false; - - if (typeindx < 256) - { - ieee_error (info, ty_start, _("illegal type index")); - return false; - } - - typeindx -= 256; - if (! ieee_alloc_type (info, typeindx, false)) - return false; - - if (**pp != 0xce) - { - ieee_error (info, *pp, _("unknown TY code")); - return false; - } - ++*pp; - - ty_var_start = *pp; - - if (! ieee_read_number (info, pp, &varindx)) - return false; - - if (varindx < 32) - { - ieee_error (info, ty_var_start, _("illegal variable index")); - return false; - } - varindx -= 32; - - if (varindx >= info->vars.alloc || info->vars.vars[varindx].name == NULL) - { - ieee_error (info, ty_var_start, _("undefined variable in TY")); - return false; - } - - ty_code_start = *pp; - - if (! ieee_read_number (info, pp, &tc)) - return false; - - dhandle = info->dhandle; - - tag = false; - typdef = false; - arg_slots = NULL; - type_bitsize = 0; - switch (tc) - { - default: - ieee_error (info, ty_code_start, _("unknown TY code")); - return false; - - case '!': - /* Unknown type, with size. We treat it as int. FIXME. */ - { - bfd_vma size; - - if (! ieee_read_number (info, pp, &size)) - return false; - type = debug_make_int_type (dhandle, size, false); - } - break; - - case 'A': /* Array. */ - case 'a': /* FORTRAN array in column/row order. FIXME: Not - distinguished from normal array. */ - { - debug_type ele_type; - bfd_vma lower, upper; - - if (! ieee_read_type_index (info, pp, &ele_type) - || ! ieee_read_number (info, pp, &lower) - || ! ieee_read_number (info, pp, &upper)) - return false; - type = debug_make_array_type (dhandle, ele_type, - ieee_builtin_type (info, ty_code_start, - ((unsigned int) - builtin_int)), - (bfd_signed_vma) lower, - (bfd_signed_vma) upper, - false); - } - break; - - case 'E': - /* Simple enumeration. */ - { - bfd_vma size; - unsigned int alloc; - const char **names; - unsigned int c; - bfd_signed_vma *vals; - unsigned int i; - - if (! ieee_read_number (info, pp, &size)) - return false; - /* FIXME: we ignore the enumeration size. */ - - alloc = 10; - names = (const char **) xmalloc (alloc * sizeof *names); - memset (names, 0, alloc * sizeof *names); - c = 0; - while (1) - { - const char *name; - unsigned long namlen; - boolean present; - - if (! ieee_read_optional_id (info, pp, &name, &namlen, &present)) - return false; - if (! present) - break; - - if (c + 1 >= alloc) - { - alloc += 10; - names = ((const char **) - xrealloc (names, alloc * sizeof *names)); - } - - names[c] = savestring (name, namlen); - if (names[c] == NULL) - return false; - ++c; - } - - names[c] = NULL; - - vals = (bfd_signed_vma *) xmalloc (c * sizeof *vals); - for (i = 0; i < c; i++) - vals[i] = i; - - type = debug_make_enum_type (dhandle, names, vals); - tag = true; - } - break; - - case 'G': - /* Struct with bit fields. */ - { - bfd_vma size; - unsigned int alloc; - debug_field *fields; - unsigned int c; - - if (! ieee_read_number (info, pp, &size)) - return false; - - alloc = 10; - fields = (debug_field *) xmalloc (alloc * sizeof *fields); - c = 0; - while (1) - { - const char *name; - unsigned long namlen; - boolean present; - debug_type ftype; - bfd_vma bitpos, bitsize; - - if (! ieee_read_optional_id (info, pp, &name, &namlen, &present)) - return false; - if (! present) - break; - if (! ieee_read_type_index (info, pp, &ftype) - || ! ieee_read_number (info, pp, &bitpos) - || ! ieee_read_number (info, pp, &bitsize)) - return false; - - if (c + 1 >= alloc) - { - alloc += 10; - fields = ((debug_field *) - xrealloc (fields, alloc * sizeof *fields)); - } - - fields[c] = debug_make_field (dhandle, savestring (name, namlen), - ftype, bitpos, bitsize, - DEBUG_VISIBILITY_PUBLIC); - if (fields[c] == NULL) - return false; - ++c; - } - - fields[c] = NULL; - - type = debug_make_struct_type (dhandle, true, size, fields); - tag = true; - } - break; - - case 'N': - /* Enumeration. */ - { - unsigned int alloc; - const char **names; - bfd_signed_vma *vals; - unsigned int c; - - alloc = 10; - names = (const char **) xmalloc (alloc * sizeof *names); - vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *names); - c = 0; - while (1) - { - const char *name; - unsigned long namlen; - boolean present; - bfd_vma val; - - if (! ieee_read_optional_id (info, pp, &name, &namlen, &present)) - return false; - if (! present) - break; - if (! ieee_read_number (info, pp, &val)) - return false; - - /* If the length of the name is zero, then the value is - actually the size of the enum. We ignore this - information. FIXME. */ - if (namlen == 0) - continue; - - if (c + 1 >= alloc) - { - alloc += 10; - names = ((const char **) - xrealloc (names, alloc * sizeof *names)); - vals = ((bfd_signed_vma *) - xrealloc (vals, alloc * sizeof *vals)); - } - - names[c] = savestring (name, namlen); - if (names[c] == NULL) - return false; - vals[c] = (bfd_signed_vma) val; - ++c; - } - - names[c] = NULL; - - type = debug_make_enum_type (dhandle, names, vals); - tag = true; - } - break; - - case 'O': /* Small pointer. We don't distinguish small and large - pointers. FIXME. */ - case 'P': /* Large pointer. */ - { - debug_type t; - - if (! ieee_read_type_index (info, pp, &t)) - return false; - type = debug_make_pointer_type (dhandle, t); - } - break; - - case 'R': - /* Range. */ - { - bfd_vma low, high, signedp, size; - - if (! ieee_read_number (info, pp, &low) - || ! ieee_read_number (info, pp, &high) - || ! ieee_read_number (info, pp, &signedp) - || ! ieee_read_number (info, pp, &size)) - return false; - - type = debug_make_range_type (dhandle, - debug_make_int_type (dhandle, size, - ! signedp), - (bfd_signed_vma) low, - (bfd_signed_vma) high); - } - break; - - case 'S': /* Struct. */ - case 'U': /* Union. */ - { - bfd_vma size; - unsigned int alloc; - debug_field *fields; - unsigned int c; - - if (! ieee_read_number (info, pp, &size)) - return false; - - alloc = 10; - fields = (debug_field *) xmalloc (alloc * sizeof *fields); - c = 0; - while (1) - { - const char *name; - unsigned long namlen; - boolean present; - bfd_vma tindx; - bfd_vma offset; - debug_type ftype; - bfd_vma bitsize; - - if (! ieee_read_optional_id (info, pp, &name, &namlen, &present)) - return false; - if (! present) - break; - if (! ieee_read_number (info, pp, &tindx) - || ! ieee_read_number (info, pp, &offset)) - return false; - - if (tindx < 256) - { - ftype = ieee_builtin_type (info, ty_code_start, tindx); - bitsize = 0; - offset *= 8; - } - else - { - struct ieee_type *t; - - tindx -= 256; - if (! ieee_alloc_type (info, tindx, true)) - return false; - t = info->types.types + tindx; - ftype = t->type; - bitsize = t->bitsize; - if (bitsize == 0) - offset *= 8; - } - - if (c + 1 >= alloc) - { - alloc += 10; - fields = ((debug_field *) - xrealloc (fields, alloc * sizeof *fields)); - } - - fields[c] = debug_make_field (dhandle, savestring (name, namlen), - ftype, offset, bitsize, - DEBUG_VISIBILITY_PUBLIC); - if (fields[c] == NULL) - return false; - ++c; - } - - fields[c] = NULL; - - type = debug_make_struct_type (dhandle, tc == 'S', size, fields); - tag = true; - } - break; - - case 'T': - /* Typedef. */ - if (! ieee_read_type_index (info, pp, &type)) - return false; - typdef = true; - break; - - case 'X': - /* Procedure. FIXME: This is an extern declaration, which we - have no way of representing. */ - { - bfd_vma attr; - debug_type rtype; - bfd_vma nargs; - boolean present; - struct ieee_var *pv; - - /* FIXME: We ignore the attribute and the argument names. */ - - if (! ieee_read_number (info, pp, &attr) - || ! ieee_read_type_index (info, pp, &rtype) - || ! ieee_read_number (info, pp, &nargs)) - return false; - do - { - const char *name; - unsigned long namlen; - - if (! ieee_read_optional_id (info, pp, &name, &namlen, &present)) - return false; - } - while (present); - - pv = info->vars.vars + varindx; - pv->kind = IEEE_EXTERNAL; - if (pv->namlen > 0 - && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER) - { - /* Set up the return type as an indirect type pointing to - the variable slot, so that we can change it to a - reference later if appropriate. */ - pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot); - *pv->pslot = rtype; - rtype = debug_make_indirect_type (dhandle, pv->pslot, - (const char *) NULL); - } - - type = debug_make_function_type (dhandle, rtype, (debug_type *) NULL, - false); - } - break; - - case 'V': - /* Void. This is not documented, but the MRI compiler emits it. */ - type = debug_make_void_type (dhandle); - break; - - case 'Z': - /* Array with 0 lower bound. */ - { - debug_type etype; - bfd_vma high; - - if (! ieee_read_type_index (info, pp, &etype) - || ! ieee_read_number (info, pp, &high)) - return false; - - type = debug_make_array_type (dhandle, etype, - ieee_builtin_type (info, ty_code_start, - ((unsigned int) - builtin_int)), - 0, (bfd_signed_vma) high, false); - } - break; - - case 'c': /* Complex. */ - case 'd': /* Double complex. */ - { - const char *name; - unsigned long namlen; - - /* FIXME: I don't know what the name means. */ - - if (! ieee_read_id (info, pp, &name, &namlen)) - return false; - - type = debug_make_complex_type (dhandle, tc == 'c' ? 4 : 8); - } - break; - - case 'f': - /* Pascal file name. FIXME. */ - ieee_error (info, ty_code_start, _("Pascal file name not supported")); - return false; - - case 'g': - /* Bitfield type. */ - { - bfd_vma signedp, bitsize, dummy; - const bfd_byte *hold; - boolean present; - - if (! ieee_read_number (info, pp, &signedp) - || ! ieee_read_number (info, pp, &bitsize)) - return false; - - /* I think the documentation says that there is a type index, - but some actual files do not have one. */ - hold = *pp; - if (! ieee_read_optional_number (info, pp, &dummy, &present)) - return false; - if (! present) - { - /* FIXME: This is just a guess. */ - type = debug_make_int_type (dhandle, 4, - signedp ? false : true); - } - else - { - *pp = hold; - if (! ieee_read_type_index (info, pp, &type)) - return false; - } - type_bitsize = bitsize; - } - break; - - case 'n': - /* Qualifier. */ - { - bfd_vma kind; - debug_type t; - - if (! ieee_read_number (info, pp, &kind) - || ! ieee_read_type_index (info, pp, &t)) - return false; - - switch (kind) - { - default: - ieee_error (info, ty_start, _("unsupported qualifer")); - return false; - - case 1: - type = debug_make_const_type (dhandle, t); - break; - - case 2: - type = debug_make_volatile_type (dhandle, t); - break; - } - } - break; - - case 's': - /* Set. */ - { - bfd_vma size; - debug_type etype; - - if (! ieee_read_number (info, pp, &size) - || ! ieee_read_type_index (info, pp, &etype)) - return false; - - /* FIXME: We ignore the size. */ - - type = debug_make_set_type (dhandle, etype, false); - } - break; - - case 'x': - /* Procedure with compiler dependencies. */ - { - struct ieee_var *pv; - bfd_vma attr, frame_type, push_mask, nargs, level, father; - debug_type rtype; - debug_type *arg_types; - boolean varargs; - boolean present; - - /* FIXME: We ignore some of this information. */ - - pv = info->vars.vars + varindx; - - if (! ieee_read_number (info, pp, &attr) - || ! ieee_read_number (info, pp, &frame_type) - || ! ieee_read_number (info, pp, &push_mask) - || ! ieee_read_type_index (info, pp, &rtype) - || ! ieee_read_number (info, pp, &nargs)) - return false; - if (nargs == (bfd_vma) -1) - { - arg_types = NULL; - varargs = false; - } - else - { - unsigned int i; - - arg_types = ((debug_type *) - xmalloc ((nargs + 1) * sizeof *arg_types)); - for (i = 0; i < nargs; i++) - if (! ieee_read_type_index (info, pp, arg_types + i)) - return false; - - /* If the last type is pointer to void, this is really a - varargs function. */ - varargs = false; - if (nargs > 0) - { - debug_type last; - - last = arg_types[nargs - 1]; - if (debug_get_type_kind (dhandle, last) == DEBUG_KIND_POINTER - && (debug_get_type_kind (dhandle, - debug_get_target_type (dhandle, - last)) - == DEBUG_KIND_VOID)) - { - --nargs; - varargs = true; - } - } - - /* If there are any pointer arguments, turn them into - indirect types in case we later need to convert them to - reference types. */ - for (i = 0; i < nargs; i++) - { - if (debug_get_type_kind (dhandle, arg_types[i]) - == DEBUG_KIND_POINTER) - { - if (arg_slots == NULL) - { - arg_slots = ((debug_type *) - xmalloc (nargs * sizeof *arg_slots)); - memset (arg_slots, 0, nargs * sizeof *arg_slots); - } - arg_slots[i] = arg_types[i]; - arg_types[i] = - debug_make_indirect_type (dhandle, - arg_slots + i, - (const char *) NULL); - } - } - - arg_types[nargs] = DEBUG_TYPE_NULL; - } - if (! ieee_read_number (info, pp, &level) - || ! ieee_read_optional_number (info, pp, &father, &present)) - return false; - - /* We can't distinguish between a global function and a static - function. */ - pv->kind = IEEE_FUNCTION; - - if (pv->namlen > 0 - && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER) - { - /* Set up the return type as an indirect type pointing to - the variable slot, so that we can change it to a - reference later if appropriate. */ - pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot); - *pv->pslot = rtype; - rtype = debug_make_indirect_type (dhandle, pv->pslot, - (const char *) NULL); - } - - type = debug_make_function_type (dhandle, rtype, arg_types, varargs); - } - break; - } - - /* Record the type in the table. */ - - if (type == DEBUG_TYPE_NULL) - return false; - - info->vars.vars[varindx].type = type; - - if ((tag || typdef) - && info->vars.vars[varindx].namlen > 0) - { - const char *name; - - name = savestring (info->vars.vars[varindx].name, - info->vars.vars[varindx].namlen); - if (typdef) - type = debug_name_type (dhandle, name, type); - else if (tc == 'E' || tc == 'N') - type = debug_tag_type (dhandle, name, type); - else - { - struct ieee_tag *it; - - /* We must allocate all struct tags as indirect types, so - that if we later see a definition of the tag as a C++ - record we can update the indirect slot and automatically - change all the existing references. */ - it = (struct ieee_tag *) xmalloc (sizeof *it); - memset (it, 0, sizeof *it); - it->next = info->tags; - info->tags = it; - it->name = name; - it->slot = type; - - type = debug_make_indirect_type (dhandle, &it->slot, name); - type = debug_tag_type (dhandle, name, type); - - it->type = type; - } - if (type == NULL) - return false; - } - - info->types.types[typeindx].type = type; - info->types.types[typeindx].arg_slots = arg_slots; - info->types.types[typeindx].bitsize = type_bitsize; - - /* We may have already allocated type as an indirect type pointing - to slot. It does no harm to replace the indirect type with the - real type. Filling in slot as well handles the indirect types - which are already hanging around. */ - if (info->types.types[typeindx].pslot != NULL) - *info->types.types[typeindx].pslot = type; - - return true; -} - -/* Parse an ATN record. */ - -static boolean -parse_ieee_atn (info, pp) - struct ieee_info *info; - const bfd_byte **pp; -{ - const bfd_byte *atn_start, *atn_code_start; - bfd_vma varindx; - struct ieee_var *pvar; - debug_type type; - bfd_vma atn_code; - PTR dhandle; - bfd_vma v, v2, v3, v4, v5; - const char *name; - unsigned long namlen; - char *namcopy; - boolean present; - int blocktype; - - atn_start = *pp; - - if (! ieee_read_number (info, pp, &varindx) - || ! ieee_read_type_index (info, pp, &type)) - return false; - - atn_code_start = *pp; - - if (! ieee_read_number (info, pp, &atn_code)) - return false; - - if (varindx == 0) - { - pvar = NULL; - name = ""; - namlen = 0; - } - else if (varindx < 32) - { - /* The MRI compiler reportedly sometimes emits variable lifetime - information for a register. We just ignore it. */ - if (atn_code == 9) - return ieee_read_number (info, pp, &v); - - ieee_error (info, atn_start, _("illegal variable index")); - return false; - } - else - { - varindx -= 32; - if (varindx >= info->vars.alloc - || info->vars.vars[varindx].name == NULL) - { - /* The MRI compiler or linker sometimes omits the NN record - for a pmisc record. */ - if (atn_code == 62) - { - if (varindx >= info->vars.alloc) - { - unsigned int alloc; - - alloc = info->vars.alloc; - if (alloc == 0) - alloc = 4; - while (varindx >= alloc) - alloc *= 2; - info->vars.vars = ((struct ieee_var *) - xrealloc (info->vars.vars, - (alloc - * sizeof *info->vars.vars))); - memset (info->vars.vars + info->vars.alloc, 0, - ((alloc - info->vars.alloc) - * sizeof *info->vars.vars)); - info->vars.alloc = alloc; - } - - pvar = info->vars.vars + varindx; - pvar->name = ""; - pvar->namlen = 0; - } - else - { - ieee_error (info, atn_start, _("undefined variable in ATN")); - return false; - } - } - - pvar = info->vars.vars + varindx; - - pvar->type = type; - - name = pvar->name; - namlen = pvar->namlen; - } - - dhandle = info->dhandle; - - /* If we are going to call debug_record_variable with a pointer - type, change the type to an indirect type so that we can later - change it to a reference type if we encounter a C++ pmisc 'R' - record. */ - if (pvar != NULL - && type != DEBUG_TYPE_NULL - && debug_get_type_kind (dhandle, type) == DEBUG_KIND_POINTER) - { - switch (atn_code) - { - case 1: - case 2: - case 3: - case 5: - case 8: - case 10: - pvar->pslot = (debug_type *) xmalloc (sizeof *pvar->pslot); - *pvar->pslot = type; - type = debug_make_indirect_type (dhandle, pvar->pslot, - (const char *) NULL); - pvar->type = type; - break; - } - } - - switch (atn_code) - { - default: - ieee_error (info, atn_code_start, _("unknown ATN type")); - return false; - - case 1: - /* Automatic variable. */ - if (! ieee_read_number (info, pp, &v)) - return false; - namcopy = savestring (name, namlen); - if (type == NULL) - type = debug_make_void_type (dhandle); - if (pvar != NULL) - pvar->kind = IEEE_LOCAL; - return debug_record_variable (dhandle, namcopy, type, DEBUG_LOCAL, v); - - case 2: - /* Register variable. */ - if (! ieee_read_number (info, pp, &v)) - return false; - namcopy = savestring (name, namlen); - if (type == NULL) - type = debug_make_void_type (dhandle); - if (pvar != NULL) - pvar->kind = IEEE_LOCAL; - return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER, - ieee_regno_to_genreg (info->abfd, v)); - - case 3: - /* Static variable. */ - if (! ieee_require_asn (info, pp, &v)) - return false; - namcopy = savestring (name, namlen); - if (type == NULL) - type = debug_make_void_type (dhandle); - if (info->blockstack.bsp <= info->blockstack.stack) - blocktype = 0; - else - blocktype = info->blockstack.bsp[-1].kind; - if (pvar != NULL) - { - if (blocktype == 4 || blocktype == 6) - pvar->kind = IEEE_LOCAL; - else - pvar->kind = IEEE_STATIC; - } - return debug_record_variable (dhandle, namcopy, type, - (blocktype == 4 || blocktype == 6 - ? DEBUG_LOCAL_STATIC - : DEBUG_STATIC), - v); - - case 4: - /* External function. We don't currently record these. FIXME. */ - if (pvar != NULL) - pvar->kind = IEEE_EXTERNAL; - return true; - - case 5: - /* External variable. We don't currently record these. FIXME. */ - if (pvar != NULL) - pvar->kind = IEEE_EXTERNAL; - return true; - - case 7: - if (! ieee_read_number (info, pp, &v) - || ! ieee_read_number (info, pp, &v2) - || ! ieee_read_optional_number (info, pp, &v3, &present)) - return false; - if (present) - { - if (! ieee_read_optional_number (info, pp, &v4, &present)) - return false; - } - - /* We just ignore the two optional fields in v3 and v4, since - they are not defined. */ - - if (! ieee_require_asn (info, pp, &v3)) - return false; - - /* We have no way to record the column number. FIXME. */ - - return debug_record_line (dhandle, v, v3); - - case 8: - /* Global variable. */ - if (! ieee_require_asn (info, pp, &v)) - return false; - namcopy = savestring (name, namlen); - if (type == NULL) - type = debug_make_void_type (dhandle); - if (pvar != NULL) - pvar->kind = IEEE_GLOBAL; - return debug_record_variable (dhandle, namcopy, type, DEBUG_GLOBAL, v); - - case 9: - /* Variable lifetime information. */ - if (! ieee_read_number (info, pp, &v)) - return false; - - /* We have no way to record this information. FIXME. */ - return true; - - case 10: - /* Locked register. The spec says that there are two required - fields, but at least on occasion the MRI compiler only emits - one. */ - if (! ieee_read_number (info, pp, &v) - || ! ieee_read_optional_number (info, pp, &v2, &present)) - return false; - - /* I think this means a variable that is both in a register and - a frame slot. We ignore the frame slot. FIXME. */ - - namcopy = savestring (name, namlen); - if (type == NULL) - type = debug_make_void_type (dhandle); - if (pvar != NULL) - pvar->kind = IEEE_LOCAL; - return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER, v); - - case 11: - /* Reserved for FORTRAN common. */ - ieee_error (info, atn_code_start, _("unsupported ATN11")); - - /* Return true to keep going. */ - return true; - - case 12: - /* Based variable. */ - v3 = 0; - v4 = 0x80; - v5 = 0; - if (! ieee_read_number (info, pp, &v) - || ! ieee_read_number (info, pp, &v2) - || ! ieee_read_optional_number (info, pp, &v3, &present)) - return false; - if (present) - { - if (! ieee_read_optional_number (info, pp, &v4, &present)) - return false; - if (present) - { - if (! ieee_read_optional_number (info, pp, &v5, &present)) - return false; - } - } - - /* We have no way to record this information. FIXME. */ - - ieee_error (info, atn_code_start, _("unsupported ATN12")); - - /* Return true to keep going. */ - return true; - - case 16: - /* Constant. The description of this that I have is ambiguous, - so I'm not going to try to implement it. */ - if (! ieee_read_number (info, pp, &v) - || ! ieee_read_optional_number (info, pp, &v2, &present)) - return false; - if (present) - { - if (! ieee_read_optional_number (info, pp, &v2, &present)) - return false; - if (present) - { - if (! ieee_read_optional_id (info, pp, &name, &namlen, &present)) - return false; - } - } - - if ((ieee_record_enum_type) **pp == ieee_e2_first_byte_enum) - { - if (! ieee_require_asn (info, pp, &v3)) - return false; - } - - return true; - - case 19: - /* Static variable from assembler. */ - v2 = 0; - if (! ieee_read_number (info, pp, &v) - || ! ieee_read_optional_number (info, pp, &v2, &present) - || ! ieee_require_asn (info, pp, &v3)) - return false; - namcopy = savestring (name, namlen); - /* We don't really handle this correctly. FIXME. */ - return debug_record_variable (dhandle, namcopy, - debug_make_void_type (dhandle), - v2 != 0 ? DEBUG_GLOBAL : DEBUG_STATIC, - v3); - - case 62: - /* Procedure miscellaneous information. */ - case 63: - /* Variable miscellaneous information. */ - case 64: - /* Module miscellaneous information. */ - if (! ieee_read_number (info, pp, &v) - || ! ieee_read_number (info, pp, &v2) - || ! ieee_read_optional_id (info, pp, &name, &namlen, &present)) - return false; - - if (atn_code == 62 && v == 80) - { - if (present) - { - ieee_error (info, atn_code_start, - _("unexpected string in C++ misc")); - return false; - } - return ieee_read_cxx_misc (info, pp, v2); - } - - /* We just ignore all of this stuff. FIXME. */ - - for (; v2 > 0; --v2) - { - switch ((ieee_record_enum_type) **pp) - { - default: - ieee_error (info, *pp, _("bad misc record")); - return false; - - case ieee_at_record_enum: - if (! ieee_require_atn65 (info, pp, &name, &namlen)) - return false; - break; - - case ieee_e2_first_byte_enum: - if (! ieee_require_asn (info, pp, &v3)) - return false; - break; - } - } - - return true; - } - - /*NOTREACHED*/ -} - -/* Handle C++ debugging miscellaneous records. This is called for - procedure miscellaneous records of type 80. */ - -static boolean -ieee_read_cxx_misc (info, pp, count) - struct ieee_info *info; - const bfd_byte **pp; - unsigned long count; -{ - const bfd_byte *start; - bfd_vma category; - - start = *pp; - - /* Get the category of C++ misc record. */ - if (! ieee_require_asn (info, pp, &category)) - return false; - --count; - - switch (category) - { - default: - ieee_error (info, start, _("unrecognized C++ misc record")); - return false; - - case 'T': - if (! ieee_read_cxx_class (info, pp, count)) - return false; - break; - - case 'M': - { - bfd_vma flags; - const char *name; - unsigned long namlen; - - /* The IEEE spec indicates that the 'M' record only has a - flags field. The MRI compiler also emits the name of the - function. */ - - if (! ieee_require_asn (info, pp, &flags)) - return false; - if (*pp < info->pend - && (ieee_record_enum_type) **pp == ieee_at_record_enum) - { - if (! ieee_require_atn65 (info, pp, &name, &namlen)) - return false; - } - - /* This is emitted for method functions, but I don't think we - care very much. It might help if it told us useful - information like the class with which this function is - associated, but it doesn't, so it isn't helpful. */ - } - break; - - case 'B': - if (! ieee_read_cxx_defaults (info, pp, count)) - return false; - break; - - case 'z': - { - const char *name, *mangled, *class; - unsigned long namlen, mangledlen, classlen; - bfd_vma control; - - /* Pointer to member. */ - - if (! ieee_require_atn65 (info, pp, &name, &namlen) - || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen) - || ! ieee_require_atn65 (info, pp, &class, &classlen) - || ! ieee_require_asn (info, pp, &control)) - return false; - - /* FIXME: We should now track down name and change its type. */ - } - break; - - case 'R': - if (! ieee_read_reference (info, pp)) - return false; - break; - } - - return true; -} - -/* Read a C++ class definition. This is a pmisc type 80 record of - category 'T'. */ - -static boolean -ieee_read_cxx_class (info, pp, count) - struct ieee_info *info; - const bfd_byte **pp; - unsigned long count; -{ - const bfd_byte *start; - bfd_vma class; - const char *tag; - unsigned long taglen; - struct ieee_tag *it; - PTR dhandle; - debug_field *fields; - unsigned int field_count, field_alloc; - debug_baseclass *baseclasses; - unsigned int baseclasses_count, baseclasses_alloc; - const debug_field *structfields; - struct ieee_method - { - const char *name; - unsigned long namlen; - debug_method_variant *variants; - unsigned count; - unsigned int alloc; - } *methods; - unsigned int methods_count, methods_alloc; - debug_type vptrbase; - boolean ownvptr; - debug_method *dmethods; - - start = *pp; - - if (! ieee_require_asn (info, pp, &class)) - return false; - --count; - - if (! ieee_require_atn65 (info, pp, &tag, &taglen)) - return false; - --count; - - /* Find the C struct with this name. */ - for (it = info->tags; it != NULL; it = it->next) - if (it->name[0] == tag[0] - && strncmp (it->name, tag, taglen) == 0 - && strlen (it->name) == taglen) - break; - if (it == NULL) - { - ieee_error (info, start, _("undefined C++ object")); - return false; - } - - dhandle = info->dhandle; - - fields = NULL; - field_count = 0; - field_alloc = 0; - baseclasses = NULL; - baseclasses_count = 0; - baseclasses_alloc = 0; - methods = NULL; - methods_count = 0; - methods_alloc = 0; - vptrbase = DEBUG_TYPE_NULL; - ownvptr = false; - - structfields = debug_get_fields (dhandle, it->type); - - while (count > 0) - { - bfd_vma id; - const bfd_byte *spec_start; - - spec_start = *pp; - - if (! ieee_require_asn (info, pp, &id)) - return false; - --count; - - switch (id) - { - default: - ieee_error (info, spec_start, _("unrecognized C++ object spec")); - return false; - - case 'b': - { - bfd_vma flags, cinline; - const char *basename, *fieldname; - unsigned long baselen, fieldlen; - char *basecopy; - debug_type basetype; - bfd_vma bitpos; - boolean virtualp; - enum debug_visibility visibility; - debug_baseclass baseclass; - - /* This represents a base or friend class. */ - - if (! ieee_require_asn (info, pp, &flags) - || ! ieee_require_atn65 (info, pp, &basename, &baselen) - || ! ieee_require_asn (info, pp, &cinline) - || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen)) - return false; - count -= 4; - - /* We have no way of recording friend information, so we - just ignore it. */ - if ((flags & BASEFLAGS_FRIEND) != 0) - break; - - /* I assume that either all of the members of the - baseclass are included in the object, starting at the - beginning of the object, or that none of them are - included. */ - - if ((fieldlen == 0) == (cinline == 0)) - { - ieee_error (info, start, _("unsupported C++ object type")); - return false; - } - - basecopy = savestring (basename, baselen); - basetype = debug_find_tagged_type (dhandle, basecopy, - DEBUG_KIND_ILLEGAL); - free (basecopy); - if (basetype == DEBUG_TYPE_NULL) - { - ieee_error (info, start, _("C++ base class not defined")); - return false; - } - - if (fieldlen == 0) - bitpos = 0; - else - { - const debug_field *pf; - - if (structfields == NULL) - { - ieee_error (info, start, _("C++ object has no fields")); - return false; - } - - for (pf = structfields; *pf != DEBUG_FIELD_NULL; pf++) - { - const char *fname; - - fname = debug_get_field_name (dhandle, *pf); - if (fname == NULL) - return false; - if (fname[0] == fieldname[0] - && strncmp (fname, fieldname, fieldlen) == 0 - && strlen (fname) == fieldlen) - break; - } - if (*pf == DEBUG_FIELD_NULL) - { - ieee_error (info, start, - _("C++ base class not found in container")); - return false; - } - - bitpos = debug_get_field_bitpos (dhandle, *pf); - } - - if ((flags & BASEFLAGS_VIRTUAL) != 0) - virtualp = true; - else - virtualp = false; - if ((flags & BASEFLAGS_PRIVATE) != 0) - visibility = DEBUG_VISIBILITY_PRIVATE; - else - visibility = DEBUG_VISIBILITY_PUBLIC; - - baseclass = debug_make_baseclass (dhandle, basetype, bitpos, - virtualp, visibility); - if (baseclass == DEBUG_BASECLASS_NULL) - return false; - - if (baseclasses_count + 1 >= baseclasses_alloc) - { - baseclasses_alloc += 10; - baseclasses = ((debug_baseclass *) - xrealloc (baseclasses, - (baseclasses_alloc - * sizeof *baseclasses))); - } - - baseclasses[baseclasses_count] = baseclass; - ++baseclasses_count; - baseclasses[baseclasses_count] = DEBUG_BASECLASS_NULL; - } - break; - - case 'd': - { - bfd_vma flags; - const char *fieldname, *mangledname; - unsigned long fieldlen, mangledlen; - char *fieldcopy; - boolean staticp; - debug_type ftype; - const debug_field *pf = NULL; - enum debug_visibility visibility; - debug_field field; - - /* This represents a data member. */ - - if (! ieee_require_asn (info, pp, &flags) - || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen) - || ! ieee_require_atn65 (info, pp, &mangledname, &mangledlen)) - return false; - count -= 3; - - fieldcopy = savestring (fieldname, fieldlen); - - staticp = (flags & CXXFLAGS_STATIC) != 0 ? true : false; - - if (staticp) - { - struct ieee_var *pv, *pvend; - - /* See if we can find a definition for this variable. */ - pv = info->vars.vars; - pvend = pv + info->vars.alloc; - for (; pv < pvend; pv++) - if (pv->namlen == mangledlen - && strncmp (pv->name, mangledname, mangledlen) == 0) - break; - if (pv < pvend) - ftype = pv->type; - else - { - /* This can happen if the variable is never used. */ - ftype = ieee_builtin_type (info, start, - (unsigned int) builtin_void); - } - } - else - { - unsigned int findx; - - if (structfields == NULL) - { - ieee_error (info, start, _("C++ object has no fields")); - return false; - } - - for (pf = structfields, findx = 0; - *pf != DEBUG_FIELD_NULL; - pf++, findx++) - { - const char *fname; - - fname = debug_get_field_name (dhandle, *pf); - if (fname == NULL) - return false; - if (fname[0] == mangledname[0] - && strncmp (fname, mangledname, mangledlen) == 0 - && strlen (fname) == mangledlen) - break; - } - if (*pf == DEBUG_FIELD_NULL) - { - ieee_error (info, start, - _("C++ data member not found in container")); - return false; - } - - ftype = debug_get_field_type (dhandle, *pf); - - if (debug_get_type_kind (dhandle, ftype) == DEBUG_KIND_POINTER) - { - /* We might need to convert this field into a - reference type later on, so make it an indirect - type. */ - if (it->fslots == NULL) - { - unsigned int fcnt; - const debug_field *pfcnt; - - fcnt = 0; - for (pfcnt = structfields; - *pfcnt != DEBUG_FIELD_NULL; - pfcnt++) - ++fcnt; - it->fslots = ((debug_type *) - xmalloc (fcnt * sizeof *it->fslots)); - memset (it->fslots, 0, - fcnt * sizeof *it->fslots); - } - - if (ftype == DEBUG_TYPE_NULL) - return false; - it->fslots[findx] = ftype; - ftype = debug_make_indirect_type (dhandle, - it->fslots + findx, - (const char *) NULL); - } - } - if (ftype == DEBUG_TYPE_NULL) - return false; - - switch (flags & CXXFLAGS_VISIBILITY) - { - default: - ieee_error (info, start, _("unknown C++ visibility")); - return false; - - case CXXFLAGS_VISIBILITY_PUBLIC: - visibility = DEBUG_VISIBILITY_PUBLIC; - break; - - case CXXFLAGS_VISIBILITY_PRIVATE: - visibility = DEBUG_VISIBILITY_PRIVATE; - break; - - case CXXFLAGS_VISIBILITY_PROTECTED: - visibility = DEBUG_VISIBILITY_PROTECTED; - break; - } - - if (staticp) - { - char *mangledcopy; - - mangledcopy = savestring (mangledname, mangledlen); - - field = debug_make_static_member (dhandle, fieldcopy, - ftype, mangledcopy, - visibility); - } - else - { - bfd_vma bitpos, bitsize; - - bitpos = debug_get_field_bitpos (dhandle, *pf); - bitsize = debug_get_field_bitsize (dhandle, *pf); - if (bitpos == (bfd_vma) -1 || bitsize == (bfd_vma) -1) - { - ieee_error (info, start, _("bad C++ field bit pos or size")); - return false; - } - field = debug_make_field (dhandle, fieldcopy, ftype, bitpos, - bitsize, visibility); - } - - if (field == DEBUG_FIELD_NULL) - return false; - - if (field_count + 1 >= field_alloc) - { - field_alloc += 10; - fields = ((debug_field *) - xrealloc (fields, field_alloc * sizeof *fields)); - } - - fields[field_count] = field; - ++field_count; - fields[field_count] = DEBUG_FIELD_NULL; - } - break; - - case 'm': - case 'v': - { - bfd_vma flags, voffset, control; - const char *name, *mangled; - unsigned long namlen, mangledlen; - struct ieee_var *pv, *pvend; - debug_type type; - enum debug_visibility visibility; - boolean constp, volatilep; - char *mangledcopy; - debug_method_variant mv; - struct ieee_method *meth; - unsigned int im; - - if (! ieee_require_asn (info, pp, &flags) - || ! ieee_require_atn65 (info, pp, &name, &namlen) - || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen)) - return false; - count -= 3; - if (id != 'v') - voffset = 0; - else - { - if (! ieee_require_asn (info, pp, &voffset)) - return false; - --count; - } - if (! ieee_require_asn (info, pp, &control)) - return false; - --count; - - /* We just ignore the control information. */ - - /* We have no way to represent friend information, so we - just ignore it. */ - if ((flags & CXXFLAGS_FRIEND) != 0) - break; - - /* We should already have seen a type for the function. */ - pv = info->vars.vars; - pvend = pv + info->vars.alloc; - for (; pv < pvend; pv++) - if (pv->namlen == mangledlen - && strncmp (pv->name, mangled, mangledlen) == 0) - break; - - if (pv >= pvend) - { - /* We won't have type information for this function if - it is not included in this file. We don't try to - handle this case. FIXME. */ - type = (debug_make_function_type - (dhandle, - ieee_builtin_type (info, start, - (unsigned int) builtin_void), - (debug_type *) NULL, - false)); - } - else - { - debug_type return_type; - const debug_type *arg_types; - boolean varargs; - - if (debug_get_type_kind (dhandle, pv->type) - != DEBUG_KIND_FUNCTION) - { - ieee_error (info, start, - _("bad type for C++ method function")); - return false; - } - - return_type = debug_get_return_type (dhandle, pv->type); - arg_types = debug_get_parameter_types (dhandle, pv->type, - &varargs); - if (return_type == DEBUG_TYPE_NULL || arg_types == NULL) - { - ieee_error (info, start, - _("no type information for C++ method function")); - return false; - } - - type = debug_make_method_type (dhandle, return_type, it->type, - (debug_type *) arg_types, - varargs); - } - if (type == DEBUG_TYPE_NULL) - return false; - - switch (flags & CXXFLAGS_VISIBILITY) - { - default: - ieee_error (info, start, _("unknown C++ visibility")); - return false; - - case CXXFLAGS_VISIBILITY_PUBLIC: - visibility = DEBUG_VISIBILITY_PUBLIC; - break; - - case CXXFLAGS_VISIBILITY_PRIVATE: - visibility = DEBUG_VISIBILITY_PRIVATE; - break; - - case CXXFLAGS_VISIBILITY_PROTECTED: - visibility = DEBUG_VISIBILITY_PROTECTED; - break; - } - - constp = (flags & CXXFLAGS_CONST) != 0 ? true : false; - volatilep = (flags & CXXFLAGS_VOLATILE) != 0 ? true : false; - - mangledcopy = savestring (mangled, mangledlen); - - if ((flags & CXXFLAGS_STATIC) != 0) - { - if (id == 'v') - { - ieee_error (info, start, _("C++ static virtual method")); - return false; - } - mv = debug_make_static_method_variant (dhandle, mangledcopy, - type, visibility, - constp, volatilep); - } - else - { - debug_type vcontext; - - if (id != 'v') - vcontext = DEBUG_TYPE_NULL; - else - { - /* FIXME: How can we calculate this correctly? */ - vcontext = it->type; - } - mv = debug_make_method_variant (dhandle, mangledcopy, type, - visibility, constp, - volatilep, voffset, - vcontext); - } - if (mv == DEBUG_METHOD_VARIANT_NULL) - return false; - - for (meth = methods, im = 0; im < methods_count; meth++, im++) - if (meth->namlen == namlen - && strncmp (meth->name, name, namlen) == 0) - break; - if (im >= methods_count) - { - if (methods_count >= methods_alloc) - { - methods_alloc += 10; - methods = ((struct ieee_method *) - xrealloc (methods, - methods_alloc * sizeof *methods)); - } - methods[methods_count].name = name; - methods[methods_count].namlen = namlen; - methods[methods_count].variants = NULL; - methods[methods_count].count = 0; - methods[methods_count].alloc = 0; - meth = methods + methods_count; - ++methods_count; - } - - if (meth->count + 1 >= meth->alloc) - { - meth->alloc += 10; - meth->variants = ((debug_method_variant *) - xrealloc (meth->variants, - (meth->alloc - * sizeof *meth->variants))); - } - - meth->variants[meth->count] = mv; - ++meth->count; - meth->variants[meth->count] = DEBUG_METHOD_VARIANT_NULL; - } - break; - - case 'o': - { - bfd_vma spec; - - /* We have no way to store this information, so we just - ignore it. */ - if (! ieee_require_asn (info, pp, &spec)) - return false; - --count; - if ((spec & 4) != 0) - { - const char *filename; - unsigned long filenamlen; - bfd_vma lineno; - - if (! ieee_require_atn65 (info, pp, &filename, &filenamlen) - || ! ieee_require_asn (info, pp, &lineno)) - return false; - count -= 2; - } - else if ((spec & 8) != 0) - { - const char *mangled; - unsigned long mangledlen; - - if (! ieee_require_atn65 (info, pp, &mangled, &mangledlen)) - return false; - --count; - } - else - { - ieee_error (info, start, - _("unrecognized C++ object overhead spec")); - return false; - } - } - break; - - case 'z': - { - const char *vname, *basename; - unsigned long vnamelen, baselen; - bfd_vma vsize, control; - - /* A virtual table pointer. */ - - if (! ieee_require_atn65 (info, pp, &vname, &vnamelen) - || ! ieee_require_asn (info, pp, &vsize) - || ! ieee_require_atn65 (info, pp, &basename, &baselen) - || ! ieee_require_asn (info, pp, &control)) - return false; - count -= 4; - - /* We just ignore the control number. We don't care what - the virtual table name is. We have no way to store the - virtual table size, and I don't think we care anyhow. */ - - /* FIXME: We can't handle multiple virtual table pointers. */ - - if (baselen == 0) - ownvptr = true; - else - { - char *basecopy; - - basecopy = savestring (basename, baselen); - vptrbase = debug_find_tagged_type (dhandle, basecopy, - DEBUG_KIND_ILLEGAL); - free (basecopy); - if (vptrbase == DEBUG_TYPE_NULL) - { - ieee_error (info, start, _("undefined C++ vtable")); - return false; - } - } - } - break; - } - } - - /* Now that we have seen all the method variants, we can call - debug_make_method for each one. */ - - if (methods_count == 0) - dmethods = NULL; - else - { - unsigned int i; - - dmethods = ((debug_method *) - xmalloc ((methods_count + 1) * sizeof *dmethods)); - for (i = 0; i < methods_count; i++) - { - char *namcopy; - - namcopy = savestring (methods[i].name, methods[i].namlen); - dmethods[i] = debug_make_method (dhandle, namcopy, - methods[i].variants); - if (dmethods[i] == DEBUG_METHOD_NULL) - return false; - } - dmethods[i] = DEBUG_METHOD_NULL; - free (methods); - } - - /* The struct type was created as an indirect type pointing at - it->slot. We update it->slot to automatically update all - references to this struct. */ - it->slot = debug_make_object_type (dhandle, - class != 'u', - debug_get_type_size (dhandle, - it->slot), - fields, baseclasses, dmethods, - vptrbase, ownvptr); - if (it->slot == DEBUG_TYPE_NULL) - return false; - - return true; -} - -/* Read C++ default argument value and reference type information. */ - -static boolean -ieee_read_cxx_defaults (info, pp, count) - struct ieee_info *info; - const bfd_byte **pp; - unsigned long count; -{ - const bfd_byte *start; - const char *fnname; - unsigned long fnlen; - bfd_vma defcount; - - start = *pp; - - /* Giving the function name before the argument count is an addendum - to the spec. The function name is demangled, though, so this - record must always refer to the current function. */ - - if (info->blockstack.bsp <= info->blockstack.stack - || info->blockstack.bsp[-1].fnindx == (unsigned int) -1) - { - ieee_error (info, start, _("C++ default values not in a function")); - return false; - } - - if (! ieee_require_atn65 (info, pp, &fnname, &fnlen) - || ! ieee_require_asn (info, pp, &defcount)) - return false; - count -= 2; - - while (defcount-- > 0) - { - bfd_vma type, val; - const char *strval; - unsigned long strvallen; - - if (! ieee_require_asn (info, pp, &type)) - return false; - --count; - - switch (type) - { - case 0: - case 4: - break; - - case 1: - case 2: - if (! ieee_require_asn (info, pp, &val)) - return false; - --count; - break; - - case 3: - case 7: - if (! ieee_require_atn65 (info, pp, &strval, &strvallen)) - return false; - --count; - break; - - default: - ieee_error (info, start, _("unrecognized C++ default type")); - return false; - } - - /* We have no way to record the default argument values, so we - just ignore them. FIXME. */ - } - - /* Any remaining arguments are indices of parameters that are really - reference type. */ - if (count > 0) - { - PTR dhandle; - debug_type *arg_slots; - - dhandle = info->dhandle; - arg_slots = info->types.types[info->blockstack.bsp[-1].fnindx].arg_slots; - while (count-- > 0) - { - bfd_vma indx; - debug_type target; - - if (! ieee_require_asn (info, pp, &indx)) - return false; - /* The index is 1 based. */ - --indx; - if (arg_slots == NULL - || arg_slots[indx] == DEBUG_TYPE_NULL - || (debug_get_type_kind (dhandle, arg_slots[indx]) - != DEBUG_KIND_POINTER)) - { - ieee_error (info, start, _("reference parameter is not a pointer")); - return false; - } - - target = debug_get_target_type (dhandle, arg_slots[indx]); - arg_slots[indx] = debug_make_reference_type (dhandle, target); - if (arg_slots[indx] == DEBUG_TYPE_NULL) - return false; - } - } - - return true; -} - -/* Read a C++ reference definition. */ - -static boolean -ieee_read_reference (info, pp) - struct ieee_info *info; - const bfd_byte **pp; -{ - const bfd_byte *start; - bfd_vma flags; - const char *class, *name; - unsigned long classlen, namlen; - debug_type *pslot; - debug_type target; - - start = *pp; - - if (! ieee_require_asn (info, pp, &flags)) - return false; - - /* Giving the class name before the member name is in an addendum to - the spec. */ - if (flags == 3) - { - if (! ieee_require_atn65 (info, pp, &class, &classlen)) - return false; - } - - if (! ieee_require_atn65 (info, pp, &name, &namlen)) - return false; - - pslot = NULL; - if (flags != 3) - { - int pass; - - /* We search from the last variable indices to the first in - hopes of finding local variables correctly. We search the - local variables on the first pass, and the global variables - on the second. FIXME: This probably won't work in all cases. - On the other hand, I don't know what will. */ - for (pass = 0; pass < 2; pass++) - { - struct ieee_vars *vars; - int i; - struct ieee_var *pv = NULL; - - if (pass == 0) - vars = &info->vars; - else - { - vars = info->global_vars; - if (vars == NULL) - break; - } - - for (i = (int) vars->alloc - 1; i >= 0; i--) - { - boolean found; - - pv = vars->vars + i; - - if (pv->pslot == NULL - || pv->namlen != namlen - || strncmp (pv->name, name, namlen) != 0) - continue; - - found = false; - switch (flags) - { - default: - ieee_error (info, start, - _("unrecognized C++ reference type")); - return false; - - case 0: - /* Global variable or function. */ - if (pv->kind == IEEE_GLOBAL - || pv->kind == IEEE_EXTERNAL - || pv->kind == IEEE_FUNCTION) - found = true; - break; - - case 1: - /* Global static variable or function. */ - if (pv->kind == IEEE_STATIC - || pv->kind == IEEE_FUNCTION) - found = true; - break; - - case 2: - /* Local variable. */ - if (pv->kind == IEEE_LOCAL) - found = true; - break; - } - - if (found) - break; - } - - if (i >= 0) - { - pslot = pv->pslot; - break; - } - } - } - else - { - struct ieee_tag *it; - - for (it = info->tags; it != NULL; it = it->next) - { - if (it->name[0] == class[0] - && strncmp (it->name, class, classlen) == 0 - && strlen (it->name) == classlen) - { - if (it->fslots != NULL) - { - const debug_field *pf; - unsigned int findx; - - pf = debug_get_fields (info->dhandle, it->type); - if (pf == NULL) - { - ieee_error (info, start, - "C++ reference in class with no fields"); - return false; - } - - for (findx = 0; *pf != DEBUG_FIELD_NULL; pf++, findx++) - { - const char *fname; - - fname = debug_get_field_name (info->dhandle, *pf); - if (fname == NULL) - return false; - if (strncmp (fname, name, namlen) == 0 - && strlen (fname) == namlen) - { - pslot = it->fslots + findx; - break; - } - } - } - - break; - } - } - } - - if (pslot == NULL) - { - ieee_error (info, start, _("C++ reference not found")); - return false; - } - - /* We allocated the type of the object as an indirect type pointing - to *pslot, which we can now update to be a reference type. */ - if (debug_get_type_kind (info->dhandle, *pslot) != DEBUG_KIND_POINTER) - { - ieee_error (info, start, _("C++ reference is not pointer")); - return false; - } - - target = debug_get_target_type (info->dhandle, *pslot); - *pslot = debug_make_reference_type (info->dhandle, target); - if (*pslot == DEBUG_TYPE_NULL) - return false; - - return true; -} - -/* Require an ASN record. */ - -static boolean -ieee_require_asn (info, pp, pv) - struct ieee_info *info; - const bfd_byte **pp; - bfd_vma *pv; -{ - const bfd_byte *start; - ieee_record_enum_type c; - bfd_vma varindx; - - start = *pp; - - c = (ieee_record_enum_type) **pp; - if (c != ieee_e2_first_byte_enum) - { - ieee_error (info, start, _("missing required ASN")); - return false; - } - ++*pp; - - c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp); - if (c != ieee_asn_record_enum) - { - ieee_error (info, start, _("missing required ASN")); - return false; - } - ++*pp; - - /* Just ignore the variable index. */ - if (! ieee_read_number (info, pp, &varindx)) - return false; - - return ieee_read_expression (info, pp, pv); -} - -/* Require an ATN65 record. */ - -static boolean -ieee_require_atn65 (info, pp, pname, pnamlen) - struct ieee_info *info; - const bfd_byte **pp; - const char **pname; - unsigned long *pnamlen; -{ - const bfd_byte *start; - ieee_record_enum_type c; - bfd_vma name_indx, type_indx, atn_code; - - start = *pp; - - c = (ieee_record_enum_type) **pp; - if (c != ieee_at_record_enum) - { - ieee_error (info, start, _("missing required ATN65")); - return false; - } - ++*pp; - - c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp); - if (c != ieee_atn_record_enum) - { - ieee_error (info, start, _("missing required ATN65")); - return false; - } - ++*pp; - - if (! ieee_read_number (info, pp, &name_indx) - || ! ieee_read_number (info, pp, &type_indx) - || ! ieee_read_number (info, pp, &atn_code)) - return false; - - /* Just ignore name_indx. */ - - if (type_indx != 0 || atn_code != 65) - { - ieee_error (info, start, _("bad ATN65 record")); - return false; - } - - return ieee_read_id (info, pp, pname, pnamlen); -} - -/* Convert a register number in IEEE debugging information into a - generic register number. */ - -static int -ieee_regno_to_genreg (abfd, r) - bfd *abfd; - int r; -{ - switch (bfd_get_arch (abfd)) - { - case bfd_arch_m68k: - /* For some reasons stabs adds 2 to the floating point register - numbers. */ - if (r >= 16) - r += 2; - break; - - case bfd_arch_i960: - /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and - 32 to 35 for fp0 to fp3. */ - --r; - break; - - default: - break; - } - - return r; -} - -/* Convert a generic register number to an IEEE specific one. */ - -static int -ieee_genreg_to_regno (abfd, r) - bfd *abfd; - int r; -{ - switch (bfd_get_arch (abfd)) - { - case bfd_arch_m68k: - /* For some reason stabs add 2 to the floating point register - numbers. */ - if (r >= 18) - r -= 2; - break; - - case bfd_arch_i960: - /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and - 32 to 35 for fp0 to fp3. */ - ++r; - break; - - default: - break; - } - - return r; -} - -/* These routines build IEEE debugging information out of the generic - debugging information. */ - -/* We build the IEEE debugging information byte by byte. Rather than - waste time copying data around, we use a linked list of buffers to - hold the data. */ - -#define IEEE_BUFSIZE (490) - -struct ieee_buf -{ - /* Next buffer. */ - struct ieee_buf *next; - /* Number of data bytes in this buffer. */ - unsigned int c; - /* Bytes. */ - bfd_byte buf[IEEE_BUFSIZE]; -}; - -/* A list of buffers. */ - -struct ieee_buflist -{ - /* Head of list. */ - struct ieee_buf *head; - /* Tail--last buffer on list. */ - struct ieee_buf *tail; -}; - -/* In order to generate the BB11 blocks required by the HP emulator, - we keep track of ranges of addresses which correspond to a given - compilation unit. */ - -struct ieee_range -{ - /* Next range. */ - struct ieee_range *next; - /* Low address. */ - bfd_vma low; - /* High address. */ - bfd_vma high; -}; - -/* This structure holds information for a class on the type stack. */ - -struct ieee_type_class -{ - /* The name index in the debugging information. */ - unsigned int indx; - /* The pmisc records for the class. */ - struct ieee_buflist pmiscbuf; - /* The number of pmisc records. */ - unsigned int pmisccount; - /* The name of the class holding the virtual table, if not this - class. */ - const char *vclass; - /* Whether this class holds its own virtual table. */ - boolean ownvptr; - /* The largest virtual table offset seen so far. */ - bfd_vma voffset; - /* The current method. */ - const char *method; - /* Additional pmisc records used to record fields of reference type. */ - struct ieee_buflist refs; -}; - -/* This is how we store types for the writing routines. Most types - are simply represented by a type index. */ - -struct ieee_write_type -{ - /* Type index. */ - unsigned int indx; - /* The size of the type, if known. */ - unsigned int size; - /* The name of the type, if any. */ - const char *name; - /* If this is a function or method type, we build the type here, and - only add it to the output buffers if we need it. */ - struct ieee_buflist fndef; - /* If this is a struct, this is where the struct definition is - built. */ - struct ieee_buflist strdef; - /* If this is a class, this is where the class information is built. */ - struct ieee_type_class *classdef; - /* Whether the type is unsigned. */ - unsigned int unsignedp : 1; - /* Whether this is a reference type. */ - unsigned int referencep : 1; - /* Whether this is in the local type block. */ - unsigned int localp : 1; - /* Whether this is a duplicate struct definition which we are - ignoring. */ - unsigned int ignorep : 1; -}; - -/* This is the type stack used by the debug writing routines. FIXME: - We could generate more efficient output if we remembered when we - have output a particular type before. */ - -struct ieee_type_stack -{ - /* Next entry on stack. */ - struct ieee_type_stack *next; - /* Type information. */ - struct ieee_write_type type; -}; - -/* This is a list of associations between a name and some types. - These are used for typedefs and tags. */ - -struct ieee_name_type -{ - /* Next type for this name. */ - struct ieee_name_type *next; - /* ID number. For a typedef, this is the index of the type to which - this name is typedefed. */ - unsigned int id; - /* Type. */ - struct ieee_write_type type; - /* If this is a tag which has not yet been defined, this is the - kind. If the tag has been defined, this is DEBUG_KIND_ILLEGAL. */ - enum debug_type_kind kind; -}; - -/* We use a hash table to associate names and types. */ - -struct ieee_name_type_hash_table -{ - struct bfd_hash_table root; -}; - -struct ieee_name_type_hash_entry -{ - struct bfd_hash_entry root; - /* Information for this name. */ - struct ieee_name_type *types; -}; - -/* This is a list of enums. */ - -struct ieee_defined_enum -{ - /* Next enum. */ - struct ieee_defined_enum *next; - /* Type index. */ - unsigned int indx; - /* Whether this enum has been defined. */ - boolean defined; - /* Tag. */ - const char *tag; - /* Names. */ - const char **names; - /* Values. */ - bfd_signed_vma *vals; -}; - -/* We keep a list of modified versions of types, so that we don't - output them more than once. */ - -struct ieee_modified_type -{ - /* Pointer to this type. */ - unsigned int pointer; - /* Function with unknown arguments returning this type. */ - unsigned int function; - /* Const version of this type. */ - unsigned int const_qualified; - /* Volatile version of this type. */ - unsigned int volatile_qualified; - /* List of arrays of this type of various bounds. */ - struct ieee_modified_array_type *arrays; -}; - -/* A list of arrays bounds. */ - -struct ieee_modified_array_type -{ - /* Next array bounds. */ - struct ieee_modified_array_type *next; - /* Type index with these bounds. */ - unsigned int indx; - /* Low bound. */ - bfd_signed_vma low; - /* High bound. */ - bfd_signed_vma high; -}; - -/* This is a list of pending function parameter information. We don't - output them until we see the first block. */ - -struct ieee_pending_parm -{ - /* Next pending parameter. */ - struct ieee_pending_parm *next; - /* Name. */ - const char *name; - /* Type index. */ - unsigned int type; - /* Whether the type is a reference. */ - boolean referencep; - /* Kind. */ - enum debug_parm_kind kind; - /* Value. */ - bfd_vma val; -}; - -/* This is the handle passed down by debug_write. */ - -struct ieee_handle -{ - /* BFD we are writing to. */ - bfd *abfd; - /* Whether we got an error in a subroutine called via traverse or - map_over_sections. */ - boolean error; - /* Current data buffer list. */ - struct ieee_buflist *current; - /* Current data buffer. */ - struct ieee_buf *curbuf; - /* Filename of current compilation unit. */ - const char *filename; - /* Module name of current compilation unit. */ - const char *modname; - /* List of buffer for global types. */ - struct ieee_buflist global_types; - /* List of finished data buffers. */ - struct ieee_buflist data; - /* List of buffers for typedefs in the current compilation unit. */ - struct ieee_buflist types; - /* List of buffers for variables and functions in the current - compilation unit. */ - struct ieee_buflist vars; - /* List of buffers for C++ class definitions in the current - compilation unit. */ - struct ieee_buflist cxx; - /* List of buffers for line numbers in the current compilation unit. */ - struct ieee_buflist linenos; - /* Ranges for the current compilation unit. */ - struct ieee_range *ranges; - /* Ranges for all debugging information. */ - struct ieee_range *global_ranges; - /* Nested pending ranges. */ - struct ieee_range *pending_ranges; - /* Type stack. */ - struct ieee_type_stack *type_stack; - /* Next unallocated type index. */ - unsigned int type_indx; - /* Next unallocated name index. */ - unsigned int name_indx; - /* Typedefs. */ - struct ieee_name_type_hash_table typedefs; - /* Tags. */ - struct ieee_name_type_hash_table tags; - /* Enums. */ - struct ieee_defined_enum *enums; - /* Modified versions of types. */ - struct ieee_modified_type *modified; - /* Number of entries allocated in modified. */ - unsigned int modified_alloc; - /* 4 byte complex type. */ - unsigned int complex_float_index; - /* 8 byte complex type. */ - unsigned int complex_double_index; - /* The depth of block nesting. This is 0 outside a function, and 1 - just after start_function is called. */ - unsigned int block_depth; - /* The name of the current function. */ - const char *fnname; - /* List of buffers for the type of the function we are currently - writing out. */ - struct ieee_buflist fntype; - /* List of buffers for the parameters of the function we are - currently writing out. */ - struct ieee_buflist fnargs; - /* Number of arguments written to fnargs. */ - unsigned int fnargcount; - /* Pending function parameters. */ - struct ieee_pending_parm *pending_parms; - /* Current line number filename. */ - const char *lineno_filename; - /* Line number name index. */ - unsigned int lineno_name_indx; - /* Filename of pending line number. */ - const char *pending_lineno_filename; - /* Pending line number. */ - unsigned long pending_lineno; - /* Address of pending line number. */ - bfd_vma pending_lineno_addr; - /* Highest address seen at end of procedure. */ - bfd_vma highaddr; -}; - -static boolean ieee_init_buffer - PARAMS ((struct ieee_handle *, struct ieee_buflist *)); -static boolean ieee_change_buffer - PARAMS ((struct ieee_handle *, struct ieee_buflist *)); -static boolean ieee_append_buffer - PARAMS ((struct ieee_handle *, struct ieee_buflist *, - struct ieee_buflist *)); -static boolean ieee_real_write_byte PARAMS ((struct ieee_handle *, int)); -static boolean ieee_write_2bytes PARAMS ((struct ieee_handle *, int)); -static boolean ieee_write_number PARAMS ((struct ieee_handle *, bfd_vma)); -static boolean ieee_write_id PARAMS ((struct ieee_handle *, const char *)); -static boolean ieee_write_asn - PARAMS ((struct ieee_handle *, unsigned int, bfd_vma)); -static boolean ieee_write_atn65 - PARAMS ((struct ieee_handle *, unsigned int, const char *)); -static boolean ieee_push_type - PARAMS ((struct ieee_handle *, unsigned int, unsigned int, boolean, - boolean)); -static unsigned int ieee_pop_type PARAMS ((struct ieee_handle *)); -static void ieee_pop_unused_type PARAMS ((struct ieee_handle *)); -static unsigned int ieee_pop_type_used - PARAMS ((struct ieee_handle *, boolean)); -static boolean ieee_add_range - PARAMS ((struct ieee_handle *, boolean, bfd_vma, bfd_vma)); -static boolean ieee_start_range PARAMS ((struct ieee_handle *, bfd_vma)); -static boolean ieee_end_range PARAMS ((struct ieee_handle *, bfd_vma)); -static boolean ieee_define_type - PARAMS ((struct ieee_handle *, unsigned int, boolean, boolean)); -static boolean ieee_define_named_type - PARAMS ((struct ieee_handle *, const char *, unsigned int, unsigned int, - boolean, boolean, struct ieee_buflist *)); -static struct ieee_modified_type *ieee_get_modified_info - PARAMS ((struct ieee_handle *, unsigned int)); -static struct bfd_hash_entry *ieee_name_type_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static boolean ieee_write_undefined_tag - PARAMS ((struct ieee_name_type_hash_entry *, PTR)); -static boolean ieee_finish_compilation_unit PARAMS ((struct ieee_handle *)); -static void ieee_add_bb11_blocks PARAMS ((bfd *, asection *, PTR)); -static boolean ieee_add_bb11 - PARAMS ((struct ieee_handle *, asection *, bfd_vma, bfd_vma)); -static boolean ieee_output_pending_parms PARAMS ((struct ieee_handle *)); -static unsigned int ieee_vis_to_flags PARAMS ((enum debug_visibility)); -static boolean ieee_class_method_var - PARAMS ((struct ieee_handle *, const char *, enum debug_visibility, boolean, - boolean, boolean, bfd_vma, boolean)); - -static boolean ieee_start_compilation_unit PARAMS ((PTR, const char *)); -static boolean ieee_start_source PARAMS ((PTR, const char *)); -static boolean ieee_empty_type PARAMS ((PTR)); -static boolean ieee_void_type PARAMS ((PTR)); -static boolean ieee_int_type PARAMS ((PTR, unsigned int, boolean)); -static boolean ieee_float_type PARAMS ((PTR, unsigned int)); -static boolean ieee_complex_type PARAMS ((PTR, unsigned int)); -static boolean ieee_bool_type PARAMS ((PTR, unsigned int)); -static boolean ieee_enum_type - PARAMS ((PTR, const char *, const char **, bfd_signed_vma *)); -static boolean ieee_pointer_type PARAMS ((PTR)); -static boolean ieee_function_type PARAMS ((PTR, int, boolean)); -static boolean ieee_reference_type PARAMS ((PTR)); -static boolean ieee_range_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma)); -static boolean ieee_array_type - PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, boolean)); -static boolean ieee_set_type PARAMS ((PTR, boolean)); -static boolean ieee_offset_type PARAMS ((PTR)); -static boolean ieee_method_type PARAMS ((PTR, boolean, int, boolean)); -static boolean ieee_const_type PARAMS ((PTR)); -static boolean ieee_volatile_type PARAMS ((PTR)); -static boolean ieee_start_struct_type - PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int)); -static boolean ieee_struct_field - PARAMS ((PTR, const char *, bfd_vma, bfd_vma, enum debug_visibility)); -static boolean ieee_end_struct_type PARAMS ((PTR)); -static boolean ieee_start_class_type - PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int, boolean, - boolean)); -static boolean ieee_class_static_member - PARAMS ((PTR, const char *, const char *, enum debug_visibility)); -static boolean ieee_class_baseclass - PARAMS ((PTR, bfd_vma, boolean, enum debug_visibility)); -static boolean ieee_class_start_method PARAMS ((PTR, const char *)); -static boolean ieee_class_method_variant - PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean, - bfd_vma, boolean)); -static boolean ieee_class_static_method_variant - PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean)); -static boolean ieee_class_end_method PARAMS ((PTR)); -static boolean ieee_end_class_type PARAMS ((PTR)); -static boolean ieee_typedef_type PARAMS ((PTR, const char *)); -static boolean ieee_tag_type - PARAMS ((PTR, const char *, unsigned int, enum debug_type_kind)); -static boolean ieee_typdef PARAMS ((PTR, const char *)); -static boolean ieee_tag PARAMS ((PTR, const char *)); -static boolean ieee_int_constant PARAMS ((PTR, const char *, bfd_vma)); -static boolean ieee_float_constant PARAMS ((PTR, const char *, double)); -static boolean ieee_typed_constant PARAMS ((PTR, const char *, bfd_vma)); -static boolean ieee_variable - PARAMS ((PTR, const char *, enum debug_var_kind, bfd_vma)); -static boolean ieee_start_function PARAMS ((PTR, const char *, boolean)); -static boolean ieee_function_parameter - PARAMS ((PTR, const char *, enum debug_parm_kind, bfd_vma)); -static boolean ieee_start_block PARAMS ((PTR, bfd_vma)); -static boolean ieee_end_block PARAMS ((PTR, bfd_vma)); -static boolean ieee_end_function PARAMS ((PTR)); -static boolean ieee_lineno - PARAMS ((PTR, const char *, unsigned long, bfd_vma)); - -static const struct debug_write_fns ieee_fns = -{ - ieee_start_compilation_unit, - ieee_start_source, - ieee_empty_type, - ieee_void_type, - ieee_int_type, - ieee_float_type, - ieee_complex_type, - ieee_bool_type, - ieee_enum_type, - ieee_pointer_type, - ieee_function_type, - ieee_reference_type, - ieee_range_type, - ieee_array_type, - ieee_set_type, - ieee_offset_type, - ieee_method_type, - ieee_const_type, - ieee_volatile_type, - ieee_start_struct_type, - ieee_struct_field, - ieee_end_struct_type, - ieee_start_class_type, - ieee_class_static_member, - ieee_class_baseclass, - ieee_class_start_method, - ieee_class_method_variant, - ieee_class_static_method_variant, - ieee_class_end_method, - ieee_end_class_type, - ieee_typedef_type, - ieee_tag_type, - ieee_typdef, - ieee_tag, - ieee_int_constant, - ieee_float_constant, - ieee_typed_constant, - ieee_variable, - ieee_start_function, - ieee_function_parameter, - ieee_start_block, - ieee_end_block, - ieee_end_function, - ieee_lineno -}; - -/* Initialize a buffer to be empty. */ - -/*ARGSUSED*/ -static boolean -ieee_init_buffer (info, buflist) - struct ieee_handle *info ATTRIBUTE_UNUSED; - struct ieee_buflist *buflist; -{ - buflist->head = NULL; - buflist->tail = NULL; - return true; -} - -/* See whether a buffer list has any data. */ - -#define ieee_buffer_emptyp(buflist) ((buflist)->head == NULL) - -/* Change the current buffer to a specified buffer chain. */ - -static boolean -ieee_change_buffer (info, buflist) - struct ieee_handle *info; - struct ieee_buflist *buflist; -{ - if (buflist->head == NULL) - { - struct ieee_buf *buf; - - buf = (struct ieee_buf *) xmalloc (sizeof *buf); - buf->next = NULL; - buf->c = 0; - buflist->head = buf; - buflist->tail = buf; - } - - info->current = buflist; - info->curbuf = buflist->tail; - - return true; -} - -/* Append a buffer chain. */ - -/*ARGSUSED*/ -static boolean -ieee_append_buffer (info, mainbuf, newbuf) - struct ieee_handle *info ATTRIBUTE_UNUSED; - struct ieee_buflist *mainbuf; - struct ieee_buflist *newbuf; -{ - if (newbuf->head != NULL) - { - if (mainbuf->head == NULL) - mainbuf->head = newbuf->head; - else - mainbuf->tail->next = newbuf->head; - mainbuf->tail = newbuf->tail; - } - return true; -} - -/* Write a byte into the buffer. We use a macro for speed and a - function for the complex cases. */ - -#define ieee_write_byte(info, b) \ - ((info)->curbuf->c < IEEE_BUFSIZE \ - ? ((info)->curbuf->buf[(info)->curbuf->c++] = (b), true) \ - : ieee_real_write_byte ((info), (b))) - -static boolean -ieee_real_write_byte (info, b) - struct ieee_handle *info; - int b; -{ - if (info->curbuf->c >= IEEE_BUFSIZE) - { - struct ieee_buf *n; - - n = (struct ieee_buf *) xmalloc (sizeof *n); - n->next = NULL; - n->c = 0; - if (info->current->head == NULL) - info->current->head = n; - else - info->current->tail->next = n; - info->current->tail = n; - info->curbuf = n; - } - - info->curbuf->buf[info->curbuf->c] = b; - ++info->curbuf->c; - - return true; -} - -/* Write out two bytes. */ - -static boolean -ieee_write_2bytes (info, i) - struct ieee_handle *info; - int i; -{ - return (ieee_write_byte (info, i >> 8) - && ieee_write_byte (info, i & 0xff)); -} - -/* Write out an integer. */ - -static boolean -ieee_write_number (info, v) - struct ieee_handle *info; - bfd_vma v; -{ - bfd_vma t; - bfd_byte ab[20]; - bfd_byte *p; - unsigned int c; - - if (v <= (bfd_vma) ieee_number_end_enum) - return ieee_write_byte (info, (int) v); - - t = v; - p = ab + sizeof ab; - while (t != 0) - { - *--p = t & 0xff; - t >>= 8; - } - c = (ab + 20) - p; - - if (c > (unsigned int) (ieee_number_repeat_end_enum - - ieee_number_repeat_start_enum)) - { - fprintf (stderr, _("IEEE numeric overflow: 0x")); - fprintf_vma (stderr, v); - fprintf (stderr, "\n"); - return false; - } - - if (! ieee_write_byte (info, (int) ieee_number_repeat_start_enum + c)) - return false; - for (; c > 0; --c, ++p) - { - if (! ieee_write_byte (info, *p)) - return false; - } - - return true; -} - -/* Write out a string. */ - -static boolean -ieee_write_id (info, s) - struct ieee_handle *info; - const char *s; -{ - unsigned int len; - - len = strlen (s); - if (len <= 0x7f) - { - if (! ieee_write_byte (info, len)) - return false; - } - else if (len <= 0xff) - { - if (! ieee_write_byte (info, (int) ieee_extension_length_1_enum) - || ! ieee_write_byte (info, len)) - return false; - } - else if (len <= 0xffff) - { - if (! ieee_write_byte (info, (int) ieee_extension_length_2_enum) - || ! ieee_write_2bytes (info, len)) - return false; - } - else - { - fprintf (stderr, _("IEEE string length overflow: %u\n"), len); - return false; - } - - for (; *s != '\0'; s++) - if (! ieee_write_byte (info, *s)) - return false; - - return true; -} - -/* Write out an ASN record. */ - -static boolean -ieee_write_asn (info, indx, val) - struct ieee_handle *info; - unsigned int indx; - bfd_vma val; -{ - return (ieee_write_2bytes (info, (int) ieee_asn_record_enum) - && ieee_write_number (info, indx) - && ieee_write_number (info, val)); -} - -/* Write out an ATN65 record. */ - -static boolean -ieee_write_atn65 (info, indx, s) - struct ieee_handle *info; - unsigned int indx; - const char *s; -{ - return (ieee_write_2bytes (info, (int) ieee_atn_record_enum) - && ieee_write_number (info, indx) - && ieee_write_number (info, 0) - && ieee_write_number (info, 65) - && ieee_write_id (info, s)); -} - -/* Push a type index onto the type stack. */ - -static boolean -ieee_push_type (info, indx, size, unsignedp, localp) - struct ieee_handle *info; - unsigned int indx; - unsigned int size; - boolean unsignedp; - boolean localp; -{ - struct ieee_type_stack *ts; - - ts = (struct ieee_type_stack *) xmalloc (sizeof *ts); - memset (ts, 0, sizeof *ts); - - ts->type.indx = indx; - ts->type.size = size; - ts->type.unsignedp = unsignedp; - ts->type.localp = localp; - - ts->next = info->type_stack; - info->type_stack = ts; - - return true; -} - -/* Pop a type index off the type stack. */ - -static unsigned int -ieee_pop_type (info) - struct ieee_handle *info; -{ - return ieee_pop_type_used (info, true); -} - -/* Pop an unused type index off the type stack. */ - -static void -ieee_pop_unused_type (info) - struct ieee_handle *info; -{ - (void) ieee_pop_type_used (info, false); -} - -/* Pop a used or unused type index off the type stack. */ - -static unsigned int -ieee_pop_type_used (info, used) - struct ieee_handle *info; - boolean used; -{ - struct ieee_type_stack *ts; - unsigned int ret; - - ts = info->type_stack; - assert (ts != NULL); - - /* If this is a function type, and we need it, we need to append the - actual definition to the typedef block now. */ - if (used && ! ieee_buffer_emptyp (&ts->type.fndef)) - { - struct ieee_buflist *buflist; - - if (ts->type.localp) - { - /* Make sure we have started the types block. */ - if (ieee_buffer_emptyp (&info->types)) - { - if (! ieee_change_buffer (info, &info->types) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 1) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, info->modname)) - return false; - } - buflist = &info->types; - } - else - { - /* Make sure we started the global type block. */ - if (ieee_buffer_emptyp (&info->global_types)) - { - if (! ieee_change_buffer (info, &info->global_types) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 2) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, "")) - return false; - } - buflist = &info->global_types; - } - - if (! ieee_append_buffer (info, buflist, &ts->type.fndef)) - return false; - } - - ret = ts->type.indx; - info->type_stack = ts->next; - free (ts); - return ret; -} - -/* Add a range of bytes included in the current compilation unit. */ - -static boolean -ieee_add_range (info, global, low, high) - struct ieee_handle *info; - boolean global; - bfd_vma low; - bfd_vma high; -{ - struct ieee_range **plist, *r, **pr; - - if (low == (bfd_vma) -1 || high == (bfd_vma) -1 || low == high) - return true; - - if (global) - plist = &info->global_ranges; - else - plist = &info->ranges; - - for (r = *plist; r != NULL; r = r->next) - { - if (high >= r->low && low <= r->high) - { - /* The new range overlaps r. */ - if (low < r->low) - r->low = low; - if (high > r->high) - r->high = high; - pr = &r->next; - while (*pr != NULL && (*pr)->low <= r->high) - { - struct ieee_range *n; - - if ((*pr)->high > r->high) - r->high = (*pr)->high; - n = (*pr)->next; - free (*pr); - *pr = n; - } - return true; - } - } - - r = (struct ieee_range *) xmalloc (sizeof *r); - memset (r, 0, sizeof *r); - - r->low = low; - r->high = high; - - /* Store the ranges sorted by address. */ - for (pr = plist; *pr != NULL; pr = &(*pr)->next) - if ((*pr)->low > high) - break; - r->next = *pr; - *pr = r; - - return true; -} - -/* Start a new range for which we only have the low address. */ - -static boolean -ieee_start_range (info, low) - struct ieee_handle *info; - bfd_vma low; -{ - struct ieee_range *r; - - r = (struct ieee_range *) xmalloc (sizeof *r); - memset (r, 0, sizeof *r); - r->low = low; - r->next = info->pending_ranges; - info->pending_ranges = r; - return true; -} - -/* Finish a range started by ieee_start_range. */ - -static boolean -ieee_end_range (info, high) - struct ieee_handle *info; - bfd_vma high; -{ - struct ieee_range *r; - bfd_vma low; - - assert (info->pending_ranges != NULL); - r = info->pending_ranges; - low = r->low; - info->pending_ranges = r->next; - free (r); - return ieee_add_range (info, false, low, high); -} - -/* Start defining a type. */ - -static boolean -ieee_define_type (info, size, unsignedp, localp) - struct ieee_handle *info; - unsigned int size; - boolean unsignedp; - boolean localp; -{ - return ieee_define_named_type (info, (const char *) NULL, - (unsigned int) -1, size, unsignedp, - localp, (struct ieee_buflist *) NULL); -} - -/* Start defining a named type. */ - -static boolean -ieee_define_named_type (info, name, indx, size, unsignedp, localp, buflist) - struct ieee_handle *info; - const char *name; - unsigned int indx; - unsigned int size; - boolean unsignedp; - boolean localp; - struct ieee_buflist *buflist; -{ - unsigned int type_indx; - unsigned int name_indx; - - if (indx != (unsigned int) -1) - type_indx = indx; - else - { - type_indx = info->type_indx; - ++info->type_indx; - } - - name_indx = info->name_indx; - ++info->name_indx; - - if (name == NULL) - name = ""; - - /* If we were given a buffer, use it; otherwise, use either the - local or the global type information, and make sure that the type - block is started. */ - if (buflist != NULL) - { - if (! ieee_change_buffer (info, buflist)) - return false; - } - else if (localp) - { - if (! ieee_buffer_emptyp (&info->types)) - { - if (! ieee_change_buffer (info, &info->types)) - return false; - } - else - { - if (! ieee_change_buffer (info, &info->types) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 1) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, info->modname)) - return false; - } - } - else - { - if (! ieee_buffer_emptyp (&info->global_types)) - { - if (! ieee_change_buffer (info, &info->global_types)) - return false; - } - else - { - if (! ieee_change_buffer (info, &info->global_types) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 2) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, "")) - return false; - } - } - - /* Push the new type on the type stack, write out an NN record, and - write out the start of a TY record. The caller will then finish - the TY record. */ - if (! ieee_push_type (info, type_indx, size, unsignedp, localp)) - return false; - - return (ieee_write_byte (info, (int) ieee_nn_record) - && ieee_write_number (info, name_indx) - && ieee_write_id (info, name) - && ieee_write_byte (info, (int) ieee_ty_record_enum) - && ieee_write_number (info, type_indx) - && ieee_write_byte (info, 0xce) - && ieee_write_number (info, name_indx)); -} - -/* Get an entry to the list of modified versions of a type. */ - -static struct ieee_modified_type * -ieee_get_modified_info (info, indx) - struct ieee_handle *info; - unsigned int indx; -{ - if (indx >= info->modified_alloc) - { - unsigned int nalloc; - - nalloc = info->modified_alloc; - if (nalloc == 0) - nalloc = 16; - while (indx >= nalloc) - nalloc *= 2; - info->modified = ((struct ieee_modified_type *) - xrealloc (info->modified, - nalloc * sizeof *info->modified)); - memset (info->modified + info->modified_alloc, 0, - (nalloc - info->modified_alloc) * sizeof *info->modified); - info->modified_alloc = nalloc; - } - - return info->modified + indx; -} - -/* Routines for the hash table mapping names to types. */ - -/* Initialize an entry in the hash table. */ - -static struct bfd_hash_entry * -ieee_name_type_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct ieee_name_type_hash_entry *ret = - (struct ieee_name_type_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == NULL) - ret = ((struct ieee_name_type_hash_entry *) - bfd_hash_allocate (table, sizeof *ret)); - if (ret == NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct ieee_name_type_hash_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - if (ret) - { - /* Set local fields. */ - ret->types = NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Look up an entry in the hash table. */ - -#define ieee_name_type_hash_lookup(table, string, create, copy) \ - ((struct ieee_name_type_hash_entry *) \ - bfd_hash_lookup (&(table)->root, (string), (create), (copy))) - -/* Traverse the hash table. */ - -#define ieee_name_type_hash_traverse(table, func, info) \ - (bfd_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \ - (info))) - -/* The general routine to write out IEEE debugging information. */ - -boolean -write_ieee_debugging_info (abfd, dhandle) - bfd *abfd; - PTR dhandle; -{ - struct ieee_handle info; - asection *s; - const char *err; - struct ieee_buf *b; - - memset (&info, 0, sizeof info); - info.abfd = abfd; - info.type_indx = 256; - info.name_indx = 32; - - if (! bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc) - || ! bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc)) - return false; - - if (! ieee_init_buffer (&info, &info.global_types) - || ! ieee_init_buffer (&info, &info.data) - || ! ieee_init_buffer (&info, &info.types) - || ! ieee_init_buffer (&info, &info.vars) - || ! ieee_init_buffer (&info, &info.cxx) - || ! ieee_init_buffer (&info, &info.linenos) - || ! ieee_init_buffer (&info, &info.fntype) - || ! ieee_init_buffer (&info, &info.fnargs)) - return false; - - if (! debug_write (dhandle, &ieee_fns, (PTR) &info)) - return false; - - if (info.filename != NULL) - { - if (! ieee_finish_compilation_unit (&info)) - return false; - } - - /* Put any undefined tags in the global typedef information. */ - info.error = false; - ieee_name_type_hash_traverse (&info.tags, - ieee_write_undefined_tag, - (PTR) &info); - if (info.error) - return false; - - /* Prepend the global typedef information to the other data. */ - if (! ieee_buffer_emptyp (&info.global_types)) - { - /* The HP debugger seems to have a bug in which it ignores the - last entry in the global types, so we add a dummy entry. */ - if (! ieee_change_buffer (&info, &info.global_types) - || ! ieee_write_byte (&info, (int) ieee_nn_record) - || ! ieee_write_number (&info, info.name_indx) - || ! ieee_write_id (&info, "") - || ! ieee_write_byte (&info, (int) ieee_ty_record_enum) - || ! ieee_write_number (&info, info.type_indx) - || ! ieee_write_byte (&info, 0xce) - || ! ieee_write_number (&info, info.name_indx) - || ! ieee_write_number (&info, 'P') - || ! ieee_write_number (&info, (int) builtin_void + 32) - || ! ieee_write_byte (&info, (int) ieee_be_record_enum)) - return false; - - if (! ieee_append_buffer (&info, &info.global_types, &info.data)) - return false; - info.data = info.global_types; - } - - /* Make sure that we have declare BB11 blocks for each range in the - file. They are added to info->vars. */ - info.error = false; - if (! ieee_init_buffer (&info, &info.vars)) - return false; - bfd_map_over_sections (abfd, ieee_add_bb11_blocks, (PTR) &info); - if (info.error) - return false; - if (! ieee_buffer_emptyp (&info.vars)) - { - if (! ieee_change_buffer (&info, &info.vars) - || ! ieee_write_byte (&info, (int) ieee_be_record_enum)) - return false; - - if (! ieee_append_buffer (&info, &info.data, &info.vars)) - return false; - } - - /* Now all the data is in info.data. Write it out to the BFD. We - normally would need to worry about whether all the other sections - are set up yet, but the IEEE backend will handle this particular - case correctly regardless. */ - if (ieee_buffer_emptyp (&info.data)) - { - /* There is no debugging information. */ - return true; - } - err = NULL; - s = bfd_make_section (abfd, ".debug"); - if (s == NULL) - err = "bfd_make_section"; - if (err == NULL) - { - if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS)) - err = "bfd_set_section_flags"; - } - if (err == NULL) - { - bfd_size_type size; - - size = 0; - for (b = info.data.head; b != NULL; b = b->next) - size += b->c; - if (! bfd_set_section_size (abfd, s, size)) - err = "bfd_set_section_size"; - } - if (err == NULL) - { - file_ptr offset; - - offset = 0; - for (b = info.data.head; b != NULL; b = b->next) - { - if (! bfd_set_section_contents (abfd, s, b->buf, offset, b->c)) - { - err = "bfd_set_section_contents"; - break; - } - offset += b->c; - } - } - - if (err != NULL) - { - fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), err, - bfd_errmsg (bfd_get_error ())); - return false; - } - - bfd_hash_table_free (&info.typedefs.root); - bfd_hash_table_free (&info.tags.root); - - return true; -} - -/* Write out information for an undefined tag. This is called via - ieee_name_type_hash_traverse. */ - -static boolean -ieee_write_undefined_tag (h, p) - struct ieee_name_type_hash_entry *h; - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - struct ieee_name_type *nt; - - for (nt = h->types; nt != NULL; nt = nt->next) - { - unsigned int name_indx; - char code; - - if (nt->kind == DEBUG_KIND_ILLEGAL) - continue; - - if (ieee_buffer_emptyp (&info->global_types)) - { - if (! ieee_change_buffer (info, &info->global_types) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 2) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, "")) - { - info->error = true; - return false; - } - } - else - { - if (! ieee_change_buffer (info, &info->global_types)) - { - info->error = true; - return false; - } - } - - name_indx = info->name_indx; - ++info->name_indx; - if (! ieee_write_byte (info, (int) ieee_nn_record) - || ! ieee_write_number (info, name_indx) - || ! ieee_write_id (info, nt->type.name) - || ! ieee_write_byte (info, (int) ieee_ty_record_enum) - || ! ieee_write_number (info, nt->type.indx) - || ! ieee_write_byte (info, 0xce) - || ! ieee_write_number (info, name_indx)) - { - info->error = true; - return false; - } - - switch (nt->kind) - { - default: - abort (); - info->error = true; - return false; - case DEBUG_KIND_STRUCT: - case DEBUG_KIND_CLASS: - code = 'S'; - break; - case DEBUG_KIND_UNION: - case DEBUG_KIND_UNION_CLASS: - code = 'U'; - break; - case DEBUG_KIND_ENUM: - code = 'E'; - break; - } - if (! ieee_write_number (info, code) - || ! ieee_write_number (info, 0)) - { - info->error = true; - return false; - } - } - - return true; -} - -/* Start writing out information for a compilation unit. */ - -static boolean -ieee_start_compilation_unit (p, filename) - PTR p; - const char *filename; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - const char *modname; - char *c, *s; - unsigned int nindx; - - if (info->filename != NULL) - { - if (! ieee_finish_compilation_unit (info)) - return false; - } - - info->filename = filename; - modname = strrchr (filename, '/'); - if (modname != NULL) - ++modname; - else - { - modname = strrchr (filename, '\\'); - if (modname != NULL) - ++modname; - else - modname = filename; - } - c = xstrdup (modname); - s = strrchr (c, '.'); - if (s != NULL) - *s = '\0'; - info->modname = c; - - if (! ieee_init_buffer (info, &info->types) - || ! ieee_init_buffer (info, &info->vars) - || ! ieee_init_buffer (info, &info->cxx) - || ! ieee_init_buffer (info, &info->linenos)) - return false; - info->ranges = NULL; - - /* Always include a BB1 and a BB3 block. That is what the output of - the MRI linker seems to look like. */ - if (! ieee_change_buffer (info, &info->types) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 1) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, info->modname)) - return false; - - nindx = info->name_indx; - ++info->name_indx; - if (! ieee_change_buffer (info, &info->vars) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 3) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, info->modname)) - return false; - - return true; -} - -/* Finish up a compilation unit. */ - -static boolean -ieee_finish_compilation_unit (info) - struct ieee_handle *info; -{ - struct ieee_range *r; - - if (! ieee_buffer_emptyp (&info->types)) - { - if (! ieee_change_buffer (info, &info->types) - || ! ieee_write_byte (info, (int) ieee_be_record_enum)) - return false; - } - - if (! ieee_buffer_emptyp (&info->cxx)) - { - /* Append any C++ information to the global function and - variable information. */ - assert (! ieee_buffer_emptyp (&info->vars)); - if (! ieee_change_buffer (info, &info->vars)) - return false; - - /* We put the pmisc records in a dummy procedure, just as the - MRI compiler does. */ - if (! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 6) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, "__XRYCPP") - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, info->highaddr - 1) - || ! ieee_append_buffer (info, &info->vars, &info->cxx) - || ! ieee_change_buffer (info, &info->vars) - || ! ieee_write_byte (info, (int) ieee_be_record_enum) - || ! ieee_write_number (info, info->highaddr - 1)) - return false; - } - - if (! ieee_buffer_emptyp (&info->vars)) - { - if (! ieee_change_buffer (info, &info->vars) - || ! ieee_write_byte (info, (int) ieee_be_record_enum)) - return false; - } - - if (info->pending_lineno_filename != NULL) - { - /* Force out the pending line number. */ - if (! ieee_lineno ((PTR) info, (const char *) NULL, 0, (bfd_vma) -1)) - return false; - } - if (! ieee_buffer_emptyp (&info->linenos)) - { - if (! ieee_change_buffer (info, &info->linenos) - || ! ieee_write_byte (info, (int) ieee_be_record_enum)) - return false; - if (strcmp (info->filename, info->lineno_filename) != 0) - { - /* We were not in the main file. We just closed the - included line number block, and now we must close the - main line number block. */ - if (! ieee_write_byte (info, (int) ieee_be_record_enum)) - return false; - } - } - - if (! ieee_append_buffer (info, &info->data, &info->types) - || ! ieee_append_buffer (info, &info->data, &info->vars) - || ! ieee_append_buffer (info, &info->data, &info->linenos)) - return false; - - /* Build BB10/BB11 blocks based on the ranges we recorded. */ - if (! ieee_change_buffer (info, &info->data)) - return false; - - if (! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 10) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, info->modname) - || ! ieee_write_id (info, "") - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, "GNU objcopy")) - return false; - - for (r = info->ranges; r != NULL; r = r->next) - { - bfd_vma low, high; - asection *s; - int kind; - - low = r->low; - high = r->high; - - /* Find the section corresponding to this range. */ - for (s = info->abfd->sections; s != NULL; s = s->next) - { - if (bfd_get_section_vma (info->abfd, s) <= low - && high <= (bfd_get_section_vma (info->abfd, s) - + bfd_section_size (info->abfd, s))) - break; - } - - if (s == NULL) - { - /* Just ignore this range. */ - continue; - } - - /* Coalesce ranges if it seems reasonable. */ - while (r->next != NULL - && high + 0x1000 >= r->next->low - && (r->next->high - <= (bfd_get_section_vma (info->abfd, s) - + bfd_section_size (info->abfd, s)))) - { - r = r->next; - high = r->high; - } - - if ((s->flags & SEC_CODE) != 0) - kind = 1; - else if ((s->flags & SEC_READONLY) != 0) - kind = 3; - else - kind = 2; - - if (! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 11) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, "") - || ! ieee_write_number (info, kind) - || ! ieee_write_number (info, s->index + IEEE_SECTION_NUMBER_BASE) - || ! ieee_write_number (info, low) - || ! ieee_write_byte (info, (int) ieee_be_record_enum) - || ! ieee_write_number (info, high - low)) - return false; - - /* Add this range to the list of global ranges. */ - if (! ieee_add_range (info, true, low, high)) - return false; - } - - if (! ieee_write_byte (info, (int) ieee_be_record_enum)) - return false; - - return true; -} - -/* Add BB11 blocks describing each range that we have not already - described. */ - -static void -ieee_add_bb11_blocks (abfd, sec, data) - bfd *abfd ATTRIBUTE_UNUSED; - asection *sec; - PTR data; -{ - struct ieee_handle *info = (struct ieee_handle *) data; - bfd_vma low, high; - struct ieee_range *r; - - low = bfd_get_section_vma (abfd, sec); - high = low + bfd_section_size (abfd, sec); - - /* Find the first range at or after this section. The ranges are - sorted by address. */ - for (r = info->global_ranges; r != NULL; r = r->next) - if (r->high > low) - break; - - while (low < high) - { - if (r == NULL || r->low >= high) - { - if (! ieee_add_bb11 (info, sec, low, high)) - info->error = true; - return; - } - - if (low < r->low - && r->low - low > 0x100) - { - if (! ieee_add_bb11 (info, sec, low, r->low)) - { - info->error = true; - return; - } - } - low = r->high; - - r = r->next; - } -} - -/* Add a single BB11 block for a range. We add it to info->vars. */ - -static boolean -ieee_add_bb11 (info, sec, low, high) - struct ieee_handle *info; - asection *sec; - bfd_vma low; - bfd_vma high; -{ - int kind; - - if (! ieee_buffer_emptyp (&info->vars)) - { - if (! ieee_change_buffer (info, &info->vars)) - return false; - } - else - { - const char *filename, *modname; - char *c, *s; - - /* Start the enclosing BB10 block. */ - filename = bfd_get_filename (info->abfd); - modname = strrchr (filename, '/'); - if (modname != NULL) - ++modname; - else - { - modname = strrchr (filename, '\\'); - if (modname != NULL) - ++modname; - else - modname = filename; - } - c = xstrdup (modname); - s = strrchr (c, '.'); - if (s != NULL) - *s = '\0'; - - if (! ieee_change_buffer (info, &info->vars) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 10) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, c) - || ! ieee_write_id (info, "") - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, "GNU objcopy")) - return false; - - free (c); - } - - if ((sec->flags & SEC_CODE) != 0) - kind = 1; - else if ((sec->flags & SEC_READONLY) != 0) - kind = 3; - else - kind = 2; - - if (! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 11) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, "") - || ! ieee_write_number (info, kind) - || ! ieee_write_number (info, sec->index + IEEE_SECTION_NUMBER_BASE) - || ! ieee_write_number (info, low) - || ! ieee_write_byte (info, (int) ieee_be_record_enum) - || ! ieee_write_number (info, high - low)) - return false; - - return true; -} - -/* Start recording information from a particular source file. This is - used to record which file defined which types, variables, etc. It - is not used for line numbers, since the lineno entry point passes - down the file name anyhow. IEEE debugging information doesn't seem - to store this information anywhere. */ - -/*ARGSUSED*/ -static boolean -ieee_start_source (p, filename) - PTR p ATTRIBUTE_UNUSED; - const char *filename ATTRIBUTE_UNUSED; -{ - return true; -} - -/* Make an empty type. */ - -static boolean -ieee_empty_type (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - return ieee_push_type (info, (int) builtin_unknown, 0, false, false); -} - -/* Make a void type. */ - -static boolean -ieee_void_type (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - return ieee_push_type (info, (int) builtin_void, 0, false, false); -} - -/* Make an integer type. */ - -static boolean -ieee_int_type (p, size, unsignedp) - PTR p; - unsigned int size; - boolean unsignedp; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int indx; - - switch (size) - { - case 1: - indx = (int) builtin_signed_char; - break; - case 2: - indx = (int) builtin_signed_short_int; - break; - case 4: - indx = (int) builtin_signed_long; - break; - case 8: - indx = (int) builtin_signed_long_long; - break; - default: - fprintf (stderr, _("IEEE unsupported integer type size %u\n"), size); - return false; - } - - if (unsignedp) - ++indx; - - return ieee_push_type (info, indx, size, unsignedp, false); -} - -/* Make a floating point type. */ - -static boolean -ieee_float_type (p, size) - PTR p; - unsigned int size; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int indx; - - switch (size) - { - case 4: - indx = (int) builtin_float; - break; - case 8: - indx = (int) builtin_double; - break; - case 12: - /* FIXME: This size really depends upon the processor. */ - indx = (int) builtin_long_double; - break; - case 16: - indx = (int) builtin_long_long_double; - break; - default: - fprintf (stderr, _("IEEE unsupported float type size %u\n"), size); - return false; - } - - return ieee_push_type (info, indx, size, false, false); -} - -/* Make a complex type. */ - -static boolean -ieee_complex_type (p, size) - PTR p; - unsigned int size; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - char code; - - switch (size) - { - case 4: - if (info->complex_float_index != 0) - return ieee_push_type (info, info->complex_float_index, size * 2, - false, false); - code = 'c'; - break; - case 12: - case 16: - /* These cases can be output by gcc -gstabs. Outputting the - wrong type is better than crashing. */ - case 8: - if (info->complex_double_index != 0) - return ieee_push_type (info, info->complex_double_index, size * 2, - false, false); - code = 'd'; - break; - default: - fprintf (stderr, _("IEEE unsupported complex type size %u\n"), size); - return false; - } - - /* FIXME: I don't know what the string is for. */ - if (! ieee_define_type (info, size * 2, false, false) - || ! ieee_write_number (info, code) - || ! ieee_write_id (info, "")) - return false; - - if (size == 4) - info->complex_float_index = info->type_stack->type.indx; - else - info->complex_double_index = info->type_stack->type.indx; - - return true; -} - -/* Make a boolean type. IEEE doesn't support these, so we just make - an integer type instead. */ - -static boolean -ieee_bool_type (p, size) - PTR p; - unsigned int size; -{ - return ieee_int_type (p, size, true); -} - -/* Make an enumeration. */ - -static boolean -ieee_enum_type (p, tag, names, vals) - PTR p; - const char *tag; - const char **names; - bfd_signed_vma *vals; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - struct ieee_defined_enum *e; - boolean localp, simple; - unsigned int indx; - int i = 0; - - localp = false; - indx = (unsigned int) -1; - for (e = info->enums; e != NULL; e = e->next) - { - if (tag == NULL) - { - if (e->tag != NULL) - continue; - } - else - { - if (e->tag == NULL - || tag[0] != e->tag[0] - || strcmp (tag, e->tag) != 0) - continue; - } - - if (! e->defined) - { - /* This enum tag has been seen but not defined. */ - indx = e->indx; - break; - } - - if (names != NULL && e->names != NULL) - { - for (i = 0; names[i] != NULL && e->names[i] != NULL; i++) - { - if (names[i][0] != e->names[i][0] - || vals[i] != e->vals[i] - || strcmp (names[i], e->names[i]) != 0) - break; - } - } - - if ((names == NULL && e->names == NULL) - || (names != NULL - && e->names != NULL - && names[i] == NULL - && e->names[i] == NULL)) - { - /* We've seen this enum before. */ - return ieee_push_type (info, e->indx, 0, true, false); - } - - if (tag != NULL) - { - /* We've already seen an enum of the same name, so we must make - sure to output this one locally. */ - localp = true; - break; - } - } - - /* If this is a simple enumeration, in which the values start at 0 - and always increment by 1, we can use type E. Otherwise we must - use type N. */ - - simple = true; - if (names != NULL) - { - for (i = 0; names[i] != NULL; i++) - { - if (vals[i] != i) - { - simple = false; - break; - } - } - } - - if (! ieee_define_named_type (info, tag, indx, 0, true, localp, - (struct ieee_buflist *) NULL) - || ! ieee_write_number (info, simple ? 'E' : 'N')) - return false; - if (simple) - { - /* FIXME: This is supposed to be the enumeration size, but we - don't store that. */ - if (! ieee_write_number (info, 4)) - return false; - } - if (names != NULL) - { - for (i = 0; names[i] != NULL; i++) - { - if (! ieee_write_id (info, names[i])) - return false; - if (! simple) - { - if (! ieee_write_number (info, vals[i])) - return false; - } - } - } - - if (! localp) - { - if (indx == (unsigned int) -1) - { - e = (struct ieee_defined_enum *) xmalloc (sizeof *e); - memset (e, 0, sizeof *e); - e->indx = info->type_stack->type.indx; - e->tag = tag; - - e->next = info->enums; - info->enums = e; - } - - e->names = names; - e->vals = vals; - e->defined = true; - } - - return true; -} - -/* Make a pointer type. */ - -static boolean -ieee_pointer_type (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - boolean localp; - unsigned int indx; - struct ieee_modified_type *m = NULL; - - localp = info->type_stack->type.localp; - indx = ieee_pop_type (info); - - /* A pointer to a simple builtin type can be obtained by adding 32. - FIXME: Will this be a short pointer, and will that matter? */ - if (indx < 32) - return ieee_push_type (info, indx + 32, 0, true, false); - - if (! localp) - { - m = ieee_get_modified_info (p, indx); - if (m == NULL) - return false; - - /* FIXME: The size should depend upon the architecture. */ - if (m->pointer > 0) - return ieee_push_type (info, m->pointer, 4, true, false); - } - - if (! ieee_define_type (info, 4, true, localp) - || ! ieee_write_number (info, 'P') - || ! ieee_write_number (info, indx)) - return false; - - if (! localp) - m->pointer = info->type_stack->type.indx; - - return true; -} - -/* Make a function type. This will be called for a method, but we - don't want to actually add it to the type table in that case. We - handle this by defining the type in a private buffer, and only - adding that buffer to the typedef block if we are going to use it. */ - -static boolean -ieee_function_type (p, argcount, varargs) - PTR p; - int argcount; - boolean varargs; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - boolean localp; - unsigned int *args = NULL; - int i; - unsigned int retindx; - struct ieee_buflist fndef; - struct ieee_modified_type *m; - - localp = false; - - if (argcount > 0) - { - args = (unsigned int *) xmalloc (argcount * sizeof *args); - for (i = argcount - 1; i >= 0; i--) - { - if (info->type_stack->type.localp) - localp = true; - args[i] = ieee_pop_type (info); - } - } - else if (argcount < 0) - varargs = false; - - if (info->type_stack->type.localp) - localp = true; - retindx = ieee_pop_type (info); - - m = NULL; - if (argcount < 0 && ! localp) - { - m = ieee_get_modified_info (p, retindx); - if (m == NULL) - return false; - - if (m->function > 0) - return ieee_push_type (info, m->function, 0, true, false); - } - - /* An attribute of 0x41 means that the frame and push mask are - unknown. */ - if (! ieee_init_buffer (info, &fndef) - || ! ieee_define_named_type (info, (const char *) NULL, - (unsigned int) -1, 0, true, localp, - &fndef) - || ! ieee_write_number (info, 'x') - || ! ieee_write_number (info, 0x41) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, retindx) - || ! ieee_write_number (info, (bfd_vma) argcount + (varargs ? 1 : 0))) - return false; - if (argcount > 0) - { - for (i = 0; i < argcount; i++) - if (! ieee_write_number (info, args[i])) - return false; - free (args); - } - if (varargs) - { - /* A varargs function is represented by writing out the last - argument as type void *, although this makes little sense. */ - if (! ieee_write_number (info, (bfd_vma) builtin_void + 32)) - return false; - } - - if (! ieee_write_number (info, 0)) - return false; - - /* We wrote the information into fndef, in case we don't need it. - It will be appended to info->types by ieee_pop_type. */ - info->type_stack->type.fndef = fndef; - - if (m != NULL) - m->function = info->type_stack->type.indx; - - return true; -} - -/* Make a reference type. */ - -static boolean -ieee_reference_type (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - /* IEEE appears to record a normal pointer type, and then use a - pmisc record to indicate that it is really a reference. */ - - if (! ieee_pointer_type (p)) - return false; - info->type_stack->type.referencep = true; - return true; -} - -/* Make a range type. */ - -static boolean -ieee_range_type (p, low, high) - PTR p; - bfd_signed_vma low; - bfd_signed_vma high; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int size; - boolean unsignedp, localp; - - size = info->type_stack->type.size; - unsignedp = info->type_stack->type.unsignedp; - localp = info->type_stack->type.localp; - ieee_pop_unused_type (info); - return (ieee_define_type (info, size, unsignedp, localp) - && ieee_write_number (info, 'R') - && ieee_write_number (info, (bfd_vma) low) - && ieee_write_number (info, (bfd_vma) high) - && ieee_write_number (info, unsignedp ? 0 : 1) - && ieee_write_number (info, size)); -} - -/* Make an array type. */ - -/*ARGSUSED*/ -static boolean -ieee_array_type (p, low, high, stringp) - PTR p; - bfd_signed_vma low; - bfd_signed_vma high; - boolean stringp ATTRIBUTE_UNUSED; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int eleindx; - boolean localp; - unsigned int size; - struct ieee_modified_type *m = NULL; - struct ieee_modified_array_type *a; - - /* IEEE does not store the range, so we just ignore it. */ - ieee_pop_unused_type (info); - localp = info->type_stack->type.localp; - size = info->type_stack->type.size; - eleindx = ieee_pop_type (info); - - /* If we don't know the range, treat the size as exactly one - element. */ - if (low < high) - size *= (high - low) + 1; - - if (! localp) - { - m = ieee_get_modified_info (info, eleindx); - if (m == NULL) - return false; - - for (a = m->arrays; a != NULL; a = a->next) - { - if (a->low == low && a->high == high) - return ieee_push_type (info, a->indx, size, false, false); - } - } - - if (! ieee_define_type (info, size, false, localp) - || ! ieee_write_number (info, low == 0 ? 'Z' : 'C') - || ! ieee_write_number (info, eleindx)) - return false; - if (low != 0) - { - if (! ieee_write_number (info, low)) - return false; - } - - if (! ieee_write_number (info, high + 1)) - return false; - - if (! localp) - { - a = (struct ieee_modified_array_type *) xmalloc (sizeof *a); - memset (a, 0, sizeof *a); - - a->indx = info->type_stack->type.indx; - a->low = low; - a->high = high; - - a->next = m->arrays; - m->arrays = a; - } - - return true; -} - -/* Make a set type. */ - -static boolean -ieee_set_type (p, bitstringp) - PTR p; - boolean bitstringp ATTRIBUTE_UNUSED; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - boolean localp; - unsigned int eleindx; - - localp = info->type_stack->type.localp; - eleindx = ieee_pop_type (info); - - /* FIXME: We don't know the size, so we just use 4. */ - - return (ieee_define_type (info, 0, true, localp) - && ieee_write_number (info, 's') - && ieee_write_number (info, 4) - && ieee_write_number (info, eleindx)); -} - -/* Make an offset type. */ - -static boolean -ieee_offset_type (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int targetindx, baseindx; - - targetindx = ieee_pop_type (info); - baseindx = ieee_pop_type (info); - - /* FIXME: The MRI C++ compiler does not appear to generate any - useful type information about an offset type. It just records a - pointer to member as an integer. The MRI/HP IEEE spec does - describe a pmisc record which can be used for a pointer to - member. Unfortunately, it does not describe the target type, - which seems pretty important. I'm going to punt this for now. */ - - return ieee_int_type (p, 4, true); -} - -/* Make a method type. */ - -static boolean -ieee_method_type (p, domain, argcount, varargs) - PTR p; - boolean domain; - int argcount; - boolean varargs; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a - method, but the definition is incomplete. We just output an 'x' - type. */ - - if (domain) - ieee_pop_unused_type (info); - - return ieee_function_type (p, argcount, varargs); -} - -/* Make a const qualified type. */ - -static boolean -ieee_const_type (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int size; - boolean unsignedp, localp; - unsigned int indx; - struct ieee_modified_type *m = NULL; - - size = info->type_stack->type.size; - unsignedp = info->type_stack->type.unsignedp; - localp = info->type_stack->type.localp; - indx = ieee_pop_type (info); - - if (! localp) - { - m = ieee_get_modified_info (info, indx); - if (m == NULL) - return false; - - if (m->const_qualified > 0) - return ieee_push_type (info, m->const_qualified, size, unsignedp, - false); - } - - if (! ieee_define_type (info, size, unsignedp, localp) - || ! ieee_write_number (info, 'n') - || ! ieee_write_number (info, 1) - || ! ieee_write_number (info, indx)) - return false; - - if (! localp) - m->const_qualified = info->type_stack->type.indx; - - return true; -} - -/* Make a volatile qualified type. */ - -static boolean -ieee_volatile_type (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int size; - boolean unsignedp, localp; - unsigned int indx; - struct ieee_modified_type *m = NULL; - - size = info->type_stack->type.size; - unsignedp = info->type_stack->type.unsignedp; - localp = info->type_stack->type.localp; - indx = ieee_pop_type (info); - - if (! localp) - { - m = ieee_get_modified_info (info, indx); - if (m == NULL) - return false; - - if (m->volatile_qualified > 0) - return ieee_push_type (info, m->volatile_qualified, size, unsignedp, - false); - } - - if (! ieee_define_type (info, size, unsignedp, localp) - || ! ieee_write_number (info, 'n') - || ! ieee_write_number (info, 2) - || ! ieee_write_number (info, indx)) - return false; - - if (! localp) - m->volatile_qualified = info->type_stack->type.indx; - - return true; -} - -/* Convert an enum debug_visibility into a CXXFLAGS value. */ - -static unsigned int -ieee_vis_to_flags (visibility) - enum debug_visibility visibility; -{ - switch (visibility) - { - default: - abort (); - case DEBUG_VISIBILITY_PUBLIC: - return CXXFLAGS_VISIBILITY_PUBLIC; - case DEBUG_VISIBILITY_PRIVATE: - return CXXFLAGS_VISIBILITY_PRIVATE; - case DEBUG_VISIBILITY_PROTECTED: - return CXXFLAGS_VISIBILITY_PROTECTED; - } - /*NOTREACHED*/ -} - -/* Start defining a struct type. We build it in the strdef field on - the stack, to avoid confusing type definitions required by the - fields with the struct type itself. */ - -static boolean -ieee_start_struct_type (p, tag, id, structp, size) - PTR p; - const char *tag; - unsigned int id; - boolean structp; - unsigned int size; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - boolean localp, ignorep; - boolean copy; - char ab[20]; - const char *look; - struct ieee_name_type_hash_entry *h; - struct ieee_name_type *nt, *ntlook; - struct ieee_buflist strdef; - - localp = false; - ignorep = false; - - /* We need to create a tag for internal use even if we don't want - one for external use. This will let us refer to an anonymous - struct. */ - if (tag != NULL) - { - look = tag; - copy = false; - } - else - { - sprintf (ab, "__anon%u", id); - look = ab; - copy = true; - } - - /* If we already have references to the tag, we must use the - existing type index. */ - h = ieee_name_type_hash_lookup (&info->tags, look, true, copy); - if (h == NULL) - return false; - - nt = NULL; - for (ntlook = h->types; ntlook != NULL; ntlook = ntlook->next) - { - if (ntlook->id == id) - nt = ntlook; - else if (! ntlook->type.localp) - { - /* We are creating a duplicate definition of a globally - defined tag. Force it to be local to avoid - confusion. */ - localp = true; - } - } - - if (nt != NULL) - { - assert (localp == nt->type.localp); - if (nt->kind == DEBUG_KIND_ILLEGAL && ! localp) - { - /* We've already seen a global definition of the type. - Ignore this new definition. */ - ignorep = true; - } - } - else - { - nt = (struct ieee_name_type *) xmalloc (sizeof *nt); - memset (nt, 0, sizeof *nt); - nt->id = id; - nt->type.name = h->root.string; - nt->next = h->types; - h->types = nt; - nt->type.indx = info->type_indx; - ++info->type_indx; - } - - nt->kind = DEBUG_KIND_ILLEGAL; - - if (! ieee_init_buffer (info, &strdef) - || ! ieee_define_named_type (info, tag, nt->type.indx, size, true, - localp, &strdef) - || ! ieee_write_number (info, structp ? 'S' : 'U') - || ! ieee_write_number (info, size)) - return false; - - if (! ignorep) - { - const char *hold; - - /* We never want nt->type.name to be NULL. We want the rest of - the type to be the object set up on the type stack; it will - have a NULL name if tag is NULL. */ - hold = nt->type.name; - nt->type = info->type_stack->type; - nt->type.name = hold; - } - - info->type_stack->type.name = tag; - info->type_stack->type.strdef = strdef; - info->type_stack->type.ignorep = ignorep; - - return true; -} - -/* Add a field to a struct. */ - -static boolean -ieee_struct_field (p, name, bitpos, bitsize, visibility) - PTR p; - const char *name; - bfd_vma bitpos; - bfd_vma bitsize; - enum debug_visibility visibility; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int size; - boolean unsignedp; - boolean referencep; - boolean localp; - unsigned int indx; - bfd_vma offset; - - assert (info->type_stack != NULL - && info->type_stack->next != NULL - && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef)); - - /* If we are ignoring this struct definition, just pop and ignore - the type. */ - if (info->type_stack->next->type.ignorep) - { - ieee_pop_unused_type (info); - return true; - } - - size = info->type_stack->type.size; - unsignedp = info->type_stack->type.unsignedp; - referencep = info->type_stack->type.referencep; - localp = info->type_stack->type.localp; - indx = ieee_pop_type (info); - - if (localp) - info->type_stack->type.localp = true; - - if (info->type_stack->type.classdef != NULL) - { - unsigned int flags; - unsigned int nindx; - - /* This is a class. We must add a description of this field to - the class records we are building. */ - - flags = ieee_vis_to_flags (visibility); - nindx = info->type_stack->type.classdef->indx; - if (! ieee_change_buffer (info, - &info->type_stack->type.classdef->pmiscbuf) - || ! ieee_write_asn (info, nindx, 'd') - || ! ieee_write_asn (info, nindx, flags) - || ! ieee_write_atn65 (info, nindx, name) - || ! ieee_write_atn65 (info, nindx, name)) - return false; - info->type_stack->type.classdef->pmisccount += 4; - - if (referencep) - { - unsigned int nindx; - - /* We need to output a record recording that this field is - really of reference type. We put this on the refs field - of classdef, so that it can be appended to the C++ - records after the class is defined. */ - - nindx = info->name_indx; - ++info->name_indx; - - if (! ieee_change_buffer (info, - &info->type_stack->type.classdef->refs) - || ! ieee_write_byte (info, (int) ieee_nn_record) - || ! ieee_write_number (info, nindx) - || ! ieee_write_id (info, "") - || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum) - || ! ieee_write_number (info, nindx) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, 62) - || ! ieee_write_number (info, 80) - || ! ieee_write_number (info, 4) - || ! ieee_write_asn (info, nindx, 'R') - || ! ieee_write_asn (info, nindx, 3) - || ! ieee_write_atn65 (info, nindx, info->type_stack->type.name) - || ! ieee_write_atn65 (info, nindx, name)) - return false; - } - } - - /* If the bitsize doesn't match the expected size, we need to output - a bitfield type. */ - if (size == 0 || bitsize == 0 || bitsize == size * 8) - offset = bitpos / 8; - else - { - if (! ieee_define_type (info, 0, unsignedp, - info->type_stack->type.localp) - || ! ieee_write_number (info, 'g') - || ! ieee_write_number (info, unsignedp ? 0 : 1) - || ! ieee_write_number (info, bitsize) - || ! ieee_write_number (info, indx)) - return false; - indx = ieee_pop_type (info); - offset = bitpos; - } - - /* Switch to the struct we are building in order to output this - field definition. */ - return (ieee_change_buffer (info, &info->type_stack->type.strdef) - && ieee_write_id (info, name) - && ieee_write_number (info, indx) - && ieee_write_number (info, offset)); -} - -/* Finish up a struct type. */ - -static boolean -ieee_end_struct_type (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - struct ieee_buflist *pb; - - assert (info->type_stack != NULL - && ! ieee_buffer_emptyp (&info->type_stack->type.strdef)); - - /* If we were ignoring this struct definition because it was a - duplicate defintion, just through away whatever bytes we have - accumulated. Leave the type on the stack. */ - if (info->type_stack->type.ignorep) - return true; - - /* If this is not a duplicate definition of this tag, then localp - will be false, and we can put it in the global type block. - FIXME: We should avoid outputting duplicate definitions which are - the same. */ - if (! info->type_stack->type.localp) - { - /* Make sure we have started the global type block. */ - if (ieee_buffer_emptyp (&info->global_types)) - { - if (! ieee_change_buffer (info, &info->global_types) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 2) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, "")) - return false; - } - pb = &info->global_types; - } - else - { - /* Make sure we have started the types block. */ - if (ieee_buffer_emptyp (&info->types)) - { - if (! ieee_change_buffer (info, &info->types) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 1) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, info->modname)) - return false; - } - pb = &info->types; - } - - /* Append the struct definition to the types. */ - if (! ieee_append_buffer (info, pb, &info->type_stack->type.strdef) - || ! ieee_init_buffer (info, &info->type_stack->type.strdef)) - return false; - - /* Leave the struct on the type stack. */ - - return true; -} - -/* Start a class type. */ - -static boolean -ieee_start_class_type (p, tag, id, structp, size, vptr, ownvptr) - PTR p; - const char *tag; - unsigned int id; - boolean structp; - unsigned int size; - boolean vptr; - boolean ownvptr; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - const char *vclass; - struct ieee_buflist pmiscbuf; - unsigned int indx; - struct ieee_type_class *classdef; - - /* A C++ class is output as a C++ struct along with a set of pmisc - records describing the class. */ - - /* We need to have a name so that we can associate the struct and - the class. */ - if (tag == NULL) - { - char *t; - - t = (char *) xmalloc (20); - sprintf (t, "__anon%u", id); - tag = t; - } - - /* We can't write out the virtual table information until we have - finished the class, because we don't know the virtual table size. - We get the size from the largest voffset we see. */ - vclass = NULL; - if (vptr && ! ownvptr) - { - vclass = info->type_stack->type.name; - assert (vclass != NULL); - /* We don't call ieee_pop_unused_type, since the class should - get defined. */ - (void) ieee_pop_type (info); - } - - if (! ieee_start_struct_type (p, tag, id, structp, size)) - return false; - - indx = info->name_indx; - ++info->name_indx; - - /* We write out pmisc records into the classdef field. We will - write out the pmisc start after we know the number of records we - need. */ - if (! ieee_init_buffer (info, &pmiscbuf) - || ! ieee_change_buffer (info, &pmiscbuf) - || ! ieee_write_asn (info, indx, 'T') - || ! ieee_write_asn (info, indx, structp ? 'o' : 'u') - || ! ieee_write_atn65 (info, indx, tag)) - return false; - - classdef = (struct ieee_type_class *) xmalloc (sizeof *classdef); - memset (classdef, 0, sizeof *classdef); - - classdef->indx = indx; - classdef->pmiscbuf = pmiscbuf; - classdef->pmisccount = 3; - classdef->vclass = vclass; - classdef->ownvptr = ownvptr; - - info->type_stack->type.classdef = classdef; - - return true; -} - -/* Add a static member to a class. */ - -static boolean -ieee_class_static_member (p, name, physname, visibility) - PTR p; - const char *name; - const char *physname; - enum debug_visibility visibility; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int flags; - unsigned int nindx; - - /* We don't care about the type. Hopefully there will be a call to - ieee_variable declaring the physical name and the type, since - that is where an IEEE consumer must get the type. */ - ieee_pop_unused_type (info); - - assert (info->type_stack != NULL - && info->type_stack->type.classdef != NULL); - - flags = ieee_vis_to_flags (visibility); - flags |= CXXFLAGS_STATIC; - - nindx = info->type_stack->type.classdef->indx; - - if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf) - || ! ieee_write_asn (info, nindx, 'd') - || ! ieee_write_asn (info, nindx, flags) - || ! ieee_write_atn65 (info, nindx, name) - || ! ieee_write_atn65 (info, nindx, physname)) - return false; - info->type_stack->type.classdef->pmisccount += 4; - - return true; -} - -/* Add a base class to a class. */ - -static boolean -ieee_class_baseclass (p, bitpos, virtual, visibility) - PTR p; - bfd_vma bitpos; - boolean virtual; - enum debug_visibility visibility; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - const char *bname; - boolean localp; - unsigned int bindx; - char *fname; - unsigned int flags; - unsigned int nindx; - - assert (info->type_stack != NULL - && info->type_stack->type.name != NULL - && info->type_stack->next != NULL - && info->type_stack->next->type.classdef != NULL - && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef)); - - bname = info->type_stack->type.name; - localp = info->type_stack->type.localp; - bindx = ieee_pop_type (info); - - /* We are currently defining both a struct and a class. We must - write out a field definition in the struct which holds the base - class. The stabs debugging reader will create a field named - _vb$CLASS for a virtual base class, so we just use that. FIXME: - we should not depend upon a detail of stabs debugging. */ - if (virtual) - { - fname = (char *) xmalloc (strlen (bname) + sizeof "_vb$"); - sprintf (fname, "_vb$%s", bname); - flags = BASEFLAGS_VIRTUAL; - } - else - { - if (localp) - info->type_stack->type.localp = true; - - fname = (char *) xmalloc (strlen (bname) + sizeof "_b$"); - sprintf (fname, "_b$%s", bname); - - if (! ieee_change_buffer (info, &info->type_stack->type.strdef) - || ! ieee_write_id (info, fname) - || ! ieee_write_number (info, bindx) - || ! ieee_write_number (info, bitpos / 8)) - return false; - flags = 0; - } - - if (visibility == DEBUG_VISIBILITY_PRIVATE) - flags |= BASEFLAGS_PRIVATE; - - nindx = info->type_stack->type.classdef->indx; - - if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf) - || ! ieee_write_asn (info, nindx, 'b') - || ! ieee_write_asn (info, nindx, flags) - || ! ieee_write_atn65 (info, nindx, bname) - || ! ieee_write_asn (info, nindx, 0) - || ! ieee_write_atn65 (info, nindx, fname)) - return false; - info->type_stack->type.classdef->pmisccount += 5; - - free (fname); - - return true; -} - -/* Start building a method for a class. */ - -static boolean -ieee_class_start_method (p, name) - PTR p; - const char *name; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - assert (info->type_stack != NULL - && info->type_stack->type.classdef != NULL - && info->type_stack->type.classdef->method == NULL); - - info->type_stack->type.classdef->method = name; - - return true; -} - -/* Define a new method variant, either static or not. */ - -static boolean -ieee_class_method_var (info, physname, visibility, staticp, constp, - volatilep, voffset, context) - struct ieee_handle *info; - const char *physname; - enum debug_visibility visibility; - boolean staticp; - boolean constp; - boolean volatilep; - bfd_vma voffset; - boolean context; -{ - unsigned int flags; - unsigned int nindx; - boolean virtual; - - /* We don't need the type of the method. An IEEE consumer which - wants the type must track down the function by the physical name - and get the type from that. */ - ieee_pop_unused_type (info); - - /* We don't use the context. FIXME: We probably ought to use it to - adjust the voffset somehow, but I don't really know how. */ - if (context) - ieee_pop_unused_type (info); - - assert (info->type_stack != NULL - && info->type_stack->type.classdef != NULL - && info->type_stack->type.classdef->method != NULL); - - flags = ieee_vis_to_flags (visibility); - - /* FIXME: We never set CXXFLAGS_OVERRIDE, CXXFLAGS_OPERATOR, - CXXFLAGS_CTORDTOR, CXXFLAGS_CTOR, or CXXFLAGS_INLINE. */ - - if (staticp) - flags |= CXXFLAGS_STATIC; - if (constp) - flags |= CXXFLAGS_CONST; - if (volatilep) - flags |= CXXFLAGS_VOLATILE; - - nindx = info->type_stack->type.classdef->indx; - - virtual = context || voffset > 0; - - if (! ieee_change_buffer (info, - &info->type_stack->type.classdef->pmiscbuf) - || ! ieee_write_asn (info, nindx, virtual ? 'v' : 'm') - || ! ieee_write_asn (info, nindx, flags) - || ! ieee_write_atn65 (info, nindx, - info->type_stack->type.classdef->method) - || ! ieee_write_atn65 (info, nindx, physname)) - return false; - - if (virtual) - { - if (voffset > info->type_stack->type.classdef->voffset) - info->type_stack->type.classdef->voffset = voffset; - if (! ieee_write_asn (info, nindx, voffset)) - return false; - ++info->type_stack->type.classdef->pmisccount; - } - - if (! ieee_write_asn (info, nindx, 0)) - return false; - - info->type_stack->type.classdef->pmisccount += 5; - - return true; -} - -/* Define a new method variant. */ - -static boolean -ieee_class_method_variant (p, physname, visibility, constp, volatilep, - voffset, context) - PTR p; - const char *physname; - enum debug_visibility visibility; - boolean constp; - boolean volatilep; - bfd_vma voffset; - boolean context; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - return ieee_class_method_var (info, physname, visibility, false, constp, - volatilep, voffset, context); -} - -/* Define a new static method variant. */ - -static boolean -ieee_class_static_method_variant (p, physname, visibility, constp, volatilep) - PTR p; - const char *physname; - enum debug_visibility visibility; - boolean constp; - boolean volatilep; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - return ieee_class_method_var (info, physname, visibility, true, constp, - volatilep, 0, false); -} - -/* Finish up a method. */ - -static boolean -ieee_class_end_method (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - assert (info->type_stack != NULL - && info->type_stack->type.classdef != NULL - && info->type_stack->type.classdef->method != NULL); - - info->type_stack->type.classdef->method = NULL; - - return true; -} - -/* Finish up a class. */ - -static boolean -ieee_end_class_type (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int nindx; - - assert (info->type_stack != NULL - && info->type_stack->type.classdef != NULL); - - /* If we were ignoring this class definition because it was a - duplicate definition, just through away whatever bytes we have - accumulated. Leave the type on the stack. */ - if (info->type_stack->type.ignorep) - return true; - - nindx = info->type_stack->type.classdef->indx; - - /* If we have a virtual table, we can write out the information now. */ - if (info->type_stack->type.classdef->vclass != NULL - || info->type_stack->type.classdef->ownvptr) - { - if (! ieee_change_buffer (info, - &info->type_stack->type.classdef->pmiscbuf) - || ! ieee_write_asn (info, nindx, 'z') - || ! ieee_write_atn65 (info, nindx, "") - || ! ieee_write_asn (info, nindx, - info->type_stack->type.classdef->voffset)) - return false; - if (info->type_stack->type.classdef->ownvptr) - { - if (! ieee_write_atn65 (info, nindx, "")) - return false; - } - else - { - if (! ieee_write_atn65 (info, nindx, - info->type_stack->type.classdef->vclass)) - return false; - } - if (! ieee_write_asn (info, nindx, 0)) - return false; - info->type_stack->type.classdef->pmisccount += 5; - } - - /* Now that we know the number of pmisc records, we can write out - the atn62 which starts the pmisc records, and append them to the - C++ buffers. */ - - if (! ieee_change_buffer (info, &info->cxx) - || ! ieee_write_byte (info, (int) ieee_nn_record) - || ! ieee_write_number (info, nindx) - || ! ieee_write_id (info, "") - || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum) - || ! ieee_write_number (info, nindx) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, 62) - || ! ieee_write_number (info, 80) - || ! ieee_write_number (info, - info->type_stack->type.classdef->pmisccount)) - return false; - - if (! ieee_append_buffer (info, &info->cxx, - &info->type_stack->type.classdef->pmiscbuf)) - return false; - if (! ieee_buffer_emptyp (&info->type_stack->type.classdef->refs)) - { - if (! ieee_append_buffer (info, &info->cxx, - &info->type_stack->type.classdef->refs)) - return false; - } - - return ieee_end_struct_type (p); -} - -/* Push a previously seen typedef onto the type stack. */ - -static boolean -ieee_typedef_type (p, name) - PTR p; - const char *name; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - struct ieee_name_type_hash_entry *h; - struct ieee_name_type *nt; - - h = ieee_name_type_hash_lookup (&info->typedefs, name, false, false); - - /* h should never be NULL, since that would imply that the generic - debugging code has asked for a typedef which it has not yet - defined. */ - assert (h != NULL); - - /* We always use the most recently defined type for this name, which - will be the first one on the list. */ - - nt = h->types; - if (! ieee_push_type (info, nt->type.indx, nt->type.size, - nt->type.unsignedp, nt->type.localp)) - return false; - - /* Copy over any other type information we may have. */ - info->type_stack->type = nt->type; - - return true; -} - -/* Push a tagged type onto the type stack. */ - -static boolean -ieee_tag_type (p, name, id, kind) - PTR p; - const char *name; - unsigned int id; - enum debug_type_kind kind; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - boolean localp; - boolean copy; - char ab[20]; - struct ieee_name_type_hash_entry *h; - struct ieee_name_type *nt; - - if (kind == DEBUG_KIND_ENUM) - { - struct ieee_defined_enum *e; - - if (name == NULL) - abort (); - for (e = info->enums; e != NULL; e = e->next) - if (e->tag != NULL && strcmp (e->tag, name) == 0) - return ieee_push_type (info, e->indx, 0, true, false); - - e = (struct ieee_defined_enum *) xmalloc (sizeof *e); - memset (e, 0, sizeof *e); - - e->indx = info->type_indx; - ++info->type_indx; - e->tag = name; - e->defined = false; - - e->next = info->enums; - info->enums = e; - - return ieee_push_type (info, e->indx, 0, true, false); - } - - localp = false; - - copy = false; - if (name == NULL) - { - sprintf (ab, "__anon%u", id); - name = ab; - copy = true; - } - - h = ieee_name_type_hash_lookup (&info->tags, name, true, copy); - if (h == NULL) - return false; - - for (nt = h->types; nt != NULL; nt = nt->next) - { - if (nt->id == id) - { - if (! ieee_push_type (info, nt->type.indx, nt->type.size, - nt->type.unsignedp, nt->type.localp)) - return false; - /* Copy over any other type information we may have. */ - info->type_stack->type = nt->type; - return true; - } - - if (! nt->type.localp) - { - /* This is a duplicate of a global type, so it must be - local. */ - localp = true; - } - } - - nt = (struct ieee_name_type *) xmalloc (sizeof *nt); - memset (nt, 0, sizeof *nt); - - nt->id = id; - nt->type.name = h->root.string; - nt->type.indx = info->type_indx; - nt->type.localp = localp; - ++info->type_indx; - nt->kind = kind; - - nt->next = h->types; - h->types = nt; - - if (! ieee_push_type (info, nt->type.indx, 0, false, localp)) - return false; - - info->type_stack->type.name = h->root.string; - - return true; -} - -/* Output a typedef. */ - -static boolean -ieee_typdef (p, name) - PTR p; - const char *name; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - struct ieee_write_type type; - unsigned int indx; - boolean found; - boolean localp; - struct ieee_name_type_hash_entry *h; - struct ieee_name_type *nt; - - type = info->type_stack->type; - indx = type.indx; - - /* If this is a simple builtin type using a builtin name, we don't - want to output the typedef itself. We also want to change the - type index to correspond to the name being used. We recognize - names used in stabs debugging output even if they don't exactly - correspond to the names used for the IEEE builtin types. */ - found = false; - if (indx <= (unsigned int) builtin_bcd_float) - { - switch ((enum builtin_types) indx) - { - default: - break; - - case builtin_void: - if (strcmp (name, "void") == 0) - found = true; - break; - - case builtin_signed_char: - case builtin_char: - if (strcmp (name, "signed char") == 0) - { - indx = (unsigned int) builtin_signed_char; - found = true; - } - else if (strcmp (name, "char") == 0) - { - indx = (unsigned int) builtin_char; - found = true; - } - break; - - case builtin_unsigned_char: - if (strcmp (name, "unsigned char") == 0) - found = true; - break; - - case builtin_signed_short_int: - case builtin_short: - case builtin_short_int: - case builtin_signed_short: - if (strcmp (name, "signed short int") == 0) - { - indx = (unsigned int) builtin_signed_short_int; - found = true; - } - else if (strcmp (name, "short") == 0) - { - indx = (unsigned int) builtin_short; - found = true; - } - else if (strcmp (name, "short int") == 0) - { - indx = (unsigned int) builtin_short_int; - found = true; - } - else if (strcmp (name, "signed short") == 0) - { - indx = (unsigned int) builtin_signed_short; - found = true; - } - break; - - case builtin_unsigned_short_int: - case builtin_unsigned_short: - if (strcmp (name, "unsigned short int") == 0 - || strcmp (name, "short unsigned int") == 0) - { - indx = builtin_unsigned_short_int; - found = true; - } - else if (strcmp (name, "unsigned short") == 0) - { - indx = builtin_unsigned_short; - found = true; - } - break; - - case builtin_signed_long: - case builtin_int: /* FIXME: Size depends upon architecture. */ - case builtin_long: - if (strcmp (name, "signed long") == 0) - { - indx = builtin_signed_long; - found = true; - } - else if (strcmp (name, "int") == 0) - { - indx = builtin_int; - found = true; - } - else if (strcmp (name, "long") == 0 - || strcmp (name, "long int") == 0) - { - indx = builtin_long; - found = true; - } - break; - - case builtin_unsigned_long: - case builtin_unsigned: /* FIXME: Size depends upon architecture. */ - case builtin_unsigned_int: /* FIXME: Like builtin_unsigned. */ - if (strcmp (name, "unsigned long") == 0 - || strcmp (name, "long unsigned int") == 0) - { - indx = builtin_unsigned_long; - found = true; - } - else if (strcmp (name, "unsigned") == 0) - { - indx = builtin_unsigned; - found = true; - } - else if (strcmp (name, "unsigned int") == 0) - { - indx = builtin_unsigned_int; - found = true; - } - break; - - case builtin_signed_long_long: - if (strcmp (name, "signed long long") == 0 - || strcmp (name, "long long int") == 0) - found = true; - break; - - case builtin_unsigned_long_long: - if (strcmp (name, "unsigned long long") == 0 - || strcmp (name, "long long unsigned int") == 0) - found = true; - break; - - case builtin_float: - if (strcmp (name, "float") == 0) - found = true; - break; - - case builtin_double: - if (strcmp (name, "double") == 0) - found = true; - break; - - case builtin_long_double: - if (strcmp (name, "long double") == 0) - found = true; - break; - - case builtin_long_long_double: - if (strcmp (name, "long long double") == 0) - found = true; - break; - } - - if (found) - type.indx = indx; - } - - h = ieee_name_type_hash_lookup (&info->typedefs, name, true, false); - if (h == NULL) - return false; - - /* See if we have already defined this type with this name. */ - localp = type.localp; - for (nt = h->types; nt != NULL; nt = nt->next) - { - if (nt->id == indx) - { - /* If this is a global definition, then we don't need to - do anything here. */ - if (! nt->type.localp) - { - ieee_pop_unused_type (info); - return true; - } - } - else - { - /* This is a duplicate definition, so make this one local. */ - localp = true; - } - } - - /* We need to add a new typedef for this type. */ - - nt = (struct ieee_name_type *) xmalloc (sizeof *nt); - memset (nt, 0, sizeof *nt); - nt->id = indx; - nt->type = type; - nt->type.name = name; - nt->type.localp = localp; - nt->kind = DEBUG_KIND_ILLEGAL; - - nt->next = h->types; - h->types = nt; - - if (found) - { - /* This is one of the builtin typedefs, so we don't need to - actually define it. */ - ieee_pop_unused_type (info); - return true; - } - - indx = ieee_pop_type (info); - - if (! ieee_define_named_type (info, name, (unsigned int) -1, type.size, - type.unsignedp, localp, - (struct ieee_buflist *) NULL) - || ! ieee_write_number (info, 'T') - || ! ieee_write_number (info, indx)) - return false; - - /* Remove the type we just added to the type stack. This should not - be ieee_pop_unused_type, since the type is used, we just don't - need it now. */ - (void) ieee_pop_type (info); - - return true; -} - -/* Output a tag for a type. We don't have to do anything here. */ - -static boolean -ieee_tag (p, name) - PTR p; - const char *name ATTRIBUTE_UNUSED; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - /* This should not be ieee_pop_unused_type, since we want the type - to be defined. */ - (void) ieee_pop_type (info); - return true; -} - -/* Output an integer constant. */ - -static boolean -ieee_int_constant (p, name, val) - PTR p ATTRIBUTE_UNUSED; - const char *name ATTRIBUTE_UNUSED; - bfd_vma val ATTRIBUTE_UNUSED; -{ - /* FIXME. */ - return true; -} - -/* Output a floating point constant. */ - -static boolean -ieee_float_constant (p, name, val) - PTR p ATTRIBUTE_UNUSED; - const char *name ATTRIBUTE_UNUSED; - double val ATTRIBUTE_UNUSED; -{ - /* FIXME. */ - return true; -} - -/* Output a typed constant. */ - -static boolean -ieee_typed_constant (p, name, val) - PTR p; - const char *name ATTRIBUTE_UNUSED; - bfd_vma val ATTRIBUTE_UNUSED; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - /* FIXME. */ - ieee_pop_unused_type (info); - return true; -} - -/* Output a variable. */ - -static boolean -ieee_variable (p, name, kind, val) - PTR p; - const char *name; - enum debug_var_kind kind; - bfd_vma val; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - unsigned int name_indx; - unsigned int size; - boolean referencep; - unsigned int type_indx; - boolean asn; - int refflag; - - size = info->type_stack->type.size; - referencep = info->type_stack->type.referencep; - type_indx = ieee_pop_type (info); - - assert (! ieee_buffer_emptyp (&info->vars)); - if (! ieee_change_buffer (info, &info->vars)) - return false; - - name_indx = info->name_indx; - ++info->name_indx; - - /* Write out an NN and an ATN record for this variable. */ - if (! ieee_write_byte (info, (int) ieee_nn_record) - || ! ieee_write_number (info, name_indx) - || ! ieee_write_id (info, name) - || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum) - || ! ieee_write_number (info, name_indx) - || ! ieee_write_number (info, type_indx)) - return false; - switch (kind) - { - default: - abort (); - return false; - case DEBUG_GLOBAL: - if (! ieee_write_number (info, 8) - || ! ieee_add_range (info, false, val, val + size)) - return false; - refflag = 0; - asn = true; - break; - case DEBUG_STATIC: - if (! ieee_write_number (info, 3) - || ! ieee_add_range (info, false, val, val + size)) - return false; - refflag = 1; - asn = true; - break; - case DEBUG_LOCAL_STATIC: - if (! ieee_write_number (info, 3) - || ! ieee_add_range (info, false, val, val + size)) - return false; - refflag = 2; - asn = true; - break; - case DEBUG_LOCAL: - if (! ieee_write_number (info, 1) - || ! ieee_write_number (info, val)) - return false; - refflag = 2; - asn = false; - break; - case DEBUG_REGISTER: - if (! ieee_write_number (info, 2) - || ! ieee_write_number (info, - ieee_genreg_to_regno (info->abfd, val))) - return false; - refflag = 2; - asn = false; - break; - } - - if (asn) - { - if (! ieee_write_asn (info, name_indx, val)) - return false; - } - - /* If this is really a reference type, then we just output it with - pointer type, and must now output a C++ record indicating that it - is really reference type. */ - if (referencep) - { - unsigned int nindx; - - nindx = info->name_indx; - ++info->name_indx; - - /* If this is a global variable, we want to output the misc - record in the C++ misc record block. Otherwise, we want to - output it just after the variable definition, which is where - the current buffer is. */ - if (refflag != 2) - { - if (! ieee_change_buffer (info, &info->cxx)) - return false; - } - - if (! ieee_write_byte (info, (int) ieee_nn_record) - || ! ieee_write_number (info, nindx) - || ! ieee_write_id (info, "") - || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum) - || ! ieee_write_number (info, nindx) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, 62) - || ! ieee_write_number (info, 80) - || ! ieee_write_number (info, 3) - || ! ieee_write_asn (info, nindx, 'R') - || ! ieee_write_asn (info, nindx, refflag) - || ! ieee_write_atn65 (info, nindx, name)) - return false; - } - - return true; -} - -/* Start outputting information for a function. */ - -static boolean -ieee_start_function (p, name, global) - PTR p; - const char *name; - boolean global; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - boolean referencep; - unsigned int retindx, typeindx; - - referencep = info->type_stack->type.referencep; - retindx = ieee_pop_type (info); - - /* Besides recording a BB4 or BB6 block, we record the type of the - function in the BB1 typedef block. We can't write out the full - type until we have seen all the parameters, so we accumulate it - in info->fntype and info->fnargs. */ - if (! ieee_buffer_emptyp (&info->fntype)) - { - /* FIXME: This might happen someday if we support nested - functions. */ - abort (); - } - - info->fnname = name; - - /* An attribute of 0x40 means that the push mask is unknown. */ - if (! ieee_define_named_type (info, name, (unsigned int) -1, 0, false, true, - &info->fntype) - || ! ieee_write_number (info, 'x') - || ! ieee_write_number (info, 0x40) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, retindx)) - return false; - - typeindx = ieee_pop_type (info); - - if (! ieee_init_buffer (info, &info->fnargs)) - return false; - info->fnargcount = 0; - - /* If the function return value is actually a reference type, we - must add a record indicating that. */ - if (referencep) - { - unsigned int nindx; - - nindx = info->name_indx; - ++info->name_indx; - if (! ieee_change_buffer (info, &info->cxx) - || ! ieee_write_byte (info, (int) ieee_nn_record) - || ! ieee_write_number (info, nindx) - || ! ieee_write_id (info, "") - || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum) - || ! ieee_write_number (info, nindx) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, 62) - || ! ieee_write_number (info, 80) - || ! ieee_write_number (info, 3) - || ! ieee_write_asn (info, nindx, 'R') - || ! ieee_write_asn (info, nindx, global ? 0 : 1) - || ! ieee_write_atn65 (info, nindx, name)) - return false; - } - - assert (! ieee_buffer_emptyp (&info->vars)); - if (! ieee_change_buffer (info, &info->vars)) - return false; - - /* The address is written out as the first block. */ - - ++info->block_depth; - - return (ieee_write_byte (info, (int) ieee_bb_record_enum) - && ieee_write_byte (info, global ? 4 : 6) - && ieee_write_number (info, 0) - && ieee_write_id (info, name) - && ieee_write_number (info, 0) - && ieee_write_number (info, typeindx)); -} - -/* Add a function parameter. This will normally be called before the - first block, so we postpone them until we see the block. */ - -static boolean -ieee_function_parameter (p, name, kind, val) - PTR p; - const char *name; - enum debug_parm_kind kind; - bfd_vma val; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - struct ieee_pending_parm *m, **pm; - - assert (info->block_depth == 1); - - m = (struct ieee_pending_parm *) xmalloc (sizeof *m); - memset (m, 0, sizeof *m); - - m->next = NULL; - m->name = name; - m->referencep = info->type_stack->type.referencep; - m->type = ieee_pop_type (info); - m->kind = kind; - m->val = val; - - for (pm = &info->pending_parms; *pm != NULL; pm = &(*pm)->next) - ; - *pm = m; - - /* Add the type to the fnargs list. */ - if (! ieee_change_buffer (info, &info->fnargs) - || ! ieee_write_number (info, m->type)) - return false; - ++info->fnargcount; - - return true; -} - -/* Output pending function parameters. */ - -static boolean -ieee_output_pending_parms (info) - struct ieee_handle *info; -{ - struct ieee_pending_parm *m; - unsigned int refcount; - - refcount = 0; - for (m = info->pending_parms; m != NULL; m = m->next) - { - enum debug_var_kind vkind; - - switch (m->kind) - { - default: - abort (); - return false; - case DEBUG_PARM_STACK: - case DEBUG_PARM_REFERENCE: - vkind = DEBUG_LOCAL; - break; - case DEBUG_PARM_REG: - case DEBUG_PARM_REF_REG: - vkind = DEBUG_REGISTER; - break; - } - - if (! ieee_push_type (info, m->type, 0, false, false)) - return false; - info->type_stack->type.referencep = m->referencep; - if (m->referencep) - ++refcount; - if (! ieee_variable ((PTR) info, m->name, vkind, m->val)) - return false; - } - - /* If there are any reference parameters, we need to output a - miscellaneous record indicating them. */ - if (refcount > 0) - { - unsigned int nindx, varindx; - - /* FIXME: The MRI compiler outputs the demangled function name - here, but we are outputting the mangled name. */ - nindx = info->name_indx; - ++info->name_indx; - if (! ieee_change_buffer (info, &info->vars) - || ! ieee_write_byte (info, (int) ieee_nn_record) - || ! ieee_write_number (info, nindx) - || ! ieee_write_id (info, "") - || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum) - || ! ieee_write_number (info, nindx) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, 62) - || ! ieee_write_number (info, 80) - || ! ieee_write_number (info, refcount + 3) - || ! ieee_write_asn (info, nindx, 'B') - || ! ieee_write_atn65 (info, nindx, info->fnname) - || ! ieee_write_asn (info, nindx, 0)) - return false; - for (m = info->pending_parms, varindx = 1; - m != NULL; - m = m->next, varindx++) - { - if (m->referencep) - { - if (! ieee_write_asn (info, nindx, varindx)) - return false; - } - } - } - - m = info->pending_parms; - while (m != NULL) - { - struct ieee_pending_parm *next; - - next = m->next; - free (m); - m = next; - } - - info->pending_parms = NULL; - - return true; -} - -/* Start a block. If this is the first block, we output the address - to finish the BB4 or BB6, and then output the function parameters. */ - -static boolean -ieee_start_block (p, addr) - PTR p; - bfd_vma addr; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - if (! ieee_change_buffer (info, &info->vars)) - return false; - - if (info->block_depth == 1) - { - if (! ieee_write_number (info, addr) - || ! ieee_output_pending_parms (info)) - return false; - } - else - { - if (! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 6) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, "") - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, addr)) - return false; - } - - if (! ieee_start_range (info, addr)) - return false; - - ++info->block_depth; - - return true; -} - -/* End a block. */ - -static boolean -ieee_end_block (p, addr) - PTR p; - bfd_vma addr; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - /* The address we are given is the end of the block, but IEEE seems - to want to the address of the last byte in the block, so we - subtract one. */ - if (! ieee_change_buffer (info, &info->vars) - || ! ieee_write_byte (info, (int) ieee_be_record_enum) - || ! ieee_write_number (info, addr - 1)) - return false; - - if (! ieee_end_range (info, addr)) - return false; - - --info->block_depth; - - if (addr > info->highaddr) - info->highaddr = addr; - - return true; -} - -/* End a function. */ - -static boolean -ieee_end_function (p) - PTR p; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - assert (info->block_depth == 1); - - --info->block_depth; - - /* Now we can finish up fntype, and add it to the typdef section. - At this point, fntype is the 'x' type up to the argument count, - and fnargs is the argument types. We must add the argument - count, and we must add the level. FIXME: We don't record varargs - functions correctly. In fact, stabs debugging does not give us - enough information to do so. */ - if (! ieee_change_buffer (info, &info->fntype) - || ! ieee_write_number (info, info->fnargcount) - || ! ieee_change_buffer (info, &info->fnargs) - || ! ieee_write_number (info, 0)) - return false; - - /* Make sure the typdef block has been started. */ - if (ieee_buffer_emptyp (&info->types)) - { - if (! ieee_change_buffer (info, &info->types) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 1) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, info->modname)) - return false; - } - - if (! ieee_append_buffer (info, &info->types, &info->fntype) - || ! ieee_append_buffer (info, &info->types, &info->fnargs)) - return false; - - info->fnname = NULL; - if (! ieee_init_buffer (info, &info->fntype) - || ! ieee_init_buffer (info, &info->fnargs)) - return false; - info->fnargcount = 0; - - return true; -} - -/* Record line number information. */ - -static boolean -ieee_lineno (p, filename, lineno, addr) - PTR p; - const char *filename; - unsigned long lineno; - bfd_vma addr; -{ - struct ieee_handle *info = (struct ieee_handle *) p; - - assert (info->filename != NULL); - - /* The HP simulator seems to get confused when more than one line is - listed for the same address, at least if they are in different - files. We handle this by always listing the last line for a - given address, since that seems to be the one that gdb uses. */ - if (info->pending_lineno_filename != NULL - && addr != info->pending_lineno_addr) - { - /* Make sure we have a line number block. */ - if (! ieee_buffer_emptyp (&info->linenos)) - { - if (! ieee_change_buffer (info, &info->linenos)) - return false; - } - else - { - info->lineno_name_indx = info->name_indx; - ++info->name_indx; - if (! ieee_change_buffer (info, &info->linenos) - || ! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 5) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, info->filename) - || ! ieee_write_byte (info, (int) ieee_nn_record) - || ! ieee_write_number (info, info->lineno_name_indx) - || ! ieee_write_id (info, "")) - return false; - info->lineno_filename = info->filename; - } - - if (strcmp (info->pending_lineno_filename, info->lineno_filename) != 0) - { - if (strcmp (info->filename, info->lineno_filename) != 0) - { - /* We were not in the main file. Close the block for the - included file. */ - if (! ieee_write_byte (info, (int) ieee_be_record_enum)) - return false; - if (strcmp (info->filename, info->pending_lineno_filename) == 0) - { - /* We need a new NN record, and we aren't about to - output one. */ - info->lineno_name_indx = info->name_indx; - ++info->name_indx; - if (! ieee_write_byte (info, (int) ieee_nn_record) - || ! ieee_write_number (info, info->lineno_name_indx) - || ! ieee_write_id (info, "")) - return false; - } - } - if (strcmp (info->filename, info->pending_lineno_filename) != 0) - { - /* We are not changing to the main file. Open a block for - the new included file. */ - info->lineno_name_indx = info->name_indx; - ++info->name_indx; - if (! ieee_write_byte (info, (int) ieee_bb_record_enum) - || ! ieee_write_byte (info, 5) - || ! ieee_write_number (info, 0) - || ! ieee_write_id (info, info->pending_lineno_filename) - || ! ieee_write_byte (info, (int) ieee_nn_record) - || ! ieee_write_number (info, info->lineno_name_indx) - || ! ieee_write_id (info, "")) - return false; - } - info->lineno_filename = info->pending_lineno_filename; - } - - if (! ieee_write_2bytes (info, (int) ieee_atn_record_enum) - || ! ieee_write_number (info, info->lineno_name_indx) - || ! ieee_write_number (info, 0) - || ! ieee_write_number (info, 7) - || ! ieee_write_number (info, info->pending_lineno) - || ! ieee_write_number (info, 0) - || ! ieee_write_asn (info, info->lineno_name_indx, - info->pending_lineno_addr)) - return false; - } - - info->pending_lineno_filename = filename; - info->pending_lineno = lineno; - info->pending_lineno_addr = addr; - - return true; -} diff --git a/binutils/is-ranlib.c b/binutils/is-ranlib.c deleted file mode 100644 index fde72a43da5..00000000000 --- a/binutils/is-ranlib.c +++ /dev/null @@ -1,3 +0,0 @@ -/* Linked with ar.o to flag that this program is 'ranlib' (not 'ar'). */ - -int is_ranlib = 1; diff --git a/binutils/is-strip.c b/binutils/is-strip.c deleted file mode 100644 index 215341a325c..00000000000 --- a/binutils/is-strip.c +++ /dev/null @@ -1,4 +0,0 @@ -/* Linked with objcopy.o to flag that this program is 'strip' (not - 'objcopy'). */ - -int is_strip = 1; diff --git a/binutils/mac-binutils.r b/binutils/mac-binutils.r deleted file mode 100644 index 7b1a3035e28..00000000000 --- a/binutils/mac-binutils.r +++ /dev/null @@ -1,42 +0,0 @@ -/* Resources for GNU binutils. */ - -#include "SysTypes.r" - -/* Version resources. */ - -resource 'vers' (1) { - 0, - 0, - 0, - 0, - verUs, - VERSION_STRING, - VERSION_STRING " (C) 1986-95 FSF, Inc." -}; - -resource 'vers' (2, purgeable) { - 0, - 0, - 0, - 0, - verUs, - VERSION_STRING, - "binutils " VERSION_STRING " for MPW" -}; - -#ifdef WANT_CFRG - -#include "CodeFragmentTypes.r" - -resource 'cfrg' (0) { - { - kPowerPC, - kFullLib, - kNoVersionNum, kNoVersionNum, - 0,0, - kIsApp, kOnDiskFlat, kZeroOffset, kWholeFork, - PROG_NAME - } -}; - -#endif /* WANT_CFRG */ diff --git a/binutils/makefile.vms-in b/binutils/makefile.vms-in deleted file mode 100644 index a809d1b13cd..00000000000 --- a/binutils/makefile.vms-in +++ /dev/null @@ -1,98 +0,0 @@ -# -# Makefile for binutils under openVMS (Alpha and Vax) -# -# For use with gnu-make for vms -# -# Created by Klaus K"ampf, kkaempf@rmi.de -# -# - -# Distribution version, filled in by configure.com -VERSION=@VERSION@ - -ifeq ($(ARCH),ALPHA) -TARGET=""vms-alpha"" -else -TARGET=""vms-vax"" -endif - -ifeq ($(CC),gcc) -CFLAGS=/include=([],[-.include],[-.bfd])$(DEFS) -DEFS=/define=("TARGET=$(TARGET)") -LIBS=,gnu_cc_library:libgcc/lib,sys$$library:vaxcrtl.olb/lib,gnu_cc_library:crt0.obj -else -CFLAGS=/noopt/debug/include=([],[-.include],[-.bfd])$(DEFS)\ -/warnings=disable=(missingreturn,implicitfunc,longextern) -DEFS=/define=("TARGET=$(TARGET)","const=","unlink=remove") -LIBS=,sys$$library:vaxcrtl.olb/lib -endif - -BFDLIB = [-.bfd]libbfd.olb/lib -BFDLIB_DEP = [-.bfd]libbfd.olb -LIBIBERTY_DEP = [-.libiberty]libiberty.olb -LIBIBERTY = [-.libiberty]libiberty.olb/lib -OPCODES_DEP = [-.opcodes]libopcodes.olb -OPCODES = [-.opcodes]libopcodes.olb/lib - -DEBUG_OBJS = rddbg.obj,debug.obj,stabs.obj,ieee.obj,rdcoff.obj - -WRITE_DEBUG_OBJS = $(DEBUG_OBJS),wrstabs.obj - -BULIBS = []bucomm.obj,version.obj,filemode.obj - -ADDL_DEPS = $(BULIBS),$(BFDLIB_DEP),$(LIBIBERTY_DEP) -ADDL_LIBS = $(BULIBS),$(BFDLIB),$(LIBIBERTY) - -SIZEOBJS = $(ADDL_DEPS),size.obj - -STRINGSOBJS = $(ADDL_DEPS),strings.obj - -NMOBJS = $(ADDL_DEPS),nm.obj - -OBJDUMPOBJS = $(ADDL_DEPS),objdump.obj,prdbg.obj,$(DEBUG_OBJS),$(OPCODES_DEP) - -all: config.h size.exe strings.exe objdump.exe nm.exe - -size.exe: $(SIZEOBJS) - link/exe=$@ size.obj,$(ADDL_LIBS)$(LIBS) - -strings.exe: $(STRINGSOBJS) - link/exe=$@ strings.obj,$(ADDL_LIBS)$(LIBS) - -nm.exe: $(NMOBJS) - link/exe=$@ nm.obj,$(ADDL_LIBS)$(LIBS) - -objdump.exe: $(OBJDUMPOBJS) - link/exe=$@ objdump.obj,prdbg.obj,$(DEBUG_OBJS),$(BFDLIB),$(OPCODES),$(ADDL_LIBS)$(LIBS) - - -version.obj: version.c - $(CC) $(CFLAGS)/define=(VERSION="""$(VERSION)""") $< - -config.h: - $$ @configure - $(MAKE) -f makefile.vms "CC=$(CC)" - -[-.bfd]libbfd.olb: - $(CD) [-.bfd] - $(MAKE) -f makefile.vms "CC=$(CC)" - $(CD) [-.binutils] - -[-.libiberty]libiberty.olb: - $(CD) [-.libiberty] - $(MAKE) -f makefile.vms "CC=$(CC)" - $(CD) [-.binutils] - -[-.opcodes]libopcodes.olb: - $(CD) [-.opcodes] - $(MAKE) -f makefile.vms "CC=$(CC)" - $(CD) [-.binutils] - -clean: - $$ purge - $(RM) *.obj; - $(RM) *.exe; - -distclean: clean - $(RM) config.h; - $(RM) makefile.vms; diff --git a/binutils/maybe-ranlib.c b/binutils/maybe-ranlib.c deleted file mode 100644 index f37bc0ff216..00000000000 --- a/binutils/maybe-ranlib.c +++ /dev/null @@ -1,4 +0,0 @@ -/* Linked with ar.o to flag that this program decides at runtime - (using argv[0] if it is is 'ar' or 'ranlib'. */ - -int is_ranlib = -1; diff --git a/binutils/maybe-strip.c b/binutils/maybe-strip.c deleted file mode 100644 index 6467c99e935..00000000000 --- a/binutils/maybe-strip.c +++ /dev/null @@ -1,4 +0,0 @@ -/* Linked with objcopy.o to flag that this program decides at runtime - (using argv[0] if it is is 'strip' or 'objcopy'. */ - -int is_strip = -1; diff --git a/binutils/mpw-config.in b/binutils/mpw-config.in deleted file mode 100644 index 21a067ddd6b..00000000000 --- a/binutils/mpw-config.in +++ /dev/null @@ -1,27 +0,0 @@ -# Configuration fragment for binutils. - -Set target_arch `echo {target_canonical} | sed -e 's/-.*-.*//'` - -# (should canonicalize arch name) */ - -Set archname ARCH_{target_arch} - -Set underscore 0 - -If "{target_canonical}" =~ /sh-hitachi-hms/ - Set underscore 1 -End If - -Echo '# From mpw-config.in' > "{o}"mk.tmp -Echo "ARCHDEFS = -d" {archname} >> "{o}"mk.tmp -Echo "UNDERSCORE = " {underscore} >> "{o}"mk.tmp -Echo "BUILD_NLMCONV = " >> "{o}"mk.tmp -Echo "BUILD_SRCONV = " >> "{o}"mk.tmp -Echo "SYSINFO_PROG = " >> "{o}"mk.tmp -Echo "BUILD_DLLTOOL = " >> "{o}"mk.tmp -Echo '# End from mpw-config.in' >> "{o}"mk.tmp - -Echo '/* config.h. Generated by mpw-configure. */' > "{o}"config.new -Echo '#include "mpw.h"' >> "{o}"config.new - -MoveIfChange "{o}"config.new "{o}"config.h diff --git a/binutils/mpw-make.sed b/binutils/mpw-make.sed deleted file mode 100644 index 03abffe18f8..00000000000 --- a/binutils/mpw-make.sed +++ /dev/null @@ -1,115 +0,0 @@ -# Sed commands to finish translating the binutils Unix makefile into MPW syntax. - -# Add a rule. -/^#### .*/a\ -\ -"{o}"underscore.c.o \\Option-f "{o}"underscore.c\ - -# Comment out any alias settings. -/^host_alias =/s/^/#/ -/^target_alias =/s/^/#/ - -# Whack out unused host define bits. -/HDEFINES/s/@HDEFINES@// - -# Don't build specialized tools. -/BUILD_NLMCONV/s/@BUILD_NLMCONV@// -/BUILD_SRCONV/s/@BUILD_SRCONV@// -/BUILD_DLLTOOL/s/@BUILD_DLLTOOL@// - -/UNDERSCORE/s/@UNDERSCORE@/{UNDERSCORE}/ - -# Don't need this. -/@HLDFLAGS@/s/@HLDFLAGS@// - -# Point at the libraries directly. -/@BFDLIB@/s/@BFDLIB@/::bfd:libbfd.o/ -/@OPCODES@/s/@OPCODES@/::opcodes:libopcodes.o/ - -# Whack out target makefile fragment. -/target_makefile_fragment/s/target_makefile_fragment@// - -# Fix and add to the include paths. -/^INCLUDES = .*$/s/$/ -i "{INCDIR}":mpw: -i ::extra-include:/ -/BFDDIR/s/-i {BFDDIR} /-i "{BFDDIR}": / -/INCDIR/s/-i {INCDIR} /-i "{INCDIR}": / - -# Use byacc instead of bison (for now anyway). -/BISON/s/^BISON =.*$/BISON = byacc/ -#/BISONFLAGS/s/^BISONFLAGS =.*$/BISONFLAGS = / - -# Embed the version in symbolic doublequotes that will expand to -# the right thing for each compiler. -/VERSION/s/'"{VERSION}"'/{dq}{VERSION}{dq}/ - -# '+' is a special char to MPW, don't use it ever. -/c++filt/s/c++filt/cplusfilt/ - -# All of the binutils use the same Rez file, change names to refer to it. -/^{[A-Z]*_PROG}/s/$/ "{s}"mac-binutils.r/ -/{[A-Z]*_PROG}\.r/s/{[A-Z]*_PROG}\.r/mac-binutils.r/ - -# There are auto-generated references to BFD .h files that are not -# in the objdir (like bfd.h) but are in the source dir. -/::bfd:lib/s/::bfd:lib\([a-z]*\)\.h/{BFDDIR}:lib\1.h/g - -# Fix the locations of generated files. -/config/s/"{s}"config\.h/"{o}"config.h/g -/config/s/^config\.h/"{o}"config\.h/ -/underscore/s/"{s}"underscore\.c/"{o}"underscore.c/g -/underscore/s/^underscore\.c/"{o}"underscore\.c/ - -# Fix paths to generated source files. -/lex.yy.c/s/"{s}"lex\.yy\.c/"{o}"lex.yy.c/g -/lex.yy.c/s/^lex\.yy\.c/"{o}"lex.yy.c/ -/arlex.c/s/"{s}"arlex\.c/"{o}"arlex.c/g -/arlex.c/s/^arlex\.c/"{o}"arlex.c/ -/y.tab.c/s/"{s}"y\.tab\.c/"{o}"y.tab.c/g -/y.tab.c/s/^y\.tab\.c/"{o}"y.tab.c/ -/arparse.c/s/"{s}"arparse\.c/"{o}"arparse.c/g -/arparse.c/s/^arparse\.c/"{o}"arparse.c/ -/y.tab.h/s/"{s}"y\.tab\.h/"{o}"y.tab.h/g -/y.tab.h/s/^y\.tab\.h/"{o}"y.tab.h/ -/arparse.h/s/"{s}"arparse\.h/"{o}"arparse.h/g -/arparse.h/s/^arparse\.h/"{o}"arparse.h/ - -/"{s}"{INCDIR}/s/"{s}"{INCDIR}/"{INCDIR}"/g - -# The generated lexer may include an ifdef for older Mac compilers that -# needs to work with newer compilers also. -/lex.yy.c/s/Rename -y \([^ ]*\) \([^ ]*\)$/sed -e 's,ifdef macintosh,if defined(macintosh) || defined(__MWERKS__),' \1 > \2/ - -# Fix an over-eagerness. -/echo.*WARNING.*This file/s/'.*'/' '/ - -# Add a "stamps" target. -$a\ -stamps \\Option-f stamp-under\ - -/^install \\Option-f /,/^$/c\ -install \\Option-f all install-only\ -\ -install-only \\Option-f\ - NewFolderRecursive "{bindir}"\ - # Need to copy all the tools\ - For prog in {PROGS}\ - Set progname `echo {prog} | sed -e 's/.new//'`\ - Duplicate -y :{prog} "{bindir}"{progname}\ - End For\ - - -/true/s/ ; @true$// - -# dot files are trouble, remove them and their actions. -/^\.dep/,/^$/d - -# Remove un-useful targets. -/^Makefile \\Option-f/,/^$/d -/^"{o}"config.h \\Option-f/,/^$/d -/^config.status \\Option-f/,/^$/d - -# Don't try to make the demangler's man page, it's useless. -/^{DEMANGLER_PROG}\.1 \\Option-f/,/^$/d -# Don't depend on it either. -/{DEMANGLER_PROG}/s/ {DEMANGLER_PROG}\.1// - diff --git a/binutils/nlmconv.1 b/binutils/nlmconv.1 deleted file mode 100644 index cbc3aedd101..00000000000 --- a/binutils/nlmconv.1 +++ /dev/null @@ -1,110 +0,0 @@ -.\" Copyright (c) 1991, 1996 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH nlmconv 1 "March 1996" "cygnus support" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -nlmconv \- converts object code into an NLM - -.SH SYNOPSIS -.hy 0 -.na -.TP -.B nlmconv -.RB "[\|" \-I\ \fIbfdname\fB\ |\ \-\-input\-target=\fIbfdname\fR "\|]" -.RB "[\|" \-O\ \fIbfdname\fB\ |\ \-\-output\-target=\fIbfdname\fR "\|]" -.RB "[\|" \-T\ \fIheaderfile\fB\ |\ \-\-header\-file=\fIheaderfile\fR "\|]" -.RB "[\|" \-V\ |\ \-\-version\fR "\|]" -.RB "[\|" \-\-help\fR "\|]" -.B infile -.B outfile -.SH DESCRIPTION -.B nlmconv -converts the relocatable object file -.B infile -into the NetWare Loadable Module -.BR outfile , -optionally reading -.I headerfile -for NLM header information. For instructions on writing the NLM -command file language used in header files, see -.IR "The NetWare Tool Maker Specification Manual" , -available from Novell, Inc. -.B nlmconv -currently works with i386 object files in -.BR COFF , -.BR ELF , -or -.B a.out -format, and with SPARC object files in -.B ELF -or -.B a.out -format. -.br -.B nlmconv -uses the GNU Binary File Descriptor library to read -.IR infile . -.SH OPTIONS -.TP -.B \-I \fIbfdname\fR, \fB\-\-input\-target=\fIbfdname -Consider the source file's object format to be -.IR bfdname , -rather than attempting to deduce it. -.TP -.B \-O \fIbfdname\fR, \fB\-\-output\-target=\fIbfdname -Write the output file using the object format -.IR bfdname . -.B nlmconv -infers the output format based on the input format, e.g. for an i386 -input file the output format is -.IR nlm32\-i386 . -.TP -.B \-T \fIheaderfile\fR, \fB\-\-header\-file=\fIheaderfile -Reads -.I headerfile -for NLM header information. For instructions on writing the NLM -command file language used in header files, see -.IR "The NetWare Tool Maker Specification Manual" , -available from Novell, Inc. -.TP -.B \-V\fR, \fB\-\-version -Show the version number of -.B nlmconv -and exit. -.TP -.B \-h\fR, \fB\-\-help -Show a summary of the options to -.B nlmconv -and exit. -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.B -info\c -\&; -.I -The GNU Binary Utilities\c -\&, Roland H. Pesch (June 1993). - -.SH COPYING -Copyright (c) 1993 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/binutils/nlmconv.c b/binutils/nlmconv.c deleted file mode 100644 index 26602d7b6a7..00000000000 --- a/binutils/nlmconv.c +++ /dev/null @@ -1,2186 +0,0 @@ -/* nlmconv.c -- NLM conversion program - Copyright (C) 1993, 94, 95, 96, 97, 98, 99, 2000 - 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Written by Ian Lance Taylor . - - This program can be used to convert any appropriate object file - into a NetWare Loadable Module (an NLM). It will accept a linker - specification file which is identical to that accepted by the - NetWare linker, NLMLINK. */ - -/* AIX requires this to be the first thing in the file. */ -#ifndef __GNUC__ -# ifdef _AIX - #pragma alloca -#endif -#endif - -#include "bfd.h" -#include "libiberty.h" -#include "bucomm.h" - -#include -#include -#include -#include -#include -#include -#include - -/* Internal BFD NLM header. */ -#include "libnlm.h" -#include "nlmconv.h" - -#ifdef NLMCONV_ALPHA -#include "coff/sym.h" -#include "coff/ecoff.h" -#endif - -/* 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 (); - -#ifndef localtime -extern struct tm *localtime (); -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -#ifndef R_OK -#define R_OK 4 -#define W_OK 2 -#define X_OK 1 -#endif - -/* Global variables. */ - -/* The name used to invoke the program. */ -char *program_name; - -/* Local variables. */ - -/* Whether to print out debugging information (currently just controls - whether it prints the linker command if there is one). */ -static int debug; - -/* The symbol table. */ -static asymbol **symbols; - -/* A section we create in the output file to hold pointers to where - the sections of the input file end up. We will put a pointer to - this section in the NLM header. These is an entry for each input - section. The format is - null terminated section name - zeroes to adjust to 4 byte boundary - 4 byte section data file pointer - 4 byte section size - We don't need a version number. The way we find this information - is by finding a stamp in the NLM header information. If we need to - change the format of this information, we can simply change the - stamp. */ -static asection *secsec; - -/* A temporary file name to be unlinked on exit. Actually, for most - errors, we leave it around. It's not clear whether that is helpful - or not. */ -static char *unlink_on_exit; - -/* The list of long options. */ -static struct option long_options[] = -{ - { "debug", no_argument, 0, 'd' }, - { "header-file", required_argument, 0, 'T' }, - { "help", no_argument, 0, 'h' }, - { "input-target", required_argument, 0, 'I' }, - { "input-format", required_argument, 0, 'I' }, /* Obsolete */ - { "linker", required_argument, 0, 'l' }, - { "output-target", required_argument, 0, 'O' }, - { "output-format", required_argument, 0, 'O' }, /* Obsolete */ - { "version", no_argument, 0, 'V' }, - { NULL, no_argument, 0, 0 } -}; - -/* Local routines. */ - -static void show_help PARAMS ((void)); -static void show_usage PARAMS ((FILE *, int)); -static const char *select_output_format PARAMS ((enum bfd_architecture, - unsigned long, boolean)); -static void setup_sections PARAMS ((bfd *, asection *, PTR)); -static void copy_sections PARAMS ((bfd *, asection *, PTR)); -static void mangle_relocs PARAMS ((bfd *, asection *, arelent ***, - long *, char *, - bfd_size_type)); -static void default_mangle_relocs PARAMS ((bfd *, asection *, arelent ***, - long *, char *, - bfd_size_type)); -static char *link_inputs PARAMS ((struct string_list *, char *)); - -#ifdef NLMCONV_I386 -static void i386_mangle_relocs PARAMS ((bfd *, asection *, arelent ***, - long *, char *, - bfd_size_type)); -#endif - -#ifdef NLMCONV_ALPHA -static void alpha_mangle_relocs PARAMS ((bfd *, asection *, arelent ***, - long *, char *, - bfd_size_type)); -#endif - -#ifdef NLMCONV_POWERPC -static void powerpc_build_stubs PARAMS ((bfd *, bfd *, asymbol ***, long *)); -static void powerpc_resolve_stubs PARAMS ((bfd *, bfd *)); -static void powerpc_mangle_relocs PARAMS ((bfd *, asection *, arelent ***, - long *, char *, - bfd_size_type)); -#endif - -/* The main routine. */ - -int -main (argc, argv) - int argc; - char **argv; -{ - int opt; - char *input_file = NULL; - const char *input_format = NULL; - const char *output_format = NULL; - const char *header_file = NULL; - char *ld_arg = NULL; - Nlm_Internal_Fixed_Header fixed_hdr_struct; - Nlm_Internal_Variable_Header var_hdr_struct; - Nlm_Internal_Version_Header version_hdr_struct; - Nlm_Internal_Copyright_Header copyright_hdr_struct; - Nlm_Internal_Extended_Header extended_hdr_struct; - bfd *inbfd; - bfd *outbfd; - asymbol **newsyms, **outsyms; - long symcount, newsymalloc, newsymcount; - long symsize; - asection *text_sec, *bss_sec, *data_sec; - bfd_vma vma; - bfd_size_type align; - asymbol *endsym; - long i; - char inlead, outlead; - boolean gotstart, gotexit, gotcheck; - struct stat st; - FILE *custom_data = NULL; - FILE *help_data = NULL; - FILE *message_data = NULL; - FILE *rpc_data = NULL; - FILE *shared_data = NULL; - size_t custom_size = 0; - size_t help_size = 0; - size_t message_size = 0; - size_t module_size = 0; - size_t rpc_size = 0; - asection *custom_section = NULL; - asection *help_section = NULL; - asection *message_section = NULL; - asection *module_section = NULL; - asection *rpc_section = NULL; - asection *shared_section = NULL; - bfd *sharedbfd; - size_t shared_offset = 0; - size_t shared_size = 0; - Nlm_Internal_Fixed_Header sharedhdr; - int len; - char *modname; - char **matching; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = argv[0]; - xmalloc_set_program_name (program_name); - - bfd_init (); - set_default_bfd_target (); - - while ((opt = getopt_long (argc, argv, "dhI:l:O:T:V", long_options, - (int *) NULL)) - != EOF) - { - switch (opt) - { - case 'd': - debug = 1; - break; - case 'h': - show_help (); - /*NOTREACHED*/ - case 'I': - input_format = optarg; - break; - case 'l': - ld_arg = optarg; - break; - case 'O': - output_format = optarg; - break; - case 'T': - header_file = optarg; - break; - case 'V': - print_version ("nlmconv"); - /*NOTREACHED*/ - case 0: - break; - default: - show_usage (stderr, 1); - /*NOTREACHED*/ - } - } - - /* The input and output files may be named on the command line. */ - output_file = NULL; - if (optind < argc) - { - input_file = argv[optind]; - ++optind; - if (optind < argc) - { - output_file = argv[optind]; - ++optind; - if (optind < argc) - show_usage (stderr, 1); - if (strcmp (input_file, output_file) == 0) - { - fatal (_("input and output files must be different")); - } - } - } - - /* Initialize the header information to default values. */ - fixed_hdr = &fixed_hdr_struct; - memset ((PTR) &fixed_hdr_struct, 0, sizeof fixed_hdr_struct); - var_hdr = &var_hdr_struct; - memset ((PTR) &var_hdr_struct, 0, sizeof var_hdr_struct); - version_hdr = &version_hdr_struct; - memset ((PTR) &version_hdr_struct, 0, sizeof version_hdr_struct); - copyright_hdr = ©right_hdr_struct; - memset ((PTR) ©right_hdr_struct, 0, sizeof copyright_hdr_struct); - extended_hdr = &extended_hdr_struct; - memset ((PTR) &extended_hdr_struct, 0, sizeof extended_hdr_struct); - check_procedure = NULL; - custom_file = NULL; - debug_info = false; - exit_procedure = "_Stop"; - export_symbols = NULL; - map_file = NULL; - full_map = false; - help_file = NULL; - import_symbols = NULL; - message_file = NULL; - modules = NULL; - sharelib_file = NULL; - start_procedure = "_Prelude"; - verbose = false; - rpc_file = NULL; - - parse_errors = 0; - - /* Parse the header file (if there is one). */ - if (header_file != NULL) - { - if (! nlmlex_file (header_file) - || yyparse () != 0 - || parse_errors != 0) - exit (1); - } - - if (input_files != NULL) - { - if (input_file != NULL) - { - fatal (_("input file named both on command line and with INPUT")); - } - if (input_files->next == NULL) - input_file = input_files->string; - else - input_file = link_inputs (input_files, ld_arg); - } - else if (input_file == NULL) - { - non_fatal (_("no input file")); - show_usage (stderr, 1); - } - - inbfd = bfd_openr (input_file, input_format); - if (inbfd == NULL) - bfd_fatal (input_file); - - if (! bfd_check_format_matches (inbfd, bfd_object, &matching)) - { - bfd_nonfatal (input_file); - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } - exit (1); - } - - if (output_format == NULL) - output_format = select_output_format (bfd_get_arch (inbfd), - bfd_get_mach (inbfd), - bfd_big_endian (inbfd)); - - assert (output_format != NULL); - - /* Use the output file named on the command line if it exists. - Otherwise use the file named in the OUTPUT statement. */ - if (output_file == NULL) - { - non_fatal (_("no name for output file")); - show_usage (stderr, 1); - } - - outbfd = bfd_openw (output_file, output_format); - if (outbfd == NULL) - bfd_fatal (output_file); - if (! bfd_set_format (outbfd, bfd_object)) - bfd_fatal (output_file); - - assert (bfd_get_flavour (outbfd) == bfd_target_nlm_flavour); - - if (bfd_arch_get_compatible (inbfd, outbfd) == NULL) - non_fatal (_("warning: input and output formats are not compatible")); - - /* Move the values read from the command file into outbfd. */ - *nlm_fixed_header (outbfd) = fixed_hdr_struct; - *nlm_variable_header (outbfd) = var_hdr_struct; - *nlm_version_header (outbfd) = version_hdr_struct; - *nlm_copyright_header (outbfd) = copyright_hdr_struct; - *nlm_extended_header (outbfd) = extended_hdr_struct; - - /* Start copying the input BFD to the output BFD. */ - if (! bfd_set_file_flags (outbfd, bfd_get_file_flags (inbfd))) - bfd_fatal (bfd_get_filename (outbfd)); - - symsize = bfd_get_symtab_upper_bound (inbfd); - if (symsize < 0) - bfd_fatal (input_file); - symbols = (asymbol **) xmalloc (symsize); - symcount = bfd_canonicalize_symtab (inbfd, symbols); - if (symcount < 0) - bfd_fatal (input_file); - - /* Make sure we have a .bss section. */ - bss_sec = bfd_get_section_by_name (outbfd, NLM_UNINITIALIZED_DATA_NAME); - if (bss_sec == NULL) - { - bss_sec = bfd_make_section (outbfd, NLM_UNINITIALIZED_DATA_NAME); - if (bss_sec == NULL - || ! bfd_set_section_flags (outbfd, bss_sec, SEC_ALLOC) - || ! bfd_set_section_alignment (outbfd, bss_sec, 1)) - bfd_fatal (_("make .bss section")); - } - - /* We store the original section names in the .nlmsections section, - so that programs which understand it can resurrect the original - sections from the NLM. We will put a pointer to .nlmsections in - the NLM header area. */ - secsec = bfd_make_section (outbfd, ".nlmsections"); - if (secsec == NULL) - bfd_fatal (_("make .nlmsections section")); - if (! bfd_set_section_flags (outbfd, secsec, SEC_HAS_CONTENTS)) - bfd_fatal (_("set .nlmsections flags")); - -#ifdef NLMCONV_POWERPC - /* For PowerPC NetWare we need to build stubs for calls to undefined - symbols. Because each stub requires an entry in the TOC section - which must be at the same location as other entries in the TOC - section, we must do this before determining where the TOC section - goes in setup_sections. */ - if (bfd_get_arch (inbfd) == bfd_arch_powerpc) - powerpc_build_stubs (inbfd, outbfd, &symbols, &symcount); -#endif - - /* Set up the sections. */ - bfd_map_over_sections (inbfd, setup_sections, (PTR) outbfd); - - text_sec = bfd_get_section_by_name (outbfd, NLM_CODE_NAME); - - /* The .bss section immediately follows the .data section. */ - data_sec = bfd_get_section_by_name (outbfd, NLM_INITIALIZED_DATA_NAME); - if (data_sec != NULL) - { - bfd_size_type add; - - vma = bfd_get_section_size_before_reloc (data_sec); - align = 1 << bss_sec->alignment_power; - add = ((vma + align - 1) &~ (align - 1)) - vma; - vma += add; - if (! bfd_set_section_vma (outbfd, bss_sec, vma)) - bfd_fatal (_("set .bss vma")); - if (add != 0) - { - bfd_size_type data_size; - - data_size = bfd_get_section_size_before_reloc (data_sec); - if (! bfd_set_section_size (outbfd, data_sec, data_size + add)) - bfd_fatal (_("set .data size")); - } - } - - /* Adjust symbol information. */ - inlead = bfd_get_symbol_leading_char (inbfd); - outlead = bfd_get_symbol_leading_char (outbfd); - gotstart = false; - gotexit = false; - gotcheck = false; - newsymalloc = 10; - newsyms = (asymbol **) xmalloc (newsymalloc * sizeof (asymbol *)); - newsymcount = 0; - endsym = NULL; - for (i = 0; i < symcount; i++) - { - register asymbol *sym; - - sym = symbols[i]; - - /* Add or remove a leading underscore. */ - if (inlead != outlead) - { - if (inlead != '\0') - { - if (bfd_asymbol_name (sym)[0] == inlead) - { - if (outlead == '\0') - ++sym->name; - else - { - char *new; - - new = xmalloc (strlen (bfd_asymbol_name (sym)) + 1); - new[0] = outlead; - strcpy (new + 1, bfd_asymbol_name (sym) + 1); - sym->name = new; - } - } - } - else - { - char *new; - - new = xmalloc (strlen (bfd_asymbol_name (sym)) + 2); - new[0] = outlead; - strcpy (new + 1, bfd_asymbol_name (sym)); - sym->name = new; - } - } - - /* NLM's have an uninitialized data section, but they do not - have a common section in the Unix sense. Move all common - symbols into the .bss section, and mark them as exported. */ - if (bfd_is_com_section (bfd_get_section (sym))) - { - bfd_vma size; - - sym->section = bss_sec; - size = sym->value; - sym->value = bss_sec->_raw_size; - bss_sec->_raw_size += size; - align = 1 << bss_sec->alignment_power; - bss_sec->_raw_size = (bss_sec->_raw_size + align - 1) &~ (align - 1); - sym->flags |= BSF_EXPORT | BSF_GLOBAL; - } - else if (bfd_get_section (sym)->output_section != NULL) - { - /* Move the symbol into the output section. */ - sym->value += bfd_get_section (sym)->output_offset; - sym->section = bfd_get_section (sym)->output_section; - /* This is no longer a section symbol. */ - sym->flags &=~ BSF_SECTION_SYM; - } - - /* Force _edata and _end to be defined. This would normally be - done by the linker, but the manipulation of the common - symbols will confuse it. */ - if ((sym->flags & BSF_DEBUGGING) == 0 - && bfd_asymbol_name (sym)[0] == '_' - && bfd_is_und_section (bfd_get_section (sym))) - { - if (strcmp (bfd_asymbol_name (sym), "_edata") == 0) - { - sym->section = bss_sec; - sym->value = 0; - } - if (strcmp (bfd_asymbol_name (sym), "_end") == 0) - { - sym->section = bss_sec; - endsym = sym; - } - -#ifdef NLMCONV_POWERPC - /* For PowerPC NetWare, we define __GOT0. This is the start - of the .got section. */ - if (bfd_get_arch (inbfd) == bfd_arch_powerpc - && strcmp (bfd_asymbol_name (sym), "__GOT0") == 0) - { - asection *got_sec; - - got_sec = bfd_get_section_by_name (inbfd, ".got"); - assert (got_sec != (asection *) NULL); - sym->value = got_sec->output_offset; - sym->section = got_sec->output_section; - } -#endif - } - - /* If this is a global symbol, check the export list. */ - if ((sym->flags & (BSF_EXPORT | BSF_GLOBAL)) != 0) - { - register struct string_list *l; - int found_simple; - - /* Unfortunately, a symbol can appear multiple times on the - export list, with and without prefixes. */ - found_simple = 0; - for (l = export_symbols; l != NULL; l = l->next) - { - if (strcmp (l->string, bfd_asymbol_name (sym)) == 0) - found_simple = 1; - else - { - char *zbase; - - zbase = strchr (l->string, '@'); - if (zbase != NULL - && strcmp (zbase + 1, bfd_asymbol_name (sym)) == 0) - { - /* We must add a symbol with this prefix. */ - if (newsymcount >= newsymalloc) - { - newsymalloc += 10; - newsyms = ((asymbol **) - xrealloc ((PTR) newsyms, - (newsymalloc - * sizeof (asymbol *)))); - } - newsyms[newsymcount] = - (asymbol *) xmalloc (sizeof (asymbol)); - *newsyms[newsymcount] = *sym; - newsyms[newsymcount]->name = l->string; - ++newsymcount; - } - } - } - if (! found_simple) - { - /* The unmodified symbol is actually not exported at - all. */ - sym->flags &=~ (BSF_GLOBAL | BSF_EXPORT); - sym->flags |= BSF_LOCAL; - } - } - - /* If it's an undefined symbol, see if it's on the import list. - Change the prefix if necessary. */ - if (bfd_is_und_section (bfd_get_section (sym))) - { - register struct string_list *l; - - for (l = import_symbols; l != NULL; l = l->next) - { - if (strcmp (l->string, bfd_asymbol_name (sym)) == 0) - break; - else - { - char *zbase; - - zbase = strchr (l->string, '@'); - if (zbase != NULL - && strcmp (zbase + 1, bfd_asymbol_name (sym)) == 0) - { - sym->name = l->string; - break; - } - } - } - if (l == NULL) - non_fatal (_("warning: symbol %s imported but not in import list"), - bfd_asymbol_name (sym)); - } - - /* See if it's one of the special named symbols. */ - if ((sym->flags & BSF_DEBUGGING) == 0) - { - bfd_vma val; - - /* FIXME: If these symbols are not in the .text section, we - add the .text section size to the value. This may not be - correct for all targets. I'm not sure how this should - really be handled. */ - if (strcmp (bfd_asymbol_name (sym), start_procedure) == 0) - { - val = bfd_asymbol_value (sym); - if (bfd_get_section (sym) == data_sec - && text_sec != (asection *) NULL) - val += bfd_section_size (outbfd, text_sec); - if (! bfd_set_start_address (outbfd, val)) - bfd_fatal (_("set start address")); - gotstart = true; - } - if (strcmp (bfd_asymbol_name (sym), exit_procedure) == 0) - { - val = bfd_asymbol_value (sym); - if (bfd_get_section (sym) == data_sec - && text_sec != (asection *) NULL) - val += bfd_section_size (outbfd, text_sec); - nlm_fixed_header (outbfd)->exitProcedureOffset = val; - gotexit = true; - } - if (check_procedure != NULL - && strcmp (bfd_asymbol_name (sym), check_procedure) == 0) - { - val = bfd_asymbol_value (sym); - if (bfd_get_section (sym) == data_sec - && text_sec != (asection *) NULL) - val += bfd_section_size (outbfd, text_sec); - nlm_fixed_header (outbfd)->checkUnloadProcedureOffset = val; - gotcheck = true; - } - } - } - - if (endsym != NULL) - { - endsym->value = bfd_get_section_size_before_reloc (bss_sec); - - /* FIXME: If any relocs referring to _end use inplace addends, - then I think they need to be updated. This is handled by - i386_mangle_relocs. Is it needed for any other object - formats? */ - } - - if (newsymcount == 0) - outsyms = symbols; - else - { - outsyms = (asymbol **) xmalloc ((symcount + newsymcount + 1) - * sizeof (asymbol *)); - memcpy (outsyms, symbols, symcount * sizeof (asymbol *)); - memcpy (outsyms + symcount, newsyms, newsymcount * sizeof (asymbol *)); - outsyms[symcount + newsymcount] = NULL; - } - - bfd_set_symtab (outbfd, outsyms, symcount + newsymcount); - - if (! gotstart) - non_fatal (_("warning: START procedure %s not defined"), start_procedure); - if (! gotexit) - non_fatal (_("warning: EXIT procedure %s not defined"), exit_procedure); - if (check_procedure != NULL && ! gotcheck) - non_fatal (_("warning: CHECK procedure %s not defined"), check_procedure); - - /* Add additional sections required for the header information. */ - if (custom_file != NULL) - { - custom_data = fopen (custom_file, "r"); - if (custom_data == NULL - || fstat (fileno (custom_data), &st) < 0) - { - fprintf (stderr, "%s:%s: %s\n", program_name, custom_file, - strerror (errno)); - custom_file = NULL; - } - else - { - custom_size = st.st_size; - custom_section = bfd_make_section (outbfd, ".nlmcustom"); - if (custom_section == NULL - || ! bfd_set_section_size (outbfd, custom_section, custom_size) - || ! bfd_set_section_flags (outbfd, custom_section, - SEC_HAS_CONTENTS)) - bfd_fatal (_("custom section")); - } - } - if (help_file != NULL) - { - help_data = fopen (help_file, "r"); - if (help_data == NULL - || fstat (fileno (help_data), &st) < 0) - { - fprintf (stderr, "%s:%s: %s\n", program_name, help_file, - strerror (errno)); - help_file = NULL; - } - else - { - help_size = st.st_size; - help_section = bfd_make_section (outbfd, ".nlmhelp"); - if (help_section == NULL - || ! bfd_set_section_size (outbfd, help_section, help_size) - || ! bfd_set_section_flags (outbfd, help_section, - SEC_HAS_CONTENTS)) - bfd_fatal (_("help section")); - strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8); - } - } - if (message_file != NULL) - { - message_data = fopen (message_file, "r"); - if (message_data == NULL - || fstat (fileno (message_data), &st) < 0) - { - fprintf (stderr, "%s:%s: %s\n", program_name, message_file, - strerror (errno)); - message_file = NULL; - } - else - { - message_size = st.st_size; - message_section = bfd_make_section (outbfd, ".nlmmessages"); - if (message_section == NULL - || ! bfd_set_section_size (outbfd, message_section, message_size) - || ! bfd_set_section_flags (outbfd, message_section, - SEC_HAS_CONTENTS)) - bfd_fatal (_("message section")); - strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8); - } - } - if (modules != NULL) - { - struct string_list *l; - - module_size = 0; - for (l = modules; l != NULL; l = l->next) - module_size += strlen (l->string) + 1; - module_section = bfd_make_section (outbfd, ".nlmmodules"); - if (module_section == NULL - || ! bfd_set_section_size (outbfd, module_section, module_size) - || ! bfd_set_section_flags (outbfd, module_section, - SEC_HAS_CONTENTS)) - bfd_fatal (_("module section")); - } - if (rpc_file != NULL) - { - rpc_data = fopen (rpc_file, "r"); - if (rpc_data == NULL - || fstat (fileno (rpc_data), &st) < 0) - { - fprintf (stderr, "%s:%s: %s\n", program_name, rpc_file, - strerror (errno)); - rpc_file = NULL; - } - else - { - rpc_size = st.st_size; - rpc_section = bfd_make_section (outbfd, ".nlmrpc"); - if (rpc_section == NULL - || ! bfd_set_section_size (outbfd, rpc_section, rpc_size) - || ! bfd_set_section_flags (outbfd, rpc_section, - SEC_HAS_CONTENTS)) - bfd_fatal (_("rpc section")); - strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8); - } - } - if (sharelib_file != NULL) - { - sharedbfd = bfd_openr (sharelib_file, output_format); - if (sharedbfd == NULL - || ! bfd_check_format (sharedbfd, bfd_object)) - { - fprintf (stderr, "%s:%s: %s\n", program_name, sharelib_file, - bfd_errmsg (bfd_get_error ())); - sharelib_file = NULL; - } - else - { - sharedhdr = *nlm_fixed_header (sharedbfd); - bfd_close (sharedbfd); - shared_data = fopen (sharelib_file, "r"); - if (shared_data == NULL - || (fstat (fileno (shared_data), &st) < 0)) - { - fprintf (stderr, "%s:%s: %s\n", program_name, sharelib_file, - strerror (errno)); - sharelib_file = NULL; - } - else - { - /* If we were clever, we could just copy out the - sections of the shared library which we actually - need. However, we would have to figure out the sizes - of the external and public information, and that can - not be done without reading through them. */ - if (sharedhdr.uninitializedDataSize > 0) - { - /* There is no place to record this information. */ - non_fatal (_("%s: warning: shared libraries can not have uninitialized data"), - sharelib_file); - } - shared_offset = st.st_size; - if (shared_offset > (size_t) sharedhdr.codeImageOffset) - shared_offset = sharedhdr.codeImageOffset; - if (shared_offset > (size_t) sharedhdr.dataImageOffset) - shared_offset = sharedhdr.dataImageOffset; - if (shared_offset > (size_t) sharedhdr.relocationFixupOffset) - shared_offset = sharedhdr.relocationFixupOffset; - if (shared_offset > (size_t) sharedhdr.externalReferencesOffset) - shared_offset = sharedhdr.externalReferencesOffset; - if (shared_offset > (size_t) sharedhdr.publicsOffset) - shared_offset = sharedhdr.publicsOffset; - shared_size = st.st_size - shared_offset; - shared_section = bfd_make_section (outbfd, ".nlmshared"); - if (shared_section == NULL - || ! bfd_set_section_size (outbfd, shared_section, - shared_size) - || ! bfd_set_section_flags (outbfd, shared_section, - SEC_HAS_CONTENTS)) - bfd_fatal (_("shared section")); - strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8); - } - } - } - - /* Check whether a version was given. */ - if (strncmp (version_hdr->stamp, "VeRsIoN#", 8) != 0) - non_fatal (_("warning: No version number given")); - - /* At least for now, always create an extended header, because that - is what NLMLINK does. */ - strncpy (nlm_extended_header (outbfd)->stamp, "MeSsAgEs", 8); - - strncpy (nlm_cygnus_ext_header (outbfd)->stamp, "CyGnUsEx", 8); - - /* If the date was not given, force it in. */ - if (nlm_version_header (outbfd)->month == 0 - && nlm_version_header (outbfd)->day == 0 - && nlm_version_header (outbfd)->year == 0) - { - time_t now; - struct tm *ptm; - - time (&now); - ptm = localtime (&now); - nlm_version_header (outbfd)->month = ptm->tm_mon + 1; - nlm_version_header (outbfd)->day = ptm->tm_mday; - nlm_version_header (outbfd)->year = ptm->tm_year + 1900; - strncpy (version_hdr->stamp, "VeRsIoN#", 8); - } - -#ifdef NLMCONV_POWERPC - /* Resolve the stubs we build for PowerPC NetWare. */ - if (bfd_get_arch (inbfd) == bfd_arch_powerpc) - powerpc_resolve_stubs (inbfd, outbfd); -#endif - - /* Copy over the sections. */ - bfd_map_over_sections (inbfd, copy_sections, (PTR) outbfd); - - /* Finish up the header information. */ - if (custom_file != NULL) - { - PTR data; - - data = xmalloc (custom_size); - if (fread (data, 1, custom_size, custom_data) != custom_size) - non_fatal (_("%s: read: %s"), custom_file, strerror (errno)); - else - { - if (! bfd_set_section_contents (outbfd, custom_section, data, - (file_ptr) 0, custom_size)) - bfd_fatal (_("custom section")); - nlm_fixed_header (outbfd)->customDataOffset = - custom_section->filepos; - nlm_fixed_header (outbfd)->customDataSize = custom_size; - } - free (data); - } - if (! debug_info) - { - /* As a special hack, the backend recognizes a debugInfoOffset - of -1 to mean that it should not output any debugging - information. This can not be handling by fiddling with the - symbol table because exported symbols appear in both the - export information and the debugging information. */ - nlm_fixed_header (outbfd)->debugInfoOffset = (file_ptr) -1; - } - if (map_file != NULL) - non_fatal (_("warning: MAP and FULLMAP are not supported; try ld -M")); - if (help_file != NULL) - { - PTR data; - - data = xmalloc (help_size); - if (fread (data, 1, help_size, help_data) != help_size) - non_fatal (_("%s: read: %s"), help_file, strerror (errno)); - else - { - if (! bfd_set_section_contents (outbfd, help_section, data, - (file_ptr) 0, help_size)) - bfd_fatal (_("help section")); - nlm_extended_header (outbfd)->helpFileOffset = - help_section->filepos; - nlm_extended_header (outbfd)->helpFileLength = help_size; - } - free (data); - } - if (message_file != NULL) - { - PTR data; - - data = xmalloc (message_size); - if (fread (data, 1, message_size, message_data) != message_size) - non_fatal (_("%s: read: %s"), message_file, strerror (errno)); - else - { - if (! bfd_set_section_contents (outbfd, message_section, data, - (file_ptr) 0, message_size)) - bfd_fatal (_("message section")); - nlm_extended_header (outbfd)->messageFileOffset = - message_section->filepos; - nlm_extended_header (outbfd)->messageFileLength = message_size; - - /* FIXME: Are these offsets correct on all platforms? Are - they 32 bits on all platforms? What endianness? */ - nlm_extended_header (outbfd)->languageID = - bfd_h_get_32 (outbfd, (bfd_byte *) data + 106); - nlm_extended_header (outbfd)->messageCount = - bfd_h_get_32 (outbfd, (bfd_byte *) data + 110); - } - free (data); - } - if (modules != NULL) - { - PTR data; - unsigned char *set; - struct string_list *l; - bfd_size_type c; - - data = xmalloc (module_size); - c = 0; - set = (unsigned char *) data; - for (l = modules; l != NULL; l = l->next) - { - *set = strlen (l->string); - strncpy (set + 1, l->string, *set); - set += *set + 1; - ++c; - } - if (! bfd_set_section_contents (outbfd, module_section, data, - (file_ptr) 0, module_size)) - bfd_fatal (_("module section")); - nlm_fixed_header (outbfd)->moduleDependencyOffset = - module_section->filepos; - nlm_fixed_header (outbfd)->numberOfModuleDependencies = c; - } - if (rpc_file != NULL) - { - PTR data; - - data = xmalloc (rpc_size); - if (fread (data, 1, rpc_size, rpc_data) != rpc_size) - non_fatal (_("%s: read: %s"), rpc_file, strerror (errno)); - else - { - if (! bfd_set_section_contents (outbfd, rpc_section, data, - (file_ptr) 0, rpc_size)) - bfd_fatal (_("rpc section")); - nlm_extended_header (outbfd)->RPCDataOffset = - rpc_section->filepos; - nlm_extended_header (outbfd)->RPCDataLength = rpc_size; - } - free (data); - } - if (sharelib_file != NULL) - { - PTR data; - - data = xmalloc (shared_size); - if (fseek (shared_data, shared_offset, SEEK_SET) != 0 - || fread (data, 1, shared_size, shared_data) != shared_size) - non_fatal (_("%s: read: %s"), sharelib_file, strerror (errno)); - else - { - if (! bfd_set_section_contents (outbfd, shared_section, data, - (file_ptr) 0, shared_size)) - bfd_fatal (_("shared section")); - } - nlm_extended_header (outbfd)->sharedCodeOffset = - sharedhdr.codeImageOffset - shared_offset + shared_section->filepos; - nlm_extended_header (outbfd)->sharedCodeLength = - sharedhdr.codeImageSize; - nlm_extended_header (outbfd)->sharedDataOffset = - sharedhdr.dataImageOffset - shared_offset + shared_section->filepos; - nlm_extended_header (outbfd)->sharedDataLength = - sharedhdr.dataImageSize; - nlm_extended_header (outbfd)->sharedRelocationFixupOffset = - (sharedhdr.relocationFixupOffset - - shared_offset - + shared_section->filepos); - nlm_extended_header (outbfd)->sharedRelocationFixupCount = - sharedhdr.numberOfRelocationFixups; - nlm_extended_header (outbfd)->sharedExternalReferenceOffset = - (sharedhdr.externalReferencesOffset - - shared_offset - + shared_section->filepos); - nlm_extended_header (outbfd)->sharedExternalReferenceCount = - sharedhdr.numberOfExternalReferences; - nlm_extended_header (outbfd)->sharedPublicsOffset = - sharedhdr.publicsOffset - shared_offset + shared_section->filepos; - nlm_extended_header (outbfd)->sharedPublicsCount = - sharedhdr.numberOfPublics; - nlm_extended_header (outbfd)->sharedDebugRecordOffset = - sharedhdr.debugInfoOffset - shared_offset + shared_section->filepos; - nlm_extended_header (outbfd)->sharedDebugRecordCount = - sharedhdr.numberOfDebugRecords; - nlm_extended_header (outbfd)->SharedInitializationOffset = - sharedhdr.codeStartOffset; - nlm_extended_header (outbfd)->SharedExitProcedureOffset = - sharedhdr.exitProcedureOffset; - free (data); - } - len = strlen (output_file); - if (len > NLM_MODULE_NAME_SIZE - 2) - len = NLM_MODULE_NAME_SIZE - 2; - nlm_fixed_header (outbfd)->moduleName[0] = len; - - strncpy (nlm_fixed_header (outbfd)->moduleName + 1, output_file, - NLM_MODULE_NAME_SIZE - 2); - nlm_fixed_header (outbfd)->moduleName[NLM_MODULE_NAME_SIZE - 1] = '\0'; - for (modname = nlm_fixed_header (outbfd)->moduleName; - *modname != '\0'; - modname++) - if (islower ((unsigned char) *modname)) - *modname = toupper (*modname); - - strncpy (nlm_variable_header (outbfd)->oldThreadName, " LONG", - NLM_OLD_THREAD_NAME_LENGTH); - - nlm_cygnus_ext_header (outbfd)->offset = secsec->filepos; - nlm_cygnus_ext_header (outbfd)->length = bfd_section_size (outbfd, secsec); - - if (! bfd_close (outbfd)) - bfd_fatal (output_file); - if (! bfd_close (inbfd)) - bfd_fatal (input_file); - - if (unlink_on_exit != NULL) - unlink (unlink_on_exit); - - return 0; -} - -/* Display a help message and exit. */ - -static void -show_help () -{ - printf (_("%s: Convert an object file into a NetWare Loadable Module\n"), - program_name); - show_usage (stdout, 0); -} - -/* Show a usage message and exit. */ - -static void -show_usage (file, status) - FILE *file; - int status; -{ - fprintf (file, _("\ -Usage: %s [-dhV] [-I bfdname] [-O bfdname] [-T header-file] [-l linker]\n\ - [--input-target=bfdname] [--output-target=bfdname]\n\ - [--header-file=file] [--linker=linker] [--debug]\n\ - [--help] [--version]\n\ - [in-file [out-file]]\n"), - program_name); - if (status == 0) - fprintf (file, _("Report bugs to %s\n"), REPORT_BUGS_TO); - exit (status); -} - -/* Select the output format based on the input architecture, machine, - and endianness. This chooses the appropriate NLM target. */ - -static const char * -select_output_format (arch, mach, bigendian) - enum bfd_architecture arch; - unsigned long mach; - boolean bigendian; -{ - switch (arch) - { -#ifdef NLMCONV_I386 - case bfd_arch_i386: - return "nlm32-i386"; -#endif -#ifdef NLMCONV_SPARC - case bfd_arch_sparc: - return "nlm32-sparc"; -#endif -#ifdef NLMCONV_ALPHA - case bfd_arch_alpha: - return "nlm32-alpha"; -#endif -#ifdef NLMCONV_POWERPC - case bfd_arch_powerpc: - return "nlm32-powerpc"; -#endif - default: - fatal (_("support not compiled in for %s"), - bfd_printable_arch_mach (arch, mach)); - } - /*NOTREACHED*/ -} - -/* The BFD sections are copied in two passes. This function selects - the output section for each input section, and sets up the section - name, size, etc. */ - -static void -setup_sections (inbfd, insec, data_ptr) - bfd *inbfd; - asection *insec; - PTR data_ptr; -{ - bfd *outbfd = (bfd *) data_ptr; - flagword f; - const char *outname; - asection *outsec; - bfd_vma offset; - bfd_size_type align; - bfd_size_type add; - bfd_size_type secsecsize; - - f = bfd_get_section_flags (inbfd, insec); - if (f & SEC_CODE) - outname = NLM_CODE_NAME; - else if ((f & SEC_LOAD) && (f & SEC_HAS_CONTENTS)) - outname = NLM_INITIALIZED_DATA_NAME; - else if (f & SEC_ALLOC) - outname = NLM_UNINITIALIZED_DATA_NAME; - else - outname = bfd_section_name (inbfd, insec); - - outsec = bfd_get_section_by_name (outbfd, outname); - if (outsec == NULL) - { - outsec = bfd_make_section (outbfd, outname); - if (outsec == NULL) - bfd_fatal (_("make section")); - } - - insec->output_section = outsec; - - offset = bfd_section_size (outbfd, outsec); - align = 1 << bfd_section_alignment (inbfd, insec); - add = ((offset + align - 1) &~ (align - 1)) - offset; - insec->output_offset = offset + add; - - if (! bfd_set_section_size (outbfd, outsec, - (bfd_section_size (outbfd, outsec) - + bfd_section_size (inbfd, insec) - + add))) - bfd_fatal (_("set section size")); - - if ((bfd_section_alignment (inbfd, insec) - > bfd_section_alignment (outbfd, outsec)) - && ! bfd_set_section_alignment (outbfd, outsec, - bfd_section_alignment (inbfd, insec))) - bfd_fatal (_("set section alignment")); - - if (! bfd_set_section_flags (outbfd, outsec, - f | bfd_get_section_flags (outbfd, outsec))) - bfd_fatal (_("set section flags")); - - bfd_set_reloc (outbfd, outsec, (arelent **) NULL, 0); - - /* For each input section we allocate space for an entry in - .nlmsections. */ - secsecsize = bfd_section_size (outbfd, secsec); - secsecsize += strlen (bfd_section_name (inbfd, insec)) + 1; - secsecsize = (secsecsize + 3) &~ 3; - secsecsize += 8; - if (! bfd_set_section_size (outbfd, secsec, secsecsize)) - bfd_fatal (_("set .nlmsections size")); -} - -/* Copy the section contents. */ - -static void -copy_sections (inbfd, insec, data_ptr) - bfd *inbfd; - asection *insec; - PTR data_ptr; -{ - static bfd_size_type secsecoff = 0; - bfd *outbfd = (bfd *) data_ptr; - const char *inname; - asection *outsec; - bfd_size_type size; - PTR contents; - long reloc_size; - bfd_byte buf[4]; - bfd_size_type add; - - inname = bfd_section_name (inbfd, insec); - - outsec = insec->output_section; - assert (outsec != NULL); - - size = bfd_get_section_size_before_reloc (insec); - - /* FIXME: Why are these necessary? */ - insec->_cooked_size = insec->_raw_size; - insec->reloc_done = true; - - if ((bfd_get_section_flags (inbfd, insec) & SEC_HAS_CONTENTS) == 0) - contents = NULL; - else - { - contents = xmalloc (size); - if (! bfd_get_section_contents (inbfd, insec, contents, - (file_ptr) 0, size)) - bfd_fatal (bfd_get_filename (inbfd)); - } - - reloc_size = bfd_get_reloc_upper_bound (inbfd, insec); - if (reloc_size < 0) - bfd_fatal (bfd_get_filename (inbfd)); - if (reloc_size != 0) - { - arelent **relocs; - long reloc_count; - - relocs = (arelent **) xmalloc (reloc_size); - reloc_count = bfd_canonicalize_reloc (inbfd, insec, relocs, symbols); - if (reloc_count < 0) - bfd_fatal (bfd_get_filename (inbfd)); - mangle_relocs (outbfd, insec, &relocs, &reloc_count, (char *) contents, - size); - - /* FIXME: refers to internal BFD fields. */ - if (outsec->orelocation != (arelent **) NULL) - { - bfd_size_type total_count; - arelent **combined; - - total_count = reloc_count + outsec->reloc_count; - combined = (arelent **) xmalloc (total_count * sizeof (arelent *)); - memcpy (combined, outsec->orelocation, - outsec->reloc_count * sizeof (arelent *)); - memcpy (combined + outsec->reloc_count, relocs, - (size_t) (reloc_count * sizeof (arelent *))); - free (outsec->orelocation); - reloc_count = total_count; - relocs = combined; - } - - bfd_set_reloc (outbfd, outsec, relocs, reloc_count); - } - - if (contents != NULL) - { - if (! bfd_set_section_contents (outbfd, outsec, contents, - insec->output_offset, size)) - bfd_fatal (bfd_get_filename (outbfd)); - free (contents); - } - - /* Add this section to .nlmsections. */ - if (! bfd_set_section_contents (outbfd, secsec, (PTR) inname, secsecoff, - strlen (inname) + 1)) - bfd_fatal (_("set .nlmsection contents")); - secsecoff += strlen (inname) + 1; - - add = ((secsecoff + 3) &~ 3) - secsecoff; - if (add != 0) - { - bfd_h_put_32 (outbfd, (bfd_vma) 0, buf); - if (! bfd_set_section_contents (outbfd, secsec, buf, secsecoff, add)) - bfd_fatal (_("set .nlmsection contents")); - secsecoff += add; - } - - if (contents != NULL) - bfd_h_put_32 (outbfd, (bfd_vma) outsec->filepos, buf); - else - bfd_h_put_32 (outbfd, (bfd_vma) 0, buf); - if (! bfd_set_section_contents (outbfd, secsec, buf, secsecoff, 4)) - bfd_fatal (_("set .nlmsection contents")); - secsecoff += 4; - - bfd_h_put_32 (outbfd, (bfd_vma) size, buf); - if (! bfd_set_section_contents (outbfd, secsec, buf, secsecoff, 4)) - bfd_fatal (_("set .nlmsection contents")); - secsecoff += 4; -} - -/* Some, perhaps all, NetWare targets require changing the relocs used - by the input formats. */ - -static void -mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents, - contents_size) - bfd *outbfd; - asection *insec; - arelent ***relocs_ptr; - long *reloc_count_ptr; - char *contents; - bfd_size_type contents_size; -{ - switch (bfd_get_arch (outbfd)) - { -#ifdef NLMCONV_I386 - case bfd_arch_i386: - i386_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, - contents, contents_size); - break; -#endif -#ifdef NLMCONV_ALPHA - case bfd_arch_alpha: - alpha_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, - contents, contents_size); - break; -#endif -#ifdef NLMCONV_POWERPC - case bfd_arch_powerpc: - powerpc_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, - contents, contents_size); - break; -#endif - default: - default_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, - contents, contents_size); - break; - } -} - -/* By default all we need to do for relocs is change the address by - the output_offset. */ - -/*ARGSUSED*/ -static void -default_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents, - contents_size) - bfd *outbfd; - asection *insec; - arelent ***relocs_ptr; - long *reloc_count_ptr; - char *contents; - bfd_size_type contents_size; -{ - if (insec->output_offset != 0) - { - long reloc_count; - register arelent **relocs; - register long i; - - reloc_count = *reloc_count_ptr; - relocs = *relocs_ptr; - for (i = 0; i < reloc_count; i++, relocs++) - (*relocs)->address += insec->output_offset; - } -} - -#ifdef NLMCONV_I386 - -/* NetWare on the i386 supports a restricted set of relocs, which are - different from those used on other i386 targets. This routine - converts the relocs. It is, obviously, very target dependent. At - the moment, the nlm32-i386 backend performs similar translations; - however, it is more reliable and efficient to do them here. */ - -static reloc_howto_type nlm_i386_pcrel_howto = - HOWTO (1, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "DISP32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - true); /* pcrel_offset */ - -static void -i386_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents, - contents_size) - bfd *outbfd; - asection *insec; - arelent ***relocs_ptr; - long *reloc_count_ptr; - char *contents; - bfd_size_type contents_size; -{ - long reloc_count, i; - arelent **relocs; - - reloc_count = *reloc_count_ptr; - relocs = *relocs_ptr; - for (i = 0; i < reloc_count; i++) - { - arelent *rel; - asymbol *sym; - bfd_size_type address; - bfd_vma addend; - - rel = *relocs++; - sym = *rel->sym_ptr_ptr; - - /* We're moving the relocs from the input section to the output - section, so we must adjust the address accordingly. */ - address = rel->address; - rel->address += insec->output_offset; - - /* Note that no serious harm will ensue if we fail to change a - reloc. The backend will fail when writing out the reloc. */ - - /* Make sure this reloc is within the data we have. We use only - 4 byte relocs here, so we insist on having 4 bytes. */ - if (address + 4 > contents_size) - continue; - - /* A PC relative reloc entirely within a single section is - completely unnecessary. This can be generated by ld -r. */ - if (sym == insec->symbol - && rel->howto != NULL - && rel->howto->pc_relative - && ! rel->howto->pcrel_offset) - { - --*reloc_count_ptr; - --relocs; - memmove (relocs, relocs + 1, - (size_t) ((reloc_count - i) * sizeof (arelent *))); - continue; - } - - /* Get the amount the relocation will add in. */ - addend = rel->addend + sym->value; - - /* NetWare doesn't support PC relative relocs against defined - symbols, so we have to eliminate them by doing the relocation - now. We can only do this if the reloc is within a single - section. */ - if (rel->howto != NULL - && rel->howto->pc_relative - && bfd_get_section (sym) == insec->output_section) - { - bfd_vma val; - - if (rel->howto->pcrel_offset) - addend -= address; - - val = bfd_get_32 (outbfd, (bfd_byte *) contents + address); - val += addend; - bfd_put_32 (outbfd, val, (bfd_byte *) contents + address); - - --*reloc_count_ptr; - --relocs; - memmove (relocs, relocs + 1, - (size_t) ((reloc_count - i) * sizeof (arelent *))); - continue; - } - - /* NetWare doesn't support reloc addends, so we get rid of them - here by simply adding them into the object data. We handle - the symbol value, if any, the same way. */ - if (addend != 0 - && rel->howto != NULL - && rel->howto->rightshift == 0 - && rel->howto->size == 2 - && rel->howto->bitsize == 32 - && rel->howto->bitpos == 0 - && rel->howto->src_mask == 0xffffffff - && rel->howto->dst_mask == 0xffffffff) - { - bfd_vma val; - - val = bfd_get_32 (outbfd, (bfd_byte *) contents + address); - val += addend; - bfd_put_32 (outbfd, val, (bfd_byte *) contents + address); - - /* Adjust the reloc for the changes we just made. */ - rel->addend = 0; - if (! bfd_is_und_section (bfd_get_section (sym))) - rel->sym_ptr_ptr = bfd_get_section (sym)->symbol_ptr_ptr; - } - - /* NetWare uses a reloc with pcrel_offset set. We adjust - pc_relative relocs accordingly. We are going to change the - howto field, so we can only do this if the current one is - compatible. We should check that special_function is NULL - here, but at the moment coff-i386 uses a special_function - which does not affect what we are doing here. */ - if (rel->howto != NULL - && rel->howto->pc_relative - && ! rel->howto->pcrel_offset - && rel->howto->rightshift == 0 - && rel->howto->size == 2 - && rel->howto->bitsize == 32 - && rel->howto->bitpos == 0 - && rel->howto->src_mask == 0xffffffff - && rel->howto->dst_mask == 0xffffffff) - { - bfd_vma val; - - /* When pcrel_offset is not set, it means that the negative - of the address of the memory location is stored in the - memory location. We must add it back in. */ - val = bfd_get_32 (outbfd, (bfd_byte *) contents + address); - val += address; - bfd_put_32 (outbfd, val, (bfd_byte *) contents + address); - - /* We must change to a new howto. */ - rel->howto = &nlm_i386_pcrel_howto; - } - } -} - -#endif /* NLMCONV_I386 */ - -#ifdef NLMCONV_ALPHA - -/* On the Alpha the first reloc for every section must be a special - relocs which hold the GP address. Also, the first reloc in the - file must be a special reloc which holds the address of the .lita - section. */ - -static reloc_howto_type nlm32_alpha_nw_howto = - HOWTO (ALPHA_R_NW_RELOC, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "NW_RELOC", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false); /* pcrel_offset */ - -/*ARGSUSED*/ -static void -alpha_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents, - contents_size) - bfd *outbfd; - asection *insec; - register arelent ***relocs_ptr; - long *reloc_count_ptr; - char *contents; - bfd_size_type contents_size; -{ - long old_reloc_count; - arelent **old_relocs; - register arelent **relocs; - - old_reloc_count = *reloc_count_ptr; - old_relocs = *relocs_ptr; - relocs = (arelent **) xmalloc ((old_reloc_count + 3) * sizeof (arelent *)); - *relocs_ptr = relocs; - - if (nlm_alpha_backend_data (outbfd)->lita_address == 0) - { - bfd *inbfd; - asection *lita_section; - - inbfd = insec->owner; - lita_section = bfd_get_section_by_name (inbfd, _LITA); - if (lita_section != (asection *) NULL) - { - nlm_alpha_backend_data (outbfd)->lita_address = - bfd_get_section_vma (inbfd, lita_section); - nlm_alpha_backend_data (outbfd)->lita_size = - bfd_section_size (inbfd, lita_section); - } - else - { - /* Avoid outputting this reloc again. */ - nlm_alpha_backend_data (outbfd)->lita_address = 4; - } - - *relocs = (arelent *) xmalloc (sizeof (arelent)); - (*relocs)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - (*relocs)->address = nlm_alpha_backend_data (outbfd)->lita_address; - (*relocs)->addend = nlm_alpha_backend_data (outbfd)->lita_size + 1; - (*relocs)->howto = &nlm32_alpha_nw_howto; - ++relocs; - ++(*reloc_count_ptr); - } - - /* Get the GP value from bfd. */ - if (nlm_alpha_backend_data (outbfd)->gp == 0) - nlm_alpha_backend_data (outbfd)->gp = - bfd_ecoff_get_gp_value (insec->owner); - - *relocs = (arelent *) xmalloc (sizeof (arelent)); - (*relocs)->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - (*relocs)->address = nlm_alpha_backend_data (outbfd)->gp; - (*relocs)->addend = 0; - (*relocs)->howto = &nlm32_alpha_nw_howto; - ++relocs; - ++(*reloc_count_ptr); - - memcpy ((PTR) relocs, (PTR) old_relocs, - (size_t) old_reloc_count * sizeof (arelent *)); - relocs[old_reloc_count] = (arelent *) NULL; - - free (old_relocs); - - if (insec->output_offset != 0) - { - register bfd_size_type i; - - for (i = 0; i < (bfd_size_type) old_reloc_count; i++, relocs++) - (*relocs)->address += insec->output_offset; - } -} - -#endif /* NLMCONV_ALPHA */ - -#ifdef NLMCONV_POWERPC - -/* We keep a linked list of stubs which we must build. Because BFD - requires us to know the sizes of all sections before we can set the - contents of any, we must figure out which stubs we want to build - before we can actually build any of them. */ - -struct powerpc_stub -{ - /* Next stub in linked list. */ - struct powerpc_stub *next; - - /* Symbol whose value is the start of the stub. This is a symbol - whose name begins with `.'. */ - asymbol *start; - - /* Symbol we are going to create a reloc against. This is a symbol - with the same name as START but without the leading `.'. */ - asymbol *reloc; - - /* The TOC index for this stub. This is the index into the TOC - section at which the reloc is created. */ - unsigned int toc_index; -}; - -/* The linked list of stubs. */ - -static struct powerpc_stub *powerpc_stubs; - -/* This is what a stub looks like. The first instruction will get - adjusted with the correct TOC index. */ - -static unsigned long powerpc_stub_insns[] = -{ - 0x81820000, /* lwz r12,0(r2) */ - 0x90410014, /* stw r2,20(r1) */ - 0x800c0000, /* lwz r0,0(r12) */ - 0x804c0004, /* lwz r2,r(r12) */ - 0x7c0903a6, /* mtctr r0 */ - 0x4e800420, /* bctr */ - 0, /* Traceback table. */ - 0xc8000, - 0 -}; - -#define POWERPC_STUB_INSN_COUNT \ - (sizeof powerpc_stub_insns / sizeof powerpc_stub_insns[0]) - -#define POWERPC_STUB_SIZE (4 * POWERPC_STUB_INSN_COUNT) - -/* Each stub uses a four byte TOC entry. */ -#define POWERPC_STUB_TOC_ENTRY_SIZE (4) - -/* The original size of the .got section. */ -static bfd_size_type powerpc_initial_got_size; - -/* Look for all undefined symbols beginning with `.', and prepare to - build a stub for each one. */ - -static void -powerpc_build_stubs (inbfd, outbfd, symbols_ptr, symcount_ptr) - bfd *inbfd; - bfd *outbfd; - asymbol ***symbols_ptr; - long *symcount_ptr; -{ - asection *stub_sec; - asection *got_sec; - unsigned int got_base; - long i; - long symcount; - long stubcount; - - /* Make a section to hold stubs. We don't set SEC_HAS_CONTENTS for - the section to prevent copy_sections from reading from it. */ - stub_sec = bfd_make_section (inbfd, ".stubs"); - if (stub_sec == (asection *) NULL - || ! bfd_set_section_flags (inbfd, stub_sec, - (SEC_CODE - | SEC_RELOC - | SEC_ALLOC - | SEC_LOAD)) - || ! bfd_set_section_alignment (inbfd, stub_sec, 2)) - bfd_fatal (".stubs"); - - /* Get the TOC section, which is named .got. */ - got_sec = bfd_get_section_by_name (inbfd, ".got"); - if (got_sec == (asection *) NULL) - { - got_sec = bfd_make_section (inbfd, ".got"); - if (got_sec == (asection *) NULL - || ! bfd_set_section_flags (inbfd, got_sec, - (SEC_DATA - | SEC_RELOC - | SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS)) - || ! bfd_set_section_alignment (inbfd, got_sec, 2)) - bfd_fatal (".got"); - } - - powerpc_initial_got_size = bfd_section_size (inbfd, got_sec); - got_base = powerpc_initial_got_size; - got_base = (got_base + 3) &~ 3; - - stubcount = 0; - - symcount = *symcount_ptr; - for (i = 0; i < symcount; i++) - { - asymbol *sym; - asymbol *newsym; - char *newname; - struct powerpc_stub *item; - - sym = (*symbols_ptr)[i]; - - /* We must make a stub for every undefined symbol whose name - starts with '.'. */ - if (bfd_asymbol_name (sym)[0] != '.' - || ! bfd_is_und_section (bfd_get_section (sym))) - continue; - - /* Make a new undefined symbol with the same name but without - the leading `.'. */ - newsym = (asymbol *) xmalloc (sizeof (asymbol)); - *newsym = *sym; - newname = (char *) xmalloc (strlen (bfd_asymbol_name (sym))); - strcpy (newname, bfd_asymbol_name (sym) + 1); - newsym->name = newname; - - /* Define the `.' symbol to be in the stub section. */ - sym->section = stub_sec; - sym->value = stubcount * POWERPC_STUB_SIZE; - /* We set the BSF_DYNAMIC flag here so that we can check it when - we are mangling relocs. FIXME: This is a hack. */ - sym->flags = BSF_LOCAL | BSF_DYNAMIC; - - /* Add this stub to the linked list. */ - item = (struct powerpc_stub *) xmalloc (sizeof (struct powerpc_stub)); - item->start = sym; - item->reloc = newsym; - item->toc_index = got_base + stubcount * POWERPC_STUB_TOC_ENTRY_SIZE; - - item->next = powerpc_stubs; - powerpc_stubs = item; - - ++stubcount; - } - - if (stubcount > 0) - { - asymbol **s; - struct powerpc_stub *l; - - /* Add the new symbols we just created to the symbol table. */ - *symbols_ptr = (asymbol **) xrealloc ((char *) *symbols_ptr, - ((symcount + stubcount) - * sizeof (asymbol))); - *symcount_ptr += stubcount; - s = &(*symbols_ptr)[symcount]; - for (l = powerpc_stubs; l != (struct powerpc_stub *) NULL; l = l->next) - *s++ = l->reloc; - - /* Set the size of the .stubs section and increase the size of - the .got section. */ - if (! bfd_set_section_size (inbfd, stub_sec, - stubcount * POWERPC_STUB_SIZE) - || ! bfd_set_section_size (inbfd, got_sec, - (got_base - + (stubcount - * POWERPC_STUB_TOC_ENTRY_SIZE)))) - bfd_fatal (_("stub section sizes")); - } -} - -/* Resolve all the stubs for PowerPC NetWare. We fill in the contents - of the output section, and create new relocs in the TOC. */ - -static void -powerpc_resolve_stubs (inbfd, outbfd) - bfd *inbfd; - bfd *outbfd; -{ - bfd_byte buf[POWERPC_STUB_SIZE]; - unsigned int i; - unsigned int stubcount; - arelent **relocs; - asection *got_sec; - arelent **r; - struct powerpc_stub *l; - - if (powerpc_stubs == (struct powerpc_stub *) NULL) - return; - - for (i = 0; i < POWERPC_STUB_INSN_COUNT; i++) - bfd_put_32 (outbfd, (bfd_vma) powerpc_stub_insns[i], buf + i * 4); - - got_sec = bfd_get_section_by_name (inbfd, ".got"); - assert (got_sec != (asection *) NULL); - assert (got_sec->output_section->orelocation == (arelent **) NULL); - - stubcount = 0; - for (l = powerpc_stubs; l != (struct powerpc_stub *) NULL; l = l->next) - ++stubcount; - relocs = (arelent **) xmalloc (stubcount * sizeof (arelent *)); - - r = relocs; - for (l = powerpc_stubs; l != (struct powerpc_stub *) NULL; l = l->next) - { - arelent *reloc; - - /* Adjust the first instruction to use the right TOC index. */ - bfd_put_32 (outbfd, (bfd_vma) powerpc_stub_insns[0] + l->toc_index, buf); - - /* Write this stub out. */ - if (! bfd_set_section_contents (outbfd, - bfd_get_section (l->start), - buf, - l->start->value, - POWERPC_STUB_SIZE)) - bfd_fatal (_("writing stub")); - - /* Create a new reloc for the TOC entry. */ - reloc = (arelent *) xmalloc (sizeof (arelent)); - reloc->sym_ptr_ptr = &l->reloc; - reloc->address = l->toc_index + got_sec->output_offset; - reloc->addend = 0; - reloc->howto = bfd_reloc_type_lookup (inbfd, BFD_RELOC_32); - - *r++ = reloc; - } - - bfd_set_reloc (outbfd, got_sec->output_section, relocs, stubcount); -} - -/* Adjust relocation entries for PowerPC NetWare. We do not output - TOC relocations. The object code already contains the offset from - the TOC pointer. When the function is called, the TOC register, - r2, will be set to the correct TOC value, so there is no need for - any further reloc. */ - -/*ARGSUSED*/ -static void -powerpc_mangle_relocs (outbfd, insec, relocs_ptr, reloc_count_ptr, contents, - contents_size) - bfd *outbfd; - asection *insec; - register arelent ***relocs_ptr; - long *reloc_count_ptr; - char *contents; - bfd_size_type contents_size; -{ - reloc_howto_type *toc_howto; - long reloc_count; - register arelent **relocs; - register long i; - - toc_howto = bfd_reloc_type_lookup (insec->owner, BFD_RELOC_PPC_TOC16); - if (toc_howto == (reloc_howto_type *) NULL) - abort (); - - /* If this is the .got section, clear out all the contents beyond - the initial size. We must do this here because copy_sections is - going to write out whatever we return in the contents field. */ - if (strcmp (bfd_get_section_name (insec->owner, insec), ".got") == 0) - memset (contents + powerpc_initial_got_size, 0, - (size_t) (bfd_get_section_size_after_reloc (insec) - - powerpc_initial_got_size)); - - reloc_count = *reloc_count_ptr; - relocs = *relocs_ptr; - for (i = 0; i < reloc_count; i++) - { - arelent *rel; - asymbol *sym; - bfd_vma sym_value; - - rel = *relocs++; - sym = *rel->sym_ptr_ptr; - - /* Convert any relocs against the .bss section into relocs - against the .data section. */ - if (strcmp (bfd_get_section_name (outbfd, bfd_get_section (sym)), - NLM_UNINITIALIZED_DATA_NAME) == 0) - { - asection *datasec; - - datasec = bfd_get_section_by_name (outbfd, - NLM_INITIALIZED_DATA_NAME); - if (datasec != NULL) - { - rel->addend += (bfd_get_section_vma (outbfd, - bfd_get_section (sym)) - + sym->value); - rel->sym_ptr_ptr = datasec->symbol_ptr_ptr; - sym = *rel->sym_ptr_ptr; - } - } - - /* We must be able to resolve all PC relative relocs at this - point. If we get a branch to an undefined symbol we build a - stub, since NetWare will resolve undefined symbols into a - pointer to a function descriptor. */ - if (rel->howto->pc_relative) - { - /* This check for whether a symbol is in the same section as - the reloc will be wrong if there is a PC relative reloc - between two sections both of which were placed in the - same output section. This should not happen. */ - if (bfd_get_section (sym) != insec->output_section) - non_fatal (_("unresolved PC relative reloc against %s"), - bfd_asymbol_name (sym)); - else - { - bfd_vma val; - - assert (rel->howto->size == 2 && rel->howto->pcrel_offset); - val = bfd_get_32 (outbfd, (bfd_byte *) contents + rel->address); - val = ((val &~ rel->howto->dst_mask) - | (((val & rel->howto->src_mask) - + (sym->value - rel->address) - + rel->addend) - & rel->howto->dst_mask)); - bfd_put_32 (outbfd, val, (bfd_byte *) contents + rel->address); - - /* If this reloc is against an stubbed symbol and the - next instruction is - cror 31,31,31 - then we replace the next instruction with - lwz r2,20(r1) - This reloads the TOC pointer after a stub call. */ - if (bfd_asymbol_name (sym)[0] == '.' - && (sym->flags & BSF_DYNAMIC) != 0 - && (bfd_get_32 (outbfd, - (bfd_byte *) contents + rel->address + 4) - == 0x4ffffb82)) /* cror 31,31,31 */ - bfd_put_32 (outbfd, (bfd_vma) 0x80410014, /* lwz r2,20(r1) */ - (bfd_byte *) contents + rel->address + 4); - - --*reloc_count_ptr; - --relocs; - memmove (relocs, relocs + 1, - (size_t) ((reloc_count - 1) * sizeof (arelent *))); - continue; - } - } - - /* When considering a TOC reloc, we do not want to include the - symbol value. The symbol will be start of the TOC section - (which is named .got). We do want to include the addend. */ - if (rel->howto == toc_howto) - sym_value = 0; - else - sym_value = sym->value; - - /* If this is a relocation against a symbol with a value, or - there is a reloc addend, we need to update the addend in the - object file. */ - if (sym_value + rel->addend != 0) - { - bfd_vma val; - - switch (rel->howto->size) - { - case 1: - val = bfd_get_16 (outbfd, - (bfd_byte *) contents + rel->address); - val = ((val &~ rel->howto->dst_mask) - | (((val & rel->howto->src_mask) - + sym_value - + rel->addend) - & rel->howto->dst_mask)); - if ((bfd_signed_vma) val < - 0x8000 - || (bfd_signed_vma) val >= 0x8000) - non_fatal (_("overflow when adjusting relocation against %s"), - bfd_asymbol_name (sym)); - bfd_put_16 (outbfd, val, (bfd_byte *) contents + rel->address); - break; - - case 2: - val = bfd_get_32 (outbfd, - (bfd_byte *) contents + rel->address); - val = ((val &~ rel->howto->dst_mask) - | (((val & rel->howto->src_mask) - + sym_value - + rel->addend) - & rel->howto->dst_mask)); - bfd_put_32 (outbfd, val, (bfd_byte *) contents + rel->address); - break; - - default: - abort (); - } - - if (! bfd_is_und_section (bfd_get_section (sym))) - rel->sym_ptr_ptr = bfd_get_section (sym)->symbol_ptr_ptr; - rel->addend = 0; - } - - /* Now that we have incorporated the addend, remove any TOC - relocs. */ - if (rel->howto == toc_howto) - { - --*reloc_count_ptr; - --relocs; - memmove (relocs, relocs + 1, - (size_t) ((reloc_count - i) * sizeof (arelent *))); - continue; - } - - rel->address += insec->output_offset; - } -} - -#endif /* NLMCONV_POWERPC */ - -/* Name of linker. */ -#ifndef LD_NAME -#define LD_NAME "ld" -#endif - -/* Temporary file name base. */ -static char *temp_filename; - -/* The user has specified several input files. Invoke the linker to - link them all together, and convert and delete the resulting output - file. */ - -static char * -link_inputs (inputs, ld) - struct string_list *inputs; - char *ld; -{ - size_t c; - struct string_list *q; - char **argv; - size_t i; - int pid; - int status; - char *errfmt; - char *errarg; - - c = 0; - for (q = inputs; q != NULL; q = q->next) - ++c; - - argv = (char **) alloca ((c + 5) * sizeof(char *)); - -#ifndef __MSDOS__ - if (ld == NULL) - { - char *p; - - /* Find the linker to invoke based on how nlmconv was run. */ - p = program_name + strlen (program_name); - while (p != program_name) - { - if (p[-1] == '/') - { - ld = (char *) xmalloc (p - program_name + strlen (LD_NAME) + 1); - memcpy (ld, program_name, p - program_name); - strcpy (ld + (p - program_name), LD_NAME); - break; - } - --p; - } - } -#endif - - if (ld == NULL) - ld = (char *) LD_NAME; - - temp_filename = choose_temp_base (); - - unlink_on_exit = xmalloc (strlen (temp_filename) + 3); - sprintf (unlink_on_exit, "%s.O", temp_filename); - - argv[0] = ld; - argv[1] = (char *) "-Ur"; - argv[2] = (char *) "-o"; - argv[3] = unlink_on_exit; - i = 4; - for (q = inputs; q != NULL; q = q->next, i++) - argv[i] = q->string; - argv[i] = NULL; - - if (debug) - { - for (i = 0; argv[i] != NULL; i++) - fprintf (stderr, " %s", argv[i]); - fprintf (stderr, "\n"); - } - - pid = pexecute (ld, argv, program_name, (char *) NULL, &errfmt, &errarg, - PEXECUTE_SEARCH | PEXECUTE_ONE); - if (pid == -1) - { - fprintf (stderr, _("%s: execution of %s failed: "), program_name, ld); - fprintf (stderr, errfmt, errarg); - unlink (unlink_on_exit); - exit (1); - } - - if (pwait (pid, &status, 0) < 0) - { - perror ("pwait"); - unlink (unlink_on_exit); - exit (1); - } - - if (status != 0) - { - non_fatal (_("Execution of %s failed"), ld); - unlink (unlink_on_exit); - exit (1); - } - - return unlink_on_exit; -} diff --git a/binutils/nlmconv.h b/binutils/nlmconv.h deleted file mode 100644 index c92a557bb7f..00000000000 --- a/binutils/nlmconv.h +++ /dev/null @@ -1,84 +0,0 @@ -/* nlmconv.h -- header file for NLM conversion program - Copyright (C) 1993 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Written by Ian Lance Taylor . - - bfd.h, nlm/common.h and nlm/internal.h must be included before this - file. */ - -/* A linked list of strings. */ - -struct string_list -{ - struct string_list *next; - char *string; -}; - -/* The NLM header parser in nlmheader.y stores information in the - following variables. */ - -extern Nlm_Internal_Fixed_Header *fixed_hdr; -extern Nlm_Internal_Variable_Header *var_hdr; -extern Nlm_Internal_Version_Header *version_hdr; -extern Nlm_Internal_Copyright_Header *copyright_hdr; -extern Nlm_Internal_Extended_Header *extended_hdr; - -/* Procedure named by CHECK. */ -extern char *check_procedure; -/* File named by CUSTOM. */ -extern char *custom_file; -/* Whether to generate debugging information (DEBUG). */ -extern boolean debug_info; -/* Procedure named by EXIT. */ -extern char *exit_procedure; -/* Exported symbols (EXPORT). */ -extern struct string_list *export_symbols; -/* List of files from INPUT. */ -extern struct string_list *input_files; -/* Map file name (MAP, FULLMAP). */ -extern char *map_file; -/* Whether a full map has been requested (FULLMAP). */ -extern boolean full_map; -/* File named by HELP. */ -extern char *help_file; -/* Imported symbols (IMPORT). */ -extern struct string_list *import_symbols; -/* File named by MESSAGES. */ -extern char *message_file; -/* Autoload module list (MODULE). */ -extern struct string_list *modules; -/* File named by OUTPUT. */ -extern char *output_file; -/* File named by SHARELIB. */ -extern char *sharelib_file; -/* Start procedure name (START). */ -extern char *start_procedure; -/* VERBOSE. */ -extern boolean verbose; -/* RPC description file (XDCDATA). */ -extern char *rpc_file; - -/* The number of serious parse errors. */ -extern int parse_errors; - -/* The parser. */ -extern int yyparse PARAMS ((void)); - -/* Tell the lexer what file to read. */ -extern boolean nlmlex_file PARAMS ((const char *)); diff --git a/binutils/nlmheader.y b/binutils/nlmheader.y deleted file mode 100644 index 0f1e22aa5e3..00000000000 --- a/binutils/nlmheader.y +++ /dev/null @@ -1,978 +0,0 @@ -%{/* nlmheader.y - parse NLM header specification keywords. - Copyright (C) 1993, 94, 95, 97, 1998 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Written by Ian 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 -#include -#include -#include "bfd.h" -#include "bucomm.h" -#include "nlm/common.h" -#include "nlm/internal.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). */ -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). */ -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. */ -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 PARAMS ((void)); -static void nlmlex_file_push PARAMS ((const char *)); -static boolean nlmlex_file_open PARAMS ((const char *)); -static int nlmlex_buf_init PARAMS ((void)); -static char nlmlex_buf_add PARAMS ((int)); -static long nlmlex_get_number PARAMS ((const char *)); -static void nlmheader_identify PARAMS ((void)); -static void nlmheader_warn PARAMS ((const char *, int)); -static void nlmheader_error PARAMS ((const char *)); -static struct string_list * string_list_cons PARAMS ((char *, - struct string_list *)); -static struct string_list * string_list_append PARAMS ((struct string_list *, - struct string_list *)); -static struct string_list * string_list_append1 PARAMS ((struct string_list *, - char *)); -static char *xstrdup PARAMS ((const char *)); - -%} - -%union -{ - char *string; - struct string_list *list; -}; - -/* The reserved words. */ - -%token CHECK CODESTART COPYRIGHT CUSTOM DATE DEBUG DESCRIPTION EXIT -%token EXPORT FLAG_ON FLAG_OFF FULLMAP HELP IMPORT INPUT MAP MESSAGES -%token MODULE MULTIPLE OS_DOMAIN OUTPUT PSEUDOPREEMPTION REENTRANT -%token SCREENNAME SHARELIB STACK START SYNCHRONIZE -%token THREADNAME TYPE VERBOSE VERSIONK XDCDATA - -/* Arguments. */ - -%token STRING -%token QUOTED_STRING - -/* Typed non-terminals. */ -%type symbol_list_opt symbol_list string_list -%type symbol - -%% - -/* Keywords must start in the leftmost column of the file. Arguments - may appear anywhere else. The lexer uses this to determine what - token to return, so we don't have to worry about it here. */ - -/* The entire file is just a list of commands. */ - -file: - commands - ; - -/* A possibly empty list of commands. */ - -commands: - /* May be empty. */ - | command commands - ; - -/* A single command. There is where most of the work takes place. */ - -command: - CHECK STRING - { - check_procedure = $2; - } - | CODESTART STRING - { - nlmheader_warn (_("CODESTART is not implemented; sorry"), -1); - free ($2); - } - | COPYRIGHT QUOTED_STRING - { - int len; - - strncpy (copyright_hdr->stamp, "CoPyRiGhT=", 10); - len = strlen ($2); - 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, $2, len); - copyright_hdr->copyrightMessage[len] = '\0'; - free ($2); - } - | CUSTOM STRING - { - custom_file = $2; - } - | DATE STRING STRING STRING - { - /* 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 ($2); - version_hdr->day = nlmlex_get_number ($3); - version_hdr->year = nlmlex_get_number ($4); - free ($2); - free ($3); - free ($4); - 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); - } - | DEBUG - { - debug_info = true; - } - | DESCRIPTION QUOTED_STRING - { - int len; - - len = strlen ($2); - 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, $2, len); - var_hdr->descriptionText[len] = '\0'; - free ($2); - } - | EXIT STRING - { - exit_procedure = $2; - } - | EXPORT - { - symbol_prefix = NULL; - } - symbol_list_opt - { - export_symbols = string_list_append (export_symbols, $3); - } - | FLAG_ON STRING - { - fixed_hdr->flags |= nlmlex_get_number ($2); - free ($2); - } - | FLAG_OFF STRING - { - fixed_hdr->flags &=~ nlmlex_get_number ($2); - free ($2); - } - | FULLMAP - { - map_file = ""; - full_map = true; - } - | FULLMAP STRING - { - map_file = $2; - full_map = true; - } - | HELP STRING - { - help_file = $2; - } - | IMPORT - { - symbol_prefix = NULL; - } - symbol_list_opt - { - import_symbols = string_list_append (import_symbols, $3); - } - | INPUT string_list - { - input_files = string_list_append (input_files, $2); - } - | MAP - { - map_file = ""; - } - | MAP STRING - { - map_file = $2; - } - | MESSAGES STRING - { - message_file = $2; - } - | MODULE string_list - { - modules = string_list_append (modules, $2); - } - | MULTIPLE - { - fixed_hdr->flags |= 0x2; - } - | OS_DOMAIN - { - fixed_hdr->flags |= 0x10; - } - | OUTPUT STRING - { - if (output_file == NULL) - output_file = $2; - else - nlmheader_warn (_("ignoring duplicate OUTPUT statement"), -1); - } - | PSEUDOPREEMPTION - { - fixed_hdr->flags |= 0x8; - } - | REENTRANT - { - fixed_hdr->flags |= 0x1; - } - | SCREENNAME QUOTED_STRING - { - int len; - - len = strlen ($2); - 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, $2, len); - var_hdr->screenName[NLM_MAX_SCREEN_NAME_LENGTH] = '\0'; - free ($2); - } - | SHARELIB STRING - { - sharelib_file = $2; - } - | STACK STRING - { - var_hdr->stackSize = nlmlex_get_number ($2); - free ($2); - } - | START STRING - { - start_procedure = $2; - } - | SYNCHRONIZE - { - fixed_hdr->flags |= 0x4; - } - | THREADNAME QUOTED_STRING - { - int len; - - len = strlen ($2); - 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, $2, len); - var_hdr->threadName[len] = '\0'; - free ($2); - } - | TYPE STRING - { - fixed_hdr->moduleType = nlmlex_get_number ($2); - free ($2); - } - | VERBOSE - { - verbose = true; - } - | VERSIONK STRING STRING STRING - { - long val; - - strncpy (version_hdr->stamp, "VeRsIoN#", 8); - version_hdr->majorVersion = nlmlex_get_number ($2); - val = nlmlex_get_number ($3); - 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 ($4); - 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 ($2); - free ($3); - free ($4); - } - | VERSIONK STRING STRING - { - long val; - - strncpy (version_hdr->stamp, "VeRsIoN#", 8); - version_hdr->majorVersion = nlmlex_get_number ($2); - val = nlmlex_get_number ($3); - 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 ($2); - free ($3); - } - | XDCDATA STRING - { - rpc_file = $2; - } - ; - -/* A possibly empty list of symbols. */ - -symbol_list_opt: - /* Empty. */ - { - $$ = NULL; - } - | symbol_list - { - $$ = $1; - } - ; - -/* A list of symbols in an import or export list. Prefixes may appear - in parentheses. We need to use left recursion here to avoid - building up a large import list on the parser stack. */ - -symbol_list: - symbol - { - $$ = string_list_cons ($1, NULL); - } - | symbol_prefix - { - $$ = NULL; - } - | symbol_list symbol - { - $$ = string_list_append1 ($1, $2); - } - | symbol_list symbol_prefix - { - $$ = $1; - } - ; - -/* A prefix for subsequent symbols. */ - -symbol_prefix: - '(' STRING ')' - { - if (symbol_prefix != NULL) - free (symbol_prefix); - symbol_prefix = $2; - } - ; - -/* A single symbol. */ - -symbol: - STRING - { - if (symbol_prefix == NULL) - $$ = $1; - else - { - $$ = xmalloc (strlen (symbol_prefix) + strlen ($1) + 2); - sprintf ($$, "%s@%s", symbol_prefix, $1); - free ($1); - } - } - ; - -/* A list of strings. */ - -string_list: - /* May be empty. */ - { - $$ = NULL; - } - | STRING string_list - { - $$ = string_list_cons ($1, $2); - } - ; - -%% - -/* 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 (); - -/* 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. */ - -boolean -nlmlex_file (name) - 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 (name) - 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 boolean -nlmlex_file_open (name) - 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; -}; - -struct keyword_tokens_struct keyword_tokens[] = -{ - { "CHECK", CHECK }, - { "CODESTART", CODESTART }, - { "COPYRIGHT", COPYRIGHT }, - { "CUSTOM", CUSTOM }, - { "DATE", DATE }, - { "DEBUG", DEBUG }, - { "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 () -{ - 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 (c) - 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 () -{ - int c; - -tail_recurse: - - c = getc (current.file); - - /* Commas are treated as whitespace characters. */ - while (isspace ((unsigned char) 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 ((unsigned char) c)); - BUF_INIT (); - while (! isspace ((unsigned char) 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 ((unsigned char) c) || c == '_') - { - if (islower ((unsigned char) c)) - BUF_ADD (toupper ((unsigned char) c)); - else - BUF_ADD (c); - c = getc (current.file); - } - BUF_FINISH (); - - if (c != EOF && ! isspace ((unsigned char) 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 (s) - 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 () -{ - 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 (s, imax) - 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 (s) - const char *s; -{ - nlmheader_warn (s, -1); - ++parse_errors; -} - -/* Add a string to a string list. */ - -static struct string_list * -string_list_cons (s, l) - 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 (l1, l2) - 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 (l, s) - 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 (s) - const char *s; -{ - unsigned long len; - char *ret; - - len = strlen (s); - ret = xmalloc (len + 1); - strcpy (ret, s); - return ret; -} diff --git a/binutils/nm.1 b/binutils/nm.1 deleted file mode 100644 index c2ad99e559a..00000000000 --- a/binutils/nm.1 +++ /dev/null @@ -1,230 +0,0 @@ -.\" Copyright (c) 1991 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH nm 1 "5 November 1991" "cygnus support" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -nm \- list symbols from object files. - -.SH SYNOPSIS -.hy 0 -.na -.TP -.B nm -.RB "[\|" \-a | \-\-debug\-syms "\|]" -.RB "[\|" \-g | \-\-extern\-only "\|]" -.RB "[\|" \-B "\|]" -.RB "[\|" \-C | \-\-demangle "\|]" -.RB "[\|" \-D | \-\-dynamic "\|]" -.RB "[\|" \-s | \-\-print\-armap "\|]" -.RB "[\|" \-o | \-\-print\-file\-name "\|]" -.RB "[\|" \-n | \-\-numeric\-sort "\|]" -.RB "[\|" \-p | \-\-no\-sort "\|]" -.RB "[\|" \-r | \-\-reverse\-sort "\|]" -.RB "[\|" \-\-size\-sort "\|]" -.RB "[\|" \-u | \-\-undefined\-only "\|]" -.RB "[\|" \-l | \-\-line\-numbers "\|]" -.RB "[\|" \-\-help "\|]" -.RB "[\|" \-\-version "\|]" -.RB "[\|" "\-t \fIradix" | \-\-radix=\fIradix "\|]" -.RB "[\|" \-P | --portability "\|]" -.RB "[\|" "\-f \fIformat" | \-\-format=\fIformat "\|]" -.RB "[\|" "\-\-target=\fIbfdname" "\|]" -.RB "[\|" \c -.I objfile\c -\&.\|.\|.\|] -.ad b -.hy 1 -.SH DESCRIPTION -GNU \c -.B nm\c -\& lists the symbols from object files \c -.I objfile\c -\&. If no object files are given as arguments, \c -.B nm\c -\& assumes `\|\c -.B a.out\c -\|'. - -.SH OPTIONS -The long and short forms of options, shown here as alternatives, are -equivalent. - -.TP -.B \-A -.TP -.B \-o -.TP -.B \-\-print\-file\-name -Precede each symbol by the name of the input file where it was found, -rather than identifying the input file once only before all of its -symbols. - -.TP -.B \-a -.TP -.B \-\-debug\-syms -Display debugger-only symbols; normally these are not listed. - -.TP -.B \-B -The same as -.B \-\-format=bsd -(for compatibility with the MIPS \fBnm\fP). - -.TP -.B \-C -.TP -.B \-\-demangle -Decode (\fIdemangle\fP) low-level symbol names into user-level names. -Besides removing any initial underscore prepended by the system, this -makes C++ function names readable. - -.TP -.B \-D -.TP -.B \-\-dynamic -Display the dynamic symbols rather than the normal symbols. This is -only meaningful for dynamic objects, such as certain types of shared -libraries. - -.TP -.B "\-f \fIformat" -Use the output format \fIformat\fP, which can be ``bsd'', -``sysv'', or ``posix''. The default is ``bsd''. -Only the first character of \fIformat\fP is significant; it can be -either upper or lower case. - -.TP -.B \-g -.TP -.B \-\-extern\-only -Display only external symbols. - -.TP -.B \-n -.TP -.B \-v -.TP -.B \-\-numeric\-sort -Sort symbols numerically by their addresses, not alphabetically by their -names. - -.TP -.B \-p -.TP -.B \-\-no\-sort -Don't bother to sort the symbols in any order; just print them in the -order encountered. - -.TP -.B \-P -.TP -.B \-\-portability -Use the POSIX.2 standard output format instead of the default format. -Equivalent to ``\-f posix''. - -.TP -.B \-s -.TP -.B \-\-print\-armap -When listing symbols from archive members, include the index: a mapping -(stored in the archive by \c -.B ar\c -\& or \c -.B ranlib\c -\&) of what modules -contain definitions for what names. - -.TP -.B \-r -.TP -.B \-\-reverse\-sort -Reverse the sense of the sort (whether numeric or alphabetic); let the -last come first. - -.TP -.B \-\-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. The size of the symbol is printed, rather than the value. - -.TP -.B "\-t \fIradix" -.TP -.B "\-\-radix=\fIradix" -Use \fIradix\fP as the radix for printing the symbol values. It must be -``d'' for decimal, ``o'' for octal, or ``x'' for hexadecimal. - -.TP -.BI "\-\-target=" "bfdname" -Specify an object code format other than your system's default format. -See -.BR objdump ( 1 ), -for information on listing available formats. - -.TP -.B \-u -.TP -.B \-\-undefined\-only -Display only undefined symbols (those external to each object file). - -.TP -.B \-l -.TP -.B \-\-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. - -.TP -.B \-V -.TP -.B \-\-version -Show the version number of -.B nm -and exit. - -.TP -.B \-\-help -Show a summary of the options to -.B nm -and exit. - -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.B -info\c -\&; -.I -The GNU Binary Utilities\c -\&, Roland H. Pesch (October 1991); -.BR ar "(" 1 ")," -.BR objdump ( 1 ), -.BR ranlib "(" 1 ")." - - -.SH COPYING -Copyright (c) 1991 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/binutils/nm.c b/binutils/nm.c deleted file mode 100644 index 2ee48731bed..00000000000 --- a/binutils/nm.c +++ /dev/null @@ -1,1557 +0,0 @@ -/* nm.c -- Describe symbol table of a rel file. - Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000 - 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 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include "bfd.h" -#include "progress.h" -#include "bucomm.h" -#include "getopt.h" -#include "aout/stab_gnu.h" -#include "aout/ranlib.h" -#include "demangle.h" -#include "libiberty.h" - -/* When sorting by size, we use this structure to hold the size and a - pointer to the minisymbol. */ - -struct size_sym -{ - const PTR minisym; - bfd_vma size; -}; - -/* When fetching relocs, we use this structure to pass information to - get_relocs. */ - -struct get_relocs_info -{ - asection **secs; - arelent ***relocs; - long *relcount; - asymbol **syms; -}; - -static void -usage PARAMS ((FILE *, int)); - -static void -set_print_radix PARAMS ((char *)); - -static void -set_output_format PARAMS ((char *)); - -static void -display_archive PARAMS ((bfd *)); - -static boolean -display_file PARAMS ((char *filename)); - -static void -display_rel_file PARAMS ((bfd * file, bfd * archive)); - -static long -filter_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int)); - -static long -sort_symbols_by_size PARAMS ((bfd *, boolean, PTR, long, unsigned int, - struct size_sym **)); - -static void -print_symbols PARAMS ((bfd *, boolean, PTR, long, unsigned int, bfd *)); - -static void -print_size_symbols PARAMS ((bfd *, boolean, struct size_sym *, long, bfd *)); - -static void -print_symname PARAMS ((const char *, const char *, bfd *)); - -static void -print_symbol PARAMS ((bfd *, asymbol *, bfd *)); - -static void -print_symdef_entry PARAMS ((bfd * abfd)); - -/* The sorting functions. */ - -static int -numeric_forward PARAMS ((const PTR, const PTR)); - -static int -numeric_reverse PARAMS ((const PTR, const PTR)); - -static int -non_numeric_forward PARAMS ((const PTR, const PTR)); - -static int -non_numeric_reverse PARAMS ((const PTR, const PTR)); - -static int -size_forward1 PARAMS ((const PTR, const PTR)); - -static int -size_forward2 PARAMS ((const PTR, const PTR)); - -/* The output formatting functions. */ - -static void -print_object_filename_bsd PARAMS ((char *filename)); - -static void -print_object_filename_sysv PARAMS ((char *filename)); - -static void -print_object_filename_posix PARAMS ((char *filename)); - - -static void -print_archive_filename_bsd PARAMS ((char *filename)); - -static void -print_archive_filename_sysv PARAMS ((char *filename)); - -static void -print_archive_filename_posix PARAMS ((char *filename)); - - -static void -print_archive_member_bsd PARAMS ((char *archive, CONST char *filename)); - -static void -print_archive_member_sysv PARAMS ((char *archive, CONST char *filename)); - -static void -print_archive_member_posix PARAMS ((char *archive, CONST char *filename)); - - -static void -print_symbol_filename_bsd PARAMS ((bfd * archive_bfd, bfd * abfd)); - -static void -print_symbol_filename_sysv PARAMS ((bfd * archive_bfd, bfd * abfd)); - -static void -print_symbol_filename_posix PARAMS ((bfd * archive_bfd, bfd * abfd)); - - -static void -print_value PARAMS ((bfd_vma)); - -static void -print_symbol_info_bsd PARAMS ((symbol_info * info, bfd * abfd)); - -static void -print_symbol_info_sysv PARAMS ((symbol_info * info, bfd * abfd)); - -static void -print_symbol_info_posix PARAMS ((symbol_info * info, bfd * abfd)); - -static void -get_relocs PARAMS ((bfd *, asection *, PTR)); - -/* Support for different output formats. */ -struct output_fns - { - /* Print the name of an object file given on the command line. */ - void (*print_object_filename) PARAMS ((char *filename)); - - /* Print the name of an archive file given on the command line. */ - void (*print_archive_filename) PARAMS ((char *filename)); - - /* Print the name of an archive member file. */ - void (*print_archive_member) PARAMS ((char *archive, CONST char *filename)); - - /* Print the name of the file (and archive, if there is one) - containing a symbol. */ - void (*print_symbol_filename) PARAMS ((bfd * archive_bfd, bfd * abfd)); - - /* Print a line of information about a symbol. */ - void (*print_symbol_info) PARAMS ((symbol_info * info, bfd * abfd)); - }; -static struct output_fns formats[] = -{ - {print_object_filename_bsd, - print_archive_filename_bsd, - print_archive_member_bsd, - print_symbol_filename_bsd, - print_symbol_info_bsd}, - {print_object_filename_sysv, - print_archive_filename_sysv, - print_archive_member_sysv, - print_symbol_filename_sysv, - print_symbol_info_sysv}, - {print_object_filename_posix, - print_archive_filename_posix, - print_archive_member_posix, - print_symbol_filename_posix, - print_symbol_info_posix} -}; - -/* Indices in `formats'. */ -#define FORMAT_BSD 0 -#define FORMAT_SYSV 1 -#define FORMAT_POSIX 2 -#define FORMAT_DEFAULT FORMAT_BSD - -/* The output format to use. */ -static struct output_fns *format = &formats[FORMAT_DEFAULT]; - - -/* Command options. */ - -static int do_demangle = 0; /* Pretty print C++ symbol names. */ -static int external_only = 0; /* print external symbols only */ -static int defined_only = 0; /* Print defined symbols only */ -static int no_sort = 0; /* don't sort; print syms in order found */ -static int print_debug_syms = 0; /* print debugger-only symbols too */ -static int print_armap = 0; /* describe __.SYMDEF data in archive files. */ -static int reverse_sort = 0; /* sort in downward(alpha or numeric) order */ -static int sort_numerically = 0; /* sort in numeric rather than alpha order */ -static int sort_by_size = 0; /* sort by size of symbol */ -static int undefined_only = 0; /* print undefined symbols only */ -static int dynamic = 0; /* print dynamic symbols. */ -static int show_version = 0; /* show the version number */ -static int show_stats = 0; /* show statistics */ -static int line_numbers = 0; /* print line numbers for symbols */ - -/* When to print the names of files. Not mutually exclusive in SYSV format. */ -static int filename_per_file = 0; /* Once per file, on its own line. */ -static int filename_per_symbol = 0; /* Once per symbol, at start of line. */ - -/* Print formats for printing a symbol value. */ -#ifndef BFD64 -static char value_format[] = "%08lx"; -#else -#if BFD_HOST_64BIT_LONG -static char value_format[] = "%016lx"; -#else -/* We don't use value_format for this case. */ -#endif -#endif -static int print_radix = 16; -/* Print formats for printing stab info. */ -static char other_format[] = "%02x"; -static char desc_format[] = "%04x"; - -static char *target = NULL; - -/* Used to cache the line numbers for a BFD. */ -static bfd *lineno_cache_bfd; -static bfd *lineno_cache_rel_bfd; - -#define OPTION_TARGET 200 - -static struct option long_options[] = -{ - {"debug-syms", no_argument, &print_debug_syms, 1}, - {"demangle", no_argument, &do_demangle, 1}, - {"dynamic", no_argument, &dynamic, 1}, - {"extern-only", no_argument, &external_only, 1}, - {"format", required_argument, 0, 'f'}, - {"help", no_argument, 0, 'h'}, - {"line-numbers", no_argument, 0, 'l'}, - {"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */ - {"no-demangle", no_argument, &do_demangle, 0}, - {"no-sort", no_argument, &no_sort, 1}, - {"numeric-sort", no_argument, &sort_numerically, 1}, - {"portability", no_argument, 0, 'P'}, - {"print-armap", no_argument, &print_armap, 1}, - {"print-file-name", no_argument, 0, 'o'}, - {"radix", required_argument, 0, 't'}, - {"reverse-sort", no_argument, &reverse_sort, 1}, - {"size-sort", no_argument, &sort_by_size, 1}, - {"stats", no_argument, &show_stats, 1}, - {"target", required_argument, 0, OPTION_TARGET}, - {"defined-only", no_argument, &defined_only, 1}, - {"undefined-only", no_argument, &undefined_only, 1}, - {"version", no_argument, &show_version, 1}, - {0, no_argument, 0, 0} -}; - -/* Some error-reporting functions */ - -static void -usage (stream, status) - FILE *stream; - int status; -{ - fprintf (stream, _("\ -Usage: %s [-aABCDglnopPrsuvV] [-t radix] [--radix=radix] [--target=bfdname]\n\ - [--debug-syms] [--extern-only] [--print-armap] [--print-file-name]\n\ - [--numeric-sort] [--no-sort] [--reverse-sort] [--size-sort]\n\ - [--undefined-only] [--portability] [-f {bsd,sysv,posix}]\n\ - [--format={bsd,sysv,posix}] [--demangle] [--no-demangle] [--dynamic]\n\ - [--defined-only] [--line-numbers]\n\ - [--version] [--help]\n\ - [file...]\n"), - program_name); - list_supported_targets (program_name, stream); - if (status == 0) - fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); - exit (status); -} - -/* Set the radix for the symbol value and size according to RADIX. */ - -static void -set_print_radix (radix) - char *radix; -{ - switch (*radix) - { - case 'x': - break; - case 'd': - case 'o': - if (*radix == 'd') - print_radix = 10; - else - print_radix = 8; -#ifndef BFD64 - value_format[4] = *radix; -#else -#if BFD_HOST_64BIT_LONG - value_format[5] = *radix; -#else - /* This case requires special handling for octal and decimal - printing. */ -#endif -#endif - other_format[3] = desc_format[3] = *radix; - break; - default: - fatal (_("%s: invalid radix"), radix); - } -} - -static void -set_output_format (f) - char *f; -{ - int i; - - switch (*f) - { - case 'b': - case 'B': - i = FORMAT_BSD; - break; - case 'p': - case 'P': - i = FORMAT_POSIX; - break; - case 's': - case 'S': - i = FORMAT_SYSV; - break; - default: - fatal (_("%s: invalid output format"), f); - } - format = &formats[i]; -} - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int retval; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = *argv; - xmalloc_set_program_name (program_name); - - START_PROGRESS (program_name, 0); - - bfd_init (); - set_default_bfd_target (); - - while ((c = getopt_long (argc, argv, "aABCDef:glnopPrst:uvV", long_options, (int *) 0)) != EOF) - { - switch (c) - { - case 'a': - print_debug_syms = 1; - break; - case 'A': - case 'o': - filename_per_symbol = 1; - break; - case 'B': /* For MIPS compatibility. */ - set_output_format ("bsd"); - break; - case 'C': - do_demangle = 1; - break; - case 'D': - dynamic = 1; - break; - case 'e': - /* Ignored for HP/UX compatibility. */ - break; - case 'f': - set_output_format (optarg); - break; - case 'g': - external_only = 1; - break; - case 'h': - usage (stdout, 0); - case 'l': - line_numbers = 1; - break; - case 'n': - case 'v': - sort_numerically = 1; - break; - case 'p': - no_sort = 1; - break; - case 'P': - set_output_format ("posix"); - break; - case 'r': - reverse_sort = 1; - break; - case 's': - print_armap = 1; - break; - case 't': - set_print_radix (optarg); - break; - case 'u': - undefined_only = 1; - break; - case 'V': - show_version = 1; - break; - - case OPTION_TARGET: /* --target */ - target = optarg; - break; - - case 0: /* A long option that just sets a flag. */ - break; - - default: - usage (stderr, 1); - } - } - - if (show_version) - print_version ("nm"); - - /* OK, all options now parsed. If no filename specified, do a.out. */ - if (optind == argc) - return !display_file ("a.out"); - - retval = 0; - - if (argc - optind > 1) - filename_per_file = 1; - - /* We were given several filenames to do. */ - while (optind < argc) - { - PROGRESS (1); - if (!display_file (argv[optind++])) - retval++; - } - - END_PROGRESS (program_name); - -#ifdef HAVE_SBRK - if (show_stats) - { - char *lim = (char *) sbrk (0); - - non_fatal (_("data size %ld"), (long) (lim - (char *) &environ)); - } -#endif - - exit (retval); - return retval; -} - -static void -display_archive (file) - bfd *file; -{ - bfd *arfile = NULL; - bfd *last_arfile = NULL; - char **matching; - - (*format->print_archive_filename) (bfd_get_filename (file)); - - if (print_armap) - print_symdef_entry (file); - - for (;;) - { - PROGRESS (1); - - arfile = bfd_openr_next_archived_file (file, arfile); - - if (arfile == NULL) - { - if (bfd_get_error () != bfd_error_no_more_archived_files) - bfd_fatal (bfd_get_filename (file)); - break; - } - - if (bfd_check_format_matches (arfile, bfd_object, &matching)) - { - (*format->print_archive_member) (bfd_get_filename (file), - bfd_get_filename (arfile)); - display_rel_file (arfile, file); - } - else - { - bfd_nonfatal (bfd_get_filename (arfile)); - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } - } - - if (last_arfile != NULL) - { - bfd_close (last_arfile); - lineno_cache_bfd = NULL; - lineno_cache_rel_bfd = NULL; - } - last_arfile = arfile; - } - - if (last_arfile != NULL) - { - bfd_close (last_arfile); - lineno_cache_bfd = NULL; - lineno_cache_rel_bfd = NULL; - } -} - -static boolean -display_file (filename) - char *filename; -{ - boolean retval = true; - bfd *file; - char **matching; - - file = bfd_openr (filename, target); - if (file == NULL) - { - bfd_nonfatal (filename); - return false; - } - - if (bfd_check_format (file, bfd_archive)) - { - display_archive (file); - } - else if (bfd_check_format_matches (file, bfd_object, &matching)) - { - (*format->print_object_filename) (filename); - display_rel_file (file, NULL); - } - else - { - bfd_nonfatal (filename); - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } - retval = false; - } - - if (bfd_close (file) == false) - bfd_fatal (filename); - - lineno_cache_bfd = NULL; - lineno_cache_rel_bfd = NULL; - - return retval; -} - -/* These globals are used to pass information into the sorting - routines. */ -static bfd *sort_bfd; -static boolean sort_dynamic; -static asymbol *sort_x; -static asymbol *sort_y; - -/* Symbol-sorting predicates */ -#define valueof(x) ((x)->section->vma + (x)->value) - -/* Numeric sorts. Undefined symbols are always considered "less than" - defined symbols with zero values. Common symbols are not treated - specially -- i.e., their sizes are used as their "values". */ - -static int -numeric_forward (P_x, P_y) - const PTR P_x; - const PTR P_y; -{ - asymbol *x, *y; - asection *xs, *ys; - - x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x); - y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y); - if (x == NULL || y == NULL) - bfd_fatal (bfd_get_filename (sort_bfd)); - - xs = bfd_get_section (x); - ys = bfd_get_section (y); - - if (bfd_is_und_section (xs)) - { - if (! bfd_is_und_section (ys)) - return -1; - } - else if (bfd_is_und_section (ys)) - return 1; - else if (valueof (x) != valueof (y)) - return valueof (x) < valueof (y) ? -1 : 1; - - return non_numeric_forward (P_x, P_y); -} - -static int -numeric_reverse (x, y) - const PTR x; - const PTR y; -{ - return - numeric_forward (x, y); -} - -static int -non_numeric_forward (P_x, P_y) - const PTR P_x; - const PTR P_y; -{ - asymbol *x, *y; - const char *xn, *yn; - - x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x); - y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y); - if (x == NULL || y == NULL) - bfd_fatal (bfd_get_filename (sort_bfd)); - - xn = bfd_asymbol_name (x); - yn = bfd_asymbol_name (y); - - return ((xn == NULL) ? ((yn == NULL) ? 0 : -1) : - ((yn == NULL) ? 1 : strcmp (xn, yn))); -} - -static int -non_numeric_reverse (x, y) - const PTR x; - const PTR y; -{ - return - non_numeric_forward (x, y); -} - -static int (*(sorters[2][2])) PARAMS ((const PTR, const PTR)) = -{ - { non_numeric_forward, non_numeric_reverse }, - { numeric_forward, numeric_reverse } -}; - -/* This sort routine is used by sort_symbols_by_size. It is similar - to numeric_forward, but when symbols have the same value it sorts - by section VMA. This simplifies the sort_symbols_by_size code - which handles symbols at the end of sections. Also, this routine - tries to sort file names before other symbols with the same value. - That will make the file name have a zero size, which will make - sort_symbols_by_size choose the non file name symbol, leading to - more meaningful output. For similar reasons, this code sorts - gnu_compiled_* and gcc2_compiled before other symbols with the same - value. */ - -static int -size_forward1 (P_x, P_y) - const PTR P_x; - const PTR P_y; -{ - asymbol *x, *y; - asection *xs, *ys; - const char *xn, *yn; - size_t xnl, ynl; - int xf, yf; - - x = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_x, sort_x); - y = bfd_minisymbol_to_symbol (sort_bfd, sort_dynamic, P_y, sort_y); - if (x == NULL || y == NULL) - bfd_fatal (bfd_get_filename (sort_bfd)); - - xs = bfd_get_section (x); - ys = bfd_get_section (y); - - if (bfd_is_und_section (xs)) - abort (); - if (bfd_is_und_section (ys)) - abort (); - - if (valueof (x) != valueof (y)) - return valueof (x) < valueof (y) ? -1 : 1; - - if (xs->vma != ys->vma) - return xs->vma < ys->vma ? -1 : 1; - - xn = bfd_asymbol_name (x); - yn = bfd_asymbol_name (y); - xnl = strlen (xn); - ynl = strlen (yn); - - /* The symbols gnu_compiled and gcc2_compiled convey even less - information than the file name, so sort them out first. */ - - xf = (strstr (xn, "gnu_compiled") != NULL - || strstr (xn, "gcc2_compiled") != NULL); - yf = (strstr (yn, "gnu_compiled") != NULL - || strstr (yn, "gcc2_compiled") != NULL); - - if (xf && ! yf) - return -1; - if (! xf && yf) - return 1; - - /* We use a heuristic for the file name. It may not work on non - Unix systems, but it doesn't really matter; the only difference - is precisely which symbol names get printed. */ - -#define file_symbol(s, sn, snl) \ - (((s)->flags & BSF_FILE) != 0 \ - || ((sn)[(snl) - 2] == '.' \ - && ((sn)[(snl) - 1] == 'o' \ - || (sn)[(snl) - 1] == 'a'))) - - xf = file_symbol (x, xn, xnl); - yf = file_symbol (y, yn, ynl); - - if (xf && ! yf) - return -1; - if (! xf && yf) - return 1; - - return non_numeric_forward (P_x, P_y); -} - -/* This sort routine is used by sort_symbols_by_size. It is sorting - an array of size_sym structures into size order. */ - -static int -size_forward2 (P_x, P_y) - const PTR P_x; - const PTR P_y; -{ - const struct size_sym *x = (const struct size_sym *) P_x; - const struct size_sym *y = (const struct size_sym *) P_y; - - if (x->size < y->size) - return reverse_sort ? 1 : -1; - else if (x->size > y->size) - return reverse_sort ? -1 : 1; - else - return sorters[0][reverse_sort] (x->minisym, y->minisym); -} - -/* Sort the symbols by size. We guess the size by assuming that the - difference between the address of a symbol and the address of the - next higher symbol is the size. FIXME: ELF actually stores a size - with each symbol. We should use it. */ - -static long -sort_symbols_by_size (abfd, dynamic, minisyms, symcount, size, symsizesp) - bfd *abfd; - boolean dynamic; - PTR minisyms; - long symcount; - unsigned int size; - struct size_sym **symsizesp; -{ - struct size_sym *symsizes; - bfd_byte *from, *fromend; - asymbol *sym = NULL; - asymbol *store_sym, *store_next; - - qsort (minisyms, symcount, size, size_forward1); - - /* We are going to return a special set of symbols and sizes to - print. */ - symsizes = (struct size_sym *) xmalloc (symcount * sizeof (struct size_sym)); - *symsizesp = symsizes; - - /* Note that filter_symbols has already removed all absolute and - undefined symbols. Here we remove all symbols whose size winds - up as zero. */ - - from = (bfd_byte *) minisyms; - fromend = from + symcount * size; - - store_sym = sort_x; - store_next = sort_y; - - if (from < fromend) - { - sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from, - store_sym); - if (sym == NULL) - bfd_fatal (bfd_get_filename (abfd)); - } - - for (; from < fromend; from += size) - { - asymbol *next; - asection *sec; - bfd_vma sz; - asymbol *temp; - - if (from + size < fromend) - { - next = bfd_minisymbol_to_symbol (abfd, - dynamic, - (const PTR) (from + size), - store_next); - if (next == NULL) - bfd_fatal (bfd_get_filename (abfd)); - } - else - next = NULL; - - sec = bfd_get_section (sym); - - if (bfd_is_com_section (sec)) - sz = sym->value; - else - { - if (from + size < fromend - && sec == bfd_get_section (next)) - sz = valueof (next) - valueof (sym); - else - sz = (bfd_get_section_vma (abfd, sec) - + bfd_section_size (abfd, sec) - - valueof (sym)); - } - - if (sz != 0) - { - symsizes->minisym = (const PTR) from; - symsizes->size = sz; - ++symsizes; - } - - sym = next; - - temp = store_sym; - store_sym = store_next; - store_next = temp; - } - - symcount = symsizes - *symsizesp; - - /* We must now sort again by size. */ - qsort ((PTR) *symsizesp, symcount, sizeof (struct size_sym), size_forward2); - - return symcount; -} - -/* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */ - -static void -display_rel_file (abfd, archive_bfd) - bfd *abfd; - bfd *archive_bfd; -{ - long symcount; - PTR minisyms; - unsigned int size; - struct size_sym *symsizes; - - if (! dynamic) - { - if (!(bfd_get_file_flags (abfd) & HAS_SYMS)) - { - non_fatal (_("%s: no symbols"), bfd_get_filename (abfd)); - return; - } - } - - symcount = bfd_read_minisymbols (abfd, dynamic, &minisyms, &size); - if (symcount < 0) - bfd_fatal (bfd_get_filename (abfd)); - - if (symcount == 0) - { - non_fatal (_("%s: no symbols"), bfd_get_filename (abfd)); - return; - } - - /* Discard the symbols we don't want to print. - It's OK to do this in place; we'll free the storage anyway - (after printing). */ - - symcount = filter_symbols (abfd, dynamic, minisyms, symcount, size); - - symsizes = NULL; - if (! no_sort) - { - sort_bfd = abfd; - sort_dynamic = dynamic; - sort_x = bfd_make_empty_symbol (abfd); - sort_y = bfd_make_empty_symbol (abfd); - if (sort_x == NULL || sort_y == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - if (! sort_by_size) - qsort (minisyms, symcount, size, - sorters[sort_numerically][reverse_sort]); - else - symcount = sort_symbols_by_size (abfd, dynamic, minisyms, symcount, - size, &symsizes); - } - - if (! sort_by_size) - print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd); - else - print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd); - - free (minisyms); -} - -/* Choose which symbol entries to print; - compact them downward to get rid of the rest. - Return the number of symbols to be printed. */ - -static long -filter_symbols (abfd, dynamic, minisyms, symcount, size) - bfd *abfd; - boolean dynamic; - PTR minisyms; - long symcount; - unsigned int size; -{ - bfd_byte *from, *fromend, *to; - asymbol *store; - - store = bfd_make_empty_symbol (abfd); - if (store == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - from = (bfd_byte *) minisyms; - fromend = from + symcount * size; - to = (bfd_byte *) minisyms; - - for (; from < fromend; from += size) - { - int keep = 0; - asymbol *sym; - - PROGRESS (1); - - sym = bfd_minisymbol_to_symbol (abfd, dynamic, (const PTR) from, store); - if (sym == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - if (undefined_only) - keep = bfd_is_und_section (sym->section); - else if (external_only) - keep = ((sym->flags & BSF_GLOBAL) != 0 - || (sym->flags & BSF_WEAK) != 0 - || bfd_is_und_section (sym->section) - || bfd_is_com_section (sym->section)); - else - keep = 1; - - if (keep - && ! print_debug_syms - && (sym->flags & BSF_DEBUGGING) != 0) - keep = 0; - - if (keep - && sort_by_size - && (bfd_is_abs_section (sym->section) - || bfd_is_und_section (sym->section))) - keep = 0; - - if (keep - && defined_only) - { - if (bfd_is_und_section (sym->section)) - keep = 0; - } - - if (keep) - { - memcpy (to, from, size); - to += size; - } - } - - return (to - (bfd_byte *) minisyms) / size; -} - -/* Print symbol name NAME, read from ABFD, with printf format FORMAT, - demangling it if requested. */ - -static void -print_symname (format, name, abfd) - const char *format; - const char *name; - bfd *abfd; -{ - if (do_demangle && *name) - { - char *res; - - /* In this mode, give a user-level view of the symbol name - even if it's not mangled; strip off any leading - underscore. */ - if (bfd_get_symbol_leading_char (abfd) == name[0]) - name++; - - res = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS); - if (res) - { - printf (format, res); - free (res); - return; - } - } - - printf (format, name); -} - -/* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive - containing ABFD. */ - -static void -print_symbols (abfd, dynamic, minisyms, symcount, size, archive_bfd) - bfd *abfd; - boolean dynamic; - PTR minisyms; - long symcount; - unsigned int size; - bfd *archive_bfd; -{ - asymbol *store; - bfd_byte *from, *fromend; - - store = bfd_make_empty_symbol (abfd); - if (store == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - from = (bfd_byte *) minisyms; - fromend = from + symcount * size; - for (; from < fromend; from += size) - { - asymbol *sym; - - sym = bfd_minisymbol_to_symbol (abfd, dynamic, from, store); - if (sym == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - print_symbol (abfd, sym, archive_bfd); - } -} - -/* Print the symbols when sorting by size. */ - -static void -print_size_symbols (abfd, dynamic, symsizes, symcount, archive_bfd) - bfd *abfd; - boolean dynamic; - struct size_sym *symsizes; - long symcount; - bfd *archive_bfd; -{ - asymbol *store; - struct size_sym *from, *fromend; - - store = bfd_make_empty_symbol (abfd); - if (store == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - from = symsizes; - fromend = from + symcount; - for (; from < fromend; from++) - { - asymbol *sym; - - sym = bfd_minisymbol_to_symbol (abfd, dynamic, from->minisym, store); - if (sym == NULL) - bfd_fatal (bfd_get_filename (abfd)); - - /* Set the symbol value so that we actually display the symbol - size. */ - sym->value = from->size - bfd_section_vma (abfd, bfd_get_section (sym)); - - print_symbol (abfd, sym, archive_bfd); - } -} - -/* Print a single symbol. */ - -static void -print_symbol (abfd, sym, archive_bfd) - bfd *abfd; - asymbol *sym; - bfd *archive_bfd; -{ - PROGRESS (1); - - (*format->print_symbol_filename) (archive_bfd, abfd); - - if (undefined_only) - { - if (bfd_is_und_section (bfd_get_section (sym))) - print_symname ("%s", bfd_asymbol_name (sym), abfd); - } - else - { - symbol_info syminfo; - - bfd_get_symbol_info (abfd, sym, &syminfo); - (*format->print_symbol_info) (&syminfo, abfd); - } - - if (line_numbers) - { - static asymbol **syms; - static long symcount; - const char *filename, *functionname; - unsigned int lineno; - - /* We need to get the canonical symbols in order to call - bfd_find_nearest_line. This is inefficient, but, then, you - don't have to use --line-numbers. */ - if (abfd != lineno_cache_bfd && syms != NULL) - { - free (syms); - syms = NULL; - } - if (syms == NULL) - { - long symsize; - - symsize = bfd_get_symtab_upper_bound (abfd); - if (symsize < 0) - bfd_fatal (bfd_get_filename (abfd)); - syms = (asymbol **) xmalloc (symsize); - symcount = bfd_canonicalize_symtab (abfd, syms); - if (symcount < 0) - bfd_fatal (bfd_get_filename (abfd)); - lineno_cache_bfd = abfd; - } - - if (bfd_is_und_section (bfd_get_section (sym))) - { - static asection **secs; - static arelent ***relocs; - static long *relcount; - static unsigned int seccount; - unsigned int i; - const char *symname; - - /* For an undefined symbol, we try to find a reloc for the - symbol, and print the line number of the reloc. */ - - if (abfd != lineno_cache_rel_bfd && relocs != NULL) - { - for (i = 0; i < seccount; i++) - if (relocs[i] != NULL) - free (relocs[i]); - free (secs); - free (relocs); - free (relcount); - secs = NULL; - relocs = NULL; - relcount = NULL; - } - - if (relocs == NULL) - { - struct get_relocs_info info; - - seccount = bfd_count_sections (abfd); - - secs = (asection **) xmalloc (seccount * sizeof *secs); - relocs = (arelent ***) xmalloc (seccount * sizeof *relocs); - relcount = (long *) xmalloc (seccount * sizeof *relcount); - - info.secs = secs; - info.relocs = relocs; - info.relcount = relcount; - info.syms = syms; - bfd_map_over_sections (abfd, get_relocs, (PTR) &info); - lineno_cache_rel_bfd = abfd; - } - - symname = bfd_asymbol_name (sym); - for (i = 0; i < seccount; i++) - { - long j; - - for (j = 0; j < relcount[i]; j++) - { - arelent *r; - - r = relocs[i][j]; - if (r->sym_ptr_ptr != NULL - && (*r->sym_ptr_ptr)->section == sym->section - && (*r->sym_ptr_ptr)->value == sym->value - && strcmp (symname, - bfd_asymbol_name (*r->sym_ptr_ptr)) == 0 - && bfd_find_nearest_line (abfd, secs[i], syms, - r->address, &filename, - &functionname, &lineno)) - { - /* We only print the first one we find. */ - printf ("\t%s:%u", filename, lineno); - i = seccount; - break; - } - } - } - } - else if (bfd_get_section (sym)->owner == abfd) - { - if (bfd_find_nearest_line (abfd, bfd_get_section (sym), syms, - sym->value, &filename, &functionname, - &lineno) - && filename != NULL - && lineno != 0) - { - printf ("\t%s:%u", filename, lineno); - } - } - } - - putchar ('\n'); -} - -/* The following 3 groups of functions are called unconditionally, - once at the start of processing each file of the appropriate type. - They should check `filename_per_file' and `filename_per_symbol', - as appropriate for their output format, to determine whether to - print anything. */ - -/* Print the name of an object file given on the command line. */ - -static void -print_object_filename_bsd (filename) - char *filename; -{ - if (filename_per_file && !filename_per_symbol) - printf ("\n%s:\n", filename); -} - -static void -print_object_filename_sysv (filename) - char *filename; -{ - if (undefined_only) - printf (_("\n\nUndefined symbols from %s:\n\n"), filename); - else - printf (_("\n\nSymbols from %s:\n\n"), filename); - printf (_("\ -Name Value Class Type Size Line Section\n\n")); -} - -static void -print_object_filename_posix (filename) - char *filename; -{ - if (filename_per_file && !filename_per_symbol) - printf ("%s:\n", filename); -} - -/* Print the name of an archive file given on the command line. */ - -static void -print_archive_filename_bsd (filename) - char *filename; -{ - if (filename_per_file) - printf ("\n%s:\n", filename); -} - -static void -print_archive_filename_sysv (filename) - char *filename ATTRIBUTE_UNUSED; -{ -} - -static void -print_archive_filename_posix (filename) - char *filename ATTRIBUTE_UNUSED; -{ -} - -/* Print the name of an archive member file. */ - -static void -print_archive_member_bsd (archive, filename) - char *archive ATTRIBUTE_UNUSED; - CONST char *filename; -{ - if (!filename_per_symbol) - printf ("\n%s:\n", filename); -} - -static void -print_archive_member_sysv (archive, filename) - char *archive; - CONST char *filename; -{ - if (undefined_only) - printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename); - else - printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename); - printf (_("\ -Name Value Class Type Size Line Section\n\n")); -} - -static void -print_archive_member_posix (archive, filename) - char *archive; - CONST char *filename; -{ - if (!filename_per_symbol) - printf ("%s[%s]:\n", archive, filename); -} - -/* Print the name of the file (and archive, if there is one) - containing a symbol. */ - -static void -print_symbol_filename_bsd (archive_bfd, abfd) - bfd *archive_bfd, *abfd; -{ - if (filename_per_symbol) - { - if (archive_bfd) - printf ("%s:", bfd_get_filename (archive_bfd)); - printf ("%s:", bfd_get_filename (abfd)); - } -} - -static void -print_symbol_filename_sysv (archive_bfd, abfd) - bfd *archive_bfd, *abfd; -{ - if (filename_per_symbol) - { - if (archive_bfd) - printf ("%s:", bfd_get_filename (archive_bfd)); - printf ("%s:", bfd_get_filename (abfd)); - } -} - -static void -print_symbol_filename_posix (archive_bfd, abfd) - bfd *archive_bfd, *abfd; -{ - if (filename_per_symbol) - { - if (archive_bfd) - printf ("%s[%s]: ", bfd_get_filename (archive_bfd), - bfd_get_filename (abfd)); - else - printf ("%s: ", bfd_get_filename (abfd)); - } -} - -/* Print a symbol value. */ - -static void -print_value (val) - bfd_vma val; -{ -#if ! defined (BFD64) || BFD_HOST_64BIT_LONG - printf (value_format, val); -#else - /* We have a 64 bit value to print, but the host is only 32 bit. */ - if (print_radix == 16) - fprintf_vma (stdout, val); - else - { - char buf[30]; - char *s; - - s = buf + sizeof buf; - *--s = '\0'; - while (val > 0) - { - *--s = (val % print_radix) + '0'; - val /= print_radix; - } - while ((buf + sizeof buf - 1) - s < 16) - *--s = '0'; - printf ("%s", s); - } -#endif -} - -/* Print a line of information about a symbol. */ - -static void -print_symbol_info_bsd (info, abfd) - symbol_info *info; - bfd *abfd; -{ - if (bfd_is_undefined_symclass (info->type)) - { - printf ("%*s", -#ifdef BFD64 - 16, -#else - 8, -#endif - ""); - } - else - print_value (info->value); - printf (" %c", info->type); - if (info->type == '-') - { - /* A stab. */ - printf (" "); - printf (other_format, info->stab_other); - printf (" "); - printf (desc_format, info->stab_desc); - printf (" %5s", info->stab_name); - } - print_symname (" %s", info->name, abfd); -} - -static void -print_symbol_info_sysv (info, abfd) - symbol_info *info; - bfd *abfd; -{ - print_symname ("%-20s|", info->name, abfd); /* Name */ - if (bfd_is_undefined_symclass (info->type)) - printf (" "); /* Value */ - else - print_value (info->value); - printf ("| %c |", info->type); /* Class */ - if (info->type == '-') - { - /* A stab. */ - printf ("%18s| ", info->stab_name); /* (C) Type */ - printf (desc_format, info->stab_desc); /* Size */ - printf ("| |"); /* Line, Section */ - } - else - printf (" | | |"); /* Type, Size, Line, Section */ -} - -static void -print_symbol_info_posix (info, abfd) - symbol_info *info; - bfd *abfd; -{ - print_symname ("%s ", info->name, abfd); - printf ("%c ", info->type); - if (bfd_is_undefined_symclass (info->type)) - printf (" "); - else - print_value (info->value); - /* POSIX.2 wants the symbol size printed here, when applicable; - BFD currently doesn't provide it, so we take the easy way out by - considering it to never be applicable. */ -} - -static void -print_symdef_entry (abfd) - bfd *abfd; -{ - symindex idx = BFD_NO_MORE_SYMBOLS; - carsym *thesym; - boolean everprinted = false; - - for (idx = bfd_get_next_mapent (abfd, idx, &thesym); - idx != BFD_NO_MORE_SYMBOLS; - idx = bfd_get_next_mapent (abfd, idx, &thesym)) - { - bfd *elt; - if (!everprinted) - { - printf (_("\nArchive index:\n")); - everprinted = true; - } - elt = bfd_get_elt_at_index (abfd, idx); - if (elt == NULL) - bfd_fatal ("bfd_get_elt_at_index"); - if (thesym->name != (char *) NULL) - { - print_symname ("%s", thesym->name, abfd); - printf (" in %s\n", bfd_get_filename (elt)); - } - } -} - -/* This function is used to get the relocs for a particular section. - It is called via bfd_map_over_sections. */ - -static void -get_relocs (abfd, sec, dataarg) - bfd *abfd; - asection *sec; - PTR dataarg; -{ - struct get_relocs_info *data = (struct get_relocs_info *) dataarg; - - *data->secs = sec; - - if ((sec->flags & SEC_RELOC) == 0) - { - *data->relocs = NULL; - *data->relcount = 0; - } - else - { - long relsize; - - relsize = bfd_get_reloc_upper_bound (abfd, sec); - if (relsize < 0) - bfd_fatal (bfd_get_filename (abfd)); - - *data->relocs = (arelent **) xmalloc (relsize); - *data->relcount = bfd_canonicalize_reloc (abfd, sec, *data->relocs, - data->syms); - if (*data->relcount < 0) - bfd_fatal (bfd_get_filename (abfd)); - } - - ++data->secs; - ++data->relocs; - ++data->relcount; -} diff --git a/binutils/not-ranlib.c b/binutils/not-ranlib.c deleted file mode 100644 index afb9ceb3d67..00000000000 --- a/binutils/not-ranlib.c +++ /dev/null @@ -1,3 +0,0 @@ -/* Linked with ar.o to flag that this program is 'ar' (not 'ranlib'). */ - -int is_ranlib = 0; diff --git a/binutils/not-strip.c b/binutils/not-strip.c deleted file mode 100644 index 98093ce391a..00000000000 --- a/binutils/not-strip.c +++ /dev/null @@ -1,4 +0,0 @@ -/* Linked with objcopy.o to flag that this program is 'objcopy' (not - 'strip'). */ - -int is_strip = 0; diff --git a/binutils/objcopy.1 b/binutils/objcopy.1 deleted file mode 100644 index 80ca21664aa..00000000000 --- a/binutils/objcopy.1 +++ /dev/null @@ -1,332 +0,0 @@ -.\" Copyright (c) 1991, 93, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH objcopy 1 "05 April 2000" "Cygnus Solutions" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -objcopy \- copy and translate object files - -.SH SYNOPSIS -.hy 0 -.na -.TP -.B objcopy -.RB "[\|" \-F\ \fIbfdname\fR\ |\ \fB\-\-target=\fIbfdname\fR "\|]" -.RB "[\|" \-I\ \fIbfdname\fR\ |\ \fB\-\-input\-target=\fIbfdname\fR "\|]" -.RB "[\|" \-O\ \fIbfdname\fR\ |\ \fB\-\-output\-target=\fIbfdname\fR "\|]" -.RB "[\|" \-j\ \fIsectionname\fR\ |\ \fB\-\-only\-section=\fIsectionname\fR "\|]" -.RB "[\|" \-R\ \fIsectionname\fR\ |\ \fB\-\-remove\-section=\fIsectionname\fR "\|]" -.RB "[\|" \-S\fR\ |\ \fB\-\-strip\-all\fR "\|]" -.RB "[\|" \-g\fR\ |\ \fB\-\-strip\-debug\fR "\|]" -.RB "[\|" \-\-strip\-unneeded\fR "\|]" -.RB "[\|" \-K\ \fIsymbolname\fR\ |\ \fB\-\-keep\-symbol=\fIsymbolname\fR "\|]" -.RB "[\|" \-N\ \fIsymbolname\fR\ |\ \fB\-\-strip\-symbol=\fIsymbolname\fR "\|]" -.RB "[\|" \-L\ \fIsymbolname\fR\ |\ \fB\-\-localize\-symbol=\fIsymbolname\fR "\|]" -.RB "[\|" \-W\ \fIsymbolname\fR\ |\ \fB\-\-weaken\-symbol=\fIsymbolname\fR "\|]" -.RB "[\|" \-x\fR\ |\ \fB\-\-discard\-all\fR "\|]" -.RB "[\|" \-X\fR\ |\ \fB\-\-discard\-locals\fR "\|]" -.RB "[\|" \-b\ \fIbyte\fR\ |\ \fB\-\-byte=\fIbyte\fR "\|]" -.RB "[\|" \-i\ \fIinterleave\fR\ |\ \fB\-\-interleave=\fIinterleave\fR "\|]" -.RB "[\|" \-p\fR\ |\ \fB\-\-preserve\-dates\fR "\|]" -.RB "[\|" \-\-debugging "\|]" -.RB "[\|" \-\-gap\-fill=\fIval\fR "\|]" -.RB "[\|" \-\-pad\-to=\fIaddress\fR "\|]" -.RB "[\|" \-\-set\-start=\fIval\fR "\|]" -.RB "[\|" \-\-change\-start=\fIincr\fR "\|]" -.RB "[\|" \-\-change\-addresses=\fIincr\fR "\|]" -.RB "[\|" \-\-change\-section\-address\ \fIsection{=,+,-}val\fR "\|]" -.RB "[\|" \-\-change\-section\-lma\ \fIsection{=,+,-}val\fR "\|]" -.RB "[\|" \-\-change\-section\-vma\ \fIsection{=,+,-}val\fR "\|]" -.RB "[\|" \-\-change\-warnings\fR "\|]" -.RB "[\|" \-\-no\-change\-warnings\fR "\|]" -.RB "[\|" \-\-set\-section\-flags\ \fIsection=flags\fR "\|]" -.RB "[\|" \-\-add\-section\ \fIsectionname=filename\fR "\|]" -.RB "[\|" \-\-change\-leading\-char\fR "\|]" -.RB "[\|" \-\-remove\-leading\-char\fR "\|]" -.RB "[\|" \-\-redefine\-sym\ \fIold=new\fR "\|]" -.RB "[\|" \-\-weaken\fR "\|]" -.RB "[\|" \-v\ |\ \-\-verbose\fR "\|]" -.RB "[\|" \-V\ |\ \-\-version\fR "\|]" -.RB "[\|" \-\-help\fR "\|]" -.B infile -.RB "[\|" outfile\fR "\|]" -.SH DESCRIPTION -The GNU -.B objcopy -utility copies the contents of an object file to another. -.B 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 -.B objcopy -is controlled by command-line options. -.PP -.B objcopy -creates temporary files to do its translations and deletes them -afterward. -.B objcopy -uses BFD to do all its translation work; it knows about all the -formats BFD knows about, and thus is able to recognize most formats -without being told explicitly. -.PP -.B objcopy -can be used to generate S-records by using an output target of -.B srec -(e.g., use -.B -O srec). -.PP -.B objcopy -can be used to generate a raw binary file by using an output target of -.B binary -(e.g., use -.B -O binary). -When -.B 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 -virtual 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 -.B -S -to remove sections containing debugging information. In some cases -.B -R -will be useful to remove sections which contain information which is -not needed by the binary file. -.PP -.I infile -and -.I outfile -are the source and output files respectively. If you do not specify -.IR outfile , -.B objcopy -creates a temporary file and destructively renames the result with the -name of the input file. - -.SH OPTIONS -.TP -.B \-I \fIbfdname\fR, \fB\-\-input\-target=\fIbfdname -Consider the source file's object format to be -.IR bfdname , -rather than attempting to deduce it. -.TP -.B \-O \fIbfdname\fR, \fB\-\-output\-target=\fIbfdname -Write the output file using the object format -.IR bfdname . -.TP -.B \-F \fIbfdname\fR, \fB\-\-target=\fIbfdname -Use -.I 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. -.TP -.B \-j \fIsectionname\fR, \fB\-\-only\-section=\fIsectionname -Copy only the named section from the input file to the output file, -discarding all other sections. This option may be given more than -once. Note that using this option inappropriately may make the output -file unusable. -.TP -.B \-R \fIsectionname\fR, \fB\-\-remove-section=\fIsectionname -Remove the named section from the file. This option may be given more -than once. Note that using this option inappropriately may make the -output file unusable. -.TP -.B \-S\fR, \fB\-\-strip\-all -Do not copy relocation and symbol information from the source file. -.TP -.B \-g\fR, \fB\-\-strip\-debug -Do not copy debugging symbols from the source file. -.TP -.B \-\-strip\-unneeded -Strip all symbols that are not needed for relocation processing. -.TP -.B \-K \fIsymbolname\fR, \fB\-\-keep\-symbol=\fIsymbolname -Copy only symbol \fIsymbolname\fP from the source file. This option -may be given more than once. -.TP -.B \-N \fIsymbolname\fR, \fB\-\-strip\-symbol=\fIsymbolname -Do not copy symbol \fIsymbolname\fP from the source file. This option -may be given more than once. -.TP -.B \-L \fIsymbolname\fR, \fB\-\-localize\-symbol=\fIsymbolname -Make symbol \fIsymbolname\fP local to the file, so that it is not -visible externally. This option may be given more than once. -.TP -.B \-W \fIsymbolname\fR, \fB\-\-weaken\-symbol=\fIsymbolname -Make symbol \fIsymbolname\fP weak. This option may be given more than once. -.TP -.B \-x\fR, \fB\-\-discard\-all -Do not copy non-global symbols from the source file. -.TP -.B \-X\fR, \fB\-\-discard\-locals -Do not copy compiler-generated local symbols. (These usually start -with "L" or "."). -.TP -.B \-b \fIbyte\fR, \fB\-\-byte=\fIbyte -Keep only every \fIbyte\fPth byte of the input file (header data is -not affected). \fIbyte\fP can be in the range from 0 to the -interleave-1. This option is useful for creating files to program -ROMs. It is typically used with an srec output target. -.TP -.B \-i \fIinterleave\fR, \fB\-\-interleave=\fIinterleave -Only copy one out of every \fIinterleave\fP bytes. Which one to copy is -selected by the \fB\-b\fP or \fB\-\-byte\fP option. The default is 4. -The interleave is ignored if neither \fB\-b\fP nor \fB\-\-byte\fP is given. -.TP -.B \-p\fR, \fB\-\-preserve\-dates -Set the access and modification dates of the output file to be the same -as those of the input file. -.TP -.B \-\-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. -.TP -.B \-\-gap\-fill=\fIval -Fill gaps between sections with \fIval\fP. This operation applies to -the \fIload address\fP (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 \fIval\fP. -.TP -.B \-\-pad\-to=\fIaddress -Pad the output file up to the load address \fIaddress\fP. 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\fP (default -zero). -.TP -.B \fB\-\-set\-start=\fIval -Set the start address of the new file to \fIval\fP. Not all object -file formats support setting the start address. -.TP -.B \fB\-\-change\-start=\fIincr\fR, \fB\-\-adjust\-start=\fIincr -Changes the start address by adding \fIincr\fP. Not all object file -formats support setting the start address. -.TP -.B \fB\-\-change\-addresses=\fIincr\fR, \fB\-\-adjust\-vma=\fIincr -Changes the address of all sections, as well as the start address, by -adding \fIincr\fP. 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. -.TP -.B \fB\-\-change\-section\-address\ \fIsection{=,+,-}val\fR, \fB\-\-adjust\-section\-vma\ \fIsection{=,+,-}val -Set or changes the VMA and LMA addresses of the named \fIsection\fP. -If \fI=\fP is used, the section address is set to \fIval\fP. -Otherwise, \fIval\fP is added to or subtracted from the section -address. See the comments under \fB\-\-change\-addresses\fP, above. If -\fIsection\fP does not exist in the input file, a warning will be -issued, unless \fB\-\-no\-change\-warnings\fP is used. -.TP -.B \fB\-\-change\-section\-lma\ \fIsection{=,+,-}val -Set or change the LMA address of the named \fIsection\fP. If \fI=\fP is -used, the section address is set to \fIval\fP. Otherwise, \fIval\fP -is added to or subtracted from the section address. See the comments -under \fB\-\-change\-addresses\fP, above. If \fIsection\fP does not exist -in the input file, a warning will be issued, unless -\fB\-\-no\-change\-warnings\fP is used. -.TP -.B \fB\-\-change\-section\-vma\ \fIsection{=,+,-}val -Set or change the VMA address of the named \fIsection\fP. If \fI=\fP is -used, the section address is set to \fIval\fP. Otherwise, \fIval\fP -is added to or subtracted from the section address. See the comments -under \fB\-\-change\-addresses\fP, above. If \fIsection\fP does not exist -in the input file, a warning will be issued, unless -\fB\-\-no\-change\-warnings\fP is used. -.TP -.B \fB\-\-change\-warnings\fR, \fB\-\-adjust\-warnings -If \fB\-\-change\-section\-XXX\fP is used, and the named section does -not exist, issue a warning. This is the default. -.TP -.B \fB\-\-no\-change\-warnings\fR, \fB\-\-no\-adjust\-warnings -Do not issue a warning if \fB\-\-change\-section\-XXX\fP is used, even -if the named section does not exist. -.TP -.B \fB\-\-set\-section\-flags\ \fIsection=flags -Set the flags for the named section. The \fIflags\fP argument is a -comma separated string of flag names. The recognized names are -\fIalloc\fP, \fIcontents\fP, \fIload\fP, \fInoload\fP, \fIreadonly\fP, -\fIcode\fP, \fIdata\fP, \fIrom\fP, \fIshare\fP, and \fIdebug\fP. Not -all flags are meaningful for all object file formats. -.TP -.B \fB\-\-add\-section\ \fIsectionname=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. -.TP -.B \-\-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 -.B 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. -.TP -.B \-\-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\fP because it always changes the symbol name -when appropriate, regardless of the object file format of the output -.TP -.B \-\-redefine\-sym\ \fIold=new -Change the name of 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. -.TP -.B \-\-weaken -Change all global symbols in the file to be weak. -.TP -.B \-v\fR, \fB\-\-verbose -Verbose output: list all object files modified. In the case of -archives, "\fBobjcopy \-V\fR" lists all members of the archive. -.TP -.B \-V\fR, \fB\-\-version -Show the version number of -.B objcopy -and exit. -.TP -.B \-\-help -Show a summary of the options to -.B objcopy -and exit. -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.B -info\c -\&; -.I -The GNU Binary Utilities\c -\&, Roland H. Pesch (June 1993). - -.SH COPYING -Copyright (c) 1993, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/binutils/objcopy.c b/binutils/objcopy.c deleted file mode 100644 index e8b710fa3bb..00000000000 --- a/binutils/objcopy.c +++ /dev/null @@ -1,2262 +0,0 @@ -/* objcopy.c -- copy object file from input to output, optionally massaging it. - Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 1999 - 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 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include "bfd.h" -#include "progress.h" -#include "bucomm.h" -#include "getopt.h" -#include "libiberty.h" -#include "budbg.h" -#include - -/* A list of symbols to explicitly strip out, or to keep. A linked - list is good enough for a small number from the command line, but - this will slow things down a lot if many symbols are being - deleted. */ - -struct symlist -{ - const char *name; - struct symlist *next; -}; - -/* A list to support redefine_sym. */ -struct redefine_node -{ - char *source; - char *target; - struct redefine_node *next; -}; - -static void copy_usage PARAMS ((FILE *, int)); -static void strip_usage PARAMS ((FILE *, int)); -static flagword parse_flags PARAMS ((const char *)); -static struct section_list *find_section_list PARAMS ((const char *, boolean)); -static void setup_section PARAMS ((bfd *, asection *, PTR)); -static void copy_section PARAMS ((bfd *, asection *, PTR)); -static void get_sections PARAMS ((bfd *, asection *, PTR)); -static int compare_section_lma PARAMS ((const PTR, const PTR)); -static void add_specific_symbol PARAMS ((const char *, struct symlist **)); -static boolean is_specified_symbol PARAMS ((const char *, struct symlist *)); -static boolean is_strip_section PARAMS ((bfd *, asection *)); -static unsigned int filter_symbols - PARAMS ((bfd *, bfd *, asymbol **, asymbol **, long)); -static void mark_symbols_used_in_relocations PARAMS ((bfd *, asection *, PTR)); -static void filter_bytes PARAMS ((char *, bfd_size_type *)); -static boolean write_debugging_info PARAMS ((bfd *, PTR, long *, asymbol ***)); -static void copy_object PARAMS ((bfd *, bfd *)); -static void copy_archive PARAMS ((bfd *, bfd *, const char *)); -static void copy_file - PARAMS ((const char *, const char *, const char *, const char *)); -static int strip_main PARAMS ((int, char **)); -static int copy_main PARAMS ((int, char **)); -static const char *lookup_sym_redefinition PARAMS((const char *)); -static void redefine_list_append PARAMS ((const char *, const char *)); - -#define RETURN_NONFATAL(s) {bfd_nonfatal (s); status = 1; return;} - -static asymbol **isympp = NULL; /* Input symbols */ -static asymbol **osympp = NULL; /* Output symbols that survive stripping */ - -/* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes. */ -static int copy_byte = -1; -static int interleave = 4; - -static boolean verbose; /* Print file and target names. */ -static boolean preserve_dates; /* Preserve input file timestamp. */ -static int status = 0; /* Exit status. */ - -enum strip_action - { - STRIP_UNDEF, - STRIP_NONE, /* don't strip */ - STRIP_DEBUG, /* strip all debugger symbols */ - STRIP_UNNEEDED, /* strip unnecessary symbols */ - STRIP_ALL /* strip all symbols */ - }; - -/* Which symbols to remove. */ -static enum strip_action strip_symbols; - -enum locals_action - { - LOCALS_UNDEF, - LOCALS_START_L, /* discard locals starting with L */ - LOCALS_ALL /* discard all locals */ - }; - -/* Which local symbols to remove. Overrides STRIP_ALL. */ -static enum locals_action discard_locals; - -/* What kind of change to perform. */ -enum change_action -{ - CHANGE_IGNORE, - CHANGE_MODIFY, - CHANGE_SET -}; - -/* Structure used to hold lists of sections and actions to take. */ -struct section_list -{ - struct section_list * next; /* Next section to change. */ - const char * name; /* Section name. */ - boolean used; /* Whether this entry was used. */ - boolean remove; /* Whether to remove this section. */ - boolean copy; /* Whether to copy this section. */ - enum change_action change_vma;/* Whether to change or set VMA. */ - bfd_vma vma_val; /* Amount to change by or set to. */ - enum change_action change_lma;/* Whether to change or set LMA. */ - bfd_vma lma_val; /* Amount to change by or set to. */ - boolean set_flags; /* Whether to set the section flags. */ - flagword flags; /* What to set the section flags to. */ -}; - -static struct section_list *change_sections; -static boolean sections_removed; -static boolean sections_copied; - -/* Changes to the start address. */ -static bfd_vma change_start = 0; -static boolean set_start_set = false; -static bfd_vma set_start; - -/* Changes to section addresses. */ -static bfd_vma change_section_address = 0; - -/* Filling gaps between sections. */ -static boolean gap_fill_set = false; -static bfd_byte gap_fill = 0; - -/* Pad to a given address. */ -static boolean pad_to_set = false; -static bfd_vma pad_to; - -/* List of sections to add. */ - -struct section_add -{ - /* Next section to add. */ - struct section_add *next; - /* Name of section to add. */ - const char *name; - /* Name of file holding section contents. */ - const char *filename; - /* Size of file. */ - size_t size; - /* Contents of file. */ - bfd_byte *contents; - /* BFD section, after it has been added. */ - asection *section; -}; - -static struct section_add *add_sections; - -/* Whether to convert debugging information. */ - -static boolean convert_debugging = false; - -/* Whether to change the leading character in symbol names. */ - -static boolean change_leading_char = false; - -/* Whether to remove the leading character from global symbol names. */ - -static boolean remove_leading_char = false; - -/* List of symbols to strip, keep, localize, weaken, or redefine. */ - -static struct symlist *strip_specific_list = NULL; -static struct symlist *keep_specific_list = NULL; -static struct symlist *localize_specific_list = NULL; -static struct symlist *weaken_specific_list = NULL; -static struct redefine_node *redefine_sym_list = NULL; - -/* If this is true, we weaken global symbols (set BSF_WEAK). */ - -static boolean weaken = false; - -/* 150 isn't special; it's just an arbitrary non-ASCII char value. */ - -#define OPTION_ADD_SECTION 150 -#define OPTION_CHANGE_ADDRESSES (OPTION_ADD_SECTION + 1) -#define OPTION_CHANGE_LEADING_CHAR (OPTION_CHANGE_ADDRESSES + 1) -#define OPTION_CHANGE_START (OPTION_CHANGE_LEADING_CHAR + 1) -#define OPTION_CHANGE_SECTION_ADDRESS (OPTION_CHANGE_START + 1) -#define OPTION_CHANGE_SECTION_LMA (OPTION_CHANGE_SECTION_ADDRESS + 1) -#define OPTION_CHANGE_SECTION_VMA (OPTION_CHANGE_SECTION_LMA + 1) -#define OPTION_CHANGE_WARNINGS (OPTION_CHANGE_SECTION_VMA + 1) -#define OPTION_DEBUGGING (OPTION_CHANGE_WARNINGS + 1) -#define OPTION_GAP_FILL (OPTION_DEBUGGING + 1) -#define OPTION_NO_CHANGE_WARNINGS (OPTION_GAP_FILL + 1) -#define OPTION_PAD_TO (OPTION_NO_CHANGE_WARNINGS + 1) -#define OPTION_REMOVE_LEADING_CHAR (OPTION_PAD_TO + 1) -#define OPTION_SET_SECTION_FLAGS (OPTION_REMOVE_LEADING_CHAR + 1) -#define OPTION_SET_START (OPTION_SET_SECTION_FLAGS + 1) -#define OPTION_STRIP_UNNEEDED (OPTION_SET_START + 1) -#define OPTION_WEAKEN (OPTION_STRIP_UNNEEDED + 1) -#define OPTION_REDEFINE_SYM (OPTION_WEAKEN + 1) - -/* Options to handle if running as "strip". */ - -static struct option strip_options[] = -{ - {"discard-all", no_argument, 0, 'x'}, - {"discard-locals", no_argument, 0, 'X'}, - {"format", required_argument, 0, 'F'}, /* Obsolete */ - {"help", no_argument, 0, 'h'}, - {"input-format", required_argument, 0, 'I'}, /* Obsolete */ - {"input-target", required_argument, 0, 'I'}, - {"keep-symbol", required_argument, 0, 'K'}, - {"output-format", required_argument, 0, 'O'}, /* Obsolete */ - {"output-target", required_argument, 0, 'O'}, - {"preserve-dates", no_argument, 0, 'p'}, - {"remove-section", required_argument, 0, 'R'}, - {"strip-all", no_argument, 0, 's'}, - {"strip-debug", no_argument, 0, 'S'}, - {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED}, - {"strip-symbol", required_argument, 0, 'N'}, - {"target", required_argument, 0, 'F'}, - {"verbose", no_argument, 0, 'v'}, - {"version", no_argument, 0, 'V'}, - {0, no_argument, 0, 0} -}; - -/* Options to handle if running as "objcopy". */ - -static struct option copy_options[] = -{ - {"add-section", required_argument, 0, OPTION_ADD_SECTION}, - {"adjust-start", required_argument, 0, OPTION_CHANGE_START}, - {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES}, - {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS}, - {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS}, - {"byte", required_argument, 0, 'b'}, - {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES}, - {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR}, - {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS}, - {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA}, - {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA}, - {"change-start", required_argument, 0, OPTION_CHANGE_START}, - {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS}, - {"debugging", no_argument, 0, OPTION_DEBUGGING}, - {"discard-all", no_argument, 0, 'x'}, - {"discard-locals", no_argument, 0, 'X'}, - {"only-section", required_argument, 0, 'j'}, - {"format", required_argument, 0, 'F'}, /* Obsolete */ - {"gap-fill", required_argument, 0, OPTION_GAP_FILL}, - {"help", no_argument, 0, 'h'}, - {"input-format", required_argument, 0, 'I'}, /* Obsolete */ - {"input-target", required_argument, 0, 'I'}, - {"interleave", required_argument, 0, 'i'}, - {"keep-symbol", required_argument, 0, 'K'}, - {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS}, - {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS}, - {"output-format", required_argument, 0, 'O'}, /* Obsolete */ - {"output-target", required_argument, 0, 'O'}, - {"pad-to", required_argument, 0, OPTION_PAD_TO}, - {"preserve-dates", no_argument, 0, 'p'}, - {"localize-symbol", required_argument, 0, 'L'}, - {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR}, - {"remove-section", required_argument, 0, 'R'}, - {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS}, - {"set-start", required_argument, 0, OPTION_SET_START}, - {"strip-all", no_argument, 0, 'S'}, - {"strip-debug", no_argument, 0, 'g'}, - {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED}, - {"strip-symbol", required_argument, 0, 'N'}, - {"target", required_argument, 0, 'F'}, - {"verbose", no_argument, 0, 'v'}, - {"version", no_argument, 0, 'V'}, - {"weaken", no_argument, 0, OPTION_WEAKEN}, - {"weaken-symbol", required_argument, 0, 'W'}, - {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM}, - {0, no_argument, 0, 0} -}; - -/* IMPORTS */ -extern char *program_name; - -/* This flag distinguishes between strip and objcopy: - 1 means this is 'strip'; 0 means this is 'objcopy'. - -1 means if we should use argv[0] to decide. */ -extern int is_strip; - - -static void -copy_usage (stream, exit_status) - FILE *stream; - int exit_status; -{ - fprintf (stream, _("Usage: %s in-file [out-file]\n"), program_name); - fprintf (stream, _(" The switches are:\n")); - fprintf (stream, _("\ - -I --input-target Assume input file is in format \n\ - -O --output-target Create an output file in format \n\ - -F --target Set both input and output format to \n\ - --debugging Convert debugging information, if possible\n\ - -p --preserve-dates Copy modified/access timestamps to the output\n\ - -j --only-section Only copy section into the output\n\ - -R --remove-section Remove section from the output\n\ - -S --strip-all Remove all symbol and relocation information\n\ - -g --strip-debug Remove all debugging symbols\n\ - --strip-unneeded Remove all symbols not needed by relocations\n\ - -N --strip-symbol Do not copy symbol \n\ - -K --keep-symbol Only copy symbol \n\ - -L --localize-symbol Force symbol to be marked as a local\n\ - -W --weaken-symbol Force symbol to be marked as a weak\n\ - --weaken Force all global symbols to be marked as weak\n\ - -x --discard-all Remove all non-global symbols\n\ - -X --discard-locals Remove any compiler-generated symbols\n\ - -i --interleave Only copy one out of every bytes\n\ - -b --byte Select byte in every interleaved block\n\ - --gap-fill Fill gaps between sections with \n\ - --pad-to Pad the last section up to address \n\ - --set-start Set the start address to \n\ - {--change-start|--adjust-start} \n\ - Add to the start address\n\ - {--change-addresses|--adjust-vma} \n\ - Add to LMA, VMA and start addresses\n\ - {--change-section-address|--adjust-section-vma} {=|+|-}\n\ - Change LMA and VMA of section by \n\ - --change-section-lma {=|+|-}\n\ - Change the LMA of section by \n\ - --change-section-vma {=|+|-}\n\ - Change the VMA of section by \n\ - {--[no-]change-warnings|--[no-]adjust-warnings}\n\ - Warn if a named section does not exist\n\ - --set-section-flags =\n\ - Set section 's properties to \n\ - --add-section = Add section found in to output\n\ - --change-leading-char Force output format's leading character style\n\ - --remove-leading-char Remove leading character from global symbols\n\ - --redefine-sym = Redefine symbol name to \n\ - -v --verbose List all object files modified\n\ - -V --version Display this program's version number\n\ - -h --help Display this output\n\ -")); - list_supported_targets (program_name, stream); - if (exit_status == 0) - fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); - exit (exit_status); -} - -static void -strip_usage (stream, exit_status) - FILE *stream; - int exit_status; -{ - fprintf (stream, _("Usage: %s in-file(s)\n"), program_name); - fprintf (stream, _(" The switches are:\n")); - fprintf (stream, _("\ - -I --input-target Assume input file is in format \n\ - -O --output-target Create an output file in format \n\ - -F --target Set both input and output format to \n\ - -p --preserve-dates Copy modified/access timestamps to the output\n\ - -R --remove-section Remove section from the output\n\ - -s --strip-all Remove all symbol and relocation information\n\ - -g -S --strip-debug Remove all debugging symbols\n\ - --strip-unneeded Remove all symbols not needed by relocations\n\ - -N --strip-symbol Do not copy symbol \n\ - -K --keep-symbol Only copy symbol \n\ - -x --discard-all Remove all non-global symbols\n\ - -X --discard-locals Remove any compiler-generated symbols\n\ - -v --verbose List all object files modified\n\ - -V --version Display this program's version number\n\ - -h --help Display this output\n\ - -o Place stripped output into \n\ -")); - - list_supported_targets (program_name, stream); - if (exit_status == 0) - fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); - exit (exit_status); -} - -/* Parse section flags into a flagword, with a fatal error if the - string can't be parsed. */ - -static flagword -parse_flags (s) - const char *s; -{ - flagword ret; - const char *snext; - int len; - - ret = SEC_NO_FLAGS; - - do - { - snext = strchr (s, ','); - if (snext == NULL) - len = strlen (s); - else - { - len = snext - s; - ++snext; - } - - if (0) ; -#define PARSE_FLAG(fname,fval) \ - else if (strncasecmp (fname, s, len) == 0) ret |= fval - PARSE_FLAG ("alloc", SEC_ALLOC); - PARSE_FLAG ("load", SEC_LOAD); - PARSE_FLAG ("noload", SEC_NEVER_LOAD); - PARSE_FLAG ("readonly", SEC_READONLY); - PARSE_FLAG ("debug", SEC_DEBUGGING); - PARSE_FLAG ("code", SEC_CODE); - PARSE_FLAG ("data", SEC_DATA); - PARSE_FLAG ("rom", SEC_ROM); - PARSE_FLAG ("share", SEC_SHARED); - PARSE_FLAG ("contents", SEC_HAS_CONTENTS); -#undef PARSE_FLAG - else - { - char *copy; - - copy = xmalloc (len + 1); - strncpy (copy, s, len); - copy[len] = '\0'; - non_fatal (_("unrecognized section flag `%s'"), copy); - fatal (_("supported flags: %s"), - "alloc, load, noload, readonly, debug, code, data, rom, share, contents"); - } - - s = snext; - } - while (s != NULL); - - return ret; -} - -/* Find and optionally add an entry in the change_sections list. */ - -static struct section_list * -find_section_list (name, add) - const char *name; - boolean add; -{ - register struct section_list *p; - - for (p = change_sections; p != NULL; p = p->next) - if (strcmp (p->name, name) == 0) - return p; - - if (! add) - return NULL; - - p = (struct section_list *) xmalloc (sizeof (struct section_list)); - p->name = name; - p->used = false; - p->remove = false; - p->copy = false; - p->change_vma = CHANGE_IGNORE; - p->change_lma = CHANGE_IGNORE; - p->vma_val = 0; - p->lma_val = 0; - p->set_flags = false; - p->flags = 0; - - p->next = change_sections; - change_sections = p; - - return p; -} - -/* Add a symbol to strip_specific_list. */ - -static void -add_specific_symbol (name, list) - const char *name; - struct symlist **list; -{ - struct symlist *tmp_list; - - tmp_list = (struct symlist *) xmalloc (sizeof (struct symlist)); - tmp_list->name = name; - tmp_list->next = *list; - *list = tmp_list; -} - -/* See whether a symbol should be stripped or kept based on - strip_specific_list and keep_symbols. */ - -static boolean -is_specified_symbol (name, list) - const char *name; - struct symlist *list; -{ - struct symlist *tmp_list; - - for (tmp_list = list; tmp_list; tmp_list = tmp_list->next) - { - if (strcmp (name, tmp_list->name) == 0) - return true; - } - return false; -} - -/* See if a section is being removed. */ - -static boolean -is_strip_section (abfd, sec) - bfd *abfd ATTRIBUTE_UNUSED; - asection *sec; -{ - struct section_list *p; - - if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0 - && (strip_symbols == STRIP_DEBUG - || strip_symbols == STRIP_UNNEEDED - || strip_symbols == STRIP_ALL - || discard_locals == LOCALS_ALL - || convert_debugging)) - return true; - - if (! sections_removed && ! sections_copied) - return false; - - p = find_section_list (bfd_get_section_name (abfd, sec), false); - if (sections_removed && p != NULL && p->remove) - return true; - if (sections_copied && (p == NULL || ! p->copy)) - return true; - return false; -} - -/* Choose which symbol entries to copy; put the result in OSYMS. - We don't copy in place, because that confuses the relocs. - Return the number of symbols to print. */ - -static unsigned int -filter_symbols (abfd, obfd, osyms, isyms, symcount) - bfd *abfd; - bfd *obfd; - asymbol **osyms, **isyms; - long symcount; -{ - register asymbol **from = isyms, **to = osyms; - long src_count = 0, dst_count = 0; - - for (; src_count < symcount; src_count++) - { - asymbol *sym = from[src_count]; - flagword flags = sym->flags; - const char *name = bfd_asymbol_name (sym); - int keep; - - if (redefine_sym_list) - { - const char *old_name, *new_name; - - old_name = bfd_asymbol_name (sym); - new_name = lookup_sym_redefinition (old_name); - name = bfd_asymbol_name (sym) = new_name; - } - - if (change_leading_char - && (bfd_get_symbol_leading_char (abfd) - != bfd_get_symbol_leading_char (obfd)) - && (bfd_get_symbol_leading_char (abfd) == '\0' - || (name[0] == bfd_get_symbol_leading_char (abfd)))) - { - if (bfd_get_symbol_leading_char (obfd) == '\0') - name = bfd_asymbol_name (sym) = name + 1; - else - { - char *n; - - n = xmalloc (strlen (name) + 2); - n[0] = bfd_get_symbol_leading_char (obfd); - if (bfd_get_symbol_leading_char (abfd) == '\0') - strcpy (n + 1, name); - else - strcpy (n + 1, name + 1); - name = bfd_asymbol_name (sym) = n; - } - } - - if (remove_leading_char - && ((flags & BSF_GLOBAL) != 0 - || (flags & BSF_WEAK) != 0 - || bfd_is_und_section (bfd_get_section (sym)) - || bfd_is_com_section (bfd_get_section (sym))) - && name[0] == bfd_get_symbol_leading_char (abfd)) - name = bfd_asymbol_name (sym) = name + 1; - - if (strip_symbols == STRIP_ALL) - keep = 0; - else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */ - || ((flags & BSF_SECTION_SYM) != 0 - && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags - & BSF_KEEP) != 0)) - keep = 1; - else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */ - || (flags & BSF_WEAK) != 0 - || bfd_is_und_section (bfd_get_section (sym)) - || bfd_is_com_section (bfd_get_section (sym))) - keep = strip_symbols != STRIP_UNNEEDED; - else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */ - keep = (strip_symbols != STRIP_DEBUG - && strip_symbols != STRIP_UNNEEDED - && ! convert_debugging); - else /* Local symbol. */ - keep = (strip_symbols != STRIP_UNNEEDED - && (discard_locals != LOCALS_ALL - && (discard_locals != LOCALS_START_L - || ! bfd_is_local_label (abfd, sym)))); - - if (keep && is_specified_symbol (name, strip_specific_list)) - keep = 0; - if (!keep && is_specified_symbol (name, keep_specific_list)) - keep = 1; - if (keep && is_strip_section (abfd, bfd_get_section (sym))) - keep = 0; - - if (keep && (flags & BSF_GLOBAL) != 0 - && (weaken || is_specified_symbol (name, weaken_specific_list))) - { - sym->flags &=~ BSF_GLOBAL; - sym->flags |= BSF_WEAK; - } - if (keep && (flags & (BSF_GLOBAL | BSF_WEAK)) - && is_specified_symbol (name, localize_specific_list)) - { - sym->flags &= ~(BSF_GLOBAL | BSF_WEAK); - sym->flags |= BSF_LOCAL; - } - - if (keep) - to[dst_count++] = sym; - } - - to[dst_count] = NULL; - - return dst_count; -} - -static const char * -lookup_sym_redefinition (source) - const char *source; -{ - const char *result; - struct redefine_node *list; - - result = source; - - for (list = redefine_sym_list; list != NULL; list = list->next) - { - if (strcmp (source, list->source) == 0) - { - result = list->target; - break; - } - } - return result; -} - -/* Add a node to a symbol redefine list */ - -static void -redefine_list_append (source, target) - const char *source; - const char *target; -{ - struct redefine_node **p; - struct redefine_node *list; - struct redefine_node *new_node; - - for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next) - { - if (strcmp (source, list->source) == 0) - { - fatal (_("%s: Multiple redefinition of symbol \"%s\""), - "--redefine-sym", - source); - } - - if (strcmp (target, list->target) == 0) - { - fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"), - "--redefine-sym", - target); - } - } - - new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node)); - - new_node->source = strdup (source); - new_node->target = strdup (target); - new_node->next = NULL; - - *p = new_node; -} - - -/* Keep only every `copy_byte'th byte in MEMHUNK, which is *SIZE bytes long. - Adjust *SIZE. */ - -static void -filter_bytes (memhunk, size) - char *memhunk; - bfd_size_type *size; -{ - char *from = memhunk + copy_byte, *to = memhunk, *end = memhunk + *size; - - for (; from < end; from += interleave) - *to++ = *from; - if (*size % interleave > (bfd_size_type) copy_byte) - *size = (*size / interleave) + 1; - else - *size /= interleave; -} - -/* Copy object file IBFD onto OBFD. */ - -static void -copy_object (ibfd, obfd) - bfd *ibfd; - bfd *obfd; -{ - bfd_vma start; - long symcount; - asection **osections = NULL; - bfd_size_type *gaps = NULL; - bfd_size_type max_gap = 0; - long symsize; - PTR dhandle; - - - if (!bfd_set_format (obfd, bfd_get_format (ibfd))) - RETURN_NONFATAL (bfd_get_filename (obfd)); - - if (verbose) - printf (_("copy from %s(%s) to %s(%s)\n"), - bfd_get_filename (ibfd), bfd_get_target (ibfd), - bfd_get_filename (obfd), bfd_get_target (obfd)); - - if (set_start_set) - start = set_start; - else - start = bfd_get_start_address (ibfd); - start += change_start; - - if (!bfd_set_start_address (obfd, start) - || !bfd_set_file_flags (obfd, - (bfd_get_file_flags (ibfd) - & bfd_applicable_file_flags (obfd)))) - RETURN_NONFATAL (bfd_get_filename (ibfd)); - - /* Copy architecture of input file to output file */ - if (!bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), - bfd_get_mach (ibfd))) - non_fatal (_("Warning: Output file cannot represent architecture %s"), - bfd_printable_arch_mach (bfd_get_arch (ibfd), - bfd_get_mach (ibfd))); - - if (!bfd_set_format (obfd, bfd_get_format (ibfd))) - RETURN_NONFATAL (bfd_get_filename (ibfd)); - - if (isympp) - free (isympp); - - if (osympp != isympp) - free (osympp); - - /* BFD mandates that all output sections be created and sizes set before - any output is done. Thus, we traverse all sections multiple times. */ - bfd_map_over_sections (ibfd, setup_section, (void *) obfd); - - if (add_sections != NULL) - { - struct section_add *padd; - struct section_list *pset; - - for (padd = add_sections; padd != NULL; padd = padd->next) - { - padd->section = bfd_make_section (obfd, padd->name); - if (padd->section == NULL) - { - non_fatal (_("can't create section `%s': %s"), - padd->name, bfd_errmsg (bfd_get_error ())); - status = 1; - return; - } - else - { - flagword flags; - - if (! bfd_set_section_size (obfd, padd->section, padd->size)) - RETURN_NONFATAL (bfd_get_filename (obfd)); - - pset = find_section_list (padd->name, false); - if (pset != NULL) - pset->used = true; - - if (pset != NULL && pset->set_flags) - flags = pset->flags | SEC_HAS_CONTENTS; - else - flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA; - - if (! bfd_set_section_flags (obfd, padd->section, flags)) - RETURN_NONFATAL (bfd_get_filename (obfd)); - - if (pset != NULL) - { - if (pset->change_vma != CHANGE_IGNORE) - if (! bfd_set_section_vma (obfd, padd->section, pset->vma_val)) - RETURN_NONFATAL (bfd_get_filename (obfd)); - - if (pset->change_lma != CHANGE_IGNORE) - { - padd->section->lma = pset->lma_val; - - if (! bfd_set_section_alignment - (obfd, padd->section, - bfd_section_alignment (obfd, padd->section))) - RETURN_NONFATAL (bfd_get_filename (obfd)); - } - } - } - } - } - - if (gap_fill_set || pad_to_set) - { - asection **set; - unsigned int c, i; - - /* We must fill in gaps between the sections and/or we must pad - the last section to a specified address. We do this by - grabbing a list of the sections, sorting them by VMA, and - increasing the section sizes as required to fill the gaps. - We write out the gap contents below. */ - - c = bfd_count_sections (obfd); - osections = (asection **) xmalloc (c * sizeof (asection *)); - set = osections; - bfd_map_over_sections (obfd, get_sections, (void *) &set); - - qsort (osections, c, sizeof (asection *), compare_section_lma); - - gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type)); - memset (gaps, 0, c * sizeof (bfd_size_type)); - - if (gap_fill_set) - { - for (i = 0; i < c - 1; i++) - { - flagword flags; - bfd_size_type size; - bfd_vma gap_start, gap_stop; - - flags = bfd_get_section_flags (obfd, osections[i]); - if ((flags & SEC_HAS_CONTENTS) == 0 - || (flags & SEC_LOAD) == 0) - continue; - - size = bfd_section_size (obfd, osections[i]); - gap_start = bfd_section_lma (obfd, osections[i]) + size; - gap_stop = bfd_section_lma (obfd, osections[i + 1]); - if (gap_start < gap_stop) - { - if (! bfd_set_section_size (obfd, osections[i], - size + (gap_stop - gap_start))) - { - non_fatal (_("Can't fill gap after %s: %s"), - bfd_get_section_name (obfd, osections[i]), - bfd_errmsg (bfd_get_error ())); - status = 1; - break; - } - gaps[i] = gap_stop - gap_start; - if (max_gap < gap_stop - gap_start) - max_gap = gap_stop - gap_start; - } - } - } - - if (pad_to_set) - { - bfd_vma lma; - bfd_size_type size; - - lma = bfd_section_lma (obfd, osections[c - 1]); - size = bfd_section_size (obfd, osections[c - 1]); - if (lma + size < pad_to) - { - if (! bfd_set_section_size (obfd, osections[c - 1], - pad_to - lma)) - { - non_fatal (_("Can't add padding to %s: %s"), - bfd_get_section_name (obfd, osections[c - 1]), - bfd_errmsg (bfd_get_error ())); - status = 1; - } - else - { - gaps[c - 1] = pad_to - (lma + size); - if (max_gap < pad_to - (lma + size)) - max_gap = pad_to - (lma + size); - } - } - } - } - - /* Symbol filtering must happen after the output sections have - been created, but before their contents are set. */ - dhandle = NULL; - symsize = bfd_get_symtab_upper_bound (ibfd); - if (symsize < 0) - RETURN_NONFATAL (bfd_get_filename (ibfd)); - - osympp = isympp = (asymbol **) xmalloc (symsize); - symcount = bfd_canonicalize_symtab (ibfd, isympp); - if (symcount < 0) - RETURN_NONFATAL (bfd_get_filename (ibfd)); - - if (convert_debugging) - dhandle = read_debugging_info (ibfd, isympp, symcount); - - if (strip_symbols == STRIP_DEBUG - || strip_symbols == STRIP_ALL - || strip_symbols == STRIP_UNNEEDED - || discard_locals != LOCALS_UNDEF - || strip_specific_list != NULL - || keep_specific_list != NULL - || localize_specific_list != NULL - || weaken_specific_list != NULL - || sections_removed - || sections_copied - || convert_debugging - || change_leading_char - || remove_leading_char - || redefine_sym_list - || weaken) - { - /* Mark symbols used in output relocations so that they - are kept, even if they are local labels or static symbols. - - Note we iterate over the input sections examining their - relocations since the relocations for the output sections - haven't been set yet. mark_symbols_used_in_relocations will - ignore input sections which have no corresponding output - section. */ - if (strip_symbols != STRIP_ALL) - bfd_map_over_sections (ibfd, - mark_symbols_used_in_relocations, - (PTR)isympp); - osympp = (asymbol **) xmalloc ((symcount + 1) * sizeof (asymbol *)); - symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount); - } - - if (convert_debugging && dhandle != NULL) - { - if (! write_debugging_info (obfd, dhandle, &symcount, &osympp)) - { - status = 1; - return; - } - } - - bfd_set_symtab (obfd, osympp, symcount); - - /* This has to happen after the symbol table has been set. */ - bfd_map_over_sections (ibfd, copy_section, (void *) obfd); - - if (add_sections != NULL) - { - struct section_add *padd; - - for (padd = add_sections; padd != NULL; padd = padd->next) - { - if (! bfd_set_section_contents (obfd, padd->section, - (PTR) padd->contents, - (file_ptr) 0, - (bfd_size_type) padd->size)) - RETURN_NONFATAL (bfd_get_filename (obfd)); - } - } - - if (gap_fill_set || pad_to_set) - { - bfd_byte *buf; - int c, i; - - /* Fill in the gaps. */ - - if (max_gap > 8192) - max_gap = 8192; - buf = (bfd_byte *) xmalloc (max_gap); - memset (buf, gap_fill, (size_t) max_gap); - - c = bfd_count_sections (obfd); - for (i = 0; i < c; i++) - { - if (gaps[i] != 0) - { - bfd_size_type left; - file_ptr off; - - left = gaps[i]; - off = bfd_section_size (obfd, osections[i]) - left; - while (left > 0) - { - bfd_size_type now; - - if (left > 8192) - now = 8192; - else - now = left; - - if (! bfd_set_section_contents (obfd, osections[i], buf, - off, now)) - RETURN_NONFATAL (bfd_get_filename (obfd)); - - left -= now; - off += now; - } - } - } - } - - /* Allow the BFD backend to copy any private data it understands - from the input BFD to the output BFD. This is done last to - permit the routine to look at the filtered symbol table, which is - important for the ECOFF code at least. */ - if (!bfd_copy_private_bfd_data (ibfd, obfd)) - { - non_fatal (_("%s: error copying private BFD data: %s"), - bfd_get_filename (obfd), - bfd_errmsg (bfd_get_error ())); - status = 1; - return; - } -} - -/* Read each archive element in turn from IBFD, copy the - contents to temp file, and keep the temp file handle. */ - -static void -copy_archive (ibfd, obfd, output_target) - bfd *ibfd; - bfd *obfd; - const char *output_target; -{ - struct name_list - { - struct name_list *next; - char *name; - bfd *obfd; - } *list, *l; - bfd **ptr = &obfd->archive_head; - bfd *this_element; - char *dir = make_tempname (bfd_get_filename (obfd)); - - /* Make a temp directory to hold the contents. */ -#if defined (_WIN32) && !defined (__CYGWIN32__) - if (mkdir (dir) != 0) -#else - if (mkdir (dir, 0700) != 0) -#endif - { - fatal (_("cannot mkdir %s for archive copying (error: %s)"), - dir, strerror (errno)); - } - obfd->has_armap = ibfd->has_armap; - - list = NULL; - - this_element = bfd_openr_next_archived_file (ibfd, NULL); - while (!status && this_element != (bfd *) NULL) - { - /* Create an output file for this member. */ - char *output_name = concat (dir, "/", bfd_get_filename (this_element), - (char *) NULL); - bfd *output_bfd = bfd_openw (output_name, output_target); - bfd *last_element; - struct stat buf; - int stat_status = 0; - - if (preserve_dates) - { - stat_status = bfd_stat_arch_elt (this_element, &buf); - if (stat_status != 0) - non_fatal (_("internal stat error on %s"), - bfd_get_filename (this_element)); - } - - l = (struct name_list *) xmalloc (sizeof (struct name_list)); - l->name = output_name; - l->next = list; - list = l; - - if (output_bfd == (bfd *) NULL) - RETURN_NONFATAL (output_name); - - if (!bfd_set_format (obfd, bfd_get_format (ibfd))) - RETURN_NONFATAL (bfd_get_filename (obfd)); - - if (bfd_check_format (this_element, bfd_object) == true) - copy_object (this_element, output_bfd); - - if (!bfd_close (output_bfd)) - { - bfd_nonfatal (bfd_get_filename (output_bfd)); - /* Error in new object file. Don't change archive. */ - status = 1; - } - - if (preserve_dates && stat_status == 0) - set_times (output_name, &buf); - - /* Open the newly output file and attach to our list. */ - output_bfd = bfd_openr (output_name, output_target); - - l->obfd = output_bfd; - - *ptr = output_bfd; - ptr = &output_bfd->next; - - last_element = this_element; - - this_element = bfd_openr_next_archived_file (ibfd, last_element); - - bfd_close (last_element); - } - *ptr = (bfd *) NULL; - - if (!bfd_close (obfd)) - RETURN_NONFATAL (bfd_get_filename (obfd)); - - if (!bfd_close (ibfd)) - RETURN_NONFATAL (bfd_get_filename (ibfd)); - - /* Delete all the files that we opened. */ - for (l = list; l != NULL; l = l->next) - { - bfd_close (l->obfd); - unlink (l->name); - } - rmdir (dir); -} - -/* The top-level control. */ - -static void -copy_file (input_filename, output_filename, input_target, output_target) - const char *input_filename; - const char *output_filename; - const char *input_target; - const char *output_target; -{ - bfd *ibfd; - char **matching; - - /* To allow us to do "strip *" without dying on the first - non-object file, failures are nonfatal. */ - - ibfd = bfd_openr (input_filename, input_target); - if (ibfd == NULL) - RETURN_NONFATAL (input_filename); - - if (bfd_check_format (ibfd, bfd_archive)) - { - bfd *obfd; - - /* bfd_get_target does not return the correct value until - bfd_check_format succeeds. */ - if (output_target == NULL) - output_target = bfd_get_target (ibfd); - - obfd = bfd_openw (output_filename, output_target); - if (obfd == NULL) - RETURN_NONFATAL (output_filename); - - copy_archive (ibfd, obfd, output_target); - } - else if (bfd_check_format_matches (ibfd, bfd_object, &matching)) - { - bfd *obfd; - - /* bfd_get_target does not return the correct value until - bfd_check_format succeeds. */ - if (output_target == NULL) - output_target = bfd_get_target (ibfd); - - obfd = bfd_openw (output_filename, output_target); - if (obfd == NULL) - RETURN_NONFATAL (output_filename); - - copy_object (ibfd, obfd); - - if (!bfd_close (obfd)) - RETURN_NONFATAL (output_filename); - - if (!bfd_close (ibfd)) - RETURN_NONFATAL (input_filename); - } - else - { - bfd_nonfatal (input_filename); - - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } - - status = 1; - } -} - -/* Create a section in OBFD with the same name and attributes - as ISECTION in IBFD. */ - -static void -setup_section (ibfd, isection, obfdarg) - bfd *ibfd; - sec_ptr isection; - PTR obfdarg; -{ - bfd *obfd = (bfd *) obfdarg; - struct section_list *p; - sec_ptr osection; - bfd_size_type size; - bfd_vma vma; - bfd_vma lma; - flagword flags; - char *err; - - if ((bfd_get_section_flags (ibfd, isection) & SEC_DEBUGGING) != 0 - && (strip_symbols == STRIP_DEBUG - || strip_symbols == STRIP_UNNEEDED - || strip_symbols == STRIP_ALL - || discard_locals == LOCALS_ALL - || convert_debugging)) - return; - - p = find_section_list (bfd_section_name (ibfd, isection), false); - if (p != NULL) - p->used = true; - - if (sections_removed && p != NULL && p->remove) - return; - if (sections_copied && (p == NULL || ! p->copy)) - return; - - osection = bfd_make_section_anyway (obfd, bfd_section_name (ibfd, isection)); - - if (osection == NULL) - { - err = "making"; - goto loser; - } - - size = bfd_section_size (ibfd, isection); - if (copy_byte >= 0) - size = (size + interleave - 1) / interleave; - if (! bfd_set_section_size (obfd, osection, size)) - { - err = "size"; - goto loser; - } - - vma = bfd_section_vma (ibfd, isection); - if (p != NULL && p->change_vma == CHANGE_MODIFY) - vma += p->vma_val; - else if (p != NULL && p->change_vma == CHANGE_SET) - vma = p->vma_val; - else - vma += change_section_address; - - if (! bfd_set_section_vma (obfd, osection, vma)) - { - err = "vma"; - goto loser; - } - - lma = isection->lma; - if ((p != NULL) && p->change_lma != CHANGE_IGNORE) - { - if (p->change_lma == CHANGE_MODIFY) - lma += p->lma_val; - else if (p->change_lma == CHANGE_SET) - lma = p->lma_val; - else - abort (); - } - else - lma += change_section_address; - - osection->lma = lma; - - /* FIXME: This is probably not enough. If we change the LMA we - may have to recompute the header for the file as well. */ - if (bfd_set_section_alignment (obfd, - osection, - bfd_section_alignment (ibfd, isection)) - == false) - { - err = "alignment"; - goto loser; - } - - flags = bfd_get_section_flags (ibfd, isection); - if (p != NULL && p->set_flags) - flags = p->flags | (flags & SEC_HAS_CONTENTS); - if (!bfd_set_section_flags (obfd, osection, flags)) - { - err = "flags"; - goto loser; - } - - /* This used to be mangle_section; we do here to avoid using - bfd_get_section_by_name since some formats allow multiple - sections with the same name. */ - isection->output_section = osection; - isection->output_offset = 0; - - /* Allow the BFD backend to copy any private data it understands - from the input section to the output section. */ - if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection)) - { - err = "private data"; - goto loser; - } - - /* All went well */ - return; - -loser: - non_fatal (_("%s: section `%s': error in %s: %s"), - bfd_get_filename (ibfd), - bfd_section_name (ibfd, isection), - err, bfd_errmsg (bfd_get_error ())); - status = 1; -} - -/* Copy the data of input section ISECTION of IBFD - to an output section with the same name in OBFD. - If stripping then don't copy any relocation info. */ - -static void -copy_section (ibfd, isection, obfdarg) - bfd *ibfd; - sec_ptr isection; - PTR obfdarg; -{ - bfd *obfd = (bfd *) obfdarg; - struct section_list *p; - arelent **relpp; - long relcount; - sec_ptr osection; - bfd_size_type size; - long relsize; - - /* If we have already failed earlier on, do not keep on generating - complaints now. */ - if (status != 0) - return; - - if ((bfd_get_section_flags (ibfd, isection) & SEC_DEBUGGING) != 0 - && (strip_symbols == STRIP_DEBUG - || strip_symbols == STRIP_UNNEEDED - || strip_symbols == STRIP_ALL - || discard_locals == LOCALS_ALL - || convert_debugging)) - { - return; - } - - p = find_section_list (bfd_section_name (ibfd, isection), false); - - if (sections_removed && p != NULL && p->remove) - return; - if (sections_copied && (p == NULL || ! p->copy)) - return; - - osection = isection->output_section; - size = bfd_get_section_size_before_reloc (isection); - - if (size == 0 || osection == 0) - return; - - - relsize = bfd_get_reloc_upper_bound (ibfd, isection); - if (relsize < 0) - RETURN_NONFATAL (bfd_get_filename (ibfd)); - - if (relsize == 0) - bfd_set_reloc (obfd, osection, (arelent **) NULL, 0); - else - { - relpp = (arelent **) xmalloc (relsize); - relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp); - if (relcount < 0) - RETURN_NONFATAL (bfd_get_filename (ibfd)); - - if (strip_symbols == STRIP_ALL) - { - /* Remove relocations which are not in - keep_strip_specific_list. */ - arelent **temp_relpp; - long temp_relcount = 0; - long i; - - temp_relpp = (arelent **) xmalloc (relsize); - for (i = 0; i < relcount; i++) - if (is_specified_symbol - (bfd_asymbol_name (*relpp [i]->sym_ptr_ptr), - keep_specific_list)) - temp_relpp [temp_relcount++] = relpp [i]; - relcount = temp_relcount; - free (relpp); - relpp = temp_relpp; - } - bfd_set_reloc (obfd, osection, - (relcount == 0 ? (arelent **) NULL : relpp), relcount); - } - - isection->_cooked_size = isection->_raw_size; - isection->reloc_done = true; - - if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS) - { - PTR memhunk = (PTR) xmalloc ((unsigned) size); - - if (!bfd_get_section_contents (ibfd, isection, memhunk, (file_ptr) 0, - size)) - RETURN_NONFATAL (bfd_get_filename (ibfd)); - - if (copy_byte >= 0) - filter_bytes (memhunk, &size); - - if (!bfd_set_section_contents (obfd, osection, memhunk, (file_ptr) 0, - size)) - RETURN_NONFATAL (bfd_get_filename (obfd)); - - free (memhunk); - } - else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0) - { - PTR memhunk = (PTR) xmalloc ((unsigned) size); - - /* We don't permit the user to turn off the SEC_HAS_CONTENTS - flag--they can just remove the section entirely and add it - back again. However, we do permit them to turn on the - SEC_HAS_CONTENTS flag, and take it to mean that the section - contents should be zeroed out. */ - - memset (memhunk, 0, size); - if (! bfd_set_section_contents (obfd, osection, memhunk, (file_ptr) 0, - size)) - RETURN_NONFATAL (bfd_get_filename (obfd)); - free (memhunk); - } -} - -/* Get all the sections. This is used when --gap-fill or --pad-to is - used. */ - -static void -get_sections (obfd, osection, secppparg) - bfd *obfd ATTRIBUTE_UNUSED; - asection *osection; - PTR secppparg; -{ - asection ***secppp = (asection ***) secppparg; - - **secppp = osection; - ++(*secppp); -} - -/* Sort sections by VMA. This is called via qsort, and is used when - --gap-fill or --pad-to is used. We force non loadable or empty - sections to the front, where they are easier to ignore. */ - -static int -compare_section_lma (arg1, arg2) - const PTR arg1; - const PTR arg2; -{ - const asection **sec1 = (const asection **) arg1; - const asection **sec2 = (const asection **) arg2; - flagword flags1, flags2; - - /* Sort non loadable sections to the front. */ - flags1 = (*sec1)->flags; - flags2 = (*sec2)->flags; - if ((flags1 & SEC_HAS_CONTENTS) == 0 - || (flags1 & SEC_LOAD) == 0) - { - if ((flags2 & SEC_HAS_CONTENTS) != 0 - && (flags2 & SEC_LOAD) != 0) - return -1; - } - else - { - if ((flags2 & SEC_HAS_CONTENTS) == 0 - || (flags2 & SEC_LOAD) == 0) - return 1; - } - - /* Sort sections by LMA. */ - if ((*sec1)->lma > (*sec2)->lma) - return 1; - else if ((*sec1)->lma < (*sec2)->lma) - return -1; - - /* Sort sections with the same LMA by size. */ - if ((*sec1)->_raw_size > (*sec2)->_raw_size) - return 1; - else if ((*sec1)->_raw_size < (*sec2)->_raw_size) - return -1; - - return 0; -} - -/* Mark all the symbols which will be used in output relocations with - the BSF_KEEP flag so that those symbols will not be stripped. - - Ignore relocations which will not appear in the output file. */ - -static void -mark_symbols_used_in_relocations (ibfd, isection, symbolsarg) - bfd *ibfd; - sec_ptr isection; - PTR symbolsarg; -{ - asymbol **symbols = (asymbol **) symbolsarg; - long relsize; - arelent **relpp; - long relcount, i; - - /* Ignore an input section with no corresponding output section. */ - if (isection->output_section == NULL) - return; - - relsize = bfd_get_reloc_upper_bound (ibfd, isection); - if (relsize < 0) - bfd_fatal (bfd_get_filename (ibfd)); - - if (relsize == 0) - return; - - relpp = (arelent **) xmalloc (relsize); - relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols); - if (relcount < 0) - bfd_fatal (bfd_get_filename (ibfd)); - - /* Examine each symbol used in a relocation. If it's not one of the - special bfd section symbols, then mark it with BSF_KEEP. */ - for (i = 0; i < relcount; i++) - { - if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol - && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol - && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol) - (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP; - } - - if (relpp != NULL) - free (relpp); -} - -/* Write out debugging information. */ - -static boolean -write_debugging_info (obfd, dhandle, symcountp, symppp) - bfd *obfd; - PTR dhandle; - long *symcountp ATTRIBUTE_UNUSED; - asymbol ***symppp ATTRIBUTE_UNUSED; -{ - if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour) - return write_ieee_debugging_info (obfd, dhandle); - - if (bfd_get_flavour (obfd) == bfd_target_coff_flavour - || bfd_get_flavour (obfd) == bfd_target_elf_flavour) - { - bfd_byte *syms, *strings; - bfd_size_type symsize, stringsize; - asection *stabsec, *stabstrsec; - - if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms, - &symsize, &strings, - &stringsize)) - return false; - - stabsec = bfd_make_section (obfd, ".stab"); - stabstrsec = bfd_make_section (obfd, ".stabstr"); - if (stabsec == NULL - || stabstrsec == NULL - || ! bfd_set_section_size (obfd, stabsec, symsize) - || ! bfd_set_section_size (obfd, stabstrsec, stringsize) - || ! bfd_set_section_alignment (obfd, stabsec, 2) - || ! bfd_set_section_alignment (obfd, stabstrsec, 0) - || ! bfd_set_section_flags (obfd, stabsec, - (SEC_HAS_CONTENTS - | SEC_READONLY - | SEC_DEBUGGING)) - || ! bfd_set_section_flags (obfd, stabstrsec, - (SEC_HAS_CONTENTS - | SEC_READONLY - | SEC_DEBUGGING))) - { - non_fatal (_("%s: can't create debugging section: %s"), - bfd_get_filename (obfd), - bfd_errmsg (bfd_get_error ())); - return false; - } - - /* We can get away with setting the section contents now because - the next thing the caller is going to do is copy over the - real sections. We may someday have to split the contents - setting out of this function. */ - if (! bfd_set_section_contents (obfd, stabsec, syms, (file_ptr) 0, - symsize) - || ! bfd_set_section_contents (obfd, stabstrsec, strings, - (file_ptr) 0, stringsize)) - { - non_fatal (_("%s: can't set debugging section contents: %s"), - bfd_get_filename (obfd), - bfd_errmsg (bfd_get_error ())); - return false; - } - - return true; - } - - non_fatal (_("%s: don't know how to write debugging information for %s"), - bfd_get_filename (obfd), bfd_get_target (obfd)); - return false; -} - -static int -strip_main (argc, argv) - int argc; - char *argv[]; -{ - char *input_target = NULL, *output_target = NULL; - boolean show_version = false; - int c, i; - struct section_list *p; - char *output_file = NULL; - - while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpgxXVv", - strip_options, (int *) 0)) != EOF) - { - switch (c) - { - case 'I': - input_target = optarg; - break; - case 'O': - output_target = optarg; - break; - case 'F': - input_target = output_target = optarg; - break; - case 'R': - p = find_section_list (optarg, true); - p->remove = true; - sections_removed = true; - break; - case 's': - strip_symbols = STRIP_ALL; - break; - case 'S': - case 'g': - strip_symbols = STRIP_DEBUG; - break; - case OPTION_STRIP_UNNEEDED: - strip_symbols = STRIP_UNNEEDED; - break; - case 'K': - add_specific_symbol (optarg, &keep_specific_list); - break; - case 'N': - add_specific_symbol (optarg, &strip_specific_list); - break; - case 'o': - output_file = optarg; - break; - case 'p': - preserve_dates = true; - break; - case 'x': - discard_locals = LOCALS_ALL; - break; - case 'X': - discard_locals = LOCALS_START_L; - break; - case 'v': - verbose = true; - break; - case 'V': - show_version = true; - break; - case 0: - break; /* we've been given a long option */ - case 'h': - strip_usage (stdout, 0); - default: - strip_usage (stderr, 1); - } - } - - if (show_version) - print_version ("strip"); - - /* Default is to strip all symbols. */ - if (strip_symbols == STRIP_UNDEF - && discard_locals == LOCALS_UNDEF - && strip_specific_list == NULL) - strip_symbols = STRIP_ALL; - - if (output_target == (char *) NULL) - output_target = input_target; - - i = optind; - if (i == argc - || (output_file != NULL && (i + 1) < argc)) - strip_usage (stderr, 1); - - for (; i < argc; i++) - { - int hold_status = status; - struct stat statbuf; - char *tmpname; - - if (preserve_dates) - { - if (stat (argv[i], &statbuf) < 0) - { - non_fatal (_("%s: cannot stat: %s"), argv[i], strerror (errno)); - continue; - } - } - - if (output_file != NULL) - tmpname = output_file; - else - tmpname = make_tempname (argv[i]); - status = 0; - - copy_file (argv[i], tmpname, input_target, output_target); - if (status == 0) - { - if (preserve_dates) - set_times (tmpname, &statbuf); - if (output_file == NULL) - smart_rename (tmpname, argv[i], preserve_dates); - status = hold_status; - } - else - unlink (tmpname); - if (output_file == NULL) - free (tmpname); - } - - return 0; -} - -static int -copy_main (argc, argv) - int argc; - char *argv[]; -{ - char *input_filename = NULL, *output_filename = NULL; - char *input_target = NULL, *output_target = NULL; - boolean show_version = false; - boolean change_warn = true; - int c; - struct section_list *p; - struct stat statbuf; - - while ((c = getopt_long (argc, argv, "b:i:I:j:K:N:s:O:d:F:L:R:SpgxXVvW:", - copy_options, (int *) 0)) != EOF) - { - switch (c) - { - case 'b': - copy_byte = atoi (optarg); - if (copy_byte < 0) - fatal (_("byte number must be non-negative")); - break; - - case 'i': - interleave = atoi (optarg); - if (interleave < 1) - fatal (_("interleave must be positive")); - break; - - case 'I': - case 's': /* "source" - 'I' is preferred */ - input_target = optarg; - break; - - case 'O': - case 'd': /* "destination" - 'O' is preferred */ - output_target = optarg; - break; - - case 'F': - input_target = output_target = optarg; - break; - - case 'j': - p = find_section_list (optarg, true); - if (p->remove) - fatal (_("%s both copied and removed"), optarg); - p->copy = true; - sections_copied = true; - break; - - case 'R': - p = find_section_list (optarg, true); - if (p->copy) - fatal (_("%s both copied and removed"), optarg); - p->remove = true; - sections_removed = true; - break; - - case 'S': - strip_symbols = STRIP_ALL; - break; - - case 'g': - strip_symbols = STRIP_DEBUG; - break; - - case OPTION_STRIP_UNNEEDED: - strip_symbols = STRIP_UNNEEDED; - break; - - case 'K': - add_specific_symbol (optarg, &keep_specific_list); - break; - - case 'N': - add_specific_symbol (optarg, &strip_specific_list); - break; - - case 'L': - add_specific_symbol (optarg, &localize_specific_list); - break; - - case 'W': - add_specific_symbol (optarg, &weaken_specific_list); - break; - - case 'p': - preserve_dates = true; - break; - - case 'x': - discard_locals = LOCALS_ALL; - break; - - case 'X': - discard_locals = LOCALS_START_L; - break; - - case 'v': - verbose = true; - break; - - case 'V': - show_version = true; - break; - - case OPTION_WEAKEN: - weaken = true; - break; - - case OPTION_ADD_SECTION: - { - const char *s; - struct stat st; - struct section_add *pa; - int len; - char *name; - FILE *f; - - s = strchr (optarg, '='); - - if (s == NULL) - fatal (_("bad format for %s"), "--add-section"); - - if (stat (s + 1, & st) < 0) - fatal (_("cannot stat: %s: %s"), s + 1, strerror (errno)); - - pa = (struct section_add *) xmalloc (sizeof (struct section_add)); - - len = s - optarg; - name = (char *) xmalloc (len + 1); - strncpy (name, optarg, len); - name[len] = '\0'; - pa->name = name; - - pa->filename = s + 1; - - pa->size = st.st_size; - - pa->contents = (bfd_byte *) xmalloc (pa->size); - f = fopen (pa->filename, FOPEN_RB); - - if (f == NULL) - fatal (_("cannot open: %s: %s"), pa->filename, strerror (errno)); - - if (fread (pa->contents, 1, pa->size, f) == 0 - || ferror (f)) - fatal (_("%s: fread failed"), pa->filename); - - fclose (f); - - pa->next = add_sections; - add_sections = pa; - } - break; - - case OPTION_CHANGE_START: - change_start = parse_vma (optarg, "--change-start"); - break; - - case OPTION_CHANGE_SECTION_ADDRESS: - case OPTION_CHANGE_SECTION_LMA: - case OPTION_CHANGE_SECTION_VMA: - { - const char *s; - int len; - char *name; - char *option = NULL; - bfd_vma val; - enum change_action what = CHANGE_IGNORE; - - switch (c) - { - case OPTION_CHANGE_SECTION_ADDRESS: - option = "--change-section-address"; - break; - case OPTION_CHANGE_SECTION_LMA: - option = "--change-section-lma"; - break; - case OPTION_CHANGE_SECTION_VMA: - option = "--change-section-vma"; - break; - } - - s = strchr (optarg, '='); - if (s == NULL) - { - s = strchr (optarg, '+'); - if (s == NULL) - { - s = strchr (optarg, '-'); - if (s == NULL) - fatal (_("bad format for %s"), option); - } - } - - len = s - optarg; - name = (char *) xmalloc (len + 1); - strncpy (name, optarg, len); - name[len] = '\0'; - - p = find_section_list (name, true); - - val = parse_vma (s + 1, option); - - switch (*s) - { - case '=': what = CHANGE_SET; break; - case '-': val = - val; /* Drop through. */ - case '+': what = CHANGE_MODIFY; break; - } - - switch (c) - { - case OPTION_CHANGE_SECTION_ADDRESS: - p->change_vma = what; - p->vma_val = val; - /* Drop through. */ - - case OPTION_CHANGE_SECTION_LMA: - p->change_lma = what; - p->lma_val = val; - break; - - case OPTION_CHANGE_SECTION_VMA: - p->change_vma = what; - p->vma_val = val; - break; - } - } - break; - - case OPTION_CHANGE_ADDRESSES: - change_section_address = parse_vma (optarg, "--change-addresses"); - change_start = change_section_address; - break; - - case OPTION_CHANGE_WARNINGS: - change_warn = true; - break; - - case OPTION_CHANGE_LEADING_CHAR: - change_leading_char = true; - break; - - case OPTION_DEBUGGING: - convert_debugging = true; - break; - - case OPTION_GAP_FILL: - { - bfd_vma gap_fill_vma; - - gap_fill_vma = parse_vma (optarg, "--gap-fill"); - gap_fill = (bfd_byte) gap_fill_vma; - if ((bfd_vma) gap_fill != gap_fill_vma) - { - char buff[20]; - - sprintf_vma (buff, gap_fill_vma); - - non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"), - buff, gap_fill); - } - gap_fill_set = true; - } - break; - - case OPTION_NO_CHANGE_WARNINGS: - change_warn = false; - break; - - case OPTION_PAD_TO: - pad_to = parse_vma (optarg, "--pad-to"); - pad_to_set = true; - break; - - case OPTION_REMOVE_LEADING_CHAR: - remove_leading_char = true; - break; - - case OPTION_REDEFINE_SYM: - { - /* Push this redefinition onto redefine_symbol_list. */ - - int len; - const char *s; - const char *nextarg; - char *source, *target; - - s = strchr (optarg, '='); - if (s == NULL) - { - fatal (_("bad format for %s"), "--redefine-sym"); - } - - len = s - optarg; - source = (char *) xmalloc (len + 1); - strncpy (source, optarg, len); - source[len] = '\0'; - - nextarg = s + 1; - len = strlen (nextarg); - target = (char *) xmalloc (len + 1); - strcpy (target, nextarg); - - redefine_list_append (source, target); - - free (source); - free (target); - } - break; - - case OPTION_SET_SECTION_FLAGS: - { - const char *s; - int len; - char *name; - - s = strchr (optarg, '='); - if (s == NULL) - fatal (_("bad format for %s"), "--set-section-flags"); - - len = s - optarg; - name = (char *) xmalloc (len + 1); - strncpy (name, optarg, len); - name[len] = '\0'; - - p = find_section_list (name, true); - - p->set_flags = true; - p->flags = parse_flags (s + 1); - } - break; - - case OPTION_SET_START: - set_start = parse_vma (optarg, "--set-start"); - set_start_set = true; - break; - - case 0: - break; /* we've been given a long option */ - - case 'h': - copy_usage (stdout, 0); - - default: - copy_usage (stderr, 1); - } - } - - if (show_version) - print_version ("objcopy"); - - if (copy_byte >= interleave) - fatal (_("byte number must be less than interleave")); - - if (optind == argc || optind + 2 < argc) - copy_usage (stderr, 1); - - input_filename = argv[optind]; - if (optind + 1 < argc) - output_filename = argv[optind + 1]; - - /* Default is to strip no symbols. */ - if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF) - strip_symbols = STRIP_NONE; - - if (output_target == (char *) NULL) - output_target = input_target; - - if (preserve_dates) - { - if (stat (input_filename, &statbuf) < 0) - fatal (_("Cannot stat: %s: %s"), input_filename, strerror (errno)); - } - - /* If there is no destination file then create a temp and rename - the result into the input. */ - - if (output_filename == (char *) NULL) - { - char *tmpname = make_tempname (input_filename); - - copy_file (input_filename, tmpname, input_target, output_target); - if (status == 0) - { - if (preserve_dates) - set_times (tmpname, &statbuf); - smart_rename (tmpname, input_filename, preserve_dates); - } - else - unlink (tmpname); - } - else - { - copy_file (input_filename, output_filename, input_target, output_target); - if (status == 0 && preserve_dates) - set_times (output_filename, &statbuf); - } - - if (change_warn) - { - for (p = change_sections; p != NULL; p = p->next) - { - if (! p->used) - { - if (p->change_vma != CHANGE_IGNORE) - { - char buff [20]; - - sprintf_vma (buff, p->vma_val); - - /* xgettext:c-format */ - non_fatal (_("%s %s%c0x%s never used"), - "--change-section-vma", - p->name, - p->change_vma == CHANGE_SET ? '=' : '+', - buff); - } - - if (p->change_lma != CHANGE_IGNORE) - { - char buff [20]; - - sprintf_vma (buff, p->lma_val); - - /* xgettext:c-format */ - non_fatal (_("%s %s%c0x%s never used"), - "--change-section-lma", - p->name, - p->change_lma == CHANGE_SET ? '=' : '+', - buff); - } - } - } - } - - return 0; -} - -int -main (argc, argv) - int argc; - char *argv[]; -{ -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = argv[0]; - xmalloc_set_program_name (program_name); - - START_PROGRESS (program_name, 0); - - strip_symbols = STRIP_UNDEF; - discard_locals = LOCALS_UNDEF; - - bfd_init (); - set_default_bfd_target (); - - if (is_strip < 0) - { - int i = strlen (program_name); - is_strip = (i >= 5 && strcmp (program_name + i - 5, "strip") == 0); - } - - if (is_strip) - strip_main (argc, argv); - else - copy_main (argc, argv); - - END_PROGRESS (program_name); - - return status; -} diff --git a/binutils/objdump.1 b/binutils/objdump.1 deleted file mode 100644 index ddc153ed8a3..00000000000 --- a/binutils/objdump.1 +++ /dev/null @@ -1,412 +0,0 @@ -.\" Copyright (c) 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH objdump 1 "5 November 1991" "cygnus support" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -objdump \- display information from object files. - -.SH SYNOPSIS -.hy 0 -.na -.TP -.B objdump -.RB "[\|" \-a | \-\-archive\-headers "\|]" -.RB "[\|" "\-b\ "\c -.I bfdname\c -.RB " | " "\-\-target="\c -.I bfdname\c -\&\|] -.RB "[\|" \-C | \-\-demangle "\|]" -.RB "[\|" \-\-debugging "\|]" -.RB "[\|" \-d | \-\-disassemble "\|]" -.RB "[\|" \-D | \-\-disassemble-all "\|]" -.RB "[\|" \-\-disassemble\-zeroes "\|]" -.RB "[\|" \-EB | \-EL | \-\-endian=\c -.I {big|little}\c -\&\|] -.RB "[\|" \-f | \-\-file\-headers "\|]" -.RB "[\|" \-h | \-\-section\-headers -.RB "| " \-\-headers "\|]" -.RB "[\|" \-i | \-\-info "\|]" -.RB "[\|" "\-j\ "\c -.I section\c -.RB " | " "\-\-section="\c -.I section\c -\&\|] -.RB "[\|" \-l | \-\-line\-numbers "\|]" -.RB "[\|" "\-m\ "\c -.I machine\c -.RB " | " "\-\-architecture="\c -.I machine\c -\&\|] -.RB "[\|" \-p | \-\-private\-headers "\|]" -.RB "[\|" \-\-prefix\-addresses "\|]" -.RB "[\|" \-r | \-\-reloc "\|]" -.RB "[\|" \-R | \-\-dynamic\-reloc "\|]" -.RB "[\|" \-s | \-\-full\-contents "\|]" -.RB "[\|" \-S | \-\-source "\|]" -.RB "[\|" \-\-[no\-]show\-raw\-insn "\|]" -.RB "[\|" \-\-stabs "\|]" -.RB "[\|" \-t | \-\-syms "\|]" -.RB "[\|" \-T | \-\-dynamic\-syms "\|]" -.RB "[\|" \-x | \-\-all\-headers "\|]" -.RB "[\|" "\-\-start\-address="\c -.I address\c -\&\|] -.RB "[\|" "\-\-stop\-address="\c -.I address\c -\&\|] -.RB "[\|" "\-\-adjust\-vma="\c -.I offset\c -\&\|] -.RB "[\|" \-\-version "\|]" -.RB "[\|" \-\-help "\|]" -.I objfile\c -\&.\|.\|. -.ad b -.hy 1 -.SH DESCRIPTION -\c -.B objdump\c -\& 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 -.IR "objfile" .\|.\|. -are the object files to be examined. When you specify archives, -\c -.B objdump\c -\& shows information on each of the member object files. - -.SH OPTIONS -Where long and short forms of an option are shown together, they are -equivalent. At least one option besides -.B \-l -(\fB\-\-line\-numbers\fP) must be given. - -.TP -.B \-a -.TP -.B \-\-archive\-headers -If any files from \c -.I objfile\c -\& are archives, display the archive -header information (in a format similar to `\|\c -.B ls \-l\c -\|'). Besides the -information you could list with `\|\c -.B ar tv\c -\|', `\|\c -.B objdump \-a\c -\|' shows -the object file format of each archive member. - -.TP -.BI "\-\-adjust\-vma=" "offset" -When dumping information, first add -.I 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. - -.TP -.BI "\-b " "bfdname"\c -.TP -.BI "\-\-target=" "bfdname" -Specify the object-code format for the object files to be -\c -.I bfdname\c -\&. This may not be necessary; \c -.I objdump\c -\& can -automatically recognize many formats. For example, -.sp -.br -objdump\ \-b\ oasys\ \-m\ vax\ \-h\ fu.o -.br -.sp -display summary information from the section headers (`\|\c -.B \-h\c -\|') of -`\|\c -.B fu.o\c -\|', which is explicitly identified (`\|\c -.B \-m\c -\|') as a Vax object -file in the format produced by Oasys compilers. You can list the -formats available with the `\|\c -.B \-i\c -\|' option. - -.TP -.B \-C -.TP -.B \-\-demangle -Decode (\fIdemangle\fP) low-level symbol names into user-level names. -Besides removing any initial underscore prepended by the system, this -makes C++ function names readable. - -.TP -.B \-\-debugging -Display debugging information. This attempts to parse debugging -information stored in the file and print it out using a C like syntax. -Only certain types of debugging information have been implemented. - -.TP -.B \-d -.TP -.B \-\-disassemble -Display the assembler mnemonics for the machine -instructions from \c -.I objfile\c -\&. -This option only disassembles those sections which are -expected to contain instructions. - -.TP -.B \-D -.TP -.B \-\-disassemble-all -Like \fB\-d\fP, but disassemble the contents of all sections, not just -those expected to contain instructions. - -.TP -.B \-\-prefix\-addresses -When disassembling, print the complete address on each line. This is -the older disassembly format. - -.TP -.B \-\-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. - -.TP -.B \-EB -.TP -.B \-EL -.TP -.BI "\-\-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. - -.TP -.B \-f -.TP -.B \-\-file\-headers -Display summary information from the overall header of -each file in \c -.I objfile\c -\&. - -.TP -.B \-h -.TP -.B \-\-section\-headers -.TP -.B \-\-headers -Display summary information from the section headers of the -object file. - -.TP -.B \-\-help -Print a summary of the options to -.B objdump -and exit. - -.TP -.B \-i -.TP -.B \-\-info -Display a list showing all architectures and object formats available -for specification with \c -.B \-b\c -\& or \c -.B \-m\c -\&. - -.TP -.BI "\-j " "name"\c -.TP -.BI "\-\-section=" "name" -Display information only for section \c -.I name\c -\&. - -.TP -.B \-l -.TP -.B \-\-line\-numbers -Label the display (using debugging information) with the filename -and source line numbers corresponding to the object code shown. -Only useful with \fB\-d\fP, \fB\-D\fP, or \fB\-r\fP. - -.TP -.BI "\-m " "machine"\c -.TP -.BI "\-\-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 \fB\-i\fP option. - -.TP -.B \-p -.TP -.B \-\-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. - -.TP -.B \-r -.TP -.B \-\-reloc -Print the relocation entries of the file. If used with \fB\-d\fP or -\fB\-D\fP, the relocations are printed interspersed with the -disassembly. - -.TP -.B \-R -.TP -.B \-\-dynamic\-reloc -Print the dynamic relocation entries of the file. This is only -meaningful for dynamic objects, such as certain types of shared -libraries. - -.TP -.B \-s -.TP -.B \-\-full\-contents -Display the full contents of any sections requested. - -.TP -.B \-S -.TP -.B \-\-source -Display source code intermixed with disassembly, if possible. Implies -\fB-d\fP. - -.TP -.B \-\-show\-raw\-insn -When disassembling instructions, print the instruction in hex as well as -in symbolic form. This is the default except when -.B \-\-prefix\-addresses -is used. - -.TP -.B \-\-no\-show\-raw\-insn -When disassembling instructions, do not print the instruction bytes. -This is the default when -.B \-\-prefix\-addresses -is used. - -.TP -.B \-\-stabs -Display the contents of the .stab, .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 -.B \-\-syms -output. - -.TP -.BI "\-\-start\-address=" "address" -Start displaying data at the specified address. This affects the output -of the -.B \-d\c -, -.B \-r -and -.B \-s -options. - -.TP -.BI "\-\-stop\-address=" "address" -Stop displaying data at the specified address. This affects the output -of the -.B \-d\c -, -.B \-r -and -.B \-s -options. - -.TP -.B \-t -.TP -.B \-\-syms -Symbol Table. Print the symbol table entries of the file. -This is similar to the information provided by the `\|\c -.B nm\c -\|' program. - -.TP -.B \-T -.TP -.B \-\-dynamic\-syms -Dynamic Symbol Table. 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 `\|\c -.B nm\c -\|' program when given the -.B \-D (\-\-dynamic) -option. - -.TP -.B \-\-version -Print the version number of -.B objdump -and exit. - -.TP -.B \-x -.TP -.B \-\-all\-headers -Display all available header information, including the symbol table and -relocation entries. Using `\|\c -.B \-x\c -\|' is equivalent to specifying all of -`\|\c -.B \-a \-f \-h \-r \-t\c -\|'. - -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.B -info\c -\&; -.I -The GNU Binary Utilities\c -\&, Roland H. Pesch (October 1991); -.BR nm "(" 1 ")." - -.SH COPYING -Copyright (c) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/binutils/objdump.c b/binutils/objdump.c deleted file mode 100644 index a5ab114903e..00000000000 --- a/binutils/objdump.c +++ /dev/null @@ -1,2978 +0,0 @@ -/* objdump.c -- dump information about an object file. - Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 - 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 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "getopt.h" -#include "progress.h" -#include "bucomm.h" -#include -#include "dis-asm.h" -#include "libiberty.h" -#include "demangle.h" -#include "debug.h" -#include "budbg.h" - -#ifdef ANSI_PROTOTYPES -#include -#else -#include -#endif - -/* Internal headers for the ELF .stab-dump code - sorry. */ -#define BYTES_IN_WORD 32 -#include "aout/aout64.h" - -#ifdef NEED_DECLARATION_FPRINTF -/* This is needed by INIT_DISASSEMBLE_INFO. */ -extern int fprintf PARAMS ((FILE *, const char *, ...)); -#endif - -/* Exit status. */ -static int exit_status = 0; - -static char *default_target = NULL; /* default at runtime */ - -static int show_version = 0; /* show the version number */ -static int dump_section_contents; /* -s */ -static int dump_section_headers; /* -h */ -static boolean dump_file_header; /* -f */ -static int dump_symtab; /* -t */ -static int dump_dynamic_symtab; /* -T */ -static int dump_reloc_info; /* -r */ -static int dump_dynamic_reloc_info; /* -R */ -static int dump_ar_hdrs; /* -a */ -static int dump_private_headers; /* -p */ -static int prefix_addresses; /* --prefix-addresses */ -static int with_line_numbers; /* -l */ -static boolean with_source_code; /* -S */ -static int show_raw_insn; /* --show-raw-insn */ -static int dump_stab_section_info; /* --stabs */ -static int do_demangle; /* -C, --demangle */ -static boolean disassemble; /* -d */ -static boolean disassemble_all; /* -D */ -static int disassemble_zeroes; /* --disassemble-zeroes */ -static boolean formats_info; /* -i */ -static char *only; /* -j secname */ -static int wide_output; /* -w */ -static bfd_vma start_address = (bfd_vma) -1; /* --start-address */ -static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */ -static int dump_debugging; /* --debugging */ -static bfd_vma adjust_section_vma = 0; /* --adjust-vma */ -static int file_start_context = 0; /* --file-start-context */ - -/* Extra info to pass to the disassembler address printing function. */ -struct objdump_disasm_info { - bfd *abfd; - asection *sec; - boolean require_sec; -}; - -/* Architecture to disassemble for, or default if NULL. */ -static char *machine = (char *) NULL; - -/* Target specific options to the disassembler. */ -static char *disassembler_options = (char *) NULL; - -/* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */ -static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN; - -/* The symbol table. */ -static asymbol **syms; - -/* Number of symbols in `syms'. */ -static long symcount = 0; - -/* The sorted symbol table. */ -static asymbol **sorted_syms; - -/* Number of symbols in `sorted_syms'. */ -static long sorted_symcount = 0; - -/* The dynamic symbol table. */ -static asymbol **dynsyms; - -/* Number of symbols in `dynsyms'. */ -static long dynsymcount = 0; - -/* Static declarations. */ - -static void -usage PARAMS ((FILE *, int)); - -static void -nonfatal PARAMS ((const char *)); - -static void -display_file PARAMS ((char *filename, char *target)); - -static void -dump_section_header PARAMS ((bfd *, asection *, PTR)); - -static void -dump_headers PARAMS ((bfd *)); - -static void -dump_data PARAMS ((bfd *abfd)); - -static void -dump_relocs PARAMS ((bfd *abfd)); - -static void -dump_dynamic_relocs PARAMS ((bfd * abfd)); - -static void -dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long)); - -static void -dump_symbols PARAMS ((bfd *abfd, boolean dynamic)); - -static void -dump_bfd_header PARAMS ((bfd *)); - -static void -dump_bfd_private_header PARAMS ((bfd *)); - -static void -display_bfd PARAMS ((bfd *abfd)); - -static void -display_target_list PARAMS ((void)); - -static void -display_info_table PARAMS ((int, int)); - -static void -display_target_tables PARAMS ((void)); - -static void -display_info PARAMS ((void)); - -static void -objdump_print_value PARAMS ((bfd_vma, struct disassemble_info *, boolean)); - -static void -objdump_print_symname PARAMS ((bfd *, struct disassemble_info *, asymbol *)); - -static asymbol * -find_symbol_for_address PARAMS ((bfd *, asection *, bfd_vma, boolean, long *)); - -static void -objdump_print_addr_with_sym PARAMS ((bfd *, asection *, asymbol *, bfd_vma, - struct disassemble_info *, boolean)); - -static void -objdump_print_addr PARAMS ((bfd_vma, struct disassemble_info *, boolean)); - -static void -objdump_print_address PARAMS ((bfd_vma, struct disassemble_info *)); - -static void -show_line PARAMS ((bfd *, asection *, bfd_vma)); - -static void -disassemble_bytes PARAMS ((struct disassemble_info *, disassembler_ftype, - boolean, bfd_byte *, bfd_vma, bfd_vma, - arelent ***, arelent **)); - -static void -disassemble_data PARAMS ((bfd *)); - -static const char * -endian_string PARAMS ((enum bfd_endian)); - -static asymbol ** -slurp_symtab PARAMS ((bfd *)); - -static asymbol ** -slurp_dynamic_symtab PARAMS ((bfd *)); - -static long -remove_useless_symbols PARAMS ((asymbol **, long)); - -static int -compare_symbols PARAMS ((const PTR, const PTR)); - -static int -compare_relocs PARAMS ((const PTR, const PTR)); - -static void -dump_stabs PARAMS ((bfd *)); - -static boolean -read_section_stabs PARAMS ((bfd *, const char *, const char *)); - -static void -print_section_stabs PARAMS ((bfd *, const char *, const char *)); - -static void -usage (stream, status) - FILE *stream; - int status; -{ - fprintf (stream, _("Usage: %s file(s)\n"), program_name); - fprintf (stream, _(" At least one of the following switches must be given:\n")); - fprintf (stream, _("\ - -a --archive-headers Display archive header information\n\ - -f --file-headers Display the contents of the overall file header\n\ - -p --private-headers Display object format specific file header contents\n\ - -h --[section-]headers Display the contents of the section headers\n\ - -x --all-headers Display the contents of all headers\n\ - -d --disassemble Display assembler contents of executable sections\n\ - -D --disassemble-all Display assembler contents of all sections\n\ - -S --source Intermix source code with disassembly\n\ - -s --full-contents Display the full contents of all sections requested\n\ - -g --debugging Display debug information in object file\n\ - -G --stabs Display the STABS contents of an ELF format file\n\ - -t --syms Display the contents of the symbol table(s)\n\ - -T --dynamic-syms Display the contents of the dynamic symbol table\n\ - -r --reloc Display the relocation entries in the file\n\ - -R --dynamic-reloc Display the dynamic relocation entries in the file\n\ - -V --version Display this program's version number\n\ - -i --info List object formats and architectures supported\n\ - -H --help Display this information\n\ -")); - if (status != 2) - { - fprintf (stream, _("\n The following switches are optional:\n")); - fprintf (stream, _("\ - -b --target Specify the target object format as \n\ - -m --architecture Specify the target architecture as \n\ - -j --section Only display information for section \n\ - -M --disassembler-options Pass text on to the disassembler\n\ - -EB --endian=big Assume big endian format when disassembling\n\ - -EL --endian=little Assume little endian format when disassembling\n\ - --file-start-context Include context from start of file (with -S)\n\ - -l --line-numbers Include line numbers and filenames in output\n\ - -C --demangle Decode mangled/processed symbol names\n\ - -w --wide Format output for more than 80 columns\n\ - -z --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\ - --start-address Only process data whoes address is >= \n\ - --stop-address Only process data whoes address is <= \n\ - --prefix-addresses Print complete address alongside disassembly\n\ - --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\ - --adjust-vma Add to all displayed section addresses\n\ -\n")); - list_supported_targets (program_name, stream); - - disassembler_usage (stream); - } - if (status == 0) - fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); - exit (status); -} - -/* 150 isn't special; it's just an arbitrary non-ASCII char value. */ - -#define OPTION_ENDIAN (150) -#define OPTION_START_ADDRESS (OPTION_ENDIAN + 1) -#define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1) -#define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1) - -static struct option long_options[]= -{ - {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA}, - {"all-headers", no_argument, NULL, 'x'}, - {"private-headers", no_argument, NULL, 'p'}, - {"architecture", required_argument, NULL, 'm'}, - {"archive-headers", no_argument, NULL, 'a'}, - {"debugging", no_argument, NULL, 'g'}, - {"demangle", no_argument, NULL, 'C'}, - {"disassemble", no_argument, NULL, 'd'}, - {"disassemble-all", no_argument, NULL, 'D'}, - {"disassembler-options", required_argument, NULL, 'M'}, - {"disassemble-zeroes", no_argument, NULL, 'z'}, - {"dynamic-reloc", no_argument, NULL, 'R'}, - {"dynamic-syms", no_argument, NULL, 'T'}, - {"endian", required_argument, NULL, OPTION_ENDIAN}, - {"file-headers", no_argument, NULL, 'f'}, - {"file-start-context", no_argument, &file_start_context, 1}, - {"full-contents", no_argument, NULL, 's'}, - {"headers", no_argument, NULL, 'h'}, - {"help", no_argument, NULL, 'H'}, - {"info", no_argument, NULL, 'i'}, - {"line-numbers", no_argument, NULL, 'l'}, - {"no-show-raw-insn", no_argument, &show_raw_insn, -1}, - {"prefix-addresses", no_argument, &prefix_addresses, 1}, - {"reloc", no_argument, NULL, 'r'}, - {"section", required_argument, NULL, 'j'}, - {"section-headers", no_argument, NULL, 'h'}, - {"show-raw-insn", no_argument, &show_raw_insn, 1}, - {"source", no_argument, NULL, 'S'}, - {"stabs", no_argument, NULL, 'G'}, - {"start-address", required_argument, NULL, OPTION_START_ADDRESS}, - {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS}, - {"syms", no_argument, NULL, 't'}, - {"target", required_argument, NULL, 'b'}, - {"version", no_argument, NULL, 'V'}, - {"wide", no_argument, NULL, 'w'}, - {0, no_argument, 0, 0} -}; - -static void -nonfatal (msg) - const char *msg; -{ - bfd_nonfatal (msg); - exit_status = 1; -} - -static void -dump_section_header (abfd, section, ignored) - bfd *abfd ATTRIBUTE_UNUSED; - asection *section; - PTR ignored ATTRIBUTE_UNUSED; -{ - char *comma = ""; - unsigned int opb = bfd_octets_per_byte (abfd); - - printf ("%3d %-13s %08lx ", section->index, - bfd_get_section_name (abfd, section), - (unsigned long) bfd_section_size (abfd, section) / opb); - printf_vma (bfd_get_section_vma (abfd, section)); - printf (" "); - printf_vma (section->lma); - printf (" %08lx 2**%u", section->filepos, - bfd_get_section_alignment (abfd, section)); - if (! wide_output) - printf ("\n "); - printf (" "); - -#define PF(x, y) \ - if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; } - - PF (SEC_HAS_CONTENTS, "CONTENTS"); - PF (SEC_ALLOC, "ALLOC"); - PF (SEC_CONSTRUCTOR, "CONSTRUCTOR"); - PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT"); - PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA"); - PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS"); - PF (SEC_LOAD, "LOAD"); - PF (SEC_RELOC, "RELOC"); -#ifdef SEC_BALIGN - PF (SEC_BALIGN, "BALIGN"); -#endif - PF (SEC_READONLY, "READONLY"); - PF (SEC_CODE, "CODE"); - PF (SEC_DATA, "DATA"); - PF (SEC_ROM, "ROM"); - PF (SEC_DEBUGGING, "DEBUGGING"); - PF (SEC_NEVER_LOAD, "NEVER_LOAD"); - PF (SEC_EXCLUDE, "EXCLUDE"); - PF (SEC_SORT_ENTRIES, "SORT_ENTRIES"); - PF (SEC_BLOCK, "BLOCK"); - PF (SEC_CLINK, "CLINK"); - PF (SEC_SMALL_DATA, "SMALL_DATA"); - PF (SEC_SHARED, "SHARED"); - - if ((section->flags & SEC_LINK_ONCE) != 0) - { - const char *ls; - - switch (section->flags & SEC_LINK_DUPLICATES) - { - default: - abort (); - case SEC_LINK_DUPLICATES_DISCARD: - ls = "LINK_ONCE_DISCARD"; - break; - case SEC_LINK_DUPLICATES_ONE_ONLY: - ls = "LINK_ONCE_ONE_ONLY"; - break; - case SEC_LINK_DUPLICATES_SAME_SIZE: - ls = "LINK_ONCE_SAME_SIZE"; - break; - case SEC_LINK_DUPLICATES_SAME_CONTENTS: - ls = "LINK_ONCE_SAME_CONTENTS"; - break; - } - printf ("%s%s", comma, ls); - - if (section->comdat != NULL) - printf (" (COMDAT %s %ld)", section->comdat->name, - section->comdat->symbol); - - comma = ", "; - } - - printf ("\n"); -#undef PF -} - -static void -dump_headers (abfd) - bfd *abfd; -{ - printf (_("Sections:\n")); - -#ifndef BFD64 - printf (_("Idx Name Size VMA LMA File off Algn")); -#else - printf (_("Idx Name Size VMA LMA File off Algn")); -#endif - - if (wide_output) - printf (_(" Flags")); - printf ("\n"); - - bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL); -} - -static asymbol ** -slurp_symtab (abfd) - bfd *abfd; -{ - asymbol **sy = (asymbol **) NULL; - long storage; - - if (!(bfd_get_file_flags (abfd) & HAS_SYMS)) - { - non_fatal (_("%s: no symbols"), bfd_get_filename (abfd)); - symcount = 0; - return NULL; - } - - storage = bfd_get_symtab_upper_bound (abfd); - if (storage < 0) - bfd_fatal (bfd_get_filename (abfd)); - - if (storage) - { - sy = (asymbol **) xmalloc (storage); - } - symcount = bfd_canonicalize_symtab (abfd, sy); - if (symcount < 0) - bfd_fatal (bfd_get_filename (abfd)); - if (symcount == 0) - non_fatal (_("%s: no symbols"), bfd_get_filename (abfd)); - return sy; -} - -/* Read in the dynamic symbols. */ - -static asymbol ** -slurp_dynamic_symtab (abfd) - bfd *abfd; -{ - asymbol **sy = (asymbol **) NULL; - long storage; - - storage = bfd_get_dynamic_symtab_upper_bound (abfd); - if (storage < 0) - { - if (!(bfd_get_file_flags (abfd) & DYNAMIC)) - { - non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd)); - dynsymcount = 0; - return NULL; - } - - bfd_fatal (bfd_get_filename (abfd)); - } - - if (storage) - { - sy = (asymbol **) xmalloc (storage); - } - dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy); - if (dynsymcount < 0) - bfd_fatal (bfd_get_filename (abfd)); - if (dynsymcount == 0) - non_fatal (_("%s: No dynamic symbols"), bfd_get_filename (abfd)); - return sy; -} - -/* Filter out (in place) symbols that are useless for disassembly. - COUNT is the number of elements in SYMBOLS. - Return the number of useful symbols. */ - -static long -remove_useless_symbols (symbols, count) - asymbol **symbols; - long count; -{ - register asymbol **in_ptr = symbols, **out_ptr = symbols; - - while (--count >= 0) - { - asymbol *sym = *in_ptr++; - - if (sym->name == NULL || sym->name[0] == '\0') - continue; - if (sym->flags & (BSF_DEBUGGING)) - continue; - if (bfd_is_und_section (sym->section) - || bfd_is_com_section (sym->section)) - continue; - - *out_ptr++ = sym; - } - return out_ptr - symbols; -} - -/* Sort symbols into value order. */ - -static int -compare_symbols (ap, bp) - const PTR ap; - const PTR bp; -{ - const asymbol *a = *(const asymbol **)ap; - const asymbol *b = *(const asymbol **)bp; - const char *an, *bn; - size_t anl, bnl; - boolean af, bf; - flagword aflags, bflags; - - if (bfd_asymbol_value (a) > bfd_asymbol_value (b)) - return 1; - else if (bfd_asymbol_value (a) < bfd_asymbol_value (b)) - return -1; - - if (a->section > b->section) - return 1; - else if (a->section < b->section) - return -1; - - an = bfd_asymbol_name (a); - bn = bfd_asymbol_name (b); - anl = strlen (an); - bnl = strlen (bn); - - /* The symbols gnu_compiled and gcc2_compiled convey no real - information, so put them after other symbols with the same value. */ - - af = (strstr (an, "gnu_compiled") != NULL - || strstr (an, "gcc2_compiled") != NULL); - bf = (strstr (bn, "gnu_compiled") != NULL - || strstr (bn, "gcc2_compiled") != NULL); - - if (af && ! bf) - return 1; - if (! af && bf) - return -1; - - /* We use a heuristic for the file name, to try to sort it after - more useful symbols. It may not work on non Unix systems, but it - doesn't really matter; the only difference is precisely which - symbol names get printed. */ - -#define file_symbol(s, sn, snl) \ - (((s)->flags & BSF_FILE) != 0 \ - || ((sn)[(snl) - 2] == '.' \ - && ((sn)[(snl) - 1] == 'o' \ - || (sn)[(snl) - 1] == 'a'))) - - af = file_symbol (a, an, anl); - bf = file_symbol (b, bn, bnl); - - if (af && ! bf) - return 1; - if (! af && bf) - return -1; - - /* Try to sort global symbols before local symbols before function - symbols before debugging symbols. */ - - aflags = a->flags; - bflags = b->flags; - - if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING)) - { - if ((aflags & BSF_DEBUGGING) != 0) - return 1; - else - return -1; - } - if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION)) - { - if ((aflags & BSF_FUNCTION) != 0) - return -1; - else - return 1; - } - if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL)) - { - if ((aflags & BSF_LOCAL) != 0) - return 1; - else - return -1; - } - if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL)) - { - if ((aflags & BSF_GLOBAL) != 0) - return -1; - else - return 1; - } - - /* Symbols that start with '.' might be section names, so sort them - after symbols that don't start with '.'. */ - if (an[0] == '.' && bn[0] != '.') - return 1; - if (an[0] != '.' && bn[0] == '.') - return -1; - - /* Finally, if we can't distinguish them in any other way, try to - get consistent results by sorting the symbols by name. */ - return strcmp (an, bn); -} - -/* Sort relocs into address order. */ - -static int -compare_relocs (ap, bp) - const PTR ap; - const PTR bp; -{ - const arelent *a = *(const arelent **)ap; - const arelent *b = *(const arelent **)bp; - - if (a->address > b->address) - return 1; - else if (a->address < b->address) - return -1; - - /* So that associated relocations tied to the same address show up - in the correct order, we don't do any further sorting. */ - if (a > b) - return 1; - else if (a < b) - return -1; - else - return 0; -} - -/* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */ - -static void -objdump_print_value (vma, info, skip_zeroes) - bfd_vma vma; - struct disassemble_info *info; - boolean skip_zeroes; -{ - char buf[30]; - char *p; - - sprintf_vma (buf, vma); - if (! skip_zeroes) - p = buf; - else - { - for (p = buf; *p == '0'; ++p) - ; - if (*p == '\0') - --p; - } - (*info->fprintf_func) (info->stream, "%s", p); -} - -/* Print the name of a symbol. */ - -static void -objdump_print_symname (abfd, info, sym) - bfd *abfd; - struct disassemble_info *info; - asymbol *sym; -{ - char *alloc; - const char *name; - const char *print; - - alloc = NULL; - name = bfd_asymbol_name (sym); - if (! do_demangle || name[0] == '\0') - print = name; - else - { - /* Demangle the name. */ - if (bfd_get_symbol_leading_char (abfd) == name[0]) - ++name; - - alloc = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS); - if (alloc == NULL) - print = name; - else - print = alloc; - } - - if (info != NULL) - (*info->fprintf_func) (info->stream, "%s", print); - else - printf ("%s", print); - - if (alloc != NULL) - free (alloc); -} - -/* Locate a symbol given a bfd, a section, and a VMA. If REQUIRE_SEC - is true, then always require the symbol to be in the section. This - returns NULL if there is no suitable symbol. If PLACE is not NULL, - then *PLACE is set to the index of the symbol in sorted_syms. */ - -static asymbol * -find_symbol_for_address (abfd, sec, vma, require_sec, place) - bfd *abfd; - asection *sec; - bfd_vma vma; - boolean require_sec; - long *place; -{ - /* @@ Would it speed things up to cache the last two symbols returned, - and maybe their address ranges? For many processors, only one memory - operand can be present at a time, so the 2-entry cache wouldn't be - constantly churned by code doing heavy memory accesses. */ - - /* Indices in `sorted_syms'. */ - long min = 0; - long max = sorted_symcount; - long thisplace; - unsigned int opb = bfd_octets_per_byte (abfd); - - if (sorted_symcount < 1) - return NULL; - - /* Perform a binary search looking for the closest symbol to the - required value. We are searching the range (min, max]. */ - while (min + 1 < max) - { - asymbol *sym; - - thisplace = (max + min) / 2; - sym = sorted_syms[thisplace]; - - if (bfd_asymbol_value (sym) > vma) - max = thisplace; - else if (bfd_asymbol_value (sym) < vma) - min = thisplace; - else - { - min = thisplace; - break; - } - } - - /* The symbol we want is now in min, the low end of the range we - were searching. If there are several symbols with the same - value, we want the first one. */ - thisplace = min; - while (thisplace > 0 - && (bfd_asymbol_value (sorted_syms[thisplace]) - == bfd_asymbol_value (sorted_syms[thisplace - 1]))) - --thisplace; - - /* If the file is relocateable, and the symbol could be from this - section, prefer a symbol from this section over symbols from - others, even if the other symbol's value might be closer. - - Note that this may be wrong for some symbol references if the - sections have overlapping memory ranges, but in that case there's - no way to tell what's desired without looking at the relocation - table. */ - - if (sorted_syms[thisplace]->section != sec - && (require_sec - || ((abfd->flags & HAS_RELOC) != 0 - && vma >= bfd_get_section_vma (abfd, sec) - && vma < (bfd_get_section_vma (abfd, sec) - + bfd_section_size (abfd, sec) / opb)))) - { - long i; - - for (i = thisplace + 1; i < sorted_symcount; i++) - { - if (bfd_asymbol_value (sorted_syms[i]) - != bfd_asymbol_value (sorted_syms[thisplace])) - break; - } - --i; - for (; i >= 0; i--) - { - if (sorted_syms[i]->section == sec - && (i == 0 - || sorted_syms[i - 1]->section != sec - || (bfd_asymbol_value (sorted_syms[i]) - != bfd_asymbol_value (sorted_syms[i - 1])))) - { - thisplace = i; - break; - } - } - - if (sorted_syms[thisplace]->section != sec) - { - /* We didn't find a good symbol with a smaller value. - Look for one with a larger value. */ - for (i = thisplace + 1; i < sorted_symcount; i++) - { - if (sorted_syms[i]->section == sec) - { - thisplace = i; - break; - } - } - } - - if (sorted_syms[thisplace]->section != sec - && (require_sec - || ((abfd->flags & HAS_RELOC) != 0 - && vma >= bfd_get_section_vma (abfd, sec) - && vma < (bfd_get_section_vma (abfd, sec) - + bfd_section_size (abfd, sec))))) - { - /* There is no suitable symbol. */ - return NULL; - } - } - - if (place != NULL) - *place = thisplace; - - return sorted_syms[thisplace]; -} - -/* Print an address to INFO symbolically. */ - -static void -objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes) - bfd *abfd; - asection *sec; - asymbol *sym; - bfd_vma vma; - struct disassemble_info *info; - boolean skip_zeroes; -{ - objdump_print_value (vma, info, skip_zeroes); - - if (sym == NULL) - { - bfd_vma secaddr; - - (*info->fprintf_func) (info->stream, " <%s", - bfd_get_section_name (abfd, sec)); - secaddr = bfd_get_section_vma (abfd, sec); - if (vma < secaddr) - { - (*info->fprintf_func) (info->stream, "-0x"); - objdump_print_value (secaddr - vma, info, true); - } - else if (vma > secaddr) - { - (*info->fprintf_func) (info->stream, "+0x"); - objdump_print_value (vma - secaddr, info, true); - } - (*info->fprintf_func) (info->stream, ">"); - } - else - { - (*info->fprintf_func) (info->stream, " <"); - objdump_print_symname (abfd, info, sym); - if (bfd_asymbol_value (sym) > vma) - { - (*info->fprintf_func) (info->stream, "-0x"); - objdump_print_value (bfd_asymbol_value (sym) - vma, info, true); - } - else if (vma > bfd_asymbol_value (sym)) - { - (*info->fprintf_func) (info->stream, "+0x"); - objdump_print_value (vma - bfd_asymbol_value (sym), info, true); - } - (*info->fprintf_func) (info->stream, ">"); - } -} - -/* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is - true, don't output leading zeroes. */ - -static void -objdump_print_addr (vma, info, skip_zeroes) - bfd_vma vma; - struct disassemble_info *info; - boolean skip_zeroes; -{ - struct objdump_disasm_info *aux; - asymbol *sym; - - if (sorted_symcount < 1) - { - (*info->fprintf_func) (info->stream, "0x"); - objdump_print_value (vma, info, skip_zeroes); - return; - } - - aux = (struct objdump_disasm_info *) info->application_data; - sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec, - (long *) NULL); - objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info, - skip_zeroes); -} - -/* Print VMA to INFO. This function is passed to the disassembler - routine. */ - -static void -objdump_print_address (vma, info) - bfd_vma vma; - struct disassemble_info *info; -{ - objdump_print_addr (vma, info, ! prefix_addresses); -} - -/* Determine of the given address has a symbol associated with it. */ - -static int -objdump_symbol_at_address (vma, info) - bfd_vma vma; - struct disassemble_info * info; -{ - struct objdump_disasm_info * aux; - asymbol * sym; - - /* No symbols - do not bother checking. */ - if (sorted_symcount < 1) - return 0; - - aux = (struct objdump_disasm_info *) info->application_data; - sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec, - (long *) NULL); - - return (sym != NULL && (bfd_asymbol_value (sym) == vma)); -} - -/* Hold the last function name and the last line number we displayed - in a disassembly. */ - -static char *prev_functionname; -static unsigned int prev_line; - -/* We keep a list of all files that we have seen when doing a - dissassembly with source, so that we know how much of the file to - display. This can be important for inlined functions. */ - -struct print_file_list -{ - struct print_file_list *next; - char *filename; - unsigned int line; - FILE *f; -}; - -static struct print_file_list *print_files; - -/* The number of preceding context lines to show when we start - displaying a file for the first time. */ - -#define SHOW_PRECEDING_CONTEXT_LINES (5) - -/* Skip ahead to a given line in a file, optionally printing each - line. */ - -static void -skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean)); - -static void -skip_to_line (p, line, show) - struct print_file_list *p; - unsigned int line; - boolean show; -{ - while (p->line < line) - { - char buf[100]; - - if (fgets (buf, sizeof buf, p->f) == NULL) - { - fclose (p->f); - p->f = NULL; - break; - } - - if (show) - printf ("%s", buf); - - if (strchr (buf, '\n') != NULL) - ++p->line; - } -} - -/* Show the line number, or the source line, in a dissassembly - listing. */ - -static void -show_line (abfd, section, addr_offset) - bfd *abfd; - asection *section; - bfd_vma addr_offset; -{ - CONST char *filename; - CONST char *functionname; - unsigned int line; - - if (! with_line_numbers && ! with_source_code) - return; - - if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename, - &functionname, &line)) - return; - - if (filename != NULL && *filename == '\0') - filename = NULL; - if (functionname != NULL && *functionname == '\0') - functionname = NULL; - - if (with_line_numbers) - { - if (functionname != NULL - && (prev_functionname == NULL - || strcmp (functionname, prev_functionname) != 0)) - printf ("%s():\n", functionname); - if (line > 0 && line != prev_line) - printf ("%s:%u\n", filename == NULL ? "???" : filename, line); - } - - if (with_source_code - && filename != NULL - && line > 0) - { - struct print_file_list **pp, *p; - - for (pp = &print_files; *pp != NULL; pp = &(*pp)->next) - if (strcmp ((*pp)->filename, filename) == 0) - break; - p = *pp; - - if (p != NULL) - { - if (p != print_files) - { - int l; - - /* We have reencountered a file name which we saw - earlier. This implies that either we are dumping out - code from an included file, or the same file was - linked in more than once. There are two common cases - of an included file: inline functions in a header - file, and a bison or flex skeleton file. In the - former case we want to just start printing (but we - back up a few lines to give context); in the latter - case we want to continue from where we left off. I - can't think of a good way to distinguish the cases, - so I used a heuristic based on the file name. */ - if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0) - l = p->line; - else - { - l = line - SHOW_PRECEDING_CONTEXT_LINES; - if (l < 0) - l = 0; - } - - if (p->f == NULL) - { - p->f = fopen (p->filename, "r"); - p->line = 0; - } - if (p->f != NULL) - skip_to_line (p, l, false); - - if (print_files->f != NULL) - { - fclose (print_files->f); - print_files->f = NULL; - } - } - - if (p->f != NULL) - { - skip_to_line (p, line, true); - *pp = p->next; - p->next = print_files; - print_files = p; - } - } - else - { - FILE *f; - - f = fopen (filename, "r"); - if (f != NULL) - { - int l; - - p = ((struct print_file_list *) - xmalloc (sizeof (struct print_file_list))); - p->filename = xmalloc (strlen (filename) + 1); - strcpy (p->filename, filename); - p->line = 0; - p->f = f; - - if (print_files != NULL && print_files->f != NULL) - { - fclose (print_files->f); - print_files->f = NULL; - } - p->next = print_files; - print_files = p; - - if (file_start_context) - l = 0; - else - l = line - SHOW_PRECEDING_CONTEXT_LINES; - if (l < 0) - l = 0; - skip_to_line (p, l, false); - if (p->f != NULL) - skip_to_line (p, line, true); - } - } - } - - if (functionname != NULL - && (prev_functionname == NULL - || strcmp (functionname, prev_functionname) != 0)) - { - if (prev_functionname != NULL) - free (prev_functionname); - prev_functionname = xmalloc (strlen (functionname) + 1); - strcpy (prev_functionname, functionname); - } - - if (line > 0 && line != prev_line) - prev_line = line; -} - -/* Pseudo FILE object for strings. */ -typedef struct -{ - char *buffer; - size_t size; - char *current; -} SFILE; - -/* sprintf to a "stream" */ - -static int -#ifdef ANSI_PROTOTYPES -objdump_sprintf (SFILE *f, const char *format, ...) -#else -objdump_sprintf (va_alist) - va_dcl -#endif -{ -#ifndef ANSI_PROTOTYPES - SFILE *f; - const char *format; -#endif - char *buf; - va_list args; - size_t n; - -#ifdef ANSI_PROTOTYPES - va_start (args, format); -#else - va_start (args); - f = va_arg (args, SFILE *); - format = va_arg (args, const char *); -#endif - - vasprintf (&buf, format, args); - - va_end (args); - - if (buf == NULL) - { - fatal (_("Out of virtual memory")); - } - - n = strlen (buf); - - while ((size_t) ((f->buffer + f->size) - f->current) < n + 1) - { - size_t curroff; - - curroff = f->current - f->buffer; - f->size *= 2; - f->buffer = xrealloc (f->buffer, f->size); - f->current = f->buffer + curroff; - } - - memcpy (f->current, buf, n); - f->current += n; - f->current[0] = '\0'; - - free (buf); - - return n; -} - -/* The number of zeroes we want to see before we start skipping them. - The number is arbitrarily chosen. */ - -#define SKIP_ZEROES (8) - -/* The number of zeroes to skip at the end of a section. If the - number of zeroes at the end is between SKIP_ZEROES_AT_END and - SKIP_ZEROES, they will be disassembled. If there are fewer than - SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic - attempt to avoid disassembling zeroes inserted by section - alignment. */ - -#define SKIP_ZEROES_AT_END (3) - -/* Disassemble some data in memory between given values. */ - -static void -disassemble_bytes (info, disassemble_fn, insns, data, - start_offset, stop_offset, relppp, - relppend) - struct disassemble_info *info; - disassembler_ftype disassemble_fn; - boolean insns; - bfd_byte *data; - bfd_vma start_offset; - bfd_vma stop_offset; - arelent ***relppp; - arelent **relppend; -{ - struct objdump_disasm_info *aux; - asection *section; - int octets_per_line; - boolean done_dot; - int skip_addr_chars; - bfd_vma addr_offset; - int opb = info->octets_per_byte; - - aux = (struct objdump_disasm_info *) info->application_data; - section = aux->sec; - - if (insns) - octets_per_line = 4; - else - octets_per_line = 16; - - /* Figure out how many characters to skip at the start of an - address, to make the disassembly look nicer. We discard leading - zeroes in chunks of 4, ensuring that there is always a leading - zero remaining. */ - skip_addr_chars = 0; - if (! prefix_addresses) - { - char buf[30]; - char *s; - - sprintf_vma (buf, section->vma + - bfd_section_size (section->owner, section) / opb); - s = buf; - while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0' - && s[4] == '0') - { - skip_addr_chars += 4; - s += 4; - } - } - - info->insn_info_valid = 0; - - done_dot = false; - addr_offset = start_offset; - while (addr_offset < stop_offset) - { - bfd_vma z; - int octets = 0; - boolean need_nl = false; - - /* If we see more than SKIP_ZEROES octets of zeroes, we just - print `...'. */ - for (z = addr_offset * opb; z < stop_offset * opb; z++) - if (data[z] != 0) - break; - if (! disassemble_zeroes - && (info->insn_info_valid == 0 - || info->branch_delay_insns == 0) - && (z - addr_offset * opb >= SKIP_ZEROES - || (z == stop_offset * opb && - z - addr_offset * opb < SKIP_ZEROES_AT_END))) - { - printf ("\t...\n"); - - /* If there are more nonzero octets to follow, we only skip - zeroes in multiples of 4, to try to avoid running over - the start of an instruction which happens to start with - zero. */ - if (z != stop_offset * opb) - z = addr_offset * opb + ((z - addr_offset * opb) &~ 3); - - octets = z - addr_offset * opb; - } - else - { - char buf[50]; - SFILE sfile; - int bpc = 0; - int pb = 0; - - done_dot = false; - - if (with_line_numbers || with_source_code) - show_line (aux->abfd, section, addr_offset); - - if (! prefix_addresses) - { - char *s; - - sprintf_vma (buf, section->vma + addr_offset); - for (s = buf + skip_addr_chars; *s == '0'; s++) - *s = ' '; - if (*s == '\0') - *--s = '0'; - printf ("%s:\t", buf + skip_addr_chars); - } - else - { - aux->require_sec = true; - objdump_print_address (section->vma + addr_offset, info); - aux->require_sec = false; - putchar (' '); - } - - if (insns) - { - sfile.size = 120; - sfile.buffer = xmalloc (sfile.size); - sfile.current = sfile.buffer; - info->fprintf_func = (fprintf_ftype) objdump_sprintf; - info->stream = (FILE *) &sfile; - info->bytes_per_line = 0; - info->bytes_per_chunk = 0; - - /* FIXME: This is wrong. It tests the number of octets - in the last instruction, not the current one. */ - if (*relppp < relppend - && (**relppp)->address >= addr_offset - && (**relppp)->address < addr_offset + octets / opb) - info->flags = INSN_HAS_RELOC; - else - info->flags = 0; - - octets = (*disassemble_fn) (section->vma + addr_offset, info); - info->fprintf_func = (fprintf_ftype) fprintf; - info->stream = stdout; - if (info->bytes_per_line != 0) - octets_per_line = info->bytes_per_line; - if (octets < 0) - { - if (sfile.current != sfile.buffer) - printf ("%s\n", sfile.buffer); - free (sfile.buffer); - break; - } - } - else - { - bfd_vma j; - - octets = octets_per_line; - if (addr_offset + octets / opb > stop_offset) - octets = (stop_offset - addr_offset) * opb; - - for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j) - { - if (isprint (data[j])) - buf[j - addr_offset * opb] = data[j]; - else - buf[j - addr_offset * opb] = '.'; - } - buf[j - addr_offset * opb] = '\0'; - } - - if (prefix_addresses - ? show_raw_insn > 0 - : show_raw_insn >= 0) - { - bfd_vma j; - - /* If ! prefix_addresses and ! wide_output, we print - octets_per_line octets per line. */ - pb = octets; - if (pb > octets_per_line && ! prefix_addresses && ! wide_output) - pb = octets_per_line; - - if (info->bytes_per_chunk) - bpc = info->bytes_per_chunk; - else - bpc = 1; - - for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc) - { - int k; - if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE) - { - for (k = bpc - 1; k >= 0; k--) - printf ("%02x", (unsigned) data[j + k]); - putchar (' '); - } - else - { - for (k = 0; k < bpc; k++) - printf ("%02x", (unsigned) data[j + k]); - putchar (' '); - } - } - - for (; pb < octets_per_line; pb += bpc) - { - int k; - - for (k = 0; k < bpc; k++) - printf (" "); - putchar (' '); - } - - /* Separate raw data from instruction by extra space. */ - if (insns) - putchar ('\t'); - else - printf (" "); - } - - if (! insns) - printf ("%s", buf); - else - { - printf ("%s", sfile.buffer); - free (sfile.buffer); - } - - if (prefix_addresses - ? show_raw_insn > 0 - : show_raw_insn >= 0) - { - while (pb < octets) - { - bfd_vma j; - char *s; - - putchar ('\n'); - j = addr_offset * opb + pb; - - sprintf_vma (buf, section->vma + j / opb); - for (s = buf + skip_addr_chars; *s == '0'; s++) - *s = ' '; - if (*s == '\0') - *--s = '0'; - printf ("%s:\t", buf + skip_addr_chars); - - pb += octets_per_line; - if (pb > octets) - pb = octets; - for (; j < addr_offset * opb + pb; j += bpc) - { - int k; - - if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE) - { - for (k = bpc - 1; k >= 0; k--) - printf ("%02x", (unsigned) data[j + k]); - putchar (' '); - } - else - { - for (k = 0; k < bpc; k++) - printf ("%02x", (unsigned) data[j + k]); - putchar (' '); - } - } - } - } - - if (!wide_output) - putchar ('\n'); - else - need_nl = true; - } - - if (dump_reloc_info - && (section->flags & SEC_RELOC) != 0) - { - while ((*relppp) < relppend - && ((**relppp)->address >= (bfd_vma) addr_offset - && (**relppp)->address < (bfd_vma) addr_offset + octets / opb)) - { - arelent *q; - - q = **relppp; - - if (wide_output) - putchar ('\t'); - else - printf ("\t\t\t"); - - objdump_print_value (section->vma + q->address, info, true); - - printf (": %s\t", q->howto->name); - - if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL) - printf ("*unknown*"); - else - { - const char *sym_name; - - sym_name = bfd_asymbol_name (*q->sym_ptr_ptr); - if (sym_name != NULL && *sym_name != '\0') - objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr); - else - { - asection *sym_sec; - - sym_sec = bfd_get_section (*q->sym_ptr_ptr); - sym_name = bfd_get_section_name (aux->abfd, sym_sec); - if (sym_name == NULL || *sym_name == '\0') - sym_name = "*unknown*"; - printf ("%s", sym_name); - } - } - - if (q->addend) - { - printf ("+0x"); - objdump_print_value (q->addend, info, true); - } - - printf ("\n"); - need_nl = false; - ++(*relppp); - } - } - - if (need_nl) - printf ("\n"); - - addr_offset += octets / opb; - } -} - -/* Disassemble the contents of an object file. */ - -static void -disassemble_data (abfd) - bfd *abfd; -{ - unsigned long addr_offset; - disassembler_ftype disassemble_fn; - struct disassemble_info disasm_info; - struct objdump_disasm_info aux; - asection *section; - unsigned int opb = bfd_octets_per_byte (abfd); - - print_files = NULL; - prev_functionname = NULL; - prev_line = -1; - - /* We make a copy of syms to sort. We don't want to sort syms - because that will screw up the relocs. */ - sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *)); - memcpy (sorted_syms, syms, symcount * sizeof (asymbol *)); - - sorted_symcount = remove_useless_symbols (sorted_syms, symcount); - - /* Sort the symbols into section and symbol order */ - qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols); - - INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf); - disasm_info.application_data = (PTR) &aux; - aux.abfd = abfd; - aux.require_sec = false; - disasm_info.print_address_func = objdump_print_address; - disasm_info.symbol_at_address_func = objdump_symbol_at_address; - disasm_info.octets_per_byte = opb; - - if (machine != (char *) NULL) - { - const bfd_arch_info_type *info = bfd_scan_arch (machine); - if (info == NULL) - { - fatal (_("Can't use supplied machine %s"), machine); - } - abfd->arch_info = info; - } - - if (endian != BFD_ENDIAN_UNKNOWN) - { - struct bfd_target *xvec; - - xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target)); - memcpy (xvec, abfd->xvec, sizeof (struct bfd_target)); - xvec->byteorder = endian; - abfd->xvec = xvec; - } - - disassemble_fn = disassembler (abfd); - if (!disassemble_fn) - { - non_fatal (_("Can't disassemble for architecture %s\n"), - bfd_printable_arch_mach (bfd_get_arch (abfd), 0)); - exit_status = 1; - return; - } - - disasm_info.flavour = bfd_get_flavour (abfd); - disasm_info.arch = bfd_get_arch (abfd); - disasm_info.mach = bfd_get_mach (abfd); - disasm_info.disassembler_options = disassembler_options; - - if (bfd_big_endian (abfd)) - disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG; - else if (bfd_little_endian (abfd)) - disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE; - else - /* ??? Aborting here seems too drastic. We could default to big or little - instead. */ - disasm_info.endian = BFD_ENDIAN_UNKNOWN; - - for (section = abfd->sections; - section != (asection *) NULL; - section = section->next) - { - bfd_byte *data = NULL; - bfd_size_type datasize = 0; - arelent **relbuf = NULL; - arelent **relpp = NULL; - arelent **relppend = NULL; - unsigned long stop_offset; - asymbol *sym = NULL; - long place = 0; - - if ((section->flags & SEC_LOAD) == 0 - || (! disassemble_all - && only == NULL - && (section->flags & SEC_CODE) == 0)) - continue; - if (only != (char *) NULL && strcmp (only, section->name) != 0) - continue; - - if (dump_reloc_info - && (section->flags & SEC_RELOC) != 0) - { - long relsize; - - relsize = bfd_get_reloc_upper_bound (abfd, section); - if (relsize < 0) - bfd_fatal (bfd_get_filename (abfd)); - - if (relsize > 0) - { - long relcount; - - relbuf = (arelent **) xmalloc (relsize); - relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms); - if (relcount < 0) - bfd_fatal (bfd_get_filename (abfd)); - - /* Sort the relocs by address. */ - qsort (relbuf, relcount, sizeof (arelent *), compare_relocs); - - relpp = relbuf; - relppend = relpp + relcount; - - /* Skip over the relocs belonging to addresses below the - start address. */ - if (start_address != (bfd_vma) -1) - { - while (relpp < relppend - && (*relpp)->address < start_address) - ++relpp; - } - } - } - - printf (_("Disassembly of section %s:\n"), section->name); - - datasize = bfd_get_section_size_before_reloc (section); - if (datasize == 0) - continue; - - data = (bfd_byte *) xmalloc ((size_t) datasize); - - bfd_get_section_contents (abfd, section, data, 0, datasize); - - aux.sec = section; - disasm_info.buffer = data; - disasm_info.buffer_vma = section->vma; - disasm_info.buffer_length = datasize; - if (start_address == (bfd_vma) -1 - || start_address < disasm_info.buffer_vma) - addr_offset = 0; - else - addr_offset = start_address - disasm_info.buffer_vma; - if (stop_address == (bfd_vma) -1) - stop_offset = datasize / opb; - else - { - if (stop_address < disasm_info.buffer_vma) - stop_offset = 0; - else - stop_offset = stop_address - disasm_info.buffer_vma; - if (stop_offset > disasm_info.buffer_length / opb) - stop_offset = disasm_info.buffer_length / opb; - } - - sym = find_symbol_for_address (abfd, section, section->vma + addr_offset, - true, &place); - - while (addr_offset < stop_offset) - { - asymbol *nextsym; - unsigned long nextstop_offset; - boolean insns; - - if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + addr_offset) - { - int x; - - for (x = place; - (x < sorted_symcount - && bfd_asymbol_value (sorted_syms[x]) <= section->vma + addr_offset); - ++x) - continue; - disasm_info.symbols = & sorted_syms[place]; - disasm_info.num_symbols = x - place; - } - else - disasm_info.symbols = NULL; - - if (! prefix_addresses) - { - printf ("\n"); - objdump_print_addr_with_sym (abfd, section, sym, - section->vma + addr_offset, - &disasm_info, - false); - printf (":\n"); - } - - if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset) - nextsym = sym; - else if (sym == NULL) - nextsym = NULL; - else - { - /* Search forward for the next appropriate symbol in - SECTION. Note that all the symbols are sorted - together into one big array, and that some sections - may have overlapping addresses. */ - while (place < sorted_symcount - && (sorted_syms[place]->section != section - || (bfd_asymbol_value (sorted_syms[place]) - <= bfd_asymbol_value (sym)))) - ++place; - if (place >= sorted_symcount) - nextsym = NULL; - else - nextsym = sorted_syms[place]; - } - - if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset) - { - nextstop_offset = bfd_asymbol_value (sym) - section->vma; - if (nextstop_offset > stop_offset) - nextstop_offset = stop_offset; - } - else if (nextsym == NULL) - nextstop_offset = stop_offset; - else - { - nextstop_offset = bfd_asymbol_value (nextsym) - section->vma; - if (nextstop_offset > stop_offset) - nextstop_offset = stop_offset; - } - - /* If a symbol is explicitly marked as being an object - rather than a function, just dump the bytes without - disassembling them. */ - if (disassemble_all - || sym == NULL - || bfd_asymbol_value (sym) > section->vma + addr_offset - || ((sym->flags & BSF_OBJECT) == 0 - && (strstr (bfd_asymbol_name (sym), "gnu_compiled") - == NULL) - && (strstr (bfd_asymbol_name (sym), "gcc2_compiled") - == NULL)) - || (sym->flags & BSF_FUNCTION) != 0) - insns = true; - else - insns = false; - - disassemble_bytes (&disasm_info, disassemble_fn, insns, data, - addr_offset, nextstop_offset, &relpp, relppend); - - addr_offset = nextstop_offset; - sym = nextsym; - } - - free (data); - if (relbuf != NULL) - free (relbuf); - } - free (sorted_syms); -} - - -/* Define a table of stab values and print-strings. We wish the initializer - could be a direct-mapped table, but instead we build one the first - time we need it. */ - -static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name, - char *strsect_name)); - -/* Dump the stabs sections from an object file that has a section that - uses Sun stabs encoding. */ - -static void -dump_stabs (abfd) - bfd *abfd; -{ - dump_section_stabs (abfd, ".stab", ".stabstr"); - dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr"); - dump_section_stabs (abfd, ".stab.index", ".stab.indexstr"); - dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$"); -} - -static bfd_byte *stabs; -static bfd_size_type stab_size; - -static char *strtab; -static bfd_size_type stabstr_size; - -/* Read ABFD's stabs section STABSECT_NAME into `stabs' - and string table section STRSECT_NAME into `strtab'. - If the section exists and was read, allocate the space and return true. - Otherwise return false. */ - -static boolean -read_section_stabs (abfd, stabsect_name, strsect_name) - bfd *abfd; - const char *stabsect_name; - const char *strsect_name; -{ - asection *stabsect, *stabstrsect; - - stabsect = bfd_get_section_by_name (abfd, stabsect_name); - if (0 == stabsect) - { - printf (_("No %s section present\n\n"), stabsect_name); - return false; - } - - stabstrsect = bfd_get_section_by_name (abfd, strsect_name); - if (0 == stabstrsect) - { - non_fatal (_("%s has no %s section"), - bfd_get_filename (abfd), strsect_name); - exit_status = 1; - return false; - } - - stab_size = bfd_section_size (abfd, stabsect); - stabstr_size = bfd_section_size (abfd, stabstrsect); - - stabs = (bfd_byte *) xmalloc (stab_size); - strtab = (char *) xmalloc (stabstr_size); - - if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size)) - { - non_fatal (_("Reading %s section of %s failed: %s"), - stabsect_name, bfd_get_filename (abfd), - bfd_errmsg (bfd_get_error ())); - free (stabs); - free (strtab); - exit_status = 1; - return false; - } - - if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0, - stabstr_size)) - { - non_fatal (_("Reading %s section of %s failed: %s\n"), - strsect_name, bfd_get_filename (abfd), - bfd_errmsg (bfd_get_error ())); - free (stabs); - free (strtab); - exit_status = 1; - return false; - } - - return true; -} - -/* Stabs entries use a 12 byte format: - 4 byte string table index - 1 byte stab type - 1 byte stab other field - 2 byte stab desc field - 4 byte stab value - FIXME: This will have to change for a 64 bit object format. */ - -#define STRDXOFF (0) -#define TYPEOFF (4) -#define OTHEROFF (5) -#define DESCOFF (6) -#define VALOFF (8) -#define STABSIZE (12) - -/* Print ABFD's stabs section STABSECT_NAME (in `stabs'), - using string table section STRSECT_NAME (in `strtab'). */ - -static void -print_section_stabs (abfd, stabsect_name, strsect_name) - bfd *abfd; - const char *stabsect_name; - const char *strsect_name ATTRIBUTE_UNUSED; -{ - int i; - unsigned file_string_table_offset = 0, next_file_string_table_offset = 0; - bfd_byte *stabp, *stabs_end; - - stabp = stabs; - stabs_end = stabp + stab_size; - - printf (_("Contents of %s section:\n\n"), stabsect_name); - printf ("Symnum n_type n_othr n_desc n_value n_strx String\n"); - - /* Loop through all symbols and print them. - - We start the index at -1 because there is a dummy symbol on - the front of stabs-in-{coff,elf} sections that supplies sizes. */ - - for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++) - { - const char *name; - unsigned long strx; - unsigned char type, other; - unsigned short desc; - bfd_vma value; - - strx = bfd_h_get_32 (abfd, stabp + STRDXOFF); - type = bfd_h_get_8 (abfd, stabp + TYPEOFF); - other = bfd_h_get_8 (abfd, stabp + OTHEROFF); - desc = bfd_h_get_16 (abfd, stabp + DESCOFF); - value = bfd_h_get_32 (abfd, stabp + VALOFF); - - printf ("\n%-6d ", i); - /* Either print the stab name, or, if unnamed, print its number - again (makes consistent formatting for tools like awk). */ - name = bfd_get_stab_name (type); - if (name != NULL) - printf ("%-6s", name); - else if (type == N_UNDF) - printf ("HdrSym"); - else - printf ("%-6d", type); - printf (" %-6d %-6d ", other, desc); - printf_vma (value); - printf (" %-6lu", strx); - - /* Symbols with type == 0 (N_UNDF) specify the length of the - string table associated with this file. We use that info - to know how to relocate the *next* file's string table indices. */ - - if (type == N_UNDF) - { - file_string_table_offset = next_file_string_table_offset; - next_file_string_table_offset += value; - } - else - { - /* Using the (possibly updated) string table offset, print the - string (if any) associated with this symbol. */ - - if ((strx + file_string_table_offset) < stabstr_size) - printf (" %s", &strtab[strx + file_string_table_offset]); - else - printf (" *"); - } - } - printf ("\n\n"); -} - -static void -dump_section_stabs (abfd, stabsect_name, strsect_name) - bfd *abfd; - char *stabsect_name; - char *strsect_name; -{ - asection *s; - - /* Check for section names for which stabsect_name is a prefix, to - handle .stab0, etc. */ - for (s = abfd->sections; - s != NULL; - s = s->next) - { - int len; - - len = strlen (stabsect_name); - - /* If the prefix matches, and the files section name ends with a - nul or a digit, then we match. I.e., we want either an exact - match or a section followed by a number. */ - if (strncmp (stabsect_name, s->name, len) == 0 - && (s->name[len] == '\000' - || isdigit ((unsigned char) s->name[len]))) - { - if (read_section_stabs (abfd, s->name, strsect_name)) - { - print_section_stabs (abfd, s->name, strsect_name); - free (stabs); - free (strtab); - } - } - } -} - -static void -dump_bfd_header (abfd) - bfd *abfd; -{ - char *comma = ""; - - printf (_("architecture: %s, "), - bfd_printable_arch_mach (bfd_get_arch (abfd), - bfd_get_mach (abfd))); - printf (_("flags 0x%08x:\n"), abfd->flags); - -#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";} - PF (HAS_RELOC, "HAS_RELOC"); - PF (EXEC_P, "EXEC_P"); - PF (HAS_LINENO, "HAS_LINENO"); - PF (HAS_DEBUG, "HAS_DEBUG"); - PF (HAS_SYMS, "HAS_SYMS"); - PF (HAS_LOCALS, "HAS_LOCALS"); - PF (DYNAMIC, "DYNAMIC"); - PF (WP_TEXT, "WP_TEXT"); - PF (D_PAGED, "D_PAGED"); - PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE"); - printf (_("\nstart address 0x")); - printf_vma (abfd->start_address); - printf ("\n"); -} - -static void -dump_bfd_private_header (abfd) -bfd *abfd; -{ - bfd_print_private_bfd_data (abfd, stdout); -} - -/* Dump selected contents of ABFD */ - -static void -dump_bfd (abfd) - bfd *abfd; -{ - /* If we are adjusting section VMA's, change them all now. Changing - the BFD information is a hack. However, we must do it, or - bfd_find_nearest_line will not do the right thing. */ - if (adjust_section_vma != 0) - { - asection *s; - - for (s = abfd->sections; s != NULL; s = s->next) - { - s->vma += adjust_section_vma; - s->lma += adjust_section_vma; - } - } - - printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd), - abfd->xvec->name); - if (dump_ar_hdrs) - print_arelt_descr (stdout, abfd, true); - if (dump_file_header) - dump_bfd_header (abfd); - if (dump_private_headers) - dump_bfd_private_header (abfd); - putchar ('\n'); - if (dump_section_headers) - dump_headers (abfd); - if (dump_symtab || dump_reloc_info || disassemble || dump_debugging) - { - syms = slurp_symtab (abfd); - } - if (dump_dynamic_symtab || dump_dynamic_reloc_info) - { - dynsyms = slurp_dynamic_symtab (abfd); - } - if (dump_symtab) - dump_symbols (abfd, false); - if (dump_dynamic_symtab) - dump_symbols (abfd, true); - if (dump_stab_section_info) - dump_stabs (abfd); - if (dump_reloc_info && ! disassemble) - dump_relocs (abfd); - if (dump_dynamic_reloc_info) - dump_dynamic_relocs (abfd); - if (dump_section_contents) - dump_data (abfd); - if (disassemble) - disassemble_data (abfd); - if (dump_debugging) - { - PTR dhandle; - - dhandle = read_debugging_info (abfd, syms, symcount); - if (dhandle != NULL) - { - if (! print_debugging_info (stdout, dhandle)) - { - non_fatal (_("%s: printing debugging information failed"), - bfd_get_filename (abfd)); - exit_status = 1; - } - } - } - if (syms) - { - free (syms); - syms = NULL; - } - if (dynsyms) - { - free (dynsyms); - dynsyms = NULL; - } -} - -static void -display_bfd (abfd) - bfd *abfd; -{ - char **matching; - - if (bfd_check_format_matches (abfd, bfd_object, &matching)) - { - dump_bfd (abfd); - return; - } - - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - nonfatal (bfd_get_filename (abfd)); - list_matching_formats (matching); - free (matching); - return; - } - - if (bfd_get_error () != bfd_error_file_not_recognized) - { - nonfatal (bfd_get_filename (abfd)); - return; - } - - if (bfd_check_format_matches (abfd, bfd_core, &matching)) - { - dump_bfd (abfd); - return; - } - - nonfatal (bfd_get_filename (abfd)); - - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } -} - -static void -display_file (filename, target) - char *filename; - char *target; -{ - bfd *file, *arfile = (bfd *) NULL; - - file = bfd_openr (filename, target); - if (file == NULL) - { - nonfatal (filename); - return; - } - - if (bfd_check_format (file, bfd_archive) == true) - { - bfd *last_arfile = NULL; - - printf (_("In archive %s:\n"), bfd_get_filename (file)); - for (;;) - { - bfd_set_error (bfd_error_no_error); - - arfile = bfd_openr_next_archived_file (file, arfile); - if (arfile == NULL) - { - if (bfd_get_error () != bfd_error_no_more_archived_files) - nonfatal (bfd_get_filename (file)); - break; - } - - display_bfd (arfile); - - if (last_arfile != NULL) - bfd_close (last_arfile); - last_arfile = arfile; - } - - if (last_arfile != NULL) - bfd_close (last_arfile); - } - else - display_bfd (file); - - bfd_close (file); -} - -/* Actually display the various requested regions */ - -static void -dump_data (abfd) - bfd *abfd; -{ - asection *section; - bfd_byte *data = 0; - bfd_size_type datasize = 0; - bfd_size_type addr_offset; - bfd_size_type start_offset, stop_offset; - unsigned int opb = bfd_octets_per_byte (abfd); - - for (section = abfd->sections; section != NULL; section = - section->next) - { - int onaline = 16; - - if (only == (char *) NULL || - strcmp (only, section->name) == 0) - { - if (section->flags & SEC_HAS_CONTENTS) - { - printf (_("Contents of section %s:\n"), section->name); - - if (bfd_section_size (abfd, section) == 0) - continue; - data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section)); - datasize = bfd_section_size (abfd, section); - - - bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section)); - - if (start_address == (bfd_vma) -1 - || start_address < section->vma) - start_offset = 0; - else - start_offset = start_address - section->vma; - if (stop_address == (bfd_vma) -1) - stop_offset = bfd_section_size (abfd, section) / opb; - else - { - if (stop_address < section->vma) - stop_offset = 0; - else - stop_offset = stop_address - section->vma; - if (stop_offset > bfd_section_size (abfd, section) / opb) - stop_offset = bfd_section_size (abfd, section) / opb; - } - for (addr_offset = start_offset; - addr_offset < stop_offset; addr_offset += onaline) - { - bfd_size_type j; - - printf (" %04lx ", (unsigned long int) - (addr_offset + section->vma)); - for (j = addr_offset * opb; - j < addr_offset * opb + onaline; j++) - { - if (j < stop_offset * opb) - printf ("%02x", (unsigned) (data[j])); - else - printf (" "); - if ((j & 3) == 3) - printf (" "); - } - - printf (" "); - for (j = addr_offset; j < addr_offset * opb + onaline; j++) - { - if (j >= stop_offset * opb) - printf (" "); - else - printf ("%c", isprint (data[j]) ? data[j] : '.'); - } - putchar ('\n'); - } - free (data); - } - } - } -} - -/* Should perhaps share code and display with nm? */ -static void -dump_symbols (abfd, dynamic) - bfd *abfd ATTRIBUTE_UNUSED; - boolean dynamic; -{ - asymbol **current; - long max; - long count; - - if (dynamic) - { - current = dynsyms; - max = dynsymcount; - if (max == 0) - return; - printf ("DYNAMIC SYMBOL TABLE:\n"); - } - else - { - current = syms; - max = symcount; - if (max == 0) - return; - printf ("SYMBOL TABLE:\n"); - } - - for (count = 0; count < max; count++) - { - if (*current) - { - bfd *cur_bfd = bfd_asymbol_bfd (*current); - - if (cur_bfd != NULL) - { - const char *name; - char *alloc; - - name = bfd_asymbol_name (*current); - alloc = NULL; - if (do_demangle && name != NULL && *name != '\0') - { - const char *n; - - /* If we want to demangle the name, we demangle it - here, and temporarily clobber it while calling - bfd_print_symbol. FIXME: This is a gross hack. */ - - n = name; - if (bfd_get_symbol_leading_char (cur_bfd) == *n) - ++n; - alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS); - if (alloc != NULL) - (*current)->name = alloc; - else - (*current)->name = n; - } - - bfd_print_symbol (cur_bfd, stdout, *current, - bfd_print_symbol_all); - - (*current)->name = name; - if (alloc != NULL) - free (alloc); - - printf ("\n"); - } - } - current++; - } - printf ("\n"); - printf ("\n"); -} - -static void -dump_relocs (abfd) - bfd *abfd; -{ - arelent **relpp; - long relcount; - asection *a; - - for (a = abfd->sections; a != (asection *) NULL; a = a->next) - { - long relsize; - - if (bfd_is_abs_section (a)) - continue; - if (bfd_is_und_section (a)) - continue; - if (bfd_is_com_section (a)) - continue; - - if (only) - { - if (strcmp (only, a->name)) - continue; - } - else if ((a->flags & SEC_RELOC) == 0) - continue; - - relsize = bfd_get_reloc_upper_bound (abfd, a); - if (relsize < 0) - bfd_fatal (bfd_get_filename (abfd)); - - printf ("RELOCATION RECORDS FOR [%s]:", a->name); - - if (relsize == 0) - { - printf (" (none)\n\n"); - } - else - { - relpp = (arelent **) xmalloc (relsize); - relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms); - if (relcount < 0) - bfd_fatal (bfd_get_filename (abfd)); - else if (relcount == 0) - { - printf (" (none)\n\n"); - } - else - { - printf ("\n"); - dump_reloc_set (abfd, a, relpp, relcount); - printf ("\n\n"); - } - free (relpp); - } - } -} - -static void -dump_dynamic_relocs (abfd) - bfd *abfd; -{ - long relsize; - arelent **relpp; - long relcount; - - relsize = bfd_get_dynamic_reloc_upper_bound (abfd); - if (relsize < 0) - bfd_fatal (bfd_get_filename (abfd)); - - printf ("DYNAMIC RELOCATION RECORDS"); - - if (relsize == 0) - { - printf (" (none)\n\n"); - } - else - { - relpp = (arelent **) xmalloc (relsize); - relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms); - if (relcount < 0) - bfd_fatal (bfd_get_filename (abfd)); - else if (relcount == 0) - { - printf (" (none)\n\n"); - } - else - { - printf ("\n"); - dump_reloc_set (abfd, (asection *) NULL, relpp, relcount); - printf ("\n\n"); - } - free (relpp); - } -} - -static void -dump_reloc_set (abfd, sec, relpp, relcount) - bfd *abfd; - asection *sec; - arelent **relpp; - long relcount; -{ - arelent **p; - char *last_filename, *last_functionname; - unsigned int last_line; - - /* Get column headers lined up reasonably. */ - { - static int width; - if (width == 0) - { - char buf[30]; - sprintf_vma (buf, (bfd_vma) -1); - width = strlen (buf) - 7; - } - printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, ""); - } - - last_filename = NULL; - last_functionname = NULL; - last_line = 0; - - for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--) - { - arelent *q = *p; - const char *filename, *functionname; - unsigned int line; - const char *sym_name; - const char *section_name; - - if (start_address != (bfd_vma) -1 - && q->address < start_address) - continue; - if (stop_address != (bfd_vma) -1 - && q->address > stop_address) - continue; - - if (with_line_numbers - && sec != NULL - && bfd_find_nearest_line (abfd, sec, syms, q->address, - &filename, &functionname, &line)) - { - if (functionname != NULL - && (last_functionname == NULL - || strcmp (functionname, last_functionname) != 0)) - { - printf ("%s():\n", functionname); - if (last_functionname != NULL) - free (last_functionname); - last_functionname = xstrdup (functionname); - } - if (line > 0 - && (line != last_line - || (filename != NULL - && last_filename != NULL - && strcmp (filename, last_filename) != 0))) - { - printf ("%s:%u\n", filename == NULL ? "???" : filename, line); - last_line = line; - if (last_filename != NULL) - free (last_filename); - if (filename == NULL) - last_filename = NULL; - else - last_filename = xstrdup (filename); - } - } - - if (q->sym_ptr_ptr && *q->sym_ptr_ptr) - { - sym_name = (*(q->sym_ptr_ptr))->name; - section_name = (*(q->sym_ptr_ptr))->section->name; - } - else - { - sym_name = NULL; - section_name = NULL; - } - if (sym_name) - { - printf_vma (q->address); - if (q->howto->name) - printf (" %-16s ", q->howto->name); - else - printf (" %-16d ", q->howto->type); - objdump_print_symname (abfd, (struct disassemble_info *) NULL, - *q->sym_ptr_ptr); - } - else - { - if (section_name == (CONST char *) NULL) - section_name = "*unknown*"; - printf_vma (q->address); - printf (" %-16s [%s]", - q->howto->name, - section_name); - } - if (q->addend) - { - printf ("+0x"); - printf_vma (q->addend); - } - printf ("\n"); - } -} - -/* The length of the longest architecture name + 1. */ -#define LONGEST_ARCH sizeof("rs6000:6000") - -static const char * -endian_string (endian) - enum bfd_endian endian; -{ - if (endian == BFD_ENDIAN_BIG) - return "big endian"; - else if (endian == BFD_ENDIAN_LITTLE) - return "little endian"; - else - return "endianness unknown"; -} - -/* List the targets that BFD is configured to support, each followed - by its endianness and the architectures it supports. */ - -static void -display_target_list () -{ - extern bfd_target *bfd_target_vector[]; - char *dummy_name; - int t; - - dummy_name = choose_temp_base (); - for (t = 0; bfd_target_vector[t]; t++) - { - bfd_target *p = bfd_target_vector[t]; - bfd *abfd = bfd_openw (dummy_name, p->name); - int a; - - printf ("%s\n (header %s, data %s)\n", p->name, - endian_string (p->header_byteorder), - endian_string (p->byteorder)); - - if (abfd == NULL) - { - nonfatal (dummy_name); - continue; - } - - if (! bfd_set_format (abfd, bfd_object)) - { - if (bfd_get_error () != bfd_error_invalid_operation) - nonfatal (p->name); - continue; - } - - for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++) - if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0)) - printf (" %s\n", - bfd_printable_arch_mach ((enum bfd_architecture) a, 0)); - } - unlink (dummy_name); - free (dummy_name); -} - -/* Print a table showing which architectures are supported for entries - FIRST through LAST-1 of bfd_target_vector (targets across, - architectures down). */ - -static void -display_info_table (first, last) - int first; - int last; -{ - extern bfd_target *bfd_target_vector[]; - int t, a; - char *dummy_name; - - /* Print heading of target names. */ - printf ("\n%*s", (int) LONGEST_ARCH, " "); - for (t = first; t < last && bfd_target_vector[t]; t++) - printf ("%s ", bfd_target_vector[t]->name); - putchar ('\n'); - - dummy_name = choose_temp_base (); - for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++) - if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0) - { - printf ("%*s ", (int) LONGEST_ARCH - 1, - bfd_printable_arch_mach (a, 0)); - for (t = first; t < last && bfd_target_vector[t]; t++) - { - bfd_target *p = bfd_target_vector[t]; - boolean ok = true; - bfd *abfd = bfd_openw (dummy_name, p->name); - - if (abfd == NULL) - { - nonfatal (p->name); - ok = false; - } - - if (ok) - { - if (! bfd_set_format (abfd, bfd_object)) - { - if (bfd_get_error () != bfd_error_invalid_operation) - nonfatal (p->name); - ok = false; - } - } - - if (ok) - { - if (! bfd_set_arch_mach (abfd, a, 0)) - ok = false; - } - - if (ok) - printf ("%s ", p->name); - else - { - int l = strlen (p->name); - while (l--) - putchar ('-'); - putchar (' '); - } - } - putchar ('\n'); - } - unlink (dummy_name); - free (dummy_name); -} - -/* Print tables of all the target-architecture combinations that - BFD has been configured to support. */ - -static void -display_target_tables () -{ - int t, columns; - extern bfd_target *bfd_target_vector[]; - char *colum; - - columns = 0; - colum = getenv ("COLUMNS"); - if (colum != NULL) - columns = atoi (colum); - if (columns == 0) - columns = 80; - - t = 0; - while (bfd_target_vector[t] != NULL) - { - int oldt = t, wid; - - wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1; - ++t; - while (wid < columns && bfd_target_vector[t] != NULL) - { - int newwid; - - newwid = wid + strlen (bfd_target_vector[t]->name) + 1; - if (newwid >= columns) - break; - wid = newwid; - ++t; - } - display_info_table (oldt, t); - } -} - -static void -display_info () -{ - printf (_("BFD header file version %s\n"), BFD_VERSION); - display_target_list (); - display_target_tables (); -} - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - char *target = default_target; - boolean seenflag = false; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = *argv; - xmalloc_set_program_name (program_name); - - START_PROGRESS (program_name, 0); - - bfd_init (); - set_default_bfd_target (); - - while ((c = getopt_long (argc, argv, "pib:m:M:VCdDlfahHrRtTxsSj:wE:zgG", - long_options, (int *) 0)) - != EOF) - { - switch (c) - { - case 0: - break; /* we've been given a long option */ - case 'm': - machine = optarg; - break; - case 'M': - disassembler_options = optarg; - break; - case 'j': - only = optarg; - break; - case 'l': - with_line_numbers = true; - break; - case 'b': - target = optarg; - break; - case 'C': - do_demangle = true; - break; - case 'w': - wide_output = true; - break; - case OPTION_ADJUST_VMA: - adjust_section_vma = parse_vma (optarg, "--adjust-vma"); - break; - case OPTION_START_ADDRESS: - start_address = parse_vma (optarg, "--start-address"); - break; - case OPTION_STOP_ADDRESS: - stop_address = parse_vma (optarg, "--stop-address"); - break; - case 'E': - if (strcmp (optarg, "B") == 0) - endian = BFD_ENDIAN_BIG; - else if (strcmp (optarg, "L") == 0) - endian = BFD_ENDIAN_LITTLE; - else - { - non_fatal (_("unrecognized -E option")); - usage (stderr, 1); - } - break; - case OPTION_ENDIAN: - if (strncmp (optarg, "big", strlen (optarg)) == 0) - endian = BFD_ENDIAN_BIG; - else if (strncmp (optarg, "little", strlen (optarg)) == 0) - endian = BFD_ENDIAN_LITTLE; - else - { - non_fatal (_("unrecognized --endian type `%s'"), optarg); - usage (stderr, 1); - } - break; - - case 'f': - dump_file_header = true; - seenflag = true; - break; - case 'i': - formats_info = true; - seenflag = true; - break; - case 'p': - dump_private_headers = true; - seenflag = true; - break; - case 'x': - dump_private_headers = true; - dump_symtab = true; - dump_reloc_info = true; - dump_file_header = true; - dump_ar_hdrs = true; - dump_section_headers = true; - seenflag = true; - break; - case 't': - dump_symtab = true; - seenflag = true; - break; - case 'T': - dump_dynamic_symtab = true; - seenflag = true; - break; - case 'd': - disassemble = true; - seenflag = true; - break; - case 'z': - disassemble_zeroes = true; - break; - case 'D': - disassemble = true; - disassemble_all = true; - seenflag = true; - break; - case 'S': - disassemble = true; - with_source_code = true; - seenflag = true; - break; - case 'g': - dump_debugging = 1; - seenflag = true; - break; - case 'G': - dump_stab_section_info = true; - seenflag = true; - break; - case 's': - dump_section_contents = true; - seenflag = true; - break; - case 'r': - dump_reloc_info = true; - seenflag = true; - break; - case 'R': - dump_dynamic_reloc_info = true; - seenflag = true; - break; - case 'a': - dump_ar_hdrs = true; - seenflag = true; - break; - case 'h': - dump_section_headers = true; - seenflag = true; - break; - case 'H': - usage (stdout, 0); - seenflag = true; - case 'V': - show_version = true; - seenflag = true; - break; - - default: - usage (stderr, 1); - } - } - - if (show_version) - print_version ("objdump"); - - if (seenflag == false) - usage (stderr, 2); - - if (formats_info) - display_info (); - else - { - if (optind == argc) - display_file ("a.out", target); - else - for (; optind < argc;) - display_file (argv[optind++], target); - } - - END_PROGRESS (program_name); - - return exit_status; -} diff --git a/binutils/po/Make-in b/binutils/po/Make-in deleted file mode 100644 index 0552db1feef..00000000000 --- a/binutils/po/Make-in +++ /dev/null @@ -1,251 +0,0 @@ -# Makefile for program source directory in GNU NLS utilities package. -# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -PACKAGE = @PACKAGE@ -VERSION = @VERSION@ - -SHELL = /bin/sh -@SET_MAKE@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ -datadir = $(prefix)/@DATADIRNAME@ -localedir = $(datadir)/locale -gnulocaledir = $(prefix)/share/locale -gettextsrcdir = $(prefix)/share/gettext/po -subdir = po - -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -MKINSTALLDIRS = @MKINSTALLDIRS@ - -CC = @CC@ -GENCAT = @GENCAT@ -GMSGFMT = PATH=../src:$$PATH @GMSGFMT@ -MSGFMT = @MSGFMT@ -XGETTEXT = PATH=../src:$$PATH @XGETTEXT@ -MSGMERGE = PATH=../src:$$PATH msgmerge - -DEFS = @DEFS@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ - -INCLUDES = -I.. -I$(top_srcdir)/intl - -COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) - -SOURCES = cat-id-tbl.c -POFILES = @POFILES@ -GMOFILES = @GMOFILES@ -DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ -stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) - -POTFILES = \ - -CATALOGS = @CATALOGS@ -CATOBJEXT = @CATOBJEXT@ -INSTOBJEXT = @INSTOBJEXT@ - -.SUFFIXES: -.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat - -.c.o: - $(COMPILE) $< - -.po.pox: - $(MAKE) $(PACKAGE).pot - $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox - -.po.mo: - $(MSGFMT) -o $@ $< - -.po.gmo: - file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ - && rm -f $$file && $(GMSGFMT) -o $$file $< - -.po.cat: - sed -f ../intl/po2msg.sed < $< > $*.msg \ - && rm -f $@ && $(GENCAT) $@ $*.msg - - -all: all-@USE_NLS@ - -all-yes: $(CATALOGS) @MAINT@ $(PACKAGE).pot -all-no: - -$(srcdir)/$(PACKAGE).pot: $(POTFILES) - $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ - --add-comments --keyword=_ --keyword=N_ \ - --files-from=$(srcdir)/POTFILES.in - rm -f $(srcdir)/$(PACKAGE).pot - mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot - -$(srcdir)/cat-id-tbl.c: stamp-cat-id; @: -$(srcdir)/stamp-cat-id: $(PACKAGE).pot - rm -f cat-id-tbl.tmp - sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \ - | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp - if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \ - rm cat-id-tbl.tmp; \ - else \ - echo cat-id-tbl.c changed; \ - rm -f $(srcdir)/cat-id-tbl.c; \ - mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \ - fi - cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id - - -install: install-exec install-data -install-exec: -install-info: -install-data: install-data-@USE_NLS@ -install-data-no: all -install-data-yes: all - if test -r $(MKINSTALLDIRS); then \ - $(MKINSTALLDIRS) $(datadir); \ - else \ - $(top_srcdir)/mkinstalldirs $(datadir); \ - fi - @catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - case "$$cat" in \ - *.gmo) destdir=$(gnulocaledir);; \ - *) destdir=$(localedir);; \ - esac; \ - lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ - dir=$$destdir/$$lang/LC_MESSAGES; \ - if test -r $(MKINSTALLDIRS); then \ - $(MKINSTALLDIRS) $$dir; \ - else \ - $(top_srcdir)/mkinstalldirs $$dir; \ - fi; \ - if test -r $$cat; then \ - $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ - echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \ - else \ - $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ - echo "installing $(srcdir)/$$cat as" \ - "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \ - fi; \ - if test -r $$cat.m; then \ - $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ - echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ - else \ - if test -r $(srcdir)/$$cat.m ; then \ - $(INSTALL_DATA) $(srcdir)/$$cat.m \ - $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ - echo "installing $(srcdir)/$$cat as" \ - "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ - else \ - true; \ - fi; \ - fi; \ - done - if test "$(PACKAGE)" = "gettext"; then \ - if test -r $(MKINSTALLDIRS); then \ - $(MKINSTALLDIRS) $(gettextsrcdir); \ - else \ - $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ - fi; \ - $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ - $(gettextsrcdir)/Makefile.in.in; \ - else \ - : ; \ - fi - -# Define this as empty until I found a useful application. -installcheck: - -uninstall: - catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ - rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ - rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ - rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ - rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ - done - rm -f $(gettextsrcdir)/po-Makefile.in.in - -check: all - -cat-id-tbl.o: ../intl/libgettext.h - -dvi info tags TAGS ID: - -mostlyclean: - rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp - rm -fr *.o - -clean: mostlyclean - -distclean: clean - rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m - -maintainer-clean: distclean - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - rm -f $(GMOFILES) - -distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) -dist distdir: update-po $(DISTFILES) - dists="$(DISTFILES)"; \ - for file in $$dists; do \ - ln $(srcdir)/$$file $(distdir) 2> /dev/null \ - || cp -p $(srcdir)/$$file $(distdir); \ - done - -update-po: Makefile - $(MAKE) $(PACKAGE).pot - PATH=`pwd`/../src:$$PATH; \ - cd $(srcdir); \ - catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ - mv $$lang.po $$lang.old.po; \ - echo "$$lang:"; \ - if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \ - rm -f $$lang.old.po; \ - else \ - echo "msgmerge for $$cat failed!"; \ - rm -f $$lang.po; \ - mv $$lang.old.po $$lang.po; \ - fi; \ - done - -POTFILES: POTFILES.in - ( if test 'x$(srcdir)' != 'x.'; then \ - posrcprefix='$(top_srcdir)/'; \ - else \ - posrcprefix="../"; \ - fi; \ - rm -f $@-t $@ \ - && (sed -e '/^#/d' -e '/^[ ]*$$/d' \ - -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ - | sed -e '$$s/\\$$//') > $@-t \ - && chmod a-w $@-t \ - && mv $@-t $@ ) - -POTFILES.in: @MAINT@ ../Makefile - cd .. && $(MAKE) po/POTFILES.in - -Makefile: Make-in ../config.status POTFILES - cd .. \ - && CONFIG_FILES=$(subdir)/Makefile.in:$(subdir)/Make-in \ - CONFIG_HEADERS= $(SHELL) ./config.status - -# Tell versions [3.59,3.63) of GNU make not to export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/binutils/po/POTFILES.in b/binutils/po/POTFILES.in deleted file mode 100644 index a3a05867fb2..00000000000 --- a/binutils/po/POTFILES.in +++ /dev/null @@ -1,55 +0,0 @@ -addr2line.c -ar.c -arsup.c -arsup.h -bucomm.c -bucomm.h -budbg.h -coffdump.c -coffgrok.c -coffgrok.h -debug.c -debug.c -debug.h -dlltool.c -dlltool.h -dllwrap.c -dyn-string.c -dyn-string.h -filemode.c -ieee.c -ieee.c -is-ranlib.c -is-strip.c -maybe-ranlib.c -maybe-strip.c -nlmconv.c -nlmconv.h -nm.c -not-ranlib.c -not-strip.c -objcopy.c -objdump.c -prdbg.c -rdcoff.c -rdcoff.c -rddbg.c -rddbg.c -readelf.c -rename.c -resbin.c -rescoff.c -resrc.c -resres.c -size.c -srconv.c -stabs.c -stabs.c -strings.c -sysdump.c -version.c -windres.c -windres.h -winduni.c -winduni.h -wrstabs.c diff --git a/binutils/po/binutils.pot b/binutils/po/binutils.pot deleted file mode 100644 index cfc4ed44821..00000000000 --- a/binutils/po/binutils.pot +++ /dev/null @@ -1,3759 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Free Software Foundation, Inc. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2000-04-04 23:33+0930\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: ENCODING\n" - -#: addr2line.c:76 -#, c-format -msgid "" -"Usage: %s [-CfsHV] [-b bfdname] [--target=bfdname]\n" -" [-e executable] [--exe=executable] [--demangle]\n" -" [--basenames] [--functions] [addr addr ...]\n" -msgstr "" - -#: addr2line.c:83 ar.c:286 nlmconv.c:1141 nm.c:306 objcopy.c:344 objcopy.c:376 -#: objdump.c:277 readelf.c:1703 size.c:89 strings.c:512 windres.c:737 -#, c-format -msgid "Report bugs to %s\n" -msgstr "" - -#: addr2line.c:243 -#, c-format -msgid "%s: can not get addresses from archive" -msgstr "" - -#: ar.c:235 -#, c-format -msgid "no entry %s in archive\n" -msgstr "" - -#: ar.c:252 -#, c-format -msgid "" -"Usage: %s [-]{dmpqrstx}[abcfilNoPsSuvV] [member-name] [count] archive-file " -"file...\n" -msgstr "" - -#: ar.c:255 -#, c-format -msgid " %s -M [ \n" -msgstr "" - -#. xgetext:c-format -#: dlltool.c:3139 -#, c-format -msgid "" -" -m --machine Create as DLL for . [default: %s]\n" -msgstr "" - -#: dlltool.c:3140 -msgid "" -" possible : arm[_interwork], i386, mcore[-elf]{-le|-be}, " -"ppc, thumb\n" -msgstr "" - -#: dlltool.c:3141 -msgid " -e --output-exp Generate an export file.\n" -msgstr "" - -#: dlltool.c:3142 -msgid " -l --output-lib Generate an interface library.\n" -msgstr "" - -#: dlltool.c:3143 -msgid " -a --add-indirect Add dll indirects to export file.\n" -msgstr "" - -#: dlltool.c:3144 -msgid "" -" -D --dllname Name of input dll to put into interface lib.\n" -msgstr "" - -#: dlltool.c:3145 -msgid " -d --input-def Name of .def file to be read in.\n" -msgstr "" - -#: dlltool.c:3146 -msgid " -z --output-def Name of .def file to be created.\n" -msgstr "" - -#: dlltool.c:3147 -msgid " --export-all-symbols Export all symbols to .def\n" -msgstr "" - -#: dlltool.c:3148 -msgid " --no-export-all-symbols Only export listed symbols\n" -msgstr "" - -#: dlltool.c:3149 -msgid " --exclude-symbols Don't export \n" -msgstr "" - -#: dlltool.c:3150 -msgid " --no-default-excludes Clear default exclude symbols\n" -msgstr "" - -#: dlltool.c:3151 -msgid " -b --base-file Read linker generated base file.\n" -msgstr "" - -#: dlltool.c:3152 -msgid " -x --no-idata4 Don't generate idata$4 section.\n" -msgstr "" - -#: dlltool.c:3153 -msgid " -c --no-idata5 Don't generate idata$5 section.\n" -msgstr "" - -#: dlltool.c:3154 -msgid "" -" -U --add-underscore Add underscores to symbols in interface " -"library.\n" -msgstr "" - -#: dlltool.c:3155 -msgid " -k --kill-at Kill @ from exported names.\n" -msgstr "" - -#: dlltool.c:3156 -msgid " -A --add-stdcall-alias Add aliases without @.\n" -msgstr "" - -#: dlltool.c:3157 -msgid " -S --as Use for assembler.\n" -msgstr "" - -#: dlltool.c:3158 -msgid " -f --as-flags Pass to the assembler.\n" -msgstr "" - -#: dlltool.c:3159 -msgid "" -" -C --compat-implib Create backward compatible import library.\n" -msgstr "" - -#: dlltool.c:3160 -msgid "" -" -n --no-delete Keep temp files (repeat for extra " -"preservation).\n" -msgstr "" - -#: dlltool.c:3161 -msgid " -v --verbose Be verbose.\n" -msgstr "" - -#: dlltool.c:3162 -msgid " -V --version Display the program version.\n" -msgstr "" - -#: dlltool.c:3163 -msgid " -h --help Display this information.\n" -msgstr "" - -#: dlltool.c:3165 -msgid "" -" -M --mcore-elf Process mcore-elf object files into .\n" -msgstr "" - -#: dlltool.c:3166 -msgid " -L --linker Use as the linker.\n" -msgstr "" - -#: dlltool.c:3167 -msgid " -F --linker-flags Pass to the linker.\n" -msgstr "" - -#: dlltool.c:3311 -#, c-format -msgid "Unable to open base-file: %s" -msgstr "" - -#: dlltool.c:3340 -#, c-format -msgid "Machine '%s' not supported" -msgstr "" - -#: dlltool.c:3443 dllwrap.c:215 -#, c-format -msgid "Tried file: %s" -msgstr "" - -#: dlltool.c:3450 dllwrap.c:222 -#, c-format -msgid "Using file: %s" -msgstr "" - -#: ieee.c:316 -msgid "unexpected end of debugging information" -msgstr "" - -#: ieee.c:411 -msgid "invalid number" -msgstr "" - -#: ieee.c:470 -msgid "invalid string length" -msgstr "" - -#: ieee.c:527 ieee.c:568 -msgid "expression stack overflow" -msgstr "" - -#: ieee.c:547 -msgid "unsupported IEEE expression operator" -msgstr "" - -#: ieee.c:562 -msgid "unknown section" -msgstr "" - -#: ieee.c:583 -msgid "expression stack underflow" -msgstr "" - -#: ieee.c:597 -msgid "expression stack mismatch" -msgstr "" - -#: ieee.c:636 -msgid "unknown builtin type" -msgstr "" - -#: ieee.c:781 -msgid "BCD float type not supported" -msgstr "" - -#: ieee.c:927 -msgid "unexpected number" -msgstr "" - -#: ieee.c:934 -msgid "unexpected record type" -msgstr "" - -#: ieee.c:967 -msgid "blocks left on stack at end" -msgstr "" - -#: ieee.c:1232 -msgid "unknown BB type" -msgstr "" - -#: ieee.c:1241 -msgid "stack overflow" -msgstr "" - -#: ieee.c:1266 -msgid "stack underflow" -msgstr "" - -#: ieee.c:1380 ieee.c:1452 ieee.c:2151 -msgid "illegal variable index" -msgstr "" - -#: ieee.c:1430 -msgid "illegal type index" -msgstr "" - -#: ieee.c:1440 ieee.c:1477 -msgid "unknown TY code" -msgstr "" - -#: ieee.c:1459 -msgid "undefined variable in TY" -msgstr "" - -#. Pascal file name. FIXME. -#: ieee.c:1870 -msgid "Pascal file name not supported" -msgstr "" - -#: ieee.c:1918 -msgid "unsupported qualifer" -msgstr "" - -#: ieee.c:2189 -msgid "undefined variable in ATN" -msgstr "" - -#: ieee.c:2232 -msgid "unknown ATN type" -msgstr "" - -#. Reserved for FORTRAN common. -#: ieee.c:2354 -msgid "unsupported ATN11" -msgstr "" - -#. We have no way to record this information. FIXME. -#: ieee.c:2381 -msgid "unsupported ATN12" -msgstr "" - -#: ieee.c:2441 -msgid "unexpected string in C++ misc" -msgstr "" - -#: ieee.c:2454 -msgid "bad misc record" -msgstr "" - -#: ieee.c:2497 -msgid "unrecognized C++ misc record" -msgstr "" - -#: ieee.c:2614 -msgid "undefined C++ object" -msgstr "" - -#: ieee.c:2648 -msgid "unrecognized C++ object spec" -msgstr "" - -#: ieee.c:2684 -msgid "unsupported C++ object type" -msgstr "" - -#: ieee.c:2694 -msgid "C++ base class not defined" -msgstr "" - -#: ieee.c:2706 ieee.c:2811 -msgid "C++ object has no fields" -msgstr "" - -#: ieee.c:2725 -msgid "C++ base class not found in container" -msgstr "" - -#: ieee.c:2832 -msgid "C++ data member not found in container" -msgstr "" - -#: ieee.c:2873 ieee.c:3023 -msgid "unknown C++ visibility" -msgstr "" - -#: ieee.c:2907 -msgid "bad C++ field bit pos or size" -msgstr "" - -#: ieee.c:2999 -msgid "bad type for C++ method function" -msgstr "" - -#: ieee.c:3009 -msgid "no type information for C++ method function" -msgstr "" - -#: ieee.c:3048 -msgid "C++ static virtual method" -msgstr "" - -#: ieee.c:3143 -msgid "unrecognized C++ object overhead spec" -msgstr "" - -#: ieee.c:3182 -msgid "undefined C++ vtable" -msgstr "" - -#: ieee.c:3253 -msgid "C++ default values not in a function" -msgstr "" - -#: ieee.c:3293 -msgid "unrecognized C++ default type" -msgstr "" - -#: ieee.c:3324 -msgid "reference parameter is not a pointer" -msgstr "" - -#: ieee.c:3409 -msgid "unrecognized C++ reference type" -msgstr "" - -#: ieee.c:3491 -msgid "C++ reference not found" -msgstr "" - -#: ieee.c:3499 -msgid "C++ reference is not pointer" -msgstr "" - -#: ieee.c:3528 ieee.c:3536 -msgid "missing required ASN" -msgstr "" - -#: ieee.c:3566 ieee.c:3574 -msgid "missing required ATN65" -msgstr "" - -#: ieee.c:3588 -msgid "bad ATN65 record" -msgstr "" - -#: ieee.c:4235 -msgid "IEEE numeric overflow: 0x" -msgstr "" - -#: ieee.c:4281 -#, c-format -msgid "IEEE string length overflow: %u\n" -msgstr "" - -#: ieee.c:5315 -#, c-format -msgid "IEEE unsupported integer type size %u\n" -msgstr "" - -#: ieee.c:5351 -#, c-format -msgid "IEEE unsupported float type size %u\n" -msgstr "" - -#: ieee.c:5387 -#, c-format -msgid "IEEE unsupported complex type size %u\n" -msgstr "" - -#: nlmconv.c:275 srconv.c:1966 -#, c-format -msgid "%s: input and output files must be different\n" -msgstr "" - -#: nlmconv.c:325 -#, c-format -msgid "%s: input file named both on command line and with INPUT\n" -msgstr "" - -#: nlmconv.c:336 -#, c-format -msgid "%s: no input file\n" -msgstr "" - -#: nlmconv.c:366 -#, c-format -msgid "%s: no name for output file\n" -msgstr "" - -#: nlmconv.c:381 -#, c-format -msgid "%s: warning:input and output formats are not compatible\n" -msgstr "" - -#: nlmconv.c:411 -msgid "make .bss section" -msgstr "" - -#: nlmconv.c:420 -msgid "make .nlmsections section" -msgstr "" - -#: nlmconv.c:422 -msgid "set .nlmsections flags" -msgstr "" - -#: nlmconv.c:450 -msgid "set .bss vma" -msgstr "" - -#: nlmconv.c:457 -msgid "set .data size" -msgstr "" - -#: nlmconv.c:638 -#, c-format -msgid "%s: warning: symbol %s imported but not in import list\n" -msgstr "" - -#: nlmconv.c:658 -msgid "set start address" -msgstr "" - -#: nlmconv.c:707 -#, c-format -msgid "%s: warning: START procedure %s not defined\n" -msgstr "" - -#: nlmconv.c:710 -#, c-format -msgid "%s: warning: EXIT procedure %s not defined\n" -msgstr "" - -#: nlmconv.c:714 -#, c-format -msgid "%s: warning: CHECK procedure %s not defined\n" -msgstr "" - -#: nlmconv.c:736 nlmconv.c:928 -msgid "custom section" -msgstr "" - -#: nlmconv.c:757 nlmconv.c:960 -msgid "help section" -msgstr "" - -#: nlmconv.c:779 nlmconv.c:979 -msgid "message section" -msgstr "" - -#: nlmconv.c:795 nlmconv.c:1012 -msgid "module section" -msgstr "" - -#: nlmconv.c:815 nlmconv.c:1029 -msgid "rpc section" -msgstr "" - -#: nlmconv.c:852 -#, c-format -msgid "%s:%s: warning: shared libraries can not have uninitialized data\n" -msgstr "" - -#: nlmconv.c:873 nlmconv.c:1049 -msgid "shared section" -msgstr "" - -#: nlmconv.c:881 -#, c-format -msgid "%s: warning: No version number given\n" -msgstr "" - -#: nlmconv.c:922 nlmconv.c:954 nlmconv.c:973 nlmconv.c:1023 nlmconv.c:1043 -#, c-format -msgid "%s:%s: read: %s\n" -msgstr "" - -#: nlmconv.c:946 -#, c-format -msgid "%s: warning: MAP and FULLMAP are not supported; try ld -M\n" -msgstr "" - -#: nlmconv.c:1121 -#, c-format -msgid "%s: Convert an object file into a NetWare Loadable Module\n" -msgstr "" - -#: nlmconv.c:1133 -#, c-format -msgid "" -"Usage: %s [-dhV] [-I bfdname] [-O bfdname] [-T header-file] [-l linker]\n" -" [--input-target=bfdname] [--output-target=bfdname]\n" -" [--header-file=file] [--linker=linker] [--debug]\n" -" [--help] [--version]\n" -" [in-file [out-file]]\n" -msgstr "" - -#: nlmconv.c:1173 -#, c-format -msgid "%s: support not compiled in for %s\n" -msgstr "" - -#: nlmconv.c:1216 -msgid "make section" -msgstr "" - -#: nlmconv.c:1230 -msgid "set section size" -msgstr "" - -#: nlmconv.c:1236 -msgid "set section alignment" -msgstr "" - -#: nlmconv.c:1240 -msgid "set section flags" -msgstr "" - -#: nlmconv.c:1251 -msgid "set .nlmsections size" -msgstr "" - -#: nlmconv.c:1339 nlmconv.c:1347 nlmconv.c:1356 nlmconv.c:1361 -msgid "set .nlmsection contents" -msgstr "" - -#: nlmconv.c:1864 -msgid "stub section sizes" -msgstr "" - -#: nlmconv.c:1913 -msgid "writing stub" -msgstr "" - -#: nlmconv.c:2003 -#, c-format -msgid "%s: unresolved PC relative reloc against %s\n" -msgstr "" - -#: nlmconv.c:2068 -#, c-format -msgid "%s: overflow when adjusting relocation against %s\n" -msgstr "" - -#: nlmconv.c:2191 -#, c-format -msgid "%s: execution of %s failed: " -msgstr "" - -#: nlmconv.c:2206 -#, c-format -msgid "%s: Execution of %s failed\n" -msgstr "" - -#: nm.c:294 -#, c-format -msgid "" -"Usage: %s [-aABCDglnopPrsuvV] [-t radix] [--radix=radix] [--target=bfdname]\n" -" [--debug-syms] [--extern-only] [--print-armap] [--print-file-name]\n" -" [--numeric-sort] [--no-sort] [--reverse-sort] [--size-sort]\n" -" [--undefined-only] [--portability] [-f {bsd,sysv,posix}]\n" -" [--format={bsd,sysv,posix}] [--demangle] [--no-demangle] [--dynamic]\n" -" [--defined-only] [--line-numbers]\n" -" [--version] [--help]\n" -" [file...]\n" -msgstr "" - -#: nm.c:339 -#, c-format -msgid "%s: %s: invalid radix\n" -msgstr "" - -#: nm.c:365 -#, c-format -msgid "%s: %s: invalid output format\n" -msgstr "" - -#: nm.c:492 -#, c-format -msgid "%s: data size %ld\n" -msgstr "" - -#: nm.c:1283 -#, c-format -msgid "" -"\n" -"\n" -"Undefined symbols from %s:\n" -"\n" -msgstr "" - -#: nm.c:1285 -#, c-format -msgid "" -"\n" -"\n" -"Symbols from %s:\n" -"\n" -msgstr "" - -#: nm.c:1286 nm.c:1340 -msgid "" -"Name Value Class Type Size Line " -"Section\n" -"\n" -msgstr "" - -#: nm.c:1337 -#, c-format -msgid "" -"\n" -"\n" -"Undefined symbols from %s[%s]:\n" -"\n" -msgstr "" - -#: nm.c:1339 -#, c-format -msgid "" -"\n" -"\n" -"Symbols from %s[%s]:\n" -"\n" -msgstr "" - -#: nm.c:1510 -msgid "" -"\n" -"Archive index:\n" -msgstr "" - -#: objcopy.c:296 -#, c-format -msgid "Usage: %s in-file [out-file]\n" -msgstr "" - -#: objcopy.c:297 objcopy.c:354 -msgid " The switches are:\n" -msgstr "" - -#: objcopy.c:298 -msgid "" -" -I --input-target Assume input file is in format \n" -" -O --output-target Create an output file in format " -"\n" -" -F --target Set both input and output format to " -"\n" -" --debugging Convert debugging information, if " -"possible\n" -" -p --preserve-dates Copy modified/access timestamps to the " -"output\n" -" -j --only-section Only copy section into the output\n" -" -R --remove-section Remove section from the output\n" -" -S --strip-all Remove all symbol and relocation " -"information\n" -" -g --strip-debug Remove all debugging symbols\n" -" --strip-unneeded Remove all symbols not needed by " -"relocations\n" -" -N --strip-symbol Do not copy symbol \n" -" -K --keep-symbol Only copy symbol \n" -" -L --localize-symbol Force symbol to be marked as a " -"local\n" -" -W --weaken-symbol Force symbol to be marked as a " -"weak\n" -" --weaken Force all global symbols to be marked as " -"weak\n" -" -x --discard-all Remove all non-global symbols\n" -" -X --discard-locals Remove any compiler-generated symbols\n" -" -i --interleave Only copy one out of every " -"bytes\n" -" -b --byte Select byte in every interleaved " -"block\n" -" --gap-fill Fill gaps between sections with \n" -" --pad-to Pad the last section up to address " -"\n" -" --set-start Set the start address to \n" -" {--change-start|--adjust-start} \n" -" Add to the start address\n" -" {--change-addresses|--adjust-vma} \n" -" Add to LMA, VMA and start " -"addresses\n" -" {--change-section-address|--adjust-section-vma} {=|+|-}\n" -" Change LMA and VMA of section by " -"\n" -" --change-section-lma {=|+|-}\n" -" Change the LMA of section by " -"\n" -" --change-section-vma {=|+|-}\n" -" Change the VMA of section by " -"\n" -" {--[no-]change-warnings|--[no-]adjust-warnings}\n" -" Warn if a named section does not exist\n" -" --set-section-flags =\n" -" Set section 's properties to " -"\n" -" --add-section = Add section found in to " -"output\n" -" --change-leading-char Force output format's leading character " -"style\n" -" --remove-leading-char Remove leading character from global " -"symbols\n" -" -v --verbose List all object files modified\n" -" -V --version Display this program's version number\n" -" -h --help Display this output\n" -msgstr "" - -#: objcopy.c:353 -#, c-format -msgid "Usage: %s in-file(s)\n" -msgstr "" - -#: objcopy.c:355 -msgid "" -" -I --input-target Assume input file is in format \n" -" -O --output-target Create an output file in format " -"\n" -" -F --target Set both input and output format to " -"\n" -" -p --preserve-dates Copy modified/access timestamps to the " -"output\n" -" -R --remove-section Remove section from the output\n" -" -s --strip-all Remove all symbol and relocation " -"information\n" -" -g -S --strip-debug Remove all debugging symbols\n" -" --strip-unneeded Remove all symbols not needed by " -"relocations\n" -" -N --strip-symbol Do not copy symbol \n" -" -K --keep-symbol Only copy symbol \n" -" -x --discard-all Remove all non-global symbols\n" -" -X --discard-locals Remove any compiler-generated symbols\n" -" -v --verbose List all object files modified\n" -" -V --version Display this program's version number\n" -" -h --help Display this output\n" -" -o Place stripped output into \n" -msgstr "" - -#: objcopy.c:425 -#, c-format -msgid "unrecognized section flag `%s'" -msgstr "" - -#: objcopy.c:426 -msgid "" -"supported flags: alloc, load, noload, readonly, debug, code, data, rom, " -"share, contents" -msgstr "" - -#: objcopy.c:671 -#, c-format -msgid "copy from %s(%s) to %s(%s)\n" -msgstr "" - -#: objcopy.c:690 -#, c-format -msgid "Warning: Output file cannot represent architecture %s" -msgstr "" - -#: objcopy.c:717 -#, c-format -msgid "can't create section `%s': %s" -msgstr "" - -#: objcopy.c:803 -#, c-format -msgid "Can't fill gap after %s: %s" -msgstr "" - -#: objcopy.c:828 -#, c-format -msgid "Can't add padding to %s: %s" -msgstr "" - -#: objcopy.c:965 -#, c-format -msgid "%s: error copying private BFD data: %s" -msgstr "" - -#: objcopy.c:999 -#, c-format -msgid "cannot mkdir %s for archive copying (error: %s)" -msgstr "" - -#: objcopy.c:1268 -#, c-format -msgid "%s: section `%s': error in %s: %s" -msgstr "" - -#: objcopy.c:1542 -#, c-format -msgid "%s: can't create debugging section: %s" -msgstr "" - -#: objcopy.c:1557 -#, c-format -msgid "%s: can't set debugging section contents: %s" -msgstr "" - -#: objcopy.c:1566 -#, c-format -msgid "%s: don't know how to write debugging information for %s" -msgstr "" - -#: objcopy.c:1671 -#, c-format -msgid "%s: cannot stat: %s" -msgstr "" - -#: objcopy.c:1721 -msgid "byte number must be non-negative" -msgstr "" - -#: objcopy.c:1726 -msgid "interleave must be positive" -msgstr "" - -#: objcopy.c:1742 objcopy.c:1749 -#, c-format -msgid "%s both copied and removed" -msgstr "" - -#: objcopy.c:1804 -msgid "bad format for --add-section NAME=FILENAME" -msgstr "" - -#: objcopy.c:1807 -#, c-format -msgid "cannot stat: %s: %s" -msgstr "" - -#: objcopy.c:1825 -#, c-format -msgid "cannot open: %s: %s" -msgstr "" - -#: objcopy.c:1829 -#, c-format -msgid "%s: fread failed" -msgstr "" - -#: objcopy.c:1872 -#, c-format -msgid "bad format for %s" -msgstr "" - -#: objcopy.c:1936 -#, c-format -msgid "Warning: truncating gap-fill from 0x%s to 0x%x" -msgstr "" - -#: objcopy.c:1960 -msgid "bad format for --set-section-flags" -msgstr "" - -#: objcopy.c:1990 -msgid "byte number must be less than interleave" -msgstr "" - -#: objcopy.c:2009 -#, c-format -msgid "Cannot stat: %s: %s" -msgstr "" - -#: objcopy.c:2049 -#, c-format -msgid "Warning: --change-section-vma %s%c0x%s never used" -msgstr "" - -#: objcopy.c:2062 -#, c-format -msgid "Warning: --change-section-lma %s%c0x%s never used" -msgstr "" - -#: objdump.c:229 -#, c-format -msgid "Usage: %s file(s)\n" -msgstr "" - -#: objdump.c:230 -msgid " At least one of the following switches must be given:\n" -msgstr "" - -#: objdump.c:231 -msgid "" -" -a --archive-headers Display archive header information\n" -" -f --file-headers Display the contents of the overall file header\n" -" -p --private-headers Display object format specific file header " -"contents\n" -" -h --[section-]headers Display the contents of the section headers\n" -" -x --all-headers Display the contents of all headers\n" -" -d --disassemble Display assembler contents of executable " -"sections\n" -" -D --disassemble-all Display assembler contents of all sections\n" -" -S --source Intermix source code with disassembly\n" -" -s --full-contents Display the full contents of all sections " -"requested\n" -" -g --debugging Display debug information in object file\n" -" -G --stabs Display the STABS contents of an ELF format file\n" -" -t --syms Display the contents of the symbol table(s)\n" -" -T --dynamic-syms Display the contents of the dynamic symbol table\n" -" -r --reloc Display the relocation entries in the file\n" -" -R --dynamic-reloc Display the dynamic relocation entries in the " -"file\n" -" -V --version Display this program's version number\n" -" -i --info List object formats and architectures supported\n" -" -H --help Display this information\n" -msgstr "" - -#: objdump.c:253 -msgid "" -"\n" -" The following switches are optional:\n" -msgstr "" - -#: objdump.c:254 -msgid "" -" -b --target Specify the target object format as " -"\n" -" -m --architecture Specify the target architecture as " -"\n" -" -j --section Only display information for section " -"\n" -" -M --disassembler-options Pass text on to the disassembler\n" -" -EB --endian=big Assume big endian format when " -"disassembling\n" -" -EL --endian=little Assume little endian format when " -"disassembling\n" -" --file-start-context Include context from start of file (with " -"-S)\n" -" -l --line-numbers Include line numbers and filenames in " -"output\n" -" -C --demangle Decode mangled/processed symbol names\n" -" -w --wide Format output for more than 80 columns\n" -" -z --disassemble-zeroes Do not skip blocks of zeroes when " -"disassembling\n" -" --start-address Only process data whoes address is >= " -"\n" -" --stop-address Only process data whoes address is <= " -"\n" -" --prefix-addresses Print complete address alongside " -"disassembly\n" -" --[no-]show-raw-insn Display hex alongside symbolic disassembly\n" -" --adjust-vma Add to all displayed section " -"addresses\n" -"\n" -msgstr "" - -#: objdump.c:420 -msgid "Sections:\n" -msgstr "" - -#: objdump.c:423 -msgid "Idx Name Size VMA LMA File off Algn" -msgstr "" - -#: objdump.c:425 -msgid "" -"Idx Name Size VMA LMA File off " -"Algn" -msgstr "" - -#: objdump.c:429 -msgid " Flags" -msgstr "" - -#: objdump.c:479 -#, c-format -msgid "%s: %s: not a dynamic object\n" -msgstr "" - -#: objdump.c:496 -#, c-format -msgid "%s: %s: No dynamic symbols\n" -msgstr "" - -#: objdump.c:1200 -msgid "Out of virtual memory\n" -msgstr "" - -#: objdump.c:1611 -#, c-format -msgid "%s: Can't use supplied machine %s\n" -msgstr "" - -#: objdump.c:1632 -#, c-format -msgid "%s: Can't disassemble for architecture %s\n" -msgstr "" - -#: objdump.c:1709 -#, c-format -msgid "Disassembly of section %s:\n" -msgstr "" - -#: objdump.c:1883 -#, c-format -msgid "" -"No %s section present\n" -"\n" -msgstr "" - -#: objdump.c:1890 -#, c-format -msgid "%s: %s has no %s section\n" -msgstr "" - -#: objdump.c:1904 objdump.c:1916 -#, c-format -msgid "%s: Reading %s section of %s failed: %s\n" -msgstr "" - -#: objdump.c:1959 -#, c-format -msgid "" -"Contents of %s section:\n" -"\n" -msgstr "" - -#: objdump.c:2059 -#, c-format -msgid "architecture: %s, " -msgstr "" - -#: objdump.c:2062 -#, c-format -msgid "flags 0x%08x:\n" -msgstr "" - -#: objdump.c:2075 -msgid "" -"\n" -"start address 0x" -msgstr "" - -#: objdump.c:2107 -#, c-format -msgid "" -"\n" -"%s: file format %s\n" -msgstr "" - -#: objdump.c:2150 -#, c-format -msgid "%s: printing debugging information failed\n" -msgstr "" - -#: objdump.c:2227 -#, c-format -msgid "In archive %s:\n" -msgstr "" - -#: objdump.c:2279 -#, c-format -msgid "Contents of section %s:\n" -msgstr "" - -#: objdump.c:2788 -#, c-format -msgid "BFD header file version %s\n" -msgstr "" - -#: objdump.c:2861 -#, c-format -msgid "%s: unrecognized -E option\n" -msgstr "" - -#: objdump.c:2873 -#, c-format -msgid "%s: unrecognized --endian type `%s'\n" -msgstr "" - -#: rdcoff.c:204 -#, c-format -msgid "%s: parse_coff_type: Bad type code 0x%x\n" -msgstr "" - -#: rdcoff.c:423 rdcoff.c:531 rdcoff.c:712 -#, c-format -msgid "%s: bfd_coff_get_syment failed: %s\n" -msgstr "" - -#: rdcoff.c:439 rdcoff.c:732 -#, c-format -msgid "%s: bfd_coff_get_auxent failed: %s\n" -msgstr "" - -#: rdcoff.c:798 -#, c-format -msgid "%s: %ld: .bf without preceding function\n" -msgstr "" - -#: rdcoff.c:848 -#, c-format -msgid "%s: %ld: unexpected .ef\n" -msgstr "" - -#: rddbg.c:87 -#, c-format -msgid "%s: no recognized debugging information\n" -msgstr "" - -#: rddbg.c:410 -msgid "Last stabs entries before error:\n" -msgstr "" - -#: readelf.c:303 readelf.c:329 -#, c-format -msgid "%s: Error: " -msgstr "" - -#: readelf.c:315 readelf.c:344 -#, c-format -msgid "%s: Warning: " -msgstr "" - -#: readelf.c:394 readelf.c:532 -#, c-format -msgid "Unhandled data length: %d\n" -msgstr "" - -#: readelf.c:591 -msgid "Don't know about relocations on this machine architecture\n" -msgstr "" - -#: readelf.c:631 readelf.c:660 readelf.c:692 readelf.c:720 -msgid "out of memory parsing relocs" -msgstr "" - -#: readelf.c:738 -msgid "" -" Offset Info Type Symbol's Value Symbol's Name " -"Addend\n" -msgstr "" - -#: readelf.c:741 -msgid " Offset Info Type Symbol's Value Symbol's Name\n" -msgstr "" - -#: readelf.c:885 readelf.c:887 -#, c-format -msgid "unrecognised: %-7lx" -msgstr "" - -#: readelf.c:912 -#, c-format -msgid "" -msgstr "" - -#: readelf.c:1119 -#, c-format -msgid "Processor Specific: %lx" -msgstr "" - -#: readelf.c:1138 -#, c-format -msgid "Operating System specific: %lx" -msgstr "" - -#: readelf.c:1141 readelf.c:1506 -#, c-format -msgid ": %lx" -msgstr "" - -#: readelf.c:1155 -msgid "NONE (None)" -msgstr "" - -#: readelf.c:1156 -msgid "REL (Relocatable file)" -msgstr "" - -#: readelf.c:1157 -msgid "EXEC (Executable file)" -msgstr "" - -#: readelf.c:1158 -msgid "DYN (Shared object file)" -msgstr "" - -#: readelf.c:1159 -msgid "CORE (Core file)" -msgstr "" - -#: readelf.c:1163 -#, c-format -msgid "Processor Specific: (%x)" -msgstr "" - -#: readelf.c:1165 -#, c-format -msgid "OS Specific: (%x)" -msgstr "" - -#: readelf.c:1167 readelf.c:1244 readelf.c:1638 -#, c-format -msgid ": %x" -msgstr "" - -#: readelf.c:1180 -msgid "None" -msgstr "" - -#: readelf.c:1676 -msgid "Usage: readelf {options} elf-file(s)\n" -msgstr "" - -#: readelf.c:1677 -msgid " Options are:\n" -msgstr "" - -#: readelf.c:1678 -msgid " -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n" -msgstr "" - -#: readelf.c:1679 -msgid " -h or --file-header Display the ELF file header\n" -msgstr "" - -#: readelf.c:1680 -msgid " -l or --program-headers or --segments\n" -msgstr "" - -#: readelf.c:1681 -msgid " Display the program headers\n" -msgstr "" - -#: readelf.c:1682 -msgid " -S or --section-headers or --sections\n" -msgstr "" - -#: readelf.c:1683 -msgid " Display the sections' header\n" -msgstr "" - -#: readelf.c:1684 -msgid " -e or --headers Equivalent to: -h -l -S\n" -msgstr "" - -#: readelf.c:1685 -msgid " -s or --syms or --symbols Display the symbol table\n" -msgstr "" - -#: readelf.c:1686 -msgid " -n or --notes Display the core notes (if present)\n" -msgstr "" - -#: readelf.c:1687 -msgid " -r or --relocs Display the relocations (if present)\n" -msgstr "" - -#: readelf.c:1688 -msgid " -d or --dynamic Display the dynamic segment (if present)\n" -msgstr "" - -#: readelf.c:1689 -msgid " -V or --version-info Display the version sections (if present)\n" -msgstr "" - -#: readelf.c:1690 -msgid "" -" -A or --arch-specific Display architecture specific information (if " -"any).\n" -msgstr "" - -#: readelf.c:1691 -msgid "" -" -D or --use-dynamic Use the dynamic section info when displaying " -"symbols\n" -msgstr "" - -#: readelf.c:1692 -msgid " -x or --hex-dump=\n" -msgstr "" - -#: readelf.c:1693 -msgid " Dump the contents of section \n" -msgstr "" - -#: readelf.c:1694 -msgid " -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n" -msgstr "" - -#: readelf.c:1695 -msgid "" -" Display the contents of DWARF2 debug sections\n" -msgstr "" - -#: readelf.c:1697 -msgid " -i or --instruction-dump=\n" -msgstr "" - -#: readelf.c:1698 -msgid "" -" Disassemble the contents of section \n" -msgstr "" - -#: readelf.c:1700 -msgid " -I or --histogram Display histogram of bucket list lengths\n" -msgstr "" - -#: readelf.c:1701 -msgid " -v or --version Display the version number of readelf\n" -msgstr "" - -#: readelf.c:1702 -msgid " -H or --help Display this information\n" -msgstr "" - -#: readelf.c:1720 -msgid "Out of memory allocating dump request table." -msgstr "" - -#: readelf.c:1855 -#, c-format -msgid "Unrecognised debug option '%s'\n" -msgstr "" - -#: readelf.c:1880 -#, c-format -msgid "Invalid option '-%c'\n" -msgstr "" - -#: readelf.c:1893 -msgid "Nothing to do.\n" -msgstr "" - -#: readelf.c:1906 readelf.c:1923 readelf.c:3493 -msgid "none" -msgstr "" - -#: readelf.c:1907 -msgid "ELF32" -msgstr "" - -#: readelf.c:1908 -msgid "ELF64" -msgstr "" - -#: readelf.c:1910 readelf.c:1927 readelf.c:1946 -#, c-format -msgid "" -msgstr "" - -#: readelf.c:1924 -msgid "2's complement, little endian" -msgstr "" - -#: readelf.c:1925 -msgid "2's complement, big endian" -msgstr "" - -#: readelf.c:1940 -msgid "UNIX - System V" -msgstr "" - -#: readelf.c:1941 -msgid "UNIX - HP-UX" -msgstr "" - -#: readelf.c:1942 -msgid "UNIX - Linux" -msgstr "" - -#: readelf.c:1943 -msgid "Standalone App" -msgstr "" - -#: readelf.c:1944 -msgid "ARM" -msgstr "" - -#: readelf.c:1961 -msgid "Not an ELF file - it has the wrong magic bytes at the start\n" -msgstr "" - -#: readelf.c:1969 -msgid "ELF Header:\n" -msgstr "" - -#: readelf.c:1970 -msgid " Magic: " -msgstr "" - -#: readelf.c:1974 -#, c-format -msgid " Class: %s\n" -msgstr "" - -#: readelf.c:1976 -#, c-format -msgid " Data: %s\n" -msgstr "" - -#: readelf.c:1978 -#, c-format -msgid " Version: %d %s\n" -msgstr "" - -#: readelf.c:1985 -#, c-format -msgid " OS/ABI: %s\n" -msgstr "" - -#: readelf.c:1987 -#, c-format -msgid " ABI Version: %d\n" -msgstr "" - -#: readelf.c:1989 -#, c-format -msgid " Type: %s\n" -msgstr "" - -#: readelf.c:1991 -#, c-format -msgid " Machine: %s\n" -msgstr "" - -#: readelf.c:1993 -#, c-format -msgid " Version: 0x%lx\n" -msgstr "" - -#: readelf.c:1996 -msgid " Entry point address: " -msgstr "" - -#: readelf.c:1998 -msgid "" -"\n" -" Start of program headers: " -msgstr "" - -#: readelf.c:2000 -msgid "" -" (bytes into file)\n" -" Start of section headers: " -msgstr "" - -#: readelf.c:2002 -msgid " (bytes into file)\n" -msgstr "" - -#: readelf.c:2004 -#, c-format -msgid " Flags: 0x%lx%s\n" -msgstr "" - -#: readelf.c:2007 -#, c-format -msgid " Size of this header: %ld (bytes)\n" -msgstr "" - -#: readelf.c:2009 -#, c-format -msgid " Size of program headers: %ld (bytes)\n" -msgstr "" - -#: readelf.c:2011 -#, c-format -msgid " Number of program headers: %ld\n" -msgstr "" - -#: readelf.c:2013 -#, c-format -msgid " Size of section headers: %ld (bytes)\n" -msgstr "" - -#: readelf.c:2015 -#, c-format -msgid " Number of section headers: %ld\n" -msgstr "" - -#: readelf.c:2017 -#, c-format -msgid " Section header string table index: %ld\n" -msgstr "" - -#: readelf.c:2102 -msgid "" -"\n" -"There are no program headers in this file.\n" -msgstr "" - -#: readelf.c:2108 -#, c-format -msgid "" -"\n" -"Elf file type is %s\n" -msgstr "" - -#: readelf.c:2109 -msgid "Entry point " -msgstr "" - -#: readelf.c:2111 -#, c-format -msgid "" -"\n" -"There are %d program headers, starting at offset " -msgstr "" - -#: readelf.c:2122 readelf.c:2298 readelf.c:2340 readelf.c:2383 readelf.c:2424 -#: readelf.c:2932 readelf.c:2973 readelf.c:3149 readelf.c:4111 readelf.c:4125 -#: readelf.c:7023 readelf.c:7063 -msgid "Out of memory\n" -msgstr "" - -#: readelf.c:2140 -#, c-format -msgid "" -"\n" -"Program Header%s:\n" -msgstr "" - -#: readelf.c:2144 -msgid "" -" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n" -msgstr "" - -#: readelf.c:2148 -msgid " Type Offset VirtAddr PhysAddr\n" -msgstr "" - -#: readelf.c:2150 -msgid " FileSiz MemSiz Flags Align\n" -msgstr "" - -#: readelf.c:2208 -msgid "more than one dynamic segment\n" -msgstr "" - -#: readelf.c:2216 -msgid "Unable to find program interpreter name\n" -msgstr "" - -#: readelf.c:2223 -#, c-format -msgid "" -"\n" -" [Requesting program interpreter: %s]" -msgstr "" - -#: readelf.c:2241 -msgid "" -"\n" -" Section to Segment mapping:\n" -msgstr "" - -#: readelf.c:2242 -msgid " Segment Sections...\n" -msgstr "" - -#: readelf.c:2505 -msgid "" -"\n" -"There are no sections in this file.\n" -msgstr "" - -#: readelf.c:2511 -#, c-format -msgid "There are %d section headers, starting at offset 0x%lx:\n" -msgstr "" - -#: readelf.c:2551 -msgid "File contains multiple dynamic symbol tables\n" -msgstr "" - -#: readelf.c:2564 -msgid "File contains multiple dynamic string tables\n" -msgstr "" - -#: readelf.c:2591 -#, c-format -msgid "" -"\n" -"Section Header%s:\n" -msgstr "" - -#: readelf.c:2595 -msgid "" -" [Nr] Name Type Addr Off Size ES Flg Lk " -"Inf Al\n" -msgstr "" - -#: readelf.c:2598 -msgid " [Nr] Name Type Address Offset\n" -msgstr "" - -#: readelf.c:2599 -msgid " Size EntSize Flags Link Info Align\n" -msgstr "" - -#: readelf.c:2646 -msgid "" -"Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n" -msgstr "" - -#: readelf.c:2647 -msgid "" -" I (info), L (link order), O (extra OS processing required)\n" -msgstr "" - -#: readelf.c:2648 -msgid " o (os specific), p (processor specific) x (unknown)\n" -msgstr "" - -#: readelf.c:2706 -#, c-format -msgid "" -"\n" -"Relocation section at offset 0x%lx contains %ld bytes:\n" -msgstr "" - -#: readelf.c:2713 -msgid "" -"\n" -"There are no dynamic relocations in this file.\n" -msgstr "" - -#: readelf.c:2741 -msgid "" -"\n" -"Relocation section " -msgstr "" - -#: readelf.c:2748 -#, c-format -msgid " at offset 0x%lx contains %lu entries:\n" -msgstr "" - -#: readelf.c:2776 -msgid "" -"\n" -"There are no relocations in this file.\n" -msgstr "" - -#: readelf.c:3026 -msgid "" -"\n" -"There is no dynamic segment in this file.\n" -msgstr "" - -#: readelf.c:3060 -msgid "Unable to seek to end of file!" -msgstr "" - -#: readelf.c:3069 -msgid "Unable to determine the number of symbols to load\n" -msgstr "" - -#: readelf.c:3099 -msgid "Unable to seek to end of file\n" -msgstr "" - -#: readelf.c:3105 -msgid "Unable to determine the length of the dynamic string table\n" -msgstr "" - -#: readelf.c:3166 -#, c-format -msgid "" -"\n" -"Dynamic segment at offset 0x%x contains %ld entries:\n" -msgstr "" - -#: readelf.c:3169 -msgid " Tag Type Name/Value\n" -msgstr "" - -#: readelf.c:3200 -msgid "Auxiliary library" -msgstr "" - -#: readelf.c:3202 -msgid "Filter library" -msgstr "" - -#: readelf.c:3218 readelf.c:3239 readelf.c:3265 -msgid "Flags:" -msgstr "" - -#: readelf.c:3220 readelf.c:3241 readelf.c:3267 -msgid " None\n" -msgstr "" - -#: readelf.c:3370 -#, c-format -msgid "Shared library: [%s]" -msgstr "" - -#: readelf.c:3373 -msgid " program interpreter" -msgstr "" - -#: readelf.c:3377 -#, c-format -msgid "Library soname: [%s]" -msgstr "" - -#: readelf.c:3381 -#, c-format -msgid "Library rpath: [%s]" -msgstr "" - -#: readelf.c:3442 -#, c-format -msgid "Not needed object: [%s]\n" -msgstr "" - -#: readelf.c:3539 -#, c-format -msgid "" -"\n" -"Version definition section '%s' contains %ld entries:\n" -msgstr "" - -#: readelf.c:3542 -msgid " Addr: 0x" -msgstr "" - -#: readelf.c:3544 readelf.c:3732 -#, c-format -msgid " Offset: %#08lx Link: %lx (%s)\n" -msgstr "" - -#: readelf.c:3574 -#, c-format -msgid " %#06x: Rev: %d Flags: %s" -msgstr "" - -#: readelf.c:3577 -#, c-format -msgid " Index: %d Cnt: %d " -msgstr "" - -#: readelf.c:3588 -#, c-format -msgid "Name: %s\n" -msgstr "" - -#: readelf.c:3590 -#, c-format -msgid "Name index: %ld\n" -msgstr "" - -#: readelf.c:3605 -#, c-format -msgid " %#06x: Parent %d: %s\n" -msgstr "" - -#: readelf.c:3608 -#, c-format -msgid " %#06x: Parent %d, name index: %ld\n" -msgstr "" - -#: readelf.c:3627 -#, c-format -msgid "" -"\n" -"Version needs section '%s' contains %ld entries:\n" -msgstr "" - -#: readelf.c:3630 -msgid " Addr: 0x" -msgstr "" - -#: readelf.c:3632 -#, c-format -msgid " Offset: %#08lx Link to section: %ld (%s)\n" -msgstr "" - -#: readelf.c:3658 -#, c-format -msgid " %#06x: Version: %d" -msgstr "" - -#: readelf.c:3661 -#, c-format -msgid " File: %s" -msgstr "" - -#: readelf.c:3663 -#, c-format -msgid " File: %lx" -msgstr "" - -#: readelf.c:3665 -#, c-format -msgid " Cnt: %d\n" -msgstr "" - -#: readelf.c:3683 -#, c-format -msgid " %#06x: Name: %s" -msgstr "" - -#: readelf.c:3686 -#, c-format -msgid " %#06x: Name index: %lx" -msgstr "" - -#: readelf.c:3689 -#, c-format -msgid " Flags: %s Version: %d\n" -msgstr "" - -#: readelf.c:3727 -#, c-format -msgid "" -"\n" -"Version symbols section '%s' contains %d entries:\n" -msgstr "" - -#: readelf.c:3730 -msgid " Addr: " -msgstr "" - -#: readelf.c:3760 -msgid " 0 (*local*) " -msgstr "" - -#: readelf.c:3764 -msgid " 1 (*global*) " -msgstr "" - -#: readelf.c:3986 -msgid "" -"\n" -"No version information found in this file.\n" -msgstr "" - -#: readelf.c:4004 readelf.c:4039 -#, c-format -msgid ": %d" -msgstr "" - -#: readelf.c:4006 readelf.c:4051 -#, c-format -msgid ": %d" -msgstr "" - -#: readelf.c:4008 readelf.c:4054 -#, c-format -msgid ": %d" -msgstr "" - -#: readelf.c:4117 -msgid "Unable to read in dynamic data\n" -msgstr "" - -#: readelf.c:4159 -msgid "Unable to seek to start of dynamic information" -msgstr "" - -#: readelf.c:4165 -msgid "Failed to read in number of buckets\n" -msgstr "" - -#: readelf.c:4171 -msgid "Failed to read in number of chains\n" -msgstr "" - -#: readelf.c:4191 -msgid "" -"\n" -"Symbol table for image:\n" -msgstr "" - -#: readelf.c:4193 -msgid " Num Buc: Value Size Type Bind Vis Ndx Name\n" -msgstr "" - -#: readelf.c:4195 -msgid " Num Buc: Value Size Type Bind Vis Ndx Name\n" -msgstr "" - -#: readelf.c:4239 -#, c-format -msgid "" -"\n" -"Symbol table '%s' contains %lu entries:\n" -msgstr "" - -#: readelf.c:4243 -msgid " Num: Value Size Type Bind Vis Ndx Name\n" -msgstr "" - -#: readelf.c:4245 -msgid " Num: Value Size Type Bind Vis Ndx Name\n" -msgstr "" - -#: readelf.c:4354 -msgid "bad dynamic symbol" -msgstr "" - -#: readelf.c:4413 -msgid "" -"\n" -"Dynamic symbol information is not available for displaying symbols.\n" -msgstr "" - -#: readelf.c:4425 -#, c-format -msgid "" -"\n" -"Histogram for bucket list length (total of %d buckets):\n" -msgstr "" - -#: readelf.c:4427 -msgid " Length Number %% of total Coverage\n" -msgstr "" - -#: readelf.c:4432 readelf.c:4451 readelf.c:6704 readelf.c:6897 -msgid "Out of memory" -msgstr "" - -#: readelf.c:4500 -#, c-format -msgid "" -"\n" -"Dynamic info segment at offset 0x%lx contains %d entries:\n" -msgstr "" - -#: readelf.c:4503 -msgid " Num: Name BoundTo Flags\n" -msgstr "" - -#: readelf.c:4551 -#, c-format -msgid "" -"\n" -"Assembly dump of section %s\n" -msgstr "" - -#: readelf.c:4574 -#, c-format -msgid "" -"\n" -"Section '%s' has no data to dump.\n" -msgstr "" - -#: readelf.c:4579 -#, c-format -msgid "" -"\n" -"Hex dump of section '%s':\n" -msgstr "" - -#: readelf.c:4731 -msgid "badly formed extended line op encountered!" -msgstr "" - -#: readelf.c:4738 -#, c-format -msgid " Extended opcode %d: " -msgstr "" - -#: readelf.c:4743 -msgid "" -"End of Sequence\n" -"\n" -msgstr "" - -#: readelf.c:4749 -#, c-format -msgid "set Address to 0x%lx\n" -msgstr "" - -#: readelf.c:4754 -msgid " define new File Table entry\n" -msgstr "" - -#: readelf.c:4755 readelf.c:4877 -msgid " Entry\tDir\tTime\tSize\tName\n" -msgstr "" - -#: readelf.c:4757 -#, c-format -msgid " %d\t" -msgstr "" - -#: readelf.c:4760 readelf.c:4762 readelf.c:4764 readelf.c:4889 readelf.c:4891 -#: readelf.c:4893 -#, c-format -msgid "%lu\t" -msgstr "" - -#: readelf.c:4765 -#, c-format -msgid "" -"%s\n" -"\n" -msgstr "" - -#: readelf.c:4769 -#, c-format -msgid "UNKNOWN: length %d\n" -msgstr "" - -#: readelf.c:4795 -#, c-format -msgid "" -"\n" -"Dump of debug contents of section %s:\n" -"\n" -msgstr "" - -#: readelf.c:4807 -msgid "The line info appears to be corrupt - the section is too small\n" -msgstr "" - -#: readelf.c:4815 -msgid "Only DWARF version 2 line info is currently supported.\n" -msgstr "" - -#: readelf.c:4830 -#, c-format -msgid " Length: %ld\n" -msgstr "" - -#: readelf.c:4831 -#, c-format -msgid " DWARF Version: %d\n" -msgstr "" - -#: readelf.c:4832 -#, c-format -msgid " Prolgue Length: %d\n" -msgstr "" - -#: readelf.c:4833 -#, c-format -msgid " Minimum Instruction Length: %d\n" -msgstr "" - -#: readelf.c:4834 -#, c-format -msgid " Initial value of 'is_stmt': %d\n" -msgstr "" - -#: readelf.c:4835 -#, c-format -msgid " Line Base: %d\n" -msgstr "" - -#: readelf.c:4836 -#, c-format -msgid " Line Range: %d\n" -msgstr "" - -#: readelf.c:4837 -#, c-format -msgid " Opcode Base: %d\n" -msgstr "" - -#: readelf.c:4846 -msgid "" -"\n" -" Opcodes:\n" -msgstr "" - -#: readelf.c:4849 -#, c-format -msgid " Opcode %d has %d args\n" -msgstr "" - -#: readelf.c:4855 -msgid "" -"\n" -" The Directory Table is empty.\n" -msgstr "" - -#: readelf.c:4858 -msgid "" -"\n" -" The Directory Table:\n" -msgstr "" - -#: readelf.c:4862 -#, c-format -msgid " %s\n" -msgstr "" - -#: readelf.c:4873 -msgid "" -"\n" -" The File Name Table is empty.\n" -msgstr "" - -#: readelf.c:4876 -msgid "" -"\n" -" The File Name Table:\n" -msgstr "" - -#: readelf.c:4884 -#, c-format -msgid " %d\t" -msgstr "" - -#: readelf.c:4895 -#, c-format -msgid "%s\n" -msgstr "" - -#. Now display the statements. -#: readelf.c:4903 -msgid "" -"\n" -" Line Number Statements:\n" -msgstr "" - -#: readelf.c:4922 -msgid " Copy\n" -msgstr "" - -#: readelf.c:4929 -#, c-format -msgid " Advance PC by %d to %lx\n" -msgstr "" - -#: readelf.c:4937 -#, c-format -msgid " Advance Line by %d to %d\n" -msgstr "" - -#: readelf.c:4944 -#, c-format -msgid " Set File Name to entry %d in the File Name Table\n" -msgstr "" - -#: readelf.c:4952 -#, c-format -msgid " Set column to %d\n" -msgstr "" - -#: readelf.c:4959 -#, c-format -msgid " Set is_stmt to %d\n" -msgstr "" - -#: readelf.c:4964 -msgid " Set basic block\n" -msgstr "" - -#: readelf.c:4972 -#, c-format -msgid " Advance PC by constant %d to 0x%lx\n" -msgstr "" - -#: readelf.c:4980 -#, c-format -msgid " Advance PC by fixed size amount %d to 0x%lx\n" -msgstr "" - -#: readelf.c:4988 -#, c-format -msgid " Special opcode %d: advance Address by %d to 0x%lx" -msgstr "" - -#: readelf.c:4992 -#, c-format -msgid " and Line by %d to %d\n" -msgstr "" - -#: readelf.c:5015 readelf.c:5437 -#, c-format -msgid "" -"Contents of the %s section:\n" -"\n" -msgstr "" - -#: readelf.c:5034 -msgid "Only DWARF 2 pubnames are currently supported" -msgstr "" - -#: readelf.c:5038 -#, c-format -msgid " Length: %ld\n" -msgstr "" - -#: readelf.c:5040 -#, c-format -msgid " Version: %d\n" -msgstr "" - -#: readelf.c:5042 -#, c-format -msgid " Offset into .debug_info section: %ld\n" -msgstr "" - -#: readelf.c:5044 -#, c-format -msgid " Size of area in .debug_info section: %ld\n" -msgstr "" - -#: readelf.c:5047 -msgid "" -"\n" -" Offset\tName\n" -msgstr "" - -#: readelf.c:5129 -#, c-format -msgid "Unknown TAG value: %lx" -msgstr "" - -#: readelf.c:5224 -#, c-format -msgid "Unknown AT value: %lx" -msgstr "" - -#: readelf.c:5261 -#, c-format -msgid "Unknown FORM value: %lx" -msgstr "" - -#: readelf.c:5443 -msgid " Number TAG\n" -msgstr "" - -#: readelf.c:5449 -#, c-format -msgid " %ld %s [%s]\n" -msgstr "" - -#: readelf.c:5452 -msgid "has children" -msgstr "" - -#: readelf.c:5452 -msgid "no children" -msgstr "" - -#: readelf.c:5456 -#, c-format -msgid " %-18s %s\n" -msgstr "" - -#: readelf.c:5475 -#, c-format -msgid " %lu byte block: " -msgstr "" - -#: readelf.c:5939 -msgid "(User defined location op)" -msgstr "" - -#: readelf.c:5941 -msgid "(Unknown location op)" -msgstr "" - -#: readelf.c:6058 -#, c-format -msgid "Unable to handle FORM: %d" -msgstr "" - -#: readelf.c:6062 -#, c-format -msgid "Unrecognised form: %d" -msgstr "" - -#: readelf.c:6075 -msgid "(not inlined)" -msgstr "" - -#: readelf.c:6076 -msgid "(inlined)" -msgstr "" - -#: readelf.c:6077 -msgid "(declared as inline but ignored)" -msgstr "" - -#: readelf.c:6078 -msgid "(declared as inline and inlined)" -msgstr "" - -#: readelf.c:6079 -#, c-format -msgid " (Unknown inline attribute value: %lx)" -msgstr "" - -#: readelf.c:6209 readelf.c:6333 -#, c-format -msgid "" -"The section %s contains:\n" -"\n" -msgstr "" - -#: readelf.c:6231 -msgid "Only version 2 DWARF debug information is currently supported.\n" -msgstr "" - -#: readelf.c:6235 -msgid " Compilation Unit:\n" -msgstr "" - -#: readelf.c:6236 -#, c-format -msgid " Length: %ld\n" -msgstr "" - -#: readelf.c:6237 -#, c-format -msgid " Version: %d\n" -msgstr "" - -#: readelf.c:6238 -#, c-format -msgid " Abbrev Offset: %ld\n" -msgstr "" - -#: readelf.c:6239 -#, c-format -msgid " Pointer Size: %d\n" -msgstr "" - -#: readelf.c:6259 -msgid "Unable to locate .debug_abbrev section!\n" -msgstr "" - -#: readelf.c:6299 -#, c-format -msgid "Unable to locate entry %lu in the abbreviation table\n" -msgstr "" - -#: readelf.c:6304 -#, c-format -msgid " <%d><%x>: Abbrev Number: %lu (%s)\n" -msgstr "" - -#: readelf.c:6352 -#, c-format -msgid " Length: %ld\n" -msgstr "" - -#: readelf.c:6353 -#, c-format -msgid " Version: %d\n" -msgstr "" - -#: readelf.c:6354 -#, c-format -msgid " Offset into .debug_info: %lx\n" -msgstr "" - -#: readelf.c:6355 -#, c-format -msgid " Pointer Size: %d\n" -msgstr "" - -#: readelf.c:6356 -#, c-format -msgid " Segment Size: %d\n" -msgstr "" - -#: readelf.c:6358 -msgid "" -"\n" -" Address Length\n" -msgstr "" - -#: readelf.c:6399 -#, c-format -msgid "Displaying the debug contents of section %s is not yet supported.\n" -msgstr "" - -#: readelf.c:6461 -#, c-format -msgid "" -"\n" -"Section '%s' has no debugging data.\n" -msgstr "" - -#: readelf.c:6477 -#, c-format -msgid "Unrecognised debug section: %s\n" -msgstr "" - -#: readelf.c:6549 -msgid "Some sections were not dumped because they do not exist!\n" -msgstr "" - -#: readelf.c:6728 -#, c-format -msgid "" -"\n" -"Section '%s' contains %d entries:\n" -msgstr "" - -#: readelf.c:6890 -msgid "conflict list with without table" -msgstr "" - -#: readelf.c:6918 -#, c-format -msgid "" -"\n" -"Section '.conflict' contains %d entries:\n" -msgstr "" - -#: readelf.c:6919 -msgid " Num: Index Value Name" -msgstr "" - -#: readelf.c:6944 -msgid "NT_PRSTATUS (prstatus structure)" -msgstr "" - -#: readelf.c:6945 -msgid "NT_FPREGSET (floating point registers)" -msgstr "" - -#: readelf.c:6946 -msgid "NT_PRPSINFO (prpsinfo structure)" -msgstr "" - -#: readelf.c:6947 -msgid "NT_TASKSTRUCT (task structure)" -msgstr "" - -#: readelf.c:6948 -msgid "NT_PRXFPREG (user_xfpregs structure)" -msgstr "" - -#: readelf.c:6949 -msgid "NT_PSTATUS (pstatus structure)" -msgstr "" - -#: readelf.c:6950 -msgid "NT_FPREGS (floating point registers)" -msgstr "" - -#: readelf.c:6951 -msgid "NT_PSINFO (psinfo structure)" -msgstr "" - -#: readelf.c:6952 -msgid "NT_LWPSTATUS (lwpstatus_t structure)" -msgstr "" - -#: readelf.c:6953 -msgid "NT_LWPSINFO (lwpsinfo_t structure)" -msgstr "" - -#: readelf.c:6954 -msgid "NT_WIN32PSTATUS (win32_pstatus strcuture)" -msgstr "" - -#: readelf.c:6956 -#, c-format -msgid "Unknown note type: (0x%08x)" -msgstr "" - -#: readelf.c:6994 -#, c-format -msgid "" -"\n" -"Notes at offset 0x%08lx with length 0x%08lx:\n" -msgstr "" - -#: readelf.c:6997 -msgid " Owner\t\tData size\tDescription\n" -msgstr "" - -#: readelf.c:7108 -msgid "No note segments present in the core file.\n" -msgstr "" - -#: readelf.c:7186 -msgid "This instance of readelf has been built without support for a\n" -msgstr "" - -#: readelf.c:7187 -msgid "64 bit data type and so it cannot read 64 bit ELF files.\n" -msgstr "" - -#: readelf.c:7222 -#, c-format -msgid "Cannot stat input file %s.\n" -msgstr "" - -#: readelf.c:7229 -#, c-format -msgid "Input file %s not found.\n" -msgstr "" - -#: readelf.c:7235 -#, c-format -msgid "%s: Failed to read file header\n" -msgstr "" - -#: readelf.c:7249 -#, c-format -msgid "" -"\n" -"File: %s\n" -msgstr "" - -#: rename.c:131 -#, c-format -msgid "%s: cannot set time: %s" -msgstr "" - -#. We have to clean up here. -#: rename.c:170 rename.c:203 -#, c-format -msgid "%s: rename: %s" -msgstr "" - -#: rename.c:211 -#, c-format -msgid "%s: simple_copy: %s" -msgstr "" - -#: resbin.c:130 -#, c-format -msgid "%s: not enough binary data" -msgstr "" - -#: resbin.c:149 -msgid "null terminated unicode string" -msgstr "" - -#: resbin.c:179 resbin.c:185 -msgid "resource ID" -msgstr "" - -#: resbin.c:229 -msgid "cursor" -msgstr "" - -#: resbin.c:263 resbin.c:270 -msgid "menu header" -msgstr "" - -#: resbin.c:280 -msgid "menuex header" -msgstr "" - -#: resbin.c:284 -msgid "menuex offset" -msgstr "" - -#: resbin.c:291 -#, c-format -msgid "unsupported menu version %d" -msgstr "" - -#: resbin.c:319 resbin.c:334 resbin.c:400 -msgid "menuitem header" -msgstr "" - -#: resbin.c:430 -msgid "menuitem" -msgstr "" - -#: resbin.c:471 resbin.c:499 -msgid "dialog header" -msgstr "" - -#: resbin.c:489 -#, c-format -msgid "unexpected dialog signature %d" -msgstr "" - -#: resbin.c:531 -msgid "dialog font point size" -msgstr "" - -#: resbin.c:539 -msgid "dialogex font information" -msgstr "" - -#: resbin.c:564 resbin.c:582 -msgid "dialog control" -msgstr "" - -#: resbin.c:574 -msgid "dialogex control" -msgstr "" - -#: resbin.c:603 -msgid "dialog control end" -msgstr "" - -#: resbin.c:615 -msgid "dialog control data" -msgstr "" - -#: resbin.c:658 -msgid "stringtable string length" -msgstr "" - -#: resbin.c:668 -msgid "stringtable string" -msgstr "" - -#: resbin.c:701 -msgid "fontdir header" -msgstr "" - -#: resbin.c:714 -msgid "fontdir" -msgstr "" - -#: resbin.c:730 -msgid "fontdir device name" -msgstr "" - -#: resbin.c:736 -msgid "fontdir face name" -msgstr "" - -#: resbin.c:779 -msgid "accelerator" -msgstr "" - -#: resbin.c:843 -msgid "group cursor header" -msgstr "" - -#: resbin.c:847 -#, c-format -msgid "unexpected group cursor type %d" -msgstr "" - -#: resbin.c:862 -msgid "group cursor" -msgstr "" - -#: resbin.c:901 -msgid "group icon header" -msgstr "" - -#: resbin.c:905 -#, c-format -msgid "unexpected group icon type %d" -msgstr "" - -#: resbin.c:920 -msgid "group icon" -msgstr "" - -#: resbin.c:991 resbin.c:1210 -msgid "unexpected version string" -msgstr "" - -#: resbin.c:1025 -#, c-format -msgid "version length %d does not match resource length %lu" -msgstr "" - -#: resbin.c:1029 -#, c-format -msgid "unexpected version type %d" -msgstr "" - -#: resbin.c:1041 -#, c-format -msgid "unexpected fixed version information length %d" -msgstr "" - -#: resbin.c:1044 -msgid "fixed version info" -msgstr "" - -#: resbin.c:1048 -#, c-format -msgid "unexpected fixed version signature %lu" -msgstr "" - -#: resbin.c:1052 -#, c-format -msgid "unexpected fixed version info version %lu" -msgstr "" - -#: resbin.c:1081 -msgid "version var info" -msgstr "" - -#: resbin.c:1098 -#, c-format -msgid "unexpected stringfileinfo value length %d" -msgstr "" - -#: resbin.c:1108 -#, c-format -msgid "unexpected version stringtable value length %d" -msgstr "" - -#: resbin.c:1142 -#, c-format -msgid "unexpected version string length %d != %d + %d" -msgstr "" - -#: resbin.c:1153 -#, c-format -msgid "unexpected version string length %d < %d" -msgstr "" - -#: resbin.c:1170 -#, c-format -msgid "unexpected varfileinfo value length %d" -msgstr "" - -#: resbin.c:1189 -msgid "version varfileinfo" -msgstr "" - -#: resbin.c:1204 -#, c-format -msgid "unexpected version value length %d" -msgstr "" - -#: rescoff.c:128 -msgid "filename required for COFF input" -msgstr "" - -#: rescoff.c:145 -#, c-format -msgid "%s: %s: no resource section\n" -msgstr "" - -#: rescoff.c:154 -msgid "can't read resource section" -msgstr "" - -#: rescoff.c:180 -#, c-format -msgid "%s: %s: address out of bounds" -msgstr "" - -#: rescoff.c:199 -msgid "directory" -msgstr "" - -#: rescoff.c:227 -msgid "named directory entry" -msgstr "" - -#: rescoff.c:236 -msgid "directory entry name" -msgstr "" - -#: rescoff.c:256 -msgid "named subdirectory" -msgstr "" - -#: rescoff.c:264 -msgid "named resource" -msgstr "" - -#: rescoff.c:279 -msgid "ID directory entry" -msgstr "" - -#: rescoff.c:296 -msgid "ID subdirectory" -msgstr "" - -#: rescoff.c:304 -msgid "ID resource" -msgstr "" - -#: rescoff.c:330 -msgid "resource type unknown" -msgstr "" - -#: rescoff.c:333 -msgid "data entry" -msgstr "" - -#: rescoff.c:341 -msgid "resource data" -msgstr "" - -#: rescoff.c:346 -msgid "resource data size" -msgstr "" - -#: rescoff.c:441 -msgid "filename required for COFF output" -msgstr "" - -#: rescoff.c:740 -msgid "can't get BFD_RELOC_RVA relocation type" -msgstr "" - -#: resrc.c:240 resrc.c:312 -#, c-format -msgid "can't open temporary file `%s': %s" -msgstr "" - -#: resrc.c:246 -#, c-format -msgid "can't redirect stdout: `%s': %s" -msgstr "" - -#: resrc.c:262 -#, c-format -msgid "%s %s: %s" -msgstr "" - -#: resrc.c:283 -#, c-format -msgid "%s exited with status %d" -msgstr "" - -#: resrc.c:308 -#, c-format -msgid "can't execute `%s': %s" -msgstr "" - -#: resrc.c:317 -#, c-format -msgid "Using temporary file `%s' to read preprocessor output\n" -msgstr "" - -#: resrc.c:324 -#, c-format -msgid "can't popen `%s': %s" -msgstr "" - -#: resrc.c:326 -msgid "Using popen to read preprocessor output\n" -msgstr "" - -#: resrc.c:369 -#, c-format -msgid "Tried `%s'\n" -msgstr "" - -#: resrc.c:380 -#, c-format -msgid "Using `%s'\n" -msgstr "" - -#: resrc.c:544 -#, c-format -msgid "%s:%d: %s\n" -msgstr "" - -#: resrc.c:553 -#, c-format -msgid "%s: unexpected EOF" -msgstr "" - -#: resrc.c:610 -#, c-format -msgid "%s: read of %lu returned %lu" -msgstr "" - -#: resrc.c:652 resrc.c:883 resrc.c:1156 resrc.c:1310 -#, c-format -msgid "stat failed on bitmap file `%s': %s" -msgstr "" - -#: resrc.c:705 -#, c-format -msgid "cursor file `%s' does not contain cursor data" -msgstr "" - -#: resrc.c:737 resrc.c:1027 -#, c-format -msgid "%s: fseek to %lu failed: %s" -msgstr "" - -#: resrc.c:996 -#, c-format -msgid "icon file `%s' does not contain icon data" -msgstr "" - -#: resrc.c:1515 -#, c-format -msgid "can't open `%s' for output: %s" -msgstr "" - -#: size.c:79 -#, c-format -msgid "" -"Usage: %s [-ABdoxV] [--format=berkeley|sysv] [--radix=8|10|16]\n" -" [--target=bfdname] [--version] [--help] [file...]\n" -msgstr "" - -#: size.c:83 -msgid "default is --format=berkeley\n" -msgstr "" - -#: size.c:85 -msgid "default is --format=sysv\n" -msgstr "" - -#: size.c:139 -#, c-format -msgid "invalid argument to --format: %s\n" -msgstr "" - -#: size.c:166 -#, c-format -msgid "Invalid radix: %s\n" -msgstr "" - -#: srconv.c:1879 -#, c-format -msgid "Usage: %s [-dhVq] in-file [out-file]\n" -msgstr "" - -#: srconv.c:1886 -#, c-format -msgid "%s: Convert a COFF object file into a SYSROFF object file\n" -msgstr "" - -#: srconv.c:2024 -#, c-format -msgid "%s: unable to open output file %s\n" -msgstr "" - -#: stabs.c:349 stabs.c:1769 -msgid "numeric overflow" -msgstr "" - -#: stabs.c:360 -#, c-format -msgid "Bad stab: %s\n" -msgstr "" - -#: stabs.c:370 -#, c-format -msgid "Warning: %s: %s\n" -msgstr "" - -#: stabs.c:492 -msgid "N_LBRAC not within function\n" -msgstr "" - -#: stabs.c:531 -msgid "Too many N_RBRACs\n" -msgstr "" - -#: stabs.c:780 -msgid "unknown C++ encoded name" -msgstr "" - -#. Complain and keep going, so compilers can invent new -#. cross-reference types. -#: stabs.c:1306 -msgid "unrecognized cross reference type" -msgstr "" - -#. Does this actually ever happen? Is that why we are worrying -#. about dealing with it rather than just calling error_type? -#: stabs.c:1861 -msgid "missing index type" -msgstr "" - -#: stabs.c:2188 -msgid "unknown virtual character for baseclass" -msgstr "" - -#: stabs.c:2206 -msgid "unknown visibility character for baseclass" -msgstr "" - -#: stabs.c:2398 -msgid "unnamed $vb type" -msgstr "" - -#: stabs.c:2404 -msgid "unrecognized C++ abbreviation" -msgstr "" - -#: stabs.c:2484 -msgid "unknown visibility character for field" -msgstr "" - -#: stabs.c:2740 -msgid "const/volatile indicator missing" -msgstr "" - -#: stabs.c:2980 -#, c-format -msgid "No mangling for \"%s\"\n" -msgstr "" - -#: stabs.c:3293 -msgid "Undefined N_EXCL" -msgstr "" - -#: stabs.c:3381 -#, c-format -msgid "Type file number %d out of range\n" -msgstr "" - -#: stabs.c:3386 -#, c-format -msgid "Type index number %d out of range\n" -msgstr "" - -#: stabs.c:3473 -#, c-format -msgid "Unrecognized XCOFF type %d\n" -msgstr "" - -#: stabs.c:3772 -#, c-format -msgid "bad mangled name `%s'\n" -msgstr "" - -#: stabs.c:3868 -msgid "no argument types in mangled string\n" -msgstr "" - -#: strings.c:159 -#, c-format -msgid "%s: invalid number %s\n" -msgstr "" - -#: strings.c:494 -#, c-format -msgid "%s: invalid integer argument %s\n" -msgstr "" - -#: strings.c:505 -#, c-format -msgid "" -"Usage: %s [-afov] [-n min-len] [-min-len] [-t {o,x,d}] [-]\n" -" [--all] [--print-file-name] [--bytes=min-len] [--radix={o,x,d}]\n" -" [--target=bfdname] [--help] [--version] file...\n" -msgstr "" - -#: sysdump.c:712 -#, c-format -msgid "Usage: %s [-hV] in-file\n" -msgstr "" - -#: sysdump.c:783 -#, c-format -msgid "%s: cannot open input file %s\n" -msgstr "" - -#: version.c:39 -msgid "Copyright 1997, 1998, 1999 Free Software Foundation, Inc.\n" -msgstr "" - -#: version.c:40 -msgid "" -"This program is free software; you may redistribute it under the terms of\n" -"the GNU General Public License. This program has absolutely no warranty.\n" -msgstr "" - -#: windres.c:237 -#, c-format -msgid "can't open %s `%s': %s" -msgstr "" - -#: windres.c:416 -msgid ": expected to be a directory\n" -msgstr "" - -#: windres.c:428 -msgid ": expected to be a leaf\n" -msgstr "" - -#: windres.c:437 -#, c-format -msgid "%s: warning: " -msgstr "" - -#: windres.c:439 -msgid ": duplicate value\n" -msgstr "" - -#: windres.c:602 -#, c-format -msgid "%s: unknown format type `%s'\n" -msgstr "" - -#: windres.c:603 -#, c-format -msgid "%s: supported formats:" -msgstr "" - -#. Otherwise, we give up. -#: windres.c:690 -#, c-format -msgid "can not determine type of file `%s'; use the -I option" -msgstr "" - -#: windres.c:704 -#, c-format -msgid "Usage: %s [options] [input-file] [output-file]\n" -msgstr "" - -#: windres.c:706 -msgid "" -"Options:\n" -" -i FILE, --input FILE Name input file\n" -" -o FILE, --output FILE Name output file\n" -" -I FORMAT, --input-format FORMAT\n" -" Specify input format\n" -" -O FORMAT, --output-format FORMAT\n" -" Specify output format\n" -" -F TARGET, --target TARGET Specify COFF target\n" -" --preprocessor PROGRAM Program to use to preprocess rc file\n" -" --include-dir DIR Include directory when preprocessing rc file\n" -" -DSYM[=VAL], --define SYM[=VAL]\n" -" Define SYM when preprocessing rc file\n" -" -v Verbose - tells you what it's doing\n" -" --language VAL Set language when reading rc file\n" -" --use-temp-file Use a temporary file instead of popen to read\n" -" the preprocessor output\n" -" --no-use-temp-file Use popen (default)\n" -msgstr "" - -#: windres.c:725 -msgid " --yydebug Turn on parser debugging\n" -msgstr "" - -#: windres.c:728 -msgid "" -" --help Print this help message\n" -" --version Print version information\n" -msgstr "" - -#: windres.c:731 -msgid "" -"FORMAT is one of rc, res, or coff, and is deduced from the file name\n" -"extension if not specified. A single file name is an input file.\n" -"No input-file is stdin, default rc. No output-file is stdout, default rc.\n" -msgstr "" - -#: windres.c:980 -msgid "no resources" -msgstr "" - -#: wrstabs.c:366 wrstabs.c:2028 -#, c-format -msgid "string_hash_lookup failed: %s\n" -msgstr "" - -#: wrstabs.c:666 -#, c-format -msgid "stab_int_type: bad size %u\n" -msgstr "" - -#: wrstabs.c:1468 -#, c-format -msgid "%s: warning: unknown size for field `%s' in struct\n" -msgstr "" diff --git a/binutils/prdbg.c b/binutils/prdbg.c deleted file mode 100644 index abd684dfeb0..00000000000 --- a/binutils/prdbg.c +++ /dev/null @@ -1,1862 +0,0 @@ -/* prdbg.c -- Print out generic debugging information. - Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc. - Written by Ian Lance Taylor . - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file prints out the generic debugging information, by - supplying a set of routines to debug_write. */ - -#include -#include - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "debug.h" -#include "budbg.h" - -/* This is the structure we use as a handle for these routines. */ - -struct pr_handle -{ - /* File to print information to. */ - FILE *f; - /* Current indentation level. */ - unsigned int indent; - /* Type stack. */ - struct pr_stack *stack; - /* Parameter number we are about to output. */ - int parameter; -}; - -/* The type stack. */ - -struct pr_stack -{ - /* Next element on the stack. */ - struct pr_stack *next; - /* This element. */ - char *type; - /* Current visibility of fields if this is a class. */ - enum debug_visibility visibility; - /* Name of the current method we are handling. */ - const char *method; -}; - -static void indent PARAMS ((struct pr_handle *)); -static boolean push_type PARAMS ((struct pr_handle *, const char *)); -static boolean prepend_type PARAMS ((struct pr_handle *, const char *)); -static boolean append_type PARAMS ((struct pr_handle *, const char *)); -static boolean substitute_type PARAMS ((struct pr_handle *, const char *)); -static boolean indent_type PARAMS ((struct pr_handle *)); -static char *pop_type PARAMS ((struct pr_handle *)); -static void print_vma PARAMS ((bfd_vma, char *, boolean, boolean)); -static boolean pr_fix_visibility - PARAMS ((struct pr_handle *, enum debug_visibility)); - -static boolean pr_start_compilation_unit PARAMS ((PTR, const char *)); -static boolean pr_start_source PARAMS ((PTR, const char *)); -static boolean pr_empty_type PARAMS ((PTR)); -static boolean pr_void_type PARAMS ((PTR)); -static boolean pr_int_type PARAMS ((PTR, unsigned int, boolean)); -static boolean pr_float_type PARAMS ((PTR, unsigned int)); -static boolean pr_complex_type PARAMS ((PTR, unsigned int)); -static boolean pr_bool_type PARAMS ((PTR, unsigned int)); -static boolean pr_enum_type - PARAMS ((PTR, const char *, const char **, bfd_signed_vma *)); -static boolean pr_pointer_type PARAMS ((PTR)); -static boolean pr_function_type PARAMS ((PTR, int, boolean)); -static boolean pr_reference_type PARAMS ((PTR)); -static boolean pr_range_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma)); -static boolean pr_array_type - PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, boolean)); -static boolean pr_set_type PARAMS ((PTR, boolean)); -static boolean pr_offset_type PARAMS ((PTR)); -static boolean pr_method_type PARAMS ((PTR, boolean, int, boolean)); -static boolean pr_const_type PARAMS ((PTR)); -static boolean pr_volatile_type PARAMS ((PTR)); -static boolean pr_start_struct_type - PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int)); -static boolean pr_struct_field - PARAMS ((PTR, const char *, bfd_vma, bfd_vma, enum debug_visibility)); -static boolean pr_end_struct_type PARAMS ((PTR)); -static boolean pr_start_class_type - PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int, boolean, - boolean)); -static boolean pr_class_static_member - PARAMS ((PTR, const char *, const char *, enum debug_visibility)); -static boolean pr_class_baseclass - PARAMS ((PTR, bfd_vma, boolean, enum debug_visibility)); -static boolean pr_class_start_method PARAMS ((PTR, const char *)); -static boolean pr_class_method_variant - PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean, - bfd_vma, boolean)); -static boolean pr_class_static_method_variant - PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean)); -static boolean pr_class_end_method PARAMS ((PTR)); -static boolean pr_end_class_type PARAMS ((PTR)); -static boolean pr_typedef_type PARAMS ((PTR, const char *)); -static boolean pr_tag_type - PARAMS ((PTR, const char *, unsigned int, enum debug_type_kind)); -static boolean pr_typdef PARAMS ((PTR, const char *)); -static boolean pr_tag PARAMS ((PTR, const char *)); -static boolean pr_int_constant PARAMS ((PTR, const char *, bfd_vma)); -static boolean pr_float_constant PARAMS ((PTR, const char *, double)); -static boolean pr_typed_constant PARAMS ((PTR, const char *, bfd_vma)); -static boolean pr_variable - PARAMS ((PTR, const char *, enum debug_var_kind, bfd_vma)); -static boolean pr_start_function PARAMS ((PTR, const char *, boolean)); -static boolean pr_function_parameter - PARAMS ((PTR, const char *, enum debug_parm_kind, bfd_vma)); -static boolean pr_start_block PARAMS ((PTR, bfd_vma)); -static boolean pr_end_block PARAMS ((PTR, bfd_vma)); -static boolean pr_end_function PARAMS ((PTR)); -static boolean pr_lineno PARAMS ((PTR, const char *, unsigned long, bfd_vma)); - -static const struct debug_write_fns pr_fns = -{ - pr_start_compilation_unit, - pr_start_source, - pr_empty_type, - pr_void_type, - pr_int_type, - pr_float_type, - pr_complex_type, - pr_bool_type, - pr_enum_type, - pr_pointer_type, - pr_function_type, - pr_reference_type, - pr_range_type, - pr_array_type, - pr_set_type, - pr_offset_type, - pr_method_type, - pr_const_type, - pr_volatile_type, - pr_start_struct_type, - pr_struct_field, - pr_end_struct_type, - pr_start_class_type, - pr_class_static_member, - pr_class_baseclass, - pr_class_start_method, - pr_class_method_variant, - pr_class_static_method_variant, - pr_class_end_method, - pr_end_class_type, - pr_typedef_type, - pr_tag_type, - pr_typdef, - pr_tag, - pr_int_constant, - pr_float_constant, - pr_typed_constant, - pr_variable, - pr_start_function, - pr_function_parameter, - pr_start_block, - pr_end_block, - pr_end_function, - pr_lineno -}; - -/* Print out the generic debugging information recorded in dhandle. */ - -boolean -print_debugging_info (f, dhandle) - FILE *f; - PTR dhandle; -{ - struct pr_handle info; - - info.f = f; - info.indent = 0; - info.stack = NULL; - info.parameter = 0; - - return debug_write (dhandle, &pr_fns, (PTR) &info); -} - -/* Indent to the current indentation level. */ - -static void -indent (info) - struct pr_handle *info; -{ - unsigned int i; - - for (i = 0; i < info->indent; i++) - putc (' ', info->f); -} - -/* Push a type on the type stack. */ - -static boolean -push_type (info, type) - struct pr_handle *info; - const char *type; -{ - struct pr_stack *n; - - if (type == NULL) - return false; - - n = (struct pr_stack *) xmalloc (sizeof *n); - memset (n, 0, sizeof *n); - - n->type = xstrdup (type); - n->visibility = DEBUG_VISIBILITY_IGNORE; - n->method = NULL; - n->next = info->stack; - info->stack = n; - - return true; -} - -/* Prepend a string onto the type on the top of the type stack. */ - -static boolean -prepend_type (info, s) - struct pr_handle *info; - const char *s; -{ - char *n; - - assert (info->stack != NULL); - - n = (char *) xmalloc (strlen (s) + strlen (info->stack->type) + 1); - sprintf (n, "%s%s", s, info->stack->type); - free (info->stack->type); - info->stack->type = n; - - return true; -} - -/* Append a string to the type on the top of the type stack. */ - -static boolean -append_type (info, s) - struct pr_handle *info; - const char *s; -{ - unsigned int len; - - if (s == NULL) - return false; - - assert (info->stack != NULL); - - len = strlen (info->stack->type); - info->stack->type = (char *) xrealloc (info->stack->type, - len + strlen (s) + 1); - strcpy (info->stack->type + len, s); - - return true; -} - -/* We use an underscore to indicate where the name should go in a type - string. This function substitutes a string for the underscore. If - there is no underscore, the name follows the type. */ - -static boolean -substitute_type (info, s) - struct pr_handle *info; - const char *s; -{ - char *u; - - assert (info->stack != NULL); - - u = strchr (info->stack->type, '|'); - if (u != NULL) - { - char *n; - - n = (char *) xmalloc (strlen (info->stack->type) + strlen (s)); - - memcpy (n, info->stack->type, u - info->stack->type); - strcpy (n + (u - info->stack->type), s); - strcat (n, u + 1); - - free (info->stack->type); - info->stack->type = n; - - return true; - } - - if (strchr (s, '|') != NULL - && (strchr (info->stack->type, '{') != NULL - || strchr (info->stack->type, '(') != NULL)) - { - if (! prepend_type (info, "(") - || ! append_type (info, ")")) - return false; - } - - if (*s == '\0') - return true; - - return (append_type (info, " ") - && append_type (info, s)); -} - -/* Indent the type at the top of the stack by appending spaces. */ - -static boolean -indent_type (info) - struct pr_handle *info; -{ - unsigned int i; - - for (i = 0; i < info->indent; i++) - { - if (! append_type (info, " ")) - return false; - } - - return true; -} - -/* Pop a type from the type stack. */ - -static char * -pop_type (info) - struct pr_handle *info; -{ - struct pr_stack *o; - char *ret; - - assert (info->stack != NULL); - - o = info->stack; - info->stack = o->next; - ret = o->type; - free (o); - - return ret; -} - -/* Print a VMA value into a string. */ - -static void -print_vma (vma, buf, unsignedp, hexp) - bfd_vma vma; - char *buf; - boolean unsignedp; - boolean hexp; -{ - if (sizeof (vma) <= sizeof (unsigned long)) - { - if (hexp) - sprintf (buf, "0x%lx", (unsigned long) vma); - else if (unsignedp) - sprintf (buf, "%lu", (unsigned long) vma); - else - sprintf (buf, "%ld", (long) vma); - } - else - { - buf[0] = '0'; - buf[1] = 'x'; - sprintf_vma (buf + 2, vma); - } -} - -/* Start a new compilation unit. */ - -static boolean -pr_start_compilation_unit (p, filename) - PTR p; - const char *filename; -{ - struct pr_handle *info = (struct pr_handle *) p; - - assert (info->indent == 0); - - fprintf (info->f, "%s:\n", filename); - - return true; -} - -/* Start a source file within a compilation unit. */ - -static boolean -pr_start_source (p, filename) - PTR p; - const char *filename; -{ - struct pr_handle *info = (struct pr_handle *) p; - - assert (info->indent == 0); - - fprintf (info->f, " %s:\n", filename); - - return true; -} - -/* Push an empty type onto the type stack. */ - -static boolean -pr_empty_type (p) - PTR p; -{ - struct pr_handle *info = (struct pr_handle *) p; - - return push_type (info, ""); -} - -/* Push a void type onto the type stack. */ - -static boolean -pr_void_type (p) - PTR p; -{ - struct pr_handle *info = (struct pr_handle *) p; - - return push_type (info, "void"); -} - -/* Push an integer type onto the type stack. */ - -static boolean -pr_int_type (p, size, unsignedp) - PTR p; - unsigned int size; - boolean unsignedp; -{ - struct pr_handle *info = (struct pr_handle *) p; - char ab[10]; - - sprintf (ab, "%sint%d", unsignedp ? "u" : "", size * 8); - return push_type (info, ab); -} - -/* Push a floating type onto the type stack. */ - -static boolean -pr_float_type (p, size) - PTR p; - unsigned int size; -{ - struct pr_handle *info = (struct pr_handle *) p; - char ab[10]; - - if (size == 4) - return push_type (info, "float"); - else if (size == 8) - return push_type (info, "double"); - - sprintf (ab, "float%d", size * 8); - return push_type (info, ab); -} - -/* Push a complex type onto the type stack. */ - -static boolean -pr_complex_type (p, size) - PTR p; - unsigned int size; -{ - struct pr_handle *info = (struct pr_handle *) p; - - if (! pr_float_type (p, size)) - return false; - - return prepend_type (info, "complex "); -} - -/* Push a boolean type onto the type stack. */ - -static boolean -pr_bool_type (p, size) - PTR p; - unsigned int size; -{ - struct pr_handle *info = (struct pr_handle *) p; - char ab[10]; - - sprintf (ab, "bool%d", size * 8); - - return push_type (info, ab); -} - -/* Push an enum type onto the type stack. */ - -static boolean -pr_enum_type (p, tag, names, values) - PTR p; - const char *tag; - const char **names; - bfd_signed_vma *values; -{ - struct pr_handle *info = (struct pr_handle *) p; - unsigned int i; - bfd_signed_vma val; - - if (! push_type (info, "enum ")) - return false; - if (tag != NULL) - { - if (! append_type (info, tag) - || ! append_type (info, " ")) - return false; - } - if (! append_type (info, "{ ")) - return false; - - if (names == NULL) - { - if (! append_type (info, "/* undefined */")) - return false; - } - else - { - val = 0; - for (i = 0; names[i] != NULL; i++) - { - if (i > 0) - { - if (! append_type (info, ", ")) - return false; - } - - if (! append_type (info, names[i])) - return false; - - if (values[i] != val) - { - char ab[20]; - - print_vma (values[i], ab, false, false); - if (! append_type (info, " = ") - || ! append_type (info, ab)) - return false; - val = values[i]; - } - - ++val; - } - } - - return append_type (info, " }"); -} - -/* Turn the top type on the stack into a pointer. */ - -static boolean -pr_pointer_type (p) - PTR p; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *s; - - assert (info->stack != NULL); - - s = strchr (info->stack->type, '|'); - if (s != NULL && s[1] == '[') - return substitute_type (info, "(*|)"); - return substitute_type (info, "*|"); -} - -/* Turn the top type on the stack into a function returning that type. */ - -static boolean -pr_function_type (p, argcount, varargs) - PTR p; - int argcount; - boolean varargs; -{ - struct pr_handle *info = (struct pr_handle *) p; - char **arg_types; - unsigned int len; - char *s; - - assert (info->stack != NULL); - - len = 10; - - if (argcount <= 0) - { - arg_types = NULL; - len += 15; - } - else - { - int i; - - arg_types = (char **) xmalloc (argcount * sizeof *arg_types); - for (i = argcount - 1; i >= 0; i--) - { - if (! substitute_type (info, "")) - return false; - arg_types[i] = pop_type (info); - if (arg_types[i] == NULL) - return false; - len += strlen (arg_types[i]) + 2; - } - if (varargs) - len += 5; - } - - /* Now the return type is on the top of the stack. */ - - s = (char *) xmalloc (len); - strcpy (s, "(|) ("); - - if (argcount < 0) - strcat (s, "/* unknown */"); - else - { - int i; - - for (i = 0; i < argcount; i++) - { - if (i > 0) - strcat (s, ", "); - strcat (s, arg_types[i]); - } - if (varargs) - { - if (i > 0) - strcat (s, ", "); - strcat (s, "..."); - } - if (argcount > 0) - free (arg_types); - } - - strcat (s, ")"); - - if (! substitute_type (info, s)) - return false; - - free (s); - - return true; -} - -/* Turn the top type on the stack into a reference to that type. */ - -static boolean -pr_reference_type (p) - PTR p; -{ - struct pr_handle *info = (struct pr_handle *) p; - - assert (info->stack != NULL); - - return substitute_type (info, "&|"); -} - -/* Make a range type. */ - -static boolean -pr_range_type (p, lower, upper) - PTR p; - bfd_signed_vma lower; - bfd_signed_vma upper; -{ - struct pr_handle *info = (struct pr_handle *) p; - char abl[20], abu[20]; - - assert (info->stack != NULL); - - if (! substitute_type (info, "")) - return false; - - print_vma (lower, abl, false, false); - print_vma (upper, abu, false, false); - - return (prepend_type (info, "range (") - && append_type (info, "):") - && append_type (info, abl) - && append_type (info, ":") - && append_type (info, abu)); -} - -/* Make an array type. */ - -/*ARGSUSED*/ -static boolean -pr_array_type (p, lower, upper, stringp) - PTR p; - bfd_signed_vma lower; - bfd_signed_vma upper; - boolean stringp; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *range_type; - char abl[20], abu[20], ab[50]; - - range_type = pop_type (info); - if (range_type == NULL) - return false; - - if (lower == 0) - { - if (upper == -1) - sprintf (ab, "|[]"); - else - { - print_vma (upper + 1, abu, false, false); - sprintf (ab, "|[%s]", abu); - } - } - else - { - print_vma (lower, abl, false, false); - print_vma (upper, abu, false, false); - sprintf (ab, "|[%s:%s]", abl, abu); - } - - if (! substitute_type (info, ab)) - return false; - - if (strcmp (range_type, "int") != 0) - { - if (! append_type (info, ":") - || ! append_type (info, range_type)) - return false; - } - - if (stringp) - { - if (! append_type (info, " /* string */")) - return false; - } - - return true; -} - -/* Make a set type. */ - -/*ARGSUSED*/ -static boolean -pr_set_type (p, bitstringp) - PTR p; - boolean bitstringp; -{ - struct pr_handle *info = (struct pr_handle *) p; - - if (! substitute_type (info, "")) - return false; - - if (! prepend_type (info, "set { ") - || ! append_type (info, " }")) - return false; - - if (bitstringp) - { - if (! append_type (info, "/* bitstring */")) - return false; - } - - return true; -} - -/* Make an offset type. */ - -static boolean -pr_offset_type (p) - PTR p; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *t; - - if (! substitute_type (info, "")) - return false; - - t = pop_type (info); - if (t == NULL) - return false; - - return (substitute_type (info, "") - && prepend_type (info, " ") - && prepend_type (info, t) - && append_type (info, "::|")); -} - -/* Make a method type. */ - -static boolean -pr_method_type (p, domain, argcount, varargs) - PTR p; - boolean domain; - int argcount; - boolean varargs; -{ - struct pr_handle *info = (struct pr_handle *) p; - unsigned int len; - char *domain_type; - char **arg_types; - char *s; - - len = 10; - - if (! domain) - domain_type = NULL; - else - { - if (! substitute_type (info, "")) - return false; - domain_type = pop_type (info); - if (domain_type == NULL) - return false; - if (strncmp (domain_type, "class ", sizeof "class " - 1) == 0 - && strchr (domain_type + sizeof "class " - 1, ' ') == NULL) - domain_type += sizeof "class " - 1; - else if (strncmp (domain_type, "union class ", - sizeof "union class ") == 0 - && (strchr (domain_type + sizeof "union class " - 1, ' ') - == NULL)) - domain_type += sizeof "union class " - 1; - len += strlen (domain_type); - } - - if (argcount <= 0) - { - arg_types = NULL; - len += 15; - } - else - { - int i; - - arg_types = (char **) xmalloc (argcount * sizeof *arg_types); - for (i = argcount - 1; i >= 0; i--) - { - if (! substitute_type (info, "")) - return false; - arg_types[i] = pop_type (info); - if (arg_types[i] == NULL) - return false; - len += strlen (arg_types[i]) + 2; - } - if (varargs) - len += 5; - } - - /* Now the return type is on the top of the stack. */ - - s = (char *) xmalloc (len); - if (! domain) - *s = '\0'; - else - strcpy (s, domain_type); - strcat (s, "::| ("); - - if (argcount < 0) - strcat (s, "/* unknown */"); - else - { - int i; - - for (i = 0; i < argcount; i++) - { - if (i > 0) - strcat (s, ", "); - strcat (s, arg_types[i]); - } - if (varargs) - { - if (i > 0) - strcat (s, ", "); - strcat (s, "..."); - } - if (argcount > 0) - free (arg_types); - } - - strcat (s, ")"); - - if (! substitute_type (info, s)) - return false; - - free (s); - - return true; -} - -/* Make a const qualified type. */ - -static boolean -pr_const_type (p) - PTR p; -{ - struct pr_handle *info = (struct pr_handle *) p; - - return substitute_type (info, "const |"); -} - -/* Make a volatile qualified type. */ - -static boolean -pr_volatile_type (p) - PTR p; -{ - struct pr_handle *info = (struct pr_handle *) p; - - return substitute_type (info, "volatile |"); -} - -/* Start accumulating a struct type. */ - -static boolean -pr_start_struct_type (p, tag, id, structp, size) - PTR p; - const char *tag; - unsigned int id; - boolean structp; - unsigned int size; -{ - struct pr_handle *info = (struct pr_handle *) p; - - info->indent += 2; - - if (! push_type (info, structp ? "struct " : "union ")) - return false; - if (tag != NULL) - { - if (! append_type (info, tag)) - return false; - } - else - { - char idbuf[20]; - - sprintf (idbuf, "%%anon%u", id); - if (! append_type (info, idbuf)) - return false; - } - - if (! append_type (info, " {")) - return false; - if (size != 0 || tag != NULL) - { - char ab[30]; - - if (! append_type (info, " /*")) - return false; - - if (size != 0) - { - sprintf (ab, " size %u", size); - if (! append_type (info, ab)) - return false; - } - if (tag != NULL) - { - sprintf (ab, " id %u", id); - if (! append_type (info, ab)) - return false; - } - if (! append_type (info, " */")) - return false; - } - if (! append_type (info, "\n")) - return false; - - info->stack->visibility = DEBUG_VISIBILITY_PUBLIC; - - return indent_type (info); -} - -/* Output the visibility of a field in a struct. */ - -static boolean -pr_fix_visibility (info, visibility) - struct pr_handle *info; - enum debug_visibility visibility; -{ - const char *s = NULL; - char *t; - unsigned int len; - - assert (info->stack != NULL); - - if (info->stack->visibility == visibility) - return true; - - assert (info->stack->visibility != DEBUG_VISIBILITY_IGNORE); - - switch (visibility) - { - case DEBUG_VISIBILITY_PUBLIC: - s = "public"; - break; - case DEBUG_VISIBILITY_PRIVATE: - s = "private"; - break; - case DEBUG_VISIBILITY_PROTECTED: - s = "protected"; - break; - case DEBUG_VISIBILITY_IGNORE: - s = "/* ignore */"; - break; - default: - abort (); - return false; - } - - /* Trim off a trailing space in the struct string, to make the - output look a bit better, then stick on the visibility string. */ - - t = info->stack->type; - len = strlen (t); - assert (t[len - 1] == ' '); - t[len - 1] = '\0'; - - if (! append_type (info, s) - || ! append_type (info, ":\n") - || ! indent_type (info)) - return false; - - info->stack->visibility = visibility; - - return true; -} - -/* Add a field to a struct type. */ - -static boolean -pr_struct_field (p, name, bitpos, bitsize, visibility) - PTR p; - const char *name; - bfd_vma bitpos; - bfd_vma bitsize; - enum debug_visibility visibility; -{ - struct pr_handle *info = (struct pr_handle *) p; - char ab[20]; - char *t; - - if (! substitute_type (info, name)) - return false; - - if (! append_type (info, "; /* ")) - return false; - - if (bitsize != 0) - { - print_vma (bitsize, ab, true, false); - if (! append_type (info, "bitsize ") - || ! append_type (info, ab) - || ! append_type (info, ", ")) - return false; - } - - print_vma (bitpos, ab, true, false); - if (! append_type (info, "bitpos ") - || ! append_type (info, ab) - || ! append_type (info, " */\n") - || ! indent_type (info)) - return false; - - t = pop_type (info); - if (t == NULL) - return false; - - if (! pr_fix_visibility (info, visibility)) - return false; - - return append_type (info, t); -} - -/* Finish a struct type. */ - -static boolean -pr_end_struct_type (p) - PTR p; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *s; - - assert (info->stack != NULL); - assert (info->indent >= 2); - - info->indent -= 2; - - /* Change the trailing indentation to have a close brace. */ - s = info->stack->type + strlen (info->stack->type) - 2; - assert (s[0] == ' ' && s[1] == ' ' && s[2] == '\0'); - - *s++ = '}'; - *s = '\0'; - - return true; -} - -/* Start a class type. */ - -static boolean -pr_start_class_type (p, tag, id, structp, size, vptr, ownvptr) - PTR p; - const char *tag; - unsigned int id; - boolean structp; - unsigned int size; - boolean vptr; - boolean ownvptr; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *tv = NULL; - - info->indent += 2; - - if (vptr && ! ownvptr) - { - tv = pop_type (info); - if (tv == NULL) - return false; - } - - if (! push_type (info, structp ? "class " : "union class ")) - return false; - if (tag != NULL) - { - if (! append_type (info, tag)) - return false; - } - else - { - char idbuf[20]; - - sprintf (idbuf, "%%anon%u", id); - if (! append_type (info, idbuf)) - return false; - } - - if (! append_type (info, " {")) - return false; - if (size != 0 || vptr || ownvptr || tag != NULL) - { - if (! append_type (info, " /*")) - return false; - - if (size != 0) - { - char ab[20]; - - sprintf (ab, "%u", size); - if (! append_type (info, " size ") - || ! append_type (info, ab)) - return false; - } - - if (vptr) - { - if (! append_type (info, " vtable ")) - return false; - if (ownvptr) - { - if (! append_type (info, "self ")) - return false; - } - else - { - if (! append_type (info, tv) - || ! append_type (info, " ")) - return false; - } - } - - if (tag != NULL) - { - char ab[30]; - - sprintf (ab, " id %u", id); - if (! append_type (info, ab)) - return false; - } - - if (! append_type (info, " */")) - return false; - } - - info->stack->visibility = DEBUG_VISIBILITY_PRIVATE; - - return (append_type (info, "\n") - && indent_type (info)); -} - -/* Add a static member to a class. */ - -static boolean -pr_class_static_member (p, name, physname, visibility) - PTR p; - const char *name; - const char *physname; - enum debug_visibility visibility; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *t; - - if (! substitute_type (info, name)) - return false; - - if (! prepend_type (info, "static ") - || ! append_type (info, "; /* ") - || ! append_type (info, physname) - || ! append_type (info, " */\n") - || ! indent_type (info)) - return false; - - t = pop_type (info); - if (t == NULL) - return false; - - if (! pr_fix_visibility (info, visibility)) - return false; - - return append_type (info, t); -} - -/* Add a base class to a class. */ - -static boolean -pr_class_baseclass (p, bitpos, virtual, visibility) - PTR p; - bfd_vma bitpos; - boolean virtual; - enum debug_visibility visibility; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *t; - const char *prefix; - char ab[20]; - char *s, *l, *n; - - assert (info->stack != NULL && info->stack->next != NULL); - - if (! substitute_type (info, "")) - return false; - - t = pop_type (info); - if (t == NULL) - return false; - - if (strncmp (t, "class ", sizeof "class " - 1) == 0) - t += sizeof "class " - 1; - - /* Push it back on to take advantage of the prepend_type and - append_type routines. */ - if (! push_type (info, t)) - return false; - - if (virtual) - { - if (! prepend_type (info, "virtual ")) - return false; - } - - switch (visibility) - { - case DEBUG_VISIBILITY_PUBLIC: - prefix = "public "; - break; - case DEBUG_VISIBILITY_PROTECTED: - prefix = "protected "; - break; - case DEBUG_VISIBILITY_PRIVATE: - prefix = "private "; - break; - default: - prefix = "/* unknown visibility */ "; - break; - } - - if (! prepend_type (info, prefix)) - return false; - - if (bitpos != 0) - { - print_vma (bitpos, ab, true, false); - if (! append_type (info, " /* bitpos ") - || ! append_type (info, ab) - || ! append_type (info, " */")) - return false; - } - - /* Now the top of the stack is something like "public A / * bitpos - 10 * /". The next element on the stack is something like "class - xx { / * size 8 * /\n...". We want to substitute the top of the - stack in before the {. */ - s = strchr (info->stack->next->type, '{'); - assert (s != NULL); - --s; - - /* If there is already a ':', then we already have a baseclass, and - we must append this one after a comma. */ - for (l = info->stack->next->type; l != s; l++) - if (*l == ':') - break; - if (! prepend_type (info, l == s ? " : " : ", ")) - return false; - - t = pop_type (info); - if (t == NULL) - return false; - - n = (char *) xmalloc (strlen (info->stack->type) + strlen (t) + 1); - memcpy (n, info->stack->type, s - info->stack->type); - strcpy (n + (s - info->stack->type), t); - strcat (n, s); - - free (info->stack->type); - info->stack->type = n; - - free (t); - - return true; -} - -/* Start adding a method to a class. */ - -static boolean -pr_class_start_method (p, name) - PTR p; - const char *name; -{ - struct pr_handle *info = (struct pr_handle *) p; - - assert (info->stack != NULL); - info->stack->method = name; - return true; -} - -/* Add a variant to a method. */ - -static boolean -pr_class_method_variant (p, physname, visibility, constp, volatilep, voffset, - context) - PTR p; - const char *physname; - enum debug_visibility visibility; - boolean constp; - boolean volatilep; - bfd_vma voffset; - boolean context; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *method_type; - char *context_type; - - assert (info->stack != NULL); - assert (info->stack->next != NULL); - - /* Put the const and volatile qualifiers on the type. */ - if (volatilep) - { - if (! append_type (info, " volatile")) - return false; - } - if (constp) - { - if (! append_type (info, " const")) - return false; - } - - /* Stick the name of the method into its type. */ - if (! substitute_type (info, - (context - ? info->stack->next->next->method - : info->stack->next->method))) - return false; - - /* Get the type. */ - method_type = pop_type (info); - if (method_type == NULL) - return false; - - /* Pull off the context type if there is one. */ - if (! context) - context_type = NULL; - else - { - context_type = pop_type (info); - if (context_type == NULL) - return false; - } - - /* Now the top of the stack is the class. */ - - if (! pr_fix_visibility (info, visibility)) - return false; - - if (! append_type (info, method_type) - || ! append_type (info, " /* ") - || ! append_type (info, physname) - || ! append_type (info, " ")) - return false; - if (context || voffset != 0) - { - char ab[20]; - - if (context) - { - if (! append_type (info, "context ") - || ! append_type (info, context_type) - || ! append_type (info, " ")) - return false; - } - print_vma (voffset, ab, true, false); - if (! append_type (info, "voffset ") - || ! append_type (info, ab)) - return false; - } - - return (append_type (info, " */;\n") - && indent_type (info)); -} - -/* Add a static variant to a method. */ - -static boolean -pr_class_static_method_variant (p, physname, visibility, constp, volatilep) - PTR p; - const char *physname; - enum debug_visibility visibility; - boolean constp; - boolean volatilep; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *method_type; - - assert (info->stack != NULL); - assert (info->stack->next != NULL); - assert (info->stack->next->method != NULL); - - /* Put the const and volatile qualifiers on the type. */ - if (volatilep) - { - if (! append_type (info, " volatile")) - return false; - } - if (constp) - { - if (! append_type (info, " const")) - return false; - } - - /* Mark it as static. */ - if (! prepend_type (info, "static ")) - return false; - - /* Stick the name of the method into its type. */ - if (! substitute_type (info, info->stack->next->method)) - return false; - - /* Get the type. */ - method_type = pop_type (info); - if (method_type == NULL) - return false; - - /* Now the top of the stack is the class. */ - - if (! pr_fix_visibility (info, visibility)) - return false; - - return (append_type (info, method_type) - && append_type (info, " /* ") - && append_type (info, physname) - && append_type (info, " */;\n") - && indent_type (info)); -} - -/* Finish up a method. */ - -static boolean -pr_class_end_method (p) - PTR p; -{ - struct pr_handle *info = (struct pr_handle *) p; - - info->stack->method = NULL; - return true; -} - -/* Finish up a class. */ - -static boolean -pr_end_class_type (p) - PTR p; -{ - return pr_end_struct_type (p); -} - -/* Push a type on the stack using a typedef name. */ - -static boolean -pr_typedef_type (p, name) - PTR p; - const char *name; -{ - struct pr_handle *info = (struct pr_handle *) p; - - return push_type (info, name); -} - -/* Push a type on the stack using a tag name. */ - -static boolean -pr_tag_type (p, name, id, kind) - PTR p; - const char *name; - unsigned int id; - enum debug_type_kind kind; -{ - struct pr_handle *info = (struct pr_handle *) p; - const char *t, *tag; - char idbuf[20]; - - switch (kind) - { - case DEBUG_KIND_STRUCT: - t = "struct "; - break; - case DEBUG_KIND_UNION: - t = "union "; - break; - case DEBUG_KIND_ENUM: - t = "enum "; - break; - case DEBUG_KIND_CLASS: - t = "class "; - break; - case DEBUG_KIND_UNION_CLASS: - t = "union class "; - break; - default: - abort (); - return false; - } - - if (! push_type (info, t)) - return false; - if (name != NULL) - tag = name; - else - { - sprintf (idbuf, "%%anon%u", id); - tag = idbuf; - } - - if (! append_type (info, tag)) - return false; - if (name != NULL && kind != DEBUG_KIND_ENUM) - { - sprintf (idbuf, " /* id %u */", id); - if (! append_type (info, idbuf)) - return false; - } - - return true; -} - -/* Output a typedef. */ - -static boolean -pr_typdef (p, name) - PTR p; - const char *name; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *s; - - if (! substitute_type (info, name)) - return false; - - s = pop_type (info); - if (s == NULL) - return false; - - indent (info); - fprintf (info->f, "typedef %s;\n", s); - - free (s); - - return true; -} - -/* Output a tag. The tag should already be in the string on the - stack, so all we have to do here is print it out. */ - -/*ARGSUSED*/ -static boolean -pr_tag (p, name) - PTR p; - const char *name ATTRIBUTE_UNUSED; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *t; - - t = pop_type (info); - if (t == NULL) - return false; - - indent (info); - fprintf (info->f, "%s;\n", t); - - free (t); - - return true; -} - -/* Output an integer constant. */ - -static boolean -pr_int_constant (p, name, val) - PTR p; - const char *name; - bfd_vma val; -{ - struct pr_handle *info = (struct pr_handle *) p; - char ab[20]; - - indent (info); - print_vma (val, ab, false, false); - fprintf (info->f, "const int %s = %s;\n", name, ab); - return true; -} - -/* Output a floating point constant. */ - -static boolean -pr_float_constant (p, name, val) - PTR p; - const char *name; - double val; -{ - struct pr_handle *info = (struct pr_handle *) p; - - indent (info); - fprintf (info->f, "const double %s = %g;\n", name, val); - return true; -} - -/* Output a typed constant. */ - -static boolean -pr_typed_constant (p, name, val) - PTR p; - const char *name; - bfd_vma val; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *t; - char ab[20]; - - t = pop_type (info); - if (t == NULL) - return false; - - indent (info); - print_vma (val, ab, false, false); - fprintf (info->f, "const %s %s = %s;\n", t, name, ab); - - free (t); - - return true; -} - -/* Output a variable. */ - -static boolean -pr_variable (p, name, kind, val) - PTR p; - const char *name; - enum debug_var_kind kind; - bfd_vma val; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *t; - char ab[20]; - - if (! substitute_type (info, name)) - return false; - - t = pop_type (info); - if (t == NULL) - return false; - - indent (info); - switch (kind) - { - case DEBUG_STATIC: - case DEBUG_LOCAL_STATIC: - fprintf (info->f, "static "); - break; - case DEBUG_REGISTER: - fprintf (info->f, "register "); - break; - default: - break; - } - print_vma (val, ab, true, true); - fprintf (info->f, "%s /* %s */;\n", t, ab); - - free (t); - - return true; -} - -/* Start outputting a function. */ - -static boolean -pr_start_function (p, name, global) - PTR p; - const char *name; - boolean global; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *t; - - if (! substitute_type (info, name)) - return false; - - t = pop_type (info); - if (t == NULL) - return false; - - indent (info); - if (! global) - fprintf (info->f, "static "); - fprintf (info->f, "%s (", t); - - info->parameter = 1; - - return true; -} - -/* Output a function parameter. */ - -static boolean -pr_function_parameter (p, name, kind, val) - PTR p; - const char *name; - enum debug_parm_kind kind; - bfd_vma val; -{ - struct pr_handle *info = (struct pr_handle *) p; - char *t; - char ab[20]; - - if (kind == DEBUG_PARM_REFERENCE - || kind == DEBUG_PARM_REF_REG) - { - if (! pr_reference_type (p)) - return false; - } - - if (! substitute_type (info, name)) - return false; - - t = pop_type (info); - if (t == NULL) - return false; - - if (info->parameter != 1) - fprintf (info->f, ", "); - - if (kind == DEBUG_PARM_REG || kind == DEBUG_PARM_REF_REG) - fprintf (info->f, "register "); - - print_vma (val, ab, true, true); - fprintf (info->f, "%s /* %s */", t, ab); - - free (t); - - ++info->parameter; - - return true; -} - -/* Start writing out a block. */ - -static boolean -pr_start_block (p, addr) - PTR p; - bfd_vma addr; -{ - struct pr_handle *info = (struct pr_handle *) p; - char ab[20]; - - if (info->parameter > 0) - { - fprintf (info->f, ")\n"); - info->parameter = 0; - } - - indent (info); - print_vma (addr, ab, true, true); - fprintf (info->f, "{ /* %s */\n", ab); - - info->indent += 2; - - return true; -} - -/* Write out line number information. */ - -static boolean -pr_lineno (p, filename, lineno, addr) - PTR p; - const char *filename; - unsigned long lineno; - bfd_vma addr; -{ - struct pr_handle *info = (struct pr_handle *) p; - char ab[20]; - - indent (info); - print_vma (addr, ab, true, true); - fprintf (info->f, "/* file %s line %lu addr %s */\n", filename, lineno, ab); - - return true; -} - -/* Finish writing out a block. */ - -static boolean -pr_end_block (p, addr) - PTR p; - bfd_vma addr; -{ - struct pr_handle *info = (struct pr_handle *) p; - char ab[20]; - - info->indent -= 2; - - indent (info); - print_vma (addr, ab, true, true); - fprintf (info->f, "} /* %s */\n", ab); - - return true; -} - -/* Finish writing out a function. */ - -/*ARGSUSED*/ -static boolean -pr_end_function (p) - PTR p ATTRIBUTE_UNUSED; -{ - return true; -} diff --git a/binutils/ranlib.1 b/binutils/ranlib.1 deleted file mode 100644 index 7efb5c8e850..00000000000 --- a/binutils/ranlib.1 +++ /dev/null @@ -1,83 +0,0 @@ -.\" Copyright (c) 1991 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH ranlib 1 "5 November 1991" "cygnus support" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -ranlib \- generate index to archive. - -.SH SYNOPSIS -.hy 0 -.na -.B ranlib \c -.RB "[\|" \-v | \-V "\|]" -.I archive\c -\& -.ad b -.hy 1 -.SH DESCRIPTION -.B 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. -.PP -You may use -.RB ` "nm \-s" ' -or -.RB ` "nm \-\-print-armap" ' -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 GNU -.B ranlib -program is another form of GNU -.BR ar ; -running -.B ranlib -is completely equivalent to executing -.RB ` "ar \-s" '. - -.SH OPTIONS -.TP -.B \-v -Print the version number of -.B ranlib -and exit. - -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.B -info\c -\&; -.I -The GNU Binary Utilities\c -\&, Roland H. Pesch (October 1991); -.BR ar "(" 1 ")," -.BR nm "(" 1 ")." - - -.SH COPYING -Copyright (c) 1991 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/binutils/ranlib.sh b/binutils/ranlib.sh deleted file mode 100755 index 2b6fbc479c6..00000000000 --- a/binutils/ranlib.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -# A simple ranlib script, to use less disk space than a ranlib program. -ar s $1 diff --git a/binutils/rclex.l b/binutils/rclex.l deleted file mode 100644 index 47b479b20b6..00000000000 --- a/binutils/rclex.l +++ /dev/null @@ -1,496 +0,0 @@ -%{ /* rclex.l -- lexer for Windows rc files parser */ -/* Copyright 1997, 1998 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This is a lex input file which generates a lexer used by the - Windows rc file parser. It basically just recognized a bunch of - keywords. */ - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "windres.h" -#include "rcparse.h" - -#include -#include - -/* Whether we are in rcdata mode, in which we returns the lengths of - strings. */ - -static int rcdata_mode; - -/* Whether we are supressing lines from cpp (including windows.h or - headers from your C sources may bring in externs and typedefs). - When active, we return IGNORED_TOKEN, which lets us ignore these - outside of resource constructs. Thus, it isn't required to protect - all the non-preprocessor lines in your header files with #ifdef - RC_INVOKED. It also means your RC file can't include other RC - files if they're named "*.h". Sorry. Name them *.rch or whatever. */ - -static int suppress_cpp_data; - -#define MAYBE_RETURN(x) return suppress_cpp_data ? IGNORED_TOKEN : (x) - -/* The first filename we detect in the cpp output. We use this to - tell included files from the original file. */ - -static char *initial_fn; - -/* List of allocated strings. */ - -struct alloc_string -{ - struct alloc_string *next; - char *s; -}; - -static struct alloc_string *strings; - -/* Local functions. */ - -static void cpp_line PARAMS ((const char *)); -static char *handle_quotes PARAMS ((const char *, unsigned long *)); -static char *get_string PARAMS ((int)); - -%} - -%% - -"BEGIN" { MAYBE_RETURN (BEG); } -"{" { MAYBE_RETURN (BEG); } -"END" { MAYBE_RETURN (END); } -"}" { MAYBE_RETURN (END); } -"ACCELERATORS" { MAYBE_RETURN (ACCELERATORS); } -"VIRTKEY" { MAYBE_RETURN (VIRTKEY); } -"ASCII" { MAYBE_RETURN (ASCII); } -"NOINVERT" { MAYBE_RETURN (NOINVERT); } -"SHIFT" { MAYBE_RETURN (SHIFT); } -"CONTROL" { MAYBE_RETURN (CONTROL); } -"ALT" { MAYBE_RETURN (ALT); } -"BITMAP" { MAYBE_RETURN (BITMAP); } -"CURSOR" { MAYBE_RETURN (CURSOR); } -"DIALOG" { MAYBE_RETURN (DIALOG); } -"DIALOGEX" { MAYBE_RETURN (DIALOGEX); } -"EXSTYLE" { MAYBE_RETURN (EXSTYLE); } -"CAPTION" { MAYBE_RETURN (CAPTION); } -"CLASS" { MAYBE_RETURN (CLASS); } -"STYLE" { MAYBE_RETURN (STYLE); } -"AUTO3STATE" { MAYBE_RETURN (AUTO3STATE); } -"AUTOCHECKBOX" { MAYBE_RETURN (AUTOCHECKBOX); } -"AUTORADIOBUTTON" { MAYBE_RETURN (AUTORADIOBUTTON); } -"CHECKBOX" { MAYBE_RETURN (CHECKBOX); } -"COMBOBOX" { MAYBE_RETURN (COMBOBOX); } -"CTEXT" { MAYBE_RETURN (CTEXT); } -"DEFPUSHBUTTON" { MAYBE_RETURN (DEFPUSHBUTTON); } -"EDITTEXT" { MAYBE_RETURN (EDITTEXT); } -"GROUPBOX" { MAYBE_RETURN (GROUPBOX); } -"LISTBOX" { MAYBE_RETURN (LISTBOX); } -"LTEXT" { MAYBE_RETURN (LTEXT); } -"PUSHBOX" { MAYBE_RETURN (PUSHBOX); } -"PUSHBUTTON" { MAYBE_RETURN (PUSHBUTTON); } -"RADIOBUTTON" { MAYBE_RETURN (RADIOBUTTON); } -"RTEXT" { MAYBE_RETURN (RTEXT); } -"SCROLLBAR" { MAYBE_RETURN (SCROLLBAR); } -"STATE3" { MAYBE_RETURN (STATE3); } -"USERBUTTON" { MAYBE_RETURN (USERBUTTON); } -"BEDIT" { MAYBE_RETURN (BEDIT); } -"HEDIT" { MAYBE_RETURN (HEDIT); } -"IEDIT" { MAYBE_RETURN (IEDIT); } -"FONT" { MAYBE_RETURN (FONT); } -"ICON" { MAYBE_RETURN (ICON); } -"LANGUAGE" { MAYBE_RETURN (LANGUAGE); } -"CHARACTERISTICS" { MAYBE_RETURN (CHARACTERISTICS); } -"VERSION" { MAYBE_RETURN (VERSIONK); } -"MENU" { MAYBE_RETURN (MENU); } -"MENUEX" { MAYBE_RETURN (MENUEX); } -"MENUITEM" { MAYBE_RETURN (MENUITEM); } -"SEPARATOR" { MAYBE_RETURN (SEPARATOR); } -"POPUP" { MAYBE_RETURN (POPUP); } -"CHECKED" { MAYBE_RETURN (CHECKED); } -"GRAYED" { MAYBE_RETURN (GRAYED); } -"HELP" { MAYBE_RETURN (HELP); } -"INACTIVE" { MAYBE_RETURN (INACTIVE); } -"MENUBARBREAK" { MAYBE_RETURN (MENUBARBREAK); } -"MENUBREAK" { MAYBE_RETURN (MENUBREAK); } -"MESSAGETABLE" { MAYBE_RETURN (MESSAGETABLE); } -"RCDATA" { MAYBE_RETURN (RCDATA); } -"STRINGTABLE" { MAYBE_RETURN (STRINGTABLE); } -"VERSIONINFO" { MAYBE_RETURN (VERSIONINFO); } -"FILEVERSION" { MAYBE_RETURN (FILEVERSION); } -"PRODUCTVERSION" { MAYBE_RETURN (PRODUCTVERSION); } -"FILEFLAGSMASK" { MAYBE_RETURN (FILEFLAGSMASK); } -"FILEFLAGS" { MAYBE_RETURN (FILEFLAGS); } -"FILEOS" { MAYBE_RETURN (FILEOS); } -"FILETYPE" { MAYBE_RETURN (FILETYPE); } -"FILESUBTYPE" { MAYBE_RETURN (FILESUBTYPE); } -"VALUE" { MAYBE_RETURN (VALUE); } -"MOVEABLE" { MAYBE_RETURN (MOVEABLE); } -"FIXED" { MAYBE_RETURN (FIXED); } -"PURE" { MAYBE_RETURN (PURE); } -"IMPURE" { MAYBE_RETURN (IMPURE); } -"PRELOAD" { MAYBE_RETURN (PRELOAD); } -"LOADONCALL" { MAYBE_RETURN (LOADONCALL); } -"DISCARDABLE" { MAYBE_RETURN (DISCARDABLE); } -"NOT" { MAYBE_RETURN (NOT); } - -"BLOCK"[ \t\n]*"\""[^\#\n]*"\"" { - char *s, *send; - - /* This is a hack to let us parse version - information easily. */ - - s = strchr (yytext, '"'); - ++s; - send = strchr (s, '"'); - if (strncmp (s, "StringFileInfo", - sizeof "StringFileInfo" - 1) == 0 - && s + sizeof "StringFileInfo" - 1 == send) - MAYBE_RETURN (BLOCKSTRINGFILEINFO); - else if (strncmp (s, "VarFileInfo", - sizeof "VarFileInfo" - 1) == 0 - && s + sizeof "VarFileInfo" - 1 == send) - MAYBE_RETURN (BLOCKVARFILEINFO); - else - { - char *r; - - r = get_string (send - s + 1); - strncpy (r, s, send - s); - r[send - s] = '\0'; - yylval.s = r; - MAYBE_RETURN (BLOCK); - } - } - -"#"[^\n]* { - cpp_line (yytext); - } - -[0-9][x0-9A-Fa-f]*L { - yylval.i.val = strtoul (yytext, 0, 0); - yylval.i.dword = 1; - MAYBE_RETURN (NUMBER); - } - -[0-9][x0-9A-Fa-f]* { - yylval.i.val = strtoul (yytext, 0, 0); - yylval.i.dword = 0; - MAYBE_RETURN (NUMBER); - } - -("\""[^\"\n]*"\""[ \t]*)+ { - char *s; - unsigned long length; - - s = handle_quotes (yytext, &length); - if (! rcdata_mode) - { - yylval.s = s; - MAYBE_RETURN (QUOTEDSTRING); - } - else - { - yylval.ss.length = length; - yylval.ss.s = s; - MAYBE_RETURN (SIZEDSTRING); - } - } - -[A-Za-z][^ ,\t\r\n]* { - char *s; - - /* I rejected comma in a string in order to - handle VIRTKEY, CONTROL in an accelerator - resource. This means that an unquoted - file name can not contain a comma. I - don't know what rc permits. */ - - s = get_string (strlen (yytext) + 1); - strcpy (s, yytext); - yylval.s = s; - MAYBE_RETURN (STRING); - } - -[\n] { ++rc_lineno; } -[ \t\r]+ { /* ignore whitespace */ } -. { MAYBE_RETURN (*yytext); } - -%% -#ifndef yywrap -/* This is needed for some versions of lex. */ -int yywrap () -{ - return 1; -} -#endif - -/* Handle a C preprocessor line. */ - -static void -cpp_line (s) - const char *s; -{ - int line; - char *send, *fn; - - ++s; - while (isspace ((unsigned char) *s)) - ++s; - - line = strtol (s, &send, 0); - if (*send != '\0' && ! isspace ((unsigned char) *send)) - return; - - /* Subtract 1 because we are about to count the newline. */ - rc_lineno = line - 1; - - s = send; - while (isspace ((unsigned char) *s)) - ++s; - - if (*s != '"') - return; - - ++s; - send = strchr (s, '"'); - if (send == NULL) - return; - - fn = (char *) xmalloc (send - s + 1); - strncpy (fn, s, send - s); - fn[send - s] = '\0'; - - free (rc_filename); - rc_filename = fn; - - if (!initial_fn) - { - initial_fn = xmalloc (strlen (fn) + 1); - strcpy(initial_fn, fn); - } - - /* Allow the initial file, regardless of name. Suppress all other - files if they end in ".h" (this allows included "*.rc") */ - if (strcmp (initial_fn, fn) == 0 - || strcmp (fn + strlen (fn) - 2, ".h") != 0) - suppress_cpp_data = 0; - else - suppress_cpp_data = 1; -} - -/* Handle a quoted string. The quotes are stripped. A pair of quotes - in a string are turned into a single quote. Adjacent strings are - merged separated by whitespace are merged, as in C. */ - -static char * -handle_quotes (input, len) - const char *input; - unsigned long *len; -{ - char *ret, *s; - const char *t; - int ch; - - ret = get_string (strlen (input) + 1); - - s = ret; - t = input; - if (*t == '"') - ++t; - while (*t != '\0') - { - if (*t == '\\') - { - ++t; - switch (*t) - { - case '\0': - rcparse_warning ("backslash at end of string"); - break; - - case '\"': - rcparse_warning ("use \"\" to put \" in a string"); - break; - - case 'a': - *s++ = ESCAPE_A; - ++t; - break; - - case 'b': - *s++ = ESCAPE_B; - ++t; - break; - - case 'f': - *s++ = ESCAPE_F; - ++t; - break; - - case 'n': - *s++ = ESCAPE_N; - ++t; - break; - - case 'r': - *s++ = ESCAPE_R; - ++t; - break; - - case 't': - *s++ = ESCAPE_T; - ++t; - break; - - case 'v': - *s++ = ESCAPE_V; - ++t; - break; - - case '\\': - *s++ = *t++; - break; - - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - ch = *t - '0'; - ++t; - if (*t >= '0' && *t <= '7') - { - ch = (ch << 3) | (*t - '0'); - ++t; - if (*t >= '0' && *t <= '7') - { - ch = (ch << 3) | (*t - '0'); - ++t; - } - } - *s++ = ch; - break; - - case 'x': - ++t; - ch = 0; - while (1) - { - if (*t >= '0' && *t <= '9') - ch = (ch << 4) | (*t - '0'); - else if (*t >= 'a' && *t <= 'f') - ch = (ch << 4) | (*t - 'a'); - else if (*t >= 'A' && *t <= 'F') - ch = (ch << 4) | (*t - 'A'); - else - break; - ++t; - } - *s++ = ch; - break; - - default: - rcparse_warning ("unrecognized escape sequence"); - *s++ = '\\'; - *s++ = *t++; - break; - } - } - else if (*t != '"') - *s++ = *t++; - else if (t[1] == '\0') - break; - else if (t[1] == '"') - { - *s++ = '"'; - t += 2; - } - else - { - ++t; - assert (isspace ((unsigned char) *t)); - while (isspace ((unsigned char) *t)) - ++t; - if (*t == '\0') - break; - assert (*t == '"'); - ++t; - } - } - - *s = '\0'; - - *len = s - ret; - - return ret; -} - -/* Allocate a string of a given length. */ - -static char * -get_string (len) - int len; -{ - struct alloc_string *as; - - as = (struct alloc_string *) xmalloc (sizeof *as); - as->s = xmalloc (len); - - as->next = strings; - strings = as->next; - - return as->s; -} - -/* Discard all the strings we have allocated. The parser calls this - when it no longer needs them. */ - -void -rcparse_discard_strings () -{ - struct alloc_string *as; - - as = strings; - while (as != NULL) - { - struct alloc_string *n; - - free (as->s); - n = as->next; - free (as); - as = n; - } - - strings = NULL; -} - -/* Enter rcdata mode. */ - -void -rcparse_rcdata () -{ - rcdata_mode = 1; -} - -/* Go back to normal mode from rcdata mode. */ - -void -rcparse_normal () -{ - rcdata_mode = 0; -} diff --git a/binutils/rcparse.y b/binutils/rcparse.y deleted file mode 100644 index 03cbbdc5b67..00000000000 --- a/binutils/rcparse.y +++ /dev/null @@ -1,1619 +0,0 @@ -%{ /* rcparse.y -- parser for Windows rc files - Copyright 1997, 1998 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This is a parser for Windows rc files. It is based on the parser - by Gunther Ebert . */ - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "windres.h" - -#include - -/* The current language. */ - -static unsigned short language; - -/* The resource information during a sub statement. */ - -static struct res_res_info sub_res_info; - -/* Dialog information. This is built by the nonterminals styles and - controls. */ - -static struct 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 unsigned long base_style; -static unsigned long default_style; -static unsigned long class; - -%} - -%union -{ - struct accelerator acc; - struct accelerator *pacc; - struct dialog_control *dialog_control; - struct menuitem *menuitem; - struct - { - struct rcdata_item *first; - struct rcdata_item *last; - } rcdata; - struct rcdata_item *rcdata_item; - struct stringtable_data *stringtable; - struct fixed_versioninfo *fixver; - struct ver_info *verinfo; - struct ver_stringinfo *verstring; - struct ver_varinfo *vervar; - struct res_id id; - struct res_res_info res_info; - struct - { - unsigned short on; - unsigned short off; - } memflags; - struct - { - unsigned long val; - /* Nonzero if this number was explicitly specified as long. */ - int dword; - } i; - unsigned long il; - unsigned short is; - const char *s; - struct - { - unsigned long length; - const char *s; - } ss; -}; - -%token BEG END -%token ACCELERATORS VIRTKEY ASCII NOINVERT SHIFT CONTROL ALT -%token BITMAP -%token CURSOR -%token DIALOG DIALOGEX EXSTYLE CAPTION CLASS STYLE -%token AUTO3STATE AUTOCHECKBOX AUTORADIOBUTTON CHECKBOX COMBOBOX CTEXT -%token DEFPUSHBUTTON EDITTEXT GROUPBOX LISTBOX LTEXT PUSHBOX PUSHBUTTON -%token RADIOBUTTON RTEXT SCROLLBAR STATE3 USERBUTTON -%token BEDIT HEDIT IEDIT -%token FONT -%token ICON -%token LANGUAGE CHARACTERISTICS VERSIONK -%token MENU MENUEX MENUITEM SEPARATOR POPUP CHECKED GRAYED HELP INACTIVE -%token MENUBARBREAK MENUBREAK -%token MESSAGETABLE -%token RCDATA -%token STRINGTABLE -%token VERSIONINFO FILEVERSION PRODUCTVERSION FILEFLAGSMASK FILEFLAGS -%token FILEOS FILETYPE FILESUBTYPE BLOCKSTRINGFILEINFO BLOCKVARFILEINFO -%token VALUE -%token BLOCK -%token MOVEABLE FIXED PURE IMPURE PRELOAD LOADONCALL DISCARDABLE -%token NOT -%token QUOTEDSTRING STRING -%token NUMBER -%token SIZEDSTRING -%token IGNORED_TOKEN - -%type acc_entries -%type acc_entry acc_event -%type control control_params -%type menuitems menuitem menuexitems menuexitem -%type optrcdata_data optrcdata_data_int rcdata_data -%type opt_control_data -%type fixedverinfo -%type verblocks -%type vervals -%type vertrans -%type suboptions memflags_move_discard memflags_move -%type memflag -%type id -%type exstyle parennumber -%type numexpr posnumexpr cnumexpr optcnumexpr cposnumexpr -%type acc_options acc_option menuitem_flags menuitem_flag -%type optstringc file_name -%type sizednumexpr sizedposnumexpr - -%left '|' -%left '^' -%left '&' -%left '+' '-' -%left '*' '/' '%' -%right '~' NEG - -%% - -input: - /* empty */ - | input newcmd accelerator - | input newcmd bitmap - | input newcmd cursor - | input newcmd dialog - | input newcmd font - | input newcmd icon - | input newcmd language - | input newcmd menu - | input newcmd menuex - | input newcmd messagetable - | input newcmd rcdata - | input newcmd stringtable - | input newcmd user - | input newcmd versioninfo - | input newcmd IGNORED_TOKEN - ; - -newcmd: - /* empty */ - { - rcparse_discard_strings (); - } - ; - -/* Accelerator resources. */ - -accelerator: - id ACCELERATORS suboptions BEG acc_entries END - { - define_accelerator ($1, &$3, $5); - } - ; - -acc_entries: - /* empty */ - { - $$ = NULL; - } - | acc_entries acc_entry - { - struct accelerator *a; - - a = (struct accelerator *) res_alloc (sizeof *a); - *a = $2; - if ($1 == NULL) - $$ = a; - else - { - struct accelerator **pp; - - for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next) - ; - *pp = a; - $$ = $1; - } - } - ; - -acc_entry: - acc_event cposnumexpr - { - $$ = $1; - $$.id = $2; - } - | acc_event cposnumexpr ',' acc_options - { - $$ = $1; - $$.id = $2; - $$.flags |= $4; - if (($$.flags & ACC_VIRTKEY) == 0 - && ($$.flags & (ACC_SHIFT | ACC_CONTROL | ACC_ALT)) != 0) - rcparse_warning (_("inappropriate modifiers for non-VIRTKEY")); - } - ; - -acc_event: - QUOTEDSTRING - { - const char *s = $1; - char ch; - - $$.next = NULL; - $$.id = 0; - ch = *s; - if (ch != '^') - $$.flags = 0; - else - { - $$.flags = ACC_CONTROL | ACC_VIRTKEY; - ++s; - ch = *s; - ch = toupper ((unsigned char) ch); - } - $$.key = ch; - if (s[1] != '\0') - rcparse_warning (_("accelerator should only be one character")); - } - | posnumexpr - { - $$.next = NULL; - $$.flags = 0; - $$.id = 0; - $$.key = $1; - } - ; - -acc_options: - acc_option - { - $$ = $1; - } - | acc_options ',' acc_option - { - $$ = $1 | $3; - } - /* I've had one report that the comma is optional. */ - | acc_options acc_option - { - $$ = $1 | $2; - } - ; - -acc_option: - VIRTKEY - { - $$ = ACC_VIRTKEY; - } - | ASCII - { - /* This is just the absence of VIRTKEY. */ - $$ = 0; - } - | NOINVERT - { - $$ = ACC_NOINVERT; - } - | SHIFT - { - $$ = ACC_SHIFT; - } - | CONTROL - { - $$ = ACC_CONTROL; - } - | ALT - { - $$ = ACC_ALT; - } - ; - -/* Bitmap resources. */ - -bitmap: - id BITMAP memflags_move file_name - { - define_bitmap ($1, &$3, $4); - } - ; - -/* Cursor resources. */ - -cursor: - id CURSOR memflags_move_discard file_name - { - define_cursor ($1, &$3, $4); - } - ; - -/* Dialog resources. */ - -dialog: - id DIALOG memflags_move exstyle posnumexpr cnumexpr cnumexpr - cnumexpr - { - memset (&dialog, 0, sizeof dialog); - dialog.x = $5; - dialog.y = $6; - dialog.width = $7; - dialog.height = $8; - dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU; - dialog.exstyle = $4; - dialog.menu.named = 1; - dialog.class.named = 1; - dialog.font = NULL; - dialog.ex = NULL; - dialog.controls = NULL; - sub_res_info = $3; - } - styles BEG controls END - { - define_dialog ($1, &sub_res_info, &dialog); - } - | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr - cnumexpr - { - memset (&dialog, 0, sizeof dialog); - dialog.x = $5; - dialog.y = $6; - dialog.width = $7; - dialog.height = $8; - dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU; - dialog.exstyle = $4; - dialog.menu.named = 1; - dialog.class.named = 1; - dialog.font = NULL; - dialog.ex = ((struct dialog_ex *) - res_alloc (sizeof (struct dialog_ex))); - memset (dialog.ex, 0, sizeof (struct dialog_ex)); - dialog.controls = NULL; - sub_res_info = $3; - } - styles BEG controls END - { - define_dialog ($1, &sub_res_info, &dialog); - } - | id DIALOGEX memflags_move exstyle posnumexpr cnumexpr cnumexpr - cnumexpr cnumexpr - { - memset (&dialog, 0, sizeof dialog); - dialog.x = $5; - dialog.y = $6; - dialog.width = $7; - dialog.height = $8; - dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU; - dialog.exstyle = $4; - dialog.menu.named = 1; - dialog.class.named = 1; - dialog.font = NULL; - dialog.ex = ((struct dialog_ex *) - res_alloc (sizeof (struct dialog_ex))); - memset (dialog.ex, 0, sizeof (struct dialog_ex)); - dialog.ex->help = $9; - dialog.controls = NULL; - sub_res_info = $3; - } - styles BEG controls END - { - define_dialog ($1, &sub_res_info, &dialog); - } - ; - -exstyle: - /* empty */ - { - $$ = 0; - } - | EXSTYLE '=' numexpr - { - $$ = $3; - } - ; - -styles: - /* empty */ - | styles CAPTION QUOTEDSTRING - { - unicode_from_ascii ((int *) NULL, &dialog.caption, $3); - } - | styles CLASS id - { - dialog.class = $3; - } - | styles STYLE - { style = dialog.style; } - styleexpr - { - dialog.style = style; - } - | styles EXSTYLE numexpr - { - dialog.exstyle = $3; - } - | styles FONT numexpr ',' QUOTEDSTRING - { - dialog.style |= DS_SETFONT; - dialog.pointsize = $3; - unicode_from_ascii ((int *) NULL, &dialog.font, $5); - } - | styles FONT numexpr ',' QUOTEDSTRING cnumexpr cnumexpr - { - dialog.style |= DS_SETFONT; - dialog.pointsize = $3; - unicode_from_ascii ((int *) NULL, &dialog.font, $5); - if (dialog.ex == NULL) - rcparse_warning (_("extended FONT requires DIALOGEX")); - else - { - dialog.ex->weight = $6; - dialog.ex->italic = $7; - } - } - | styles MENU id - { - dialog.menu = $3; - } - | styles CHARACTERISTICS numexpr - { - sub_res_info.characteristics = $3; - } - | styles LANGUAGE numexpr cnumexpr - { - sub_res_info.language = $3 | ($4 << 8); - } - | styles VERSIONK numexpr - { - sub_res_info.version = $3; - } - ; - -controls: - /* empty */ - | controls control - { - struct dialog_control **pp; - - for (pp = &dialog.controls; *pp != NULL; pp = &(*pp)->next) - ; - *pp = $2; - } - ; - -control: - AUTO3STATE - { - default_style = BS_AUTO3STATE | WS_TABSTOP; - base_style = BS_AUTO3STATE; - class = CTL_BUTTON; - } - control_params - { - $$ = $3; - } - | AUTOCHECKBOX - { - default_style = BS_AUTOCHECKBOX | WS_TABSTOP; - base_style = BS_AUTOCHECKBOX; - class = CTL_BUTTON; - } - control_params - { - $$ = $3; - } - | AUTORADIOBUTTON - { - default_style = BS_AUTORADIOBUTTON | WS_TABSTOP; - base_style = BS_AUTORADIOBUTTON; - class = CTL_BUTTON; - } - control_params - { - $$ = $3; - } - | BEDIT - { - default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; - base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; - class = CTL_EDIT; - } - control_params - { - $$ = $3; - if (dialog.ex == NULL) - rcparse_warning (_("IEDIT requires DIALOGEX")); - res_string_to_id (&$$->class, "BEDIT"); - } - | CHECKBOX - { - default_style = BS_CHECKBOX | WS_TABSTOP; - base_style = BS_CHECKBOX | WS_TABSTOP; - class = CTL_BUTTON; - } - control_params - { - $$ = $3; - } - | COMBOBOX - { - default_style = CBS_SIMPLE | WS_TABSTOP; - base_style = 0; - class = CTL_COMBOBOX; - } - control_params - { - $$ = $3; - } - | CONTROL optstringc numexpr cnumexpr control_styleexpr cnumexpr - cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data - { - $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10); - if ($11 != NULL) - { - if (dialog.ex == NULL) - rcparse_warning (_("control data requires DIALOGEX")); - $$->data = $11; - } - } - | CONTROL optstringc numexpr cnumexpr control_styleexpr cnumexpr - cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data - { - $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10); - if (dialog.ex == NULL) - rcparse_warning (_("help ID requires DIALOGEX")); - $$->help = $11; - $$->data = $12; - } - | CONTROL optstringc numexpr ',' QUOTEDSTRING control_styleexpr - cnumexpr cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data - { - $$ = define_control ($2, $3, $7, $8, $9, $10, 0, style, $11); - if ($12 != NULL) - { - if (dialog.ex == NULL) - rcparse_warning ("control data requires DIALOGEX"); - $$->data = $12; - } - $$->class.named = 1; - unicode_from_ascii(&$$->class.u.n.length, &$$->class.u.n.name, $5); - } - | CONTROL optstringc numexpr ',' QUOTEDSTRING control_styleexpr - cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data - { - $$ = define_control ($2, $3, $7, $8, $9, $10, 0, style, $11); - if (dialog.ex == NULL) - rcparse_warning ("help ID requires DIALOGEX"); - $$->help = $12; - $$->data = $13; - $$->class.named = 1; - unicode_from_ascii(&$$->class.u.n.length, &$$->class.u.n.name, $5); - } - | CTEXT - { - default_style = SS_CENTER | WS_GROUP; - base_style = SS_CENTER; - class = CTL_STATIC; - } - control_params - { - $$ = $3; - } - | DEFPUSHBUTTON - { - default_style = BS_DEFPUSHBUTTON | WS_TABSTOP; - base_style = BS_DEFPUSHBUTTON | WS_TABSTOP; - class = CTL_BUTTON; - } - control_params - { - $$ = $3; - } - | EDITTEXT - { - default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; - base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; - class = CTL_EDIT; - } - control_params - { - $$ = $3; - } - | GROUPBOX - { - default_style = BS_GROUPBOX; - base_style = BS_GROUPBOX; - class = CTL_BUTTON; - } - control_params - { - $$ = $3; - } - | HEDIT - { - default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; - base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; - class = CTL_EDIT; - } - control_params - { - $$ = $3; - if (dialog.ex == NULL) - rcparse_warning (_("IEDIT requires DIALOGEX")); - res_string_to_id (&$$->class, "HEDIT"); - } - | ICON optstringc numexpr cnumexpr cnumexpr opt_control_data - { - $$ = define_control ($2, $3, $4, $5, 0, 0, CTL_STATIC, - SS_ICON | WS_CHILD | WS_VISIBLE, 0); - if ($6 != NULL) - { - if (dialog.ex == NULL) - rcparse_warning (_("control data requires DIALOGEX")); - $$->data = $6; - } - } - | ICON optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr - icon_styleexpr optcnumexpr opt_control_data - { - $$ = define_control ($2, $3, $4, $5, $6, $7, CTL_STATIC, - style, $9); - if ($10 != NULL) - { - if (dialog.ex == NULL) - rcparse_warning (_("control data requires DIALOGEX")); - $$->data = $10; - } - } - | ICON optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr - icon_styleexpr cnumexpr cnumexpr opt_control_data - { - $$ = define_control ($2, $3, $4, $5, $6, $7, CTL_STATIC, - style, $9); - if (dialog.ex == NULL) - rcparse_warning (_("help ID requires DIALOGEX")); - $$->help = $10; - $$->data = $11; - } - | IEDIT - { - default_style = ES_LEFT | WS_BORDER | WS_TABSTOP; - base_style = ES_LEFT | WS_BORDER | WS_TABSTOP; - class = CTL_EDIT; - } - control_params - { - $$ = $3; - if (dialog.ex == NULL) - rcparse_warning (_("IEDIT requires DIALOGEX")); - res_string_to_id (&$$->class, "IEDIT"); - } - | LISTBOX - { - default_style = LBS_NOTIFY | WS_BORDER; - base_style = LBS_NOTIFY | WS_BORDER; - class = CTL_LISTBOX; - } - control_params - { - $$ = $3; - } - | LTEXT - { - default_style = SS_LEFT | WS_GROUP; - base_style = SS_LEFT; - class = CTL_STATIC; - } - control_params - { - $$ = $3; - } - | PUSHBOX - { - default_style = BS_PUSHBOX | WS_TABSTOP; - base_style = BS_PUSHBOX; - class = CTL_BUTTON; - } - control_params - { - $$ = $3; - } - | PUSHBUTTON - { - default_style = BS_PUSHBUTTON | WS_TABSTOP; - base_style = BS_PUSHBUTTON | WS_TABSTOP; - class = CTL_BUTTON; - } - control_params - { - $$ = $3; - } - | RADIOBUTTON - { - default_style = BS_RADIOBUTTON | WS_TABSTOP; - base_style = BS_RADIOBUTTON; - class = CTL_BUTTON; - } - control_params - { - $$ = $3; - } - | RTEXT - { - default_style = SS_RIGHT | WS_GROUP; - base_style = SS_RIGHT; - class = CTL_STATIC; - } - control_params - { - $$ = $3; - } - | SCROLLBAR - { - default_style = SBS_HORZ; - base_style = 0; - class = CTL_SCROLLBAR; - } - control_params - { - $$ = $3; - } - | STATE3 - { - default_style = BS_3STATE | WS_TABSTOP; - base_style = BS_3STATE; - class = CTL_BUTTON; - } - control_params - { - $$ = $3; - } - | USERBUTTON QUOTEDSTRING ',' numexpr ',' numexpr ',' numexpr ',' - numexpr ',' numexpr ',' - { style = WS_CHILD | WS_VISIBLE; } - styleexpr optcnumexpr - { - $$ = define_control ($2, $4, $6, $8, $10, $12, CTL_BUTTON, - style, $16); - } - ; - -/* Parameters for a control. The static variables DEFAULT_STYLE, - BASE_STYLE, and CLASS must be initialized before this nonterminal - is used. DEFAULT_STYLE is the style to use if no style expression - is specified. BASE_STYLE is the base style to use if a style - expression is specified; the style expression modifies the base - style. CLASS is the class of the control. */ - -control_params: - optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr - opt_control_data - { - $$ = define_control ($1, $2, $3, $4, $5, $6, class, - default_style | WS_CHILD | WS_VISIBLE, 0); - if ($7 != NULL) - { - if (dialog.ex == NULL) - rcparse_warning (_("control data requires DIALOGEX")); - $$->data = $7; - } - } - | optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr - control_params_styleexpr optcnumexpr opt_control_data - { - $$ = define_control ($1, $2, $3, $4, $5, $6, class, style, $8); - if ($9 != NULL) - { - if (dialog.ex == NULL) - rcparse_warning (_("control data requires DIALOGEX")); - $$->data = $9; - } - } - | optstringc numexpr cnumexpr cnumexpr cnumexpr cnumexpr - control_params_styleexpr cnumexpr cnumexpr opt_control_data - { - $$ = define_control ($1, $2, $3, $4, $5, $6, class, style, $8); - if (dialog.ex == NULL) - rcparse_warning (_("help ID requires DIALOGEX")); - $$->help = $9; - $$->data = $10; - } - ; - -optstringc: - /* empty */ - { - $$ = NULL; - } - | QUOTEDSTRING ',' - { - $$ = $1; - } - ; - -opt_control_data: - /* empty */ - { - $$ = NULL; - } - | BEG optrcdata_data END - { - $$ = $2.first; - } - ; - -/* These only exist to parse a reduction out of a common case. */ - -control_styleexpr: - ',' - { style = WS_CHILD | WS_VISIBLE; } - styleexpr - ; - -icon_styleexpr: - ',' - { style = SS_ICON | WS_CHILD | WS_VISIBLE; } - styleexpr - ; - -control_params_styleexpr: - ',' - { style = base_style | WS_CHILD | WS_VISIBLE; } - styleexpr - ; - -/* Font resources. */ - -font: - id FONT memflags_move_discard file_name - { - define_font ($1, &$3, $4); - } - ; - -/* Icon resources. */ - -icon: - id ICON memflags_move_discard file_name - { - define_icon ($1, &$3, $4); - } - ; - -/* Language command. This changes the static variable language, which - affects all subsequent resources. */ - -language: - LANGUAGE numexpr cnumexpr - { - language = $2 | ($3 << 8); - } - ; - -/* Menu resources. */ - -menu: - id MENU suboptions BEG menuitems END - { - define_menu ($1, &$3, $5); - } - ; - -menuitems: - /* empty */ - { - $$ = NULL; - } - | menuitems menuitem - { - if ($1 == NULL) - $$ = $2; - else - { - struct menuitem **pp; - - for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next) - ; - *pp = $2; - $$ = $1; - } - } - ; - -menuitem: - MENUITEM QUOTEDSTRING cnumexpr menuitem_flags - { - $$ = define_menuitem ($2, $3, $4, 0, 0, NULL); - } - | MENUITEM SEPARATOR - { - $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL); - } - | POPUP QUOTEDSTRING menuitem_flags BEG menuitems END - { - $$ = define_menuitem ($2, 0, $3, 0, 0, $5); - } - ; - -menuitem_flags: - /* empty */ - { - $$ = 0; - } - | menuitem_flags ',' menuitem_flag - { - $$ = $1 | $3; - } - | menuitem_flags menuitem_flag - { - $$ = $1 | $2; - } - ; - -menuitem_flag: - CHECKED - { - $$ = MENUITEM_CHECKED; - } - | GRAYED - { - $$ = MENUITEM_GRAYED; - } - | HELP - { - $$ = MENUITEM_HELP; - } - | INACTIVE - { - $$ = MENUITEM_INACTIVE; - } - | MENUBARBREAK - { - $$ = MENUITEM_MENUBARBREAK; - } - | MENUBREAK - { - $$ = MENUITEM_MENUBREAK; - } - ; - -/* Menuex resources. */ - -menuex: - id MENUEX suboptions BEG menuexitems END - { - define_menu ($1, &$3, $5); - } - ; - -menuexitems: - /* empty */ - { - $$ = NULL; - } - | menuexitems menuexitem - { - if ($1 == NULL) - $$ = $2; - else - { - struct menuitem **pp; - - for (pp = &$1->next; *pp != NULL; pp = &(*pp)->next) - ; - *pp = $2; - $$ = $1; - } - } - ; - -menuexitem: - MENUITEM QUOTEDSTRING - { - $$ = define_menuitem ($2, 0, 0, 0, 0, NULL); - } - | MENUITEM QUOTEDSTRING cnumexpr - { - $$ = define_menuitem ($2, $3, 0, 0, 0, NULL); - } - | MENUITEM QUOTEDSTRING cnumexpr cnumexpr optcnumexpr - { - $$ = define_menuitem ($2, $3, $4, $5, 0, NULL); - } - | MENUITEM SEPARATOR - { - $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL); - } - | POPUP QUOTEDSTRING BEG menuexitems END - { - $$ = define_menuitem ($2, 0, 0, 0, 0, $4); - } - | POPUP QUOTEDSTRING cnumexpr BEG menuexitems END - { - $$ = define_menuitem ($2, $3, 0, 0, 0, $5); - } - | POPUP QUOTEDSTRING cnumexpr cnumexpr BEG menuexitems END - { - $$ = define_menuitem ($2, $3, $4, 0, 0, $6); - } - | POPUP QUOTEDSTRING cnumexpr cnumexpr cnumexpr optcnumexpr - BEG menuexitems END - { - $$ = define_menuitem ($2, $3, $4, $5, $6, $8); - } - ; - -/* Messagetable resources. */ - -messagetable: - id MESSAGETABLE memflags_move file_name - { - define_messagetable ($1, &$3, $4); - } - ; - -/* Rcdata resources. */ - -rcdata: - id RCDATA suboptions BEG optrcdata_data END - { - define_rcdata ($1, &$3, $5.first); - } - ; - -/* We use a different lexing algorithm, because rcdata strings may - contain embedded null bytes, and we need to know the length to use. */ - -optrcdata_data: - { - rcparse_rcdata (); - } - optrcdata_data_int - { - rcparse_normal (); - $$ = $2; - } - ; - -optrcdata_data_int: - /* empty */ - { - $$.first = NULL; - $$.last = NULL; - } - | rcdata_data - { - $$ = $1; - } - ; - -rcdata_data: - SIZEDSTRING - { - struct rcdata_item *ri; - - ri = define_rcdata_string ($1.s, $1.length); - $$.first = ri; - $$.last = ri; - } - | sizednumexpr - { - struct rcdata_item *ri; - - ri = define_rcdata_number ($1.val, $1.dword); - $$.first = ri; - $$.last = ri; - } - | rcdata_data ',' SIZEDSTRING - { - struct rcdata_item *ri; - - ri = define_rcdata_string ($3.s, $3.length); - $$.first = $1.first; - $1.last->next = ri; - $$.last = ri; - } - | rcdata_data ',' sizednumexpr - { - struct rcdata_item *ri; - - ri = define_rcdata_number ($3.val, $3.dword); - $$.first = $1.first; - $1.last->next = ri; - $$.last = ri; - } - ; - -/* Stringtable resources. */ - -stringtable: - STRINGTABLE suboptions BEG - { sub_res_info = $2; } - string_data END - ; - -string_data: - /* empty */ - | string_data numexpr QUOTEDSTRING - { - define_stringtable (&sub_res_info, $2, $3); - } - | string_data numexpr ',' QUOTEDSTRING - { - define_stringtable (&sub_res_info, $2, $4); - } - ; - -/* User defined resources. We accept general suboptions in the - file_name case to keep the parser happy. */ - -user: - id id suboptions BEG optrcdata_data END - { - define_user_data ($1, $2, &$3, $5.first); - } - | id id suboptions file_name - { - define_user_file ($1, $2, &$3, $4); - } - ; - -/* Versioninfo resources. */ - -versioninfo: - id VERSIONINFO fixedverinfo BEG verblocks END - { - define_versioninfo ($1, language, $3, $5); - } - ; - -fixedverinfo: - /* empty */ - { - $$ = ((struct fixed_versioninfo *) - res_alloc (sizeof (struct fixed_versioninfo))); - memset ($$, 0, sizeof (struct fixed_versioninfo)); - } - | fixedverinfo FILEVERSION numexpr cnumexpr cnumexpr cnumexpr - { - $1->file_version_ms = ($3 << 16) | $4; - $1->file_version_ls = ($5 << 16) | $6; - $$ = $1; - } - | fixedverinfo PRODUCTVERSION numexpr cnumexpr cnumexpr cnumexpr - { - $1->product_version_ms = ($3 << 16) | $4; - $1->product_version_ls = ($5 << 16) | $6; - $$ = $1; - } - | fixedverinfo FILEFLAGSMASK numexpr - { - $1->file_flags_mask = $3; - $$ = $1; - } - | fixedverinfo FILEFLAGS numexpr - { - $1->file_flags = $3; - $$ = $1; - } - | fixedverinfo FILEOS numexpr - { - $1->file_os = $3; - $$ = $1; - } - | fixedverinfo FILETYPE numexpr - { - $1->file_type = $3; - $$ = $1; - } - | fixedverinfo FILESUBTYPE numexpr - { - $1->file_subtype = $3; - $$ = $1; - } - ; - -/* To handle verblocks successfully, the lexer handles BLOCK - specially. A BLOCK "StringFileInfo" is returned as - BLOCKSTRINGFILEINFO. A BLOCK "VarFileInfo" is returned as - BLOCKVARFILEINFO. A BLOCK with some other string returns BLOCK - with the string as the value. */ - -verblocks: - /* empty */ - { - $$ = NULL; - } - | verblocks BLOCKSTRINGFILEINFO BEG BLOCK BEG vervals END END - { - $$ = append_ver_stringfileinfo ($1, $4, $6); - } - | verblocks BLOCKVARFILEINFO BEG VALUE QUOTEDSTRING vertrans END - { - $$ = append_ver_varfileinfo ($1, $5, $6); - } - ; - -vervals: - /* empty */ - { - $$ = NULL; - } - | vervals VALUE QUOTEDSTRING ',' QUOTEDSTRING - { - $$ = append_verval ($1, $3, $5); - } - ; - -vertrans: - /* empty */ - { - $$ = NULL; - } - | vertrans cnumexpr cnumexpr - { - $$ = append_vertrans ($1, $2, $3); - } - ; - -/* A resource ID. */ - -id: - posnumexpr - { - $$.named = 0; - $$.u.id = $1; - } - | STRING - { - char *copy, *s; - - /* It seems that resource ID's are forced to upper case. */ - copy = xstrdup ($1); - for (s = copy; *s != '\0'; s++) - if (islower ((unsigned char) *s)) - *s = toupper ((unsigned char) *s); - res_string_to_id (&$$, copy); - free (copy); - } - ; - -/* Generic suboptions. These may appear before the BEGIN in any - multiline statement. */ - -suboptions: - /* empty */ - { - memset (&$$, 0, sizeof (struct res_res_info)); - $$.language = language; - /* FIXME: Is this the right default? */ - $$.memflags = MEMFLAG_MOVEABLE; - } - | suboptions memflag - { - $$ = $1; - $$.memflags |= $2.on; - $$.memflags &=~ $2.off; - } - | suboptions CHARACTERISTICS numexpr - { - $$ = $1; - $$.characteristics = $3; - } - | suboptions LANGUAGE numexpr cnumexpr - { - $$ = $1; - $$.language = $3 | ($4 << 8); - } - | suboptions VERSIONK numexpr - { - $$ = $1; - $$.version = $3; - } - ; - -/* Memory flags which default to MOVEABLE and DISCARDABLE. */ - -memflags_move_discard: - /* empty */ - { - memset (&$$, 0, sizeof (struct res_res_info)); - $$.language = language; - $$.memflags = MEMFLAG_MOVEABLE | MEMFLAG_DISCARDABLE; - } - | memflags_move_discard memflag - { - $$ = $1; - $$.memflags |= $2.on; - $$.memflags &=~ $2.off; - } - ; - -/* Memory flags which default to MOVEABLE. */ - -memflags_move: - /* empty */ - { - memset (&$$, 0, sizeof (struct res_res_info)); - $$.language = language; - $$.memflags = MEMFLAG_MOVEABLE; - } - | memflags_move memflag - { - $$ = $1; - $$.memflags |= $2.on; - $$.memflags &=~ $2.off; - } - ; - -/* Memory flags. This returns a struct with two integers, because we - sometimes want to set bits and we sometimes want to clear them. */ - -memflag: - MOVEABLE - { - $$.on = MEMFLAG_MOVEABLE; - $$.off = 0; - } - | FIXED - { - $$.on = 0; - $$.off = MEMFLAG_MOVEABLE; - } - | PURE - { - $$.on = MEMFLAG_PURE; - $$.off = 0; - } - | IMPURE - { - $$.on = 0; - $$.off = MEMFLAG_PURE; - } - | PRELOAD - { - $$.on = MEMFLAG_PRELOAD; - $$.off = 0; - } - | LOADONCALL - { - $$.on = 0; - $$.off = MEMFLAG_PRELOAD; - } - | DISCARDABLE - { - $$.on = MEMFLAG_DISCARDABLE; - $$.off = 0; - } - ; - -/* A file name. */ - -file_name: - QUOTEDSTRING - { - $$ = $1; - } - | STRING - { - $$ = $1; - } - ; - -/* A style expression. This changes the static variable STYLE. We do - it this way because rc appears to permit a style to be set to - something like - WS_GROUP | NOT WS_TABSTOP - to mean that a default of WS_TABSTOP should be removed. Anything - which wants to accept a style must first set STYLE to the default - value. The styleexpr nonterminal will change STYLE as specified by - the user. Note that we do not accept arbitrary expressions here, - just numbers separated by '|'. */ - -styleexpr: - parennumber - { - style |= $1; - } - | NOT parennumber - { - style &=~ $2; - } - | styleexpr '|' parennumber - { - style |= $3; - } - | styleexpr '|' NOT parennumber - { - style &=~ $4; - } - ; - -parennumber: - NUMBER - { - $$ = $1.val; - } - | '(' numexpr ')' - { - $$ = $2; - } - ; - -/* An optional expression with a leading comma. */ - -optcnumexpr: - /* empty */ - { - $$ = 0; - } - | cnumexpr - { - $$ = $1; - } - ; - -/* An expression with a leading comma. */ - -cnumexpr: - ',' numexpr - { - $$ = $2; - } - ; - -/* A possibly negated numeric expression. */ - -numexpr: - sizednumexpr - { - $$ = $1.val; - } - ; - -/* A possibly negated expression with a size. */ - -sizednumexpr: - NUMBER - { - $$ = $1; - } - | '(' sizednumexpr ')' - { - $$ = $2; - } - | '~' sizednumexpr %prec '~' - { - $$.val = ~ $2.val; - $$.dword = $2.dword; - } - | '-' sizednumexpr %prec NEG - { - $$.val = - $2.val; - $$.dword = $2.dword; - } - | sizednumexpr '*' sizednumexpr - { - $$.val = $1.val * $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizednumexpr '/' sizednumexpr - { - $$.val = $1.val / $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizednumexpr '%' sizednumexpr - { - $$.val = $1.val % $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizednumexpr '+' sizednumexpr - { - $$.val = $1.val + $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizednumexpr '-' sizednumexpr - { - $$.val = $1.val - $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizednumexpr '&' sizednumexpr - { - $$.val = $1.val & $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizednumexpr '^' sizednumexpr - { - $$.val = $1.val ^ $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizednumexpr '|' sizednumexpr - { - $$.val = $1.val | $3.val; - $$.dword = $1.dword || $3.dword; - } - ; - -/* An expression with a leading comma which does not use unary - negation. */ - -cposnumexpr: - ',' posnumexpr - { - $$ = $2; - } - ; - -/* An expression which does not use unary negation. */ - -posnumexpr: - sizedposnumexpr - { - $$ = $1.val; - } - ; - -/* An expression which does not use unary negation. We separate unary - negation to avoid parsing conflicts when two numeric expressions - appear consecutively. */ - -sizedposnumexpr: - NUMBER - { - $$ = $1; - } - | '(' sizednumexpr ')' - { - $$ = $2; - } - | '~' sizednumexpr %prec '~' - { - $$.val = ~ $2.val; - $$.dword = $2.dword; - } - | sizedposnumexpr '*' sizednumexpr - { - $$.val = $1.val * $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizedposnumexpr '/' sizednumexpr - { - $$.val = $1.val / $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizedposnumexpr '%' sizednumexpr - { - $$.val = $1.val % $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizedposnumexpr '+' sizednumexpr - { - $$.val = $1.val + $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizedposnumexpr '-' sizednumexpr - { - $$.val = $1.val - $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizedposnumexpr '&' sizednumexpr - { - $$.val = $1.val & $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizedposnumexpr '^' sizednumexpr - { - $$.val = $1.val ^ $3.val; - $$.dword = $1.dword || $3.dword; - } - | sizedposnumexpr '|' sizednumexpr - { - $$.val = $1.val | $3.val; - $$.dword = $1.dword || $3.dword; - } - ; - -%% - -/* Set the language from the command line. */ - -void -rcparse_set_language (lang) - int lang; -{ - language = lang; -} diff --git a/binutils/rdcoff.c b/binutils/rdcoff.c deleted file mode 100644 index e1385c7140e..00000000000 --- a/binutils/rdcoff.c +++ /dev/null @@ -1,887 +0,0 @@ -/* stabs.c -- Parse COFF debugging information - Copyright (C) 1996, 98, 99, 2000 Free Software Foundation, Inc. - Written by Ian Lance Taylor . - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file contains code which parses COFF debugging information. */ - -#include "bfd.h" -#include "coff/internal.h" -#include "bucomm.h" -#include "libiberty.h" -#include "demangle.h" -#include "debug.h" -#include "budbg.h" - -/* FIXME: We should not need this BFD internal file. We need it for - the N_BTMASK, etc., values. */ -#include "libcoff.h" - -/* These macros extract the right mask and shifts for this BFD. They - assume that there is a local variable named ABFD. This is so that - macros like ISFCN and DECREF, from coff/internal.h, will work - without modification. */ -#define N_BTMASK (coff_data (abfd)->local_n_btmask) -#define N_BTSHFT (coff_data (abfd)->local_n_btshft) -#define N_TMASK (coff_data (abfd)->local_n_tmask) -#define N_TSHIFT (coff_data (abfd)->local_n_tshift) - -/* This structure is used to hold the symbols, as well as the current - location within the symbols. */ - -struct coff_symbols -{ - /* The symbols. */ - asymbol **syms; - /* The number of symbols. */ - long symcount; - /* The index of the current symbol. */ - long symno; - /* The index of the current symbol in the COFF symbol table (where - each auxent counts as a symbol). */ - long coff_symno; -}; - -/* The largest basic type we are prepared to handle. */ - -#define T_MAX (T_LNGDBL) - -/* This structure is used to hold slots. */ - -struct coff_slots -{ - /* Next set of slots. */ - struct coff_slots *next; - /* Slots. */ -#define COFF_SLOTS (16) - debug_type slots[COFF_SLOTS]; -}; - -/* This structure is used to map symbol indices to types. */ - -struct coff_types -{ - /* Slots. */ - struct coff_slots *slots; - /* Basic types. */ - debug_type basic[T_MAX + 1]; -}; - -static debug_type *coff_get_slot PARAMS ((struct coff_types *, int)); -static debug_type parse_coff_type - PARAMS ((bfd *, struct coff_symbols *, struct coff_types *, long, int, - union internal_auxent *, boolean, PTR)); -static debug_type parse_coff_base_type - PARAMS ((bfd *, struct coff_symbols *, struct coff_types *, long, int, - union internal_auxent *, PTR)); -static debug_type parse_coff_struct_type - PARAMS ((bfd *, struct coff_symbols *, struct coff_types *, int, - union internal_auxent *, PTR)); -static debug_type parse_coff_enum_type - PARAMS ((bfd *, struct coff_symbols *, struct coff_types *, - union internal_auxent *, PTR)); -static boolean parse_coff_symbol - PARAMS ((bfd *, struct coff_types *, asymbol *, long, - struct internal_syment *, PTR, debug_type, boolean)); - -/* Return the slot for a type. */ - -static debug_type * -coff_get_slot (types, indx) - struct coff_types *types; - int indx; -{ - struct coff_slots **pps; - - pps = &types->slots; - - while (indx >= COFF_SLOTS) - { - if (*pps == NULL) - { - *pps = (struct coff_slots *) xmalloc (sizeof **pps); - memset (*pps, 0, sizeof **pps); - } - pps = &(*pps)->next; - indx -= COFF_SLOTS; - } - - if (*pps == NULL) - { - *pps = (struct coff_slots *) xmalloc (sizeof **pps); - memset (*pps, 0, sizeof **pps); - } - - return (*pps)->slots + indx; -} - -/* Parse a COFF type code in NTYPE. */ - -static debug_type -parse_coff_type (abfd, symbols, types, coff_symno, ntype, pauxent, useaux, - dhandle) - bfd *abfd; - struct coff_symbols *symbols; - struct coff_types *types; - long coff_symno; - int ntype; - union internal_auxent *pauxent; - boolean useaux; - PTR dhandle; -{ - debug_type type; - - if ((ntype & ~N_BTMASK) != 0) - { - int newtype; - - newtype = DECREF (ntype); - - if (ISPTR (ntype)) - { - type = parse_coff_type (abfd, symbols, types, coff_symno, newtype, - pauxent, useaux, dhandle); - type = debug_make_pointer_type (dhandle, type); - } - else if (ISFCN (ntype)) - { - type = parse_coff_type (abfd, symbols, types, coff_symno, newtype, - pauxent, useaux, dhandle); - type = debug_make_function_type (dhandle, type, (debug_type *) NULL, - false); - } - else if (ISARY (ntype)) - { - int n; - - if (pauxent == NULL) - n = 0; - else - { - unsigned short *dim; - int i; - - /* FIXME: If pauxent->x_sym.x_tagndx.l == 0, gdb sets - the c_naux field of the syment to 0. */ - - /* Move the dimensions down, so that the next array - picks up the next one. */ - dim = pauxent->x_sym.x_fcnary.x_ary.x_dimen; - n = dim[0]; - for (i = 0; *dim != 0 && i < DIMNUM - 1; i++, dim++) - *dim = *(dim + 1); - *dim = 0; - } - - type = parse_coff_type (abfd, symbols, types, coff_symno, newtype, - pauxent, false, dhandle); - type = debug_make_array_type (dhandle, type, - parse_coff_base_type (abfd, symbols, - types, - coff_symno, - T_INT, - NULL, dhandle), - 0, n - 1, false); - } - else - { - non_fatal (_("parse_coff_type: Bad type code 0x%x"), ntype); - return DEBUG_TYPE_NULL; - } - - return type; - } - - if (pauxent != NULL && pauxent->x_sym.x_tagndx.l > 0) - { - debug_type *slot; - - /* This is a reference to an existing type. FIXME: gdb checks - that the class is not C_STRTAG, nor C_UNTAG, nor C_ENTAG. */ - slot = coff_get_slot (types, pauxent->x_sym.x_tagndx.l); - if (*slot != DEBUG_TYPE_NULL) - return *slot; - else - return debug_make_indirect_type (dhandle, slot, (const char *) NULL); - } - - /* If the aux entry has already been used for something, useaux will - have been set to false, indicating that parse_coff_base_type - should not use it. We need to do it this way, rather than simply - passing pauxent as NULL, because we need to be able handle - multiple array dimensions while still discarding pauxent after - having handled all of them. */ - if (! useaux) - pauxent = NULL; - - return parse_coff_base_type (abfd, symbols, types, coff_symno, ntype, - pauxent, dhandle); -} - -/* Parse a basic COFF type in NTYPE. */ - -static debug_type -parse_coff_base_type (abfd, symbols, types, coff_symno, ntype, pauxent, - dhandle) - bfd *abfd; - struct coff_symbols *symbols; - struct coff_types *types; - long coff_symno; - int ntype; - union internal_auxent *pauxent; - PTR dhandle; -{ - debug_type ret; - boolean set_basic; - const char *name; - debug_type *slot; - - if (ntype >= 0 - && ntype <= T_MAX - && types->basic[ntype] != DEBUG_TYPE_NULL) - return types->basic[ntype]; - - set_basic = true; - name = NULL; - - switch (ntype) - { - default: - ret = debug_make_void_type (dhandle); - break; - - case T_NULL: - case T_VOID: - ret = debug_make_void_type (dhandle); - name = "void"; - break; - - case T_CHAR: - ret = debug_make_int_type (dhandle, 1, false); - name = "char"; - break; - - case T_SHORT: - ret = debug_make_int_type (dhandle, 2, false); - name = "short"; - break; - - case T_INT: - /* FIXME: Perhaps the size should depend upon the architecture. */ - ret = debug_make_int_type (dhandle, 4, false); - name = "int"; - break; - - case T_LONG: - ret = debug_make_int_type (dhandle, 4, false); - name = "long"; - break; - - case T_FLOAT: - ret = debug_make_float_type (dhandle, 4); - name = "float"; - break; - - case T_DOUBLE: - ret = debug_make_float_type (dhandle, 8); - name = "double"; - break; - - case T_LNGDBL: - ret = debug_make_float_type (dhandle, 12); - name = "long double"; - break; - - case T_UCHAR: - ret = debug_make_int_type (dhandle, 1, true); - name = "unsigned char"; - break; - - case T_USHORT: - ret = debug_make_int_type (dhandle, 2, true); - name = "unsigned short"; - break; - - case T_UINT: - ret = debug_make_int_type (dhandle, 4, true); - name = "unsigned int"; - break; - - case T_ULONG: - ret = debug_make_int_type (dhandle, 4, true); - name = "unsigned long"; - break; - - case T_STRUCT: - if (pauxent == NULL) - ret = debug_make_struct_type (dhandle, true, 0, - (debug_field *) NULL); - else - ret = parse_coff_struct_type (abfd, symbols, types, ntype, pauxent, - dhandle); - - slot = coff_get_slot (types, coff_symno); - *slot = ret; - - set_basic = false; - break; - - case T_UNION: - if (pauxent == NULL) - ret = debug_make_struct_type (dhandle, false, 0, (debug_field *) NULL); - else - ret = parse_coff_struct_type (abfd, symbols, types, ntype, pauxent, - dhandle); - - slot = coff_get_slot (types, coff_symno); - *slot = ret; - - set_basic = false; - break; - - case T_ENUM: - if (pauxent == NULL) - ret = debug_make_enum_type (dhandle, (const char **) NULL, - (bfd_signed_vma *) NULL); - else - ret = parse_coff_enum_type (abfd, symbols, types, pauxent, dhandle); - - slot = coff_get_slot (types, coff_symno); - *slot = ret; - - set_basic = false; - break; - } - - if (name != NULL) - ret = debug_name_type (dhandle, name, ret); - - if (set_basic - && ntype >= 0 - && ntype <= T_MAX) - types->basic[ntype] = ret; - - return ret; -} - -/* Parse a struct type. */ - -static debug_type -parse_coff_struct_type (abfd, symbols, types, ntype, pauxent, dhandle) - bfd *abfd; - struct coff_symbols *symbols; - struct coff_types *types; - int ntype; - union internal_auxent *pauxent; - PTR dhandle; -{ - long symend; - int alloc; - debug_field *fields; - int count; - boolean done; - - symend = pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l; - - alloc = 10; - fields = (debug_field *) xmalloc (alloc * sizeof *fields); - count = 0; - - done = false; - while (! done - && symbols->coff_symno < symend - && symbols->symno < symbols->symcount) - { - asymbol *sym; - long this_coff_symno; - struct internal_syment syment; - union internal_auxent auxent; - union internal_auxent *psubaux; - bfd_vma bitpos = 0, bitsize = 0; - - sym = symbols->syms[symbols->symno]; - - if (! bfd_coff_get_syment (abfd, sym, &syment)) - { - non_fatal (_("bfd_coff_get_syment failed: %s"), - bfd_errmsg (bfd_get_error ())); - return DEBUG_TYPE_NULL; - } - - this_coff_symno = symbols->coff_symno; - - ++symbols->symno; - symbols->coff_symno += 1 + syment.n_numaux; - - if (syment.n_numaux == 0) - psubaux = NULL; - else - { - if (! bfd_coff_get_auxent (abfd, sym, 0, &auxent)) - { - non_fatal (_("bfd_coff_get_auxent failed: %s"), - bfd_errmsg (bfd_get_error ())); - return DEBUG_TYPE_NULL; - } - psubaux = &auxent; - } - - switch (syment.n_sclass) - { - case C_MOS: - case C_MOU: - bitpos = 8 * bfd_asymbol_value (sym); - bitsize = 0; - break; - - case C_FIELD: - bitpos = bfd_asymbol_value (sym); - bitsize = auxent.x_sym.x_misc.x_lnsz.x_size; - break; - - case C_EOS: - done = true; - break; - } - - if (! done) - { - debug_type ftype; - debug_field f; - - ftype = parse_coff_type (abfd, symbols, types, this_coff_symno, - syment.n_type, psubaux, true, dhandle); - f = debug_make_field (dhandle, bfd_asymbol_name (sym), ftype, - bitpos, bitsize, DEBUG_VISIBILITY_PUBLIC); - if (f == DEBUG_FIELD_NULL) - return DEBUG_TYPE_NULL; - - if (count + 1 >= alloc) - { - alloc += 10; - fields = ((debug_field *) - xrealloc (fields, alloc * sizeof *fields)); - } - - fields[count] = f; - ++count; - } - } - - fields[count] = DEBUG_FIELD_NULL; - - return debug_make_struct_type (dhandle, ntype == T_STRUCT, - pauxent->x_sym.x_misc.x_lnsz.x_size, - fields); -} - -/* Parse an enum type. */ - -static debug_type -parse_coff_enum_type (abfd, symbols, types, pauxent, dhandle) - bfd *abfd; - struct coff_symbols *symbols; - struct coff_types *types ATTRIBUTE_UNUSED; - union internal_auxent *pauxent; - PTR dhandle; -{ - long symend; - int alloc; - const char **names; - bfd_signed_vma *vals; - int count; - boolean done; - - symend = pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l; - - alloc = 10; - names = (const char **) xmalloc (alloc * sizeof *names); - vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *vals); - count = 0; - - done = false; - while (! done - && symbols->coff_symno < symend - && symbols->symno < symbols->symcount) - { - asymbol *sym; - struct internal_syment syment; - - sym = symbols->syms[symbols->symno]; - - if (! bfd_coff_get_syment (abfd, sym, &syment)) - { - non_fatal (_("bfd_coff_get_syment failed: %s"), - bfd_errmsg (bfd_get_error ())); - return DEBUG_TYPE_NULL; - } - - ++symbols->symno; - symbols->coff_symno += 1 + syment.n_numaux; - - switch (syment.n_sclass) - { - case C_MOE: - if (count + 1 >= alloc) - { - alloc += 10; - names = ((const char **) - xrealloc (names, alloc * sizeof *names)); - vals = ((bfd_signed_vma *) - xrealloc (vals, alloc * sizeof *vals)); - } - - names[count] = bfd_asymbol_name (sym); - vals[count] = bfd_asymbol_value (sym); - ++count; - break; - - case C_EOS: - done = true; - break; - } - } - - names[count] = NULL; - - return debug_make_enum_type (dhandle, names, vals); -} - -/* Handle a single COFF symbol. */ - -static boolean -parse_coff_symbol (abfd, types, sym, coff_symno, psyment, dhandle, type, - within_function) - bfd *abfd ATTRIBUTE_UNUSED; - struct coff_types *types; - asymbol *sym; - long coff_symno; - struct internal_syment *psyment; - PTR dhandle; - debug_type type; - boolean within_function; -{ - switch (psyment->n_sclass) - { - case C_NULL: - break; - - case C_AUTO: - if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type, - DEBUG_LOCAL, bfd_asymbol_value (sym))) - return false; - break; - - case C_EXT: - if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type, - DEBUG_GLOBAL, bfd_asymbol_value (sym))) - return false; - break; - - case C_STAT: - if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type, - (within_function - ? DEBUG_LOCAL_STATIC - : DEBUG_STATIC), - bfd_asymbol_value (sym))) - return false; - break; - - case C_REG: - /* FIXME: We may need to convert the register number. */ - if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type, - DEBUG_REGISTER, bfd_asymbol_value (sym))) - return false; - break; - - case C_LABEL: - break; - - case C_ARG: - if (! debug_record_parameter (dhandle, bfd_asymbol_name (sym), type, - DEBUG_PARM_STACK, bfd_asymbol_value (sym))) - return false; - break; - - case C_REGPARM: - /* FIXME: We may need to convert the register number. */ - if (! debug_record_parameter (dhandle, bfd_asymbol_name (sym), type, - DEBUG_PARM_REG, bfd_asymbol_value (sym))) - return false; - break; - - case C_TPDEF: - type = debug_name_type (dhandle, bfd_asymbol_name (sym), type); - if (type == DEBUG_TYPE_NULL) - return false; - break; - - case C_STRTAG: - case C_UNTAG: - case C_ENTAG: - { - debug_type *slot; - - type = debug_tag_type (dhandle, bfd_asymbol_name (sym), type); - if (type == DEBUG_TYPE_NULL) - return false; - - /* Store the named type into the slot, so that references get - the name. */ - slot = coff_get_slot (types, coff_symno); - *slot = type; - } - break; - - default: - break; - } - - return true; -} - -/* This is the main routine. It looks through all the symbols and - handles them. */ - -boolean -parse_coff (abfd, syms, symcount, dhandle) - bfd *abfd; - asymbol **syms; - long symcount; - PTR dhandle; -{ - struct coff_symbols symbols; - struct coff_types types; - int i; - long next_c_file; - const char *fnname; - int fnclass; - int fntype; - bfd_vma fnend; - alent *linenos; - boolean within_function; - long this_coff_symno; - - symbols.syms = syms; - symbols.symcount = symcount; - symbols.symno = 0; - symbols.coff_symno = 0; - - types.slots = NULL; - for (i = 0; i <= T_MAX; i++) - types.basic[i] = DEBUG_TYPE_NULL; - - next_c_file = -1; - fnname = NULL; - fnclass = 0; - fntype = 0; - fnend = 0; - linenos = NULL; - within_function = false; - - while (symbols.symno < symcount) - { - asymbol *sym; - const char *name; - struct internal_syment syment; - union internal_auxent auxent; - union internal_auxent *paux; - debug_type type; - - sym = syms[symbols.symno]; - - if (! bfd_coff_get_syment (abfd, sym, &syment)) - { - non_fatal (_("bfd_coff_get_syment failed: %s"), - bfd_errmsg (bfd_get_error ())); - return false; - } - - name = bfd_asymbol_name (sym); - - this_coff_symno = symbols.coff_symno; - - ++symbols.symno; - symbols.coff_symno += 1 + syment.n_numaux; - - /* We only worry about the first auxent, because that is the - only one which is relevant for debugging information. */ - if (syment.n_numaux == 0) - paux = NULL; - else - { - if (! bfd_coff_get_auxent (abfd, sym, 0, &auxent)) - { - non_fatal (_("bfd_coff_get_auxent failed: %s"), - bfd_errmsg (bfd_get_error ())); - return false; - } - paux = &auxent; - } - - if (this_coff_symno == next_c_file && syment.n_sclass != C_FILE) - { - /* The last C_FILE symbol points to the first external - symbol. */ - if (! debug_set_filename (dhandle, "*globals*")) - return false; - } - - switch (syment.n_sclass) - { - case C_EFCN: - case C_EXTDEF: - case C_ULABEL: - case C_USTATIC: - case C_LINE: - case C_ALIAS: - case C_HIDDEN: - /* Just ignore these classes. */ - break; - - case C_FILE: - next_c_file = syment.n_value; - if (! debug_set_filename (dhandle, name)) - return false; - break; - - case C_STAT: - /* Ignore static symbols with a type of T_NULL. These - represent section entries. */ - if (syment.n_type == T_NULL) - break; - /* Fall through. */ - case C_EXT: - if (ISFCN (syment.n_type)) - { - fnname = name; - fnclass = syment.n_sclass; - fntype = syment.n_type; - if (syment.n_numaux > 0) - fnend = bfd_asymbol_value (sym) + auxent.x_sym.x_misc.x_fsize; - else - fnend = 0; - linenos = BFD_SEND (abfd, _get_lineno, (abfd, sym)); - break; - } - type = parse_coff_type (abfd, &symbols, &types, this_coff_symno, - syment.n_type, paux, true, dhandle); - if (type == DEBUG_TYPE_NULL) - return false; - if (! parse_coff_symbol (abfd, &types, sym, this_coff_symno, &syment, - dhandle, type, within_function)) - return false; - break; - - case C_FCN: - if (strcmp (name, ".bf") == 0) - { - if (fnname == NULL) - { - non_fatal (_("%ld: .bf without preceding function"), - this_coff_symno); - return false; - } - - type = parse_coff_type (abfd, &symbols, &types, this_coff_symno, - DECREF (fntype), paux, false, dhandle); - if (type == DEBUG_TYPE_NULL) - return false; - - if (! debug_record_function (dhandle, fnname, type, - fnclass == C_EXT, - bfd_asymbol_value (sym))) - return false; - - if (linenos != NULL) - { - int base; - bfd_vma addr; - - if (syment.n_numaux == 0) - base = 0; - else - base = auxent.x_sym.x_misc.x_lnsz.x_lnno - 1; - - addr = bfd_get_section_vma (abfd, bfd_get_section (sym)); - - ++linenos; - - while (linenos->line_number != 0) - { - if (! debug_record_line (dhandle, - linenos->line_number + base, - linenos->u.offset + addr)) - return false; - ++linenos; - } - } - - fnname = NULL; - linenos = NULL; - fnclass = 0; - fntype = 0; - - within_function = true; - } - else if (strcmp (name, ".ef") == 0) - { - if (! within_function) - { - non_fatal (_("%ld: unexpected .ef\n"), this_coff_symno); - return false; - } - - if (bfd_asymbol_value (sym) > fnend) - fnend = bfd_asymbol_value (sym); - if (! debug_end_function (dhandle, fnend)) - return false; - - fnend = 0; - within_function = false; - } - break; - - case C_BLOCK: - if (strcmp (name, ".bb") == 0) - { - if (! debug_start_block (dhandle, bfd_asymbol_value (sym))) - return false; - } - else if (strcmp (name, ".eb") == 0) - { - if (! debug_end_block (dhandle, bfd_asymbol_value (sym))) - return false; - } - break; - - default: - type = parse_coff_type (abfd, &symbols, &types, this_coff_symno, - syment.n_type, paux, true, dhandle); - if (type == DEBUG_TYPE_NULL) - return false; - if (! parse_coff_symbol (abfd, &types, sym, this_coff_symno, &syment, - dhandle, type, within_function)) - return false; - break; - } - } - - return true; -} diff --git a/binutils/rddbg.c b/binutils/rddbg.c deleted file mode 100644 index f9fae05d669..00000000000 --- a/binutils/rddbg.c +++ /dev/null @@ -1,458 +0,0 @@ -/* rddbg.c -- Read debugging information into a generic form. - Copyright (C) 1995, 96, 97, 98, 2000 Free Software Foundation, Inc. - Written by Ian Lance Taylor . - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file reads debugging information into a generic form. This - file knows how to dig the debugging information out of an object - file. */ - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "debug.h" -#include "budbg.h" - -static boolean read_section_stabs_debugging_info - PARAMS ((bfd *, asymbol **, long, PTR, boolean *)); -static boolean read_symbol_stabs_debugging_info - PARAMS ((bfd *, asymbol **, long, PTR, boolean *)); -static boolean read_ieee_debugging_info PARAMS ((bfd *, PTR, boolean *)); -static void save_stab PARAMS ((int, int, bfd_vma, const char *)); -static void stab_context PARAMS ((void)); -static void free_saved_stabs PARAMS ((void)); - -/* Read debugging information from a BFD. Returns a generic debugging - pointer. */ - -PTR -read_debugging_info (abfd, syms, symcount) - bfd *abfd; - asymbol **syms; - long symcount; -{ - PTR dhandle; - boolean found; - - dhandle = debug_init (); - if (dhandle == NULL) - return NULL; - - if (! read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, - &found)) - return NULL; - - if (bfd_get_flavour (abfd) == bfd_target_aout_flavour) - { - if (! read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle, - &found)) - return NULL; - } - - if (bfd_get_flavour (abfd) == bfd_target_ieee_flavour) - { - if (! read_ieee_debugging_info (abfd, dhandle, &found)) - return NULL; - } - - /* Try reading the COFF symbols if we didn't find any stabs in COFF - sections. */ - if (! found - && bfd_get_flavour (abfd) == bfd_target_coff_flavour - && symcount > 0) - { - if (! parse_coff (abfd, syms, symcount, dhandle)) - return NULL; - found = true; - } - - if (! found) - { - non_fatal (_("%s: no recognized debugging information"), - bfd_get_filename (abfd)); - return NULL; - } - - return dhandle; -} - -/* Read stabs in sections debugging information from a BFD. */ - -static boolean -read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) - bfd *abfd; - asymbol **syms; - long symcount; - PTR dhandle; - boolean *pfound; -{ - static struct - { - const char *secname; - const char *strsecname; - } names[] = { { ".stab", ".stabstr" } }; - unsigned int i; - PTR shandle; - - *pfound = false; - shandle = NULL; - - for (i = 0; i < sizeof names / sizeof names[0]; i++) - { - asection *sec, *strsec; - - sec = bfd_get_section_by_name (abfd, names[i].secname); - strsec = bfd_get_section_by_name (abfd, names[i].strsecname); - if (sec != NULL && strsec != NULL) - { - bfd_size_type stabsize, strsize; - bfd_byte *stabs, *strings; - bfd_byte *stab; - bfd_size_type stroff, next_stroff; - - stabsize = bfd_section_size (abfd, sec); - stabs = (bfd_byte *) xmalloc (stabsize); - if (! bfd_get_section_contents (abfd, sec, stabs, 0, stabsize)) - { - fprintf (stderr, "%s: %s: %s\n", - bfd_get_filename (abfd), names[i].secname, - bfd_errmsg (bfd_get_error ())); - return false; - } - - strsize = bfd_section_size (abfd, strsec); - strings = (bfd_byte *) xmalloc (strsize); - if (! bfd_get_section_contents (abfd, strsec, strings, 0, strsize)) - { - fprintf (stderr, "%s: %s: %s\n", - bfd_get_filename (abfd), names[i].strsecname, - bfd_errmsg (bfd_get_error ())); - return false; - } - - if (shandle == NULL) - { - shandle = start_stab (dhandle, abfd, true, syms, symcount); - if (shandle == NULL) - return false; - } - - *pfound = true; - - stroff = 0; - next_stroff = 0; - for (stab = stabs; stab < stabs + stabsize; stab += 12) - { - unsigned int strx; - int type; - int other; - int desc; - bfd_vma value; - - /* This code presumes 32 bit values. */ - - strx = bfd_get_32 (abfd, stab); - type = bfd_get_8 (abfd, stab + 4); - other = bfd_get_8 (abfd, stab + 5); - desc = bfd_get_16 (abfd, stab + 6); - value = bfd_get_32 (abfd, stab + 8); - - if (type == 0) - { - /* Special type 0 stabs indicate the offset to the - next string table. */ - stroff = next_stroff; - next_stroff += value; - } - else - { - char *f, *s; - - f = NULL; - - if (stroff + strx > strsize) - { - fprintf (stderr, "%s: %s: stab entry %d is corrupt, strx = 0x%x, type = %d\n", - bfd_get_filename (abfd), names[i].secname, - (stab - stabs) / 12, strx, type); - continue; - } - - s = (char *) strings + stroff + strx; - - while (s[strlen (s) - 1] == '\\' - && stab + 12 < stabs + stabsize) - { - char *p; - - stab += 12; - p = s + strlen (s) - 1; - *p = '\0'; - s = concat (s, - ((char *) strings - + stroff - + bfd_get_32 (abfd, stab)), - (const char *) NULL); - - /* We have to restore the backslash, because, if - the linker is hashing stabs strings, we may - see the same string more than once. */ - *p = '\\'; - - if (f != NULL) - free (f); - f = s; - } - - save_stab (type, desc, value, s); - - if (! parse_stab (dhandle, shandle, type, desc, value, s)) - { - stab_context (); - free_saved_stabs (); - return false; - } - - /* Don't free f, since I think the stabs code - expects strings to hang around. This should be - straightened out. FIXME. */ - } - } - - free_saved_stabs (); - free (stabs); - - /* Don't free strings, since I think the stabs code expects - the strings to hang around. This should be straightened - out. FIXME. */ - } - } - - if (shandle != NULL) - { - if (! finish_stab (dhandle, shandle)) - return false; - } - - return true; -} - -/* Read stabs in the symbol table. */ - -static boolean -read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) - bfd *abfd; - asymbol **syms; - long symcount; - PTR dhandle; - boolean *pfound; -{ - PTR shandle; - asymbol **ps, **symend; - - shandle = NULL; - symend = syms + symcount; - for (ps = syms; ps < symend; ps++) - { - symbol_info i; - - bfd_get_symbol_info (abfd, *ps, &i); - - if (i.type == '-') - { - const char *s; - char *f; - - if (shandle == NULL) - { - shandle = start_stab (dhandle, abfd, false, syms, symcount); - if (shandle == NULL) - return false; - } - - *pfound = true; - - s = i.name; - f = NULL; - while (s[strlen (s) - 1] == '\\' - && ps + 1 < symend) - { - char *sc, *n; - - ++ps; - sc = xstrdup (s); - sc[strlen (sc) - 1] = '\0'; - n = concat (sc, bfd_asymbol_name (*ps), (const char *) NULL); - free (sc); - if (f != NULL) - free (f); - f = n; - s = n; - } - - save_stab (i.stab_type, i.stab_desc, i.value, s); - - if (! parse_stab (dhandle, shandle, i.stab_type, i.stab_desc, - i.value, s)) - { - stab_context (); - free_saved_stabs (); - return false; - } - - /* Don't free f, since I think the stabs code expects - strings to hang around. This should be straightened out. - FIXME. */ - } - } - - free_saved_stabs (); - - if (shandle != NULL) - { - if (! finish_stab (dhandle, shandle)) - return false; - } - - return true; -} - -/* Read IEEE debugging information. */ - -static boolean -read_ieee_debugging_info (abfd, dhandle, pfound) - bfd *abfd; - PTR dhandle; - boolean *pfound; -{ - asection *dsec; - bfd_size_type size; - bfd_byte *contents; - - /* The BFD backend puts the debugging information into a section - named .debug. */ - - dsec = bfd_get_section_by_name (abfd, ".debug"); - if (dsec == NULL) - return true; - - size = bfd_section_size (abfd, dsec); - contents = (bfd_byte *) xmalloc (size); - if (! bfd_get_section_contents (abfd, dsec, contents, 0, size)) - return false; - - if (! parse_ieee (dhandle, abfd, contents, size)) - return false; - - free (contents); - - *pfound = true; - - return true; -} - -/* Record stabs strings, so that we can give some context for errors. */ - -#define SAVE_STABS_COUNT (16) - -struct saved_stab -{ - int type; - int desc; - bfd_vma value; - char *string; -}; - -static struct saved_stab saved_stabs[SAVE_STABS_COUNT]; -static int saved_stabs_index; - -/* Save a stabs string. */ - -static void -save_stab (type, desc, value, string) - int type; - int desc; - bfd_vma value; - const char *string; -{ - if (saved_stabs[saved_stabs_index].string != NULL) - free (saved_stabs[saved_stabs_index].string); - saved_stabs[saved_stabs_index].type = type; - saved_stabs[saved_stabs_index].desc = desc; - saved_stabs[saved_stabs_index].value = value; - saved_stabs[saved_stabs_index].string = xstrdup (string); - saved_stabs_index = (saved_stabs_index + 1) % SAVE_STABS_COUNT; -} - -/* Provide context for an error. */ - -static void -stab_context () -{ - int i; - - fprintf (stderr, _("Last stabs entries before error:\n")); - fprintf (stderr, "n_type n_desc n_value string\n"); - - i = saved_stabs_index; - do - { - struct saved_stab *stabp; - - stabp = saved_stabs + i; - if (stabp->string != NULL) - { - const char *s; - - s = bfd_get_stab_name (stabp->type); - if (s != NULL) - fprintf (stderr, "%-6s", s); - else if (stabp->type == 0) - fprintf (stderr, "HdrSym"); - else - fprintf (stderr, "%-6d", stabp->type); - fprintf (stderr, " %-6d ", stabp->desc); - fprintf_vma (stderr, stabp->value); - if (stabp->type != 0) - fprintf (stderr, " %s", stabp->string); - fprintf (stderr, "\n"); - } - i = (i + 1) % SAVE_STABS_COUNT; - } - while (i != saved_stabs_index); -} - -/* Free the saved stab strings. */ - -static void -free_saved_stabs () -{ - int i; - - for (i = 0; i < SAVE_STABS_COUNT; i++) - { - if (saved_stabs[i].string != NULL) - { - free (saved_stabs[i].string); - saved_stabs[i].string = NULL; - } - } - - saved_stabs_index = 0; -} diff --git a/binutils/readelf.c b/binutils/readelf.c deleted file mode 100644 index f4c47f4342d..00000000000 --- a/binutils/readelf.c +++ /dev/null @@ -1,7318 +0,0 @@ -/* readelf.c -- display contents of an ELF format file - Copyright (C) 1998, 99, 2000 Free Software Foundation, Inc. - - Originally developed by Eric Youngdale - Modifications by Nick Clifton - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - - -#include -#include -#include -#include -#include - -#if __GNUC__ >= 2 -/* Define BFD64 here, even if our default architecture is 32 bit ELF - as this will allow us to read in and parse 64bit and 32bit ELF files. - Only do this if we belive that the compiler can support a 64 bit - data type. For now we only rely on GCC being able to do this. */ -#define BFD64 -#endif - -#include "bfd.h" - -#include "elf/common.h" -#include "elf/external.h" -#include "elf/internal.h" -#include "elf/dwarf2.h" - -/* The following headers use the elf/reloc-macros.h file to - automatically generate relocation recognition functions - such as elf_mips_reloc_type() */ - -#define RELOC_MACROS_GEN_FUNC - -#include "elf/i386.h" -#include "elf/v850.h" -#include "elf/ppc.h" -#include "elf/mips.h" -#include "elf/alpha.h" -#include "elf/arm.h" -#include "elf/m68k.h" -#include "elf/sparc.h" -#include "elf/m32r.h" -#include "elf/d10v.h" -#include "elf/d30v.h" -#include "elf/sh.h" -#include "elf/mn10200.h" -#include "elf/mn10300.h" -#include "elf/hppa.h" -#include "elf/arc.h" -#include "elf/fr30.h" -#include "elf/mcore.h" -#include "elf/i960.h" -#include "elf/pj.h" -#include "elf/avr.h" - -#include "bucomm.h" -#include "getopt.h" - -#ifdef ANSI_PROTOTYPES -#include -#else -#include -#endif - -char * program_name = "readelf"; -unsigned int dynamic_addr; -bfd_size_type dynamic_size; -unsigned int rela_addr; -unsigned int rela_size; -char * dynamic_strings; -char * string_table; -unsigned long num_dynamic_syms; -Elf_Internal_Sym * dynamic_symbols; -Elf_Internal_Syminfo * dynamic_syminfo; -unsigned long dynamic_syminfo_offset; -unsigned int dynamic_syminfo_nent; -char program_interpreter [64]; -int dynamic_info[DT_JMPREL + 1]; -int version_info[16]; -int loadaddr = 0; -Elf_Internal_Ehdr elf_header; -Elf_Internal_Shdr * section_headers; -Elf_Internal_Dyn * dynamic_segment; -int show_name; -int do_dynamic; -int do_syms; -int do_reloc; -int do_sections; -int do_segments; -int do_using_dynamic; -int do_header; -int do_dump; -int do_version; -int do_histogram; -int do_debugging; -int do_debug_info; -int do_debug_abbrevs; -int do_debug_lines; -int do_debug_pubnames; -int do_debug_aranges; -int do_arch; -int do_notes; -int is_32bit_elf; - -/* A dynamic array of flags indicating which sections require dumping. */ -char * dump_sects = NULL; -unsigned int num_dump_sects = 0; - -#define HEX_DUMP (1 << 0) -#define DISASS_DUMP (1 << 1) -#define DEBUG_DUMP (1 << 2) - -/* How to rpint a vma value. */ -typedef enum print_mode -{ - HEX, - DEC, - DEC_5, - UNSIGNED, - PREFIX_HEX, - FULL_HEX, - LONG_HEX -} -print_mode; - -/* Forward declarations for dumb compilers. */ -static void print_vma PARAMS ((bfd_vma, print_mode)); -static bfd_vma (* byte_get) PARAMS ((unsigned char *, int)); -static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int)); -static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int)); -static const char * get_mips_dynamic_type PARAMS ((unsigned long)); -static const char * get_sparc64_dynamic_type PARAMS ((unsigned long)); -static const char * get_parisc_dynamic_type PARAMS ((unsigned long)); -static const char * get_dynamic_type PARAMS ((unsigned long)); -static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int)); -static char * get_file_type PARAMS ((unsigned)); -static char * get_machine_name PARAMS ((unsigned)); -static void decode_ARM_machine_flags PARAMS ((unsigned, char [])); -static char * get_machine_flags PARAMS ((unsigned, unsigned)); -static const char * get_mips_segment_type PARAMS ((unsigned long)); -static const char * get_parisc_segment_type PARAMS ((unsigned long)); -static const char * get_segment_type PARAMS ((unsigned long)); -static const char * get_mips_section_type_name PARAMS ((unsigned int)); -static const char * get_parisc_section_type_name PARAMS ((unsigned int)); -static const char * get_section_type_name PARAMS ((unsigned int)); -static const char * get_symbol_binding PARAMS ((unsigned int)); -static const char * get_symbol_type PARAMS ((unsigned int)); -static const char * get_symbol_visibility PARAMS ((unsigned int)); -static const char * get_symbol_index_type PARAMS ((unsigned int)); -static const char * get_dynamic_flags PARAMS ((bfd_vma)); -static void usage PARAMS ((void)); -static void parse_args PARAMS ((int, char **)); -static int process_file_header PARAMS ((void)); -static int process_program_headers PARAMS ((FILE *)); -static int process_section_headers PARAMS ((FILE *)); -static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *)); -static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *)); -static int process_dynamic_segment PARAMS ((FILE *)); -static int process_symbol_table PARAMS ((FILE *)); -static int process_section_contents PARAMS ((FILE *)); -static void process_file PARAMS ((char *)); -static int process_relocs PARAMS ((FILE *)); -static int process_version_sections PARAMS ((FILE *)); -static char * get_ver_flags PARAMS ((unsigned int)); -static int get_32bit_section_headers PARAMS ((FILE *)); -static int get_64bit_section_headers PARAMS ((FILE *)); -static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *)); -static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *)); -static int get_file_header PARAMS ((FILE *)); -static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long)); -static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, unsigned long, unsigned long)); -static int * get_dynamic_data PARAMS ((FILE *, unsigned int)); -static int get_32bit_dynamic_segment PARAMS ((FILE *)); -static int get_64bit_dynamic_segment PARAMS ((FILE *)); -#ifdef SUPPORT_DISASSEMBLY -static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *)); -#endif -static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *)); -static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *)); -static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *)); -static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *)); -static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int)); -static int process_extended_line_op PARAMS ((unsigned char *, int, int)); -static void reset_state_machine PARAMS ((int)); -static char * get_TAG_name PARAMS ((unsigned long)); -static char * get_AT_name PARAMS ((unsigned long)); -static char * get_FORM_name PARAMS ((unsigned long)); -static void free_abbrevs PARAMS ((void)); -static void add_abbrev PARAMS ((unsigned long, unsigned long, int)); -static void add_abbrev_attr PARAMS ((unsigned long, unsigned long)); -static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long)); -static unsigned char * display_block PARAMS ((unsigned char *, unsigned long)); -static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long)); -static void request_dump PARAMS ((unsigned int, char)); -static const char * get_elf_class PARAMS ((unsigned char)); -static const char * get_data_encoding PARAMS ((unsigned char)); -static const char * get_osabi_name PARAMS ((unsigned char)); -static int guess_is_rela PARAMS ((unsigned long)); -static char * get_note_type PARAMS ((unsigned int)); -static int process_note PARAMS ((Elf32_Internal_Note *)); -static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma)); -static int process_corefile_note_segments PARAMS ((FILE *)); -static int process_corefile_contents PARAMS ((FILE *)); - -typedef int Elf32_Word; - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif -#define UNKNOWN -1 - -#define SECTION_NAME(X) (string_table + (X)->sh_name) - -#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */ - -#define BYTE_GET(field) byte_get (field, sizeof (field)) - -/* If we can support a 64 bit data type then BFD64 should be defined - and sizeof (bfd_vma) == 8. In this case when translating from an - external 8 byte field to an internal field, we can assume that the - internal field is also 8 bytes wide and so we can extact all the data. - If, however, BFD64 is not defined, then we must assume that the - internal data structure only has 4 byte wide fields that are the - equivalent of the 8 byte wide external counterparts, and so we must - truncate the data. */ -#ifdef BFD64 -#define BYTE_GET8(field) byte_get (field, -8) -#else -#define BYTE_GET8(field) byte_get (field, 8) -#endif - -#define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0])) - -#define GET_DATA_ALLOC(offset, size, var, type, reason) \ - if (fseek (file, offset, SEEK_SET)) \ - { \ - error (_("Unable to seek to start of %s at %x\n"), reason, offset); \ - return 0; \ - } \ - \ - var = (type) malloc (size); \ - \ - if (var == NULL) \ - { \ - error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \ - return 0; \ - } \ - \ - if (fread (var, size, 1, file) != 1) \ - { \ - error (_("Unable to read in %d bytes of %s\n"), size, reason); \ - free (var); \ - var = NULL; \ - return 0; \ - } - - -#define GET_DATA(offset, var, reason) \ - if (fseek (file, offset, SEEK_SET)) \ - { \ - error (_("Unable to seek to %x for %s\n"), offset, reason); \ - return 0; \ - } \ - else if (fread (& var, sizeof (var), 1, file) != 1) \ - { \ - error (_("Unable to read data at %x for %s\n"), offset, reason); \ - return 0; \ - } - -#define GET_ELF_SYMBOLS(file, offset, size) \ - (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \ - : get_64bit_elf_symbols (file, offset, size)) - - -#ifdef ANSI_PROTOTYPES -static void -error (const char * message, ...) -{ - va_list args; - - fprintf (stderr, _("%s: Error: "), program_name); - va_start (args, message); - vfprintf (stderr, message, args); - va_end (args); - return; -} - -static void -warn (const char * message, ...) -{ - va_list args; - - fprintf (stderr, _("%s: Warning: "), program_name); - va_start (args, message); - vfprintf (stderr, message, args); - va_end (args); - return; -} -#else -static void -error (va_alist) - va_dcl -{ - char * message; - va_list args; - - fprintf (stderr, _("%s: Error: "), program_name); - va_start (args); - message = va_arg (args, char *); - vfprintf (stderr, message, args); - va_end (args); - return; -} - -static void -warn (va_alist) - va_dcl -{ - char * message; - va_list args; - - fprintf (stderr, _("%s: Warning: "), program_name); - va_start (args); - message = va_arg (args, char *); - vfprintf (stderr, message, args); - va_end (args); - return; -} -#endif - -static bfd_vma -byte_get_little_endian (field, size) - unsigned char * field; - int size; -{ - switch (size) - { - case 1: - return * field; - - case 2: - return ((unsigned int) (field [0])) - | (((unsigned int) (field [1])) << 8); - - case 8: - /* We want to extract data from an 8 byte wide field and - place it into a 4 byte wide field. Since this is a little - endian source we can juts use the 4 byte extraction code. */ - /* Fall through. */ - case 4: - return ((unsigned long) (field [0])) - | (((unsigned long) (field [1])) << 8) - | (((unsigned long) (field [2])) << 16) - | (((unsigned long) (field [3])) << 24); - -#ifdef BFD64 - case -8: - /* This is a special case, generated by the BYTE_GET8 macro. - It means that we are loading an 8 byte value from a field - in an external structure into an 8 byte value in a field - in an internal strcuture. */ - return ((bfd_vma) (field [0])) - | (((bfd_vma) (field [1])) << 8) - | (((bfd_vma) (field [2])) << 16) - | (((bfd_vma) (field [3])) << 24) - | (((bfd_vma) (field [4])) << 32) - | (((bfd_vma) (field [5])) << 40) - | (((bfd_vma) (field [6])) << 48) - | (((bfd_vma) (field [7])) << 56); -#endif - default: - error (_("Unhandled data length: %d\n"), size); - abort (); - } -} - -/* Print a VMA value. */ -static void -print_vma (vma, mode) - bfd_vma vma; - print_mode mode; -{ -#ifdef BFD64 - if (is_32bit_elf) -#endif - { - switch (mode) - { - case FULL_HEX: printf ("0x"); /* drop through */ - case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break; - case PREFIX_HEX: printf ("0x"); /* drop through */ - case HEX: printf ("%lx", (unsigned long) vma); break; - case DEC: printf ("%ld", (unsigned long) vma); break; - case DEC_5: printf ("%5ld", (long) vma); break; - case UNSIGNED: printf ("%lu", (unsigned long) vma); break; - } - } -#ifdef BFD64 - else - { - switch (mode) - { - case FULL_HEX: - printf ("0x"); - /* drop through */ - - case LONG_HEX: - printf_vma (vma); - break; - - case PREFIX_HEX: - printf ("0x"); - /* drop through */ - - case HEX: -#if BFD_HOST_64BIT_LONG - printf ("%lx", vma); -#else - if (_bfd_int64_high (vma)) - printf ("%lx%lx", _bfd_int64_high (vma), _bfd_int64_low (vma)); - else - printf ("%lx", _bfd_int64_low (vma)); -#endif - break; - - case DEC: -#if BFD_HOST_64BIT_LONG - printf ("%ld", vma); -#else - if (_bfd_int64_high (vma)) - /* ugg */ - printf ("++%ld", _bfd_int64_low (vma)); - else - printf ("%ld", _bfd_int64_low (vma)); -#endif - break; - - case DEC_5: -#if BFD_HOST_64BIT_LONG - printf ("%5ld", vma); -#else - if (_bfd_int64_high (vma)) - /* ugg */ - printf ("++%ld", _bfd_int64_low (vma)); - else - printf ("%5ld", _bfd_int64_low (vma)); -#endif - break; - - case UNSIGNED: -#if BFD_HOST_64BIT_LONG - printf ("%lu", vma); -#else - if (_bfd_int64_high (vma)) - /* ugg */ - printf ("++%lu", _bfd_int64_low (vma)); - else - printf ("%lu", _bfd_int64_low (vma)); -#endif - break; - } - } -#endif -} - -static bfd_vma -byte_get_big_endian (field, size) - unsigned char * field; - int size; -{ - switch (size) - { - case 1: - return * field; - - case 2: - return ((unsigned int) (field [1])) | (((int) (field [0])) << 8); - - case 4: - return ((unsigned long) (field [3])) - | (((unsigned long) (field [2])) << 8) - | (((unsigned long) (field [1])) << 16) - | (((unsigned long) (field [0])) << 24); - - case 8: - /* Although we are extracing data from an 8 byte wide field, we - are returning only 4 bytes of data. */ - return ((unsigned long) (field [7])) - | (((unsigned long) (field [6])) << 8) - | (((unsigned long) (field [5])) << 16) - | (((unsigned long) (field [4])) << 24); - -#ifdef BFD64 - case -8: - /* This is a special case, generated by the BYTE_GET8 macro. - It means that we are loading an 8 byte value from a field - in an external structure into an 8 byte value in a field - in an internal strcuture. */ - return ((bfd_vma) (field [7])) - | (((bfd_vma) (field [6])) << 8) - | (((bfd_vma) (field [5])) << 16) - | (((bfd_vma) (field [4])) << 24) - | (((bfd_vma) (field [3])) << 32) - | (((bfd_vma) (field [2])) << 40) - | (((bfd_vma) (field [1])) << 48) - | (((bfd_vma) (field [0])) << 56); -#endif - - default: - error (_("Unhandled data length: %d\n"), size); - abort (); - } -} - - -/* Guess the relocation sized based on the sized commonly used by the specific machine. */ -static int -guess_is_rela (e_machine) - unsigned long e_machine; -{ - switch (e_machine) - { - /* Targets that use REL relocations. */ - case EM_ARM: - case EM_386: - case EM_486: - case EM_960: - case EM_CYGNUS_M32R: - case EM_CYGNUS_D10V: - case EM_MIPS: - case EM_MIPS_RS4_BE: - return FALSE; - - /* Targets that use RELA relocations. */ - case EM_68K: - case EM_SPARC32PLUS: - case EM_SPARCV9: - case EM_SPARC: - case EM_PPC: - case EM_CYGNUS_V850: - case EM_CYGNUS_D30V: - case EM_CYGNUS_MN10200: - case EM_CYGNUS_MN10300: - case EM_CYGNUS_FR30: - case EM_SH: - case EM_ALPHA: - case EM_MCORE: - return TRUE; - - case EM_MMA: - case EM_PCP: - case EM_NCPU: - case EM_NDR1: - case EM_STARCORE: - case EM_ME16: - case EM_ST100: - case EM_TINYJ: - case EM_FX66: - case EM_ST9PLUS: - case EM_ST7: - case EM_68HC16: - case EM_68HC11: - case EM_68HC08: - case EM_68HC05: - case EM_SVX: - case EM_ST19: - case EM_VAX: - default: - warn (_("Don't know about relocations on this machine architecture\n")); - return FALSE; - } -} - -/* Display the contents of the relocation data found at the specified offset. */ -static int -dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela) - FILE * file; - unsigned long rel_offset; - unsigned long rel_size; - Elf_Internal_Sym * symtab; - unsigned long nsyms; - char * strtab; - int is_rela; -{ - unsigned int i; - Elf_Internal_Rel * rels; - Elf_Internal_Rela * relas; - - - if (is_rela == UNKNOWN) - is_rela = guess_is_rela (elf_header.e_machine); - - if (is_rela) - { - if (is_32bit_elf) - { - Elf32_External_Rela * erelas; - - GET_DATA_ALLOC (rel_offset, rel_size, erelas, - Elf32_External_Rela *, "relocs"); - - rel_size = rel_size / sizeof (Elf32_External_Rela); - - relas = (Elf_Internal_Rela *) - malloc (rel_size * sizeof (Elf_Internal_Rela)); - - if (relas == NULL) - { - error(_("out of memory parsing relocs")); - return 0; - } - - for (i = 0; i < rel_size; i++) - { - relas[i].r_offset = BYTE_GET (erelas[i].r_offset); - relas[i].r_info = BYTE_GET (erelas[i].r_info); - relas[i].r_addend = BYTE_GET (erelas[i].r_addend); - } - - free (erelas); - - rels = (Elf_Internal_Rel *) relas; - } - else - { - Elf64_External_Rela * erelas; - - GET_DATA_ALLOC (rel_offset, rel_size, erelas, - Elf64_External_Rela *, "relocs"); - - rel_size = rel_size / sizeof (Elf64_External_Rela); - - relas = (Elf_Internal_Rela *) - malloc (rel_size * sizeof (Elf_Internal_Rela)); - - if (relas == NULL) - { - error(_("out of memory parsing relocs")); - return 0; - } - - for (i = 0; i < rel_size; i++) - { - relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset); - relas[i].r_info = BYTE_GET8 (erelas[i].r_info); - relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend); - } - - free (erelas); - - rels = (Elf_Internal_Rel *) relas; - } - } - else - { - if (is_32bit_elf) - { - Elf32_External_Rel * erels; - - GET_DATA_ALLOC (rel_offset, rel_size, erels, - Elf32_External_Rel *, "relocs"); - - rel_size = rel_size / sizeof (Elf32_External_Rel); - - rels = (Elf_Internal_Rel *) - malloc (rel_size * sizeof (Elf_Internal_Rel)); - - if (rels == NULL) - { - error(_("out of memory parsing relocs")); - return 0; - } - - for (i = 0; i < rel_size; i++) - { - rels[i].r_offset = BYTE_GET (erels[i].r_offset); - rels[i].r_info = BYTE_GET (erels[i].r_info); - } - - free (erels); - - relas = (Elf_Internal_Rela *) rels; - } - else - { - Elf64_External_Rel * erels; - - GET_DATA_ALLOC (rel_offset, rel_size, erels, - Elf64_External_Rel *, "relocs"); - - rel_size = rel_size / sizeof (Elf64_External_Rel); - - rels = (Elf_Internal_Rel *) - malloc (rel_size * sizeof (Elf_Internal_Rel)); - - if (rels == NULL) - { - error(_("out of memory parsing relocs")); - return 0; - } - - for (i = 0; i < rel_size; i++) - { - rels[i].r_offset = BYTE_GET8 (erels[i].r_offset); - rels[i].r_info = BYTE_GET8 (erels[i].r_info); - } - - free (erels); - - relas = (Elf_Internal_Rela *) rels; - } - } - - if (is_rela) - printf - (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n")); - else - printf - (_(" Offset Info Type Symbol's Value Symbol's Name\n")); - - for (i = 0; i < rel_size; i++) - { - const char * rtype; - bfd_vma offset; - bfd_vma info; - bfd_vma symtab_index; - bfd_vma type; - - if (is_rela) - { - offset = relas [i].r_offset; - info = relas [i].r_info; - } - else - { - offset = rels [i].r_offset; - info = rels [i].r_info; - } - - if (is_32bit_elf) - { - type = ELF32_R_TYPE (info); - symtab_index = ELF32_R_SYM (info); - } - else - { - if (elf_header.e_machine == EM_SPARCV9) - type = ELF64_R_TYPE_ID (info); - else - type = ELF64_R_TYPE (info); - /* The #ifdef BFD64 below is to prevent a compile time warning. - We know that if we do not have a 64 bit data type that we - will never execute this code anyway. */ -#ifdef BFD64 - symtab_index = ELF64_R_SYM (info); -#endif - } - -#ifdef _bfd_int64_low - printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset), _bfd_int64_low (info)); -#else - printf (" %8.8lx %5.5lx ", offset, info); -#endif - - switch (elf_header.e_machine) - { - default: - rtype = NULL; - break; - - case EM_CYGNUS_M32R: - rtype = elf_m32r_reloc_type (type); - break; - - case EM_386: - case EM_486: - rtype = elf_i386_reloc_type (type); - break; - - case EM_68K: - rtype = elf_m68k_reloc_type (type); - break; - - case EM_960: - rtype = elf_i960_reloc_type (type); - break; - - case EM_AVR: - rtype = elf_avr_reloc_type (type); - break; - - case EM_OLD_SPARCV9: - case EM_SPARC32PLUS: - case EM_SPARCV9: - case EM_SPARC: - rtype = elf_sparc_reloc_type (type); - break; - - case EM_CYGNUS_V850: - rtype = v850_reloc_type (type); - break; - - case EM_CYGNUS_D10V: - rtype = elf_d10v_reloc_type (type); - break; - - case EM_CYGNUS_D30V: - rtype = elf_d30v_reloc_type (type); - break; - - case EM_SH: - rtype = elf_sh_reloc_type (type); - break; - - case EM_CYGNUS_MN10300: - rtype = elf_mn10300_reloc_type (type); - break; - - case EM_CYGNUS_MN10200: - rtype = elf_mn10200_reloc_type (type); - break; - - case EM_CYGNUS_FR30: - rtype = elf_fr30_reloc_type (type); - break; - - case EM_MCORE: - rtype = elf_mcore_reloc_type (type); - break; - - case EM_PPC: - rtype = elf_ppc_reloc_type (type); - break; - - case EM_MIPS: - case EM_MIPS_RS4_BE: - rtype = elf_mips_reloc_type (type); - break; - - case EM_ALPHA: - rtype = elf_alpha_reloc_type (type); - break; - - case EM_ARM: - rtype = elf_arm_reloc_type (type); - break; - - case EM_CYGNUS_ARC: - rtype = elf_arc_reloc_type (type); - break; - - case EM_PARISC: - rtype = elf_hppa_reloc_type (type); - break; - - case EM_PJ: - rtype = elf_pj_reloc_type (type); - break; - } - - if (rtype == NULL) -#ifdef _bfd_int64_low - printf (_("unrecognised: %-7lx"), _bfd_int64_low (type)); -#else - printf (_("unrecognised: %-7lx"), type); -#endif - else - printf ("%-21.21s", rtype); - - if (symtab_index) - { - if (symtab != NULL) - { - if (symtab_index >= nsyms) - printf (" bad symbol index: %08lx", (unsigned long) symtab_index); - else - { - Elf_Internal_Sym * psym; - - psym = symtab + symtab_index; - - printf (" "); - print_vma (psym->st_value, LONG_HEX); - printf (" "); - - if (psym->st_name == 0) - printf ("%-25.25s", - SECTION_NAME (section_headers + psym->st_shndx)); - else if (strtab == NULL) - printf (_(""), psym->st_name); - else - printf ("%-25.25s", strtab + psym->st_name); - - if (is_rela) - printf (" + %lx", (unsigned long) relas [i].r_addend); - } - } - } - else if (is_rela) - { - printf ("%*c", is_32bit_elf ? 34 : 26, ' '); - print_vma (relas[i].r_addend, LONG_HEX); - } - - if (elf_header.e_machine == EM_SPARCV9 - && !strcmp (rtype, "R_SPARC_OLO10")) - printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info)); - - putchar ('\n'); - } - - free (relas); - - return 1; -} - -static const char * -get_mips_dynamic_type (type) - unsigned long type; -{ - switch (type) - { - case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION"; - case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP"; - case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM"; - case DT_MIPS_IVERSION: return "MIPS_IVERSION"; - case DT_MIPS_FLAGS: return "MIPS_FLAGS"; - case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS"; - case DT_MIPS_MSYM: return "MIPS_MSYM"; - case DT_MIPS_CONFLICT: return "MIPS_CONFLICT"; - case DT_MIPS_LIBLIST: return "MIPS_LIBLIST"; - case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO"; - case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO"; - case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO"; - case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO"; - case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO"; - case DT_MIPS_GOTSYM: return "MIPS_GOTSYM"; - case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO"; - case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP"; - case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS"; - case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO"; - case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE"; - case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO"; - case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC"; - case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO"; - case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM"; - case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO"; - case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM"; - case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO"; - case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS"; - case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT"; - case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB"; - case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX"; - case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX"; - case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX"; - case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX"; - case DT_MIPS_OPTIONS: return "MIPS_OPTIONS"; - case DT_MIPS_INTERFACE: return "MIPS_INTERFACE"; - case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN"; - case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE"; - case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR"; - case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX"; - case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE"; - case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE"; - case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC"; - default: - return NULL; - } -} - -static const char * -get_sparc64_dynamic_type (type) - unsigned long type; -{ - switch (type) - { - case DT_SPARC_REGISTER: return "SPARC_REGISTER"; - default: - return NULL; - } -} - -static const char * -get_parisc_dynamic_type (type) - unsigned long type; -{ - switch (type) - { - case DT_HP_LOAD_MAP: return "HP_LOAD_MAP"; - case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS"; - case DT_HP_DLD_HOOK: return "HP_DLD_HOOK"; - case DT_HP_UX10_INIT: return "HP_UX10_INIT"; - case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ"; - case DT_HP_PREINIT: return "HP_PREINIT"; - case DT_HP_PREINITSZ: return "HP_PREINITSZ"; - case DT_HP_NEEDED: return "HP_NEEDED"; - case DT_HP_TIME_STAMP: return "HP_TIME_STAMP"; - case DT_HP_CHECKSUM: return "HP_CHECKSUM"; - case DT_HP_GST_SIZE: return "HP_GST_SIZE"; - case DT_HP_GST_VERSION: return "HP_GST_VERSION"; - case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL"; - default: - return NULL; - } -} - -static const char * -get_dynamic_type (type) - unsigned long type; -{ - static char buff [32]; - - switch (type) - { - case DT_NULL: return "NULL"; - case DT_NEEDED: return "NEEDED"; - case DT_PLTRELSZ: return "PLTRELSZ"; - case DT_PLTGOT: return "PLTGOT"; - case DT_HASH: return "HASH"; - case DT_STRTAB: return "STRTAB"; - case DT_SYMTAB: return "SYMTAB"; - case DT_RELA: return "RELA"; - case DT_RELASZ: return "RELASZ"; - case DT_RELAENT: return "RELAENT"; - case DT_STRSZ: return "STRSZ"; - case DT_SYMENT: return "SYMENT"; - case DT_INIT: return "INIT"; - case DT_FINI: return "FINI"; - case DT_SONAME: return "SONAME"; - case DT_RPATH: return "RPATH"; - case DT_SYMBOLIC: return "SYMBOLIC"; - case DT_REL: return "REL"; - case DT_RELSZ: return "RELSZ"; - case DT_RELENT: return "RELENT"; - case DT_PLTREL: return "PLTREL"; - case DT_DEBUG: return "DEBUG"; - case DT_TEXTREL: return "TEXTREL"; - case DT_JMPREL: return "JMPREL"; - case DT_BIND_NOW: return "BIND_NOW"; - case DT_INIT_ARRAY: return "INIT_ARRAY"; - case DT_FINI_ARRAY: return "FINI_ARRAY"; - case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ"; - case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ"; - case DT_RUNPATH: return "RUNPATH"; - case DT_FLAGS: return "FLAGS"; - - case DT_PREINIT_ARRAY: return "PREINIT_ARRAY"; - case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ"; - - case DT_PLTPADSZ: return "PLTPADSZ"; - case DT_MOVEENT: return "MOVEENT"; - case DT_MOVESZ: return "MOVESZ"; - case DT_FEATURE_1: return "FEATURE_1"; - case DT_POSFLAG_1: return "POSFLAG_1"; - case DT_SYMINSZ: return "SYMINSZ"; - case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */ - - case DT_ADDRRNGLO: return "ADDRRNGLO"; - case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */ - - case DT_VERSYM: return "VERSYM"; - - case DT_RELACOUNT: return "RELACOUNT"; - case DT_RELCOUNT: return "RELCOUNT"; - case DT_FLAGS_1: return "FLAGS_1"; - case DT_VERDEF: return "VERDEF"; - case DT_VERDEFNUM: return "VERDEFNUM"; - case DT_VERNEED: return "VERNEED"; - case DT_VERNEEDNUM: return "VERNEEDNUM"; - - case DT_AUXILIARY: return "AUXILARY"; - case DT_USED: return "USED"; - case DT_FILTER: return "FILTER"; - - default: - if ((type >= DT_LOPROC) && (type <= DT_HIPROC)) - { - const char * result; - - switch (elf_header.e_machine) - { - case EM_MIPS: - case EM_MIPS_RS4_BE: - result = get_mips_dynamic_type (type); - break; - case EM_SPARCV9: - result = get_sparc64_dynamic_type (type); - break; - default: - result = NULL; - break; - } - - if (result != NULL) - return result; - - sprintf (buff, _("Processor Specific: %lx"), type); - } - else if ((type >= DT_LOOS) && (type <= DT_HIOS)) - { - const char * result; - - switch (elf_header.e_machine) - { - case EM_PARISC: - result = get_parisc_dynamic_type (type); - break; - default: - result = NULL; - break; - } - - if (result != NULL) - return result; - - sprintf (buff, _("Operating System specific: %lx"), type); - } - else - sprintf (buff, _(": %lx"), type); - - return buff; - } -} - -static char * -get_file_type (e_type) - unsigned e_type; -{ - static char buff [32]; - - switch (e_type) - { - case ET_NONE: return _("NONE (None)"); - case ET_REL: return _("REL (Relocatable file)"); - case ET_EXEC: return _("EXEC (Executable file)"); - case ET_DYN: return _("DYN (Shared object file)"); - case ET_CORE: return _("CORE (Core file)"); - - default: - if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC)) - sprintf (buff, _("Processor Specific: (%x)"), e_type); - else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS)) - sprintf (buff, _("OS Specific: (%x)"), e_type); - else - sprintf (buff, _(": %x"), e_type); - return buff; - } -} - -static char * -get_machine_name (e_machine) - unsigned e_machine; -{ - static char buff [64]; /* XXX */ - - switch (e_machine) - { - case EM_NONE: return _("None"); - case EM_M32: return "WE32100"; - case EM_SPARC: return "Sparc"; - case EM_386: return "Intel 80386"; - case EM_68K: return "MC68000"; - case EM_88K: return "MC88000"; - case EM_486: return "Intel 80486"; - case EM_860: return "Intel 80860"; - case EM_MIPS: return "MIPS R3000"; - case EM_S370: return "IBM System/370"; - case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian"; - case EM_OLD_SPARCV9: return "Sparc v9 (old)"; - case EM_PARISC: return "HPPA"; - case EM_PPC_OLD: return "Power PC (old)"; - case EM_SPARC32PLUS: return "Sparc v8+" ; - case EM_960: return "Intel 90860"; - case EM_PPC: return "PowerPC"; - case EM_V800: return "NEC V800"; - case EM_FR20: return "Fujitsu FR20"; - case EM_RH32: return "TRW RH32"; - case EM_MCORE: return "MCORE"; - case EM_ARM: return "ARM"; - case EM_OLD_ALPHA: return "Digital Alpha (old)"; - case EM_SH: return "Hitachi SH"; - case EM_SPARCV9: return "Sparc v9"; - case EM_TRICORE: return "Siemens Tricore"; - case EM_ARC: return "Argonaut RISC Core"; - case EM_H8_300: return "Hitachi H8/300"; - case EM_H8_300H: return "Hitachi H8/300H"; - case EM_H8S: return "Hitachi H8S"; - case EM_H8_500: return "Hitachi H8/500"; - case EM_IA_64: return "Intel IA-64"; - case EM_MIPS_X: return "Stanford MIPS-X"; - case EM_COLDFIRE: return "Motorola Coldfire"; - case EM_68HC12: return "Motorola M68HC12"; - case EM_ALPHA: return "Alpha"; - case EM_CYGNUS_D10V: return "d10v"; - case EM_CYGNUS_D30V: return "d30v"; - case EM_CYGNUS_ARC: return "Arc"; - case EM_CYGNUS_M32R: return "Mitsubishi M32r"; - case EM_CYGNUS_V850: return "NEC v850"; - case EM_CYGNUS_MN10300: return "mn10300"; - case EM_CYGNUS_MN10200: return "mn10200"; - case EM_CYGNUS_FR30: return "Fujitsu FR30"; - case EM_PJ: return "picoJava"; - case EM_MMA: return "Fujitsu Multimedia Accelerator"; - case EM_PCP: return "Siemens PCP"; - case EM_NCPU: return "Sony nCPU embedded RISC processor"; - case EM_NDR1: return "Denso NDR1 microprocesspr"; - case EM_STARCORE: return "Motorola Star*Core processor"; - case EM_ME16: return "Toyota ME16 processor"; - case EM_ST100: return "STMicroelectronics ST100 processor"; - case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor"; - case EM_FX66: return "Siemens FX66 microcontroller"; - case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller"; - case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller"; - case EM_68HC16: return "Motorola MC68HC16 Microcontroller"; - case EM_68HC11: return "Motorola MC68HC11 Microcontroller"; - case EM_68HC08: return "Motorola MC68HC08 Microcontroller"; - case EM_68HC05: return "Motorola MC68HC05 Microcontroller"; - case EM_SVX: return "Silicon Graphics SVx"; - case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller"; - case EM_VAX: return "Digital VAX"; - case EM_AVR: return "AVR"; - default: - sprintf (buff, _(": %x"), e_machine); - return buff; - } -} - -static void -decode_ARM_machine_flags (e_flags, buf) - unsigned e_flags; - char buf[]; -{ - unsigned eabi; - int unknown = 0; - - eabi = EF_ARM_EABI_VERSION (e_flags); - e_flags &= ~ EF_ARM_EABIMASK; - - /* Handle "generic" ARM flags. */ - if (e_flags & EF_ARM_RELEXEC) - { - strcat (buf, ", relocatable executable"); - e_flags &= ~ EF_ARM_RELEXEC; - } - - if (e_flags & EF_ARM_HASENTRY) - { - strcat (buf, ", has entry point"); - e_flags &= ~ EF_ARM_HASENTRY; - } - - /* Now handle EABI specific flags. */ - switch (eabi) - { - default: - strcat (buf, ", "); - if (e_flags) - unknown = 1; - break; - - case EF_ARM_EABI_VER1: - while (e_flags) - { - unsigned flag; - - /* Process flags one bit at a time. */ - flag = e_flags & - e_flags; - e_flags &= ~ flag; - - switch (flag) - { - case EF_ARM_SYMSARESORTED: /* Conflicts with EF_INTERWORK. */ - strcat (buf, ", sorted symbol tables"); - break; - - default: - unknown = 1; - break; - } - } - break; - - case EF_ARM_EABI_UNKNOWN: - while (e_flags) - { - unsigned flag; - - /* Process flags one bit at a time. */ - flag = e_flags & - e_flags; - e_flags &= ~ flag; - - switch (flag) - { - case EF_INTERWORK: - strcat (buf, ", interworking enabled"); - break; - - case EF_APCS_26: - strcat (buf, ", uses APCS/26"); - break; - - case EF_APCS_FLOAT: - strcat (buf, ", uses APCS/float"); - break; - - case EF_PIC: - strcat (buf, ", position independent"); - break; - - case EF_ALIGN8: - strcat (buf, ", 8 bit structure alignment"); - break; - - case EF_NEW_ABI: - strcat (buf, ", uses new ABI"); - break; - - case EF_OLD_ABI: - strcat (buf, ", uses old ABI"); - break; - - case EF_SOFT_FLOAT: - strcat (buf, ", software FP"); - break; - - default: - unknown = 1; - break; - } - } - } - - if (unknown) - strcat (buf,", "); -} - -static char * -get_machine_flags (e_flags, e_machine) - unsigned e_flags; - unsigned e_machine; -{ - static char buf [1024]; - - buf[0] = '\0'; - - if (e_flags) - { - switch (e_machine) - { - default: - break; - - case EM_ARM: - decode_ARM_machine_flags (e_flags, buf); - break; - - case EM_68K: - if (e_flags & EF_CPU32) - strcat (buf, ", cpu32"); - break; - - case EM_PPC: - if (e_flags & EF_PPC_EMB) - strcat (buf, ", emb"); - - if (e_flags & EF_PPC_RELOCATABLE) - strcat (buf, ", relocatable"); - - if (e_flags & EF_PPC_RELOCATABLE_LIB) - strcat (buf, ", relocatable-lib"); - break; - - case EM_CYGNUS_V850: - switch (e_flags & EF_V850_ARCH) - { - case E_V850E_ARCH: - strcat (buf, ", v850e"); - break; - case E_V850EA_ARCH: - strcat (buf, ", v850ea"); - break; - case E_V850_ARCH: - strcat (buf, ", v850"); - break; - default: - strcat (buf, ", unknown v850 architecture variant"); - break; - } - break; - - case EM_CYGNUS_M32R: - if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH) - strcat (buf, ", m32r"); - - break; - - case EM_MIPS: - case EM_MIPS_RS4_BE: - if (e_flags & EF_MIPS_NOREORDER) - strcat (buf, ", noreorder"); - - if (e_flags & EF_MIPS_PIC) - strcat (buf, ", pic"); - - if (e_flags & EF_MIPS_CPIC) - strcat (buf, ", cpic"); - - if (e_flags & EF_MIPS_ABI2) - strcat (buf, ", abi2"); - - if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1) - strcat (buf, ", mips1"); - - if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2) - strcat (buf, ", mips2"); - - if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3) - strcat (buf, ", mips3"); - - if ((e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4) - strcat (buf, ", mips4"); - break; - - case EM_SPARCV9: - if (e_flags & EF_SPARC_32PLUS) - strcat (buf, ", v8+"); - - if (e_flags & EF_SPARC_SUN_US1) - strcat (buf, ", ultrasparcI"); - - if (e_flags & EF_SPARC_SUN_US3) - strcat (buf, ", ultrasparcIII"); - - if (e_flags & EF_SPARC_HAL_R1) - strcat (buf, ", halr1"); - - if (e_flags & EF_SPARC_LEDATA) - strcat (buf, ", ledata"); - - if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO) - strcat (buf, ", tso"); - - if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO) - strcat (buf, ", pso"); - - if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO) - strcat (buf, ", rmo"); - break; - - case EM_PARISC: - switch (e_flags & EF_PARISC_ARCH) - { - case EFA_PARISC_1_0: - strcpy (buf, ", PA-RISC 1.0"); - break; - case EFA_PARISC_1_1: - strcpy (buf, ", PA-RISC 1.1"); - break; - case EFA_PARISC_2_0: - strcpy (buf, ", PA-RISC 2.0"); - break; - default: - break; - } - if (e_flags & EF_PARISC_TRAPNIL) - strcat (buf, ", trapnil"); - if (e_flags & EF_PARISC_EXT) - strcat (buf, ", ext"); - if (e_flags & EF_PARISC_LSB) - strcat (buf, ", lsb"); - if (e_flags & EF_PARISC_WIDE) - strcat (buf, ", wide"); - if (e_flags & EF_PARISC_NO_KABP) - strcat (buf, ", no kabp"); - if (e_flags & EF_PARISC_LAZYSWAP) - strcat (buf, ", lazyswap"); - break; - - case EM_PJ: - if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS) - strcat (buf, ", new calling convention"); - - if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS) - strcat (buf, ", gnu calling convention"); - break; - } - } - - return buf; -} - -static const char * -get_mips_segment_type (type) - unsigned long type; -{ - switch (type) - { - case PT_MIPS_REGINFO: - return "REGINFO"; - case PT_MIPS_RTPROC: - return "RTPROC"; - case PT_MIPS_OPTIONS: - return "OPTIONS"; - default: - break; - } - - return NULL; -} - -static const char * -get_parisc_segment_type (type) - unsigned long type; -{ - switch (type) - { - case PT_HP_TLS: return "HP_TLS"; - case PT_HP_CORE_NONE: return "HP_CORE_NONE"; - case PT_HP_CORE_VERSION: return "HP_CORE_VERSION"; - case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL"; - case PT_HP_CORE_COMM: return "HP_CORE_COMM"; - case PT_HP_CORE_PROC: return "HP_CORE_PROC"; - case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE"; - case PT_HP_CORE_STACK: return "HP_CORE_STACK"; - case PT_HP_CORE_SHM: return "HP_CORE_SHM"; - case PT_HP_CORE_MMF: return "HP_CORE_MMF"; - case PT_HP_PARALLEL: return "HP_PARALLEL"; - case PT_HP_FASTBIND: return "HP_FASTBIND"; - case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT"; - case PT_PARISC_UNWIND: return "PARISC_UNWIND"; - default: - break; - } - - return NULL; -} - -static const char * -get_segment_type (p_type) - unsigned long p_type; -{ - static char buff [32]; - - switch (p_type) - { - case PT_NULL: return "NULL"; - case PT_LOAD: return "LOAD"; - case PT_DYNAMIC: return "DYNAMIC"; - case PT_INTERP: return "INTERP"; - case PT_NOTE: return "NOTE"; - case PT_SHLIB: return "SHLIB"; - case PT_PHDR: return "PHDR"; - - default: - if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC)) - { - const char * result; - - switch (elf_header.e_machine) - { - case EM_MIPS: - case EM_MIPS_RS4_BE: - result = get_mips_segment_type (p_type); - break; - case EM_PARISC: - result = get_parisc_segment_type (p_type); - break; - default: - result = NULL; - break; - } - - if (result != NULL) - return result; - - sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC); - } - else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS)) - { - const char * result; - - switch (elf_header.e_machine) - { - case EM_PARISC: - result = get_parisc_segment_type (p_type); - break; - default: - result = NULL; - break; - } - - if (result != NULL) - return result; - - sprintf (buff, "LOOS+%lx", p_type - PT_LOOS); - } - else - sprintf (buff, _(": %lx"), p_type); - - return buff; - } -} - -static const char * -get_mips_section_type_name (sh_type) - unsigned int sh_type; -{ - switch (sh_type) - { - case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST"; - case SHT_MIPS_MSYM: return "MIPS_MSYM"; - case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT"; - case SHT_MIPS_GPTAB: return "MIPS_GPTAB"; - case SHT_MIPS_UCODE: return "MIPS_UCODE"; - case SHT_MIPS_DEBUG: return "MIPS_DEBUG"; - case SHT_MIPS_REGINFO: return "MIPS_REGINFO"; - case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE"; - case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM"; - case SHT_MIPS_RELD: return "MIPS_RELD"; - case SHT_MIPS_IFACE: return "MIPS_IFACE"; - case SHT_MIPS_CONTENT: return "MIPS_CONTENT"; - case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS"; - case SHT_MIPS_SHDR: return "MIPS_SHDR"; - case SHT_MIPS_FDESC: return "MIPS_FDESC"; - case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM"; - case SHT_MIPS_DENSE: return "MIPS_DENSE"; - case SHT_MIPS_PDESC: return "MIPS_PDESC"; - case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM"; - case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM"; - case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM"; - case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR"; - case SHT_MIPS_LINE: return "MIPS_LINE"; - case SHT_MIPS_RFDESC: return "MIPS_RFDESC"; - case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM"; - case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST"; - case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS"; - case SHT_MIPS_DWARF: return "MIPS_DWARF"; - case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL"; - case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB"; - case SHT_MIPS_EVENTS: return "MIPS_EVENTS"; - case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE"; - case SHT_MIPS_PIXIE: return "MIPS_PIXIE"; - case SHT_MIPS_XLATE: return "MIPS_XLATE"; - case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG"; - case SHT_MIPS_WHIRL: return "MIPS_WHIRL"; - case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION"; - case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD"; - case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION"; - default: - break; - } - return NULL; -} - -static const char * -get_parisc_section_type_name (sh_type) - unsigned int sh_type; -{ - switch (sh_type) - { - case SHT_PARISC_EXT: return "PARISC_EXT"; - case SHT_PARISC_UNWIND: return "PARISC_UNWIND"; - case SHT_PARISC_DOC: return "PARISC_DOC"; - default: - break; - } - return NULL; -} - -static const char * -get_section_type_name (sh_type) - unsigned int sh_type; -{ - static char buff [32]; - - switch (sh_type) - { - case SHT_NULL: return "NULL"; - case SHT_PROGBITS: return "PROGBITS"; - case SHT_SYMTAB: return "SYMTAB"; - case SHT_STRTAB: return "STRTAB"; - case SHT_RELA: return "RELA"; - case SHT_HASH: return "HASH"; - case SHT_DYNAMIC: return "DYNAMIC"; - case SHT_NOTE: return "NOTE"; - case SHT_NOBITS: return "NOBITS"; - case SHT_REL: return "REL"; - case SHT_SHLIB: return "SHLIB"; - case SHT_DYNSYM: return "DYNSYM"; - case SHT_INIT_ARRAY: return "INIT_ARRAY"; - case SHT_FINI_ARRAY: return "FINI_ARRAY"; - case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY"; - case SHT_GNU_verdef: return "VERDEF"; - case SHT_GNU_verneed: return "VERNEED"; - case SHT_GNU_versym: return "VERSYM"; - case 0x6ffffff0: return "VERSYM"; - case 0x6ffffffc: return "VERDEF"; - case 0x7ffffffd: return "AUXILIARY"; - case 0x7fffffff: return "FILTER"; - - default: - if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC)) - { - const char * result; - - switch (elf_header.e_machine) - { - case EM_MIPS: - case EM_MIPS_RS4_BE: - result = get_mips_section_type_name (sh_type); - break; - case EM_PARISC: - result = get_parisc_section_type_name (sh_type); - break; - default: - result = NULL; - break; - } - - if (result != NULL) - return result; - - sprintf (buff, "SHT_LOPROC+%x", sh_type - SHT_LOPROC); - } - else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS)) - sprintf (buff, "SHT_LOOS+%x", sh_type - SHT_LOOS); - else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER)) - sprintf (buff, "SHT_LOUSER+%x", sh_type - SHT_LOUSER); - else - sprintf (buff, _(": %x"), sh_type); - - return buff; - } -} - -struct option options [] = -{ - {"all", no_argument, 0, 'a'}, - {"file-header", no_argument, 0, 'h'}, - {"program-headers", no_argument, 0, 'l'}, - {"headers", no_argument, 0, 'e'}, - {"histogram", no_argument, 0, 'I'}, - {"segments", no_argument, 0, 'l'}, - {"sections", no_argument, 0, 'S'}, - {"section-headers", no_argument, 0, 'S'}, - {"symbols", no_argument, 0, 's'}, - {"syms", no_argument, 0, 's'}, - {"relocs", no_argument, 0, 'r'}, - {"notes", no_argument, 0, 'n'}, - {"dynamic", no_argument, 0, 'd'}, - {"arch-specific", no_argument, 0, 'A'}, - {"version-info", no_argument, 0, 'V'}, - {"use-dynamic", no_argument, 0, 'D'}, - {"hex-dump", required_argument, 0, 'x'}, - {"debug-dump", optional_argument, 0, 'w'}, -#ifdef SUPPORT_DISASSEMBLY - {"instruction-dump", required_argument, 0, 'i'}, -#endif - - {"version", no_argument, 0, 'v'}, - {"help", no_argument, 0, 'H'}, - {0, no_argument, 0, 0} -}; - -static void -usage () -{ - fprintf (stdout, _("Usage: readelf {options} elf-file(s)\n")); - fprintf (stdout, _(" Options are:\n")); - fprintf (stdout, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n")); - fprintf (stdout, _(" -h or --file-header Display the ELF file header\n")); - fprintf (stdout, _(" -l or --program-headers or --segments\n")); - fprintf (stdout, _(" Display the program headers\n")); - fprintf (stdout, _(" -S or --section-headers or --sections\n")); - fprintf (stdout, _(" Display the sections' header\n")); - fprintf (stdout, _(" -e or --headers Equivalent to: -h -l -S\n")); - fprintf (stdout, _(" -s or --syms or --symbols Display the symbol table\n")); - fprintf (stdout, _(" -n or --notes Display the core notes (if present)\n")); - fprintf (stdout, _(" -r or --relocs Display the relocations (if present)\n")); - fprintf (stdout, _(" -d or --dynamic Display the dynamic segment (if present)\n")); - fprintf (stdout, _(" -V or --version-info Display the version sections (if present)\n")); - fprintf (stdout, _(" -A or --arch-specific Display architecture specific information (if any).\n")); - fprintf (stdout, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n")); - fprintf (stdout, _(" -x or --hex-dump=\n")); - fprintf (stdout, _(" Dump the contents of section \n")); - fprintf (stdout, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n")); - fprintf (stdout, _(" Display the contents of DWARF2 debug sections\n")); -#ifdef SUPPORT_DISASSEMBLY - fprintf (stdout, _(" -i or --instruction-dump=\n")); - fprintf (stdout, _(" Disassemble the contents of section \n")); -#endif - fprintf (stdout, _(" -I or --histogram Display histogram of bucket list lengths\n")); - fprintf (stdout, _(" -v or --version Display the version number of readelf\n")); - fprintf (stdout, _(" -H or --help Display this information\n")); - fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO); - - exit (0); -} - -static void -request_dump (section, type) - unsigned int section; - char type; -{ - if (section >= num_dump_sects) - { - char * new_dump_sects; - - new_dump_sects = (char *) calloc (section + 1, 1); - - if (new_dump_sects == NULL) - error (_("Out of memory allocating dump request table.")); - else - { - /* Copy current flag settings. */ - memcpy (new_dump_sects, dump_sects, num_dump_sects); - - free (dump_sects); - - dump_sects = new_dump_sects; - num_dump_sects = section + 1; - } - } - - if (dump_sects) - dump_sects [section] |= type; - - return; -} - -static void -parse_args (argc, argv) - int argc; - char ** argv; -{ - int c; - - if (argc < 2) - usage (); - - while ((c = getopt_long - (argc, argv, "ersahnldSDAIw::x:i:vV", options, NULL)) != EOF) - { - char * cp; - int section; - - switch (c) - { - case 0: - /* Long options. */ - break; - case 'H': - usage (); - break; - - case 'a': - do_syms ++; - do_reloc ++; - do_dynamic ++; - do_header ++; - do_sections ++; - do_segments ++; - do_version ++; - do_histogram ++; - do_arch ++; - do_notes ++; - break; - case 'e': - do_header ++; - do_sections ++; - do_segments ++; - break; - case 'A': - do_arch ++; - break; - case 'D': - do_using_dynamic ++; - break; - case 'r': - do_reloc ++; - break; - case 'h': - do_header ++; - break; - case 'l': - do_segments ++; - break; - case 's': - do_syms ++; - break; - case 'S': - do_sections ++; - break; - case 'd': - do_dynamic ++; - break; - case 'I': - do_histogram ++; - break; - case 'n': - do_notes ++; - break; - case 'x': - do_dump ++; - section = strtoul (optarg, & cp, 0); - if (! * cp && section >= 0) - { - request_dump (section, HEX_DUMP); - break; - } - goto oops; - case 'w': - do_dump ++; - if (optarg == 0) - do_debugging = 1; - else - { - do_debugging = 0; - switch (optarg[0]) - { - case 'i': - case 'I': - do_debug_info = 1; - break; - - case 'a': - case 'A': - do_debug_abbrevs = 1; - break; - - case 'l': - case 'L': - do_debug_lines = 1; - break; - - case 'p': - case 'P': - do_debug_pubnames = 1; - break; - - case 'r': - case 'R': - do_debug_aranges = 1; - break; - - default: - warn (_("Unrecognised debug option '%s'\n"), optarg); - break; - } - } - break; -#ifdef SUPPORT_DISASSEMBLY - case 'i': - do_dump ++; - section = strtoul (optarg, & cp, 0); - if (! * cp && section >= 0) - { - request_dump (section, DISASS_DUMP); - break; - } - goto oops; -#endif - case 'v': - print_version (program_name); - break; - case 'V': - do_version ++; - break; - default: - oops: - /* xgettext:c-format */ - error (_("Invalid option '-%c'\n"), c); - /* Drop through. */ - case '?': - usage (); - } - } - - if (!do_dynamic && !do_syms && !do_reloc && !do_sections - && !do_segments && !do_header && !do_dump && !do_version - && !do_histogram && !do_debugging && !do_arch && !do_notes) - usage (); - else if (argc < 3) - { - warn (_("Nothing to do.\n")); - usage(); - } -} - -static const char * -get_elf_class (elf_class) - unsigned char elf_class; -{ - static char buff [32]; - - switch (elf_class) - { - case ELFCLASSNONE: return _("none"); - case ELFCLASS32: return _("ELF32"); - case ELFCLASS64: return _("ELF64"); - default: - sprintf (buff, _(""), elf_class); - return buff; - } -} - -static const char * -get_data_encoding (encoding) - unsigned char encoding; -{ - static char buff [32]; - - switch (encoding) - { - case ELFDATANONE: return _("none"); - case ELFDATA2LSB: return _("2's complement, little endian"); - case ELFDATA2MSB: return _("2's complement, big endian"); - default: - sprintf (buff, _(""), encoding); - return buff; - } -} - -static const char * -get_osabi_name (osabi) - unsigned char osabi; -{ - static char buff [32]; - - switch (osabi) - { - case ELFOSABI_SYSV: return _("UNIX - System V"); - case ELFOSABI_HPUX: return _("UNIX - HP-UX"); - case ELFOSABI_LINUX: return _("UNIX - Linux"); - case ELFOSABI_STANDALONE: return _("Standalone App"); - case ELFOSABI_ARM: return _("ARM"); - default: - sprintf (buff, _(""), osabi); - return buff; - } -} - -/* Decode the data held in 'elf_header'. */ -static int -process_file_header () -{ - if ( elf_header.e_ident [EI_MAG0] != ELFMAG0 - || elf_header.e_ident [EI_MAG1] != ELFMAG1 - || elf_header.e_ident [EI_MAG2] != ELFMAG2 - || elf_header.e_ident [EI_MAG3] != ELFMAG3) - { - error - (_("Not an ELF file - it has the wrong magic bytes at the start\n")); - return 0; - } - - if (do_header) - { - int i; - - printf (_("ELF Header:\n")); - printf (_(" Magic: ")); - for (i = 0; i < EI_NIDENT; i ++) - printf ("%2.2x ", elf_header.e_ident [i]); - printf ("\n"); - printf (_(" Class: %s\n"), - get_elf_class (elf_header.e_ident [EI_CLASS])); - printf (_(" Data: %s\n"), - get_data_encoding (elf_header.e_ident [EI_DATA])); - printf (_(" Version: %d %s\n"), - elf_header.e_ident [EI_VERSION], - (elf_header.e_ident [EI_VERSION] == EV_CURRENT - ? "(current)" - : (elf_header.e_ident [EI_VERSION] != EV_NONE - ? "" - : ""))); - printf (_(" OS/ABI: %s\n"), - get_osabi_name (elf_header.e_ident [EI_OSABI])); - printf (_(" ABI Version: %d\n"), - elf_header.e_ident [EI_ABIVERSION]); - printf (_(" Type: %s\n"), - get_file_type (elf_header.e_type)); - printf (_(" Machine: %s\n"), - get_machine_name (elf_header.e_machine)); - printf (_(" Version: 0x%lx\n"), - (unsigned long) elf_header.e_version); - - printf (_(" Entry point address: ")); - print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX); - printf (_("\n Start of program headers: ")); - print_vma ((bfd_vma) elf_header.e_phoff, DEC); - printf (_(" (bytes into file)\n Start of section headers: ")); - print_vma ((bfd_vma) elf_header.e_shoff, DEC); - printf (_(" (bytes into file)\n")); - - printf (_(" Flags: 0x%lx%s\n"), - (unsigned long) elf_header.e_flags, - get_machine_flags (elf_header.e_flags, elf_header.e_machine)); - printf (_(" Size of this header: %ld (bytes)\n"), - (long) elf_header.e_ehsize); - printf (_(" Size of program headers: %ld (bytes)\n"), - (long) elf_header.e_phentsize); - printf (_(" Number of program headers: %ld\n"), - (long) elf_header.e_phnum); - printf (_(" Size of section headers: %ld (bytes)\n"), - (long) elf_header.e_shentsize); - printf (_(" Number of section headers: %ld\n"), - (long) elf_header.e_shnum); - printf (_(" Section header string table index: %ld\n"), - (long) elf_header.e_shstrndx); - } - - return 1; -} - - -static int -get_32bit_program_headers (file, program_headers) - FILE * file; - Elf_Internal_Phdr * program_headers; -{ - Elf32_External_Phdr * phdrs; - Elf32_External_Phdr * external; - Elf32_Internal_Phdr * internal; - unsigned int i; - - GET_DATA_ALLOC (elf_header.e_phoff, - elf_header.e_phentsize * elf_header.e_phnum, - phdrs, Elf32_External_Phdr *, "program headers"); - - for (i = 0, internal = program_headers, external = phdrs; - i < elf_header.e_phnum; - i ++, internal ++, external ++) - { - internal->p_type = BYTE_GET (external->p_type); - internal->p_offset = BYTE_GET (external->p_offset); - internal->p_vaddr = BYTE_GET (external->p_vaddr); - internal->p_paddr = BYTE_GET (external->p_paddr); - internal->p_filesz = BYTE_GET (external->p_filesz); - internal->p_memsz = BYTE_GET (external->p_memsz); - internal->p_flags = BYTE_GET (external->p_flags); - internal->p_align = BYTE_GET (external->p_align); - } - - free (phdrs); - - return 1; -} - -static int -get_64bit_program_headers (file, program_headers) - FILE * file; - Elf_Internal_Phdr * program_headers; -{ - Elf64_External_Phdr * phdrs; - Elf64_External_Phdr * external; - Elf64_Internal_Phdr * internal; - unsigned int i; - - GET_DATA_ALLOC (elf_header.e_phoff, - elf_header.e_phentsize * elf_header.e_phnum, - phdrs, Elf64_External_Phdr *, "program headers"); - - for (i = 0, internal = program_headers, external = phdrs; - i < elf_header.e_phnum; - i ++, internal ++, external ++) - { - internal->p_type = BYTE_GET (external->p_type); - internal->p_flags = BYTE_GET (external->p_flags); - internal->p_offset = BYTE_GET8 (external->p_offset); - internal->p_vaddr = BYTE_GET8 (external->p_vaddr); - internal->p_paddr = BYTE_GET8 (external->p_paddr); - internal->p_filesz = BYTE_GET8 (external->p_filesz); - internal->p_memsz = BYTE_GET8 (external->p_memsz); - internal->p_align = BYTE_GET8 (external->p_align); - } - - free (phdrs); - - return 1; -} - -static int -process_program_headers (file) - FILE * file; -{ - Elf_Internal_Phdr * program_headers; - Elf_Internal_Phdr * segment; - unsigned int i; - - if (elf_header.e_phnum == 0) - { - if (do_segments) - printf (_("\nThere are no program headers in this file.\n")); - return 1; - } - - if (do_segments && !do_header) - { - printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type)); - printf (_("Entry point ")); - print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX); - printf (_("\nThere are %d program headers, starting at offset "), - elf_header.e_phnum); - print_vma ((bfd_vma) elf_header.e_phoff, DEC); - printf ("\n"); - } - - program_headers = (Elf_Internal_Phdr *) malloc - (elf_header.e_phnum * sizeof (Elf_Internal_Phdr)); - - if (program_headers == NULL) - { - error (_("Out of memory\n")); - return 0; - } - - if (is_32bit_elf) - i = get_32bit_program_headers (file, program_headers); - else - i = get_64bit_program_headers (file, program_headers); - - if (i == 0) - { - free (program_headers); - return 0; - } - - if (do_segments) - { - printf - (_("\nProgram Header%s:\n"), elf_header.e_phnum > 1 ? "s" : ""); - - if (is_32bit_elf) - printf - (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n")); - else - { - printf - (_(" Type Offset VirtAddr PhysAddr\n")); - printf - (_(" FileSiz MemSiz Flags Align\n")); - } - } - - loadaddr = -1; - dynamic_addr = 0; - dynamic_size = 0; - - for (i = 0, segment = program_headers; - i < elf_header.e_phnum; - i ++, segment ++) - { - if (do_segments) - { - printf (" %-14.14s ", get_segment_type (segment->p_type)); - - if (is_32bit_elf) - { - printf ("0x%6.6lx ", (unsigned long) segment->p_offset); - printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr); - printf ("0x%8.8lx ", (unsigned long) segment->p_paddr); - printf ("0x%5.5lx ", (unsigned long) segment->p_filesz); - printf ("0x%5.5lx ", (unsigned long) segment->p_memsz); - printf ("%c%c%c ", - (segment->p_flags & PF_R ? 'R' : ' '), - (segment->p_flags & PF_W ? 'W' : ' '), - (segment->p_flags & PF_X ? 'E' : ' ')); - printf ("%#lx", (unsigned long) segment->p_align); - } - else - { - print_vma (segment->p_offset, FULL_HEX); - putchar (' '); - print_vma (segment->p_vaddr, FULL_HEX); - putchar (' '); - print_vma (segment->p_paddr, FULL_HEX); - printf ("\n "); - print_vma (segment->p_filesz, FULL_HEX); - putchar (' '); - print_vma (segment->p_memsz, FULL_HEX); - printf (" %c%c%c ", - (segment->p_flags & PF_R ? 'R' : ' '), - (segment->p_flags & PF_W ? 'W' : ' '), - (segment->p_flags & PF_X ? 'E' : ' ')); - print_vma (segment->p_align, HEX); - } - } - - switch (segment->p_type) - { - case PT_LOAD: - if (loadaddr == -1) - loadaddr = (segment->p_vaddr & 0xfffff000) - - (segment->p_offset & 0xfffff000); - break; - - case PT_DYNAMIC: - if (dynamic_addr) - error (_("more than one dynamic segment\n")); - - dynamic_addr = segment->p_offset; - dynamic_size = segment->p_filesz; - break; - - case PT_INTERP: - if (fseek (file, (long) segment->p_offset, SEEK_SET)) - error (_("Unable to find program interpreter name\n")); - else - { - program_interpreter[0] = 0; - fscanf (file, "%63s", program_interpreter); - - if (do_segments) - printf (_("\n [Requesting program interpreter: %s]"), - program_interpreter); - } - break; - } - - if (do_segments) - putc ('\n', stdout); - } - - if (loadaddr == -1) - { - /* Very strange. */ - loadaddr = 0; - } - - if (do_segments && section_headers != NULL) - { - printf (_("\n Section to Segment mapping:\n")); - printf (_(" Segment Sections...\n")); - - assert (string_table != NULL); - - for (i = 0; i < elf_header.e_phnum; i++) - { - int j; - Elf_Internal_Shdr * section; - - segment = program_headers + i; - section = section_headers; - - printf (" %2.2d ", i); - - for (j = 0; j < elf_header.e_shnum; j++, section ++) - { - if (section->sh_size > 0 - /* Compare allocated sections by VMA, unallocated - sections by file offset. */ - && (section->sh_flags & SHF_ALLOC - ? (section->sh_addr >= segment->p_vaddr - && section->sh_addr + section->sh_size - <= segment->p_vaddr + segment->p_memsz) - : ((bfd_vma) section->sh_offset >= segment->p_offset - && (section->sh_offset + section->sh_size - <= segment->p_offset + segment->p_filesz)))) - printf ("%s ", SECTION_NAME (section)); - } - - putc ('\n',stdout); - } - } - - free (program_headers); - - return 1; -} - - -static int -get_32bit_section_headers (file) - FILE * file; -{ - Elf32_External_Shdr * shdrs; - Elf32_Internal_Shdr * internal; - unsigned int i; - - GET_DATA_ALLOC (elf_header.e_shoff, - elf_header.e_shentsize * elf_header.e_shnum, - shdrs, Elf32_External_Shdr *, "section headers"); - - section_headers = (Elf_Internal_Shdr *) malloc - (elf_header.e_shnum * sizeof (Elf_Internal_Shdr)); - - if (section_headers == NULL) - { - error (_("Out of memory\n")); - return 0; - } - - for (i = 0, internal = section_headers; - i < elf_header.e_shnum; - i ++, internal ++) - { - internal->sh_name = BYTE_GET (shdrs[i].sh_name); - internal->sh_type = BYTE_GET (shdrs[i].sh_type); - internal->sh_flags = BYTE_GET (shdrs[i].sh_flags); - internal->sh_addr = BYTE_GET (shdrs[i].sh_addr); - internal->sh_offset = BYTE_GET (shdrs[i].sh_offset); - internal->sh_size = BYTE_GET (shdrs[i].sh_size); - internal->sh_link = BYTE_GET (shdrs[i].sh_link); - internal->sh_info = BYTE_GET (shdrs[i].sh_info); - internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign); - internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize); - } - - free (shdrs); - - return 1; -} - -static int -get_64bit_section_headers (file) - FILE * file; -{ - Elf64_External_Shdr * shdrs; - Elf64_Internal_Shdr * internal; - unsigned int i; - - GET_DATA_ALLOC (elf_header.e_shoff, - elf_header.e_shentsize * elf_header.e_shnum, - shdrs, Elf64_External_Shdr *, "section headers"); - - section_headers = (Elf_Internal_Shdr *) malloc - (elf_header.e_shnum * sizeof (Elf_Internal_Shdr)); - - if (section_headers == NULL) - { - error (_("Out of memory\n")); - return 0; - } - - for (i = 0, internal = section_headers; - i < elf_header.e_shnum; - i ++, internal ++) - { - internal->sh_name = BYTE_GET (shdrs[i].sh_name); - internal->sh_type = BYTE_GET (shdrs[i].sh_type); - internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags); - internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr); - internal->sh_size = BYTE_GET8 (shdrs[i].sh_size); - internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize); - internal->sh_link = BYTE_GET (shdrs[i].sh_link); - internal->sh_info = BYTE_GET (shdrs[i].sh_info); - internal->sh_offset = BYTE_GET (shdrs[i].sh_offset); - internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign); - } - - free (shdrs); - - return 1; -} - -static Elf_Internal_Sym * -get_32bit_elf_symbols (file, offset, number) - FILE * file; - unsigned long offset; - unsigned long number; -{ - Elf32_External_Sym * esyms; - Elf_Internal_Sym * isyms; - Elf_Internal_Sym * psym; - unsigned int j; - - GET_DATA_ALLOC (offset, number * sizeof (Elf32_External_Sym), - esyms, Elf32_External_Sym *, "symbols"); - - isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym)); - - if (isyms == NULL) - { - error (_("Out of memory\n")); - free (esyms); - - return NULL; - } - - for (j = 0, psym = isyms; - j < number; - j ++, psym ++) - { - psym->st_name = BYTE_GET (esyms[j].st_name); - psym->st_value = BYTE_GET (esyms[j].st_value); - psym->st_size = BYTE_GET (esyms[j].st_size); - psym->st_shndx = BYTE_GET (esyms[j].st_shndx); - psym->st_info = BYTE_GET (esyms[j].st_info); - psym->st_other = BYTE_GET (esyms[j].st_other); - } - - free (esyms); - - return isyms; -} - -static Elf_Internal_Sym * -get_64bit_elf_symbols (file, offset, number) - FILE * file; - unsigned long offset; - unsigned long number; -{ - Elf64_External_Sym * esyms; - Elf_Internal_Sym * isyms; - Elf_Internal_Sym * psym; - unsigned int j; - - GET_DATA_ALLOC (offset, number * sizeof (Elf64_External_Sym), - esyms, Elf64_External_Sym *, "symbols"); - - isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym)); - - if (isyms == NULL) - { - error (_("Out of memory\n")); - free (esyms); - - return NULL; - } - - for (j = 0, psym = isyms; - j < number; - j ++, psym ++) - { - psym->st_name = BYTE_GET (esyms[j].st_name); - psym->st_info = BYTE_GET (esyms[j].st_info); - psym->st_other = BYTE_GET (esyms[j].st_other); - psym->st_shndx = BYTE_GET (esyms[j].st_shndx); - psym->st_value = BYTE_GET8 (esyms[j].st_value); - psym->st_size = BYTE_GET8 (esyms[j].st_size); - } - - free (esyms); - - return isyms; -} - -static const char * -get_elf_section_flags (sh_flags) - bfd_vma sh_flags; -{ - static char buff [32]; - - * buff = 0; - - while (sh_flags) - { - bfd_vma flag; - - flag = sh_flags & - sh_flags; - sh_flags &= ~ flag; - - switch (flag) - { - case SHF_WRITE: strcat (buff, "W"); break; - case SHF_ALLOC: strcat (buff, "A"); break; - case SHF_EXECINSTR: strcat (buff, "X"); break; - case SHF_MERGE: strcat (buff, "M"); break; - case SHF_STRINGS: strcat (buff, "S"); break; - case SHF_INFO_LINK: strcat (buff, "I"); break; - case SHF_LINK_ORDER: strcat (buff, "L"); break; - case SHF_OS_NONCONFORMING: strcat (buff, "O"); break; - - default: - if (flag & SHF_MASKOS) - { - strcat (buff, "o"); - sh_flags &= ~ SHF_MASKOS; - } - else if (flag & SHF_MASKPROC) - { - strcat (buff, "p"); - sh_flags &= ~ SHF_MASKPROC; - } - else - strcat (buff, "x"); - break; - } - } - - return buff; -} - -static int -process_section_headers (file) - FILE * file; -{ - Elf_Internal_Shdr * section; - int i; - - section_headers = NULL; - - if (elf_header.e_shnum == 0) - { - if (do_sections) - printf (_("\nThere are no sections in this file.\n")); - - return 1; - } - - if (do_sections && !do_header) - printf (_("There are %d section headers, starting at offset 0x%lx:\n"), - elf_header.e_shnum, (unsigned long) elf_header.e_shoff); - - if (is_32bit_elf) - { - if (! get_32bit_section_headers (file)) - return 0; - } - else if (! get_64bit_section_headers (file)) - return 0; - - /* Read in the string table, so that we have names to display. */ - section = section_headers + elf_header.e_shstrndx; - - if (section->sh_size != 0) - { - unsigned long string_table_offset; - - string_table_offset = section->sh_offset; - - GET_DATA_ALLOC (section->sh_offset, section->sh_size, - string_table, char *, "string table"); - } - - /* Scan the sections for the dynamic symbol table - and dynamic string table and debug sections. */ - dynamic_symbols = NULL; - dynamic_strings = NULL; - dynamic_syminfo = NULL; - - for (i = 0, section = section_headers; - i < elf_header.e_shnum; - i ++, section ++) - { - char * name = SECTION_NAME (section); - - if (section->sh_type == SHT_DYNSYM) - { - if (dynamic_symbols != NULL) - { - error (_("File contains multiple dynamic symbol tables\n")); - continue; - } - - num_dynamic_syms = section->sh_size / section->sh_entsize; - dynamic_symbols = - GET_ELF_SYMBOLS (file, section->sh_offset, num_dynamic_syms); - } - else if (section->sh_type == SHT_STRTAB - && strcmp (name, ".dynstr") == 0) - { - if (dynamic_strings != NULL) - { - error (_("File contains multiple dynamic string tables\n")); - continue; - } - - GET_DATA_ALLOC (section->sh_offset, section->sh_size, - dynamic_strings, char *, "dynamic strings"); - } - else if ((do_debugging || do_debug_info || do_debug_abbrevs - || do_debug_lines || do_debug_pubnames || do_debug_aranges) - && strncmp (name, ".debug_", 7) == 0) - { - name += 7; - - if (do_debugging - || (do_debug_info && (strcmp (name, "info") == 0)) - || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0)) - || (do_debug_lines && (strcmp (name, "line") == 0)) - || (do_debug_pubnames && (strcmp (name, "pubnames") == 0)) - || (do_debug_aranges && (strcmp (name, "aranges") == 0)) - ) - request_dump (i, DEBUG_DUMP); - } - } - - if (! do_sections) - return 1; - - printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : ""); - - if (is_32bit_elf) - printf - (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n")); - else - { - printf (_(" [Nr] Name Type Address Offset\n")); - printf (_(" Size EntSize Flags Link Info Align\n")); - } - - for (i = 0, section = section_headers; - i < elf_header.e_shnum; - i ++, section ++) - { - printf (" [%2d] %-17.17s %-15.15s ", - i, - SECTION_NAME (section), - get_section_type_name (section->sh_type)); - - if (is_32bit_elf) - { - print_vma (section->sh_addr, LONG_HEX); - - printf ( " %6.6lx %6.6lx %2.2lx", - (unsigned long) section->sh_offset, - (unsigned long) section->sh_size, - (unsigned long) section->sh_entsize); - - printf (" %3s ", get_elf_section_flags (section->sh_flags)); - - printf (" %2ld %3lx %ld\n", - (unsigned long) section->sh_link, - (unsigned long) section->sh_info, - (unsigned long) section->sh_addralign); - } - else - { - putchar (' '); - print_vma (section->sh_addr, LONG_HEX); - printf (" %8.8lx", section->sh_offset); - printf ("\n "); - print_vma (section->sh_size, LONG_HEX); - printf (" "); - print_vma (section->sh_entsize, LONG_HEX); - - printf (" %3s ", get_elf_section_flags (section->sh_flags)); - - printf (" %2ld %3lx %ld\n", - (unsigned long) section->sh_link, - (unsigned long) section->sh_info, - (unsigned long) section->sh_addralign); - } - } - - printf (_("Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n")); - printf (_(" I (info), L (link order), O (extra OS processing required)\n")); - printf (_(" o (os specific), p (processor specific) x (unknown)\n")); - - return 1; -} - -/* Process the reloc section. */ -static int -process_relocs (file) - FILE * file; -{ - unsigned long rel_size; - unsigned long rel_offset; - - - if (!do_reloc) - return 1; - - if (do_using_dynamic) - { - int is_rela = FALSE; - - rel_size = 0; - rel_offset = 0; - - if (dynamic_info[DT_REL]) - { - rel_offset = dynamic_info[DT_REL]; - rel_size = dynamic_info[DT_RELSZ]; - is_rela = FALSE; - } - else if (dynamic_info [DT_RELA]) - { - rel_offset = dynamic_info[DT_RELA]; - rel_size = dynamic_info[DT_RELASZ]; - is_rela = TRUE; - } - else if (dynamic_info[DT_JMPREL]) - { - rel_offset = dynamic_info[DT_JMPREL]; - rel_size = dynamic_info[DT_PLTRELSZ]; - - switch (dynamic_info[DT_PLTREL]) - { - case DT_REL: - is_rela = FALSE; - break; - case DT_RELA: - is_rela = TRUE; - break; - default: - is_rela = UNKNOWN; - break; - } - } - - if (rel_size) - { - printf - (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"), - rel_offset, rel_size); - - dump_relocations (file, rel_offset - loadaddr, rel_size, - dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela); - } - else - printf (_("\nThere are no dynamic relocations in this file.\n")); - } - else - { - Elf32_Internal_Shdr * section; - unsigned long i; - int found = 0; - - for (i = 0, section = section_headers; - i < elf_header.e_shnum; - i++, section ++) - { - if ( section->sh_type != SHT_RELA - && section->sh_type != SHT_REL) - continue; - - rel_offset = section->sh_offset; - rel_size = section->sh_size; - - if (rel_size) - { - Elf32_Internal_Shdr * strsec; - Elf32_Internal_Shdr * symsec; - Elf_Internal_Sym * symtab; - char * strtab; - int is_rela; - unsigned long nsyms; - - printf (_("\nRelocation section ")); - - if (string_table == NULL) - printf ("%d", section->sh_name); - else - printf ("'%s'", SECTION_NAME (section)); - - printf (_(" at offset 0x%lx contains %lu entries:\n"), - rel_offset, (unsigned long) (rel_size / section->sh_entsize)); - - symsec = section_headers + section->sh_link; - - nsyms = symsec->sh_size / symsec->sh_entsize; - symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms); - - if (symtab == NULL) - continue; - - strsec = section_headers + symsec->sh_link; - - GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab, - char *, "string table"); - - is_rela = section->sh_type == SHT_RELA; - - dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela); - - free (strtab); - free (symtab); - - found = 1; - } - } - - if (! found) - printf (_("\nThere are no relocations in this file.\n")); - } - - return 1; -} - - -static void -dynamic_segment_mips_val (entry) - Elf_Internal_Dyn * entry; -{ - switch (entry->d_tag) - { - case DT_MIPS_FLAGS: - if (entry->d_un.d_val == 0) - printf ("NONE\n"); - else - { - static const char * opts[] = - { - "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT", - "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS", - "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD", - "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF", - "RLD_ORDER_SAFE" - }; - unsigned int cnt; - int first = 1; - for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt) - if (entry->d_un.d_val & (1 << cnt)) - { - printf ("%s%s", first ? "" : " ", opts[cnt]); - first = 0; - } - puts (""); - } - break; - - case DT_MIPS_IVERSION: - if (dynamic_strings != NULL) - printf ("Interface Version: %s\n", - dynamic_strings + entry->d_un.d_val); - else - printf ("%ld\n", (long) entry->d_un.d_ptr); - break; - - case DT_MIPS_TIME_STAMP: - { - char timebuf[20]; - time_t time = entry->d_un.d_val; - strftime (timebuf, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time)); - printf ("Time Stamp: %s\n", timebuf); - } - break; - - case DT_MIPS_RLD_VERSION: - case DT_MIPS_LOCAL_GOTNO: - case DT_MIPS_CONFLICTNO: - case DT_MIPS_LIBLISTNO: - case DT_MIPS_SYMTABNO: - case DT_MIPS_UNREFEXTNO: - case DT_MIPS_HIPAGENO: - case DT_MIPS_DELTA_CLASS_NO: - case DT_MIPS_DELTA_INSTANCE_NO: - case DT_MIPS_DELTA_RELOC_NO: - case DT_MIPS_DELTA_SYM_NO: - case DT_MIPS_DELTA_CLASSSYM_NO: - case DT_MIPS_COMPACT_SIZE: - printf ("%ld\n", (long) entry->d_un.d_ptr); - break; - - default: - printf ("%#lx\n", (long) entry->d_un.d_ptr); - } -} - - -static void -dynamic_segment_parisc_val (entry) - Elf_Internal_Dyn * entry; -{ - switch (entry->d_tag) - { - case DT_HP_DLD_FLAGS: - { - static struct - { - long int bit; - const char * str; - } - flags[] = - { - { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" }, - { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" }, - { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" }, - { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" }, - { DT_HP_BIND_NOW, "HP_BIND_NOW" }, - { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" }, - { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" }, - { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" }, - { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" }, - { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" }, - { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" } - }; - int first = 1; - size_t cnt; - bfd_vma val = entry->d_un.d_val; - - for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt) - if (val & flags[cnt].bit) - { - if (! first) - putchar (' '); - fputs (flags[cnt].str, stdout); - first = 0; - val ^= flags[cnt].bit; - } - - if (val != 0 || first) - { - if (! first) - putchar (' '); - print_vma (val, HEX); - } - } - break; - - default: - print_vma (entry->d_un.d_ptr, PREFIX_HEX); - break; - } -} - -static int -get_32bit_dynamic_segment (file) - FILE * file; -{ - Elf32_External_Dyn * edyn; - Elf_Internal_Dyn * entry; - bfd_size_type i; - - GET_DATA_ALLOC (dynamic_addr, dynamic_size, - edyn, Elf32_External_Dyn *, "dynamic segment"); - - /* SGI's ELF has more than one section in the DYNAMIC segment. Determine - how large this .dynamic is now. We can do this even before the byte - swapping since the DT_NULL tag is recognizable. */ - dynamic_size = 0; - while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL) - ; - - dynamic_segment = (Elf_Internal_Dyn *) - malloc (dynamic_size * sizeof (Elf_Internal_Dyn)); - - if (dynamic_segment == NULL) - { - error (_("Out of memory\n")); - free (edyn); - return 0; - } - - for (i = 0, entry = dynamic_segment; - i < dynamic_size; - i ++, entry ++) - { - entry->d_tag = BYTE_GET (edyn [i].d_tag); - entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val); - } - - free (edyn); - - return 1; -} - -static int -get_64bit_dynamic_segment (file) - FILE * file; -{ - Elf64_External_Dyn * edyn; - Elf_Internal_Dyn * entry; - bfd_size_type i; - - GET_DATA_ALLOC (dynamic_addr, dynamic_size, - edyn, Elf64_External_Dyn *, "dynamic segment"); - - /* SGI's ELF has more than one section in the DYNAMIC segment. Determine - how large this .dynamic is now. We can do this even before the byte - swapping since the DT_NULL tag is recognizable. */ - dynamic_size = 0; - while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL) - ; - - dynamic_segment = (Elf_Internal_Dyn *) - malloc (dynamic_size * sizeof (Elf_Internal_Dyn)); - - if (dynamic_segment == NULL) - { - error (_("Out of memory\n")); - free (edyn); - return 0; - } - - for (i = 0, entry = dynamic_segment; - i < dynamic_size; - i ++, entry ++) - { - entry->d_tag = BYTE_GET8 (edyn [i].d_tag); - entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val); - } - - free (edyn); - - return 1; -} - -static const char * -get_dynamic_flags (flags) - bfd_vma flags; -{ - static char buff [64]; - while (flags) - { - bfd_vma flag; - - flag = flags & - flags; - flags &= ~ flag; - - switch (flag) - { - case DF_ORIGIN: strcat (buff, "ORIGIN "); break; - case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break; - case DF_TEXTREL: strcat (buff, "TEXTREL "); break; - case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break; - default: strcat (buff, "unknown "); break; - } - } - return buff; -} - -/* Parse and display the contents of the dynamic segment. */ -static int -process_dynamic_segment (file) - FILE * file; -{ - Elf_Internal_Dyn * entry; - bfd_size_type i; - - if (dynamic_size == 0) - { - if (do_dynamic) - printf (_("\nThere is no dynamic segment in this file.\n")); - - return 1; - } - - if (is_32bit_elf) - { - if (! get_32bit_dynamic_segment (file)) - return 0; - } - else if (! get_64bit_dynamic_segment (file)) - return 0; - - /* Find the appropriate symbol table. */ - if (dynamic_symbols == NULL) - { - for (i = 0, entry = dynamic_segment; - i < dynamic_size; - ++i, ++ entry) - { - unsigned long offset; - - if (entry->d_tag != DT_SYMTAB) - continue; - - dynamic_info[DT_SYMTAB] = entry->d_un.d_val; - - /* Since we do not know how big the symbol table is, - we default to reading in the entire file (!) and - processing that. This is overkill, I know, but it - should work. */ - offset = entry->d_un.d_val - loadaddr; - - if (fseek (file, 0, SEEK_END)) - error (_("Unable to seek to end of file!")); - - if (is_32bit_elf) - num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf32_External_Sym); - else - num_dynamic_syms = (ftell (file) - offset) / sizeof (Elf64_External_Sym); - - if (num_dynamic_syms < 1) - { - error (_("Unable to determine the number of symbols to load\n")); - continue; - } - - dynamic_symbols = GET_ELF_SYMBOLS (file, offset, num_dynamic_syms); - } - } - - /* Similarly find a string table. */ - if (dynamic_strings == NULL) - { - for (i = 0, entry = dynamic_segment; - i < dynamic_size; - ++i, ++ entry) - { - unsigned long offset; - long str_tab_len; - - if (entry->d_tag != DT_STRTAB) - continue; - - dynamic_info[DT_STRTAB] = entry->d_un.d_val; - - /* Since we do not know how big the string table is, - we default to reading in the entire file (!) and - processing that. This is overkill, I know, but it - should work. */ - - offset = entry->d_un.d_val - loadaddr; - if (fseek (file, 0, SEEK_END)) - error (_("Unable to seek to end of file\n")); - str_tab_len = ftell (file) - offset; - - if (str_tab_len < 1) - { - error - (_("Unable to determine the length of the dynamic string table\n")); - continue; - } - - GET_DATA_ALLOC (offset, str_tab_len, dynamic_strings, char *, - "dynamic string table"); - - break; - } - } - - /* And find the syminfo section if available. */ - if (dynamic_syminfo == NULL) - { - unsigned int syminsz = 0; - - for (i = 0, entry = dynamic_segment; - i < dynamic_size; - ++i, ++ entry) - { - if (entry->d_tag == DT_SYMINENT) - { - /* Note: these braces are necessary to avoid a syntax - error from the SunOS4 C compiler. */ - assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val); - } - else if (entry->d_tag == DT_SYMINSZ) - syminsz = entry->d_un.d_val; - else if (entry->d_tag == DT_SYMINFO) - dynamic_syminfo_offset = entry->d_un.d_val - loadaddr; - } - - if (dynamic_syminfo_offset != 0 && syminsz != 0) - { - Elf_External_Syminfo * extsyminfo; - Elf_Internal_Syminfo * syminfo; - - /* There is a syminfo section. Read the data. */ - GET_DATA_ALLOC (dynamic_syminfo_offset, syminsz, extsyminfo, - Elf_External_Syminfo *, "symbol information"); - - dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz); - if (dynamic_syminfo == NULL) - { - error (_("Out of memory\n")); - return 0; - } - - dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo); - for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent; - ++i, ++syminfo) - { - syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto); - syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags); - } - - free (extsyminfo); - } - } - - if (do_dynamic && dynamic_addr) - printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"), - dynamic_addr, (long) dynamic_size); - if (do_dynamic) - printf (_(" Tag Type Name/Value\n")); - - for (i = 0, entry = dynamic_segment; - i < dynamic_size; - i++, entry ++) - { - if (do_dynamic) - { - const char * dtype; - - putchar (' '); - print_vma (entry->d_tag, FULL_HEX); - dtype = get_dynamic_type (entry->d_tag); - printf (" (%s)%*s", dtype, - ((is_32bit_elf ? 27 : 19) - - (int) strlen (dtype)), - " "); - } - - switch (entry->d_tag) - { - case DT_FLAGS: - if (do_dynamic) - printf ("%s", get_dynamic_flags (entry->d_un.d_val)); - break; - - case DT_AUXILIARY: - case DT_FILTER: - if (do_dynamic) - { - if (entry->d_tag == DT_AUXILIARY) - printf (_("Auxiliary library")); - else - printf (_("Filter library")); - - if (dynamic_strings) - printf (": [%s]\n", dynamic_strings + entry->d_un.d_val); - else - { - printf (": "); - print_vma (entry->d_un.d_val, PREFIX_HEX); - putchar ('\n'); - } - } - break; - - case DT_FEATURE_1: - if (do_dynamic) - { - printf (_("Flags:")); - if (entry->d_un.d_val == 0) - printf (_(" None\n")); - else - { - unsigned long int val = entry->d_un.d_val; - if (val & DTF_1_PARINIT) - { - printf (" PARINIT"); - val ^= DTF_1_PARINIT; - } - if (val != 0) - printf (" %lx", val); - puts (""); - } - } - break; - - case DT_POSFLAG_1: - if (do_dynamic) - { - printf (_("Flags:")); - if (entry->d_un.d_val == 0) - printf (_(" None\n")); - else - { - unsigned long int val = entry->d_un.d_val; - if (val & DF_P1_LAZYLOAD) - { - printf (" LAZYLOAD"); - val ^= DF_P1_LAZYLOAD; - } - if (val & DF_P1_GROUPPERM) - { - printf (" GROUPPERM"); - val ^= DF_P1_GROUPPERM; - } - if (val != 0) - printf (" %lx", val); - puts (""); - } - } - break; - - case DT_FLAGS_1: - if (do_dynamic) - { - printf (_("Flags:")); - if (entry->d_un.d_val == 0) - printf (_(" None\n")); - else - { - unsigned long int val = entry->d_un.d_val; - if (val & DF_1_NOW) - { - printf (" NOW"); - val ^= DF_1_NOW; - } - if (val & DF_1_GLOBAL) - { - printf (" GLOBAL"); - val ^= DF_1_GLOBAL; - } - if (val & DF_1_GROUP) - { - printf (" GROUP"); - val ^= DF_1_GROUP; - } - if (val & DF_1_NODELETE) - { - printf (" NODELETE"); - val ^= DF_1_NODELETE; - } - if (val & DF_1_LOADFLTR) - { - printf (" LOADFLTR"); - val ^= DF_1_LOADFLTR; - } - if (val & DF_1_INITFIRST) - { - printf (" INITFIRST"); - val ^= DF_1_INITFIRST; - } - if (val & DF_1_NOOPEN) - { - printf (" NOOPEN"); - val ^= DF_1_NOOPEN; - } - if (val & DF_1_ORIGIN) - { - printf (" ORIGIN"); - val ^= DF_1_ORIGIN; - } - if (val & DF_1_DIRECT) - { - printf (" DIRECT"); - val ^= DF_1_DIRECT; - } - if (val & DF_1_TRANS) - { - printf (" TRANS"); - val ^= DF_1_TRANS; - } - if (val & DF_1_INTERPOSE) - { - printf (" INTERPOSE"); - val ^= DF_1_INTERPOSE; - } - if (val != 0) - printf (" %lx", val); - puts (""); - } - } - break; - - case DT_PLTREL: - if (do_dynamic) - puts (get_dynamic_type (entry->d_un.d_val)); - break; - - case DT_NULL : - case DT_NEEDED : - case DT_PLTGOT : - case DT_HASH : - case DT_STRTAB : - case DT_SYMTAB : - case DT_RELA : - case DT_INIT : - case DT_FINI : - case DT_SONAME : - case DT_RPATH : - case DT_SYMBOLIC: - case DT_REL : - case DT_DEBUG : - case DT_TEXTREL : - case DT_JMPREL : - dynamic_info[entry->d_tag] = entry->d_un.d_val; - - if (do_dynamic) - { - char * name; - - if (dynamic_strings == NULL) - name = NULL; - else - name = dynamic_strings + entry->d_un.d_val; - - if (name) - { - switch (entry->d_tag) - { - case DT_NEEDED: - printf (_("Shared library: [%s]"), name); - - if (strcmp (name, program_interpreter) == 0) - printf (_(" program interpreter")); - break; - - case DT_SONAME: - printf (_("Library soname: [%s]"), name); - break; - - case DT_RPATH: - printf (_("Library rpath: [%s]"), name); - break; - - default: - print_vma (entry->d_un.d_val, PREFIX_HEX); - break; - } - } - else - print_vma (entry->d_un.d_val, PREFIX_HEX); - - putchar ('\n'); - } - break; - - case DT_PLTRELSZ: - case DT_RELASZ : - case DT_STRSZ : - case DT_RELSZ : - case DT_RELAENT : - case DT_SYMENT : - case DT_RELENT : - case DT_PLTPADSZ: - case DT_MOVEENT : - case DT_MOVESZ : - case DT_INIT_ARRAYSZ: - case DT_FINI_ARRAYSZ: - if (do_dynamic) - { - print_vma (entry->d_un.d_val, UNSIGNED); - printf (" (bytes)\n"); - } - break; - - case DT_VERDEFNUM: - case DT_VERNEEDNUM: - case DT_RELACOUNT: - case DT_RELCOUNT: - if (do_dynamic) - { - print_vma (entry->d_un.d_val, UNSIGNED); - putchar ('\n'); - } - break; - - case DT_SYMINSZ: - case DT_SYMINENT: - case DT_SYMINFO: - case DT_USED: - case DT_INIT_ARRAY: - case DT_FINI_ARRAY: - if (do_dynamic) - { - if (dynamic_strings != NULL && entry->d_tag == DT_USED) - { - char * name; - - name = dynamic_strings + entry->d_un.d_val; - - if (* name) - { - printf (_("Not needed object: [%s]\n"), name); - break; - } - } - - print_vma (entry->d_un.d_val, PREFIX_HEX); - putchar ('\n'); - } - break; - - case DT_BIND_NOW: - /* The value of this entry is ignored. */ - break; - - default: - if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM)) - version_info [DT_VERSIONTAGIDX (entry->d_tag)] = - entry->d_un.d_val; - - if (do_dynamic) - { - switch (elf_header.e_machine) - { - case EM_MIPS: - case EM_MIPS_RS4_BE: - dynamic_segment_mips_val (entry); - break; - case EM_PARISC: - dynamic_segment_parisc_val (entry); - break; - default: - print_vma (entry->d_un.d_val, PREFIX_HEX); - putchar ('\n'); - } - } - break; - } - } - - return 1; -} - -static char * -get_ver_flags (flags) - unsigned int flags; -{ - static char buff [32]; - - buff[0] = 0; - - if (flags == 0) - return _("none"); - - if (flags & VER_FLG_BASE) - strcat (buff, "BASE "); - - if (flags & VER_FLG_WEAK) - { - if (flags & VER_FLG_BASE) - strcat (buff, "| "); - - strcat (buff, "WEAK "); - } - - if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK)) - strcat (buff, "| "); - - return buff; -} - -/* Display the contents of the version sections. */ -static int -process_version_sections (file) - FILE * file; -{ - Elf32_Internal_Shdr * section; - unsigned i; - int found = 0; - - if (! do_version) - return 1; - - for (i = 0, section = section_headers; - i < elf_header.e_shnum; - i++, section ++) - { - switch (section->sh_type) - { - case SHT_GNU_verdef: - { - Elf_External_Verdef * edefs; - unsigned int idx; - unsigned int cnt; - - found = 1; - - printf - (_("\nVersion definition section '%s' contains %ld entries:\n"), - SECTION_NAME (section), section->sh_info); - - printf (_(" Addr: 0x")); - printf_vma (section->sh_addr); - printf (_(" Offset: %#08lx Link: %lx (%s)\n"), - (unsigned long) section->sh_offset, section->sh_link, - SECTION_NAME (section_headers + section->sh_link)); - - GET_DATA_ALLOC (section->sh_offset, section->sh_size, - edefs, Elf_External_Verdef *, - "version definition section"); - - for (idx = cnt = 0; cnt < section->sh_info; ++ cnt) - { - char * vstart; - Elf_External_Verdef * edef; - Elf_Internal_Verdef ent; - Elf_External_Verdaux * eaux; - Elf_Internal_Verdaux aux; - int j; - int isum; - - vstart = ((char *) edefs) + idx; - - edef = (Elf_External_Verdef *) vstart; - - ent.vd_version = BYTE_GET (edef->vd_version); - ent.vd_flags = BYTE_GET (edef->vd_flags); - ent.vd_ndx = BYTE_GET (edef->vd_ndx); - ent.vd_cnt = BYTE_GET (edef->vd_cnt); - ent.vd_hash = BYTE_GET (edef->vd_hash); - ent.vd_aux = BYTE_GET (edef->vd_aux); - ent.vd_next = BYTE_GET (edef->vd_next); - - printf (_(" %#06x: Rev: %d Flags: %s"), - idx, ent.vd_version, get_ver_flags (ent.vd_flags)); - - printf (_(" Index: %d Cnt: %d "), - ent.vd_ndx, ent.vd_cnt); - - vstart += ent.vd_aux; - - eaux = (Elf_External_Verdaux *) vstart; - - aux.vda_name = BYTE_GET (eaux->vda_name); - aux.vda_next = BYTE_GET (eaux->vda_next); - - if (dynamic_strings) - printf (_("Name: %s\n"), dynamic_strings + aux.vda_name); - else - printf (_("Name index: %ld\n"), aux.vda_name); - - isum = idx + ent.vd_aux; - - for (j = 1; j < ent.vd_cnt; j ++) - { - isum += aux.vda_next; - vstart += aux.vda_next; - - eaux = (Elf_External_Verdaux *) vstart; - - aux.vda_name = BYTE_GET (eaux->vda_name); - aux.vda_next = BYTE_GET (eaux->vda_next); - - if (dynamic_strings) - printf (_(" %#06x: Parent %d: %s\n"), - isum, j, dynamic_strings + aux.vda_name); - else - printf (_(" %#06x: Parent %d, name index: %ld\n"), - isum, j, aux.vda_name); - } - - idx += ent.vd_next; - } - - free (edefs); - } - break; - - case SHT_GNU_verneed: - { - Elf_External_Verneed * eneed; - unsigned int idx; - unsigned int cnt; - - found = 1; - - printf (_("\nVersion needs section '%s' contains %ld entries:\n"), - SECTION_NAME (section), section->sh_info); - - printf (_(" Addr: 0x")); - printf_vma (section->sh_addr); - printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"), - (unsigned long) section->sh_offset, section->sh_link, - SECTION_NAME (section_headers + section->sh_link)); - - GET_DATA_ALLOC (section->sh_offset, section->sh_size, - eneed, Elf_External_Verneed *, - "version need section"); - - for (idx = cnt = 0; cnt < section->sh_info; ++cnt) - { - Elf_External_Verneed * entry; - Elf_Internal_Verneed ent; - int j; - int isum; - char * vstart; - - vstart = ((char *) eneed) + idx; - - entry = (Elf_External_Verneed *) vstart; - - ent.vn_version = BYTE_GET (entry->vn_version); - ent.vn_cnt = BYTE_GET (entry->vn_cnt); - ent.vn_file = BYTE_GET (entry->vn_file); - ent.vn_aux = BYTE_GET (entry->vn_aux); - ent.vn_next = BYTE_GET (entry->vn_next); - - printf (_(" %#06x: Version: %d"), idx, ent.vn_version); - - if (dynamic_strings) - printf (_(" File: %s"), dynamic_strings + ent.vn_file); - else - printf (_(" File: %lx"), ent.vn_file); - - printf (_(" Cnt: %d\n"), ent.vn_cnt); - - vstart += ent.vn_aux; - - for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j) - { - Elf_External_Vernaux * eaux; - Elf_Internal_Vernaux aux; - - eaux = (Elf_External_Vernaux *) vstart; - - aux.vna_hash = BYTE_GET (eaux->vna_hash); - aux.vna_flags = BYTE_GET (eaux->vna_flags); - aux.vna_other = BYTE_GET (eaux->vna_other); - aux.vna_name = BYTE_GET (eaux->vna_name); - aux.vna_next = BYTE_GET (eaux->vna_next); - - if (dynamic_strings) - printf (_(" %#06x: Name: %s"), - isum, dynamic_strings + aux.vna_name); - else - printf (_(" %#06x: Name index: %lx"), - isum, aux.vna_name); - - printf (_(" Flags: %s Version: %d\n"), - get_ver_flags (aux.vna_flags), aux.vna_other); - - isum += aux.vna_next; - vstart += aux.vna_next; - } - - idx += ent.vn_next; - } - - free (eneed); - } - break; - - case SHT_GNU_versym: - { - Elf32_Internal_Shdr * link_section; - int total; - int cnt; - unsigned char * edata; - unsigned short * data; - char * strtab; - Elf_Internal_Sym * symbols; - Elf32_Internal_Shdr * string_sec; - - link_section = section_headers + section->sh_link; - total = section->sh_size / section->sh_entsize; - - found = 1; - - symbols = GET_ELF_SYMBOLS (file, link_section->sh_offset, - link_section->sh_size / link_section->sh_entsize); - - string_sec = section_headers + link_section->sh_link; - - GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size, - strtab, char *, "version string table"); - - printf (_("\nVersion symbols section '%s' contains %d entries:\n"), - SECTION_NAME (section), total); - - printf (_(" Addr: ")); - printf_vma (section->sh_addr); - printf (_(" Offset: %#08lx Link: %lx (%s)\n"), - (unsigned long) section->sh_offset, section->sh_link, - SECTION_NAME (link_section)); - - GET_DATA_ALLOC (version_info [DT_VERSIONTAGIDX (DT_VERSYM)] - - loadaddr, - total * sizeof (short), edata, - unsigned char *, "version symbol data"); - - data = (unsigned short *) malloc (total * sizeof (short)); - - for (cnt = total; cnt --;) - data [cnt] = byte_get (edata + cnt * sizeof (short), - sizeof (short)); - - free (edata); - - for (cnt = 0; cnt < total; cnt += 4) - { - int j, nn; - char * name; - - printf (" %03x:", cnt); - - for (j = 0; (j < 4) && (cnt + j) < total; ++j) - switch (data [cnt + j]) - { - case 0: - fputs (_(" 0 (*local*) "), stdout); - break; - - case 1: - fputs (_(" 1 (*global*) "), stdout); - break; - - default: - nn = printf ("%4x%c", data [cnt + j] & 0x7fff, - data [cnt + j] & 0x8000 ? 'h' : ' '); - - if (symbols [cnt + j].st_shndx < SHN_LORESERVE - && section_headers[symbols [cnt + j].st_shndx].sh_type - == SHT_NOBITS) - { - /* We must test both. */ - Elf_Internal_Verneed ivn; - unsigned long offset; - - offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)] - - loadaddr; - - do - { - Elf_External_Verneed evn; - Elf_External_Vernaux evna; - Elf_Internal_Vernaux ivna; - unsigned long vna_off; - - GET_DATA (offset, evn, "version need"); - - ivn.vn_aux = BYTE_GET (evn.vn_aux); - ivn.vn_next = BYTE_GET (evn.vn_next); - - vna_off = offset + ivn.vn_aux; - - do - { - GET_DATA (vna_off, evna, - "version need aux (1)"); - - ivna.vna_next = BYTE_GET (evna.vna_next); - ivna.vna_other = BYTE_GET (evna.vna_other); - - vna_off += ivna.vna_next; - } - while (ivna.vna_other != data [cnt + j] - && ivna.vna_next != 0); - - if (ivna.vna_other == data [cnt + j]) - { - ivna.vna_name = BYTE_GET (evna.vna_name); - - name = strtab + ivna.vna_name; - nn += printf ("(%s%-*s", - name, - 12 - (int) strlen (name), - ")"); - break; - } - else if (ivn.vn_next == 0) - { - if (data [cnt + j] != 0x8001) - { - Elf_Internal_Verdef ivd; - Elf_External_Verdef evd; - - offset = version_info - [DT_VERSIONTAGIDX (DT_VERDEF)] - - loadaddr; - - do - { - GET_DATA (offset, evd, - "version definition"); - - ivd.vd_next = BYTE_GET (evd.vd_next); - ivd.vd_ndx = BYTE_GET (evd.vd_ndx); - - offset += ivd.vd_next; - } - while (ivd.vd_ndx - != (data [cnt + j] & 0x7fff) - && ivd.vd_next != 0); - - if (ivd.vd_ndx - == (data [cnt + j] & 0x7fff)) - { - Elf_External_Verdaux evda; - Elf_Internal_Verdaux ivda; - - ivd.vd_aux = BYTE_GET (evd.vd_aux); - - GET_DATA (offset + ivd.vd_aux, evda, - "version definition aux"); - - ivda.vda_name = - BYTE_GET (evda.vda_name); - - name = strtab + ivda.vda_name; - nn += - printf ("(%s%-*s", - name, - 12 - (int) strlen (name), - ")"); - } - } - - break; - } - else - offset += ivn.vn_next; - } - while (ivn.vn_next); - } - else if (symbols [cnt + j].st_shndx == SHN_UNDEF) - { - Elf_Internal_Verneed ivn; - unsigned long offset; - - offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)] - - loadaddr; - - do - { - Elf_Internal_Vernaux ivna; - Elf_External_Verneed evn; - Elf_External_Vernaux evna; - unsigned long a_off; - - GET_DATA (offset, evn, "version need"); - - ivn.vn_aux = BYTE_GET (evn.vn_aux); - ivn.vn_next = BYTE_GET (evn.vn_next); - - a_off = offset + ivn.vn_aux; - - do - { - GET_DATA (a_off, evna, - "version need aux (2)"); - - ivna.vna_next = BYTE_GET (evna.vna_next); - ivna.vna_other = BYTE_GET (evna.vna_other); - - a_off += ivna.vna_next; - } - while (ivna.vna_other != data [cnt + j] - && ivna.vna_next != 0); - - if (ivna.vna_other == data [cnt + j]) - { - ivna.vna_name = BYTE_GET (evna.vna_name); - - name = strtab + ivna.vna_name; - nn += printf ("(%s%-*s", - name, - 12 - (int) strlen (name), - ")"); - break; - } - - offset += ivn.vn_next; - } - while (ivn.vn_next); - } - else if (data [cnt + j] != 0x8001) - { - Elf_Internal_Verdef ivd; - Elf_External_Verdef evd; - unsigned long offset; - - offset = version_info - [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr; - - do - { - GET_DATA (offset, evd, "version def"); - - ivd.vd_next = BYTE_GET (evd.vd_next); - ivd.vd_ndx = BYTE_GET (evd.vd_ndx); - - offset += ivd.vd_next; - } - while (ivd.vd_ndx != (data [cnt + j] & 0x7fff) - && ivd.vd_next != 0); - - if (ivd.vd_ndx == (data [cnt + j] & 0x7fff)) - { - Elf_External_Verdaux evda; - Elf_Internal_Verdaux ivda; - - ivd.vd_aux = BYTE_GET (evd.vd_aux); - - GET_DATA (offset - ivd.vd_next + ivd.vd_aux, - evda, "version def aux"); - - ivda.vda_name = BYTE_GET (evda.vda_name); - - name = strtab + ivda.vda_name; - nn += printf ("(%s%-*s", - name, - 12 - (int) strlen (name), - ")"); - } - } - - if (nn < 18) - printf ("%*c", 18 - nn, ' '); - } - - putchar ('\n'); - } - - free (data); - free (strtab); - free (symbols); - } - break; - - default: - break; - } - } - - if (! found) - printf (_("\nNo version information found in this file.\n")); - - return 1; -} - -static const char * -get_symbol_binding (binding) - unsigned int binding; -{ - static char buff [32]; - - switch (binding) - { - case STB_LOCAL: return "LOCAL"; - case STB_GLOBAL: return "GLOBAL"; - case STB_WEAK: return "WEAK"; - default: - if (binding >= STB_LOPROC && binding <= STB_HIPROC) - sprintf (buff, _(": %d"), binding); - else if (binding >= STB_LOOS && binding <= STB_HIOS) - sprintf (buff, _(": %d"), binding); - else - sprintf (buff, _(": %d"), binding); - return buff; - } -} - -static const char * -get_symbol_type (type) - unsigned int type; -{ - static char buff [32]; - - switch (type) - { - case STT_NOTYPE: return "NOTYPE"; - case STT_OBJECT: return "OBJECT"; - case STT_FUNC: return "FUNC"; - case STT_SECTION: return "SECTION"; - case STT_FILE: return "FILE"; - case STT_COMMON: return "COMMON"; - default: - if (type >= STT_LOPROC && type <= STT_HIPROC) - { - if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC) - return "THUMB_FUNC"; - - if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER) - return "REGISTER"; - - if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI) - return "PARISC_MILLI"; - - sprintf (buff, _(": %d"), type); - } - else if (type >= STT_LOOS && type <= STT_HIOS) - { - if (elf_header.e_machine == EM_PARISC) - { - if (type == STT_HP_OPAQUE) - return "HP_OPAQUE"; - if (type == STT_HP_STUB) - return "HP_STUB"; - } - - sprintf (buff, _(": %d"), type); - } - else - sprintf (buff, _(": %d"), type); - return buff; - } -} - -static const char * -get_symbol_visibility (visibility) - unsigned int visibility; -{ - switch (visibility) - { - case STV_DEFAULT: return "DEFAULT"; - case STV_INTERNAL: return "INTERNAL"; - case STV_HIDDEN: return "HIDDEN"; - case STV_PROTECTED: return "PROTECTED"; - default: abort (); - } -} - -static const char * -get_symbol_index_type (type) - unsigned int type; -{ - switch (type) - { - case SHN_UNDEF: return "UND"; - case SHN_ABS: return "ABS"; - case SHN_COMMON: return "COM"; - default: - if (type >= SHN_LOPROC && type <= SHN_HIPROC) - return "PRC"; - else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE) - return "RSV"; - else if (type >= SHN_LOOS && type <= SHN_HIOS) - return "OS "; - else - { - static char buff [32]; - - sprintf (buff, "%3d", type); - return buff; - } - } -} - -static int * -get_dynamic_data (file, number) - FILE * file; - unsigned int number; -{ - char * e_data; - int * i_data; - - e_data = (char *) malloc (number * 4); - - if (e_data == NULL) - { - error (_("Out of memory\n")); - return NULL; - } - - if (fread (e_data, 4, number, file) != number) - { - error (_("Unable to read in dynamic data\n")); - return NULL; - } - - i_data = (int *) malloc (number * sizeof (* i_data)); - - if (i_data == NULL) - { - error (_("Out of memory\n")); - free (e_data); - return NULL; - } - - while (number--) - i_data [number] = byte_get (e_data + number * 4, 4); - - free (e_data); - - return i_data; -} - -/* Dump the symbol table */ -static int -process_symbol_table (file) - FILE * file; -{ - Elf32_Internal_Shdr * section; - char nb [4]; - char nc [4]; - int nbuckets = 0; - int nchains = 0; - int * buckets = NULL; - int * chains = NULL; - - if (! do_syms && !do_histogram) - return 1; - - if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL) - || do_histogram)) - { - if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET)) - { - error (_("Unable to seek to start of dynamic information")); - return 0; - } - - if (fread (nb, sizeof (nb), 1, file) != 1) - { - error (_("Failed to read in number of buckets\n")); - return 0; - } - - if (fread (nc, sizeof (nc), 1, file) != 1) - { - error (_("Failed to read in number of chains\n")); - return 0; - } - - nbuckets = byte_get (nb, 4); - nchains = byte_get (nc, 4); - - buckets = get_dynamic_data (file, nbuckets); - chains = get_dynamic_data (file, nchains); - - if (buckets == NULL || chains == NULL) - return 0; - } - - if (do_syms - && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL) - { - int hn; - int si; - - printf (_("\nSymbol table for image:\n")); - if (is_32bit_elf) - printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n")); - else - printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n")); - - for (hn = 0; hn < nbuckets; hn++) - { - if (! buckets [hn]) - continue; - - for (si = buckets [hn]; si < nchains && si > 0; si = chains [si]) - { - Elf_Internal_Sym * psym; - - psym = dynamic_symbols + si; - - printf (" %3d %3d: ", si, hn); - print_vma (psym->st_value, LONG_HEX); - putchar (' ' ); - print_vma (psym->st_size, DEC_5); - - printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info))); - printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info))); - printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other))); - printf (" %3.3s", get_symbol_index_type (psym->st_shndx)); - printf (" %s\n", dynamic_strings + psym->st_name); - } - } - } - else if (do_syms && !do_using_dynamic) - { - unsigned int i; - - for (i = 0, section = section_headers; - i < elf_header.e_shnum; - i++, section++) - { - unsigned int si; - char * strtab; - Elf_Internal_Sym * symtab; - Elf_Internal_Sym * psym; - - - if ( section->sh_type != SHT_SYMTAB - && section->sh_type != SHT_DYNSYM) - continue; - - printf (_("\nSymbol table '%s' contains %lu entries:\n"), - SECTION_NAME (section), - (unsigned long) (section->sh_size / section->sh_entsize)); - if (is_32bit_elf) - printf (_(" Num: Value Size Type Bind Vis Ndx Name\n")); - else - printf (_(" Num: Value Size Type Bind Vis Ndx Name\n")); - - symtab = GET_ELF_SYMBOLS (file, section->sh_offset, - section->sh_size / section->sh_entsize); - if (symtab == NULL) - continue; - - if (section->sh_link == elf_header.e_shstrndx) - strtab = string_table; - else - { - Elf32_Internal_Shdr * string_sec; - - string_sec = section_headers + section->sh_link; - - GET_DATA_ALLOC (string_sec->sh_offset, string_sec->sh_size, - strtab, char *, "string table"); - } - - for (si = 0, psym = symtab; - si < section->sh_size / section->sh_entsize; - si ++, psym ++) - { - printf ("%6d: ", si); - print_vma (psym->st_value, LONG_HEX); - putchar (' '); - print_vma (psym->st_size, DEC_5); - printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info))); - printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info))); - printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other))); - printf (" %4s", get_symbol_index_type (psym->st_shndx)); - printf (" %s", strtab + psym->st_name); - - if (section->sh_type == SHT_DYNSYM && - version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0) - { - unsigned char data[2]; - unsigned short vers_data; - unsigned long offset; - int is_nobits; - int check_def; - - offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)] - - loadaddr; - - GET_DATA (offset + si * sizeof (vers_data), data, - "version data"); - - vers_data = byte_get (data, 2); - - is_nobits = psym->st_shndx < SHN_LORESERVE ? - (section_headers [psym->st_shndx].sh_type == SHT_NOBITS) - : 0; - - check_def = (psym->st_shndx != SHN_UNDEF); - - if ((vers_data & 0x8000) || vers_data > 1) - { - if (is_nobits || ! check_def) - { - Elf_External_Verneed evn; - Elf_Internal_Verneed ivn; - Elf_Internal_Vernaux ivna; - - /* We must test both. */ - offset = version_info - [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr; - - do - { - unsigned long vna_off; - - GET_DATA (offset, evn, "version need"); - - ivn.vn_aux = BYTE_GET (evn.vn_aux); - ivn.vn_next = BYTE_GET (evn.vn_next); - - vna_off = offset + ivn.vn_aux; - - do - { - Elf_External_Vernaux evna; - - GET_DATA (vna_off, evna, - "version need aux (3)"); - - ivna.vna_other = BYTE_GET (evna.vna_other); - ivna.vna_next = BYTE_GET (evna.vna_next); - ivna.vna_name = BYTE_GET (evna.vna_name); - - vna_off += ivna.vna_next; - } - while (ivna.vna_other != vers_data - && ivna.vna_next != 0); - - if (ivna.vna_other == vers_data) - break; - - offset += ivn.vn_next; - } - while (ivn.vn_next != 0); - - if (ivna.vna_other == vers_data) - { - printf ("@%s (%d)", - strtab + ivna.vna_name, ivna.vna_other); - check_def = 0; - } - else if (! is_nobits) - error (_("bad dynamic symbol")); - else - check_def = 1; - } - - if (check_def) - { - if (vers_data != 0x8001) - { - Elf_Internal_Verdef ivd; - Elf_Internal_Verdaux ivda; - Elf_External_Verdaux evda; - unsigned long offset; - - offset = - version_info [DT_VERSIONTAGIDX (DT_VERDEF)] - - loadaddr; - - do - { - Elf_External_Verdef evd; - - GET_DATA (offset, evd, "version def"); - - ivd.vd_ndx = BYTE_GET (evd.vd_ndx); - ivd.vd_aux = BYTE_GET (evd.vd_aux); - ivd.vd_next = BYTE_GET (evd.vd_next); - - offset += ivd.vd_next; - } - while (ivd.vd_ndx != (vers_data & 0x7fff) - && ivd.vd_next != 0); - - offset -= ivd.vd_next; - offset += ivd.vd_aux; - - GET_DATA (offset, evda, "version def aux"); - - ivda.vda_name = BYTE_GET (evda.vda_name); - - if (psym->st_name != ivda.vda_name) - printf ((vers_data & 0x8000) - ? "@%s" : "@@%s", - strtab + ivda.vda_name); - } - } - } - } - - putchar ('\n'); - } - - free (symtab); - if (strtab != string_table) - free (strtab); - } - } - else if (do_syms) - printf - (_("\nDynamic symbol information is not available for displaying symbols.\n")); - - if (do_histogram && buckets != NULL) - { - int *lengths; - int *counts; - int hn; - int si; - int maxlength = 0; - int nzero_counts = 0; - int nsyms = 0; - - printf (_("\nHistogram for bucket list length (total of %d buckets):\n"), - nbuckets); - printf (_(" Length Number %% of total Coverage\n")); - - lengths = (int *) calloc (nbuckets, sizeof (int)); - if (lengths == NULL) - { - error (_("Out of memory")); - return 0; - } - for (hn = 0; hn < nbuckets; ++hn) - { - if (! buckets [hn]) - continue; - - for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si]) - { - ++ nsyms; - if (maxlength < ++lengths[hn]) - ++ maxlength; - } - } - - counts = (int *) calloc (maxlength + 1, sizeof (int)); - if (counts == NULL) - { - error (_("Out of memory")); - return 0; - } - - for (hn = 0; hn < nbuckets; ++hn) - ++ counts [lengths [hn]]; - - if (nbuckets > 0) - { - printf (" 0 %-10d (%5.1f%%)\n", - counts[0], (counts[0] * 100.0) / nbuckets); - for (si = 1; si <= maxlength; ++si) - { - nzero_counts += counts[si] * si; - printf ("%7d %-10d (%5.1f%%) %5.1f%%\n", - si, counts[si], (counts[si] * 100.0) / nbuckets, - (nzero_counts * 100.0) / nsyms); - } - } - - free (counts); - free (lengths); - } - - if (buckets != NULL) - { - free (buckets); - free (chains); - } - - return 1; -} - -static int -process_syminfo (file) - FILE * file ATTRIBUTE_UNUSED; -{ - unsigned int i; - - if (dynamic_syminfo == NULL - || !do_dynamic) - /* No syminfo, this is ok. */ - return 1; - - /* There better should be a dynamic symbol section. */ - if (dynamic_symbols == NULL || dynamic_strings == NULL) - return 0; - - if (dynamic_addr) - printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"), - dynamic_syminfo_offset, dynamic_syminfo_nent); - - printf (_(" Num: Name BoundTo Flags\n")); - for (i = 0; i < dynamic_syminfo_nent; ++i) - { - unsigned short int flags = dynamic_syminfo[i].si_flags; - - printf ("%4d: %-30s ", i, - dynamic_strings + dynamic_symbols[i].st_name); - - switch (dynamic_syminfo[i].si_boundto) - { - case SYMINFO_BT_SELF: - fputs ("SELF ", stdout); - break; - case SYMINFO_BT_PARENT: - fputs ("PARENT ", stdout); - break; - default: - if (dynamic_syminfo[i].si_boundto > 0 - && dynamic_syminfo[i].si_boundto < dynamic_size) - printf ("%-10s ", - dynamic_strings - + dynamic_segment[dynamic_syminfo[i].si_boundto].d_un.d_val); - else - printf ("%-10d ", dynamic_syminfo[i].si_boundto); - break; - } - - if (flags & SYMINFO_FLG_DIRECT) - printf (" DIRECT"); - if (flags & SYMINFO_FLG_PASSTHRU) - printf (" PASSTHRU"); - if (flags & SYMINFO_FLG_COPY) - printf (" COPY"); - if (flags & SYMINFO_FLG_LAZYLOAD) - printf (" LAZYLOAD"); - - puts (""); - } - - return 1; -} - -#ifdef SUPPORT_DISASSEMBLY -static void -disassemble_section (section, file) - Elf32_Internal_Shdr * section; - FILE * file; -{ - printf (_("\nAssembly dump of section %s\n"), - SECTION_NAME (section)); - - /* XXX -- to be done --- XXX */ - - return 1; -} -#endif - -static int -dump_section (section, file) - Elf32_Internal_Shdr * section; - FILE * file; -{ - bfd_size_type bytes; - bfd_vma addr; - unsigned char * data; - unsigned char * start; - - bytes = section->sh_size; - - if (bytes == 0) - { - printf (_("\nSection '%s' has no data to dump.\n"), - SECTION_NAME (section)); - return 0; - } - else - printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section)); - - addr = section->sh_addr; - - GET_DATA_ALLOC (section->sh_offset, bytes, start, unsigned char *, - "section data"); - - data = start; - - while (bytes) - { - int j; - int k; - int lbytes; - - lbytes = (bytes > 16 ? 16 : bytes); - - printf (" 0x%8.8lx ", (unsigned long) addr); - - switch (elf_header.e_ident [EI_DATA]) - { - default: - case ELFDATA2LSB: - for (j = 15; j >= 0; j --) - { - if (j < lbytes) - printf ("%2.2x", data [j]); - else - printf (" "); - - if (!(j & 0x3)) - printf (" "); - } - break; - - case ELFDATA2MSB: - for (j = 0; j < 16; j++) - { - if (j < lbytes) - printf ("%2.2x", data [j]); - else - printf (" "); - - if ((j & 3) == 3) - printf (" "); - } - break; - } - - for (j = 0; j < lbytes; j++) - { - k = data [j]; - if (k >= ' ' && k < 0x80) - printf ("%c", k); - else - printf ("."); - } - - putchar ('\n'); - - data += lbytes; - addr += lbytes; - bytes -= lbytes; - } - - free (start); - - return 1; -} - - -static unsigned long int -read_leb128 (data, length_return, sign) - unsigned char * data; - int * length_return; - int sign; -{ - unsigned long int result = 0; - unsigned int num_read = 0; - int shift = 0; - unsigned char byte; - - do - { - byte = * data ++; - num_read ++; - - result |= (byte & 0x7f) << shift; - - shift += 7; - - } - while (byte & 0x80); - - if (length_return != NULL) - * length_return = num_read; - - if (sign && (shift < 32) && (byte & 0x40)) - result |= -1 << shift; - - return result; -} - -typedef struct State_Machine_Registers -{ - unsigned long address; - unsigned int file; - unsigned int line; - unsigned int column; - int is_stmt; - int basic_block; - int end_sequence; -/* This variable hold the number of the last entry seen - in the File Table. */ - unsigned int last_file_entry; -} SMR; - -static SMR state_machine_regs; - -static void -reset_state_machine (is_stmt) - int is_stmt; -{ - state_machine_regs.address = 0; - state_machine_regs.file = 1; - state_machine_regs.line = 1; - state_machine_regs.column = 0; - state_machine_regs.is_stmt = is_stmt; - state_machine_regs.basic_block = 0; - state_machine_regs.end_sequence = 0; - state_machine_regs.last_file_entry = 0; -} - -/* Handled an extend line op. Returns true if this is the end - of sequence. */ -static int -process_extended_line_op (data, is_stmt, pointer_size) - unsigned char * data; - int is_stmt; - int pointer_size; -{ - unsigned char op_code; - int bytes_read; - unsigned int len; - unsigned char * name; - unsigned long adr; - - len = read_leb128 (data, & bytes_read, 0); - data += bytes_read; - - if (len == 0) - { - warn (_("badly formed extended line op encountered!")); - return bytes_read; - } - - len += bytes_read; - op_code = * data ++; - - printf (_(" Extended opcode %d: "), op_code); - - switch (op_code) - { - case DW_LNE_end_sequence: - printf (_("End of Sequence\n\n")); - reset_state_machine (is_stmt); - break; - - case DW_LNE_set_address: - adr = byte_get (data, pointer_size); - printf (_("set Address to 0x%lx\n"), adr); - state_machine_regs.address = adr; - break; - - case DW_LNE_define_file: - printf (_(" define new File Table entry\n")); - printf (_(" Entry\tDir\tTime\tSize\tName\n")); - - printf (_(" %d\t"), ++ state_machine_regs.last_file_entry); - name = data; - data += strlen (data) + 1; - printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0)); - data += bytes_read; - printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0)); - data += bytes_read; - printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0)); - printf (_("%s\n\n"), name); - break; - - default: - printf (_("UNKNOWN: length %d\n"), len - bytes_read); - break; - } - - return len; -} - -/* Size of pointers in the .debug_line section. This information is not - really present in that section. It's obtained before dumping the debug - sections by doing some pre-scan of the .debug_info section. */ -static int debug_line_pointer_size = 4; - -static int -display_debug_lines (section, start, file) - Elf32_Internal_Shdr * section; - unsigned char * start; - FILE * file ATTRIBUTE_UNUSED; -{ - DWARF2_External_LineInfo * external; - DWARF2_Internal_LineInfo info; - unsigned char * standard_opcodes; - unsigned char * data = start; - unsigned char * end = start + section->sh_size; - unsigned char * end_of_sequence; - int i; - - printf (_("\nDump of debug contents of section %s:\n\n"), - SECTION_NAME (section)); - - while (data < end) - { - external = (DWARF2_External_LineInfo *) data; - - /* Check the length of the block. */ - info.li_length = BYTE_GET (external->li_length); - if (info.li_length > section->sh_size) - { - warn - (_("The line info appears to be corrupt - the section is too small\n")); - return 0; - } - - /* Check its version number. */ - info.li_version = BYTE_GET (external->li_version); - if (info.li_version != 2) - { - warn (_("Only DWARF version 2 line info is currently supported.\n")); - return 0; - } - - info.li_prologue_length = BYTE_GET (external->li_prologue_length); - info.li_min_insn_length = BYTE_GET (external->li_min_insn_length); - info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt); - info.li_line_base = BYTE_GET (external->li_line_base); - info.li_line_range = BYTE_GET (external->li_line_range); - info.li_opcode_base = BYTE_GET (external->li_opcode_base); - - /* Sign extend the line base field. */ - info.li_line_base <<= 24; - info.li_line_base >>= 24; - - printf (_(" Length: %ld\n"), info.li_length); - printf (_(" DWARF Version: %d\n"), info.li_version); - printf (_(" Prolgue Length: %d\n"), info.li_prologue_length); - printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length); - printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt); - printf (_(" Line Base: %d\n"), info.li_line_base); - printf (_(" Line Range: %d\n"), info.li_line_range); - printf (_(" Opcode Base: %d\n"), info.li_opcode_base); - - end_of_sequence = data + info.li_length + sizeof (info.li_length); - - reset_state_machine (info.li_default_is_stmt); - - /* Display the contents of the Opcodes table. */ - standard_opcodes = data + sizeof (* external); - - printf (_("\n Opcodes:\n")); - - for (i = 1; i < info.li_opcode_base; i++) - printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]); - - /* Display the contents of the Directory table. */ - data = standard_opcodes + info.li_opcode_base - 1; - - if (* data == 0) - printf (_("\n The Directory Table is empty.\n")); - else - { - printf (_("\n The Directory Table:\n")); - - while (* data != 0) - { - printf (_(" %s\n"), data); - - data += strlen (data) + 1; - } - } - - /* Skip the NUL at the end of the table. */ - data ++; - - /* Display the contents of the File Name table. */ - if (* data == 0) - printf (_("\n The File Name Table is empty.\n")); - else - { - printf (_("\n The File Name Table:\n")); - printf (_(" Entry\tDir\tTime\tSize\tName\n")); - - while (* data != 0) - { - char * name; - int bytes_read; - - printf (_(" %d\t"), ++ state_machine_regs.last_file_entry); - name = data; - - data += strlen (data) + 1; - - printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0)); - data += bytes_read; - printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0)); - data += bytes_read; - printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0)); - data += bytes_read; - printf (_("%s\n"), name); - } - } - - /* Skip the NUL at the end of the table. */ - data ++; - - /* Now display the statements. */ - printf (_("\n Line Number Statements:\n")); - - - while (data < end_of_sequence) - { - unsigned char op_code; - int adv; - int bytes_read; - - op_code = * data ++; - - switch (op_code) - { - case DW_LNS_extended_op: - data += process_extended_line_op (data, info.li_default_is_stmt, - debug_line_pointer_size); - break; - - case DW_LNS_copy: - printf (_(" Copy\n")); - break; - - case DW_LNS_advance_pc: - adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0); - data += bytes_read; - state_machine_regs.address += adv; - printf (_(" Advance PC by %d to %lx\n"), adv, - state_machine_regs.address); - break; - - case DW_LNS_advance_line: - adv = read_leb128 (data, & bytes_read, 1); - data += bytes_read; - state_machine_regs.line += adv; - printf (_(" Advance Line by %d to %d\n"), adv, - state_machine_regs.line); - break; - - case DW_LNS_set_file: - adv = read_leb128 (data, & bytes_read, 0); - data += bytes_read; - printf (_(" Set File Name to entry %d in the File Name Table\n"), - adv); - state_machine_regs.file = adv; - break; - - case DW_LNS_set_column: - adv = read_leb128 (data, & bytes_read, 0); - data += bytes_read; - printf (_(" Set column to %d\n"), adv); - state_machine_regs.column = adv; - break; - - case DW_LNS_negate_stmt: - adv = state_machine_regs.is_stmt; - adv = ! adv; - printf (_(" Set is_stmt to %d\n"), adv); - state_machine_regs.is_stmt = adv; - break; - - case DW_LNS_set_basic_block: - printf (_(" Set basic block\n")); - state_machine_regs.basic_block = 1; - break; - - case DW_LNS_const_add_pc: - adv = (((255 - info.li_opcode_base) / info.li_line_range) - * info.li_min_insn_length); - state_machine_regs.address += adv; - printf (_(" Advance PC by constant %d to 0x%lx\n"), adv, - state_machine_regs.address); - break; - - case DW_LNS_fixed_advance_pc: - adv = byte_get (data, 2); - data += 2; - state_machine_regs.address += adv; - printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"), - adv, state_machine_regs.address); - break; - - default: - op_code -= info.li_opcode_base; - adv = (op_code / info.li_line_range) * info.li_min_insn_length; - state_machine_regs.address += adv; - printf (_(" Special opcode %d: advance Address by %d to 0x%lx"), - op_code, adv, state_machine_regs.address); - adv = (op_code % info.li_line_range) + info.li_line_base; - state_machine_regs.line += adv; - printf (_(" and Line by %d to %d\n"), - adv, state_machine_regs.line); - break; - } - } - printf ("\n"); - } - - return 1; -} - -static int -display_debug_pubnames (section, start, file) - Elf32_Internal_Shdr * section; - unsigned char * start; - FILE * file ATTRIBUTE_UNUSED; -{ - DWARF2_External_PubNames * external; - DWARF2_Internal_PubNames pubnames; - unsigned char * end; - - end = start + section->sh_size; - - printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section)); - - while (start < end) - { - unsigned char * data; - unsigned long offset; - - external = (DWARF2_External_PubNames *) start; - - pubnames.pn_length = BYTE_GET (external->pn_length); - pubnames.pn_version = BYTE_GET (external->pn_version); - pubnames.pn_offset = BYTE_GET (external->pn_offset); - pubnames.pn_size = BYTE_GET (external->pn_size); - - data = start + sizeof (* external); - start += pubnames.pn_length + sizeof (external->pn_length); - - if (pubnames.pn_version != 2) - { - warn (_("Only DWARF 2 pubnames are currently supported")); - continue; - } - - printf (_(" Length: %ld\n"), - pubnames.pn_length); - printf (_(" Version: %d\n"), - pubnames.pn_version); - printf (_(" Offset into .debug_info section: %ld\n"), - pubnames.pn_offset); - printf (_(" Size of area in .debug_info section: %ld\n"), - pubnames.pn_size); - - printf (_("\n Offset\tName\n")); - - do - { - offset = byte_get (data, 4); - - if (offset != 0) - { - data += 4; - printf (" %ld\t\t%s\n", offset, data); - data += strlen (data) + 1; - } - } - while (offset != 0); - } - - printf ("\n"); - return 1; -} - -static char * -get_TAG_name (tag) - unsigned long tag; -{ - switch (tag) - { - case DW_TAG_padding: return "DW_TAG_padding"; - case DW_TAG_array_type: return "DW_TAG_array_type"; - case DW_TAG_class_type: return "DW_TAG_class_type"; - case DW_TAG_entry_point: return "DW_TAG_entry_point"; - case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type"; - case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter"; - case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration"; - case DW_TAG_label: return "DW_TAG_label"; - case DW_TAG_lexical_block: return "DW_TAG_lexical_block"; - case DW_TAG_member: return "DW_TAG_member"; - case DW_TAG_pointer_type: return "DW_TAG_pointer_type"; - case DW_TAG_reference_type: return "DW_TAG_reference_type"; - case DW_TAG_compile_unit: return "DW_TAG_compile_unit"; - case DW_TAG_string_type: return "DW_TAG_string_type"; - case DW_TAG_structure_type: return "DW_TAG_structure_type"; - case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type"; - case DW_TAG_typedef: return "DW_TAG_typedef"; - case DW_TAG_union_type: return "DW_TAG_union_type"; - case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters"; - case DW_TAG_variant: return "DW_TAG_variant"; - case DW_TAG_common_block: return "DW_TAG_common_block"; - case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion"; - case DW_TAG_inheritance: return "DW_TAG_inheritance"; - case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine"; - case DW_TAG_module: return "DW_TAG_module"; - case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type"; - case DW_TAG_set_type: return "DW_TAG_set_type"; - case DW_TAG_subrange_type: return "DW_TAG_subrange_type"; - case DW_TAG_with_stmt: return "DW_TAG_with_stmt"; - case DW_TAG_access_declaration: return "DW_TAG_access_declaration"; - case DW_TAG_base_type: return "DW_TAG_base_type"; - case DW_TAG_catch_block: return "DW_TAG_catch_block"; - case DW_TAG_const_type: return "DW_TAG_const_type"; - case DW_TAG_constant: return "DW_TAG_constant"; - case DW_TAG_enumerator: return "DW_TAG_enumerator"; - case DW_TAG_file_type: return "DW_TAG_file_type"; - case DW_TAG_friend: return "DW_TAG_friend"; - case DW_TAG_namelist: return "DW_TAG_namelist"; - case DW_TAG_namelist_item: return "DW_TAG_namelist_item"; - case DW_TAG_packed_type: return "DW_TAG_packed_type"; - case DW_TAG_subprogram: return "DW_TAG_subprogram"; - case DW_TAG_template_type_param: return "DW_TAG_template_type_param"; - case DW_TAG_template_value_param: return "DW_TAG_template_value_param"; - case DW_TAG_thrown_type: return "DW_TAG_thrown_type"; - case DW_TAG_try_block: return "DW_TAG_try_block"; - case DW_TAG_variant_part: return "DW_TAG_variant_part"; - case DW_TAG_variable: return "DW_TAG_variable"; - case DW_TAG_volatile_type: return "DW_TAG_volatile_type"; - case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop"; - case DW_TAG_format_label: return "DW_TAG_format_label"; - case DW_TAG_function_template: return "DW_TAG_function_template"; - case DW_TAG_class_template: return "DW_TAG_class_template"; - default: - { - static char buffer [100]; - - sprintf (buffer, _("Unknown TAG value: %lx"), tag); - return buffer; - } - } -} - -static char * -get_AT_name (attribute) - unsigned long attribute; -{ - switch (attribute) - { - case DW_AT_sibling: return "DW_AT_sibling"; - case DW_AT_location: return "DW_AT_location"; - case DW_AT_name: return "DW_AT_name"; - case DW_AT_ordering: return "DW_AT_ordering"; - case DW_AT_subscr_data: return "DW_AT_subscr_data"; - case DW_AT_byte_size: return "DW_AT_byte_size"; - case DW_AT_bit_offset: return "DW_AT_bit_offset"; - case DW_AT_bit_size: return "DW_AT_bit_size"; - case DW_AT_element_list: return "DW_AT_element_list"; - case DW_AT_stmt_list: return "DW_AT_stmt_list"; - case DW_AT_low_pc: return "DW_AT_low_pc"; - case DW_AT_high_pc: return "DW_AT_high_pc"; - case DW_AT_language: return "DW_AT_language"; - case DW_AT_member: return "DW_AT_member"; - case DW_AT_discr: return "DW_AT_discr"; - case DW_AT_discr_value: return "DW_AT_discr_value"; - case DW_AT_visibility: return "DW_AT_visibility"; - case DW_AT_import: return "DW_AT_import"; - case DW_AT_string_length: return "DW_AT_string_length"; - case DW_AT_common_reference: return "DW_AT_common_reference"; - case DW_AT_comp_dir: return "DW_AT_comp_dir"; - case DW_AT_const_value: return "DW_AT_const_value"; - case DW_AT_containing_type: return "DW_AT_containing_type"; - case DW_AT_default_value: return "DW_AT_default_value"; - case DW_AT_inline: return "DW_AT_inline"; - case DW_AT_is_optional: return "DW_AT_is_optional"; - case DW_AT_lower_bound: return "DW_AT_lower_bound"; - case DW_AT_producer: return "DW_AT_producer"; - case DW_AT_prototyped: return "DW_AT_prototyped"; - case DW_AT_return_addr: return "DW_AT_return_addr"; - case DW_AT_start_scope: return "DW_AT_start_scope"; - case DW_AT_stride_size: return "DW_AT_stride_size"; - case DW_AT_upper_bound: return "DW_AT_upper_bound"; - case DW_AT_abstract_origin: return "DW_AT_abstract_origin"; - case DW_AT_accessibility: return "DW_AT_accessibility"; - case DW_AT_address_class: return "DW_AT_address_class"; - case DW_AT_artificial: return "DW_AT_artificial"; - case DW_AT_base_types: return "DW_AT_base_types"; - case DW_AT_calling_convention: return "DW_AT_calling_convention"; - case DW_AT_count: return "DW_AT_count"; - case DW_AT_data_member_location: return "DW_AT_data_member_location"; - case DW_AT_decl_column: return "DW_AT_decl_column"; - case DW_AT_decl_file: return "DW_AT_decl_file"; - case DW_AT_decl_line: return "DW_AT_decl_line"; - case DW_AT_declaration: return "DW_AT_declaration"; - case DW_AT_discr_list: return "DW_AT_discr_list"; - case DW_AT_encoding: return "DW_AT_encoding"; - case DW_AT_external: return "DW_AT_external"; - case DW_AT_frame_base: return "DW_AT_frame_base"; - case DW_AT_friend: return "DW_AT_friend"; - case DW_AT_identifier_case: return "DW_AT_identifier_case"; - case DW_AT_macro_info: return "DW_AT_macro_info"; - case DW_AT_namelist_items: return "DW_AT_namelist_items"; - case DW_AT_priority: return "DW_AT_priority"; - case DW_AT_segment: return "DW_AT_segment"; - case DW_AT_specification: return "DW_AT_specification"; - case DW_AT_static_link: return "DW_AT_static_link"; - case DW_AT_type: return "DW_AT_type"; - case DW_AT_use_location: return "DW_AT_use_location"; - case DW_AT_variable_parameter: return "DW_AT_variable_parameter"; - case DW_AT_virtuality: return "DW_AT_virtuality"; - case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location"; - case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde"; - case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin"; - case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin"; - case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin"; - case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor"; - case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth"; - case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name"; - case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride"; - case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name"; - case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin"; - case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines"; - case DW_AT_sf_names: return "DW_AT_sf_names"; - case DW_AT_src_info: return "DW_AT_src_info"; - case DW_AT_mac_info: return "DW_AT_mac_info"; - case DW_AT_src_coords: return "DW_AT_src_coords"; - case DW_AT_body_begin: return "DW_AT_body_begin"; - case DW_AT_body_end: return "DW_AT_body_end"; - default: - { - static char buffer [100]; - - sprintf (buffer, _("Unknown AT value: %lx"), attribute); - return buffer; - } - } -} - -static char * -get_FORM_name (form) - unsigned long form; -{ - switch (form) - { - case DW_FORM_addr: return "DW_FORM_addr"; - case DW_FORM_block2: return "DW_FORM_block2"; - case DW_FORM_block4: return "DW_FORM_block4"; - case DW_FORM_data2: return "DW_FORM_data2"; - case DW_FORM_data4: return "DW_FORM_data4"; - case DW_FORM_data8: return "DW_FORM_data8"; - case DW_FORM_string: return "DW_FORM_string"; - case DW_FORM_block: return "DW_FORM_block"; - case DW_FORM_block1: return "DW_FORM_block1"; - case DW_FORM_data1: return "DW_FORM_data1"; - case DW_FORM_flag: return "DW_FORM_flag"; - case DW_FORM_sdata: return "DW_FORM_sdata"; - case DW_FORM_strp: return "DW_FORM_strp"; - case DW_FORM_udata: return "DW_FORM_udata"; - case DW_FORM_ref_addr: return "DW_FORM_ref_addr"; - case DW_FORM_ref1: return "DW_FORM_ref1"; - case DW_FORM_ref2: return "DW_FORM_ref2"; - case DW_FORM_ref4: return "DW_FORM_ref4"; - case DW_FORM_ref8: return "DW_FORM_ref8"; - case DW_FORM_ref_udata: return "DW_FORM_ref_udata"; - case DW_FORM_indirect: return "DW_FORM_indirect"; - default: - { - static char buffer [100]; - - sprintf (buffer, _("Unknown FORM value: %lx"), form); - return buffer; - } - } -} - -/* FIXME: There are better and more effiecint ways to handle - these structures. For now though, I just want something that - is simple to implement. */ -typedef struct abbrev_attr -{ - unsigned long attribute; - unsigned long form; - struct abbrev_attr * next; -} -abbrev_attr; - -typedef struct abbrev_entry -{ - unsigned long entry; - unsigned long tag; - int children; - struct abbrev_attr * first_attr; - struct abbrev_attr * last_attr; - struct abbrev_entry * next; -} -abbrev_entry; - -static abbrev_entry * first_abbrev = NULL; -static abbrev_entry * last_abbrev = NULL; - -static void -free_abbrevs PARAMS ((void)) -{ - abbrev_entry * abbrev; - - for (abbrev = first_abbrev; abbrev;) - { - abbrev_entry * next = abbrev->next; - abbrev_attr * attr; - - for (attr = abbrev->first_attr; attr;) - { - abbrev_attr * next = attr->next; - - free (attr); - attr = next; - } - - free (abbrev); - abbrev = next; - } - - last_abbrev = first_abbrev = NULL; -} - -static void -add_abbrev (number, tag, children) - unsigned long number; - unsigned long tag; - int children; -{ - abbrev_entry * entry; - - entry = (abbrev_entry *) malloc (sizeof (* entry)); - - if (entry == NULL) - /* ugg */ - return; - - entry->entry = number; - entry->tag = tag; - entry->children = children; - entry->first_attr = NULL; - entry->last_attr = NULL; - entry->next = NULL; - - if (first_abbrev == NULL) - first_abbrev = entry; - else - last_abbrev->next = entry; - - last_abbrev = entry; -} - -static void -add_abbrev_attr (attribute, form) - unsigned long attribute; - unsigned long form; -{ - abbrev_attr * attr; - - attr = (abbrev_attr *) malloc (sizeof (* attr)); - - if (attr == NULL) - /* ugg */ - return; - - attr->attribute = attribute; - attr->form = form; - attr->next = NULL; - - if (last_abbrev->first_attr == NULL) - last_abbrev->first_attr = attr; - else - last_abbrev->last_attr->next = attr; - - last_abbrev->last_attr = attr; -} - -/* Processes the (partial) contents of a .debug_abbrev section. - Returns NULL if the end of the section was encountered. - Returns the address after the last byte read if the end of - an abbreviation set was found. */ - -static unsigned char * -process_abbrev_section (start, end) - unsigned char * start; - unsigned char * end; -{ - if (first_abbrev != NULL) - return NULL; - - while (start < end) - { - int bytes_read; - unsigned long entry; - unsigned long tag; - unsigned long attribute; - int children; - - entry = read_leb128 (start, & bytes_read, 0); - start += bytes_read; - - /* A single zero is supposed to end the section according - to the standard. If there's more, then signal that to - the caller. */ - if (entry == 0) - return start == end ? NULL : start; - - tag = read_leb128 (start, & bytes_read, 0); - start += bytes_read; - - children = * start ++; - - add_abbrev (entry, tag, children); - - do - { - unsigned long form; - - attribute = read_leb128 (start, & bytes_read, 0); - start += bytes_read; - - form = read_leb128 (start, & bytes_read, 0); - start += bytes_read; - - if (attribute != 0) - add_abbrev_attr (attribute, form); - } - while (attribute != 0); - } - - return NULL; -} - - -static int -display_debug_abbrev (section, start, file) - Elf32_Internal_Shdr * section; - unsigned char * start; - FILE * file ATTRIBUTE_UNUSED; -{ - abbrev_entry * entry; - unsigned char * end = start + section->sh_size; - - printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section)); - - do - { - start = process_abbrev_section (start, end); - - printf (_(" Number TAG\n")); - - for (entry = first_abbrev; entry; entry = entry->next) - { - abbrev_attr * attr; - - printf (_(" %ld %s [%s]\n"), - entry->entry, - get_TAG_name (entry->tag), - entry->children ? _("has children") : _("no children")); - - for (attr = entry->first_attr; attr; attr = attr->next) - { - printf (_(" %-18s %s\n"), - get_AT_name (attr->attribute), - get_FORM_name (attr->form)); - } - } - } - while (start); - - printf ("\n"); - - return 1; -} - - -static unsigned char * -display_block (data, length) - unsigned char * data; - unsigned long length; -{ - printf (_(" %lu byte block: "), length); - - while (length --) - printf ("%lx ", (unsigned long) byte_get (data ++, 1)); - - return data; -} - -static void -decode_location_expression (data, pointer_size, length) - unsigned char * data; - unsigned int pointer_size; - unsigned long length; -{ - unsigned op; - int bytes_read; - unsigned long uvalue; - unsigned char *end = data + length; - - while (data < end) - { - op = * data ++; - - switch (op) - { - case DW_OP_addr: - printf ("DW_OP_addr: %lx", - (unsigned long) byte_get (data, pointer_size)); - data += pointer_size; - break; - case DW_OP_deref: - printf ("DW_OP_deref"); - break; - case DW_OP_const1u: - printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1)); - break; - case DW_OP_const1s: - printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1)); - break; - case DW_OP_const2u: - printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2)); - data += 2; - break; - case DW_OP_const2s: - printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2)); - data += 2; - break; - case DW_OP_const4u: - printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4)); - data += 4; - break; - case DW_OP_const4s: - printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4)); - data += 4; - break; - case DW_OP_const8u: - printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4), - (unsigned long) byte_get (data + 4, 4)); - data += 8; - break; - case DW_OP_const8s: - printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4), - (long) byte_get (data + 4, 4)); - data += 8; - break; - case DW_OP_constu: - printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0)); - data += bytes_read; - break; - case DW_OP_consts: - printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1)); - data += bytes_read; - break; - case DW_OP_dup: - printf ("DW_OP_dup"); - break; - case DW_OP_drop: - printf ("DW_OP_drop"); - break; - case DW_OP_over: - printf ("DW_OP_over"); - break; - case DW_OP_pick: - printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1)); - break; - case DW_OP_swap: - printf ("DW_OP_swap"); - break; - case DW_OP_rot: - printf ("DW_OP_rot"); - break; - case DW_OP_xderef: - printf ("DW_OP_xderef"); - break; - case DW_OP_abs: - printf ("DW_OP_abs"); - break; - case DW_OP_and: - printf ("DW_OP_and"); - break; - case DW_OP_div: - printf ("DW_OP_div"); - break; - case DW_OP_minus: - printf ("DW_OP_minus"); - break; - case DW_OP_mod: - printf ("DW_OP_mod"); - break; - case DW_OP_mul: - printf ("DW_OP_mul"); - break; - case DW_OP_neg: - printf ("DW_OP_neg"); - break; - case DW_OP_not: - printf ("DW_OP_not"); - break; - case DW_OP_or: - printf ("DW_OP_or"); - break; - case DW_OP_plus: - printf ("DW_OP_plus"); - break; - case DW_OP_plus_uconst: - printf ("DW_OP_plus_uconst: %lu", - read_leb128 (data, &bytes_read, 0)); - data += bytes_read; - break; - case DW_OP_shl: - printf ("DW_OP_shl"); - break; - case DW_OP_shr: - printf ("DW_OP_shr"); - break; - case DW_OP_shra: - printf ("DW_OP_shra"); - break; - case DW_OP_xor: - printf ("DW_OP_xor"); - break; - case DW_OP_bra: - printf ("DW_OP_bra: %ld", (long) byte_get (data, 2)); - data += 2; - break; - case DW_OP_eq: - printf ("DW_OP_eq"); - break; - case DW_OP_ge: - printf ("DW_OP_ge"); - break; - case DW_OP_gt: - printf ("DW_OP_gt"); - break; - case DW_OP_le: - printf ("DW_OP_le"); - break; - case DW_OP_lt: - printf ("DW_OP_lt"); - break; - case DW_OP_ne: - printf ("DW_OP_ne"); - break; - case DW_OP_skip: - printf ("DW_OP_skip: %ld", (long) byte_get (data, 2)); - data += 2; - break; - - case DW_OP_lit0: - case DW_OP_lit1: - case DW_OP_lit2: - case DW_OP_lit3: - case DW_OP_lit4: - case DW_OP_lit5: - case DW_OP_lit6: - case DW_OP_lit7: - case DW_OP_lit8: - case DW_OP_lit9: - case DW_OP_lit10: - case DW_OP_lit11: - case DW_OP_lit12: - case DW_OP_lit13: - case DW_OP_lit14: - case DW_OP_lit15: - case DW_OP_lit16: - case DW_OP_lit17: - case DW_OP_lit18: - case DW_OP_lit19: - case DW_OP_lit20: - case DW_OP_lit21: - case DW_OP_lit22: - case DW_OP_lit23: - case DW_OP_lit24: - case DW_OP_lit25: - case DW_OP_lit26: - case DW_OP_lit27: - case DW_OP_lit28: - case DW_OP_lit29: - case DW_OP_lit30: - case DW_OP_lit31: - printf ("DW_OP_lit%d", op - DW_OP_lit0); - break; - - case DW_OP_reg0: - case DW_OP_reg1: - case DW_OP_reg2: - case DW_OP_reg3: - case DW_OP_reg4: - case DW_OP_reg5: - case DW_OP_reg6: - case DW_OP_reg7: - case DW_OP_reg8: - case DW_OP_reg9: - case DW_OP_reg10: - case DW_OP_reg11: - case DW_OP_reg12: - case DW_OP_reg13: - case DW_OP_reg14: - case DW_OP_reg15: - case DW_OP_reg16: - case DW_OP_reg17: - case DW_OP_reg18: - case DW_OP_reg19: - case DW_OP_reg20: - case DW_OP_reg21: - case DW_OP_reg22: - case DW_OP_reg23: - case DW_OP_reg24: - case DW_OP_reg25: - case DW_OP_reg26: - case DW_OP_reg27: - case DW_OP_reg28: - case DW_OP_reg29: - case DW_OP_reg30: - case DW_OP_reg31: - printf ("DW_OP_reg%d", op - DW_OP_reg0); - break; - - case DW_OP_breg0: - case DW_OP_breg1: - case DW_OP_breg2: - case DW_OP_breg3: - case DW_OP_breg4: - case DW_OP_breg5: - case DW_OP_breg6: - case DW_OP_breg7: - case DW_OP_breg8: - case DW_OP_breg9: - case DW_OP_breg10: - case DW_OP_breg11: - case DW_OP_breg12: - case DW_OP_breg13: - case DW_OP_breg14: - case DW_OP_breg15: - case DW_OP_breg16: - case DW_OP_breg17: - case DW_OP_breg18: - case DW_OP_breg19: - case DW_OP_breg20: - case DW_OP_breg21: - case DW_OP_breg22: - case DW_OP_breg23: - case DW_OP_breg24: - case DW_OP_breg25: - case DW_OP_breg26: - case DW_OP_breg27: - case DW_OP_breg28: - case DW_OP_breg29: - case DW_OP_breg30: - case DW_OP_breg31: - printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0, - read_leb128 (data, &bytes_read, 1)); - data += bytes_read; - break; - - case DW_OP_regx: - printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0)); - data += bytes_read; - break; - case DW_OP_fbreg: - printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1)); - data += bytes_read; - break; - case DW_OP_bregx: - uvalue = read_leb128 (data, &bytes_read, 0); - data += bytes_read; - printf ("DW_OP_bregx: %lu %ld", uvalue, - read_leb128 (data, &bytes_read, 1)); - data += bytes_read; - break; - case DW_OP_piece: - printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0)); - data += bytes_read; - break; - case DW_OP_deref_size: - printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1)); - break; - case DW_OP_xderef_size: - printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1)); - break; - case DW_OP_nop: - printf ("DW_OP_nop"); - break; - - default: - if (op >= DW_OP_lo_user - && op <= DW_OP_hi_user) - printf (_("(User defined location op)")); - else - printf (_("(Unknown location op)")); - /* No way to tell where the next op is, so just bail. */ - return; - } - } -} - - -static unsigned char * -read_and_display_attr (attribute, form, data, cu_offset, pointer_size) - unsigned long attribute; - unsigned long form; - unsigned char * data; - unsigned long cu_offset; - unsigned long pointer_size; -{ - unsigned long uvalue = 0; - unsigned char * block_start = NULL; - int bytes_read; - - printf (" %-18s:", get_AT_name (attribute)); - - switch (form) - { - case DW_FORM_ref_addr: - case DW_FORM_addr: - uvalue = byte_get (data, pointer_size); - data += pointer_size; - break; - - case DW_FORM_ref1: - case DW_FORM_flag: - case DW_FORM_data1: - uvalue = byte_get (data ++, 1); - break; - - case DW_FORM_ref2: - case DW_FORM_data2: - uvalue = byte_get (data, 2); - data += 2; - break; - - case DW_FORM_ref4: - case DW_FORM_data4: - uvalue = byte_get (data, 4); - data += 4; - break; - - case DW_FORM_sdata: - uvalue = read_leb128 (data, & bytes_read, 1); - data += bytes_read; - break; - - case DW_FORM_ref_udata: - case DW_FORM_udata: - uvalue = read_leb128 (data, & bytes_read, 0); - data += bytes_read; - break; - } - - switch (form) - { - case DW_FORM_ref_addr: - printf (" <#%lx>", uvalue); - break; - - case DW_FORM_ref1: - case DW_FORM_ref2: - case DW_FORM_ref4: - case DW_FORM_ref_udata: - printf (" <%lx>", uvalue + cu_offset); - break; - - case DW_FORM_addr: - printf (" %#lx", uvalue); - - case DW_FORM_flag: - case DW_FORM_data1: - case DW_FORM_data2: - case DW_FORM_data4: - case DW_FORM_sdata: - case DW_FORM_udata: - printf (" %ld", uvalue); - break; - - case DW_FORM_ref8: - case DW_FORM_data8: - uvalue = byte_get (data, 4); - printf (" %lx", uvalue); - printf (" %lx", (unsigned long) byte_get (data + 4, 4)); - data += 8; - break; - - case DW_FORM_string: - printf (" %s", data); - data += strlen (data) + 1; - break; - - case DW_FORM_block: - uvalue = read_leb128 (data, & bytes_read, 0); - block_start = data + bytes_read; - data = display_block (block_start, uvalue); - break; - - case DW_FORM_block1: - uvalue = byte_get (data, 1); - block_start = data + 1; - data = display_block (block_start, uvalue); - break; - - case DW_FORM_block2: - uvalue = byte_get (data, 2); - block_start = data + 2; - data = display_block (block_start, uvalue); - break; - - case DW_FORM_block4: - uvalue = byte_get (data, 4); - block_start = data + 4; - data = display_block (block_start, uvalue); - break; - - case DW_FORM_strp: - case DW_FORM_indirect: - warn (_("Unable to handle FORM: %d"), form); - break; - - default: - warn (_("Unrecognised form: %d"), form); - break; - } - - /* For some attributes we can display futher information. */ - - printf ("\t"); - - switch (attribute) - { - case DW_AT_inline: - switch (uvalue) - { - case DW_INL_not_inlined: printf (_("(not inlined)")); break; - case DW_INL_inlined: printf (_("(inlined)")); break; - case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break; - case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break; - default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break; - } - break; - - case DW_AT_language: - switch (uvalue) - { - case DW_LANG_C: printf ("(non-ANSI C)"); break; - case DW_LANG_C89: printf ("(ANSI C)"); break; - case DW_LANG_C_plus_plus: printf ("(C++)"); break; - case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break; - case DW_LANG_Fortran90: printf ("(Fortran 90)"); break; - case DW_LANG_Modula2: printf ("(Modula 2)"); break; - case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break; - case DW_LANG_Ada83: printf ("(Ada)"); break; - case DW_LANG_Cobol74: printf ("(Cobol 74)"); break; - case DW_LANG_Cobol85: printf ("(Cobol 85)"); break; - case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break; - default: printf ("(Unknown: %lx)", uvalue); break; - } - break; - - case DW_AT_encoding: - switch (uvalue) - { - case DW_ATE_void: printf ("(void)"); break; - case DW_ATE_address: printf ("(machine address)"); break; - case DW_ATE_boolean: printf ("(boolean)"); break; - case DW_ATE_complex_float: printf ("(complex float)"); break; - case DW_ATE_float: printf ("(float)"); break; - case DW_ATE_signed: printf ("(signed)"); break; - case DW_ATE_signed_char: printf ("(signed char)"); break; - case DW_ATE_unsigned: printf ("(unsigned)"); break; - case DW_ATE_unsigned_char: printf ("(unsigned char)"); break; - default: - if (uvalue >= DW_ATE_lo_user - && uvalue <= DW_ATE_hi_user) - printf ("(user defined type)"); - else - printf ("(unknown type)"); - break; - } - break; - - case DW_AT_accessibility: - switch (uvalue) - { - case DW_ACCESS_public: printf ("(public)"); break; - case DW_ACCESS_protected: printf ("(protected)"); break; - case DW_ACCESS_private: printf ("(private)"); break; - default: printf ("(unknown accessibility)"); break; - } - break; - - case DW_AT_visibility: - switch (uvalue) - { - case DW_VIS_local: printf ("(local)"); break; - case DW_VIS_exported: printf ("(exported)"); break; - case DW_VIS_qualified: printf ("(qualified)"); break; - default: printf ("(unknown visibility)"); break; - } - break; - - case DW_AT_virtuality: - switch (uvalue) - { - case DW_VIRTUALITY_none: printf ("(none)"); break; - case DW_VIRTUALITY_virtual: printf ("(virtual)"); break; - case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break; - default: printf ("(unknown virtuality)"); break; - } - break; - - case DW_AT_identifier_case: - switch (uvalue) - { - case DW_ID_case_sensitive: printf ("(case_sensitive)"); break; - case DW_ID_up_case: printf ("(up_case)"); break; - case DW_ID_down_case: printf ("(down_case)"); break; - case DW_ID_case_insensitive: printf ("(case_insensitive)"); break; - default: printf ("(unknown case)"); break; - } - break; - - case DW_AT_calling_convention: - switch (uvalue) - { - case DW_CC_normal: printf ("(normal)"); break; - case DW_CC_program: printf ("(program)"); break; - case DW_CC_nocall: printf ("(nocall)"); break; - default: - if (uvalue >= DW_CC_lo_user - && uvalue <= DW_CC_hi_user) - printf ("(user defined)"); - else - printf ("(unknown convention)"); - } - break; - - case DW_AT_frame_base: - case DW_AT_location: - case DW_AT_data_member_location: - case DW_AT_vtable_elem_location: - if (block_start) - { - printf ("("); - decode_location_expression (block_start, pointer_size, uvalue); - printf (")"); - } - break; - - default: - break; - } - - printf ("\n"); - return data; -} - -static int -display_debug_info (section, start, file) - Elf32_Internal_Shdr * section; - unsigned char * start; - FILE * file; -{ - unsigned char * end = start + section->sh_size; - unsigned char * section_begin = start; - - printf (_("The section %s contains:\n\n"), SECTION_NAME (section)); - - while (start < end) - { - DWARF2_External_CompUnit * external; - DWARF2_Internal_CompUnit compunit; - unsigned char * tags; - int i; - int level; - unsigned long cu_offset; - - external = (DWARF2_External_CompUnit *) start; - - compunit.cu_length = BYTE_GET (external->cu_length); - compunit.cu_version = BYTE_GET (external->cu_version); - compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset); - compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size); - - tags = start + sizeof (* external); - cu_offset = start - section_begin; - start += compunit.cu_length + sizeof (external->cu_length); - - if (compunit.cu_version != 2) - { - warn (_("Only version 2 DWARF debug information is currently supported.\n")); - continue; - } - - printf (_(" Compilation Unit:\n")); - printf (_(" Length: %ld\n"), compunit.cu_length); - printf (_(" Version: %d\n"), compunit.cu_version); - printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset); - printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size); - - if (first_abbrev != NULL) - free_abbrevs (); - - /* Read in the abbrevs used by this compilation unit. */ - - { - Elf32_Internal_Shdr * sec; - unsigned char * begin; - - /* Locate the .debug_abbrev section and process it. */ - for (i = 0, sec = section_headers; - i < elf_header.e_shnum; - i ++, sec ++) - if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0) - break; - - if (i == -1 || sec->sh_size == 0) - { - warn (_("Unable to locate .debug_abbrev section!\n")); - return 0; - } - - GET_DATA_ALLOC (sec->sh_offset, sec->sh_size, begin, unsigned char *, - "debug_abbrev section data"); - - process_abbrev_section (begin + compunit.cu_abbrev_offset, - begin + sec->sh_size); - - free (begin); - } - - level = 0; - while (tags < start) - { - int bytes_read; - unsigned long abbrev_number; - abbrev_entry * entry; - abbrev_attr * attr; - - abbrev_number = read_leb128 (tags, & bytes_read, 0); - tags += bytes_read; - - /* A null DIE marks the end of a list of children. */ - if (abbrev_number == 0) - { - --level; - continue; - } - - /* Scan through the abbreviation list until we reach the - correct entry. */ - for (entry = first_abbrev; - entry && entry->entry != abbrev_number; - entry = entry->next) - continue; - - if (entry == NULL) - { - warn (_("Unable to locate entry %lu in the abbreviation table\n"), - abbrev_number); - return 0; - } - - printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"), - level, tags - section_begin - bytes_read, - abbrev_number, - get_TAG_name (entry->tag)); - - for (attr = entry->first_attr; attr; attr = attr->next) - tags = read_and_display_attr (attr->attribute, - attr->form, - tags, cu_offset, - compunit.cu_pointer_size); - - if (entry->children) - ++level; - } - } - - printf ("\n"); - - return 1; -} - -static int -display_debug_aranges (section, start, file) - Elf32_Internal_Shdr * section; - unsigned char * start; - FILE * file ATTRIBUTE_UNUSED; -{ - unsigned char * end = start + section->sh_size; - - printf (_("The section %s contains:\n\n"), SECTION_NAME (section)); - - while (start < end) - { - DWARF2_External_ARange * external; - DWARF2_Internal_ARange arange; - unsigned char * ranges; - unsigned long length; - unsigned long address; - int excess; - - external = (DWARF2_External_ARange *) start; - - arange.ar_length = BYTE_GET (external->ar_length); - arange.ar_version = BYTE_GET (external->ar_version); - arange.ar_info_offset = BYTE_GET (external->ar_info_offset); - arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size); - arange.ar_segment_size = BYTE_GET (external->ar_segment_size); - - printf (_(" Length: %ld\n"), arange.ar_length); - printf (_(" Version: %d\n"), arange.ar_version); - printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset); - printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size); - printf (_(" Segment Size: %d\n"), arange.ar_segment_size); - - printf (_("\n Address Length\n")); - - ranges = start + sizeof (* external); - - /* Must pad to an alignment boundary that is twice the pointer size. */ - excess = sizeof (*external) % (2 * arange.ar_pointer_size); - if (excess) - ranges += (2 * arange.ar_pointer_size) - excess; - - for (;;) - { - address = byte_get (ranges, arange.ar_pointer_size); - - ranges += arange.ar_pointer_size; - - length = byte_get (ranges, arange.ar_pointer_size); - - ranges += arange.ar_pointer_size; - - /* A pair of zeros marks the end of the list. */ - if (address == 0 && length == 0) - break; - - printf (" %8.8lx %lu\n", address, length); - } - - start += arange.ar_length + sizeof (external->ar_length); - } - - printf ("\n"); - - return 1; -} - - -static int -display_debug_not_supported (section, start, file) - Elf32_Internal_Shdr * section; - unsigned char * start ATTRIBUTE_UNUSED; - FILE * file ATTRIBUTE_UNUSED; -{ - printf (_("Displaying the debug contents of section %s is not yet supported.\n"), - SECTION_NAME (section)); - - return 1; -} - -/* Pre-scan the .debug_info section to record the size of address. - When dumping the .debug_line, we use that size information, assuming - that all compilation units have the same address size. */ -static int -prescan_debug_info (section, start, file) - Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED; - unsigned char * start; - FILE * file ATTRIBUTE_UNUSED; -{ - DWARF2_External_CompUnit * external; - - external = (DWARF2_External_CompUnit *) start; - - debug_line_pointer_size = BYTE_GET (external->cu_pointer_size); - return 0; -} - - /* A structure containing the name of a debug section and a pointer - to a function that can decode it. The third field is a prescan - function to be run over the section before displaying any of the - sections. */ -struct -{ - char * name; - int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *)); - int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *)); -} -debug_displays[] = -{ - { ".debug_info", display_debug_info, prescan_debug_info }, - { ".debug_abbrev", display_debug_abbrev, NULL }, - { ".debug_line", display_debug_lines, NULL }, - { ".debug_aranges", display_debug_aranges, NULL }, - { ".debug_pubnames", display_debug_pubnames, NULL }, - { ".debug_macinfo", display_debug_not_supported, NULL }, - { ".debug_frame", display_debug_not_supported, NULL }, - { ".debug_str", display_debug_not_supported, NULL }, - { ".debug_static_func", display_debug_not_supported, NULL }, - { ".debug_static_vars", display_debug_not_supported, NULL }, - { ".debug_types", display_debug_not_supported, NULL }, - { ".debug_weaknames", display_debug_not_supported, NULL } -}; - -static int -display_debug_section (section, file) - Elf32_Internal_Shdr * section; - FILE * file; -{ - char * name = SECTION_NAME (section); - bfd_size_type length; - unsigned char * start; - int i; - - length = section->sh_size; - if (length == 0) - { - printf (_("\nSection '%s' has no debugging data.\n"), name); - return 0; - } - - GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *, - "debug section data"); - - /* See if we know how to display the contents of this section. */ - for (i = NUM_ELEM (debug_displays); i--;) - if (strcmp (debug_displays[i].name, name) == 0) - { - debug_displays[i].display (section, start, file); - break; - } - - if (i == -1) - printf (_("Unrecognised debug section: %s\n"), name); - - free (start); - - /* If we loaded in the abbrev section at some point, - we must release it here. */ - if (first_abbrev != NULL) - free_abbrevs (); - - return 1; -} - -static int -process_section_contents (file) - FILE * file; -{ - Elf32_Internal_Shdr * section; - unsigned int i; - - if (! do_dump) - return 1; - - /* Pre-scan the debug sections to find some debug information not - present in some of them. For the .debug_line, we must find out the - size of address (specified in .debug_info and .debug_aranges). */ - for (i = 0, section = section_headers; - i < elf_header.e_shnum && i < num_dump_sects; - i ++, section ++) - { - char * name = SECTION_NAME (section); - int j; - - if (section->sh_size == 0) - continue; - - /* See if there is some pre-scan operation for this section. */ - for (j = NUM_ELEM (debug_displays); j--;) - if (strcmp (debug_displays[j].name, name) == 0) - { - if (debug_displays[j].prescan != NULL) - { - bfd_size_type length; - unsigned char * start; - - length = section->sh_size; - GET_DATA_ALLOC (section->sh_offset, length, start, unsigned char *, - "debug section data"); - - debug_displays[j].prescan (section, start, file); - free (start); - } - - break; - } - } - - for (i = 0, section = section_headers; - i < elf_header.e_shnum && i < num_dump_sects; - i ++, section ++) - { -#ifdef SUPPORT_DISASSEMBLY - if (dump_sects[i] & DISASS_DUMP) - disassemble_section (section, file); -#endif - if (dump_sects[i] & HEX_DUMP) - dump_section (section, file); - - if (dump_sects[i] & DEBUG_DUMP) - display_debug_section (section, file); - } - - if (i < num_dump_sects) - warn (_("Some sections were not dumped because they do not exist!\n")); - - return 1; -} - -static void -process_mips_fpe_exception (mask) - int mask; -{ - if (mask) - { - int first = 1; - if (mask & OEX_FPU_INEX) - fputs ("INEX", stdout), first = 0; - if (mask & OEX_FPU_UFLO) - printf ("%sUFLO", first ? "" : "|"), first = 0; - if (mask & OEX_FPU_OFLO) - printf ("%sOFLO", first ? "" : "|"), first = 0; - if (mask & OEX_FPU_DIV0) - printf ("%sDIV0", first ? "" : "|"), first = 0; - if (mask & OEX_FPU_INVAL) - printf ("%sINVAL", first ? "" : "|"); - } - else - fputs ("0", stdout); -} - -static int -process_mips_specific (file) - FILE * file; -{ - Elf_Internal_Dyn * entry; - size_t liblist_offset = 0; - size_t liblistno = 0; - size_t conflictsno = 0; - size_t options_offset = 0; - size_t conflicts_offset = 0; - - /* We have a lot of special sections. Thanks SGI! */ - if (dynamic_segment == NULL) - /* No information available. */ - return 0; - - for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry) - switch (entry->d_tag) - { - case DT_MIPS_LIBLIST: - liblist_offset = entry->d_un.d_val - loadaddr; - break; - case DT_MIPS_LIBLISTNO: - liblistno = entry->d_un.d_val; - break; - case DT_MIPS_OPTIONS: - options_offset = entry->d_un.d_val - loadaddr; - break; - case DT_MIPS_CONFLICT: - conflicts_offset = entry->d_un.d_val - loadaddr; - break; - case DT_MIPS_CONFLICTNO: - conflictsno = entry->d_un.d_val; - break; - default: - break; - } - - if (liblist_offset != 0 && liblistno != 0 && do_dynamic) - { - Elf32_External_Lib * elib; - size_t cnt; - - GET_DATA_ALLOC (liblist_offset, liblistno * sizeof (Elf32_External_Lib), - elib, Elf32_External_Lib *, "liblist"); - - printf ("\nSection '.liblist' contains %lu entries:\n", - (unsigned long) liblistno); - fputs (" Library Time Stamp Checksum Version Flags\n", - stdout); - - for (cnt = 0; cnt < liblistno; ++cnt) - { - Elf32_Lib liblist; - time_t time; - char timebuf[20]; - - liblist.l_name = BYTE_GET (elib[cnt].l_name); - time = BYTE_GET (elib[cnt].l_time_stamp); - liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum); - liblist.l_version = BYTE_GET (elib[cnt].l_version); - liblist.l_flags = BYTE_GET (elib[cnt].l_flags); - - strftime (timebuf, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time)); - - printf ("%3lu: %-20s %s %#10lx %-7ld", (unsigned long) cnt, - dynamic_strings + liblist.l_name, timebuf, - liblist.l_checksum, liblist.l_version); - - if (liblist.l_flags == 0) - puts (" NONE"); - else - { - static const struct - { - const char * name; - int bit; - } - l_flags_vals[] = - { - { " EXACT_MATCH", LL_EXACT_MATCH }, - { " IGNORE_INT_VER", LL_IGNORE_INT_VER }, - { " REQUIRE_MINOR", LL_REQUIRE_MINOR }, - { " EXPORTS", LL_EXPORTS }, - { " DELAY_LOAD", LL_DELAY_LOAD }, - { " DELTA", LL_DELTA } - }; - int flags = liblist.l_flags; - size_t fcnt; - - for (fcnt = 0; - fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]); - ++fcnt) - if ((flags & l_flags_vals[fcnt].bit) != 0) - { - fputs (l_flags_vals[fcnt].name, stdout); - flags ^= l_flags_vals[fcnt].bit; - } - if (flags != 0) - printf (" %#x", (unsigned int) flags); - - puts (""); - } - } - - free (elib); - } - - if (options_offset != 0) - { - Elf_External_Options * eopt; - Elf_Internal_Shdr * sect = section_headers; - Elf_Internal_Options * iopt; - Elf_Internal_Options * option; - size_t offset; - int cnt; - - /* Find the section header so that we get the size. */ - while (sect->sh_type != SHT_MIPS_OPTIONS) - ++ sect; - - GET_DATA_ALLOC (options_offset, sect->sh_size, eopt, - Elf_External_Options *, "options"); - - iopt = (Elf_Internal_Options *) malloc ((sect->sh_size / sizeof (eopt)) - * sizeof (*iopt)); - if (iopt == NULL) - { - error (_("Out of memory")); - return 0; - } - - offset = cnt = 0; - option = iopt; - - while (offset < sect->sh_size) - { - Elf_External_Options * eoption; - - eoption = (Elf_External_Options *) ((char *) eopt + offset); - - option->kind = BYTE_GET (eoption->kind); - option->size = BYTE_GET (eoption->size); - option->section = BYTE_GET (eoption->section); - option->info = BYTE_GET (eoption->info); - - offset += option->size; - - ++option; - ++cnt; - } - - printf (_("\nSection '%s' contains %d entries:\n"), - string_table + sect->sh_name, cnt); - - option = iopt; - - while (cnt-- > 0) - { - size_t len; - - switch (option->kind) - { - case ODK_NULL: - /* This shouldn't happen. */ - printf (" NULL %d %lx", option->section, option->info); - break; - case ODK_REGINFO: - printf (" REGINFO "); - if (elf_header.e_machine == EM_MIPS) - { - /* 32bit form. */ - Elf32_External_RegInfo *ereg; - Elf32_RegInfo reginfo; - - ereg = (Elf32_External_RegInfo *) (option + 1); - reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask); - reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]); - reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]); - reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]); - reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]); - reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value); - - printf ("GPR %08lx GP 0x%lx\n", - reginfo.ri_gprmask, - (unsigned long) reginfo.ri_gp_value); - printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n", - reginfo.ri_cprmask[0], reginfo.ri_cprmask[1], - reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]); - } - else - { - /* 64 bit form. */ - Elf64_External_RegInfo * ereg; - Elf64_Internal_RegInfo reginfo; - - ereg = (Elf64_External_RegInfo *) (option + 1); - reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask); - reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]); - reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]); - reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]); - reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]); - reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value); - - printf ("GPR %08lx GP 0x", - reginfo.ri_gprmask); - printf_vma (reginfo.ri_gp_value); - printf ("\n"); - - printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n", - reginfo.ri_cprmask[0], reginfo.ri_cprmask[1], - reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]); - } - ++option; - continue; - case ODK_EXCEPTIONS: - fputs (" EXCEPTIONS fpe_min(", stdout); - process_mips_fpe_exception (option->info & OEX_FPU_MIN); - fputs (") fpe_max(", stdout); - process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8); - fputs (")", stdout); - - if (option->info & OEX_PAGE0) - fputs (" PAGE0", stdout); - if (option->info & OEX_SMM) - fputs (" SMM", stdout); - if (option->info & OEX_FPDBUG) - fputs (" FPDBUG", stdout); - if (option->info & OEX_DISMISS) - fputs (" DISMISS", stdout); - break; - case ODK_PAD: - fputs (" PAD ", stdout); - if (option->info & OPAD_PREFIX) - fputs (" PREFIX", stdout); - if (option->info & OPAD_POSTFIX) - fputs (" POSTFIX", stdout); - if (option->info & OPAD_SYMBOL) - fputs (" SYMBOL", stdout); - break; - case ODK_HWPATCH: - fputs (" HWPATCH ", stdout); - if (option->info & OHW_R4KEOP) - fputs (" R4KEOP", stdout); - if (option->info & OHW_R8KPFETCH) - fputs (" R8KPFETCH", stdout); - if (option->info & OHW_R5KEOP) - fputs (" R5KEOP", stdout); - if (option->info & OHW_R5KCVTL) - fputs (" R5KCVTL", stdout); - break; - case ODK_FILL: - fputs (" FILL ", stdout); - /* XXX Print content of info word? */ - break; - case ODK_TAGS: - fputs (" TAGS ", stdout); - /* XXX Print content of info word? */ - break; - case ODK_HWAND: - fputs (" HWAND ", stdout); - if (option->info & OHWA0_R4KEOP_CHECKED) - fputs (" R4KEOP_CHECKED", stdout); - if (option->info & OHWA0_R4KEOP_CLEAN) - fputs (" R4KEOP_CLEAN", stdout); - break; - case ODK_HWOR: - fputs (" HWOR ", stdout); - if (option->info & OHWA0_R4KEOP_CHECKED) - fputs (" R4KEOP_CHECKED", stdout); - if (option->info & OHWA0_R4KEOP_CLEAN) - fputs (" R4KEOP_CLEAN", stdout); - break; - case ODK_GP_GROUP: - printf (" GP_GROUP %#06lx self-contained %#06lx", - option->info & OGP_GROUP, - (option->info & OGP_SELF) >> 16); - break; - case ODK_IDENT: - printf (" IDENT %#06lx self-contained %#06lx", - option->info & OGP_GROUP, - (option->info & OGP_SELF) >> 16); - break; - default: - /* This shouldn't happen. */ - printf (" %3d ??? %d %lx", - option->kind, option->section, option->info); - break; - } - - len = sizeof (*eopt); - while (len < option->size) - if (((char *) option)[len] >= ' ' - && ((char *) option)[len] < 0x7f) - printf ("%c", ((char *) option)[len++]); - else - printf ("\\%03o", ((char *) option)[len++]); - - fputs ("\n", stdout); - ++option; - } - - free (eopt); - } - - if (conflicts_offset != 0 && conflictsno != 0) - { - Elf32_External_Conflict * econf32; - Elf64_External_Conflict * econf64; - Elf32_Conflict * iconf; - size_t cnt; - - if (dynamic_symbols == NULL) - { - error (_("conflict list with without table")); - return 0; - } - - iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf)); - if (iconf == NULL) - { - error (_("Out of memory")); - return 0; - } - - if (is_32bit_elf) - { - GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf32), - econf32, Elf32_External_Conflict *, "conflict"); - - for (cnt = 0; cnt < conflictsno; ++cnt) - iconf[cnt] = BYTE_GET (econf32[cnt]); - } - else - { - GET_DATA_ALLOC (conflicts_offset, conflictsno * sizeof (*econf64), - econf64, Elf64_External_Conflict *, "conflict"); - - for (cnt = 0; cnt < conflictsno; ++cnt) - iconf[cnt] = BYTE_GET (econf64[cnt]); - } - - printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno); - puts (_(" Num: Index Value Name")); - - for (cnt = 0; cnt < conflictsno; ++cnt) - { - Elf_Internal_Sym * psym = &dynamic_symbols[iconf[cnt]]; - - printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]); - print_vma (psym->st_value, FULL_HEX); - printf (" %s\n", dynamic_strings + psym->st_name); - } - - free (iconf); - } - - return 1; -} - -static char * -get_note_type (e_type) - unsigned e_type; -{ - static char buff[64]; - - switch (e_type) - { - case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)"); - case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)"); - case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)"); - case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)"); - case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)"); - case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)"); - case NT_FPREGS: return _("NT_FPREGS (floating point registers)"); - case NT_PSINFO: return _("NT_PSINFO (psinfo structure)"); - case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)"); - case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)"); - case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus strcuture)"); - default: - sprintf (buff, _("Unknown note type: (0x%08x)"), e_type); - return buff; - } -} - -/* Note that by the ELF standard, the name field is already null byte - terminated, and namesz includes the terminating null byte. - I.E. the value of namesz for the name "FSF" is 4. - - If the value of namesz is zero, there is no name present. */ -static int -process_note (pnote) - Elf32_Internal_Note * pnote; -{ - printf (" %s\t\t0x%08lx\t%s\n", - pnote->namesz ? pnote->namedata : "(NONE)", - pnote->descsz, get_note_type (pnote->type)); - return 1; -} - - -static int -process_corefile_note_segment (file, offset, length) - FILE * file; - bfd_vma offset; - bfd_vma length; -{ - Elf_External_Note * pnotes; - Elf_External_Note * external; - int res = 1; - - if (length <= 0) - return 0; - - GET_DATA_ALLOC (offset, length, pnotes, Elf_External_Note *, "notes"); - - external = pnotes; - - printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"), - (unsigned long) offset, (unsigned long) length); - printf (_(" Owner\t\tData size\tDescription\n")); - - while (external < (Elf_External_Note *)((char *) pnotes + length)) - { - Elf32_Internal_Note inote; - char * temp = NULL; - - inote.type = BYTE_GET (external->type); - inote.namesz = BYTE_GET (external->namesz); - inote.namedata = external->name; - inote.descsz = BYTE_GET (external->descsz); - inote.descdata = inote.namedata + align_power (inote.namesz, 2); - inote.descpos = offset + (inote.descdata - (char *) pnotes); - - external = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2)); - - /* Verify that name is null terminated. It appears that at least - one version of Linux (RedHat 6.0) generates corefiles that don't - comply with the ELF spec by failing to include the null byte in - namesz. */ - if (inote.namedata[inote.namesz] != '\0') - { - temp = malloc (inote.namesz + 1); - - if (temp == NULL) - { - error (_("Out of memory\n")); - res = 0; - break; - } - - strncpy (temp, inote.namedata, inote.namesz); - temp[inote.namesz] = 0; - - /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */ - inote.namedata = temp; - } - - res &= process_note (& inote); - - if (temp != NULL) - { - free (temp); - temp = NULL; - } - } - - free (pnotes); - - return res; -} - -static int -process_corefile_note_segments (file) - FILE * file; -{ - Elf_Internal_Phdr * program_headers; - Elf_Internal_Phdr * segment; - unsigned int i; - int res = 1; - - program_headers = (Elf_Internal_Phdr *) malloc - (elf_header.e_phnum * sizeof (Elf_Internal_Phdr)); - - if (program_headers == NULL) - { - error (_("Out of memory\n")); - return 0; - } - - if (is_32bit_elf) - i = get_32bit_program_headers (file, program_headers); - else - i = get_64bit_program_headers (file, program_headers); - - if (i == 0) - { - free (program_headers); - return 0; - } - - for (i = 0, segment = program_headers; - i < elf_header.e_phnum; - i ++, segment ++) - { - if (segment->p_type == PT_NOTE) - res &= process_corefile_note_segment (file, - (bfd_vma) segment->p_offset, - (bfd_vma) segment->p_filesz); - } - - free (program_headers); - - return res; -} - -static int -process_corefile_contents (file) - FILE * file; -{ - /* If we have not been asked to display the notes then do nothing. */ - if (! do_notes) - return 1; - - /* If file is not a core file then exit. */ - if (elf_header.e_type != ET_CORE) - return 1; - - /* No program headers means no NOTE segment. */ - if (elf_header.e_phnum == 0) - { - printf (_("No note segments present in the core file.\n")); - return 1; - } - - return process_corefile_note_segments (file); -} - -static int -process_arch_specific (file) - FILE * file; -{ - if (! do_arch) - return 1; - - switch (elf_header.e_machine) - { - case EM_MIPS: - case EM_MIPS_RS4_BE: - return process_mips_specific (file); - break; - default: - break; - } - return 1; -} - -static int -get_file_header (file) - FILE * file; -{ - /* Read in the identity array. */ - if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1) - return 0; - - /* Determine how to read the rest of the header. */ - switch (elf_header.e_ident [EI_DATA]) - { - default: /* fall through */ - case ELFDATANONE: /* fall through */ - case ELFDATA2LSB: byte_get = byte_get_little_endian; break; - case ELFDATA2MSB: byte_get = byte_get_big_endian; break; - } - - /* For now we only support 32 bit and 64 bit ELF files. */ - is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64); - - /* Read in the rest of the header. */ - if (is_32bit_elf) - { - Elf32_External_Ehdr ehdr32; - - if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1) - return 0; - - elf_header.e_type = BYTE_GET (ehdr32.e_type); - elf_header.e_machine = BYTE_GET (ehdr32.e_machine); - elf_header.e_version = BYTE_GET (ehdr32.e_version); - elf_header.e_entry = BYTE_GET (ehdr32.e_entry); - elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff); - elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff); - elf_header.e_flags = BYTE_GET (ehdr32.e_flags); - elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize); - elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize); - elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum); - elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize); - elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum); - elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx); - } - else - { - Elf64_External_Ehdr ehdr64; - - /* If we have been compiled with sizeof (bfd_vma) == 4, then - we will not be able to cope with the 64bit data found in - 64 ELF files. Detect this now and abort before we start - overwritting things. */ - if (sizeof (bfd_vma) < 8) - { - error (_("This instance of readelf has been built without support for a\n")); - error (_("64 bit data type and so it cannot read 64 bit ELF files.\n")); - return 0; - } - - if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1) - return 0; - - elf_header.e_type = BYTE_GET (ehdr64.e_type); - elf_header.e_machine = BYTE_GET (ehdr64.e_machine); - elf_header.e_version = BYTE_GET (ehdr64.e_version); - elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry); - elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff); - elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff); - elf_header.e_flags = BYTE_GET (ehdr64.e_flags); - elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize); - elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize); - elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum); - elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize); - elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum); - elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx); - } - - return 1; -} - -static void -process_file (file_name) - char * file_name; -{ - FILE * file; - struct stat statbuf; - unsigned int i; - - if (stat (file_name, & statbuf) < 0) - { - error (_("Cannot stat input file %s.\n"), file_name); - return; - } - - file = fopen (file_name, "rb"); - if (file == NULL) - { - error (_("Input file %s not found.\n"), file_name); - return; - } - - if (! get_file_header (file)) - { - error (_("%s: Failed to read file header\n"), file_name); - fclose (file); - return; - } - - /* Initialise per file variables. */ - for (i = NUM_ELEM (version_info); i--;) - version_info[i] = 0; - - for (i = NUM_ELEM (dynamic_info); i--;) - dynamic_info[i] = 0; - - /* Process the file. */ - if (show_name) - printf (_("\nFile: %s\n"), file_name); - - if (! process_file_header ()) - { - fclose (file); - return; - } - - process_section_headers (file); - - process_program_headers (file); - - process_dynamic_segment (file); - - process_relocs (file); - - process_symbol_table (file); - - process_syminfo (file); - - process_version_sections (file); - - process_section_contents (file); - - process_corefile_contents (file); - - process_arch_specific (file); - - fclose (file); - - if (section_headers) - { - free (section_headers); - section_headers = NULL; - } - - if (string_table) - { - free (string_table); - string_table = NULL; - } - - if (dynamic_strings) - { - free (dynamic_strings); - dynamic_strings = NULL; - } - - if (dynamic_symbols) - { - free (dynamic_symbols); - dynamic_symbols = NULL; - num_dynamic_syms = 0; - } - - if (dynamic_syminfo) - { - free (dynamic_syminfo); - dynamic_syminfo = NULL; - } -} - -#ifdef SUPPORT_DISASSEMBLY -/* Needed by the i386 disassembler. For extra credit, someone could - fix this so that we insert symbolic addresses here, esp for GOT/PLT - symbols */ - -void -print_address (unsigned int addr, FILE * outfile) -{ - fprintf (outfile,"0x%8.8x", addr); -} - -/* Needed by the i386 disassembler. */ -void -db_task_printsym (unsigned int addr) -{ - print_address (addr, stderr); -} -#endif - -int -main (argc, argv) - int argc; - char ** argv; -{ -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - parse_args (argc, argv); - - if (optind < (argc - 1)) - show_name = 1; - - while (optind < argc) - process_file (argv [optind ++]); - - if (dump_sects != NULL) - free (dump_sects); - - return 0; -} diff --git a/binutils/rename.c b/binutils/rename.c deleted file mode 100644 index 78ea9fd6b20..00000000000 --- a/binutils/rename.c +++ /dev/null @@ -1,220 +0,0 @@ -/* rename.c -- rename a file, preserving symlinks. - Copyright (C) 1999 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 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include "bfd.h" -#include "bucomm.h" - -#include - -#ifdef HAVE_GOOD_UTIME_H -#include -#else /* ! HAVE_GOOD_UTIME_H */ -#ifdef HAVE_UTIMES -#include -#endif /* HAVE_UTIMES */ -#endif /* ! HAVE_GOOD_UTIME_H */ - -/* We need to open the file in binary modes on system where that makes - a difference. */ -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -static int simple_copy PARAMS ((const char *, const char *)); - -/* The number of bytes to copy at once. */ -#define COPY_BUF 8192 - -/* Copy file FROM to file TO, performing no translations. - Return 0 if ok, -1 if error. */ - -static int -simple_copy (from, to) - const char *from; - const char *to; -{ - int fromfd, tofd, nread; - int saved; - char buf[COPY_BUF]; - - fromfd = open (from, O_RDONLY | O_BINARY); - if (fromfd < 0) - return -1; -#ifdef O_CREAT - tofd = open (to, O_CREAT | O_WRONLY | O_TRUNC | O_BINARY, 0777); -#else - tofd = creat (to, 0777); -#endif - if (tofd < 0) - { - saved = errno; - close (fromfd); - errno = saved; - return -1; - } - while ((nread = read (fromfd, buf, sizeof buf)) > 0) - { - if (write (tofd, buf, nread) != nread) - { - saved = errno; - close (fromfd); - close (tofd); - errno = saved; - return -1; - } - } - saved = errno; - close (fromfd); - close (tofd); - if (nread < 0) - { - errno = saved; - return -1; - } - return 0; -} - -/* Set the times of the file DESTINATION to be the same as those in - STATBUF. */ - -void -set_times (destination, statbuf) - const char *destination; - const struct stat *statbuf; -{ - int result; - - { -#ifdef HAVE_GOOD_UTIME_H - struct utimbuf tb; - - tb.actime = statbuf->st_atime; - tb.modtime = statbuf->st_mtime; - result = utime (destination, &tb); -#else /* ! HAVE_GOOD_UTIME_H */ -#ifndef HAVE_UTIMES - long tb[2]; - - tb[0] = statbuf->st_atime; - tb[1] = statbuf->st_mtime; - result = utime (destination, tb); -#else /* HAVE_UTIMES */ - struct timeval tv[2]; - - tv[0].tv_sec = statbuf->st_atime; - tv[0].tv_usec = 0; - tv[1].tv_sec = statbuf->st_mtime; - tv[1].tv_usec = 0; - result = utimes (destination, tv); -#endif /* HAVE_UTIMES */ -#endif /* ! HAVE_GOOD_UTIME_H */ - } - - if (result != 0) - non_fatal (_("%s: cannot set time: %s"), destination, strerror (errno)); -} - -#ifndef S_ISLNK -#ifdef S_IFLNK -#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) -#else -#define S_ISLNK(m) 0 -#define lstat stat -#endif -#endif - -/* Rename FROM to TO, copying if TO is a link. - Return 0 if ok, -1 if error. */ - -int -smart_rename (from, to, preserve_dates) - const char *from; - const char *to; - int preserve_dates; -{ - boolean exists; - struct stat s; - int ret = 0; - - exists = lstat (to, &s) == 0; - -#if defined (_WIN32) && !defined (__CYGWIN32__) - /* Win32, unlike unix, will not erase `to' in `rename(from, to)' but - fail instead. Also, chown is not present. */ - - if (exists) - remove (to); - - ret = rename (from, to); - if (ret != 0) - { - /* We have to clean up here. */ - - non_fatal (_("%s: rename: %s"), to, strerror (errno)); - unlink (from); - } -#else - /* Use rename only if TO is not a symbolic link and has - only one hard link. */ - if (! exists || (!S_ISLNK (s.st_mode) && s.st_nlink == 1)) - { - ret = rename (from, to); - if (ret == 0) - { - if (exists) - { - /* Try to preserve the permission bits and ownership of - TO. First get the mode right except for the setuid - bit. Then change the ownership. Then fix the setuid - bit. We do the chmod before the chown because if the - chown succeeds, and we are a normal user, we won't be - able to do the chmod afterward. We don't bother to - fix the setuid bit first because that might introduce - a fleeting security problem, and because the chown - will clear the setuid bit anyhow. We only fix the - setuid bit if the chown succeeds, because we don't - want to introduce an unexpected setuid file owned by - the user running objcopy. */ - chmod (to, s.st_mode & 0777); - if (chown (to, s.st_uid, s.st_gid) >= 0) - chmod (to, s.st_mode & 07777); - } - } - else - { - /* We have to clean up here. */ - non_fatal (_("%s: rename: %s"), to, strerror (errno)); - unlink (from); - } - } - else - { - ret = simple_copy (from, to); - if (ret != 0) - non_fatal (_("%s: simple_copy: %s"), to, strerror (errno)); - - if (preserve_dates) - set_times (to, &s); - unlink (from); - } -#endif /* _WIN32 && !__CYGWIN32__ */ - - return ret; -} diff --git a/binutils/resbin.c b/binutils/resbin.c deleted file mode 100644 index 8fc07fbb292..00000000000 --- a/binutils/resbin.c +++ /dev/null @@ -1,2387 +0,0 @@ -/* resbin.c -- manipulate the Windows binary resource format. - Copyright 1997, 1998 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file contains functions to convert between the binary resource - format and the internal structures that we want to use. The same - binary resource format is used in both res and COFF files. */ - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "windres.h" - -/* Macros to swap in values. */ - -#define get_16(be, s) ((be) ? bfd_getb16 (s) : bfd_getl16 (s)) -#define get_32(be, s) ((be) ? bfd_getb32 (s) : bfd_getl32 (s)) - -/* Local functions. */ - -static void toosmall PARAMS ((const char *)); -static unichar *get_unicode - PARAMS ((const unsigned char *, unsigned long, int, int *)); -static int get_resid - PARAMS ((struct res_id *, const unsigned char *, unsigned long, int)); -static struct res_resource *bin_to_res_generic - PARAMS ((enum res_type, const unsigned char *, unsigned long)); -static struct res_resource *bin_to_res_cursor - PARAMS ((const unsigned char *, unsigned long, int)); -static struct res_resource *bin_to_res_menu - PARAMS ((const unsigned char *, unsigned long, int)); -static struct menuitem *bin_to_res_menuitems - PARAMS ((const unsigned char *, unsigned long, int, int *)); -static struct menuitem *bin_to_res_menuexitems - PARAMS ((const unsigned char *, unsigned long, int, int *)); -static struct res_resource *bin_to_res_dialog - PARAMS ((const unsigned char *, unsigned long, int)); -static struct res_resource *bin_to_res_string - PARAMS ((const unsigned char *, unsigned long, int)); -static struct res_resource *bin_to_res_fontdir - PARAMS ((const unsigned char *, unsigned long, int)); -static struct res_resource *bin_to_res_accelerators - PARAMS ((const unsigned char *, unsigned long, int)); -static struct res_resource *bin_to_res_rcdata - PARAMS ((const unsigned char *, unsigned long, int)); -static struct res_resource *bin_to_res_group_cursor - PARAMS ((const unsigned char *, unsigned long, int)); -static struct res_resource *bin_to_res_group_icon - PARAMS ((const unsigned char *, unsigned long, int)); -static struct res_resource *bin_to_res_version - PARAMS ((const unsigned char *, unsigned long, int)); -static struct res_resource *bin_to_res_userdata - PARAMS ((const unsigned char *, unsigned long, int)); - -/* Given a resource type ID, a pointer to data, a length, return a - res_resource structure which represents that resource. The caller - is responsible for initializing the res_info and coff_info fields - of the returned structure. */ - -struct res_resource * -bin_to_res (type, data, length, big_endian) - struct res_id type; - const unsigned char *data; - unsigned long length; - int big_endian; -{ - if (type.named) - return bin_to_res_userdata (data, length, big_endian); - else - { - switch (type.u.id) - { - default: - return bin_to_res_userdata (data, length, big_endian); - case RT_CURSOR: - return bin_to_res_cursor (data, length, big_endian); - case RT_BITMAP: - return bin_to_res_generic (RES_TYPE_BITMAP, data, length); - case RT_ICON: - return bin_to_res_generic (RES_TYPE_ICON, data, length); - case RT_MENU: - return bin_to_res_menu (data, length, big_endian); - case RT_DIALOG: - return bin_to_res_dialog (data, length, big_endian); - case RT_STRING: - return bin_to_res_string (data, length, big_endian); - case RT_FONTDIR: - return bin_to_res_fontdir (data, length, big_endian); - case RT_FONT: - return bin_to_res_generic (RES_TYPE_FONT, data, length); - case RT_ACCELERATOR: - return bin_to_res_accelerators (data, length, big_endian); - case RT_RCDATA: - return bin_to_res_rcdata (data, length, big_endian); - case RT_MESSAGETABLE: - return bin_to_res_generic (RES_TYPE_MESSAGETABLE, data, length); - case RT_GROUP_CURSOR: - return bin_to_res_group_cursor (data, length, big_endian); - case RT_GROUP_ICON: - return bin_to_res_group_icon (data, length, big_endian); - case RT_VERSION: - return bin_to_res_version (data, length, big_endian); - } - } -} - -/* Give an error if the binary data is too small. */ - -static void -toosmall (msg) - const char *msg; -{ - fatal (_("%s: not enough binary data"), msg); -} - -/* Swap in a NULL terminated unicode string. */ - -static unichar * -get_unicode (data, length, big_endian, retlen) - const unsigned char *data; - unsigned long length; - int big_endian; - int *retlen; -{ - int c, i; - unichar *ret; - - c = 0; - while (1) - { - if (length < (unsigned long) c * 2 + 2) - toosmall (_("null terminated unicode string")); - if (get_16 (big_endian, data + c * 2) == 0) - break; - ++c; - } - - ret = (unichar *) res_alloc ((c + 1) * sizeof (unichar)); - - for (i = 0; i < c; i++) - ret[i] = get_16 (big_endian, data + i * 2); - ret[i] = 0; - - if (retlen != NULL) - *retlen = c; - - return ret; -} - -/* Get a resource identifier. This returns the number of bytes used. */ - -static int -get_resid (id, data, length, big_endian) - struct res_id *id; - const unsigned char *data; - unsigned long length; - int big_endian; -{ - int first; - - if (length < 2) - toosmall (_("resource ID")); - - first = get_16 (big_endian, data); - if (first == 0xffff) - { - if (length < 4) - toosmall (_("resource ID")); - id->named = 0; - id->u.id = get_16 (big_endian, data + 2); - return 4; - } - else - { - id->named = 1; - id->u.n.name = get_unicode (data, length, big_endian, &id->u.n.length); - return id->u.n.length * 2 + 2; - } -} - -/* Convert a resource which just stores uninterpreted data from - binary. */ - -struct res_resource * -bin_to_res_generic (type, data, length) - enum res_type type; - const unsigned char *data; - unsigned long length; -{ - struct res_resource *r; - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = type; - r->u.data.data = data; - r->u.data.length = length; - - return r; -} - -/* Convert a cursor resource from binary. */ - -struct res_resource * -bin_to_res_cursor (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - struct cursor *c; - struct res_resource *r; - - if (length < 4) - toosmall (_("cursor")); - - c = (struct cursor *) res_alloc (sizeof *c); - c->xhotspot = get_16 (big_endian, data); - c->yhotspot = get_16 (big_endian, data + 2); - c->length = length - 4; - c->data = data + 4; - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_CURSOR; - r->u.cursor = c; - - return r; -} - -/* Convert a menu resource from binary. */ - -struct res_resource * -bin_to_res_menu (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - struct res_resource *r; - struct menu *m; - int version, read; - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_MENU; - - m = (struct menu *) res_alloc (sizeof *m); - r->u.menu = m; - - if (length < 2) - toosmall (_("menu header")); - - version = get_16 (big_endian, data); - - if (version == 0) - { - if (length < 4) - toosmall (_("menu header")); - m->help = 0; - m->items = bin_to_res_menuitems (data + 4, length - 4, big_endian, - &read); - } - else if (version == 1) - { - unsigned int offset; - - if (length < 8) - toosmall (_("menuex header")); - m->help = get_32 (big_endian, data + 4); - offset = get_16 (big_endian, data + 2); - if (offset + 4 >= length) - toosmall (_("menuex offset")); - m->items = bin_to_res_menuexitems (data + 4 + offset, - length - (4 + offset), - big_endian, - &read); - } - else - fatal (_("unsupported menu version %d"), version); - - return r; -} - -/* Convert menu items from binary. */ - -static struct menuitem * -bin_to_res_menuitems (data, length, big_endian, read) - const unsigned char *data; - unsigned long length; - int big_endian; - int *read; -{ - struct menuitem *first, **pp; - - first = NULL; - pp = &first; - - *read = 0; - - while (length > 0) - { - int flags, slen, itemlen; - unsigned int stroff; - struct menuitem *mi; - - if (length < 4) - toosmall (_("menuitem header")); - - mi = (struct menuitem *) res_alloc (sizeof *mi); - mi->state = 0; - mi->help = 0; - - flags = get_16 (big_endian, data); - mi->type = flags &~ (MENUITEM_POPUP | MENUITEM_ENDMENU); - - if ((flags & MENUITEM_POPUP) == 0) - stroff = 4; - else - stroff = 2; - - if (length < stroff + 2) - toosmall (_("menuitem header")); - - if (get_16 (big_endian, data + stroff) == 0) - { - slen = 0; - mi->text = NULL; - } - else - mi->text = get_unicode (data + stroff, length - stroff, big_endian, - &slen); - - itemlen = stroff + slen * 2 + 2; - - if ((flags & MENUITEM_POPUP) == 0) - { - mi->popup = NULL; - mi->id = get_16 (big_endian, data + 2); - } - else - { - int subread; - - mi->id = 0; - mi->popup = bin_to_res_menuitems (data + itemlen, length - itemlen, - big_endian, &subread); - itemlen += subread; - } - - mi->next = NULL; - *pp = mi; - pp = &mi->next; - - data += itemlen; - length -= itemlen; - *read += itemlen; - - if ((flags & MENUITEM_ENDMENU) != 0) - return first; - } - - return first; -} - -/* Convert menuex items from binary. */ - -static struct menuitem * -bin_to_res_menuexitems (data, length, big_endian, read) - const unsigned char *data; - unsigned long length; - int big_endian; - int *read; -{ - struct menuitem *first, **pp; - - first = NULL; - pp = &first; - - *read = 0; - - while (length > 0) - { - int flags, slen; - unsigned int itemlen; - struct menuitem *mi; - - if (length < 14) - toosmall (_("menuitem header")); - - mi = (struct menuitem *) res_alloc (sizeof *mi); - mi->type = get_32 (big_endian, data); - mi->state = get_32 (big_endian, data + 4); - mi->id = get_16 (big_endian, data + 8); - - flags = get_16 (big_endian, data + 10); - - if (get_16 (big_endian, data + 12) == 0) - { - slen = 0; - mi->text = NULL; - } - else - mi->text = get_unicode (data + 12, length - 12, big_endian, &slen); - - itemlen = 12 + slen * 2 + 2; - itemlen = (itemlen + 3) &~ 3; - - if ((flags & 1) == 0) - { - mi->popup = NULL; - mi->help = 0; - } - else - { - int subread; - - if (length < itemlen + 4) - toosmall (_("menuitem")); - mi->help = get_32 (big_endian, data + itemlen); - itemlen += 4; - - mi->popup = bin_to_res_menuexitems (data + itemlen, - length - itemlen, - big_endian, &subread); - itemlen += subread; - } - - mi->next = NULL; - *pp = mi; - pp = &mi->next; - - data += itemlen; - length -= itemlen; - *read += itemlen; - - if ((flags & 0x80) != 0) - return first; - } - - return first; -} - -/* Convert a dialog resource from binary. */ - -static struct res_resource * -bin_to_res_dialog (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - int version; - struct dialog *d; - int c, sublen, i; - unsigned int off; - struct dialog_control **pp; - struct res_resource *r; - - if (length < 18) - toosmall (_("dialog header")); - - d = (struct dialog *) res_alloc (sizeof *d); - - version = get_16 (big_endian, data); - if (version != 1) - { - d->ex = NULL; - d->style = get_32 (big_endian, data); - d->exstyle = get_32 (big_endian, data + 4); - off = 8; - } - else - { - int signature; - - signature = get_16 (big_endian, data + 2); - if (signature != 0xffff) - fatal (_("unexpected dialog signature %d"), signature); - - d->ex = (struct dialog_ex *) res_alloc (sizeof (struct dialog_ex)); - d->ex->help = get_32 (big_endian, data + 4); - d->exstyle = get_32 (big_endian, data + 8); - d->style = get_32 (big_endian, data + 12); - off = 16; - } - - if (length < off + 10) - toosmall (_("dialog header")); - - c = get_16 (big_endian, data + off); - d->x = get_16 (big_endian, data + off + 2); - d->y = get_16 (big_endian, data + off + 4); - d->width = get_16 (big_endian, data + off + 6); - d->height = get_16 (big_endian, data + off + 8); - - off += 10; - - sublen = get_resid (&d->menu, data + off, length - off, big_endian); - off += sublen; - - sublen = get_resid (&d->class, data + off, length - off, big_endian); - off += sublen; - - d->caption = get_unicode (data + off, length - off, big_endian, &sublen); - off += sublen * 2 + 2; - - if ((d->style & DS_SETFONT) == 0) - { - d->pointsize = 0; - d->font = NULL; - if (d->ex != NULL) - { - d->ex->weight = 0; - d->ex->italic = 0; - } - } - else - { - if (length < off + 2) - toosmall (_("dialog font point size")); - - d->pointsize = get_16 (big_endian, data + off); - off += 2; - - if (d->ex != NULL) - { - if (length < off + 4) - toosmall (_("dialogex font information")); - d->ex->weight = get_16 (big_endian, data + off); - d->ex->italic = get_16 (big_endian, data + off + 2); - off += 4; - } - - d->font = get_unicode (data + off, length - off, big_endian, &sublen); - off += sublen * 2 + 2; - } - - d->controls = NULL; - pp = &d->controls; - - for (i = 0; i < c; i++) - { - struct dialog_control *dc; - int datalen; - - off = (off + 3) &~ 3; - - dc = (struct dialog_control *) res_alloc (sizeof *dc); - - if (d->ex == NULL) - { - if (length < off + 8) - toosmall (_("dialog control")); - - dc->style = get_32 (big_endian, data + off); - dc->exstyle = get_32 (big_endian, data + off + 4); - dc->help = 0; - off += 8; - } - else - { - if (length < off + 12) - toosmall (_("dialogex control")); - dc->help = get_32 (big_endian, data + off); - dc->exstyle = get_32 (big_endian, data + off + 4); - dc->style = get_32 (big_endian, data + off + 8); - off += 12; - } - - if (length < off + 10) - toosmall (_("dialog control")); - - dc->x = get_16 (big_endian, data + off); - dc->y = get_16 (big_endian, data + off + 2); - dc->width = get_16 (big_endian, data + off + 4); - dc->height = get_16 (big_endian, data + off + 6); - - if (d->ex != NULL) - dc->id = get_32 (big_endian, data + off + 8); - else - dc->id = get_16 (big_endian, data + off + 8); - - off += 10 + (d->ex != NULL ? 2 : 0); - - sublen = get_resid (&dc->class, data + off, length - off, big_endian); - off += sublen; - - sublen = get_resid (&dc->text, data + off, length - off, big_endian); - off += sublen; - - if (length < off + 2) - toosmall (_("dialog control end")); - - datalen = get_16 (big_endian, data + off); - off += 2; - - if (datalen == 0) - dc->data = NULL; - else - { - off = (off + 3) &~ 3; - - if (length < off + datalen) - toosmall (_("dialog control data")); - - dc->data = ((struct rcdata_item *) - res_alloc (sizeof (struct rcdata_item))); - dc->data->next = NULL; - dc->data->type = RCDATA_BUFFER; - dc->data->u.buffer.length = datalen; - dc->data->u.buffer.data = data + off; - - off += datalen; - } - - dc->next = NULL; - *pp = dc; - pp = &dc->next; - } - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_DIALOG; - r->u.dialog = d; - - return r; -} - -/* Convert a stringtable resource from binary. */ - -static struct res_resource * -bin_to_res_string (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - struct stringtable *st; - int i; - struct res_resource *r; - - st = (struct stringtable *) res_alloc (sizeof *st); - - for (i = 0; i < 16; i++) - { - unsigned int slen; - - if (length < 2) - toosmall (_("stringtable string length")); - slen = get_16 (big_endian, data); - st->strings[i].length = slen; - - if (slen > 0) - { - unichar *s; - unsigned int j; - - if (length < 2 + 2 * slen) - toosmall (_("stringtable string")); - - s = (unichar *) res_alloc (slen * sizeof (unichar)); - st->strings[i].string = s; - - for (j = 0; j < slen; j++) - s[j] = get_16 (big_endian, data + 2 + j * 2); - } - - data += 2 + 2 * slen; - length -= 2 + 2 * slen; - } - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_STRINGTABLE; - r->u.stringtable = st; - - return r; -} - -/* Convert a fontdir resource from binary. */ - -static struct res_resource * -bin_to_res_fontdir (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - int c, i; - struct fontdir *first, **pp; - struct res_resource *r; - - if (length < 2) - toosmall (_("fontdir header")); - - c = get_16 (big_endian, data); - - first = NULL; - pp = &first; - - for (i = 0; i < c; i++) - { - struct fontdir *fd; - unsigned int off; - - if (length < 56) - toosmall (_("fontdir")); - - fd = (struct fontdir *) res_alloc (sizeof *fd); - fd->index = get_16 (big_endian, data); - - /* To work out the length of the fontdir data, we must get the - length of the device name and face name strings, even though - we don't store them in the fontdir structure. The - documentation says that these are NULL terminated char - strings, not Unicode strings. */ - - off = 56; - - while (off < length && data[off] != '\0') - ++off; - if (off >= length) - toosmall (_("fontdir device name")); - ++off; - - while (off < length && data[off] != '\0') - ++off; - if (off >= length) - toosmall (_("fontdir face name")); - ++off; - - fd->length = off; - fd->data = data; - - fd->next = NULL; - *pp = fd; - pp = &fd->next; - - /* The documentation does not indicate that any rounding is - required. */ - - data += off; - length -= off; - } - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_FONTDIR; - r->u.fontdir = first; - - return r; -} - -/* Convert an accelerators resource from binary. */ - -static struct res_resource * -bin_to_res_accelerators (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - struct accelerator *first, **pp; - struct res_resource *r; - - first = NULL; - pp = &first; - - while (1) - { - struct accelerator *a; - - if (length < 8) - toosmall (_("accelerator")); - - a = (struct accelerator *) res_alloc (sizeof *a); - - a->flags = get_16 (big_endian, data); - a->key = get_16 (big_endian, data + 2); - a->id = get_16 (big_endian, data + 4); - - a->next = NULL; - *pp = a; - pp = &a->next; - - if ((a->flags & ACC_LAST) != 0) - break; - - data += 8; - length -= 8; - } - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_ACCELERATOR; - r->u.acc = first; - - return r; -} - -/* Convert an rcdata resource from binary. */ - -static struct res_resource * -bin_to_res_rcdata (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - struct rcdata_item *ri; - struct res_resource *r; - - ri = (struct rcdata_item *) res_alloc (sizeof *ri); - - ri->next = NULL; - ri->type = RCDATA_BUFFER; - ri->u.buffer.length = length; - ri->u.buffer.data = data; - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_RCDATA; - r->u.rcdata = ri; - - return r; -} - -/* Convert a group cursor resource from binary. */ - -static struct res_resource * -bin_to_res_group_cursor (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - int type, c, i; - struct group_cursor *first, **pp; - struct res_resource *r; - - if (length < 6) - toosmall (_("group cursor header")); - - type = get_16 (big_endian, data + 2); - if (type != 2) - fatal (_("unexpected group cursor type %d"), type); - - c = get_16 (big_endian, data + 4); - - data += 6; - length -= 6; - - first = NULL; - pp = &first; - - for (i = 0; i < c; i++) - { - struct group_cursor *gc; - - if (length < 14) - toosmall (_("group cursor")); - - gc = (struct group_cursor *) res_alloc (sizeof *gc); - - gc->width = get_16 (big_endian, data); - gc->height = get_16 (big_endian, data + 2); - gc->planes = get_16 (big_endian, data + 4); - gc->bits = get_16 (big_endian, data + 6); - gc->bytes = get_32 (big_endian, data + 8); - gc->index = get_16 (big_endian, data + 12); - - gc->next = NULL; - *pp = gc; - pp = &gc->next; - - data += 14; - length -= 14; - } - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_GROUP_CURSOR; - r->u.group_cursor = first; - - return r; -} - -/* Convert a group icon resource from binary. */ - -static struct res_resource * -bin_to_res_group_icon (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - int type, c, i; - struct group_icon *first, **pp; - struct res_resource *r; - - if (length < 6) - toosmall (_("group icon header")); - - type = get_16 (big_endian, data + 2); - if (type != 1) - fatal (_("unexpected group icon type %d"), type); - - c = get_16 (big_endian, data + 4); - - data += 6; - length -= 6; - - first = NULL; - pp = &first; - - for (i = 0; i < c; i++) - { - struct group_icon *gi; - - if (length < 14) - toosmall (_("group icon")); - - gi = (struct group_icon *) res_alloc (sizeof *gi); - - gi->width = data[0]; - gi->height = data[1]; - gi->colors = data[2]; - gi->planes = get_16 (big_endian, data + 4); - gi->bits = get_16 (big_endian, data + 6); - gi->bytes = get_32 (big_endian, data + 8); - gi->index = get_16 (big_endian, data + 12); - - gi->next = NULL; - *pp = gi; - pp = &gi->next; - - data += 14; - length -= 14; - } - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_GROUP_ICON; - r->u.group_icon = first; - - return r; -} - -/* Extract data from a version header. If KEY is not NULL, then the - key must be KEY; otherwise, the key is returned in *PKEY. This - sets *LEN to the total length, *VALLEN to the value length, *TYPE - to the type, and *OFF to the offset to the children. */ - -static void -get_version_header (data, length, big_endian, key, pkey, len, vallen, type, - off) - const unsigned char *data; - unsigned long length; - int big_endian; - const char *key; - unichar **pkey; - int *len; - int *vallen; - int *type; - int *off; -{ - if (length < 8) - toosmall (key); - - *len = get_16 (big_endian, data); - *vallen = get_16 (big_endian, data + 2); - *type = get_16 (big_endian, data + 4); - - *off = 6; - - length -= 6; - data += 6; - - if (key == NULL) - { - int sublen; - - *pkey = get_unicode (data, length, big_endian, &sublen); - *off += sublen * 2 + 2; - } - else - { - while (1) - { - if (length < 2) - toosmall (key); - if (get_16 (big_endian, data) != (unsigned char) *key) - fatal (_("unexpected version string")); - - *off += 2; - length -= 2; - data += 2; - - if (*key == '\0') - break; - - ++key; - } - } - - *off = (*off + 3) &~ 3; -} - -/* Convert a version resource from binary. */ - -static struct res_resource * -bin_to_res_version (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - int verlen, vallen, type, off; - struct fixed_versioninfo *fi; - struct ver_info *first, **pp; - struct versioninfo *v; - struct res_resource *r; - - get_version_header (data, length, big_endian, "VS_VERSION_INFO", - (unichar *) NULL, &verlen, &vallen, &type, &off); - - if ((unsigned int) verlen != length) - fatal (_("version length %d does not match resource length %lu"), - verlen, length); - - if (type != 0) - fatal (_("unexpected version type %d"), type); - - data += off; - length -= off; - - if (vallen == 0) - fi = NULL; - else - { - unsigned long signature, fiv; - - if (vallen != 52) - fatal (_("unexpected fixed version information length %d"), vallen); - - if (length < 52) - toosmall (_("fixed version info")); - - signature = get_32 (big_endian, data); - if (signature != 0xfeef04bd) - fatal (_("unexpected fixed version signature %lu"), signature); - - fiv = get_32 (big_endian, data + 4); - if (fiv != 0 && fiv != 0x10000) - fatal (_("unexpected fixed version info version %lu"), fiv); - - fi = (struct fixed_versioninfo *) res_alloc (sizeof *fi); - - fi->file_version_ms = get_32 (big_endian, data + 8); - fi->file_version_ls = get_32 (big_endian, data + 12); - fi->product_version_ms = get_32 (big_endian, data + 16); - fi->product_version_ls = get_32 (big_endian, data + 20); - fi->file_flags_mask = get_32 (big_endian, data + 24); - fi->file_flags = get_32 (big_endian, data + 28); - fi->file_os = get_32 (big_endian, data + 32); - fi->file_type = get_32 (big_endian, data + 36); - fi->file_subtype = get_32 (big_endian, data + 40); - fi->file_date_ms = get_32 (big_endian, data + 44); - fi->file_date_ls = get_32 (big_endian, data + 48); - - data += 52; - length -= 52; - } - - first = NULL; - pp = &first; - - while (length > 0) - { - struct ver_info *vi; - int ch; - - if (length < 8) - toosmall (_("version var info")); - - vi = (struct ver_info *) res_alloc (sizeof *vi); - - ch = get_16 (big_endian, data + 6); - - if (ch == 'S') - { - struct ver_stringinfo **ppvs; - - vi->type = VERINFO_STRING; - - get_version_header (data, length, big_endian, "StringFileInfo", - (unichar *) NULL, &verlen, &vallen, &type, - &off); - - if (vallen != 0) - fatal (_("unexpected stringfileinfo value length %d"), vallen); - - data += off; - length -= off; - - get_version_header (data, length, big_endian, (const char *) NULL, - &vi->u.string.language, &verlen, &vallen, - &type, &off); - - if (vallen != 0) - fatal (_("unexpected version stringtable value length %d"), vallen); - - data += off; - length -= off; - verlen -= off; - - vi->u.string.strings = NULL; - ppvs = &vi->u.string.strings; - - /* It's convenient to round verlen to a 4 byte alignment, - since we round the subvariables in the loop. */ - verlen = (verlen + 3) &~ 3; - - while (verlen > 0) - { - struct ver_stringinfo *vs; - int subverlen, vslen, valoff; - - vs = (struct ver_stringinfo *) res_alloc (sizeof *vs); - - get_version_header (data, length, big_endian, - (const char *) NULL, &vs->key, &subverlen, - &vallen, &type, &off); - - subverlen = (subverlen + 3) &~ 3; - - data += off; - length -= off; - - vs->value = get_unicode (data, length, big_endian, &vslen); - valoff = vslen * 2 + 2; - valoff = (valoff + 3) &~ 3; - - if (off + valoff != subverlen) - fatal (_("unexpected version string length %d != %d + %d"), - subverlen, off, valoff); - - vs->next = NULL; - *ppvs = vs; - ppvs = &vs->next; - - data += valoff; - length -= valoff; - - if (verlen < subverlen) - fatal (_("unexpected version string length %d < %d"), - verlen, subverlen); - - verlen -= subverlen; - } - } - else if (ch == 'V') - { - struct ver_varinfo **ppvv; - - vi->type = VERINFO_VAR; - - get_version_header (data, length, big_endian, "VarFileInfo", - (unichar *) NULL, &verlen, &vallen, &type, - &off); - - if (vallen != 0) - fatal (_("unexpected varfileinfo value length %d"), vallen); - - data += off; - length -= off; - - get_version_header (data, length, big_endian, (const char *) NULL, - &vi->u.var.key, &verlen, &vallen, &type, &off); - - data += off; - length -= off; - - vi->u.var.var = NULL; - ppvv = &vi->u.var.var; - - while (vallen > 0) - { - struct ver_varinfo *vv; - - if (length < 4) - toosmall (_("version varfileinfo")); - - vv = (struct ver_varinfo *) res_alloc (sizeof *vv); - - vv->language = get_16 (big_endian, data); - vv->charset = get_16 (big_endian, data + 2); - - vv->next = NULL; - *ppvv = vv; - ppvv = &vv->next; - - data += 4; - length -= 4; - - if (vallen < 4) - fatal (_("unexpected version value length %d"), vallen); - - vallen -= 4; - } - } - else - fatal (_("unexpected version string")); - - vi->next = NULL; - *pp = vi; - pp = &vi->next; - } - - v = (struct versioninfo *) res_alloc (sizeof *v); - v->fixed = fi; - v->var = first; - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_VERSIONINFO; - r->u.versioninfo = v; - - return r; -} - -/* Convert an arbitrary user defined resource from binary. */ - -static struct res_resource * -bin_to_res_userdata (data, length, big_endian) - const unsigned char *data; - unsigned long length; - int big_endian; -{ - struct rcdata_item *ri; - struct res_resource *r; - - ri = (struct rcdata_item *) res_alloc (sizeof *ri); - - ri->next = NULL; - ri->type = RCDATA_BUFFER; - ri->u.buffer.length = length; - ri->u.buffer.data = data; - - r = (struct res_resource *) res_alloc (sizeof *r); - r->type = RES_TYPE_USERDATA; - r->u.rcdata = ri; - - return r; -} - -/* Macros to swap out values. */ - -#define put_16(be, v, s) ((be) ? bfd_putb16 ((v), (s)) : bfd_putl16 ((v), (s))) -#define put_32(be, v, s) ((be) ? bfd_putb32 ((v), (s)) : bfd_putl32 ((v), (s))) - -/* Local functions used to convert resources to binary format. */ - -static void dword_align_bin PARAMS ((struct bindata ***, unsigned long *)); -static struct bindata *resid_to_bin PARAMS ((struct res_id, int)); -static struct bindata *unicode_to_bin PARAMS ((const unichar *, int)); -static struct bindata *res_to_bin_accelerator - PARAMS ((const struct accelerator *, int)); -static struct bindata *res_to_bin_cursor - PARAMS ((const struct cursor *, int)); -static struct bindata *res_to_bin_group_cursor - PARAMS ((const struct group_cursor *, int)); -static struct bindata *res_to_bin_dialog - PARAMS ((const struct dialog *, int)); -static struct bindata *res_to_bin_fontdir - PARAMS ((const struct fontdir *, int)); -static struct bindata *res_to_bin_group_icon - PARAMS ((const struct group_icon *, int)); -static struct bindata *res_to_bin_menu - PARAMS ((const struct menu *, int)); -static struct bindata *res_to_bin_menuitems - PARAMS ((const struct menuitem *, int)); -static struct bindata *res_to_bin_menuexitems - PARAMS ((const struct menuitem *, int)); -static struct bindata *res_to_bin_rcdata - PARAMS ((const struct rcdata_item *, int)); -static struct bindata *res_to_bin_stringtable - PARAMS ((const struct stringtable *, int)); -static struct bindata *string_to_unicode_bin PARAMS ((const char *, int)); -static struct bindata *res_to_bin_versioninfo - PARAMS ((const struct versioninfo *, int)); -static struct bindata *res_to_bin_generic - PARAMS ((unsigned long, const unsigned char *)); - -/* Convert a resource to binary. */ - -struct bindata * -res_to_bin (res, big_endian) - const struct res_resource *res; - int big_endian; -{ - switch (res->type) - { - default: - abort (); - case RES_TYPE_BITMAP: - case RES_TYPE_FONT: - case RES_TYPE_ICON: - case RES_TYPE_MESSAGETABLE: - return res_to_bin_generic (res->u.data.length, res->u.data.data); - case RES_TYPE_ACCELERATOR: - return res_to_bin_accelerator (res->u.acc, big_endian); - case RES_TYPE_CURSOR: - return res_to_bin_cursor (res->u.cursor, big_endian); - case RES_TYPE_GROUP_CURSOR: - return res_to_bin_group_cursor (res->u.group_cursor, big_endian); - case RES_TYPE_DIALOG: - return res_to_bin_dialog (res->u.dialog, big_endian); - case RES_TYPE_FONTDIR: - return res_to_bin_fontdir (res->u.fontdir, big_endian); - case RES_TYPE_GROUP_ICON: - return res_to_bin_group_icon (res->u.group_icon, big_endian); - case RES_TYPE_MENU: - return res_to_bin_menu (res->u.menu, big_endian); - case RES_TYPE_RCDATA: - return res_to_bin_rcdata (res->u.rcdata, big_endian); - case RES_TYPE_STRINGTABLE: - return res_to_bin_stringtable (res->u.stringtable, big_endian); - case RES_TYPE_USERDATA: - return res_to_bin_rcdata (res->u.rcdata, big_endian); - case RES_TYPE_VERSIONINFO: - return res_to_bin_versioninfo (res->u.versioninfo, big_endian); - } -} - -/* Align to a 32 bit boundary. PPP points to the of a list of bindata - structures. LENGTH points to the length of the structures. If - necessary, this adds a new bindata to bring length up to a 32 bit - boundary. It updates *PPP and *LENGTH. */ - -static void -dword_align_bin (ppp, length) - struct bindata ***ppp; - unsigned long *length; -{ - int add; - struct bindata *d; - - if ((*length & 3) == 0) - return; - - add = 4 - (*length & 3); - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = add; - d->data = (unsigned char *) reswr_alloc (add); - memset (d->data, 0, add); - - d->next = NULL; - **ppp = d; - *ppp = &(**ppp)->next; - - *length += add; -} - -/* Convert a resource ID to binary. This always returns exactly one - bindata structure. */ - -static struct bindata * -resid_to_bin (id, big_endian) - struct res_id id; - int big_endian; -{ - struct bindata *d; - - d = (struct bindata *) reswr_alloc (sizeof *d); - - if (! id.named) - { - d->length = 4; - d->data = (unsigned char *) reswr_alloc (4); - put_16 (big_endian, 0xffff, d->data); - put_16 (big_endian, id.u.id, d->data + 2); - } - else - { - int i; - - d->length = id.u.n.length * 2 + 2; - d->data = (unsigned char *) reswr_alloc (d->length); - for (i = 0; i < id.u.n.length; i++) - put_16 (big_endian, id.u.n.name[i], d->data + i * 2); - put_16 (big_endian, 0, d->data + i * 2); - } - - d->next = NULL; - - return d; -} - -/* Convert a null terminated unicode string to binary. This always - returns exactly one bindata structure. */ - -static struct bindata * -unicode_to_bin (str, big_endian) - const unichar *str; - int big_endian; -{ - int len; - struct bindata *d; - - len = 0; - if (str != NULL) - { - const unichar *s; - - for (s = str; *s != 0; s++) - ++len; - } - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = len * 2 + 2; - d->data = (unsigned char *) reswr_alloc (d->length); - - if (str == NULL) - put_16 (big_endian, 0, d->data); - else - { - const unichar *s; - int i; - - for (s = str, i = 0; *s != 0; s++, i++) - put_16 (big_endian, *s, d->data + i * 2); - put_16 (big_endian, 0, d->data + i * 2); - } - - d->next = NULL; - - return d; -} - -/* Convert an accelerator resource to binary. */ - -static struct bindata * -res_to_bin_accelerator (accelerators, big_endian) - const struct accelerator *accelerators; - int big_endian; -{ - struct bindata *first, **pp; - const struct accelerator *a; - - first = NULL; - pp = &first; - - for (a = accelerators; a != NULL; a = a->next) - { - struct bindata *d; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = 8; - d->data = (unsigned char *) reswr_alloc (8); - - put_16 (big_endian, - a->flags | (a->next != NULL ? 0 : ACC_LAST), - d->data); - put_16 (big_endian, a->key, d->data + 2); - put_16 (big_endian, a->id, d->data + 4); - put_16 (big_endian, 0, d->data + 8); - - d->next = NULL; - *pp = d; - pp = &d->next; - } - - return first; -} - -/* Convert a cursor resource to binary. */ - -static struct bindata * -res_to_bin_cursor (c, big_endian) - const struct cursor *c; - int big_endian; -{ - struct bindata *d; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = 4; - d->data = (unsigned char *) reswr_alloc (4); - - put_16 (big_endian, c->xhotspot, d->data); - put_16 (big_endian, c->yhotspot, d->data + 2); - - d->next = (struct bindata *) reswr_alloc (sizeof *d); - d->next->length = c->length; - d->next->data = (unsigned char *) c->data; - d->next->next = NULL; - - return d; -} - -/* Convert a group cursor resource to binary. */ - -static struct bindata * -res_to_bin_group_cursor (group_cursors, big_endian) - const struct group_cursor *group_cursors; - int big_endian; -{ - struct bindata *first, **pp; - int c; - const struct group_cursor *gc; - - first = (struct bindata *) reswr_alloc (sizeof *first); - first->length = 6; - first->data = (unsigned char *) reswr_alloc (6); - - put_16 (big_endian, 0, first->data); - put_16 (big_endian, 2, first->data + 2); - - first->next = NULL; - pp = &first->next; - - c = 0; - for (gc = group_cursors; gc != NULL; gc = gc->next) - { - struct bindata *d; - - ++c; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = 14; - d->data = (unsigned char *) reswr_alloc (14); - - put_16 (big_endian, gc->width, d->data); - put_16 (big_endian, gc->height, d->data + 2); - put_16 (big_endian, gc->planes, d->data + 4); - put_16 (big_endian, gc->bits, d->data + 6); - put_32 (big_endian, gc->bytes, d->data + 8); - put_16 (big_endian, gc->index, d->data + 12); - - d->next = NULL; - *pp = d; - pp = &d->next; - } - - put_16 (big_endian, c, first->data + 4); - - return first; -} - -/* Convert a dialog resource to binary. */ - -static struct bindata * -res_to_bin_dialog (dialog, big_endian) - const struct dialog *dialog; - int big_endian; -{ - int dialogex; - struct bindata *first, **pp; - unsigned long length; - int off, c; - struct dialog_control *dc; - - dialogex = extended_dialog (dialog); - - first = (struct bindata *) reswr_alloc (sizeof *first); - first->length = dialogex ? 26 : 18; - first->data = (unsigned char *) reswr_alloc (first->length); - - length = first->length; - - if (! dialogex) - { - put_32 (big_endian, dialog->style, first->data); - put_32 (big_endian, dialog->exstyle, first->data + 4); - off = 8; - } - else - { - put_16 (big_endian, 1, first->data); - put_16 (big_endian, 0xffff, first->data + 2); - - if (dialog->ex == NULL) - put_32 (big_endian, 0, first->data + 4); - else - put_32 (big_endian, dialog->ex->help, first->data + 4); - put_32 (big_endian, dialog->exstyle, first->data + 8); - put_32 (big_endian, dialog->style, first->data + 12); - off = 16; - } - - put_16 (big_endian, dialog->x, first->data + off + 2); - put_16 (big_endian, dialog->y, first->data + off + 4); - put_16 (big_endian, dialog->width, first->data + off + 6); - put_16 (big_endian, dialog->height, first->data + off + 8); - - pp = &first->next; - - *pp = resid_to_bin (dialog->menu, big_endian); - length += (*pp)->length; - pp = &(*pp)->next; - - *pp = resid_to_bin (dialog->class, big_endian); - length += (*pp)->length; - pp = &(*pp)->next; - - *pp = unicode_to_bin (dialog->caption, big_endian); - length += (*pp)->length; - pp = &(*pp)->next; - - if ((dialog->style & DS_SETFONT) != 0) - { - struct bindata *d; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = dialogex ? 6 : 2; - d->data = (unsigned char *) reswr_alloc (d->length); - - length += d->length; - - put_16 (big_endian, dialog->pointsize, d->data); - - if (dialogex) - { - if (dialog->ex == NULL) - { - put_16 (big_endian, 0, d->data + 2); - put_16 (big_endian, 0, d->data + 4); - } - else - { - put_16 (big_endian, dialog->ex->weight, d->data + 2); - put_16 (big_endian, dialog->ex->italic, d->data + 4); - } - } - - *pp = d; - pp = &d->next; - - *pp = unicode_to_bin (dialog->font, big_endian); - length += (*pp)->length; - pp = &(*pp)->next; - } - - c = 0; - for (dc = dialog->controls; dc != NULL; dc = dc->next) - { - struct bindata *d; - int dcoff; - - ++c; - - dword_align_bin (&pp, &length); - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = dialogex ? 24 : 18; - d->data = (unsigned char *) reswr_alloc (d->length); - - length += d->length; - - if (! dialogex) - { - put_32 (big_endian, dc->style, d->data); - put_32 (big_endian, dc->exstyle, d->data + 4); - dcoff = 8; - } - else - { - put_32 (big_endian, dc->help, d->data); - put_32 (big_endian, dc->exstyle, d->data + 4); - put_32 (big_endian, dc->style, d->data + 8); - dcoff = 12; - } - - put_16 (big_endian, dc->x, d->data + dcoff); - put_16 (big_endian, dc->y, d->data + dcoff + 2); - put_16 (big_endian, dc->width, d->data + dcoff + 4); - put_16 (big_endian, dc->height, d->data + dcoff + 6); - - if (dialogex) - put_32 (big_endian, dc->id, d->data + dcoff + 8); - else - put_16 (big_endian, dc->id, d->data + dcoff + 8); - - *pp = d; - pp = &d->next; - - *pp = resid_to_bin (dc->class, big_endian); - length += (*pp)->length; - pp = &(*pp)->next; - - *pp = resid_to_bin (dc->text, big_endian); - length += (*pp)->length; - pp = &(*pp)->next; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = 2; - d->data = (unsigned char *) reswr_alloc (2); - - length += 2; - - d->next = NULL; - *pp = d; - pp = &d->next; - - if (dc->data == NULL) - put_16 (big_endian, 0, d->data); - else - { - unsigned long sublen; - - dword_align_bin (&pp, &length); - - *pp = res_to_bin_rcdata (dc->data, big_endian); - sublen = 0; - while (*pp != NULL) - { - sublen += (*pp)->length; - pp = &(*pp)->next; - } - - put_16 (big_endian, sublen, d->data); - - length += sublen; - } - } - put_16 (big_endian, c, first->data + off); - - return first; -} - -/* Convert a fontdir resource to binary. */ - -static struct bindata * -res_to_bin_fontdir (fontdirs, big_endian) - const struct fontdir *fontdirs; - int big_endian; -{ - struct bindata *first, **pp; - int c; - const struct fontdir *fd; - - first = (struct bindata *) reswr_alloc (sizeof *first); - first->length = 2; - first->data = (unsigned char *) reswr_alloc (2); - - first->next = NULL; - pp = &first->next; - - c = 0; - for (fd = fontdirs; fd != NULL; fd = fd->next) - { - struct bindata *d; - - ++c; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = 2; - d->data = (unsigned char *) reswr_alloc (2); - - put_16 (big_endian, fd->index, d->data); - - *pp = d; - pp = &d->next; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = fd->length; - d->data = (unsigned char *) fd->data; - - d->next = NULL; - *pp = d; - pp = &d->next; - } - - put_16 (big_endian, c, first->data); - - return first; -} - -/* Convert a group icon resource to binary. */ - -static struct bindata * -res_to_bin_group_icon (group_icons, big_endian) - const struct group_icon *group_icons; - int big_endian; -{ - struct bindata *first, **pp; - int c; - const struct group_icon *gi; - - first = (struct bindata *) reswr_alloc (sizeof *first); - first->length = 6; - first->data = (unsigned char *) reswr_alloc (6); - - put_16 (big_endian, 0, first->data); - put_16 (big_endian, 1, first->data + 2); - - first->next = NULL; - pp = &first->next; - - c = 0; - for (gi = group_icons; gi != NULL; gi = gi->next) - { - struct bindata *d; - - ++c; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = 14; - d->data = (unsigned char *) reswr_alloc (14); - - d->data[0] = gi->width; - d->data[1] = gi->height; - d->data[2] = gi->colors; - d->data[3] = 0; - put_16 (big_endian, gi->planes, d->data + 4); - put_16 (big_endian, gi->bits, d->data + 6); - put_32 (big_endian, gi->bytes, d->data + 8); - put_16 (big_endian, gi->index, d->data + 12); - - d->next = NULL; - *pp = d; - pp = &d->next; - } - - put_16 (big_endian, c, first->data + 4); - - return first; -} - -/* Convert a menu resource to binary. */ - -static struct bindata * -res_to_bin_menu (menu, big_endian) - const struct menu *menu; - int big_endian; -{ - int menuex; - struct bindata *d; - - menuex = extended_menu (menu); - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = menuex ? 8 : 4; - d->data = (unsigned char *) reswr_alloc (d->length); - - if (! menuex) - { - put_16 (big_endian, 0, d->data); - put_16 (big_endian, 0, d->data + 2); - - d->next = res_to_bin_menuitems (menu->items, big_endian); - } - else - { - put_16 (big_endian, 1, d->data); - put_16 (big_endian, 4, d->data + 2); - put_32 (big_endian, menu->help, d->data + 4); - - d->next = res_to_bin_menuexitems (menu->items, big_endian); - } - - return d; -} - -/* Convert menu items to binary. */ - -static struct bindata * -res_to_bin_menuitems (items, big_endian) - const struct menuitem *items; - int big_endian; -{ - struct bindata *first, **pp; - const struct menuitem *mi; - - first = NULL; - pp = &first; - - for (mi = items; mi != NULL; mi = mi->next) - { - struct bindata *d; - int flags; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = mi->popup == NULL ? 4 : 2; - d->data = (unsigned char *) reswr_alloc (d->length); - - flags = mi->type; - if (mi->next == NULL) - flags |= MENUITEM_ENDMENU; - if (mi->popup != NULL) - flags |= MENUITEM_POPUP; - - put_16 (big_endian, flags, d->data); - - if (mi->popup == NULL) - put_16 (big_endian, mi->id, d->data + 2); - - *pp = d; - pp = &d->next; - - *pp = unicode_to_bin (mi->text, big_endian); - pp = &(*pp)->next; - - if (mi->popup != NULL) - { - *pp = res_to_bin_menuitems (mi->popup, big_endian); - while (*pp != NULL) - pp = &(*pp)->next; - } - } - - return first; -} - -/* Convert menuex items to binary. */ - -static struct bindata * -res_to_bin_menuexitems (items, big_endian) - const struct menuitem *items; - int big_endian; -{ - struct bindata *first, **pp; - unsigned long length; - const struct menuitem *mi; - - first = NULL; - pp = &first; - - length = 0; - - for (mi = items; mi != NULL; mi = mi->next) - { - struct bindata *d; - int flags; - - dword_align_bin (&pp, &length); - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = 12; - d->data = (unsigned char *) reswr_alloc (12); - - length += 12; - - put_32 (big_endian, mi->type, d->data); - put_32 (big_endian, mi->state, d->data + 4); - put_16 (big_endian, mi->id, d->data + 8); - - flags = 0; - if (mi->next == NULL) - flags |= 0x80; - if (mi->popup != NULL) - flags |= 1; - put_16 (big_endian, flags, d->data + 10); - - *pp = d; - pp = &d->next; - - *pp = unicode_to_bin (mi->text, big_endian); - length += (*pp)->length; - pp = &(*pp)->next; - - if (mi->popup != NULL) - { - dword_align_bin (&pp, &length); - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = 4; - d->data = (unsigned char *) reswr_alloc (4); - - put_32 (big_endian, mi->help, d->data); - - *pp = d; - pp = &d->next; - - *pp = res_to_bin_menuexitems (mi->popup, big_endian); - while (*pp != NULL) - { - length += (*pp)->length; - pp = &(*pp)->next; - } - } - } - - return first; -} - -/* Convert an rcdata resource to binary. This is also used to convert - other information which happens to be stored in rcdata_item lists - to binary. */ - -static struct bindata * -res_to_bin_rcdata (items, big_endian) - const struct rcdata_item *items; - int big_endian; -{ - struct bindata *first, **pp; - const struct rcdata_item *ri; - - first = NULL; - pp = &first; - - for (ri = items; ri != NULL; ri = ri->next) - { - struct bindata *d; - - d = (struct bindata *) reswr_alloc (sizeof *d); - - switch (ri->type) - { - default: - abort (); - - case RCDATA_WORD: - d->length = 2; - d->data = (unsigned char *) reswr_alloc (2); - put_16 (big_endian, ri->u.word, d->data); - break; - - case RCDATA_DWORD: - d->length = 4; - d->data = (unsigned char *) reswr_alloc (4); - put_32 (big_endian, ri->u.dword, d->data); - break; - - case RCDATA_STRING: - d->length = ri->u.string.length; - d->data = (unsigned char *) ri->u.string.s; - break; - - case RCDATA_WSTRING: - { - unsigned long i; - - d->length = ri->u.wstring.length * 2; - d->data = (unsigned char *) reswr_alloc (d->length); - for (i = 0; i < ri->u.wstring.length; i++) - put_16 (big_endian, ri->u.wstring.w[i], d->data + i * 2); - break; - } - - case RCDATA_BUFFER: - d->length = ri->u.buffer.length; - d->data = (unsigned char *) ri->u.buffer.data; - break; - } - - d->next = NULL; - *pp = d; - pp = &d->next; - } - - return first; -} - -/* Convert a stringtable resource to binary. */ - -static struct bindata * -res_to_bin_stringtable (st, big_endian) - const struct stringtable *st; - int big_endian; -{ - struct bindata *first, **pp; - int i; - - first = NULL; - pp = &first; - - for (i = 0; i < 16; i++) - { - int slen, j; - struct bindata *d; - unichar *s; - - slen = st->strings[i].length; - s = st->strings[i].string; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = 2 + slen * 2; - d->data = (unsigned char *) reswr_alloc (d->length); - - put_16 (big_endian, slen, d->data); - - for (j = 0; j < slen; j++) - put_16 (big_endian, s[j], d->data + 2 + j * 2); - - d->next = NULL; - *pp = d; - pp = &d->next; - } - - return first; -} - -/* Convert an ASCII string to a unicode binary string. This always - returns exactly one bindata structure. */ - -static struct bindata * -string_to_unicode_bin (s, big_endian) - const char *s; - int big_endian; -{ - size_t len, i; - struct bindata *d; - - len = strlen (s); - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = len * 2 + 2; - d->data = (unsigned char *) reswr_alloc (d->length); - - for (i = 0; i < len; i++) - put_16 (big_endian, s[i], d->data + i * 2); - put_16 (big_endian, 0, d->data + i * 2); - - d->next = NULL; - - return d; -} - -/* Convert a versioninfo resource to binary. */ - -static struct bindata * -res_to_bin_versioninfo (versioninfo, big_endian) - const struct versioninfo *versioninfo; - int big_endian; -{ - struct bindata *first, **pp; - unsigned long length; - struct ver_info *vi; - - first = (struct bindata *) reswr_alloc (sizeof *first); - first->length = 6; - first->data = (unsigned char *) reswr_alloc (6); - - length = 6; - - if (versioninfo->fixed == NULL) - put_16 (big_endian, 0, first->data + 2); - else - put_16 (big_endian, 52, first->data + 2); - - put_16 (big_endian, 0, first->data + 4); - - pp = &first->next; - - *pp = string_to_unicode_bin ("VS_VERSION_INFO", big_endian); - length += (*pp)->length; - pp = &(*pp)->next; - - dword_align_bin (&pp, &length); - - if (versioninfo->fixed != NULL) - { - const struct fixed_versioninfo *fi; - struct bindata *d; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = 52; - d->data = (unsigned char *) reswr_alloc (52); - - length += 52; - - fi = versioninfo->fixed; - - put_32 (big_endian, 0xfeef04bd, d->data); - put_32 (big_endian, 0x10000, d->data + 4); - put_32 (big_endian, fi->file_version_ms, d->data + 8); - put_32 (big_endian, fi->file_version_ls, d->data + 12); - put_32 (big_endian, fi->product_version_ms, d->data + 16); - put_32 (big_endian, fi->product_version_ls, d->data + 20); - put_32 (big_endian, fi->file_flags_mask, d->data + 24); - put_32 (big_endian, fi->file_flags, d->data + 28); - put_32 (big_endian, fi->file_os, d->data + 32); - put_32 (big_endian, fi->file_type, d->data + 36); - put_32 (big_endian, fi->file_subtype, d->data + 40); - put_32 (big_endian, fi->file_date_ms, d->data + 44); - put_32 (big_endian, fi->file_date_ls, d->data + 48); - - d->next = NULL; - *pp = d; - pp = &d->next; - } - - for (vi = versioninfo->var; vi != NULL; vi = vi->next) - { - struct bindata *vid; - unsigned long vilen; - - dword_align_bin (&pp, &length); - - vid = (struct bindata *) reswr_alloc (sizeof *vid); - vid->length = 6; - vid->data = (unsigned char *) reswr_alloc (6); - - length += 6; - vilen = 6; - - put_16 (big_endian, 0, vid->data + 2); - put_16 (big_endian, 0, vid->data + 4); - - *pp = vid; - pp = &vid->next; - - switch (vi->type) - { - default: - abort (); - - case VERINFO_STRING: - { - unsigned long hold, vslen; - struct bindata *vsd; - const struct ver_stringinfo *vs; - - *pp = string_to_unicode_bin ("StringFileInfo", big_endian); - length += (*pp)->length; - vilen += (*pp)->length; - pp = &(*pp)->next; - - hold = length; - dword_align_bin (&pp, &length); - vilen += length - hold; - - vsd = (struct bindata *) reswr_alloc (sizeof *vsd); - vsd->length = 6; - vsd->data = (unsigned char *) reswr_alloc (6); - - length += 6; - vilen += 6; - vslen = 6; - - put_16 (big_endian, 0, vsd->data + 2); - put_16 (big_endian, 0, vsd->data + 4); - - *pp = vsd; - pp = &vsd->next; - - *pp = unicode_to_bin (vi->u.string.language, big_endian); - length += (*pp)->length; - vilen += (*pp)->length; - vslen += (*pp)->length; - pp = &(*pp)->next; - - for (vs = vi->u.string.strings; vs != NULL; vs = vs->next) - { - struct bindata *vssd; - unsigned long vsslen; - - hold = length; - dword_align_bin (&pp, &length); - vilen += length - hold; - vslen += length - hold; - - vssd = (struct bindata *) reswr_alloc (sizeof *vssd); - vssd->length = 6; - vssd->data = (unsigned char *) reswr_alloc (6); - - length += 6; - vilen += 6; - vslen += 6; - vsslen = 6; - - put_16 (big_endian, 1, vssd->data + 4); - - *pp = vssd; - pp = &vssd->next; - - *pp = unicode_to_bin (vs->key, big_endian); - length += (*pp)->length; - vilen += (*pp)->length; - vslen += (*pp)->length; - vsslen += (*pp)->length; - pp = &(*pp)->next; - - hold = length; - dword_align_bin (&pp, &length); - vilen += length - hold; - vslen += length - hold; - vsslen += length - hold; - - *pp = unicode_to_bin (vs->value, big_endian); - put_16 (big_endian, (*pp)->length / 2, vssd->data + 2); - length += (*pp)->length; - vilen += (*pp)->length; - vslen += (*pp)->length; - vsslen += (*pp)->length; - pp = &(*pp)->next; - - put_16 (big_endian, vsslen, vssd->data); - } - - put_16 (big_endian, vslen, vsd->data); - - break; - } - - case VERINFO_VAR: - { - unsigned long hold, vvlen, vvvlen; - struct bindata *vvd; - const struct ver_varinfo *vv; - - *pp = string_to_unicode_bin ("VarFileInfo", big_endian); - length += (*pp)->length; - vilen += (*pp)->length; - pp = &(*pp)->next; - - hold = length; - dword_align_bin (&pp, &length); - vilen += length - hold; - - vvd = (struct bindata *) reswr_alloc (sizeof *vvd); - vvd->length = 6; - vvd->data = (unsigned char *) reswr_alloc (6); - - length += 6; - vilen += 6; - vvlen = 6; - - put_16 (big_endian, 0, vvd->data + 4); - - *pp = vvd; - pp = &vvd->next; - - *pp = unicode_to_bin (vi->u.var.key, big_endian); - length += (*pp)->length; - vilen += (*pp)->length; - vvlen += (*pp)->length; - pp = &(*pp)->next; - - hold = length; - dword_align_bin (&pp, &length); - vilen += length - hold; - vvlen += length - hold; - - vvvlen = 0; - - for (vv = vi->u.var.var; vv != NULL; vv = vv->next) - { - struct bindata *vvsd; - - vvsd = (struct bindata *) reswr_alloc (sizeof *vvsd); - vvsd->length = 4; - vvsd->data = (unsigned char *) reswr_alloc (4); - - length += 4; - vilen += 4; - vvlen += 4; - vvvlen += 4; - - put_16 (big_endian, vv->language, vvsd->data); - put_16 (big_endian, vv->charset, vvsd->data + 2); - - vvsd->next = NULL; - *pp = vvsd; - pp = &vvsd->next; - } - - put_16 (big_endian, vvlen, vvd->data); - put_16 (big_endian, vvvlen, vvd->data + 2); - - break; - } - } - - put_16 (big_endian, vilen, vid->data); - } - - put_16 (big_endian, length, first->data); - - return first; -} - -/* Convert a generic resource to binary. */ - -static struct bindata * -res_to_bin_generic (length, data) - unsigned long length; - const unsigned char *data; -{ - struct bindata *d; - - d = (struct bindata *) reswr_alloc (sizeof *d); - d->length = length; - d->data = (unsigned char *) data; - - d->next = NULL; - - return d; -} diff --git a/binutils/rescoff.c b/binutils/rescoff.c deleted file mode 100644 index 45161c3677d..00000000000 --- a/binutils/rescoff.c +++ /dev/null @@ -1,785 +0,0 @@ -/* rescoff.c -- read and write resources in Windows COFF files. - Copyright 1997, 1998, 2000 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file contains function that read and write Windows resources - in COFF files. */ - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "windres.h" - -#include - -/* In order to use the address of a resource data entry, we need to - get the image base of the file. Right now we extract it from - internal BFD information. FIXME. */ - -#include "coff/internal.h" -#include "libcoff.h" - -/* Information we extract from the file. */ - -struct coff_file_info -{ - /* File name. */ - const char *filename; - /* Data read from the file. */ - const bfd_byte *data; - /* End of data read from file. */ - const bfd_byte *data_end; - /* Address of the resource section minus the image base of the file. */ - bfd_vma secaddr; - /* Non-zero if the file is big endian. */ - int big_endian; -}; - -/* A resource directory table in a COFF file. */ - -struct extern_res_directory -{ - /* Characteristics. */ - bfd_byte characteristics[4]; - /* Time stamp. */ - bfd_byte time[4]; - /* Major version number. */ - bfd_byte major[2]; - /* Minor version number. */ - bfd_byte minor[2]; - /* Number of named directory entries. */ - bfd_byte name_count[2]; - /* Number of directory entries with IDs. */ - bfd_byte id_count[2]; -}; - -/* A resource directory entry in a COFF file. */ - -struct extern_res_entry -{ - /* Name or ID. */ - bfd_byte name[4]; - /* Address of resource entry or subdirectory. */ - bfd_byte rva[4]; -}; - -/* A resource data entry in a COFF file. */ - -struct extern_res_data -{ - /* Address of resource data. This is apparently a file relative - address, rather than a section offset. */ - bfd_byte rva[4]; - /* Size of resource data. */ - bfd_byte size[4]; - /* Code page. */ - bfd_byte codepage[4]; - /* Reserved. */ - bfd_byte reserved[4]; -}; - -/* Macros to swap in values. */ - -#define getfi_16(fi, s) ((fi)->big_endian ? bfd_getb16 (s) : bfd_getl16 (s)) -#define getfi_32(fi, s) ((fi)->big_endian ? bfd_getb32 (s) : bfd_getl32 (s)) - -/* Local functions. */ - -static void overrun PARAMS ((const struct coff_file_info *, const char *)); -static struct res_directory *read_coff_res_dir - PARAMS ((const bfd_byte *, const struct coff_file_info *, - const struct res_id *, int)); -static struct res_resource *read_coff_data_entry - PARAMS ((const bfd_byte *, const struct coff_file_info *, - const struct res_id *)); - -/* Read the resources in a COFF file. */ - -struct res_directory * -read_coff_rsrc (filename, target) - const char *filename; - const char *target; -{ - bfd *abfd; - char **matching; - asection *sec; - bfd_size_type size; - bfd_byte *data; - struct coff_file_info finfo; - - if (filename == NULL) - fatal (_("filename required for COFF input")); - - abfd = bfd_openr (filename, target); - if (abfd == NULL) - bfd_fatal (filename); - - if (! bfd_check_format_matches (abfd, bfd_object, &matching)) - { - bfd_nonfatal (bfd_get_filename (abfd)); - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - list_matching_formats (matching); - xexit (1); - } - - sec = bfd_get_section_by_name (abfd, ".rsrc"); - if (sec == NULL) - { - fatal (_("%s: no resource section"), filename); - } - - size = bfd_section_size (abfd, sec); - data = (bfd_byte *) res_alloc (size); - - if (! bfd_get_section_contents (abfd, sec, data, 0, size)) - bfd_fatal (_("can't read resource section")); - - finfo.filename = filename; - finfo.data = data; - finfo.data_end = data + size; - finfo.secaddr = (bfd_get_section_vma (abfd, sec) - - pe_data (abfd)->pe_opthdr.ImageBase); - finfo.big_endian = bfd_big_endian (abfd); - - bfd_close (abfd); - - /* Now just read in the top level resource directory. Note that we - don't free data, since we create resource entries that point into - it. If we ever want to free up the resource information we read, - this will have to be cleaned up. */ - - return read_coff_res_dir (data, &finfo, (const struct res_id *) NULL, 0); -} - -/* Give an error if we are out of bounds. */ - -static void -overrun (finfo, msg) - const struct coff_file_info *finfo; - const char *msg; -{ - fatal (_("%s: %s: address out of bounds"), finfo->filename, msg); -} - -/* Read a resource directory. */ - -static struct res_directory * -read_coff_res_dir (data, finfo, type, level) - const bfd_byte *data; - const struct coff_file_info *finfo; - const struct res_id *type; - int level; -{ - const struct extern_res_directory *erd; - struct res_directory *rd; - int name_count, id_count, i; - struct res_entry **pp; - const struct extern_res_entry *ere; - - if ((size_t) (finfo->data_end - data) < sizeof (struct extern_res_directory)) - overrun (finfo, _("directory")); - - erd = (const struct extern_res_directory *) data; - - rd = (struct res_directory *) res_alloc (sizeof *rd); - rd->characteristics = getfi_32 (finfo, erd->characteristics); - rd->time = getfi_32 (finfo, erd->time); - rd->major = getfi_16 (finfo, erd->major); - rd->minor = getfi_16 (finfo, erd->minor); - rd->entries = NULL; - - name_count = getfi_16 (finfo, erd->name_count); - id_count = getfi_16 (finfo, erd->id_count); - - pp = &rd->entries; - - /* The resource directory entries immediately follow the directory - table. */ - ere = (const struct extern_res_entry *) (erd + 1); - - for (i = 0; i < name_count; i++, ere++) - { - unsigned long name, rva; - struct res_entry *re; - const bfd_byte *ers; - int length, j; - - if ((const bfd_byte *) ere >= finfo->data_end) - overrun (finfo, _("named directory entry")); - - name = getfi_32 (finfo, ere->name); - rva = getfi_32 (finfo, ere->rva); - - /* For some reason the high bit in NAME is set. */ - name &=~ 0x80000000; - - if (name > (size_t) (finfo->data_end - finfo->data)) - overrun (finfo, _("directory entry name")); - - ers = finfo->data + name; - - re = (struct res_entry *) res_alloc (sizeof *re); - re->next = NULL; - re->id.named = 1; - length = getfi_16 (finfo, ers); - re->id.u.n.length = length; - re->id.u.n.name = (unichar *) res_alloc (length * sizeof (unichar)); - for (j = 0; j < length; j++) - re->id.u.n.name[j] = getfi_16 (finfo, ers + j * 2 + 2); - - if (level == 0) - type = &re->id; - - if ((rva & 0x80000000) != 0) - { - rva &=~ 0x80000000; - if (rva >= (size_t) (finfo->data_end - finfo->data)) - overrun (finfo, _("named subdirectory")); - re->subdir = 1; - re->u.dir = read_coff_res_dir (finfo->data + rva, finfo, type, - level + 1); - } - else - { - if (rva >= (size_t) (finfo->data_end - finfo->data)) - overrun (finfo, _("named resource")); - re->subdir = 0; - re->u.res = read_coff_data_entry (finfo->data + rva, finfo, type); - } - - *pp = re; - pp = &re->next; - } - - for (i = 0; i < id_count; i++, ere++) - { - unsigned long name, rva; - struct res_entry *re; - - if ((const bfd_byte *) ere >= finfo->data_end) - overrun (finfo, _("ID directory entry")); - - name = getfi_32 (finfo, ere->name); - rva = getfi_32 (finfo, ere->rva); - - re = (struct res_entry *) res_alloc (sizeof *re); - re->next = NULL; - re->id.named = 0; - re->id.u.id = name; - - if (level == 0) - type = &re->id; - - if ((rva & 0x80000000) != 0) - { - rva &=~ 0x80000000; - if (rva >= (size_t) (finfo->data_end - finfo->data)) - overrun (finfo, _("ID subdirectory")); - re->subdir = 1; - re->u.dir = read_coff_res_dir (finfo->data + rva, finfo, type, - level + 1); - } - else - { - if (rva >= (size_t) (finfo->data_end - finfo->data)) - overrun (finfo, _("ID resource")); - re->subdir = 0; - re->u.res = read_coff_data_entry (finfo->data + rva, finfo, type); - } - - *pp = re; - pp = &re->next; - } - - return rd; -} - -/* Read a resource data entry. */ - -static struct res_resource * -read_coff_data_entry (data, finfo, type) - const bfd_byte *data; - const struct coff_file_info *finfo; - const struct res_id *type; -{ - const struct extern_res_data *erd; - struct res_resource *r; - unsigned long size, rva; - const bfd_byte *resdata; - - if (type == NULL) - fatal (_("resource type unknown")); - - if ((size_t) (finfo->data_end - data) < sizeof (struct extern_res_data)) - overrun (finfo, _("data entry")); - - erd = (const struct extern_res_data *) data; - - size = getfi_32 (finfo, erd->size); - rva = getfi_32 (finfo, erd->rva); - if (rva < finfo->secaddr - || rva - finfo->secaddr >= (size_t) (finfo->data_end - finfo->data)) - overrun (finfo, _("resource data")); - - resdata = finfo->data + (rva - finfo->secaddr); - - if (size > (size_t) (finfo->data_end - resdata)) - overrun (finfo, _("resource data size")); - - r = bin_to_res (*type, resdata, size, finfo->big_endian); - - memset (&r->res_info, 0, sizeof (struct res_res_info)); - r->coff_info.codepage = getfi_32 (finfo, erd->codepage); - r->coff_info.reserved = getfi_32 (finfo, erd->reserved); - - return r; -} - -/* This structure is used to build a list of bindata structures. */ - -struct bindata_build -{ - /* The data. */ - struct bindata *d; - /* The last structure we have added to the list. */ - struct bindata *last; - /* The size of the list as a whole. */ - unsigned long length; -}; - -/* This structure keeps track of information as we build the directory - tree. */ - -struct coff_write_info -{ - /* These fields are based on the BFD. */ - /* The BFD itself. */ - bfd *abfd; - /* Non-zero if the file is big endian. */ - int big_endian; - /* Pointer to section symbol used to build RVA relocs. */ - asymbol **sympp; - - /* These fields are computed initially, and then not changed. */ - /* Length of directory tables and entries. */ - unsigned long dirsize; - /* Length of directory entry strings. */ - unsigned long dirstrsize; - /* Length of resource data entries. */ - unsigned long dataentsize; - - /* These fields are updated as we add data. */ - /* Directory tables and entries. */ - struct bindata_build dirs; - /* Directory entry strings. */ - struct bindata_build dirstrs; - /* Resource data entries. */ - struct bindata_build dataents; - /* Actual resource data. */ - struct bindata_build resources; - /* Relocations. */ - arelent **relocs; - /* Number of relocations. */ - unsigned int reloc_count; -}; - -/* Macros to swap out values. */ - -#define putcwi_16(cwi, v, s) \ - ((cwi->big_endian) ? bfd_putb16 ((v), (s)) : bfd_putl16 ((v), (s))) -#define putcwi_32(cwi, v, s) \ - ((cwi->big_endian) ? bfd_putb32 ((v), (s)) : bfd_putl32 ((v), (s))) - -static void coff_bin_sizes - PARAMS ((const struct res_directory *, struct coff_write_info *)); -static unsigned char *coff_alloc PARAMS ((struct bindata_build *, size_t)); -static void coff_to_bin - PARAMS ((const struct res_directory *, struct coff_write_info *)); -static void coff_res_to_bin - PARAMS ((const struct res_resource *, struct coff_write_info *)); - -/* Write resources to a COFF file. RESOURCES should already be - sorted. - - Right now we always create a new file. Someday we should also - offer the ability to merge resources into an existing file. This - would require doing the basic work of objcopy, just modifying or - adding the .rsrc section. */ - -void -write_coff_file (filename, target, resources) - const char *filename; - const char *target; - const struct res_directory *resources; -{ - bfd *abfd; - asection *sec; - struct coff_write_info cwi; - struct bindata *d; - unsigned long length, offset; - - if (filename == NULL) - fatal (_("filename required for COFF output")); - - abfd = bfd_openw (filename, target); - if (abfd == NULL) - bfd_fatal (filename); - - if (! bfd_set_format (abfd, bfd_object)) - bfd_fatal ("bfd_set_format"); - -#if defined DLLTOOL_SH - if (! bfd_set_arch_mach (abfd, bfd_arch_sh, 0)) - bfd_fatal ("bfd_set_arch_mach(sh)"); -#elif defined DLLTOOL_MIPS - if (! bfd_set_arch_mach (abfd, bfd_arch_mips, 0)) - bfd_fatal ("bfd_set_arch_mach(mips)"); -#elif defined DLLTOOL_ARM - if (! bfd_set_arch_mach (abfd, bfd_arch_arm, 0)) - bfd_fatal ("bfd_set_arch_mach(arm)"); -#else - /* FIXME: This is obviously i386 specific. */ - if (! bfd_set_arch_mach (abfd, bfd_arch_i386, 0)) - bfd_fatal ("bfd_set_arch_mach(i386)"); -#endif - - if (! bfd_set_file_flags (abfd, HAS_SYMS | HAS_RELOC)) - bfd_fatal ("bfd_set_file_flags"); - - sec = bfd_make_section (abfd, ".rsrc"); - if (sec == NULL) - bfd_fatal ("bfd_make_section"); - - if (! bfd_set_section_flags (abfd, sec, - (SEC_HAS_CONTENTS | SEC_ALLOC - | SEC_LOAD | SEC_DATA))) - bfd_fatal ("bfd_set_section_flags"); - - if (! bfd_set_symtab (abfd, sec->symbol_ptr_ptr, 1)) - bfd_fatal ("bfd_set_symtab"); - - /* Requiring this is probably a bug in BFD. */ - sec->output_section = sec; - - /* The order of data in the .rsrc section is - resource directory tables and entries - resource directory strings - resource data entries - actual resource data - - We build these different types of data in different lists. */ - - cwi.abfd = abfd; - cwi.big_endian = bfd_big_endian (abfd); - cwi.sympp = sec->symbol_ptr_ptr; - cwi.dirsize = 0; - cwi.dirstrsize = 0; - cwi.dataentsize = 0; - cwi.dirs.d = NULL; - cwi.dirs.last = NULL; - cwi.dirs.length = 0; - cwi.dirstrs.d = NULL; - cwi.dirstrs.last = NULL; - cwi.dirstrs.length = 0; - cwi.dataents.d = NULL; - cwi.dataents.last = NULL; - cwi.dataents.length = 0; - cwi.resources.d = NULL; - cwi.resources.last = NULL; - cwi.resources.length = 0; - cwi.relocs = NULL; - cwi.reloc_count = 0; - - /* Work out the sizes of the resource directory entries, so that we - know the various offsets we will need. */ - coff_bin_sizes (resources, &cwi); - - /* Force the directory strings to be 32 bit aligned. Every other - structure is 32 bit aligned anyhow. */ - cwi.dirstrsize = (cwi.dirstrsize + 3) &~ 3; - - /* Actually convert the resources to binary. */ - coff_to_bin (resources, &cwi); - - /* Add another 2 bytes to the directory strings if needed for - alignment. */ - if ((cwi.dirstrs.length & 3) != 0) - { - unsigned char *ex; - - ex = coff_alloc (&cwi.dirstrs, 2); - ex[0] = 0; - ex[1] = 0; - } - - /* Make sure that the data we built came out to the same size as we - calculated initially. */ - assert (cwi.dirs.length == cwi.dirsize); - assert (cwi.dirstrs.length == cwi.dirstrsize); - assert (cwi.dataents.length == cwi.dataentsize); - - length = (cwi.dirsize - + cwi.dirstrsize - + cwi.dataentsize - + cwi.resources.length); - - if (! bfd_set_section_size (abfd, sec, length)) - bfd_fatal ("bfd_set_section_size"); - - bfd_set_reloc (abfd, sec, cwi.relocs, cwi.reloc_count); - - offset = 0; - for (d = cwi.dirs.d; d != NULL; d = d->next) - { - if (! bfd_set_section_contents (abfd, sec, d->data, offset, d->length)) - bfd_fatal ("bfd_set_section_contents"); - offset += d->length; - } - for (d = cwi.dirstrs.d; d != NULL; d = d->next) - { - if (! bfd_set_section_contents (abfd, sec, d->data, offset, d->length)) - bfd_fatal ("bfd_set_section_contents"); - offset += d->length; - } - for (d = cwi.dataents.d; d != NULL; d = d->next) - { - if (! bfd_set_section_contents (abfd, sec, d->data, offset, d->length)) - bfd_fatal ("bfd_set_section_contents"); - offset += d->length; - } - for (d = cwi.resources.d; d != NULL; d = d->next) - { - if (! bfd_set_section_contents (abfd, sec, d->data, offset, d->length)) - bfd_fatal ("bfd_set_section_contents"); - offset += d->length; - } - - assert (offset == length); - - if (! bfd_close (abfd)) - bfd_fatal ("bfd_close"); - - /* We allocated the relocs array using malloc. */ - free (cwi.relocs); -} - -/* Work out the sizes of the various fixed size resource directory - entries. This updates fields in CWI. */ - -static void -coff_bin_sizes (resdir, cwi) - const struct res_directory *resdir; - struct coff_write_info *cwi; -{ - const struct res_entry *re; - - cwi->dirsize += sizeof (struct extern_res_directory); - - for (re = resdir->entries; re != NULL; re = re->next) - { - cwi->dirsize += sizeof (struct extern_res_entry); - - if (re->id.named) - cwi->dirstrsize += re->id.u.n.length * 2 + 2; - - if (re->subdir) - coff_bin_sizes (re->u.dir, cwi); - else - cwi->dataentsize += sizeof (struct extern_res_data); - } -} - -/* Allocate data for a particular list. */ - -static unsigned char * -coff_alloc (bb, size) - struct bindata_build *bb; - size_t size; -{ - struct bindata *d; - - d = (struct bindata *) reswr_alloc (sizeof *d); - - d->next = NULL; - d->data = (unsigned char *) reswr_alloc (size); - d->length = size; - - if (bb->d == NULL) - bb->d = d; - else - bb->last->next = d; - bb->last = d; - bb->length += size; - - return d->data; -} - -/* Convert the resource directory RESDIR to binary. */ - -static void -coff_to_bin (resdir, cwi) - const struct res_directory *resdir; - struct coff_write_info *cwi; -{ - struct extern_res_directory *erd; - int ci, cn; - const struct res_entry *e; - struct extern_res_entry *ere; - - /* Write out the directory table. */ - - erd = ((struct extern_res_directory *) - coff_alloc (&cwi->dirs, sizeof (*erd))); - - putcwi_32 (cwi, resdir->characteristics, erd->characteristics); - putcwi_32 (cwi, resdir->time, erd->time); - putcwi_16 (cwi, resdir->major, erd->major); - putcwi_16 (cwi, resdir->minor, erd->minor); - - ci = 0; - cn = 0; - for (e = resdir->entries; e != NULL; e = e->next) - { - if (e->id.named) - ++cn; - else - ++ci; - } - - putcwi_16 (cwi, cn, erd->name_count); - putcwi_16 (cwi, ci, erd->id_count); - - /* Write out the data entries. Note that we allocate space for all - the entries before writing them out. That permits a recursive - call to work correctly when writing out subdirectories. */ - - ere = ((struct extern_res_entry *) - coff_alloc (&cwi->dirs, (ci + cn) * sizeof (*ere))); - for (e = resdir->entries; e != NULL; e = e->next, ere++) - { - if (! e->id.named) - putcwi_32 (cwi, e->id.u.id, ere->name); - else - { - unsigned char *str; - int i; - - /* For some reason existing files seem to have the high bit - set on the address of the name, although that is not - documented. */ - putcwi_32 (cwi, - 0x80000000 | (cwi->dirsize + cwi->dirstrs.length), - ere->name); - - str = coff_alloc (&cwi->dirstrs, e->id.u.n.length * 2 + 2); - putcwi_16 (cwi, e->id.u.n.length, str); - for (i = 0; i < e->id.u.n.length; i++) - putcwi_16 (cwi, e->id.u.n.name[i], str + i * 2 + 2); - } - - if (e->subdir) - { - putcwi_32 (cwi, 0x80000000 | cwi->dirs.length, ere->rva); - coff_to_bin (e->u.dir, cwi); - } - else - { - putcwi_32 (cwi, - cwi->dirsize + cwi->dirstrsize + cwi->dataents.length, - ere->rva); - - coff_res_to_bin (e->u.res, cwi); - } - } -} - -/* Convert the resource RES to binary. */ - -static void -coff_res_to_bin (res, cwi) - const struct res_resource *res; - struct coff_write_info *cwi; -{ - arelent *r; - struct extern_res_data *erd; - struct bindata *d; - unsigned long length; - - /* For some reason, although every other address is a section - offset, the address of the resource data itself is an RVA. That - means that we need to generate a relocation for it. We allocate - the relocs array using malloc so that we can use realloc. FIXME: - This relocation handling is correct for the i386, but probably - not for any other target. */ - - r = (arelent *) reswr_alloc (sizeof (arelent)); - r->sym_ptr_ptr = cwi->sympp; - r->address = cwi->dirsize + cwi->dirstrsize + cwi->dataents.length; - r->addend = 0; - r->howto = bfd_reloc_type_lookup (cwi->abfd, BFD_RELOC_RVA); - if (r->howto == NULL) - bfd_fatal (_("can't get BFD_RELOC_RVA relocation type")); - - cwi->relocs = xrealloc (cwi->relocs, - (cwi->reloc_count + 2) * sizeof (arelent *)); - cwi->relocs[cwi->reloc_count] = r; - cwi->relocs[cwi->reloc_count + 1] = NULL; - ++cwi->reloc_count; - - erd = (struct extern_res_data *) coff_alloc (&cwi->dataents, sizeof (*erd)); - - putcwi_32 (cwi, - (cwi->dirsize - + cwi->dirstrsize - + cwi->dataentsize - + cwi->resources.length), - erd->rva); - putcwi_32 (cwi, res->coff_info.codepage, erd->codepage); - putcwi_32 (cwi, res->coff_info.reserved, erd->reserved); - - d = res_to_bin (res, cwi->big_endian); - - if (cwi->resources.d == NULL) - cwi->resources.d = d; - else - cwi->resources.last->next = d; - - length = 0; - for (; d->next != NULL; d = d->next) - length += d->length; - length += d->length; - cwi->resources.last = d; - cwi->resources.length += length; - - putcwi_32 (cwi, length, erd->size); - - /* Force the next resource to have 32 bit alignment. */ - - if ((length & 3) != 0) - { - int add; - unsigned char *ex; - - add = 4 - (length & 3); - - ex = coff_alloc (&cwi->resources, add); - memset (ex, 0, add); - } -} diff --git a/binutils/resrc.c b/binutils/resrc.c deleted file mode 100644 index 8c3c9a74d22..00000000000 --- a/binutils/resrc.c +++ /dev/null @@ -1,2650 +0,0 @@ -/* resrc.c -- read and write Windows rc files. - Copyright 1997, 1998, 1999 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file contains functions that read and write Windows rc files. - These are text files that represent resources. */ - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "windres.h" - -#include -#include -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef HAVE_SYS_WAIT_H -#include -#else /* ! HAVE_SYS_WAIT_H */ -#if ! defined (_WIN32) || defined (__CYGWIN__) -#ifndef WIFEXITED -#define WIFEXITED(w) (((w)&0377) == 0) -#endif -#ifndef WIFSIGNALED -#define WIFSIGNALED(w) (((w)&0377) != 0177 && ((w)&~0377) == 0) -#endif -#ifndef WTERMSIG -#define WTERMSIG(w) ((w) & 0177) -#endif -#ifndef WEXITSTATUS -#define WEXITSTATUS(w) (((w) >> 8) & 0377) -#endif -#else /* defined (_WIN32) && ! defined (__CYGWIN__) */ -#ifndef WIFEXITED -#define WIFEXITED(w) (((w) & 0xff) == 0) -#endif -#ifndef WIFSIGNALED -#define WIFSIGNALED(w) (((w) & 0xff) != 0 && ((w) & 0xff) != 0x7f) -#endif -#ifndef WTERMSIG -#define WTERMSIG(w) ((w) & 0x7f) -#endif -#ifndef WEXITSTATUS -#define WEXITSTATUS(w) (((w) & 0xff00) >> 8) -#endif -#endif /* defined (_WIN32) && ! defined (__CYGWIN__) */ -#endif /* ! HAVE_SYS_WAIT_H */ - -#ifndef STDOUT_FILENO -#define STDOUT_FILENO 1 -#endif - -#if defined (_WIN32) && ! defined (__CYGWIN__) -#define popen _popen -#define pclose _pclose -#endif - -/* The default preprocessor. */ - -#define DEFAULT_PREPROCESSOR "gcc -E -xc-header -DRC_INVOKED" - -/* We read the directory entries in a cursor or icon file into - instances of this structure. */ - -struct icondir -{ - /* Width of image. */ - unsigned char width; - /* Height of image. */ - unsigned char height; - /* Number of colors in image. */ - unsigned char colorcount; - union - { - struct - { - /* Color planes. */ - unsigned short planes; - /* Bits per pixel. */ - unsigned short bits; - } icon; - struct - { - /* X coordinate of hotspot. */ - unsigned short xhotspot; - /* Y coordinate of hotspot. */ - unsigned short yhotspot; - } cursor; - } u; - /* Bytes in image. */ - unsigned long bytes; - /* File offset of image. */ - unsigned long offset; -}; - -/* The name of the rc file we are reading. */ - -char *rc_filename; - -/* The line number in the rc file. */ - -int rc_lineno; - -/* The pipe we are reading from, so that we can close it if we exit. */ - -static FILE *cpp_pipe; - -/* The temporary file used if we're not using popen, so we can delete it - if we exit. */ - -static char *cpp_temp_file; - -/* Input stream is either a file or a pipe. */ - -static enum {ISTREAM_PIPE, ISTREAM_FILE} istream_type; - -/* As we read the rc file, we attach information to this structure. */ - -static struct res_directory *resources; - -/* The number of cursor resources we have written out. */ - -static int cursors; - -/* The number of font resources we have written out. */ - -static int fonts; - -/* Font directory information. */ - -struct fontdir *fontdirs; - -/* Resource info to use for fontdirs. */ - -struct res_res_info fontdirs_resinfo; - -/* The number of icon resources we have written out. */ - -static int icons; - -/* Local functions. */ - -static int run_cmd PARAMS ((char *, const char *)); -static FILE *open_input_stream PARAMS ((char *)); -static FILE *look_for_default PARAMS ((char *, const char *, int, - const char *, const char *)); -static void close_input_stream PARAMS ((void)); -static void unexpected_eof PARAMS ((const char *)); -static int get_word PARAMS ((FILE *, const char *)); -static unsigned long get_long PARAMS ((FILE *, const char *)); -static void get_data - PARAMS ((FILE *, unsigned char *, unsigned long, const char *)); -static void define_fontdirs PARAMS ((void)); - -/* Run `cmd' and redirect the output to `redir'. */ - -static int -run_cmd (cmd, redir) - char *cmd; - const char *redir; -{ - char *s; - int pid, wait_status, retcode; - int i; - const char **argv; - char *errmsg_fmt, *errmsg_arg; - char *temp_base = choose_temp_base (); - int in_quote; - char sep; - int redir_handle = -1; - int stdout_save = -1; - - /* Count the args. */ - i = 0; - - for (s = cmd; *s; s++) - if (*s == ' ') - i++; - - i++; - argv = alloca (sizeof (char *) * (i + 3)); - i = 0; - s = cmd; - - while (1) - { - while (*s == ' ' && *s != 0) - s++; - - if (*s == 0) - break; - - in_quote = (*s == '\'' || *s == '"'); - sep = (in_quote) ? *s++ : ' '; - argv[i++] = s; - - while (*s != sep && *s != 0) - s++; - - if (*s == 0) - break; - - *s++ = 0; - - if (in_quote) - s++; - } - argv[i++] = NULL; - - /* Setup the redirection. We can't use the usual fork/exec and redirect - since we may be running on non-POSIX Windows host. */ - - fflush (stdout); - fflush (stderr); - - /* Open temporary output file. */ - redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT, 0666); - if (redir_handle == -1) - fatal (_("can't open temporary file `%s': %s"), redir, - strerror (errno)); - - /* Duplicate the stdout file handle so it can be restored later. */ - stdout_save = dup (STDOUT_FILENO); - if (stdout_save == -1) - fatal (_("can't redirect stdout: `%s': %s"), redir, strerror (errno)); - - /* Redirect stdout to our output file. */ - dup2 (redir_handle, STDOUT_FILENO); - - pid = pexecute (argv[0], (char * const *) argv, program_name, temp_base, - &errmsg_fmt, &errmsg_arg, PEXECUTE_ONE | PEXECUTE_SEARCH); - - /* Restore stdout to its previous setting. */ - dup2 (stdout_save, STDOUT_FILENO); - - /* Close reponse file. */ - close (redir_handle); - - if (pid == -1) - { - fatal (_("%s %s: %s"), errmsg_fmt, errmsg_arg, strerror (errno)); - return 1; - } - - retcode = 0; - pid = pwait (pid, &wait_status, 0); - - if (pid == -1) - { - fatal (_("wait: %s"), strerror (errno)); - retcode = 1; - } - else if (WIFSIGNALED (wait_status)) - { - fatal (_("subprocess got fatal signal %d"), WTERMSIG (wait_status)); - retcode = 1; - } - else if (WIFEXITED (wait_status)) - { - if (WEXITSTATUS (wait_status) != 0) - { - fatal (_("%s exited with status %d"), cmd, - WEXITSTATUS (wait_status)); - retcode = 1; - } - } - else - retcode = 1; - - return retcode; -} - -static FILE * -open_input_stream (cmd) - char *cmd; -{ - if (istream_type == ISTREAM_FILE) - { - char *fileprefix; - - fileprefix = choose_temp_base (); - cpp_temp_file = (char *) xmalloc (strlen (fileprefix) + 5); - sprintf (cpp_temp_file, "%s.irc", fileprefix); - free (fileprefix); - - if (run_cmd (cmd, cpp_temp_file)) - fatal (_("can't execute `%s': %s"), cmd, strerror (errno)); - - cpp_pipe = fopen (cpp_temp_file, FOPEN_RT);; - if (cpp_pipe == NULL) - fatal (_("can't open temporary file `%s': %s"), - cpp_temp_file, strerror (errno)); - - if (verbose) - fprintf (stderr, - _("Using temporary file `%s' to read preprocessor output\n"), - cpp_temp_file); - } - else - { - cpp_pipe = popen (cmd, FOPEN_RT); - if (cpp_pipe == NULL) - fatal (_("can't popen `%s': %s"), cmd, strerror (errno)); - if (verbose) - fprintf (stderr, _("Using popen to read preprocessor output\n")); - } - - xatexit (close_input_stream); - return cpp_pipe; -} - -/* look for the preprocessor program */ - -static FILE * -look_for_default (cmd, prefix, end_prefix, preprocargs, filename) - char *cmd; - const char *prefix; - int end_prefix; - const char *preprocargs; - const char *filename; -{ - char *space; - int found; - struct stat s; - - strcpy (cmd, prefix); - - sprintf (cmd + end_prefix, "%s", DEFAULT_PREPROCESSOR); - space = strchr (cmd + end_prefix, ' '); - if (space) - *space = 0; - - if ( -#if defined (__DJGPP__) || defined (__CYGWIN__) || defined (_WIN32) - strchr (cmd, '\\') || -#endif - strchr (cmd, '/')) - { - found = (stat (cmd, &s) == 0 -#ifdef HAVE_EXECUTABLE_SUFFIX - || stat (strcat (cmd, EXECUTABLE_SUFFIX), &s) == 0 -#endif - ); - - if (! found) - { - if (verbose) - fprintf (stderr, _("Tried `%s'\n"), cmd); - return NULL; - } - } - - strcpy (cmd, prefix); - - sprintf (cmd + end_prefix, "%s %s %s", - DEFAULT_PREPROCESSOR, preprocargs, filename); - - if (verbose) - fprintf (stderr, _("Using `%s'\n"), cmd); - - cpp_pipe = open_input_stream (cmd); - return cpp_pipe; -} - -/* Read an rc file. */ - -struct res_directory * -read_rc_file (filename, preprocessor, preprocargs, language, use_temp_file) - const char *filename; - const char *preprocessor; - const char *preprocargs; - int language; - int use_temp_file; -{ - char *cmd; - - istream_type = (use_temp_file) ? ISTREAM_FILE : ISTREAM_PIPE; - - if (preprocargs == NULL) - preprocargs = ""; - if (filename == NULL) - filename = "-"; - - if (preprocessor) - { - cmd = xmalloc (strlen (preprocessor) - + strlen (preprocargs) - + strlen (filename) - + 10); - sprintf (cmd, "%s %s %s", preprocessor, preprocargs, filename); - - cpp_pipe = open_input_stream (cmd); - } - else - { - char *dash, *slash, *cp; - - preprocessor = DEFAULT_PREPROCESSOR; - - cmd = xmalloc (strlen (program_name) - + strlen (preprocessor) - + strlen (preprocargs) - + strlen (filename) -#ifdef HAVE_EXECUTABLE_SUFFIX - + strlen (EXECUTABLE_SUFFIX) -#endif - + 10); - - - dash = slash = 0; - for (cp = program_name; *cp; cp++) - { - if (*cp == '-') - dash = cp; - if ( -#if defined (__DJGPP__) || defined (__CYGWIN__) || defined(_WIN32) - *cp == ':' || *cp == '\\' || -#endif - *cp == '/') - { - slash = cp; - dash = 0; - } - } - - cpp_pipe = 0; - - if (dash) - { - /* First, try looking for a prefixed gcc in the windres - directory, with the same prefix as windres */ - - cpp_pipe = look_for_default (cmd, program_name, dash-program_name+1, - preprocargs, filename); - } - - if (slash && !cpp_pipe) - { - /* Next, try looking for a gcc in the same directory as - that windres */ - - cpp_pipe = look_for_default (cmd, program_name, slash-program_name+1, - preprocargs, filename); - } - - if (!cpp_pipe) - { - /* Sigh, try the default */ - - cpp_pipe = look_for_default (cmd, "", 0, preprocargs, filename); - } - - } - - free (cmd); - - rc_filename = xstrdup (filename); - rc_lineno = 1; - if (language != -1) - rcparse_set_language (language); - yyin = cpp_pipe; - yyparse (); - - close_input_stream (); - - if (fontdirs != NULL) - define_fontdirs (); - - free (rc_filename); - rc_filename = NULL; - - return resources; -} - -/* Close the input stream if it is open. */ - -static void -close_input_stream () -{ - if (cpp_pipe != NULL) - pclose (cpp_pipe); - - if (istream_type == ISTREAM_FILE) - { - if (cpp_pipe != NULL) - fclose (cpp_pipe); - - if (cpp_temp_file != NULL) - { - int errno_save = errno; - - unlink (cpp_temp_file); - errno = errno_save; - free (cpp_temp_file); - } - } - else - { - if (cpp_pipe != NULL) - pclose (cpp_pipe); - } - - /* Since this is also run via xatexit, safeguard. */ - cpp_pipe = NULL; - cpp_temp_file = NULL; -} - -/* Report an error while reading an rc file. */ - -void -yyerror (msg) - const char *msg; -{ - fatal ("%s:%d: %s", rc_filename, rc_lineno, msg); -} - -/* Issue a warning while reading an rc file. */ - -void -rcparse_warning (msg) - const char *msg; -{ - fprintf (stderr, _("%s:%d: %s\n"), rc_filename, rc_lineno, msg); -} - -/* Die if we get an unexpected end of file. */ - -static void -unexpected_eof (msg) - const char *msg; -{ - fatal (_("%s: unexpected EOF"), msg); -} - -/* Read a 16 bit word from a file. The data is assumed to be little - endian. */ - -static int -get_word (e, msg) - FILE *e; - const char *msg; -{ - int b1, b2; - - b1 = getc (e); - b2 = getc (e); - if (feof (e)) - unexpected_eof (msg); - return ((b2 & 0xff) << 8) | (b1 & 0xff); -} - -/* Read a 32 bit word from a file. The data is assumed to be little - endian. */ - -static unsigned long -get_long (e, msg) - FILE *e; - const char *msg; -{ - int b1, b2, b3, b4; - - b1 = getc (e); - b2 = getc (e); - b3 = getc (e); - b4 = getc (e); - if (feof (e)) - unexpected_eof (msg); - return (((((((b4 & 0xff) << 8) - | (b3 & 0xff)) << 8) - | (b2 & 0xff)) << 8) - | (b1 & 0xff)); -} - -/* Read data from a file. This is a wrapper to do error checking. */ - -static void -get_data (e, p, c, msg) - FILE *e; - unsigned char *p; - unsigned long c; - const char *msg; -{ - unsigned long got; - - got = fread (p, 1, c, e); - if (got == c) - return; - - fatal (_("%s: read of %lu returned %lu"), msg, c, got); -} - -/* Define an accelerator resource. */ - -void -define_accelerator (id, resinfo, data) - struct res_id id; - const struct res_res_info *resinfo; - struct accelerator *data; -{ - struct res_resource *r; - - r = define_standard_resource (&resources, RT_ACCELERATOR, id, - resinfo->language, 0); - r->type = RES_TYPE_ACCELERATOR; - r->u.acc = data; - r->res_info = *resinfo; -} - -/* Define a bitmap resource. Bitmap data is stored in a file. The - first 14 bytes of the file are a standard header, which is not - included in the resource data. */ - -#define BITMAP_SKIP (14) - -void -define_bitmap (id, resinfo, filename) - struct res_id id; - const struct res_res_info *resinfo; - const char *filename; -{ - FILE *e; - char *real_filename; - struct stat s; - unsigned char *data; - int i; - struct res_resource *r; - - e = open_file_search (filename, FOPEN_RB, "bitmap file", &real_filename); - - if (stat (real_filename, &s) < 0) - fatal (_("stat failed on bitmap file `%s': %s"), real_filename, - strerror (errno)); - - data = (unsigned char *) res_alloc (s.st_size - BITMAP_SKIP); - - for (i = 0; i < BITMAP_SKIP; i++) - getc (e); - - get_data (e, data, s.st_size - BITMAP_SKIP, real_filename); - - fclose (e); - free (real_filename); - - r = define_standard_resource (&resources, RT_BITMAP, id, - resinfo->language, 0); - - r->type = RES_TYPE_BITMAP; - r->u.data.length = s.st_size - BITMAP_SKIP; - r->u.data.data = data; - r->res_info = *resinfo; -} - -/* Define a cursor resource. A cursor file may contain a set of - bitmaps, each representing the same cursor at various different - resolutions. They each get written out with a different ID. The - real cursor resource is then a group resource which can be used to - select one of the actual cursors. */ - -void -define_cursor (id, resinfo, filename) - struct res_id id; - const struct res_res_info *resinfo; - const char *filename; -{ - FILE *e; - char *real_filename; - int type, count, i; - struct icondir *icondirs; - int first_cursor; - struct res_resource *r; - struct group_cursor *first, **pp; - - e = open_file_search (filename, FOPEN_RB, "cursor file", &real_filename); - - /* A cursor file is basically an icon file. The start of the file - is a three word structure. The first word is ignored. The - second word is the type of data. The third word is the number of - entries. */ - - get_word (e, real_filename); - type = get_word (e, real_filename); - count = get_word (e, real_filename); - if (type != 2) - fatal (_("cursor file `%s' does not contain cursor data"), real_filename); - - /* Read in the icon directory entries. */ - - icondirs = (struct icondir *) xmalloc (count * sizeof *icondirs); - - for (i = 0; i < count; i++) - { - icondirs[i].width = getc (e); - icondirs[i].height = getc (e); - icondirs[i].colorcount = getc (e); - getc (e); - icondirs[i].u.cursor.xhotspot = get_word (e, real_filename); - icondirs[i].u.cursor.yhotspot = get_word (e, real_filename); - icondirs[i].bytes = get_long (e, real_filename); - icondirs[i].offset = get_long (e, real_filename); - - if (feof (e)) - unexpected_eof (real_filename); - } - - /* Define each cursor as a unique resource. */ - - first_cursor = cursors; - - for (i = 0; i < count; i++) - { - unsigned char *data; - struct res_id name; - struct cursor *c; - - if (fseek (e, icondirs[i].offset, SEEK_SET) != 0) - fatal (_("%s: fseek to %lu failed: %s"), real_filename, - icondirs[i].offset, strerror (errno)); - - data = (unsigned char *) res_alloc (icondirs[i].bytes); - - get_data (e, data, icondirs[i].bytes, real_filename); - - c = (struct cursor *) res_alloc (sizeof *c); - c->xhotspot = icondirs[i].u.cursor.xhotspot; - c->yhotspot = icondirs[i].u.cursor.yhotspot; - c->length = icondirs[i].bytes; - c->data = data; - - ++cursors; - - name.named = 0; - name.u.id = cursors; - - r = define_standard_resource (&resources, RT_CURSOR, name, - resinfo->language, 0); - r->type = RES_TYPE_CURSOR; - r->u.cursor = c; - r->res_info = *resinfo; - } - - fclose (e); - free (real_filename); - - /* Define a cursor group resource. */ - - first = NULL; - pp = &first; - for (i = 0; i < count; i++) - { - struct group_cursor *cg; - - cg = (struct group_cursor *) res_alloc (sizeof *cg); - cg->next = NULL; - cg->width = icondirs[i].width; - cg->height = 2 * icondirs[i].height; - - /* FIXME: What should these be set to? */ - cg->planes = 1; - cg->bits = 1; - - cg->bytes = icondirs[i].bytes + 4; - cg->index = first_cursor + i + 1; - - *pp = cg; - pp = &(*pp)->next; - } - - free (icondirs); - - r = define_standard_resource (&resources, RT_GROUP_CURSOR, id, - resinfo->language, 0); - r->type = RES_TYPE_GROUP_CURSOR; - r->u.group_cursor = first; - r->res_info = *resinfo; -} - -/* Define a dialog resource. */ - -void -define_dialog (id, resinfo, dialog) - struct res_id id; - const struct res_res_info *resinfo; - const struct dialog *dialog; -{ - struct dialog *copy; - struct res_resource *r; - - copy = (struct dialog *) res_alloc (sizeof *copy); - *copy = *dialog; - - r = define_standard_resource (&resources, RT_DIALOG, id, - resinfo->language, 0); - r->type = RES_TYPE_DIALOG; - r->u.dialog = copy; - r->res_info = *resinfo; -} - -/* Define a dialog control. This does not define a resource, but - merely allocates and fills in a structure. */ - -struct dialog_control * -define_control (text, id, x, y, width, height, class, style, exstyle) - const char *text; - unsigned long id; - unsigned long x; - unsigned long y; - unsigned long width; - unsigned long height; - unsigned long class; - unsigned long style; - unsigned long exstyle; -{ - struct dialog_control *n; - - n = (struct dialog_control *) res_alloc (sizeof *n); - n->next = NULL; - n->id = id; - n->style = style; - n->exstyle = exstyle; - n->x = x; - n->y = y; - n->width = width; - n->height = height; - n->class.named = 0; - n->class.u.id = class; - if (text != NULL) - res_string_to_id (&n->text, text); - else - { - n->text.named = 0; - n->text.u.id = 0; - } - n->data = NULL; - n->help = 0; - - return n; -} - -/* Define a font resource. */ - -void -define_font (id, resinfo, filename) - struct res_id id; - const struct res_res_info *resinfo; - const char *filename; -{ - FILE *e; - char *real_filename; - struct stat s; - unsigned char *data; - struct res_resource *r; - long offset; - long fontdatalength; - unsigned char *fontdata; - struct fontdir *fd; - const char *device, *face; - struct fontdir **pp; - - e = open_file_search (filename, FOPEN_RB, "font file", &real_filename); - - if (stat (real_filename, &s) < 0) - fatal (_("stat failed on bitmap file `%s': %s"), real_filename, - strerror (errno)); - - data = (unsigned char *) res_alloc (s.st_size); - - get_data (e, data, s.st_size, real_filename); - - fclose (e); - free (real_filename); - - r = define_standard_resource (&resources, RT_FONT, id, - resinfo->language, 0); - - r->type = RES_TYPE_FONT; - r->u.data.length = s.st_size; - r->u.data.data = data; - r->res_info = *resinfo; - - /* For each font resource, we must add an entry in the FONTDIR - resource. The FONTDIR resource includes some strings in the font - file. To find them, we have to do some magic on the data we have - read. */ - - offset = ((((((data[47] << 8) - | data[46]) << 8) - | data[45]) << 8) - | data[44]); - if (offset > 0 && offset < s.st_size) - device = (char *) data + offset; - else - device = ""; - - offset = ((((((data[51] << 8) - | data[50]) << 8) - | data[49]) << 8) - | data[48]); - if (offset > 0 && offset < s.st_size) - face = (char *) data + offset; - else - face = ""; - - ++fonts; - - fontdatalength = 58 + strlen (device) + strlen (face); - fontdata = (unsigned char *) res_alloc (fontdatalength); - memcpy (fontdata, data, 56); - strcpy ((char *) fontdata + 56, device); - strcpy ((char *) fontdata + 57 + strlen (device), face); - - fd = (struct fontdir *) res_alloc (sizeof *fd); - fd->next = NULL; - fd->index = fonts; - fd->length = fontdatalength; - fd->data = fontdata; - - for (pp = &fontdirs; *pp != NULL; pp = &(*pp)->next) - ; - *pp = fd; - - /* For the single fontdirs resource, we always use the resource - information of the last font. I don't know what else to do. */ - fontdirs_resinfo = *resinfo; -} - -/* Define the fontdirs resource. This is called after the entire rc - file has been parsed, if any font resources were seen. */ - -static void -define_fontdirs () -{ - struct res_resource *r; - struct res_id id; - - id.named = 0; - id.u.id = 1; - - r = define_standard_resource (&resources, RT_FONTDIR, id, 0x409, 0); - - r->type = RES_TYPE_FONTDIR; - r->u.fontdir = fontdirs; - r->res_info = fontdirs_resinfo; -} - -/* Define an icon resource. An icon file may contain a set of - bitmaps, each representing the same icon at various different - resolutions. They each get written out with a different ID. The - real icon resource is then a group resource which can be used to - select one of the actual icon bitmaps. */ - -void -define_icon (id, resinfo, filename) - struct res_id id; - const struct res_res_info *resinfo; - const char *filename; -{ - FILE *e; - char *real_filename; - int type, count, i; - struct icondir *icondirs; - int first_icon; - struct res_resource *r; - struct group_icon *first, **pp; - - e = open_file_search (filename, FOPEN_RB, "icon file", &real_filename); - - /* The start of an icon file is a three word structure. The first - word is ignored. The second word is the type of data. The third - word is the number of entries. */ - - get_word (e, real_filename); - type = get_word (e, real_filename); - count = get_word (e, real_filename); - if (type != 1) - fatal (_("icon file `%s' does not contain icon data"), real_filename); - - /* Read in the icon directory entries. */ - - icondirs = (struct icondir *) xmalloc (count * sizeof *icondirs); - - for (i = 0; i < count; i++) - { - icondirs[i].width = getc (e); - icondirs[i].height = getc (e); - icondirs[i].colorcount = getc (e); - getc (e); - icondirs[i].u.icon.planes = get_word (e, real_filename); - icondirs[i].u.icon.bits = get_word (e, real_filename); - icondirs[i].bytes = get_long (e, real_filename); - icondirs[i].offset = get_long (e, real_filename); - - if (feof (e)) - unexpected_eof (real_filename); - } - - /* Define each icon as a unique resource. */ - - first_icon = icons; - - for (i = 0; i < count; i++) - { - unsigned char *data; - struct res_id name; - - if (fseek (e, icondirs[i].offset, SEEK_SET) != 0) - fatal (_("%s: fseek to %lu failed: %s"), real_filename, - icondirs[i].offset, strerror (errno)); - - data = (unsigned char *) res_alloc (icondirs[i].bytes); - - get_data (e, data, icondirs[i].bytes, real_filename); - - ++icons; - - name.named = 0; - name.u.id = icons; - - r = define_standard_resource (&resources, RT_ICON, name, - resinfo->language, 0); - r->type = RES_TYPE_ICON; - r->u.data.length = icondirs[i].bytes; - r->u.data.data = data; - r->res_info = *resinfo; - } - - fclose (e); - free (real_filename); - - /* Define an icon group resource. */ - - first = NULL; - pp = &first; - for (i = 0; i < count; i++) - { - struct group_icon *cg; - - /* For some reason, at least in some files the planes and bits - are zero. We instead set them from the color. This is - copied from rcl. */ - - cg = (struct group_icon *) res_alloc (sizeof *cg); - cg->next = NULL; - cg->width = icondirs[i].width; - cg->height = icondirs[i].height; - cg->colors = icondirs[i].colorcount; - - cg->planes = 1; - cg->bits = 0; - while ((1 << cg->bits) < cg->colors) - ++cg->bits; - - cg->bytes = icondirs[i].bytes; - cg->index = first_icon + i + 1; - - *pp = cg; - pp = &(*pp)->next; - } - - free (icondirs); - - r = define_standard_resource (&resources, RT_GROUP_ICON, id, - resinfo->language, 0); - r->type = RES_TYPE_GROUP_ICON; - r->u.group_icon = first; - r->res_info = *resinfo; -} - -/* Define a menu resource. */ - -void -define_menu (id, resinfo, menuitems) - struct res_id id; - const struct res_res_info *resinfo; - struct menuitem *menuitems; -{ - struct menu *m; - struct res_resource *r; - - m = (struct menu *) res_alloc (sizeof *m); - m->items = menuitems; - m->help = 0; - - r = define_standard_resource (&resources, RT_MENU, id, resinfo->language, 0); - r->type = RES_TYPE_MENU; - r->u.menu = m; - r->res_info = *resinfo; -} - -/* Define a menu item. This does not define a resource, but merely - allocates and fills in a structure. */ - -struct menuitem * -define_menuitem (text, menuid, type, state, help, menuitems) - const char *text; - int menuid; - unsigned long type; - unsigned long state; - unsigned long help; - struct menuitem *menuitems; -{ - struct menuitem *mi; - - mi = (struct menuitem *) res_alloc (sizeof *mi); - mi->next = NULL; - mi->type = type; - mi->state = state; - mi->id = menuid; - if (text == NULL) - mi->text = NULL; - else - unicode_from_ascii ((int *) NULL, &mi->text, text); - mi->help = help; - mi->popup = menuitems; - return mi; -} - -/* Define a messagetable resource. */ - -void -define_messagetable (id, resinfo, filename) - struct res_id id; - const struct res_res_info *resinfo; - const char *filename; -{ - FILE *e; - char *real_filename; - struct stat s; - unsigned char *data; - struct res_resource *r; - - e = open_file_search (filename, FOPEN_RB, "messagetable file", - &real_filename); - - if (stat (real_filename, &s) < 0) - fatal (_("stat failed on bitmap file `%s': %s"), real_filename, - strerror (errno)); - - data = (unsigned char *) res_alloc (s.st_size); - - get_data (e, data, s.st_size, real_filename); - - fclose (e); - free (real_filename); - - r = define_standard_resource (&resources, RT_MESSAGETABLE, id, - resinfo->language, 0); - - r->type = RES_TYPE_MESSAGETABLE; - r->u.data.length = s.st_size; - r->u.data.data = data; - r->res_info = *resinfo; -} - -/* Define an rcdata resource. */ - -void -define_rcdata (id, resinfo, data) - struct res_id id; - const struct res_res_info *resinfo; - struct rcdata_item *data; -{ - struct res_resource *r; - - r = define_standard_resource (&resources, RT_RCDATA, id, - resinfo->language, 0); - r->type = RES_TYPE_RCDATA; - r->u.rcdata = data; - r->res_info = *resinfo; -} - -/* Create an rcdata item holding a string. */ - -struct rcdata_item * -define_rcdata_string (string, len) - const char *string; - unsigned long len; -{ - struct rcdata_item *ri; - char *s; - - ri = (struct rcdata_item *) res_alloc (sizeof *ri); - ri->next = NULL; - ri->type = RCDATA_STRING; - ri->u.string.length = len; - s = (char *) res_alloc (len); - memcpy (s, string, len); - ri->u.string.s = s; - - return ri; -} - -/* Create an rcdata item holding a number. */ - -struct rcdata_item * -define_rcdata_number (val, dword) - unsigned long val; - int dword; -{ - struct rcdata_item *ri; - - ri = (struct rcdata_item *) res_alloc (sizeof *ri); - ri->next = NULL; - ri->type = dword ? RCDATA_DWORD : RCDATA_WORD; - ri->u.word = val; - - return ri; -} - -/* Define a stringtable resource. This is called for each string - which appears in a STRINGTABLE statement. */ - -void -define_stringtable (resinfo, stringid, string) - const struct res_res_info *resinfo; - unsigned long stringid; - const char *string; -{ - struct res_id id; - struct res_resource *r; - - id.named = 0; - id.u.id = (stringid >> 4) + 1; - r = define_standard_resource (&resources, RT_STRING, id, - resinfo->language, 1); - - if (r->type == RES_TYPE_UNINITIALIZED) - { - int i; - - r->type = RES_TYPE_STRINGTABLE; - r->u.stringtable = ((struct stringtable *) - res_alloc (sizeof (struct stringtable))); - for (i = 0; i < 16; i++) - { - r->u.stringtable->strings[i].length = 0; - r->u.stringtable->strings[i].string = NULL; - } - - r->res_info = *resinfo; - } - - unicode_from_ascii (&r->u.stringtable->strings[stringid & 0xf].length, - &r->u.stringtable->strings[stringid & 0xf].string, - string); -} - -/* Define a user data resource where the data is in the rc file. */ - -void -define_user_data (id, type, resinfo, data) - struct res_id id; - struct res_id type; - const struct res_res_info *resinfo; - struct rcdata_item *data; -{ - struct res_id ids[3]; - struct res_resource *r; - - ids[0] = type; - ids[1] = id; - ids[2].named = 0; - ids[2].u.id = resinfo->language; - - r = define_resource (&resources, 3, ids, 0); - r->type = RES_TYPE_USERDATA; - r->u.userdata = data; - r->res_info = *resinfo; -} - -/* Define a user data resource where the data is in a file. */ - -void -define_user_file (id, type, resinfo, filename) - struct res_id id; - struct res_id type; - const struct res_res_info *resinfo; - const char *filename; -{ - FILE *e; - char *real_filename; - struct stat s; - unsigned char *data; - struct res_id ids[3]; - struct res_resource *r; - - e = open_file_search (filename, FOPEN_RB, "font file", &real_filename); - - if (stat (real_filename, &s) < 0) - fatal (_("stat failed on bitmap file `%s': %s"), real_filename, - strerror (errno)); - - data = (unsigned char *) res_alloc (s.st_size); - - get_data (e, data, s.st_size, real_filename); - - fclose (e); - free (real_filename); - - ids[0] = type; - ids[1] = id; - ids[2].named = 0; - ids[2].u.id = resinfo->language; - - r = define_resource (&resources, 3, ids, 0); - r->type = RES_TYPE_USERDATA; - r->u.userdata = ((struct rcdata_item *) - res_alloc (sizeof (struct rcdata_item))); - r->u.userdata->next = NULL; - r->u.userdata->type = RCDATA_BUFFER; - r->u.userdata->u.buffer.length = s.st_size; - r->u.userdata->u.buffer.data = data; - r->res_info = *resinfo; -} - -/* Define a versioninfo resource. */ - -void -define_versioninfo (id, language, fixedverinfo, verinfo) - struct res_id id; - int language; - struct fixed_versioninfo *fixedverinfo; - struct ver_info *verinfo; -{ - struct res_resource *r; - - r = define_standard_resource (&resources, RT_VERSION, id, language, 0); - r->type = RES_TYPE_VERSIONINFO; - r->u.versioninfo = ((struct versioninfo *) - res_alloc (sizeof (struct versioninfo))); - r->u.versioninfo->fixed = fixedverinfo; - r->u.versioninfo->var = verinfo; - r->res_info.language = language; -} - -/* Add string version info to a list of version information. */ - -struct ver_info * -append_ver_stringfileinfo (verinfo, language, strings) - struct ver_info *verinfo; - const char *language; - struct ver_stringinfo *strings; -{ - struct ver_info *vi, **pp; - - vi = (struct ver_info *) res_alloc (sizeof *vi); - vi->next = NULL; - vi->type = VERINFO_STRING; - unicode_from_ascii ((int *) NULL, &vi->u.string.language, language); - vi->u.string.strings = strings; - - for (pp = &verinfo; *pp != NULL; pp = &(*pp)->next) - ; - *pp = vi; - - return verinfo; -} - -/* Add variable version info to a list of version information. */ - -struct ver_info * -append_ver_varfileinfo (verinfo, key, var) - struct ver_info *verinfo; - const char *key; - struct ver_varinfo *var; -{ - struct ver_info *vi, **pp; - - vi = (struct ver_info *) res_alloc (sizeof *vi); - vi->next = NULL; - vi->type = VERINFO_VAR; - unicode_from_ascii ((int *) NULL, &vi->u.var.key, key); - vi->u.var.var = var; - - for (pp = &verinfo; *pp != NULL; pp = &(*pp)->next) - ; - *pp = vi; - - return verinfo; -} - -/* Append version string information to a list. */ - -struct ver_stringinfo * -append_verval (strings, key, value) - struct ver_stringinfo *strings; - const char *key; - const char *value; -{ - struct ver_stringinfo *vs, **pp; - - vs = (struct ver_stringinfo *) res_alloc (sizeof *vs); - vs->next = NULL; - unicode_from_ascii ((int *) NULL, &vs->key, key); - unicode_from_ascii ((int *) NULL, &vs->value, value); - - for (pp = &strings; *pp != NULL; pp = &(*pp)->next) - ; - *pp = vs; - - return strings; -} - -/* Append version variable information to a list. */ - -struct ver_varinfo * -append_vertrans (var, language, charset) - struct ver_varinfo *var; - unsigned long language; - unsigned long charset; -{ - struct ver_varinfo *vv, **pp; - - vv = (struct ver_varinfo *) res_alloc (sizeof *vv); - vv->next = NULL; - vv->language = language; - vv->charset = charset; - - for (pp = &var; *pp != NULL; pp = &(*pp)->next) - ; - *pp = vv; - - return var; -} - -/* Local functions used to write out an rc file. */ - -static void indent PARAMS ((FILE *, int)); -static void write_rc_directory - PARAMS ((FILE *, const struct res_directory *, const struct res_id *, - const struct res_id *, int *, int)); -static void write_rc_subdir - PARAMS ((FILE *, const struct res_entry *, const struct res_id *, - const struct res_id *, int *, int)); -static void write_rc_resource - PARAMS ((FILE *, const struct res_id *, const struct res_id *, - const struct res_resource *, int *)); -static void write_rc_accelerators - PARAMS ((FILE *, const struct accelerator *)); -static void write_rc_cursor PARAMS ((FILE *, const struct cursor *)); -static void write_rc_group_cursor - PARAMS ((FILE *, const struct group_cursor *)); -static void write_rc_dialog PARAMS ((FILE *, const struct dialog *)); -static void write_rc_dialog_control - PARAMS ((FILE *, const struct dialog_control *)); -static void write_rc_fontdir PARAMS ((FILE *, const struct fontdir *)); -static void write_rc_group_icon PARAMS ((FILE *, const struct group_icon *)); -static void write_rc_menu PARAMS ((FILE *, const struct menu *, int)); -static void write_rc_menuitems - PARAMS ((FILE *, const struct menuitem *, int, int)); -static void write_rc_rcdata PARAMS ((FILE *, const struct rcdata_item *, int)); -static void write_rc_stringtable - PARAMS ((FILE *, const struct res_id *, const struct stringtable *)); -static void write_rc_versioninfo PARAMS ((FILE *, const struct versioninfo *)); -static void write_rc_filedata - PARAMS ((FILE *, unsigned long, const unsigned char *)); - -/* Indent a given number of spaces. */ - -static void -indent (e, c) - FILE *e; - int c; -{ - int i; - - for (i = 0; i < c; i++) - putc (' ', e); -} - -/* Dump the resources we have read in the format of an rc file. - - Actually, we don't use the format of an rc file, because it's way - too much of a pain--for example, we'd have to write icon resources - into a file and refer to that file. We just generate a readable - format that kind of looks like an rc file, and is useful for - understanding the contents of a resource file. Someday we may want - to generate an rc file which the rc compiler can read; if that day - comes, this code will have to be fixed up. */ - -void -write_rc_file (filename, resources) - const char *filename; - const struct res_directory *resources; -{ - FILE *e; - int language; - - if (filename == NULL) - e = stdout; - else - { - e = fopen (filename, FOPEN_WT); - if (e == NULL) - fatal (_("can't open `%s' for output: %s"), filename, strerror (errno)); - } - - language = -1; - write_rc_directory (e, resources, (const struct res_id *) NULL, - (const struct res_id *) NULL, &language, 1); -} - -/* Write out a directory. E is the file to write to. RD is the - directory. TYPE is a pointer to the level 1 ID which serves as the - resource type. NAME is a pointer to the level 2 ID which serves as - an individual resource name. LANGUAGE is a pointer to the current - language. LEVEL is the level in the tree. */ - -static void -write_rc_directory (e, rd, type, name, language, level) - FILE *e; - const struct res_directory *rd; - const struct res_id *type; - const struct res_id *name; - int *language; - int level; -{ - const struct res_entry *re; - - /* Print out some COFF information that rc files can't represent. */ - - if (rd->time != 0) - fprintf (e, "// Time stamp: %lu\n", rd->time); - if (rd->characteristics != 0) - fprintf (e, "// Characteristics: %lu\n", rd->characteristics); - if (rd->major != 0 || rd->minor != 0) - fprintf (e, "// Version: %d %d\n", rd->major, rd->minor); - - for (re = rd->entries; re != NULL; re = re->next) - { - switch (level) - { - case 1: - /* If we're at level 1, the key of this resource is the - type. This normally duplicates the information we have - stored with the resource itself, but we need to remember - the type if this is a user define resource type. */ - type = &re->id; - break; - - case 2: - /* If we're at level 2, the key of this resource is the name - we are going to use in the rc printout. */ - name = &re->id; - break; - - case 3: - /* If we're at level 3, then this key represents a language. - Use it to update the current language. */ - if (! re->id.named - && re->id.u.id != (unsigned long) (unsigned int) *language - && (re->id.u.id & 0xffff) == re->id.u.id) - { - fprintf (e, "LANGUAGE %lu, %lu\n", - re->id.u.id & 0xff, (re->id.u.id >> 8) & 0xff); - *language = re->id.u.id; - } - break; - - default: - break; - } - - if (re->subdir) - write_rc_subdir (e, re, type, name, language, level); - else - { - if (level == 3) - { - /* This is the normal case: the three levels are - TYPE/NAME/LANGUAGE. NAME will have been set at level - 2, and represents the name to use. We probably just - set LANGUAGE, and it will probably match what the - resource itself records if anything. */ - write_rc_resource (e, type, name, re->u.res, language); - } - else - { - fprintf (e, "// Resource at unexpected level %d\n", level); - write_rc_resource (e, type, (struct res_id *) NULL, re->u.res, - language); - } - } - } -} - -/* Write out a subdirectory entry. E is the file to write to. RE is - the subdirectory entry. TYPE and NAME are pointers to higher level - IDs, or NULL. LANGUAGE is a pointer to the current language. - LEVEL is the level in the tree. */ - -static void -write_rc_subdir (e, re, type, name, language, level) - FILE *e; - const struct res_entry *re; - const struct res_id *type; - const struct res_id *name; - int *language; - int level; -{ - fprintf (e, "\n"); - switch (level) - { - case 1: - fprintf (e, "// Type: "); - if (re->id.named) - res_id_print (e, re->id, 1); - else - { - const char *s; - - switch (re->id.u.id) - { - case RT_CURSOR: s = "cursor"; break; - case RT_BITMAP: s = "bitmap"; break; - case RT_ICON: s = "icon"; break; - case RT_MENU: s = "menu"; break; - case RT_DIALOG: s = "dialog"; break; - case RT_STRING: s = "stringtable"; break; - case RT_FONTDIR: s = "fontdir"; break; - case RT_FONT: s = "font"; break; - case RT_ACCELERATOR: s = "accelerators"; break; - case RT_RCDATA: s = "rcdata"; break; - case RT_MESSAGETABLE: s = "messagetable"; break; - case RT_GROUP_CURSOR: s = "group cursor"; break; - case RT_GROUP_ICON: s = "group icon"; break; - case RT_VERSION: s = "version"; break; - case RT_DLGINCLUDE: s = "dlginclude"; break; - case RT_PLUGPLAY: s = "plugplay"; break; - case RT_VXD: s = "vxd"; break; - case RT_ANICURSOR: s = "anicursor"; break; - case RT_ANIICON: s = "aniicon"; break; - default: s = NULL; break; - } - - if (s != NULL) - fprintf (e, "%s", s); - else - res_id_print (e, re->id, 1); - } - fprintf (e, "\n"); - break; - - case 2: - fprintf (e, "// Name: "); - res_id_print (e, re->id, 1); - fprintf (e, "\n"); - break; - - case 3: - fprintf (e, "// Language: "); - res_id_print (e, re->id, 1); - fprintf (e, "\n"); - break; - - default: - fprintf (e, "// Level %d: ", level); - res_id_print (e, re->id, 1); - fprintf (e, "\n"); - } - - write_rc_directory (e, re->u.dir, type, name, language, level + 1); -} - -/* Write out a single resource. E is the file to write to. TYPE is a - pointer to the type of the resource. NAME is a pointer to the name - of the resource; it will be NULL if there is a level mismatch. RES - is the resource data. LANGUAGE is a pointer to the current - language. */ - -static void -write_rc_resource (e, type, name, res, language) - FILE *e; - const struct res_id *type; - const struct res_id *name; - const struct res_resource *res; - int *language; -{ - const char *s; - int rt; - int menuex = 0; - - fprintf (e, "\n"); - - switch (res->type) - { - default: - abort (); - - case RES_TYPE_ACCELERATOR: - s = "ACCELERATOR"; - rt = RT_ACCELERATOR; - break; - - case RES_TYPE_BITMAP: - s = "BITMAP"; - rt = RT_BITMAP; - break; - - case RES_TYPE_CURSOR: - s = "CURSOR"; - rt = RT_CURSOR; - break; - - case RES_TYPE_GROUP_CURSOR: - s = "GROUP_CURSOR"; - rt = RT_GROUP_CURSOR; - break; - - case RES_TYPE_DIALOG: - if (extended_dialog (res->u.dialog)) - s = "DIALOGEX"; - else - s = "DIALOG"; - rt = RT_DIALOG; - break; - - case RES_TYPE_FONT: - s = "FONT"; - rt = RT_FONT; - break; - - case RES_TYPE_FONTDIR: - s = "FONTDIR"; - rt = RT_FONTDIR; - break; - - case RES_TYPE_ICON: - s = "ICON"; - rt = RT_ICON; - break; - - case RES_TYPE_GROUP_ICON: - s = "GROUP_ICON"; - rt = RT_GROUP_ICON; - break; - - case RES_TYPE_MENU: - if (extended_menu (res->u.menu)) - { - s = "MENUEX"; - menuex = 1; - } - else - { - s = "MENU"; - menuex = 0; - } - rt = RT_MENU; - break; - - case RES_TYPE_MESSAGETABLE: - s = "MESSAGETABLE"; - rt = RT_MESSAGETABLE; - break; - - case RES_TYPE_RCDATA: - s = "RCDATA"; - rt = RT_RCDATA; - break; - - case RES_TYPE_STRINGTABLE: - s = "STRINGTABLE"; - rt = RT_STRING; - break; - - case RES_TYPE_USERDATA: - s = NULL; - rt = 0; - break; - - case RES_TYPE_VERSIONINFO: - s = "VERSIONINFO"; - rt = RT_VERSION; - break; - } - - if (rt != 0 - && type != NULL - && (type->named || type->u.id != (unsigned long) rt)) - { - fprintf (e, "// Unexpected resource type mismatch: "); - res_id_print (e, *type, 1); - fprintf (e, " != %d", rt); - } - - if (res->coff_info.codepage != 0) - fprintf (e, "// Code page: %lu\n", res->coff_info.codepage); - if (res->coff_info.reserved != 0) - fprintf (e, "// COFF reserved value: %lu\n", res->coff_info.reserved); - - if (name != NULL) - res_id_print (e, *name, 0); - else - fprintf (e, "??Unknown-Name??"); - - fprintf (e, " "); - if (s != NULL) - fprintf (e, "%s", s); - else if (type != NULL) - res_id_print (e, *type, 0); - else - fprintf (e, "??Unknown-Type??"); - - if (res->res_info.memflags != 0) - { - if ((res->res_info.memflags & MEMFLAG_MOVEABLE) != 0) - fprintf (e, " MOVEABLE"); - if ((res->res_info.memflags & MEMFLAG_PURE) != 0) - fprintf (e, " PURE"); - if ((res->res_info.memflags & MEMFLAG_PRELOAD) != 0) - fprintf (e, " PRELOAD"); - if ((res->res_info.memflags & MEMFLAG_DISCARDABLE) != 0) - fprintf (e, " DISCARDABLE"); - } - - if (res->type == RES_TYPE_DIALOG) - { - fprintf (e, " %d, %d, %d, %d", res->u.dialog->x, res->u.dialog->y, - res->u.dialog->width, res->u.dialog->height); - if (res->u.dialog->ex != NULL - && res->u.dialog->ex->help != 0) - fprintf (e, ", %lu", res->u.dialog->ex->help); - } - - fprintf (e, "\n"); - - if ((res->res_info.language != 0 && res->res_info.language != *language) - || res->res_info.characteristics != 0 - || res->res_info.version != 0) - { - int modifiers; - - switch (res->type) - { - case RES_TYPE_ACCELERATOR: - case RES_TYPE_DIALOG: - case RES_TYPE_MENU: - case RES_TYPE_RCDATA: - case RES_TYPE_STRINGTABLE: - modifiers = 1; - break; - - default: - modifiers = 0; - break; - } - - if (res->res_info.language != 0 && res->res_info.language != *language) - fprintf (e, "%sLANGUAGE %d, %d\n", - modifiers ? "// " : "", - res->res_info.language & 0xff, - (res->res_info.language >> 8) & 0xff); - if (res->res_info.characteristics != 0) - fprintf (e, "%sCHARACTERISTICS %lu\n", - modifiers ? "// " : "", - res->res_info.characteristics); - if (res->res_info.version != 0) - fprintf (e, "%sVERSION %lu\n", - modifiers ? "// " : "", - res->res_info.version); - } - - switch (res->type) - { - default: - abort (); - - case RES_TYPE_ACCELERATOR: - write_rc_accelerators (e, res->u.acc); - break; - - case RES_TYPE_CURSOR: - write_rc_cursor (e, res->u.cursor); - break; - - case RES_TYPE_GROUP_CURSOR: - write_rc_group_cursor (e, res->u.group_cursor); - break; - - case RES_TYPE_DIALOG: - write_rc_dialog (e, res->u.dialog); - break; - - case RES_TYPE_FONTDIR: - write_rc_fontdir (e, res->u.fontdir); - break; - - case RES_TYPE_GROUP_ICON: - write_rc_group_icon (e, res->u.group_icon); - break; - - case RES_TYPE_MENU: - write_rc_menu (e, res->u.menu, menuex); - break; - - case RES_TYPE_RCDATA: - write_rc_rcdata (e, res->u.rcdata, 0); - break; - - case RES_TYPE_STRINGTABLE: - write_rc_stringtable (e, name, res->u.stringtable); - break; - - case RES_TYPE_USERDATA: - write_rc_rcdata (e, res->u.userdata, 0); - break; - - case RES_TYPE_VERSIONINFO: - write_rc_versioninfo (e, res->u.versioninfo); - break; - - case RES_TYPE_BITMAP: - case RES_TYPE_FONT: - case RES_TYPE_ICON: - case RES_TYPE_MESSAGETABLE: - write_rc_filedata (e, res->u.data.length, res->u.data.data); - break; - } -} - -/* Write out accelerator information. */ - -static void -write_rc_accelerators (e, accelerators) - FILE *e; - const struct accelerator *accelerators; -{ - const struct accelerator *acc; - - fprintf (e, "BEGIN\n"); - for (acc = accelerators; acc != NULL; acc = acc->next) - { - int printable; - - fprintf (e, " "); - - if ((acc->key & 0x7f) == acc->key - && isprint ((unsigned char) acc->key) - && (acc->flags & ACC_VIRTKEY) == 0) - { - fprintf (e, "\"%c\"", acc->key); - printable = 1; - } - else - { - fprintf (e, "%d", acc->key); - printable = 0; - } - - fprintf (e, ", %d", acc->id); - - if (! printable) - { - if ((acc->flags & ACC_VIRTKEY) != 0) - fprintf (e, ", VIRTKEY"); - else - fprintf (e, ", ASCII"); - } - - if ((acc->flags & ACC_SHIFT) != 0) - fprintf (e, ", SHIFT"); - if ((acc->flags & ACC_CONTROL) != 0) - fprintf (e, ", CONTROL"); - if ((acc->flags & ACC_ALT) != 0) - fprintf (e, ", ALT"); - - fprintf (e, "\n"); - } - - fprintf (e, "END\n"); -} - -/* Write out cursor information. This would normally be in a separate - file, which the rc file would include. */ - -static void -write_rc_cursor (e, cursor) - FILE *e; - const struct cursor *cursor; -{ - fprintf (e, "// Hotspot: x: %d; y: %d\n", cursor->xhotspot, - cursor->yhotspot); - write_rc_filedata (e, cursor->length, cursor->data); -} - -/* Write out group cursor data. This would normally be built from the - cursor data. */ - -static void -write_rc_group_cursor (e, group_cursor) - FILE *e; - const struct group_cursor *group_cursor; -{ - const struct group_cursor *gc; - - for (gc = group_cursor; gc != NULL; gc = gc->next) - { - fprintf (e, "// width: %d; height %d; planes %d; bits %d\n", - gc->width, gc->height, gc->planes, gc->bits); - fprintf (e, "// data bytes: %lu; index: %d\n", - gc->bytes, gc->index); - } -} - -/* Write dialog data. */ - -static void -write_rc_dialog (e, dialog) - FILE *e; - const struct dialog *dialog; -{ - const struct dialog_control *control; - - if (dialog->style != 0) - fprintf (e, "STYLE 0x%lx\n", dialog->style); - if (dialog->exstyle != 0) - fprintf (e, "EXSTYLE 0x%lx\n", dialog->exstyle); - if ((dialog->class.named && dialog->class.u.n.length > 0) - || dialog->class.u.id != 0) - { - fprintf (e, "CLASS "); - res_id_print (e, dialog->class, 0); - fprintf (e, "\n"); - } - if (dialog->caption != NULL) - { - fprintf (e, "CAPTION \""); - unicode_print (e, dialog->caption, -1); - fprintf (e, "\"\n"); - } - if ((dialog->menu.named && dialog->menu.u.n.length > 0) - || dialog->menu.u.id != 0) - { - fprintf (e, "MENU "); - res_id_print (e, dialog->menu, 0); - fprintf (e, "\n"); - } - if (dialog->font != NULL) - { - fprintf (e, "FONT %d, \"", dialog->pointsize); - unicode_print (e, dialog->font, -1); - fprintf (e, "\""); - if (dialog->ex != NULL - && (dialog->ex->weight != 0 || dialog->ex->italic != 0)) - fprintf (e, ", %d, %d", dialog->ex->weight, dialog->ex->italic); - fprintf (e, "\n"); - } - - fprintf (e, "BEGIN\n"); - - for (control = dialog->controls; control != NULL; control = control->next) - write_rc_dialog_control (e, control); - - fprintf (e, "END\n"); -} - -/* For each predefined control keyword, this table provides the class - and the style. */ - -struct control_info -{ - const char *name; - unsigned short class; - unsigned long style; -}; - -static const struct control_info control_info[] = -{ - { "AUTO3STATE", CTL_BUTTON, BS_AUTO3STATE }, - { "AUTOCHECKBOX", CTL_BUTTON, BS_AUTOCHECKBOX }, - { "AUTORADIOBUTTON", CTL_BUTTON, BS_AUTORADIOBUTTON }, - { "CHECKBOX", CTL_BUTTON, BS_CHECKBOX }, - { "COMBOBOX", CTL_COMBOBOX, (unsigned long) -1 }, - { "CTEXT", CTL_STATIC, SS_CENTER }, - { "DEFPUSHBUTTON", CTL_BUTTON, BS_DEFPUSHBUTTON }, - { "EDITTEXT", CTL_EDIT, (unsigned long) -1 }, - { "GROUPBOX", CTL_BUTTON, BS_GROUPBOX }, - { "ICON", CTL_STATIC, SS_ICON }, - { "LISTBOX", CTL_LISTBOX, (unsigned long) -1 }, - { "LTEXT", CTL_STATIC, SS_LEFT }, - { "PUSHBOX", CTL_BUTTON, BS_PUSHBOX }, - { "PUSHBUTTON", CTL_BUTTON, BS_PUSHBUTTON }, - { "RADIOBUTTON", CTL_BUTTON, BS_RADIOBUTTON }, - { "RTEXT", CTL_STATIC, SS_RIGHT }, - { "SCROLLBAR", CTL_SCROLLBAR, (unsigned long) -1 }, - { "STATE3", CTL_BUTTON, BS_3STATE }, - /* It's important that USERBUTTON come after all the other button - types, so that it won't be matched too early. */ - { "USERBUTTON", CTL_BUTTON, (unsigned long) -1 }, - { NULL, 0, 0 } -}; - -/* Write a dialog control. */ - -static void -write_rc_dialog_control (e, control) - FILE *e; - const struct dialog_control *control; -{ - const struct control_info *ci; - - fprintf (e, " "); - - if (control->class.named) - ci = NULL; - else - { - for (ci = control_info; ci->name != NULL; ++ci) - if (ci->class == control->class.u.id - && (ci->style == (unsigned long) -1 - || ci->style == (control->style & 0xff))) - break; - } - if (ci == NULL) - fprintf (e, "CONTROL"); - else if (ci->name != NULL) - fprintf (e, "%s", ci->name); - else - fprintf (e, "CONTROL"); - - if (control->text.named || control->text.u.id != 0) - { - fprintf (e, " "); - res_id_print (e, control->text, 1); - fprintf (e, ","); - } - - fprintf (e, " %d, ", control->id); - - if (ci == NULL) - { - if (control->class.named) - fprintf (e, "\""); - res_id_print (e, control->class, 0); - if (control->class.named) - fprintf (e, "\""); - fprintf (e, ", 0x%lx, ", control->style); - } - - fprintf (e, "%d, %d", control->x, control->y); - - if (control->style != SS_ICON - || control->exstyle != 0 - || control->width != 0 - || control->height != 0 - || control->help != 0) - { - fprintf (e, ", %d, %d", control->width, control->height); - - /* FIXME: We don't need to print the style if it is the default. - More importantly, in certain cases we actually need to turn - off parts of the forced style, by using NOT. */ - fprintf (e, ", 0x%lx", control->style); - - if (control->exstyle != 0 || control->help != 0) - fprintf (e, ", 0x%lx, %lu", control->exstyle, control->help); - } - - fprintf (e, "\n"); - - if (control->data != NULL) - write_rc_rcdata (e, control->data, 2); -} - -/* Write out font directory data. This would normally be built from - the font data. */ - -static void -write_rc_fontdir (e, fontdir) - FILE *e; - const struct fontdir *fontdir; -{ - const struct fontdir *fc; - - for (fc = fontdir; fc != NULL; fc = fc->next) - { - fprintf (e, "// Font index: %d\n", fc->index); - write_rc_filedata (e, fc->length, fc->data); - } -} - -/* Write out group icon data. This would normally be built from the - icon data. */ - -static void -write_rc_group_icon (e, group_icon) - FILE *e; - const struct group_icon *group_icon; -{ - const struct group_icon *gi; - - for (gi = group_icon; gi != NULL; gi = gi->next) - { - fprintf (e, "// width: %d; height %d; colors: %d; planes %d; bits %d\n", - gi->width, gi->height, gi->colors, gi->planes, gi->bits); - fprintf (e, "// data bytes: %lu; index: %d\n", - gi->bytes, gi->index); - } -} - -/* Write out a menu resource. */ - -static void -write_rc_menu (e, menu, menuex) - FILE *e; - const struct menu *menu; - int menuex; -{ - if (menu->help != 0) - fprintf (e, "// Help ID: %lu\n", menu->help); - write_rc_menuitems (e, menu->items, menuex, 0); -} - -/* Write out menuitems. */ - -static void -write_rc_menuitems (e, menuitems, menuex, ind) - FILE *e; - const struct menuitem *menuitems; - int menuex; - int ind; -{ - const struct menuitem *mi; - - indent (e, ind); - fprintf (e, "BEGIN\n"); - - for (mi = menuitems; mi != NULL; mi = mi->next) - { - indent (e, ind + 2); - - if (mi->popup == NULL) - fprintf (e, "MENUITEM"); - else - fprintf (e, "POPUP"); - - if (! menuex - && mi->popup == NULL - && mi->text == NULL - && mi->type == 0 - && mi->id == 0) - { - fprintf (e, " SEPARATOR\n"); - continue; - } - - if (mi->text == NULL) - fprintf (e, " \"\""); - else - { - fprintf (e, " \""); - unicode_print (e, mi->text, -1); - fprintf (e, "\""); - } - - if (! menuex) - { - if (mi->popup == NULL) - fprintf (e, ", %d", mi->id); - - if ((mi->type & MENUITEM_CHECKED) != 0) - fprintf (e, ", CHECKED"); - if ((mi->type & MENUITEM_GRAYED) != 0) - fprintf (e, ", GRAYED"); - if ((mi->type & MENUITEM_HELP) != 0) - fprintf (e, ", HELP"); - if ((mi->type & MENUITEM_INACTIVE) != 0) - fprintf (e, ", INACTIVE"); - if ((mi->type & MENUITEM_MENUBARBREAK) != 0) - fprintf (e, ", MENUBARBREAK"); - if ((mi->type & MENUITEM_MENUBREAK) != 0) - fprintf (e, ", MENUBREAK"); - } - else - { - if (mi->id != 0 || mi->type != 0 || mi->state != 0 || mi->help != 0) - { - fprintf (e, ", %d", mi->id); - if (mi->type != 0 || mi->state != 0 || mi->help != 0) - { - fprintf (e, ", %lu", mi->type); - if (mi->state != 0 || mi->help != 0) - { - fprintf (e, ", %lu", mi->state); - if (mi->help != 0) - fprintf (e, ", %lu", mi->help); - } - } - } - } - - fprintf (e, "\n"); - - if (mi->popup != NULL) - write_rc_menuitems (e, mi->popup, menuex, ind + 2); - } - - indent (e, ind); - fprintf (e, "END\n"); -} - -/* Write out an rcdata resource. This is also used for other types of - resources that need to print arbitrary data. */ - -static void -write_rc_rcdata (e, rcdata, ind) - FILE *e; - const struct rcdata_item *rcdata; - int ind; -{ - const struct rcdata_item *ri; - - indent (e, ind); - fprintf (e, "BEGIN\n"); - - for (ri = rcdata; ri != NULL; ri = ri->next) - { - if (ri->type == RCDATA_BUFFER && ri->u.buffer.length == 0) - continue; - - indent (e, ind + 2); - - switch (ri->type) - { - default: - abort (); - - case RCDATA_WORD: - fprintf (e, "%d", ri->u.word); - break; - - case RCDATA_DWORD: - fprintf (e, "%luL", ri->u.dword); - break; - - case RCDATA_STRING: - { - const char *s; - unsigned long i; - - fprintf (e, "\""); - s = ri->u.string.s; - for (i = 0; i < ri->u.string.length; i++) - { - if (isprint ((unsigned char) *s)) - putc (*s, e); - else - fprintf (e, "\\%03o", *s); - } - fprintf (e, "\""); - break; - } - - case RCDATA_WSTRING: - fprintf (e, "L\""); - unicode_print (e, ri->u.wstring.w, ri->u.wstring.length); - fprintf (e, "\""); - break; - - case RCDATA_BUFFER: - { - unsigned long i; - int first; - - /* Assume little endian data. */ - - first = 1; - for (i = 0; i + 3 < ri->u.buffer.length; i += 4) - { - unsigned long l; - int j; - - if (! first) - indent (e, ind + 2); - l = ((((((ri->u.buffer.data[i + 3] << 8) - | ri->u.buffer.data[i + 2]) << 8) - | ri->u.buffer.data[i + 1]) << 8) - | ri->u.buffer.data[i]); - fprintf (e, "%luL", l); - if (i + 4 < ri->u.buffer.length || ri->next != NULL) - fprintf (e, ","); - for (j = 0; j < 4; ++j) - if (! isprint (ri->u.buffer.data[i + j]) - && ri->u.buffer.data[i + j] != 0) - break; - if (j >= 4) - { - fprintf (e, "\t// "); - for (j = 0; j < 4; ++j) - { - if (! isprint (ri->u.buffer.data[i + j])) - fprintf (e, "\\%03o", ri->u.buffer.data[i + j]); - else - { - if (ri->u.buffer.data[i + j] == '\\') - fprintf (e, "\\"); - fprintf (e, "%c", ri->u.buffer.data[i + j]); - } - } - } - fprintf (e, "\n"); - first = 0; - } - - if (i + 1 < ri->u.buffer.length) - { - int s; - int j; - - if (! first) - indent (e, ind + 2); - s = (ri->u.buffer.data[i + 1] << 8) | ri->u.buffer.data[i]; - fprintf (e, "%d", s); - if (i + 2 < ri->u.buffer.length || ri->next != NULL) - fprintf (e, ","); - for (j = 0; j < 2; ++j) - if (! isprint (ri->u.buffer.data[i + j]) - && ri->u.buffer.data[i + j] != 0) - break; - if (j >= 2) - { - fprintf (e, "\t// "); - for (j = 0; j < 2; ++j) - { - if (! isprint (ri->u.buffer.data[i + j])) - fprintf (e, "\\%03o", ri->u.buffer.data[i + j]); - else - { - if (ri->u.buffer.data[i + j] == '\\') - fprintf (e, "\\"); - fprintf (e, "%c", ri->u.buffer.data[i + j]); - } - } - } - fprintf (e, "\n"); - i += 2; - first = 0; - } - - if (i < ri->u.buffer.length) - { - if (! first) - indent (e, ind + 2); - if ((ri->u.buffer.data[i] & 0x7f) == ri->u.buffer.data[i] - && isprint (ri->u.buffer.data[i])) - fprintf (e, "\"%c\"", ri->u.buffer.data[i]); - else - fprintf (e, "\"\\%03o\"", ri->u.buffer.data[i]); - if (ri->next != NULL) - fprintf (e, ","); - fprintf (e, "\n"); - first = 0; - } - - break; - } - } - - if (ri->type != RCDATA_BUFFER) - { - if (ri->next != NULL) - fprintf (e, ","); - fprintf (e, "\n"); - } - } - - indent (e, ind); - fprintf (e, "END\n"); -} - -/* Write out a stringtable resource. */ - -static void -write_rc_stringtable (e, name, stringtable) - FILE *e; - const struct res_id *name; - const struct stringtable *stringtable; -{ - unsigned long offset; - int i; - - if (name != NULL && ! name->named) - offset = (name->u.id - 1) << 4; - else - { - fprintf (e, "// %s string table name\n", - name == NULL ? "Missing" : "Invalid"); - offset = 0; - } - - fprintf (e, "BEGIN\n"); - - for (i = 0; i < 16; i++) - { - if (stringtable->strings[i].length != 0) - { - fprintf (e, " %lu, \"", offset + i); - unicode_print (e, stringtable->strings[i].string, - stringtable->strings[i].length); - fprintf (e, "\"\n"); - } - } - - fprintf (e, "END\n"); -} - -/* Write out a versioninfo resource. */ - -static void -write_rc_versioninfo (e, versioninfo) - FILE *e; - const struct versioninfo *versioninfo; -{ - const struct fixed_versioninfo *f; - const struct ver_info *vi; - - f = versioninfo->fixed; - if (f->file_version_ms != 0 || f->file_version_ls != 0) - fprintf (e, " FILEVERSION %lu, %lu, %lu, %lu\n", - (f->file_version_ms >> 16) & 0xffff, - f->file_version_ms & 0xffff, - (f->file_version_ls >> 16) & 0xffff, - f->file_version_ls & 0xffff); - if (f->product_version_ms != 0 || f->product_version_ls != 0) - fprintf (e, " PRODUCTVERSION %lu, %lu, %lu, %lu\n", - (f->product_version_ms >> 16) & 0xffff, - f->product_version_ms & 0xffff, - (f->product_version_ls >> 16) & 0xffff, - f->product_version_ls & 0xffff); - if (f->file_flags_mask != 0) - fprintf (e, " FILEFLAGSMASK 0x%lx\n", f->file_flags_mask); - if (f->file_flags != 0) - fprintf (e, " FILEFLAGS 0x%lx\n", f->file_flags); - if (f->file_os != 0) - fprintf (e, " FILEOS 0x%lx\n", f->file_os); - if (f->file_type != 0) - fprintf (e, " FILETYPE 0x%lx\n", f->file_type); - if (f->file_subtype != 0) - fprintf (e, " FILESUBTYPE 0x%lx\n", f->file_subtype); - if (f->file_date_ms != 0 || f->file_date_ls != 0) - fprintf (e, "// Date: %lu, %lu\n", f->file_date_ms, f->file_date_ls); - - fprintf (e, "BEGIN\n"); - - for (vi = versioninfo->var; vi != NULL; vi = vi->next) - { - switch (vi->type) - { - case VERINFO_STRING: - { - const struct ver_stringinfo *vs; - - fprintf (e, " BLOCK \"StringFileInfo\"\n"); - fprintf (e, " BEGIN\n"); - fprintf (e, " BLOCK \""); - unicode_print (e, vi->u.string.language, -1); - fprintf (e, "\"\n"); - fprintf (e, " BEGIN\n"); - - for (vs = vi->u.string.strings; vs != NULL; vs = vs->next) - { - fprintf (e, " VALUE \""); - unicode_print (e, vs->key, -1); - fprintf (e, "\", \""); - unicode_print (e, vs->value, -1); - fprintf (e, "\"\n"); - } - - fprintf (e, " END\n"); - fprintf (e, " END\n"); - break; - } - - case VERINFO_VAR: - { - const struct ver_varinfo *vv; - - fprintf (e, " BLOCK \"VarFileInfo\"\n"); - fprintf (e, " BEGIN\n"); - fprintf (e, " VALUE \""); - unicode_print (e, vi->u.var.key, -1); - fprintf (e, "\""); - - for (vv = vi->u.var.var; vv != NULL; vv = vv->next) - fprintf (e, ", 0x%x, %d", (unsigned int) vv->language, - vv->charset); - - fprintf (e, "\n END\n"); - - break; - } - } - } - - fprintf (e, "END\n"); -} - -/* Write out data which would normally be read from a file. */ - -static void -write_rc_filedata (e, length, data) - FILE *e; - unsigned long length; - const unsigned char *data; -{ - unsigned long i; - - for (i = 0; i + 15 < length; i += 16) - { - fprintf (e, "// %4lx: ", i); - fprintf (e, "%02x %02x %02x %02x %02x %02x %02x %02x ", - data[i + 0], data[i + 1], data[i + 2], data[i + 3], - data[i + 4], data[i + 5], data[i + 6], data[i + 7]); - fprintf (e, "%02x %02x %02x %02x %02x %02x %02x %02x\n", - data[i + 8], data[i + 9], data[i + 10], data[i + 11], - data[i + 12], data[i + 13], data[i + 14], data[i + 15]); - } - - if (i < length) - { - fprintf (e, "// %4lx:", i); - while (i < length) - { - fprintf (e, " %02x", data[i]); - ++i; - } - fprintf (e, "\n"); - } -} diff --git a/binutils/resres.c b/binutils/resres.c deleted file mode 100644 index 6a860eb2aeb..00000000000 --- a/binutils/resres.c +++ /dev/null @@ -1,659 +0,0 @@ -/* resres.c: read_res_file and write_res_file implementation for windres. - Copyright 1998, 1999 Free Software Foundation, Inc. - Written by Anders Norlander . - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* FIXME: This file does not work correctly in a cross configuration. - It assumes that it can use fread and fwrite to read and write - integers. It does no swapping. */ - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "windres.h" - -#include -#include - -struct res_hdr - { - unsigned long data_size; - unsigned long header_size; - }; - -static void write_res_directory - PARAMS ((const struct res_directory *, - const struct res_id *, const struct res_id *, - int *, int)); -static void write_res_resource - PARAMS ((const struct res_id *, const struct res_id *, - const struct res_resource *, int *)); -static void write_res_bin - PARAMS ((const struct res_resource *, const struct res_id *, - const struct res_id *, const struct res_res_info *)); - -static void write_res_id PARAMS ((const struct res_id *)); -static void write_res_info PARAMS ((const struct res_res_info *)); -static void write_res_data PARAMS ((const void *, size_t, int)); -static void write_res_header - PARAMS ((unsigned long, const struct res_id *, const struct res_id *, - const struct res_res_info *)); - -static int read_resource_entry PARAMS ((void)); -static void read_res_data PARAMS ((void *, size_t, int)); -static void read_res_id PARAMS ((struct res_id *)); -static unichar *read_unistring PARAMS ((int *)); -static void skip_null_resource PARAMS ((void)); - -static unsigned long get_id_size PARAMS ((const struct res_id *)); -static void res_align_file PARAMS ((void)); - -static void - res_add_resource - PARAMS ((struct res_resource *, const struct res_id *, - const struct res_id *, int, int)); - -void - res_append_resource - PARAMS ((struct res_directory **, struct res_resource *, - int, const struct res_id *, int)); - -static struct res_directory *resources = NULL; - -static FILE *fres; -static const char *filename; - -extern char *program_name; - -/* Read resource file */ -struct res_directory * -read_res_file (fn) - const char *fn; -{ - filename = fn; - fres = fopen (filename, "rb"); - if (fres == NULL) - fatal ("can't open `%s' for output: %s", filename, strerror (errno)); - - skip_null_resource (); - - while (read_resource_entry ()) - ; - - fclose (fres); - - return resources; -} - -/* Write resource file */ -void -write_res_file (fn, resdir) - const char *fn; - const struct res_directory *resdir; -{ - int language; - static const unsigned char sign[] = - {0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - long fpos; - - filename = fn; - - fres = fopen (filename, "wb"); - if (fres == NULL) - fatal ("can't open `%s' for output: %s", filename, strerror (errno)); - - /* Write 32 bit resource signature */ - write_res_data (sign, sizeof (sign), 1); - - /* write resources */ - - language = -1; - write_res_directory (resdir, (const struct res_id *) NULL, - (const struct res_id *) NULL, &language, 1); - - /* end file on DWORD boundary */ - fpos = ftell (fres); - if (fpos % 4) - write_res_data (sign, fpos % 4, 1); - - fclose (fres); -} - -/* Read a resource entry, returns 0 when all resources are read */ -static int -read_resource_entry (void) -{ - struct res_id type; - struct res_id name; - struct res_res_info resinfo; - struct res_hdr reshdr; - long version; - void *buff; - - struct res_resource *r; - - res_align_file (); - - /* Read header */ - if (fread (&reshdr, sizeof (reshdr), 1, fres) != 1) - return 0; - - /* read resource type */ - read_res_id (&type); - /* read resource id */ - read_res_id (&name); - - res_align_file (); - - /* Read additional resource header */ - read_res_data (&resinfo.version, sizeof (resinfo.version), 1); - read_res_data (&resinfo.memflags, sizeof (resinfo.memflags), 1); - read_res_data (&resinfo.language, sizeof (resinfo.language), 1); - read_res_data (&version, sizeof (version), 1); - read_res_data (&resinfo.characteristics, sizeof (resinfo.characteristics), 1); - - res_align_file (); - - /* Allocate buffer for data */ - buff = res_alloc (reshdr.data_size); - /* Read data */ - read_res_data (buff, reshdr.data_size, 1); - /* Convert binary data to resource */ - r = bin_to_res (type, buff, reshdr.data_size, 0); - r->res_info = resinfo; - /* Add resource to resource directory */ - res_add_resource (r, &type, &name, resinfo.language, 0); - - return 1; -} - -/* write resource directory to binary resource file */ -static void -write_res_directory (rd, type, name, language, level) - const struct res_directory *rd; - const struct res_id *type; - const struct res_id *name; - int *language; - int level; -{ - const struct res_entry *re; - - for (re = rd->entries; re != NULL; re = re->next) - { - switch (level) - { - case 1: - /* If we're at level 1, the key of this resource is the - type. This normally duplicates the information we have - stored with the resource itself, but we need to remember - the type if this is a user define resource type. */ - type = &re->id; - break; - - case 2: - /* If we're at level 2, the key of this resource is the name - we are going to use in the rc printout. */ - name = &re->id; - break; - - case 3: - /* If we're at level 3, then this key represents a language. - Use it to update the current language. */ - if (!re->id.named - && re->id.u.id != (unsigned long) *language - && (re->id.u.id & 0xffff) == re->id.u.id) - { - *language = re->id.u.id; - } - break; - - default: - break; - } - - if (re->subdir) - write_res_directory (re->u.dir, type, name, language, level + 1); - else - { - if (level == 3) - { - /* This is the normal case: the three levels are - TYPE/NAME/LANGUAGE. NAME will have been set at level - 2, and represents the name to use. We probably just - set LANGUAGE, and it will probably match what the - resource itself records if anything. */ - write_res_resource (type, name, re->u.res, language); - } - else - { - fprintf (stderr, "// Resource at unexpected level %d\n", level); - write_res_resource (type, (struct res_id *) NULL, re->u.res, - language); - } - } - } - -} - -static void -write_res_resource (type, name, res, language) - const struct res_id *type; - const struct res_id *name; - const struct res_resource *res; - int *language ATTRIBUTE_UNUSED; -{ - int rt; - - switch (res->type) - { - default: - abort (); - - case RES_TYPE_ACCELERATOR: - rt = RT_ACCELERATOR; - break; - - case RES_TYPE_BITMAP: - rt = RT_BITMAP; - break; - - case RES_TYPE_CURSOR: - rt = RT_CURSOR; - break; - - case RES_TYPE_GROUP_CURSOR: - rt = RT_GROUP_CURSOR; - break; - - case RES_TYPE_DIALOG: - rt = RT_DIALOG; - break; - - case RES_TYPE_FONT: - rt = RT_FONT; - break; - - case RES_TYPE_FONTDIR: - rt = RT_FONTDIR; - break; - - case RES_TYPE_ICON: - rt = RT_ICON; - break; - - case RES_TYPE_GROUP_ICON: - rt = RT_GROUP_ICON; - break; - - case RES_TYPE_MENU: - rt = RT_MENU; - break; - - case RES_TYPE_MESSAGETABLE: - rt = RT_MESSAGETABLE; - break; - - case RES_TYPE_RCDATA: - rt = RT_RCDATA; - break; - - case RES_TYPE_STRINGTABLE: - rt = RT_STRING; - break; - - case RES_TYPE_USERDATA: - rt = 0; - break; - - case RES_TYPE_VERSIONINFO: - rt = RT_VERSION; - break; - } - - if (rt != 0 - && type != NULL - && (type->named || type->u.id != (unsigned long) rt)) - { - fprintf (stderr, "// Unexpected resource type mismatch: "); - res_id_print (stderr, *type, 1); - fprintf (stderr, " != %d", rt); - abort (); - } - - write_res_bin (res, type, name, &res->res_info); - return; -} - -/* Write a resource in binary resource format */ -static void -write_res_bin (res, type, name, resinfo) - const struct res_resource *res; - const struct res_id *type; - const struct res_id *name; - const struct res_res_info *resinfo; -{ - unsigned long datasize = 0; - const struct bindata *bin_rep, *data; - - bin_rep = res_to_bin (res, 0); - for (data = bin_rep; data != NULL; data = data->next) - datasize += data->length; - - write_res_header (datasize, type, name, resinfo); - - for (data = bin_rep; data != NULL; data = data->next) - write_res_data (data->data, data->length, 1); -} - -/* Get number of bytes needed to store an id in binary format */ -static unsigned long -get_id_size (id) - const struct res_id *id; -{ - if (id->named) - return sizeof (unichar) * (id->u.n.length + 1); - else - return sizeof (unichar) * 2; -} - -/* Write a resource header */ -static void -write_res_header (datasize, type, name, resinfo) - unsigned long datasize; - const struct res_id *type; - const struct res_id *name; - const struct res_res_info *resinfo; -{ - struct res_hdr reshdr; - reshdr.data_size = datasize; - reshdr.header_size = 24 + get_id_size (type) + get_id_size (name); - - res_align_file (); - write_res_data (&reshdr, sizeof (reshdr), 1); - write_res_id (type); - write_res_id (name); - - res_align_file (); - - write_res_info (resinfo); - res_align_file (); -} - - -/* Write data to file, abort on failure */ -static void -write_res_data (data, size, count) - const void *data; - size_t size; - int count; -{ - if (fwrite (data, size, count, fres) != (size_t) count) - fatal ("%s: could not write to file", filename); -} - -/* Read data from file, abort on failure */ -static void -read_res_data (data, size, count) - void *data; - size_t size; - int count; -{ - if (fread (data, size, count, fres) != (size_t) count) - fatal ("%s: unexpected end of file", filename); -} - -/* Write a resource id */ -static void -write_res_id (id) - const struct res_id *id; -{ - if (id->named) - { - unsigned long len = id->u.n.length; - unichar null_term = 0; - write_res_data (id->u.n.name, len * sizeof (unichar), 1); - write_res_data (&null_term, sizeof (null_term), 1); - } - else - { - unsigned short i = 0xFFFF; - write_res_data (&i, sizeof (i), 1); - i = id->u.id; - write_res_data (&i, sizeof (i), 1); - } -} - -/* Write resource info */ -static void -write_res_info (info) - const struct res_res_info *info; -{ - write_res_data (&info->version, sizeof (info->version), 1); - write_res_data (&info->memflags, sizeof (info->memflags), 1); - write_res_data (&info->language, sizeof (info->language), 1); - write_res_data (&info->version, sizeof (info->version), 1); - write_res_data (&info->characteristics, sizeof (info->characteristics), 1); -} - -/* read a resource identifier */ -void -read_res_id (id) - struct res_id *id; -{ - unsigned short ord; - unichar *id_s = NULL; - int len; - - read_res_data (&ord, sizeof (ord), 1); - if (ord == 0xFFFF) /* an ordinal id */ - { - read_res_data (&ord, sizeof (ord), 1); - id->named = 0; - id->u.id = ord; - } - else - /* named id */ - { - if (fseek (fres, -sizeof (ord), SEEK_CUR) != 0) - fatal ("%s: %s: could not seek in file", program_name, filename); - id_s = read_unistring (&len); - id->named = 1; - id->u.n.length = len; - id->u.n.name = id_s; - } -} - -/* Read a null terminated UNICODE string */ -static unichar * -read_unistring (len) - int *len; -{ - unichar *s; - unichar c; - unichar *p; - int l; - - *len = 0; - l = 0; - - /* there are hardly any names longer than 256 characters */ - p = s = (unichar *) xmalloc (sizeof (unichar) * 256); - do - { - read_res_data (&c, sizeof (c), 1); - *p++ = c; - if (c != 0) - l++; - } - while (c != 0); - *len = l; - return s; -} - -/* align file on DWORD boundary */ -static void -res_align_file (void) -{ - if (fseek (fres, ftell (fres) % 4, SEEK_CUR) != 0) - fatal ("%s: %s: unable to align file", program_name, filename); -} - -/* Check if file is a win32 binary resource file, if so - skip past the null resource. Returns 0 if successful, -1 on - error. - */ -static void -skip_null_resource (void) -{ - struct res_hdr reshdr = - {0, 0}; - read_res_data (&reshdr, sizeof (reshdr), 1); - if ((reshdr.data_size != 0) || (reshdr.header_size != 0x20)) - goto skip_err; - - /* Subtract size of HeaderSize and DataSize */ - if (fseek (fres, reshdr.header_size - 8, SEEK_CUR) != 0) - goto skip_err; - - return; - -skip_err: - fprintf (stderr, "%s: %s: Not a valid WIN32 resource file\n", program_name, - filename); - xexit (1); -} - -/* Add a resource to resource directory */ -void -res_add_resource (r, type, id, language, dupok) - struct res_resource *r; - const struct res_id *type; - const struct res_id *id; - int language; - int dupok; -{ - struct res_id a[3]; - - a[0] = *type; - a[1] = *id; - a[2].named = 0; - a[2].u.id = language; - res_append_resource (&resources, r, 3, a, dupok); -} - -/* Append a resource to resource directory. - This is just copied from define_resource - and modified to add an existing resource. - */ -void -res_append_resource (resources, resource, cids, ids, dupok) - struct res_directory **resources; - struct res_resource *resource; - int cids; - const struct res_id *ids; - int dupok; -{ - struct res_entry *re = NULL; - int i; - - assert (cids > 0); - for (i = 0; i < cids; i++) - { - struct res_entry **pp; - - if (*resources == NULL) - { - static unsigned long timeval; - - /* Use the same timestamp for every resource created in a - single run. */ - if (timeval == 0) - timeval = time (NULL); - - *resources = ((struct res_directory *) - res_alloc (sizeof **resources)); - (*resources)->characteristics = 0; - (*resources)->time = timeval; - (*resources)->major = 0; - (*resources)->minor = 0; - (*resources)->entries = NULL; - } - - for (pp = &(*resources)->entries; *pp != NULL; pp = &(*pp)->next) - if (res_id_cmp ((*pp)->id, ids[i]) == 0) - break; - - if (*pp != NULL) - re = *pp; - else - { - re = (struct res_entry *) res_alloc (sizeof *re); - re->next = NULL; - re->id = ids[i]; - if ((i + 1) < cids) - { - re->subdir = 1; - re->u.dir = NULL; - } - else - { - re->subdir = 0; - re->u.res = NULL; - } - - *pp = re; - } - - if ((i + 1) < cids) - { - if (!re->subdir) - { - fprintf (stderr, "%s: ", program_name); - res_ids_print (stderr, i, ids); - fprintf (stderr, ": expected to be a directory\n"); - xexit (1); - } - - resources = &re->u.dir; - } - } - - if (re->subdir) - { - fprintf (stderr, "%s: ", program_name); - res_ids_print (stderr, cids, ids); - fprintf (stderr, ": expected to be a leaf\n"); - xexit (1); - } - - if (re->u.res != NULL) - { - if (dupok) - return; - - fprintf (stderr, "%s: warning: ", program_name); - res_ids_print (stderr, cids, ids); - fprintf (stderr, ": duplicate value\n"); - } - - re->u.res = resource; -} diff --git a/binutils/sanity.sh b/binutils/sanity.sh deleted file mode 100755 index 942cabf9ac0..00000000000 --- a/binutils/sanity.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/sh -### quick sanity test for the binutils. -### -### This file was written and is maintained by K. Richard Pixley, -### rich@cygnus.com. - -### fail on errors -set -e - -### first arg is directory in which binaries to be tested reside. -case "$1" in -"") BIN=. ;; -*) BIN="$1" ;; -esac - -### size -for i in size objdump nm ar strip ranlib ; do - ${BIN}/size ${BIN}/$i > /dev/null -done - -### objdump -for i in size objdump nm ar strip ranlib ; do - ${BIN}/objdump -ahifdrtxsl ${BIN}/$i > /dev/null -done - -### nm -for i in size objdump nm ar strip ranlib ; do - ${BIN}/nm ${BIN}/$i > /dev/null -done - -### strip -TMPDIR=./binutils-$$ -mkdir ${TMPDIR} - -cp ${BIN}/strip ${TMPDIR}/strip - -for i in size objdump nm ar ranlib ; do - cp ${BIN}/$i ${TMPDIR}/$i - ${BIN}/strip ${TMPDIR}/$i - cp ${BIN}/$i ${TMPDIR}/$i - ${TMPDIR}/strip ${TMPDIR}/$i -done - -### ar - -### ranlib - -rm -rf ${TMPDIR} - -exit 0 diff --git a/binutils/size.1 b/binutils/size.1 deleted file mode 100644 index 3b19bd25930..00000000000 --- a/binutils/size.1 +++ /dev/null @@ -1,161 +0,0 @@ -.\" Copyright (c) 1991 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH size 1 "5 November 1991" "cygnus support" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -size \- list section sizes and total size. - -.SH SYNOPSIS -.hy 0 -.na -.TP -.B size -.RB "[\|" \-A \||\| \-B \||\| \c -.BI "\-\-format=" compatibility\c -\&\|] -.RB "[\|" \-\-help "\|]" -.RB "[\|" \-d \||\| \-o \||\| \-x\c -\||\|\c -.BI "\-\-radix=" number\c -\&\|] -.RB "[\|" \c -.BI "\-\-target=" bfdname\c -\&\|] -.RB "[\|" \-V \||\| \-\-version "\|]" -.I objfile\c -\&.\|.\|. -.ad b -.hy 1 -.SH DESCRIPTION -The GNU \c -.B size\c -\& utility lists the section sizes\(em\&and the total -size\(em\&for each of the object files -.I objfile -in its argument list. -By default, one line of output is generated for each object file or each -module in an archive. - -.SH OPTIONS -.TP -.B \-A -.TP -.B \-B -.TP -.BI "\-\-format " "compatibility" -Using one of these options, you can choose whether the output from GNU -\c -.B size\c -\& resembles output from System V \c -.B size\c -\& (using `\|\c -.B \-A\c -\|', -or `\|\c -.B \-\-format=sysv\c -\|'), or Berkeley \c -.B size\c -\& (using `\|\c -.B \-B\c -\|', or -`\|\c -.B \-\-format=berkeley\c -\|'). The default is the one-line format similar to -Berkeley's. - -.TP -.B \-\-help -Show a summary of acceptable arguments and options. - -.TP -.B \-d -.TP -.B \-o -.TP -.B \-x -.TP -.BI "\-\-radix " "number" -Using one of these options, you can control whether the size of each -section is given in decimal (`\|\c -.B \-d\c -\|', or `\|\c -.B \-\-radix 10\c -\|'); octal -(`\|\c -.B \-o\c -\|', or `\|\c -.B \-\-radix 8\c -\|'); or hexadecimal (`\|\c -.B \-x\c -\|', or -`\|\c -.B \-\-radix 16\c -\|'). In `\|\c -.B \-\-radix \c -.I number\c -\&\c -\|', only the three -values (8, 10, 16) are supported. The total size is always given in two -radices; decimal and hexadecimal for `\|\c -.B \-d\c -\|' or `\|\c -.B \-x\c -\|' output, or -octal and hexadecimal if you're using `\|\c -.B \-o\c -\|'. - -.TP -.BI "\-\-target " "bfdname" -You can specify a particular object-code format for \c -.I objfile\c -\& as -\c -.I bfdname\c -\&. This may not be necessary; \c -.I size\c -\& can -automatically recognize many formats. See -.BR objdump ( 1 ) -for information -on listing available formats. - -.TP -.B \-V -.TP -.B \-\-version -Display version number information on \c -.B size\c -\& itself. - -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.BR info ; -.IR "The GNU Binary Utilities" , - Roland H. Pesch (October 1991); -.BR ar "(" 1 ")," -.BR objdump ( 1 ). - -.SH COPYING -Copyright (c) 1991 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/binutils/size.c b/binutils/size.c deleted file mode 100644 index 070834b63c0..00000000000 --- a/binutils/size.c +++ /dev/null @@ -1,515 +0,0 @@ -/* size.c -- report size of various sections of an executable file. - Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000 - 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 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Extensions/incompatibilities: - o - BSD output has filenames at the end. - o - BSD output can appear in different radicies. - o - SysV output has less redundant whitespace. Filename comes at end. - o - SysV output doesn't show VMA which is always the same as the PMA. - o - We also handle core files. - o - We also handle archives. - If you write shell scripts which manipulate this info then you may be - out of luck; there's no --compatibility or --pedantic option. -*/ - -#include "bfd.h" -#include "getopt.h" -#include "bucomm.h" -#include "libiberty.h" - -#ifndef BSD_DEFAULT -#define BSD_DEFAULT 1 -#endif - -/* Program options. */ - -enum - { - decimal, octal, hex - } radix = decimal; -int berkeley_format = BSD_DEFAULT; /* 0 means use AT&T-style output. */ -int show_version = 0; -int show_help = 0; - -/* Program exit status. */ -int return_code = 0; - -static char *target = NULL; - -/* Static declarations */ - -static void usage PARAMS ((FILE *, int)); -static void display_file PARAMS ((char *filename)); -static void display_bfd PARAMS ((bfd *)); -static void display_archive PARAMS ((bfd *)); -static int size_number PARAMS ((bfd_size_type)); -#if 0 -static void lprint_number PARAMS ((int, bfd_size_type)); -#endif -static void rprint_number PARAMS ((int, bfd_size_type)); -static void print_berkeley_format PARAMS ((bfd *)); -static void sysv_internal_sizer PARAMS ((bfd *, asection *, PTR)); -static void sysv_internal_printer PARAMS ((bfd *, asection *, PTR)); -static void print_sysv_format PARAMS ((bfd *)); -static void print_sizes PARAMS ((bfd * file)); -static void berkeley_sum PARAMS ((bfd *, sec_ptr, PTR)); - -static void -usage (stream, status) - FILE *stream; - int status; -{ - fprintf (stream, _("\ -Usage: %s [-ABdoxV] [--format=berkeley|sysv] [--radix=8|10|16]\n\ - [--target=bfdname] [--version] [--help] [file...]\n"), program_name); -#if BSD_DEFAULT - fputs (_("default is --format=berkeley\n"), stream); -#else - fputs (_("default is --format=sysv\n"), stream); -#endif - list_supported_targets (program_name, stream); - if (status == 0) - fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); - exit (status); -} - -struct option long_options[] = -{ - {"format", required_argument, 0, 200}, - {"radix", required_argument, 0, 201}, - {"target", required_argument, 0, 202}, - {"version", no_argument, &show_version, 1}, - {"help", no_argument, &show_help, 1}, - {0, no_argument, 0, 0} -}; - -int -main (argc, argv) - int argc; - char **argv; -{ - int temp; - int c; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = *argv; - xmalloc_set_program_name (program_name); - - bfd_init (); - set_default_bfd_target (); - - while ((c = getopt_long (argc, argv, "ABVdox", long_options, - (int *) 0)) != EOF) - switch (c) - { - case 200: /* --format */ - switch (*optarg) - { - case 'B': - case 'b': - berkeley_format = 1; - break; - case 'S': - case 's': - berkeley_format = 0; - break; - default: - non_fatal (_("invalid argument to --format: %s"), optarg); - usage (stderr, 1); - } - break; - - case 202: /* --target */ - target = optarg; - break; - - case 201: /* --radix */ -#ifdef ANSI_LIBRARIES - temp = strtol (optarg, NULL, 10); -#else - temp = atol (optarg); -#endif - switch (temp) - { - case 10: - radix = decimal; - break; - case 8: - radix = octal; - break; - case 16: - radix = hex; - break; - default: - non_fatal (_("Invalid radix: %s\n"), optarg); - usage (stderr, 1); - } - break; - - case 'A': - berkeley_format = 0; - break; - case 'B': - berkeley_format = 1; - break; - case 'V': - show_version = 1; - break; - case 'd': - radix = decimal; - break; - case 'x': - radix = hex; - break; - case 'o': - radix = octal; - break; - case 0: - break; - case '?': - usage (stderr, 1); - } - - if (show_version) - print_version ("size"); - if (show_help) - usage (stdout, 0); - - if (optind == argc) - display_file ("a.out"); - else - for (; optind < argc;) - display_file (argv[optind++]); - - return return_code; -} - -/* Display stats on file or archive member ABFD. */ - -static void -display_bfd (abfd) - bfd *abfd; -{ - char **matching; - - if (bfd_check_format (abfd, bfd_archive)) - /* An archive within an archive. */ - return; - - if (bfd_check_format_matches (abfd, bfd_object, &matching)) - { - print_sizes (abfd); - printf ("\n"); - return; - } - - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - bfd_nonfatal (bfd_get_filename (abfd)); - list_matching_formats (matching); - free (matching); - return_code = 3; - return; - } - - if (bfd_check_format_matches (abfd, bfd_core, &matching)) - { - CONST char *core_cmd; - - print_sizes (abfd); - fputs (" (core file", stdout); - - core_cmd = bfd_core_file_failing_command (abfd); - if (core_cmd) - printf (" invoked as %s", core_cmd); - - puts (")\n"); - return; - } - - bfd_nonfatal (bfd_get_filename (abfd)); - - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } - - return_code = 3; -} - -static void -display_archive (file) - bfd *file; -{ - bfd *arfile = (bfd *) NULL; - - for (;;) - { - bfd_set_error (bfd_error_no_error); - - arfile = bfd_openr_next_archived_file (file, arfile); - if (arfile == NULL) - { - if (bfd_get_error () != bfd_error_no_more_archived_files) - { - bfd_nonfatal (bfd_get_filename (file)); - return_code = 2; - } - break; - } - - display_bfd (arfile); - /* Don't close the archive elements; we need them for next_archive */ - } -} - -static void -display_file (filename) - char *filename; -{ - bfd *file = bfd_openr (filename, target); - if (file == NULL) - { - bfd_nonfatal (filename); - return_code = 1; - return; - } - - if (bfd_check_format (file, bfd_archive) == true) - display_archive (file); - else - display_bfd (file); - - if (bfd_close (file) == false) - { - bfd_nonfatal (filename); - return_code = 1; - return; - } -} - -/* This is what lexical functions are for. */ - -static int -size_number (num) - bfd_size_type num; -{ - char buffer[40]; - sprintf (buffer, - (radix == decimal ? "%lu" : - ((radix == octal) ? "0%lo" : "0x%lx")), - (unsigned long) num); - - return strlen (buffer); -} - -#if 0 - -/* This is not used. */ - -static void -lprint_number (width, num) - int width; - bfd_size_type num; -{ - char buffer[40]; - sprintf (buffer, - (radix == decimal ? "%lu" : - ((radix == octal) ? "0%lo" : "0x%lx")), - (unsigned long) num); - - printf ("%-*s", width, buffer); -} - -#endif - -static void -rprint_number (width, num) - int width; - bfd_size_type num; -{ - char buffer[40]; - sprintf (buffer, - (radix == decimal ? "%lu" : - ((radix == octal) ? "0%lo" : "0x%lx")), - (unsigned long) num); - - printf ("%*s", width, buffer); -} - -static bfd_size_type bsssize; -static bfd_size_type datasize; -static bfd_size_type textsize; - -static void -berkeley_sum (abfd, sec, ignore) - bfd *abfd ATTRIBUTE_UNUSED; - sec_ptr sec; - PTR ignore ATTRIBUTE_UNUSED; -{ - flagword flags; - bfd_size_type size; - - flags = bfd_get_section_flags (abfd, sec); - if ((flags & SEC_ALLOC) == 0) - return; - - size = bfd_get_section_size_before_reloc (sec); - if ((flags & SEC_CODE) != 0 || (flags & SEC_READONLY) != 0) - textsize += size; - else if ((flags & SEC_HAS_CONTENTS) != 0) - datasize += size; - else - bsssize += size; -} - -static void -print_berkeley_format (abfd) - bfd *abfd; -{ - static int files_seen = 0; - bfd_size_type total; - - bsssize = 0; - datasize = 0; - textsize = 0; - - bfd_map_over_sections (abfd, berkeley_sum, (PTR) NULL); - - if (files_seen++ == 0) -#if 0 - /* Intel doesn't like bss/stk because they don't have core files. */ - puts ((radix == octal) ? " text\t data\tbss/stk\t oct\t hex\tfilename" : - " text\t data\tbss/stk\t dec\t hex\tfilename"); -#else - puts ((radix == octal) ? " text\t data\t bss\t oct\t hex\tfilename" : - " text\t data\t bss\t dec\t hex\tfilename"); -#endif - - total = textsize + datasize + bsssize; - - rprint_number (7, textsize); - putchar ('\t'); - rprint_number (7, datasize); - putchar ('\t'); - rprint_number (7, bsssize); - printf (((radix == octal) ? "\t%7lo\t%7lx\t" : "\t%7lu\t%7lx\t"), - (unsigned long) total, (unsigned long) total); - - fputs (bfd_get_filename (abfd), stdout); - if (bfd_my_archive (abfd)) - printf (" (ex %s)", bfd_get_filename (bfd_my_archive (abfd))); -} - -/* I REALLY miss lexical functions! */ -bfd_size_type svi_total = 0; -bfd_vma svi_maxvma = 0; -int svi_namelen = 0; -int svi_vmalen = 0; -int svi_sizelen = 0; - -static void -sysv_internal_sizer (file, sec, ignore) - bfd *file ATTRIBUTE_UNUSED; - sec_ptr sec; - PTR ignore ATTRIBUTE_UNUSED; -{ - bfd_size_type size = bfd_section_size (file, sec); - if (!bfd_is_abs_section (sec) - && !bfd_is_com_section (sec) - && !bfd_is_und_section (sec)) - { - int namelen = strlen (bfd_section_name (file, sec)); - if (namelen > svi_namelen) - svi_namelen = namelen; - - svi_total += size; - if (bfd_section_vma (file, sec) > svi_maxvma) - svi_maxvma = bfd_section_vma (file, sec); - } -} - -static void -sysv_internal_printer (file, sec, ignore) - bfd *file ATTRIBUTE_UNUSED; - sec_ptr sec; - PTR ignore ATTRIBUTE_UNUSED; -{ - bfd_size_type size = bfd_section_size (file, sec); - if (!bfd_is_abs_section (sec) - && !bfd_is_com_section (sec) - && !bfd_is_und_section (sec)) - { - svi_total += size; - - printf ("%-*s ", svi_namelen, bfd_section_name (file, sec)); - rprint_number (svi_sizelen, size); - printf (" "); - rprint_number (svi_vmalen, bfd_section_vma (file, sec)); - printf ("\n"); - } -} - -static void -print_sysv_format (file) - bfd *file; -{ - /* size all of the columns */ - svi_total = 0; - svi_maxvma = 0; - svi_namelen = 0; - bfd_map_over_sections (file, sysv_internal_sizer, (PTR) NULL); - svi_vmalen = size_number ((bfd_size_type)svi_maxvma); - if ((size_t) svi_vmalen < sizeof ("addr") - 1) - svi_vmalen = sizeof ("addr")-1; - - svi_sizelen = size_number (svi_total); - if ((size_t) svi_sizelen < sizeof ("size") - 1) - svi_sizelen = sizeof ("size")-1; - - svi_total = 0; - printf ("%s ", bfd_get_filename (file)); - if (bfd_my_archive (file)) - printf (" (ex %s)", bfd_get_filename (bfd_my_archive (file))); - - printf (":\n%-*s %*s %*s\n", svi_namelen, "section", - svi_sizelen, "size", svi_vmalen, "addr"); - bfd_map_over_sections (file, sysv_internal_printer, (PTR) NULL); - - printf ("%-*s ", svi_namelen, "Total"); - rprint_number (svi_sizelen, svi_total); - printf ("\n\n"); -} - -static void -print_sizes (file) - bfd *file; -{ - if (berkeley_format) - print_berkeley_format (file); - else - print_sysv_format (file); -} diff --git a/binutils/srconv.c b/binutils/srconv.c deleted file mode 100644 index c317d9807fa..00000000000 --- a/binutils/srconv.c +++ /dev/null @@ -1,2029 +0,0 @@ -/* srconv.c -- Sysroff conversion program - Copyright (C) 1994, 95, 96, 98, 99, 2000 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 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* Written by Steve Chamberlain (sac@cygnus.com) - - This program can be used to convert a coff object file - into a Hitachi OM/LM (Sysroff) format. - - All debugging information is preserved */ - -#include -#include "bucomm.h" -#include "sysroff.h" -#include "coffgrok.h" -#include -#include - -#include "coff/internal.h" -#include "../bfd/libcoff.h" - -#define PROGRAM_VERSION "1.5" -/*#define FOOP1 1 */ - -static int addrsize; -static char *toolname; -static char **rnames; - -static void wr_cs (); -static void walk_tree_scope (); -static void wr_globals (); -static int find_base (); - -static FILE *file; -static bfd *abfd; -static int debug = 0; -static int quick = 0; -static int noprescan = 0; -static struct coff_ofile *tree; -/* Obsolete ?? - static int absolute_p; - */ - -static int segmented_p; -static int code; - -static int ids1[20000]; -static int ids2[20000]; - -static int base1 = 0x18; -static int base2 = 0x2018; - -static int -get_member_id (x) - int x; -{ - if (ids2[x]) - { - return ids2[x]; - } - ids2[x] = base2++; - return ids2[x]; -} - -static int -get_ordinary_id (x) - int x; -{ - if (ids1[x]) - { - return ids1[x]; - } - ids1[x] = base1++; - return ids1[x]; -} -static char * -section_translate (n) - char *n; -{ - if (strcmp (n, ".text") == 0) - return "P"; - if (strcmp (n, ".data") == 0) - return "D"; - if (strcmp (n, ".bss") == 0) - return "B"; - return n; -} - - - -#define DATE "940201073000"; /* Just a time on my birthday */ - - -static -char * -strip_suffix (name) - char *name; -{ - int i; - char *res; - for (i = 0; name[i] != 0 && name[i] != '.'; i++) - ; - res = (char *) xmalloc (i + 1); - memcpy (res, name, i); - res[i] = 0; - return res; -} - - -/* IT LEN stuff CS */ -static void -checksum (file, ptr, size, code) - FILE *file; - char *ptr; - int size; - int code; -{ - int j; - int last; - int sum = 0; - int bytes = size / 8; - last = !(code & 0xff00); - if (size & 0x7) - abort (); - ptr[0] = code | (last ? 0x80 : 0); - ptr[1] = bytes + 1; - - for (j = 0; j < bytes; j++) - { - sum += ptr[j]; - } - /* Glue on a checksum too */ - ptr[bytes] = ~sum; - fwrite (ptr, bytes + 1, 1, file); -} - - - - -static void -writeINT (n, ptr, idx, size, file) - int n; - char *ptr; - int *idx; - int size; - FILE *file; -{ - int byte = *idx / 8; - - if (size == -2) - size = addrsize; - else if (size == -1) - size = 0; - - if (byte > 240) - { - /* Lets write out that record and do another one */ - checksum (file, ptr, *idx, code | 0x1000); - *idx = 16; - byte = *idx / 8; - } - switch (size) - { - case 0: - break; - case 1: - ptr[byte] = n; - break; - case 2: - ptr[byte + 0] = n >> 8; - ptr[byte + 1] = n; - break; - case 4: - ptr[byte + 0] = n >> 24; - ptr[byte + 1] = n >> 16; - ptr[byte + 2] = n >> 8; - ptr[byte + 3] = n >> 0; - break; - default: - abort (); - } - *idx += size * 8; -} - - -static void -writeBITS (val, ptr, idx, size) - int val; - char *ptr; - int *idx; - int size; -{ - int byte = *idx / 8; - int bit = *idx % 8; - int old; - *idx += size; - - old = ptr[byte]; - /* Turn off all about to change bits */ - old &= ~((~0 >> (8 - bit - size)) & ((1 << size) - 1)); - /* Turn on the bits we want */ - old |= (val & ((1 << size) - 1)) << (8 - bit - size); - ptr[byte] = old; -} - -static void -writeBARRAY (data, ptr, idx, size, file) - barray data; - char *ptr; - int *idx; - int size; - FILE *file; -{ - int i; - writeINT (data.len, ptr, idx, 1, file); - for (i = 0; i < data.len; i++) - { - writeINT (data.data[i], ptr, idx, 1, file); - } -} - - -static void -writeCHARS (string, ptr, idx, size, file) - char *string; - char *ptr; - int *idx; - int size; - FILE *file; -{ - int i = *idx / 8; - - if (i > 240) - { - /* Lets write out that record and do another one */ - checksum (file, ptr, *idx, code | 0x1000); - *idx = 16; - i = *idx / 8; - } - - if (size == 0) - { - /* Variable length string */ - size = strlen (string); - ptr[i++] = size; - } - - /* BUG WAITING TO HAPPEN */ - memcpy (ptr + i, string, size); - i += size; - *idx = i * 8; -} - -#define SYSROFF_SWAP_OUT -#include "sysroff.c" - - -static char *rname_sh[] = -{ - "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15" -}; - -static char *rname_h8300[] = -{ - "ER0", "ER1", "ER2", "ER3", "ER4", "ER5", "ER6", "ER7", "PC", "CCR" -}; - -static void -wr_tr () -{ - /* The TR block is not normal - it doesn't have any contents. */ - - static char b[] = { - 0xff, /* IT */ - 0x03, /* RL */ - 0xfd, /* CS */ - }; - fwrite (b, 1, sizeof (b), file); -} - -static void -wr_un (ptr, sfile, first, nsecs) - struct coff_ofile *ptr; - struct coff_sfile *sfile; - int first; - int nsecs; -{ - struct IT_un un; - - struct coff_symbol *s; - - un.spare1 = 0; - - if (bfd_get_file_flags (abfd) & EXEC_P) - un.format = FORMAT_LM; - else - un.format = FORMAT_OM; - un.spare1 = 0; - - -#if 1 - un.nsections = ptr->nsections - 1; /* Don't count the abs section */ -#else - /*NEW - only count sections with size */ - un.nsections = nsecs; -#endif - - un.nextdefs = 0; - un.nextrefs = 0; - /* Count all the undefined and defined variables with global scope */ - - if (first) - { - for (s = ptr->symbol_list_head; s; s = s->next_in_ofile_list) - { - if (s->visible->type == coff_vis_ext_def - || s->visible->type == coff_vis_common) - un.nextdefs++; - - if (s->visible->type == coff_vis_ext_ref) - un.nextrefs++; - } - } - un.tool = toolname; - un.tcd = DATE; - un.linker = "L_GX00"; - un.lcd = DATE; - un.name = sfile->name; - sysroff_swap_un_out (file, &un); -} - - -static void -wr_hd (p) - struct coff_ofile *p; -{ - struct IT_hd hd; - - hd.spare1 = 0; - if (bfd_get_file_flags (abfd) & EXEC_P) - { - hd.mt = MTYPE_ABS_LM; - } - else - { - hd.mt = MTYPE_OMS_OR_LMS; - } - hd.cd = DATE; - - hd.nu = p->nsources; /* Always one unit */ - hd.code = 0; /* Always ASCII */ - hd.ver = "0200"; /* Version 2.00 */ - switch (bfd_get_arch (abfd)) - { - case bfd_arch_h8300: - hd.au = 8; - hd.si = 0; - hd.spcsz = 32; - hd.segsz = 0; - hd.segsh = 0; - switch (bfd_get_mach (abfd)) - { - case bfd_mach_h8300: - hd.cpu = "H8300"; - hd.afl = 2; - addrsize = 2; - toolname = "C_H8/300"; - break; - case bfd_mach_h8300h: - hd.cpu = "H8300H"; - hd.afl = 4; - addrsize = 4; - toolname = "C_H8/300H"; - break; - case bfd_mach_h8300s: - hd.cpu = "H8300S"; - hd.afl = 4; - addrsize = 4; - toolname = "C_H8/300S"; - break; - default: - abort(); - } - rnames = rname_h8300; - break; - case bfd_arch_sh: - hd.au = 8; - hd.si = 0; - hd.afl = 4; - hd.spcsz = 32; - hd.segsz = 0; - hd.segsh = 0; - hd.cpu = "SH"; - addrsize = 4; - toolname = "C_SH"; - rnames = rname_sh; - break; - default: - abort (); - } - - if (! bfd_get_file_flags(abfd) & EXEC_P) - { - hd.ep = 0; - } - else - { - hd.ep = 1; - hd.uan = 0; - hd.sa = 0; - hd.sad = 0; - hd.address = bfd_get_start_address (abfd); - } - - hd.os = ""; - hd.sys = ""; - hd.mn = strip_suffix (bfd_get_filename (abfd)); - - sysroff_swap_hd_out (file, &hd); -} - - -static void -wr_sh (p, sec) - struct coff_ofile *p; - struct coff_section *sec; -{ - struct IT_sh sh; - sh.unit = 0; - sh.section = sec->number; -#ifdef FOOP1 - sh.section = 0; -#endif - sysroff_swap_sh_out (file, &sh); -} - - -static void -wr_ob (p, section) - struct coff_ofile *p; - struct coff_section *section; -{ - bfd_size_type i; - int first = 1; - unsigned char stuff[200]; - - i = 0; - while (i < section->bfd_section->_raw_size) - { - struct IT_ob ob; - int todo = 200; /* Copy in 200 byte lumps */ - ob.spare = 0; - if (i + todo > section->bfd_section->_raw_size) - todo = section->bfd_section->_raw_size - i; - - if (first) - { - ob.saf = 1; - if (bfd_get_file_flags (abfd) & EXEC_P) - ob.address = section->address; - else - ob.address = 0; - - first = 0; - } - else - { - ob.saf = 0; - } - - ob.cpf = 0; /* Never compress */ - ob.data.len = todo; - bfd_get_section_contents (abfd, section->bfd_section, stuff, i, todo); - ob.data.data = stuff; - sysroff_swap_ob_out (file, &ob /*, i + todo < section->size */ ); - i += todo; - } - /* Now fill the rest with blanks */ - while (i < (bfd_size_type) section->size) - { - struct IT_ob ob; - int todo = 200; /* Copy in 200 byte lumps */ - ob.spare = 0; - if (i + todo > (bfd_size_type) section->size) - todo = section->size - i; - ob.saf = 0; - - ob.cpf = 0; /* Never compress */ - ob.data.len = todo; - memset (stuff, 0, todo); - ob.data.data = stuff; - sysroff_swap_ob_out (file, &ob); - i += todo; - } - /* Now fill the rest with blanks */ - -} - -static void -wr_rl (ptr, sec) - struct coff_ofile *ptr; - struct coff_section *sec; -{ - int nr = sec->nrelocs; - int i; - for (i = 0; i < nr; i++) - { - struct coff_reloc *r = sec->relocs + i; - struct coff_symbol *ref; - struct IT_rl rl; - rl.apol = 0; - rl.boundary = 0; - rl.segment = 1; - rl.sign = 0; - rl.check = 0; - rl.addr = r->offset; - rl.bitloc = 0; - rl.flen = 32; /* SH Specific */ - /* What sort of reloc ? Look in the section to find out */ - ref = r->symbol; - if (ref->visible->type == coff_vis_ext_ref) - { - rl.bcount = 4; /* Always 4 for us */ - rl.op = OP_EXT_REF; - rl.symn = ref->er_number; - } - else if (ref->visible->type == coff_vis_common) - { - rl.bcount = 11; /* Always 11 for us */ - rl.op = OP_SEC_REF; - rl.secn = ref->where->section->number; - rl.copcode_is_3 = 3; - rl.alength_is_4 = 4; - rl.addend = ref->where->offset - ref->where->section->address; - rl.aopcode_is_0x20 = 0x20; - } - - else - { - rl.bcount = 11; /* Always 11 for us */ - rl.op = OP_SEC_REF; - rl.secn = ref->where->section->number; - rl.copcode_is_3 = 3; - rl.alength_is_4 = 4; - rl.addend = -ref->where->section->address; - rl.aopcode_is_0x20 = 0x20; - } - rl.end = 0xff; - if (rl.op == OP_SEC_REF - || rl.op == OP_EXT_REF) - { - sysroff_swap_rl_out (file, &rl); - } - } -} - -static void -wr_object_body (p) - struct coff_ofile *p; -{ - int i; - for (i = 1; i < p->nsections; i++) - { - wr_sh (p, p->sections + i); - wr_ob (p, p->sections + i); - wr_rl (p, p->sections + i); - } -} - -static void -wr_dps_start (sfile, section, scope, type, nest) - struct coff_sfile *sfile; - struct coff_section *section; - struct coff_scope *scope; - int type; - int nest; -{ - struct IT_dps dps; - dps.end = 0; - dps.opt = 0; - dps.type = type; - if (scope->sec) - { - dps.san = scope->sec->number; - dps.address = scope->offset - find_base (sfile, scope->sec); - dps.block_size = scope->size; - if (debug) - { - printf ("DPS %s %d %x\n", - sfile->name, - nest, - dps.address); - - } - } - else - { - dps.san = 0; - dps.address = 0; - dps.block_size = 0; - } - - dps.nesting = nest; - dps.neg = 0x1001; - sysroff_swap_dps_out (file, &dps); -} - -static void -wr_dps_end (section, scope, type) - struct coff_section *section; - struct coff_scope *scope; - int type; -{ - struct IT_dps dps; - dps.end = 1; - dps.type = type; - sysroff_swap_dps_out (file, &dps); -} - -static int * -nints (x) - int x; -{ - return (int *) (xcalloc (sizeof (int), x)); -} - -static void walk_tree_symbol (); -static void -walk_tree_type_1 (sfile, symbol, type, nest) - struct coff_sfile *sfile; - struct coff_symbol *symbol; - struct coff_type *type; - int nest; -{ - switch (type->type) - { - case coff_secdef_type: - case coff_basic_type: - { - struct IT_dbt dbt; - - switch (type->u.basic) - { - case T_NULL: - case T_VOID: - dbt.btype = BTYPE_VOID; - dbt.sign = BTYPE_UNSPEC; - dbt.fptype = FPTYPE_NOTSPEC; - break; - case T_CHAR: - dbt.btype = BTYPE_CHAR; - dbt.sign = BTYPE_UNSPEC; - dbt.fptype = FPTYPE_NOTSPEC; - break; - case T_SHORT: - case T_INT: - case T_LONG: - dbt.btype = BTYPE_INT; - dbt.sign = SIGN_SIGNED; - dbt.fptype = FPTYPE_NOTSPEC; - break; - case T_FLOAT: - dbt.btype = BTYPE_FLOAT; - dbt.fptype = FPTYPE_SINGLE; - break; - case T_DOUBLE: - dbt.btype = BTYPE_FLOAT; - dbt.fptype = FPTYPE_DOUBLE; - break; - case T_LNGDBL: - dbt.btype = BTYPE_FLOAT; - dbt.fptype = FPTYPE_EXTENDED; - break; - case T_UCHAR: - dbt.btype = BTYPE_CHAR; - dbt.sign = SIGN_UNSIGNED; - dbt.fptype = FPTYPE_NOTSPEC; - break; - case T_USHORT: - case T_UINT: - case T_ULONG: - dbt.btype = BTYPE_INT; - dbt.sign = SIGN_UNSIGNED; - dbt.fptype = FPTYPE_NOTSPEC; - break; - } - dbt.bitsize = type->size; - dbt.neg = 0x1001; - sysroff_swap_dbt_out (file, &dbt); - break; - } - case coff_pointer_type: - { - struct IT_dpt dpt; - walk_tree_type_1 (sfile, symbol, type->u.pointer.points_to, nest + 1); - dpt.neg = 0x1001; - sysroff_swap_dpt_out (file, &dpt); - break; - } - - case coff_function_type: - { - struct IT_dfp dfp; - struct coff_symbol *param; - dfp.end = 0; - dfp.spare = 0; - dfp.nparams = type->u.function.parameters->nvars; - dfp.neg = 0x1001; - - walk_tree_type_1 (sfile, symbol, type->u.function.function_returns, nest + 1); - - sysroff_swap_dfp_out (file, &dfp); - - for (param = type->u.function.parameters->vars_head; - param; - param = param->next) - { - walk_tree_symbol (sfile, 0, param, nest); - } - dfp.end = 1; - sysroff_swap_dfp_out (file, &dfp); - break; - } - - case coff_structdef_type: - { - struct IT_dbt dbt; - struct IT_dds dds; - struct coff_symbol *member; - dds.spare = 0; - dbt.btype = BTYPE_STRUCT; - dbt.bitsize = type->size; - dbt.sign = SIGN_UNSPEC; - dbt.fptype = FPTYPE_NOTSPEC; - dbt.sid = get_member_id (type->u.astructdef.idx); - dbt.neg = 0x1001; - sysroff_swap_dbt_out (file, &dbt); - dds.end = 0; - dds.neg = 0x1001; - sysroff_swap_dds_out (file, &dds); - for (member = type->u.astructdef.elements->vars_head; - member; - member = member->next) - { - walk_tree_symbol (sfile, 0, member, nest + 1); - } - - dds.end = 1; - sysroff_swap_dds_out (file, &dds); - - } - break; - case coff_structref_type: - { - struct IT_dbt dbt; - dbt.btype = BTYPE_TAG; - dbt.bitsize = type->size; - dbt.sign = SIGN_UNSPEC; - dbt.fptype = FPTYPE_NOTSPEC; - if (type->u.astructref.ref) - { - dbt.sid = get_member_id (type->u.astructref.ref->number); - } - else - { - dbt.sid = 0; - } - - dbt.neg = 0x1001; - sysroff_swap_dbt_out (file, &dbt); - } - break; - case coff_array_type: - { - struct IT_dar dar; - int j; - int dims = 1; /* Only output one dimension at a time */ - dar.dims = dims; - dar.variable = nints (dims); - dar.subtype = nints (dims); - dar.spare = nints (dims); - dar.max_variable = nints (dims); - dar.maxspare = nints (dims); - dar.max = nints (dims); - dar.min_variable = nints (dims); - dar.min = nints (dims); - dar.minspare = nints (dims); - dar.neg = 0x1001; - dar.length = type->size / type->u.array.dim; - for (j = 0; j < dims; j++) - { - dar.variable[j] = VARIABLE_FIXED; - dar.subtype[j] = SUB_INTEGER; - dar.spare[j] = 0; - dar.max_variable[j] = 0; - dar.max[j] = type->u.array.dim; - dar.min_variable[j] = 0; - dar.min[j] = 1; /* Why isn't this 0 ? */ - } - walk_tree_type_1 (sfile, symbol, type->u.array.array_of, nest + 1); - sysroff_swap_dar_out (file, &dar); - } - break; - case coff_enumdef_type: - { - struct IT_dbt dbt; - struct IT_den den; - struct coff_symbol *member; - dbt.btype = BTYPE_ENUM; - dbt.bitsize = type->size; - dbt.sign = SIGN_UNSPEC; - dbt.fptype = FPTYPE_NOTSPEC; - dbt.sid = get_member_id (type->u.aenumdef.idx); - dbt.neg = 0x1001; - sysroff_swap_dbt_out (file, &dbt); - - den.end = 0; - den.neg = 0x1001; - den.spare = 0; - sysroff_swap_den_out (file, &den); - for (member = type->u.aenumdef.elements->vars_head; - member; - member = member->next) - { - walk_tree_symbol (sfile, 0, member, nest + 1); - } - - den.end = 1; - sysroff_swap_den_out (file, &den); - } - break; - - break; - case coff_enumref_type: - { - struct IT_dbt dbt; - dbt.btype = BTYPE_TAG; - dbt.bitsize = type->size; - dbt.sign = SIGN_UNSPEC; - dbt.fptype = FPTYPE_NOTSPEC; - dbt.sid = get_member_id (type->u.aenumref.ref->number); - dbt.neg = 0x1001; - sysroff_swap_dbt_out (file, &dbt); - } - break; - default: - abort (); - } -} - -/* Obsolete ? - static void - dty_start () - { - struct IT_dty dty; - dty.end = 0; - dty.neg = 0x1001; - dty.spare = 0; - sysroff_swap_dty_out (file, &dty); - } - - static void - dty_stop () - { - struct IT_dty dty; - dty.end = 0; - dty.neg = 0x1001; - dty.end = 1; - sysroff_swap_dty_out (file, &dty); - } - - - static void - dump_tree_structure (sfile, symbol, type, nest) - struct coff_sfile *sfile; - struct coff_symbol *symbol; - struct coff_type *type; - int nest; - { - if (symbol->type->type == coff_function_type) - { - - - } - - } - */ - -static void -walk_tree_type (sfile, symbol, type, nest) - - struct - coff_sfile *sfile; - struct coff_symbol *symbol; - struct coff_type *type; - int nest; -{ - if (symbol->type->type == coff_function_type) - { - - struct IT_dty dty; - dty.end = 0; - dty.neg = 0x1001; - - sysroff_swap_dty_out (file, &dty); - walk_tree_type_1 (sfile, symbol, type, nest); - dty.end = 1; - sysroff_swap_dty_out (file, &dty); - - wr_dps_start (sfile, - symbol->where->section, - symbol->type->u.function.code, - BLOCK_TYPE_FUNCTION, nest); - wr_dps_start (sfile, symbol->where->section, - symbol->type->u.function.code, - BLOCK_TYPE_BLOCK, nest); - walk_tree_scope (symbol->where->section, - sfile, - symbol->type->u.function.code, - nest + 1, BLOCK_TYPE_BLOCK); - - wr_dps_end (symbol->where->section, - symbol->type->u.function.code, - BLOCK_TYPE_BLOCK); - wr_dps_end (symbol->where->section, - symbol->type->u.function.code, BLOCK_TYPE_FUNCTION); - - } - else - { - struct IT_dty dty; - dty.end = 0; - dty.neg = 0x1001; - sysroff_swap_dty_out (file, &dty); - walk_tree_type_1 (sfile, symbol, type, nest); - dty.end = 1; - sysroff_swap_dty_out (file, &dty); - } - -} - - - -static void -walk_tree_symbol (sfile, section, symbol, nest) - struct coff_sfile *sfile; - struct coff_section *section; - struct coff_symbol *symbol; - int nest; -{ - struct IT_dsy dsy; - - memset(&dsy, 0, sizeof(dsy)); - dsy.nesting = nest; - - switch (symbol->type->type) - { - case coff_function_type: - dsy.type = STYPE_FUNC; - dsy.assign = 1; - break; - case coff_structref_type: - case coff_pointer_type: - case coff_array_type: - case coff_basic_type: - case coff_enumref_type: - dsy.type = STYPE_VAR; - dsy.assign = 1; - break; - case coff_enumdef_type: - dsy.type = STYPE_TAG; - dsy.assign = 0; - dsy.magic = 2; - break; - case coff_structdef_type: - dsy.type = STYPE_TAG; - dsy.assign = 0; - dsy.magic = symbol->type->u.astructdef.isstruct ? 0 : 1; - break; - case coff_secdef_type: - return; - default: - abort (); - } - - if (symbol->where->where == coff_where_member_of_struct) - { - dsy.assign = 0; - dsy.type = STYPE_MEMBER; - } - if (symbol->where->where == coff_where_member_of_enum) - { - dsy.type = STYPE_ENUM; - dsy.assign = 0; - dsy.evallen = 4; - dsy.evalue = symbol->where->offset; - } - - if (symbol->type->type == coff_structdef_type - || symbol->where->where == coff_where_entag - || symbol->where->where == coff_where_strtag) - { - dsy.snumber = get_member_id (symbol->number); - } - else - { - dsy.snumber = get_ordinary_id (symbol->number); - } - - - dsy.sname = symbol->name[0] == '_' ? symbol->name + 1 : symbol->name; - - switch (symbol->visible->type) - { - case coff_vis_common: - case coff_vis_ext_def: - dsy.ainfo = AINFO_STATIC_EXT_DEF; - break; - case coff_vis_ext_ref: - dsy.ainfo = AINFO_STATIC_EXT_REF; - break; - case coff_vis_int_def: - dsy.ainfo = AINFO_STATIC_INT; - break; - case coff_vis_auto: - case coff_vis_autoparam: - dsy.ainfo = AINFO_AUTO; - break; - case coff_vis_register: - case coff_vis_regparam: - dsy.ainfo = AINFO_REG; - break; - break; - case coff_vis_tag: - case coff_vis_member_of_struct: - case coff_vis_member_of_enum: - break; - default: - abort (); - } - - dsy.dlength = symbol->type->size; - switch (symbol->where->where) - { - case coff_where_memory: - - dsy.section = symbol->where->section->number; -#ifdef FOOP - dsy.section = 0; -#endif - break; - case coff_where_member_of_struct: - case coff_where_member_of_enum: - case coff_where_stack: - case coff_where_register: - case coff_where_unknown: - case coff_where_strtag: - - case coff_where_entag: - case coff_where_typedef: - break; - default: - abort (); - } - - switch (symbol->where->where) - { - case coff_where_memory: - dsy.address = symbol->where->offset - find_base (sfile, symbol->where->section); - break; - case coff_where_stack: - dsy.address = symbol->where->offset; - break; - case coff_where_member_of_struct: - - - if (symbol->where->bitsize) - { - int bits = (symbol->where->offset * 8 + symbol->where->bitoffset); - dsy.bitunit = 1; - dsy.field_len = symbol->where->bitsize; - dsy.field_off = (bits / 32) * 4; - dsy.field_bitoff = bits % 32; - } - else - { - dsy.bitunit = 0; - - dsy.field_len = symbol->type->size; - dsy.field_off = symbol->where->offset; - } - break; - case coff_where_member_of_enum: - /* dsy.bitunit = 0; - dsy.field_len = symbol->type->size; - dsy.field_off = symbol->where->offset; */ - break; - case coff_where_register: - case coff_where_unknown: - case coff_where_strtag: - - case coff_where_entag: - case coff_where_typedef: - break; - default: - abort (); - } - - if (symbol->where->where == coff_where_register) - dsy.reg = rnames[symbol->where->offset]; - - switch (symbol->visible->type) - { - case coff_vis_common: - /* We do this 'cause common C symbols are treated as extdefs */ - case coff_vis_ext_def: - case coff_vis_ext_ref: - - dsy.ename = symbol->name; - break; - - case coff_vis_regparam: - case coff_vis_autoparam: - dsy.type = STYPE_PARAMETER; - break; - - case coff_vis_int_def: - - case coff_vis_auto: - case coff_vis_register: - case coff_vis_tag: - case coff_vis_member_of_struct: - case coff_vis_member_of_enum: - break; - default: - abort (); - } - - dsy.sfn = 0; - dsy.sln = 2; - - dsy.neg = 0x1001; - - - sysroff_swap_dsy_out (file, &dsy); - - walk_tree_type (sfile, symbol, symbol->type, nest); -} - - -static void -walk_tree_scope (section, sfile, scope, nest, type) - struct coff_section *section; - struct coff_sfile *sfile; - struct coff_scope *scope; - int nest; - int type; -{ - struct coff_symbol *vars; - struct coff_scope *child; - - if (scope->vars_head - || (scope->list_head && scope->list_head->vars_head)) - { - wr_dps_start (sfile, section, scope, type, nest); - - if (nest == 0) - wr_globals (tree, sfile, nest + 1); - - for (vars = scope->vars_head; vars; vars = vars->next) - { - walk_tree_symbol (sfile, section, vars, nest); - } - - for (child = scope->list_head; child; child = child->next) - { - walk_tree_scope (section, sfile, child, nest + 1, BLOCK_TYPE_BLOCK); - } - - wr_dps_end (section, scope, type); - } -} -static void -walk_tree_sfile (section, sfile) - struct coff_section *section; - struct coff_sfile *sfile; -{ - walk_tree_scope (section, sfile, sfile->scope, 0, BLOCK_TYPE_COMPUNIT); - -} - -static void -wr_program_structure (p, sfile) - struct coff_ofile *p; - struct coff_sfile *sfile; -{ - - walk_tree_sfile (p->sections + 4, sfile); - -} - -static void -wr_du (p, sfile, n) - struct coff_ofile *p; - struct coff_sfile *sfile; - int n; -{ - struct IT_du du; - int lim; -#if 0 - struct coff_symbol *symbol; - static int incit = 0x500000; - int used = 0; -#endif - int i; - int j; - unsigned int *lowest = (unsigned *) nints (p->nsections); - unsigned int *highest = (unsigned *) nints (p->nsections); - du.format = bfd_get_file_flags (abfd) & EXEC_P ? 0 : 1; - du.optimized = 0; - du.stackfrmt = 0; - du.spare = 0; - du.unit = n; - du.sections = p->nsections - 1; - du.san = (int *) xcalloc (sizeof (int), du.sections); - du.address = nints (du.sections); - du.length = nints (du.sections); - - for (i = 0; i < du.sections; i++) - { - lowest[i] = ~0; - highest[i] = 0; - } - - /* Look through all the symbols and try and work out the extents in this - source file */ -#if 0 - for (symbol = sfile->scope->vars_head; - symbol; - symbol = symbol->next) - { - if (symbol->type->type == coff_secdef_type) - { - unsigned int low = symbol->where->offset; - unsigned int high = symbol->where->offset + symbol->type->size - 1; - struct coff_section *section = symbol->where->section; - - int sn = section->number; - if (low < lowest[sn]) - lowest[sn] = low; - if (high > highest[sn]) - highest[sn] = high; - } - } - - - for (i = 0; i < du.sections; i++) - { - if (highest[i] == 0) - { - lowest[i] = highest[i] = incit; - } - du.san[used] = i; - du.length[used] = highest[i] - lowest[i]; - du.address[used] = bfd_get_file_flags (abfd) & EXEC_P ? lowest[i] : 0; - if (debug) - { - printf (" section %6s 0x%08x..0x%08x\n", - p->sections[i + 1].name, - lowest[i], - highest[i]); - } - used++; - } - -#endif - lim = du.sections; - for (j = 0; j < lim; j++) - { - int src = j; - int dst = j; - du.san[dst] = dst; - if (sfile->section[src].init) - { - du.length[dst] - = sfile->section[src].high - sfile->section[src].low + 1; - du.address[dst] - = sfile->section[src].low; - } - else - { - du.length[dst] = 0; - du.address[dst] = 0; - } - if (debug) - { - if (sfile->section[src].parent) - { - printf (" section %6s 0x%08x..0x%08x\n", - sfile->section[src].parent->name, - du.address[dst], - du.address[dst] + du.length[dst] - 1); - } - } - du.sections = dst + 1; - } - - du.tool = "c_gcc"; - du.date = DATE; - - sysroff_swap_du_out (file, &du); -} - -static void -wr_dus (p, sfile) - struct coff_ofile *p; - struct coff_sfile *sfile; -{ - - struct IT_dus dus; - - dus.efn = 0x1001; - dus.ns = 1; /* p->nsources; sac 14 jul 94 */ - dus.drb = nints (dus.ns); - dus.fname = (char **) xcalloc (sizeof (char *), dus.ns); - dus.spare = nints (dus.ns); - dus.ndir = 0; - /* Find the filenames */ -#if 0 - i = 0; - - for (sfile = p->source_head; - sfile; - sfile = sfile->next) - { - dus.drb[i] = 0; - dus.spare[i] = 0; - dus.fname[i] = sfile->name; - i++; - } -#else - dus.drb[0] = 0; - dus.fname[0] = sfile->name; -#endif - - sysroff_swap_dus_out (file, &dus); - -} - -/* Find the offset of the .text section for this sfile in the - .text section for the output file */ - -static int -find_base (sfile, section) - struct coff_sfile *sfile; - struct coff_section *section; -{ - return sfile->section[section->number].low; -} -static void -wr_dln (p, sfile, n) - struct coff_ofile *p; - struct coff_sfile *sfile; - int n; - -{ -#if 0 - if (n == 0) - { - /* Count up all the linenumbers */ - struct coff_symbol *sy; - int lc = 0; - struct IT_dln dln; - - int idx; - - for (sy = p->symbol_list_head; - sy; - sy = sy->next_in_ofile_list) - { - struct coff_type *t = sy->type; - if (t->type == coff_function_type) - { - struct coff_line *l = t->u.function.lines; - lc += l->nlines; - } - } - - dln.sfn = nints (lc); - dln.sln = nints (lc); - dln.lln = nints (lc); - dln.section = nints (lc); - - dln.from_address = nints (lc); - dln.to_address = nints (lc); - - - dln.neg = 0x1001; - - dln.nln = lc; - - /* Run through once more and fill up the structure */ - idx = 0; - for (sy = p->symbol_list_head; - sy; - sy = sy->next_in_ofile_list) - { - if (sy->type->type == coff_function_type) - { - int i; - struct coff_line *l = sy->type->u.function.lines; - for (i = 0; i < l->nlines; i++) - { - dln.section[idx] = sy->where->section->number; - dln.sfn[idx] = n; - dln.sln[idx] = l->lines[i]; - dln.from_address[idx] = l->addresses[i]; - if (idx) - dln.to_address[idx - 1] = dln.from_address[idx]; - idx++; - } - } - n++; - } - sysroff_swap_dln_out (file, &dln); - } - -#endif -#if 1 - /* Count up all the linenumbers */ - - struct coff_symbol *sy; - int lc = 0; - struct IT_dln dln; - - int idx; - - for (sy = sfile->scope->vars_head; - sy; - sy = sy->next) - { - struct coff_type *t = sy->type; - if (t->type == coff_function_type) - { - struct coff_line *l = t->u.function.lines; - if (l) - lc += l->nlines; - } - } - - dln.sfn = nints (lc); - dln.sln = nints (lc); - dln.cc = nints (lc); - dln.section = nints (lc); - - dln.from_address = nints (lc); - dln.to_address = nints (lc); - - - dln.neg = 0x1001; - - dln.nln = lc; - - /* Run through once more and fill up the structure */ - idx = 0; - for (sy = sfile->scope->vars_head; - sy; - sy = sy->next) - { - if (sy->type->type == coff_function_type) - { - int i; - struct coff_line *l = sy->type->u.function.lines; - if (l) - { - int base = find_base (sfile, sy->where->section); - for (i = 0; i < l->nlines; i++) - { - dln.section[idx] = sy->where->section->number; - dln.sfn[idx] = 0; - dln.sln[idx] = l->lines[i]; - dln.from_address[idx] = - l->addresses[i] + sy->where->section->address - base; - dln.cc[idx] = 0; - if (idx) - dln.to_address[idx - 1] = dln.from_address[idx]; - idx++; - - } - dln.to_address[idx - 1] = dln.from_address[idx - 1] + 2; - } - } - } - if (lc) - sysroff_swap_dln_out (file, &dln); -#endif -} - -/* Write the global symbols out to the debug info */ -static void -wr_globals (p, sfile, n) - struct coff_ofile *p; - struct coff_sfile *sfile; - int n; -{ - struct coff_symbol *sy; - for (sy = p->symbol_list_head; - sy; - sy = sy->next_in_ofile_list) - { - if (sy->visible->type == coff_vis_ext_def - || sy->visible->type == coff_vis_ext_ref) - { - /* Only write out symbols if they belong to - the current source file */ - if (sy->sfile == sfile) - walk_tree_symbol (sfile, 0, sy, 0); - - } - } -} - -static void -wr_debug (p) - struct coff_ofile *p; -{ - struct coff_sfile *sfile; - int n = 0; - for (sfile = p->source_head; - sfile; - sfile = sfile->next) - - { - if (debug) - { - printf ("%s\n", sfile->name); - } - wr_du (p, sfile, n); - wr_dus (p, sfile); - wr_program_structure (p, sfile); - wr_dln (p, sfile, n); - n++; - } -} - -static void -wr_cs () -{ - /* It seems that the CS struct is not normal - the size is wrong - heres one I prepared earlier.. */ - static char b[] = { - 0x80, /* IT */ - 0x21, /* RL */ - 0x00, /* number of chars in variable length part */ - 0x80, /* hd */ - 0x00, /* hs */ - 0x80, /* un */ - 0x00, /* us */ - 0x80, /* sc */ - 0x00, /* ss */ - 0x80, /* er */ - 0x80, /* ed */ - 0x80, /* sh */ - 0x80, /* ob */ - 0x80, /* rl */ - 0x80, /* du */ - 0x80, /* dps */ - 0x80, /* dsy */ - 0x80, /* dty */ - 0x80, /* dln */ - 0x80, /* dso */ - 0x80, /* dus */ - 0x00, /* dss */ - 0x80, /* dbt */ - 0x00, /* dpp */ - 0x80, /* dfp */ - 0x80, /* den */ - 0x80, /* dds */ - 0x80, /* dar */ - 0x80, /* dpt */ - 0x00, /* dul */ - 0x00, /* dse */ - 0x00, /* dot */ - 0xDE /* CS */ - }; - fwrite (b, 1, sizeof (b), file); -} - -/* Write out the SC records for a unit. Create an SC - for all the sections which appear in the output file, even - if there isn't an equivalent one on the input */ - -static int -wr_sc (ptr, sfile) - struct coff_ofile *ptr; - struct coff_sfile *sfile; -{ - int i; -int scount = 0; - /* First work out the total number of sections */ - - int total_sec = ptr->nsections; - - struct myinfo - { - struct coff_section *sec; - struct coff_symbol *symbol; - }; - struct coff_symbol *symbol; - - struct myinfo *info - = (struct myinfo *) calloc (total_sec, sizeof (struct myinfo)); - - - - for (i = 0; i < total_sec; i++) - { - info[i].sec = ptr->sections + i; - info[i].symbol = 0; - } - - for (symbol = sfile->scope->vars_head; - symbol; - symbol = symbol->next) - { - - if (symbol->type->type == coff_secdef_type) - { - for (i = 0; i < total_sec; i++) - { - if (symbol->where->section == info[i].sec) - { - info[i].symbol = symbol; - break; - } - } - } - } - - /* Now output all the section info, and fake up some stuff for sections - we don't have */ - - for (i = 1; i < total_sec; i++) - { - struct IT_sc sc; - char *name; - symbol = info[i].symbol; - sc.spare = 0; - sc.spare1 = 0; - if (!symbol) - { - /* Don't have a symbol set aside for this section, which means that nothing - in this file does anything for the section. */ - sc.format = !(bfd_get_file_flags (abfd) & EXEC_P); - sc.addr = 0; - sc.length = 0; - name = info[i].sec->name; - } - else - { - if (bfd_get_file_flags (abfd) & EXEC_P) - { - sc.format = 0; - sc.addr = symbol->where->offset; - } - else - { - sc.format = 1; - sc.addr = 0; - } - sc.length = symbol->type->size; - name = symbol->name; - } - - sc.align = 4; - - sc.concat = CONCAT_SIMPLE; - sc.read = 3; - sc.write = 3; - sc.exec = 3; - sc.init = 3; - sc.mode = 3; - sc.spare = 0; - sc.segadd = 0; - sc.spare1 = 0; /* If not zero, then it doesn't work */ - sc.name = section_translate (name); - if (strlen (sc.name) == 1) - { - switch (sc.name[0]) - { - case 'D': - case 'B': - sc.contents = CONTENTS_DATA; - break; - default: - sc.contents = CONTENTS_CODE; - } - } - else - { - sc.contents = CONTENTS_CODE; - } -#if 0 - /* NEW */ - if (sc.length) { -#endif - sysroff_swap_sc_out (file, &sc); - scount++; -#if 0 - } -#endif - } -return scount; -} - - -/* Write out the ER records for a unit. */ -static void -wr_er (ptr, sfile, first) - struct coff_ofile *ptr; - struct coff_sfile *sfile; - int first; -{ - int idx = 0; - struct coff_symbol *sym; - if (first) - { - for (sym = ptr->symbol_list_head; sym; sym = sym->next_in_ofile_list) - { - if (sym->visible->type == coff_vis_ext_ref) - { - struct IT_er er; - er.spare = 0; - er.type = ER_NOTSPEC; - er.name = sym->name; - sysroff_swap_er_out (file, &er); - sym->er_number = idx++; - } - } - } -} - -/* Write out the ED records for a unit. */ -static void -wr_ed (ptr, sfile, first) - struct coff_ofile *ptr; - struct coff_sfile *sfile; - int first; -{ - struct coff_symbol *s; - if (first) - { - for (s = ptr->symbol_list_head; s; s = s->next_in_ofile_list) - { - if (s->visible->type == coff_vis_ext_def - || s->visible->type == coff_vis_common) - { - struct IT_ed ed; - - ed.section = s->where->section->number; - ed.spare = 0; - if (s->where->section->data) - { - ed.type = ED_TYPE_DATA; - } - else if (s->where->section->code & SEC_CODE) - { - ed.type = ED_TYPE_ENTRY; - } - else - { - ed.type = ED_TYPE_NOTSPEC; - ed.type = ED_TYPE_DATA; - } - ed.address = s->where->offset - s->where->section->address; - ed.name = s->name; - sysroff_swap_ed_out (file, &ed); - } - } - } -} - -static void -wr_unit_info (ptr) - struct coff_ofile *ptr; -{ - struct coff_sfile *sfile; - int first = 1; - for (sfile = ptr->source_head; - sfile; - sfile = sfile->next) - { - long p1; - long p2; - int nsecs; - p1 = ftell (file); - wr_un (ptr, sfile, first, 0); - nsecs = wr_sc (ptr, sfile); - p2 = ftell (file); - fseek (file, p1, SEEK_SET); - wr_un (ptr, sfile, first, nsecs); - fseek (file, p2, SEEK_SET); - wr_er (ptr, sfile, first); - wr_ed (ptr, sfile, first); - first = 0; - } -} - -static void -wr_module (p) - struct coff_ofile *p; -{ - wr_cs (); - wr_hd (p); - wr_unit_info (p); - wr_object_body (p); - wr_debug (p); - wr_tr (); -} - -static int -align (x) - int x; -{ - return (x + 3) & ~3; -} - -/* Find all the common variables and turn them into - ordinary defs - dunno why, but thats what hitachi does with 'em */ - -static void -prescan (tree) - struct coff_ofile *tree; -{ - struct coff_symbol *s; - struct coff_section *common_section; - /* Find the common section - always section 3 */ - common_section = tree->sections + 3; - for (s = tree->symbol_list_head; - s; - s = s->next_in_ofile_list) - { - if (s->visible->type == coff_vis_common) - { - struct coff_where *w = s->where; - /* s->visible->type = coff_vis_ext_def; leave it as common */ - common_section->size = align (common_section->size); - w->offset = common_section->size + common_section->address; - w->section = common_section; - common_section->size += s->type->size; - common_section->size = align (common_section->size); - } - } -} - -char *program_name; - -static void -show_usage (file, status) - FILE *file; - int status; -{ - fprintf (file, _("Usage: %s [-dhVq] in-file [out-file]\n"), program_name); - exit (status); -} - -static void -show_help () -{ - printf (_("%s: Convert a COFF object file into a SYSROFF object file\n"), - program_name); - show_usage (stdout, 0); -} - - - -int -main (ac, av) - int ac; - char *av[]; -{ - int opt; - static struct option long_options[] = - { - {"debug", no_argument, 0, 'd'}, - {"quick", no_argument, 0, 'q'}, - {"noprescan", no_argument, 0, 'n'}, - {"help", no_argument, 0, 'h'}, - {"version", no_argument, 0, 'V'}, - {NULL, no_argument, 0, 0} - }; - char **matching; - char *input_file; - char *output_file; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = av[0]; - xmalloc_set_program_name (program_name); - - while ((opt = getopt_long (ac, av, "dhVqn", long_options, - (int *) NULL)) - != EOF) - { - switch (opt) - { - case 'q': - quick = 1; - break; - case 'n': - noprescan = 1; - break; - case 'd': - debug = 1; - break; - case 'h': - show_help (); - /*NOTREACHED */ - case 'V': - printf (_("GNU %s version %s\n"), program_name, PROGRAM_VERSION); - exit (0); - /*NOTREACHED */ - case 0: - break; - default: - show_usage (stderr, 1); - /*NOTREACHED */ - } - } - - /* The input and output files may be named on the command line. */ - output_file = NULL; - if (optind < ac) - { - input_file = av[optind]; - ++optind; - if (optind < ac) - { - output_file = av[optind]; - ++optind; - if (optind < ac) - show_usage (stderr, 1); - if (strcmp (input_file, output_file) == 0) - { - fatal (_("input and output files must be different")); - } - } - } - else - input_file = 0; - - if (!input_file) - { - fatal (_("no input file specified")); - } - - if (!output_file) - { - /* Take a .o off the input file and stick on a .obj. If - it doesn't end in .o, then stick a .obj on anyway */ - - int len = strlen (input_file); - output_file = xmalloc (len + 5); - strcpy (output_file, input_file); - if (len > 3 - && output_file[len - 2] == '.' - && output_file[len - 1] == 'o') - { - output_file[len] = 'b'; - output_file[len + 1] = 'j'; - output_file[len + 2] = 0; - } - else - { - strcat (output_file, ".obj"); - } - } - - abfd = bfd_openr (input_file, 0); - - if (!abfd) - bfd_fatal (input_file); - - if (!bfd_check_format_matches (abfd, bfd_object, &matching)) - { - bfd_nonfatal (input_file); - if (bfd_get_error () == bfd_error_file_ambiguously_recognized) - { - list_matching_formats (matching); - free (matching); - } - exit (1); - } - - file = fopen (output_file, FOPEN_WB); - - if (!file) - { - fatal (_("unable to open output file %s"), output_file); - } - - if (debug) - printf ("ids %d %d\n", base1, base2); - tree = coff_grok (abfd); - if (!noprescan) - prescan (tree); - wr_module (tree); - return 0; -} diff --git a/binutils/stabs.c b/binutils/stabs.c deleted file mode 100644 index 8c20ed308e1..00000000000 --- a/binutils/stabs.c +++ /dev/null @@ -1,5209 +0,0 @@ -/* stabs.c -- Parse stabs debugging information - Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. - Written by Ian Lance Taylor . - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file contains code which parses stabs debugging information. - The organization of this code is based on the gdb stabs reading - code. The job it does is somewhat different, because it is not - trying to identify the correct address for anything. */ - -#include -#include - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "demangle.h" -#include "debug.h" -#include "budbg.h" - -/* Meaningless definition needs by aout64.h. FIXME. */ -#define BYTES_IN_WORD 4 - -#include "aout/aout64.h" -#include "aout/stab_gnu.h" - -#ifndef DIR_SEPARATOR -#ifdef _WIN32 -#define DIR_SEPARATOR '\\' -#else -#define DIR_SEPARATOR '/' -#endif -#endif - -/* The number of predefined XCOFF types. */ - -#define XCOFF_TYPE_COUNT 34 - -/* This structure is used as a handle so that the stab parsing doesn't - need to use any static variables. */ - -struct stab_handle -{ - /* The BFD. */ - bfd *abfd; - /* True if this is stabs in sections. */ - boolean sections; - /* The symbol table. */ - asymbol **syms; - /* The number of symbols. */ - long symcount; - /* The accumulated file name string. */ - char *so_string; - /* The value of the last N_SO symbol. */ - bfd_vma so_value; - /* The value of the start of the file, so that we can handle file - relative N_LBRAC and N_RBRAC symbols. */ - bfd_vma file_start_offset; - /* The offset of the start of the function, so that we can handle - function relative N_LBRAC and N_RBRAC symbols. */ - bfd_vma function_start_offset; - /* The version number of gcc which compiled the current compilation - unit, 0 if not compiled by gcc. */ - int gcc_compiled; - /* Whether an N_OPT symbol was seen that was not generated by gcc, - so that we can detect the SunPRO compiler. */ - boolean n_opt_found; - /* The main file name. */ - char *main_filename; - /* A stack of unfinished N_BINCL files. */ - struct bincl_file *bincl_stack; - /* A list of finished N_BINCL files. */ - struct bincl_file *bincl_list; - /* Whether we are inside a function or not. */ - boolean within_function; - /* The address of the end of the function, used if we have seen an - N_FUN symbol while in a function. This is -1 if we have not seen - an N_FUN (the normal case). */ - bfd_vma function_end; - /* The depth of block nesting. */ - int block_depth; - /* List of pending variable definitions. */ - struct stab_pending_var *pending; - /* Number of files for which we have types. */ - unsigned int files; - /* Lists of types per file. */ - struct stab_types **file_types; - /* Predefined XCOFF types. */ - debug_type xcoff_types[XCOFF_TYPE_COUNT]; - /* Undefined tags. */ - struct stab_tag *tags; - /* Set by parse_stab_type if it sees a structure defined as a cross - reference to itself. Reset by parse_stab_type otherwise. */ - boolean self_crossref; -}; - -/* A list of these structures is used to hold pending variable - definitions seen before the N_LBRAC of a block. */ - -struct stab_pending_var -{ - /* Next pending variable definition. */ - struct stab_pending_var *next; - /* Name. */ - const char *name; - /* Type. */ - debug_type type; - /* Kind. */ - enum debug_var_kind kind; - /* Value. */ - bfd_vma val; -}; - -/* A list of these structures is used to hold the types for a single - file. */ - -struct stab_types -{ - /* Next set of slots for this file. */ - struct stab_types *next; - /* Types indexed by type number. */ -#define STAB_TYPES_SLOTS (16) - debug_type types[STAB_TYPES_SLOTS]; -}; - -/* We keep a list of undefined tags that we encounter, so that we can - fill them in if the tag is later defined. */ - -struct stab_tag -{ - /* Next undefined tag. */ - struct stab_tag *next; - /* Tag name. */ - const char *name; - /* Type kind. */ - enum debug_type_kind kind; - /* Slot to hold real type when we discover it. If we don't, we fill - in an undefined tag type. */ - debug_type slot; - /* Indirect type we have created to point at slot. */ - debug_type type; -}; - -static char *savestring PARAMS ((const char *, int)); -static bfd_vma parse_number PARAMS ((const char **, boolean *)); -static void bad_stab PARAMS ((const char *)); -static void warn_stab PARAMS ((const char *, const char *)); -static boolean parse_stab_string - PARAMS ((PTR, struct stab_handle *, int, int, bfd_vma, const char *)); -static debug_type parse_stab_type - PARAMS ((PTR, struct stab_handle *, const char *, const char **, - debug_type **)); -static boolean parse_stab_type_number - PARAMS ((const char **, int *)); -static debug_type parse_stab_range_type - PARAMS ((PTR, struct stab_handle *, const char *, const char **, - const int *)); -static debug_type parse_stab_sun_builtin_type PARAMS ((PTR, const char **)); -static debug_type parse_stab_sun_floating_type - PARAMS ((PTR, const char **)); -static debug_type parse_stab_enum_type PARAMS ((PTR, const char **)); -static debug_type parse_stab_struct_type - PARAMS ((PTR, struct stab_handle *, const char *, const char **, boolean, - const int *)); -static boolean parse_stab_baseclasses - PARAMS ((PTR, struct stab_handle *, const char **, debug_baseclass **)); -static boolean parse_stab_struct_fields - PARAMS ((PTR, struct stab_handle *, const char **, debug_field **, - boolean *)); -static boolean parse_stab_cpp_abbrev - PARAMS ((PTR, struct stab_handle *, const char **, debug_field *)); -static boolean parse_stab_one_struct_field - PARAMS ((PTR, struct stab_handle *, const char **, const char *, - debug_field *, boolean *)); -static boolean parse_stab_members - PARAMS ((PTR, struct stab_handle *, const char *, const char **, - const int *, debug_method **)); -static debug_type parse_stab_argtypes - PARAMS ((PTR, struct stab_handle *, debug_type, const char *, const char *, - debug_type, const char *, boolean, boolean, const char **)); -static boolean parse_stab_tilde_field - PARAMS ((PTR, struct stab_handle *, const char **, const int *, - debug_type *, boolean *)); -static debug_type parse_stab_array_type - PARAMS ((PTR, struct stab_handle *, const char **, boolean)); -static void push_bincl PARAMS ((struct stab_handle *, const char *, bfd_vma)); -static const char *pop_bincl PARAMS ((struct stab_handle *)); -static boolean find_excl - PARAMS ((struct stab_handle *, const char *, bfd_vma)); -static boolean stab_record_variable - PARAMS ((PTR, struct stab_handle *, const char *, debug_type, - enum debug_var_kind, bfd_vma)); -static boolean stab_emit_pending_vars PARAMS ((PTR, struct stab_handle *)); -static debug_type *stab_find_slot - PARAMS ((struct stab_handle *, const int *)); -static debug_type stab_find_type - PARAMS ((PTR, struct stab_handle *, const int *)); -static boolean stab_record_type - PARAMS ((PTR, struct stab_handle *, const int *, debug_type)); -static debug_type stab_xcoff_builtin_type - PARAMS ((PTR, struct stab_handle *, int)); -static debug_type stab_find_tagged_type - PARAMS ((PTR, struct stab_handle *, const char *, int, - enum debug_type_kind)); -static debug_type *stab_demangle_argtypes - PARAMS ((PTR, struct stab_handle *, const char *, boolean *)); - -/* Save a string in memory. */ - -static char * -savestring (start, len) - const char *start; - int len; -{ - char *ret; - - ret = (char *) xmalloc (len + 1); - memcpy (ret, start, len); - ret[len] = '\0'; - return ret; -} - -/* Read a number from a string. */ - -static bfd_vma -parse_number (pp, poverflow) - const char **pp; - boolean *poverflow; -{ - unsigned long ul; - const char *orig; - - if (poverflow != NULL) - *poverflow = false; - - orig = *pp; - - errno = 0; - ul = strtoul (*pp, (char **) pp, 0); - if (ul + 1 != 0 || errno == 0) - { - /* If bfd_vma is larger than unsigned long, and the number is - meant to be negative, we have to make sure that we sign - extend properly. */ - if (*orig == '-') - return (bfd_vma) (bfd_signed_vma) (long) ul; - return (bfd_vma) ul; - } - - /* Note that even though strtoul overflowed, it should have set *pp - to the end of the number, which is where we want it. */ - - if (sizeof (bfd_vma) > sizeof (unsigned long)) - { - const char *p; - boolean neg; - int base; - bfd_vma over, lastdig; - boolean overflow; - bfd_vma v; - - /* Our own version of strtoul, for a bfd_vma. */ - - p = orig; - - neg = false; - if (*p == '+') - ++p; - else if (*p == '-') - { - neg = true; - ++p; - } - - base = 10; - if (*p == '0') - { - if (p[1] == 'x' || p[1] == 'X') - { - base = 16; - p += 2; - } - else - { - base = 8; - ++p; - } - } - - over = ((bfd_vma) (bfd_signed_vma) -1) / (bfd_vma) base; - lastdig = ((bfd_vma) (bfd_signed_vma) -1) % (bfd_vma) base; - - overflow = false; - v = 0; - while (1) - { - int d; - - d = *p++; - if (isdigit ((unsigned char) d)) - d -= '0'; - else if (isupper ((unsigned char) d)) - d -= 'A'; - else if (islower ((unsigned char) d)) - d -= 'a'; - else - break; - - if (d >= base) - break; - - if (v > over || (v == over && (bfd_vma) d > lastdig)) - { - overflow = true; - break; - } - } - - if (! overflow) - { - if (neg) - v = - v; - return v; - } - } - - /* If we get here, the number is too large to represent in a - bfd_vma. */ - - if (poverflow != NULL) - *poverflow = true; - else - warn_stab (orig, _("numeric overflow")); - - return 0; -} - -/* Give an error for a bad stab string. */ - -static void -bad_stab (p) - const char *p; -{ - fprintf (stderr, _("Bad stab: %s\n"), p); -} - -/* Warn about something in a stab string. */ - -static void -warn_stab (p, err) - const char *p; - const char *err; -{ - fprintf (stderr, _("Warning: %s: %s\n"), err, p); -} - -/* Create a handle to parse stabs symbols with. */ - -/*ARGSUSED*/ -PTR -start_stab (dhandle, abfd, sections, syms, symcount) - PTR dhandle ATTRIBUTE_UNUSED; - bfd *abfd; - boolean sections; - asymbol **syms; - long symcount; -{ - struct stab_handle *ret; - - ret = (struct stab_handle *) xmalloc (sizeof *ret); - memset (ret, 0, sizeof *ret); - ret->abfd = abfd; - ret->sections = sections; - ret->syms = syms; - ret->symcount = symcount; - ret->files = 1; - ret->file_types = (struct stab_types **) xmalloc (sizeof *ret->file_types); - ret->file_types[0] = NULL; - ret->function_end = (bfd_vma) -1; - return (PTR) ret; -} - -/* When we have processed all the stabs information, we need to go - through and fill in all the undefined tags. */ - -boolean -finish_stab (dhandle, handle) - PTR dhandle; - PTR handle; -{ - struct stab_handle *info = (struct stab_handle *) handle; - struct stab_tag *st; - - if (info->within_function) - { - if (! stab_emit_pending_vars (dhandle, info) - || ! debug_end_function (dhandle, info->function_end)) - return false; - info->within_function = false; - info->function_end = (bfd_vma) -1; - } - - for (st = info->tags; st != NULL; st = st->next) - { - enum debug_type_kind kind; - - kind = st->kind; - if (kind == DEBUG_KIND_ILLEGAL) - kind = DEBUG_KIND_STRUCT; - st->slot = debug_make_undefined_tagged_type (dhandle, st->name, kind); - if (st->slot == DEBUG_TYPE_NULL) - return false; - } - - return true; -} - -/* Handle a single stabs symbol. */ - -boolean -parse_stab (dhandle, handle, type, desc, value, string) - PTR dhandle; - PTR handle; - int type; - int desc; - bfd_vma value; - const char *string; -{ - struct stab_handle *info = (struct stab_handle *) handle; - - /* gcc will emit two N_SO strings per compilation unit, one for the - directory name and one for the file name. We just collect N_SO - strings as we see them, and start the new compilation unit when - we see a non N_SO symbol. */ - if (info->so_string != NULL - && (type != N_SO || *string == '\0' || value != info->so_value)) - { - if (! debug_set_filename (dhandle, info->so_string)) - return false; - info->main_filename = info->so_string; - - info->gcc_compiled = 0; - info->n_opt_found = false; - - /* Generally, for stabs in the symbol table, the N_LBRAC and - N_RBRAC symbols are relative to the N_SO symbol value. */ - if (! info->sections) - info->file_start_offset = info->so_value; - - /* We need to reset the mapping from type numbers to types. We - can't free the old mapping, because of the use of - debug_make_indirect_type. */ - info->files = 1; - info->file_types = ((struct stab_types **) - xmalloc (sizeof *info->file_types)); - info->file_types[0] = NULL; - - info->so_string = NULL; - - /* Now process whatever type we just got. */ - } - - switch (type) - { - case N_FN: - case N_FN_SEQ: - break; - - case N_LBRAC: - /* Ignore extra outermost context from SunPRO cc and acc. */ - if (info->n_opt_found && desc == 1) - break; - - if (! info->within_function) - { - fprintf (stderr, _("N_LBRAC not within function\n")); - return false; - } - - /* Start an inner lexical block. */ - if (! debug_start_block (dhandle, - (value - + info->file_start_offset - + info->function_start_offset))) - return false; - - /* Emit any pending variable definitions. */ - if (! stab_emit_pending_vars (dhandle, info)) - return false; - - ++info->block_depth; - break; - - case N_RBRAC: - /* Ignore extra outermost context from SunPRO cc and acc. */ - if (info->n_opt_found && desc == 1) - break; - - /* We shouldn't have any pending variable definitions here, but, - if we do, we probably need to emit them before closing the - block. */ - if (! stab_emit_pending_vars (dhandle, info)) - return false; - - /* End an inner lexical block. */ - if (! debug_end_block (dhandle, - (value - + info->file_start_offset - + info->function_start_offset))) - return false; - - --info->block_depth; - if (info->block_depth < 0) - { - fprintf (stderr, _("Too many N_RBRACs\n")); - return false; - } - break; - - case N_SO: - /* This always ends a function. */ - if (info->within_function) - { - bfd_vma endval; - - endval = value; - if (*string != '\0' - && info->function_end != (bfd_vma) -1 - && info->function_end < endval) - endval = info->function_end; - if (! stab_emit_pending_vars (dhandle, info) - || ! debug_end_function (dhandle, endval)) - return false; - info->within_function = false; - info->function_end = (bfd_vma) -1; - } - - /* An empty string is emitted by gcc at the end of a compilation - unit. */ - if (*string == '\0') - return true; - - /* Just accumulate strings until we see a non N_SO symbol. If - the string starts with a directory separator or some other - form of absolute path specification, we discard the previously - accumulated strings. */ - if (info->so_string == NULL) - info->so_string = xstrdup (string); - else - { - char *f; - - f = info->so_string; - - if ( (string[0] == '/') - || (string[0] == DIR_SEPARATOR) - || ( (DIR_SEPARATOR == '\\') - && (string[1] == ':') - && ( (string[2] == DIR_SEPARATOR) - || (string[2] == '/')))) - info->so_string = xstrdup (string); - else - info->so_string = concat (info->so_string, string, - (const char *) NULL); - free (f); - } - - info->so_value = value; - - break; - - case N_SOL: - /* Start an include file. */ - if (! debug_start_source (dhandle, string)) - return false; - break; - - case N_BINCL: - /* Start an include file which may be replaced. */ - push_bincl (info, string, value); - if (! debug_start_source (dhandle, string)) - return false; - break; - - case N_EINCL: - /* End an N_BINCL include. */ - if (! debug_start_source (dhandle, pop_bincl (info))) - return false; - break; - - case N_EXCL: - /* This is a duplicate of a header file named by N_BINCL which - was eliminated by the linker. */ - if (! find_excl (info, string, value)) - return false; - break; - - case N_SLINE: - if (! debug_record_line (dhandle, desc, - value + info->function_start_offset)) - return false; - break; - - case N_BCOMM: - if (! debug_start_common_block (dhandle, string)) - return false; - break; - - case N_ECOMM: - if (! debug_end_common_block (dhandle, string)) - return false; - break; - - case N_FUN: - if (*string == '\0') - { - if (info->within_function) - { - /* This always marks the end of a function; we don't - need to worry about info->function_end. */ - if (info->sections) - value += info->function_start_offset; - if (! stab_emit_pending_vars (dhandle, info) - || ! debug_end_function (dhandle, value)) - return false; - info->within_function = false; - info->function_end = (bfd_vma) -1; - } - break; - } - - /* A const static symbol in the .text section will have an N_FUN - entry. We need to use these to mark the end of the function, - in case we are looking at gcc output before it was changed to - always emit an empty N_FUN. We can't call debug_end_function - here, because it might be a local static symbol. */ - if (info->within_function - && (info->function_end == (bfd_vma) -1 - || value < info->function_end)) - info->function_end = value; - - /* Fall through. */ - /* FIXME: gdb checks the string for N_STSYM, N_LCSYM or N_ROSYM - symbols, and if it does not start with :S, gdb relocates the - value to the start of the section. gcc always seems to use - :S, so we don't worry about this. */ - /* Fall through. */ - default: - { - const char *colon; - - colon = strchr (string, ':'); - if (colon != NULL - && (colon[1] == 'f' || colon[1] == 'F')) - { - if (info->within_function) - { - bfd_vma endval; - - endval = value; - if (info->function_end != (bfd_vma) -1 - && info->function_end < endval) - endval = info->function_end; - if (! stab_emit_pending_vars (dhandle, info) - || ! debug_end_function (dhandle, endval)) - return false; - info->function_end = (bfd_vma) -1; - } - /* For stabs in sections, line numbers and block addresses - are offsets from the start of the function. */ - if (info->sections) - info->function_start_offset = value; - info->within_function = true; - } - - if (! parse_stab_string (dhandle, info, type, desc, value, string)) - return false; - } - break; - - case N_OPT: - if (string != NULL && strcmp (string, "gcc2_compiled.") == 0) - info->gcc_compiled = 2; - else if (string != NULL && strcmp (string, "gcc_compiled.") == 0) - info->gcc_compiled = 1; - else - info->n_opt_found = true; - break; - - case N_OBJ: - case N_ENDM: - case N_MAIN: - break; - } - - return true; -} - -/* Parse the stabs string. */ - -static boolean -parse_stab_string (dhandle, info, stabtype, desc, value, string) - PTR dhandle; - struct stab_handle *info; - int stabtype; - int desc; - bfd_vma value; - const char *string; -{ - const char *p; - char *name; - int type; - debug_type dtype; - boolean synonym; - boolean self_crossref; - unsigned int lineno; - debug_type *slot; - - p = strchr (string, ':'); - if (p == NULL) - return true; - - while (p[1] == ':') - { - p += 2; - p = strchr (p, ':'); - if (p == NULL) - { - bad_stab (string); - return false; - } - } - - /* GCC 2.x puts the line number in desc. SunOS apparently puts in - the number of bytes occupied by a type or object, which we - ignore. */ - if (info->gcc_compiled >= 2) - lineno = desc; - else - lineno = 0; - - /* FIXME: Sometimes the special C++ names start with '.'. */ - name = NULL; - if (string[0] == '$') - { - switch (string[1]) - { - case 't': - name = "this"; - break; - case 'v': - /* Was: name = "vptr"; */ - break; - case 'e': - name = "eh_throw"; - break; - case '_': - /* This was an anonymous type that was never fixed up. */ - break; - case 'X': - /* SunPRO (3.0 at least) static variable encoding. */ - break; - default: - warn_stab (string, _("unknown C++ encoded name")); - break; - } - } - - if (name == NULL) - { - if (p == string || (string[0] == ' ' && p == string + 1)) - name = NULL; - else - name = savestring (string, p - string); - } - - ++p; - if (isdigit ((unsigned char) *p) || *p == '(' || *p == '-') - type = 'l'; - else - type = *p++; - - switch (type) - { - case 'c': - /* c is a special case, not followed by a type-number. - SYMBOL:c=iVALUE for an integer constant symbol. - SYMBOL:c=rVALUE for a floating constant symbol. - SYMBOL:c=eTYPE,INTVALUE for an enum constant symbol. - e.g. "b:c=e6,0" for "const b = blob1" - (where type 6 is defined by "blobs:t6=eblob1:0,blob2:1,;"). */ - if (*p != '=') - { - bad_stab (string); - return false; - } - ++p; - switch (*p++) - { - case 'r': - /* Floating point constant. */ - if (! debug_record_float_const (dhandle, name, atof (p))) - return false; - break; - case 'i': - /* Integer constant. */ - /* Defining integer constants this way is kind of silly, - since 'e' constants allows the compiler to give not only - the value, but the type as well. C has at least int, - long, unsigned int, and long long as constant types; - other languages probably should have at least unsigned as - well as signed constants. */ - if (! debug_record_int_const (dhandle, name, atoi (p))) - return false; - break; - case 'e': - /* SYMBOL:c=eTYPE,INTVALUE for a constant symbol whose value - can be represented as integral. - e.g. "b:c=e6,0" for "const b = blob1" - (where type 6 is defined by "blobs:t6=eblob1:0,blob2:1,;"). */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, - &p, (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (*p != ',') - { - bad_stab (string); - return false; - } - if (! debug_record_typed_const (dhandle, name, dtype, atoi (p))) - return false; - break; - default: - bad_stab (string); - return false; - } - - break; - - case 'C': - /* The name of a caught exception. */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, - &p, (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (! debug_record_label (dhandle, name, dtype, value)) - return false; - break; - - case 'f': - case 'F': - /* A function definition. */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (! debug_record_function (dhandle, name, dtype, type == 'F', value)) - return false; - - /* Sun acc puts declared types of arguments here. We don't care - about their actual types (FIXME -- we should remember the whole - function prototype), but the list may define some new types - that we have to remember, so we must scan it now. */ - while (*p == ';') - { - ++p; - if (parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL) - == DEBUG_TYPE_NULL) - return false; - } - - break; - - case 'G': - { - char leading; - long c; - asymbol **ps; - - /* A global symbol. The value must be extracted from the - symbol table. */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - leading = bfd_get_symbol_leading_char (info->abfd); - for (c = info->symcount, ps = info->syms; c > 0; --c, ++ps) - { - const char *n; - - n = bfd_asymbol_name (*ps); - if (leading != '\0' && *n == leading) - ++n; - if (*n == *name && strcmp (n, name) == 0) - break; - } - if (c > 0) - value = bfd_asymbol_value (*ps); - if (! stab_record_variable (dhandle, info, name, dtype, DEBUG_GLOBAL, - value)) - return false; - } - break; - - /* This case is faked by a conditional above, when there is no - code letter in the dbx data. Dbx data never actually - contains 'l'. */ - case 'l': - case 's': - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (! stab_record_variable (dhandle, info, name, dtype, DEBUG_LOCAL, - value)) - return false; - break; - - case 'p': - /* A function parameter. */ - if (*p != 'F') - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - else - { - /* pF is a two-letter code that means a function parameter in - Fortran. The type-number specifies the type of the return - value. Translate it into a pointer-to-function type. */ - ++p; - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype != DEBUG_TYPE_NULL) - { - debug_type ftype; - - ftype = debug_make_function_type (dhandle, dtype, - (debug_type *) NULL, false); - dtype = debug_make_pointer_type (dhandle, ftype); - } - } - if (dtype == DEBUG_TYPE_NULL) - return false; - if (! debug_record_parameter (dhandle, name, dtype, DEBUG_PARM_STACK, - value)) - return false; - - /* FIXME: At this point gdb considers rearranging the parameter - address on a big endian machine if it is smaller than an int. - We have no way to do that, since we don't really know much - about the target. */ - - break; - - case 'P': - if (stabtype == N_FUN) - { - /* Prototype of a function referenced by this file. */ - while (*p == ';') - { - ++p; - if (parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL) - == DEBUG_TYPE_NULL) - return false; - } - break; - } - /* Fall through. */ - case 'R': - /* Parameter which is in a register. */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (! debug_record_parameter (dhandle, name, dtype, DEBUG_PARM_REG, - value)) - return false; - break; - - case 'r': - /* Register variable (either global or local). */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (! stab_record_variable (dhandle, info, name, dtype, DEBUG_REGISTER, - value)) - return false; - - /* FIXME: At this point gdb checks to combine pairs of 'p' and - 'r' stabs into a single 'P' stab. */ - - break; - - case 'S': - /* Static symbol at top level of file */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (! stab_record_variable (dhandle, info, name, dtype, DEBUG_STATIC, - value)) - return false; - break; - - case 't': - /* A typedef. */ - dtype = parse_stab_type (dhandle, info, name, &p, &slot); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (name == NULL) - { - /* A nameless type. Nothing to do. */ - return true; - } - - dtype = debug_name_type (dhandle, name, dtype); - if (dtype == DEBUG_TYPE_NULL) - return false; - - if (slot != NULL) - *slot = dtype; - - break; - - case 'T': - /* Struct, union, or enum tag. For GNU C++, this can be be followed - by 't' which means we are typedef'ing it as well. */ - if (*p != 't') - { - synonym = false; - /* FIXME: gdb sets synonym to true if the current language - is C++. */ - } - else - { - synonym = true; - ++p; - } - - dtype = parse_stab_type (dhandle, info, name, &p, &slot); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (name == NULL) - return true; - - /* INFO->SELF_CROSSREF is set by parse_stab_type if this type is - a cross reference to itself. These are generated by some - versions of g++. */ - self_crossref = info->self_crossref; - - dtype = debug_tag_type (dhandle, name, dtype); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (slot != NULL) - *slot = dtype; - - /* See if we have a cross reference to this tag which we can now - fill in. Avoid filling in a cross reference to ourselves, - because that would lead to circular debugging information. */ - if (! self_crossref) - { - register struct stab_tag **pst; - - for (pst = &info->tags; *pst != NULL; pst = &(*pst)->next) - { - if ((*pst)->name[0] == name[0] - && strcmp ((*pst)->name, name) == 0) - { - (*pst)->slot = dtype; - *pst = (*pst)->next; - break; - } - } - } - - if (synonym) - { - dtype = debug_name_type (dhandle, name, dtype); - if (dtype == DEBUG_TYPE_NULL) - return false; - - if (slot != NULL) - *slot = dtype; - } - - break; - - case 'V': - /* Static symbol of local scope */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - /* FIXME: gdb checks os9k_stabs here. */ - if (! stab_record_variable (dhandle, info, name, dtype, - DEBUG_LOCAL_STATIC, value)) - return false; - break; - - case 'v': - /* Reference parameter. */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (! debug_record_parameter (dhandle, name, dtype, DEBUG_PARM_REFERENCE, - value)) - return false; - break; - - case 'a': - /* Reference parameter which is in a register. */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (! debug_record_parameter (dhandle, name, dtype, DEBUG_PARM_REF_REG, - value)) - return false; - break; - - case 'X': - /* This is used by Sun FORTRAN for "function result value". - Sun claims ("dbx and dbxtool interfaces", 2nd ed) - that Pascal uses it too, but when I tried it Pascal used - "x:3" (local symbol) instead. */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p, - (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return false; - if (! stab_record_variable (dhandle, info, name, dtype, DEBUG_LOCAL, - value)) - return false; - break; - - default: - bad_stab (string); - return false; - } - - /* FIXME: gdb converts structure values to structure pointers in a - couple of cases, depending upon the target. */ - - return true; -} - -/* Parse a stabs type. The typename argument is non-NULL if this is a - typedef or a tag definition. The pp argument points to the stab - string, and is updated. The slotp argument points to a place to - store the slot used if the type is being defined. */ - -static debug_type -parse_stab_type (dhandle, info, typename, pp, slotp) - PTR dhandle; - struct stab_handle *info; - const char *typename; - const char **pp; - debug_type **slotp; -{ - const char *orig; - int typenums[2]; - int size; - boolean stringp; - int descriptor; - debug_type dtype; - - if (slotp != NULL) - *slotp = NULL; - - orig = *pp; - - size = -1; - stringp = false; - - info->self_crossref = false; - - /* Read type number if present. The type number may be omitted. - for instance in a two-dimensional array declared with type - "ar1;1;10;ar1;1;10;4". */ - if (! isdigit ((unsigned char) **pp) && **pp != '(' && **pp != '-') - { - /* 'typenums=' not present, type is anonymous. Read and return - the definition, but don't put it in the type vector. */ - typenums[0] = typenums[1] = -1; - } - else - { - if (! parse_stab_type_number (pp, typenums)) - return DEBUG_TYPE_NULL; - - if (**pp != '=') - { - /* Type is not being defined here. Either it already - exists, or this is a forward reference to it. */ - return stab_find_type (dhandle, info, typenums); - } - - /* Only set the slot if the type is being defined. This means - that the mapping from type numbers to types will only record - the name of the typedef which defines a type. If we don't do - this, then something like - typedef int foo; - int i; - will record that i is of type foo. Unfortunately, stabs - information is ambiguous about variable types. For this code, - typedef int foo; - int i; - foo j; - the stabs information records both i and j as having the same - type. This could be fixed by patching the compiler. */ - if (slotp != NULL && typenums[0] >= 0 && typenums[1] >= 0) - *slotp = stab_find_slot (info, typenums); - - /* Type is being defined here. */ - /* Skip the '='. */ - ++*pp; - - while (**pp == '@') - { - const char *p = *pp + 1; - const char *attr; - - if (isdigit ((unsigned char) *p) || *p == '(' || *p == '-') - { - /* Member type. */ - break; - } - - /* Type attributes. */ - attr = p; - - for (; *p != ';'; ++p) - { - if (*p == '\0') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - } - *pp = p + 1; - - switch (*attr) - { - case 's': - size = atoi (attr + 1); - if (size <= 0) - size = -1; - break; - - case 'S': - stringp = true; - break; - - default: - /* Ignore unrecognized type attributes, so future - compilers can invent new ones. */ - break; - } - } - } - - descriptor = **pp; - ++*pp; - - switch (descriptor) - { - case 'x': - { - enum debug_type_kind code; - const char *q1, *q2, *p; - - /* A cross reference to another type. */ - - switch (**pp) - { - case 's': - code = DEBUG_KIND_STRUCT; - break; - case 'u': - code = DEBUG_KIND_UNION; - break; - case 'e': - code = DEBUG_KIND_ENUM; - break; - default: - /* Complain and keep going, so compilers can invent new - cross-reference types. */ - warn_stab (orig, _("unrecognized cross reference type")); - code = DEBUG_KIND_STRUCT; - break; - } - ++*pp; - - q1 = strchr (*pp, '<'); - p = strchr (*pp, ':'); - if (p == NULL) - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - if (q1 != NULL && p > q1 && p[1] == ':') - { - int nest = 0; - - for (q2 = q1; *q2 != '\0'; ++q2) - { - if (*q2 == '<') - ++nest; - else if (*q2 == '>') - --nest; - else if (*q2 == ':' && nest == 0) - break; - } - p = q2; - if (*p != ':') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - } - - /* Some versions of g++ can emit stabs like - fleep:T20=xsfleep: - which define structures in terms of themselves. We need to - tell the caller to avoid building a circular structure. */ - if (typename != NULL - && strncmp (typename, *pp, p - *pp) == 0 - && typename[p - *pp] == '\0') - info->self_crossref = true; - - dtype = stab_find_tagged_type (dhandle, info, *pp, p - *pp, code); - - *pp = p + 1; - } - break; - - case '-': - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '(': - { - const char *hold; - int xtypenums[2]; - - /* This type is defined as another type. */ - - (*pp)--; - hold = *pp; - - /* Peek ahead at the number to detect void. */ - if (! parse_stab_type_number (pp, xtypenums)) - return DEBUG_TYPE_NULL; - - if (typenums[0] == xtypenums[0] && typenums[1] == xtypenums[1]) - { - /* This type is being defined as itself, which means that - it is void. */ - dtype = debug_make_void_type (dhandle); - } - else - { - *pp = hold; - - /* Go back to the number and have parse_stab_type get it. - This means that we can deal with something like - t(1,2)=(3,4)=... which the Lucid compiler uses. */ - dtype = parse_stab_type (dhandle, info, (const char *) NULL, - pp, (debug_type **) NULL); - if (dtype == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - } - - if (typenums[0] != -1) - { - if (! stab_record_type (dhandle, info, typenums, dtype)) - return DEBUG_TYPE_NULL; - } - - break; - } - - case '*': - dtype = debug_make_pointer_type (dhandle, - parse_stab_type (dhandle, info, - (const char *) NULL, - pp, - (debug_type **) NULL)); - break; - - case '&': - /* Reference to another type. */ - dtype = (debug_make_reference_type - (dhandle, - parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL))); - break; - - case 'f': - /* Function returning another type. */ - /* FIXME: gdb checks os9k_stabs here. */ - dtype = (debug_make_function_type - (dhandle, - parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL), - (debug_type *) NULL, false)); - break; - - case 'k': - /* Const qualifier on some type (Sun). */ - /* FIXME: gdb accepts 'c' here if os9k_stabs. */ - dtype = debug_make_const_type (dhandle, - parse_stab_type (dhandle, info, - (const char *) NULL, - pp, - (debug_type **) NULL)); - break; - - case 'B': - /* Volatile qual on some type (Sun). */ - /* FIXME: gdb accepts 'i' here if os9k_stabs. */ - dtype = (debug_make_volatile_type - (dhandle, - parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL))); - break; - - case '@': - /* Offset (class & variable) type. This is used for a pointer - relative to an object. */ - { - debug_type domain; - debug_type memtype; - - /* Member type. */ - - domain = parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL); - if (domain == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - - if (**pp != ',') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - memtype = parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL); - if (memtype == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - - dtype = debug_make_offset_type (dhandle, domain, memtype); - } - break; - - case '#': - /* Method (class & fn) type. */ - if (**pp == '#') - { - debug_type return_type; - - ++*pp; - return_type = parse_stab_type (dhandle, info, (const char *) NULL, - pp, (debug_type **) NULL); - if (return_type == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - if (**pp != ';') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - dtype = debug_make_method_type (dhandle, return_type, - DEBUG_TYPE_NULL, - (debug_type *) NULL, false); - } - else - { - debug_type domain; - debug_type return_type; - debug_type *args; - unsigned int n; - unsigned int alloc; - boolean varargs; - - domain = parse_stab_type (dhandle, info, (const char *) NULL, - pp, (debug_type **) NULL); - if (domain == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - - if (**pp != ',') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - return_type = parse_stab_type (dhandle, info, (const char *) NULL, - pp, (debug_type **) NULL); - if (return_type == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - - alloc = 10; - args = (debug_type *) xmalloc (alloc * sizeof *args); - n = 0; - while (**pp != ';') - { - if (**pp != ',') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - if (n + 1 >= alloc) - { - alloc += 10; - args = ((debug_type *) - xrealloc ((PTR) args, alloc * sizeof *args)); - } - - args[n] = parse_stab_type (dhandle, info, (const char *) NULL, - pp, (debug_type **) NULL); - if (args[n] == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - ++n; - } - ++*pp; - - /* If the last type is not void, then this function takes a - variable number of arguments. Otherwise, we must strip - the void type. */ - if (n == 0 - || debug_get_type_kind (dhandle, args[n - 1]) != DEBUG_KIND_VOID) - varargs = true; - else - { - --n; - varargs = false; - } - - args[n] = DEBUG_TYPE_NULL; - - dtype = debug_make_method_type (dhandle, return_type, domain, args, - varargs); - } - break; - - case 'r': - /* Range type. */ - dtype = parse_stab_range_type (dhandle, info, typename, pp, typenums); - break; - - case 'b': - /* FIXME: gdb checks os9k_stabs here. */ - /* Sun ACC builtin int type. */ - dtype = parse_stab_sun_builtin_type (dhandle, pp); - break; - - case 'R': - /* Sun ACC builtin float type. */ - dtype = parse_stab_sun_floating_type (dhandle, pp); - break; - - case 'e': - /* Enumeration type. */ - dtype = parse_stab_enum_type (dhandle, pp); - break; - - case 's': - case 'u': - /* Struct or union type. */ - dtype = parse_stab_struct_type (dhandle, info, typename, pp, - descriptor == 's', typenums); - break; - - case 'a': - /* Array type. */ - if (**pp != 'r') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - dtype = parse_stab_array_type (dhandle, info, pp, stringp); - break; - - case 'S': - dtype = debug_make_set_type (dhandle, - parse_stab_type (dhandle, info, - (const char *) NULL, - pp, - (debug_type **) NULL), - stringp); - break; - - default: - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - - if (dtype == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - - if (typenums[0] != -1) - { - if (! stab_record_type (dhandle, info, typenums, dtype)) - return DEBUG_TYPE_NULL; - } - - if (size != -1) - { - if (! debug_record_type_size (dhandle, dtype, (unsigned int) size)) - return DEBUG_TYPE_NULL; - } - - return dtype; -} - -/* Read a number by which a type is referred to in dbx data, or - perhaps read a pair (FILENUM, TYPENUM) in parentheses. Just a - single number N is equivalent to (0,N). Return the two numbers by - storing them in the vector TYPENUMS. */ - -static boolean -parse_stab_type_number (pp, typenums) - const char **pp; - int *typenums; -{ - const char *orig; - - orig = *pp; - - if (**pp != '(') - { - typenums[0] = 0; - typenums[1] = (int) parse_number (pp, (boolean *) NULL); - } - else - { - ++*pp; - typenums[0] = (int) parse_number (pp, (boolean *) NULL); - if (**pp != ',') - { - bad_stab (orig); - return false; - } - ++*pp; - typenums[1] = (int) parse_number (pp, (boolean *) NULL); - if (**pp != ')') - { - bad_stab (orig); - return false; - } - ++*pp; - } - - return true; -} - -/* Parse a range type. */ - -static debug_type -parse_stab_range_type (dhandle, info, typename, pp, typenums) - PTR dhandle; - struct stab_handle *info; - const char *typename; - const char **pp; - const int *typenums; -{ - const char *orig; - int rangenums[2]; - boolean self_subrange; - debug_type index_type; - const char *s2, *s3; - bfd_signed_vma n2, n3; - boolean ov2, ov3; - - orig = *pp; - - index_type = DEBUG_TYPE_NULL; - - /* First comes a type we are a subrange of. - In C it is usually 0, 1 or the type being defined. */ - if (! parse_stab_type_number (pp, rangenums)) - return DEBUG_TYPE_NULL; - - self_subrange = (rangenums[0] == typenums[0] - && rangenums[1] == typenums[1]); - - if (**pp == '=') - { - *pp = orig; - index_type = parse_stab_type (dhandle, info, (const char *) NULL, - pp, (debug_type **) NULL); - if (index_type == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - } - - if (**pp == ';') - ++*pp; - - /* The remaining two operands are usually lower and upper bounds of - the range. But in some special cases they mean something else. */ - s2 = *pp; - n2 = parse_number (pp, &ov2); - if (**pp != ';') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - s3 = *pp; - n3 = parse_number (pp, &ov3); - if (**pp != ';') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - if (ov2 || ov3) - { - /* gcc will emit range stabs for long long types. Handle this - as a special case. FIXME: This needs to be more general. */ -#define LLLOW "01000000000000000000000;" -#define LLHIGH "0777777777777777777777;" -#define ULLHIGH "01777777777777777777777;" - if (index_type == DEBUG_TYPE_NULL) - { - if (strncmp (s2, LLLOW, sizeof LLLOW - 1) == 0 - && strncmp (s3, LLHIGH, sizeof LLHIGH - 1) == 0) - return debug_make_int_type (dhandle, 8, false); - if (! ov2 - && n2 == 0 - && strncmp (s3, ULLHIGH, sizeof ULLHIGH - 1) == 0) - return debug_make_int_type (dhandle, 8, true); - } - - warn_stab (orig, _("numeric overflow")); - } - - if (index_type == DEBUG_TYPE_NULL) - { - /* A type defined as a subrange of itself, with both bounds 0, - is void. */ - if (self_subrange && n2 == 0 && n3 == 0) - return debug_make_void_type (dhandle); - - /* A type defined as a subrange of itself, with n2 positive and - n3 zero, is a complex type, and n2 is the number of bytes. */ - if (self_subrange && n3 == 0 && n2 > 0) - return debug_make_complex_type (dhandle, n2); - - /* If n3 is zero and n2 is positive, this is a floating point - type, and n2 is the number of bytes. */ - if (n3 == 0 && n2 > 0) - return debug_make_float_type (dhandle, n2); - - /* If the upper bound is -1, this is an unsigned int. */ - if (n2 == 0 && n3 == -1) - { - /* When gcc is used with -gstabs, but not -gstabs+, it will emit - long long int:t6=r1;0;-1; - long long unsigned int:t7=r1;0;-1; - We hack here to handle this reasonably. */ - if (typename != NULL) - { - if (strcmp (typename, "long long int") == 0) - return debug_make_int_type (dhandle, 8, false); - else if (strcmp (typename, "long long unsigned int") == 0) - return debug_make_int_type (dhandle, 8, true); - } - /* FIXME: The size here really depends upon the target. */ - return debug_make_int_type (dhandle, 4, true); - } - - /* A range of 0 to 127 is char. */ - if (self_subrange && n2 == 0 && n3 == 127) - return debug_make_int_type (dhandle, 1, false); - - /* FIXME: gdb checks for the language CHILL here. */ - - if (n2 == 0) - { - if (n3 < 0) - return debug_make_int_type (dhandle, - n3, true); - else if (n3 == 0xff) - return debug_make_int_type (dhandle, 1, true); - else if (n3 == 0xffff) - return debug_make_int_type (dhandle, 2, true); - else if (n3 == (bfd_signed_vma) 0xffffffff) - return debug_make_int_type (dhandle, 4, true); -#ifdef BFD64 - else if (n3 == ((((bfd_vma) 0xffffffff) << 32) | 0xffffffff)) - return debug_make_int_type (dhandle, 8, true); -#endif - } - else if (n3 == 0 - && n2 < 0 - && (self_subrange || n2 == -8)) - return debug_make_int_type (dhandle, - n2, true); - else if (n2 == - n3 - 1 || n2 == n3 + 1) - { - if (n3 == 0x7f) - return debug_make_int_type (dhandle, 1, false); - else if (n3 == 0x7fff) - return debug_make_int_type (dhandle, 2, false); - else if (n3 == 0x7fffffff) - return debug_make_int_type (dhandle, 4, false); -#ifdef BFD64 - else if (n3 == ((((bfd_vma) 0x7fffffff) << 32) | 0xffffffff)) - return debug_make_int_type (dhandle, 8, false); -#endif - } - } - - /* At this point I don't have the faintest idea how to deal with a - self_subrange type; I'm going to assume that this is used as an - idiom, and that all of them are special cases. So . . . */ - if (self_subrange) - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - - index_type = stab_find_type (dhandle, info, rangenums); - if (index_type == DEBUG_TYPE_NULL) - { - /* Does this actually ever happen? Is that why we are worrying - about dealing with it rather than just calling error_type? */ - warn_stab (orig, _("missing index type")); - index_type = debug_make_int_type (dhandle, 4, false); - } - - return debug_make_range_type (dhandle, index_type, n2, n3); -} - -/* Sun's ACC uses a somewhat saner method for specifying the builtin - typedefs in every file (for int, long, etc): - - type = b ; ; - signed = u or s. Possible c in addition to u or s (for char?). - offset = offset from high order bit to start bit of type. - width is # bytes in object of this type, nbits is # bits in type. - - The width/offset stuff appears to be for small objects stored in - larger ones (e.g. `shorts' in `int' registers). We ignore it for now, - FIXME. */ - -static debug_type -parse_stab_sun_builtin_type (dhandle, pp) - PTR dhandle; - const char **pp; -{ - const char *orig; - boolean unsignedp; - bfd_vma bits; - - orig = *pp; - - switch (**pp) - { - case 's': - unsignedp = false; - break; - case 'u': - unsignedp = true; - break; - default: - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - /* For some odd reason, all forms of char put a c here. This is strange - because no other type has this honor. We can safely ignore this because - we actually determine 'char'acterness by the number of bits specified in - the descriptor. */ - if (**pp == 'c') - ++*pp; - - /* The first number appears to be the number of bytes occupied - by this type, except that unsigned short is 4 instead of 2. - Since this information is redundant with the third number, - we will ignore it. */ - (void) parse_number (pp, (boolean *) NULL); - if (**pp != ';') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - /* The second number is always 0, so ignore it too. */ - (void) parse_number (pp, (boolean *) NULL); - if (**pp != ';') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - /* The third number is the number of bits for this type. */ - bits = parse_number (pp, (boolean *) NULL); - - /* The type *should* end with a semicolon. If it are embedded - in a larger type the semicolon may be the only way to know where - the type ends. If this type is at the end of the stabstring we - can deal with the omitted semicolon (but we don't have to like - it). Don't bother to complain(), Sun's compiler omits the semicolon - for "void". */ - if (**pp == ';') - ++*pp; - - if (bits == 0) - return debug_make_void_type (dhandle); - - return debug_make_int_type (dhandle, bits / 8, unsignedp); -} - -/* Parse a builtin floating type generated by the Sun compiler. */ - -static debug_type -parse_stab_sun_floating_type (dhandle, pp) - PTR dhandle; - const char **pp; -{ - const char *orig; - bfd_vma details; - bfd_vma bytes; - - orig = *pp; - - /* The first number has more details about the type, for example - FN_COMPLEX. */ - details = parse_number (pp, (boolean *) NULL); - if (**pp != ';') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - - /* The second number is the number of bytes occupied by this type */ - bytes = parse_number (pp, (boolean *) NULL); - if (**pp != ';') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - - if (details == NF_COMPLEX - || details == NF_COMPLEX16 - || details == NF_COMPLEX32) - return debug_make_complex_type (dhandle, bytes); - - return debug_make_float_type (dhandle, bytes); -} - -/* Handle an enum type. */ - -static debug_type -parse_stab_enum_type (dhandle, pp) - PTR dhandle; - const char **pp; -{ - const char *orig; - const char **names; - bfd_signed_vma *values; - unsigned int n; - unsigned int alloc; - - orig = *pp; - - /* FIXME: gdb checks os9k_stabs here. */ - - /* The aix4 compiler emits an extra field before the enum members; - my guess is it's a type of some sort. Just ignore it. */ - if (**pp == '-') - { - while (**pp != ':') - ++*pp; - ++*pp; - } - - /* Read the value-names and their values. - The input syntax is NAME:VALUE,NAME:VALUE, and so on. - A semicolon or comma instead of a NAME means the end. */ - alloc = 10; - names = (const char **) xmalloc (alloc * sizeof *names); - values = (bfd_signed_vma *) xmalloc (alloc * sizeof *values); - n = 0; - while (**pp != '\0' && **pp != ';' && **pp != ',') - { - const char *p; - char *name; - bfd_signed_vma val; - - p = *pp; - while (*p != ':') - ++p; - - name = savestring (*pp, p - *pp); - - *pp = p + 1; - val = (bfd_signed_vma) parse_number (pp, (boolean *) NULL); - if (**pp != ',') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - if (n + 1 >= alloc) - { - alloc += 10; - names = ((const char **) - xrealloc ((PTR) names, alloc * sizeof *names)); - values = ((bfd_signed_vma *) - xrealloc ((PTR) values, alloc * sizeof *values)); - } - - names[n] = name; - values[n] = val; - ++n; - } - - names[n] = NULL; - values[n] = 0; - - if (**pp == ';') - ++*pp; - - return debug_make_enum_type (dhandle, names, values); -} - -/* Read the description of a structure (or union type) and return an object - describing the type. - - PP points to a character pointer that points to the next unconsumed token - in the the stabs string. For example, given stabs "A:T4=s4a:1,0,32;;", - *PP will point to "4a:1,0,32;;". */ - -static debug_type -parse_stab_struct_type (dhandle, info, tagname, pp, structp, typenums) - PTR dhandle; - struct stab_handle *info; - const char *tagname; - const char **pp; - boolean structp; - const int *typenums; -{ - const char *orig; - bfd_vma size; - debug_baseclass *baseclasses; - debug_field *fields; - boolean statics; - debug_method *methods; - debug_type vptrbase; - boolean ownvptr; - - orig = *pp; - - /* Get the size. */ - size = parse_number (pp, (boolean *) NULL); - - /* Get the other information. */ - if (! parse_stab_baseclasses (dhandle, info, pp, &baseclasses) - || ! parse_stab_struct_fields (dhandle, info, pp, &fields, &statics) - || ! parse_stab_members (dhandle, info, tagname, pp, typenums, &methods) - || ! parse_stab_tilde_field (dhandle, info, pp, typenums, &vptrbase, - &ownvptr)) - return DEBUG_TYPE_NULL; - - if (! statics - && baseclasses == NULL - && methods == NULL - && vptrbase == DEBUG_TYPE_NULL - && ! ownvptr) - return debug_make_struct_type (dhandle, structp, size, fields); - - return debug_make_object_type (dhandle, structp, size, fields, baseclasses, - methods, vptrbase, ownvptr); -} - -/* The stabs for C++ derived classes contain baseclass information which - is marked by a '!' character after the total size. This function is - called when we encounter the baseclass marker, and slurps up all the - baseclass information. - - Immediately following the '!' marker is the number of base classes that - the class is derived from, followed by information for each base class. - For each base class, there are two visibility specifiers, a bit offset - to the base class information within the derived class, a reference to - the type for the base class, and a terminating semicolon. - - A typical example, with two base classes, would be "!2,020,19;0264,21;". - ^^ ^ ^ ^ ^ ^ ^ - Baseclass information marker __________________|| | | | | | | - Number of baseclasses __________________________| | | | | | | - Visibility specifiers (2) ________________________| | | | | | - Offset in bits from start of class _________________| | | | | - Type number for base class ___________________________| | | | - Visibility specifiers (2) _______________________________| | | - Offset in bits from start of class ________________________| | - Type number of base class ____________________________________| - - Return true for success, false for failure. */ - -static boolean -parse_stab_baseclasses (dhandle, info, pp, retp) - PTR dhandle; - struct stab_handle *info; - const char **pp; - debug_baseclass **retp; -{ - const char *orig; - unsigned int c, i; - debug_baseclass *classes; - - *retp = NULL; - - orig = *pp; - - if (**pp != '!') - { - /* No base classes. */ - return true; - } - ++*pp; - - c = (unsigned int) parse_number (pp, (boolean *) NULL); - - if (**pp != ',') - { - bad_stab (orig); - return false; - } - ++*pp; - - classes = (debug_baseclass *) xmalloc ((c + 1) * sizeof (**retp)); - - for (i = 0; i < c; i++) - { - boolean virtual; - enum debug_visibility visibility; - bfd_vma bitpos; - debug_type type; - - switch (**pp) - { - case '0': - virtual = false; - break; - case '1': - virtual = true; - break; - default: - warn_stab (orig, _("unknown virtual character for baseclass")); - virtual = false; - break; - } - ++*pp; - - switch (**pp) - { - case '0': - visibility = DEBUG_VISIBILITY_PRIVATE; - break; - case '1': - visibility = DEBUG_VISIBILITY_PROTECTED; - break; - case '2': - visibility = DEBUG_VISIBILITY_PUBLIC; - break; - default: - warn_stab (orig, _("unknown visibility character for baseclass")); - visibility = DEBUG_VISIBILITY_PUBLIC; - break; - } - ++*pp; - - /* The remaining value is the bit offset of the portion of the - object corresponding to this baseclass. Always zero in the - absence of multiple inheritance. */ - bitpos = parse_number (pp, (boolean *) NULL); - if (**pp != ',') - { - bad_stab (orig); - return false; - } - ++*pp; - - type = parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL); - if (type == DEBUG_TYPE_NULL) - return false; - - classes[i] = debug_make_baseclass (dhandle, type, bitpos, virtual, - visibility); - if (classes[i] == DEBUG_BASECLASS_NULL) - return false; - - if (**pp != ';') - return false; - ++*pp; - } - - classes[i] = DEBUG_BASECLASS_NULL; - - *retp = classes; - - return true; -} - -/* Read struct or class data fields. They have the form: - - NAME : [VISIBILITY] TYPENUM , BITPOS , BITSIZE ; - - At the end, we see a semicolon instead of a field. - - In C++, this may wind up being NAME:?TYPENUM:PHYSNAME; for - a static field. - - The optional VISIBILITY is one of: - - '/0' (VISIBILITY_PRIVATE) - '/1' (VISIBILITY_PROTECTED) - '/2' (VISIBILITY_PUBLIC) - '/9' (VISIBILITY_IGNORE) - - or nothing, for C style fields with public visibility. - - Returns 1 for success, 0 for failure. */ - -static boolean -parse_stab_struct_fields (dhandle, info, pp, retp, staticsp) - PTR dhandle; - struct stab_handle *info; - const char **pp; - debug_field **retp; - boolean *staticsp; -{ - const char *orig; - const char *p; - debug_field *fields; - unsigned int c; - unsigned int alloc; - - *retp = NULL; - *staticsp = false; - - orig = *pp; - - c = 0; - alloc = 10; - fields = (debug_field *) xmalloc (alloc * sizeof *fields); - while (**pp != ';') - { - /* FIXME: gdb checks os9k_stabs here. */ - - p = *pp; - - /* Add 1 to c to leave room for NULL pointer at end. */ - if (c + 1 >= alloc) - { - alloc += 10; - fields = ((debug_field *) - xrealloc ((PTR) fields, alloc * sizeof *fields)); - } - - /* If it starts with CPLUS_MARKER it is a special abbreviation, - unless the CPLUS_MARKER is followed by an underscore, in - which case it is just the name of an anonymous type, which we - should handle like any other type name. We accept either '$' - or '.', because a field name can never contain one of these - characters except as a CPLUS_MARKER. */ - - if ((*p == '$' || *p == '.') && p[1] != '_') - { - ++*pp; - if (! parse_stab_cpp_abbrev (dhandle, info, pp, fields + c)) - return false; - ++c; - continue; - } - - /* Look for the ':' that separates the field name from the field - values. Data members are delimited by a single ':', while member - functions are delimited by a pair of ':'s. When we hit the member - functions (if any), terminate scan loop and return. */ - - p = strchr (p, ':'); - if (p == NULL) - { - bad_stab (orig); - return false; - } - - if (p[1] == ':') - break; - - if (! parse_stab_one_struct_field (dhandle, info, pp, p, fields + c, - staticsp)) - return false; - - ++c; - } - - fields[c] = DEBUG_FIELD_NULL; - - *retp = fields; - - return true; -} - -/* Special GNU C++ name. */ - -static boolean -parse_stab_cpp_abbrev (dhandle, info, pp, retp) - PTR dhandle; - struct stab_handle *info; - const char **pp; - debug_field *retp; -{ - const char *orig; - int cpp_abbrev; - debug_type context; - const char *name; - const char *typename; - debug_type type; - bfd_vma bitpos; - - *retp = DEBUG_FIELD_NULL; - - orig = *pp; - - if (**pp != 'v') - { - bad_stab (*pp); - return false; - } - ++*pp; - - cpp_abbrev = **pp; - ++*pp; - - /* At this point, *pp points to something like "22:23=*22...", where - the type number before the ':' is the "context" and everything - after is a regular type definition. Lookup the type, find it's - name, and construct the field name. */ - - context = parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL); - if (context == DEBUG_TYPE_NULL) - return false; - - switch (cpp_abbrev) - { - case 'f': - /* $vf -- a virtual function table pointer. */ - name = "_vptr$"; - break; - case 'b': - /* $vb -- a virtual bsomethingorother */ - typename = debug_get_type_name (dhandle, context); - if (typename == NULL) - { - warn_stab (orig, _("unnamed $vb type")); - typename = "FOO"; - } - name = concat ("_vb$", typename, (const char *) NULL); - break; - default: - warn_stab (orig, _("unrecognized C++ abbreviation")); - name = "INVALID_CPLUSPLUS_ABBREV"; - break; - } - - if (**pp != ':') - { - bad_stab (orig); - return false; - } - ++*pp; - - type = parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL); - if (**pp != ',') - { - bad_stab (orig); - return false; - } - ++*pp; - - bitpos = parse_number (pp, (boolean *) NULL); - if (**pp != ';') - { - bad_stab (orig); - return false; - } - ++*pp; - - *retp = debug_make_field (dhandle, name, type, bitpos, 0, - DEBUG_VISIBILITY_PRIVATE); - if (*retp == DEBUG_FIELD_NULL) - return false; - - return true; -} - -/* Parse a single field in a struct or union. */ - -static boolean -parse_stab_one_struct_field (dhandle, info, pp, p, retp, staticsp) - PTR dhandle; - struct stab_handle *info; - const char **pp; - const char *p; - debug_field *retp; - boolean *staticsp; -{ - const char *orig; - char *name; - enum debug_visibility visibility; - debug_type type; - bfd_vma bitpos; - bfd_vma bitsize; - - orig = *pp; - - /* FIXME: gdb checks ARM_DEMANGLING here. */ - - name = savestring (*pp, p - *pp); - - *pp = p + 1; - - if (**pp != '/') - visibility = DEBUG_VISIBILITY_PUBLIC; - else - { - ++*pp; - switch (**pp) - { - case '0': - visibility = DEBUG_VISIBILITY_PRIVATE; - break; - case '1': - visibility = DEBUG_VISIBILITY_PROTECTED; - break; - case '2': - visibility = DEBUG_VISIBILITY_PUBLIC; - break; - default: - warn_stab (orig, _("unknown visibility character for field")); - visibility = DEBUG_VISIBILITY_PUBLIC; - break; - } - ++*pp; - } - - type = parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL); - if (type == DEBUG_TYPE_NULL) - return false; - - if (**pp == ':') - { - char *varname; - - /* This is a static class member. */ - ++*pp; - p = strchr (*pp, ';'); - if (p == NULL) - { - bad_stab (orig); - return false; - } - - varname = savestring (*pp, p - *pp); - - *pp = p + 1; - - *retp = debug_make_static_member (dhandle, name, type, varname, - visibility); - *staticsp = true; - - return true; - } - - if (**pp != ',') - { - bad_stab (orig); - return false; - } - ++*pp; - - bitpos = parse_number (pp, (boolean *) NULL); - if (**pp != ',') - { - bad_stab (orig); - return false; - } - ++*pp; - - bitsize = parse_number (pp, (boolean *) NULL); - if (**pp != ';') - { - bad_stab (orig); - return false; - } - ++*pp; - - if (bitpos == 0 && bitsize == 0) - { - /* This can happen in two cases: (1) at least for gcc 2.4.5 or - so, it is a field which has been optimized out. The correct - stab for this case is to use VISIBILITY_IGNORE, but that is a - recent invention. (2) It is a 0-size array. For example - union { int num; char str[0]; } foo. Printing "" - for str in "p foo" is OK, since foo.str (and thus foo.str[3]) - will continue to work, and a 0-size array as a whole doesn't - have any contents to print. - - I suspect this probably could also happen with gcc -gstabs - (not -gstabs+) for static fields, and perhaps other C++ - extensions. Hopefully few people use -gstabs with gdb, since - it is intended for dbx compatibility. */ - visibility = DEBUG_VISIBILITY_IGNORE; - } - - /* FIXME: gdb does some stuff here to mark fields as unpacked. */ - - *retp = debug_make_field (dhandle, name, type, bitpos, bitsize, visibility); - - return true; -} - -/* Read member function stabs info for C++ classes. The form of each member - function data is: - - NAME :: TYPENUM[=type definition] ARGS : PHYSNAME ; - - An example with two member functions is: - - afunc1::20=##15;:i;2A.;afunc2::20:i;2A.; - - For the case of overloaded operators, the format is op$::*.funcs, where - $ is the CPLUS_MARKER (usually '$'), `*' holds the place for an operator - name (such as `+=') and `.' marks the end of the operator name. */ - -static boolean -parse_stab_members (dhandle, info, tagname, pp, typenums, retp) - PTR dhandle; - struct stab_handle *info; - const char *tagname; - const char **pp; - const int *typenums; - debug_method **retp; -{ - const char *orig; - debug_method *methods; - unsigned int c; - unsigned int alloc; - - *retp = NULL; - - orig = *pp; - - alloc = 0; - methods = NULL; - c = 0; - - while (**pp != ';') - { - const char *p; - char *name; - debug_method_variant *variants; - unsigned int cvars; - unsigned int allocvars; - debug_type look_ahead_type; - - p = strchr (*pp, ':'); - if (p == NULL || p[1] != ':') - break; - - /* FIXME: Some systems use something other than '$' here. */ - if ((*pp)[0] != 'o' || (*pp)[1] != 'p' || (*pp)[2] != '$') - { - name = savestring (*pp, p - *pp); - *pp = p + 2; - } - else - { - /* This is a completely wierd case. In order to stuff in the - names that might contain colons (the usual name delimiter), - Mike Tiemann defined a different name format which is - signalled if the identifier is "op$". In that case, the - format is "op$::XXXX." where XXXX is the name. This is - used for names like "+" or "=". YUUUUUUUK! FIXME! */ - *pp = p + 2; - for (p = *pp; *p != '.' && *p != '\0'; p++) - ; - if (*p != '.') - { - bad_stab (orig); - return false; - } - name = savestring (*pp, p - *pp); - *pp = p + 1; - } - - allocvars = 10; - variants = ((debug_method_variant *) - xmalloc (allocvars * sizeof *variants)); - cvars = 0; - - look_ahead_type = DEBUG_TYPE_NULL; - - do - { - debug_type type; - boolean stub; - char *argtypes; - enum debug_visibility visibility; - boolean constp, volatilep, staticp; - bfd_vma voffset; - debug_type context; - const char *physname; - boolean varargs; - - if (look_ahead_type != DEBUG_TYPE_NULL) - { - /* g++ version 1 kludge */ - type = look_ahead_type; - look_ahead_type = DEBUG_TYPE_NULL; - } - else - { - type = parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL); - if (type == DEBUG_TYPE_NULL) - return false; - if (**pp != ':') - { - bad_stab (orig); - return false; - } - } - - ++*pp; - p = strchr (*pp, ';'); - if (p == NULL) - { - bad_stab (orig); - return false; - } - - stub = false; - if (debug_get_type_kind (dhandle, type) == DEBUG_KIND_METHOD - && debug_get_parameter_types (dhandle, type, &varargs) == NULL) - stub = true; - - argtypes = savestring (*pp, p - *pp); - *pp = p + 1; - - switch (**pp) - { - case '0': - visibility = DEBUG_VISIBILITY_PRIVATE; - break; - case '1': - visibility = DEBUG_VISIBILITY_PROTECTED; - break; - default: - visibility = DEBUG_VISIBILITY_PUBLIC; - break; - } - ++*pp; - - constp = false; - volatilep = false; - switch (**pp) - { - case 'A': - /* Normal function. */ - ++*pp; - break; - case 'B': - /* const member function. */ - constp = true; - ++*pp; - break; - case 'C': - /* volatile member function. */ - volatilep = true; - ++*pp; - break; - case 'D': - /* const volatile member function. */ - constp = true; - volatilep = true; - ++*pp; - break; - case '*': - case '?': - case '.': - /* File compiled with g++ version 1; no information. */ - break; - default: - warn_stab (orig, _("const/volatile indicator missing")); - break; - } - - staticp = false; - switch (**pp) - { - case '*': - /* virtual member function, followed by index. The sign - bit is supposedly set to distinguish - pointers-to-methods from virtual function indicies. */ - ++*pp; - voffset = parse_number (pp, (boolean *) NULL); - if (**pp != ';') - { - bad_stab (orig); - return false; - } - ++*pp; - voffset &= 0x7fffffff; - - if (**pp == ';' || *pp == '\0') - { - /* Must be g++ version 1. */ - context = DEBUG_TYPE_NULL; - } - else - { - /* Figure out from whence this virtual function - came. It may belong to virtual function table of - one of its baseclasses. */ - look_ahead_type = parse_stab_type (dhandle, info, - (const char *) NULL, - pp, - (debug_type **) NULL); - if (**pp == ':') - { - /* g++ version 1 overloaded methods. */ - context = DEBUG_TYPE_NULL; - } - else - { - context = look_ahead_type; - look_ahead_type = DEBUG_TYPE_NULL; - if (**pp != ';') - { - bad_stab (orig); - return false; - } - ++*pp; - } - } - break; - - case '?': - /* static member function. */ - ++*pp; - staticp = true; - voffset = 0; - context = DEBUG_TYPE_NULL; - if (strncmp (argtypes, name, strlen (name)) != 0) - stub = true; - break; - - default: - warn_stab (orig, "member function type missing"); - voffset = 0; - context = DEBUG_TYPE_NULL; - break; - - case '.': - ++*pp; - voffset = 0; - context = DEBUG_TYPE_NULL; - break; - } - - /* If the type is not a stub, then the argtypes string is - the physical name of the function. Otherwise the - argtypes string is the mangled form of the argument - types, and the full type and the physical name must be - extracted from them. */ - if (! stub) - physname = argtypes; - else - { - debug_type class_type, return_type; - - class_type = stab_find_type (dhandle, info, typenums); - if (class_type == DEBUG_TYPE_NULL) - return false; - return_type = debug_get_return_type (dhandle, type); - if (return_type == DEBUG_TYPE_NULL) - { - bad_stab (orig); - return false; - } - type = parse_stab_argtypes (dhandle, info, class_type, name, - tagname, return_type, argtypes, - constp, volatilep, &physname); - if (type == DEBUG_TYPE_NULL) - return false; - } - - if (cvars + 1 >= allocvars) - { - allocvars += 10; - variants = ((debug_method_variant *) - xrealloc ((PTR) variants, - allocvars * sizeof *variants)); - } - - if (! staticp) - variants[cvars] = debug_make_method_variant (dhandle, physname, - type, visibility, - constp, volatilep, - voffset, context); - else - variants[cvars] = debug_make_static_method_variant (dhandle, - physname, - type, - visibility, - constp, - volatilep); - if (variants[cvars] == DEBUG_METHOD_VARIANT_NULL) - return false; - - ++cvars; - } - while (**pp != ';' && **pp != '\0'); - - variants[cvars] = DEBUG_METHOD_VARIANT_NULL; - - if (**pp != '\0') - ++*pp; - - if (c + 1 >= alloc) - { - alloc += 10; - methods = ((debug_method *) - xrealloc ((PTR) methods, alloc * sizeof *methods)); - } - - methods[c] = debug_make_method (dhandle, name, variants); - - ++c; - } - - if (methods != NULL) - methods[c] = DEBUG_METHOD_NULL; - - *retp = methods; - - return true; -} - -/* Parse a string representing argument types for a method. Stabs - tries to save space by packing argument types into a mangled - string. This string should give us enough information to extract - both argument types and the physical name of the function, given - the tag name. */ - -static debug_type -parse_stab_argtypes (dhandle, info, class_type, fieldname, tagname, - return_type, argtypes, constp, volatilep, pphysname) - PTR dhandle; - struct stab_handle *info; - debug_type class_type; - const char *fieldname; - const char *tagname; - debug_type return_type; - const char *argtypes; - boolean constp; - boolean volatilep; - const char **pphysname; -{ - boolean is_full_physname_constructor; - boolean is_constructor; - boolean is_destructor; - debug_type *args; - boolean varargs; - - /* Constructors are sometimes handled specially. */ - is_full_physname_constructor = ((argtypes[0] == '_' - && argtypes[1] == '_' - && (isdigit ((unsigned char) argtypes[2]) - || argtypes[2] == 'Q' - || argtypes[2] == 't')) - || strncmp (argtypes, "__ct", 4) == 0); - - is_constructor = (is_full_physname_constructor - || (tagname != NULL - && strcmp (fieldname, tagname) == 0)); - is_destructor = ((argtypes[0] == '_' - && (argtypes[1] == '$' || argtypes[1] == '.') - && argtypes[2] == '_') - || strncmp (argtypes, "__dt", 4) == 0); - - if (is_destructor || is_full_physname_constructor) - *pphysname = argtypes; - else - { - unsigned int len; - const char *const_prefix; - const char *volatile_prefix; - char buf[20]; - unsigned int mangled_name_len; - char *physname; - - len = tagname == NULL ? 0 : strlen (tagname); - const_prefix = constp ? "C" : ""; - volatile_prefix = volatilep ? "V" : ""; - - if (len == 0) - sprintf (buf, "__%s%s", const_prefix, volatile_prefix); - else if (tagname != NULL && strchr (tagname, '<') != NULL) - { - /* Template methods are fully mangled. */ - sprintf (buf, "__%s%s", const_prefix, volatile_prefix); - tagname = NULL; - len = 0; - } - else - sprintf (buf, "__%s%s%d", const_prefix, volatile_prefix, len); - - mangled_name_len = ((is_constructor ? 0 : strlen (fieldname)) - + strlen (buf) - + len - + strlen (argtypes) - + 1); - - if (fieldname[0] == 'o' - && fieldname[1] == 'p' - && (fieldname[2] == '$' || fieldname[2] == '.')) - { - const char *opname; - - opname = cplus_mangle_opname (fieldname + 3, 0); - if (opname == NULL) - { - fprintf (stderr, _("No mangling for \"%s\"\n"), fieldname); - return DEBUG_TYPE_NULL; - } - mangled_name_len += strlen (opname); - physname = (char *) xmalloc (mangled_name_len); - strncpy (physname, fieldname, 3); - strcpy (physname + 3, opname); - } - else - { - physname = (char *) xmalloc (mangled_name_len); - if (is_constructor) - physname[0] = '\0'; - else - strcpy (physname, fieldname); - } - - strcat (physname, buf); - if (tagname != NULL) - strcat (physname, tagname); - strcat (physname, argtypes); - - *pphysname = physname; - } - - if (*argtypes == '\0' || is_destructor) - { - args = (debug_type *) xmalloc (sizeof *args); - *args = NULL; - return debug_make_method_type (dhandle, return_type, class_type, args, - false); - } - - args = stab_demangle_argtypes (dhandle, info, *pphysname, &varargs); - if (args == NULL) - return DEBUG_TYPE_NULL; - - return debug_make_method_type (dhandle, return_type, class_type, args, - varargs); -} - -/* The tail end of stabs for C++ classes that contain a virtual function - pointer contains a tilde, a %, and a type number. - The type number refers to the base class (possibly this class itself) which - contains the vtable pointer for the current class. - - This function is called when we have parsed all the method declarations, - so we can look for the vptr base class info. */ - -static boolean -parse_stab_tilde_field (dhandle, info, pp, typenums, retvptrbase, retownvptr) - PTR dhandle; - struct stab_handle *info; - const char **pp; - const int *typenums; - debug_type *retvptrbase; - boolean *retownvptr; -{ - const char *orig; - const char *hold; - int vtypenums[2]; - - *retvptrbase = DEBUG_TYPE_NULL; - *retownvptr = false; - - orig = *pp; - - /* If we are positioned at a ';', then skip it. */ - if (**pp == ';') - ++*pp; - - if (**pp != '~') - return true; - - ++*pp; - - if (**pp == '=' || **pp == '+' || **pp == '-') - { - /* Obsolete flags that used to indicate the presence of - constructors and/or destructors. */ - ++*pp; - } - - if (**pp != '%') - return true; - - ++*pp; - - hold = *pp; - - /* The next number is the type number of the base class (possibly - our own class) which supplies the vtable for this class. */ - if (! parse_stab_type_number (pp, vtypenums)) - return false; - - if (vtypenums[0] == typenums[0] - && vtypenums[1] == typenums[1]) - *retownvptr = true; - else - { - debug_type vtype; - const char *p; - - *pp = hold; - - vtype = parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL); - for (p = *pp; *p != ';' && *p != '\0'; p++) - ; - if (*p != ';') - { - bad_stab (orig); - return false; - } - - *retvptrbase = vtype; - - *pp = p + 1; - } - - return true; -} - -/* Read a definition of an array type. */ - -static debug_type -parse_stab_array_type (dhandle, info, pp, stringp) - PTR dhandle; - struct stab_handle *info; - const char **pp; - boolean stringp; -{ - const char *orig; - const char *p; - int typenums[2]; - debug_type index_type; - boolean adjustable; - bfd_signed_vma lower, upper; - debug_type element_type; - - /* Format of an array type: - "ar;lower;upper;". - OS9000: "arlower,upper;". - - Fortran adjustable arrays use Adigits or Tdigits for lower or upper; - for these, produce a type like float[][]. */ - - orig = *pp; - - /* FIXME: gdb checks os9k_stabs here. */ - - /* If the index type is type 0, we take it as int. */ - p = *pp; - if (! parse_stab_type_number (&p, typenums)) - return DEBUG_TYPE_NULL; - if (typenums[0] == 0 && typenums[1] == 0 && **pp != '=') - { - index_type = debug_find_named_type (dhandle, "int"); - if (index_type == DEBUG_TYPE_NULL) - { - index_type = debug_make_int_type (dhandle, 4, false); - if (index_type == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - } - *pp = p; - } - else - { - index_type = parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL); - } - - if (**pp != ';') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - adjustable = false; - - if (! isdigit ((unsigned char) **pp) && **pp != '-') - { - ++*pp; - adjustable = true; - } - - lower = (bfd_signed_vma) parse_number (pp, (boolean *) NULL); - if (**pp != ';') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - if (! isdigit ((unsigned char) **pp) && **pp != '-') - { - ++*pp; - adjustable = true; - } - - upper = (bfd_signed_vma) parse_number (pp, (boolean *) NULL); - if (**pp != ';') - { - bad_stab (orig); - return DEBUG_TYPE_NULL; - } - ++*pp; - - element_type = parse_stab_type (dhandle, info, (const char *) NULL, pp, - (debug_type **) NULL); - if (element_type == DEBUG_TYPE_NULL) - return DEBUG_TYPE_NULL; - - if (adjustable) - { - lower = 0; - upper = -1; - } - - return debug_make_array_type (dhandle, element_type, index_type, lower, - upper, stringp); -} - -/* This struct holds information about files we have seen using - N_BINCL. */ - -struct bincl_file -{ - /* The next N_BINCL file. */ - struct bincl_file *next; - /* The next N_BINCL on the stack. */ - struct bincl_file *next_stack; - /* The file name. */ - const char *name; - /* The hash value. */ - bfd_vma hash; - /* The file index. */ - unsigned int file; - /* The list of types defined in this file. */ - struct stab_types *file_types; -}; - -/* Start a new N_BINCL file, pushing it onto the stack. */ - -static void -push_bincl (info, name, hash) - struct stab_handle *info; - const char *name; - bfd_vma hash; -{ - struct bincl_file *n; - - n = (struct bincl_file *) xmalloc (sizeof *n); - n->next = info->bincl_list; - n->next_stack = info->bincl_stack; - n->name = name; - n->hash = hash; - n->file = info->files; - n->file_types = NULL; - info->bincl_list = n; - info->bincl_stack = n; - - ++info->files; - info->file_types = ((struct stab_types **) - xrealloc ((PTR) info->file_types, - (info->files - * sizeof *info->file_types))); - info->file_types[n->file] = NULL; -} - -/* Finish an N_BINCL file, at an N_EINCL, popping the name off the - stack. */ - -static const char * -pop_bincl (info) - struct stab_handle *info; -{ - struct bincl_file *o; - - o = info->bincl_stack; - if (o == NULL) - return info->main_filename; - info->bincl_stack = o->next_stack; - - o->file_types = info->file_types[o->file]; - - if (info->bincl_stack == NULL) - return info->main_filename; - return info->bincl_stack->name; -} - -/* Handle an N_EXCL: get the types from the corresponding N_BINCL. */ - -static boolean -find_excl (info, name, hash) - struct stab_handle *info; - const char *name; - bfd_vma hash; -{ - struct bincl_file *l; - - ++info->files; - info->file_types = ((struct stab_types **) - xrealloc ((PTR) info->file_types, - (info->files - * sizeof *info->file_types))); - - for (l = info->bincl_list; l != NULL; l = l->next) - if (l->hash == hash && strcmp (l->name, name) == 0) - break; - if (l == NULL) - { - warn_stab (name, _("Undefined N_EXCL")); - info->file_types[info->files - 1] = NULL; - return true; - } - - info->file_types[info->files - 1] = l->file_types; - - return true; -} - -/* Handle a variable definition. gcc emits variable definitions for a - block before the N_LBRAC, so we must hold onto them until we see - it. The SunPRO compiler emits variable definitions after the - N_LBRAC, so we can call debug_record_variable immediately. */ - -static boolean -stab_record_variable (dhandle, info, name, type, kind, val) - PTR dhandle; - struct stab_handle *info; - const char *name; - debug_type type; - enum debug_var_kind kind; - bfd_vma val; -{ - struct stab_pending_var *v; - - if ((kind == DEBUG_GLOBAL || kind == DEBUG_STATIC) - || ! info->within_function - || (info->gcc_compiled == 0 && info->n_opt_found)) - return debug_record_variable (dhandle, name, type, kind, val); - - v = (struct stab_pending_var *) xmalloc (sizeof *v); - memset (v, 0, sizeof *v); - - v->next = info->pending; - v->name = name; - v->type = type; - v->kind = kind; - v->val = val; - info->pending = v; - - return true; -} - -/* Emit pending variable definitions. This is called after we see the - N_LBRAC that starts the block. */ - -static boolean -stab_emit_pending_vars (dhandle, info) - PTR dhandle; - struct stab_handle *info; -{ - struct stab_pending_var *v; - - v = info->pending; - while (v != NULL) - { - struct stab_pending_var *next; - - if (! debug_record_variable (dhandle, v->name, v->type, v->kind, v->val)) - return false; - - next = v->next; - free (v); - v = next; - } - - info->pending = NULL; - - return true; -} - -/* Find the slot for a type in the database. */ - -static debug_type * -stab_find_slot (info, typenums) - struct stab_handle *info; - const int *typenums; -{ - int filenum; - int index; - struct stab_types **ps; - - filenum = typenums[0]; - index = typenums[1]; - - if (filenum < 0 || (unsigned int) filenum >= info->files) - { - fprintf (stderr, _("Type file number %d out of range\n"), filenum); - return NULL; - } - if (index < 0) - { - fprintf (stderr, _("Type index number %d out of range\n"), index); - return NULL; - } - - ps = info->file_types + filenum; - - while (index >= STAB_TYPES_SLOTS) - { - if (*ps == NULL) - { - *ps = (struct stab_types *) xmalloc (sizeof **ps); - memset (*ps, 0, sizeof **ps); - } - ps = &(*ps)->next; - index -= STAB_TYPES_SLOTS; - } - if (*ps == NULL) - { - *ps = (struct stab_types *) xmalloc (sizeof **ps); - memset (*ps, 0, sizeof **ps); - } - - return (*ps)->types + index; -} - -/* Find a type given a type number. If the type has not been - allocated yet, create an indirect type. */ - -static debug_type -stab_find_type (dhandle, info, typenums) - PTR dhandle; - struct stab_handle *info; - const int *typenums; -{ - debug_type *slot; - - if (typenums[0] == 0 && typenums[1] < 0) - { - /* A negative type number indicates an XCOFF builtin type. */ - return stab_xcoff_builtin_type (dhandle, info, typenums[1]); - } - - slot = stab_find_slot (info, typenums); - if (slot == NULL) - return DEBUG_TYPE_NULL; - - if (*slot == DEBUG_TYPE_NULL) - return debug_make_indirect_type (dhandle, slot, (const char *) NULL); - - return *slot; -} - -/* Record that a given type number refers to a given type. */ - -static boolean -stab_record_type (dhandle, info, typenums, type) - PTR dhandle ATTRIBUTE_UNUSED; - struct stab_handle *info; - const int *typenums; - debug_type type; -{ - debug_type *slot; - - slot = stab_find_slot (info, typenums); - if (slot == NULL) - return false; - - /* gdb appears to ignore type redefinitions, so we do as well. */ - - *slot = type; - - return true; -} - -/* Return an XCOFF builtin type. */ - -static debug_type -stab_xcoff_builtin_type (dhandle, info, typenum) - PTR dhandle; - struct stab_handle *info; - int typenum; -{ - debug_type rettype; - const char *name; - - if (typenum >= 0 || typenum < -XCOFF_TYPE_COUNT) - { - fprintf (stderr, _("Unrecognized XCOFF type %d\n"), typenum); - return DEBUG_TYPE_NULL; - } - if (info->xcoff_types[-typenum] != NULL) - return info->xcoff_types[-typenum]; - - switch (-typenum) - { - case 1: - /* The size of this and all the other types are fixed, defined - by the debugging format. */ - name = "int"; - rettype = debug_make_int_type (dhandle, 4, false); - break; - case 2: - name = "char"; - rettype = debug_make_int_type (dhandle, 1, false); - break; - case 3: - name = "short"; - rettype = debug_make_int_type (dhandle, 2, false); - break; - case 4: - name = "long"; - rettype = debug_make_int_type (dhandle, 4, false); - break; - case 5: - name = "unsigned char"; - rettype = debug_make_int_type (dhandle, 1, true); - break; - case 6: - name = "signed char"; - rettype = debug_make_int_type (dhandle, 1, false); - break; - case 7: - name = "unsigned short"; - rettype = debug_make_int_type (dhandle, 2, true); - break; - case 8: - name = "unsigned int"; - rettype = debug_make_int_type (dhandle, 4, true); - break; - case 9: - name = "unsigned"; - rettype = debug_make_int_type (dhandle, 4, true); - case 10: - name = "unsigned long"; - rettype = debug_make_int_type (dhandle, 4, true); - break; - case 11: - name = "void"; - rettype = debug_make_void_type (dhandle); - break; - case 12: - /* IEEE single precision (32 bit). */ - name = "float"; - rettype = debug_make_float_type (dhandle, 4); - break; - case 13: - /* IEEE double precision (64 bit). */ - name = "double"; - rettype = debug_make_float_type (dhandle, 8); - break; - case 14: - /* This is an IEEE double on the RS/6000, and different machines - with different sizes for "long double" should use different - negative type numbers. See stabs.texinfo. */ - name = "long double"; - rettype = debug_make_float_type (dhandle, 8); - break; - case 15: - name = "integer"; - rettype = debug_make_int_type (dhandle, 4, false); - break; - case 16: - name = "boolean"; - rettype = debug_make_bool_type (dhandle, 4); - break; - case 17: - name = "short real"; - rettype = debug_make_float_type (dhandle, 4); - break; - case 18: - name = "real"; - rettype = debug_make_float_type (dhandle, 8); - break; - case 19: - /* FIXME */ - name = "stringptr"; - rettype = NULL; - break; - case 20: - /* FIXME */ - name = "character"; - rettype = debug_make_int_type (dhandle, 1, true); - break; - case 21: - name = "logical*1"; - rettype = debug_make_bool_type (dhandle, 1); - break; - case 22: - name = "logical*2"; - rettype = debug_make_bool_type (dhandle, 2); - break; - case 23: - name = "logical*4"; - rettype = debug_make_bool_type (dhandle, 4); - break; - case 24: - name = "logical"; - rettype = debug_make_bool_type (dhandle, 4); - break; - case 25: - /* Complex type consisting of two IEEE single precision values. */ - name = "complex"; - rettype = debug_make_complex_type (dhandle, 8); - break; - case 26: - /* Complex type consisting of two IEEE double precision values. */ - name = "double complex"; - rettype = debug_make_complex_type (dhandle, 16); - break; - case 27: - name = "integer*1"; - rettype = debug_make_int_type (dhandle, 1, false); - break; - case 28: - name = "integer*2"; - rettype = debug_make_int_type (dhandle, 2, false); - break; - case 29: - name = "integer*4"; - rettype = debug_make_int_type (dhandle, 4, false); - break; - case 30: - /* FIXME */ - name = "wchar"; - rettype = debug_make_int_type (dhandle, 2, false); - break; - case 31: - name = "long long"; - rettype = debug_make_int_type (dhandle, 8, false); - break; - case 32: - name = "unsigned long long"; - rettype = debug_make_int_type (dhandle, 8, true); - break; - case 33: - name = "logical*8"; - rettype = debug_make_bool_type (dhandle, 8); - break; - case 34: - name = "integer*8"; - rettype = debug_make_int_type (dhandle, 8, false); - break; - default: - abort (); - } - - rettype = debug_name_type (dhandle, name, rettype); - - info->xcoff_types[-typenum] = rettype; - - return rettype; -} - -/* Find or create a tagged type. */ - -static debug_type -stab_find_tagged_type (dhandle, info, p, len, kind) - PTR dhandle; - struct stab_handle *info; - const char *p; - int len; - enum debug_type_kind kind; -{ - char *name; - debug_type dtype; - struct stab_tag *st; - - name = savestring (p, len); - - /* We pass DEBUG_KIND_ILLEGAL because we want all tags in the same - namespace. This is right for C, and I don't know how to handle - other languages. FIXME. */ - dtype = debug_find_tagged_type (dhandle, name, DEBUG_KIND_ILLEGAL); - if (dtype != DEBUG_TYPE_NULL) - { - free (name); - return dtype; - } - - /* We need to allocate an entry on the undefined tag list. */ - for (st = info->tags; st != NULL; st = st->next) - { - if (st->name[0] == name[0] - && strcmp (st->name, name) == 0) - { - if (st->kind == DEBUG_KIND_ILLEGAL) - st->kind = kind; - free (name); - break; - } - } - if (st == NULL) - { - st = (struct stab_tag *) xmalloc (sizeof *st); - memset (st, 0, sizeof *st); - - st->next = info->tags; - st->name = name; - st->kind = kind; - st->slot = DEBUG_TYPE_NULL; - st->type = debug_make_indirect_type (dhandle, &st->slot, name); - info->tags = st; - } - - return st->type; -} - -/* In order to get the correct argument types for a stubbed method, we - need to extract the argument types from a C++ mangled string. - Since the argument types can refer back to the return type, this - means that we must demangle the entire physical name. In gdb this - is done by calling cplus_demangle and running the results back - through the C++ expression parser. Since we have no expression - parser, we must duplicate much of the work of cplus_demangle here. - - We assume that GNU style demangling is used, since this is only - done for method stubs, and only g++ should output that form of - debugging information. */ - -/* This structure is used to hold a pointer to type information which - demangling a string. */ - -struct stab_demangle_typestring -{ - /* The start of the type. This is not null terminated. */ - const char *typestring; - /* The length of the type. */ - unsigned int len; -}; - -/* This structure is used to hold information while demangling a - string. */ - -struct stab_demangle_info -{ - /* The debugging information handle. */ - PTR dhandle; - /* The stab information handle. */ - struct stab_handle *info; - /* The array of arguments we are building. */ - debug_type *args; - /* Whether the method takes a variable number of arguments. */ - boolean varargs; - /* The array of types we have remembered. */ - struct stab_demangle_typestring *typestrings; - /* The number of typestrings. */ - unsigned int typestring_count; - /* The number of typestring slots we have allocated. */ - unsigned int typestring_alloc; -}; - -static void stab_bad_demangle PARAMS ((const char *)); -static unsigned int stab_demangle_count PARAMS ((const char **)); -static boolean stab_demangle_get_count - PARAMS ((const char **, unsigned int *)); -static boolean stab_demangle_prefix - PARAMS ((struct stab_demangle_info *, const char **)); -static boolean stab_demangle_function_name - PARAMS ((struct stab_demangle_info *, const char **, const char *)); -static boolean stab_demangle_signature - PARAMS ((struct stab_demangle_info *, const char **)); -static boolean stab_demangle_qualified - PARAMS ((struct stab_demangle_info *, const char **, debug_type *)); -static boolean stab_demangle_template - PARAMS ((struct stab_demangle_info *, const char **, char **)); -static boolean stab_demangle_class - PARAMS ((struct stab_demangle_info *, const char **, const char **)); -static boolean stab_demangle_args - PARAMS ((struct stab_demangle_info *, const char **, debug_type **, - boolean *)); -static boolean stab_demangle_arg - PARAMS ((struct stab_demangle_info *, const char **, debug_type **, - unsigned int *, unsigned int *)); -static boolean stab_demangle_type - PARAMS ((struct stab_demangle_info *, const char **, debug_type *)); -static boolean stab_demangle_fund_type - PARAMS ((struct stab_demangle_info *, const char **, debug_type *)); -static boolean stab_demangle_remember_type - PARAMS ((struct stab_demangle_info *, const char *, int)); - -/* Warn about a bad demangling. */ - -static void -stab_bad_demangle (s) - const char *s; -{ - fprintf (stderr, _("bad mangled name `%s'\n"), s); -} - -/* Get a count from a stab string. */ - -static unsigned int -stab_demangle_count (pp) - const char **pp; -{ - unsigned int count; - - count = 0; - while (isdigit ((unsigned char) **pp)) - { - count *= 10; - count += **pp - '0'; - ++*pp; - } - return count; -} - -/* Require a count in a string. The count may be multiple digits, in - which case it must end in an underscore. */ - -static boolean -stab_demangle_get_count (pp, pi) - const char **pp; - unsigned int *pi; -{ - if (! isdigit ((unsigned char) **pp)) - return false; - - *pi = **pp - '0'; - ++*pp; - if (isdigit ((unsigned char) **pp)) - { - unsigned int count; - const char *p; - - count = *pi; - p = *pp; - do - { - count *= 10; - count += *p - '0'; - ++p; - } - while (isdigit ((unsigned char) *p)); - if (*p == '_') - { - *pp = p + 1; - *pi = count; - } - } - - return true; -} - -/* This function demangles a physical name, returning a NULL - terminated array of argument types. */ - -static debug_type * -stab_demangle_argtypes (dhandle, info, physname, pvarargs) - PTR dhandle; - struct stab_handle *info; - const char *physname; - boolean *pvarargs; -{ - struct stab_demangle_info minfo; - - minfo.dhandle = dhandle; - minfo.info = info; - minfo.args = NULL; - minfo.varargs = false; - minfo.typestring_alloc = 10; - minfo.typestrings = ((struct stab_demangle_typestring *) - xmalloc (minfo.typestring_alloc - * sizeof *minfo.typestrings)); - minfo.typestring_count = 0; - - /* cplus_demangle checks for special GNU mangled forms, but we can't - see any of them in mangled method argument types. */ - - if (! stab_demangle_prefix (&minfo, &physname)) - goto error_return; - - if (*physname != '\0') - { - if (! stab_demangle_signature (&minfo, &physname)) - goto error_return; - } - - free (minfo.typestrings); - minfo.typestrings = NULL; - - if (minfo.args == NULL) - fprintf (stderr, _("no argument types in mangled string\n")); - - *pvarargs = minfo.varargs; - return minfo.args; - - error_return: - if (minfo.typestrings != NULL) - free (minfo.typestrings); - return NULL; -} - -/* Demangle the prefix of the mangled name. */ - -static boolean -stab_demangle_prefix (minfo, pp) - struct stab_demangle_info *minfo; - const char **pp; -{ - const char *scan; - unsigned int i; - - /* cplus_demangle checks for global constructors and destructors, - but we can't see them in mangled argument types. */ - - /* Look for `__'. */ - scan = *pp; - do - { - scan = strchr (scan, '_'); - } - while (scan != NULL && *++scan != '_'); - - if (scan == NULL) - { - stab_bad_demangle (*pp); - return false; - } - - --scan; - - /* We found `__'; move ahead to the last contiguous `__' pair. */ - i = strspn (scan, "_"); - if (i > 2) - scan += i - 2; - - if (scan == *pp - && (isdigit ((unsigned char) scan[2]) - || scan[2] == 'Q' - || scan[2] == 't')) - { - /* This is a GNU style constructor name. */ - *pp = scan + 2; - return true; - } - else if (scan == *pp - && ! isdigit ((unsigned char) scan[2]) - && scan[2] != 't') - { - /* Look for the `__' that separates the prefix from the - signature. */ - while (*scan == '_') - ++scan; - scan = strstr (scan, "__"); - if (scan == NULL || scan[2] == '\0') - { - stab_bad_demangle (*pp); - return false; - } - - return stab_demangle_function_name (minfo, pp, scan); - } - else if (scan[2] != '\0') - { - /* The name doesn't start with `__', but it does contain `__'. */ - return stab_demangle_function_name (minfo, pp, scan); - } - else - { - stab_bad_demangle (*pp); - return false; - } - /*NOTREACHED*/ -} - -/* Demangle a function name prefix. The scan argument points to the - double underscore which separates the function name from the - signature. */ - -static boolean -stab_demangle_function_name (minfo, pp, scan) - struct stab_demangle_info *minfo; - const char **pp; - const char *scan; -{ - const char *name; - - /* The string from *pp to scan is the name of the function. We - don't care about the name, since we just looking for argument - types. However, for conversion operators, the name may include a - type which we must remember in order to handle backreferences. */ - - name = *pp; - *pp = scan + 2; - - if (*pp - name >= 5 - && strncmp (name, "type", 4) == 0 - && (name[4] == '$' || name[4] == '.')) - { - const char *tem; - - /* This is a type conversion operator. */ - tem = name + 5; - if (! stab_demangle_type (minfo, &tem, (debug_type *) NULL)) - return false; - } - else if (name[0] == '_' - && name[1] == '_' - && name[2] == 'o' - && name[3] == 'p') - { - const char *tem; - - /* This is a type conversion operator. */ - tem = name + 4; - if (! stab_demangle_type (minfo, &tem, (debug_type *) NULL)) - return false; - } - - return true; -} - -/* Demangle the signature. This is where the argument types are - found. */ - -static boolean -stab_demangle_signature (minfo, pp) - struct stab_demangle_info *minfo; - const char **pp; -{ - const char *orig; - boolean expect_func, func_done; - const char *hold; - - orig = *pp; - - expect_func = false; - func_done = false; - hold = NULL; - - while (**pp != '\0') - { - switch (**pp) - { - case 'Q': - hold = *pp; - if (! stab_demangle_qualified (minfo, pp, (debug_type *) NULL) - || ! stab_demangle_remember_type (minfo, hold, *pp - hold)) - return false; - expect_func = true; - hold = NULL; - break; - - case 'S': - /* Static member function. FIXME: Can this happen? */ - if (hold == NULL) - hold = *pp; - ++*pp; - break; - - case 'C': - /* Const member function. */ - if (hold == NULL) - hold = *pp; - ++*pp; - break; - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - if (hold == NULL) - hold = *pp; - if (! stab_demangle_class (minfo, pp, (const char **) NULL) - || ! stab_demangle_remember_type (minfo, hold, *pp - hold)) - return false; - expect_func = true; - hold = NULL; - break; - - case 'F': - /* Function. I don't know if this actually happens with g++ - output. */ - hold = NULL; - func_done = true; - ++*pp; - if (! stab_demangle_args (minfo, pp, &minfo->args, &minfo->varargs)) - return false; - break; - - case 't': - /* Template. */ - if (hold == NULL) - hold = *pp; - if (! stab_demangle_template (minfo, pp, (char **) NULL) - || ! stab_demangle_remember_type (minfo, hold, *pp - hold)) - return false; - hold = NULL; - expect_func = true; - break; - - case '_': - /* At the outermost level, we cannot have a return type - specified, so if we run into another '_' at this point we - are dealing with a mangled name that is either bogus, or - has been mangled by some algorithm we don't know how to - deal with. So just reject the entire demangling. */ - stab_bad_demangle (orig); - return false; - - default: - /* Assume we have stumbled onto the first outermost function - argument token, and start processing args. */ - func_done = true; - if (! stab_demangle_args (minfo, pp, &minfo->args, &minfo->varargs)) - return false; - break; - } - - if (expect_func) - { - func_done = true; - if (! stab_demangle_args (minfo, pp, &minfo->args, &minfo->varargs)) - return false; - } - } - - if (! func_done) - { - /* With GNU style demangling, bar__3foo is 'foo::bar(void)', and - bar__3fooi is 'foo::bar(int)'. We get here when we find the - first case, and need to ensure that the '(void)' gets added - to the current declp. */ - if (! stab_demangle_args (minfo, pp, &minfo->args, &minfo->varargs)) - return false; - } - - return true; -} - -/* Demangle a qualified name, such as "Q25Outer5Inner" which is the - mangled form of "Outer::Inner". */ - -static boolean -stab_demangle_qualified (minfo, pp, ptype) - struct stab_demangle_info *minfo; - const char **pp; - debug_type *ptype; -{ - const char *orig; - const char *p; - unsigned int qualifiers; - debug_type context; - - orig = *pp; - - switch ((*pp)[1]) - { - case '_': - /* GNU mangled name with more than 9 classes. The count is - preceded by an underscore (to distinguish it from the <= 9 - case) and followed by an underscore. */ - p = *pp + 2; - if (! isdigit ((unsigned char) *p) || *p == '0') - { - stab_bad_demangle (orig); - return false; - } - qualifiers = atoi (p); - while (isdigit ((unsigned char) *p)) - ++p; - if (*p != '_') - { - stab_bad_demangle (orig); - return false; - } - *pp = p + 1; - break; - - case '1': case '2': case '3': case '4': case '5': - case '6': case '7': case '8': case '9': - qualifiers = (*pp)[1] - '0'; - /* Skip an optional underscore after the count. */ - if ((*pp)[2] == '_') - ++*pp; - *pp += 2; - break; - - case '0': - default: - stab_bad_demangle (orig); - return false; - } - - context = DEBUG_TYPE_NULL; - - /* Pick off the names. */ - while (qualifiers-- > 0) - { - if (**pp == '_') - ++*pp; - if (**pp == 't') - { - char *name; - - if (! stab_demangle_template (minfo, pp, - ptype != NULL ? &name : NULL)) - return false; - - if (ptype != NULL) - { - context = stab_find_tagged_type (minfo->dhandle, minfo->info, - name, strlen (name), - DEBUG_KIND_CLASS); - free (name); - if (context == DEBUG_TYPE_NULL) - return false; - } - } - else - { - unsigned int len; - - len = stab_demangle_count (pp); - if (strlen (*pp) < len) - { - stab_bad_demangle (orig); - return false; - } - - if (ptype != NULL) - { - const debug_field *fields; - - fields = NULL; - if (context != DEBUG_TYPE_NULL) - fields = debug_get_fields (minfo->dhandle, context); - - context = DEBUG_TYPE_NULL; - - if (fields != NULL) - { - char *name; - - /* Try to find the type by looking through the - fields of context until we find a field with the - same type. This ought to work for a class - defined within a class, but it won't work for, - e.g., an enum defined within a class. stabs does - not give us enough information to figure out the - latter case. */ - - name = savestring (*pp, len); - - for (; *fields != DEBUG_FIELD_NULL; fields++) - { - debug_type ft; - const char *dn; - - ft = debug_get_field_type (minfo->dhandle, *fields); - if (ft == NULL) - return false; - dn = debug_get_type_name (minfo->dhandle, ft); - if (dn != NULL && strcmp (dn, name) == 0) - { - context = ft; - break; - } - } - - free (name); - } - - if (context == DEBUG_TYPE_NULL) - { - /* We have to fall back on finding the type by name. - If there are more types to come, then this must - be a class. Otherwise, it could be anything. */ - - if (qualifiers == 0) - { - char *name; - - name = savestring (*pp, len); - context = debug_find_named_type (minfo->dhandle, - name); - free (name); - } - - if (context == DEBUG_TYPE_NULL) - { - context = stab_find_tagged_type (minfo->dhandle, - minfo->info, - *pp, len, - (qualifiers == 0 - ? DEBUG_KIND_ILLEGAL - : DEBUG_KIND_CLASS)); - if (context == DEBUG_TYPE_NULL) - return false; - } - } - } - - *pp += len; - } - } - - if (ptype != NULL) - *ptype = context; - - return true; -} - -/* Demangle a template. If PNAME is not NULL, this sets *PNAME to a - string representation of the template. */ - -static boolean -stab_demangle_template (minfo, pp, pname) - struct stab_demangle_info *minfo; - const char **pp; - char **pname; -{ - const char *orig; - unsigned int r, i; - - orig = *pp; - - ++*pp; - - /* Skip the template name. */ - r = stab_demangle_count (pp); - if (r == 0 || strlen (*pp) < r) - { - stab_bad_demangle (orig); - return false; - } - *pp += r; - - /* Get the size of the parameter list. */ - if (stab_demangle_get_count (pp, &r) == 0) - { - stab_bad_demangle (orig); - return false; - } - - for (i = 0; i < r; i++) - { - if (**pp == 'Z') - { - /* This is a type parameter. */ - ++*pp; - if (! stab_demangle_type (minfo, pp, (debug_type *) NULL)) - return false; - } - else - { - const char *old_p; - boolean pointerp, realp, integralp, charp, boolp; - boolean done; - - old_p = *pp; - pointerp = false; - realp = false; - integralp = false; - charp = false; - boolp = false; - done = false; - - /* This is a value parameter. */ - - if (! stab_demangle_type (minfo, pp, (debug_type *) NULL)) - return false; - - while (*old_p != '\0' && ! done) - { - switch (*old_p) - { - case 'P': - case 'p': - case 'R': - pointerp = true; - done = true; - break; - case 'C': /* Const. */ - case 'S': /* Signed. */ - case 'U': /* Unsigned. */ - case 'V': /* Volatile. */ - case 'F': /* Function. */ - case 'M': /* Member function. */ - case 'O': /* ??? */ - ++old_p; - break; - case 'Q': /* Qualified name. */ - integralp = true; - done = true; - break; - case 'T': /* Remembered type. */ - abort (); - case 'v': /* Void. */ - abort (); - case 'x': /* Long long. */ - case 'l': /* Long. */ - case 'i': /* Int. */ - case 's': /* Short. */ - case 'w': /* Wchar_t. */ - integralp = true; - done = true; - break; - case 'b': /* Bool. */ - boolp = true; - done = true; - break; - case 'c': /* Char. */ - charp = true; - done = true; - break; - case 'r': /* Long double. */ - case 'd': /* Double. */ - case 'f': /* Float. */ - realp = true; - done = true; - break; - default: - /* Assume it's a user defined integral type. */ - integralp = true; - done = true; - break; - } - } - - if (integralp) - { - if (**pp == 'm') - ++*pp; - while (isdigit ((unsigned char) **pp)) - ++*pp; - } - else if (charp) - { - unsigned int val; - - if (**pp == 'm') - ++*pp; - val = stab_demangle_count (pp); - if (val == 0) - { - stab_bad_demangle (orig); - return false; - } - } - else if (boolp) - { - unsigned int val; - - val = stab_demangle_count (pp); - if (val != 0 && val != 1) - { - stab_bad_demangle (orig); - return false; - } - } - else if (realp) - { - if (**pp == 'm') - ++*pp; - while (isdigit ((unsigned char) **pp)) - ++*pp; - if (**pp == '.') - { - ++*pp; - while (isdigit ((unsigned char) **pp)) - ++*pp; - } - if (**pp == 'e') - { - ++*pp; - while (isdigit ((unsigned char) **pp)) - ++*pp; - } - } - else if (pointerp) - { - unsigned int len; - - if (! stab_demangle_get_count (pp, &len)) - { - stab_bad_demangle (orig); - return false; - } - *pp += len; - } - } - } - - /* We can translate this to a string fairly easily by invoking the - regular demangling routine. */ - if (pname != NULL) - { - char *s1, *s2, *s3, *s4; - char *from, *to; - - s1 = savestring (orig, *pp - orig); - - s2 = concat ("NoSuchStrinG__", s1, (const char *) NULL); - - free (s1); - - s3 = cplus_demangle (s2, DMGL_ANSI); - - free (s2); - - if (s3 != NULL) - s4 = strstr (s3, "::NoSuchStrinG"); - if (s3 == NULL || s4 == NULL) - { - stab_bad_demangle (orig); - if (s3 != NULL) - free (s3); - return false; - } - - /* Eliminating all spaces, except those between > characters, - makes it more likely that the demangled name will match the - name which g++ used as the structure name. */ - for (from = to = s3; from != s4; ++from) - if (*from != ' ' - || (from[1] == '>' && from > s3 && from[-1] == '>')) - *to++ = *from; - - *pname = savestring (s3, to - s3); - - free (s3); - } - - return true; -} - -/* Demangle a class name. */ - -static boolean -stab_demangle_class (minfo, pp, pstart) - struct stab_demangle_info *minfo ATTRIBUTE_UNUSED; - const char **pp; - const char **pstart; -{ - const char *orig; - unsigned int n; - - orig = *pp; - - n = stab_demangle_count (pp); - if (strlen (*pp) < n) - { - stab_bad_demangle (orig); - return false; - } - - if (pstart != NULL) - *pstart = *pp; - - *pp += n; - - return true; -} - -/* Demangle function arguments. If the pargs argument is not NULL, it - is set to a NULL terminated array holding the arguments. */ - -static boolean -stab_demangle_args (minfo, pp, pargs, pvarargs) - struct stab_demangle_info *minfo; - const char **pp; - debug_type **pargs; - boolean *pvarargs; -{ - const char *orig; - unsigned int alloc, count; - - orig = *pp; - - alloc = 10; - if (pargs != NULL) - { - *pargs = (debug_type *) xmalloc (alloc * sizeof **pargs); - *pvarargs = false; - } - count = 0; - - while (**pp != '_' && **pp != '\0' && **pp != 'e') - { - if (**pp == 'N' || **pp == 'T') - { - char temptype; - unsigned int r, t; - - temptype = **pp; - ++*pp; - - if (temptype == 'T') - r = 1; - else - { - if (! stab_demangle_get_count (pp, &r)) - { - stab_bad_demangle (orig); - return false; - } - } - - if (! stab_demangle_get_count (pp, &t)) - { - stab_bad_demangle (orig); - return false; - } - - if (t >= minfo->typestring_count) - { - stab_bad_demangle (orig); - return false; - } - while (r-- > 0) - { - const char *tem; - - tem = minfo->typestrings[t].typestring; - if (! stab_demangle_arg (minfo, &tem, pargs, &count, &alloc)) - return false; - } - } - else - { - if (! stab_demangle_arg (minfo, pp, pargs, &count, &alloc)) - return false; - } - } - - if (pargs != NULL) - (*pargs)[count] = DEBUG_TYPE_NULL; - - if (**pp == 'e') - { - if (pargs != NULL) - *pvarargs = true; - ++*pp; - } - - return true; -} - -/* Demangle a single argument. */ - -static boolean -stab_demangle_arg (minfo, pp, pargs, pcount, palloc) - struct stab_demangle_info *minfo; - const char **pp; - debug_type **pargs; - unsigned int *pcount; - unsigned int *palloc; -{ - const char *start; - debug_type type; - - start = *pp; - if (! stab_demangle_type (minfo, pp, - pargs == NULL ? (debug_type *) NULL : &type) - || ! stab_demangle_remember_type (minfo, start, *pp - start)) - return false; - - if (pargs != NULL) - { - if (type == DEBUG_TYPE_NULL) - return false; - - if (*pcount + 1 >= *palloc) - { - *palloc += 10; - *pargs = ((debug_type *) - xrealloc (*pargs, *palloc * sizeof **pargs)); - } - (*pargs)[*pcount] = type; - ++*pcount; - } - - return true; -} - -/* Demangle a type. If the ptype argument is not NULL, *ptype is set - to the newly allocated type. */ - -static boolean -stab_demangle_type (minfo, pp, ptype) - struct stab_demangle_info *minfo; - const char **pp; - debug_type *ptype; -{ - const char *orig; - - orig = *pp; - - switch (**pp) - { - case 'P': - case 'p': - /* A pointer type. */ - ++*pp; - if (! stab_demangle_type (minfo, pp, ptype)) - return false; - if (ptype != NULL) - *ptype = debug_make_pointer_type (minfo->dhandle, *ptype); - break; - - case 'R': - /* A reference type. */ - ++*pp; - if (! stab_demangle_type (minfo, pp, ptype)) - return false; - if (ptype != NULL) - *ptype = debug_make_reference_type (minfo->dhandle, *ptype); - break; - - case 'A': - /* An array. */ - { - unsigned long high; - - ++*pp; - high = 0; - while (**pp != '\0' && **pp != '_') - { - if (! isdigit ((unsigned char) **pp)) - { - stab_bad_demangle (orig); - return false; - } - high *= 10; - high += **pp - '0'; - ++*pp; - } - if (**pp != '_') - { - stab_bad_demangle (orig); - return false; - } - ++*pp; - - if (! stab_demangle_type (minfo, pp, ptype)) - return false; - if (ptype != NULL) - { - debug_type int_type; - - int_type = debug_find_named_type (minfo->dhandle, "int"); - if (int_type == NULL) - int_type = debug_make_int_type (minfo->dhandle, 4, false); - *ptype = debug_make_array_type (minfo->dhandle, *ptype, int_type, - 0, high, false); - } - } - break; - - case 'T': - /* A back reference to a remembered type. */ - { - unsigned int i; - const char *p; - - ++*pp; - if (! stab_demangle_get_count (pp, &i)) - { - stab_bad_demangle (orig); - return false; - } - if (i >= minfo->typestring_count) - { - stab_bad_demangle (orig); - return false; - } - p = minfo->typestrings[i].typestring; - if (! stab_demangle_type (minfo, &p, ptype)) - return false; - } - break; - - case 'F': - /* A function. */ - { - debug_type *args; - boolean varargs; - - ++*pp; - if (! stab_demangle_args (minfo, pp, - (ptype == NULL - ? (debug_type **) NULL - : &args), - (ptype == NULL - ? (boolean *) NULL - : &varargs))) - return false; - if (**pp != '_') - { - /* cplus_demangle will accept a function without a return - type, but I don't know when that will happen, or what - to do if it does. */ - stab_bad_demangle (orig); - return false; - } - ++*pp; - if (! stab_demangle_type (minfo, pp, ptype)) - return false; - if (ptype != NULL) - *ptype = debug_make_function_type (minfo->dhandle, *ptype, args, - varargs); - - } - break; - - case 'M': - case 'O': - { - boolean memberp, constp, volatilep; - debug_type class_type = DEBUG_TYPE_NULL; - debug_type *args; - boolean varargs; - unsigned int n; - const char *name; - - memberp = **pp == 'M'; - constp = false; - volatilep = false; - args = NULL; - varargs = false; - - ++*pp; - if (isdigit ((unsigned char) **pp)) - { - n = stab_demangle_count (pp); - if (strlen (*pp) < n) - { - stab_bad_demangle (orig); - return false; - } - name = *pp; - *pp += n; - - if (ptype != NULL) - { - class_type = stab_find_tagged_type (minfo->dhandle, - minfo->info, - name, (int) n, - DEBUG_KIND_CLASS); - if (class_type == DEBUG_TYPE_NULL) - return false; - } - } - else if (**pp == 'Q') - { - if (! stab_demangle_qualified (minfo, pp, - (ptype == NULL - ? (debug_type *) NULL - : &class_type))) - return false; - } - else - { - stab_bad_demangle (orig); - return false; - } - - if (memberp) - { - if (**pp == 'C') - { - constp = true; - ++*pp; - } - else if (**pp == 'V') - { - volatilep = true; - ++*pp; - } - if (**pp != 'F') - { - stab_bad_demangle (orig); - return false; - } - ++*pp; - if (! stab_demangle_args (minfo, pp, - (ptype == NULL - ? (debug_type **) NULL - : &args), - (ptype == NULL - ? (boolean *) NULL - : &varargs))) - return false; - } - - if (**pp != '_') - { - stab_bad_demangle (orig); - return false; - } - ++*pp; - - if (! stab_demangle_type (minfo, pp, ptype)) - return false; - - if (ptype != NULL) - { - if (! memberp) - *ptype = debug_make_offset_type (minfo->dhandle, class_type, - *ptype); - else - { - /* FIXME: We have no way to record constp or - volatilep. */ - *ptype = debug_make_method_type (minfo->dhandle, *ptype, - class_type, args, varargs); - } - } - } - break; - - case 'G': - ++*pp; - if (! stab_demangle_type (minfo, pp, ptype)) - return false; - break; - - case 'C': - ++*pp; - if (! stab_demangle_type (minfo, pp, ptype)) - return false; - if (ptype != NULL) - *ptype = debug_make_const_type (minfo->dhandle, *ptype); - break; - - case 'Q': - { - const char *hold; - - hold = *pp; - if (! stab_demangle_qualified (minfo, pp, ptype)) - return false; - } - break; - - default: - if (! stab_demangle_fund_type (minfo, pp, ptype)) - return false; - break; - } - - return true; -} - -/* Demangle a fundamental type. If the ptype argument is not NULL, - *ptype is set to the newly allocated type. */ - -static boolean -stab_demangle_fund_type (minfo, pp, ptype) - struct stab_demangle_info *minfo; - const char **pp; - debug_type *ptype; -{ - const char *orig; - boolean constp, volatilep, unsignedp, signedp; - boolean done; - - orig = *pp; - - constp = false; - volatilep = false; - unsignedp = false; - signedp = false; - - done = false; - while (! done) - { - switch (**pp) - { - case 'C': - constp = true; - ++*pp; - break; - - case 'U': - unsignedp = true; - ++*pp; - break; - - case 'S': - signedp = true; - ++*pp; - break; - - case 'V': - volatilep = true; - ++*pp; - break; - - default: - done = true; - break; - } - } - - switch (**pp) - { - case '\0': - case '_': - /* cplus_demangle permits this, but I don't know what it means. */ - stab_bad_demangle (orig); - break; - - case 'v': /* void */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, "void"); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_void_type (minfo->dhandle); - } - ++*pp; - break; - - case 'x': /* long long */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, - (unsignedp - ? "long long unsigned int" - : "long long int")); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_int_type (minfo->dhandle, 8, unsignedp); - } - ++*pp; - break; - - case 'l': /* long */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, - (unsignedp - ? "long unsigned int" - : "long int")); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_int_type (minfo->dhandle, 4, unsignedp); - } - ++*pp; - break; - - case 'i': /* int */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, - (unsignedp - ? "unsigned int" - : "int")); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_int_type (minfo->dhandle, 4, unsignedp); - } - ++*pp; - break; - - case 's': /* short */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, - (unsignedp - ? "short unsigned int" - : "short int")); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_int_type (minfo->dhandle, 2, unsignedp); - } - ++*pp; - break; - - case 'b': /* bool */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, "bool"); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_bool_type (minfo->dhandle, 4); - } - ++*pp; - break; - - case 'c': /* char */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, - (unsignedp - ? "unsigned char" - : (signedp - ? "signed char" - : "char"))); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_int_type (minfo->dhandle, 1, unsignedp); - } - ++*pp; - break; - - case 'w': /* wchar_t */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, "__wchar_t"); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_int_type (minfo->dhandle, 2, true); - } - ++*pp; - break; - - case 'r': /* long double */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, "long double"); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_float_type (minfo->dhandle, 8); - } - ++*pp; - break; - - case 'd': /* double */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, "double"); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_float_type (minfo->dhandle, 8); - } - ++*pp; - break; - - case 'f': /* float */ - if (ptype != NULL) - { - *ptype = debug_find_named_type (minfo->dhandle, "float"); - if (*ptype == DEBUG_TYPE_NULL) - *ptype = debug_make_float_type (minfo->dhandle, 4); - } - ++*pp; - break; - - case 'G': - ++*pp; - if (! isdigit ((unsigned char) **pp)) - { - stab_bad_demangle (orig); - return false; - } - /* Fall through. */ - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - { - const char *hold; - - if (! stab_demangle_class (minfo, pp, &hold)) - return false; - if (ptype != NULL) - { - char *name; - - name = savestring (hold, *pp - hold); - *ptype = debug_find_named_type (minfo->dhandle, name); - free (name); - if (*ptype == DEBUG_TYPE_NULL) - { - /* FIXME: It is probably incorrect to assume that - undefined types are tagged types. */ - *ptype = stab_find_tagged_type (minfo->dhandle, minfo->info, - hold, *pp - hold, - DEBUG_KIND_ILLEGAL); - if (*ptype == DEBUG_TYPE_NULL) - return false; - } - } - } - break; - - case 't': - { - char *name; - - if (! stab_demangle_template (minfo, pp, - ptype != NULL ? &name : NULL)) - return false; - if (ptype != NULL) - { - *ptype = stab_find_tagged_type (minfo->dhandle, minfo->info, - name, strlen (name), - DEBUG_KIND_CLASS); - free (name); - if (*ptype == DEBUG_TYPE_NULL) - return false; - } - } - break; - - default: - stab_bad_demangle (orig); - return false; - } - - if (ptype != NULL) - { - if (constp) - *ptype = debug_make_const_type (minfo->dhandle, *ptype); - if (volatilep) - *ptype = debug_make_volatile_type (minfo->dhandle, *ptype); - } - - return true; -} - -/* Remember a type string in a demangled string. */ - -static boolean -stab_demangle_remember_type (minfo, p, len) - struct stab_demangle_info *minfo; - const char *p; - int len; -{ - if (minfo->typestring_count >= minfo->typestring_alloc) - { - minfo->typestring_alloc += 10; - minfo->typestrings = ((struct stab_demangle_typestring *) - xrealloc (minfo->typestrings, - (minfo->typestring_alloc - * sizeof *minfo->typestrings))); - } - - minfo->typestrings[minfo->typestring_count].typestring = p; - minfo->typestrings[minfo->typestring_count].len = (unsigned int) len; - ++minfo->typestring_count; - - return true; -} diff --git a/binutils/stamp-h.in b/binutils/stamp-h.in deleted file mode 100644 index 9788f70238c..00000000000 --- a/binutils/stamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp diff --git a/binutils/strings.1 b/binutils/strings.1 deleted file mode 100644 index 4d33b7996b7..00000000000 --- a/binutils/strings.1 +++ /dev/null @@ -1,151 +0,0 @@ -.\" Copyright (c) 1993, 94, 95, 2000 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH strings 1 "09 March 2000" "cygnus support" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -strings \- print the strings of printable characters in files - -.SH SYNOPSIS -.hy 0 -.na -.TP -.B strings -.RB "[\|" \-a | \-\c -.RB | \-\-all "\|]" -.RB "[\|" \-f | \-\-print\-file\-name "\|]" -.RB "[\|" \-o "\|]" -.RB "[\|" \-\-help "\|]" -.RB "[\|" \-v | \-\-version "\|]" -.RB "[\|" \-n -.I min\-len\c -.RI | \-min\-len\c -.RB | "\-\-bytes="\c -.I min\-len\c -\&\|] -.RB "[\|" \-t -.I {o,x,d}\c -.RB "[\|" "\-\-target=\fIbfdname" "\|]" -.RB | "\-\-radix="\c -.I {o,x,d}\c -\&\|] -.I file\c -.ad b -.hy 1 -.SH DESCRIPTION -For each -.I file -given, GNU \c -.B 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. - -.PP -.B strings -is mainly useful for determining the contents of non-text files. - -.SH OPTIONS -The long and short forms of options, shown here as alternatives, are -equivalent. - -.TP -.B \-a -.TP -.B \-\-all -.TP -.B \- -Do not scan only the initialized and loaded sections of object files; -scan the whole files. - -.TP -.B \-f -.TP -.B \-\-print\-file\-name -Print the name of the file before each string. - -.TP -.B \-\-help -Print a summary of the options to -.B strings -on the standard output and exit. - -.TP -.B \-v -.TP -.B \-\-version -Print the version number -of -.B strings -on the standard output and exit. - -.TP -.B "\-n \fImin\-len\fP" -.TP -.B "\-\fImin\-len\fP" -.TP -.B "\-\-bytes=\fImin\-len\fP" -Print sequences of characters that are at least -.I min\-len -characters long, instead of the default 4. - -.TP -.BR "\-t " {o,x,d} -.TP -.BR "\-\-radix=" {o,x,d} -Print the offset within the file before each string. The single -character argument specifies the radix of the offset\(emoctal, -hexadecimal, or decimal. - -.TP -.BI "\-\-target=" "bfdname" -Specify an object code format other than your system's default format. -See -.BR objdump ( 1 ), -for information on listing available formats. - -.TP -.B \-o -Like -.BR "\-t o" . - -.PP - -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.B -info\c -\&; -.I -The GNU Binary Utilities\c -\&, Roland H. Pesch (October 1991); -.BR ar ( 1 ), -.BR nm ( 1 ), -.BR objdump ( 1 ), -.BR ranlib ( 1 ). - - -.SH COPYING -Copyright (c) 1993 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/binutils/strings.c b/binutils/strings.c deleted file mode 100644 index ab845b04d42..00000000000 --- a/binutils/strings.c +++ /dev/null @@ -1,512 +0,0 @@ -/* strings -- print the strings of printable characters in files - Copyright (C) 1993, 94, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* Usage: strings [options] file... - - Options: - --all - -a - - Do not scan only the initialized data section of object files. - - --print-file-name - -f Print the name of the file before each string. - - --bytes=min-len - -n min-len - -min-len Print graphic char sequences, MIN-LEN or more bytes long, - that are followed by a NUL or a newline. Default is 4. - - --radix={o,x,d} - -t {o,x,d} Print the offset within the file before each string, - in octal/hex/decimal. - - -o Like -to. (Some other implementations have -o like -to, - others like -td. We chose one arbitrarily.) - - --target=BFDNAME - Specify a non-default object file format. - - --help - -h Print the usage message on the standard output. - - --version - -v Print the program version number. - - Written by Richard Stallman - and David MacKenzie . */ - -#include "bfd.h" -#include -#include -#include -#include -#include "bucomm.h" -#include "libiberty.h" - -#ifdef isascii -#define isgraphic(c) (isascii (c) && isprint (c)) -#else -#define isgraphic(c) (isprint (c)) -#endif - -#ifndef errno -extern int errno; -#endif - -/* The BFD section flags that identify an initialized data section. */ -#define DATA_FLAGS (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS) - -/* Radix for printing addresses (must be 8, 10 or 16). */ -static int address_radix; - -/* Minimum length of sequence of graphic chars to trigger output. */ -static int string_min; - -/* true means print address within file for each string. */ -static boolean print_addresses; - -/* true means print filename for each string. */ -static boolean print_filenames; - -/* true means for object files scan only the data section. */ -static boolean datasection_only; - -/* true if we found an initialized data section in the current file. */ -static boolean got_a_section; - -/* The BFD object file format. */ -static char *target; - -static struct option long_options[] = -{ - {"all", no_argument, NULL, 'a'}, - {"print-file-name", no_argument, NULL, 'f'}, - {"bytes", required_argument, NULL, 'n'}, - {"radix", required_argument, NULL, 't'}, - {"target", required_argument, NULL, 'T'}, - {"help", no_argument, NULL, 'h'}, - {"version", no_argument, NULL, 'v'}, - {NULL, 0, NULL, 0} -}; - -static void strings_a_section PARAMS ((bfd *, asection *, PTR)); -static boolean strings_object_file PARAMS ((const char *)); -static boolean strings_file PARAMS ((char *file)); -static int integer_arg PARAMS ((char *s)); -static void print_strings PARAMS ((const char *filename, FILE *stream, - file_ptr address, int stop_point, - int magiccount, char *magic)); -static void usage PARAMS ((FILE *stream, int status)); - -int -main (argc, argv) - int argc; - char **argv; -{ - int optc; - int exit_status = 0; - boolean files_given = false; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = argv[0]; - xmalloc_set_program_name (program_name); - string_min = -1; - print_addresses = false; - print_filenames = false; - datasection_only = true; - target = NULL; - - while ((optc = getopt_long (argc, argv, "afn:ot:v0123456789", - long_options, (int *) 0)) != EOF) - { - switch (optc) - { - case 'a': - datasection_only = false; - break; - - case 'f': - print_filenames = true; - break; - - case 'h': - usage (stdout, 0); - - case 'n': - string_min = integer_arg (optarg); - if (string_min < 1) - { - fatal (_("invalid number %s"), optarg); - } - break; - - case 'o': - print_addresses = true; - address_radix = 8; - break; - - case 't': - print_addresses = true; - if (optarg[1] != '\0') - usage (stderr, 1); - switch (optarg[0]) - { - case 'o': - address_radix = 8; - break; - - case 'd': - address_radix = 10; - break; - - case 'x': - address_radix = 16; - break; - - default: - usage (stderr, 1); - } - break; - - case 'T': - target = optarg; - break; - - case 'v': - print_version ("strings"); - break; - - case '?': - usage (stderr, 1); - - default: - if (string_min < 0) - string_min = optc - '0'; - else - string_min = string_min * 10 + optc - '0'; - break; - } - } - - if (string_min < 0) - string_min = 4; - - bfd_init (); - set_default_bfd_target (); - - if (optind >= argc) - { - datasection_only = false; - print_strings ("{standard input}", stdin, 0, 0, 0, (char *) NULL); - files_given = true; - } - else - { - for (; optind < argc; ++optind) - { - if (strcmp (argv[optind], "-") == 0) - datasection_only = false; - else - { - files_given = true; - exit_status |= (strings_file (argv[optind]) == false); - } - } - } - - if (files_given == false) - usage (stderr, 1); - - return (exit_status); -} - -/* Scan section SECT of the file ABFD, whose printable name is FILE. - If it contains initialized data, - set `got_a_section' and print the strings in it. */ - -static void -strings_a_section (abfd, sect, filearg) - bfd *abfd; - asection *sect; - PTR filearg; -{ - const char *file = (const char *) filearg; - - if ((sect->flags & DATA_FLAGS) == DATA_FLAGS) - { - bfd_size_type sz = bfd_get_section_size_before_reloc (sect); - PTR mem = xmalloc (sz); - if (bfd_get_section_contents (abfd, sect, mem, (file_ptr) 0, sz)) - { - got_a_section = true; - print_strings (file, (FILE *) NULL, sect->filepos, 0, sz, mem); - } - free (mem); - } -} - -/* Scan all of the sections in FILE, and print the strings - in the initialized data section(s). - - Return true if successful, - false if not (such as if FILE is not an object file). */ - -static boolean -strings_object_file (file) - const char *file; -{ - bfd *abfd = bfd_openr (file, target); - - if (abfd == NULL) - { - /* Treat the file as a non-object file. */ - return false; - } - - /* This call is mainly for its side effect of reading in the sections. - We follow the traditional behavior of `strings' in that we don't - complain if we don't recognize a file to be an object file. */ - if (bfd_check_format (abfd, bfd_object) == false) - { - bfd_close (abfd); - return false; - } - - got_a_section = false; - bfd_map_over_sections (abfd, strings_a_section, (PTR) file); - - if (!bfd_close (abfd)) - { - bfd_nonfatal (file); - return false; - } - - return got_a_section; -} - -/* Print the strings in FILE. Return true if ok, false if an error occurs. */ - -static boolean -strings_file (file) - char *file; -{ - /* If we weren't told to scan the whole file, - try to open it as an object file and only look at - initialized data sections. If that fails, fall back to the - whole file. */ - if (!datasection_only || !strings_object_file (file)) - { - FILE *stream; - - stream = fopen (file, "rb"); - /* Not all systems permit "rb", so try "r" if it failed. */ - if (stream == NULL) - stream = fopen (file, "r"); - if (stream == NULL) - { - fprintf (stderr, "%s: ", program_name); - perror (file); - return false; - } - - print_strings (file, stream, (file_ptr) 0, 0, 0, (char *) 0); - - if (fclose (stream) == EOF) - { - fprintf (stderr, "%s: ", program_name); - perror (file); - return false; - } - } - - return true; -} - -/* Find the strings in file FILENAME, read from STREAM. - Assume that STREAM is positioned so that the next byte read - is at address ADDRESS in the file. - Stop reading at address STOP_POINT in the file, if nonzero. - - If STREAM is NULL, do not read from it. - The caller can supply a buffer of characters - to be processed before the data in STREAM. - MAGIC is the address of the buffer and - MAGICCOUNT is how many characters are in it. - Those characters come at address ADDRESS and the data in STREAM follow. */ - -static void -print_strings (filename, stream, address, stop_point, magiccount, magic) - const char *filename; - FILE *stream; - file_ptr address; - int stop_point; - int magiccount; - char *magic; -{ - char *buf = (char *) xmalloc (string_min + 1); - - while (1) - { - file_ptr start; - int i; - int c; - - /* See if the next `string_min' chars are all graphic chars. */ - tryline: - if (stop_point && address >= stop_point) - break; - start = address; - for (i = 0; i < string_min; i++) - { - if (magiccount) - { - magiccount--; - c = *magic++; - } - else - { - if (stream == NULL) - return; - c = getc (stream); - if (c == EOF) - return; - } - address++; - if (!isgraphic (c)) - /* Found a non-graphic. Try again starting with next char. */ - goto tryline; - buf[i] = c; - } - - /* We found a run of `string_min' graphic characters. Print up - to the next non-graphic character. */ - - if (print_filenames) - printf ("%s: ", filename); - if (print_addresses) - switch (address_radix) - { - case 8: - printf ("%7lo ", (unsigned long) start); - break; - - case 10: - printf ("%7ld ", (long) start); - break; - - case 16: - printf ("%7lx ", (unsigned long) start); - break; - } - - buf[i] = '\0'; - fputs (buf, stdout); - - while (1) - { - if (magiccount) - { - magiccount--; - c = *magic++; - } - else - { - if (stream == NULL) - break; - c = getc (stream); - if (c == EOF) - break; - } - address++; - if (! isgraphic (c)) - break; - putchar (c); - } - - putchar ('\n'); - } -} - -/* Parse string S as an integer, using decimal radix by default, - but allowing octal and hex numbers as in C. */ - -static int -integer_arg (s) - char *s; -{ - int value; - int radix = 10; - char *p = s; - int c; - - if (*p != '0') - radix = 10; - else if (*++p == 'x') - { - radix = 16; - p++; - } - else - radix = 8; - - value = 0; - while (((c = *p++) >= '0' && c <= '9') - || (radix == 16 && (c & ~40) >= 'A' && (c & ~40) <= 'Z')) - { - value *= radix; - if (c >= '0' && c <= '9') - value += c - '0'; - else - value += (c & ~40) - 'A'; - } - - if (c == 'b') - value *= 512; - else if (c == 'B') - value *= 1024; - else - p--; - - if (*p) - { - fatal (_("invalid integer argument %s"), s); - } - return value; -} - -static void -usage (stream, status) - FILE *stream; - int status; -{ - fprintf (stream, _("\ -Usage: %s [-afov] [-n min-len] [-min-len] [-t {o,x,d}] [-]\n\ - [--all] [--print-file-name] [--bytes=min-len] [--radix={o,x,d}]\n\ - [--target=bfdname] [--help] [--version] file...\n"), - program_name); - list_supported_targets (program_name, stream); - if (status == 0) - fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); - exit (status); -} diff --git a/binutils/strip.1 b/binutils/strip.1 deleted file mode 100644 index 708817ded13..00000000000 --- a/binutils/strip.1 +++ /dev/null @@ -1,185 +0,0 @@ -.\" Copyright (c) 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH strip 1 "5 November 1991" "cygnus support" "GNU Development Tools" -.de BP -.sp -.ti \-.2i -\(** -.. - -.SH NAME -strip \- Discard symbols from object files. - -.SH SYNOPSIS -.hy 0 -.na -.TP -.B strip -.RB "[\|" \-F\ \fIbfdname\fR\ |\ \fB\-\-target=\fIbfdname\fP "\|]" -.RB "[\|" \-I\ \fIbfdname\fR\ |\ \fB\-\-input\-target=\fIbfdname\fP "\|]" -.RB "[\|" \-O\ \fIbfdname\fR\ |\ \fB\-\-output\-target=\fIbfdname\fP "\|]" -.RB "[\|" \-R\ \fIsectionname\fR\ |\ \fB\-\-remove\-section=\fIsectionname\fP "\|]" -.RB "[\|" \-s\fR\ |\ \fB\-\-strip\-all "\|]" -.RB "[\|" \-S\fR\ |\ \fB\-g\fR\ |\ \fB\-\-strip\-debug "\|]" -.RB "[\|" \-\-strip\-unneeded\fR "\|]" -.RB "[\|" \-x\fR\ |\ \fB\-\-discard\-all "\|]" -.RB "[\|" \-X\fR\ |\ \fB\-\-discard\-locals "\|]" -.RB "[\|" \-K\ \fIsymbolname\fR\ |\ \fB\-\-keep\-symbol=\fIsymbolname\fR "\|]" -.RB "[\|" \-N\ \fIsymbolname\fR\ |\ \fB\-\-strip\-symbol=\fIsymbolname\fR "\|]" -.RB "[\|" \-o\ \fIfile\f\R "\|]" -.RB "[\|" \-p\fR\ |\ \fB\-\-preserve\-dates "\|]" -.RB "[\|" \-v\fR\ |\ \fB\-\-verbose "\|]" -.RB "[\|" \-V\fR\ |\ \fB\-\-version "\|]" -.RB "[\|" \-V\fR\ |\ \fB\-\-help "\|]" -.I objfile\c -\&.\|.\|. - -.SH DESCRIPTION -GNU -.B strip -discards all symbols from the object files -.IR objfile . -The list of object files may include archives. -At least one object file must be given. - -.P -.B strip -modifies the files named in its argument, -rather than writing modified copies under different names. - -.SH OPTIONS -.TP -.B "\-F \fIbfdname" -.TP -.B "\-\-target=\fIbfdname" -Treat the original \fIobjfile\fP as a file with the object -code format \fIbfdname\fP, and rewrite it in the same format. - -.TP -.B \-\-help -Show a summary of the options to -.B strip -and exit. - -.TP -.B "\-I \fIbfdname -.TP -.B "\-\-input\-target=\fIbfdname" -Treat the original \fIobjfile\fP as a file with the object -code format \fIbfdname\fP. - -.TP -.B "\-O \fIbfdname\fP" -.TP -.B "\-\-output\-target=\fIbfdname" -Replace \fIobjfile\fP with a file in the output format \fIbfdname\fP. - -.TP -.B "\-R \fIsectionname\fP" -.TP -.B "\-\-remove\-section=\fIsectionname" -Remove the named section from the file. This option may be given more -than once. Note that using this option inappropriately may make the -object file unusable. - -.TP -.B \-s -.TP -.B \-\-strip\-all -Remove all symbols. - -.TP -.B \-S -.TP -.B \-g -.TP -.B \-\-strip\-debug -Remove debugging symbols only. - -.TP -.B \-\-strip\-unneeded -Strip all symbols that are not needed for relocation processing. - -.TP -.B \-N \fIsymbolname\fR -.TP -.B \-\-strip\-symbol=\fIsymbolname -Remove symbol \fIsymbolname\fP from the source file. This option -may be given more than once, and may be combined with other strip -options. - -.TP -.B \-o \fIfile\fR -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. - -.TP -.B \-p -.TP -.B \-\-preserve-dates -Preserve the access and modification dates of the file. - -.TP -.B \-x -.TP -.B \-\-discard\-all -Remove non-global symbols. - -.TP -.B \-X -.TP -.B \-\-discard\-locals -Remove compiler-generated local symbols. -(These usually start with ``L'' or ``.''.) - -.TP -.B \-K \fIsymbolname\fR, \fB\-\-keep\-symbol=\fIsymbolname -Copy only symbol \fIsymbolname\fP from the source file. This option -may be given more than once. - -.TP -.B \-N \fIsymbolname\fR, \fB\-\-strip\-symbol=\fIsymbolname -Do not copy symbol \fIsymbolname\fP from the source file. This option -may be given more than once, and may be combined with strip options -other than \fB\-K\fR. - -.TP -.B \-v -.TP -.B \-\-verbose -Verbose output: list all object files modified. In the case of -archives, -.B "strip \-v" -lists all members of the archive. - -.TP -.B \-V -.TP -.B \-\-version -Show the version number for \fBstrip\fP and exit. - -.SH "SEE ALSO" -.RB "`\|" binutils "\|'" -entry in -.BR info ; -.IR "The GNU Binary Utilities" , -Roland H. Pesch (October 1991). - -.SH COPYING -Copyright (c) 1991 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/binutils/sysdump.c b/binutils/sysdump.c deleted file mode 100644 index fd2a0ea3e47..00000000000 --- a/binutils/sysdump.c +++ /dev/null @@ -1,786 +0,0 @@ -/* Sysroff object format dumper. - Copyright (C) 1994, 95, 98, 99, 2000 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 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - - -/* Written by Steve Chamberlain . - - This program reads a SYSROFF object file and prints it in an - almost human readable form to stdout. */ - -#include "bfd.h" -#include "bucomm.h" - -#include -#include -#include -#include -#include "sysroff.h" - -#define PROGRAM_VERSION "1.0" - -static int dump = 1; -static int segmented_p; -static int code; -static int addrsize = 4; -static FILE *file; - -char * -getCHARS (ptr, idx, size, max) - unsigned char *ptr; - int *idx; - int size; - int max; -{ - int oc = *idx / 8; - char *r; - int b = size; - if (b >= max) - { - return "*undefined*"; - } - - if (b == 0) - { - /* Got to work out the length of the string from self */ - b = ptr[oc++]; - (*idx) += 8; - } - - *idx += b * 8; - r = xcalloc (b + 1, 1); - memcpy (r, ptr + oc, b); - r[b] = 0; - return r; -} - -static void -dh (ptr, size) - unsigned char *ptr; - int size; -{ - int i; - int j; - int span = 16; - - printf ("\n************************************************************\n"); - - for (i = 0; i < size; i += span) - { - for (j = 0; j < span; j++) - { - if (j + i < size) - printf ("%02x ", ptr[i + j]); - else - printf (" "); - } - - for (j = 0; j < span && j + i < size; j++) - { - int c = ptr[i + j]; - if (c < 32 || c > 127) - c = '.'; - printf ("%c", c); - } - printf ("\n"); - } -} - -int -fillup (ptr) - char *ptr; -{ - int size; - int sum; - int i; - size = getc (file) - 2; - fread (ptr, 1, size, file); - sum = code + size + 2; - for (i = 0; i < size; i++) - { - sum += ptr[i]; - } - - if ((sum & 0xff) != 0xff) - { - printf ("SUM IS %x\n", sum); - } - if (dump) - dh (ptr, size); - - return size - 1; -} - -barray -getBARRAY (ptr, idx, dsize, max) - unsigned char *ptr; - int *idx; - int dsize; - int max; -{ - barray res; - int i; - int byte = *idx / 8; - int size = ptr[byte++]; - res.len = size; - res.data = (unsigned char *) xmalloc (size); - for (i = 0; i < size; i++) - { - res.data[i] = ptr[byte++]; - } - return res; -} - -int -getINT (ptr, idx, size, max) - unsigned char *ptr; - int *idx; - int size; - int max; -{ - int n = 0; - int byte = *idx / 8; - - if (byte >= max) - { - return 0; - } - if (size == -2) - size = addrsize; - if (size == -1) - size = 0; - switch (size) - { - case 0: - return 0; - case 1: - n = (ptr[byte]); - break; - case 2: - n = (ptr[byte + 0] << 8) + ptr[byte + 1]; - break; - case 4: - n = (ptr[byte + 0] << 24) + (ptr[byte + 1] << 16) + (ptr[byte + 2] << 8) + (ptr[byte + 3]); - break; - default: - abort (); - } - *idx += size * 8; - return n; -} - -int -getBITS (ptr, idx, size, max) - char *ptr; - int *idx; - int size, max; -{ - int byte = *idx / 8; - int bit = *idx % 8; - - if (byte >= max) - return 0; - - *idx += size; - - return (ptr[byte] >> (8 - bit - size)) & ((1 << size) - 1); -} - -static void -itheader (name, code) - char *name; - int code; -{ - printf ("\n%s 0x%02x\n", name, code); -} - -static int indent; -static void -p () -{ - int i; - for (i = 0; i < indent; i++) - { - printf ("| "); - } - printf ("> "); -} - -static void -tabout () -{ - p (); -} - -static void -pbarray (y) - barray *y; -{ - int x; - printf ("%d (", y->len); - for (x = 0; x < y->len; x++) - { - printf ("(%02x %c)", y->data[x], isprint (y->data[x]) ? y->data[x] : '.'); - } - printf (")\n"); -} - -#define SYSROFF_PRINT -#define SYSROFF_SWAP_IN - -#include "sysroff.c" - -/* - * FIXME: sysinfo, which generates sysroff.[ch] from sysroff.info, can't - * hack the special case of the tr block, which has no contents. So we - * implement our own functions for reading in and printing out the tr - * block. - */ - -#define IT_tr_CODE 0x7f -void -sysroff_swap_tr_in() -{ - char raw[255]; - - memset(raw, 0, 255); - fillup(raw); -} - -void -sysroff_print_tr_out() -{ - itheader("tr", IT_tr_CODE); -} - -static int -getone (type) - int type; -{ - int c = getc (file); - code = c; - - if ((c & 0x7f) != type) - { - ungetc (c, file); - return 0; - } - - switch (c & 0x7f) - { - case IT_cs_CODE: - { - struct IT_cs dummy; - sysroff_swap_cs_in (&dummy); - sysroff_print_cs_out (&dummy); - } - break; - case IT_dln_CODE: - { - struct IT_dln dummy; - sysroff_swap_dln_in (&dummy); - sysroff_print_dln_out (&dummy); - } - break; - case IT_hd_CODE: - { - struct IT_hd dummy; - sysroff_swap_hd_in (&dummy); - addrsize = dummy.afl; - sysroff_print_hd_out (&dummy); - } - break; - case IT_dar_CODE: - { - struct IT_dar dummy; - sysroff_swap_dar_in (&dummy); - sysroff_print_dar_out (&dummy); - } - break; - case IT_dsy_CODE: - { - struct IT_dsy dummy; - sysroff_swap_dsy_in (&dummy); - sysroff_print_dsy_out (&dummy); - } - break; - case IT_dfp_CODE: - { - struct IT_dfp dummy; - sysroff_swap_dfp_in (&dummy); - sysroff_print_dfp_out (&dummy); - } - break; - case IT_dso_CODE: - { - struct IT_dso dummy; - sysroff_swap_dso_in (&dummy); - sysroff_print_dso_out (&dummy); - } - break; - case IT_dpt_CODE: - { - struct IT_dpt dummy; - sysroff_swap_dpt_in (&dummy); - sysroff_print_dpt_out (&dummy); - } - break; - case IT_den_CODE: - { - struct IT_den dummy; - sysroff_swap_den_in (&dummy); - sysroff_print_den_out (&dummy); - } - break; - case IT_dbt_CODE: - { - struct IT_dbt dummy; - sysroff_swap_dbt_in (&dummy); - sysroff_print_dbt_out (&dummy); - } - break; - case IT_dty_CODE: - { - struct IT_dty dummy; - sysroff_swap_dty_in (&dummy); - sysroff_print_dty_out (&dummy); - } - break; - case IT_un_CODE: - { - struct IT_un dummy; - sysroff_swap_un_in (&dummy); - sysroff_print_un_out (&dummy); - } - break; - case IT_sc_CODE: - { - struct IT_sc dummy; - sysroff_swap_sc_in (&dummy); - sysroff_print_sc_out (&dummy); - } - break; - case IT_er_CODE: - { - struct IT_er dummy; - sysroff_swap_er_in (&dummy); - sysroff_print_er_out (&dummy); - } - break; - case IT_ed_CODE: - { - struct IT_ed dummy; - sysroff_swap_ed_in (&dummy); - sysroff_print_ed_out (&dummy); - } - break; - case IT_sh_CODE: - { - struct IT_sh dummy; - sysroff_swap_sh_in (&dummy); - sysroff_print_sh_out (&dummy); - } - break; - case IT_ob_CODE: - { - struct IT_ob dummy; - sysroff_swap_ob_in (&dummy); - sysroff_print_ob_out (&dummy); - } - break; - case IT_rl_CODE: - { - struct IT_rl dummy; - sysroff_swap_rl_in (&dummy); - sysroff_print_rl_out (&dummy); - } - break; - case IT_du_CODE: - { - struct IT_du dummy; - sysroff_swap_du_in (&dummy); - - sysroff_print_du_out (&dummy); - } - break; - case IT_dus_CODE: - { - struct IT_dus dummy; - sysroff_swap_dus_in (&dummy); - sysroff_print_dus_out (&dummy); - } - break; - case IT_dul_CODE: - { - struct IT_dul dummy; - sysroff_swap_dul_in (&dummy); - sysroff_print_dul_out (&dummy); - } - break; - case IT_dss_CODE: - { - struct IT_dss dummy; - sysroff_swap_dss_in (&dummy); - sysroff_print_dss_out (&dummy); - } - break; - case IT_hs_CODE: - { - struct IT_hs dummy; - sysroff_swap_hs_in (&dummy); - sysroff_print_hs_out (&dummy); - } - break; - case IT_dps_CODE: - { - struct IT_dps dummy; - sysroff_swap_dps_in (&dummy); - sysroff_print_dps_out (&dummy); - } - break; - case IT_tr_CODE: - { - sysroff_swap_tr_in (); - sysroff_print_tr_out (); - } - break; - case IT_dds_CODE: - { - struct IT_dds dummy; - sysroff_swap_dds_in (&dummy); - sysroff_print_dds_out (&dummy); - } - break; - default: - printf ("GOT A %x\n", c); - return 0; - break; - } - return 1; -} - -static int -opt (x) - int x; -{ - return getone (x); -} - -#if 0 - -/* This is no longer used. */ - -static void -unit_info_list () -{ - while (opt (IT_un_CODE)) - { - getone (IT_us_CODE); - - while (getone (IT_sc_CODE)) - getone (IT_ss_CODE); - - while (getone (IT_er_CODE)) - ; - - while (getone (IT_ed_CODE)) - ; - } -} - -#endif - -#if 0 - -/* This is no longer used. */ - -static void -object_body_list () -{ - while (getone (IT_sh_CODE)) - { - while (getone (IT_ob_CODE)) - ; - while (getone (IT_rl_CODE)) - ; - } -} - -#endif - -static void -must (x) - int x; -{ - if (!getone (x)) - { - printf ("WANTED %x!!\n", x); - } -} - -static void -tab (i, s) - int i; - char *s; -{ - indent += i; - if (s) - { - p (); - printf (s); - printf ("\n"); - } -} - -static void derived_type (); - -static void -dump_symbol_info () -{ - tab (1, "SYMBOL INFO"); - while (opt (IT_dsy_CODE)) - { - if (opt (IT_dty_CODE)) - { - must (IT_dbt_CODE); - derived_type (); - must (IT_dty_CODE); - } - } - tab (-1, ""); -} - -static void -derived_type () -{ - tab (1, "DERIVED TYPE"); - while (1) - { - if (opt (IT_dpp_CODE)) - { - dump_symbol_info (); - must (IT_dpp_CODE); - } - else if (opt (IT_dfp_CODE)) - { - dump_symbol_info (); - must (IT_dfp_CODE); - } - else if (opt (IT_den_CODE)) - { - dump_symbol_info (); - must (IT_den_CODE); - } - else if (opt (IT_den_CODE)) - { - dump_symbol_info (); - must (IT_den_CODE); - } - else if (opt (IT_dds_CODE)) - { - dump_symbol_info (); - must (IT_dds_CODE); - } - else if (opt (IT_dar_CODE)) - { - } - else if (opt (IT_dpt_CODE)) - { - } - else if (opt (IT_dul_CODE)) - { - } - else if (opt (IT_dse_CODE)) - { - } - else if (opt (IT_dot_CODE)) - { - } - else - break; - } - - tab (-1, ""); -} - -#if 0 - -/* This is no longer used. */ - -static void -program_structure () -{ - tab (1, "PROGRAM STRUCTURE"); - while (opt (IT_dps_CODE)) - { - must (IT_dso_CODE); - opt (IT_dss_CODE); - dump_symbol_info (); - must (IT_dps_CODE); - } - tab (-1, ""); -} - -#endif - -#if 0 - -/* This is no longer used. */ - -static void -debug_list () -{ - tab (1, "DEBUG LIST"); - - must (IT_du_CODE); - opt (IT_dus_CODE); - program_structure (); - must (IT_dln_CODE); - - tab (-1, ""); -} - -#endif - -static void -module () -{ - int c = 0; - int l = 0; - - tab (1, "MODULE***\n"); - - do - { - c = getc (file); - ungetc (c, file); - - c &= 0x7f; - } - while (getone (c) && c != IT_tr_CODE); - -#if 0 - must (IT_cs_CODE); - must (IT_hd_CODE); - opt (IT_hs_CODE); - - unit_info_list (); - object_body_list (); - debug_list (); - - must (IT_tr_CODE); -#endif - tab (-1, ""); - - c = getc (file); - while (c != EOF) - { - printf ("%02x ", c); - l++; - if (l == 32) - { - printf ("\n"); - l = 0; - } - c = getc (file); - } -} - -char *program_name; - -static void -show_usage (file, status) - FILE *file; - int status; -{ - fprintf (file, _("Usage: %s [-hV] in-file\n"), program_name); - exit (status); -} - -static void -show_help () -{ - printf (_("%s: Print a human readable interpretation of a SYSROFF object file\n"), - program_name); - show_usage (stdout, 0); -} - -int -main (ac, av) - int ac; - char **av; -{ - char *input_file = NULL; - int opt; - static struct option long_options[] = - { - {"help", no_argument, 0, 'h'}, - {"version", no_argument, 0, 'V'}, - {NULL, no_argument, 0, 0} - }; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = av[0]; - xmalloc_set_program_name (program_name); - - while ((opt = getopt_long (ac, av, "hV", long_options, (int *) NULL)) != EOF) - { - switch (opt) - { - case 'h': - show_help (); - /*NOTREACHED*/ - case 'V': - printf (_("GNU %s version %s\n"), program_name, PROGRAM_VERSION); - exit (0); - /*NOTREACHED*/ - case 0: - break; - default: - show_usage (stderr, 1); - /*NOTREACHED*/ - } - } - - /* The input and output files may be named on the command line. */ - - if (optind < ac) - { - input_file = av[optind]; - } - - if (!input_file) - { - fatal (_("no input file specified")); - } - - file = fopen (input_file, FOPEN_RB); - if (!file) - { - fatal (_("cannot open input file %s"), input_file); - } - - module (); - return 0; -} diff --git a/binutils/sysinfo.y b/binutils/sysinfo.y deleted file mode 100644 index 0aa87375dd6..00000000000 --- a/binutils/sysinfo.y +++ /dev/null @@ -1,415 +0,0 @@ -%{ -#include -#include - -extern char *word; -extern char writecode; -extern int number; -extern int unit; -char nice_name[1000]; -char *it; -int sofar; -int width; -int code; -char * repeat; -char *oldrepeat; -char *name; -int rdepth; -char *loop [] = {"","n","m","/*BAD*/"}; -char *names[] = {" ","[n]","[n][m]"}; -char *pnames[]= {"","*","**"}; -%} - - -%union { - int i; - char *s; -} -%token COND -%token REPEAT -%token '(' ')' -%token TYPE -%token NAME -%token NUMBER UNIT -%type attr_size -%type attr_desc attr_id attr_type -%% - -top: { - 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"); - break; - } - } -it_list { - switch (writecode) { - case 'i': - case 'p': - case 'g': - case 'c': - printf("#endif\n"); - break; - case 'd': - break; - } -} - - ; - - -it_list: it it_list - | - ; - -it: - '(' NAME NUMBER - { - it = $2; code = $3; - switch (writecode) - { - case 'd': - printf("\n\n\n#define IT_%s_CODE 0x%x\n", it,code); - printf("struct IT_%s { \n", it); - break; - case 'i': - printf("void sysroff_swap_%s_in(ptr)\n",$2); - printf("struct IT_%s *ptr;\n", it); - printf("{\n"); - printf("char raw[255];\n"); - printf("\tint idx = 0 ;\n"); - printf("\tint size;\n"); - printf("memset(raw,0,255);\n"); - printf("memset(ptr,0,sizeof(*ptr));\n"); - printf("size = fillup(raw);\n"); - break; - case 'g': - printf("void sysroff_swap_%s_out(file,ptr)\n",$2); - printf("FILE * file;\n"); - printf("struct IT_%s *ptr;\n", it); - printf("{\n"); - printf("\tchar 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(abfd,ptr)\n",$2); - printf("bfd * abfd;\n"); - printf("struct IT_%s *ptr;\n",it); - printf("{\n"); - printf("int idx = 0 ;\n"); - break; - case 'c': - printf("void sysroff_print_%s_out(ptr)\n",$2); - printf("struct IT_%s *ptr;\n", it); - printf("{\n"); - printf("itheader(\"%s\", IT_%s_CODE);\n",$2,$2); - break; - - case 't': - break; - } - - } - it_field_list -')' -{ - switch (writecode) { - case 'd': - printf("};\n"); - break; - case 'g': - printf("\tchecksum(file,raw, idx, IT_%s_CODE);\n", it); - - case 'i': - - case 'o': - case 'c': - printf("}\n"); - } -} -; - - - -it_field_list: - it_field it_field_list - | cond_it_field it_field_list - | repeat_it_field it_field_list - | - ; - -repeat_it_field: '(' REPEAT NAME - { - rdepth++; - switch (writecode) - { - case 'c': - if (rdepth==1) - printf("\tprintf(\"repeat %%d\\n\", %s);\n",$3); - if (rdepth==2) - printf("\tprintf(\"repeat %%d\\n\", %s[n]);\n",$3); - case 'i': - case 'g': - case 'o': - - if (rdepth==1) - { - printf("\t{ int n; for (n = 0; n < %s; n++) {\n", $3); - } - if (rdepth == 2) { - printf("\t{ int m; for (m = 0; m < %s[n]; m++) {\n", $3); - } - - break; - } - - oldrepeat = repeat; - repeat = $3; - } - - it_field_list ')' - - { - repeat = oldrepeat; - oldrepeat =0; - rdepth--; - switch (writecode) - { - case 'i': - case 'g': - case 'o': - case 'c': - printf("\t}}\n"); - } - } - ; - - -cond_it_field: '(' COND NAME - { - switch (writecode) - { - case 'i': - case 'g': - case 'o': - case 'c': - printf("\tif (%s) {\n", $3); - break; - } - } - - it_field_list ')' - { - switch (writecode) - { - case 'i': - case 'g': - case 'o': - case 'c': - printf("\t}\n"); - } - } - ; - -it_field: - '(' attr_desc '(' attr_type attr_size ')' attr_id - {name = $7; } - enums ')' - { - char *desc = $2; - char *type = $4; - int size = $5; - char *id = $7; -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,file);\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; - } - } - - ; - - -attr_type: - TYPE { $$ = $1; } - | { $$ = "INT";} - ; - -attr_desc: - '(' NAME ')' - { $$ = $2; } - ; - -attr_size: - NUMBER UNIT - { $$ = $1 * $2; } - ; - - -attr_id: - '(' NAME ')' { $$ = $2; } - | { $$ = "dummy";} - ; - -enums: - | '(' enum_list ')' ; - -enum_list: - | - enum_list '(' NAME NAME ')' { - switch (writecode) - { - case 'd': - printf("#define %s %s\n", $3,$4); - break; - case 'c': - printf("if (ptr->%s%s == %s) { tabout(); printf(\"%s\\n\");}\n", name, names[rdepth],$4,$3); - } - } - - ; - - - -%% -/* four modes - - -d write structure defintions 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; -char writecode; - -int -main(ac,av) -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; -} - -int -yyerror(s) - char *s; -{ - fprintf(stderr, "%s\n" , s); - return 0; -} diff --git a/binutils/syslex.l b/binutils/syslex.l deleted file mode 100644 index a39484287a7..00000000000 --- a/binutils/syslex.l +++ /dev/null @@ -1,51 +0,0 @@ -%{ -#include "sysinfo.h" -char *word; -int number; -int unit; - -#ifndef yywrap -static int yywrap () { return 1; } -#endif -%} -%% -"(" { return '(';} -")" { return ')';} -"[" { return '[';} -"]" { return ']';} -" " { ; } -";".* { ; } -"\t" { ; } -"\n" { ; } -"\""[^\"]*"\"" { -yylval.s = malloc(strlen (yytext)); -strcpy(yylval.s, yytext+1); -yylval.s[strlen(yylval.s)-1] = 0; - return NAME; - } - -0x[0-9a-f]+ { - yylval.i = strtol(yytext,0,16); - return NUMBER; - } - -[0-9]+ { - yylval.i = atoi(yytext); - return NUMBER; - } - - -"bits" { yylval.i =1 ;return UNIT;} -"bit" { yylval.i = 1; return UNIT;} -"bytes" { yylval.i= 8; return UNIT;} -"byte" { yylval.i = 8; return UNIT;} - -"int" { yylval.s = "INT"; return TYPE;} -"barray" { yylval.s = "BARRAY"; return TYPE;} -"chars" { yylval.s = "CHARS"; return TYPE;} -"variable" { yylval.i = 0; return NUMBER;} -"counted" { yylval.i = -4; return NUMBER;} -"addrsize" { yylval.i = -2; return NUMBER; } -"segsize" { yylval.i = -1; return NUMBER; } -"cond" { return COND;} -"repeat" { return REPEAT;} diff --git a/binutils/sysroff.info b/binutils/sysroff.info deleted file mode 100644 index 3af001a1016..00000000000 --- a/binutils/sysroff.info +++ /dev/null @@ -1,504 +0,0 @@ -("cs" 0x0 - (("size") (1 byte) ("size")) - - (("hd") (1 byte) ("hd")) - (("hs") (1 byte) ("hs")) - (("un") (1 byte) ("un")) - (("us") (1 byte) ("us")) - - (("sc") (1 byte) ("sc")) - (("ss") (1 byte) ("ss")) - (("er") (1 byte) ("er")) - (("ed") (1 byte) ("ed")) - - (("sh") (1 byte) ("sh")) - (("ob") (1 byte) ("ob")) - (("rl") (1 byte) ("rl")) - (("du") (1 byte) ("du")) - - (("dps") (1 byte) ("dps")) - (("dsy") (1 byte) ("dsy")) - (("dty") (1 byte) ("dty")) - (("dln") (1 byte) ("dln")) - - (("dso") (1 byte) ("dso")) - (("dus") (1 byte) ("dus")) - (("dss") (1 byte) ("dss")) - (("dbt") (1 byte) ("dbt")) - - (("dpp") (1 byte) ("dpp")) - (("dfp") (1 byte) ("dfp")) - (("den") (1 byte) ("den")) - (("dds") (1 byte) ("dds")) - - (("dar") (1 byte) ("dar")) - (("dpt") (1 byte) ("dpt")) - (("dul") (1 byte) ("dul")) - (("dse") (1 byte) ("dse")) - - (("dot") (1 byte) ("dot"))) - - -("hd" 0x04 - (("module type") (4 bits) ("mt") - (("MTYPE_ABS_LM" "0") - ("MTYPE_REL_LM" "1") - ("MTYPE_OMS_OR_LMS" "2") - ("MTYPE_UNSPEC" "0xf"))) - (("spare")(4 bits) ("spare1")) - (("creation date")( chars 12 bytes)( "cd")) - (("number of units") (2 bytes) ("nu")) - (("code") (1 byte) ("code")) - (("version") (chars 4 bytes) ("ver")) - (("address update") (1 byte) ("au")) - (("segment identifier") (1 bit) ("si")) - (("address field length") (4 bits) ("afl")) - (("spare")(3 bits) ("spare2")) - (("space size within segment") (1 byte) ("spcsz")) - (("segment size") (1 byte) ("segsz")) - (("segment shift") (1 byte) ("segsh")) - (("entry point") (1 byte) ("ep")) - (cond "ptr->ep" - (cond "ptr->mt != MTYPE_ABS_LM" - (("unit appearance number") (2 bytes) ("uan")) - (("section appearance number") (2 bytes) ("sa"))) - (cond "segmented_p" - (("segment address") (segsize bytes) ("sad"))) - (("address") (addrsize bytes) ("address"))) - (("os name") (chars variable bytes) ("os")) - (("sys name") (chars variable bytes) ("sys")) - (("module name") (chars variable bytes) ("mn")) - (("cpu") (chars variable bytes) ("cpu"))) - - -("hs" 0x05 - (("neg number") (2 bytes) ("neg"))) - - -("un" 0x06 - (("format") (2 bits) ("format") - (("FORMAT_LM" "0") - ("FORMAT_OM" "1") - ("FORMAT_OMS_OR_LMS" "2"))) - (("spare") (6 bits) ("spare1")) - (("number of sections") (2 bytes) ("nsections")) - (("number of external refs") (2 bytes) ("nextrefs")) - (("number of external defs") (2 bytes) ("nextdefs")) - (("unit name") (chars variable byte) ("name")) - (("tool name") (chars variable byte) ("tool")) - (("creation date") (chars 12 bytes) ("tcd")) - (("linker name") (chars variable byte) ("linker")) - (("creation date") (chars 12 bytes) ("lcd"))) - - -("us" 0x07 - (("negotiation number") (2 bytes) ("neg"))) - - -("sc" 0x08 - (("format") (2 bits) ("format")) - (("spare") (6 bits) ("spare")) - (("segment address") (segsize bytes) ("segadd")) - (("address") (addrsize bytes) ("addr")) - (("length") (addrsize bytes) ("length")) - (("alignment") (addrsize bytes) ("align")) - (("contents") (4 bits) ("contents") - (("CONTENTS_CODE" "0") - ("CONTENTS_DATA" "1") - ("CONTENTS_STACK" "2") - ("CONTENTS_DUMMY" "3") - ("CONTENTS_SPECIAL" "4") - ("CONTENTS_NONSPEC" "0xf"))) - (("concat") (4 bits) ("concat") - (("CONCAT_SIMPLE" "0") - ("CONCAT_SHAREDC" "1") - ("CONCAT_DUMMY" "2") - ("CONCAT_GROUP" "3") - ("CONCAT_SHARED" "4") - ("CONCAT_PRIVATE" "5") - ("CONCAT_UNSPEC" "0xf"))) - (("read") (2 bits) ("read")) - (("write") (2 bits) ("write")) - (("exec") (2 bits) ("exec")) - (("initialized") (2 bits) ("init")) - (("mode") (2 bits) ("mode")) - (("spare") (6 bits) ("spare1")) - (("name") (chars variable byte) ("name"))) - - -("ss" 0x09 - (("neg number") (2 bytes) ("neg"))) - - -("er" 0x0c - (("symbol type") (2 bits) ("type") - (("ER_ENTRY" "0") - ("ER_DATA" "1") - ("ER_NOTDEF" "2") - ("ER_NOTSPEC" "3"))) - (("spare") (6 bits) ("spare")) - (("symbol name") (chars variable byte) ("name"))) - - -("ed" 0x14 - (("section appearance number") (2 bytes) ("section")) - (("symbol type") (3 bits) ("type") - (("ED_TYPE_ENTRY" "0") - ("ED_TYPE_DATA" "1") - ("ED_TYPE_CONST" "2") - ("ED_TYPE_NOTSPEC" "7"))) - (("spare") (5 bits) ("spare")) - (cond "ptr->type==ED_TYPE_ENTRY || ptr->type==ED_TYPE_DATA" - (("symbol address") (addrsize bytes) ("address"))) - (cond "ptr->type==ED_TYPE_CONST" - (("constant value") (addrsize bytes) ("constant"))) - (("symbol name") (chars variable byte) ("name"))) - - -("sh" 0x1a - (("unit appearance number") (2 bytes) ("unit")) - (("section appearance number") (2 bytes) ("section"))) - - -("ob" 0x1c - (("starting address flag") (1 bit) ("saf")) - (("compression flag") (1 bit) ("cpf")) - (("spare") (6 bits) ("spare")) - (cond "ptr->saf" - ( ("starting address") (addrsize bytes) ("address"))) - (cond "ptr->cpf" - (("comp reps") (addrsize bytes) ("compreps"))) - (("data") (barray counted byte) ("data"))) - - -("rl" 0x20 - (("boundary of relocateable area") (4 bits) ("boundary")) - (("address polarity") (1 bit) ("apol")) - (("segment number") (1 bit) ("segment")) - (("sign of relocation") (1 bit) ("sign")) - (("check range") (1 bit) ("check")) - (("reloc address") (addrsize bytes) ("addr")) - - (("bit loc") (1 byte) ("bitloc")) - (("field length") (1 byte) ("flen")) - (("bcount") (1 byte) ("bcount")) - (("operator") (1 byte) ("op") - (("OP_RELOC_ADDR" "1") - ("OP_SEC_REF" "0") - ("OP_EXT_REF" "2"))) - (cond "ptr->op == OP_EXT_REF" - (("symbol number") (2 bytes) ("symn")) ) - - (cond "ptr->op == OP_SEC_REF" - (("section number") (2 bytes) ("secn")) - (("const opcode") (1 byte) ("copcode_is_3")) - (("addend length") (1 byte) ("alength_is_4")) - (("addend") (4 byte) ("addend")) - (("plus opcode") (1 byte) ("aopcode_is_0x20"))) - - (cond "ptr->op == OP_RELOC_ADDR" - (("dunno") (2 bytes) ("dunno"))) - - (("end") (1 byte) ("end"))) - - -("du" 0x30 - (("format") (2 bits) ("format")) - (("optimized") (1 bit) ("optimized")) - (("stackfrmt") (2 bits) ("stackfrmt")) - (("spare") (3 bits) ("spare")) - (("unit number") (2 bytes) ("unit")) - (("sections") (2 bytes) ("sections")) - (repeat "ptr->sections" - (("section appearance number") (2 bytes) ("san")) - (("address") (addrsize bytes) ("address")) - (("section length") (addrsize bytes) ("length"))) - (("tool name") (chars variable byte) ("tool")) - (("creation date") (chars 12 bytes) ("date"))) - - -("dsy" 0x34 - (("symbol type") (7 bits) ("type") - (("STYPE_VAR" "0") - ("STYPE_LAB" "1") - ("STYPE_PROC" "2") - ("STYPE_FUNC" "3") - ("STYPE_TYPE" "4") - ("STYPE_CONST" "5") - ("STYPE_ENTRY" "6") - ("STYPE_MEMBER" "7") - ("STYPE_ENUM" "8") - ("STYPE_TAG" "9") - ("STYPE_PACKAGE" "10") - ("STYPE_GENERIC" "11") - ("STYPE_TASK" "12") - ("STYPE_EXCEPTION" "13") - ("STYPE_PARAMETER" "14") - ("STYPE_EQUATE" "15") - ("STYPE_UNSPEC" "0x7f"))) - (("assignment info") (1 bit) ("assign")) - (("symbol id") (2 bytes) ("snumber")) - (("symbol name") (chars variable bytes) ("sname")) - (("nesting level") (2 bytes) ("nesting")) - (cond "ptr->assign" - (("assignment type") (1 byte) ("ainfo") - (("AINFO_REG" "1") - ("AINFO_STATIC_EXT_DEF" "2") - ("AINFO_STATIC_EXT_REF" "3") - ("AINFO_STATIC_INT" "4") - ("AINFO_STATIC_COM" "5") - ("AINFO_AUTO" "6") - ("AINFO_CONST" "7") - ("AINFO_UNSPEC" "0xff"))) - (("data length") (addrsize bytes) ("dlength")) - (cond "ptr->ainfo == AINFO_STATIC_EXT_DEF - || ptr->ainfo == AINFO_STATIC_INT - || ptr->ainfo == AINFO_STATIC_COM" - (("section number") (2 bytes) ("section"))) - (cond "ptr->ainfo == AINFO_STATIC_EXT_DEF - || ptr->ainfo == AINFO_STATIC_INT - || ptr->ainfo == AINFO_STATIC_COM - || ptr->ainfo == AINFO_AUTO" - (("address") (addrsize bytes) ("address"))) - (cond "ptr->ainfo == AINFO_REG" - (("register name") (chars variable bytes) ("reg"))) - (cond "ptr->ainfo == AINFO_STATIC_EXT_DEF - || ptr->ainfo == AINFO_STATIC_EXT_REF" - (("external name") (chars variable bytes) ("ename"))) - (cond "ptr->ainfo == AINFO_CONST" - (("constant") (chars variable bytes) ("constant")))) - (cond "ptr->type == STYPE_MEMBER" - (("assignment unit") (1 bit) ("bitunit")) - (("spare") (7 bits) ("spare2")) - (("field length") (addrsize bytes) ("field_len")) - (("field offset") (addrsize bytes) ("field_off")) - (cond "ptr->bitunit" - (("bit offset") (addrsize bytes) ("field_bitoff")))) - (cond "ptr->type== STYPE_ENUM" - (("value length") (1 byte) ("evallen")) - (("value") (4 bytes) ("evalue"))) - (cond "ptr->type == STYPE_CONST" - (("value") (chars variable bytes) ("cvalue"))) - (cond "ptr->type == STYPE_EQUATE" - (("value length") (1 byte) ("qvallen")) - (("value") (4 bytes) ("qvalue")) - (("basic type") (1 byte) ("btype")) - (("size information") (addrsize bytes) ("sizeinfo")) - (("sign") (2 bits) ("sign")) - (("floating point type") (6 bits) ("flt_type"))) - (("source file number") (2 bytes) ("sfn")) - (("source line number") (2 bytes) ("sln")) - (("negotiation number") (2 bytes) ("neg")) - (cond "ptr->type == STYPE_TAG" - (("magic") (1 byte) ("magic")))) - - - -("dul" 0x52 - (("max declaration type flag") (1 bit) ("max_variable")) - (("max spare") (7 bits) ("maxspare")) - (cond "ptr->max_variable == 0" - (("maximum") (addrsize bytes) ("max")) - (("max mode") (chars variable bytes) ("maxmode"))) - - (("min declaration type flag") (1 bit) ("min_variable")) - (("min spare") (7 bits) ("minspare")) - (cond "ptr->min_variable == 0" - (("minimum") (addrsize bytes) ("min")) - (("min mode") (chars variable bytes) ("minmode")))) - - -("dty" 0x36 - (("end flag") (1 bit) ("end")) - (("spare") (7 bits) ("spare")) - (cond "!ptr->end" - (("negotiation") (2 bytes) ("neg")))) - - -("dbt" 0x44 - (("basic type") (1 byte) ("btype") - (("BTYPE_VOID" "0") - ("BTYPE_UNDEF" "1") - ("BTYPE_CHAR" "2") - ("BTYPE_INT" "3") - ("BTYPE_FLOAT" "4") - ("BTYPE_BIT" "5") - ("BTYPE_STRING" "6") - ("BTYPE_DECIMAL" "7") - ("BTYPE_ENUM" "8") - ("BTYPE_STRUCT" "9") - ("BTYPE_TYPE" "10") - ("BTYPE_TAG" "11") - ("BTYPE_UNSPEC" "0xff"))) - (("size info") (addrsize bytes) ("bitsize")) - (("sign") (2 bits) ("sign") - (("SIGN_SIGNED" "0") - ("SIGN_UNSIGNED" "1") - ("SIGN_UNSPEC" "3"))) - (("floating point type") (6 bits) ("fptype") - (("FPTYPE_SINGLE" "0") - ("FPTYPE_DOUBLE" "1") - ("FPTYPE_EXTENDED" "2") - ("FPTYPE_NOTSPEC" "0x3f"))) - (cond "ptr->btype==BTYPE_TAG || ptr->btype == BTYPE_TYPE" - (("symbol id") (2 bytes) ("sid"))) - (("negotiation") (2 bytes) ("neg"))) - -("dar" 0x4e - (("element length" ) (addrsize bytes) ("length")) - (("dims") (1 byte) ("dims")) - (repeat "ptr->dims" - (("variable flag") (1 bit) ("variable") - (("VARIABLE_FIXED" "0") - ("VARIABLE_VARIABLE" "1"))) - - (("subscript type") (1 bit) ("subtype") - (("SUB_INTEGER" "0") - ("SUB_TYPE" "1"))) - - (("spare") (6 bits) ("spare")) - - (cond "ptr->subtype[n] == SUB_TYPE" - (("sub symbol id") (2 bytes) ("sid"))) - - (cond "ptr->subtype[n] == SUB_INTEGER" - (("max declaration type flag") (1 bit) ("max_variable")) - (("max spare") (7 bits) ("maxspare")) - ;; FIXME: next field should be conditional on max_variable, - (("maximum") (addrsize bytes) ("max")) - - (("min declaration type flag") (1 bit) ("min_variable")) - (("min spare") (7 bits) ("minspare")) - ;; FIXME: next field should be conditional on min_variable - (("minimum") (addrsize bytes) ("min")))) - (("negotiation") (2 bytes) ("neg"))) - - -("dso" 0x3a - (("function name") (2 bytes) ("sid")) - (("sp update count") (4 bytes) ("spupdates")) - (repeat "ptr->spupdates" - (("update address") (addrsize bytes) ("address")) - (("offset") (addrsize bytes) ("offset")))) - -("dln" 0x38 - (("number of lines") (2 bytes) ("nln")) - (repeat "ptr->nln" - (("source file number") (2 bytes) ("sfn")) - (("source line number") (2 bytes) ("sln")) - (("section number") (2 bytes) ("section")) - (("from address") (addrsize bytes) ("from_address")) - (("to address") (addrsize bytes) ("to_address")) - (("call count") (2 bytes) ("cc")) - ) - (("neg") (2 bytes) ("neg"))) - -("dpp" 0x46 - (("start/end") (1 bit) ("end")) - (("spare") (7 bits) ("spare")) - (cond "!ptr->end" - (("params") (1 byte) ("params")) - (("neg number") (2 bytes) ("neg")))) - -("den" 0x4a - (("start/end") (1 bit) ("end")) - (("spare") (7 bits) ("spare")) - (cond "!ptr->end" - (("neg number") (2 bytes) ("neg")))) - -("dfp" 0x48 - (("start/end flag") (1 bit) ("end")) - (("spare") (7 bits) ("spare")) - (cond "!ptr->end" - (("number of parameters") (1 byte) ("nparams")) - (("neg number") (2 bytes) ("neg")))) - -("dds" 0x4c - (("start/end") (1 bit) ("end")) - (("spare") (7 bits) ("spare")) - (cond "!ptr->end" - (("neg number") (2 bytes) ("neg")))) - -("dpt" 0x50 - (("neg number") (2 bytes) ("neg")) - (("dunno") (1 byte) ("dunno"))) - -("dse" 0x54 - (("neg number") (2 bytes) ("neg")) - (("dunno") (1 byte) ("dunno"))) - -("dot" 0x56 - (("unknown") (1 byte) ("unknown"))) -; FIXME: unknown field should be repeated symbol number? - - -("dss" 0x42 - (("type") (1 byte) ("type")) - (("external/internal") (1 bit) ("internal")) - (("spare") (7 bits) ("spare")) - (cond "!ptr->internal" - ( ("package name") (chars variable byte) ("package"))) - (cond "ptr->internal" - (("symbol id") (2 bytes) ("id"))) - (("record type") (2 bytes) ("record")) - (("rules") (chars variable byte) ("rules")) - (("number of symbols") (2 bytes) ("nsymbols")) - (("unknown" ) (2 bytes) ("fixme"))) - -("pss" 0x40 - (("negotiation number") (2 bytes) ("efn")) - (("number of source files") (2 bytes) ("ns")) - (repeat "ptr->ns" - (("directory reference bit") (1 bit) ("drb")) - (("spare") (7 bits) ("spare")) - (("completed file name") (chars variable byte) ("fname")) - (cond "ptr->drb[n]" - (("directory apperance number") (2 bytes) ("dan")))) - - (("number of directories") (2 bytes) ("ndir")) - (repeat "ptr->ndir" - (("directory name") (chars variable bytes) ("dname")))) - - -; FIXME: the tr block has no contents. sysinfo, etc. aren't prepared -; to deal with that. -; ("tr" 0x7f) - - -("dus" 0x40 - (("negotiation number") (2 bytes) ("efn")) - (("number of source files") (2 bytes) ("ns")) - (repeat "ptr->ns" - (("directory reference bit") (1 bit) ("drb")) - (("spare") (7 bits) ("spare")) - (("completed file name") (chars variable byte) ("fname")) - (cond "ptr->drb[n]" - (("directory apperance number") (2 bytes) ("dan")))) - (("number of directories") (2 bytes) ("ndir")) - (repeat "ptr->ndir" - (("directory name") (chars variable bytes) ("dname")))) - - -("dps" 0x32 - (("start/end flag") (1 bit) ("end")) - (("block type") (7 bits) ("type") - (("BLOCK_TYPE_COMPUNIT" "0") - ("BLOCK_TYPE_PROCEDURE" "2") - ("BLOCK_TYPE_FUNCTION" "3") - ("BLOCK_TYPE_BLOCK" "4") - ("BLOCK_TYPE_BASIC" "9"))) - (cond "!ptr->end" - (("optimization") (1 byte) ("opt")) - (("section number") (2 bytes) ("san")) - (("address") (addrsize bytes) ("address")) - (("block size") (addrsize bytes) ("block_size")) - (("nesting") (1 byte) ("nesting")) - (cond "ptr->type == BLOCK_TYPE_PROCEDURE - || ptr->type == BLOCK_TYPE_FUNCTION" - (("return address") (1 bit) ("retaddr")) - (("interrupt function flag") (1 bit) ("intrflag")) - (("stack update flag") (1 bit) ("stackflag")) - (("intra page JMP") (1 bit) ("intrpagejmp")) - (("spare") (4 bits) ("spare"))) - (("neg number") (2 bytes) ("neg")))) - diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog deleted file mode 100644 index 078f8d53c70..00000000000 --- a/binutils/testsuite/ChangeLog +++ /dev/null @@ -1,641 +0,0 @@ -2000-03-13 Nick Clifton - - * binutils-all/readelf.s: Adjust to match noew format of readelf - output. - * binutils-all/readelf.ss: Adjust to match noew format of readelf - output. - -1999-11-01 Nick Clifton - - * binutils-all/objcopy.exp: Expect simple objcopy test for fail - for COFF based ARM and Thumb ports. - -Tue Sep 14 00:28:17 1999 Jeffrey A Law (law@cygnus.com) - - * binutils-all/hppa/objdump.exp: Do not run for PA64. - -1999-09-04 Steve Chamberlain - - * binutils-all/objdump.exp: Add pj to cpus_expected. - -Sat Aug 28 00:24:27 1999 Jerry Quinn - - * binutils-all/hppa/freg.s: New file. - * binutils-all/hppa/objdump.exp: Add freg.s test. - -1999-08-09 Ian Lance Taylor - - * binutils-all/objcopy.exp: Add setup_xfail for simple copy test - for i*86-*-msdos*. - -1999-07-21 H.J. Lu - - * binutils-all/testprog.c: Include . - -1999-06-29 Nick Clifton - - * binutils-all/objdump.exp: Add fr30 and MCore to expected cpus - list. - - * binutils-all/readelf.r: Do not assume a fixed number of spaces - in the output. - -1999-06-10 Nick Clifton - - * binutils-all/readelf.wi: Update to match latest output. - * binutils-all/readelf.h: Update to match latest output. - -Wed Jun 9 11:59:22 1999 Andreas Schwab - - * binutils-all/objdump.exp: Tighten regexp to match `objdump -i' - output to avoid massive exponential behaviour. - -1999-05-28 Ian Lance Taylor - - * binutils-all/readelf.h: Update for changes of 1999-04-08. - -1999-03-12 Nick Clifton - - * binutils-all/readelf.wi: Remove FR30 specific componnts. - * binutils-all/readelf.s: Remove RELA specific components. - -1999-02-16 Nick Clifton - - * binutils-all/readelf.s: Do not assume section alignment is 4. - * binutils-all/readelf.r: Do not assume rela's are being used. - * binutils-all/readelf.exp: disable tests for non ELF based - targets. - -1999-02-02 Nick Clifton - - * binutils-all/readelf.wi: Amend to match new readelf output. - * binutils-all/readelf.r: Do not assume that RELAs will be used. - -1999-01-29 Nick Clifton - - * config/default.exp: Add definitions of READELF and READELFFLAGS. - - * binutils-all/readelf.exp: New file: Readelf tests - * binutils-all/readelf.h: New file: Expected results for 'readelf -h' - * binutils-all/readelf.s: New file: Expected results for 'readelf -S' - * binutils-all/readelf.ss: New file: Expected results for 'readelf -s' - * binutils-all/readelf.r: New file: Expected results for 'readelf -r' - * binutils-all/readelf.wi: New file: Expected results for 'readelf -wi' - -Wed Dec 9 19:11:39 1998 Jeffrey A Law (law@cygnus.com) - - * binutils-all/objcopy.exp (copy_executable): Expect comparison - failure for mips*-*-elf. - -Fri Oct 16 22:57:12 1998 Felix Lee - - * binutils-all/objcopy.exp: fix "no symbols" message. - -Tue Jul 28 15:14:04 1998 Jeffrey A Law (law@cygnus.com) - - * binutils-all/objcopy.exp: Keep "main" and "_main" for strip with - saving symbol tests. Look for either "main" or "_main" in the output - file. Fix test for "no symbols" in the output file. - -1998-07-22 Vladimir N. Makarov - - * binutils-all/objcopy.exp: Polish output about fail for objcopy - (simple copy), strip with/without saving a symbol for object file - and executable. - -Wed Jul 1 16:27:40 1998 Nick Clifton - - * binutils-all/objcopy.exp: ARM simple objcopy now passes. - -Wed Jun 24 09:20:21 1998 Nick Clifton - - * binutils-all/objdump.exp: Look for '.data' rather than 'data' - when parsing output of objdump -h. - * binutils-all/size.exp: Look for '.data' rather than 'data' when - parsing output of size -A. - -1998-07-20 Vladimir N. Makarov - - * objcopy.exp: Two new tests - strip object file with saving a - symbol and strip executable file with saving a symbol. - -Fri May 29 14:50:24 1998 Ian Lance Taylor - - * binutils-all/objcopy.exp: Don't xfail the simple objcopy test - when cross compiling. - -Thu Nov 6 14:32:37 1997 Bob Manson - - * lib/utils-lib.exp: Temporary definition of target_assemble and - default_target_assemble so that testing can work with older - dejagnu versions. - -Wed Sep 24 12:09:15 1997 Bob Manson - - * binutils-all/objcopy.exp(strip_executable): Make a new copy of - the executable being tested. - -Mon Sep 15 21:25:20 1997 Bob Manson - - * binutils-all/objcopy.exp: Compile the executables to be tested - on the target with a status wrapper (as necessary). - - * binutils-all/ar.exp: If testing on a remote host, don't bother - looking on the local host for the program being tested. Use the - correct filenames on the remote host. - - * binutils-all/nm.exp: Ditto. - - * binutils-all/size.exp: Ditto. - - * binutils-all/objdump.exp: Ditto. - (cpus_expected): Add the target CPU to the regexp of CPUs to be - expected, if it's not already there. - -Thu Aug 28 09:57:27 1997 Doug Evans - - * binutils-all/objdump.exp (cpus_expected): Add arc. - -Tue Aug 5 00:03:20 1997 Ian Lance Taylor - - * config/default.exp: Look for nm-new and strip-new. - -Tue Jun 3 17:12:54 1997 Bob Manson - - * config/default.exp: Remove expect_before statement. - - * binutils-all/objcopy.exp: Don't use global exec_output variable; - the output is returned from remote_load instead. - -Mon May 12 22:14:20 1997 Bob Manson - - * binutils-all/objcopy.exp(strip_test): Tests that - fail to compile are untested, not unresolved. - (copy_setup): Ditto. - - * lib/utils-lib.exp(default_binutils_assemble): Call - target_assemble instead of target_compile. - -Wed Apr 30 20:37:51 1997 Bob Manson - - Changes to support multilib and remote hosted testing, along with - general cleanups and simplifications. - - * lib/utils-lib.exp(binutil_version): Use remote_exec. - (default_binutils_run): Ditto. - (default_binutils_assemble): Remove first argument; call - target_compile to actually do the assembly. - (default_binutils_compile,default_binutils_remove,prune_warnings): - Delete. - - * config/default.exp: Remove AS and ASFLAGS. - (binutils_compile,binutils_remove): Delete. - (binutils_assemble): Remove first argument. - - * binutils-all/ar.exp: See if we're running the tests on - a remote host, and download/upload files as appropriate. - Replace calls to binutils_remove with remote_file. Replace - calls to binutils_compile with target_compile. Remove initial - argument to binutils_assemble. Use remote_load to execute - programs on the target. - * binutils-all/nm.exp: Ditto. - * binutils-all/objcopy.exp: Ditto. - * binutils-all/objdump.exp: Ditto. - * binutils-all/size.exp: Ditto. - -Mon Apr 14 12:36:41 1997 Ian Lance Taylor - - * binutils-all/ar.exp (long_filenames): Check for a file system - with a 14 character file name length limit. - -Tue Apr 1 09:52:15 1997 Jeffrey A Law (law@cygnus.com) - - * binutils-all/objdump.exp: Handle d10v. - -Fri Feb 7 16:45:34 1997 Bob Manson - - * binutils-all/ar.exp: Use prune_warnings instead of - prune_system_crud. - * binutils-all/objcopy.exp: Ditto. - -Wed Jan 29 00:16:43 1997 Bob Manson - - * binutils-all/nm.exp: Use / between $srcdir and $subdir. - * binutils-all/objcopy.exp: Ditto. - * binutils-all/objdump.exp: Ditto. - * binutils-all/size.exp: Ditto. - * binutils-all/hppa/objdump.exp: Ditto. - - -Wed Oct 16 22:57:59 1996 Jeffrey A Law (law@cygnus.com) - - * binutils-all/objdump.exp: Add mn10200 and mn10300 to expected - cpus list. - -Tue Oct 1 15:06:55 1996 Ian Lance Taylor - - * lib/utils-lib.exp (binutil_version): Fix for current version - printing. - -Sun Aug 4 22:25:40 1996 Ian Lance Taylor - - * binutils-all/objcopy.exp: Fix end of line matching in srec tests - to work with TCL 7.5. - -Sat Jun 29 12:51:30 1996 Ian Lance Taylor - - * binutils-all/objcopy.exp: Simple copy test works for i960 b.out - targets. - -Mon Jun 24 14:33:04 1996 Ian Lance Taylor - - * binutils-all/objcopy.exp: On OSF/1, the simple copy test will - succeed with gas, and fail with /bin/as, so mark it as an expected - failure only if it fails. - -Tue Mar 26 16:55:08 1996 Jeffrey A Law (law@cygnus.com) - - * binutils-all/objcopy.exp: No longer expect adjust-section-vma - test to fail for hppa*-*-proelf*. - -Mon Mar 11 08:25:14 1996 Jeffrey A Law (law@cygnus.com) - - * binutils-all/objdump.exp: Look for "$CODE$", not just "CODE". - -Wed Jan 31 11:55:13 1996 Jeffrey A Law (law@cygnus.com) - - * binutils-all/objcopy.exp: Expect adjust-section-vma tests to - fail for hppa*-*-proelf* targets. - -Thu Jan 25 13:53:04 1996 Ian Lance Taylor - - * binutils-all/objdump.exp: Update for objdump -h format change. - * binutils-all/objcopy.exp: Likewise. - -Mon Jan 15 18:14:14 1996 Ian Lance Taylor - - * binutils-all/objcopy.exp: Use the lma, not the vma, when testing - address adjustments. - -Fri Dec 15 16:31:55 1995 Ian Lance Taylor - - * binutils-all/objdump.exp: Update objdump -i test for current - objdump output. - -Mon Nov 27 15:15:09 1995 Ian Lance Taylor - - * binutils-all/objcopy.exp: Correct fail calls to always use the - same string as the pass call. - -Wed Nov 22 13:18:58 1995 Ian Lance Taylor - - * lib/utils-lib.exp (prune_system_crud): Discard -g -O warnings - from native compilers on OSF/1 and SunOS. - -Fri Nov 17 10:36:09 1995 Ian Lance Taylor - - * lib/utils-lib.exp (default_binutils_compiler: Change error - message to say compilation rather than assembly. - -Wed Nov 15 18:34:42 1995 Ken Raeburn - - * binutils-all/objcopy.exp: Simple copy test does appear to work - on i*86-svr4. - -Wed Nov 15 12:19:28 1995 Ian Lance Taylor - - * binutils-all/objcopy.exp: If assembly fails, call unresolved. - Test running objcopy and strip on a final executable. - * binutils-all/testprog.c: New file. - * config/default.exp (STRIP, STRIPFLAGS): Define. - (binutils_compile): New procedure. - * lib/utils-lib.exp (default_binutils_compile): New procedure. - -Fri Nov 3 13:22:33 1995 Ian Lance Taylor - - * lib/utils-lib.exp (default_binutils_run): Don't use verbose - -log, reverting part of Oct 2 change. - -Wed Nov 1 15:09:57 1995 Manfred Hollstein KS/EF4A 60/1F/110 #40283 - - * binutils-all/objcopy.exp: Add setup_xfails for - m68*-motorola-sysv* and m88*-motorola-sysv*. - -Wed Oct 4 14:38:31 1995 Ian Lance Taylor - - * binutils-all/nm.exp: Add setup_xfails for XCOFF. - -Mon Oct 2 12:41:48 1995 Ian Lance Taylor - - * binutils-all/ar.exp: New file. - * binutils-all/bintest.s: Make text_symbol and data_symbol global. - Add new static symbols static_text_symbol and static_data_symbol. - * binutils-all/nm.exp: Adjust accordingly. - * config/default.exp (AR): Set if not set. - (binutils_remove): New procedure. - * lib/utils-lib.exp (default_binutils_run): Call - prune_system_crud on program output. Use verbose -log instead of - both verbose and send_log. - (default_binutils_remove): New procedure. - - * lib/utils-lib.exp (default_binutils_assemble): Call - prune_system_crud on assembler output. - -Tue Sep 26 14:07:05 1995 Ian Lance Taylor - - * binutils-all/objcopy.exp: Add setup_xfails for simple copy test - for i386 COFF targets. - -Wed Sep 13 13:20:21 1995 Ian Lance Taylor - - * lib/utils-lib.exp (prune_system_crud): Define if not defined. - * binutils-all/objcopy.exp: Call prune_system_crud on cmp output. - -Sat Aug 19 17:38:06 1995 Ian Lance Taylor - - * binutils-all/objcopy.exp: Add xfail for i*86-*-aout* for simple - copy test. - -Wed Aug 16 16:52:53 1995 Ian Lance Taylor - - * binutils-all/nm.exp: Add setup_xfail for mips*-sony-bsd* for - tests which fail on ECOFF targets. - - * binutils-all/objcopy.exp: Change i*86-*-linux xfail for simple - copy test to check for i*86-*-linuxaout* instead. - -Tue Aug 8 17:48:37 1995 Ian Lance Taylor - - * binutils-all/objcopy.exp: Add setup_xfail for a29k-*-vxworks* - for simple copy test. - -Tue Jul 25 11:57:12 1995 Ian Lance Taylor - - * binutils-all/objcopy.exp: Change setup_xfail for simple copy - test from i960-*-vxworks5.1 to i960-*-vxworks*. - -Mon Jul 10 12:25:46 1995 Ian Lance Taylor - - * binutils-all/objcopy.exp: Add setup_xfail for z8*-*-coff for - simple copy test. - * binutils-all/objdump.exp (cpus_expected): Add z8001 and z8002. - -Sun May 21 20:32:53 1995 Jeff Law (law@snake.cs.utah.edu) - - * binutils-all/hppa/objdump.exp (addendbug): Handle PA ELF targets - too. - * binutils-all/objcopy.exp (simple copy): Don't expect PA ELF - targets to fail. - -Tue Apr 4 14:52:08 1995 Jeff Law (law@snake.cs.utah.edu) - - * binutils-all/hppa: Renamed from binutils-hppa. - -Wed Mar 29 12:02:43 1995 Ian Lance Taylor - - * binutils-all/objcopy.exp: Add setup_xfail for simple copy test - for h8500-*-hms and h8500-*-coff. - -Tue Mar 28 11:18:28 1995 Ian Lance Taylor - - * binutils-all/objcopy.exp: Add setup_xfail for simple copy test - for m68*-ericsson-ose and m88*-*-coff. - -Mon Mar 27 11:27:31 1995 Ian Lance Taylor - - * binutils-all/objcopy.exp: Add setup_xfail for simple copy test - for m68*-*-vxworks*. - -Fri Mar 24 11:44:25 1995 Ian Lance Taylor - - * binutils-hppa/objdump.exp: Correct hppa*-*-* check. - -Tue Mar 21 10:48:45 1995 Jeff Law (law@snake.cs.utah.edu) - - * binutils-hppa/addendbug.s: New testcase. - * binutils-hppa/objdump.exp: Run it. - -Mon Mar 20 11:31:05 1995 Ian Lance Taylor - - * lib/utils-lib.exp (default_binutils_run): Quote any dollar signs - in progargs before passing it to exec. - -Fri Mar 17 16:39:31 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/hppa.sed: Sed script to transform bintest.s into proper - PA assembly code. - * binutils-all/nm.exp: Enable these tests on the PA. - * binutils-all/objcopy.exp: Enable these tests on the PA. Expect - simple copy to fail. - * binutils-all/objdump.exp: Enable these tests on the PA. Handle - "CODE" as a section name. - * binutils-all/size.exp: Enable these tests on the PA. - * lib/utils-lib.exp (default_binutils_assemble): For "hppa*-*-*", - run the assembly through a sed script before passing it to the - assembler. - -Wed Mar 15 16:47:13 1995 Ian Lance Taylor - - * binutils-all/objdump.exp: Force section sizes to be interpreted - in hex. Change objdump -h failure mode to always use the same - string. - -Thu Jan 5 13:01:43 1995 Ian Lance Taylor - - * binutils-all/nm.exp: Just check for irix4*, rather than - irix\[0-4\]*, to avoid DejaGnu bug. - -Thu Dec 15 19:35:31 1994 Ken Raeburn - - * binutils-all/objcopy.exp: Expect simple-objcopy test to fail - for various other targets for which gas doesn't use bfd: sh-hms, - m68k-hpux, m68k-sunos, m68k-coff, i386-linux, a29k-udi, a29k-coff, - i960-vxworks5.1, i960-coff, h8300-hms, h8300-coff. - -Wed Dec 14 15:54:46 1994 Ken Raeburn - - * binutils-all/size.exp: Skip tests requiring bintest.o on hppa, - since it (correctly) generates syntax errors on that platform. - * binutils-all/objdump.exp: Ditto. - * binutils-all/nm.exp: Ditto. - * binutils-all/objcopy.exp: Ditto. Also, move setup_xfail for - sh-coff to branch where objcopy execution produced no error - messages. Expect failure for hp300 also. - -Thu Dec 8 14:36:15 1994 Ken Raeburn - - * binutils-all/objdump.exp (cpus_expected): New variable, taken - from objdump -i test, added ns32k and powerpc, sorted. - (objdump -i, -f tests): Use $cpus_expected. - - * binutils-all/objcopy.exp: For simple-copy test, expect failure - for sh-coff. - -Tue Oct 25 16:00:14 1994 Ian Lance Taylor - - * binutils-all/objcopy.exp: Adjust --adjust-section-vma tests for - new S-record section handling. - -Tue Oct 18 11:18:21 1994 Ian Lance Taylor - - * binutils-all/nm.exp: nm with no arguments and nm -P do not work - as expected on ECOFF targets; add calls to setup_xfail. - - * binutils-all/objcopy.exp: New file. - * config/default.exp: Initialize OBJCOPY and OBJCOPYFLAGS. - -Fri Oct 14 14:46:22 1994 Ian Lance Taylor - - Rewrite testsuite. - * configure.in, Makefile.in: Remove. - * binutils-all/configure.in, binutils-all/Makefile.in: Remove. - * binutils-all/bintest.c: Remove. - * binutils-all/bintest.s: New file. - * binutils-all/nm.exp, binutils-all/objdump.exp: Rewrite. - * binutils-all/size.exp: Rewrite. - * config/default.exp: Load utils-lib.exp. Set AS and ASFLAGS. - Don't go up one directory from $base_dir. Create tmpdir. - (binutils_run, binutils-assemble): New procedures. - * config/unix.exp: Remove. - * config/mt-a29k-udi, config/mt-i386-aout: Remove. - * config/mt-i960-nindy, config/mt-lynx, config/mt-m68k: Remove. - * config/mt-mips-ecoff, config/mt-slite: Remove. - * config/mt-sparc-aout, config/mt-vxworks: Remove. - * lib/utils-lib.exp (binutil_version): Don't redirect standard - input when getting version. Don't unset errorInfo. - (default_binutils_run): New procedure. - (default_binutils_assemble): New procedure. - -Thu Sep 29 12:45:39 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * VMS does not permit `.' in directory names: renamed binutils.all - to binutils-all. - * configure.in (configdirs): Change binutils.all to binutils-all. - -Fri Sep 23 16:01:14 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * configure.in: Use mt-m68k for m68k*-*-aout* and m68k*-*-coff*, - not for m68k-*-*. - -Fri Sep 23 13:54:50 1994 Ken Raeburn - - * binutils.all/objdump.exp: Added ARM to list of CPU types. - -Thu Sep 22 11:04:50 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * binutils.all/objdump.exp: Update for new usage message. - * binutils.all/size.exp: Use a double backslash in the string to - get a single backslash to the regexp matcher. Accept $TEXT$, - $DATA$ and $BSS$ as well as .text, .data and .bss, for HP/UX. - -Fri Sep 2 12:53:10 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/unix.exp: If nm.new does not exist, use [transform nm]. - * config/default.exp: Likewise. - -Wed Aug 24 12:41:37 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * configure.in, binutils.all/configure.in: Change i386 to - i[345]86. - -Tue Jul 19 15:23:53 1994 Bill Cox (bill@rtl.cygnus.com) - - * config/mt-mips-ecoff: Add -Tidp.ld option. - -Thu Jun 30 12:41:55 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * config/default.exp: Use nm.new, not nm, from newly built tree. - -Tue May 17 14:04:05 1994 Bill Cox (bill@rtl.cygnus.com) - - * config/default.exp, config/unix.exp: Replace error - proc calls with perror. - -Tue May 10 11:20:54 1994 Stan Shebs (shebs@andros.cygnus.com) - - * configure.in (sparclite): Match on sparclite*-*-*. - -Wed Apr 13 18:25:19 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/unix.exp: Use nm.new, not nm, from newly built tree. - - * binutils.all/objdump.exp: Add more wildcards to list of - single-letter options in pattern for usage message. - - * binutils.all/nm.exp: Deleted debug-symbols test, since it only - works for a.out/stabs systems. Fixed regexps to make underscores - optional, since some C compilers don't prepend them. Deleted - check for foo.o symbol, since again some systems don't generate - it. - -Mon Apr 11 10:31:00 1994 Bill Cox (bill@rtl.cygnus.com) - - * Makefile.in (check): Set TCL_LIBRARY for runtest. - -Mon Feb 14 19:34:03 1994 Rob Savoye (rob@darkstar.cygnus.com) - - * Makefile.in: Use new config features of DejaGnu in site.exp - file. "Make check" should now work for all crosses. - -Fri Jan 28 18:00:29 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * binutils.all/objdump.exp: In usage message, accept - "section-name" as well as "section_name". - -Mon Jan 17 16:57:02 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * binutils.all/objdump.exp: Trim list of format names expected, - and accept any known CPU type. - -Thu Dec 2 20:50:24 1993 Rob Savoye (rob@darkstar.cygnus.com) - - * Makefile.in: Remove some stuff from the site.exp file. - * config/unix.exp: Add global before seeing if the variables for - nm, objdump, and size exist. - -Wed Nov 3 11:12:32 1993 Rob Savoye (rob@darkstar.cygnus.com) - - * config/udi.exp,unix.exp: Transform tool name. - * binutils.all/*.exp: Clear errorInfo after exec. - -Fri Jul 2 12:41:20 1993 Ian Lance Taylor (ian@cygnus.com) - - * binutils.all/*.exp: Use -- for long arguments rather than +. - -Fri Jun 4 10:52:29 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: change srctrigger to Makefile.in - -Wed May 26 17:27:46 1993 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (FLAGS_TO_PASS): Pass down CC and CFLAGS. - -Fri May 7 13:58:44 1993 Ian Lance Taylor (ian@cygnus.com) - - * binutils.all/objdump.exp: Update for new usage message. - -Mon Apr 19 14:08:52 1993 Rob Savoye (rob@darkstar.cygnus.com) - - * binutils.all/*.exp: Use the new util_test proc. - * Makefile.in: Create a local site.exp file with config info. - -Thu Mar 25 05:38:47 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * nm.all/configure.in (srcname): Delete extra quote. - -Mon Feb 22 07:54:03 1993 Mike Werner (mtw@poseidon.cygnus.com) - - * binutils/testsuite: made modifications to testcases, etc., to allow - them to work properly given the reorganization of deja-gnu and the - relocation of the testcases from deja-gnu to a "tool" subdirectory. - -Sun Feb 21 10:55:55 1993 Mike Werner (mtw@poseidon.cygnus.com) - - * binutils/testsuite: Initial creation of binutils/testsuite. - Migrated dejagnu testcases and support files for testing nm to - binutils/testsuite from deja-gnu. These files were moved "as is" - with no modifications. This migration is part of a major overhaul - of dejagnu. The modifications to these testcases, etc., which - will allow them to work with the new version of dejagnu will be - made in a future update. - diff --git a/binutils/testsuite/binutils-all/ar.exp b/binutils/testsuite/binutils-all/ar.exp deleted file mode 100644 index 4b38c6b066e..00000000000 --- a/binutils/testsuite/binutils-all/ar.exp +++ /dev/null @@ -1,219 +0,0 @@ -# Copyright (C) 1995, 1997 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-dejagnu@prep.ai.mit.edu - -# Written by Ian Lance Taylor - -if ![is_remote host] { - if {[which $AR] == 0} then { - perror "$AR does not exist" - return - } -} - -# send_user "Version [binutil_version $AR]" - -# Test long file name support - -proc long_filenames { } { - global AR - global host_triplet - - set testname "ar long file names" - - set n1 "abcdefghijklmnopqrstuvwxyz1" - set n2 "abcdefghijklmnopqrstuvwxyz2" - set file1 tmpdir/$n1 - set file2 tmpdir/$n2 - - remote_file build delete $file1 - - # Some file systems truncate file names at 14 characters, which - # makes it impossible to run this test. Check for that now. - set status [catch "set f [open tmpdir/$n1 w]" errs] - if { $status != 0 } { - verbose -log "open tmpdir/$n1 returned $errs" - unsupported $testname - return - } - puts $f "first" - close $f - - - remote_file build delete $file2 - - set status [catch "set f [open tmpdir/$n2 w]" errs] - if { $status != 0 } { - verbose -log "open tmpdir/$n2 returned $errs" - unsupported $testname - return - } - puts $f "second" - close $f - - if [is_remote host] { - set file1 [remote_download host $file1]; - set file2 [remote_download host $file2]; - set dest artest.a - } else { - set dest tmpdir/artest.a - } - - remote_file host delete $dest; - - set got [binutils_run $AR "rc $dest $file1 $file2"] - if [is_remote host] { - remote_upload host $file1 tmpdir/$n1 - } - - set f [open tmpdir/$n1 r] - gets $f string - close $f - if ![string match "first" $string] { - verbose -log "reading tmpdir/$n1 returned $string" - unsupported $testname - return - } - - remote_file host delete $dest; - set got [binutils_run $AR "rc $dest $file1 $file2"] - - if ![string match "" $got] { - fail $testname - return - } - - remote_file build delete tmpdir/$n1 - remote_file build delete tmpdir/$n2 - - set got [binutils_run $AR "t $dest"] - regsub "\[\r\n \t\]*$" "$got" "" got; - if ![string match "$n1*$n2" $got] { - fail $testname - return - } - - if [is_remote host] { - remote_file host delete $file1; - remote_file host delete $file2; - } - - verbose -log "$AR x $dest" - set exec_output [binutils_run $AR "x $dest"] - set exec_output [prune_warnings $exec_output] - if ![string match "" $exec_output] { - verbose -log $exec_output - fail $testname - return - } - - if [is_remote host] { - remote_upload host $n1 tmpdir/$n1; - remote_upload host $n2 tmpdir/$n2; - set file1 tmpdir/$n1 - set file2 tmpdir/$n2 - } else { - set file1 $n1 - set file2 $n2 - } - - if ![file exists $file1] { - verbose -log "$file1 does not exist" - fail $testname - return - } - if ![file exists $file2] { - verbose -log "$file2 does not exist" - fail $testname - return - } - - set f [open $file1 r] - if { [gets $f line] == -1 || $line != "first" } { - verbose -log "$file1 contents:" - verbose -log "$line" - close $f - fail $testname - return - } - close $f - - set f [open $file2 r] - if { [gets $f line] == -1 || $line != "second" } { - verbose -log "$file2 contents:" - verbose -log "$line" - close $f - fail $testname - return - } - close $f - - pass $testname -} - -# Test building the symbol table. - -proc symbol_table { } { - global AR - global AS - global NM - global srcdir - global subdir - - set testname "ar symbol table" - - if ![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o] { - unresolved $testname - return - } - - if [is_remote host] { - set archive artest.a - set objfile [remote_download host tmpdir/bintest.o] - remote_file host delete $archive - } else { - set archive tmpdir/artest.a - set objfile tmpdir/bintest.o - } - - remote_file build delete tmpdir/artest.a - - set got [binutils_run $AR "rc $archive ${objfile}"] - if ![string match "" $got] { - fail $testname - return - } - - set got [binutils_run $NM "--print-armap $archive"] - if { ![string match "*text_symbol in bintest.o*" $got] \ - || ![string match "*data_symbol in bintest.o*" $got] \ - || ![string match "*common_symbol in bintest.o*" $got] \ - || [string match "*static_text_symbol in bintest.o*" $got] \ - || [string match "*static_data_symbol in bintest.o*" $got] \ - || [string match "*external_symbol in bintest.o*" $got] } { - fail $testname - return - } - - pass $testname -} - -# Run the tests. - -long_filenames -symbol_table diff --git a/binutils/testsuite/binutils-all/bintest.s b/binutils/testsuite/binutils-all/bintest.s deleted file mode 100644 index 9e006502219..00000000000 --- a/binutils/testsuite/binutils-all/bintest.s +++ /dev/null @@ -1,12 +0,0 @@ - .globl text_symbol - .text -text_symbol: -static_text_symbol: - .long 1 - .long external_symbol - .globl data_symbol - .data -data_symbol: -static_data_symbol: - .long 2 - .comm common_symbol,4 diff --git a/binutils/testsuite/binutils-all/hppa/addendbug.s b/binutils/testsuite/binutils-all/hppa/addendbug.s deleted file mode 100644 index 659306f0741..00000000000 --- a/binutils/testsuite/binutils-all/hppa/addendbug.s +++ /dev/null @@ -1,23 +0,0 @@ - .SPACE $PRIVATE$ - .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31 - .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82 - .SPACE $TEXT$ - .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44 - .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY - .IMPORT $global$,DATA - .IMPORT $$dyncall,MILLICODE -; gcc_compiled.: - .SPACE $TEXT$ - .SUBSPA $CODE$ - - .align 4 - .EXPORT initialize_char_syntax,CODE - .EXPORT initialize_char_syntax,ENTRY,PRIV_LEV=3,RTNVAL=GR -initialize_char_syntax - .PROC - .CALLINFO FRAME=64,NO_CALLS,SAVE_SP,ENTRY_GR=3 - .ENTRY - addil L'is_idchar-$global$-32,%r27 - .EXIT - .PROCEND -is_idchar .comm 256 diff --git a/binutils/testsuite/binutils-all/hppa/freg.s b/binutils/testsuite/binutils-all/hppa/freg.s deleted file mode 100644 index 501e10f937d..00000000000 --- a/binutils/testsuite/binutils-all/hppa/freg.s +++ /dev/null @@ -1,23 +0,0 @@ - .LEVEL 2.0 - .SPACE $PRIVATE$ - .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31 - .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82 - .SPACE $TEXT$ - .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44 - .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY - .IMPORT $global$,DATA - .IMPORT $$dyncall,MILLICODE -; gcc_compiled.: - .SPACE $TEXT$ - .SUBSPA $CODE$ - - .align 4 - .NSUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY - .EXPORT main,ENTRY,PRIV_LEV=3,RTNVAL=GR -main - .PROC - .CALLINFO FRAME=64,CALLS,SAVE_RP - .ENTRY - fmpyfadd,sgl %fr4L,%fr4R,%fr5R,%fr5L - .EXIT - .PROCEND diff --git a/binutils/testsuite/binutils-all/hppa/objdump.exp b/binutils/testsuite/binutils-all/hppa/objdump.exp deleted file mode 100644 index 2e2155ed6d9..00000000000 --- a/binutils/testsuite/binutils-all/hppa/objdump.exp +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-dejagnu@prep.ai.mit.edu - -# This file was written by Rob Savoye -# and rewritten by Ian Lance Taylor - -if ![istarget hppa*-*-*] then { - return -} - -# These tests are not suitable for wide mode. -if [istarget hppa*w-*-*] then { - return -} - -if {[which $OBJDUMP] == 0} then { - perror "$OBJDUMP does not exist" - return -} - -send_user "Version [binutil_version $OBJDUMP]" - -if {![binutils_assemble $srcdir/$subdir/addendbug.s tmpdir/addendbug.o]} then { - return -} - -if [is_remote host] { - set objfile [remote_download host tmpdir/addendbug.o] -} else { - set objfile tmpdir/addendbug.o -} - -# Make sure the SOM BFD code sign extends constants in R_DATA_OVERRIDE fixups. - -set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -r $objfile"] - -if [istarget hppa*-*-*elf*] then { - set want "00000000 R_PARISC_DPREL21L\[ \]+is_idchar\\+0xffffffe0.*" -} else { - set want "00000000 R_DP_RELATIVE\[ \]+is_idchar\\+0xffffffe0.*" -} - - -if [regexp $want $got] then { - pass "addendbug test" -} else { - fail "addendbug test" -} - -########################### -# Set up the test of freg.s -########################### - -if {![binutils_assemble $srcdir/$subdir/freg.s tmpdir/freg.o]} then { - return -} - -if [is_remote host] { - set objfile [remote_download host tmpdir/freg.o] -} else { - set objfile tmpdir/freg.o -} - -# Make sure that we get R float regs like we're supposed to - -set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble $objfile"] - -set want "fmpyfadd,sgl fr4,fr4R,fr5R,fr5" - -if [regexp $want $got] then { - pass "freg test" -} else { - fail "freg test" -} diff --git a/binutils/testsuite/binutils-all/nm.exp b/binutils/testsuite/binutils-all/nm.exp deleted file mode 100644 index 76c7c5f38c9..00000000000 --- a/binutils/testsuite/binutils-all/nm.exp +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-dejagnu@prep.ai.mit.edu - -# This file was written by Rob Savoye -# and rewritten by Ian Lance Taylor - -if ![is_remote host] { - if {[which $NM] == 0} then { - perror "$NM does not exist" - return - } -} - -send_user "Version [binutil_version $NM]" - - -if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then { - return -} - -if [is_remote host] { - set tempfile [remote_download host tmpdir/bintest.o] -} else { - set tempfile tmpdir/bintest.o -} - -# Test nm with no arguments. - -# This test does not work correctly on ECOFF targets, because ECOFF -# stores most symbols twice, which messes up the nm output. -setup_xfail "alpha*-*-osf*" "alpha*-*-netware*" -setup_xfail "mips*-*-ultrix*" "mips*-*-ecoff*" "mips*-*-irix4*" -setup_xfail "mips*-*-riscos*" "mips*-*-sysv3*" "mips*-sony-bsd*" - -# This test does not work correctly on XCOFF targets, because XCOFF -# does not enter static symbols in the symbol table. -setup_xfail "*-*-aix*" - -set got [binutils_run $NM "$NMFLAGS $tempfile"] - -if [info exists vars] then { unset vars } -while {[regexp "(\[a-zA-Z\]) (\[a-z_\]*_symbol)(.*)" $got all type symbol rest]} { - set vars($symbol) $type - set got $rest -} - -if {![info exists vars(text_symbol)] \ - || $vars(text_symbol) != "T" \ - || ![info exists vars(data_symbol)] \ - || $vars(data_symbol) != "D" \ - || ![info exists vars(common_symbol)] \ - || $vars(common_symbol) != "C" \ - || ![info exists vars(external_symbol)] \ - || $vars(external_symbol) != "U" \ - || ![info exists vars(static_text_symbol)] \ - || $vars(static_text_symbol) != "t" \ - || ![info exists vars(static_data_symbol)] \ - || $vars(static_data_symbol) != "d"} { - fail "nm (no arguments)" -} else { - pass "nm (no arguments)" -} - -# Test nm -g - -set got [binutils_run $NM "$NMFLAGS -g $tempfile"] - -if [info exists vars] then { unset vars } -while {[regexp "(\[a-z_\]*_symbol)(.*)" $got all symbol rest]} { - set vars($symbol) 1 - set got $rest -} - -if {![info exists vars(text_symbol)] \ - || ![info exists vars(data_symbol)] \ - || ![info exists vars(common_symbol)] \ - || ![info exists vars(external_symbol)] \ - || [info exists vars(static_text_symbol)] \ - || [info exists vars(static_data_symbol)]} { - fail "nm -g" -} else { - pass "nm -g" -} - -# Test nm -P - -# This test does not work correctly on ECOFF targets, because ECOFF -# stores most symbols twice, which messes up the nm output. -setup_xfail "alpha*-*-osf*" "alpha*-*-netware*" -setup_xfail "mips*-*-ultrix*" "mips*-*-ecoff*" "mips*-*-irix4*" -setup_xfail "mips*-*-riscos*" "mips*-*-sysv3*" "mips*-sony-bsd*" - -# This test does not work correctly on XCOFF targets, because XCOFF -# does not enter static symbols in the symbol table. -setup_xfail "*-*-aix*" - -set got [binutils_run $NM "$NMFLAGS -P $tempfile"] - -set want "common_symbol C \[0\]*4.*data_symbol D \[0-9a-fA-F\]*.*external_symbol U.*static_data_symbol d \[0-9a-fA-F\]*.*static_text_symbol t \[0-9a-fA-F\]*.*text_symbol T \[0-9a-fA-F\]*" - -if [regexp $want $got] then { - pass "nm -P" -} else { - fail "nm -P" -} - -# There are certainly other tests that could be run. diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp deleted file mode 100644 index 1c40e0a6682..00000000000 --- a/binutils/testsuite/binutils-all/objcopy.exp +++ /dev/null @@ -1,596 +0,0 @@ -# Copyright (C) 1994, 95, 96, 97, 1998 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-dejagnu@prep.ai.mit.edu - -# Written by Ian Lance Taylor - -if ![is_remote host] { - if {[which $OBJCOPY] == 0} then { - perror "$OBJCOPY does not exist" - return - } -} - -send_user "Version [binutil_version $OBJCOPY]" - -if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then { - perror "unresolved 1" - unresolved "objcopy (simple copy)" - return -} - -if ![is_remote host] { - set tempfile tmpdir/bintest.o; - set copyfile tmpdir/copy; -} else { - set tempfile [remote_download host tmpdir/bintest.o] - set copyfile copy -} - -# Test that objcopy does not modify a file when copying it. - -set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $tempfile ${copyfile}.o"] - -if ![string match "" $got] then { - fail "objcopy (simple copy)" -} else { - send_log "cmp $tempfile ${copyfile}.o\n" - verbose "cmp $tempfile ${copyfile}.o" - if [is_remote host] { - set src1 tmpdir/bintest.o - set src2 tmpdir/copy.o - remote_upload host $tempfile $src1; - remote_upload host ${copyfile}.o $src2; - } else { - set src1 ${tempfile} - set src2 ${copyfile}.o - } - set status [remote_exec build cmp "${src1} ${src2}"]; - set exec_output [lindex $status 1]; - set exec_output [prune_warnings $exec_output] - - # On some systems the result of objcopy will not be identical. - # Usually this is just because gas isn't using bfd to write the files - # in the first place, and may order things a little differently. - # Those systems should use setup_xfail here. - - setup_xfail "sh-*-coff" "sh-*-hms" - setup_xfail "m68*-*-hpux*" "m68*-*-sunos*" "m68*-*-coff" "m68*-*-vxworks*" - setup_xfail "m68*-ericsson-ose" "m68k*-motorola-sysv*" - setup_xfail "i*86-*-linuxaout*" "i*86-*-aout*" - setup_xfail "i*86-*-sysv3" "i*86-*-isc*" "i*86-*-sco*" "i*86-*-coff" - setup_xfail "i*86-*-aix*" "i*86-*-go32*" "i*86-*-msdos*" - setup_xfail "a29k-*-udi" "a29k-*-coff" "a29k-*-vxworks*" - setup_xfail "i960-*-coff" - setup_xfail "h8300-*-hms" "h8300-*-coff" - setup_xfail "h8500-*-hms" "h8500-*-coff" - setup_xfail "hppa*-*-*" - clear_xfail "hppa*-*-*elf*" - setup_xfail "m88*-*-coff" "m88*-motorola-sysv*" - setup_xfail "z8*-*-coff" - - if [string match "" $exec_output] then { - pass "objcopy (simple copy)" - } else { - send_log "$exec_output\n" - verbose "$exec_output" 1 - - # On OSF/1, this succeeds with gas and fails with /bin/as. - setup_xfail "alpha*-*-osf*" - - # This fails for COFF i960-vxworks targets. - setup_xfail "i960-*-vxworks*" - - fail "objcopy (simple copy)" - } -} - -# Test generating S records. - -# We make the srec filename 8.3 compatible. Note that the header string -# matched against depends on the name of the file. Ugh. - -if [is_remote host] { - set srecfile copy.sre - set header_string S00B0000636F70792E737265C1 -} else { - set srecfile ${copyfile}.srec - set header_string S0130000746D706469722F636F70792E7372656397 -} - -set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"] - -if ![string match "" $got] then { - fail "objcopy -O srec" -} else { - if [is_remote host] { - remote_upload host ${srecfile} tmpdir/copy.srec; - set srecfile tmpdir/copy.srec; - } - set file [open ${srecfile} r] - - # The first S record is fixed by the file name we are using. - gets $file line - send_log "$line\n" - verbose $line - if ![regexp "$header_string.*" $line] { - send_log "bad header\n" - fail "objcopy -O srec" - } else { - while {[gets $file line] != -1 \ - && [regexp "^S\[123\]\[0-9a-fA-F\]+\[\r\n\]*$" $line]} { - send_log "$line\n" - verbose $line - set line "**EOF**" - } - send_log "$line\n" - verbose $line - if ![regexp "^S\[789\]\[0-9a-fA-F\]+\[\r\n\]*$" $line] then { - send_log "bad trailer\n" - fail "objcopy -O srec" - } else { - if {[gets $file line] != -1} then { - send_log "garbage at end\n" - send_log "$line\n" - verbose $line - fail "objcopy -O srec" - } else { - set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"] - if ![regexp "file format srec" $got] then { - send_log "objdump failed\n" - fail "objcopy -O srec" - } else { - pass "objcopy -O srec" - } - } - } - } - - close $file -} - -# Test setting and adjusting the start address. We only test this -# while generating S records, because we may not be able to set the -# start address for other object file formats, and the S record case -# is the only useful one anyhow. - -set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"] -if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then { - perror "objdump can not recognize bintest.o" - set origstart "" -} else { - set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${copyfile}.srec --set-start 0x7654"] - if ![string match "" $got] then { - fail "objcopy --set-start" - } else { - set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"] - if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then { - fail "objcopy --set-start" - } else { - if {$srecstart != 0x7654} then { - send_log "$srecstart != 0x7654\n" - fail "objcopy --set-start" - } else { - pass "objcopy --set-start" - } - } - } - - set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${copyfile}.srec --adjust-start 0x123"] - if ![string match "" $got] then { - fail "objcopy --adjust-start" - } else { - set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"] - if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then { - fail "objcopy --adjust-start" - } else { - if {$srecstart != $origstart + 0x123} then { - send_log "$srecstart != $origstart + 0x123\n" - fail "objcopy --adjust-start" - } else { - pass "objcopy --adjust-start" - } - } - } -} - -# Test adjusting the overall VMA, and adjusting the VMA of a -# particular section. We again only test this when generating S -# records. - -set low "" -set lowname "" - -set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"] - -set headers_regexp "\[ 0-9\]+(\[^ \]+)\[ \]*(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+2\[*\]\[*\]\[0-9\]+(.*)" - -set got $headers -while {[regexp $headers_regexp $got all name size vma rest]} { - set vma 0x$vma - set size 0x$size - if {$size != 0} { - if {$low == "" || $vma < $low} { - set low $vma - set lowname $name - } - } - set got $rest -} - -if {$low == "" || $origstart == ""} then { - perror "objdump can not recognize bintest.o" -} else { - set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${copyfile}.srec --adjust-vma 0x123"] - if ![string match "" $got] then { - fail "objcopy --adjust-vma" - } else { - set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -fh ${copyfile}.srec"] - set want "file format srec.*start address\[ \]*(\[0-9a-fA-FxX\]+).*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)" - if ![regexp $want $got all start vma] then { - fail "objcopy --adjust-vma" - } else { - set vma 0x$vma - if {$vma != $low + 0x123} then { - send_log "$vma != $low + 0x123\n" - fail "objcopy --adjust-vma" - } else { - if {$start != $origstart + 0x123} then { - send_log "$start != $origstart + 0x123\n" - fail "objcopy --adjust-vma" - } else { - pass "objcopy --adjust-vma" - } - } - } - } - - set arg "" - set got $headers - while {[regexp $headers_regexp $got all name size vma rest]} { - set vma 0x$vma - if {$vma == $low} then { - set arg "$arg --adjust-section-vma $name+4" - } - set got $rest - } - - set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${copyfile}.srec $arg"] - if ![string match "" $got] then { - fail "objcopy --adjust-section-vma +" - } else { - set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"] - set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)" - if ![regexp $want $got all vma] then { - fail "objcopy --adjust-section-vma +" - } else { - set vma 0x$vma - if {$vma != $low + 4} then { - send_log "$vma != $low + 4\n" - fail "objcopy --adjust-section-vma +" - } else { - pass "objcopy --adjust-section-vma +" - } - } - } - - regsub -all "\\+4" $arg "=[expr $low + 4]" argeq - set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${copyfile}.srec $argeq"] - if ![string match "" $got] then { - fail "objcopy --adjust-section-vma =" - } else { - set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"] - set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)" - if ![regexp $want $got all vma] then { - fail "objcopy --adjust-section-vma =" - } else { - set vma 0x$vma - if {$vma != $low + 4} then { - send_log "$vma != $low + 4\n" - fail "objcopy --adjust-section-vma =" - } else { - pass "objcopy --adjust-section-vma =" - } - } - } -} - -# Test stripping an object. - -proc strip_test { } { - global CC - global STRIP - global STRIPFLAGS - global NM - global NMFLAGS - global srcdir - global subdir - - set test "strip" - - if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } { - untested $test - return - } - - if [is_remote host] { - set objfile [remote_download host tmpdir/testprog.o]; - } else { - set objfile tmpdir/testprog.o - } - - set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"] - if ![string match "" $exec_output] { - fail $test - return - } - - set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"] - if ![string match "*: no symbols*" $exec_output] { - fail $test - return - } - - pass $test -} - -strip_test - -# Test stripping an object file with saving a symbol - -proc strip_test_with_saving_a_symbol { } { - global CC - global STRIP - global STRIPFLAGS - global NM - global NMFLAGS - global srcdir - global subdir - - set test "strip with saving a symbol" - - if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } { - untested $test - return - } - - if [is_remote host] { - set objfile [remote_download host tmpdir/testprog.o]; - } else { - set objfile tmpdir/testprog.o - } - - set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"] - if ![string match "" $exec_output] { - fail $test - return - } - - set exec_output [binutils_run $NM "$NMFLAGS $objfile"] - if {![regexp {^([0-9a-fA-F]+)?[ ]+T main} $exec_output] \ - && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} { - fail $test - return - } - - pass $test -} - -strip_test_with_saving_a_symbol - -# Build a final executable. - -proc copy_setup { } { - global srcdir - global subdir - - set res [build_wrapper testglue.o]; - set flags { debug }; - - if { $res != "" } { - lappend flags "additional_flags=[lindex $res 1]"; - set add_libs "testglue.o"; - } else { - set add_libs ""; - } - - if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/testprog executable $flags] != "" } { - return 2 - } - - set result [remote_load target tmpdir/testprog]; - set status [lindex $result 0]; - - if { $status != "pass" } { - perror "unresolved setup, status = $status" - return 3 - } - - return 0 -} - -# Test copying an executable. - -proc copy_executable { prog flags test1 test2 } { - - if [is_remote host] { - set testfile [remote_download host tmpdir/testprog]; - set testcopy copyprog - } else { - set testfile tmpdir/testprog - set testcopy tmpdir/copyprog - } - remote_file host delete $testcopy; - - set exec_output [binutils_run $prog "$flags $testfile $testcopy"] - - if ![string match "" $exec_output] { - fail $test1 - fail $test2 - return - } - - if [is_remote host] { - remote_upload host $testcopy tmpdir/copyprog - } - - set status [remote_exec build "cmp" "tmpdir/testprog tmpdir/copyprog"] - set exec_output [lindex $status 1]; - - if [string match "" $exec_output] then { - pass $test1 - } else { - send_log "$exec_output\n" - verbose "$exec_output" - - # This will fail for many reasons. For example, it will most - # likely fail if a non-GNU linker is used. Therefore, we do - # not insist that it pass. If you are using an assembler and - # linker based on the same BFD as objcopy, it is worth - # investigating to see why this failure occurs. If we are - # cross compiling, we assume that a GNU linker is being used, - # and expect it to succeed. - if {[isnative]} then { - setup_xfail "*-*-*" - } - - # This also fails for mips*-*-elf targets. See elf32-mips.c - # mips_elf_sym_is_global. - setup_xfail "mips*-*-elf" - - setup_xfail "arm*-*-coff" - setup_xfail "arm*-*-pe" - setup_xfail "thumb*-*-coff" - setup_xfail "thumb*-*-pe" - - fail $test1 - } - - set output [remote_load target tmpdir/copyprog] - set status [lindex $output 0]; - if { $status != "pass" } { - fail $test2 - } else { - pass $test2 - } -} - -# Test stripping an executable - -proc strip_executable { prog flags test } { - global NM - global NMFLAGS - - remote_download build tmpdir/copyprog tmpdir/striprog - if [is_remote host] { - set copyfile [remote_download host tmpdir/striprog]; - } else { - set copyfile tmpdir/striprog - } - - set exec_output [binutils_run $prog "$flags ${copyfile}"] - if ![string match "" $exec_output] { - fail $test - return - } - - if [is_remote host] { - remote_upload host ${copyfile} tmpdir/striprog; - } - - set result [remote_load target tmpdir/striprog] - set status [lindex $result 0]; - if { $status != "pass" } { - fail $test - return - } - - set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"] - if ![string match "*: no symbols*" $exec_output] { - fail $test - return - } - pass $test -} - -# Test stripping an executable with saving a symbol - -proc strip_executable_with_saving_a_symbol { prog flags test } { - global NM - global NMFLAGS - - remote_download build tmpdir/copyprog tmpdir/striprog - if [is_remote host] { - set copyfile [remote_download host tmpdir/striprog]; - } else { - set copyfile tmpdir/striprog - } - - set exec_output [binutils_run $prog "$flags ${copyfile}"] - if ![string match "" $exec_output] { - fail $test - return - } - - if [is_remote host] { - remote_upload host ${copyfile} tmpdir/striprog; - } - - set result [remote_load target tmpdir/striprog] - set status [lindex $result 0]; - if { $status != "pass" } { - fail $test - return - } - - set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"] - if {![regexp {^[0-9a-fA-F]+ T main} $exec_output] \ - && ![regexp {^[0-9a-fA-F]+ T _main} $exec_output]} { - fail $test - return - } - pass $test -} - -set test1 "simple objcopy of executable" -set test2 "run objcopy of executable" -set test3 "run stripped executable" -set test4 "run stripped executable with saving a symbol" - -switch [copy_setup] { - "1" { - # do nothing - } - "2" { - untested $test1 - untested $test2 - untested $test3 - untested $test4 - } - "3" { - unresolved $test1 - unresolved $test2 - unresolved $test3 - unresolved $test4 - } - "0" { - copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" "$test2" - strip_executable "$STRIP" "$STRIPFLAGS" "$test3" - strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test4" - } -} diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp deleted file mode 100644 index 89040fc2e97..00000000000 --- a/binutils/testsuite/binutils-all/objdump.exp +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-dejagnu@prep.ai.mit.edu - -# This file was written by Rob Savoye -# and rewritten by Ian Lance Taylor - -if ![is_remote host] { - if {[which $OBJDUMP] == 0} then { - perror "$OBJDUMP does not exist" - return - } -} - -send_user "Version [binutil_version $OBJDUMP]" - -# Simple test of objdump -i - -set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -i"] - -set cpus_expected "(a29k|alliant|alpha|arc|arm|convex|d10v|d30v|fr30|h8|hppa|i386|i860|i960|m32r|m68k|m88k|MCore|mips|mn10200|mn10300|ns32k|pj|powerpc|pyramid|romp|rs6000|sh|sparc|tahoe|v850|vax|we32k|z8k|z8001|z8002)" - -# Make sure the target CPU shows up in the list. -if ![regexp $cpus_expected $target_cpu] { - regsub "^\[(\]" "$cpus_expected" "(${target_cpu}|" cpus_expected; -} - -set want "BFD header file version.*srec\[^\n\]*\n\[^\n\]*header \[^\n\]*endian\[^\n\]*, data \[^\n\]*endian.*$cpus_expected" - -if [regexp $want $got] then { - pass "objdump -i" -} else { - fail "objdump -i" -} - -# The remaining tests require a test file. - - -if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then { - return -} -if [is_remote host] { - set testfile [remote_download host tmpdir/bintest.o] -} else { - set testfile tmpdir/bintest.o -} - -# Test objdump -f - -set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $testfile"] - -set want "$testfile:\[ \]*file format.*architecture:\[ \]*${cpus_expected}.*HAS_RELOC.*HAS_SYMS" - -if ![regexp $want $got] then { - fail "objdump -f" -} else { - pass "objdump -f" -} - -# Test objdump -h - -set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $testfile"] - -set want "$testfile:\[ \]*file format.*Sections.*\[0-9\]+\[ \]+\[^ \]*(text|TEXT|\\\$CODE\\\$)\[^ \]*\[ \]*(\[0-9a-fA-F\]+).*\[0-9\]+\[ \]+\[^ \]*(\\.data|DATA)\[^ \]*\[ \]*(\[0-9a-fA-F\]+)" - -if ![regexp $want $got all text_name text_size data_name data_size] then { - fail "objdump -h" -} else { - verbose "text name is $text_name size is $text_size" - verbose "data name is $data_name size is $data_size" - if {[expr "0x$text_size"] < 8 || [expr "0x$data_size"] < 4} then { - send_log "sizes too small\n" - fail "objdump -h" - } else { - pass "objdump -h" - } -} - -# Test objdump -t - -set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -t $testfile"] - -if [info exists vars] then { unset vars } -while {[regexp "(\[a-z\]*_symbol)(.*)" $got all symbol rest]} { - set vars($symbol) 1 - set got $rest -} - -if {![info exists vars(text_symbol)] \ - || ![info exists vars(data_symbol)] \ - || ![info exists vars(common_symbol)] \ - || ![info exists vars(external_symbol)]} then { - fail "objdump -t" -} else { - pass "objdump -t" -} - -# Test objdump -r - -set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -r $testfile"] - -set want "$testfile:\[ \]*file format.*RELOCATION RECORDS FOR \\\[\[^\]\]*(text|TEXT|\\\$CODE\\\$)\[^\]\]*\\\].*external_symbol" - -if [regexp $want $got] then { - pass "objdump -r" -} else { - fail "objdump -r" -} - -# Test objdump -s - -set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s $testfile"] - -set want "$testfile:\[ \]*file format.*Contents.*(text|TEXT|\\\$CODE\\\$)\[^0-9\]*\[ \]*\[0-9a-fA-F\]*\[ \]*(00000001|01000000).*Contents.*(data|DATA)\[^0-9\]*\[ \]*\[0-9a-fA-F\]*\[ \]*(00000002|02000000)" - -if [regexp $want $got] then { - pass "objdump -s" -} else { - fail "objdump -s" -} - -# Options which are not tested: -a -d -D -R -T -x -l --stabs -# I don't see any generic way to test any of these other than -a. -# Tests could be written for specific targets, and that should be done -# if specific problems are found. diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp deleted file mode 100644 index b2f744c7e15..00000000000 --- a/binutils/testsuite/binutils-all/readelf.exp +++ /dev/null @@ -1,217 +0,0 @@ -# Copyright (C) 1999 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-dejagnu@prep.ai.mit.edu - -# Written by Nick Clifto -# Based on scripts written by Ian Lance Taylor -# and Ken Raeburn . - -# First some helpful procedures, then the tests themselves - -# Return the contents of the filename given -proc file_contents { filename } { - set file [open $filename r] - set contents [read $file] - close $file - return $contents -} - -# regexp_diff, based on simple_diff taken from ld test suite -# compares two files line-by-line -# file1 contains strings, file2 contains regexps and #-comments -# blank lines are ignored in either file -# returns non-zero if differences exist -# -proc regexp_diff { file_1 file_2 } { - - set eof -1 - set end_1 0 - set end_2 0 - set differences 0 - set diff_pass 0 - - if [file exists $file_1] then { - set file_a [open $file_1 r] - } else { - warning "$file_1 doesn't exist" - return 1 - } - - if [file exists $file_2] then { - set file_b [open $file_2 r] - } else { - fail "$file_2 doesn't exist" - close $file_a - return 1 - } - - verbose " Regexp-diff'ing: $file_1 $file_2" 2 - - while { 1 } { - set line_a "" - set line_b "" - while { [string length $line_a] == 0 } { - if { [gets $file_a line_a] == $eof } { - set end_1 1 - break - } - } - while { [string length $line_b] == 0 || [string match "#*" $line_b] } { - if [ string match "#pass" $line_b ] { - set end_2 1 - set diff_pass 1 - break - } - if { [gets $file_b line_b] == $eof } { - set end_2 1 - break - } - } - - if { $diff_pass } { - break - } elseif { $end_1 && $end_2 } { - break - } elseif { $end_1 } { - send_log "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1\n" - verbose "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1" 3 - set differences 1 - break - } elseif { $end_2 } { - send_log "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" - verbose "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" 3 - set differences 1 - break - } else { - verbose "regexp \"^$line_b$\"\nline \"$line_a\"" 3 - if ![regexp "^$line_b$" "$line_a"] { - send_log "regexp_diff match failure\n" - send_log "regexp \"^$line_b$\"\nline \"$line_a\"\n" - set differences 1 - break - } - } - } - - if { $differences == 0 && !$diff_pass && [eof $file_a] != [eof $file_b] } { - send_log "$file_1 and $file_2 are different lengths\n" - verbose "$file_1 and $file_2 are different lengths" 3 - set differences 1 - } - - close $file_a - close $file_b - - return $differences -} - -# Run an individual readelf test. -# Basically readelf is run on the binary_file with the given options. -# Readelf's output is captured and then compared against the contents -# of the regexp_file. - -proc readelf_test { options binary_file regexp_file xfails } { - - global READELF - global READELFFLAGS - global srcdir - global subdir - - send_log "exec $READELF $READELFFLAGS $options $binary_file > readelf.out" - catch "exec $READELF $READELFFLAGS $options $binary_file > readelf.out" got - - if { [llength $xfails] != 0 } then { - setup_xfail $xfails - } - - if ![string match "" $got] then { - send_log $got - fail "readelf $options" - return - } - - if { [regexp_diff readelf.out $srcdir/$subdir/$regexp_file] } then { - fail "readelf $options" - verbose "output is \n[file_contents readelf.out]" 2 - return - } - - pass "readelf $options" -} - - - -# Only ELF based toolchains need readelf. -# For now be paranoid and assume that if ELF is not mentioned -# in the target string, then the target is not an ELF based port. - -if ![istarget "*-*elf"] then { - verbose "$READELF is only intenteded for ELF targets" 2 - return -} - -if ![is_remote host] { - if {[which $READELF] == 0} then { - perror "$READELF does not exist" - return - } -} - -send_user "Version [binutil_version $READELF]" - -# Assemle the test file. -if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then { - perror "unresolved 1" - unresolved "readelf - failed to assemble" - return -} - -if ![is_remote host] { - set tempfile tmpdir/bintest.o; -} else { - set tempfile [remote_download host tmpdir/bintest.o] -} - -# Run the tests -readelf_test -h $tempfile readelf.h {} - -# The v850 fails the next two tests because it creates two special -# sections of its own: .call_table_data and .call_table_text -# The regexp scripts are not expecting these sections... - -readelf_test -S $tempfile readelf.s {v850*-*-*} -readelf_test -s $tempfile readelf.ss {v850*-*-*} -readelf_test -r $tempfile readelf.r {} - - -# Compile the second test file. -if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } { - untested "readelf -w" - return -} - -if [is_remote host] { - set tempfile [remote_download host tmpdir/testprog.o]; -} else { - set tempfile tmpdir/testprog.o -} - -# The xfail targets here do not default to DWARF2 format debug information -# The symptom is that the output of 'readelf -wi' is empty. - -readelf_test -wi $tempfile readelf.wi {v850*-*-*} diff --git a/binutils/testsuite/binutils-all/readelf.h b/binutils/testsuite/binutils-all/readelf.h deleted file mode 100644 index 810eab5eab1..00000000000 --- a/binutils/testsuite/binutils-all/readelf.h +++ /dev/null @@ -1,20 +0,0 @@ -ELF Header: - Magic: 7f 45 4c 46 0[12] 0[12] 01 .. 00 00 00 00 00 00 00 00 - Class: ELF[36][24] - Data: 2's complement,.* endian - Version: 1 \(current\) - OS/ABI: .* - ABI Version: .* - Type: REL \(Relocatable file\) - Machine: .* - Version: 0x1 - Entry point address: 0x0 - Start of program headers: 0 \(bytes into file\) - Start of section headers: .* \(bytes into file\) - Flags: .* - Size of this header: .* \(bytes\) - Size of program headers: 0 \(bytes\) - Number of program headers: 0 - Size of section headers: .* \(bytes\) - Number of section headers: .* - Section header string table index: .* diff --git a/binutils/testsuite/binutils-all/readelf.r b/binutils/testsuite/binutils-all/readelf.r deleted file mode 100644 index 1349659c704..00000000000 --- a/binutils/testsuite/binutils-all/readelf.r +++ /dev/null @@ -1,4 +0,0 @@ - -Relocation section '.rel.*text' at offset 0x.* contains 1 entries: - Offset Info Type Symbol's Value Symbol's Name.* - 00000004 00.* R_.*00000000 external_symbol.* diff --git a/binutils/testsuite/binutils-all/readelf.s b/binutils/testsuite/binutils-all/readelf.s deleted file mode 100644 index 89ae0fca49a..00000000000 --- a/binutils/testsuite/binutils-all/readelf.s +++ /dev/null @@ -1,16 +0,0 @@ -There are .* section headers, starting at offset .*: - -Section Headers: - \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al - \[ 0\] NULL 00000000 000000 000000 00 0 0 0 - \[ 1\] .text PROGBITS 00000000 000034 000008 00 AX 0 0 . - \[ 2\] .rel.+text +REL. +0+ 0+.* 00000. 0. . 1 4 - \[ 3\] .data PROGBITS 00000000 00003c 000004 00 WA 0 0 . - \[ 4\] .bss NOBITS 00000000 000040 000000 00 WA 0 0 . - \[ .\] .shstrtab STRTAB 00000000 000040 0000.* 00 0 0 . - \[ .\] .symtab SYMTAB 00000000 0+.* 0+.* 10 7 6 4 - \[ .\] .strtab STRTAB 00000000 0+.* 0+.* 00 0 0 1 -Key to Flags: W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\) - I \(info\), L \(link order\), O \(extra OS processing required\) - o \(os specific\), p \(processor specific\) x \(unknown\) - diff --git a/binutils/testsuite/binutils-all/readelf.ss b/binutils/testsuite/binutils-all/readelf.ss deleted file mode 100644 index 926612d4bec..00000000000 --- a/binutils/testsuite/binutils-all/readelf.ss +++ /dev/null @@ -1,13 +0,0 @@ - -Symbol table '.symtab' contains .* entries: - Num: Value Size Type Bind Vis Ndx Name - 0: 00000000 0 NOTYPE LOCAL DEFAULT UND - 1: 00000000 0 SECTION LOCAL DEFAULT 1 - 2: 00000000 0 SECTION LOCAL DEFAULT 3 - 3: 00000000 0 SECTION LOCAL DEFAULT 4 - 4: 00000000 0 NOTYPE LOCAL DEFAULT 1 static_text_symbol - 5: 00000000 0 NOTYPE LOCAL DEFAULT 3 static_data_symbol -.* .: 00000000 0 NOTYPE GLOBAL DEFAULT 1 text_symbol - .: 00000000 0 NOTYPE GLOBAL DEFAULT UND external_symbol - .: 00000000 0 NOTYPE GLOBAL DEFAULT 3 data_symbol - .: 00000004 4 OBJECT GLOBAL DEFAULT COM common_symbol diff --git a/binutils/testsuite/binutils-all/readelf.wi b/binutils/testsuite/binutils-all/readelf.wi deleted file mode 100644 index e022fff5580..00000000000 --- a/binutils/testsuite/binutils-all/readelf.wi +++ /dev/null @@ -1,76 +0,0 @@ -The section .debug_info contains: - - Compilation Unit: - Length: .* - Version: 2 - Abbrev Offset: 0 - Pointer Size: 4 - <.><.*>: Abbrev Number: 1 \(DW_TAG_compile_unit\) - DW_AT_name : .*/testprog.c - DW_AT_comp_dir : .*/binutils - DW_AT_producer : GNU C .* - DW_AT_language : 1 \(ANSI C\) - DW_AT_low_pc : 0 - DW_AT_high_pc : .* - DW_AT_stmt_list : 0 - <.><.*>: Abbrev Number: 2 \(DW_TAG_subprogram\) - DW_AT_external : 1 - DW_AT_name : fn - DW_AT_decl_file : 1 - DW_AT_decl_line : 10 - DW_AT_type : .* - DW_AT_low_pc : 0 - DW_AT_high_pc : .* - DW_AT_frame_base : 1 byte block: .* - <.><.*>: Abbrev Number: 3 \(DW_TAG_base_type\) - DW_AT_name : int - DW_AT_byte_size : 4 - DW_AT_encoding : 5 \(signed\) - <.><.*>: Abbrev Number: 4 \(DW_TAG_subprogram\) - DW_AT_sibling : .* - DW_AT_external : 1 - DW_AT_name : main - DW_AT_decl_file : 1 - DW_AT_decl_line : 16 - DW_AT_type : .* - DW_AT_low_pc : .* - DW_AT_high_pc : .* - DW_AT_frame_base : 1 byte block: .* - <.><.*>: Abbrev Number: 5 \(DW_TAG_lexical_block\) - DW_AT_low_pc : .* - DW_AT_high_pc : .* - <.><.*>: Abbrev Number: 6 \(DW_TAG_variable\) - DW_AT_name : common - DW_AT_decl_file : 1 - DW_AT_decl_line : 3 - DW_AT_type : <.*> - DW_AT_external : 1 - DW_AT_location : 5 byte block: 3 0 0 0 0 \(DW_OP_addr: 0\) - <.><.*>: Abbrev Number: 6 \(DW_TAG_variable\) - DW_AT_name : global - DW_AT_decl_file : 1 - DW_AT_decl_line : 4 - DW_AT_type : <.*> - DW_AT_external : 1 - DW_AT_location : 5 byte block: 3 0 0 0 0 \(DW_OP_addr: 0\) - <.><.*>: Abbrev Number: 7 \(DW_TAG_variable\) - DW_AT_name : local - DW_AT_decl_file : 1 - DW_AT_decl_line : 5 - DW_AT_type : <.*> - DW_AT_location : 5 byte block: 3 . 0 0 . \(DW_OP_addr: .\) - <.><.*>: Abbrev Number: 8 \(DW_TAG_array_type\) - DW_AT_sibling : <.*> - DW_AT_type : <.*> - <.><.*>: Abbrev Number: 9 \(DW_TAG_subrange_type\) - DW_AT_upper_bound : 6 - <.><.*>: Abbrev Number: 3 \(DW_TAG_base_type\) - DW_AT_name : char - DW_AT_byte_size : 1 - DW_AT_encoding : 8 \(unsigned char\) - <.><.*>: Abbrev Number: 7 \(DW_TAG_variable\) - DW_AT_name : string - DW_AT_decl_file : 1 - DW_AT_decl_line : 6 - DW_AT_type : <.*> - DW_AT_location : 5 byte block: 3 . 0 0 . \(DW_OP_addr: .\) diff --git a/binutils/testsuite/binutils-all/size.exp b/binutils/testsuite/binutils-all/size.exp deleted file mode 100644 index b908c9198bf..00000000000 --- a/binutils/testsuite/binutils-all/size.exp +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-dejagnu@prep.ai.mit.edu - -# This file was written by Rob Savoye -# and rewritten by Ian Lance Taylor - -if ![is_remote host] { - if {[which $SIZE] == 0} then { - perror "$SIZE does not exist" - return - } -} - -send_user "Version [binutil_version $SIZE]" - - -if {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then { - return -} - -if [is_remote host] { - set testfile [remote_download host tmpdir/bintest.o] -} else { - set testfile tmpdir/bintest.o -} - -set dec "\[0-9\]+" -set hex "\[0-9a-fA-F\]+" - -# Test size with no arguments - -set got [binutils_run $SIZE "$SIZEFLAGS $testfile"] - -set want "($dec)\[ \]+($dec)\[ \]+($dec)\[ \]+($dec)\[ \]+($hex)\[ \]+${testfile}" - -if ![regexp $want $got all text data bss dtot hextot] then { - fail "size (no arguments)" -} else { - if {$text < 8 || $data < 4} then { - fail "size (no arguments)" - } else { - pass "size (no arguments)" - } -} - -# Test size -A - -set got [binutils_run $SIZE "$SIZEFLAGS -A ${testfile}"] - -set want "${testfile}.*(text|TEXT)\[^\n\r\]*\[ \]($dec)\[ \]+$dec.*(\\.data|DATA)\[^\n\r\]*\[ \]($dec)\[ \]+$dec" - -if ![regexp $want $got all textname textsize dataname datasize] then { - fail "size -A" -} else { - verbose "text size: $textsize" - verbose "data size: $datasize" - if {$textsize < 8 || $datasize < 4} then { - fail "size -A" - } else { - pass "size -A" - } -} diff --git a/binutils/testsuite/binutils-all/testprog.c b/binutils/testsuite/binutils-all/testprog.c deleted file mode 100644 index c2b1856dedd..00000000000 --- a/binutils/testsuite/binutils-all/testprog.c +++ /dev/null @@ -1,30 +0,0 @@ -/* This program is used to test objcopy and strip. */ - -#include - -int common; -int global = 1; -static int local = 2; -static char string[] = "string"; - -int -fn () -{ - return 3; -} - -int -main () -{ - if (common != 0 - || global != 1 - || local != 2 - || strcmp (string, "string") != 0) - { - printf ("failed\n"); - exit (1); - } - - printf ("ok\n"); - exit (0); -} diff --git a/binutils/testsuite/config/default.exp b/binutils/testsuite/config/default.exp deleted file mode 100644 index 2a2802e3a14..00000000000 --- a/binutils/testsuite/config/default.exp +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-dejagnu@prep.ai.mit.edu - -# This file was written by Rob Savoye. (rob@cygnus.com) - -load_lib util-defs.exp -load_lib utils-lib.exp - -if ![info exists NM] then { - set NM [findfile $base_dir/nm-new $base_dir/nm-new [transform nm]] -} -if ![info exists NMFLAGS] then { - set NMFLAGS "" -} - -if ![info exists SIZE] then { - set SIZE [findfile $base_dir/size] -} -if ![info exists SIZEFLAGS] then { - set SIZEFLAGS "" -} - -if ![info exists OBJDUMP] then { - set OBJDUMP [findfile $base_dir/objdump] -} -if ![info exists OBJDUMPFLAGS] then { - set OBJDUMPFLAGS "" -} - -if ![info exists OBJCOPY] then { - set OBJCOPY [findfile $base_dir/objcopy] -} -if ![info exists OBJCOPYFLAGS] then { - set OBJCOPYFLAGS "" -} - -if ![info exists AR] then { - set AR [findfile $base_dir/ar] -} - -if ![info exists STRIP] then { - set STRIP [findfile $base_dir/strip-new $base_dir/strip-new [transform strip]] -} -if ![info exists STRIPFLAGS] then { - set STRIPFLAGS "" -} - -if ![info exists READELF] then { - set READELF [findfile $base_dir/readelf] -} -if ![info exists READELFFLAGS] then { - set READELFFLAGS "" -} - -if ![file isdirectory tmpdir] {catch "exec mkdir tmpdir" status} - -# -# binutils_run -# run a program, returning the output -# sets binutils_run_failed if the program does not exist -# -proc binutils_run { prog progargs } { - default_binutils_run $prog $progargs -} - -# -# binutils_assemble -# assemble a file -# -proc binutils_assemble { source object } { - default_binutils_assemble $source $object -} diff --git a/binutils/testsuite/config/hppa.sed b/binutils/testsuite/config/hppa.sed deleted file mode 100644 index d8607d85d0c..00000000000 --- a/binutils/testsuite/config/hppa.sed +++ /dev/null @@ -1,4 +0,0 @@ -s/# Old OSF sed blows up if you have a sed command starting with "#"// -s/# Avoid it by putting the comments within real sed commands.// -s/# Fix the definition of common_symbol to be correct for the PA assebmlers.// -s/ \.comm common_symbol,4/common_symbol .comm 4/ diff --git a/binutils/testsuite/lib/utils-lib.exp b/binutils/testsuite/lib/utils-lib.exp deleted file mode 100644 index e27f21710c9..00000000000 --- a/binutils/testsuite/lib/utils-lib.exp +++ /dev/null @@ -1,161 +0,0 @@ -# Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-dejagnu@prep.ai.mit.edu - -# This file was written by Rob Savoye -# and extended by Ian Lance Taylor - -proc binutil_version { prog } { - if ![is_remote host] { - set path [which $prog]; - if {$path == 0} then { - perror "$prog can't be run, file not found." - return "" - } - } else { - set path $prog - } - set state [remote_exec host $prog --version]; - set tmp "[lindex $state 1]\n"; - # Should find a way to discard constant parts, keep whatever's - # left, so the version string could be almost anything at all... - regexp "\[^\n\]* (cygnus-|)(\[-0-9.a-zA-Z-\]+)\[\r\n\].*" "$tmp" version cyg number - if ![info exists number] then { - return "$path (no version number)\n" - } - return "$path $number\n" -} - -# -# default_binutils_run -# run a program, returning the output -# sets binutils_run_failed if the program does not exist -# -proc default_binutils_run { prog progargs } { - global binutils_run_failed - global host_triplet - - set binutils_run_failed 0 - - if ![is_remote host] { - if {[which $prog] == 0} then { - perror "$prog does not exist" - set binutils_run_failed 1 - return "" - } - } - - send_log "$prog $progargs\n" - verbose "$prog $progargs" - - # Gotta quote dollar-signs because they get mangled by the - # shell otherwise. - regsub -all "\\$" "$progargs" "\\$" progargs - - set state [remote_exec host $prog $progargs] - set exec_output [prune_warnings [lindex $state 1]]; - if {![string match "" $exec_output]} then { - send_log "$exec_output\n" - verbose "$exec_output" - } - return $exec_output -} - -# -# default_binutils_assemble -# assemble a file -# -proc default_binutils_assemble { source object } { - global srcdir - global host_triplet - - # The HPPA assembler syntax is a little different than most, to make - # the test source file assemble we need to run it through sed. - # - # This is a hack in that it won't scale well if other targets need - # similar transformations to assemble. We'll generalize the hack - # if/when other targets need similar handling. - if [istarget "hppa*-*-*" ] then { - send_log "sed -f $srcdir/config/hppa.sed < $source > asm.s\n" - verbose "sed -f $srcdir/config/hppa.sed < $source > asm.s" - catch "exec sed -f $srcdir/config/hppa.sed < $source > asm.s"; - set source asm.s - } - - set exec_output [target_assemble $source $object ""]; - set exec_output [prune_warnings $exec_output] - - if [string match "" $exec_output] { - return 1 - } else { - send_log "$exec_output\n" - verbose "$exec_output" - perror "$source: assembly failed" - return 0 - } -} - -if ![info exists target_assemble] { -# -# Stolen from dejagnu/lib/target.exp--please remove after 1/1/98. -# -uplevel #0 { - proc target_assemble { source destfile flags } { - return [default_target_assemble $source $destfile $flags]; - } - - proc default_target_assemble { source destfile flags } { - global AS_FOR_TARGET; - global ASFLAGS_FOR_TARGET; - - if [info exists AS_FOR_TARGET] { - set AS "$AS_FOR_TARGET"; - } else { - if ![board_info target exists assembler] { - set AS [find_gas]; - } else { - set AS [board_info target assembler]; - } - } - - if [info exists ASFLAGS_FOR_TARGET] { - append flags " $ASFLAGS_FOR_TARGET"; - } - - if [is_remote host] { - set source [remote_download host $source]; - set dest "a.out" - } else { - set dest $destfile - } - set status [remote_exec host "$AS $source $flags -o $dest"] - if [is_remote host] { - remote_upload host $dest $destfile - } - - set comp_output [prune_warnings [lindex $status 1]]; - if { [lindex $status 0] != 0 } { - verbose -log "assembler exited with status [lindex $status 0]"; - } - if { [lindex $status 1] != "" } { - verbose -log "assembler output is:\n[lindex $status 1]" 2; - } - return ${comp_output}; -} -} -} diff --git a/binutils/version.c b/binutils/version.c deleted file mode 100644 index cb893cf9837..00000000000 --- a/binutils/version.c +++ /dev/null @@ -1,44 +0,0 @@ -/* version.c -- binutils version information - Copyright 1991, 96, 97, 98, 99, 2000 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 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include -#include "bfd.h" -#include "bucomm.h" - -/* This is the version numbers for the binutils. They all change in - lockstep -- it's easier that way. */ - -const char *program_version = VERSION; - -/* Print the version number and copyright information, and exit. This - implements the --version option for the various programs. */ - -void -print_version (name) - const char *name; -{ - /* This output is intended to follow the GNU standards document. */ - /* xgettext:c-format */ - printf ("GNU %s %s\n", name, program_version); - printf (_("Copyright 1997, 98, 99, 2000 Free Software Foundation, Inc.\n")); - printf (_("\ -This program is free software; you may redistribute it under the terms of\n\ -the GNU General Public License. This program has absolutely no warranty.\n")); - exit (0); -} diff --git a/binutils/windres.c b/binutils/windres.c deleted file mode 100644 index 89f0ac2ecc2..00000000000 --- a/binutils/windres.c +++ /dev/null @@ -1,1009 +0,0 @@ -/* windres.c -- a program to manipulate Windows resources - Copyright 1997, 98, 99, 2000 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This program can read and write Windows resources in various - formats. In particular, it can act like the rc resource compiler - program, and it can act like the cvtres res to COFF conversion - program. - - It is based on information taken from the following sources: - - * Microsoft documentation. - - * The rcl program, written by Gunther Ebert - . - - * The res2coff program, written by Pedro A. Aranda . - - */ - -#include "bfd.h" -#include "getopt.h" -#include "bucomm.h" -#include "libiberty.h" -#include "obstack.h" -#include "windres.h" - -#include -#include -#include - -/* used by resrc.c at least */ - -int verbose = 0; - -/* An enumeration of format types. */ - -enum res_format -{ - /* Unknown format. */ - RES_FORMAT_UNKNOWN, - /* Textual RC file. */ - RES_FORMAT_RC, - /* Binary RES file. */ - RES_FORMAT_RES, - /* COFF file. */ - RES_FORMAT_COFF -}; - -/* A structure used to map between format types and strings. */ - -struct format_map -{ - const char *name; - enum res_format format; -}; - -/* A mapping between names and format types. */ - -static const struct format_map format_names[] = -{ - { "rc", RES_FORMAT_RC }, - { "res", RES_FORMAT_RES }, - { "coff", RES_FORMAT_COFF }, - { NULL, RES_FORMAT_UNKNOWN } -}; - -/* A mapping from file extensions to format types. */ - -static const struct format_map format_fileexts[] = -{ - { "rc", RES_FORMAT_RC }, - { "res", RES_FORMAT_RES }, - { "exe", RES_FORMAT_COFF }, - { "obj", RES_FORMAT_COFF }, - { "o", RES_FORMAT_COFF }, - { NULL, RES_FORMAT_UNKNOWN } -}; - -/* A list of include directories. */ - -struct include_dir -{ - struct include_dir *next; - char *dir; -}; - -static struct include_dir *include_dirs; - -/* Long options. */ - -/* 150 isn't special; it's just an arbitrary non-ASCII char value. */ - -#define OPTION_DEFINE 150 -#define OPTION_HELP (OPTION_DEFINE + 1) -#define OPTION_INCLUDE_DIR (OPTION_HELP + 1) -#define OPTION_LANGUAGE (OPTION_INCLUDE_DIR + 1) -#define OPTION_PREPROCESSOR (OPTION_LANGUAGE + 1) -#define OPTION_USE_TEMP_FILE (OPTION_PREPROCESSOR + 1) -#define OPTION_NO_USE_TEMP_FILE (OPTION_USE_TEMP_FILE + 1) -#define OPTION_VERSION (OPTION_NO_USE_TEMP_FILE + 1) -#define OPTION_YYDEBUG (OPTION_VERSION + 1) - -static const struct option long_options[] = -{ - {"define", required_argument, 0, OPTION_DEFINE}, - {"help", no_argument, 0, OPTION_HELP}, - {"include-dir", required_argument, 0, OPTION_INCLUDE_DIR}, - {"input-format", required_argument, 0, 'I'}, - {"language", required_argument, 0, OPTION_LANGUAGE}, - {"output-format", required_argument, 0, 'O'}, - {"preprocessor", required_argument, 0, OPTION_PREPROCESSOR}, - {"target", required_argument, 0, 'F'}, - {"use-temp-file", no_argument, 0, OPTION_USE_TEMP_FILE}, - {"no-use-temp-file", no_argument, 0, OPTION_NO_USE_TEMP_FILE}, - {"verbose", no_argument, 0, 'v'}, - {"version", no_argument, 0, OPTION_VERSION}, - {"yydebug", no_argument, 0, OPTION_YYDEBUG}, - {0, no_argument, 0, 0} -}; - -/* Static functions. */ - -static void res_init PARAMS ((void)); -static int extended_menuitems PARAMS ((const struct menuitem *)); -static enum res_format format_from_name PARAMS ((const char *)); -static enum res_format format_from_filename PARAMS ((const char *, int)); -static void usage PARAMS ((FILE *, int)); -static int cmp_res_entry PARAMS ((const PTR, const PTR)); -static struct res_directory *sort_resources PARAMS ((struct res_directory *)); - -/* When we are building a resource tree, we allocate everything onto - an obstack, so that we can free it all at once if we want. */ - -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free free - -/* The resource building obstack. */ - -static struct obstack res_obstack; - -/* Initialize the resource building obstack. */ - -static void -res_init () -{ - obstack_init (&res_obstack); -} - -/* Allocate space on the resource building obstack. */ - -PTR -res_alloc (bytes) - size_t bytes; -{ - return (PTR) obstack_alloc (&res_obstack, bytes); -} - -/* We also use an obstack to save memory used while writing out a set - of resources. */ - -static struct obstack reswr_obstack; - -/* Initialize the resource writing obstack. */ - -static void -reswr_init () -{ - obstack_init (&reswr_obstack); -} - -/* Allocate space on the resource writing obstack. */ - -PTR -reswr_alloc (bytes) - size_t bytes; -{ - return (PTR) obstack_alloc (&reswr_obstack, bytes); -} - -/* Open a file using the include directory search list. */ - -FILE * -open_file_search (filename, mode, errmsg, real_filename) - const char *filename; - const char *mode; - const char *errmsg; - char **real_filename; -{ - FILE *e; - struct include_dir *d; - - e = fopen (filename, mode); - if (e != NULL) - { - *real_filename = xstrdup (filename); - return e; - } - - if (errno == ENOENT) - { - for (d = include_dirs; d != NULL; d = d->next) - { - char *n; - - n = (char *) xmalloc (strlen (d->dir) + strlen (filename) + 2); - sprintf (n, "%s/%s", d->dir, filename); - e = fopen (n, mode); - if (e != NULL) - { - *real_filename = n; - return e; - } - - if (errno != ENOENT) - break; - } - } - - fatal (_("can't open %s `%s': %s"), errmsg, filename, strerror (errno)); - - /* Return a value to avoid a compiler warning. */ - return NULL; -} - -/* Compare two resource ID's. We consider name entries to come before - numeric entries, because that is how they appear in the COFF .rsrc - section. */ - -int -res_id_cmp (a, b) - struct res_id a; - struct res_id b; -{ - if (! a.named) - { - if (b.named) - return 1; - if (a.u.id > b.u.id) - return 1; - else if (a.u.id < b.u.id) - return -1; - else - return 0; - } - else - { - unichar *as, *ase, *bs, *bse; - - if (! b.named) - return -1; - - as = a.u.n.name; - ase = as + a.u.n.length; - bs = b.u.n.name; - bse = bs + b.u.n.length; - - while (as < ase) - { - int i; - - if (bs >= bse) - return 1; - i = (int) *as - (int) *bs; - if (i != 0) - return i; - ++as; - ++bs; - } - - if (bs < bse) - return -1; - - return 0; - } -} - -/* Print a resource ID. */ - -void -res_id_print (stream, id, quote) - FILE *stream; - struct res_id id; - int quote; -{ - if (! id.named) - fprintf (stream, "%lu", id.u.id); - else - { - if (quote) - putc ('"', stream); - unicode_print (stream, id.u.n.name, id.u.n.length); - if (quote) - putc ('"', stream); - } -} - -/* Print a list of resource ID's. */ - -void -res_ids_print (stream, cids, ids) - FILE *stream; - int cids; - const struct res_id *ids; -{ - int i; - - for (i = 0; i < cids; i++) - { - res_id_print (stream, ids[i], 1); - if (i + 1 < cids) - fprintf (stream, ": "); - } -} - -/* Convert an ASCII string to a resource ID. */ - -void -res_string_to_id (res_id, string) - struct res_id *res_id; - const char *string; -{ - res_id->named = 1; - unicode_from_ascii (&res_id->u.n.length, &res_id->u.n.name, string); -} - -/* Define a resource. The arguments are the resource tree, RESOURCES, - and the location at which to put it in the tree, CIDS and IDS. - This returns a newly allocated res_resource structure, which the - caller is expected to initialize. If DUPOK is non-zero, then if a - resource with this ID exists, it is returned. Otherwise, a warning - is issued, and a new resource is created replacing the existing - one. */ - -struct res_resource * -define_resource (resources, cids, ids, dupok) - struct res_directory **resources; - int cids; - const struct res_id *ids; - int dupok; -{ - struct res_entry *re = NULL; - int i; - - assert (cids > 0); - for (i = 0; i < cids; i++) - { - struct res_entry **pp; - - if (*resources == NULL) - { - static unsigned long timeval; - - /* Use the same timestamp for every resource created in a - single run. */ - if (timeval == 0) - timeval = time (NULL); - - *resources = ((struct res_directory *) - res_alloc (sizeof **resources)); - (*resources)->characteristics = 0; - (*resources)->time = timeval; - (*resources)->major = 0; - (*resources)->minor = 0; - (*resources)->entries = NULL; - } - - for (pp = &(*resources)->entries; *pp != NULL; pp = &(*pp)->next) - if (res_id_cmp ((*pp)->id, ids[i]) == 0) - break; - - if (*pp != NULL) - re = *pp; - else - { - re = (struct res_entry *) res_alloc (sizeof *re); - re->next = NULL; - re->id = ids[i]; - if ((i + 1) < cids) - { - re->subdir = 1; - re->u.dir = NULL; - } - else - { - re->subdir = 0; - re->u.res = NULL; - } - - *pp = re; - } - - if ((i + 1) < cids) - { - if (! re->subdir) - { - fprintf (stderr, "%s: ", program_name); - res_ids_print (stderr, i, ids); - fprintf (stderr, _(": expected to be a directory\n")); - xexit (1); - } - - resources = &re->u.dir; - } - } - - if (re->subdir) - { - fprintf (stderr, "%s: ", program_name); - res_ids_print (stderr, cids, ids); - fprintf (stderr, _(": expected to be a leaf\n")); - xexit (1); - } - - if (re->u.res != NULL) - { - if (dupok) - return re->u.res; - - fprintf (stderr, _("%s: warning: "), program_name); - res_ids_print (stderr, cids, ids); - fprintf (stderr, _(": duplicate value\n")); - } - - re->u.res = ((struct res_resource *) - res_alloc (sizeof (struct res_resource))); - - re->u.res->type = RES_TYPE_UNINITIALIZED; - memset (&re->u.res->res_info, 0, sizeof (struct res_res_info)); - memset (&re->u.res->coff_info, 0, sizeof (struct res_coff_info)); - - return re->u.res; -} - -/* Define a standard resource. This is a version of define_resource - that just takes type, name, and language arguments. */ - -struct res_resource * -define_standard_resource (resources, type, name, language, dupok) - struct res_directory **resources; - int type; - struct res_id name; - int language; - int dupok; -{ - struct res_id a[3]; - - a[0].named = 0; - a[0].u.id = type; - a[1] = name; - a[2].named = 0; - a[2].u.id = language; - return define_resource (resources, 3, a, dupok); -} - -/* Comparison routine for resource sorting. */ - -static int -cmp_res_entry (p1, p2) - const PTR p1; - const PTR p2; -{ - const struct res_entry **re1, **re2; - - re1 = (const struct res_entry **) p1; - re2 = (const struct res_entry **) p2; - return res_id_cmp ((*re1)->id, (*re2)->id); -} - -/* Sort the resources. */ - -static struct res_directory * -sort_resources (resdir) - struct res_directory *resdir; -{ - int c, i; - struct res_entry *re; - struct res_entry **a; - - if (resdir->entries == NULL) - return resdir; - - c = 0; - for (re = resdir->entries; re != NULL; re = re->next) - ++c; - - /* This is a recursive routine, so using xmalloc is probably better - than alloca. */ - a = (struct res_entry **) xmalloc (c * sizeof (struct res_entry *)); - - for (i = 0, re = resdir->entries; re != NULL; re = re->next, i++) - a[i] = re; - - qsort (a, c, sizeof (struct res_entry *), cmp_res_entry); - - resdir->entries = a[0]; - for (i = 0; i < c - 1; i++) - a[i]->next = a[i + 1]; - a[i]->next = NULL; - - free (a); - - /* Now sort the subdirectories. */ - - for (re = resdir->entries; re != NULL; re = re->next) - if (re->subdir) - re->u.dir = sort_resources (re->u.dir); - - return resdir; -} - -/* Return whether the dialog resource DIALOG is a DIALOG or a - DIALOGEX. */ - -int -extended_dialog (dialog) - const struct dialog *dialog; -{ - const struct dialog_control *c; - - if (dialog->ex != NULL) - return 1; - - for (c = dialog->controls; c != NULL; c = c->next) - if (c->data != NULL || c->help != 0) - return 1; - - return 0; -} - -/* Return whether MENUITEMS are a MENU or a MENUEX. */ - -int -extended_menu (menu) - const struct menu *menu; -{ - return extended_menuitems (menu->items); -} - -static int -extended_menuitems (menuitems) - const struct menuitem *menuitems; -{ - const struct menuitem *mi; - - for (mi = menuitems; mi != NULL; mi = mi->next) - { - if (mi->help != 0 || mi->state != 0) - return 1; - if (mi->popup != NULL && mi->id != 0) - return 1; - if ((mi->type - & ~ (MENUITEM_CHECKED - | MENUITEM_GRAYED - | MENUITEM_HELP - | MENUITEM_INACTIVE - | MENUITEM_MENUBARBREAK - | MENUITEM_MENUBREAK)) - != 0) - return 1; - if (mi->popup != NULL) - { - if (extended_menuitems (mi->popup)) - return 1; - } - } - - return 0; -} - -/* Convert a string to a format type, or exit if it can't be done. */ - -static enum res_format -format_from_name (name) - const char *name; -{ - const struct format_map *m; - - for (m = format_names; m->name != NULL; m++) - if (strcasecmp (m->name, name) == 0) - break; - - if (m->name == NULL) - { - non_fatal (_("unknown format type `%s'"), name); - fprintf (stderr, _("%s: supported formats:"), program_name); - for (m = format_names; m->name != NULL; m++) - fprintf (stderr, " %s", m->name); - fprintf (stderr, "\n"); - xexit (1); - } - - return m->format; -} - -/* Work out a format type given a file name. If INPUT is non-zero, - it's OK to look at the file itself. */ - -static enum res_format -format_from_filename (filename, input) - const char *filename; - int input; -{ - const char *ext; - FILE *e; - unsigned char b1, b2, b3, b4, b5; - int magic; - - /* If we have an extension, see if we recognize it as implying a - particular format. */ - ext = strrchr (filename, '.'); - if (ext != NULL) - { - const struct format_map *m; - - ++ext; - for (m = format_fileexts; m->name != NULL; m++) - if (strcasecmp (m->name, ext) == 0) - return m->format; - } - - /* If we don't recognize the name of an output file, assume it's a - COFF file. */ - - if (! input) - return RES_FORMAT_COFF; - - /* Read the first few bytes of the file to see if we can guess what - it is. */ - - e = fopen (filename, FOPEN_RB); - if (e == NULL) - fatal ("%s: %s", filename, strerror (errno)); - - b1 = getc (e); - b2 = getc (e); - b3 = getc (e); - b4 = getc (e); - b5 = getc (e); - - fclose (e); - - /* A PE executable starts with 0x4d 0x5a. */ - if (b1 == 0x4d && b2 == 0x5a) - return RES_FORMAT_COFF; - - /* A COFF .o file starts with a COFF magic number. */ - magic = (b2 << 8) | b1; - switch (magic) - { - case 0x14c: /* i386 */ - case 0x166: /* MIPS */ - case 0x184: /* Alpha */ - case 0x268: /* 68k */ - case 0x1f0: /* PowerPC */ - case 0x290: /* PA */ - return RES_FORMAT_COFF; - } - - /* A RES file starts with 0x0 0x0 0x0 0x0 0x20 0x0 0x0 0x0. */ - if (b1 == 0 && b2 == 0 && b3 == 0 && b4 == 0 && b5 == 0x20) - return RES_FORMAT_RES; - - /* If every character is printable or space, assume it's an RC file. */ - if ((isprint (b1) || isspace (b1)) - && (isprint (b2) || isspace (b2)) - && (isprint (b3) || isspace (b3)) - && (isprint (b4) || isspace (b4)) - && (isprint (b5) || isspace (b5))) - return RES_FORMAT_RC; - - /* Otherwise, we give up. */ - fatal (_("can not determine type of file `%s'; use the -I option"), - filename); - - /* Return something to silence the compiler warning. */ - return RES_FORMAT_UNKNOWN; -} - -/* Print a usage message and exit. */ - -static void -usage (stream, status) - FILE *stream; - int status; -{ - fprintf (stream, _("Usage: %s [options] [input-file] [output-file]\n"), - program_name); - fprintf (stream, _("\ -Options:\n\ - -i FILE, --input FILE Name input file\n\ - -o FILE, --output FILE Name output file\n\ - -I FORMAT, --input-format FORMAT\n\ - Specify input format\n\ - -O FORMAT, --output-format FORMAT\n\ - Specify output format\n\ - -F TARGET, --target TARGET Specify COFF target\n\ - --preprocessor PROGRAM Program to use to preprocess rc file\n\ - --include-dir DIR Include directory when preprocessing rc file\n\ - -DSYM[=VAL], --define SYM[=VAL]\n\ - Define SYM when preprocessing rc file\n\ - -v Verbose - tells you what it's doing\n\ - --language VAL Set language when reading rc file\n\ - --use-temp-file Use a temporary file instead of popen to read\n\ - the preprocessor output\n\ - --no-use-temp-file Use popen (default)\n")); -#ifdef YYDEBUG - fprintf (stream, _("\ - --yydebug Turn on parser debugging\n")); -#endif - fprintf (stream, _("\ - --help Print this help message\n\ - --version Print version information\n")); - fprintf (stream, _("\ -FORMAT is one of rc, res, or coff, and is deduced from the file name\n\ -extension if not specified. A single file name is an input file.\n\ -No input-file is stdin, default rc. No output-file is stdout, default rc.\n")); - list_supported_targets (program_name, stream); - if (status == 0) - fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); - exit (status); -} - -/* Quote characters that will confuse the shell when we run the preprocessor */ -static const char *quot (string) - const char *string; -{ - static char *buf = 0; - static int buflen = 0; - int slen = strlen (string); - const char *src; - char *dest; - - if ((buflen < slen * 2 + 2) || !buf) - { - buflen = slen * 2 + 2; - if (buf) - free (buf); - buf = (char *) xmalloc (buflen); - } - - for (src=string, dest=buf; *src; src++, dest++) - { - if (*src == '(' || *src == ')' || *src == ' ') - *dest++ = '\\'; - *dest = *src; - } - *dest = 0; - return buf; -} - -/* The main function. */ - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - char *input_filename; - char *output_filename; - enum res_format input_format; - enum res_format output_format; - char *target; - char *preprocessor; - char *preprocargs; - const char *quotedarg; - int language; - struct res_directory *resources; - int use_temp_file; - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = argv[0]; - xmalloc_set_program_name (program_name); - - bfd_init (); - set_default_bfd_target (); - - res_init (); - - input_filename = NULL; - output_filename = NULL; - input_format = RES_FORMAT_UNKNOWN; - output_format = RES_FORMAT_UNKNOWN; - target = NULL; - preprocessor = NULL; - preprocargs = NULL; - language = -1; - use_temp_file = 0; - - while ((c = getopt_long (argc, argv, "i:o:I:O:F:D:v", long_options, - (int *) 0)) != EOF) - { - switch (c) - { - case 'i': - input_filename = optarg; - break; - - case 'o': - output_filename = optarg; - break; - - case 'I': - input_format = format_from_name (optarg); - break; - - case 'O': - output_format = format_from_name (optarg); - break; - - case 'F': - target = optarg; - break; - - case OPTION_PREPROCESSOR: - preprocessor = optarg; - break; - - case 'D': - case OPTION_DEFINE: - if (preprocargs == NULL) - { - quotedarg = quot (optarg); - preprocargs = xmalloc (strlen (quotedarg) + 3); - sprintf (preprocargs, "-D%s", quotedarg); - } - else - { - char *n; - - quotedarg = quot (optarg); - n = xmalloc (strlen (preprocargs) + strlen (quotedarg) + 4); - sprintf (n, "%s -D%s", preprocargs, quotedarg); - free (preprocargs); - preprocargs = n; - } - break; - - case 'v': - verbose ++; - break; - - case OPTION_INCLUDE_DIR: - if (preprocargs == NULL) - { - quotedarg = quot (optarg); - preprocargs = xmalloc (strlen (quotedarg) + 3); - sprintf (preprocargs, "-I%s", quotedarg); - } - else - { - char *n; - - quotedarg = quot (optarg); - n = xmalloc (strlen (preprocargs) + strlen (quotedarg) + 4); - sprintf (n, "%s -I%s", preprocargs, quotedarg); - free (preprocargs); - preprocargs = n; - } - - { - struct include_dir *n, **pp; - - n = (struct include_dir *) xmalloc (sizeof *n); - n->next = NULL; - n->dir = optarg; - - for (pp = &include_dirs; *pp != NULL; pp = &(*pp)->next) - ; - *pp = n; - } - - break; - - case OPTION_LANGUAGE: - language = strtol (optarg, (char **) NULL, 16); - break; - - case OPTION_USE_TEMP_FILE: - use_temp_file = 1; - break; - - case OPTION_NO_USE_TEMP_FILE: - use_temp_file = 0; - break; - -#ifdef YYDEBUG - case OPTION_YYDEBUG: - yydebug = 1; - break; -#endif - - case OPTION_HELP: - usage (stdout, 0); - break; - - case OPTION_VERSION: - print_version ("windres"); - break; - - default: - usage (stderr, 1); - break; - } - } - - if (input_filename == NULL && optind < argc) - { - input_filename = argv[optind]; - ++optind; - } - - if (output_filename == NULL && optind < argc) - { - output_filename = argv[optind]; - ++optind; - } - - if (argc != optind) - usage (stderr, 1); - - if (input_format == RES_FORMAT_UNKNOWN) - { - if (input_filename == NULL) - input_format = RES_FORMAT_RC; - else - input_format = format_from_filename (input_filename, 1); - } - - if (output_format == RES_FORMAT_UNKNOWN) - { - if (output_filename == NULL) - output_format = RES_FORMAT_RC; - else - output_format = format_from_filename (output_filename, 0); - } - - /* Read the input file. */ - - switch (input_format) - { - default: - abort (); - case RES_FORMAT_RC: - resources = read_rc_file (input_filename, preprocessor, preprocargs, - language, use_temp_file); - break; - case RES_FORMAT_RES: - resources = read_res_file (input_filename); - break; - case RES_FORMAT_COFF: - resources = read_coff_rsrc (input_filename, target); - break; - } - - if (resources == NULL) - fatal (_("no resources")); - - /* Sort the resources. This is required for COFF, convenient for - rc, and unimportant for res. */ - - resources = sort_resources (resources); - - /* Write the output file. */ - - reswr_init (); - - switch (output_format) - { - default: - abort (); - case RES_FORMAT_RC: - write_rc_file (output_filename, resources); - break; - case RES_FORMAT_RES: - write_res_file (output_filename, resources); - break; - case RES_FORMAT_COFF: - write_coff_file (output_filename, target, resources); - break; - } - - xexit (0); - return 0; -} - diff --git a/binutils/windres.h b/binutils/windres.h deleted file mode 100644 index ba736129828..00000000000 --- a/binutils/windres.h +++ /dev/null @@ -1,849 +0,0 @@ -/* windres.h -- header file for windres program. - Copyright 1997, 1998 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include - -/* This is the header file for the windres program. It defines - structures and declares functions used within the program. */ - -#include "winduni.h" - -/* We represent resources internally as a tree, similar to the tree - used in the .rsrc section of a COFF file. The root is a - res_directory structure. */ - -struct res_directory -{ - /* Resource flags. According to the MS docs, this is currently - always zero. */ - unsigned long characteristics; - /* Time/date stamp. */ - unsigned long time; - /* Major version number. */ - unsigned short major; - /* Minor version number. */ - unsigned short minor; - /* Directory entries. */ - struct res_entry *entries; -}; - -/* A resource ID is stored in a res_id structure. */ - -struct res_id -{ - /* Non-zero if this entry has a name rather than an ID. */ - unsigned int named : 1; - union - { - /* If the named field is non-zero, this is the name. */ - struct - { - /* Length of the name. */ - int length; - /* Pointer to the name, which is a Unicode string. */ - unichar *name; - } n; - /* If the named field is zero, this is the ID. */ - unsigned long id; - } u; -}; - -/* Each entry in the tree is a res_entry structure. We mix - directories and resources because in a COFF file all entries in a - directory are sorted together, whether the entries are - subdirectories or resources. */ - -struct res_entry -{ - /* Next entry. */ - struct res_entry *next; - /* Resource ID. */ - struct res_id id; - /* Non-zero if this entry is a subdirectory rather than a leaf. */ - unsigned int subdir : 1; - union - { - /* If the subdir field is non-zero, this is a pointer to the - subdirectory. */ - struct res_directory *dir; - /* If the subdir field is zero, this is a pointer to the resource - data. */ - struct res_resource *res; - } u; -}; - -/* Types of resources. */ - -enum res_type -{ - RES_TYPE_UNINITIALIZED, - RES_TYPE_ACCELERATOR, - RES_TYPE_BITMAP, - RES_TYPE_CURSOR, - RES_TYPE_GROUP_CURSOR, - RES_TYPE_DIALOG, - RES_TYPE_FONT, - RES_TYPE_FONTDIR, - RES_TYPE_ICON, - RES_TYPE_GROUP_ICON, - RES_TYPE_MENU, - RES_TYPE_MESSAGETABLE, - RES_TYPE_RCDATA, - RES_TYPE_STRINGTABLE, - RES_TYPE_USERDATA, - RES_TYPE_VERSIONINFO -}; - -/* A res file and a COFF file store information differently. The - res_info structures holds data which in a res file is stored with - each resource, but in a COFF file is stored elsewhere. */ - -struct res_res_info -{ - /* Language. In a COFF file, the third level of the directory is - keyed by the language, so the language of a resource is defined - by its location in the resource tree. */ - unsigned short language; - /* Characteristics of the resource. Entirely user defined. In a - COFF file, the res_directory structure has a characteristics - field, but I don't know if it's related to the one in the res - file. */ - unsigned long characteristics; - /* Version of the resource. Entirely user defined. In a COFF file, - the res_directory structure has a characteristics field, but I - don't know if it's related to the one in the res file. */ - unsigned long version; - /* Memory flags. This is a combination of the MEMFLAG values - defined below. Most of these values are historical, and are not - meaningful for win32. I don't think there is any way to store - this information in a COFF file. */ - unsigned short memflags; -}; - -/* Each resource in a COFF file has some information which can does - not appear in a res file. */ - -struct res_coff_info -{ - /* The code page used for the data. I don't really know what this - should be. */ - unsigned long codepage; - /* A resource entry in a COFF file has a reserved field, which we - record here when reading a COFF file. When writing a COFF file, - we set this field to zero. */ - unsigned long reserved; -}; - -/* Resource data is stored in a res_resource structure. */ - -struct res_resource -{ - /* The type of resource. */ - enum res_type type; - /* The data for the resource. */ - union - { - struct - { - unsigned long length; - const unsigned char *data; - } data; - struct accelerator *acc; - struct cursor *cursor; - struct group_cursor *group_cursor; - struct dialog *dialog; - struct fontdir *fontdir; - struct group_icon *group_icon; - struct menu *menu; - struct rcdata_item *rcdata; - struct stringtable *stringtable; - struct rcdata_item *userdata; - struct versioninfo *versioninfo; - } u; - /* Information from a res file. */ - struct res_res_info res_info; - /* Information from a COFF file. */ - struct res_coff_info coff_info; -}; - -/* Memory flags in the memflags field of a struct res_resource. */ - -#define MEMFLAG_MOVEABLE 0x10 -#define MEMFLAG_PURE 0x20 -#define MEMFLAG_PRELOAD 0x40 -#define MEMFLAG_DISCARDABLE 0x1000 - -/* Standard resource type codes. These are used in the ID field of a - res_entry structure. */ - -#define RT_CURSOR 1 -#define RT_BITMAP 2 -#define RT_ICON 3 -#define RT_MENU 4 -#define RT_DIALOG 5 -#define RT_STRING 6 -#define RT_FONTDIR 7 -#define RT_FONT 8 -#define RT_ACCELERATOR 9 -#define RT_RCDATA 10 -#define RT_MESSAGETABLE 11 -#define RT_GROUP_CURSOR 12 -#define RT_GROUP_ICON 14 -#define RT_VERSION 16 -#define RT_DLGINCLUDE 17 -#define RT_PLUGPLAY 19 -#define RT_VXD 20 -#define RT_ANICURSOR 21 -#define RT_ANIICON 22 - -/* An accelerator resource is a linked list of these structures. */ - -struct accelerator -{ - /* Next accelerator. */ - struct accelerator *next; - /* Flags. A combination of the ACC values defined below. */ - unsigned short flags; - /* Key value. */ - unsigned short key; - /* Resource ID. */ - unsigned short id; -}; - -/* Accelerator flags in the flags field of a struct accelerator. - These are the same values that appear in a res file. I hope. */ - -#define ACC_VIRTKEY 0x01 -#define ACC_NOINVERT 0x02 -#define ACC_SHIFT 0x04 -#define ACC_CONTROL 0x08 -#define ACC_ALT 0x10 -#define ACC_LAST 0x80 - -/* A cursor resource. */ - -struct cursor -{ - /* X coordinate of hotspot. */ - short xhotspot; - /* Y coordinate of hotspot. */ - short yhotspot; - /* Length of bitmap data. */ - unsigned long length; - /* Data. */ - const unsigned char *data; -}; - -/* A group_cursor resource is a list of group_cursor structures. */ - -struct group_cursor -{ - /* Next cursor in group. */ - struct group_cursor *next; - /* Width. */ - unsigned short width; - /* Height. */ - unsigned short height; - /* Planes. */ - unsigned short planes; - /* Bits per pixel. */ - unsigned short bits; - /* Number of bytes in cursor resource. */ - unsigned long bytes; - /* Index of cursor resource. */ - unsigned short index; -}; - -/* A dialog resource. */ - -struct dialog -{ - /* Basic window style. */ - unsigned long style; - /* Extended window style. */ - unsigned long exstyle; - /* X coordinate. */ - unsigned short x; - /* Y coordinate. */ - unsigned short y; - /* Width. */ - unsigned short width; - /* Height. */ - unsigned short height; - /* Menu name. */ - struct res_id menu; - /* Class name. */ - struct res_id class; - /* Caption. */ - unichar *caption; - /* Font point size. */ - unsigned short pointsize; - /* Font name. */ - unichar *font; - /* Extended information for a dialogex. */ - struct dialog_ex *ex; - /* Controls. */ - struct dialog_control *controls; -}; - -/* An extended dialog has additional information. */ - -struct dialog_ex -{ - /* Help ID. */ - unsigned long help; - /* Font weight. */ - unsigned short weight; - /* Whether the font is italic. */ - unsigned short italic; -}; - -/* Window style flags, from the winsup Defines.h header file. These - can appear in the style field of a struct dialog or a struct - dialog_control. */ - -#define CW_USEDEFAULT (0x80000000) -#define WS_BORDER (0x800000L) -#define WS_CAPTION (0xc00000L) -#define WS_CHILD (0x40000000L) -#define WS_CHILDWINDOW (0x40000000L) -#define WS_CLIPCHILDREN (0x2000000L) -#define WS_CLIPSIBLINGS (0x4000000L) -#define WS_DISABLED (0x8000000L) -#define WS_DLGFRAME (0x400000L) -#define WS_GROUP (0x20000L) -#define WS_HSCROLL (0x100000L) -#define WS_ICONIC (0x20000000L) -#define WS_MAXIMIZE (0x1000000L) -#define WS_MAXIMIZEBOX (0x10000L) -#define WS_MINIMIZE (0x20000000L) -#define WS_MINIMIZEBOX (0x20000L) -#define WS_OVERLAPPED (0L) -#define WS_OVERLAPPEDWINDOW (0xcf0000L) -#define WS_POPUP (0x80000000L) -#define WS_POPUPWINDOW (0x80880000L) -#define WS_SIZEBOX (0x40000L) -#define WS_SYSMENU (0x80000L) -#define WS_TABSTOP (0x10000L) -#define WS_THICKFRAME (0x40000L) -#define WS_TILED (0L) -#define WS_TILEDWINDOW (0xcf0000L) -#define WS_VISIBLE (0x10000000L) -#define WS_VSCROLL (0x200000L) -#define MDIS_ALLCHILDSTYLES (0x1) -#define BS_3STATE (0x5L) -#define BS_AUTO3STATE (0x6L) -#define BS_AUTOCHECKBOX (0x3L) -#define BS_AUTORADIOBUTTON (0x9L) -#define BS_BITMAP (0x80L) -#define BS_BOTTOM (0x800L) -#define BS_CENTER (0x300L) -#define BS_CHECKBOX (0x2L) -#define BS_DEFPUSHBUTTON (0x1L) -#define BS_GROUPBOX (0x7L) -#define BS_ICON (0x40L) -#define BS_LEFT (0x100L) -#define BS_LEFTTEXT (0x20L) -#define BS_MULTILINE (0x2000L) -#define BS_NOTIFY (0x4000L) -#define BS_OWNERDRAW (0xbL) -#define BS_PUSHBOX (0xcL) /* FIXME! What should this be? */ -#define BS_PUSHBUTTON (0L) -#define BS_PUSHLIKE (0x1000L) -#define BS_RADIOBUTTON (0x4L) -#define BS_RIGHT (0x200L) -#define BS_RIGHTBUTTON (0x20L) -#define BS_TEXT (0L) -#define BS_TOP (0x400L) -#define BS_USERBUTTON (0x8L) -#define BS_VCENTER (0xc00L) -#define CBS_AUTOHSCROLL (0x40L) -#define CBS_DISABLENOSCROLL (0x800L) -#define CBS_DROPDOWN (0x2L) -#define CBS_DROPDOWNLIST (0x3L) -#define CBS_HASSTRINGS (0x200L) -#define CBS_LOWERCASE (0x4000L) -#define CBS_NOINTEGRALHEIGHT (0x400L) -#define CBS_OEMCONVERT (0x80L) -#define CBS_OWNERDRAWFIXED (0x10L) -#define CBS_OWNERDRAWVARIABLE (0x20L) -#define CBS_SIMPLE (0x1L) -#define CBS_SORT (0x100L) -#define CBS_UPPERCASE (0x2000L) -#define ES_AUTOHSCROLL (0x80L) -#define ES_AUTOVSCROLL (0x40L) -#define ES_CENTER (0x1L) -#define ES_LEFT (0L) -#define ES_LOWERCASE (0x10L) -#define ES_MULTILINE (0x4L) -#define ES_NOHIDESEL (0x100L) -#define ES_NUMBER (0x2000L) -#define ES_OEMCONVERT (0x400L) -#define ES_PASSWORD (0x20L) -#define ES_READONLY (0x800L) -#define ES_RIGHT (0x2L) -#define ES_UPPERCASE (0x8L) -#define ES_WANTRETURN (0x1000L) -#define LBS_DISABLENOSCROLL (0x1000L) -#define LBS_EXTENDEDSEL (0x800L) -#define LBS_HASSTRINGS (0x40L) -#define LBS_MULTICOLUMN (0x200L) -#define LBS_MULTIPLESEL (0x8L) -#define LBS_NODATA (0x2000L) -#define LBS_NOINTEGRALHEIGHT (0x100L) -#define LBS_NOREDRAW (0x4L) -#define LBS_NOSEL (0x4000L) -#define LBS_NOTIFY (0x1L) -#define LBS_OWNERDRAWFIXED (0x10L) -#define LBS_OWNERDRAWVARIABLE (0x20L) -#define LBS_SORT (0x2L) -#define LBS_STANDARD (0xa00003L) -#define LBS_USETABSTOPS (0x80L) -#define LBS_WANTKEYBOARDINPUT (0x400L) -#define SBS_BOTTOMALIGN (0x4L) -#define SBS_HORZ (0L) -#define SBS_LEFTALIGN (0x2L) -#define SBS_RIGHTALIGN (0x4L) -#define SBS_SIZEBOX (0x8L) -#define SBS_SIZEBOXBOTTOMRIGHTALIGN (0x4L) -#define SBS_SIZEBOXTOPLEFTALIGN (0x2L) -#define SBS_SIZEGRIP (0x10L) -#define SBS_TOPALIGN (0x2L) -#define SBS_VERT (0x1L) -#define SS_BITMAP (0xeL) -#define SS_BLACKFRAME (0x7L) -#define SS_BLACKRECT (0x4L) -#define SS_CENTER (0x1L) -#define SS_CENTERIMAGE (0x200L) -#define SS_ENHMETAFILE (0xfL) -#define SS_ETCHEDFRAME (0x12L) -#define SS_ETCHEDHORZ (0x10L) -#define SS_ETCHEDVERT (0x11L) -#define SS_GRAYFRAME (0x8L) -#define SS_GRAYRECT (0x5L) -#define SS_ICON (0x3L) -#define SS_LEFT (0L) -#define SS_LEFTNOWORDWRAP (0xcL) -#define SS_NOPREFIX (0x80L) -#define SS_NOTIFY (0x100L) -#define SS_OWNERDRAW (0xdL) -#define SS_REALSIZEIMAGE (0x800L) -#define SS_RIGHT (0x2L) -#define SS_RIGHTJUST (0x400L) -#define SS_SIMPLE (0xbL) -#define SS_SUNKEN (0x1000L) -#define SS_USERITEM (0xaL) -#define SS_WHITEFRAME (0x9L) -#define SS_WHITERECT (0x6L) -#define DS_3DLOOK (0x4L) -#define DS_ABSALIGN (0x1L) -#define DS_CENTER (0x800L) -#define DS_CENTERMOUSE (0x1000L) -#define DS_CONTEXTHELP (0x2000L) -#define DS_CONTROL (0x400L) -#define DS_FIXEDSYS (0x8L) -#define DS_LOCALEDIT (0x20L) -#define DS_MODALFRAME (0x80L) -#define DS_NOFAILCREATE (0x10L) -#define DS_NOIDLEMSG (0x100L) -#define DS_SETFONT (0x40L) -#define DS_SETFOREGROUND (0x200L) -#define DS_SYSMODAL (0x2L) - -/* A dialog control. */ - -struct dialog_control -{ - /* Next control. */ - struct dialog_control *next; - /* ID. */ - unsigned short id; - /* Style. */ - unsigned long style; - /* Extended style. */ - unsigned long exstyle; - /* X coordinate. */ - unsigned short x; - /* Y coordinate. */ - unsigned short y; - /* Width. */ - unsigned short width; - /* Height. */ - unsigned short height; - /* Class name. */ - struct res_id class; - /* Associated text. */ - struct res_id text; - /* Extra data for the window procedure. */ - struct rcdata_item *data; - /* Help ID. Only used in an extended dialog. */ - unsigned long help; -}; - -/* Control classes. These can be used as the ID field in a struct - dialog_control. */ - -#define CTL_BUTTON 0x80 -#define CTL_EDIT 0x81 -#define CTL_STATIC 0x82 -#define CTL_LISTBOX 0x83 -#define CTL_SCROLLBAR 0x84 -#define CTL_COMBOBOX 0x85 - -/* A fontdir resource is a list of fontdir structures. */ - -struct fontdir -{ - struct fontdir *next; - /* Index of font entry. */ - short index; - /* Length of font information. */ - unsigned long length; - /* Font information. */ - const unsigned char *data; -}; - -/* A group_icon resource is a list of group_icon structures. */ - -struct group_icon -{ - /* Next icon in group. */ - struct group_icon *next; - /* Width. */ - unsigned char width; - /* Height. */ - unsigned char height; - /* Color count. */ - unsigned char colors; - /* Planes. */ - unsigned short planes; - /* Bits per pixel. */ - unsigned short bits; - /* Number of bytes in cursor resource. */ - unsigned long bytes; - /* Index of cursor resource. */ - unsigned short index; -}; - -/* A menu resource. */ - -struct menu -{ - /* List of menuitems. */ - struct menuitem *items; - /* Help ID. I don't think there is any way to set this in an rc - file, but it can appear in the binary format. */ - unsigned long help; -}; - -/* A menu resource is a list of menuitem structures. */ - -struct menuitem -{ - /* Next menuitem. */ - struct menuitem *next; - /* Type. In a normal menu, rather than a menuex, this is the flags - field. */ - unsigned long type; - /* State. This is only used in a menuex. */ - unsigned long state; - /* Id. */ - unsigned short id; - /* Unicode text. */ - unichar *text; - /* Popup menu items for a popup. */ - struct menuitem *popup; - /* Help ID. This is only used in a menuex. */ - unsigned long help; -}; - -/* Menu item flags. These can appear in the flags field of a struct - menuitem. */ - -#define MENUITEM_GRAYED 0x001 -#define MENUITEM_INACTIVE 0x002 -#define MENUITEM_BITMAP 0x004 -#define MENUITEM_OWNERDRAW 0x100 -#define MENUITEM_CHECKED 0x008 -#define MENUITEM_POPUP 0x010 -#define MENUITEM_MENUBARBREAK 0x020 -#define MENUITEM_MENUBREAK 0x040 -#define MENUITEM_ENDMENU 0x080 -#define MENUITEM_HELP 0x4000 - -/* An rcdata resource is a pointer to a list of rcdata_item - structures. */ - -struct rcdata_item -{ - /* Next data item. */ - struct rcdata_item *next; - /* Type of data. */ - enum - { - RCDATA_WORD, - RCDATA_DWORD, - RCDATA_STRING, - RCDATA_WSTRING, - RCDATA_BUFFER - } type; - union - { - unsigned int word; - unsigned long dword; - struct - { - unsigned long length; - const char *s; - } string; - struct - { - unsigned long length; - const unichar *w; - } wstring; - struct - { - unsigned long length; - const unsigned char *data; - } buffer; - } u; -}; - -/* A stringtable resource is a pointer to a stringtable structure. */ - -struct stringtable -{ - /* Each stringtable resource is a list of 16 unicode strings. */ - struct - { - /* Length of string. */ - int length; - /* String data if length > 0. */ - unichar *string; - } strings[16]; -}; - -/* A versioninfo resource points to a versioninfo structure. */ - -struct versioninfo -{ - /* Fixed version information. */ - struct fixed_versioninfo *fixed; - /* Variable version information. */ - struct ver_info *var; -}; - -/* The fixed portion of a versioninfo resource. */ - -struct fixed_versioninfo -{ - /* The file version, which is two 32 bit integers. */ - unsigned long file_version_ms; - unsigned long file_version_ls; - /* The product version, which is two 32 bit integers. */ - unsigned long product_version_ms; - unsigned long product_version_ls; - /* The file flags mask. */ - unsigned long file_flags_mask; - /* The file flags. */ - unsigned long file_flags; - /* The OS type. */ - unsigned long file_os; - /* The file type. */ - unsigned long file_type; - /* The file subtype. */ - unsigned long file_subtype; - /* The date, which in Windows is two 32 bit integers. */ - unsigned long file_date_ms; - unsigned long file_date_ls; -}; - -/* A list of variable version information. */ - -struct ver_info -{ - /* Next item. */ - struct ver_info *next; - /* Type of data. */ - enum { VERINFO_STRING, VERINFO_VAR } type; - union - { - /* StringFileInfo data. */ - struct - { - /* Language. */ - unichar *language; - /* Strings. */ - struct ver_stringinfo *strings; - } string; - /* VarFileInfo data. */ - struct - { - /* Key. */ - unichar *key; - /* Values. */ - struct ver_varinfo *var; - } var; - } u; -}; - -/* A list of string version information. */ - -struct ver_stringinfo -{ - /* Next string. */ - struct ver_stringinfo *next; - /* Key. */ - unichar *key; - /* Value. */ - unichar *value; -}; - -/* A list of variable version information. */ - -struct ver_varinfo -{ - /* Next item. */ - struct ver_varinfo *next; - /* Language ID. */ - unsigned short language; - /* Character set ID. */ - unsigned short charset; -}; - -/* This structure is used when converting resource information to - binary. */ - -struct bindata -{ - /* Next data. */ - struct bindata *next; - /* Length of data. */ - unsigned long length; - /* Data. */ - unsigned char *data; -}; - -extern int verbose; - -/* Function declarations. */ - -extern struct res_directory *read_rc_file - PARAMS ((const char *, const char *, const char *, int, int)); -extern struct res_directory *read_res_file PARAMS ((const char *)); -extern struct res_directory *read_coff_rsrc - PARAMS ((const char *, const char *)); -extern void write_rc_file - PARAMS ((const char *, const struct res_directory *)); -extern void write_res_file - PARAMS ((const char *, const struct res_directory *)); -extern void write_coff_file - PARAMS ((const char *, const char *, const struct res_directory *)); - -extern struct res_resource *bin_to_res - PARAMS ((struct res_id, const unsigned char *, unsigned long, int)); -extern struct bindata *res_to_bin PARAMS ((const struct res_resource *, int)); - -extern FILE *open_file_search - PARAMS ((const char *, const char *, const char *, char **)); - -extern PTR res_alloc PARAMS ((size_t)); -extern PTR reswr_alloc PARAMS ((size_t)); - -/* Resource ID handling. */ - -extern int res_id_cmp PARAMS ((struct res_id, struct res_id)); -extern void res_id_print PARAMS ((FILE *, struct res_id, int)); -extern void res_ids_print PARAMS ((FILE *, int, const struct res_id *)); -extern void res_string_to_id PARAMS ((struct res_id *, const char *)); - -/* Manipulation of the resource tree. */ - -extern struct res_resource *define_resource - PARAMS ((struct res_directory **, int, const struct res_id *, int)); -extern struct res_resource *define_standard_resource - PARAMS ((struct res_directory **, int, struct res_id, int, int)); - -extern int extended_dialog PARAMS ((const struct dialog *)); -extern int extended_menu PARAMS ((const struct menu *)); - -/* Communication between the rc file support and the parser and lexer. */ - -extern int yydebug; -extern FILE *yyin; -extern char *rc_filename; -extern int rc_lineno; -extern int yyparse PARAMS ((void)); -extern int yylex PARAMS ((void)); -extern void yyerror PARAMS ((const char *)); -extern void rcparse_warning PARAMS ((const char *)); -extern void rcparse_set_language PARAMS ((int)); -extern void rcparse_discard_strings PARAMS ((void)); -extern void rcparse_rcdata PARAMS ((void)); -extern void rcparse_normal PARAMS ((void)); - -extern void define_accelerator - PARAMS ((struct res_id, const struct res_res_info *, struct accelerator *)); -extern void define_bitmap - PARAMS ((struct res_id, const struct res_res_info *, const char *)); -extern void define_cursor - PARAMS ((struct res_id, const struct res_res_info *, const char *)); -extern void define_dialog - PARAMS ((struct res_id, const struct res_res_info *, const struct dialog *)); -extern struct dialog_control *define_control - PARAMS ((const char *, unsigned long, unsigned long, unsigned long, - unsigned long, unsigned long, unsigned long, unsigned long, - unsigned long)); -extern void define_font - PARAMS ((struct res_id, const struct res_res_info *, const char *)); -extern void define_icon - PARAMS ((struct res_id, const struct res_res_info *, const char *)); -extern void define_menu - PARAMS ((struct res_id, const struct res_res_info *, struct menuitem *)); -extern struct menuitem *define_menuitem - PARAMS ((const char *, int, unsigned long, unsigned long, unsigned long, - struct menuitem *)); -extern void define_messagetable - PARAMS ((struct res_id, const struct res_res_info *, const char *)); -extern void define_rcdata - PARAMS ((struct res_id, const struct res_res_info *, struct rcdata_item *)); -extern struct rcdata_item *define_rcdata_string - PARAMS ((const char *, unsigned long)); -extern struct rcdata_item *define_rcdata_number PARAMS ((unsigned long, int)); -extern void define_stringtable - PARAMS ((const struct res_res_info *, unsigned long, const char *)); -extern void define_user_data - PARAMS ((struct res_id, struct res_id, const struct res_res_info *, - struct rcdata_item *)); -extern void define_user_file - PARAMS ((struct res_id, struct res_id, const struct res_res_info *, - const char *)); -extern void define_versioninfo - PARAMS ((struct res_id, int, struct fixed_versioninfo *, - struct ver_info *)); -extern struct ver_info *append_ver_stringfileinfo - PARAMS ((struct ver_info *, const char *, struct ver_stringinfo *)); -extern struct ver_info *append_ver_varfileinfo - PARAMS ((struct ver_info *, const char *, struct ver_varinfo *)); -extern struct ver_stringinfo *append_verval - PARAMS ((struct ver_stringinfo *, const char *, const char *)); -extern struct ver_varinfo *append_vertrans - PARAMS ((struct ver_varinfo *, unsigned long, unsigned long)); diff --git a/binutils/winduni.c b/binutils/winduni.c deleted file mode 100644 index d79f47a3d7b..00000000000 --- a/binutils/winduni.c +++ /dev/null @@ -1,147 +0,0 @@ -/* winduni.c -- unicode support for the windres program. - Copyright 1997, 1998 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file contains unicode support routines for the windres - program. Ideally, we would have generic unicode support which - would work on all systems. However, we don't. Instead, on a - Windows host, we are prepared to call some Windows routines. This - means that we will generate different output on Windows and Unix - hosts, but that seems better than not really supporting unicode at - all. */ - -#include "bfd.h" -#include "bucomm.h" -#include "winduni.h" - -#include - -#ifdef _WIN32 -#include -#endif - -/* Convert an ASCII string to a unicode string. We just copy it, - expanding chars to shorts, rather than doing something intelligent. */ - -void -unicode_from_ascii (length, unicode, ascii) - int *length; - unichar **unicode; - const char *ascii; -{ - int len; - const char *s; - unsigned short *w; - - len = strlen (ascii); - - if (length != NULL) - *length = len; - - *unicode = ((unichar *) res_alloc ((len + 1) * sizeof (unichar))); - -#ifdef _WIN32 - /* FIXME: On Windows, we should be using MultiByteToWideChar to set - the length. */ - MultiByteToWideChar (CP_ACP, 0, ascii, len + 1, *unicode, len + 1); -#else - for (s = ascii, w = *unicode; *s != '\0'; s++, w++) - *w = *s & 0xff; - *w = 0; -#endif -} - -/* Print the unicode string UNICODE to the file E. LENGTH is the - number of characters to print, or -1 if we should print until the - end of the string. FIXME: On a Windows host, we should be calling - some Windows function, probably WideCharToMultiByte. */ - -void -unicode_print (e, unicode, length) - FILE *e; - const unichar *unicode; - int length; -{ - while (1) - { - unichar ch; - - if (length == 0) - return; - if (length > 0) - --length; - - ch = *unicode; - - if (ch == 0 && length < 0) - return; - - ++unicode; - - if ((ch & 0x7f) == ch) - { - if (ch == '\\') - fputs ("\\", e); - else if (isprint (ch)) - putc (ch, e); - else - { - switch (ch) - { - case ESCAPE_A: - fputs ("\\a", e); - break; - - case ESCAPE_B: - fputs ("\\b", e); - break; - - case ESCAPE_F: - fputs ("\\f", e); - break; - - case ESCAPE_N: - fputs ("\\n", e); - break; - - case ESCAPE_R: - fputs ("\\r", e); - break; - - case ESCAPE_T: - fputs ("\\t", e); - break; - - case ESCAPE_V: - fputs ("\\v", e); - break; - - default: - fprintf (e, "\\%03o", (unsigned int) ch); - break; - } - } - } - else if ((ch & 0xff) == ch) - fprintf (e, "\\%03o", (unsigned int) ch); - else - fprintf (e, "\\x%x", (unsigned int) ch); - } -} diff --git a/binutils/winduni.h b/binutils/winduni.h deleted file mode 100644 index 13a9af2e736..00000000000 --- a/binutils/winduni.h +++ /dev/null @@ -1,60 +0,0 @@ -/* winduni.h -- header file for unicode support for windres program. - Copyright 1997, 1998 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include - -/* This header file declares the types and functions we use for - unicode support in windres. Our unicode support is very limited at - present. - - We don't put this stuff in windres.h so that winduni.c doesn't have - to include windres.h. winduni.c needs to includes windows.h, and - that would conflict with the definitions of Windows macros we - already have in windres.h. */ - -/* We use this type to hold a unicode character. */ - -typedef unsigned short unichar; - -/* Escape character translations. */ - -#define ESCAPE_A (007) -#define ESCAPE_B (010) -#define ESCAPE_F (014) -#define ESCAPE_N (012) -#define ESCAPE_R (015) -#define ESCAPE_T (011) -#define ESCAPE_V (013) - -/* Convert an ASCII string to a unicode string. */ - -extern void unicode_from_ascii - PARAMS ((int *, unichar **, const char *)); - -/* Print a unicode string to a file. */ - -extern void unicode_print PARAMS ((FILE *, const unichar *, int)); - -/* Windres support routine called by unicode_from_ascii. This is both - here and in windres.h. It should probably be in a separate header - file, but it hardly seems worth it for one function. */ - -extern PTR res_alloc PARAMS ((size_t)); diff --git a/binutils/wrstabs.c b/binutils/wrstabs.c deleted file mode 100644 index c74af2ee72a..00000000000 --- a/binutils/wrstabs.c +++ /dev/null @@ -1,2415 +0,0 @@ -/* wrstabs.c -- Output stabs debugging information - Copyright (C) 1996, 97, 98, 99, 2000 Free Software Foundation, Inc. - Written by Ian Lance Taylor . - - This file is part of GNU Binutils. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file contains code which writes out stabs debugging - information. */ - -#include -#include -#include - -#include "bfd.h" -#include "bucomm.h" -#include "libiberty.h" -#include "debug.h" -#include "budbg.h" - -/* Meaningless definition needs by aout64.h. FIXME. */ -#define BYTES_IN_WORD 4 - -#include "aout/aout64.h" -#include "aout/stab_gnu.h" - -/* The size of a stabs symbol. This presumes 32 bit values. */ - -#define STAB_SYMBOL_SIZE (12) - -/* An entry in a string hash table. */ - -struct string_hash_entry -{ - struct bfd_hash_entry root; - /* Next string in this table. */ - struct string_hash_entry *next; - /* Index in string table. */ - long index; - /* Size of type if this is a typedef. */ - unsigned int size; -}; - -/* A string hash table. */ - -struct string_hash_table -{ - struct bfd_hash_table table; -}; - -/* The type stack. Each element on the stack is a string. */ - -struct stab_type_stack -{ - /* The next element on the stack. */ - struct stab_type_stack *next; - /* This element as a string. */ - char *string; - /* The type index of this element. */ - long index; - /* The size of the type. */ - unsigned int size; - /* Whether type string defines a new type. */ - boolean definition; - /* String defining struct fields. */ - char *fields; - /* NULL terminated array of strings defining base classes for a - class. */ - char **baseclasses; - /* String defining class methods. */ - char *methods; - /* String defining vtable pointer for a class. */ - char *vtable; -}; - -/* This structure is used to keep track of type indices for tagged - types. */ - -struct stab_tag -{ - /* The type index. */ - long index; - /* The tag name. */ - const char *tag; - /* The kind of type. This is set to DEBUG_KIND_ILLEGAL when the - type is defined. */ - enum debug_type_kind kind; - /* The size of the struct. */ - unsigned int size; -}; - -/* We remember various sorts of type indices. They are not related, - but, for convenience, we keep all the information in this - structure. */ - -struct stab_type_cache -{ - /* The void type index. */ - long void_type; - /* Signed integer type indices, indexed by size - 1. */ - long signed_integer_types[8]; - /* Unsigned integer type indices, indexed by size - 1. */ - long unsigned_integer_types[8]; - /* Floating point types, indexed by size - 1. */ - long float_types[16]; - /* Pointers to types, indexed by the type index. */ - long *pointer_types; - size_t pointer_types_alloc; - /* Functions returning types, indexed by the type index. */ - long *function_types; - size_t function_types_alloc; - /* References to types, indexed by the type index. */ - long *reference_types; - size_t reference_types_alloc; - /* Struct/union/class type indices, indexed by the struct id. */ - struct stab_tag *struct_types; - size_t struct_types_alloc; -}; - -/* This is the handle passed through debug_write. */ - -struct stab_write_handle -{ - /* The BFD. */ - bfd *abfd; - /* This buffer holds the symbols. */ - bfd_byte *symbols; - size_t symbols_size; - size_t symbols_alloc; - /* This is a list of hash table entries for the strings. */ - struct string_hash_entry *strings; - /* The last string hash table entry. */ - struct string_hash_entry *last_string; - /* The size of the strings. */ - size_t strings_size; - /* This hash table eliminates duplicate strings. */ - struct string_hash_table strhash; - /* The type stack. */ - struct stab_type_stack *type_stack; - /* The next type index. */ - long type_index; - /* The type cache. */ - struct stab_type_cache type_cache; - /* A mapping from typedef names to type indices. */ - struct string_hash_table typedef_hash; - /* If this is not -1, it is the offset to the most recent N_SO - symbol, and the value of that symbol needs to be set. */ - long so_offset; - /* If this is not -1, it is the offset to the most recent N_FUN - symbol, and the value of that symbol needs to be set. */ - long fun_offset; - /* The last text section address seen. */ - bfd_vma last_text_address; - /* The block nesting depth. */ - unsigned int nesting; - /* The function address. */ - bfd_vma fnaddr; - /* A pending LBRAC symbol. */ - bfd_vma pending_lbrac; - /* The current line number file name. */ - const char *lineno_filename; -}; - -static struct bfd_hash_entry *string_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static boolean stab_write_symbol - PARAMS ((struct stab_write_handle *, int, int, bfd_vma, const char *)); -static boolean stab_push_string - PARAMS ((struct stab_write_handle *, const char *, long, boolean, - unsigned int)); -static boolean stab_push_defined_type - PARAMS ((struct stab_write_handle *, long, unsigned int)); -static char *stab_pop_type PARAMS ((struct stab_write_handle *)); -static boolean stab_modify_type - PARAMS ((struct stab_write_handle *, int, unsigned int, long **, size_t *)); -static long stab_get_struct_index - PARAMS ((struct stab_write_handle *, const char *, unsigned int, - enum debug_type_kind, unsigned int *)); -static boolean stab_class_method_var - PARAMS ((struct stab_write_handle *, const char *, enum debug_visibility, - boolean, boolean, boolean, bfd_vma, boolean)); - -static boolean stab_start_compilation_unit PARAMS ((PTR, const char *)); -static boolean stab_start_source PARAMS ((PTR, const char *)); -static boolean stab_empty_type PARAMS ((PTR)); -static boolean stab_void_type PARAMS ((PTR)); -static boolean stab_int_type PARAMS ((PTR, unsigned int, boolean)); -static boolean stab_float_type PARAMS ((PTR, unsigned int)); -static boolean stab_complex_type PARAMS ((PTR, unsigned int)); -static boolean stab_bool_type PARAMS ((PTR, unsigned int)); -static boolean stab_enum_type - PARAMS ((PTR, const char *, const char **, bfd_signed_vma *)); -static boolean stab_pointer_type PARAMS ((PTR)); -static boolean stab_function_type PARAMS ((PTR, int, boolean)); -static boolean stab_reference_type PARAMS ((PTR)); -static boolean stab_range_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma)); -static boolean stab_array_type - PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, boolean)); -static boolean stab_set_type PARAMS ((PTR, boolean)); -static boolean stab_offset_type PARAMS ((PTR)); -static boolean stab_method_type PARAMS ((PTR, boolean, int, boolean)); -static boolean stab_const_type PARAMS ((PTR)); -static boolean stab_volatile_type PARAMS ((PTR)); -static boolean stab_start_struct_type - PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int)); -static boolean stab_struct_field - PARAMS ((PTR, const char *, bfd_vma, bfd_vma, enum debug_visibility)); -static boolean stab_end_struct_type PARAMS ((PTR)); -static boolean stab_start_class_type - PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int, boolean, - boolean)); -static boolean stab_class_static_member - PARAMS ((PTR, const char *, const char *, enum debug_visibility)); -static boolean stab_class_baseclass - PARAMS ((PTR, bfd_vma, boolean, enum debug_visibility)); -static boolean stab_class_start_method PARAMS ((PTR, const char *)); -static boolean stab_class_method_variant - PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean, - bfd_vma, boolean)); -static boolean stab_class_static_method_variant - PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean)); -static boolean stab_class_end_method PARAMS ((PTR)); -static boolean stab_end_class_type PARAMS ((PTR)); -static boolean stab_typedef_type PARAMS ((PTR, const char *)); -static boolean stab_tag_type - PARAMS ((PTR, const char *, unsigned int, enum debug_type_kind)); -static boolean stab_typdef PARAMS ((PTR, const char *)); -static boolean stab_tag PARAMS ((PTR, const char *)); -static boolean stab_int_constant PARAMS ((PTR, const char *, bfd_vma)); -static boolean stab_float_constant PARAMS ((PTR, const char *, double)); -static boolean stab_typed_constant PARAMS ((PTR, const char *, bfd_vma)); -static boolean stab_variable - PARAMS ((PTR, const char *, enum debug_var_kind, bfd_vma)); -static boolean stab_start_function PARAMS ((PTR, const char *, boolean)); -static boolean stab_function_parameter - PARAMS ((PTR, const char *, enum debug_parm_kind, bfd_vma)); -static boolean stab_start_block PARAMS ((PTR, bfd_vma)); -static boolean stab_end_block PARAMS ((PTR, bfd_vma)); -static boolean stab_end_function PARAMS ((PTR)); -static boolean stab_lineno - PARAMS ((PTR, const char *, unsigned long, bfd_vma)); - -static const struct debug_write_fns stab_fns = -{ - stab_start_compilation_unit, - stab_start_source, - stab_empty_type, - stab_void_type, - stab_int_type, - stab_float_type, - stab_complex_type, - stab_bool_type, - stab_enum_type, - stab_pointer_type, - stab_function_type, - stab_reference_type, - stab_range_type, - stab_array_type, - stab_set_type, - stab_offset_type, - stab_method_type, - stab_const_type, - stab_volatile_type, - stab_start_struct_type, - stab_struct_field, - stab_end_struct_type, - stab_start_class_type, - stab_class_static_member, - stab_class_baseclass, - stab_class_start_method, - stab_class_method_variant, - stab_class_static_method_variant, - stab_class_end_method, - stab_end_class_type, - stab_typedef_type, - stab_tag_type, - stab_typdef, - stab_tag, - stab_int_constant, - stab_float_constant, - stab_typed_constant, - stab_variable, - stab_start_function, - stab_function_parameter, - stab_start_block, - stab_end_block, - stab_end_function, - stab_lineno -}; - -/* Routine to create an entry in a string hash table. */ - -static struct bfd_hash_entry * -string_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct string_hash_entry *ret = (struct string_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct string_hash_entry *) NULL) - ret = ((struct string_hash_entry *) - bfd_hash_allocate (table, sizeof (struct string_hash_entry))); - if (ret == (struct string_hash_entry *) NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct string_hash_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - - if (ret) - { - /* Initialize the local fields. */ - ret->next = NULL; - ret->index = -1; - ret->size = 0; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Look up an entry in a string hash table. */ - -#define string_hash_lookup(t, string, create, copy) \ - ((struct string_hash_entry *) \ - bfd_hash_lookup (&(t)->table, (string), (create), (copy))) - -/* Add a symbol to the stabs debugging information we are building. */ - -static boolean -stab_write_symbol (info, type, desc, value, string) - struct stab_write_handle *info; - int type; - int desc; - bfd_vma value; - const char *string; -{ - bfd_size_type strx; - bfd_byte sym[STAB_SYMBOL_SIZE]; - - if (string == NULL) - strx = 0; - else - { - struct string_hash_entry *h; - - h = string_hash_lookup (&info->strhash, string, true, true); - if (h == NULL) - { - non_fatal (_("string_hash_lookup failed: %s"), - bfd_errmsg (bfd_get_error ())); - return false; - } - if (h->index != -1) - strx = h->index; - else - { - strx = info->strings_size; - h->index = strx; - if (info->last_string == NULL) - info->strings = h; - else - info->last_string->next = h; - info->last_string = h; - info->strings_size += strlen (string) + 1; - } - } - - /* This presumes 32 bit values. */ - bfd_put_32 (info->abfd, strx, sym); - bfd_put_8 (info->abfd, type, sym + 4); - bfd_put_8 (info->abfd, 0, sym + 5); - bfd_put_16 (info->abfd, desc, sym + 6); - bfd_put_32 (info->abfd, value, sym + 8); - - if (info->symbols_size + STAB_SYMBOL_SIZE > info->symbols_alloc) - { - info->symbols_alloc *= 2; - info->symbols = (bfd_byte *) xrealloc (info->symbols, - info->symbols_alloc); - } - - memcpy (info->symbols + info->symbols_size, sym, STAB_SYMBOL_SIZE); - - info->symbols_size += STAB_SYMBOL_SIZE; - - return true; -} - -/* Push a string on to the type stack. */ - -static boolean -stab_push_string (info, string, index, definition, size) - struct stab_write_handle *info; - const char *string; - long index; - boolean definition; - unsigned int size; -{ - struct stab_type_stack *s; - - s = (struct stab_type_stack *) xmalloc (sizeof *s); - s->string = xstrdup (string); - s->index = index; - s->definition = definition; - s->size = size; - - s->fields = NULL; - s->baseclasses = NULL; - s->methods = NULL; - s->vtable = NULL; - - s->next = info->type_stack; - info->type_stack = s; - - return true; -} - -/* Push a type index which has already been defined. */ - -static boolean -stab_push_defined_type (info, index, size) - struct stab_write_handle *info; - long index; - unsigned int size; -{ - char buf[20]; - - sprintf (buf, "%ld", index); - return stab_push_string (info, buf, index, false, size); -} - -/* Pop a type off the type stack. The caller is responsible for - freeing the string. */ - -static char * -stab_pop_type (info) - struct stab_write_handle *info; -{ - struct stab_type_stack *s; - char *ret; - - s = info->type_stack; - assert (s != NULL); - - info->type_stack = s->next; - - ret = s->string; - - free (s); - - return ret; -} - -/* The general routine to write out stabs in sections debugging - information. This accumulates the stabs symbols and the strings in - two obstacks. We can't easily write out the information as we go - along, because we need to know the section sizes before we can - write out the section contents. ABFD is the BFD and DHANDLE is the - handle for the debugging information. This sets *PSYMS to point to - the symbols, *PSYMSIZE the size of the symbols, *PSTRINGS to the - strings, and *PSTRINGSIZE to the size of the strings. */ - -boolean -write_stabs_in_sections_debugging_info (abfd, dhandle, psyms, psymsize, - pstrings, pstringsize) - bfd *abfd; - PTR dhandle; - bfd_byte **psyms; - bfd_size_type *psymsize; - bfd_byte **pstrings; - bfd_size_type *pstringsize; -{ - struct stab_write_handle info; - struct string_hash_entry *h; - bfd_byte *p; - - info.abfd = abfd; - - info.symbols_size = 0; - info.symbols_alloc = 500; - info.symbols = (bfd_byte *) xmalloc (info.symbols_alloc); - - info.strings = NULL; - info.last_string = NULL; - /* Reserve 1 byte for a null byte. */ - info.strings_size = 1; - - if (! bfd_hash_table_init (&info.strhash.table, string_hash_newfunc) - || ! bfd_hash_table_init (&info.typedef_hash.table, string_hash_newfunc)) - { - non_fatal ("bfd_hash_table_init_failed: %s", - bfd_errmsg (bfd_get_error ())); - return false; - } - - info.type_stack = NULL; - info.type_index = 1; - memset (&info.type_cache, 0, sizeof info.type_cache); - info.so_offset = -1; - info.fun_offset = -1; - info.last_text_address = 0; - info.nesting = 0; - info.fnaddr = 0; - info.pending_lbrac = (bfd_vma) -1; - - /* The initial symbol holds the string size. */ - if (! stab_write_symbol (&info, 0, 0, 0, (const char *) NULL)) - return false; - - /* Output an initial N_SO symbol. */ - info.so_offset = info.symbols_size; - if (! stab_write_symbol (&info, N_SO, 0, 0, bfd_get_filename (abfd))) - return false; - - if (! debug_write (dhandle, &stab_fns, (PTR) &info)) - return false; - - assert (info.pending_lbrac == (bfd_vma) -1); - - /* Output a trailing N_SO. */ - if (! stab_write_symbol (&info, N_SO, 0, info.last_text_address, - (const char *) NULL)) - return false; - - /* Put the string size in the initial symbol. */ - bfd_put_32 (abfd, info.strings_size, info.symbols + 8); - - *psyms = info.symbols; - *psymsize = info.symbols_size; - - *pstringsize = info.strings_size; - *pstrings = (bfd_byte *) xmalloc (info.strings_size); - - p = *pstrings; - *p++ = '\0'; - for (h = info.strings; h != NULL; h = h->next) - { - strcpy ((char *) p, h->root.string); - p += strlen ((char *) p) + 1; - } - - return true; -} - -/* Start writing out information for a compilation unit. */ - -static boolean -stab_start_compilation_unit (p, filename) - PTR p; - const char *filename; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - /* We would normally output an N_SO symbol here. However, that - would force us to reset all of our type information. I think we - will be better off just outputting an N_SOL symbol, and not - worrying about splitting information between files. */ - - info->lineno_filename = filename; - - return stab_write_symbol (info, N_SOL, 0, 0, filename); -} - -/* Start writing out information for a particular source file. */ - -static boolean -stab_start_source (p, filename) - PTR p; - const char *filename; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - /* FIXME: The symbol's value is supposed to be the text section - address. However, we would have to fill it in later, and gdb - doesn't care, so we don't bother with it. */ - - info->lineno_filename = filename; - - return stab_write_symbol (info, N_SOL, 0, 0, filename); -} - -/* Push an empty type. This shouldn't normally happen. We just use a - void type. */ - -static boolean -stab_empty_type (p) - PTR p; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - /* We don't call stab_void_type if the type is not yet defined, - because that might screw up the typedef. */ - - if (info->type_cache.void_type != 0) - return stab_push_defined_type (info, info->type_cache.void_type, 0); - else - { - long index; - char buf[40]; - - index = info->type_index; - ++info->type_index; - - sprintf (buf, "%ld=%ld", index, index); - - return stab_push_string (info, buf, index, false, 0); - } -} - -/* Push a void type. */ - -static boolean -stab_void_type (p) - PTR p; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - if (info->type_cache.void_type != 0) - return stab_push_defined_type (info, info->type_cache.void_type, 0); - else - { - long index; - char buf[40]; - - index = info->type_index; - ++info->type_index; - - info->type_cache.void_type = index; - - sprintf (buf, "%ld=%ld", index, index); - - return stab_push_string (info, buf, index, true, 0); - } -} - -/* Push an integer type. */ - -static boolean -stab_int_type (p, size, unsignedp) - PTR p; - unsigned int size; - boolean unsignedp; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - long *cache; - - if (size <= 0 || (size > sizeof (long) && size != 8)) - { - non_fatal (_("stab_int_type: bad size %u"), size); - return false; - } - - if (unsignedp) - cache = info->type_cache.signed_integer_types; - else - cache = info->type_cache.unsigned_integer_types; - - if (cache[size - 1] != 0) - return stab_push_defined_type (info, cache[size - 1], size); - else - { - long index; - char buf[100]; - - index = info->type_index; - ++info->type_index; - - cache[size - 1] = index; - - sprintf (buf, "%ld=r%ld;", index, index); - if (unsignedp) - { - strcat (buf, "0;"); - if (size < sizeof (long)) - sprintf (buf + strlen (buf), "%ld;", ((long) 1 << (size * 8)) - 1); - else if (size == sizeof (long)) - strcat (buf, "-1;"); - else if (size == 8) - strcat (buf, "01777777777777777777777;"); - else - abort (); - } - else - { - if (size <= sizeof (long)) - sprintf (buf + strlen (buf), "%ld;%ld;", - (long) - ((unsigned long) 1 << (size * 8 - 1)), - (long) (((unsigned long) 1 << (size * 8 - 1)) - 1)); - else if (size == 8) - strcat (buf, "01000000000000000000000;0777777777777777777777;"); - else - abort (); - } - - return stab_push_string (info, buf, index, true, size); - } -} - -/* Push a floating point type. */ - -static boolean -stab_float_type (p, size) - PTR p; - unsigned int size; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - if (size > 0 - && size - 1 < (sizeof info->type_cache.float_types - / sizeof info->type_cache.float_types[0]) - && info->type_cache.float_types[size - 1] != 0) - return stab_push_defined_type (info, - info->type_cache.float_types[size - 1], - size); - else - { - long index; - char *int_type; - char buf[50]; - - /* Floats are defined as a subrange of int. */ - if (! stab_int_type (info, 4, false)) - return false; - int_type = stab_pop_type (info); - - index = info->type_index; - ++info->type_index; - - if (size > 0 - && size - 1 < (sizeof info->type_cache.float_types - / sizeof info->type_cache.float_types[0])) - info->type_cache.float_types[size - 1] = index; - - sprintf (buf, "%ld=r%s;%u;0;", index, int_type, size); - - free (int_type); - - return stab_push_string (info, buf, index, true, size); - } -} - -/* Push a complex type. */ - -static boolean -stab_complex_type (p, size) - PTR p; - unsigned int size; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - char buf[50]; - long index; - - index = info->type_index; - ++info->type_index; - - sprintf (buf, "%ld=r%ld;%u;0;", index, index, size); - - return stab_push_string (info, buf, index, true, size * 2); -} - -/* Push a boolean type. We use an XCOFF predefined type, since gdb - always recognizes them. */ - -static boolean -stab_bool_type (p, size) - PTR p; - unsigned int size; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - long index; - - switch (size) - { - case 1: - index = -21; - break; - - case 2: - index = -22; - break; - - default: - case 4: - index = -16; - break; - - case 8: - index = -33; - break; - } - - return stab_push_defined_type (info, index, size); -} - -/* Push an enum type. */ - -static boolean -stab_enum_type (p, tag, names, vals) - PTR p; - const char *tag; - const char **names; - bfd_signed_vma *vals; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - size_t len; - const char **pn; - char *buf; - long index = 0; - bfd_signed_vma *pv; - - if (names == NULL) - { - assert (tag != NULL); - - buf = (char *) xmalloc (10 + strlen (tag)); - sprintf (buf, "xe%s:", tag); - /* FIXME: The size is just a guess. */ - if (! stab_push_string (info, buf, 0, false, 4)) - return false; - free (buf); - return true; - } - - len = 10; - if (tag != NULL) - len += strlen (tag); - for (pn = names; *pn != NULL; pn++) - len += strlen (*pn) + 20; - - buf = (char *) xmalloc (len); - - if (tag == NULL) - strcpy (buf, "e"); - else - { - index = info->type_index; - ++info->type_index; - sprintf (buf, "%s:T%ld=e", tag, index); - } - - for (pn = names, pv = vals; *pn != NULL; pn++, pv++) - sprintf (buf + strlen (buf), "%s:%ld,", *pn, (long) *pv); - strcat (buf, ";"); - - if (tag == NULL) - { - /* FIXME: The size is just a guess. */ - if (! stab_push_string (info, buf, 0, false, 4)) - return false; - } - else - { - /* FIXME: The size is just a guess. */ - if (! stab_write_symbol (info, N_LSYM, 0, 0, buf) - || ! stab_push_defined_type (info, index, 4)) - return false; - } - - free (buf); - - return true; -} - -/* Push a modification of the top type on the stack. Cache the - results in CACHE and CACHE_ALLOC. */ - -static boolean -stab_modify_type (info, mod, size, cache, cache_alloc) - struct stab_write_handle *info; - int mod; - unsigned int size; - long **cache; - size_t *cache_alloc; -{ - long targindex; - long index; - char *s, *buf; - - assert (info->type_stack != NULL); - targindex = info->type_stack->index; - - if (targindex <= 0 - || cache == NULL) - { - boolean definition; - - /* Either the target type has no index, or we aren't caching - this modifier. Either way we have no way of recording the - new type, so we don't bother to define one. */ - definition = info->type_stack->definition; - s = stab_pop_type (info); - buf = (char *) xmalloc (strlen (s) + 2); - sprintf (buf, "%c%s", mod, s); - free (s); - if (! stab_push_string (info, buf, 0, definition, size)) - return false; - free (buf); - } - else - { - if ((size_t) targindex >= *cache_alloc) - { - size_t alloc; - - alloc = *cache_alloc; - if (alloc == 0) - alloc = 10; - while ((size_t) targindex >= alloc) - alloc *= 2; - *cache = (long *) xrealloc (*cache, alloc * sizeof (long)); - memset (*cache + *cache_alloc, 0, - (alloc - *cache_alloc) * sizeof (long)); - *cache_alloc = alloc; - } - - index = (*cache)[targindex]; - if (index != 0 && ! info->type_stack->definition) - { - /* We have already defined a modification of this type, and - the entry on the type stack is not a definition, so we - can safely discard it (we may have a definition on the - stack, even if we already defined a modification, if it - is a struct which we did not define at the time it was - referenced). */ - free (stab_pop_type (info)); - if (! stab_push_defined_type (info, index, size)) - return false; - } - else - { - index = info->type_index; - ++info->type_index; - - s = stab_pop_type (info); - buf = (char *) xmalloc (strlen (s) + 20); - sprintf (buf, "%ld=%c%s", index, mod, s); - free (s); - - (*cache)[targindex] = index; - - if (! stab_push_string (info, buf, index, true, size)) - return false; - - free (buf); - } - } - - return true; -} - -/* Push a pointer type. */ - -static boolean -stab_pointer_type (p) - PTR p; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - /* FIXME: The size should depend upon the architecture. */ - return stab_modify_type (info, '*', 4, &info->type_cache.pointer_types, - &info->type_cache.pointer_types_alloc); -} - -/* Push a function type. */ - -static boolean -stab_function_type (p, argcount, varargs) - PTR p; - int argcount; - boolean varargs ATTRIBUTE_UNUSED; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - int i; - - /* We have no way to represent the argument types, so we just - discard them. However, if they define new types, we must output - them. We do this by producing empty typedefs. */ - for (i = 0; i < argcount; i++) - { - if (! info->type_stack->definition) - free (stab_pop_type (info)); - else - { - char *s, *buf; - - s = stab_pop_type (info); - - buf = (char *) xmalloc (strlen (s) + 3); - sprintf (buf, ":t%s", s); - free (s); - - if (! stab_write_symbol (info, N_LSYM, 0, 0, buf)) - return false; - - free (buf); - } - } - - return stab_modify_type (info, 'f', 0, &info->type_cache.function_types, - &info->type_cache.function_types_alloc); -} - -/* Push a reference type. */ - -static boolean -stab_reference_type (p) - PTR p; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - /* FIXME: The size should depend upon the architecture. */ - return stab_modify_type (info, '&', 4, &info->type_cache.reference_types, - &info->type_cache.reference_types_alloc); -} - -/* Push a range type. */ - -static boolean -stab_range_type (p, low, high) - PTR p; - bfd_signed_vma low; - bfd_signed_vma high; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - boolean definition; - unsigned int size; - char *s, *buf; - - definition = info->type_stack->definition; - size = info->type_stack->size; - - s = stab_pop_type (info); - buf = (char *) xmalloc (strlen (s) + 100); - sprintf (buf, "r%s;%ld;%ld;", s, (long) low, (long) high); - free (s); - - if (! stab_push_string (info, buf, 0, definition, size)) - return false; - - free (buf); - - return true; -} - -/* Push an array type. */ - -static boolean -stab_array_type (p, low, high, stringp) - PTR p; - bfd_signed_vma low; - bfd_signed_vma high; - boolean stringp; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - boolean definition; - unsigned int element_size; - char *range, *element, *buf; - long index; - unsigned int size; - - definition = info->type_stack->definition; - range = stab_pop_type (info); - - definition = definition || info->type_stack->definition; - element_size = info->type_stack->size; - element = stab_pop_type (info); - - buf = (char *) xmalloc (strlen (range) + strlen (element) + 100); - - if (! stringp) - { - index = 0; - *buf = '\0'; - } - else - { - /* We need to define a type in order to include the string - attribute. */ - index = info->type_index; - ++info->type_index; - definition = true; - sprintf (buf, "%ld=@S;", index); - } - - sprintf (buf + strlen (buf), "ar%s;%ld;%ld;%s", - range, (long) low, (long) high, element); - free (range); - free (element); - - if (high < low) - size = 0; - else - size = element_size * ((high - low) + 1); - if (! stab_push_string (info, buf, index, definition, size)) - return false; - - free (buf); - - return true; -} - -/* Push a set type. */ - -static boolean -stab_set_type (p, bitstringp) - PTR p; - boolean bitstringp; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - boolean definition; - char *s, *buf; - long index; - - definition = info->type_stack->definition; - - s = stab_pop_type (info); - buf = (char *) xmalloc (strlen (s) + 30); - - if (! bitstringp) - { - *buf = '\0'; - index = 0; - } - else - { - /* We need to define a type in order to include the string - attribute. */ - index = info->type_index; - ++info->type_index; - definition = true; - sprintf (buf, "%ld=@S;", index); - } - - sprintf (buf + strlen (buf), "S%s", s); - free (s); - - if (! stab_push_string (info, buf, index, definition, 0)) - return false; - - free (buf); - - return true; -} - -/* Push an offset type. */ - -static boolean -stab_offset_type (p) - PTR p; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - boolean definition; - char *target, *base, *buf; - - definition = info->type_stack->definition; - target = stab_pop_type (info); - - definition = definition || info->type_stack->definition; - base = stab_pop_type (info); - - buf = (char *) xmalloc (strlen (target) + strlen (base) + 3); - sprintf (buf, "@%s,%s", base, target); - free (base); - free (target); - - if (! stab_push_string (info, buf, 0, definition, 0)) - return false; - - free (buf); - - return true; -} - -/* Push a method type. */ - -static boolean -stab_method_type (p, domainp, argcount, varargs) - PTR p; - boolean domainp; - int argcount; - boolean varargs; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - boolean definition; - char *domain, *return_type, *buf; - char **args; - int i; - size_t len; - - /* We don't bother with stub method types, because that would - require a mangler for C++ argument types. This will waste space - in the debugging output. */ - - /* We need a domain. I'm not sure DOMAINP can ever be false, - anyhow. */ - if (! domainp) - { - if (! stab_empty_type (p)) - return false; - } - - definition = info->type_stack->definition; - domain = stab_pop_type (info); - - /* A non-varargs function is indicated by making the last parameter - type be void. */ - - if (argcount < 0) - { - args = NULL; - argcount = 0; - } - else if (argcount == 0) - { - if (varargs) - args = NULL; - else - { - args = (char **) xmalloc (1 * sizeof (*args)); - if (! stab_empty_type (p)) - return false; - definition = definition || info->type_stack->definition; - args[0] = stab_pop_type (info); - argcount = 1; - } - } - else - { - args = (char **) xmalloc ((argcount + 1) * sizeof (*args)); - for (i = argcount - 1; i >= 0; i--) - { - definition = definition || info->type_stack->definition; - args[i] = stab_pop_type (info); - } - if (! varargs) - { - if (! stab_empty_type (p)) - return false; - definition = definition || info->type_stack->definition; - args[argcount] = stab_pop_type (info); - ++argcount; - } - } - - definition = definition || info->type_stack->definition; - return_type = stab_pop_type (info); - - len = strlen (domain) + strlen (return_type) + 10; - for (i = 0; i < argcount; i++) - len += strlen (args[i]); - - buf = (char *) xmalloc (len); - - sprintf (buf, "#%s,%s", domain, return_type); - free (domain); - free (return_type); - for (i = 0; i < argcount; i++) - { - strcat (buf, ","); - strcat (buf, args[i]); - free (args[i]); - } - strcat (buf, ";"); - - if (args != NULL) - free (args); - - if (! stab_push_string (info, buf, 0, definition, 0)) - return false; - - free (buf); - - return true; -} - -/* Push a const version of a type. */ - -static boolean -stab_const_type (p) - PTR p; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - return stab_modify_type (info, 'k', info->type_stack->size, - (long **) NULL, (size_t *) NULL); -} - -/* Push a volatile version of a type. */ - -static boolean -stab_volatile_type (p) - PTR p; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - return stab_modify_type (info, 'B', info->type_stack->size, - (long **) NULL, (size_t *) NULL); -} - -/* Get the type index to use for a struct/union/class ID. This should - return -1 if it fails. */ - -static long -stab_get_struct_index (info, tag, id, kind, psize) - struct stab_write_handle *info; - const char *tag; - unsigned int id; - enum debug_type_kind kind; - unsigned int *psize; -{ - if (id >= info->type_cache.struct_types_alloc) - { - size_t alloc; - - alloc = info->type_cache.struct_types_alloc; - if (alloc == 0) - alloc = 10; - while (id >= alloc) - alloc *= 2; - info->type_cache.struct_types = - (struct stab_tag *) xrealloc (info->type_cache.struct_types, - alloc * sizeof (struct stab_tag)); - memset ((info->type_cache.struct_types - + info->type_cache.struct_types_alloc), - 0, - ((alloc - info->type_cache.struct_types_alloc) - * sizeof (struct stab_tag))); - info->type_cache.struct_types_alloc = alloc; - } - - if (info->type_cache.struct_types[id].index == 0) - { - info->type_cache.struct_types[id].index = info->type_index; - ++info->type_index; - info->type_cache.struct_types[id].tag = tag; - info->type_cache.struct_types[id].kind = kind; - } - - if (kind == DEBUG_KIND_ILLEGAL) - { - /* This is a definition of the struct. */ - info->type_cache.struct_types[id].kind = kind; - info->type_cache.struct_types[id].size = *psize; - } - else - *psize = info->type_cache.struct_types[id].size; - - return info->type_cache.struct_types[id].index; -} - -/* Start outputting a struct. We ignore the tag, and handle it in - stab_tag. */ - -/*ARGSUSED*/ -static boolean -stab_start_struct_type (p, tag, id, structp, size) - PTR p; - const char *tag; - unsigned int id; - boolean structp; - unsigned int size; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - long index; - boolean definition; - char *buf; - - buf = (char *) xmalloc (40); - - if (id == 0) - { - index = 0; - *buf = '\0'; - definition = false; - } - else - { - index = stab_get_struct_index (info, tag, id, DEBUG_KIND_ILLEGAL, - &size); - if (index < 0) - return false; - sprintf (buf, "%ld=", index); - definition = true; - } - - sprintf (buf + strlen (buf), "%c%u", - structp ? 's' : 'u', - size); - - if (! stab_push_string (info, buf, index, definition, size)) - return false; - - info->type_stack->fields = (char *) xmalloc (1); - info->type_stack->fields[0] = '\0'; - - return true; -} - -/* Add a field to a struct. */ - -static boolean -stab_struct_field (p, name, bitpos, bitsize, visibility) - PTR p; - const char *name; - bfd_vma bitpos; - bfd_vma bitsize; - enum debug_visibility visibility; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - boolean definition; - unsigned int size; - char *s, *n; - const char *vis; - - definition = info->type_stack->definition; - size = info->type_stack->size; - s = stab_pop_type (info); - - /* Add this field to the end of the current struct fields, which is - currently on the top of the stack. */ - - assert (info->type_stack->fields != NULL); - n = (char *) xmalloc (strlen (info->type_stack->fields) - + strlen (name) - + strlen (s) - + 50); - - switch (visibility) - { - default: - abort (); - - case DEBUG_VISIBILITY_PUBLIC: - vis = ""; - break; - - case DEBUG_VISIBILITY_PRIVATE: - vis = "/0"; - break; - - case DEBUG_VISIBILITY_PROTECTED: - vis = "/1"; - break; - } - - if (bitsize == 0) - { - bitsize = size * 8; - if (bitsize == 0) - non_fatal (_("%s: warning: unknown size for field `%s' in struct"), - bfd_get_filename (info->abfd), name); - } - - sprintf (n, "%s%s:%s%s,%ld,%ld;", info->type_stack->fields, name, vis, s, - (long) bitpos, (long) bitsize); - - free (info->type_stack->fields); - info->type_stack->fields = n; - - if (definition) - info->type_stack->definition = true; - - return true; -} - -/* Finish up a struct. */ - -static boolean -stab_end_struct_type (p) - PTR p; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - boolean definition; - long index; - unsigned int size; - char *fields, *first, *buf; - - assert (info->type_stack != NULL && info->type_stack->fields != NULL); - - definition = info->type_stack->definition; - index = info->type_stack->index; - size = info->type_stack->size; - fields = info->type_stack->fields; - first = stab_pop_type (info); - - buf = (char *) xmalloc (strlen (first) + strlen (fields) + 2); - sprintf (buf, "%s%s;", first, fields); - free (first); - free (fields); - - if (! stab_push_string (info, buf, index, definition, size)) - return false; - - free (buf); - - return true; -} - -/* Start outputting a class. */ - -static boolean -stab_start_class_type (p, tag, id, structp, size, vptr, ownvptr) - PTR p; - const char *tag; - unsigned int id; - boolean structp; - unsigned int size; - boolean vptr; - boolean ownvptr; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - boolean definition; - char *vstring; - - if (! vptr || ownvptr) - { - definition = false; - vstring = NULL; - } - else - { - definition = info->type_stack->definition; - vstring = stab_pop_type (info); - } - - if (! stab_start_struct_type (p, tag, id, structp, size)) - return false; - - if (vptr) - { - char *vtable; - - if (ownvptr) - { - assert (info->type_stack->index > 0); - vtable = (char *) xmalloc (20); - sprintf (vtable, "~%%%ld", info->type_stack->index); - } - else - { - vtable = (char *) xmalloc (strlen (vstring) + 3); - sprintf (vtable, "~%%%s", vstring); - free (vstring); - } - - info->type_stack->vtable = vtable; - } - - if (definition) - info->type_stack->definition = true; - - return true; -} - -/* Add a static member to the class on the type stack. */ - -static boolean -stab_class_static_member (p, name, physname, visibility) - PTR p; - const char *name; - const char *physname; - enum debug_visibility visibility; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - boolean definition; - char *s, *n; - const char *vis; - - definition = info->type_stack->definition; - s = stab_pop_type (info); - - /* Add this field to the end of the current struct fields, which is - currently on the top of the stack. */ - - assert (info->type_stack->fields != NULL); - n = (char *) xmalloc (strlen (info->type_stack->fields) - + strlen (name) - + strlen (s) - + strlen (physname) - + 10); - - switch (visibility) - { - default: - abort (); - - case DEBUG_VISIBILITY_PUBLIC: - vis = ""; - break; - - case DEBUG_VISIBILITY_PRIVATE: - vis = "/0"; - break; - - case DEBUG_VISIBILITY_PROTECTED: - vis = "/1"; - break; - } - - sprintf (n, "%s%s:%s%s:%s;", info->type_stack->fields, name, vis, s, - physname); - - free (info->type_stack->fields); - info->type_stack->fields = n; - - if (definition) - info->type_stack->definition = true; - - return true; -} - -/* Add a base class to the class on the type stack. */ - -static boolean -stab_class_baseclass (p, bitpos, virtual, visibility) - PTR p; - bfd_vma bitpos; - boolean virtual; - enum debug_visibility visibility; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - boolean definition; - char *s; - char *buf; - unsigned int c; - char **baseclasses; - - definition = info->type_stack->definition; - s = stab_pop_type (info); - - /* Build the base class specifier. */ - - buf = (char *) xmalloc (strlen (s) + 25); - buf[0] = virtual ? '1' : '0'; - switch (visibility) - { - default: - abort (); - - case DEBUG_VISIBILITY_PRIVATE: - buf[1] = '0'; - break; - - case DEBUG_VISIBILITY_PROTECTED: - buf[1] = '1'; - break; - - case DEBUG_VISIBILITY_PUBLIC: - buf[1] = '2'; - break; - } - - sprintf (buf + 2, "%ld,%s;", (long) bitpos, s); - free (s); - - /* Add the new baseclass to the existing ones. */ - - assert (info->type_stack != NULL && info->type_stack->fields != NULL); - - if (info->type_stack->baseclasses == NULL) - c = 0; - else - { - c = 0; - while (info->type_stack->baseclasses[c] != NULL) - ++c; - } - - baseclasses = (char **) xrealloc (info->type_stack->baseclasses, - (c + 2) * sizeof (*baseclasses)); - baseclasses[c] = buf; - baseclasses[c + 1] = NULL; - - info->type_stack->baseclasses = baseclasses; - - if (definition) - info->type_stack->definition = true; - - return true; -} - -/* Start adding a method to the class on the type stack. */ - -static boolean -stab_class_start_method (p, name) - PTR p; - const char *name; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - char *m; - - assert (info->type_stack != NULL && info->type_stack->fields != NULL); - - if (info->type_stack->methods == NULL) - { - m = (char *) xmalloc (strlen (name) + 3); - *m = '\0'; - } - else - { - m = (char *) xrealloc (info->type_stack->methods, - (strlen (info->type_stack->methods) - + strlen (name) - + 4)); - } - - sprintf (m + strlen (m), "%s::", name); - - info->type_stack->methods = m; - - return true; -} - -/* Add a variant, either static or not, to the current method. */ - -static boolean -stab_class_method_var (info, physname, visibility, staticp, constp, volatilep, - voffset, contextp) - struct stab_write_handle *info; - const char *physname; - enum debug_visibility visibility; - boolean staticp; - boolean constp; - boolean volatilep; - bfd_vma voffset; - boolean contextp; -{ - boolean definition; - char *type; - char *context = NULL; - char visc, qualc, typec; - - definition = info->type_stack->definition; - type = stab_pop_type (info); - - if (contextp) - { - definition = definition || info->type_stack->definition; - context = stab_pop_type (info); - } - - assert (info->type_stack != NULL && info->type_stack->methods != NULL); - - switch (visibility) - { - default: - abort (); - - case DEBUG_VISIBILITY_PRIVATE: - visc = '0'; - break; - - case DEBUG_VISIBILITY_PROTECTED: - visc = '1'; - break; - - case DEBUG_VISIBILITY_PUBLIC: - visc = '2'; - break; - } - - if (constp) - { - if (volatilep) - qualc = 'D'; - else - qualc = 'B'; - } - else - { - if (volatilep) - qualc = 'C'; - else - qualc = 'A'; - } - - if (staticp) - typec = '?'; - else if (! contextp) - typec = '.'; - else - typec = '*'; - - info->type_stack->methods = - (char *) xrealloc (info->type_stack->methods, - (strlen (info->type_stack->methods) - + strlen (type) - + strlen (physname) - + (contextp ? strlen (context) : 0) - + 40)); - - sprintf (info->type_stack->methods + strlen (info->type_stack->methods), - "%s:%s;%c%c%c", type, physname, visc, qualc, typec); - free (type); - - if (contextp) - { - sprintf (info->type_stack->methods + strlen (info->type_stack->methods), - "%ld;%s;", (long) voffset, context); - free (context); - } - - if (definition) - info->type_stack->definition = true; - - return true; -} - -/* Add a variant to the current method. */ - -static boolean -stab_class_method_variant (p, physname, visibility, constp, volatilep, - voffset, contextp) - PTR p; - const char *physname; - enum debug_visibility visibility; - boolean constp; - boolean volatilep; - bfd_vma voffset; - boolean contextp; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - return stab_class_method_var (info, physname, visibility, false, constp, - volatilep, voffset, contextp); -} - -/* Add a static variant to the current method. */ - -static boolean -stab_class_static_method_variant (p, physname, visibility, constp, volatilep) - PTR p; - const char *physname; - enum debug_visibility visibility; - boolean constp; - boolean volatilep; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - return stab_class_method_var (info, physname, visibility, true, constp, - volatilep, 0, false); -} - -/* Finish up a method. */ - -static boolean -stab_class_end_method (p) - PTR p; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - assert (info->type_stack != NULL && info->type_stack->methods != NULL); - - /* We allocated enough room on info->type_stack->methods to add the - trailing semicolon. */ - strcat (info->type_stack->methods, ";"); - - return true; -} - -/* Finish up a class. */ - -static boolean -stab_end_class_type (p) - PTR p; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - size_t len; - unsigned int i = 0; - char *buf; - - assert (info->type_stack != NULL && info->type_stack->fields != NULL); - - /* Work out the size we need to allocate for the class definition. */ - - len = (strlen (info->type_stack->string) - + strlen (info->type_stack->fields) - + 10); - if (info->type_stack->baseclasses != NULL) - { - len += 20; - for (i = 0; info->type_stack->baseclasses[i] != NULL; i++) - len += strlen (info->type_stack->baseclasses[i]); - } - if (info->type_stack->methods != NULL) - len += strlen (info->type_stack->methods); - if (info->type_stack->vtable != NULL) - len += strlen (info->type_stack->vtable); - - /* Build the class definition. */ - - buf = (char *) xmalloc (len); - - strcpy (buf, info->type_stack->string); - - if (info->type_stack->baseclasses != NULL) - { - sprintf (buf + strlen (buf), "!%u,", i); - for (i = 0; info->type_stack->baseclasses[i] != NULL; i++) - { - strcat (buf, info->type_stack->baseclasses[i]); - free (info->type_stack->baseclasses[i]); - } - free (info->type_stack->baseclasses); - info->type_stack->baseclasses = NULL; - } - - strcat (buf, info->type_stack->fields); - free (info->type_stack->fields); - info->type_stack->fields = NULL; - - if (info->type_stack->methods != NULL) - { - strcat (buf, info->type_stack->methods); - free (info->type_stack->methods); - info->type_stack->methods = NULL; - } - - strcat (buf, ";"); - - if (info->type_stack->vtable != NULL) - { - strcat (buf, info->type_stack->vtable); - free (info->type_stack->vtable); - info->type_stack->vtable = NULL; - } - - /* Replace the string on the top of the stack with the complete - class definition. */ - free (info->type_stack->string); - info->type_stack->string = buf; - - return true; -} - -/* Push a typedef which was previously defined. */ - -static boolean -stab_typedef_type (p, name) - PTR p; - const char *name; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - struct string_hash_entry *h; - - h = string_hash_lookup (&info->typedef_hash, name, false, false); - assert (h != NULL && h->index > 0); - - return stab_push_defined_type (info, h->index, h->size); -} - -/* Push a struct, union or class tag. */ - -static boolean -stab_tag_type (p, name, id, kind) - PTR p; - const char *name; - unsigned int id; - enum debug_type_kind kind; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - long index; - unsigned int size; - - index = stab_get_struct_index (info, name, id, kind, &size); - if (index < 0) - return false; - - return stab_push_defined_type (info, index, size); -} - -/* Define a typedef. */ - -static boolean -stab_typdef (p, name) - PTR p; - const char *name; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - long index; - unsigned int size; - char *s, *buf; - struct string_hash_entry *h; - - index = info->type_stack->index; - size = info->type_stack->size; - s = stab_pop_type (info); - - buf = (char *) xmalloc (strlen (name) + strlen (s) + 20); - - if (index > 0) - sprintf (buf, "%s:t%s", name, s); - else - { - index = info->type_index; - ++info->type_index; - sprintf (buf, "%s:t%ld=%s", name, index, s); - } - - free (s); - - if (! stab_write_symbol (info, N_LSYM, 0, 0, buf)) - return false; - - free (buf); - - h = string_hash_lookup (&info->typedef_hash, name, true, false); - if (h == NULL) - { - non_fatal (_("string_hash_lookup failed: %s"), - bfd_errmsg (bfd_get_error ())); - return false; - } - - /* I don't think we care about redefinitions. */ - - h->index = index; - h->size = size; - - return true; -} - -/* Define a tag. */ - -static boolean -stab_tag (p, tag) - PTR p; - const char *tag; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - char *s, *buf; - - s = stab_pop_type (info); - - buf = (char *) xmalloc (strlen (tag) + strlen (s) + 3); - - sprintf (buf, "%s:T%s", tag, s); - free (s); - - if (! stab_write_symbol (info, N_LSYM, 0, 0, buf)) - return false; - - free (buf); - - return true; -} - -/* Define an integer constant. */ - -static boolean -stab_int_constant (p, name, val) - PTR p; - const char *name; - bfd_vma val; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - char *buf; - - buf = (char *) xmalloc (strlen (name) + 20); - sprintf (buf, "%s:c=i%ld", name, (long) val); - - if (! stab_write_symbol (info, N_LSYM, 0, 0, buf)) - return false; - - free (buf); - - return true; -} - -/* Define a floating point constant. */ - -static boolean -stab_float_constant (p, name, val) - PTR p; - const char *name; - double val; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - char *buf; - - buf = (char *) xmalloc (strlen (name) + 20); - sprintf (buf, "%s:c=f%g", name, val); - - if (! stab_write_symbol (info, N_LSYM, 0, 0, buf)) - return false; - - free (buf); - - return true; -} - -/* Define a typed constant. */ - -static boolean -stab_typed_constant (p, name, val) - PTR p; - const char *name; - bfd_vma val; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - char *s, *buf; - - s = stab_pop_type (info); - - buf = (char *) xmalloc (strlen (name) + strlen (s) + 20); - sprintf (buf, "%s:c=e%s,%ld", name, s, (long) val); - free (s); - - if (! stab_write_symbol (info, N_LSYM, 0, 0, buf)) - return false; - - free (buf); - - return true; -} - -/* Record a variable. */ - -static boolean -stab_variable (p, name, kind, val) - PTR p; - const char *name; - enum debug_var_kind kind; - bfd_vma val; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - char *s, *buf; - int stab_type; - const char *kindstr; - - s = stab_pop_type (info); - - switch (kind) - { - default: - abort (); - - case DEBUG_GLOBAL: - stab_type = N_GSYM; - kindstr = "G"; - break; - - case DEBUG_STATIC: - stab_type = N_STSYM; - kindstr = "S"; - break; - - case DEBUG_LOCAL_STATIC: - stab_type = N_STSYM; - kindstr = "V"; - break; - - case DEBUG_LOCAL: - stab_type = N_LSYM; - kindstr = ""; - - /* Make sure that this is a type reference or definition. */ - if (! isdigit ((unsigned char) *s)) - { - char *n; - long index; - - index = info->type_index; - ++info->type_index; - n = (char *) xmalloc (strlen (s) + 20); - sprintf (n, "%ld=%s", index, s); - free (s); - s = n; - } - break; - - case DEBUG_REGISTER: - stab_type = N_RSYM; - kindstr = "r"; - break; - } - - buf = (char *) xmalloc (strlen (name) + strlen (s) + 3); - sprintf (buf, "%s:%s%s", name, kindstr, s); - free (s); - - if (! stab_write_symbol (info, stab_type, 0, val, buf)) - return false; - - free (buf); - - return true; -} - -/* Start outputting a function. */ - -static boolean -stab_start_function (p, name, globalp) - PTR p; - const char *name; - boolean globalp; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - char *rettype, *buf; - - assert (info->nesting == 0 && info->fun_offset == -1); - - rettype = stab_pop_type (info); - - buf = (char *) xmalloc (strlen (name) + strlen (rettype) + 3); - sprintf (buf, "%s:%c%s", name, - globalp ? 'F' : 'f', - rettype); - - /* We don't know the value now, so we set it in start_block. */ - info->fun_offset = info->symbols_size; - - if (! stab_write_symbol (info, N_FUN, 0, 0, buf)) - return false; - - free (buf); - - return true; -} - -/* Output a function parameter. */ - -static boolean -stab_function_parameter (p, name, kind, val) - PTR p; - const char *name; - enum debug_parm_kind kind; - bfd_vma val; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - char *s, *buf; - int stab_type; - char kindc; - - s = stab_pop_type (info); - - switch (kind) - { - default: - abort (); - - case DEBUG_PARM_STACK: - stab_type = N_PSYM; - kindc = 'p'; - break; - - case DEBUG_PARM_REG: - stab_type = N_RSYM; - kindc = 'P'; - break; - - case DEBUG_PARM_REFERENCE: - stab_type = N_PSYM; - kindc = 'v'; - break; - - case DEBUG_PARM_REF_REG: - stab_type = N_RSYM; - kindc = 'a'; - break; - } - - buf = (char *) xmalloc (strlen (name) + strlen (s) + 3); - sprintf (buf, "%s:%c%s", name, kindc, s); - free (s); - - if (! stab_write_symbol (info, stab_type, 0, val, buf)) - return false; - - free (buf); - - return true; -} - -/* Start a block. */ - -static boolean -stab_start_block (p, addr) - PTR p; - bfd_vma addr; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - /* Fill in any slots which have been waiting for the first known - text address. */ - - if (info->so_offset != -1) - { - bfd_put_32 (info->abfd, addr, info->symbols + info->so_offset + 8); - info->so_offset = -1; - } - - if (info->fun_offset != -1) - { - bfd_put_32 (info->abfd, addr, info->symbols + info->fun_offset + 8); - info->fun_offset = -1; - } - - ++info->nesting; - - /* We will be called with a top level block surrounding the - function, but stabs information does not output that block, so we - ignore it. */ - - if (info->nesting == 1) - { - info->fnaddr = addr; - return true; - } - - /* We have to output the LBRAC symbol after any variables which are - declared inside the block. We postpone the LBRAC until the next - start_block or end_block. */ - - /* If we have postponed an LBRAC, output it now. */ - if (info->pending_lbrac != (bfd_vma) -1) - { - if (! stab_write_symbol (info, N_LBRAC, 0, info->pending_lbrac, - (const char *) NULL)) - return false; - } - - /* Remember the address and output it later. */ - - info->pending_lbrac = addr - info->fnaddr; - - return true; -} - -/* End a block. */ - -static boolean -stab_end_block (p, addr) - PTR p; - bfd_vma addr; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - if (addr > info->last_text_address) - info->last_text_address = addr; - - /* If we have postponed an LBRAC, output it now. */ - if (info->pending_lbrac != (bfd_vma) -1) - { - if (! stab_write_symbol (info, N_LBRAC, 0, info->pending_lbrac, - (const char *) NULL)) - return false; - info->pending_lbrac = (bfd_vma) -1; - } - - assert (info->nesting > 0); - - --info->nesting; - - /* We ignore the outermost block. */ - if (info->nesting == 0) - return true; - - return stab_write_symbol (info, N_RBRAC, 0, addr - info->fnaddr, - (const char *) NULL); -} - -/* End a function. */ - -/*ARGSUSED*/ -static boolean -stab_end_function (p) - PTR p ATTRIBUTE_UNUSED; -{ - return true; -} - -/* Output a line number. */ - -static boolean -stab_lineno (p, file, lineno, addr) - PTR p; - const char *file; - unsigned long lineno; - bfd_vma addr; -{ - struct stab_write_handle *info = (struct stab_write_handle *) p; - - assert (info->lineno_filename != NULL); - - if (addr > info->last_text_address) - info->last_text_address = addr; - - if (strcmp (file, info->lineno_filename) != 0) - { - if (! stab_write_symbol (info, N_SOL, 0, addr, file)) - return false; - info->lineno_filename = file; - } - - return stab_write_symbol (info, N_SLINE, lineno, addr - info->fnaddr, - (const char *) NULL); -} diff --git a/gas/CONTRIBUTORS b/gas/CONTRIBUTORS deleted file mode 100644 index b3fd03eb1bc..00000000000 --- a/gas/CONTRIBUTORS +++ /dev/null @@ -1,111 +0,0 @@ -(This file is under construction.) -*- text -*- - -If you've contributed to gas and your name isn't listed here, it is -not meant as a slight. I just don't know about it. Email me, -raeburn@cygnus.com and I'll correct the situation. - -This file will eventually be deleted: The general info will go into -the documentation, and info on specific files will go into an AUTHORS -file, as requested by the FSF. - -++++++++++++++++ - -Dean Elsner wrote the original gas for vax. [more details?] - -Jay Fenlason maintained gas for a while, adding support for -gdb-specific debug information and the 68k series machines, most of -the preprocessing pass, and extensive changes in messages.c, -input-file.c, write.c. - -K. Richard Pixley maintained gas for a while, adding various -enhancements and many bug fixes, including merging support for several -processors, breaking gas up to handle multiple object file format -backends (including heavy rewrite, testing, an integration of the coff -and b.out backends), adding configuration including heavy testing and -verification of cross assemblers and file splits and renaming, -converted gas to strictly ansi C including full prototypes, added -support for m680[34]0 & cpu32, considerable work on i960 including a -coff port (including considerable amounts of reverse engineering), a -sparc opcode file rewrite, decstation, rs6000, and hp300hpux host -ports, updated "know" assertions and made them work, much other -reorganization, cleanup, and lint. - -Ken Raeburn currently maintains gas, and wrote the high-level BFD -interface code to replace most of the code in format-specific I/O -modules. - -The original Vax-VMS support was contributed by David L. Kashtan. -Eric Youngdale and Pat Rankin have done much work with it since. - -The Intel 80386 machine description was written by Eliot Dresselhaus. - -Minh Tran-Le at IntelliCorp contributed some AIX 386 support. - -The Motorola 88k machine description was contributed by Devon Bowen of -Buffalo University and Torbjorn Granlund of the Swedish Institute of -Computer Science. - -Keith Knowles at the Open Software Foundation wrote the original MIPS -back end (tc-mips.c, tc-mips.h), and contributed Rose format support -that hasn't been merged in yet. Ralph Campbell worked with the MIPS -code to support a.out format. - -Support for the Zilog Z8k and Hitachi H8/300, H8/500 and SH processors -(tc-z8k, tc-h8300, tc-h8500, tc-sh), and IEEE 695 object file format -(obj-ieee), was written by Steve Chamberlain of Cygnus Solutions. -Steve also modified the COFF back end (obj-coffbfd) to use BFD for -some low-level operations, for use with the Hitachi, 29k and Zilog -targets. - -John Gilmore built the AMD 29000 support, added .include support, and -simplified the configuration of which versions accept which -pseudo-ops. He updated the 68k machine description so that Motorola's -opcodes always produced fixed-size instructions (e.g. jsr), while -synthetic instructions remained shrinkable (jbsr). John fixed many -bugs, including true tested cross-compilation support, and one bug in -relaxation that took a week and required the proverbial one-bit fix. - -Ian Lance Taylor of Cygnus Solutions merged the Motorola and MIT -syntaxes for the 68k, completed support for some COFF targets (68k, -i386 SVR3, and SCO Unix), wrote the ECOFF support based on Michael -Meissner's mips-tfile program, wrote the PowerPC and RS/6000 support, -and made a few other minor patches. He handled the binutils releases -for versions 2.7 through 2.9. - -David Edelsohn contributed fixes for the PowerPC and AIX support. - -Steve Chamberlain made gas able to generate listings. - -Support for the HP9000/300 was contributed by Glenn Engel of HP. - -Support for ELF format files has been worked on by Mark Eichin of -Cygnus Solutions (original, incomplete implementation), Pete -Hoogenboom at the University of Utah (HPPA mainly), Michael Meissner -of the Open Software Foundation (i386 mainly), and Ken Raeburn of -Cygnus Solutions (sparc, initial 64-bit support). - -Several engineers at Cygnus Solutions have also provided many small -bug fixes and configuration enhancements. - -The initial Alpha support was contributed by Carnegie-Mellon -University. Additional work was done by Ken Raeburn of Cygnus -Solutions. Richard Henderson then rewrote much of the Alpha support. - -Ian Dall updated the support code for the National Semiconductor 32000 -series, and added support for Mach 3 and NetBSD running on the PC532. - -Klaus Kaempf ported the assembler and the binutils to openVMS/Alpha. - -Steve Haworth contributed the support for the Texas Instruction c30 -(tms320c30). - -H.J. Lu has contributed many patches and much testing. - -Alan Modra reworked much of the i386 backend, improving the error -checking, updating the code, and improving the 16 bit support, using -patches from the work of Martynas Kunigelis and H.J. Lu. - -Many others have contributed large or small bugfixes and enhancements. If -you've contributed significant work and are not mentioned on this list, and -want to be, let us know. Some of the history has been lost; we aren't -intentionally leaving anyone out. diff --git a/gas/COPYING b/gas/COPYING deleted file mode 100644 index 60549be514a..00000000000 --- a/gas/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/gas/ChangeLog b/gas/ChangeLog deleted file mode 100644 index 6b47aa31336..00000000000 --- a/gas/ChangeLog +++ /dev/null @@ -1,5702 +0,0 @@ -Fri Apr 7 15:56:57 2000 Andrew Cagney - - * configure.in (WARN_CFLAGS): Set to -W -Wall by default. Add - --enable-build-warnings option. - * Makefile.am (AM_CFLAGS, WARN_CFLAGS): Add definitions. - * Makefile.in, configure: Re-generate. - -2000-04-07 Nick Clifton - - * config/tc-arm.c (md_apply_fix3): Treat BFD_RELOC_ARM_PCREL_BLX - in the same way as BFD_RELOC_ARM_PCREL_BRANCH, and - BFD_RELOC_THUMB_PCREL_BLX lie BFD_RELOC_THUMB_PCREL_BRANCH. - (tc_gen_reloc): Accept BFD_RELOC_{ARM|THUMB}_PCREL_BLX. - (arm_force_relocation): Force relocations for - BFD_RELOC_{ARM|THUMB}_PCREL_BLX as well. - -Wed Apr 5 22:26:32 2000 J"orn Rennecke - - * config/tc-sh.c (get_operands): There's no third operand if the - first operand is an immediate. - -Wed Apr 5 22:07:19 2000 J"orn Rennecke - - * config/tc-sh.c (immediate): Delete. - (sh_operand_info): Add immediate member. - (parse_reg): Use A_PC for pc. - (parse_exp): Add second argument 'op'. All callers changed. - (parse_at): Expect pc to be coded as A_PC. - Use immediate field in *op. - (insert): Add fourth argument 'op'. All callers changed. - (build_relax): Add second argument 'op'. All callers changed. - (insert_loop_bounds): New function. - (build_Mytes): Remove DISP_4. - Split IMM_[48]{,BY[24]} into IMM[01]_[48]{,BY[24]}. Add REPEAT. - (assemble_ppi): Use immediate field in *operand. - (sh_force_relocation): Handle BFD_RELOC_SH_LOOP_{START,END}. - (md_apply_fix): Likewise. - (tc_gen_reloc): Likewise. Check for a pcrel BFD_RELOC_SH_LABEL. - -Wed Apr 5 06:35:45 2000 Alexandre Oliva - - * config/tc-sparc.c (sparc_ip): Avoid string pasting. - -Tue Apr 4 19:27:50 2000 Hans-Peter Nilsson - - * internals.texi (CPU backend): Document - TC_CHECK_ADJUSTED_BROKEN_DOT_WORD. - -2000-04-04 Alan Modra - - * po/gas.pot: Regenerate. - - * as.c (show_usage): Restore translated part of bug string. - * gasp.c (show_usage): Likewise. - - * Makefile.am (MKDEP): Use gcc -MM rather than ../mkdep. - (DEP): Quote when passing vars to sub-make. Use "mv -f" rather - than move-if-change. - (DEP1): Modify for "gcc -MM". - (DEPTC): Likewise. - (DEPOBJ): Likewise. - (DEP2): Likewise. - (CLEANFILES): Add DEPTCA, DEPOBJA, DEP2a, DEPA. - Update dependencies. - * Makefile.in: Regenerate. - -2000-04-03 Alexandre Oliva - - * config/tc-mn10300.c (md_pseudo_table): Use constant names. - (md_begin): Likewise. - (HAVE_AM33): New macro. - (md_assemble): Use it. Match r_regs and xr_regs only if - HAVE_AM33. - -2000-04-03 Alan Modra - - * as.h: #include "bin-bugs.h" - * as.c (show_usage): Use REPORT_BUGS_TO. - * gasp.c: #include "bin-bugs.h" - (show_usage): Use REPORT_BUGS_TO. - - * config/tc-sparc.c (md_show_usage): Add a trailing newline. - -Mon Apr 3 13:56:03 2000 Hans-Peter Nilsson - - * write.c (write_object_file) [! WORKING_DOT_WORD]: If defined, - call TC_CHECK_ADJUSTED_BROKEN_DOT_WORD for each word after - adjustments. - -2000-04-03 Alan Modra - - * config/tc-i386.c (i386_immediate): Don't assume a constant - immediate is necessarily 16 bits when in 16 bit code mode. - (md_assemble): Instead set guess_suffix here after we have checked - registers. - -2000-04-02 Richard Henderson - - * config/tc-d30v.c (check_range): Allow signed or unsigned 32-bit - quantities. Correct right shift sign extension. - (build_insn): Make `number' unsigned long. Mask top 6 bits of - 32-bit value when shifting into place. - -2000-04-01 Ian Lance Taylor - - * app.c: Add ATTRIBUTE_UNUSED as needed. - * config/tc-ppc.c: Likewise. - (ppc_size): Make unsigned long. - (ppc_insert_operand): Add casts to avoid warnings. - -2000-03-31 Nick Clifton - - * config/tc-d10v.h (md_flush_pending_output): Define. - -2000-03-29 Nick Clifton - - * config/tc-sh.h (SEG_NAME): New macro: return the name of a - segment. Works for both BFD_ASSEMBLER and others. - (SUB_SEGMENT_ALIGN): Use SEG_NAME. - -2000-03-29 Nick Clifton - - * listing.c (LISTING_LHS_WIDTH): Default depends on - LISTING_WORD_SIZE. - (LISTING_LHS_WIDTH_SECOND): Default to LISTING_LHS_WIDTH. - -2000-03-27 Ian Lance Taylor - - * config/tc-sh.c (md_show_usage): Use backslash before newline in - string literal. - -2000-03-27 Alan Modra - - * config/tc-avr.h (TC_HANDLES_FX_DONE): Define. - - * config/tc-avr.c (mcu_types): Add missing initialiser. - (md_pcrel_from_section): Add prototype. - (avr_operand): Remove redundant test of unsigned < 0. - (avr_cons_fix_new): Ensure exp_mod_pm zero on function exit. - -2000-03-27 Denis Chertykov - - * config/tc-avr.c: New file for AVR support. - * config/tc-avr.h: Likewise. - * configure.in: Add AVR support. - * configure: Regenerate. - -2000-03-26 Timothy Wall - - * gasp.c (macro_op): Add new argument to check_macro call. - Macro structure definitions moved to macro.h - * sb.h: Add argument to prototype for input_scrub_include_sb. - * input-scrub.c (input_scrub_include_sb): Allow disabling of sb - nesting checks with an additional flag. - (struct input_save): Add flag to indicate whether current sb - should be checked for proper macro/conditional nesting. - (input_scrub_push/pop): Save/restore nest check flag. - (input_scrub_next_buffer): Ditto. Also call end of macro hook if - defined. - * macro.c (check_macro): Allow caller to retrieve parsed macro - information if a pointer is provided. This information may be - used by the new macro hooks. - * macro.h: Update prototype for check_macro. Macro struct - definitions moved here from macro.c/gasp.c. - * read.c (read_a_source_file): Add parameter to check_macro call, - and pass macro info to the macro hook, if defined. - (input_scrub_insert_line): New. Allow insertion of a line of - characters into the input stream. - (input_scrub_insert_file): New. Allow insertion of an arbitrary - file into the input stream. - (s_include): Use input_scrub_insert_file. - * internals.texi: Document new macro hooks. - * as.h: New prototypes added. - -2000-03-26 Alan Modra - - * config/tc-i386.c: Don't start any as_bad or as_warn message with - an initial capital letter. - (i386_index_check): Reindent. - -2000-03-19 Nick Clifton - - * config/tc-arm.c (md_apply_fix3): Fix bug detectng overflow of pc - relative branches. - -2000-03-17 Thomas de Lellis - - * config/tc-arm.c (do_t_adr): Flag "adr Rd,label" - instruction operand bad if Rd > 7 when generating - thumb instructions. Prevents for example, - "adr r12,label" from silently failing and generating - the wrong instruction. - -2000-03-17 Nick Clifton - - * config/tc-arm.c (md_apply_fix3): Handle same-section relocations - that have a destingation >= 0x400000. - Fix compile time warning messages. - -Thu Mar 16 23:45:16 2000 J"orn Rennecke - - * config/tc-sh.c (md_begin): When encountering insn that are - not supported by the current arch, only change the name if - its contents are the same as prev_name. - (get_specific): If the the architecture doesn't match, fail. - -Thu Mar 16 21:18:13 2000 J"orn Rennecke - - * config/tc-sh.c (IDENT_CHAR): Define. - (parse_reg): Use it instead of isalnum. Put r[0..7]_bank operand - matching back where it came from. - -Thu Mar 16 20:58:10 2000 J"orn Rennecke - - * config/tc-sh.c (md_show_usage): Add description of -dsp. - -2000-03-15 Jonathan Larmour - - * config/tc-sh.c (parse_reg): Match r[0..7]_bank operands before - normal operands. - -2000-03-15 Kazu Hirata - - * config/tc-h8300.c: Add ATTRIBUTE_UNUSED as appropriate. - -Mon Mar 13 22:02:59 2000 Hans-Peter Nilsson - - * expr.c (operand) [case 'f']: When testing if '0f' can start a - floating-point-number, make sure 'f' is in FLT_CHARS. - -Sat Mar 11 00:01:39 2000 Hans-Peter Nilsson - - * read.c (TC_IMPLICIT_LCOMM_ALIGNMENT): New default-definition. - (s_lcomm_internal): Use it. - * doc/internals.texi (CPU backend): Document it. - * config/obj-evax.h (TC_IMPLICIT_LCOMM_ALIGNMENT): Set to 2**3 - bytes. - -2000-03-10 Geoffrey Keating - - * config/tc-mips.c (mips_ip): Don't put stuff in .rodata - when embedded-pic. - - * config/tc-mips.c (SWITCH_TABLE): The ELF embedded-pic - implementation doesn't have special handling for switch - statements. - (macro_build): Allow for code in sections other than .text. - (macro): Likewise. - (mips_ip): Likewise. - (md_apply_fix): Do pc-relative relocation madness for MIPS ELF. - Don't perform relocs if we will be outputting them. - (tc_gen_reloc): For ELF, just use fx_addnumber for pc-relative - relocations. Allow BFD_RELOC_16_PCREL_S2 relocs when - embedded-pic. - -2000-03-09 Catherine Moore - - * config/tc-m32r.c (m32r_fix_adjustable): Look up the - relocation type based on the entry in the fixup structure. - -2000-03-08 H.J. Lu (hjl@gnu.org) - - * Makefile.am (install-exec-tooldir): Depend on - install-exec-bindir for parallel make. - * Makefile.in: Regenerated. - -2000-03-06 Nick Clifton - - * config/tc-m32r.c (struct md_longopts): Add -m32r command line - switch. - (md_parse_option): Parse -m32r command line switch - disable m32rx - compatability. - (md_show_usage): Document new option. - - * doc/Makefile.am (CPU_DOCS): Add c-m32r.texi. - * doc/Makefile.in: Regenerate. - * doc/c-m32r.texi (M32R-Opts): Document new command line switch. - -2000-03-02 Michael Meissner - - * config/tc-d30v.c (check_range): Remove code that incorrectly - sign extended values where bits < 32. - -2000-03-02 H.J. Lu (hjl@gnu.org) - - * configure.in: Support --enable-targets=all on ia32. - * configure: Regenerated. - -2000-03-01 Nick Clifton - - * gasp.c (do_align): Remove bogus check of alignment value. - -2000-02-27 Thomas de Lellis - - * config/obj-elf.c (elf_frob_symbol): Remove code which when - TC_PPC was defined forced the type of a symbol with no other type - to be BSF_OBJECT. - -2000-02-27 Hans-Peter Nilsson - - * doc/internals.texi (CPU backend): Mention that - line_separator_chars do not break up comments. Fix typos for - LEX_AT and LEX_NAME descriptions. Document operands for - TC_EQUAL_IN_INSN, md_operand and md_section_align. Correct - description of md_create_short_jump usage. Document argument for - md_undefined_symbol. - -2000-02-27 Jakub Jelinek - - * config/tc-sparc.c (OPTION_UNDECLARED_REGS): New option. - (md_parse_option): Handle it. - (md_show_usage): Document it. - -2000-02-27 Ian Lance Taylor - - * config/tc-alpha.c (md_assemble): Accept `1' and `9' in an - opcode, for the instruction `pal19'. From Andrea Arcangeli - . - -2000-02-26 Alan Modra - - * config/tc-i386.c (i386_immediate): Move constant operand sizing - from here.. - (md_assemble): To here, before template operands are matched. - Also ensure a constant immediate is sign extended when we know the - size is at most 16 bits. This is to catch cases like "add - $0xffc0,%ax" where we don't know the size, and thus that the - immediate can be represented as Imm8S until after parsing the - register operand. - (i386_displacement): Similarly sign extend 16 bit constant - displacements. - (md_assemble): Relax 16-bit jump constant range check to suit sign - extended displacements. - -2000-02-26 Andreas Jaeger - - * doc/c-mips.texi (MIPS Opts): Fix typo in last patch. - -2000-02-25 Alan Modra - - * config/tc-i386.c (md_assemble): Don't swap intersegment jmp and - call operands when intel_syntax. - (intel_float_operand): Return 2 for "fi...". - (i386_operand_modifier): Change "DWORD PTR" test to suit above. - Return SHORT_MNEM_SUFFIX for "WORD PTR" when "fi...". Revert - earlier "SHORT" change. - (md_assemble): When determining suffix from Regs, exclude - InOutPortReg. - -2000-02-24 Nick Clifton - - * configure: Add arm-wince, mips-pe and sh-pe targets. - * configure: Regenerate. - - * config/obj-coff.h (COFF_WITH_PE): Define for mips-pe and - sh-pe targets. - (TARGET_FORMAT): Set to "pe-shl" for the sh-pe target and to - "pe-mips" for the mips-pe target. - - * config/tc-arm.c (insns): Change displacement encoded in BL - and B instructions if the target port is arm-wince. - (do_ldst): Do not bias the relocation offset if the target - port is arm-wince. - (md_pcrel_from): Add in missing relocation offset bias if the - target os arm-wince. - - * config/tc-mips.c (mips_target_format): Support COFF flavour. - (md_begin): Disable -G support for mips-pe target. - (md_apply_fix): Treat BFD_RELOC_RVA reloc as BFD_RELOC_32. - * config/tc-mips.h (USE_GLOBAL_POINTER_OPT): Add support for - COFF flavour. - - * config/tc-sh.c (md_begin): sh-pe target is little endian. - * config/tc-sh.h (SUB_SEGMENT_ALIGN): If using a BFD - assembler, just set the alignment to 4. - - * config/te-wince-pe.h: New file for WinCE targets. Define - TE_WINCE. - -2000-02-25 Alan Modra - - * config/tc-i386.c (md_assemble): Swap segments too for intel mode - string instructions. - (i386_operand_modifier): Set i.suffix = WORD_MNEM_SUFFIX for SHORT. - (i386_intel_memory_operand): After finding a segment override, - check again for no `[' before looking for a displacement. Bomb if - more than one displacement rather than silently discarding the - second and subsequent ones. Free strings malloc'd by - build_displacement_string. - -2000-02-24 Catherine Moore - - * config/obj-som.c (obj_pseudo_table): Add "weak". - (obj_som_weak): New routine. - -2000-02-24 Alan Modra - - * config/tc-i386.c (union i386_op): New. - (struct _i386_insn): Delete disps[], imms[], regs[]. Add op[]. - Throughout file replace occurences of disps[n], imms[n], regs[n] - with equivalent op[n].disps, op[n].imms, op[n].regs. Simplify - intel mode operand swapping. Add assert in regKludge and - fake_zero_displacement code. Test i.types[n] when outputting - displacements and immediates. Combine output of Disp16 with - Disp32. - (md_assemble): Don't try to fix broken UNIXWARE_COMPAT opcodes - when in intel mode by (not) reversing fsub and fdiv operands - before the template search. This fails for single operand - shorthand forms of the instruction, and if UNIXWARE_COMPAT is - undefined. Instead fix the base_opcode after we've found the - template. Move base_opcode xor with found_reverse_match from - opcode output code to before this fix so we test for the correct - opcodes. - (md_assemble): Don't use strcmp when deciding to ignore the suffix - check in intel mode. Instead compare opcodes. - - * config/tc-i386.h (TC_RELOC): Delete. - * config/tc-i386.c (TC_RELOC): Delete. Replace usage of TC_RELOC - with equivalent call to reloc. - - * as.h (flag_m68k_mri): Move declaration after target include, and - only declare when TC_M68K defined. Define as zero otherwise. - (LABELS_WITHOUT_COLONS, NO_PSEUDO_DOT): If undefined, define as 0. - * app.c (scrub_m68k_mri): Declare only when TC_M68K defined. - Define as zero otherwise. - (do_scrub_begin): Use m68k_mri parameter only when TC_M68K defined. - (struct app_save): Declare scrub_m68k_mri only when TC_M68K. - (app_push, app_pop): Save scrub_m68k_mri only when TC_M68K. - (do_scrub_chars): Use LABELS_WITHOUT_COLONS directly rather than - testing whether defined. - * cond.c (ignore_input): Use NO_PSEUDO_DOT directly. - * expr.c (operand): #ifdef unused case labels when TC_M68K undefined. - * read.c: Use LABELS_WITHOUT_COLONS and NO_PSEUDO_DOT directly - rather than testing whether defined. - (s_mri): Set flag_m68k_mri only when TC_M68K defined. - (parse_mri_cons): Declare and use only when TC_M68K. - * config/tc-hppa.h (LABELS_WITHOUT_COLONS): Define as 1. - * config/tc-m68k.h (NO_PSEUDO_DOT): Define as 1. - * config/tc-m88k.h (NO_PSEUDO_DOT): Define as 1. - - * NEWS: Mention IBM 370 support. - -2000-02-23 Richard Henderson - - * config/tc-i386.c (md_assemble): When swapping operands for - intel_syntax, assume everything that's not Imm or Disp is a - register. - -2000-02-23 Linas Vepstas - - * config/tc-i370.c, config/tc-i370.h: New files. - * Makefile.am: Add support for Linux/IBM 370. - * configure.in: Likewise. - * app.c (do_scrub_begin): Don't lex single quote when TC_I370. - * config/obj-elf.c: Include elf/i370.h - (obj_elf_section): Don't do anything special for flag_mri if TC_I370. - - * Makefile.in: Regenerate. - * configure: Regenerate. - - * doc/c-i370.texi: New file. - * doc/all.texi: Include it. - * doc/as.texinfo: And here. - * doc/Makefile.am(CPU_DOCS): Add c-i370.texi. - * doc/Makefile.in: Regenerate. - -2000-02-19 Michael Meissner - - * config/tc-d30v.c (parallel_ok): Use FLAG_NOT_WITH_ADDSUBppp to - determine if an instruction can be used in parallel with an ADDppp - or SUBppp instruction. - -2000-02-22 Andrew Haley - - * doc/c-mips.texi (MIPS Opts): Document -mgp32 and -mgp64. - -1999-12-30 Andrew Haley - - * config/tc-mips.c (mips_gp32): New variable. - (macro_build) Use mips_gp32. - (mips_ip): Ditto. - (md_longopts): Add "-mgp32" and "-mgp64". - (md_parse_option): Add OPTION_GP32 and OPTION_GP64. - -2000-02-22 Alexandre Oliva - - * config/obj-coff.c (add_lineno): Accept non-positive lineno with - warning, and bump it to 1. - -2000-02-22 Ian Lance Taylor - - From Brad Lucier : - * dwarf2dbg.c (print_stats): Add cast to force printf argument to - match format. - -2000-02-21 Catherine Moore - - * config/tc-mips.c (MF_HILO_INSN): Define. - (mips_7000_hilo_fix): Declare. - (append_insn): Conditionally insert nops after an mfhi/mflo insn. - (md_parse_option): Check for 7000_HILO_FIX options. - (OPTION_M7000_HILO_FIX): Define. - (OPTION_NO_M7000_HILO_FIX): Define. - * doc/c-mips.texi (-mfix7000): Describe. - -2000-02-21 Alan Modra - - * listing.c (print_lines): Remove unused variable `end'. - - * config/tc-i386.c (md_assemble): Use `reloc()' to select reloc - type for JumpInterSegment output. Use enum bfd_reloc_code_real for - reloc_type when BFD_ASSEMBLER. - (md_estimate_size_before_relax): Use enum bfd_reloc_code_real for - reloc_type when BFD_ASSEMBLER. Move common code out of switch - statement and quell signed vs. unsigned comparison warning. - -2000-02-18 Nick Clifton - - * config/tc-d10v.c (find_opcode): Add a symbol's value to - the computed frag offset, rather than overwriting it. - -Thu Feb 17 00:11:08 2000 J"orn Rennecke - - * config/tc-sh.c ("elf/sh.h"): Include. - (sh_dsp, valid_arch, reg_x, reg_y, reg_efg): New static variables. - (md.begin): Initialize target_arch. - Only include opcodes in has table that match selected architecture. - (parse_reg): Recognize register names for sh-dsp. - (parse_at): Recognize post-modify addressing. - (get_operands): The leading space is now optional. - (get_specific): Remove FDREG_N support. Add support for sh-dsp - arguments. Update valid_arch. - (build_Mytes): Add support for SDT_REG_N. - (find_cooked_opcode): New function, broken out of md_assemble. - (assemble_ppi, sh_elf_final_processing): New functions. - (md_assemble): Use find_cooked_opcode and assemble_ppi. - (md_longopts, md_parse_option): New option: -dsp. - * config/tc-sh.h (elf_tc_final_processing): Define. - (sh_elf_final_processing): Declare. - -Fri Feb 11 14:21:51 2000 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_build_unwind_subspace): Use subseg_new to create - the unwinder subspace. Save the current seg/subseg before creating - the new seg/subseg. - -2000-02-10 Nick Clifton - - * config/tc-mcore.c (INST_BYTE0): Redefine to handle big and - little endian targets. - (INST_BYTE1): Redefine to handle big and little endian - targets. - (cpu_type): New type: Select between M340 and M210. - (parse_psrmod): New function: Parse the PSRCLR and PSRSET - instructions of the M340. - (md_assemble): Add support for the MULSH and OPSR classes of - instructions. - (md_atof): Add support for little endian targets. - (md_parse_option): Add support for -EL, -EB and -mcpu command - line switches. - (md_convert_frag): Add support for little endian targets. - (md_apply_fix3): Add support for little endian targets. - (md_number_to_chars): Add support for little endian targets. - -2000-02-10 Timothy Wall - - * read.c (read_a_source_file): If TC_START_LABEL_WITHOUT_COLON is - defined, use it to verify the symbol just read should be a label. - -2000-02-10 Timothy Wall - - * app.c (do_scrub_chars): Handle "||" for parallel instructions - when DOUBLEBAR_PARALLEL is defined. Avoid stripping whitespace - around colons when KEEP_WHITE_AROUND_COLON is defined. - * doc/internals.texi (CPU backend): Document DOUBLEBAR_PARALLEL - and KEEP_WHITE_AROUND_COLON. - -2000-02-08 Timothy Wall - - * read.c (s_rept): Call do_repeat, which abstracts the repeat - logic. - (do_repeat): New. Abstract repeat logic so that a "break" can be - implemented. - (end_repeat): New. Provide support for a "break" out of the - repeat loop. - * read.h: Add prototypes for new functions. - -2000-02-08 Timothy Wall - - * doc/internals.texi: Document NUMBERS_WITH_SUFFIX macro. - * as.h: Provide a default NUMBERS_WITH_SUFFIX definition (zero). - * expr.c: Handle numbers with suffixes if NUMBERS_WITH_SUFFIX is - non-zero. - -2000-02-08 Timothy Wall - - * read.c: Added elseif to directives table. - * read.h: Added prototype for s_elseif. - * doc/as.texinfo: Added description for elseif. - * cond.c (s_elseif): New function - -2000-02-04 Timothy Wall - - * listing.c (print_lines): Remove conditionals causing bug in - listings. - -2000-02-03 Timothy Wall - - * as.h: Define OCTETS_PER_BYTE and OCTETS_PER_BYTE_POWER - default values. - * frags.c (frag_new): Calculate fr_fix in octets - (frag_now_fix) Return offset as target address offset (bytes). - (frag_now_fix_octets) New - Return offset in octets (8-bit - quantities). - * frags.h: Added prototype for frag_now_fix_octets(). - Distinguish between octets and bytes in field descriptions. - * listing.c (calc_hex): Account for octets vs bytes when - printing addresses/offsets. - (print_lines) Ditto. Also, if LISTING_WORD_SIZE is not 1, and - target is little-endian, print the octets in a word in big-endian - order so that the display looks like a proper hexadecimal number, - instead of having the octets reversed. - * read.c (do_align): When recording alignment, alignment power - should be in terms of target bytes (minimum addressible unit) - instead of octets. - (do_org) Convert ORG target address (byte) argument into an - octet offset when generating a variable fragment. - * symbols.c (resolve_symbol_value): Symbol final value - converted to a target address offset (bytes) from its octet offset. - * config/obj-coff.c (coff_frob_symbol): Symbol target address - offset (bytes) is adjusted by the frag offset (octets) converted - to bytes. - (coff_frob_section) Section alignment power is in terms of bytes; - convert it to an octet alignment power when calculating size (and - size mask) in octets. Don't modify the section size in order to - "align" it for TI COFF, since that format has a different method - for storing alignment information. - -2000-02-01 Timothy Wall - - * stabs.c (generate_asm_file): Escape backslashes in stabs file - entries, matching the way GCC generates them. If not escaped, the - filename is encoded incorrectly. - -2000-01-31 Nick Clifton - * config/tc-arm.c (reg_table): Add support for ATPCS register - naming conventions. - -2000-01-31 Geoff Keating - - * config/obj-coff.h (OBJ_COPY_SYMBOL_ATTRIBUTES): Don't define if - already defined. - * config/tc-ppc.h [OBJ_XCOFF] (OBJ_COPY_SYMBOL_ATTRIBUTES): - New macro. - * config/tc-ppc.c (ppc_fix_adjustable): Don't look at the frag - of a symbol when we really care about its value. - -2000-01-19 Chandra Chavva - - * config/tc-mcore.c (md_assemble): Give warning message if - operands passes to instruction are more than the spec. - -2000-01-27 Thomas de Lellis - - * config/tc-arm.c (armadjust_symtab): If the assembler is in - Thumb mode but the label seen was not declared as '.thumb_func' - then set the ST_INFO type to STT_ARM_16BIT mode. This allows - correct disassembly of Thumb code bounded by non function labels. - -2000-01-27 Alan Modra - - * Makefile.am (MULTI_CFILES): Add config/e-i386aout.c - Add dependencies for e-i386aout.o. Fix 2 comment lines. - - * Makefile.in: Same here. - Update copyright. - - * configure.in: Set bfd_gas for i386-aout when primary target - is bfd. Handle i386aout emulation. Don't use te_file=multi, as - we may need the primary te_file. Remove incorrect comment. - - * configure: Regenerate. - - * config/e-i386aout.c: New file. - - * as.c (USE_EMULATIONS): Move to before print_version_id. - (struct emulation): Add i386aout. - (show_usage): Split text strings. Reformat -a text. Add --em - help. - Update copyright. - - * obj.h (struct format_ops): Add s_get_other and s_get_desc. - (aout_format_ops): New. - Update copyright. - - * read.c (s_lcomm_internal): Rewrite OBJ_AOUT,OBJ_BOUT - preprocessor conditional and add aout USE_EMULATIONS tests. - (read_a_source_file): Don't pass error strings to printf as - format arg. - Update copyright. - - * gasp.c (exp_get_abs): Don't pass error strings to printf as - format arg. - (do_data): Same here. - (process_file): And here. - Update copyright. - - * symbols.c (colon): Rewrite "already defined" fatal message - code for aout with USE_EMULATIONS. - Update copyright. - - * config/obj-aout.c (OBJ_HEADER): Define. - (obj_pseudo_table): Rename to aout_pseudo_table. Init all - fields of sentinel. - (obj_aout_frob_symbol): Expand S_GET_DESC, S_GET_TYPE, - S_GET_OTHER, S_SET_TYPE macros since we don't need obj-multi - forms here. - (obj_aout_type): Expand S_SET_OTHER here too. - (obj_read_begin_hook): Remove. - (aout_pop_insert): New. - (obj_aout_s_get_other): New. - (obj_aout_s_get_desc): New. - (aout_format_ops): New. - Update copyright. - - * config/obj-aout.h (obj_pop_insert): Define so non-multi usage - gets aout_pseudo_table. - (aout_pseudo_table): Declare. - (obj_read_begin_hook): Define. - Update copyright. - - * config/obj-coff.c (obj_pseudo_table): Rename to - coff_pseudo_table. - (coff_pop_insert): Use coff_pseudo_table. - (coff_sec_sym_ok_for_reloc): Remove. - (coff_format_ops): Add 0 entries for s_get_size, s_set_size, - and comment all zero entries and remove #if 0 code. - Update copyright. - - * config/obj-coff.h (obj_pop_insert): Define. - (coff_pseudo_table): Declare. - Update copyright. - - * config/obj-ecoff.c (ecoff_format_ops): Add 0 entries for - s_get_size, s_set_size. Comment all zero entries. - Update copyright. - - * config/obj-elf.c (elf_s_get_other): New function. - (obj_read_begin_hook): Rename to elf_obj_read_begin_hook. - (obj_symbol_new_hook): Rename to elf_obj_symbol_new_hook. - (elf_format_ops): Add elf_s_get_other, 0 s_get_size entry, and - comment. - (obj_elf_parse_section_letters): Don't pass error strings to - printf as format arg. - Update copyright. - - * config/obj-elf.h (ECOFF_DEBUGGING): Define when - OBJ_MAYBE_ECOFF. - (elf_s_get_other): Declare. - (S_GET_OTHER) Define as elf_s_get_other if not already - defined. - (S_SET_OTHER): Only define when not already defined. - (elf_obj_read_begin_hook): Declare. - (obj_read_begin_hook): Define. - (elf_obj_symbol_new_hook): Declare. - (obj_symbol_new_hook): Define. - Update copyright. - - * config/obj-multi.h: Add copyright header and protect against - multiple inclusion. Add * to all function pointers. - (OBJ_HEADER): If defined, include it rather than other defines - in this file. - (obj_frob_file_after_relocs): Test for NULL. - (obj_symbol_new_hook): Here too. - (obj_sec_sym_ok_for_reloc): And here. - (S_GET_OTHER): Define. - (S_GET_DESC): Define. - (ECOFF_DEBUGGING): Remove as it's done in obj-elf.h - (OBJ_MAYBE_ELF): Update comment. - - * config/tc-i386.c (i386_immediate): Add OBJ_MAYBE_AOUT to - OBJ_AOUT preprocessor conditional and handle emulation by - testing OUTPUT_FLAVOR. - (i386_displacement): Here too. - (md_section_align): Similarly here. - (i386_target_format): Conditionally compile when more than one - of OBJ_MAYBE_{ELF,COFF,AOUT} defined. Add aout case. - (i386_immediate): Fix error message for aout BFD_ASSMBLER. - (i386_displacement): Here too. - Update copyright. - - * config/tc-i386.h (AOUT_TARGET_FORMAT): Define for each TE_*. - Define TARGET_FORMAT for aout only when not multi. - Update copyright. - - * config/te-multi.h: Delete file as it's identical to te-generic.h - -2000-01-15 Alan Modra - - * config/tc-i386.h (DWORD_MNEM_SUFFIX): Delete. - * config/tc-i386.c (DWORD_MNEM_SUFFIX): Rename all occurrences to - LONG_MNEM_SUFFIX. - - * config/tc-i386.h (INTEL_DWORD_MNEM_SUFFIX): Rename to - DWORD_MNEM_SUFFIX. - * config/tc-i386.c (INTEL_DWORD_MNEM_SUFFIX): Here too. Fix some - comments. - -2000-01-13 Clinton Popetz - - * config/tc-mips.c (mips_do_align): New function. - * config/tc-mips.h (md_do_align): Define. - -2000-01-10 Philip Blundell - - * doc/c-arm.texi (ARM Options): Fix typo. - (ARM-Chars): Correct description of `#'. Mention that `;' is a - line separator for Linux. - * doc/as.texinfo (Comments): Mention the ARM. - -2000-01-10 Philip Blundell - - * configure.in (arm*-*-conix*): New target. - (arm*-*-linux-gnu*): Match instead of arm-*-linux* and - armv*-*-linux-gnu. - * configure: Regenerate. - -2000-01-03 Martin v. Loewis - - * config/obj-elf.c (elf_pseudo_table): Define visibility pseudos. - (obj_elf_visibility): New function. - - * doc/as.texinfo (Visibility): New node: document visibility - pseudo ops. - -1999-12-27 Alan Modra - - * config/tc-i386.c (MATCH): Relax JumpAbsolute check. Emit a - warning for absolute jump/call without `*' in non-intel mode. No - need to set i.types[0] JumpAbsolute in intel mode. - -1999-12-22 Philip Blundell - - * config/tc-arm.c (arm_s_text): If OBJ_ELF, call the appropriate - hook function when changing sections. - (arm_s_data): Likewise. - -1999-12-14 Nick Clifton - - * config/tc-arm.c (md_parse_option): Add support for -marm720 - command line switch. - -Tue Nov 30 22:59:00 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_pseudo_table): Add ".am33" pseudo-op. - (r_registers, xr_registers): Define. - (r_register_name, xr_register_name): New functions. - (md_assemble): Handle new am33 operand types and instruction - formats. - (mn10300_insert_operand, check_operand): Likewise. - -1999-11-29 Nick Clifton - - * config/tc-arm.c (thumb_mode): Turn into a tristate variable. - (s_force_thumb): Set thumb_mode to 2. - (md_assemble): Do not complain about thumb instructions on a - non-thumb target if thumb_mode is set to 2. - -1999-11-28 Michael Meissner - - * config/tc-alpha.c (toplevel): Include struc-symbol.h. - (alpha_macro_arg): Add MACRO_{LITERAL,BASE,BYTOFF,JSR} cases. - (O_...): Add new machine dependent expressions if we are handling - explicit relocations. - (alpha_reloc_op): New static table holding the explicit relocation - information. - (alpha_literal_hash): New static to hold the hash table for - explicit relocations. - (alpha_macros): Add support for explicit relocations. - (md_begin): If explicit relocations, initialize hash table. - (md_assemble): Don't print a second error if tokenize_arguments - already printed an error message. - (md_apply_fix): Add support for explicit relocations. - (alpha_force_relocation): Ditto. - (alpha_fix_adjustable): Ditto. - (alpha_adjust_symtab): New function to support explicit - relocations. - (alpha_adjust_symtab_relocs): Ditto. - (debug_exp): Debug stub compiled if DEBUG_ALPHA is defined. - (tokenize_arguments): Add debug code if DEBUG_ALPHA is defined. - Add support for explicit relocations. Return -2 if an error - message was already printed. - (find_macro_match): Add support for explicit relocations. Comment - each of the cases. - (emit_insn): Add support for explicit relocations. - (assemble_tokens): Ditto. - (emit_ldgp): Ditto. - (load_expression): Ditto. - (emit_lda): Ditto. - (emit_ldah): Ditto. - (emit_ir_load): Ditto. - (emit_loadstore): Ditto. - (emit_ldXu): Ditto. - (emit_ldil): Ditto. - (emit_sextX): Ditto. - (emit_division): Ditto. - (emit_jsrjmp): Ditto. - (emit_retjcr): Ditto. - - * config/tc-alpha.h (RELOC_OP_P): Enable explicit relocations if - ELF object format. - (tc_adjust_symtab): If explicit relocations, call the function - alpha_adjust_symtab. - (TC_FIX_TYPE): Add fields to be able to move explicit lituse - relocations next to the literal relocation they reference. - (TC_INIT_FIX_DATA): Initialize the new fields. - (TC_FIX_DATA_PRINT): Print the new fields if DEBUG5 is defined. - -Wed Nov 24 20:27:58 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip): Handle PA2.0 unit completers. Handle - 'B' operand for PA2.0 bb instruction. - -1999-11-18 Nick Clifton - - * config/tc-mcore.h (TC_FORCE_RELOCATION): Define for Mcore-pe - target. - - * config/tc-mcore.c (tc_gen_reloc): Support generation of RVA - relocs. - (mcore_force_relocation): Force relocations to be generated for - RVA relocs. - -1999-11-16 Alan Modra - - * config/tc-i386.c (i386_immediate): Disallow O_big immediates. - (i386_displacement): Disallow O_big displacements. - -Mon Nov 15 20:12:43 1999 Donald Lindsay - - * config/tc-arm.c (do_mia,do_mar,do_mra,do_pld,do_ldrl,do_co_reg): Small - improvements in error checking. - (md_assemble): Support for unconditional ARM instructions. - (md_parse_option): Support for -m[arm]v5e flag. - -1999-11-12 Nick Clifton - - * macro.c (buffer_and_nest): Do not check beyond the end of the - buffer. - -1999-11-11 Nick Clifton - - * macro.c (buffer_and_nest): Look for seperator after TO and - FROM tokens. - -1999-11-08 Andrew Haley - - * app.c (do_scrub_chars): When in State 10, treat backslash - characters in the same way as as symbol characters. - -1999-11-07 Richard Henderson - - * config/tc-alpha.c (alpha_align): Check, don't assert, that - the previous label was in the current section before playing - with auto-alignment. - -1999-11-06 Nick Clifton - - * config/tc-v850.c (v850_force_relocation): Force relocation - for weak symbols. - (v850_pcrel_from_selection): Do not compute a pcrel offset if - the symbol is weak. - -1999-11-05 Michael Meissner - - * expr.h (operatorT): Increase machine dependent operators to 16. - * expr.c (op_rank): Ditto. - -1999-11-03 Ian Lance Taylor - - * read.c (pseudo_set): Reject attempts to set the value of a - section symbol. - - * config/obj-elf.c (obj_elf_ident): Call md_flush_pending_output - if it is defined. - - * config/obj-elf.c (elf_set_index): Add ATTRIBUTE_UNUSED. - - * config/obj-elf.c (elf_frob_file_after_relocs): Don't pass NULL - to bfd_set_section_contents. - -1999-11-03 Nick Clifton - - * config/tc-mcore.h (TARGET_BYTES_BIG_ENDIAN): Change to false. - -1999-11-01 Gavin Romig-Koch - - * config/tc-mips.c (macro_build): Use OPCODE_IS_MEMBER. - (mips_ip): Use OPCODE_IS_MEMBER. - -Wed Oct 27 16:50:44 1999 Don Lindsay - - * config/tc-arm.c (reg_required_here): Improve comments. - - * config/tc-arm.c (thumb_opcode): Add "variants" field. - (tinsns): Initialize variants field. - - * config/tc-arm.c (bad_args, bad_pc): Renamed to BAD_ARGS and - BAD_PC respectively. - -1999-10-27 Scott Bambrough - - * config/tc-arm.c (reloc_map[]): Fix compiler warning. - * config/tc-arm.h: Fix compile time warnings. - -Mon Oct 18 18:11:10 MDT 1999 Diego Novillo - - * tc_d10v.c (find_opcode): Allow ATSIGN to match expressions of the - form @abs16, @(abs16) and @(abs16 + imm). - -1999-10-21 Gavin Romig-Koch - - * config/tc-mips.c (ISA_HAS_COPROC_DELAYS) : New. - (ISA_HAS_64_BIT_REGS) New. - (gpr_interlocks,md_begin,reg_needs_delay,append_insn, - mips_emit_delays,macro_build,load_register,load_addresss, - macro,macro2,mips_ip,s_cprestore,s_cpadd): Simplify - and/or use new ISA_xxx macros in expressions involving - ISA, particularly mips_opts.isa. - -1999-10-18 Michael Meissner - - * expr.h (operatorT): Add machine dependent operators md1..md8. - (expressionS): Make X_op 8 bits instead of 7. Add a X_md field - for the machine dependent operators to use. - - * expr.c (op_rank): Add machine dependent operators. - - * config/tc-alpha.c (O_pregister): Define as a machine dependent - operator. - (O_cpregister): Ditto. - (md_begin): Change X_op test that field is wide enough to use - O_max instead of O_alpha_max. - (cpu_types): Fill in missing initializer. - (alpha_num_macros): Make unsigned. - (md_assemble): Make opnamelen be size_t. - (md_apply_fix): Cast alpha_num_operands to int before testing. - (alpha_force_relocation): Ditto. - (alpha_fix_adjustable): Ditto. - (alpha_fix_adjustable): Mark unused arguments ATTRIBUTE_UNUSED. - (tc_gen_reloc): Ditto. - (tc_get_register): Ditto. - (emit_ldgp): Ditto. - (emit_lda): Ditto. - (emit_ldah): Ditto. - (emit_ldil): Ditto. - (s_alpha_ent): Ditto. - (s_alpha_end): Ditto. - (s_alpha_frame): Ditto. - (s_alpha_prologue): Ditto. - (s_alpha_file): Ditto. - (s_alpha_gprel32): Ditto. - (s_alpha_proc): Ditto. - (s_alpha_set): Ditto. - (s_alpha_base): Ditto. - (s_alpha_align): Ditto. - (s_alpha_arch): Ditto. - (alpha_align): Ditto. - (assemble_insn): Suppress unused variable warning. - (emit_insn): Ditto. - (assemble_insn): Don't assume X_op and X_unsigned are in a given - order in the structure. - (s_alpha_coff_wrapper): Avoid int/unsigned comparison. - -Sun Oct 17 17:15:58 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (md_apply_fix): Make "fmt" an int. - -1999-10-12 Alan Modra - - * config/tc-i386.c (i386_index_check): Correct #endif location. - -Mon Oct 11 14:02:40 1999 Geoffrey Keating - - * as.c (show_usage): Document new options. - (parse_args): Add --no-warn, --warn, --fatal-warnings, - which become 'W', OPTION_WARN, and OPTION_WARN_FATAL. - (parse_args): Parse the new options. - (main): If there were warnings, and --fatal-warnings - was specified, print an error. - * as.h: New variable, flag_fatal_warnings, for new option. - -Sun Oct 10 01:47:23 1999 Jerry Quinn - - * config/tc-hppa.c (pa_ip): Add new codes 'cc', 'cd', 'cC', 'co', - '@'. Change autoincrement completers to fall through to cache control - completers. - - * config/tc-hppa.c (pa_ip): Remove unused args. Add code to '?W' - arg. - (pa_parse_addb_64_cmpltr): New function. - - * config/tc-hppa.c (pa_ip): Change error message. - (pa_ip,pa_parse_cmpb_64_cmpltr,pa_parse_cmpib_64_cmpltr) Fix '?N' and - '?Q' args to allow falling through. - - * configtc-hppa.c (pa_ip): Implement conditional codes "?N", "?Q". - Remove unused conditional codes. - (pa_parse_cmpb_64_cmpltr,pa_parse_cmpib_64_cmpltr): New. - -Thu Oct 7 00:23:53 MDT 1999 Diego Novillo - - * config/tc-d30v.c (CHAR_BIT): Define. - (check_range): Fix bit operations to support integers bigger than - 32 bits. - -Thu Oct 7 00:11:50 MDT 1999 Diego Novillo - - * config/tc-d10v.c (check_range): Check range for RESTRICTED_NUM3 - operands. - -Mon Oct 4 17:24:23 1999 Nick Clifton - Doug Evans - - Add support for m32rx. - * config/tc-m32r.c (enable_m32rx): New static global. - (enable_special,warn_explicit_parallel_conflicts,optimize): Ditto. - (allow_m32rx): New function. - (M32R_SHORTOPTS): Add `O'. - (md_longopts): Add --m32rx plus several warning options. - (md_parse_option): Handle new options. - (md_show_usage): Print them. - (md_begin): Enable m32rx. - (OPERAND_IS_COND_BIT): New macro. - (first_writes_to_seconds_operands): New function. - (writes_to_pc,can_make_parallel,make_parallel): New functions. - (target_make_parallel,assemble_two_insns): New functions. - (md_assemble): Recognize "insn1 -> insn2" and "insn1 || insn2". - If optimizing and m32rx, try to make consecutive insns parallel. - -Tue Sep 28 14:06:44 1999 Geoffrey Keating - - * config/tc-mips.c (nopic_need_relax): Allow for the - .sdata.foo sections generated by -fdata-sections, - and for the .gnu.linkonce.s sections generated by C++. - -Thu Sep 23 07:13:45 1999 Jerry Quinn - - * config/tc-hppa.c (pa_ip): Replace 'B', 'M', 'l' and 'g' handling - with cleaner code using completer prefixes. Add 'Y'. - - * config/tc-hppa.c (pa_ip): Add parens to silence compiler. - -Wed Sep 22 09:37:19 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip): Avoid ANSI specific initialization. - (pa_ip, case 'm'): Failure to get a CBIT specifier just means the - insn does not match and we should try the next insn in the table. - -1999-09-22 Nick Clifton - - * config/tc-arm.c (MULTI_SET_PSR): Rename to LDM_TYPE_2_OR_3. - -Mon Sep 20 04:01:41 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip): Fix thinkos in recent cleanup - of PA2.0 support. - -1999-09-19 Alexandre Oliva - - * config/tc-i386.c (md_shortopts): Check OBJ_MAYBE_ELF as well as - OBJ_ELF. If ELF, add "sq". - (md_parse_option): If ELF, ignore -s and -q. - (md_show_usage): Mention ELF options. - -Sun Sep 19 10:43:31 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip): Handle 'J', 'K' and 'cc' - operands. - - * config/tc-hppa.c (pa_ip); Handle "fe", and 'cJ'. - - * config/tc-hppa.c (pa_ip): Handle 'd', '#' and 'cq'. - - * config/tc-hppa.c (struct pa_it): New field "trunc". - (pa_ip): Hadnle 'h', 'm', '=', '{', and '_' operands. - (pa_parse_ftest_gfx_completer): New function - (pa_parse_fp_cnv_format): New function. - - * config/tc-hppa.c (pa_ip): Handle 'X' operand. - (md_apply_fix): Handle 22bit pc-rel branches. - - * config/tc-hppa.c (pa_ip): Handle 'B' operand. - - * config/tc-hppa.c (pa_ip): Handle 'L' and 'M' operands. - - * config/tc-hppa.c (pa_ip): Handle 'l' operand. - - * config/tc-hppa.c (pa_ip): Handle 'g' operand. - -at Sep 18 12:13:28 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (md_assemble): Fix dwarf2 line handling. - (pa_ip): Handle 'fX'. - -Sat Sep 18 12:13:28 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (md_assemble): Fix dwarf2 line handling. - (pa_ip): Handle 'fX'. - -Fri Sep 17 11:57:34 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_build_unwind_subspace): Do not build - unwinds unless the function is in the text space. - (pa_type_args): Set BSF_FUNCTION for an exproted data symbol. - -Wed Sep 15 05:14:32 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip): Move dwarf2 stuff from here. - (md_assemble): To here. Tweak address generation. - - * config/tc-hppa.c: Include dwarf2dbg.h if OBJ_ELF. Declare - debug_line. - (md_pseudo_table): Add .file and .line pseudo-ops for OBJ_ELF. - (md_assemble): Call dwarf2_where for OBJ_ELF. - (pa_ip): Call dwarf2_gen_line_info for OBJ_ELF. - (pa_end_of_source): New function. - * tc-hppa.h (md_end): Define for OBJ_ELF. - -1999-09-14 Michael Meissner - - * configure.in (Canonicalization of target names): Remove adding - ${CONFIG_SHELL} in front of $ac_config_sub, since autoconfig 2.14 - generates $ac_config_sub with a ${CONFIG_SHELL} already. - * configure: Regenerate. - -1999-09-14 Donn Terry - - * config/te-interix.h (GLOBAL_OFFSET_TABLE_NAME): Define. - -1999-09-13 Alan Modra - - * config/tc-i386.c (md_assemble): Handle "jmp/call constant" as a - pc-relative jmp/call to an absolute symbol. - (md_apply_fix3): When OBJ_ELF, don't add the values in twice for - absolute section symbols. - - * config/tc-i386.c (md_assemble): Correct frag_var size. Tidy - jump handling code and comments. - -1999-09-12 Ian Lance Taylor - - * config/tc-i386.c (md_apply_fix3): Add horrible adjustments to - the value if TE_PE and a global defined symbol. - -1999-09-11 Ian Lance Taylor - - * write.c (dump_section_relocs): Call print_symbol_value_1 to - print the symbol, rather than printing it here. - -1999-09-11 Donn Terry - - * config/tc-i386.c (tc_i386_fix_adjustable): Don't adjust - BFD_RELOC_RVA relocations. - - * config/tc-i386.c (md_undefined_symbol): Compare the name against - the macro GLOBAL_OFFSET_TABLE_NAME, rather than assuming that it - starts with "_G". - - * write.c (write_relocs): Call SET_SECTION_RELOCS if it is - defined. - * config/obj-coff.h (SET_SECTION_RELOCS): Define. - * doc/internals.texi (Object format backend): Document - SET_SECTION_RELOCS. - - * config/tc-i386.c (tc_i386_fix_adjustable): Don't adjust - relocations against global symbols if TE_PE. - - * config/obj-coff.c (obj_coff_ident): Add BFD_ASSEMBLER version. - (obj_pseudo_table): Always handle ".ident" with obj-coff_ident. - - * config/obj-coff.c (coff_frob_symbol): Prohibit weak common - symbols. - - * config/obj-coff.c (obj_coff_endef): Don't merge labels, or - symbols which do not have a constant value, or tags with - non-tags. Remove the symbol from the list before adding it at the - end. - - * config/obj-coff.c (obj_coff_endef) [BFD_ASSEMBLER]: Handle .ef - C_FCN symbol differently if TE_PE. - (obj_coff_line) [BFD_ASSEMBLER]: Always use the line number which - appears in the pseudo-op, rather coff_line_base which is only set - for a .bf symbol. - - * config/obj-coff.c (obj_coff_loc): New static function. - (obj_pseudo_table): Add "loc". - - * config/obj-coff.c (add_lineno): Check that the line number is - positive. - - * config/atof-ieee.c (atof_ieee): Change what_kind to int. - * config/atof-vax.c (flonum_gen2vax): Change format_letter to - int. - (md_atof): Return NULL rather than 0. - * config/tc-i386.c (md_atof): Change type to int. - * expr.c (expr): Change first parameter to int. - * config/obj-coff.c: Add declarations for static functions. - (coff_frob_symbol): Use SYM_AUXENT. - * config/tc-i386.h (flag_16bit_code): Don't declare. - - * config/obj-coff.c (obj_coff_section): Default to setting - SEC_LOAD. Don't set SEC_DATA for 'w' modifier. - - * write.c (adjust_reloc_syms): Print adjusted fixup. - - * expr.c (integer_constant): Correct too_many_digits calculation - in base 10 case. - -1999-09-09 Andreas Schwab - - * doc/c-arm.texi: Fix arguments of @var to not contain - punctuation. - -1999-09-08 Philip Blundell - - * config/tc-arm.c (s_thumb_set): Only support interworking for ELF - and COFF targets. - (md_parse_option): Only support -k flag for ELF and COFF targets. - -Tue Sep 7 13:28:59 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip): Put strict register checks before - call to pa_parse_number. - - * config/tc-hppa.c (pa_ip): Support 'Z' argument. - -1999-09-06 Ian Lance Taylor - - * config/obj-coff.c: Add ATTRIBUTE_UNUSED as needed for - BFD_ASSEMBLER code. - -1999-09-06 Donn Terry - - * as.c (perform_an_assembly_pass): Set SEC_DATA for data_section. - -Mon Sep 6 04:26:56 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip): Get strict/non-strict mode from the - candidate instruction. Require registers for register arguments - when in strict mode. Require assemble-time constants for - constants when in strict mode. - (pa_get_absolute_expression): Require a constant when in strict - mode. - -1999-09-06 Nick Clifton - - * config/tc-m32r.c (md_longopts): Fix value for -Wnuh. - -1999-09-04 Steve Chamberlain - - * config/tc-pj.c: New file, supports picoJava in ELF. - * config/tc-pj.h: Ditto. - * configure.in (pjl*, pj*): New targets. - * Makefile.am: Rebuild dependencies. - (CPU_TYPES): Add pj. - (TARGET_CPU_CFILES): Add config/tc-pj.c. - (TARGET_CPU_HFILES): Add config/tc-pj.h. - * doc/c-pj.texi: New file. - * doc/as.texinfo: Add some PJ specifics. - * doc/all.texi: Add PJ to the list of all architectures, sort them - all alphabetically. - * doc/Makefile.in (CPU_DOCS): Add c-pj.texi. - * configure, Makefile.in, doc/Makefile.in: Rebuild. - -1999-09-02 Alan Modra - - * config/obj-multi.h: Include obj-elf.h if OBJ_MAYBE_ELF. Reformat. - (obj_frob_file): Test for null pointer. - (OBJ_COPY_SYMBOL_ATTRIBUTES): Here too. - (OBJ_PROCESS_STAB): And here. - (elf_obj_sy): Remove - - * config/obj-elf.h: #ifndef everything defined in obj-multi.h, - except OBJ_PROCESS_STAB, which we #undef for ecoff. - (elf_obj_sy): Remove #ifndef OBJ_SYMFIELD_TYPE. - - * config/obj-coff.c (no_func): Remove. - (coff_format_ops): Change occurrences of no_func to 0, as we test - for 0 in obj-multi.h. - - * configure.in: Enable bfd for i386-coff when primary target is - bfd. Enable i386 elf,coff emulation support. Don't set - USE_EMULATIONS=1 or te_file=multi unless there is more than one - emulation to support. - *configure: Regenerate. - -1999-09-02 Nick Clifton - - * config/tc-mcore.c (mcore_s_section): Do not dump literals if a - .section .line directive is encountered. - -1999-09-01 Nick Clifton - - * config/tc-arm.c (md_section_align): Do not align sections in ELF - format. - - * as.c (show_usage): Add --gdwarf2 to list of options displayed. - * as.texinfo: Document --gdwarf2 command line option. - Add additional documentation of ARM command line switches. - -1999-08-30 Alan Modra - - * config/tc-i386.c (i386_intel_memory_operand): Combine - i386_is_reg and parse_register calls. Remove END_STRING_AND_SAVE - and RESTORE_END_STRING around parse_register calls. - (i386_operand): Here too. - (i386_is_reg): Remove. - (parse_register): Move as_bad calls from within this function to - callers. - -1999-08-29 Alan Modra - - Based on a patch from H.J. Lu - * config/tc-i386.c (parse_register): Handle FP regs specially. - (md_begin): Remove '(' and ')' from register_chars. - -1999-08-29 Doug Evans - - * config/tc-m32r.c (md_parse_option): Delete unrecognized option - error message (done elsewhere). - -Sat Aug 28 01:23:11 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip): Do not allow '*' in 32bit completers. - -Sat Aug 28 00:26:26 1999 Jerry Quinn - - * config/tc-hppa.c (pa_ip): Replace 'f' by 'v'. Prefix float register - args by 'f'. - - * config/tc-hppa.c (pa_ip): Add args q, %, and |. - - * config/tc-hppa.c (pa_ip): Absorb white space in instructions - between args. - Add new completers. Fix bug in 64 bit condition handling. - - * config/tc-hppa.c (pa_ip): Add completer codes 'a', 'ch', 'cH', - 'cS', and 'c*'. - - * config/tc-hppa.c (pa_ip): Place completers behind prefix 'c'. - - * config/tc-hppa.c (pa_ip): Add cases for '.', '~'. '$'. and '!' - - * config/tc-hppa.c (pa_ip): Add case for 'I'. - -1999-08-27 Jim Wilson - - * dwarf2dbg.c (MAX_SPECIAL_ADDR_DELTA): Correct typo in comment. - (struct ls): Add frag field. Initialize it to zero. - (out_end_sequence): New local text_frag. Set it while in text section. - Replace address check with frag check. Set ls.frag to text_frag if - out_set_addr called. - (dwarf2_gen_line_info): Add explanatory comment. New local saved_frag. - Set it before switching sections. Replace address check with frag - check. Set ls.frag to saved_frag if out_set_addr called. - -1999-08-26 David Mosberger - - * dwarf2dbg.c (out_end_sequence): If address changed, directly - output "advance_pc" opcode instead of calling gen_addr_line(). - The latter has the undesired side-effect of creating a new row - in the debug line info matrix. - -1999-08-26 Jim Wilson - - * dwarf2dbg.c (out_end_sequence): Correct comments. Set last to - ls.last_filename if last is less than zero. Set ls.last_filename - when allocating new entry. - (dwarf2_gen_line_info): Save seg and subseg info before subseg_new - call. - -1999-08-20 Alan Modra - - * config/tc-i386.c (i386_index_check): Fix the displacement size - when INFER_ADDR_PREFIX. - -1999-08-18 Nick Clifton - - * config/tc-arm.c (md_apply_fix3): If an offset is invalid, - display its value. - -1999-08-17 Ian Lance Taylor - - * config/tc-ppc.c (md_assemble): Trim @ha constant to 16 bits, to - handle 0xffffNNNN constants correctly. - -1999-08-16 Nick Clifton - - * config/tc-arm.c (do_ldst): Look for register conflicts on stores - as well as loads. - -1999-08-13 Nick Clifton - - * config/tc-arm.c (validate_offset_imm): Work on unsigned values. - (md_apply_fix3): Always pass positive values to - validate_offset_imm. - -1999-08-12 Nick Clifton - - * config/tc-arm.c (skip_whitespace): New macro. - Formatting tidy ups. - - (md_apply_fix3): Store relocation offset in addend for ELF based - relocs. - (arm_force_relocation): Always generate relocs for Thumb function - calls. - -1999-08-11 Alan Modra - - * config/tc-i386.c (md_assemble): Remove dead code. intel_syntax - LONG_DOUBLE_MNEM_SUFFIX floating point is done in opcode/i386.h - -Tue Aug 10 12:58:31 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_build_unwind_subspace): Use sane section - flags for the unwind subspace. - - * config/tc-hppa.c (UNWIND_SECTION_NAME): Define for ELF. - (pa_build_unwind_subspace): Remove #if 0 wrapper. Select a - suitable relocation based on the size of the target's pointer. - Always Use subsegment zero for the unwinders. - (pa_level): Handle "2.0w". - -Mon Aug 9 20:02:22 1998 J"orn Rennecke - - * config/tc-d30v.c (write_2_short): Don't group repeat instructions - with the following instruction unless this was specified. - -1999-08-09 Ian Lance Taylor - - * config/tc-i386.h (SUB_SEGMENT_ALIGN): If TE_GO32, return 4 for - certain sections, to match BFD changes. - -1999-08-08 Mumit Khan - - * Makefile.am (noinst_SCRIPTS): Change .gdbinit to $(GDBINIT). - (EXTRA_SCRIPTS): Define to keep automake happy. - * Makefile.in: Rebuild. - -1999-08-08 Ian Lance Taylor - - * Makefile.am: Rename .dep* files to DEP*. - (MKDEP): Rename from DEP. Change all uses. Use $${srcdir} rather - than $(srcdir). Rename TCDEP targets to DEPTC. Rename OBJDEP - targets to DEPOBJ. - * Makefile.in: Rebuild. - -1999-08-08 Jakub Jelinek - - * config/tc-sparc.c (sparc_ip): Allow assembly of %lo()+%reg. - -1999-08-08 Ian Lance Taylor - - * Makefile.am: Change all uses of itbl-test-ops to itbl-tops to - avoid problems on DOS filesystems. - * Makefile.in: Rebuild. - - * doc/as.texinfo (Section): Document 's' flag for COFF version. - -1999-08-08 Mumit Khan - - * config/obj-coff.c (obj_coff_section): Handle 's' (shared) - section flag. - -1999-08-08 Ian Lance Taylor - - * configure.in: Define and substitute GDBINIT. Change AC_OUTPUT - line to create ${GDBINIT} rather than .gdbinit. - * configure, Makefile.in, doc/Makefile.in: Rebuild. - -Fri Aug 6 12:12:44 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip, case '?'): Add missing break. - -Fri Aug 6 09:46:35 1999 Jerry Quinn - - * config/tc-hppa.c (pa_ip): Add 64 bit condition completers. - -1999-08-06 Jakub Jelinek - - * config/tc-sparc.h (tc_fix_adjustable): Fix check for PIC local - non-adjustable symbols. - -Thu Aug 5 16:52:51 1999 Jerry Quinn - - * config/tc-hppa.c (pa_ip): Change condition args to have '?' prefix. - -Thu Aug 5 23:05:56 1999 J"orn Rennecke - - * config/tc-sh.c (md_assemble): Call as_bad when there are excess - operands. - -1999-08-05 Donn Terry - - * config/te-interix.h: New file. - * configure.in (i386-*-interix*): New target. - * configure: Rebuild. - -Wed Aug 4 13:12:17 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_chk_field_selector): Allow 3 byte - selectors for ELF too. - (selector_table): Add "ltp" and "rtp" selectors. - -1999-08-04 Alan Modra - - * config/tc-i386.c (i386_operand): No need to change - operand_string pointer in segment reg case before goto - do_memory_reference. Initialise displacement_string_start and - displacement_string_end after do_memory_reference label. - (i386_index_check): Add operand_string param, and print error - message on failure here. - (i386_intel_memory_operand): Instead of here. - (i386_operand): And here. - (INFER_ADDR_PREFIX): Enable. - - * doc/c-i386.texi (i386-16bit): Document .code16gcc. - - * config/tc-i386.h (DefaultSize): Define. Renumber following - opcode_modifier defines. - - From Etienne Lorrain - * config/tc-i386.c (stackop_size): New variable. - (set_16bit_code_flag): Clear it here. - (set_16bit_gcc_code_flag): New function. - (md_pseudo_table): Add "code16gcc" entry. - (md_assemble): Set i.suffix for insns with DefaultSize modifier. - -1999-08-03 Ian Lance Taylor - - * config/obj-coff.c (coff_frob_symbol): Always update set_end with - next_set_end even if the end symbol is being discarded. - - * gasp.c: Add ATTRIBUTE_UNUSED as needed for non-BFD_ASSEMBLER. - * output-file.c, symbols.c, config/tc-i386.c: Likewise. - * config/obj-coff.c: Likewise. - (seg_info_type): Remove. - (seg_info_off_by_4): Change to array of segT. - (s_get_segment): Adjust accordingly. - (obj_pseudo_table): Fully initialize sentinel entry. - - * config/tc-mips.c (append_insn): Correct INSN_SYNC test. From - Ralf Baechle . - -1999-08-03 Etienne Lorrain - - * config/tc-i386.c (f16_3): New. Fixes 16 bit 3 byte nop. - -1999-08-03 Alan Modra - - * config/tc-i386.c: Indentation and white space changes. - (i386_index_check): New function. Add INFER_ADDR_PREFIX code, but - don't enable it by default. - (i386_intel_operand): Remove redundant prototype. - Move check on number of memory operands, and i.mem_operands++ - (i386_intel_memory_operand): To here. - Remove i386_immediate code from here. Remove special case code - for input and output using (%dx). Remove base/index checks and - call i386_index_check instead. Save initial operand_string - argument for error message. - (i386_operand): Remove redundant prototype. Move base/index - checks to i386_index_check. - (i386_displacement): Move intel mode check for non-zero - i.disp_operand - (i386_intel_memory_operand): To here. - -1999-07-30 Jakub Jelinek - - * config/tc-sparc.c (md_longopts): Add --no-undeclared-regs option. - (sparc_ip): Warn if %g2 or %g3 register is used and not covered - by .register pseudo-op if -64 and --no-undeclared-regs. - (s_register, sparc_adjust_symtab): New functions. - * config/tc-sparc.h (tc_adjust_symtab, sparc_adjust_symtab): - Declare sparc_adjust_symtab as tc_adjust_symtab. - * doc/c-sparc.texi: Add description of #ignore special literal - for .register pseudo-op. - -1999-07-30 Catherine Moore - - * config/tc-arm.c (tc_gen_reloc): Record the vtable entry in - the relocation's section offset. - -1999-07-29 Alan Modra - - * write.c (fixup_segment): Fix generic error check overflow test. - - * config/tc-i386.c (pe): Change %d to %ld, %x to %lx, and cast - X_add_number to long. - -Wed Jul 28 02:04:24 1999 "Jerry Quinn" - - * config/tc-hppa.c (pa_ip): Add 'J' and 'K' code - processing. - -1999-07-27 Ian Lance Taylor - - * config/tc-sparc.h (tc_fix_adjustable): Don't adjust GOT, PLT, or - VTABLE relocations. - -1999-07-21 Mark Elbrecht - - * config/te-go32.h (COFF_LONG_SECTION_NAMES): Define. - - * configure.bat: Remove; obsolete. - * config/go32.cfg: Likewise. - -1999-07-21 Brad M. Garcia - - * configure.in (i386-*-vxworks*): New target. - * configure: Rebuild. - -1999-07-16 Jakub Jelinek - - * doc/c-sparc.texi: Document .register and .nword pseudo-ops. - -1999-07-16 Jakub Jelinek - - * config/tc-sparc.c (sparc_ip): Allow OLO10 relocations - on -64 and not pic. - (output_insn): Put OLO10's secondary addend into tc_fix_data. - (md_apply_fix3): Handle BFD_RELOC_SPARC_OLO10. - (tc_gen_reloc): Return two relocs for OLO10, LO10 and SPARC13. - * config/tc-sparc.h (RELOC_EXPANSION_POSSIBLE, - MAX_RELOC_EXPANSION): Define. - (TC_FIX_TYPE, TC_INIT_FIX_DATA, TC_FIX_DATA_PRINT): Likewise. - -1999-07-16 Alan Modra - - * config/tc-i386.c (intel_float_operand): Add prototype, make static. - (md_assemble): Localize *exp variable to if (fake_zero_displacement) - block. Print a warning if an 8-bit or 16-bit constant - displacement or immediate is truncated on output. - (i386_immediate): Ensure Imm16 is always legal for a 16-bit mode - immediate. - (i386_operand): Disallow immediate jump absolute operand. - -1999-07-15 Ian Lance Taylor - - * configure.in: Bump version number to 2.9.5. - * configure: Rebuild. - - * dwarf2dbg.c (dwarf2_gen_line_info): Don't assume that long long - or %llx work. - -Thu Jul 15 02:45:30 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (md_pseudo_table): Add ".dword" pseudo-op. - (cons_fix_new_hppa): Derive size of fixup from size of the object. - -1999-07-14 Philip Blundell - - * symbols.c (dollar_label_name): Prepend LOCAL_LABEL_PREFIX if it - is defined. - * config/tc-arm.h (LOCAL_LABEL_PREFIX): Define to '.' for ELF. - - * config/tc-arm.c (md_begin): Set F_SOFTFLOAT in the output file - if -mno-fpu was given. - (tc_gen_reloc): Fix typo. Delete bogus code related to GOTPC - relocs. - (cons_fix_new_arm): Remove misleading comments. - -1999-07-14 Ian Lance Taylor - - * write.c (cvt_frag_to_fill): Use frag file and line in rs_org - error message. - (relax_segment): Likewise. After giving a rs_org error, convert - the frag to rs_align to avoid cascading errors. - -1999-07-12 Andreas Schwab - - * config/tc-m68k.c: Add some ATTRIBUTE_UNUSED. - -1999-07-11 Ian Lance Taylor - - * Many files: Changes to avoid gcc warnings: Add ATTRIBUTE_UNUSED - as appropriate. Fill in structure initializations. Add variable - initializations. Add casts. - * dwarf2dbg.c (print_stats): Change i to size_t. - * listing.c (listing_listing): Change list_line to unsigned int. - -1999-07-10 Ian Lance Taylor - - * config/tc-ppc.h (tc_fix_adjustable) [OBJ_ELF]: Call S_IS_LOCAL - rather than checking for \001 and \002 in symbol name. - * config/tc-sparc.h (tc_fix_adjustable) [OBJ_ELF]: Likewise. - -Thu Jul 8 12:32:23 1999 John David Anglin - - * configure.in (hppa*-linux-gnu*): New target. - * configure: Rebuilt. - -1999-07-08 Nick Clifton - - * doc/c-arm.texi (ARM Directives): Document .thumb_set directive. - -1999-07-07 Nick Clifton - - * config/tc-v850.c (v850_comm): Use symbol_get_obj() rather than - accessing symbolP directly. - -Tue Jul 6 10:41:42 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.h (tc_frob_symbol): Always punt "$global$" symbol - for ELF. - -1999-07-05 Nick Clifton - - * config/tc-arm.c (ARM_EXT_V5): Define. - (ARM_ARCH_V5, ARM_ARCH_V5T): Define. - (md_begin): Detect ARM v5 architectures. - (md_parse_option): Accept arm v5 specification. - (md_show_usage): Documment -marmv5 switch. - - * doc/c-arm.texi: Document -marmv5 command line option. - - * config/tc-arm.c (do_adrl): New function. Implement ADRL pseudo - op. - (validate_immediate_twopart): New function. Determine if a - constant can be computed by two ADD instructions. - (output_inst): Remove its command line parameter - it was never - used. - (md_apply_fix3): Support BFD_RELOC_ARM_ADRL_IMMEDIATE, used to - implememt the ADRL pseudo op. - (tc_gen_reloc): Generate a suitable error message if an ADRL - instruction tries to generate a real reloc. - - * doc/c-arm.texi: Document NOP, ADR and ADRL pseudo ops. - -Thu Jul 1 15:33:10 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip): Convert the opcode and all completers - into lower case. - -1999-06-27 H.J. Lu - - * subsegs.c (subseg_text_p): Use 1/0 instead of true/false for - non BFD_ASSEMBLER case. - -1999-06-26 Mumit Khan - - * config/obj-coff.c (obj_coff_section): Mark writable sections as - data. - -1999-06-26 David Mosberger - - * dwarf2dbg.c (dwarf2_gen_line_info): Don't call - out_end_sequence() when the address decreases due to a new frag. - (gen_dir_list): Set ls.file[i].dir to j + 1 (not j) because file - numbering starts with 1. - -1999-06-23 Nick Clifton - - * config/tc-mcore.c (md_pseudo_table): Add .comm for ELF and allow - .section for COFF. - (mcore_s_text): Call obj_elf_text for ELF target. - (mcore_s_data): Call obj_elf_data for ELF target. - (mcore_s_section): No longer ELF specific. Call obj_coff_section - for COFF target. - (mcore_s_bss): New function: Dump literal table before changing - sections. - (mcore_s_comm): New function: Dump literal table before changing - sections. - - * config/obj-elf.c (obj_elf_common, obj_elf_data, obj_elf_text): - No longer static functions. - * config/obj-elf.h (obj_elf_common, obj_elf_data, obj_elf_text): - Provide prototypes for these functions. - -1999-06-22 Ian Lance Taylor - - * subsegs.c (subseg_text_p): Rewrite non BFD_ASSEMBLER case to use - a list of names, to try obj_segment_name, and to try abbreviated - names when using COFF without long section names. - - * config/tc-alpha.c: More use of symbol accessor functions. - * config/tc-arc.c: Likewise. - * config/tc-d30v.c: Likewise. - * config/tc-fr30.c: Likewise. - * config/tc-i860.c: Likewise. - * config/tc-m88k.c: Likewise. - * config/tc-mcore.c: Likewise. - * config/tc-ns32k.c: Likewise. - * config/tc-sparc.c: Likewise. - * config/tc-v850.c: Likewise. - - * config/tc-arc.c (get_arc_exp_reloc_type): Change uses of - sy_value with appropriate accessor functions. - * config/tc-arm.c (md_apply_fix3): Likewise. - * config/tc-d10v.c (AT_WORD_P): Likewise. - * config/tc-v850.c (reg_name_search): Likewise. - - * config/obj-ecoff.c (obj_ecoff_set_ext): Change uses of bsym to - use symbol_get_bfdsym instead. - * config/tc-ppc.c (md_assemble): Likewise. - * config/tc-v850.c (v850_comm): Likewise. - -1999-06-22 Jonathan Larmour - - * config/tc-arc.c (tc_gen_reloc): Use symbol_get_bfdsym to get at - the symbol, rather than accessing the bsym member. - * config/tc-d10v.c (tc_gen_reloc): Likewise. - * config/tc-d30v.c (tc_gen_reloc): Likewise. - * config/tc-mcore.c (tc_gen_reloc): Likewise. - * config/tc-mn10200.c (tc_gen_reloc): Likewise. - * config/tc-mn10300.c (tc_gen_reloc): Likewise. - * config/tc-ns32k.c (tc_gen_reloc): Likewise. - * config/tc-tic30.c (tc_gen_reloc): Likewise. - * config/tc-v850.c (tc_gen_reloc): Likewise. - -Mon Jun 21 16:45:19 1999 Jeffrey A Law (law@cygnus.com) - - * tc-hppa.c (elf_hppa_reloc_type): Renamed from elf32_hppa_reloc_type. - (hppa_gen_reloc_type): Conditionalize on BFD64. - (tc_gen_reloc): Re-enable ELF relocations. - * tc-hppa.h (TARGET_FORMAT): Handle elf64-hppa format. - -1999-06-21 Ian Lance Taylor - - * config/tc-arm.c (ldst_extend): Add parentheses to avoid - warning. - (do_ldst): Move assignment out of if condition. - (md_apply_fix3): Add casts to avoid printf format warnings. Add - parentheses to avoid warning. - -1999-06-21 Nick Clifton - - * config/tc-arm.c (arm_adjust_symtab): Use symbol_get_bfdsym() - macro to get at the BFD symbol associated with a GAS symbol. - -1999-06-19 Ian Lance Taylor - - * config/tc-ppc.c: Update for symbol handling changes. - * config/obj-coff.c: Likewise. - -Fri Jun 18 14:34:18 1999 Jeffrey A Law (law@cygnus.com) - - * tc-hppa.c: General cleanups of ELF support. No more spaces - and subspaces for ELF. - (GDB_DEBUG_SPACE_NAME): Delete definition for ELF. - (GDB_STRINGS_SUBSPACE_NAME): Likewise. - (GDB_SYMBOLS_SUBSPACE_NAME): Likewise - (UNWIND_SECTION_NAME): Likewise. - (space/subspace related structures): Conditionalize definitions - on OBJ_SOM. - (space/subspace directives and support routines): Conditionalize - definitions and references/uses on OBJ_SOM. - (label_symbol_struct): For ELF, track the symbol's segment. For - SOM track its space. - (pa_define_label, pa_undefine_label, pa_get_label): Corresponding - changes. - (USE_ALIASES): Kill for both SOM & ELF. - (pa_def_subspaces, pa_def_spaces): Corresponding changes. - (pa_space, pa_subspace): Corresponding changes. - (pa_spaces_begin): Corresponding chagnes. - (md_begin): Do not muck around with space/subspace stuff for - OBJ_ELF. - (md_apply_fix): Temporarily disable argument relocation stuff - for OBJ_ELF. - (tc_gen_reloc): Temporarily disable relocation generation for - OBJ_ELF - (pa_build_unwind_subspace): Similarly. - -1999-06-16 Nick Clifton - - * config/tc-arm.c (thumb_set): New pseudo op. - (text, data, section): Override these pseudo ops with ARM - specific versions. - (s_thumb_set): New function: Perform the same as a .set pseudo - op, but also mark the alias'ed symbol as being a Thumb - function. - (arm_s_text): New function: Perform the same as the .text - pseudo op, but dump the literal pool before changing - sections. - (arm_s_data): New function: Perform the same as the .data - pseudo op, but dump the literal pool before changing - sections. - (arm_s_section): New function: Perform the same as the - .section pseudo op, but dump the literal pool before changing - sections. - (arm_cleanup): Do not reset the current section before dumping - the literal pool. - -1999-06-17 Nick Clifton - - * config/tc-m32r.c (md_longopts): Fix OPTION_WARN_UNMATCHED and - OPTION_NO_WARN_UNMATCHED entries. - (md_parse_option): Generate a warning message if an unrecognised - option is encountered. - - * config/tc-d10v.c (do_not_ignore_hash): New variable. - (get_operands): When parsing an expression after an '@' symbol - has been detected, do not ignore '#' symbols. - (md_operand): Only ignore '#' symbols if do_not_ignore_hash is - false. - -1999-06-13 Ian Lance Taylor - - From K. Richard Pixley : - * configure.in (ppc-*-vxworks*): New target. - * configure: Rebuild. - -1999-06-12 Philip Blundell - - * config/tc-arm.c (tc_gen_reloc): Fix handling of GOTPC relocs. - -1999-06-13 Ian Lance Taylor - - * write.c (adjust_reloc_syms): Rather than never reducing reloc - which refer to symbols in linkonce sections, permit reducing the - relocs if the symbol is local. - -1999-06-12 Ian Lance Taylor - - * subsegs.c (subseg_text_p): New function. - * as.h (subseg_text_p): Declare. - * read.c (do_align): Use subseg_text_p to set the default fill. - * write.c (subsegs_finish): Likewise. - * config/obj-coff.c (write_object_file): Likewise. - * config/tc-i386.h (md_maybe_text): Don't define. - (md_do_align): Use subseg_text_p to set the default fill. - * config/tc-m32r.c (m32r_do_align): Likewise. - * config/tc-sh.c (sh_do_align): Likewise. - * config/tc-sparc.h (md_do_align): Likewise. - -1999-06-12 David O'Brien - - * configure.in: (i[3456]86-*-freebsd*): Now defaults to ELF. - * configure: Rebuild. - -1999-06-12 Ian Lance Taylor - - * dwarf2dbg.c: Include elf/dwarf2.h with "", not <>. - * Makefile.am: Rebuild dependencies. - * Makefile.in: Rebuild. - - * config/tc-i386.c (i386_immediate): Remove unused label - seg_unimplemented. - - * struc-symbol.h: Put local_symbol code in ifdef BFD_ASSEMBLER. - * symbols.c: Likewise. - * config/obj-aout.c (obj_crawl_symbol_chain): Refer directly to - sy_next field when taking address, rather than symbol_next. - - * dwarf2dbg.c: Change bfd_vma to addressT and bfd_signed_vma to - offsetT. - (out_set_addr): Don't use BYTES_PER_ADDRESS. Instead, get the - value from the output file architecture. - (dwarf2_gen_line_info): Ifdef BFD_ASSEMBLER specific code. - * dwarf2dbg.h: Change bfd_vma to addressT. - -1999-06-11 Ian Lance Taylor - - * dwarf2dbg.h: Use PARAMS in function declarations. - -1999-06-11 Martin Dorey - - * write.c (fixup_segment): Don't add symbol value for i960 ELF. - * config/tc-i960.c (s_leafproc): Don't call tc_set_bal_of_cal if - OBJ_ELF. - (md_apply_fix): Simplify BFD_ASSEMBLER handling. - -1999-06-11 Ian Lance Taylor - - * config/tc-i386.c (md_apply_fix3): Add default case to switch. - - * config/tc-sparc.c (md_pseudo_table): Remove pushsection and - popsection. - - * config/tc-sparc.c (sparc_ip): Add default case to reloc switch. - - * read.c (read_a_source_file): Only declare inescape if - QUOTES_IN_INSN. - - * itbl-ops.c (itbl_disassemble): Change sprintf format strings to - match parameters. - (find_entry_byval): Add parens to avoid warning. - - * as.c: If HAVE_ITBL_CPU, include "itbl-ops.h". - - * symbols.c (resolve_symbol_value): Don't permit subtraction of - undefined symbols. - -1999-06-10 Jakub Jelinek - - * config/tc-sparc.c (sparc_ip): Don't use side-effect expression - with isoctal. - - * config/tc-sparc.c (synthetize_setuw, synthetize_setsw, - synthetize_setx): New functions. - (md_assemble): Broken the special cases into the above - functions. Make compiler happy if sizeof(bfd_vma)==4. - Fix sethi generated from set/setuw. If instructions have a relloc, - always clear the fields to be relocated in the opcode. - (sparc_ip): Remove special_case global variable. - -1999-06-10 Ian Lance Taylor - - Based on patches from John W. Woznack : - * itbl-ops.c (itbl_get_reg_val): Add pval parameter. Return - indication of success rather than a value. - (itbl_get_val): Likewise. - (itbl_get_field): Use strcspn. Change delimiters to include - parens. - * itbl-ops.h (itbl_get_reg_val): Update declaration. - (itbl_get_val): Likewise. - * config/tc-mips.c (mips_ip): Update call to itbl_get_reg_val. - - * symbols.c (copy_symbol_attributes): Convert local symbols to - regular symbols. - -1999-06-10 Nick Clifton - - * config/tc-arm.c (md_parse_option): Add support for ARM920 and - ARM920t. - -1999-06-07 Jakub Jelinek - - * config/tc-sparc.c (md_assemble): Fix up setx, support setsw. - Optimize set if sizeof(bfd_vma) == 64. - (sparc_ip): Fix sethi - without %hi() it should generate - R_SPARC_22 reloc, not R_SPARC_HI22. - (tc_gen_reloc): Handle BFD_RELOC_SPARC22. - -1999-06-07 Jakub Jelinek - - * config/tc-sparc.c (md_begin): Handle native wordsize aliases. - (s_ncons): New function. - (native_op_table): New table. - (sparc_ip): Be more strict on %hi() etc.; prepare assembler for - R_SPARC_OLO10 handling. - -Mon Jun 7 10:22:16 1999 Richard Henderson - - * expr.h (struct expressionS): Revert last change; widen X_op. - * config/tc-alpha.c (md_begin): Check the field is wide enough. - -Mon Jun 7 11:25:16 1999 Andreas Schwab - - * Makefile.am (TARGET_CPU_CFILES): Add config/tc-fr30.c. - (TARGET_CPU_HFILES): Add config/tc-fr30.h. - (TARG_ENV_HFILES): Add config/te-epoc-pe.h. - * Makefile.in: Regenerated. - - * config/obj-elf.c (obj_elf_common): In MRI mode if called as - `common' pass on to s_mri_common. - (elf_pseudo_table): Pass 1 to obj_elf_common for `common'. - -1999-06-06 Richard Henderson - - * config/obj-elf.c (obj_elf_section): Don't free the return - value of demand_copy_C_string. - -1999-06-05 Richard Henderson - - * dwarf2dbg.c (dwarf2_gen_line_info): Mirror the section symbol - creation logic from obj_elf_create_section. - - * config/obj-elf.c (elf_pseudo_tab): Add pushsection/popsection. - (section_stack): New. - (special_sections): Make const. - (obj_elf_section): Gut and rewrite parsing. - (obj_elf_change_section): New function broken out of obj_elf_section. - (obj_elf_parse_section_letters): Likewise. - (obj_elf_section_word): Likewise. - (obj_elf_section_type): Likewise. - (obj_elf_previous): Treat as a toggle. - (obj_elf_popsection): New. - * config/tc-ppc.c (ppc_section_word): Take str+len not ptr_str. - (ppc_section_type): Likewise. - * config/tc-ppc.h: Likewise. - - * expr.h (struct expressionS): Don't make X_op a bitfield. - * config/tc-alpha.c: Update for symbol handling changes. - (md_apply_fix) [case GPREL]: Use now_seg instead of absolute_section. - (load_expression, emit_ir_load, emit_loadstore, emit_jsrjmp): Likewise. - -1999-06-05 Richard Henderson - - * dwarf2dbg.c (*): Convert to K&R + prototypes. - (dwarf2_gen_line_info): Kill unused variables. - (dwarf2_finish): Likewise. - (dwarf2_where): Likewise. - (dwarf2_directive_file): If we've only got a string, - hand off to s_app_file. - * ecoff.c: Move the include of ecoff.h. - * symbols.h (S_IS_FUNCTION): Prototype. - - * read.c (LEX_HASH): Supply a default. - (lex_type): Use it. - (s_globl): Update `c' after skipping whitespace. - * read.h (LEX_END_NAME, is_name_ender): New. - * expr.c (get_symbol_end): Respect it. - -1999-06-04 Mark Klein - - * config/tc-hppa.c (md_begin): Convert local symbol dummy_symbol - to real if OBJ_SOM - (tc_gen_reloc): Still need bfd_abs_symbol in some relocs. - - * config/tc-hppa.c: Update for symbol handling changes. - -1999-06-03 Ian Lance Taylor - - * cgen.c: Update for symbol handling changes. - * config/tc-m32r.c: Likewise. - - * config/tc-hppa.h: Update for symbol handling changes. - * config/tc-hppa.c: Likewise. - - * config/tc-arm.h: Update for symbol handling changes. - * config/tc-arm.c: Likewise. - (symbol_make_empty): Remove. Just use symbol_create. - - * symbols.c (symbol_set_tc): Correct name. - - * Makefile.am: Rebuild dependencies. - ($(OBJS)): Don't depend upon struc-symbol.h. - (.dep1, .tcdep, .objdep): Create itbl-parse.h. - * dep-in.sed: Don't remove struc-symbol.h. - * Makefile.in: Rebuild. - - * doc/internals.texi (Symbols): Describe changes in symbol - handling. - -1999-06-03 Richard Henderson - - * dwarf2dbg.c (dwarf2_gen_line_info): Use section_symbol - instead of doing the work by hand. - -1999-06-03 David Mosberger - - * dwarf2dbg.c (INITIAL_STATE): New macro encapsulating initial - state of line state-machine. - (struct ls): Collect DWARF2 line state-machine state in new member - SM. Add member EMPTY_SEQUENCE to keep track if a code sequence - resulted in any DWARF2 directives. - (reset_state_machine): New function. - (out_end_sequence): Ditto. - (dwarf2_gen_line_info): When switching sections or switching to a - lower text address, call out_end_sequence() first to terminate the - previous code sequence as code sequences MUST have monotonically - increasing addresses. - (dwarf2_finish): Call out_end_sequence() instead of open coding it. - -1999-06-03 David Mosberger - - * as.c (parse_args): Add option -gdwarf2 to allow requesting - DWARF2 debug info (line information only, at this point). - * as.h: Update comment about supported debug formats. - * dwarf2dbg.c, dwarf2dbg.h: New files. - * Makefile.am (GAS_CFILES, HFILES, GENERIC_OBJS): Add them. - - * expr.c (operand): Don't use [ for parens if we want an index op. - (op_encoding): Switch [ into O_index, if desired. - (op_rank): Renumber with O_index on bottom. - (expr): If O_index, match closing bracket. - * expr.h (O_index): New. - - * read.c (read_a_source_file): Conditionally allow matched " - in lines passed to md_assemble. - - * config/obj-elf.c (elf_pseudo_table): Add `common'. - -1999-06-03 Ian Lance Taylor - - Add support for storing local symbols in a small structure to save - memory when assembling large files. - * as.h: Don't include struc-symbol.h. - (symbolS): Add typedef. - * symbols.c: Include struc-symbol.h. - (local_hash): New static variable. - (save_symbol_name): New static function, from symbol_create. - (symbol_create): Call save_symbol_name. - (local_symbol_count): New static variable. - (local_symbol_conversion_count): Likewise. - (LOCAL_SYMBOL_CHECK): Define. - (local_symbol_make): New static function. - (local_symbol_convert): New static function. - (colon): Handle local symbols. Create local symbol for local - label name. - (symbol_table_insert): Handle local symbols. - (symbol_find_or_make): Create local symbol for local label name. - (symbol_find_base): Check for local symbol. - (symbol_append, symbol_insert): Check for local symbols. - (symbol_clear_list_pointers, symbol_remove): Likewise. - (verify_symbol_chain): Likewise. - (copy_symbol_attributes): Likewise. - (resolve_symbol_value): Handle local symbols. - (resolve_local_symbol): New static function. - (resolve_local_symbol_values): New function. - (S_GET_VALUE, S_SET_VALUE): Handle local symbols. - (S_IS_FUNCTION, S_IS_EXTERNAL, S_IS_WEAK, S_IS_COMMON): Likewise. - (S_IS_DEFINED, S_IS_DEBUG, S_IS_LOCAL, S_GET_NAME): Likewise. - (S_GET_SEGMENT, S_SET_SEGMENT, S_SET_EXTERNAL): Likewise. - (S_CLEAR_EXTERNAL, S_SET_WEAK, S_SET_NAME): Likewise. - (symbol_previous, symbol_next): New functions. - (symbol_get_value_expression): Likewise. - (symbol_set_value_expression): Likewise. - (symbol_set_frag, symbol_get_frag): Likewise. - (symbol_mark_used, symbol_clear_used, symbol_used_p): Likewise. - (symbol_mark_used_in_reloc): Likewise. - (symbol_clear_used_in_reloc, symbol_used_in_reloc_p): Likewise. - (symbol_mark_mri_common, symbol_clear_mri_common): Likewise. - (symbol_mri_common_p): Likewise. - (symbol_mark_written, symbol_clear_written): Likewise. - (symbol_written_p): Likewise. - (symbol_mark_resolved, symbol_resolved_p): Likewise. - (symbol_section_p, symbol_equated_p): Likewise. - (symbol_constant_p): Likewise. - (symbol_get_bfdsym, symbol_set_bfdsym): Likewise. - (symbol_get_obj, symbol_set_obj): Likewise. - (symbol_get_tc, symbol_set_tc): Likewise. - (symbol_begin): Initialize local_hash. - (print_symbol_value_1): Handle local symbols. - (symbol_print_statistics): Print local symbol statistics. - * symbols.h: Include "struc-symbol.h" if not BFD_ASSEMBLER. - Declare new symbols.c functions. Move many declarations here from - struc-symbol.h. - (SYMBOLS_NEED_BACKPOINTERS): Define if needed. - * struc-symbol.h (SYMBOLS_NEED_BACKPOINTERS): Don't set. - (struct symbol): Move bsym to make it clearly the first field. - Remove TARGET_SYMBOL_FIELDS. - (symbolS): Don't typedef. - (struct broken_word): Remove. - (N_TYPE_seg, seg_N_TYPE): Move to symbol.h. - (SEGMENT_TO_SYMBOL_TYPE, N_REGISTER): Likewise. - (symbol_clear_list_pointers): Likewise. - (symbol_insert, symbol_remove): Likewise. - (symbol_previous, symbol_append): Likewise. - (verify_symbol_chain, verify_symbol_chain_2): Likewise. - (struct local_symbol): Define. - (local_symbol_converted_p, local_symbol_mark_converted): Define. - (local_symbol_resolved_p, local_symbol_mark_resolved): Define. - (local_symbol_get_frag, local_symbol_set_frag): Define. - (local_symbol_get_real_symbol): Define. - (local_symbol_set_real_symbol): Define. - Define. - * write.c (write_object_file): Call resolve_local_symbol_values. - * config/obj-ecoff.h (OBJ_SYMFIELD_TYPE): Define. - (TARGET_SYMBOL_FIELDS): Don't define. - * config/obj-elf.h (OBJ_SYMFIELD_TYPE): Add local field. If - ECOFF_DEBUGGING, add ECOFF fields. - (ELF_TARGET_SYMBOL_FIELDS, TARGET_SYMBOL_FIELDS): Don't define. - * config/obj-multi.h (struct elf_obj_sy): Add local field. If - ECOFF_DEBUGGING, add ECOFF fields. - (ELF_TARGET_SYMBOL_FIELDS, TARGET_SYMBOL_FIELDS): Don't define. - (ECOFF_DEBUG_TARGET_SYMBOL_FIELDS): Don't define. - * config/tc-mcore.h: Don't include struc-symbol.h. - (TARGET_SYMBOL_FIELDS): Don't define. - (struct mcore_tc_sy): Define. - (TC_SYMFIELD_TYPE): Define. - * Many files: Use symbolS instead of struct symbol. Use new - accessor functions rather than referring to symbolS fields - directly. - - * read.c (s_mri_common): Don't add in value of line_label. - - * config/tc-mips.c (md_apply_fix): Correct parenthesization when - checking for SEC_LINK_ONCE. - - * config/tc-sh.h (sh_fix_adjustable): Declare. - - * app.c (input_buffer): New static variable. - (app_push): Save saved_input in allocated buffer. - (app_pop): Restored saved_input. - (do_scrub_chars): Change get parameter to take char * and int as - arguments. Change GET macro to pass input_buffer to get - function. Don't save input into allocated buffer. - * as.h (do_scrub_chars): Update declaration. - * input-file.c (input_file_get): Change to take char * and int. - Read data into passed in buffer. Remove static buffer. - * read.c (scrub_from_string): Change to take char * and int. Copy - data into passed in buffer. - - * hash.h: Neaten. Declare hash_traverse. - * hash.c: Complete rewrite based on BFD hashing code. - * gasp.c (chunksize): New variable. - * macro.c (macro_expand_body): Call hash_jam with NULL rather than - hash_delete. - -1999-05-28 Nick Clifton - - * config/tc-arm.c (md_apply_fix3): Add pipeline offset into reloc - addend unless the target uses an old ABI. - -Mon May 24 13:36:55 1999 Doug Evans - - -Wchar-subscripts cleanup - * listing.c (listing_newline): Use unsigned char variable, so - calls to isascii,iscntrl are correct. - * atof-generic.c (atof_generic): Cast arg to isdigit, et. al. with - (unsigned char). - * ecoff.c (ecoff_directive_ent,ecoff_stab): Ditto. - * config/obj-elf.c (obj_elf_vtable_inherit): Ditto. - * config/tc-mips.c (mips_ip,mips16_ip): Ditto. - (my_getSmallExpression,get_number,s_mips_ent): Ditto. - -1999-05-28 Torbjorn Granlund - - * config/tc-m68k.c (m68k_ip): Check for disallowed index register - width for Coldfire. - (arch_coldfire_p): New #define. - (m68k_ip, m68k_init_after_args): Use arch_coldfire_p. - -1999-05-28 Linus Nordberg - - * config/tc-m68k.c (install_operand): Add places `n', `o'. - - * config/tc-m68k.c (m68k_ip): Add formats `E', `G', `H'. - (install_operand): Add place `N'. - (init_table): Add registers ACC, MACSR, MASK. - - * config/m68k-parse.h (m68k_register): Add ACC, MACSR, MASK. - - * config/tc-m68k.c: Change mcf5200 --> mcf. - (archs): Add mcf5206e, mcf5307. - (m68k_ip): Add format `u'. - (install_operand): Add place `m', `M', `h'. - (init_table): Add upper/lower registers. - - * config/m68k-parse.h (m68k_register): Add upper/lower registers. - -1999-05-28 Martin Dorey - - * config/tc-i960.c: Several minor changes to add ELF and - BFD_ASSEMBLER support. - * config/tc-i960.h: Likewise. - * configure.in (i960-*-elf*): New target. - * aclocal.m4, configure: Rebuild. - -1999-05-25 Alan Modra - - * config/tc-i386.c (md_apply_fix3): Only do 1999-05-17 fx_pcrel - reloc changes when defined(BFD_ASSEMBLER). - -1999-05-17 Alan Modra - - * config/tc-i386.c (tc_gen_reloc): Remove F and MAP macros. - - * write.c (write_print_statistics): Output to file, not stderr. - - * expr.c (generic_bignum_to_int32,64): Prototype. - - * read.c (s_lcomm_internal, sizeof_sleb128, sizeof_uleb128, - output_sleb128, output_uleb128, output_big_sleb128, - output_big_uleb128, output_big_leb128): Prototype. - (output_big_sleb128, output_big_uleb128): Make inline. - (output_big_leb128): Remove inline - - From Maciej W. Rozycki - * config/tc-i386.c (md_apply_fix3): Convert BFD_RELOC_16 with - fx_pcrel set to BFD_RELOC_16_PCREL. Similarly for BFD_RELOC_8. - Handle BFD_RELOC_16_PCREL and BFD_RELOC_8_PCREL. Return changed - value for correct overflow check in write.c:fixup_segment. - * write.c (fixup_segment): Move bitfield overflow checks to after - the md_apply_fix call. - * config/obj-coff.c (fixup_segment): Likewise. - * doc/internals.texi (CPU backend): Mention md_apply_fix modifying - valueT *val argument. - -Fri May 14 10:52:13 1999 Andreas Schwab - - * config/atof-ieee.c (gen_to_words): Correctly round a - denormalized number. Fix off-by-one in range checking for - exponent in a denormal. - -1999-05-10 Nick Clifton - - * config/tc-mcore.c (parse_reg): Accept 'sp' as a valid register - name. - -Thu May 13 09:46:59 1999 Joel Sherrill (joel@OARcorp.com) - - * configure.in (i386-*-rtemself*, sh-*-rtemself*): New targets. - -1999-05-12 Alan Modra - - * config/tc-i386.h (InvMem): New flag. Add to AnyMem. - (ReverseRegRegmem): Remove. - (ImmExt): New flag. Renumber some of the opcode_modifier bits. - * config/tc-i386.c (md_assemble): Test for PIII SIMD and AMD - 3DNow! via ImmExt opcode_modifier. Remove ReverseRegRegmem - kludge. - - From Doug Ledford - * config/tc-i386.h (RegXMM): New for P/III. - * config/tc-i386.c: Add support for P/III. - -Sat May 8 23:28:50 1999 Richard Henderson - - * config/tc-ppc.c (md_parse_option): Recognize -mppc64bridge. - (md_begin): Allow ppc32 insns in ppc64bridge mode. - (ppc_insert_operand): Accept SIGNOPT in ppc64 mode. - -Thu May 6 23:13:39 1999 Richard Henderson - - * config/tc-i386.c (i386_immediate): Skip whitespace before - complaining about junk after expression. - (i386_displacement): Likewise. - -Thu May 6 19:50:14 1999 Richard Henderson - - * symbols.c (symbol_find_base): Use memcpy instead of strcpy. - Don't copy before downcaseing. - -1999-05-05 Catherine Moore - - * tc-m68k.c: Include elf/m68k.h. - (m68k_elf_final_processing): New routine. - * tc-m68k.h (elf_tc_final_processing m68k_elf_final_processing): - Define. - -Mon May 3 10:26:03 1999 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (md_apply_fix): Handle 22 bit fmt insn like a - 17 bit fmt insn. - -1999-04-30 Nick Clifton - - * config/tc-mcore.c (mcore_s_section): Dump literals before - changing section. - -1999-04-29 Nick Clifton - - * config/tc-mcore.c (md_apply_fix3): Insert reloc addend into insn - for COFF/PE port. - -Mon Apr 26 12:34:37 1999 Doug Evans - - * config/tc-fr30.h (TC_FIX_TYPE): Delete, cgen fields moved to write.h. - (TC_INIT_FIX_DATA): Delete. - * config/tc-m32r.h (TC_FIX_TYPE): Delete, cgen fields moved to write.h. - (TC_INIT_FIX_DATA): Delete. - * write.h (struct fix): New member fx_cgen, ifdef USING_CGEN. - * write.c (fix_new_internal): Initialize fx_cgen member. - * cgen.c (gas_cgen_record_fixup,gas_cgen_record_fixup_exp): Update. - (gas_cgen_md_apply_fix3): Update. - * config/tc-m32r.c (md_cgen_lookup_reloc): Update. - (md_cgen_record_fixup_exp): Update. - (FX_OPINFO_R_TYPE): Update. - - * frags.c (frag_var,frag_variant): Initialize fr_cgen here. - * config/tc-fr30.h (TC_FRAG_INIT): Delete. - * config/tc-m32r.h (TC_FRAG_INIT): Delete. - * frags.h (struct frag): Make opindex, opinfo ints. - - * config/tc-fr30.c (FX_OPINFO_R_TYPE): Delete, unused. - -1999-04-26 Tom Tromey - - * aclocal.m4, configure: Updated for new version of libtool. - -1999-04-22 Nick Clifton - - * config/tc-mcore.c (md_apply_fix3): Renamed function from - md_apply_fix. - (md_apply_fix3): Do not fix up absolute relocations against - symbolic values. - - * config/tc-mcore.h (MD_APPLY_FIX3): Define. - -1999-04-20 Nick Clifton - - * config/tc-mcore.c (md_pseudo_table): Add intercepts for section - changes and data-in-text directives. - (mcore_cons): New function: intercept cons() operations. - (mcore_float_cons): New function: intercept float_cons() - operations. - (mcore_stringer): New function: intercept stringer() operations. - -1999-04-18 Ian Lance Taylor - - * obj.h (struct format_ops): Change generate_asm_lineno field to - take no parameters. - * config/obj-ecoff.h (OBJ_GENERATE_ASM_LINENO): Don't define. - - * config/tc-alpha.c (find_opcode_match): Add default case to - switch. - (find_macro_match): Likewise. - (load_expression): Parenthesize && within ||. - - * config/tc-alpha.h (TC_RELOC_RTSYM_LOC_FIXUP): Define. - -1999-04-17 Nick Clifton - - * config/tc-mcore.c (md_pseudo_table): Add overrides for .bss - .text .data .section pseudo ops. - (mcore_s_section): New function. Dump lits before changing secs. - (mcore_s_text): New function. Dump lits before changing secs. - (mcore_s_data): New function. Dump lits before changing secs. - -1999-04-16 Gavin Romig-Koch - - * config/tc-mips.c (mips_32bitmode): New. - (md_begin): Set mips_32bitmode if needed. - (mips_elf_final_processing): Don't set EF_MIPS_ARCH. - Set EF_MIPS_32BITMODE. - -Fri Apr 16 12:26:39 1999 Bob Manson - - * config/obj-coff.c (c_section_symbol): Fix typo in previous - change. - -1999-04-16 Nick Clifton - - * config/tc-mcore.h (LOCAL_LABELS_FB): Define to 1. - -Thu Apr 15 16:52:09 1999 Jeffrey A Law (law@cygnus.com) - - * tc-hppa.c (pa_get_absolute_exression): Try to handle "5 %r3" - expressions correctly. - - -1999-04-15 Gavin Romig-Koch - - * config/tc-mips.c (mips_elf_final_processing): Set EF_MIPS_ARCH. - -Mon Apr 12 23:45:07 1999 Jeffrey A Law (law@cygnus.com) - - * tc-hppa.c (pa_ip, case '3'): New case for PA2.0 fmpyfadd - and fmpynfadd instructions. - -1999-04-11 Richard Henderson - - * as.h (environ): Declare it, if needed. - * as.c (dump_statistics): Don't declare environ. - * configure.in (environ): Detect declaration. - * configure, config.in: Rebuild - - * config/tc-i386.c (i386_immediate): Accept @GOT relocations. - (i386_displacement): Allocate enough space for replacement buffer. - Clean up replacement buffer initialization. - -1999-04-11 Bob Manson : - - * subsegs.c (section_symbol): Don't create a new symbol if one - already exists; instead, use the existing one, but set its segment - and frag data if it hasn't already been defined. - * config/obj-coff.c (c_section_symbol): Likewise. - -Sat Apr 10 20:10:02 1999 Richard Henderson - - * tc-alpha.c (load_expression): Call as_bad instead of abort. - -1999-04-08 Nick Clifton - - * config/tc-mcore.c: New File: Support routines for MCore - assembler. - * config/tc-mcore.h: New File: Definitions for MCore assembler. - * config/obj-coff.c: Add support for mcore-pe target. - - * Makefile.am: Add support for MCore targets. - * Makefile.in: Regenerate. - * configure.in: Add support for MCore targets. - * configure: Regenerate. - - * doc/all.texi: Set MCORE. - * doc/as.texinfo: Document MCore specific command line options. - - * write.h: Prevent multiple inclusion. - -1999-04-06 Ian Lance Taylor - - * asintl.h (LC_MESSAGES): Never define. - * as.c (main): Don't pass LC_MESSAGES to setlocale if the system - does not define it. - * gasp.c (main): Don't pass LC_MESSAGES to setlocale if the system - does not define it. - - * Makefile.am (m68k-parse.c): If configuring in the source - directory, copy m68k-parse.y into the local directory before - running ylwrap, to remove spurious differences when generating - snapshots. - * Makefile.in: Rebuild. - - * config/tc-sparc.h (md_do_align): Just allocate the number of - bytes necessary, rather than always allocating 1024. - -1999-04-04 Ian Lance Taylor - - * listing.c (listing_newline): Add cast to avoid warning. - * read.c (generate_lineno_debug): Add cases to switch. Reindent. - * config/tc-i386.c (i386_scale): Add return value. - (build_displacement_string): Remove unused local temp_disp2. - (i386_intel_memory_operand): Add parentheses to avoid warning. - (i386_intel_operand): Remove unused local end_of_operand_string. - (i386_operand): Remove unused local operand_modifier. - (i386_operand): Add parens to avoid warning. - -1999-04-04 Don Bowman - - * configure.in: Add mips*-*-vxworks* target; have it define - MIPS_STABS_ELF. - * configure, config.in: Rebuild. - -1999-03-31 Nick Clifton - - * configure.in (emulations): Add support for arm-epoc-pe. - * configure: Regenerate. - * config/te-epoc-pe.h: New file. Define macros specific to - arm-epoc-pe target. - * config/tc-arm.h: Select epoc-pe-arm target format if configured - for arm-epoc-pe target. - -Mon Mar 29 10:15:40 CST 1999 Catherine Moore - - * tc-mips.c (md_apply_fix): Adjust value for linkonce sections. - -Wed Mar 24 14:11:10 1999 Jeffrey A Law (law@cygnus.com) - - * tc-hppa.c (pa_parse_nonneg_cmpsub_cmpltr): Clean up code to - detect ",n" without a condition. - (pa_parse_neg_cmpsub_cmpltr): Likewise. - - -Tue Mar 23 11:28:23 1999 Jeffrey A Law (law@cygnus.com) - - * tc-hppa.c (pa_ip, case '~'): The condition for a branch on bit - instruction is encoded with one bit. - - -1999-03-23 Ian Lance Taylor - - * doc/internals.texi (CPU backend): Mention that - line_separator_chars should not include newline. From thi - . - -1999-03-22 Doug Evans - - * config/tc-fr30.c (md_begin): Update call to fr30_cgen_cpu_open. - * config/tc-m32r.c (md_begin): Update call to m32r_cgen_cpu_open. - -Sun Mar 21 18:08:18 1999 Richard Henderson - - * tc-alpha.c (md_assemble): Allow '6' in an opcode. - -Thu Mar 18 10:55:30 1999 Jeffrey A Law (law@cygnus.com) - - * tc-hppa.c (pa_ip, case 'a'): Do not call pa_parse_..._cmpsub_cmpltr. - - -Thu Mar 18 02:30:07 1999 Jeffrey A Law (law@cygnus.com) - - * tc-hppa.c (pa_ip, case 'd'): Do not allow ",n". - -1999-03-15 Martin Hunt - - * app.c (do_scrub_begin): Change '-' back to a symbol char - so we can use multiple opcodes on a line again. - - * config/tc-d30v.c: By default, warn if a symbol has - the same name as a register. Plus some minor - updates from the branch. - -1999-03-13 Nick Clifton - - * config/tc-d30v.c (md_apply_fix3): Handle BFD_RELOC_8, - BFD_RELOC_16 and BFD_RELOC_64. - -1999-03-12 Andreas Schwab - - * expr.c (expr): Add missing else. - -1999-03-12 Nick Clifton - - * config/tc-arm.c (md_apply_fix3): Improve error message. - -1999-03-11 Doug Evans - - * Makefile.am (CPU_TYPES): Add fr30. - (cgen.o): Add $(CGEN_CPU_PREFIX)-desc.h dependency. - (fr30,m32r dependencies): Update. - * Makefile.in: Rebuild. - - * cgen.c (gas_cgen_record_fixup): Update use of operand->type. - (gas_cgen_record_fixup_exp): Ditto. - (gas_cgen_finish_insn): Call cgen_operand_lookup_by_num. - (gas_cgen_md_apply_fix3): Ditto. Update call to set_vma_operand. - * config/tc-fr30.c (md_begin): Update call to fr30_cgen_cpu_open. - (md_cgen_lookup_reloc): Update use of operand->type. - * config/tc-m32r.c (md_begin): Update call to fr30_cgen_cpu_open. - (md_convert_frag): Call cgen_operand_lookup_by_num. - (md_cgen_lookup_reloc): Update use of operand->type. - (m32r_cgen_record_fixup_exp): Ditto. - -1999-03-09 Jim Blandy - - * config/tc-mips.c (md_show_usage): Fix message. - -1999-03-03 Nick Clifton - - * doc/c-arm.texi (ARM Syntax): Document new command line switches - and LDR reg,= instruction. - - * config/tc-arm.c: Add support for -mcpu=arm810, -mcpu=arm9 and - -mcpu=arm9tdmi. - -Fri Feb 19 09:36:30 1999 Ian Lance Taylor - - * doc/c-arm.texi (ARM-Chars): Fix typo in use of '@'. - -1999-02-17 Nick Clifton - - This patch was created by: Scott Bambrough - - - * app.c: - Special cased '@' character. The '@' character is used as the - ARM assembler comment character, as a special character - and in ELF .symver pseudo-op's, and as a special character in - .type and .section pseudo-ops. - (symver_pseudo): New static variable. - (symver_state): New static variable. - (struct app_save): Add field 'symver_state'. - (app_push): Save global symver_state int struct app_save. - (app_pop): Restore global symver_state from struct app_save. - (do_scrub_chars): Special case handling of '@' character in - .symver pseudo-ops. - - * configure.in: Modified to recognize armv* uname syntax from ARM - Linux kernel. - * configure: Regenerated. - - * config/obj-elf.c (obj_elf_section): Allow '%' as well as '@' as - a prefix to the section's type. - (obj_elf_type): Allow '%' as well as '@' and '#' as prefixes to - the type's typename. - - * config/tc-arm.h: Add support for PIC generation: - (pic_code): New boolean. - (obj_relocate_extern): Define. - (TC_RELOC_RTSYM_LOC_FIXUP): Define - (TC_CONS_FIX_NEW): Define. - (tc_fix_adjustable): Define. - (GLOBAL_OFFSET_TABLE_NAME): Define. - - * config/tc-arm.c: Add support for PIC generation: - (line_seperator_chars): Allow ';' as a seperator for Linux. - (is_immediate_prefix): New macro. - (arm_parse_reloc): New function. - (s_arm_elf_cons): New function. - (do_branch): Special case for BFD_RELOC_ARM_PLT32. - (md_undefined_symbol): Special case handling for the Global Offset - Table's symbol. - (md_apply_fix3): Handle PIC relocs. - (tc_gen_reloc): Handle PIC relocs. - (md_parse_option): Add support for '-k' command line switch to - enable PIC generation. - (cons_fix_new_arm): New function. - (s_arm_elf_cons): New function. - -Tue Feb 16 16:31:53 1999 Ian Lance Taylor - - * configure.in: Add comments for uses of AC_DEFINE. - * acinclude.m4: Likewise. - * acconfig.h: Remove. - * aclocal.m4: Rebuild. - * configure: Rebuild. - * Makefile.in: Rebuild. - * config.in: Rebuild. - -1999-02-15 Jim Lemke - - * config/tc-mips.c (mips_ip: case 'o'): Fix assertion failure for - non-constant offset from a base register. - -1999-02-14 Ken Raeburn - - * config/tc-alpha.c (md_show_usage): Put \ before newline in - strings always. - -Sat Feb 13 14:10:10 1999 Richard Henderson - - * config/tc-alpha.c (cpu_types): Enable EV6 PALcode with -m21264. - (emit_insn): Look for pc-relative and no-overflow specifiers on - internal relocation types. - -1999-02-13 Jim Blandy - - * doc/c-mips.texi (MIPS Opts): Updated list of -mNNNN and - -mcpu=NNNN flags. - - * config/tc-mips.c: Remove all the mips_NNNN variables; just use - mips_cpu instead. - (mips_4650, mips_4010, mips_4100): Variables removed. - (hilo_interlocks, gpr_interlocks, append_insn, macro_build, macro, - macro2, mips16_macro, mips_ip): Test mips_cpu, not the mips_NNNN - variables. - (md_begin): Don't bother initializing the mips_NNNN variables; - mips_cpu is set, and that's good enough now. - (md_parse_option): Have the -mNNNN options set mips_cpu instead of - the mips_NNNN variable. The -no-mNNNN flags are now no-ops. - (show): New function, to handle wrapping in the CPU lists. - (md_show_usage): Update lists of -mcpu and -mNNNN switches. - -Sat Feb 13 00:17:26 1999 Richard Henderson - - * config/tc-i386.c (i386_intel_operand): Ignore `SHORT' rather - than treat as an immediate specifier. - -Thu Feb 11 16:18:31 1999 Richard Henderson - - * config/tc-i386.c: Prototype many functions. - (set_intel_syntax): Accept `prefix'/`noprefix' specifiers. - (i386_immediate): Remove unused second argument. - (i386_intel_operand): Fix i386_is_reg typo. - (i386_operand): Use allow_naked_reg. - (output_invalid): Make operand int for K&R. - -Thu Feb 11 11:21:02 1999 Ian Lance Taylor - - * Makefile.am (EXTRA_as_new_SOURCES): Uncomment--fixed by automake - patch. - * Makefile.in: Rebuild. - -1999-02-09 Doug Evans - - * Makefile.am (DISTCLEANFILES): Change cgen-opc.h to cgen-desc.h. - (cgen.o): Ditto. - (EXTRA_as_new_SOURCES): Comment out. - (.tcdep): -opc.h renamed to -desc.h. - * Makefile.in: Rebuild. - * doc/Makefile.in: Rebuild. - * configure.in: Require autoconf 2.13. Redo using_cgen handling. - Delete call to AM_CYGWIN32. Replace AM_EXEEXT with AC_EXEEXT. - (AC_OUTPUT): -opc.h renamed to -desc.h. - * configure: Rebuild. - * aclocal.m4: Rebuild. - * config.in: Rebuild. - * cgen.c: Include cgen-desc.h, not cgen-opc.h. - (*): CGEN_OPCODE_DESC renamed to CGEN_CPU_DESC. - (gas_cgen_cpu_desc): Renamed from gas_cgen_opcode_desc. - CGEN_INSN_ATTR renamed to CGEN_INSN_ATTR_VALUE. - CGEN_OPERAND_ATTR renamed to CGEN_OPERAND_ATTR_VALUE. - (gas_cgen_record_fixup): Remove unnecessary != 0 test. - (gas_cgen_record_fixup_exp): Ditto. - (gas_cgen_finish_insn): Ditto. Refer to operand table via cpu - descriptor, not global variable. - (gas_cgen_md_apply_fix3): Refer to operand_table via cpu - descriptor, not global variable. Refer to insert_operand handler - via cpu descriptor, not global function. - * cgen.h (*): CGEN_OPCODE_DESC renamed to CGEN_CPU_DESC. - * config/tc-fr30.c: Include opcodes/fr30-desc.h. - (*): gas_cgen_opcode_desc renamed to gas_cgen_cpu_desc. - CGEN_INSN_ATTR renamed to CGEN_INSN_ATTR_VALUE. - Update call to CGEN_OPERAND_TYPE,CGEN_INSN_OPERANDS. - * config/tc-m32r.c: Ditto. - (assemble_two_insns): Update calls to cgen_lookup_get_insn_operands. - (md_assemble): Ditto. - (md_convert_frag): Update call to CGEN_OPERAND_ENTRY. - -1999-02-09 Nick Clifton - - * config/tc-arm.c (md_apply_fix3): Fix handling of label1 - label2 - relocations for ELF targets. - -1999-02-08 Nick Clifton - - * configure.in: Add support for StrongARM target. - * configure: Regenerate. - -1999-02-05 Nick Clifton - - * config/tc-arm.h: Tidy OBJ_ELF and OBJ_COFF definitions. - - * config/tc-arm.c (md_apply_fix3): Fix BFD_RELOC_ARM_PCREL_BRANCH - for COFF ports. - -Wed Feb 3 11:35:47 1999 Richard Henderson - - * config/tc-alpha.c (md_show_usage): Document pca56 and ev6 options. - -Mon Feb 1 20:37:30 1999 Catherine Moore - - * config/tc-i386.h (LONG_DOUBLE_MNEM_SUFFIX): Define. - (INTEL_DWORD_MNEM_SUFFIX): Define. - (BYTE_PTR): Define. - (WORD_PTR): Define. - (DWORD_PTR): Define. - (XWORD_PTR): Define. - (SHORT): Define. - (OFFSET_FLAT): Define. - (FLAT): Define. - (NONE_FOUND): Define. - (No_dSuf): Define. - (No_xSuf): Define. - * config/tc-i386.c (set_intel_syntax): New routine. - (intel_syntax): Declare. - (allow_naked_reg): Declare. - (md_pseudo_table): Support .intel_syntax and .att_syntax. - (intel_float_operand): New routine. - (md_assemble): Handle INTEL_DWORD_MNEM_SUFFIX. - Handle brackets as well as parens. Call i386_intel_operand for - intel syntax. Reverse operands if appropriate. Handle new - suffixes. Handle movzx and movsx. - (i386_is_reg): New routine. - (i386_immediate): New routine. - (i386_scale): New routine. - (i386_displacement): New routine. - (i386_operand_modifier): New routine. - (build_displacement_string): New routine. - (i386_parse_seg): New routine. - (i386_intel_memory_operand): New routine. - (i386_intel_operand): New routine. - (i386_operand): Call i386_displacement, i386_immediate, - i386_scale, etc. instead of handling inline. - (parse_register): Handle registers without prefix. - -Mon Feb 1 12:24:58 1999 Catherine Moore - - * configure: Regenerate. - * configure.in (arm-*-oabi): New. - (thumb-*-oabi): New. - * config/tc-arm.c (target_oabi): Declare. - (md_apply_fix3): Support REL relocs. - (md_parse_option): Handle -oabi. - (elf32_arm_target_format): New routine. - (md_longopts): Add OPTION_OABI. - * config/tc-arm.h: Redefine TARGET_FORMAT. - - -1999-01-28 Nick Clifton - - * write.c (write_relocs): Handle out of range error. - - * config/tc-fr30.c (fr30_fix_adjustable): New function. - (fr30_force_relocation): Default to 0. - - * config/tc-fr30.h (obj_fix_adjustable): Define. - (TC_FORCE_RELOCATION): Define. - - * cgen.c (gas_cgen_md_apply_fix3): Do not apply fixes to VTABLE - relocs. - -1999-01-16 Nick Clifton - - * config/tc-d30v.c (write_2_short): Do not generate a sequential - merge of two instructions if the left instruciton kills the right. - -1999-01-11 Doug Evans - - * Makefile.in: Regenerate. - * configure.in: Redo test for using cgen. - * configure: Regenerate. - -1999-01-09 Nick Clifton - - * config/obj-coff.h (obj_adjust_symtab): Prevent accidental - redefinition of this macro. - -Tue Jan 5 21:58:03 1999 Doug Evans - - * config/tc-mips.c (mips_frob_file): Disable "Unmatched %hi reloc" - warning. - -1998-12-29 Gavin Romig-Koch - - * config/tc-mips.c (append_insn): For mips16, insert a nop between - a read of HI or LO and an immediatly following branch. - -1998-12-29 Gavin Romig-Koch - - * config/tc-mips.c (md_begin): Another correction to the setting of - mips_eabi64. - -1998-12-23 Gavin Romig-Koch - - * config/tc-mips.c (md_begin): Correct type-o in setting of mips_eabi64. - -1998-12-21 Nick Clifton - - * config/tc-m32r.c (md_assemble): Emit a NOP after a relaxable 16 - bit insn when optimizing, so that parallelised instructions will - start on a 32 bit boundary. - -1998-12-19 Gavin Romig-Koch - - * config/tc-mips.c (mips_eabi64): New. - (md_begin): Set mips_eabi64. - (mips_elf_final_processing): Use it. - -1998-12-18 Gavin Romig-Koch - - * config/tc-mips.c (mips_elf_final_processing): - Correct setting of ABI in e_flags. - -Wed Dec 16 16:17:22 1998 Dave Brolley - - * config/tc-fr30.c (md_assemble): Warn about invalid instructions in delay slots. - -1998-12-16 Gavin Romig-Koch - - * config/tc-mips.c (md_begin,md_parse_option): Handle vr4111. - -1998-12-15 Doug Evans - - * cgen.c (gas_cgen_md_apply_fix3): Mark as an error, rather than a - warning, values that don't fit in the field. - -1998-12-15 Gavin Romig-Koch - - * config/tc-mips.c (mips_abi_string): New. - (md_parse_option,md_longopts): Add mabi. - (mips_elf_final_processing): Set e_flags based on mabi flag. - -1998-12-15 Gavin Romig-Koch - - * config/tc-mips.c (md_parse_option): Handle vr4111. - -98-12-11 Ken Raeburn - - * config/tc-h8300.c (build_bytes): Change message given if the - instruction requires H8/300H mode and we're not in Hmode, to - suggest that it may be the operand modes that are the problem, not - necessarily the opcode. - -1998-12-10 Nick Clifton - - * config/tc-fr30.c: Add line separator character. - -Tue Dec 8 19:51:50 1998 Mark Klein - - * configure.in (hppa-*-mpeix*): New target. - * config/obj-som.h (obj_som_compiler): Declare. - * config/obj-som.c (compiler_seen): New static variable. - (obj_som_compiler): New function. - * config/tc-hppa.c: Update tc_data uses for change to bfd/som.h. - (md_pseudo_table): Add "compiler" if OBJ_SOM. - (pa_type_args): Set hppa_priv_level. - (pa_compiler): New static function if OBJ_SOM. - * configure: Rebuild. - -Tue Dec 8 15:00:50 1998 Ian Lance Taylor - - * read.c (output_leb128): Don't mark as inline. - -1998-12-08 Andrew MacLeod - - * config/tc-ppc.c (ppc_vbyte): Prototype and new function for - AIX .vbyte unaligned data support. - (md_pseudo_table): Add 'vbyte' to list of valid pseudos. - (ppc_elf_validate_fix): Add eh_frame to list of ELF relocatable - sections. - -1998-12-07 Nick Clifton - - * config/tc-d30v.c (md_assemble, do_assemble): Improve erroneous - input handling. - -Mon Dec 7 09:48:34 1998 Catherine Moore - - * config/tc-arm.c (elf32_arm_force_relocation): Check for - BFD_RELOC_ARM_PCREL_BRANCH. - -Sun Dec 6 12:46:36 1998 Ian Lance Taylor - - * configure.in: Define TARGET_BYTES_{BIG,LITTLE}_ENDIAN after - checking the target type. - (mips-dec-bsd*): Set endian to little. - * configure: Rebuild. - - COFF weak symbol support, based on patches from Mark Elbrecht - : - * config/obj-coff.h (S_IS_WEAK): Define if not BFD_ASSEMBLER. - * config/obj-coff.c (obj_coff_weak): New static function. - (obj_coff_endef) [both versions]: Handle weak symbols. - (coff_frob_symbol): Likewise. - (yank_symbols): Likewise. - (obj_pseudo_table): Add "weak". - - * configure.in (m68k-*-gnu*): New target. From Aymeric Vincent - . - * aclocal.m4: Rebuild with current tools. - * configure: Rebuild. - - * config/tc-alpha.c (emit_ldgp): Give an error message rather than - an assertion failure for a case we can't handle when OBJ_ECOFF. - - * expr.c (operator): And with 0xff to avoid problems with signed - char. - -1998-12-03 Nick Clifton - - * config/tc-fr30.c (md_cgen_lookup_reloc): Generate - BFD_RELOC_FR30_48 instead of BFD_RELOC_FR30_32. - -1998-12-02 Nick Clifton - - * config/tc-fr30.c (md_cgen_lookup_reloc): Enable relocs for - LDI:20 insn. - -Thu Nov 26 11:23:48 1998 Dave Brolley - - * config/tc-fr30.c (md_pcrel_from_section): Restore previous calculation - of pcrel point. - -Tue Nov 24 17:21:52 1998 Nick Clifton - - * config/tc-fr30.c (md_pcrel_from_section): Fix calculation of - pcrel point. - -Tue Nov 24 14:54:38 1998 Nick Clifton - - * config/tc-d10v.c (md_assemble): Make static 'etype' have file - scope. - (d10v_cleanup): Only generate previous insn if a multiline insn is - not pending. - -Fri Nov 20 11:41:13 1998 Nick Clifton - - * config/tc-fr30.c (md_cgen_lookup_reloc): Add support for - FR30_OPERAND_I32. - -Thu Nov 19 15:01:29 1998 Nick Clifton - - * config/tc-arm.c (md_parse_option): Add support for -marm7xxx and - -marm6xxx command line switches. - -1998-11-18 Doug Evans - - * Makefile.am (DEP): Use $(srcdir)/../mkdep. - (itbl-ops.o): Delete duplicate dependencies. - Rebuild dependencies. - Add fr30 dependencies. - * Makefile.in: Rebuild. - -Tue Nov 17 13:42:42 1998 Nick Clifton - - * config/tc-fr30.c (md_cgen_lookup_reloc): Updated to match latest - opcode list. - * listing.c: Ignore line terminator characters found inside - strings. - -Thu Nov 12 19:21:24 1998 Dave Brolley - - * po/gas.pot: Regenerated. - -Thu Nov 12 10:54:16 1998 Nick Clifton - - * config/tc-fr30.c (fr30_is_colon_insn): New name for - fr30_is_label_start(). Also checks for delay slot insns. - - * config/tc-fr30.c (fr30_is_label_start): New function: Handle - FR30 instructions which contain a colon in the mnemonic. - - * config/tc-fr30.h (TC_START_LABEL): Define this macro. - -Wed Nov 11 09:58:21 1998 Nick Clifton - - * config/tc-fr30.c: Removed currently superflous code. - -Tue Nov 10 13:13:05 1998 Nick Clifton - - * config/tc-fr30.h: New file. - * config/tc-fr30.c: Tweaking so that it will compile. - -Tue Nov 10 14:41:33 1998 Catherine Moore - - * config/tc-d10v.h (obj_fix_adjustable): Define. - (TC_FORCE_RELOCATION): Define. - (d10v_force_relocation): Declare. - * config/tc-d10v.c (tc_gen_reloc): Handle Vtable relocs. - (md_apply_fix3): Handle Vtable relocs. - (d10v_fix_adjustable): New. - (d10v_force_relocation): New. - -Mon Nov 9 14:25:06 1998 Nick Clifton - - * config/tc-d30v.c: Change default behaviour to ignore potential - conflicts between register name and symbol names. - -Wed Nov 4 18:42:00 1998 Dave Brolley - - * configure.in: Add fr30-*-*. - * config/tc-fr30.c: New file. - * Makefile.in: Regenerated. - * config.in: Regenerated. - * configure: Regenerated. - * doc/Makefile.in: Regenerated. - * po/gas.pot: Regenerated. - -Mon Nov 2 20:54:16 1998 Doug Evans - - * config/tc-m32r.c (assemble_two_insns): Ensure both insns - are 16 bit insns. - -Mon Nov 2 20:10:18 1998 Martin von Loewis - - * app.c (do_scrub_begin): Set characters above 127 to be symbol - characters. - (do_scrub_chars): Add some casts to unsigned char to avoid - unwanted sign extension. - * read.c (lex_type): Set characters about 127 to be symbol - characters. - * config/tc-i386.c (md_begin): Set identifier_chars and - operand_chars for values above 127. - -Mon Nov 2 15:05:33 1998 Geoffrey Noer - - * configure.in: detect cygwin* instead of cygwin32* - * configure: regenerate - -Tue Oct 27 13:18:40 1998 Nick Clifton - - * listing.c: Add support for producing a listing from piped - input. - -Tue Oct 27 08:56:44 1998 Gavin Romig-Koch - - * config/tc-mips.c (hilo_interlocks): Remove mips_3900. - (append_insn): Account for the tx39's multiply behavior. - -1998-10-26 Michael Meissner - - * config/tc-m32r.c (assemble_two_insns): Rename assemble_two_insns - from assemble_parallel_insns. Add support for '->' to indicate - explicitly serializing the instructions. - (md_assemble): Ditto. - -Sat Oct 24 15:12:19 1998 Catherine Moore - - * config/tc-sh.c (sh_fix_adjustable): Adjust EXTERN and - WEAK handling. - -Thu Oct 22 12:41:33 1998 Catherine Moore - - * cgen.c (gas_cgen_md_apply_fix3): Revert last change. - -Thu Oct 22 10:03:15 1998 Ron Unrau - - * config/tc-mips.c : support frame and regmask/fregmask when - MIPS_STABS_ELF is specified. - -Wed Oct 21 11;34:51 1998 Catherine Moore - - * config/tc-sh.c (sh_fix_adjustable): Only include if OBJ_ELF. - (md_apply_fix): Don't return 1 for VTABLE relocs. - * config/tc-sh.h (obj_fix_adjustable): Define only if OBJ_ELF. - -Tue Oct 20 11:18:28 1998 Alan Modra - - * doc/c-i386.texi: Replace occurences of "opcode" with - "instruction mnemonic", "instruction", or "mnemonic" when - referring to the name of an instruction. Use "opcode" when - referring to the sequence of machine bytes. - - * config/tc-i386.c (opcode_chars): Rename to mnemonic_chars. - (is_opcode_char): Rename to is_mnemonic_char. - (md_assemble and i386_operand): Correct error messages from - "opcode" to "instruction mnemonic" - Rename throughout opcode[] -> mnemonic[], opp -> mnem_p, - MAX_OPCODE_SIZE -> MAX_MNEM_SIZE, - DWORD_OPCODE_SUFFIX -> DWORD_MNEM_SUFFIX, - WORD_OPCODE_SUFFIX -> WORD_MNEM_SUFFIX, - BYTE_OPCODE_SUFFIX -> BYTE_MNEM_SUFFIX, - SHORT_OPCODE_SUFFIX -> SHORT_MNEM_SUFFIX - LONG_OPCODE_SUFFIX -> LONG_MNEM_SUFFIX - - * config/tc-i386.h (*_MNEM_SUFFIX): Rename from *_OPCODE_SUFFIX. - - * config/tc-i386.c (i386_operand): Check for garbage after - register name. - -Tue Oct 20 10:49:42 1998 Ian Lance Taylor - - * config/tc-i386.c (md_apply_fix3): Change handling of PCREL reloc - for BFD_ASSEMBLER to only change value when COFF if TE_PE. - -Mon Oct 19 20:20:42 1998 Catherine Moore - - * config/tc-sh.h (obj_fix_adjustable): Define. - * config/tc-sh.c (sh_force_relocation): Handle VT relocs. - (md_apply_fix): Likewise. - (tc_gen_reloc): Likewise. - (sh_fix_adjustable): New. - -Mon Oct 19 12:35:43 1998 Doug Evans - - * cgen.c (gas_cgen_finish_insn): Update handling of CGEN_INT_INSN_P. - * cgen.h (gas_cgen_finish_insn): Update prototype. - * config/tc-m32r.c (m32r_insn): CGEN_INT_INSN -> CGEN_INT_INSN_P. - cgen_insn_t -> CGEN_INSN_INT. - (make_parallel): Update handling of CGEN_INT_INSN_P. - (assemble_parallel_insn): Ditto. - (target_make_parallel): New function. - (md_assemble): Use it. - -Mon Oct 19 13:16:12 1998 Catherine Moore - - * config/tc-m32r.c (m32r_force_relocation): Fix typo. - -Sun Oct 18 18:48:57 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-sh.c (md_assemble): Make sure the entire opcode is - converted into lower case. - -Fri Oct 16 13:36:34 CDT Catherine Moore - - * cgen.c (gas_cgen_md_apply_fix3): Handle VTABLE relocs. - (gas_cgen_tc_gen_reloc): Likewise. - * config/tc-m32r.h (obj_fix_adjustable): Define. - * config/tc-m32r.c (m32r_fix_adjustable): New. - (m32r_force_relocation): Handle VTABLE relocs. - -Wed Oct 14 11:33:38 1998 Nick Clifton - - * doc/c-arm.texi (ARM Directives): Document .ltorn directive. - -Mon Oct 12 11:07:21 1998 Nick Clifton - - * config/tc-m32r.c (assemble_parallel_insn): Convert second opcode - to lower case before parsing. - - * config/tc-d30v.c (parallel_ok): Ignore conflicts when explicitly - parallel insns modift buts in the PSW as a side effect. - -Thu Oct 8 10:18:33 1998 Nick Clifton - - * config/tc-d30v.c (find_format): Test for missing flag and - control registers. - - (md_apply_fix3): Fix error messages to avoid - assumption about presence of a symbol. - - (parallel_ok): Disallow parallel instructions that both modify the - same flag register. - - (find_format): Generate a warning if an odd numbered register is - used as the first register in a mutli-register instruction. - -Wed Oct 7 14:09:14 1998 Nick Clifton - - * config/tc-d30v.c (md_apply_fix3): Do not assume that bad - relocations are always associated with a symbol. - -Tue Oct 6 09:31:15 1998 Catherine Moore - - * tc-sparc.h (TC_FORCE_RELOCATION): Define. - (elf32_sparc_force_relocation): Declare. - * tc-sparc.c (md_apply_fix3): Handle vtable relocs. - (tc_gen_reloc): Handle vtable relocs. - (elf32_sparc_force_relocation): New. - -Mon Oct 5 09:25:32 1998 Catherine Moore - - * symbols.c (S_IS_FUNCTION): New. - * config/tc-v850.h (obj_fix_adjustable): Define. - (TC_FORCE_RELOCATION): Define. - (v850_force_relocation): Declare. - * config/tc-v850.c (tc_gen_reloc): Use offset instead - of fx_addnumber for VTABLE reloc addends. - (md_apply_fix3): Handle VTABLE relocs. - (v850_fix_adjustable): New. - (v850_force_relocation): New. - -Mon Oct 5 00:48:52 1998 Jeffrey A Law (law@cygnus.com) - - * tc-hppa.c (fp_operand_format): Add some additional formats. - (pa_ip): Do not automatically promote into pa2.0 mode. - (pa_level): Handle ".level 2.0". - -Sun Oct 4 20:57:43 1998 Alan Modra - - * config/tc-i386.c (md_assemble): Handle AMD_3DNOW_OPCODE. - * config/tc-i386.h (template.extension_opcode): Change to - unsigned int to allow full range of 8-bit opcode suffixes. - (None): Redefine as 0xffff. - - From Jeff B Epler - * doc/c-i386.texi (i386-SIMD): New section. - -Thu Oct 1 15:37:54 1998 Richard Henderson - - * read.c (discard_rest_of_line): New function. - * read.h: Declare it. - * config/tc-alpha.c (s_alpha_mask, s_alpha_frame): Use it. - -Thu Oct 1 10:33:53 1998 Nick Clifton - - * config/tc-d10v.c (find_symbol_matching_register): New function. - (find_opcode): Cope with the case where a register name matches - a symbol name. - -Wed Sep 30 10:52:32 1998 Nick Clifton - - * config/tc-v850.c (md_pcrel_from): Rename to - v850_pcrel_from_section. - (v850_pcrel_from_section): Do not resolves symbols in other - sections. - - * config/tc-v850.h (MD_PCREL_FROM_SECTION): Define. - -Mon Sep 28 11:01:20 1998 Nick Clifton - - * config/tc-d10v.c (find_opcode): Generate an error if a register - is supplied for an operand that should not be a register. - -Fri Sep 25 10:04:21 1998 Nick Clifton - - * config/tc-d30v.c (write_2_short): But do allow delayed branch - instructions to have another instruction in the right bin. - -Thu Sep 24 09:28:34 1998 Nick Clifton - - * config/tc-d30v.c (write_2_short): Do not allow instructions in - the right container if the left container holds a branch - instruction. - -Wed Sep 23 10:54:29 1998 Nick Clifton - - * config/tc-d30v.c (reg_name_search): Only warn if a name matches - both a register name and symbol name. - (find_format): Allow correct parsing of MVTSYS and MVFSYS insns. - -Tue Sep 22 17:49:16 1998 Nick Clifton - - * config/tc-d30v.c (write_2_short): Implement EITHER_BUT_PREFER_MU - execution unit class. - - (reg_name_search): If a name matches a register and a symbol, - prefer the register. - (find_format): Disallow flag registers when a general purpose - register is required. - If a number is required, but a register has been given, check to - see if a symbol with the same name as the register exists, and if - so, use that symbol. - -Tue Sep 22 16:40:52 1998 Jim Wilson - - * config/obj-elf.h (ECOFF_DEBUGGING): Add missing parens. - -Tue Sep 22 15:44:21 1998 Nick Clifton - - * config/tc-d30v.c (find_format): Do not accept flag registers as - general purpose registers. - (find_format): If an immediate value is expected at a given place - in a format, but a register name has been provided instead, check - to see if that register name matches the name of a predefined - symbol and if it does, then use the symbol instead. - (reg_name_search): If a register name matches a symbol name, - prefer the register name to the symbol name. - -Mon Sep 21 10:42:57 1998 Nick Clifton - - * config/tc-m32r.c (m32r_do_align): After inserting NOPs, reset - the previous insn to empty. - -1998-09-20 Michael Meissner - - * config/tc-ppc.c (md_apply_fix3): Do not break string into two - pieces, forcing the use of an ANSI compiler. - -Sun Sep 20 00:58:12 1998 Andreas Schwab - - * config/tc-m68k.h (TC_FORCE_RELOCATION): New macro. Force vtable - relocs. - * config/tc-m68k.c (md_apply_fix_2): Do nothing for vtable relocs. - -Tue Sep 15 08:51:07 1998 Catherine Moore - - * config/obj-elf.c (obj_elf_vtable_inherit): Handle arm - assembler syntax. - (obj_elf_vtable_entry): Likewise. - * config/tc-arm.h: Define TC_FORCE_RELOCATION for OBJ_ELF. - * config/tc-arm.c (md_apply_fix3): Handle VTABLE relocations. - (tc_gen_reloc): Likewise. - (arm_fix_adjustable): Likewise. - (elf32_arm_force_relocation): New. - (armelf_frob_symbol): Remove coff-style symbol support. - -Wed Sep 9 11:27:16 1998 Richard Henderson - - * config/tc-i386.c (i386_operand): Fix typo in last patch. - -Tue Sep 8 18:10:01 1998 Catherine Moore - - * config/tc-arm.c (arm_adjust_symtab): Move #ifdef - OBJ_COFF so that routine is defined for a.out format. - -Tue Sep 8 15:56:19 1998 Richard Henderson - - * config/tc-i386.c (i386_operand): Detect non-segment registers - used as segment prefixes. - -Sat Sep 5 19:00:38 1998 Ian Lance Taylor - - * ehopt.c (check_eh_frame): Check the size of the FDE, and don't - optimize across FDE boundaries. - - * config/obj-coff.c (obj_coff_section): Preserve any link once - flags when setting the section flags. - -Fri Sep 4 17:07:14 1998 Nick Clifton - - * config/tc-arm.h (obj_adjust_symtab): Fixed typo. - * config/tc-arm.c (armelf_adjust_symtab): Reformatted. - -Fri Sep 4 13:57:43 1998 Jakub Jelinek - - * config/tc-sparc.c (in_signed_range): Sign extend 32-bit words - to the host width. - -Wed Sep 2 11:31:14 1998 Richard Henderson - - * frags.c (frag_grow): Include the size of the frag struct in the - obstack chunk size. - - * subsegs.c (subseg_set_rest): Adjust the seginfo frchain start - if the new subseg comes before the old. - -Tue Sep 1 15:01:33 1998 Jakub Jelinek - - * config/tc-sparc.c (sparc_ip): Allow all digits in an instruction - to handle edge8 and edge16. - -Mon Aug 31 09:51:14 1998 Richard Henderson - - * config/obj-elf.c (obj_elf_vtable_inherit): Print error message - before we clobber the symbol involved. - -Mon Aug 31 10:58:06 1998 Catherine Moore - - * config/tc-arm.c: Remove OBJ_ELF definitions for - S_GET_STORAGE_CLASS and S_SET_STORAGE_CLASS. Only - use arm_adjust_symtab for OBJ_COFF. - (armelf_adjust_symtab): New Routine. - * config/tc-arm.h: Define obj_adjust_symtab to - armelf_adjust_symtab for OBJ_ELF. - -Sat Aug 29 22:18:51 1998 Richard Henderson - - * configure.in: Make all i386-elf targets use bfd_gas. - * config/tc-i386.c (tc_i386_force_relocation): New. - (tc_i386_fix_adjustable): Don't fix vtable relocs. - (md_apply_fix3): Likewise. - (tc_gen_reloc): Handle them. - * config/tc-i386.h (TC_FORCE_RELOCATION): Always define, calling - tc_i386_force_relocation. - -Mon Aug 24 13:40:21 1998 Nick Clifton - - * config/tc-arm.c (md_show_usage): Improve formatting of --help output. - -Fri Aug 21 18:43:48 1998 Nick Clifton - - * config/tc-d30v.c (md_assemble): Copy previous opcode over - current opcode after writing the first insturction of a reverse - sequential pair. - -Fri Aug 21 07:30:35 1998 Doug Evans - - * read.h (generate_lineno_debug): Add prototype. - * read.c (generate_lineno_debug): Make non-static. - -Thu Aug 20 23:17:04 1998 Alan Modra - - * config/tc-i386.c (md_assemble): Only warn for address/data size - prefixes. - -Thu Aug 20 14:45:08 1998 Nick Clifton - - * config/tc-arm.c (arm_fix_adjustable): Do not adjust relocations - against Thumb function names, as the linker needs this information. - -1998-08-20 Vladimir N. Makarov - - * expr.c (operand): Check also that there is no advance in operand - after atof_generic in order to decide "is it label 0f or floating - point number?". - -Wed Aug 19 09:30:16 1998 Nick Clifton - - * config/tc-m32r.c: Replace double dash prefix to M32R specific - command line options with a single dash. - * doc/c-m32r.texi: Replace double dash prefix with a single dash. - -Tue Aug 18 11:59:43 1998 Catherine Moore - - * tc-arm.h: Define obj_fix_adjustable for OBJ_ELF. - * tc-arm.c (arm_fix_adjustable): New routine. - -1998-08-13 Vladimir N. Makarov - - * read.c (s_align, s_comm, s_mri_common, s_fail, s_globl, s_space, - s_float_space, s_struct, cons_worker): Move ignore_rest_of_line or - demand_empty_rest_of_line before mri_comment_end. - (equals): Check garbage after expression before - mri_comment_end in MRI mode. - -Thu Aug 13 15:08:42 1998 Ian Lance Taylor - - * config/tc-mips.c (macro): Correct M_SGE_I/M_SGEUI_I case for a - small immediate constant to use the constant itself rather than - always using 1. - -Wed Aug 12 18:47:38 1998 Ian Lance Taylor - - * config/tc-hppa.c (pa_enter): Call as_bad rather than abort. - (pa_leave): Likewise. - -Wed Aug 12 13:25:03 1998 Alan Modra - - * config/tc-i386.c (md_assemble): Emit a warning for stand-alone - prefixes. - (i386_operand): Fix an error message. - -Tue Aug 11 14:44:32 1998 Nick Clifton - - * doc/c-arm.texi (ARM Directives): Document .req directive. - - * config/tc-arm.c (reg_required_here): Display erroneous string if - the register name could not be decoded. - Do not set inst.instruction if the sift is -1. - -Mon Aug 10 15:39:56 1998 Richard Henderson - - * config/tc-alpha.c (tc_gen_reloc): Bias WEAK symbols just as - we do for EXTERN. - -Mon Aug 10 15:06:18 1998 Nick Clifton - - * config/tc-d30v.c (d30v_align): Always perform alignment request, - even if it is belived to be unnecessary. - -Mon Aug 10 17:48:09 1998 Alan Modra - - config/tc-i386.c (i386_operand): Size immediate constants by - suffix (erroneously removed as part of July 7 change). - -Sun Aug 9 20:45:32 1998 Catherine Moore - - * config/obj-elf.h: Check for redefinition of obj_frob_symbol. - * config/tc-arm.c: Define S_GET_STORAGE_CLASS and S_SET_STORAGE_CLASS. - (armelf_frob_symbol): New Routine. - * config/tc-arm.h: Define obj_frob_symbol if OBJ_ELF. - -Sat Aug 8 15:21:28 1998 Richard Henderson - - * config/tc-alpha.c (alpha_fix_adjustable): Don't adjust weak syms. - -Wed Aug 5 15:54:14 1998 Nick Clifton - - * config/tc-arm.c (md_begin): Set BFD private flags depending upon - command line switches passed to assembler. - -Mon Aug 3 14:02:52 1998 Doug Evans - - * cgen.h (GAS_CGEN_MAX_FIXUPS): GAS_ prepended, all uses updated. - (gas_cgen_opcode_desc): Declare. - (gas_cgen_parse_operand): Declare. - (*): Prepend gas_ to gas specific fns to denote them as such. - All uses updated. - * cgen.c (gas_cgen_opcode_desc): New global - (gas_cgen_init_parse): Renamed from cgen_asm_init_parse. - (queue_fixup): Renamed from cgen_queue_fixup. - (*): Prepend gas_ to gas specific fns to denote them as such. - All uses updated. - (gas_cgen_md_apply_fix3): Update call to insert_operand. - (gas_cgen_finish_insn): Renamed from cgen_asm_finish_insn. - * config/tc-m32r.c (md_begin): Remove use of CGEN_SYM. - Open opcode table and initialize it. - (make_parallel): Use gas_cgen_opcode_desc. - (assemble_parallel_insn): Ditto. Remove use of CGEN_SYM. - (md_assemble): Ditto. - -Sat Aug 1 19:27:30 1998 Richard Henderson - - * as.h (debug_info_type): Add entries for unspecified and dwarf*. - * ecoff.c (ecoff_generate_asm_lineno): Take no arguments; call - as_where ourselves. Provide a stub for !ECOFF_DEBUGGING. - * ecoff.h: Move ECOFF_DEBUGGING protection inside GAS_ECOFF_H. - Move ecoff_generate_asm_lineno outside ECOFF_DEBUGGING protection. - * read.c (generate_lineno_debug): Tidy ECOFF bits. Use - DEBUG_UNSPECIFIED rather than DEBUG_NONE for initial test. - * config/obj-elf.h (ECOFF_DEBUGGING) [TC_ALPHA]: Define to a variable. - (SEPARATE_STAB_SECTIONS): Conditionalize on value of ECOFF_DEBUGGING. - (INIT_STAB_SECTION): Likewise. - (OBJ_PROCESS_STAB): Likewise. - - * config/tc-alpha.c (md_longopts): New options -mdebug/-no-mdebug. - (md_parse_option): Watch for them. - (alpha_cur_ent_sym, alpha_flag_mdebug): New variables. - (md_begin): Kill neverdef code. - (s_alpha_ent, s_alpha_end, s_alpha_mask, s_alpha_frame): New. - (s_alpha_prologue): Watch alpha_cur_ent_sym. - (s_alpha_coff_wrapper): New. - (md_pseudo_table): Trap all ECOFF pseudos. - -Fri Jul 31 16:45:54 1998 Ron Unrau - - Start of changes to remove mdebug section from mips*-elf - Based on MIPS_STAB_ELF definition - * acconfig.h: undef if not configured - * config.in: undef if not configured - * config/mips-elf.h: only set ECOFF debugging if not stabs-in-elf - * config/tc-mips.c (s_ent): set BSF_FUNCTION - * stabs.c (s_stab_generic): flush frag - -Fri Jul 31 16:14:45 1998 Catherine Moore - - * configure.in: (arm-*-elf): Handle. - (thumb-*-elf): Handle. - * configure: Regenerate. - * read.c (stringer): Fix typo in comment. - * write.c (fixup_segment): Don't add symbol value to addend if - TC_ARM and OBJ_ELF. - * config/tc-arm.c (md_section_align): Don't align dwarf debug - sections. - (tc_gen_reloc): Always set the reloc addend to fixp->fx_offset - for OBJ_ELF. - -Thu Jul 30 21:38:43 1998 Frank Ch. Eigler - - * config/tc-d30v.c ({cur,prev}_left_kills_right_p): New variables. - (write_2_short): Emit warning if new flag is set. - (do_assemble): Set flags if left instruction is one of special - "right-instruction-killer" type. - -Tue Jun 28 18:12:28 1998 Stan Cox - - * config/tc-sparc.c (md_number_to_chars, cons_fix_new_sparc): - Always output words in debug_info section as big endian. - (sparc_target_format): Choose correct bfd target. - (md_apply_fix3): Rename BFD_RELOC_SPARC_32LE to BFD_RELOC_SPARC_REV32. - -Tue Jul 28 11:01:21 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_assemble): Fix "errmsg" initialization - to work with internationalization code. Issue an error when two - operands match that are not allowed to match. - -Mon Jul 27 16:25:58 1998 Doug Evans - - * configure.in (install_tooldir): Allow target to specify whether - it wants to be installed in $(tooldir)/bin. - * configure: Regenerate. - * Makefile.am (install-exec-local): Set install-exec-tooldir - dependency via configure. - * Makefile.in: Regenerate. - -Fri Jul 24 19:58:59 1998 Doug Evans - - * Makefile.am (install-exec-local): Split into two ... - (install-exec-bindir,install-exec-tooldir): New rules. - * Makefile.in: Regenerate. - -Fri Jul 24 16:31:49 1998 Ian Lance Taylor - - * Makefile.am (install-exec-local): Don't remove the file before - checking whether $(bindir) == $(tooldir)/bin. From Maciej - W. Rozycki . - * Makefile.in: Rebuild. - -Fri Jul 24 09:13:46 1998 Doug Evans - - * cgen.c: Include libiberty.h. - (cgen_md_apply_fix3): Update call to md_cgen_lookup_reloc. - (cgen_tc_gen_reloc): Use xmalloc, not bfd_alloc. - * cgen.h (cgen_md_apply_fix3,cgen_tc_gen_reloc): Declare. - (md_cgen_lookup_reloc)): Declare. - (md_cgen_record_fixup_exp): Declare. - * config/tc-m32r.h (md_pcrel_from_section): Declare. - (m32r_relax_frag): Declare. - (cgen_md_apply_fix3): Decls moved to cgen.h. - (cgen_record_fixup_exp,cgen_tc_gen_reloc): Ditto. - (m32r_cgen_record_fixup_exp): Delete decl. - * config/tc-m32r.c (m32r_cpu_desc): #if 0 out. - (assemble_nop): Delete. - (expand_debug_syms): Delete unused `exp'. - (md_cgen_lookup_reloc): Renamed from CGEN_SYM (lookup_reloc). - Add default case for -Wall. - (m32r_cgen_record_fixup_exp): Add default case for -Wall. - (md_atof): Delete unused wordP. - -Thu Jul 23 13:19:50 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_assemble): Make sure "errmsg" has a non-NULL - value. - -Wed Jul 22 14:36:56 1998 Ian Lance Taylor - - * doc/as.texinfo: Add documentation for .end, .exitm, .fail, - .ifc, .ifeqs, .ifge, .ifgt, .ifle, .iflt, .ifnc, .ifne, .ifnes, - .print, .purgem, and .struct. Remove documentation for - .app-file. - -Tue Jul 21 16:50:52 1998 Doug Evans - - * cgen.c (cgen_md_apply_fix3): set_operand renamed to set_vma_operand. - Update call to insert_operand. - -Fri Jul 17 11:42:20 1998 Nick Clifton - - * config/tc-m32r.c (ms_show_usage): Formatting changes. - -Wed Jul 15 15:38:28 1998 Ian Lance Taylor - - * config/tc-i386.c (md_assemble): Don't get confused by trailing - whitespace after a prefix operator. - -Tue Jul 14 15:32:56 1998 Richard Henderson - - * configure.in (i386-*-beos{pe,elf,}*): Recognize. - -Tue Jul 14 12:33:44 1998 Chris Torek - - * config/tc-sparc.c (log2): New static function. - (s_reserve): Use log2 to convert alignment before calling - record_alignment. - (s_common): Use log2 to convert alignment before calling - record_alignment and frag_align. - (sparc_cons_align): Use log2. - -Tue Jul 14 11:58:40 1998 Ian Lance Taylor - - * config/tc-sparc.c (s_reserve): Set symbol size if OBJ_ELF. - (s_common): Likewise. - - * config/tc-sparc.c (sparc_handle_align): Reindent a bit. Correct - initialization of waddr. - (sparc_elf_final_processing): Add default case to switch. - -Tue Jul 14 11:00:16 1998 Alan Modra - - * doc/c-i386.texi: Fix a typo. Use the term 80-bit real rather - than temporary real. - -Mon Jul 13 13:55:42 1998 Ian Lance Taylor - - * write.c (subsegs_finish): Don't align the segments if there were - any errors. - - * config/obj-coff.c (c_symbol_merge): Correct number of bytes when - copying aux information. - - * expr.c (make_expr_symbol): Catch attempts to turn an O_big - expression into a symbol. - -Mon Jul 13 13:29:04 1998 Alan Modra - - * config/tc-i386.c (mode_from_disp_size): Change arg and return - type to unsigned int. - (md_assemble): Change type used to store offsets from unsigned - long to long. - (i386_operand): Switch error check to only call RESTORE_END_STRING - once after parse_register. - -Fri Jul 10 16:00:04 1998 Nick Clifton - - * config/tc-v850.c (md_show_usage): Changed format to match that - of gcc, ld, etc. - - * as.c (show_usage): Changed format to match that of gcc, ld, etc. - -Thu Jul 9 12:09:57 1998 Andreas Schwab - - * config/tc-m68k.c (tc_m68k_fix_adjustable): Don't adjust vtable - relocs. - (md_apply_fix_2): Force the symbol of the vtable reloc to be - weak. - -Thu Jul 9 11:31:54 1998 Ian Lance Taylor - - * doc/Makefile.am (MAINTAINERCLEANFILES): Define. - * doc/Makefile.in: Rebuild. - -Wed Jul 8 12:18:56 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mips.c (mips_ip, case 'i' and 'j'): Mask off high bits - for %lo expressions. - (mips_ip, case 'u'): Move range check after code to mask - off bits in %hi/%lo expressions. Mask off high bits for - %lo expressions. - -Tue Jul 7 17:57:38 1998 Ian Lance Taylor - - * doc/Makefile.am (gasver.texi): New target. - (as.info, as.dvi): Depends upon gasver.texi. - * doc/as.texinfo: Include gasver.texi. Mention version number on - title page and in top node. - * doc/Makefile.in: Rebuild. - -Tue Jul 7 11:42:16 1998 Richard Henderson - - * listing.c (listing_listing): For EDICT_LIST, skip all lines up to - but not including the line containing the edict. - * listing.h (LISTING_EOF): New. - * input-scrub.c (input_scrub_next_buffer): Call it. - -Tue Jul 7 13:00:37 1998 Alan Modra - - * config/tc-i386.c (i386_operand): Don't set the size of an - immediate address based solely on the suffix and the mode. - - * config/tc-i386.c (md_assemble): Add assertion to make sure - overlap2 does not set Imm. - - * config/tc-i386.c (space_chars): Remove. The scrubber converts - sequences of whitespace to a single space. - (is_space_chars): Just compare with space. - (md_begin): Don't initialize space_chars. - (md_assemble): Just skip a single whitespace character. - (i386_operand): Rewrite base-index parsing to use new - parse_register, and to skip white space. Skip white space in a - number of other places too. Don't give error message if - parse_register fails. - (parse_register): Change reg_string parameter to be non-const. - Add end_op parameter. Skip white space after the `%', and return - end of register string. Give error message here rather than - caller. - -Fri Jul 3 15:34:34 1998 Ian Lance Taylor - - Based on patch from Matt Semersky : - * expr.c (op_encoding): Make const. - (expr_set_precedence): New function. - (expr_begin): Don't set operator rankings, just call - expr_set_precedence. - * expr.h (expr_set_precedence): Declare. - * read.c (s_mri): Call expr_set_precedence. - -Thu Jul 2 16:24:58 1998 Ian Lance Taylor - - * doc/as.texinfo (Statements): Remove paragraph discussing - continuing lines with a backslash. This hasn't worked for years, - if it ever did. - -Thu Jul 2 14:06:22 1998 Klaus Kaempf - - * obj-vms.c: Add C++ support with ctors/dtors sections. Add weak - symbol definitions. - (Ctors_Symbols, Dtors_Symbols): New symbol chains. - (ps_CTORS, ps_DTORS): New section types. - (vms_fixup_xtors_section): New function - (Ctors_Psect, Dtors_Psect): Define. - (IS_GXX_XTOR): Define - (global_symbol_directory): Change check of gxx_bug_fixed to 0. - Filter static constructors/destructors and add to - Ctors_Symbols/Dtors_Symbols chain. - (vms_write_object_file): Write Ctors_Symbols/Dtors_Symbols to - appropriate section. - - * tc-alpha.h (TARGET_FORMAT): Rename "evax-alpha" to "vms-alpha". - * makefile.vms: Merge vax/vms support. - -Wed Jul 1 20:06:20 1998 Richard Henderson - - * config/obj-elf.c (obj_elf_vtable_inherit, obj_elf_vtable_entry): New. - (elf_pseudo_table): Add them. - * config/tc-mips.c (mips_force_relocation): Force vtable relocs. - (md_apply_fix): Accept them. - (mips_fix_adjustable): Don't adjust them. - (tc_gen_reloc): Mung BFD_RELOC_VTABLE_ENTRY for Rel. - * config/tc-ppc.c (md_apply_fix3): Accept vtable relocs. - * config/tc-ppc.h (TC_FORCE_RELOCATION_SECTION): Force vtable relocs. - (tc_fix_adjustable): Don't adjust them. - -Wed Jul 1 16:35:32 1998 Doug Evans - - * Makefile.am (CGEN_CPU_PREFIX): New variable. - (cgen.o): Use it. - * Makefile.in: Regenerate. - * configure.in: AC_SUBST cgen_cpu_prefix. - * configure: Regenerate. - -Wed Jul 1 21:38:56 1998 J"orn Rennecke - - * config/tc-sh (COND_JUMP_DELAY, COND12_DELAY_LENGTH): Define. - Changed all users of COND12_DELAY. - -Fri Jun 26 11:21:11 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (set_arch_mach): New function. - (md_pseudo_table): Add pseudo-ops to set the current machine type. - (md_begin): Default to mn10300 mode. - (md_assemble): Only accept instructions for the core mn10300 - chip and the active machine type. - -Wed Jun 24 19:06:04 1998 Ian Lance Taylor - - * subsegs.h (segment_info_type): Give the struct a name. - * config/tc-h8300.h (tc_reloc_mangle): Add prototype. - * config/tc-h8500.h (tc_reloc_mangle): Declare. - * config/tc-sh.h (sh_coff_reloc_mangle): Add prototype. - * config/tc-w65.h (tc_reloc_mangle): Declare. - * config/tc-z8k.h (tc_reloc_mangle): Declare. - -Wed Jun 24 13:45:00 1998 Catherine Moore - - * config/tc-v850.c (v850_comm): Restore old section - after common processing. - -Wed Jun 24 11:50:54 1998 Klaus Kaempf - - * config/obj-vms.c (Create_VMS_Object_File): Force binary file. - -Tue Jun 23 17:47:31 1998 Jim Wilson - - * config/tc-h8300.c (do_a_fix_imm, build_bytes): Replace cast to - char with code that explicitly sign-extends. - -Tue Jun 23 13:54:57 1998 Nick Clifton - - * config/tc-v850.c (md_begin): Restore text section as the current - section after creating call table sections. - * config/obj-coff.h (SYM_AUXINFO): New macro to conceal ugly - code. - - * config/obj-coff.c (c_symbol_merge): Replace complex expresion - with call to macro SYM_AUXINFO. - -Tue Jun 23 15:09:27 1998 Mike Stump - - * Makefile.am (install-exec-local): Don't let EXEEXT interfere - with the program transform name. - * Makefile.in: Rebuild. - -Mon Jun 22 19:52:42 1998 Ian Lance Taylor - - * config/obj-coff.c (c_symbol_merge): Fix copying of auxiliary - information. - -Mon Jun 22 15:18:58 1998 Ian Lance Taylor - - * config/tc-i386.c (i386_operand): Be prepared for a space between - the open parenthesis and the start of the register operand, - because of the June 16 change. - -Sun Jun 21 21:27:03 1998 Ian Lance Taylor - - * config/tc-sh.c (md_apply_fix): Handle weak symbols correctly if - BFD_ASSEMBLER. - -Sun Jun 21 12:26:36 1998 Nick Clifton - - * config/tc-d30v.c (d30v_align): Always perform alignment request, - even if it is belived to be unnecessary. - -Fri Jun 19 13:57:06 1998 Ian Lance Taylor - - * write.c (adjust_reloc_syms): Never adjust relocs against weak - symbols. - * config/tc-mips.c (md_apply_fix): Adjust accordingly. - -Fri Jun 19 09:50:17 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (mn10300_insert_operand): Do not hardcode the - shift amount for a repeated operand. The shift amount for the - repeated copy comes from the size of the operand. - -Fri Jun 19 00:44:19 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-h8300.c (get_operand): Fix typos in ldm/stm support. - -Wed Jun 17 13:07:05 1998 Ian Lance Taylor - - * config/tc-mips.c (md_show_usage): Fix -mipsN usage. - -Tue Jun 16 13:06:21 1998 Alan Modra - - * app.c (do_scrub_begin): If tc_symbol_chars is defined, treat all - characters in it as LEX_IS_SYMBOL_COMPONENT. - * config/tc-i386.h (tc_symbol_chars): Define. - (extra_symbol_chars): Declare. - * config/tc-i386.c (extra_symbol_chars): Define. - (comment_chars): Don't use '/' as comment start if TE_LINUX. - (line_comment_chars): Set to '/' if TE_LINUX. - * doc/c-i386.texi (i386-prefixes): Update. - * doc/internals.texi (CPU backend): Document tc_symbol_chars. - -Fri Jun 12 13:36:54 1998 Tom Tromey - - * po/Make-in (all-yes): If maintainer mode, depend on .pot file. - ($(PACKAGE).pot): Unconditionally depend on POTFILES. - -1998-06-12 Vladimir N. Makarov - - * config/tc-d10v.c (md_apply_fix3): Checking displacement - constraint in instructions REP & REPI. - -Thu Jun 11 08:56:46 1998 Nick Clifton - - * config/tc-d30v.c (md_apply_fix3): Catch BFD_RELOC_8, - BFD_RELOC_16, BFD_RELOC_64 and issue appropriate error messages. - - (check_range): If the operand is shifted, then shift the number - before checking its range. - - * write.c (adjust_reloc_syms): Add more checks for NULL pointers. - - * config/tc-v850.c (v850_comm): Set SEC_COMMON bit on special - common sections. - -Wed Jun 10 17:26:35 1998 Nick Clifton - - * config/tc-v850.c (v850_comm): Create special sections as needed. - -1998-06-10 Vladimir N. Makarov - - * config/tc-d10v.c (write_2_short): Addition of swapping - instructions for sequential and reverse sequential order when - given order is not possible. - -Tue Jun 9 13:52:53 1998 Ian Lance Taylor - - * Makefile.am: Rebuild dependencies. - (DEP_INCLUDES): Fix reference to intl build directory. - * Makefile.in: Rebuild. - -Tue Jun 9 12:20:05 1998 Alan Modra - - * doc/c-i386.texi: Update 16 bit documentation. - - * config/tc-i386.h: Change Data16 to Size16, Data32 to Size32, - IgnoreDataSize to IgnoreSize as they are used for address size as - well as data size. - * config/tc-i386.c: Likewise. Add code to reject addr32/data32 in - 32-bit mode, similarly addr16/data16 and variants. - -Mon Jun 8 18:32:01 1998 Nick Clifton - - * config/tc-d30v.c (md_assemble): Fix handling of reverse - sequential word multiply instructions. - - (do_assemble): Add extra command line argument, to allow mul32 - attribute to be preserved across parallel insns. - (md_assemble): Insert NOPs between explicitly parallel insns which - contain an 32 bit multiply and a 16 multiply. - -Mon Jun 8 12:20:30 1998 Alan Modra - - * config/tc-i386.c: REPNE renamed to REPNE_PREFIX_OPCODE, and - likewise for REPE. - - * config/tc-i386.c (reloc): Add braces. - - * config/tc-i386.c (struct _i386_insn): Rename bi to sib to be - consistent with Intel naming. - * config/tc-i386.h (base_index_byte): Rename to sib_byte. Don't - use bitfields in sib_byte. - (modrm_byte): Don't use bitfields here either. - - * config/tc-i386.c (current_templates): Add const. - (parse_register): Add const to return, param, and char *s. - (i386_operand): Add const to reg_entry *r. - * config/tc-i386.h (templates): Add const to start, end. - - Inspired by code for 16 bit gas support from Martynas Kunigelis - : - * config/tc-i386.c (md_assemble): Add full support for 16 bit - modrm, and Jump, JumpByte, JumpDword, JumpInterSegment insns. - (uses_mem_addrmode): Remove. - (md_estimate_size_before_relax): Add support here too. - (md_relax_table): Rewrite interface to md_relax for 16 bit - support. - (BYTE, WORD, DWORD, UNKNOWN_SIZE): Remove. - (opcode_suffix_to_type): Remove. - (CODE16, SMALL, SMALL16, BIG, BIG16): Define. - (SIZE_FROM_RELAX_STATE): Modify to suit above. - (md_convert_frag): Likewise. - (i386_operand): Add support for 16 bit base/index regs, - immediates, and displacements. Remove some unnecessary casts, and - localise end_of_operand_string, displacement_string_start, - displacement_string_end variables. Add GCC_ASM_O_HACK. - * config/tc-i386.h (NO_BASE_REGISTER_16): Define. - - * config/tc-i386.c (prefix_hash): Remove. - (md_begin): Rewrite without obstacks. Remove prefix hash table - handling. Rewrite lexical table handling. - (i386_print_statistics): Don't print prefix statistics. - (md_assemble): Rewrite instruction parser so that line is not - converted to lower case. Don't do a hash_find for prefixes, - instead recognise them via opcode modifier. - (expecting_operand, paren_not_balanced): Localise variables. - * config/tc-i386.h (IsPrefix): Define. - (prefix_entry): Remove. - - * config/tc-i386.h (PREFIX_SEPERATOR): Don't define. - * config/tc-i386.c (PREFIX_SEPARATOR): Define here instead, using - '\\' in case where comment_chars contains '/'. - - * config/tc-i386.c (MATCH): Ensure given operand and template - match for JumpAbsolute. Makes e.g. `ljmp table(%ebx)' invalid; - you must write `ljmp *table(%ebx)'. - - From H.J. Lu : - * config/tc-i386.c (BFD_RELOC_16, BFD_RELOC_16_PCREL): Define - as 0 ifndef BFD_ASSEMBLER. - (md_assemble): Allow immediate operands without suffix or - other reg operand to default in size to the current code size. - -Mon Jun 8 09:45:00 1998 Catherine Moore - - * config/tc-v850.c (md_begin): Restore creation of - .call_table_text and .call_table_data sections. - -Sat Jun 6 00:02:41 1998 Nick Clifton - - * config/tc-d30v.c (md_assemble): Set execution type to unknown - after emitting a word of noops. - -Fri Jun 5 23:27:04 1998 Alan Modra - - * config/tc-i386.c (mode_from_disp_size): Disp16 is mode 2. - (i386_operand): Simplify checks for valid base/index combinations. - Disallow `in 4(%dx),%al'. - - * config/tc-i386.c (struct _i386_insn): Make regs, base_reg, and - index_reg const. - (add_prefix): Change parameter from char to int. - - * config/tc-i386.h (Ugh): Define opcode modifier. - * config/tc-i386.c (md_assemble): Print warnings for Ugh insns. - - * config/tc-i386.c (md_assemble): Rewrite MATCH and - CONSISTENT_REGISTER_MATCH macros to check register types more - thoroughly. Check for illegal suffix/operand combinations - when matching insns with operands. Handle new `s' suffix, and - associated FloatMF opcode modifier for float insns with memory - operands. - * config/tc-i386.h (FloatMF): Define new opcode modifier. - (No_sSuf, No_bSuf, No_wSuf, No_lSuf): Likewise. - (SHORT_OPCODE_SUFFIX, LONG_OPCODE_SUFFIX): Define. - * config/tc-i386.c: Rename WORD_PREFIX_OPCODE to - DATA_PREFIX_OPCODE throughout. - - * config/tc-i386.c (REGISTER_WARNINGS): Define. - (md_assemble): Rewrite suffix/register operand checking code to be - more thorough. Remove Abs8,16,32. Change occurrences of Mem to - AnyMem, the better to grep. - (pi): Remove Abs. - (i386_operand): Don't set Mem bits in i.types[this_operand] when - given a memory operand. Don't set Abs bits either. - (type_names): Remove Mem*, Abs*. - * config/tc-i386.h (Mem8, Mem16, Mem32, Abs8, Abs16, Abs32): Don't - define opcode_modifiers as these cases are handled by Disp8, - Disp16, Disp32 and suffix checks. - (COMES_IN_BOTH_DIRECTIONS): Remove. - (FloatR): Define. It's OK to share the bit with ReverseRegRegmem. - - * config/tc-i386.c (md_assemble): Don't emit operand size prefix - if IgnoreDataSize modifier given. Remove ShortformW modifier - test. Add test for ShortForm in W base_opcode modification. - Merge Seg2ShortForm and Seg3ShortForm code. - * config/tc-i386.h (ShortFormW): Remove. - (IgnoreDataSize): Define. - -Fri Jun 5 10:50:53 1998 Nick Clifton - - * config/tc-d30v.c (md_assemble): Store previous segment state - with previous instruction. - -Wed Jun 3 18:21:56 1998 Alan Modra - - * config/tc-i386.c (SCALE1_WHEN_NO_INDEX): Define. - (ebp, esp): Remove static variables. - (MATCH): Remove test for InOutPortReg. - (i386_operand): Properly handle InOutPortReg here instead. - Disallows `inb (%dx,2)', `inb %es:(%dx)' and `mov (%dx),%ax' - (md_assemble): Simplify and correct modrm and sib generation. - (i386_operand): Add warning for scale without index. - Rewrite checks for valid base/index combinations. - - * config/tc-i386.c (END_STRING_AND_SAVE): Protect arguments of - macros and enclose in do while(0). - (RESTORE_END_STRING): Likewise. - (md_assemble): Add one to printed operand number so we start - from 1 not 0. Add some more gettext invocations. - (i386_operand): Fix `%%s' -> `%%%s'. Inc printed operand - number here too. - - * config/tc-i386.h (WAIT_PREFIX, LOCKREP_PREFIX, ADDR_PREFIX, - DATA_PREFIX, SEG_PREFIX): Define. - * config/tc-i386.c (struct _i386_insn): Remove wait_prefix field. - (check_prefix): Remove function. - (add_prefix): New function. Add prefix to i.prefix as well as - doing checks. - (md_assemble): Changes for add_prefix. Remove hack for wait - prefix, instead always output prefixes in fixed order. Test - for jcxz/loop when selecting between word & dword operations, - and add address size prefix rather than operand size prefix. - Remove operand -> address size hack when emitting jcxz/loop. - (i386_operand): Remove O_Absent check as it's done in expr. - -Wed Jun 3 15:09:10 1998 Ian Lance Taylor - - * configure.in: Recognize m5200 as a cpu_type of m68k. - * aclocal.m4: Rebuild with current libtool. - * configure: Rebuild. - -Wed Jun 3 14:11:59 1998 Andreas Schwab - - * config/tc-m68k.c (md_estimate_size_before_relax): Add more calls - to relaxable_symbol to prevent references to external symbol from - being relaxed. - -Wed Jun 3 14:10:36 1998 Ian Lance Taylor - - * config/tc-m68k.c (relaxable_symbol): If TARGET_OS is "elf", all - symbols are relaxable. - -Wed Jun 3 09:16:00 1998 Catherine Moore - - * config/tc-v850.c (md_begin): Don't create special - sections by default. - -Tue Jun 2 14:52:56 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mips.c (macro): For div and udiv, close the - reorder block as soon as possible. - -Tue Jun 2 15:36:13 1998 Ian Lance Taylor - - From Matt Semersky : - * macro.c (macro_mri_mode): New function. - * macro.h (macro_mri_mode): Declare. - * read.c (s_mri): Call macro_mri_mode when switching in and out of - MRI mode. - -Tue Jun 2 13:32:22 1998 Klaus Kaempf - - * config/tc-alpha.c (s_alpha_comm): Allow alignment parameter in - OBJ_EVAX case. - - * config/tc-alpha.c (s_alpha_comm): Defer restoring character - until after xstrdup in OBJ_EVAX case. - -Tue Jun 2 13:11:13 1998 Pat Rankin - - * config/tc-vax.c (md_create_short_jump): Fix off by two bug in - offset calculation. Also, use VAX_BRW from vax-inst.h instead - of hardcoded magic number. - (md_create_long_jump): Use VAX_JMP and VAX_ABSOLUTE_MODE macros. - -Tue Jun 2 09:25:34 1998 Doug Evans - - * read.c (do_s_func): New function. - (s_func): Call it. - * read.h (do_s_func): Add prototype. - -Mon Jun 1 12:47:30 1998 Doug Evans - - * config/tc-m32r.c (m32r_do_align): Only fill code sections with - nops if fill pattern not specified. - -Mon Jun 1 14:08:35 1998 Ian Lance Taylor - - From Andrew Crabtree : - * config/te-go32.h (TE_GO32): Define. - * config/tc-i386.h (LOCAL_LABEL): Don't define if TE_GO32. - -Sun May 31 15:43:06 1998 Doug Evans - - Implement .func/.endfunc pseudo-ops. - * read.h (stabs_generate_asm_func,stabs_generate_asm_endfunc): Declare. - (s_func): Declare. - * read.c (potable): Add .func,.endfunc. - (s_func): New function. - * stabs.c (stabs_generate_asm_func,stabs_generate_asm_endfunc): New - functions. - (in_doc_func_p,current_function_label): New static globals. - (stabs_generate_asm_lineno): Emit function relative stabs if in .func. - -Fri May 29 18:13:12 1998 Ian Lance Taylor - - * config/tc-a29k.h (WORKING_DOT_WORD): Define. - * config/tc-alpha.h (WORKING_DOT_WORD): Define. - * config/tc-arm.h (WORKING_DOT_WORD): Define. - * config/tc-h8300.h (WORKING_DOT_WORD): Define. - * config/tc-h8500.h (WORKING_DOT_WORD): Define. - * config/tc-hppa.h (WORKING_DOT_WORD): Define. - * config/tc-i860.h (WORKING_DOT_WORD): Define. - * config/tc-i960.h (WORKING_DOT_WORD): Define. - * config/tc-tic30.h (WORKING_DOT_WORD): Define. - * config/tc-w65.h (WORKING_DOT_WORD): Define. - * config/tc-z8k.h (WORKING_DOT_WORD): Define. - * config/tc-a29k.c: Don't define md_short_jump_size, - md_long_jump_size, md_create_short_jump or md_create_long_jump. - * config/tc-alpha.c: Likewise. - * config/tc-alpha.h: Likewise. - * config/tc-arm.c: Likewise. - * config/tc-h8300.c: Likewise. - * config/tc-h8500.c: Likewise. - * config/tc-hppa.c: Likewise. - * config/tc-i860.c: Likewise. - * config/tc-i960.c: Likewise. - * config/tc-ppc.c: Likewise. - * config/tc-sh.c: Likewise. - * config/tc-sparc.h: Likewise. - * config/tc-tic30.c: Likewise. - * config/tc-w65.c: Likewise. - * config/tc-z8k.c: Likewise. - -Fri May 29 16:03:26 1998 Pat Rankin - - * config/tc-vax.c (_): Delete this macro used for placeholder - values in vax_operand_width_size; it conflicts with the _() macro - used for internationalization. - -Fri May 29 13:46:07 1998 Ian Lance Taylor - - * symbols.c (symbol_find_base): Fix case insensitive symbol name - code. From Chris Moller . - - Based on patch from Klaus Kaempf : - * struc-symbol.h (struct broken_word): Add seg and subseg fields. - * read.c (emit_expr): Initialize seg and subseg fields of a new - broken word. - * write.c (write_object_file): Switch to the appropriate segment - and subsegment when processing a broken word. - - * config/tc-m68k.c (mri_assemble): New static function. - (build_mri_control_operand): Call mri_assemble rather than - md_assemble. - (s_mri_else, s_mri_break, s_mri_next, s_mri_for): Likewise. - (s_mri_endf, s_mri_endw): Likewise. - -Wed May 27 11:16:25 1998 Ian Lance Taylor - - * read.c (s_org): Call md_flush_pending_output if it is defined. - - * config/tc-sparc.c (md_show_usage): Add \n\ to new string. - -Tue May 26 19:27:52 1998 Stan Cox - - * config/tc-sparc.c (OPTION_LITTLE_ENDIAN_DATA): New. - (md_parse_option): Add for same. - (sparc_md_end): Set bfd_mach_sparc_sparclite_le. - (md_apply_fix3, tc_gen_reloc): Allow BFD_RELOC_SPARC_32LE. - (cons_fix_new_sparc): Added to create BFD_RELOC_SPARC_32LE. - - * config/tc-sparc.h (cons_fix_new_sparc): Added. - -Thu May 21 15:02:41 1998 Nick Clifton - - * config/tc-arm.c (find_real_start): Relax definition of local - labels. - -Tue May 19 16:59:44 1998 Nick Clifton - - * config/tc-d30v.c (d30v_align): Apply address adjustment to all - symbols at the given address, not just the last one specified. - -Tue May 19 08:25:19 1998 Catherine Moore - - * config/tc-sparc.c (sparc_handle_align): Use number_to_chars_bigendian - or number_to_chars_littleendian to write data. - -Mon May 18 17:09:30 1998 Nick Clifton - - * config/tc-v850.c (md_assemble): Remove artificially created - register name symbols. - -Mon May 18 13:47:06 1998 Doug Evans - - * write.c (fixup_segment): Change "segment" to "section" in - error message. - -Mon May 18 16:55:40 1998 Michael Meissner - - * write.c (fixup_segment): Change sym1-sym2 message again. - -Mon May 18 09:31:43 1998 Michael Meissner - - * write.c (fixup_segment): Improve error message for sym1-sym2 - errors when sym1 is in a different segment from sym2. - -Wed May 13 10:16:37 1998 Doug Evans - - * config/tc-m32r.c (warn_unmatched_high): New static local. - (OPTION_WARN_PARALLEL): Rename from OPTION_WARN. - (OPTION_NO_WARN_PARALLEL): Rename from OPTION_NO_WARN. - (md_longopts): Recognize --{no-,}warn-unmatched-high. - (md_parse_option): Likewise. - (md_show_usage): Likewise. - (m32r_frob_file): Likewise. - - * read.c (generate_file_debug,generate_lineno_debug): New functions. - (read_a_source_file): Call them. - * read.h (stabs_generate_asm_file): Declare. - * stabs.c (stabs_generate_asm_file): New function. - (generate_asm_file): New function. - (stabs_generate_asm_lineno): Move file name handling into - generate_asm_file. - -Tue May 12 12:03:44 1998 Richard Henderson - - * config/tc-d30v.c (cur_mul32_p, prev_mul32_p): Make static. - (d30v_current_align, d30v_current_align_seg): New variables. - (d30v_last_label): New variable. - (d30v_align, s_d30v_align, s_d30v_text): New functions. - (s_d30v_data, s_d30v_section): Likewise. - (md_pseudo_table): Call them. - (md_begin): Initialize d30v_current_align_seg. - (md_assemble): Call d30v_align when needed by known current alignment. - (d30v_frob_label, d30v_cons_align): New functions. - * config/tc-d30v.h (md_do_align): Remove. - (tc_frob_label): Call d30v_frob_label. - (md_cons_align): New. - - * config/tc-d30v.c (find_format): Convert complex expressions to - expression symbols before processing. Clean up code formatting. - -Sun May 10 22:35:02 1998 Jeffrey A Law (law@cygnus.com) - - * po/Make-in (install-info): New target. - -Thu May 7 15:49:07 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (md_assemble): Handle "bra" just like "jmp" - instructions. - * config/tc-mn10300.c (md_assemble): Likewise. - -Thu May 7 11:47:22 1998 Doug Evans - - * Makefile.am: Update with `make dep-am'. - (HFILES): Add cgen.h. - (cgen.o): Depend on cgen.h. - * Makefile.in: Regenerate. - - * cgen.c (cgen_md_apply_fix3): Don't pass newline to as_warn_where. - -Thu May 7 13:20:56 1998 Anders Blomdell - - * gasp.c (grab_label): Permit a label to be a preprocessor - variable by permitting a label to start with a backslash. - -Thu May 7 12:50:33 1998 Frank Ch. Eigler - - * config/tc-mips.c (validate_mips_insn): Removed hack - for previously inaccessible bitfields in some INSN_TRAP - instructions. - -Thu May 7 11:13:00 1998 Frank Ch. Eigler - - * config/tc-d30v.c (do_assemble): Abort with error message - if opcode operands do not match. - -Thu May 7 09:36:06 1998 Frank Ch. Eigler - - * config/tc-mips.c (macro_build, validate_mips_insn): Implement - 'q' operand format for 20-bit "break"/"sdbbp" instructions. - (mips_ip): Truncate overflowed "break" 'c' operand. Implement - similar new 'q' operand. - -Thu May 7 07:47:14 1998 Michael Meissner - - * cgen.c (cgen_asm_finish_insn): Fix typo. - -Thu May 7 02:19:14 1998 Doug Evans - - * cgen.h: New file. - * cgen.c: Include it. - (MAX_FIXUPS): Renamed to CGEN_MAX_FIXUPS. - (cgen_asm_finish_insn): Result is now void. New arg `result'. - All callers updated. - * config/tc-m32r.c: Include cgen.h. - (m23r_insn): New members num_fixups,fixups. - -Wed May 6 16:29:19 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (md_apply_fix): Slightly rework some code - to avoid compiler warning. - -Wed May 6 15:26:34 1998 Klaus Kaempf - - * makefile.vms: Run dec c with /nodebug. Pass CC value when - calling make. - - * makefile.vms (OBJS): Add ehopt.obj - -Wed May 6 15:11:12 1998 Klaus Kaempf - - * doc/c-vax.texi: Correct and extend vax/vms documentation. - -Wed May 6 11:51:51 1998 Richard Henderson - - * config/tc-d30v.c (do_assemble): Accept a new parameter requesting - a short format insn. - (md_assemble): Set it for explicitly packed insns. - -Tue May 5 13:23:13 1998 Nick Clifton - - * config/obj-coff.c (c_symbol_merge): Do not take address of - native fields when performing the memcpy. - -Tue May 5 13:10:41 1998 Gavin Koch - - * config/tc-mips.c (macro,macro2): Implement - M_DMULO_I, M_MULO_I, M_DMULOU_I, and M_MULOU_I. - -Mon May 4 17:49:14 1998 Andreas Schwab - - * config/tc-m68k.h (TC_RELOC_RTSYM_LOC_FIXUP): Changed to keep - relocations against globally visible symbols. - * config/tc-m68k.c (relaxable_symbol): New macro. - (m68k_ip, md_estimate_size_before_relax): Use it. - (tc_m68k_fix_adjustable): Also handle weak symbols. - -Mon May 4 16:12:23 1998 Ian Lance Taylor - - * config/tc-i386.h (TC_RELOC_RTSYM_LOC_FIXUP): Keep relocs for all - references to externally visible symbols. - * config/tc-i386.c (md_apply_fix3): When OBJ_ELF, don't add the - values in twice for a PC relative reloc if the symbol is - externally defined. - - * config/tc-sparc.h (tc_fix_adjustable) [OBJ_AOUT]: When PIC, - don't adjust a PC relative reloc against an externally visible - symbol. - * config/tc-sparc.c (md_apply_fix3): When generating a.out PIC, - for a PC relative fixup against an externally visible defined - symbol, arrange to store object file and addend values as though - the symbol were not defined. - (tc_gen_reloc): Likewise. - -Thu Apr 30 13:09:39 1998 Fred Fish - - * read.c (sizeof_leb128): Referenced externally by write.c so - don't inline. - -Wed Apr 29 15:45:57 1998 Michael Meissner - - * config/tc-m32r.c ({,expand_}debug_sym): New functions to record - and expand a 'debug' symbol associated with the next instruction - that does not cause a short instruction to be filled with a NOP. - (md_pseudo_table): Add support for .debugsym. - (assemble_parallel_insn): Add calls to expand_debug_sym as - appropriate. - (md_assemble): Ditto. - -Tue Apr 28 19:16:26 1998 Tom Tromey - - * as.c (main): Conditionally call setlocale. - * gasp.c (main): Likewise. - * asintl.h: Include if HAVE_LOCALE_H. - (LC_MESSAGES): Now can be defined even when ENABLE_NLS. - -Tue Apr 28 18:33:23 1998 Frank Ch. Eigler - - * config/tc-d30v.c (md_show_usage): Correct gettext typo. - -Tue Apr 28 12:16:30 1998 Ian Lance Taylor - - * config/tc-hppa.c: Change all calls to bzero to use memset. - (pa_ip): Add cast to avoid warning. - (tc_gen_reloc, md_apply_fix): Likewise. - (pa_find_space_by_number): Likewise. - (hppa_force_relocation): Likewise. - (pa_block): Change i to unsigned int. - * config/obj-som.h (obj_som_copyright): Declare. - -Tue Apr 28 11:35:56 1998 Frank Ch. Eigler - - * ecoff.c (ecoff_build_lineno): Do not use dummy first_lineno - for line numbers for assembly source. - -Mon Apr 27 15:58:46 1998 Ian Lance Taylor - - * configure.in: Change version number to 2.9.4 - * configure: Rebuild. - -Mon Apr 27 12:07:33 1998 Doug Evans - - * cgen.c (cgen_asm_finish_insn): New arg relax_p. All callers updated. - -Mon Apr 27 15:16:12 1998 Ian Lance Taylor - - * ecoff.h: Change symbolS in function declaration to struct - symbol. - -Sun Apr 26 13:44:22 1998 Ian Lance Taylor - - * config/tc-sh.c (parse_reg): Add casts to avoid warnings. - (md_convert_frag): Fix i18n typo. - -Sat Apr 25 20:12:02 1998 Richard Henderson - - * ecoff.c (ecoff_get_cur_proc_sym): New function. - * ecoff.h: Protoype it. - * config/tc-alpha.c [ELF] (s_alpha_prologue): New function. - [EVAX] (s_alpha_prologue): Delete. - (md_pseudo_table): Update. - -Sat Apr 25 14:00:52 1998 Ian Lance Taylor - - * config/tc-i960.c (md_assemble): Change bp_error_msg from static - array to local pointer. - (get_args, parse_expr): Add casts to avoid warnings. - -Fri Apr 24 12:47:42 1998 Philippe De Muyter - - * read.c (s_set): Cast xmalloc return value to fragS *. - * config/tc-m68k.c (m68k_ip): Function made static to match - previous forward declaration. - (insert_reg, init_regtable, md_convert_frag_1): Likewise. - -Fri Apr 24 09:26:46 1998 Nick Clifton - - * config/tc-v850.c: Add internationalisation macros to error - strings. - - * config/tc-m32r.c (can_make_parallel): Add internationalisation - macros to error strings. - -Thu Apr 23 19:23:23 1998 Ian Lance Taylor - - * config/tc-ppc.c (ppc_fix_adjustable): Correct test of whether a - reloc is in the TOC csect. - (md_apply_fix3): Correct gettext typo. - -Thu Apr 23 14:58:31 1998 Nick Clifton - - * config/tc-arm.c (find_real_start): Ignore symbols starting with - .L - they are local labels and the branches are not really - function calls but rather far jumps. - -Wed Apr 22 15:57:21 1998 Tom Tromey - - * po/Make-in (MKINSTALLDIRS): Don't look in $(top_srcdir). - -Wed Apr 22 14:52:36 1998 Ian Lance Taylor - - * config/tc-i386.c (md_assemble): Print operand number rather than - using ordinal_names. - (i386_operand): Likewise. - -Tue Apr 21 22:34:25 1998 Tom Tromey - - * Makefile.am (INTLLIBS): Define to work around apparent automake - bug. - All Makefiles: Regenerated. - - * Many files: Added gettext invocations around user-visible - strings. - * acconfig.h (ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT, HAVE_STPCPY, - HAVE_LC_MESSAGES): Define. - * dep-in.sed: Added asintl.h. - * po/Make-in: New file. - * gasp.c (main): Call setlocale, bindtextdomain, and textdomain. - Include "asintl.h". - * read.c (Z_): Renamed from `_'. - * Makefile.am (SUBDIRS): Added po. - (POTFILES): new macro. - (po/POTFILES.in): New target. - ($(OBJS)): Added asintl.h. - (HFILES): Likewise. - (INCLUDES): Added -DLOCALEDIR, -I$(top_srcdir)/../intl. - (as_new_LDADD): Added $(INTLLIBS). - (as_new_DEPENDENCIES): Added $(INTLDEPS). - (gasp_new_LDADD): Added $(INTLLIBS). - (gasp_new_DEPENDENCIES): New macro. - * configure, aclocal.m4: Rebuilt. - * configure.in: Call CY_GNU_GETTEXT. Generate po/Makefile.in and - po/Makefile. - (ALL_LINGUAS): Define. - * macro.c: Include "asintl.h". - * as.c (main): Call setlocale, bindtextdomain, and textdomain. - * as.h: Include "asintl.h". - * config/tc-i386.c (ordinal_names): Removed. - (md_assemble): Changed error text to avoid ordinal_names. - (i386_operand): Likewise. - (reloc): Added as_bad to avoid i18n problems. - (tc_gen_reloc): Likewise. - * config/tc-arm.c (bad_args): Now a #define. - (bad_pc): Likewise. - * config/obj-vms.c (VMS_stab_parse): Changed type of - `long_const_msg'. - (global_symbol_directory): Unified strings to avoid i18n - problems. - * config/tc-m68k.c (get_reloc_code): Added some as_bad calls to - avoid i18n problems. - * config/tc-ns32k.c (reloc): Added as_bad to avoid i18n problems. - * config/tc-ppc.c (md_apply_fix3): Added as_bad_where to avoid - i18n problems. - * config/tc-sh.c (md_convert_frag): Added as_bad to avoid i18n - problems. - * config/tc-v850.c (md_assemble): Changed C++ comment into C - comment. - * config/tc-vax.c (md_assemble): Added as_warn to avoid i18n - problems. - * as.c (print_version_id): Added an fprintf to avoid i18n - problems. - * cond.c (cond_finish_check): Added as_bad call to avoid i18n - problems. - * expr.c (expr): Added as_warn call to avoid i18n problems. - * messages.c (as_assert): Changed code to avoid i18n problems. - (as_abort): Likewise. - * read.c (pseudo_set): Added as_bad call to avoid i18n problems. - (s_space): Likewise. - * po/Make-in, po/POTFILES.in, po/gas.pot: New files. - -Tue Apr 21 17:01:22 1998 Alan Modra - - * config/tc-i386.c (check_prefix): New static function, split out - from md_assemble. - (struct _i386_insn): Add wait_prefix field. - (md_assemble): Remove wait_prefix local variable. Use - check_prefix when adding a prefix. - - * config/tc-i386.c (current_templates): New static variable. - (md_assemble): Remove current_templates local variable. - (md_assemble, i386_operand): Improve error and warning messages in - many places. Add RESTORE_END_STRING in many places before error - return. Clarify some comments. - - * config/tc-i386.c (struct _i386_insn): Change seg field to a two - element array. - (md_assemble): Parse string instruction operands, looking for - segment override prefixes. Check for invalid segment prefixes on - string instruction. - (i386_operand): i.seg[] and max mem_operand changes for string - insns. - * config/tc-i386.h (EsSeg): Define. - - * config/tc-i386.h (regKludge): Define. - (iclrKludge, imulKludge): Don't define. - * config/tc-i386.c (md_assemble): Merge imulKludge and iclrKludge - code. Move ReverseRegRegmem fudges into Modrm case. Reorder - opcode_modifier checks to look for more common cases first. Add - default_seg for IsString case. - -Tue Apr 21 16:18:12 1998 Ian Lance Taylor - - * configure.in: Call AM_PROG_LEX rather than AC_PROG_LEX and - AC_DECL_YYTEXT. - * configure: Rebuild with new automake and libtool. - * aclocal.m4, Makefile.in: Likewise. - - * doc/Makefile.am (as.dvi): New target. - * doc/Makefile.in: Rebuild. - -Sat Apr 18 01:21:04 1998 Stan Cox - - * configure.in: Added sparc86x support. - - * configure: Rebuild. - - * config/tc-sparc.c (lookup_arch): Added arch_type to struct - sparc_arch. - (md_parse_option): Warn if -EL is not supported for this architecture. - - * config/tc-sparc.h (SPARC_BIENDIAN) Always define. - -Sat Apr 18 01:19:01 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mips.c (mips_ip): Note when we use get match on - the full instruction name. - -Wed Apr 15 15:17:27 1998 Richard Henderson - - * symbols.c (resolve_symbol_value) [O_symbol]: Also store the symbol - back into the expression to handle add/sub simplification correctly. - -Wed Apr 15 07:06:04 1998 Catherine Moore - - * config/tc-mips.c (hilo_interlocks): Remove 4300. - -Mon Apr 13 16:51:04 1998 Nick Clifton - - * config/tc-arm.c (do_msr): Support undocumented 'msr cpsr_flg, - #' instruction. - -Thu Apr 9 10:29:42 1998 Doug Evans - - * symbols.c (max_indent_level): New global. - (print_symbol_value_1): Use it. - * expr.h (expr_build_dot): Declare. - * expr.c (expr_build_dot): New function. - -Wed Apr 8 16:16:11 1998 Doug Evans - - * symbols.c (print_binary): New function. - (print_expr_1): Call it. - -Mon Apr 6 12:06:39 1998 Andreas Schwab - - * config/tc-m68k.c (m68k_ip, case "#B"): Install the offset of the - operand in the opcode. - -Fri Apr 3 11:58:19 1998 Alan Modra - - * config/tc-i386.h: Reorder operand flags and opcode modifier - flags for clarity. Remove unused definitions: Unknown, - ImmUnknown, DispUnknown, NoModrm. - * config/tc-i386.c (type_names): Add missing Debug type. - (md_assemble): Better duplicate prefix checking. Quicker string - instruction check via new opcode_modifier flag. - -Fri Apr 3 11:44:34 1998 Ian Lance Taylor - - * doc/as.texinfo (Invoking): Clarify -Wa example. - -Fri Apr 3 09:12:23 1998 Gavin Koch - - * config/tc-mips.c (mips_pseudo_table): Add weakext entry. - (s_mips_weakext): Define. - * ecoff.c (ecoff_directive_weakext): Don't define if defined(TC_MIPS). - * config/obj-ecoff.c (obj_pseudo_table): Don't add weakext if - defined(TC_MIPS). - -Thu Apr 2 22:42:02 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (tc_gen_reloc): The difference of two symbols - is an error if the value can not be computed at assembly time. - * config/tc-mn10300.c (tc_gen-reloc): Likewise. - -Thu Apr 2 16:36:47 1998 Ian Lance Taylor - - * gasp.c (main): Set next field of new include_path structure to - NULL. From Avery Pennarun . - - * read.c (s_mri_sect): Call as_bad rather than abort for an - unsupported MRI target. - -Wed Apr 1 11:08:27 1998 Nick Clifton - - * config/tc-arm.c (arm_validate_fix): New function. Determine if - the destination of a branch instruction should be altered. - (find_real_start): New function: Locate the real, Thumb coded - start of a Thumb function. - (do_t_branch23): Alter the destination of branches to Thumb - functions. - - * config/tc-arm.h: Define TC_VALIDATE_FIX. - -Tue Mar 31 13:27:33 1998 Dean M. Deaver - - * config/tc-arm.c (decode_shift): Handle addressing mode 2 w/rrx - also. - -Wed Apr 1 13:13:20 1998 Andreas Schwab - - * doc/as.texinfo: Use @itemx for a secondary item in a table. - * doc/c-hppa.texi: Likewise. - -Tue Mar 31 17:52:40 1998 Ian Lance Taylor - - * Makefile.am: Rebuild dependencies. - * Makefile.in: Rebuild. - - * Makefile.am (DEP_INCLUDES): New variable. - (.dep1): Change to work when srcdir is not an absolute path. - (.tcdep, .objdep, .dep2, dep.sed): Likewise. - * Makefile.in: Rebuild. - -Mon Mar 30 12:46:48 1998 Ian Lance Taylor - - * config/tc-i386.h, config/tc-i386.c: Revert March 24 - LinearAddress patch. - - * configure.in: Set version to 2.9.1. - * configure: Rebuild. - - * Branched binutils 2.9. - -Mon Mar 30 11:22:08 1998 Alan Modra - - * config/tc-i386.h (FWait): Define. - * config/tc-i386.c (md_assemble): Emit fwait prefix before any - other prefixes. Check FWait flag in opcode table to see which - instructions require an fwait prefix. - -Mon Mar 30 10:12:00 1998 Andreas Schwab - - * stabs.c (get_stab_string_offset): Always create a stab string - section. - -Sat Mar 28 22:28:02 1998 Ian Lance Taylor - - Fix some gcc -Wall warnings: - * atof-generic.c (atof_generic): Add casts to avoid warnings. - * ehopt.c (eh_frame_code_alignment): Likewise. - * expr.c (integer_constant, operand): Likewise. - * frags.c (frag_align): Likewise. - * gasp.c (level_0, change_base, doinstr): Likewise. - * hash.c (hash_ask): Likewise. - * listing.c (listing_page, calc_hex, print_lines): Likewise. - (debugging_pseudo): Likewise. - * macro.c (define_macro, check_macro): Likewise. - * read.c (read_a_source_file, s_align, s_float_space): Likewise. - (ignore_rest_of_line, float_cons): Likewise. - * symbols.c (decode_local_label_name): Likewise. - * write.c (record_alignment, cvs_frag_to_fill): Likewise. - (fixup_segment, number_to_chars_bigendian): Likewise. - (number_to_chars_littleendian): Likewise. - * config/atof-ieee.c (gen_to_words): Likewise. - * config/tc-sparc.c (md_begin, md_assemble): Likewise. - (sparc_ip, parse_keyword_arg, s_common): Likewise. - * read.c (output_big_sleb128): Initialize locals to avoid - warnings. - (output_big_uleb128, equals): Likewise. - * atof-generic.c (atof_generic): Change number_of_digits_* locals - to unsigned int. Change zeros to unsigned int. - * cond.c (s_if): Add return to default case. - * frags.c (frag_now_fix): Change return type to addressT. - * frags.h (frag_now_fix): Update declaration. - * listing.c (file_info_struct): Change linenum to unsigned int. - (struct list_info_struct): Change hll_line to unsigned int. - (print_source): Update format string. - * read.c (emit_expr): Change scan to unsigned int, and don't - bother to initialize it. - * symbols.c (dollar_label_count): Change to unsigned long. - * write.c (adjust_reloc_syms): Remove unused label reduce_fixup. - * config/tc-sparc.c (sparc_memory_model): Only define if OBJ_ELF. - * config/tc-sparc.c (tc_gen_reloc): Add return to default case. - -Fri Mar 27 12:46:47 1998 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Check legal addressing modes for - mcf5200 just as we do for m68000. - (m68k_init_after_args): Likewise. - (md_estimate_size_before_relax): Likewise. - -Fri Mar 27 10:30:01 1998 Catherine Moore - - * config/tc-v850.c (md_assemble): Store relocation addend in - fixup instead of instruction. - -Thu Mar 26 23:07:18 1998 Alan Modra - - * config/tc-i386.c (md_assemble): Swap template arguments to - CONSISTENT_REGISTER_MATCH macro in reverse direction test. - This macro is currently symmetric, so passing them the wrong - way didn't cause any problem, but may if the macro is changed - in the future. - After copying template to i.tm, use i.tm. rather than t-> to - access fields, and make t a const* - Move i.tm.operand_types[] swap to immediately after the copy. - -Wed Mar 25 13:44:18 1998 Doug Evans - - * expr.h (expr_build_uconstant): Add prototype. - (expr_build_unary,expr_build_binary): Add prototypes. - * expr.c (expr_build_uconstant): New function. - (expr_build_unary,expr_build_binary): New functions. - -Wed Mar 25 13:10:42 1998 Bruno Haible - - * gasp.c (IS*): Cast argument to unsigned char, not unsigned int. - * macro.c (macro_expand_body): Increase buffer size. - * messages.c (as_warn): Likewise. - (as_warn_where, as_bad, as_bad_where): Likewise. - -Wed Mar 25 12:59:07 1998 Ian Lance Taylor - - Based on patch from H.J. Lu : - * Makefile.am (DISTSTUFF): New variable. - (diststuff): New target. - * Makefile.in: Rebuild. - -Tue Mar 24 16:51:29 1998 Nick Clifton - - * config/tc-m32r.h (md_cleanup, md_elf_section_change_hook): Call - m32r_elf_section_change_hook. - - * config/tc-m32r.c (m32r_elf_section_change_hook): New function to - emit a nop if a section ends with a 16 bit instruction. - -Tue Mar 24 19:48:09 1998 Ian Lance Taylor - - * config/obj-coff.c (obj_coff_bss): Compile unconditionally. Call - s_lcomm rather than obj_coff_lcomm. - (obj_pseudo_table): Compile .bss pseudo-op unconditionally. - -Tue Mar 24 18:30:58 1998 H.J. Lu - - * config/tc-i386.h (LinearAddress): Define. - * config/tc-i386.c (md_assemble): If LinearAddress is set for the - instruction, don't use a default segment. - -Mon Mar 23 18:53:40 1998 Joel Sherrill - - * configure.in: (sh*-*-rtems*): Switched from ELF to COFF. - * configure: Rebuild. - -Fri Mar 20 19:15:44 1998 Ian Lance Taylor - - * aclocal.m4, configure: Rebuild with libtool 1.2. - -Thu Mar 19 16:03:12 1998 Nick Clifton - - * config/tc-arm.c (md_apply_fix3): fix code to test the range of - PC relative branches. Patch courtesy of Jonathan Walton. - - -Wed Mar 18 09:29:51 1998 Nick Clifton - - * configure.in (emulations): Add thumb-pe target. - - * configure (emulations): Add thumb-pe target. - -1998-03-17 Ken Raeburn - - * itbl-lex.l (yywrap): Don't define if already defined as a - macro. - -Fri Mar 13 16:31:38 1998 Tom Tromey - - * depend.c (quote_string_for_make): New function. - (wrap_output): Use it. - -Thu Mar 12 18:28:22 1998 Nick Clifton - - * config/obj-elf.c (obj_elf_section): Set bss flag in seg_info - structure if type is SHT_NOBITS. [Bug fix courtesy of rth] - -Sat Feb 28 17:28:55 1998 Richard Henderson - - * config/tc-alpha.c (md_shortopts, md_longopts, md_parse_option): - Recognize -GN and -relax. - (md_begin): Initialize gp size from -G switch. - (alpha_force_relocation): Always force if -relax. - (alpha_align): Take a new argument that will specify when to - emit an R_ALPHA_ALIGN relocation (though we don't do that now). - Change all callers. Emit nop alignment padding as nop+unop pair. - -Sat Feb 28 17:06:22 1998 Richard Henderson - - * config/obj-elf.c [TC_ALPHA]: Include . - * config/tc-alpha.h (ELF_TC_SPECIAL_SECTIONS): New. - -Thu Feb 26 15:49:04 1998 Michael Meissner - - * config/tc-d30v.c (write_2_short): Delayed jsr instructions don't - require padding to the next long word boundary. - -Mon Feb 23 11:29:06 1998 Doug Evans - - * cgen.c: #include symcat.h. - * config/tc-m32r.c: Likewise. - -Mon Feb 23 10:27:40 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mips.c (mips_ip, case 'P'): Make 'P' arguments be - absolute expressions instead of '$' prefixed register names. - -Sat Feb 21 22:36:52 1998 Richard Henderson - - * read.c (s_set): Record file and line info for symbols when -as. - (pseudo_set): Don't overwrite that dummy fragment. - -Fri Feb 20 15:03:13 1998 Ian Lance Taylor - - * config/tc-ppc.c (md_pseudo_table): Add "section". - (ppc_named_section): New static function. - -Thu Feb 19 22:25:42 1998 Richard Henderson - - * tc-ppc.c (ppc_biei): Cache the last symbol we inserted - so we don't have to scan the entire list. - -Tue Feb 17 17:02:15 1998 Fred Fish - - * config/tc-d30v.c (parallel_ok): For the explicitly parallel - case, allow the parallel instructions to modify the same flag - bits. - -Thu Feb 19 16:08:15 1998 Richard Henderson - - * listing.c (list_symbol_table): Categorize symbols by - undefined_section rather than sy_frag->line == NULL. - -Wed Feb 18 23:39:46 1998 Richard Henderson - - * Makefile.am (install-exec-local): Install properly when ln - fails or tooldir == prefix. - -Tue Feb 17 18:58:51 1998 Doug Evans - - * cgen.c (cgen_md_apply_fix3): Delete call to validate_operand. - Test result of insert_operand for error. - -Fri Feb 13 16:41:42 1998 Ian Lance Taylor - - * Makefile.am (AUTOMAKE_OPTIONS): Add cygnus. - * configure, Makefile.in, aclocal.m4: Rebuild with automake 1.2e. - * doc/Makefile.am (AUTOMAKE_OPTIONS): Define. - * doc/Makefile.in: Rebuild. - -Fri Feb 13 00:47:44 1998 Ian Lance Taylor - - * config/tc-mips.c (macro_build): Handle operand type 'C'. - (macro): Fix handling of M_COP[0-3]. - -Thu Feb 12 14:06:59 1998 Ian Lance Taylor - - Based on patches from Ross Harvey : - * macro.c (ISSEP): Only treat '<' and '>' as separator characters - if macro_alternate or macro_mri. - (getstring): Remove support for byte constants between < and >. - (get_any_string): '<' only starts a string if macro_alternate or - macro_mri. - (macro_expand_body): Permit keyword parameters following - positional parameters. - - NetBSD patches from Gordon W. Ross : - * configure.in (alpha*-*-netbsd*): New target. - * config/te-nbsd.h (LOCAL_LABELS_FB): Define. - * configure: Rebuild. - - * as.h (flag_warn_suppress_instructionswap): Move from here... - * config/tc-d10v.c (flag_warn_suppress_instructionswap): ...to - here, and make static. - - * ehopt.c (eh_frame_code_alignment): Only use seg_info if - BFD_ASSEMBLER or MANY_SEGMENTS. - - * as.c (show_usage): Update bug-gnu-utils address. - * gasp.c (show_usage): Likewise. - * doc/as.texinfo (Bug Reporting): Likewise. - -Wed Feb 11 23:26:28 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mips.c (load_address): Don't use mips III or mips IV - insns regardless of the size of a pointer if we're in mips I or - MIPS II mode. - (macro, macro2, s_cprestore, s_cpadd): Likewise. - -Thu Feb 12 03:41:00 1998 J"orn Rennecke - -Fix rac to accept only a0: - * tc-d10v.c (parallel_ok, find_opcode): - Split OPERAND_ACC into OPERAND_ACC0 and OPERAND_ACC1. - Introduce OPERAND_GPR. - -Wed Feb 11 16:28:13 1998 Richard Henderson - - * read.c (s_fill): Handle non-constant repeat counts by creating - an rs_space fragment. - -Tue Feb 10 18:31:31 1998 Ian Lance Taylor - - * config/tc-i386.c (i386_operand): Change error added Jan 2 1998 - from as_bad to as_warn. - -Tue Feb 10 18:04:00 1998 Jim Lemke - - * as.c: (perform_an_assembly_pass): Use [TEXT|DATA|BSS]_SECTION_NAME - * as.h: Define default values of [TEXT|DATA|BSS]_SECTION_NAME - * config/obj-elf.c (elf_begin): Use [TEXT|DATA|BSS]_SECTION_NAME - -Tue Feb 10 17:58:18 1998 Ian Lance Taylor - - * ehopt.c (eh_frame_code_alignment): If not BFD_ASSEMBLER, use - seg_fix_rotP rather than fix_root from seg_info. - -Tue Feb 10 15:32:22 1998 Ian Carmichael - - * expr.c: Add support for 0x1_2_3_4 bignums. - -Tue Feb 10 14:43:40 1998 Ian Lance Taylor - - * configure.in: Change -linux* to -linux-gnu*. - * configure: Rebuild. - - * app.c (do_scrub_begin): Treat \r as whitespace. - -Mon Feb 9 14:16:11 1998 Ian Lance Taylor - - * Makefile.am: Update dependencies. - * Makefile.in: Rebuild. - -Sat Feb 7 15:33:51 1998 Ian Lance Taylor - - * configure, aclocal.m4: Rebuild with new libtool. - -Fri Feb 6 16:08:30 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mips.c (md_begin): If mips_cpu is set, then use it as - the argument to bfd_set_arch_mach. - (load_address): Use bfd_arch_bits_per_address to determine the - bit size of an address instead of looking at the isa level. - (macro, macro2, s_cprestore, s_cpadd): Likewise. - -Fri Feb 6 14:44:34 1998 Nick Clifton - - * config/tc-v850.c (md_parse_option): Add -mv850any command line option. - -Thu Feb 5 12:39:08 1998 Ian Lance Taylor - - * ehopt.c: New file. - * as.h (enum _relax_state): Add rs_cfa. - (check_eh_frame, eh_frame_estimate_size_before_relax): Declare. - (eh_frame_relax_frag, eh_frame_convert_frag): Declare. - * read.c (emit_expr): Call check_eh_frame. - * write.c (cvt_frag_to_fill): Handle rs_cfa. - (relax_segment): Likewise. - * Makefile.am: Rebuild dependencies. - (GAS_CFILES): Add ehopt.c. - (GENERIC_OBJS): Add ehopt.o. - * doc/internals.texi (Frags): Document rs_cfa. - - * as.c (show_usage): Mention --traditional-format. - (parse_args): Accept --traditional-format. - * as.h (flag_traditional_format): Declare. - * output-file.c (output_file_create): If flag_traditional_format, - set BFD_TRADITIONAL_FORMAT on stdoutput. - * doc/as.texinfo, doc/as.1: Document --traditional-format. - - * config/tc-mips.c (append_insn): Make sure that if we have a - fixup for an unmatched %hi reloc, it does not associated with a - variant frag. - - * configure, Makefile.in, aclocal.m4: Rebuild with new libtool. - * doc/Makefile.in: Likewise. - -Wed Feb 4 15:41:54 1998 Nick Clifton - - * config/tc-m32r.c (check_for_side_effects): New function. - (can_make_parallel): Add checks for instruction side effects - clashing with the other instruction. - (assemble_parallel_insn): Improve warning messages. Return error - message from non-swapped instruction order. - -Wed Feb 4 20:00:26 1998 James G. Smith - - * config/tc-arm.c: Rename arm_after_pass_hook() to arm_cleanup(). - - * config/tc-arm.h: Replace md_after_pass_hook definition with a - md_cleanup definition. This moves the forced literal output to - the end of the source pass, and avoids macro's inserting literals - into the code immediately after the macro expansion. - -Wed Feb 4 13:17:19 1998 Ian Lance Taylor - - * config/tc-sparc.h (tc_fix_adjustable) [OBJ_ELF]: A reloc against - a gas internal symbol is adjustable. - * config/tc-ppc.h (tc_fix_adjustable): Likewise. - - * as.h: If gcc version greater than 2.6, use `__format__' and - `__printf__' in function attributes, rather than `format' and - `printf'. - -Mon Feb 2 18:38:18 1998 Ian Lance Taylor - - * config/tc-sparc.c: Only include elf/sparc.h if OBJ_ELF. - -Mon Feb 2 18:30:34 1998 Steve Haworth - - Add tms320c30 support: - * config/tc-tic30.h: New file. - * config/tc-tic30.c: New file. - * config/obj-coff.h: If TC_TIC30, include coff/tic30.h and define - TARGET_FORMAT as "coff-tic30". - * configure.in (tic30-*-*aout*, tic30-*-*coff*): New targets. - * Makefile.am: Rebuild dependencies. - (CPU_TYPES): Add tic30. - (CPU_OBJ_VALID): tic30-aout is valid. - (TARGET_CPU_CFILES): Add config/tc-tic30.c. - (TARGET_CPU_HFILES): Add config/tc-tic30.h. - * configure, Makefile.in: Rebuild. - -Mon Feb 2 10:20:37 1998 Nick Clifton - - * config/tc-v850.c (md_assemble): Improvements to error messages. - -Mon Feb 2 12:39:05 1998 Geoff Keating - - * config/tc-ppc.c (md_apply_fix3): Change BFD_RELOC_HI16 and - BFD_RELOC_HI16_S to store the high bits of any value. - - * config/tc-ppc.h (tc_fix_adjustable): Undo change of Fri Jun 27. - (TC_RELOC_RTSYM_LOC_FIXUP): Don't let the - assembler calculate relocations to any external symbol at all. - * config/tc-ppc.c (md_apply_fix3) [OBJ_ELF]: Correct bugs - involving generation of pc-relative relocs. - (md_pcrel_from_section) [OBJ_ELF]: The job this code used to do - has been moved to md_apply_fix3. - - * config/tc-ppc.c (md_apply_fix3): Fix test for too-far branch. - (ppc_elf_suffix): Warn about 'identifier+constant@got' syntax, - which actually means (the address of identifier's GOT entry) + - constant, which is not particularly useful. - -Fri Jan 30 11:02:35 1998 Doug Evans - - * read.h (include_dirs): Declare. - (include_dir_count,include_dir_maxlen): Declare. - -Fri Jan 30 11:47:02 1998 Ian Lance Taylor - - * configure.in: Correct check for shared opcodes library. - * configure: Rebuild. - - * listing.c (buffer_line): If we can't open the file, set at_end. - (listing_print): Remove unused local variable fi. - - * config/m68k-parse.y (reglistpair): Handle register list in - either order. - - * config/vms-conf.h: Don't undef VERSION. - -Thu Jan 29 14:42:44 1998 Pat Rankin - - * Makefile.am (CONFIG_OBJS): New variable, containing part of old - OBJS variable. - (GENERIC_OBJS): New variable, with the rest of the old OBJS - variable. - (OBJS): Now just $(CONFIG_OBJS) and $(GENERIC_OBJS). - ($(srcdir)/make-gas.com): Rename from make-gas.com. - (stamp-mk.com): Replace $(OBJS) with $(GENERIC_OBJS). - (EXTRA_DIST): Define. - * vmsconf.sh: Handle {targ-cpu, obj-format, atof-targ} modules - explicitly rather than via the list of object files. - (gcc-as.opt): New file created when make-gas.com is run. - * config-gas.com: Create {targ-cpu.h, obj-format.h, targ-env.h, - itbl-cpu.h} to #include appropriate file rather than copying that - file. - * config/vms-conf.h: Synchronize with current config.in. - * Makefile.in: Rebuild. - -Thu Jan 29 18:48:19 1998 Bill Moyer - - * config/tc-d30v.c (do_assemble): Added flag_explicitly_parallel. - (parallel_ok): Relaxed parallel subinstruction dependency check. - -Wed Jan 28 14:35:00 1998 Bill Moyer - - * as.h (flag_warn_suppress_instructionswap): added new flag. - * tc-d10v.c (md_parse_option,md_longopts): added "--nowarnswap" - command line argument. - * tc-d10v.c (write_2_short): emit "Swapping instructions" - warning only if flag_warn_suppress_instructionswap is false. - -Wed Jan 28 16:41:19 1998 J.J. van der Heijden - - * configure.in (i386-*-mingw32*): New target. - * configure: Rebuild. - -Wed Jan 28 14:51:18 1998 Ian Lance Taylor - - * symbols.c (resolve_symbol_value): Don't set the segment if it - hasn't changed, and this is OBJ_AOUT without BFD_ASSEMBLER. - - * config/obj-aout.h (S_IS_LOCAL): Correct typo--pass argument to - S_GET_SEGMENT. - -Wed Jan 28 13:54:50 1998 Pat Rankin - - as.h (unlink): Reverse 13-Feb-97 change; use of unlink vs remove - depends upon HAVE_{UNLINK,REMOVE} values rather than host - compiler. - -Wed Jan 28 13:48:08 1998 Ian Lance Taylor - - * config/obj-coff.h (RESOLVE_SYMBOL_REDEFINITION): Define. - -Wed Jan 28 09:52:00 1998 Nick Clifton - - * config/tc-v850.c (v850_insert_operand): Display instruction when - an error is encountered. - -Tue Jan 27 13:32:01 1998 Robert Lipe - - * configure.in (i386-*-sco3.2v5*): Defaults to ELF now. - (i386-*-sco3.2v5*coff): New target. - (i386-*-sco3.2*): New target. - * configure: Rebuild. - -Tue Jan 27 11:06:52 1998 Nick Clifton - - * config/tc-v850.c: Tidy error message production. - -Tue Jan 27 12:24:32 1998 Ian Lance Taylor - - * config/tc-arm.c (md_apply_fix3): Add new variable newimm to hold - validate_immediate return value in the right type for comparisons - to FAIL. - -Tue Jan 27 06:51:59 1998 Richard Henderson - - * listing.c (MAX_BYTES): Use listing variables not constants. - (data_buffer): No longer an array, but a pointer. - (calc_hex): sizeof(data_buffer) -> MAX_BYTES. - (listing_listing): Allocate data_buffer. - -Tue Jan 27 06:38:35 1998 Richard Henderson - - * as.c (parse_args): Add --listing-lhs-width, --listing-lhs-width2, - --listing-rhs-width, --listing-cont-lines. - (show_usage): Update. - * listing.c (listing_lhs_width, listing_lhs_width_second): New vars. - (listing_lhs_cont_lines, listing_rhs_width): New vars. - (print_lines): Use the variables instead of the constants. - (listing_listing): Likewise. - * listing.h: Declare the new vars. - -Tue Jan 27 05:32:05 1998 Richard Henderson - - * as.c (parse_args): Add --keep-locals alias for -L. - Add --strip-local-absolute. - (show_usage): Update. - * as.h (flag_strip_local_absolute): New flag. - * symbols.c (S_IS_LOCAL): Use it. - * config/obj-aout.h (S_IS_LOCAL): Likewise. - * config/obj-bout.h (S_IS_LOCAL): Likewise. - * config/obj-coff.h (S_IS_LOCAL): Likewise. - -Mon Jan 26 13:07:41 1998 Nick Clifton - - * config/tc-m32r.c: Detect if explicitly parallel instructions - might have an io conflict and issue a warning message. - -Thu Jan 22 17:51:44 1998 Nick Clifton - - * cgen.c (cgen_save_fixups, cgen_restore_fixups, - cgen_swap_fixups): Functions to save, restore and swap the fixup - chain with a backup copy. - (cgen_asm_finish_insn): Returns address of constructed insn. - -Wed Jan 21 16:49:10 1998 Richard Henderson - - * listing.c (file_info_struct): Remove FILE, add POS. - (last_open_file_info, last_open_file): New; a one entry FILE* cache. - (file_info): Don't open the file. - (buffer_line): Check for the file in the last_open cache, updating - as necessary. - (print_source): Don't reference file_info->file. - (listing_listing): Likewise. - (listing_print): Close the file in the cache, if any. - -Fri Jan 16 14:51:48 1998 Ian Lance Taylor - - * read.c (dwarf_file_string): New file static variable. - (emit_expr): Look for constant sequence that leads up to a file - name in DWARF debugging output. - (stringer): Use dwarf_file_string to decide whether to accept a - string as a file name. - -Fri Jan 16 11:30:37 1998 Richard Henderson - - * tc-m68k.c (m68k_ip): Remove absl->reglst MRI hack. - (crack_operand): Add reg->reglst MRI hack. - (r_seg): Put reglst symbols in reg_section. - (m68k_frob_symbol): Frob reglst symbols into absolute_section. - -Thu Jan 15 14:19:01 1998 Richard Henderson - - * tc-sh.c (get_specific): Handle SGR & DBR. - -Thu Jan 15 13:46:48 1998 Richard Henderson - - * tc-h8300.c (parse_reg): Take the length of the symbol into - account when attempting to match a register name. - * tc-h8500.c (parse_reg): Likewise. - -Wed Jan 14 17:52:33 1998 Nick Clifton - - * cgen.c: Formatting changes to improve readability. - -Wed Jan 14 15:41:41 1998 Jeffrey A Law (law@cygnus.com) - - * config/tc-mips.c (macro): Rework division code to avoid unfilled - delay slot. - -Wed Jan 14 18:04:20 1998 Michael Meissner - - Based on a patch from Jim Wilson - * config/tc-d30v.c (do_assemble): Remove non-ansi default case. - (tc_gen_reloc): Handle cross section PC relative relocs - correctly. - -Wed Jan 14 15:02:19 1998 Doug Evans - - * config/tc-mips.c (mips_ip): Don't test pinfo flags if INSN_MACRO. - -Mon Jan 12 13:04:57 1998 Doug Evans - - * cgen.c: #include setjmp.h. Clean up pass over `struct foo' usage. - (expr_jmp_buf): New static local. - (cgen_parse_operand): Allow use of longjmp in parsing to handle errors. - (cgen_md_operand): New function. - * tc-m32r.c: Clean up pass over `struct foo' usage. - (md_estimate_size_before_relax): Use CGEN_INSN_MNEMONIC. - -Tue Jan 6 15:36:02 1998 Richard Henderson - - * symbols.c (S_SET_SEGMENT): Don't set the segment for section syms. - (S_IS_EXTERNAL, S_IS_LOCAL): Correct parenthetication. - -Fri Jan 2 16:08:54 1998 Ian Lance Taylor - - * config/tc-i386.c (i386_operand): Give an error if there are - unrecognized characters after an expression. - -For older changes see ChangeLog-9697 diff --git a/gas/ChangeLog-9295 b/gas/ChangeLog-9295 deleted file mode 100644 index 7ea48e6a9c2..00000000000 --- a/gas/ChangeLog-9295 +++ /dev/null @@ -1,13110 +0,0 @@ -Sat Dec 30 23:42:51 1995 Jeffrey A Law (law@cygnus.com) - - * ecoff.c (ecoff_stab): Simplify. Correctly handle sym + offset - addresses for static variables. - -Thu Dec 21 12:54:32 1995 Michael Meissner - - * config/tc-ppc.c (mapping): Make @got give a real GOT relocation, - and xgot give the old toc16 relocation. - (md_apply_fix3): Support all GOT relocations. - -Wed Dec 20 14:57:17 1995 Ian Lance Taylor - - * config/tc-mips.c (load_address): Correctly handle a constant in - SVR4_PIC case. From Richard Kenner . - -Fri Dec 15 14:25:07 1995 J.T. Conklin - - * config/tc-sh.c (parse_reg): Recognize SH3 registers. - (get_specific): Handle A_SSR, A_SPC and A_REG_B. - (build_Mbytes): Handle REG_B. - -Fri Dec 15 16:07:25 1995 Ian Lance Taylor - - * ecoff.c (ecoff_build_aux): Use new bfd_big_endian macro. - -Fri Dec 15 12:11:48 1995 Raymond Jou - - * mpw-make.sed: If linking, edit ALL_CFLAGS to CFLAGS. - -Thu Dec 14 15:09:52 1995 Ian Lance Taylor - - * config/obj-coff.c (write_object_file): Set the s_align field to - the number of bytes, rather than to the power of 2. - -Tue Dec 12 12:19:37 1995 Ian Lance Taylor - - * Makefile.in (DISTCLEAN_HERE): New variable. - (distclean): Use it. - (maintainer-clean): Depend upon clean-here rather than clean, - distclean, and clean-info. Run make maintainer-clean in doc. - Remove files listed in DISTCLEAN_HERE. - * doc/Makefile.in (maintainer-clean realclean): Split out from - distclean. Depend upon clean-info and distclean. - -Mon Dec 11 16:23:51 1995 Stan Shebs - - * mac-as.r: Fix copyright and version strings. - (cfrg): Use PROG_NAME instead of literal name. - -Mon Dec 11 14:14:08 1995 Ian Lance Taylor - - * read.c (read_a_source_file): If tc_unrecognized_line is defined, - call it. - * config/tc-a29k.h (tc_unrecognized_line): Define. - * config/tc-a29k.c (a29k_unrecognized_line): New function. - (md_operand): Handle a29k style local dollar labels. - -Wed Dec 6 17:52:52 1995 Ian Lance Taylor - - * config/obj-multi.h: If OBJ_MAYBE_ELF, define OBJ_SYMFIELD_TYPE. - -Tue Dec 5 13:26:34 1995 Ken Raeburn - - * read.c (s_fill): If md_flush_pending_output is defined, call - it. - -Mon Dec 4 15:10:53 1995 Ken Raeburn - - * config/obj-coff.c (size_section, fill_section, fixup_mdeps): - Treat rs_align_code like rs_align. - -Sun Dec 3 16:46:54 1995 Richard Earnshaw (rearnsha@armltd.co.uk) - - * config/tc-arm.c (cp_address_required_here): Set pre_inc when - converting an absolute address into a PC-relative one. - -Fri Dec 1 11:57:56 1995 Stan Shebs - - * mpw-config.in: Don't always use te-generic.h for emulation. - (powerpc-apple-macos): Use emulation te-macos.h. - * mpw-make.sed (install, install-only): Edit in Mac-specific - install procedure. - -Fri Dec 1 10:59:25 1995 Ian Lance Taylor - - * configure.in: Improve message about unsupported ELF targets. - * configure: Rebuild. - - * config/tc-m88k.c (m88k_do_align): Correct check for whether fill - pattern is zero. From Manfred Hollstein. - -Thu Nov 30 13:25:49 1995 Kim Knuttila - - * config/tc-ppc.c (ppc_pe_section): To get the alignment right for - the various idata sections, we check the name on the .section pseudo. - -Thu Nov 30 11:23:42 1995 Manfred Hollstein KS/EF4A 60/1F/110 #40283 - - * config/obj-coff.c (fixup_segment): If TC_M88K is defined, do not - add section's paddr to add_number; compatibility to native as and - ld forbids. - -Wed Nov 29 23:14:27 1995 Ken Raeburn - - * configure.in: Treat m68k-sysv4 like m68k-elf, not m68k-sysv3. - - * hash.c (struct hash_entry): Moved here... - * hash.h (struct hash_entry): ...from here. - - * config/obj-elf.c (elf_frob_symbol): Don't free and clear sy_obj - if it's already known to be null. - -Wed Nov 29 13:00:20 1995 Michael Meissner - - * config/tc-ppc.c (md_apply_fix3): Don't adjust the value for 32 - bit relocs converted to PC relative relocs. This turned out to - add the offset from the beginning of .text twice. - -Tue Nov 28 10:42:36 1995 Ken Raeburn - - * stabs.c (s_stab_generic): In 's' case, free string from - obstack. - - * config/obj-elf.h (ELF_TARGET_SYMBOL_FIELDS): Remove unused field - sy_name_offset. - * config/obj-multi.h (ELF_TARGET_SYMBOL_FIELDS) [OBJ_MAYBE_ELF]: - Ditto. - - * subsegs.h (segment_info_type): Make bitfields unsigned. - - * expr.h (struct expressionS): Make X_op and X_unsigned bitfields, - and move them together. On most systems this will reduce the - structure size by one word. - (operatorT): Define O_max. - * expr.c (expr_begin): Verify that X_op is wide enough to hold - O_max. - - * read.c (pop_insert): Print error returned by hash table - insertion code. - - * as.c (dump_statistics): Split out from main; dump some hash - table stats and target-specific stats. - (start_time): No longer automatic to main. - (main): Set file-level start_time and call dump_statistics at - exit. Exit by calling xexit. - (show_usage): Make --statistics description less specific. - * subsegs.c (subsegs_print_statistics): New function. - * write.c (write_print_statistics): New function. - (n_fixups): New static variable. - (fix_new_internal): Increment it. - * read.c (read_print_statistics): New function. - * read.h (read_print_statistics): Declare. - * symbol.c (symbol_print_statistics): New function. - * symbol.h (symbol_print_statistics): Declare. - * hash.c (hash_print_statistics): New function. - * hash.h (hash_print_statistics): Declare. - * config/tc-i386.c (i386_print_statistics): New function. - * config/tc-i386.h (i386_print_statistics): Declare. - (tc_print_statistics): New macro. - * messages.c (as_fatal, as_assert, as_abort): Use xexit, not - exit. - - * hash.c (DELETED): Rewrite to use a valid but unique address. - (START_POWER): Reduce to 10. - (enum stat_enum): New enumerator, replacing STAT_* index macros. - Add new values for counting strcmp calls. - (GROW_FACTOR): New macro. - (hash_grow): Use GROW_FACTOR. Rewrite for quick returns instead - of nesting blocks. - (FULL_VALUE): New macro. Use 1/4 of table size instead of 1/2. - (hash_new): Use FULL_VALUE. - (struct hash_control): Definition moved here. - (hash_code): Don't mask to low bits. - (hash_ask): Mask returned hash code here. Check hash value before - calling strcmp; count strcmp calls. - * hash.h (struct hash_control): Declare, don't define, here. - (HASH_STATLENGTH): Deleted. - (struct hash_entry): Add field for hash code. - (hash_say, hash_apply): Don't declare. - - * hash.c (destroy): Return void. - (applicatee): Ditto. - (main): Fix declarations. - (hash_apply): Return void. Argument `function' returns void. Put - inside "#ifdef TEST". - (hash_say): Define only if TEST is defined. - * hash.h (hash_apply, hash_say): Declarations deleted. - -Mon Nov 27 13:18:25 1995 Ian Lance Taylor - - * configure: Rebuild with autoconf 2.7. - -Tue Nov 21 18:39:01 1995 Ian Lance Taylor - - * aclocal.m4 (AC_PROG_CC): Remove local definition. - * configure: Rebuild with autoconf 2.6. - -Mon Nov 20 17:26:00 1995 Ian Lance Taylor - - * config/tc-ppc.c (ppc_debug_name_section_size): Remove. - (ppc_stabx): Don't increment ppc_debug_name_section_size. - (ppc_bc): Likewise. - (ppc_frob_file): Remove. - * config/tc-ppc.h (tc_frob_file): Don't define. - (ppc_frob_file): Don't declare. - -Mon Nov 20 13:37:05 1995 Ken Raeburn - - * Makefile.in (TARG_CPU_DEP_alpha): Mention alpha-opcode.h. - * config/alpha-opcode.h: Include one-operand variants of jmp and - jsr. - - * config/te-delt88.h: Renamed from te-delta88.h, to avoid conflict - with te-delta.h in 8.3 file systems. - * configure.in: Adjusted. - -Thu Nov 16 12:49:38 1995 Ian Lance Taylor - - * config/tc-mips.c (s_err): Remove; just use the one in read.c. - - * config/m68k-parse.y (yylex): In MRI mode, '@' can start an octal - number. - * expr.c (operand): Handle MRI suffixes after unadorned 0. - -Thu Nov 16 00:21:44 1995 Ken Raeburn - - Version 2.6 released. - * Makefile.in (VERSION): Updated to 2.6. - - * config/obj-coff.c (write_object_file): Change use of md_do_align - to pass a pointer rather than a fill value, to match other uses. - -Wed Nov 15 03:52:00 1995 Ken Raeburn - - * config/tc-ns32k.h (TC_FIX_TYPE): Add missing semicolon. - - * as.c (main): Move md_end call to just after call to - perform_an_assembly_pass. Delete cpu-specific code here. - * config/tc-i960.h (md_end): New macro, calls brtab_emit. - * config/tc-arm.c (md_end): Unused function deleted. - * config/tc-ns32k.c (md_end): Ditto. - - * config/tc-i386.c (i386_align_code): New function, moved here - from HANDLE_ALIGN macro. - * config/tc-i386.h (HANDLE_ALIGN): Call it. - - Mon Jul 31 14:53:19 1995 Alan Modra - - * config/tc-i386.h (md_do_align): cast fill and 0x90 to char - before comparing - - Mon May 1 10:91:49 1995 Alan Modra - - * config/tc-i386.h (md_do_align): Make ".align n,0x90" generate - multi-byte nops to avoid changing gcc. The necessary gcc change - might break old assemblers. - - Sat Apr 22 20:53:05 1995 Alan Modra - - * config/tc-i386.h (md_do_align, HANDLE_ALIGN): Add macros to - generate optimal multi-byte nop instructions for ".align n" - ".align n,0x90", and aligns requiring more than 15 bytes of - padding still generate multiple 0x90's as before. - -Mon Nov 13 17:40:21 1995 Ian Lance Taylor - - * config/tc-m68k.c (s_mri_until): Call pop_mri_control. - -Mon Nov 13 20:39:06 1995 Stan Shebs - - * configure.in (ppc-*-macos*, ppc-*-mpw*): New configurations. - * configure: Update. - * mpw-make.sed: Reorder commands to make sed happier. - * config/te-macos.h: New file. - * config/tc-ppc.h (TARGET_FORMAT): Set correctly for PowerMac. - -Sun Nov 12 21:14:56 1995 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_ip): Fix off-by-2 bug in length check for - conditional branches. - (md_apply_fix): Likewise. - -Thu Nov 9 16:14:01 1995 Ian Lance Taylor - - * config/tc-a29k.c (md_apply_fix): Warn if an attempt is made to - generate a reloc which the linker will not handle correctly. Fix - overflow checking--R_IREL is 18 bits, not 17. - -Wed Nov 8 19:59:36 1995 Ian Lance Taylor - - * config/obj-coff.c (fixup_segment): Don't subtract md_pcrel_from - from a PC relative reloc if TC_A29K. - - * config/tc-a29k.c (line_separator_chars): Restore '@'. Existing - code depends upon it. - - * config/tc-a29k.c (md_operand): Handle $float, $double, and - $extend. Based on code from Eric Freudenthal - . - * config/tc-a29k.h (LEX_DOLLAR): Define. - * read.c (LEX_DOLLAR): Define if not defined. - (lex_type): Use LEX_DOLLAR. - -Wed Nov 8 16:38:14 1995 Eric Freudenthal - - * configure.in (a29k-nyu-sym1): New target, just like other a29k - targets. - -Wed Nov 8 11:38:48 1995 Ian Lance Taylor - - * config/obj-coff.c (c_dot_file_symbol): Cast xmalloc return. - -Tue Nov 7 09:14:35 1995 Kim Knuttila - - * config/tc-ppc.c (md_apply_fix3): Added BFD_RELOC_RVA. Currently - used only by "dlltool.c". - -Mon Nov 6 18:51:26 1995 Ian Lance Taylor - - * config/tc-alpha.c: Undefine inline if not __GNUC__. - (md_pseudo_table): Don't define "extern". - -Sat Nov 4 00:51:21 1995 Ian Lance Taylor - - * config/tc-ppc.c (ppc_biei): Force symbol into text_section. - - * config/tc-ppc.c (md_show_usage): Put backslash at end of line. - -Fri Nov 3 13:02:59 1995 Ian Lance Taylor - - * macro.c (macro_expand_body): Don't warn about == with a - nonexistent parameter, in case it is in a comment field. - - * as.c (main): On TC_A29K, call macro_init with macro_alternate - set to 1. - * macro.c (get_any_string): Don't keep quotes if macro_strip_at is - set, even if macro_alternate is set. - (get_apost_token): If macro_strip_at, only skip kind if it is '@'. - (sub_actual): If macro_strip_at, and kind is '@', don't look up - the token unless it ended in '@'. - * config/tc-a29k.c (line_separator_chars): Remove '@'. - * doc/c-a29k.texi: Document macro usage on A29K. - -Thu Nov 2 23:07:57 1995 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Handle new 'W' place, meaning a - signed word. - (install_operand): Likewise. - - * config/obj-elf.c (ecoff_debug_pseudo_table): Add "extern". - -Wed Nov 1 15:17:02 1995 Manfred Hollstein KS/EF4A 60/1F/110 #40283 - - * configure.in (m88k-motorola-sysv*): New target. - * configure: Rebuild. - * config/te-delta88.h: New file. - * config/obj-coff.c (write_object_file): Use md_do_align if it is - defined. - * config/tc-m88k.h (SUB_SEGMENT_ALIGN): Define. - (md_do_align): Define. - * config/tc-m88k.c: Include "subsegs.h". - (m88k_do_align): New function. - - * config/te-delta.h (STRIP_UNDERSCORE): Don't define. - (COFF_NOLOAD_PROBLEM): Define. - (LOCAL_LABELS_DOLLAR, LOCAL_LABELS_FB): Define. - -Wed Nov 1 16:07:43 1995 Ken Raeburn - - * config/tc-i386.c (md_assemble): For a jump instruction with - non-constant target, require 7 available bytes in the current - frag, not 6. - -Tue Oct 31 15:37:16 1995 Fred Fish - - * config/obj-elf.h: Include bfd/elf-bfd.h rather than - bfd/libelf.h. - -Tue Oct 31 16:34:28 1995 David Mosberger-Tang - - * configure.in (alpha-*-linux*): Use ecoff. - * configure: Rebuild. - * ecoff.c (ecoff_directive_extern): New function. - (ecoff_directive_weakext): New function. - (ecoff_build_symbols): Handle weak symbols. - (ecoff_setup_ext): Likewise. - (ecoff_frob_symbol): Warn about weak common symbols. - * ecoff.h (ecoff_directive_extern): Declare. - (ecoff_directive_weakext): Declare. - * symbols.c (S_IS_WEAK): New function. - * symbols.h (S_IS_WEAK): Declare. - * config/obj-ecoff.c (obj_pseudo_table): Add "extern" and - "weakext". - * config/tc-mips.c (mips_pseudo_table): Remove "extern". - (s_extern): Remove. - -Tue Oct 31 13:29:08 1995 Ian Lance Taylor - - * config/tc-ppc.c (ppc_lglobl): Do the right thing. - - * config/tc-ppc.c (ppc_bb): Call SF_SET_PROCESS. - (ppc_eb): Likewise. Set the storage class to C_BLOCK, not C_FCN. - (ppc_frob_symbol): Don't change C_BLOCK symbols to C_HIDEXT. - * config/obj-coff.c (coff_frob_symbol): Don't call - SA_SET_SYM_ENDNDX with the current symbol; call it with the next - one. If OBJ_XCOFF, try to figure out whether the symbol is going - to be dropped. - - * config/tc-ppc.c (md_pseudo_table): Add "bc" and "ec". - (ppc_stab_symbol): New static variable. - (ppc_change_csect): Check that ppc_toc_csect is not NULL. - (ppc_stabx): Set ppc_stab_symbol around call to symbol_make. Set - sy_tc.real_name to the stab string. - (ppc_bc, ppc_ec): New static functions. - (ppc_canonicalize_symbol_name): If ppc_stab_symbol is set, don't - do anything. - (ppc_symbol_new_hook): If ppc_stab_symbol is set, don't look for a - suffix. - (ppc_frob_symbol): Set BSF_NOT_AT_END for symbols with csect aux - entries. - - * input-scrub.c (input_scrub_push): Reset sb_index. - -Mon Oct 30 17:52:46 1995 Ian Lance Taylor - - * listing.c (listing_newline): Don't create a frag in the absolute - section. - -Sat Oct 28 01:02:05 1995 Ian Lance Taylor - - * config/tc-ppc.c (md_pseudo_table): Add "data" and "text". - (ppc_csect): Move most of the code to ppc_change_csect, and call - it. - (ppc_change_csect): New static function, taken from ppc_csect. - (ppc_section): New static function. - (ppc_saw_abs): New static varable. - (ppc_frob_symbol): Create aux entry for absolute symbols. Warn if - a symbol has no csect. - (ppc_adjust_symtab): New function. - * config/tc-ppc.h (tc_adjust_symtab): Define if OBJ_XCOFF. - (ppc_adjust_symtab): Declare if OBJ_XCOFF. - - * write.c (write_object_file): If tc_adjust_symtab is defined, - call it just before the call to obj_adjust_symtab. - - * symbols.c (symbol_find_or_make): Change name to be const. - * symbols.h (symbol_find_or_make): Update declaration. - -Thu Oct 26 19:18:27 1995 Ken Raeburn - - * doc/as.texinfo (Align): Mention SH. - * doc/c-m68k.texi (M68K-Directives, .even): Describe behavior, not - .align value. - * doc/c-z8k.texi (Z8000 Directives, global): Fix minor typo. - (Z8000 Directives, even): Don't give numeric align value, instead - explain behavior. - -Thu Oct 26 11:45:03 1995 Richard Earnshaw (rearnsha@armltd.co.uk) - - * tc-arm.c (do_ldst): Assemble ldr/str r0, [r1] as a pre-increment - instruction. - -Wed Oct 25 11:59:24 1995 Per Bothner - - * Makefile.in (diststuff): Also make info. - (maintainer-clean realclean): Also make clean-info. - -Tue Oct 24 15:21:33 1995 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (md_pseudo_table): Add new ".nsubspa" opcode. - (pa_subspace): For ".nsubspa", always create a new subspace - with the given attributes, even if one already exists with the - same name. - -Tue Oct 24 14:50:38 1995 Michael Meissner - - * config/tc-ppc.h (TC_FORCE_RELOCATION_SECTION): Rename from - TC_FORCE_RELOCATION, taking an additional section argument. If - the section of the target symbol is not the same as the current - section, always force the relocation to be used. - (MD_PCREL_FROM_SECTION): New macro to call md_pcrel_from_section. - - * config/tc-ppc.c (md_pcrel_from_section): Rename from the - md_pcrel_from function, taking an additional section argument. - Invoke TC_FORCE_RELOCATION_SECTION instead of TC_FORCE_RELOCATION. - - * write.c (TC_FORCE_RELOCATION_SECTION): Define in terms of the - older TC_FORCE_RELOCATION if not defined. - (MD_PCREL_FROM_SECTION): If not defined, invoke md_pcrel_from. - (fixup_segment): Use MD_PCREL_FROM_SECTION instead of - md_pcrel_from, and TC_FORCE_RELOCATION_SECTION instead of - TC_FORCE_RELOCATION. - -Mon Oct 23 16:20:04 1995 Ken Raeburn - - * input-scrub.c (as_where): Set name to null pointer if we don't - have a file name. - * messages.c (identify): Only print filename if non-null. - (as_show_where): Ditto, for line number too. - (as_warn_internal, as_bad_internal): Ditto. - - * input-file.c (input_file_open): If the input file can't be - opened, consider it an error. - -Mon Oct 23 11:15:44 1995 James G. Smith - - * config/tc-mips.c: Added mips_4100 control, and support for - accepting the 4100 as a MIPS architecture variant (md_begin, - macro_build, mips_ip, md_parse_option). Adding suitable - command-line OPTIONs, and updating the help text (md_show_usage). - -Wed Oct 18 13:20:32 1995 Ken Raeburn - - * subsegs.c (subseg_begin): Only set absolute_frchain.fix_* when - BFD_ASSEMBLER is defined. - - * Use one active frag and one obstack per frag chain: - * frags.c (frags): Variable deleted. - (frag_alloc): New function. - (frag_grow, frag_more, frag_variant, frag_now_fix, - frag_append_1_char): Refer to frchain_now->frch_obstack instead of - frags variable. - (frag_new): Ditto. Verify that frch_last and frag_now match on - entry and exit, and that old frag_now has non-zero type. Replace - "know" uses with "assert". Use frag_alloc instead of mucking with - obstack alignment. - * frags.h (frags): Declaration deleted. - * subsegs.h (struct frchain): Add new field frch_frag_now. - * subsegs.c (frchains, dummy_frag, absolute_frchain): New static - variables. - (subsegs_begin): Initialize frchains obstack. Under gcc, don't - give it any stricter alignment than frchainS structures need. Do - not initialize frags obstack. Set frag_now to point to - dummy_obstack. Initialize absolute_frchain. - (subseg_set_rest): Save and restore frag_now in frch_frag_now - field of frchainS. Don't create new frags on section switch, and - use frag_alloc when creating a new frag chain. For absolute - section, set frchain_now to absolute_frchain. Verify that - frch_last and frag_now match on entry and exit. Initialize - per-chain obstack, and under gcc, set required alignment to that - needed by fragS structure. - - * write.c (chain_frchains_together_1): Verify fr_type is nonzero. - - * stabs.c (get_stab_string_offset): Only copy input string if a - fresh copy is needed, not if the section already exists. - (s_stab_generic): Cache stab section name to bypass lookups, since - usually it will match. Could be made faster still by changing the - memory allocation rules. - (s_xstab): Cache section name to bypass repeated string - allocation. - - * frags.c (frag_new): Deleted register declarations. - - * listing.c (frag_now): Don't declare. - - * as.c (chunksize): New variable. - (debug_memory): New variable. - (main): If debug_memory is set, reduce chunksize and - _bfd_chunksize. - * as.h (chunksize): Declare it. - * read.c (read_begin): Use it. - - * config/tc-alpha.c (md_shortopts): Include 'g'. - (md_parse_option): Ignore it. - - * Makefile.in (distclean): Remove Makefile and config.status from - testsuite directory. - (clean-here): Don't delete testsuite. Instead, delete only the - files within it that would be generated by running tests. - - * config/tc-hppa.c (hppa_elf_mark_end_of_function): Call - frag_now_fix instead of accessing obstack info directly. - * config/tc-arm.c (s_ltorg): Ditto. - (md_assemble): Ditto. - - * config/tc-i386.c (md_assemble): Call frag_grow instead of - obstack_room. - -Wed Oct 18 12:22:59 1995 Ken Raeburn - - * stabs.c (aout_process_stab): Insert debug symbol into symbol - chain after parsing value expression, if any, to avoid separating - continued .stabs lines. - -Mon Oct 16 10:56:41 1995 Ian Lance Taylor - - * config/tc-mips.c (mips_elf_pseudo_table): Remove. - (mips_pop_insert): Don't call pop_insert on mips_elf_pseudo_table. - -Mon Oct 16 07:07:37 1995 Michael Meissner - - * config/tc-ppc.c (md_begin): Use new flags PPC_OPCODE_COMMON for - -mcom support and PPC_OPCODE_ANY for -many. - (md_parse_option): Ditto. - (ppc_arch): Ditto. - (md_begin): For duplicate instructions, print all duplicates - before aborting. - -Sun Oct 15 22:06:14 1995 Michael Meissner - - * config/tc-ppc.c (md_parse_option): Support for -mcom to turn on - common mode operation. - (md_show_usage): Add -mcom to usage message. - -Fri Oct 13 13:32:45 1995 steve chamberlain - - * expr.c (op_rank): Add O_symbol_rva. - * expr.h (operatorT): Add O_symbol_rva. - * read.c (cons_worker): Set O_symbol_rva when necessary. - * write.c (fix_new_exp): Understand O_symbol_rva. - -Tue Oct 10 11:34:14 1995 Ian Lance Taylor - - * config/tc-mips.c: Correct s_cons arguments. From Michael - Joosten . - -Mon Oct 9 19:59:53 1995 Ian Lance Taylor - - * config/tc-ppc.c (ppc_macro): Make count unsigned. - (ppc_biei): Set segment to now_seg and value to coff_n_line_nos. - (ppc_frob_symbol): Handle C_BINCL and C_EINCL symbols by setting - the fix_line field. - * config/obj-coff.c (coff_n_line_nos): Rename from n_line_nos, and - make non-static. Change all users. - * config/obj-coff.h (coff_n_line_nos): Declare. - -Fri Oct 6 16:24:27 1995 Ken Raeburn - - Mon Sep 25 22:49:32 1995 Andreas Schwab - - * configure.in (AC_ARG_WITH(bfd-assembler)): Fix help message. - - * config/obj-elf.c (obj_elf_common): Convert specified byte - alignment to power of two. Set size of local bss symbol. - - * config/tc-m68k.c (tc_gen_reloc): Fix typo in variable name. - -Fri Oct 6 15:22:25 1995 Ian Lance Taylor - - * sb.c, macro.c: Decide whether to include or - just as as.h does. - -Fri Oct 6 09:55:33 1995 Doug Evans - - * Makefile.in (site.exp): Fix setting of $srcdir. - - * config/tc-arm.c (md_atof): Fix little-endian output. - * config/tc-arm.h (ARM_BI_ENDIAN): Move definition so defined for - all coff targets. - -Thu Oct 5 20:17:30 1995 Ken Raeburn - - * doc/as.texinfo: Split out the NS32k family documentation, - despite its being commented out for now. - * doc/c-ns32k.texi: New file. - - * sb.c, macro.c: Include string.h. - - * Makefile.in (comparison): Only check *.o; we don't care if - timestamps inserted by the native linker differ. - - * config/tc-alpha.c (alpha_align): Only fill with a no-op pattern - if alignment stricter than 4 bytes is requested; in that case, - align to a 4-byte boundary first. - - Thu Sep 28 19:35:27 1995 Pat Rankin - - * config/obj-vms.c (VMS_RSYM_Parse): eliminate "might be used - uninitialized" warning for `Max_Source_Offset'. - -Wed Oct 4 16:17:02 1995 Kim Knuttila - - * config/tc-ppc.c (parse_toc_entry): New function to parse [toc] - qualifiers and detect errors if present. - (md_assemble): Add call to parse_toc_entry. Also added some support - for the [tocv] qualifier. - (ppc_pe_tocd): New function to support data in the toc section. - -Wed Oct 4 14:03:39 1995 Ian Lance Taylor - - * config/tc-ppc.c (ppc_frob_symbol): Don't create an aux entry for - an absolute symbol. - -Tue Oct 3 12:18:19 1995 Ian Lance Taylor - - * config/tc-m68k.c (isword): Accept all values from -65536 to - +65535, so ~VAL will not be rejected. - - * cond.c (s_endif): Call demand_empty_rest_of_line. In MRI mode, - skip characters after the pseudo-op. - (s_else): Likewise. - * read.c (get_line_sb): Don't look past buffer_limit. - (s_include): In MRI mode, skip characters after the file name. - -Mon Oct 2 16:15:27 1995 Ian Lance Taylor - - * config/m68k-parse.y (m68k_reg_parse): In MRI mode, permit - periods in register names. - -Sat Sep 30 23:03:31 1995 Jeff Law (law@hurl.cygnus.com) - - * config/tc-hppa.c (hppa_fix_adjustable): DP relative relocs - are not adjustable in SOM to avoid confusing the optimizing - linker. - -Fri Sep 29 15:18:08 1995 Ian Lance Taylor - - Add some support for i960 MRI compatibility mode. - * config/tc-i960.c (md_pseudo_table): Add endian. - (get_args): Don't discard a space between alphanumeric characters. - (get_cdisp): Change text_section to now_seg. - (s_endian): New static function. - * config/tc-i960.h (MRI_MODE_NEEDS_PSEUDO_DOT): Define. - * expr.h (operatorT): Add O_logical_not, O_logical_and, and - O_logical_or. - * expr.c (operand): Treat '!' as logical not operator. If - TC_I960, in MRI mode permit `sizeof secname' and `startof - secname'. - (op_rank): Bump values by 2 to make room for && and ||. Add - entries for !, &&, and ||. - (expr_begin): Only do MRI changes if TC_M68K. - (operator): Recognize || and &&. - (expr): Handle new operatorT values. - * symbols.c (resolve_symbol_value): Handle new operatorT values. - (print_expr_1): Likewise. - * read.c (potable): Add debug, err, irep, irepc, print, purgem, - and rep. - (read_a_source_file): Handle MRI_MODE_NEEDS_PSEUDO_DOT. - (mri_comment_field): Only handle weird comments if TC_M68K. - (s_err): New function. - (s_org): Only punt in MRI mode if TC_M68K. - (s_mri_sect): Write TC_I960 version. - (s_print, s_purgem): New functions. - * read.h (s_err, s_print, s_purgem): Declare. - * cond.c (s_ifeqs): Implement. - (ignore_input): Handle MRI_MODE_NEEDS_PSEUDO_DOT. - * macro.c (macro_strip_at): New static variable. - (macro_init): Add strip_at parameter. - (do_formals): If macro_strip_at, change NARG to $NARG. - (define_macro): Skip a comma after the macro name. - (get_apost_token): Skip character if macro_strip_at, even if - macro_mri. - (macro_expand_body): If macro_strip_at, don't recognize parameters - in strings unless they are preceded by an '@'. If macro_strip_at, - pass '@' as strip character to sub_actual. If macro_strip_at, - strip '@' characters. - (macro_expand): If macro_strip_at, change NARG to $NARG. - (delete_macro): New function. - (expand_irp): Skip leading and trailing '"' characters if irpc. - * macro.h (macro_init): Mention new strip_at parameter. - (delete_macro): Declare. - * as.c (main): If TC_I960, pass flag_mri to macro_init as - strip_at; otherwise, pass 0. - * gasp.c (process_pseudo_op): Pass 0 to macro_init as strip_at. - (main): Likewise. - * doc/as.texinfo: Document i960 MRI mode. - - * as.c (show_usage): Mention --defsym. - -Thu Sep 28 19:25:04 1995 Stan Shebs - - * mpw-config.in: Translate "powerpc" into "ppc", remove gen of - VERSION, move gen of "conf" here from makefile. - * mpw-make.sed: New file, sed commands to translate Unix makefile - into MPW syntax. - * mpw-make.in: Remove. - * mac-as.r: New file, Mac resource file. - * as.h (inline): Don't decide about defining if __MWERKS__, - remove redundant conditional and definition. - - * stabs.c (s_stab_generic): Fix syntax for OBJ_PROCESS_STAB. - -Thu Sep 28 15:43:15 1995 Kim Knuttila - - * config/tc-ppc.c (md_apply_fix3): Removed some TE_PE specific - manipulations, since I can't prove they're needed. - (md_begin): Removed init_regtable, insert_reg, and the call points. - (register_name): New function. Parses a register name, if appropriate. - (md_assemble): Added call to register_name to handle symbolic names. - (ppc_pe_section): Removed all duplicate IMAGE defines, and include - coff/pe.h instead. - -Thu Sep 28 12:09:19 1995 Ian Lance Taylor - - * config/tc-ppc.h (tc_fix_adjustable): Define. - (ppc_pe_fix_adjustable): Declare. - * config/tc-ppc.c (ppc_pe_fix_adjustable): New function. - -Thu Sep 28 01:11:58 1995 Doug Evans - - * config/tc-arm.h (TARGET_FORMAT): Define for arm-coff. - -Wed Sep 27 12:53:58 1995 Ian Lance Taylor - - * symbols.c (S_IS_LOCAL): All symbols in reg_section are local. - - * config/tc-ppc.h (OBJ_XCOFF): Define if OBJ_COFF and not TE_PE. - Change OBJ_COFF checks to check OBJ_XCOFF instead. - (TARGET_FORMAT): Fully parenthesize. - (LEX_QM): Define if TE_PE. - * config/tc-ppc.c: Replace OBJ_COFF by OBJ_XCOFF throughout. - Remove checks of TE_PE within #ifdef OBJ_XCOFF sections. - (init_regtable): Make i unsigned. - (ppc_set_current_section): Rename from setCurrentSection. Change - all callers. - (ppc_arch): Return after as_fatal to avoid gcc warning. - (md_assemble): Only declare reloc if OBJ_ELF. Add default to - switch on fixups[i].reloc to avoid gcc warning. - (IMAGE_SGN_LNK_OTHER): Fix nested comment. - (ppc_pe_function): Don't call ppc_canonicalize_symbol_name. - (ppc_frob_symbol): Remove TE_PE section checks. - (md_estimate_size_before_relax): Return after abort to avoid gcc - warning. - (md_apply_fix3): Add BFD_RELOC_16_GOT_PCREL to switch. - * read.c (LEX_QM): Define as 0 if not defined. - (lex_type): Use LEX_QM for '?'. - - * configure.in: No need to check whether ${cpu_type} is powerpc; - it never will be. - * configure: Rebuild. - -Wed Sep 27 11:33:38 1995 Michael Meissner - - * config/tc-ppc.c (md_apply_fix3): Remove Sep 26 changes to this - function, keeping other Sep. 26 changes. - -Wed Sep 27 10:29:13 1995 Kim Knuttila - - * configure (emulations): Added support for ppcle-*-[pe|winnt] - (target_frag): Removed an extraneous PPC definition. - * configure.in (emulations): Same - * config/tc-ppc.h: - * config/tc-ppc.c (md_pseudo_table): Base support for new or altered - pseudo ops - There will be more. - (pre_defined_registers): Predefined reg table to name registers, etc - (md_begin): Setup reg table initialization - (md_assemble): Initial [toc]x(rtoc) support - (ppc_frob_label): Removed some xcoff specific processing from TE_PE - (ppc_frob_symbol): Removed some xcoff specific processing from TE_PE - Added support for more predefined sections - (ppc_frob_section): Removed some xcoff specific processing from TE_PE - (ppc_fix_adjustable): Removed from TE_PE mainline - (md_apply_fix3): For TE_PE toc entries, we don't need to mess - with fx_addnumber. Removed for the time being. - (lots): Put back missing assignments to ppc_current_csect. - -Tue Sep 26 14:57:59 1995 Michael Meissner - - * config/tc-ppc.c (ppc_elf_suffix): Support all of the V.4 - relocations. - (ppc_elf_cons): Remove restriction that @ suffixes must be done - with .long. Add error if relocation does not fit in the number of - bytes provided. - (md_assemble): For absolute branches, map PC relative relocations - back into an equivalent absolute relocation. - (md_pcrel_from): If TC_FORCE_RELOCATION is true, relocation offset - is 0, not segment start. - (md_apply_fix3): Don't bother writing addend into the instruction, - since it is ignored, given that we use RELA relocations for ELF. - - * config/tc-ppc.h (TC_FORCE_RELOCATION): Define to force all - branch prediction relocations to always be emitted. - -Mon Sep 25 16:08:43 1995 Michael Meissner - - * config/tc-ppc.c (ppc_elf_suffix): Lower case reloc before - testing. - (md_assemble): Be more robust in terms of relocations. - (md_apply_fix3): Allow 14 bit relocs to be emitted for external - symbols in addition to 26 bit relocs. Properly insert 26/14 bit - reloc value fields into the instruction stream. - -Mon Sep 25 00:23:16 1995 Ian Lance Taylor - - * config/tc-arm.c (md_atof): Output little endian constants in - little endian mode. - - * config/obj-coff.c (obj_coff_section): Pass &type, not type, - s_mri_sect. - - * configure.in: Fix typo: fmt-elf to fmt=elf. - -Fri Sep 22 16:34:46 1995 Michael Meissner - - * config/tc-ppc.c (ppc_elf_suffix): Rewrite to use a table of - strings and relocations they represent. Add @br{,n}taken for - branch taken/not taken support. - (md_apply_fix3): Add BFD_RELOC_PPC_B16_BR{,N}TAKEN support. - -Thu Sep 21 21:10:17 1995 Michael Meissner - - * config/tc-ppc.c (md_parse_option): -mrelocatable-lib now only - sets EF_PPC_RELOCATABLE_LIB and not also EF_PPC_RELOCATABLE. - -Thu Sep 21 16:30:56 1995 Ian Lance Taylor - - * subsegs.c (subseg_set): Permit SEG_ABSOLUTE in know expression. - * expr.c (expr): Account for new operatorT values in know - expression. - - * write.c (fixup_segment): Clear fixp->fx_subsy if the relocation - is fully resolved. - -Thu Sep 21 14:11:49 1995 Michael Meissner - - * config/tc-ppc.c (ppc_flags): New variable to hold the flag bits - to set in the ELF header. - (md_parse_option): Add support for -mrelocatable-lib. Make both - -mrelocatable and -mrelocatable-lib set ppc_flags. - (md_begin): Set ELF flags with ppc_flags. - -Wed Sep 20 13:01:52 1995 Ian Lance Taylor - - * Makefile.in (maintainer-clean): New target, synonym for - realclean. Add GNU standard maintainer-clean echos. - * doc/Makefile.in (maintainer-clean): New target, synonym for - realclean. - -Tue Sep 19 11:31:31 1995 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Reject immediate operands for '%'. - - * config/tc-m68k.c (m68k_ip): Reject immediate operands for '|'. - Replace 'P' with '0', '1', and '2'. - - * config/tc-m68k.c (parse_mri_control_operand): Change leftstop - and rightstop to not be const. - (parse_mri_control_expression): Likewise. - (build_mri_control_operand): Likewise. Use m68k_ip_op to examine - the operand, not m68k_reg_parse. - (s_mri_if): In MRI mode, stop at the first '*'. - (s_mri_while): Likewise. - (s_mri_else): In MRI mode, ignore trailing characters. - (s_mri_endi, s_mri_break, s_mri_next, s_mri_for): Likewise. - (s_mri_endf, s_mri_repeat, s_mri_until, s_mri_endw): Likewise. - * config/m68k-parse.y: Revert yesterday's change. - * config/m68k-parse.h: Revert yesterday's change. - -Mon Sep 18 15:22:28 1995 Ian Lance Taylor - - * config/tc-m68k.c (parse_mri_control_operand): Change leftstart - and rightstart to not be const. - (parse_mri_control_expression): Likewise. - (build_mri_control_operand): Likewise. If the left side of the - comparison is a register, and the right side is not, swap the two - sides. - * config/m68k-parse.y (m68k_reg_parse): Make globally visible. - * config/m68k-parse.h (m68k_reg_parse): Declare. - - * read.c (mri_comment_field): New function. - (mri_comment_end): New function. - (s_align_bytes): Use mri_comment_field. - (s_align_ptwo, s_comm, s_mri_common, s_fail, s_globl): Likewise. - (s_float_space, s_struct): Likewise. - (s_space): Use mri_comment_field rather than doing it by hand. - (cons_worker, equals): Likewise. - (s_end): Ignore comments starting with '*' or '!'. - * read.h (mri_comment_field): Declare. - (mri_comment_end): Declare. - * cond.c (s_if): Use mri_comment_field. - * config/tc-m68k.c (s_chip, s_reg): Likewise. - - * write.c (fixup_segment): Handle ABS-sym in -sym case rather than - sym-sym case. - * config/obj-coff.c (fixup_segment): Likewise. Permit negative - symbols if TC_M68K. - * config/tc-m68k.c (tc_coff_fix2rtype): If fx_tcbit is set, return - R_RELLONG_NEG. - (tc_gen_reloc): If fx_tcbit is set, abort. - (md_apply_fix_2): For a negative reloc, move fx_subsy to fx_addsy, - and set fx_tcbit. - - * config/tc-m68k.c (s_reg): Ignore comment field in MRI mode. - -Mon Sep 18 14:44:04 1995 Arne H. Juul - - * configure.in (mips-dec-netbsd*): New target. - * configure: Rebuild. - -Sun Sep 17 22:17:43 1995 Ian Lance Taylor - - * configure.in: Set endian to little for mips-*-ultrix*. - * configure: Rebuild. - -Fri Sep 15 13:16:55 1995 Ian Lance Taylor - - * expr.c (current_location): New static function. Handle magic - symbol `.'; in absolute section, return a constant. - (operand): Call current_location for '.' and '$', instead of doing - it inline. In MRI mode, call current_location for '*'. - -Fri Sep 15 21:39:29 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-m68k.c: Change some "CONST" references to "const". - -Fri Sep 15 17:27:41 1995 Ken Raeburn - - Tue Sep 12 17:08:23 1995 Pat Rankin - - * config/obj-vms.c (VMS_stab_parse): simplify first loop; - use S_GET_NAME/modify/S_SET_NAME sequence instead of abusing - S_GET_NAME when updating symbol name. - (local_symbols_DST): first prefix/postfix typo from July 21st. - [plus comment reformatting --kr] - -Wed Sep 13 12:33:03 1995 Ian Lance Taylor - - * Makefile.in (EXPECT): New variable. - (CHECKFLAGS): Remove. - (site.exp): New target. - (check): Rewrite to invoke runtest directly, rather than recurring - down into testsuite. - (clean-here): Remove testsuite directory. - (clean, distclean): Don't recur into testsuite. - * configure.in: Don't call AC_CONFIG_SUBDIRS(testsuite). - * configure: Rebuild. - - * write.c (relax_and_size_seg): Change to the segment we are - relaxing, in case md_convert_frag, called by cvt_frag_to_fill, - wants to call fix_new. - * config/tc-m68k.c (m68k_ip): Permit PC relative code if the - segment of the symbol is the current segment, not just in - text_section. - (md_convert_frag_1): Don't call subseg_change. - (md_estimate_size_before_relax): Likewise. - -Tue Sep 12 10:36:40 1995 Doug Evans - - * config/tc-arm.c (md_atof): Fix debugging printf, and leave it - out by default. - -Mon Sep 11 11:39:11 1995 Ian Lance Taylor - - * doc/configure.in: Remove unused file. - - * app.c (do_scrub_chars): Grab all available spaces at start of - line before preserving a single space. Remove state == 0 test - which will never succeed. - * macro.c (macro_expand_body): Delete local variables from the - formal hash table. - (macro_expand): In MRI mode, stop when whitespace is seen in the - argument list. - - * sb.c: Include "libiberty.h". - * macro.c: Likewise. Also include if it exists. - -Fri Sep 8 00:27:46 1995 Ian Lance Taylor - - * app.c (do_scrub_chars): In MRI mode, keep a space before a - possible comment character. - * config/tc-m68k.c (m68k_ip): In MRI mode, ignore anything after - an instruction which takes no operands. - - * Makefile.in (install): Don't install gasp in $(tooldir). - - * config/tc-mips.c (macro): Handle a non zero base register for - M_U{L,S}{D,W,H}_A. - - * gasp.c (show_usage): Put program_name argument in first fprintf, - not second. - -Thu Sep 7 12:33:58 1995 Ian Lance Taylor - - * expr.c (operand): Handle 08 and 09 in MRI mode. - * macro.c (ISSEP): Remove duplicated `"' character. - (get_any_string): Copy some characters for which ISSEP is true: - ';', '>', '(', ')'. Otherwise we can get in an infinite loop. - * read.c (s_space): In MRI mode, the expressions stop at the first - unquoted space. - (cons_worker): In MRI mode, restore the terminating character at - the end of the function. - - * read.c (cons_worker): Don't use #elif; old compilers don't - support it. - -Wed Sep 6 21:13:06 1995 Ian Lance Taylor - - * app.c (do_scrub_chars): In MRI mode, silently end quoted strings - at newline characters. In MRI mode, always keep spaces in the - operands field. In MRI mode, treat a line comment character as a - regular comment character following a space. - * cond.c (ignore_input): Use strncasecmp rather than strncmp when - looking for special pseudo-ops. - * read.c (cons_worker): In MRI mode, the expressions stop at the - first unquoted space. - (equals): Likewise. - -Wed Sep 6 15:03:53 1995 Jim Wilson - - * config/tc-sh.c (get_operands): Read third arg if it exists. - Otherwise, clear it. - (get_specific, case F_FR0): Add. - -Wed Sep 6 15:03:53 1995 Jim Wilson - - * config/tc-sh.c (get_specific): Delete arg_to_test. - (md_assemble): Increase operand array from 2 to 3. - -Tue Sep 5 16:47:36 1995 Stan Shebs - - * config/tc-mips.c: Remove CYGNUS LOCAL comments. - (md_begin): Use 0/1 instead of TRUE/FALSE. - (md_show_usage): Break up long format string for the benefit - of lame compilers. - * config/tc-m68k.c (md_show_usage): Ditto. - * gasp.c (show_usage): Ditto. - * macro.c (check_macro): Cast result of hash_find. - -Tue Sep 5 14:46:38 1995 Ken Raeburn - - * configure.in: When testing for a free() declaration in system - header files, cast the address to a function pointer, not to an - integer. - - * write.c (fix_new_internal): Call TC_INIT_FIX_DATA if TC_FIX_TYPE - is defined. Don't initialize fx_bsr. Verify that fx_size field - is wide enough to hold stored value. - * write.h (struct fix): Change tc_fix_data to type TC_FIX_TYPE if - that is defined, otherwise omit it. Delete fx_bsr. Change - fx_size to unsigned char. - * config/tc-i960.h (TC_FIX_TYPE, fx_bsr, TC_INIT_FIX_DATA): New - macros. - * config/tc-ns32k.h (TC_FIX_TYPE, fx_bsr, TC_INIT_FIX_DATA): New - macros. - * config/tc-hppa.h (TC_FIX_TYPE): Define as PTR. - - * config/tc-i860.c (md_apply_fix): Delete code for checking - fx_im_disp, and for handling non-zero values, since it never gets - set after being initialized to zero. - - * write.h (struct fix): Make fx_im_disp always 2 bits, since the - only tc-* files actually using it need that much. - - NS32K changes from Ian Dall: - * configure.in: Treat ns32k-pc532-ux* like ns32k-pc532-mach*, and - ns32k-pc532-lites* like ns32k-pc532-netbsd*. - * config/tc-ns32k.h (LOCAL_LABELS_FB): Define to 1. - -Fri Sep 1 17:02:15 1995 steve chamberlain - - * write.c (fixup_segment): Get TC_FORCE_RELOCATION up the - right way! - -Fri Sep 1 08:20:19 1995 James G. Smith - - * config/tc-mips.c (md_parse_option, md_begin, md_show_usage): - Add support for "-mcpu=vr4300" as processor identifier. - -Thu Aug 31 16:41:06 1995 steve chamberlain - - * write.c (fixup_segment): Remove change of 29th. - * config/tc-{i386,arm}.h (TC_FORCE_RELOCATION): Keep RVA relocs. - -Tue Aug 29 19:42:58 1995 Andreas Schwab - - * config/tc-m68k.c (m68k_ip) [case POST/PRE/BASE]: Fix typo when - looking at outer displacement. Don't set the postindex bit if the - index suppress bit is set (for memory indirect addressing mode). - -Thu Aug 31 06:49:37 1995 Doug Evans - - * config/tc-arm.c (tc_gen_reloc): Delete duplicated code. - -Wed Aug 30 23:51:57 1995 Ian Lance Taylor - - * app.c (do_scrub_chars): Free saved_input when the from buffer - exactly fills the to buffer. - -Wed Aug 30 13:46:39 1995 Doug Evans - - * config/tc-sparc.c (parse_keyword_arg, parse_const_expr_arg): New fns. - (sparc_ip): Call them for asi, membar, and prefetch parsing. - -Tue Aug 29 15:45:37 1995 Doug Evans - - * config/tc-sparc.c (membar_masks): Deleted. - (sparc_ip): Clean up ASI and membar support. - -Tue Aug 29 13:20:27 1995 steve chamberlain - - * read.c (potable): Rva is new entry. - (cons_worker): New, split from cons. Handles rva. - (cons, s_rva): Call cons_worker. - * read.h (s_rva): New declaration. - * write.c (fixup_segment): Don't throw away rva relocs. - * config/tc-arm.c (md_apply_fix, tc_gen_reloc): Handle RVA. - * config/tc-i386.c (tc_coff_fix2type): Handle RVA. - * config/tc-i386.h (TC_COUNT_RELOC): Remember RVAs. - (TC_RVA_RELOC): New definition. - -Sun Aug 27 17:41:05 1995 Doug Evans - - * config/tc-arm.c (do_swi): Allow optional leading '#'. - -Sat Aug 26 17:24:20 1995 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-m68k.c (comment_chars): If TE_DELTA is defined, - include '#'. - * config/tc-m68k.h (NO_PSEUDO_DOT): Define if TE_DELTA is - defined. - - * config/te-delta.h: Include obj-format.h. - * config/te-sco386.h: Likewise. - * config/te-sysv32.h: Likewise. - - * app.c (scrub_file): Remove. - (scrub_from_file, scrub_to_file): Remove. - (scrub_string, scrub_last_string): Remove. - (scrub_from_string, scrub_to_string): Remove. - (saved_input, saved_input_len): New static variables. - (struct app_saved): Remove scrub_string, scrub_last_string, and - scrub_file fields. Add saved_input and saved_input_len fields. - (app_push): Adjust saved fields for changes in struct app_save. - Initialize state and saved_input. - (app_pop): Adjust saved fields for changes in struct app_save. - (do_scrub_chars): Rename from do_scrub_next_char and rewrite to - process a buffer at a time rather than a character at a time. - (main, as_warn): Remove obsolete testing code. - * as.h (do_scrub_next_char): Don't declare. - (do_scrub_chars): Declare. - (scrub_from_file, scrub_from_string): Don't declare. - (scrub_to_file, scrub_to_string): Don't declare. - * input-file.c (input_file_get): New static function. - (input_file_give_next_buffer): Call do_scrub_chars rather than - do_scrub_next_char. - * read.c (scrub_string, scrub_string_end): New static variables. - (scrub_from_string): New static function. - (read_a_source_file): Call do_scrub_chars rather than - do_scrub_next_char. - -Thu Aug 24 18:50:19 1995 Ian Lance Taylor (ian@cygnus.com) - - * gasp.c (as_abort): New function. - * sb.c (sb_build): Revert yesterday's patch. - - * Makefile.in (gasp.new): Depend upon ../libiberty/libiberty.a. - Just link against libiberty, not against $(LIBS). - -Wed Aug 23 15:18:20 1995 Ian Lance Taylor (ian@cygnus.com) - - * sb.c (sb_build): Undefine abort before calling it, since gasp - does not provide as_abort. - -Wed Aug 23 10:40:41 1995 Michael Meissner - - * config/tc-ppc.c (set_target_endian): New static to say whether - we've initialized target_big_endian or not. - (md_parse_option): Set set_target_endian if we set the variable - target_big_endian. - (md_begin): Only set target_big_endian if !set_target_endian. - -Tue Aug 22 03:00:33 1995 Ken Raeburn - - Sat Aug 19 18:08:16 1995 Pat Rankin - - * config/obj-vms.h (DST_S_C_SRC_SETREC_W, DST_S_C_SRC_DEFLINES_B): - New macros. - * config/obj-vms.c (VMS_TBT_Line_PC_Correlation, - VMS_TBT_Source_Lines): Make traceback info be robust enough to - handle huge source files. - (VMS_TBT_Source_File): Reorganize the native- vs cross-assembly - support so that actual object file output is clearer. - (VMS_TBT_Source_File: Fab, Nam, Date_Xab, File_Header_Xab): - Replace static variables with automatic ones. - - Sat Aug 12 20:18:15 1995 Pat Rankin - - * config/obj-vms.c (Module_Name): new file scope variable. - (VMS_TBT_Module_Begin): use it instead of local variable. - (Write_VMS_MHD_Records): ditto; assign its value here. - (Write_VMS_EOM_Record): second argument has type valueT. - (VMS_Initialized_Data_Size): simplify search loop; return - type is offsetT; second argument is unsigned. - - Sat Jun 17 19:05:25 1995 Pat Rankin (rankin@eql.caltech.edu) - - * messages.c (as_perror): Use xstrerror instead of strerror. - -Mon Aug 21 13:57:20 1995 Ian Lance Taylor - - * as.c (parse_args): Accept --defsym SYM=VALUE. - * doc/as.texinfo, doc/as.1: Document --defsym. - - * read.c (read_a_source_file): In MRI mode, don't end the - statement inside a quotation. - (s_space): Don't warn about a zero repeat count in MRI mode. - * config/tc-m68k.c (crack_operand): In MRI mode, don't count - parentheses inside quotes. - (md_assemble): In MRI mode, anything after the operands field is a - comment. - (parse_mri_control_operand): Adjust start and stop to remove - spaces. - (s_mri_for): Likewise. - - * cond.c (s_ifdef): Restore the character after the symbol name, - in case it is a newline. - (s_if): If ignoring the current tree, don't try to parse the - expression. - - * app.c (do_scrub_next_char): If LEX_IS_STRINGQUOTE or - LEX_IS_ONECHAR_QUOTE is seen in state 10, preserve one space. - - * doc/as.texinfo: Document irp, irpc, macro, and rept. MRI mode - now supports macros, ifc, ifnc, irp, irpc, rept, and endr, without - using gasp. - - Add support for macros. - * as.c: Include sb.h and macro.h. - (max_macro_next): New global variable. - (main): Call macro_init. - (macro_expr): New static function. - * as.h (max_macro_nest): Declare. - * read.c (line_label): Rename from mri_line_label. Change all - uses. - (potable): Add exitm, irp, irpc, macro, mexit, rept. - (read_a_source_file): Always clear line_label at the start of a - line, not just when flag_mri or LABELS_WITHOUT_COLONS. Fix - MRI/LABELS_WITHOUT_COLONS handling. In MRI mode, permit label: - equ val. Set line_label when calling colon. In MRI mode, a - leading '.' does not imply a pseudo-op. Check for macro expansion - before calling md_assemble. - (s_irp): New function. - (get_line_sb): New static function. - (s_macro): New function. - (s_mexit): New function. - (s_rept): New function. - * read.h (line_label): Rename from mri_line_label. - (s_irp, s_rept): Declare. - (s_macro, s_mexit): Declare. - * input-scrub.c: Include sb.h. - (sb_index, from_sb): New static variables. - (macro_nest): New static variable. - (struct input_save): Add sb_index and from_sb fields. Change - next_saved_file field to be struct input_save *. - (next_saved_file): Changed to be struct input_save *. - (input_scrub_push): Change to return type struct input_save *. - Save sb_index and from_sb. - (input_scrub_pop): Change parameter type to struct input_save *. - Restore sb_index and from_sb. - (input_scrub_include_sb): New function. - (input_scrub_next_buffer): Handle reading from from_sb. - (bump_line_counters): Only increment lines if not using from_sb. - * config/tc-m68k.c (opt_table): Add nest. - (opt_nest): New static function. - * gasp.c: Include sb.h and macro.h. Move all sb related functions - and definitions to sb.h and sb.c. Move all macro related - functions and definitions to macro.h and macro.c. - * sb.h, sb.c: New files, extracted from gasp.c. - * macro.h, macro.c: Likewise. - * Makefile.in (OBJS): Add sb.o and macro.o - (GASPOBJS): Define. - (gasp.new): Depend upon $(GASPOBJS). Use $(GASPOBJS) to link. - (TARG_CPU_DEP_m68k): Depend upon subsegs.h. - (gasp.o): Depend upon sb.h and macro.h. - (sb.o): New target. - (macro.o): New target. - (as.o): Depend upon sb.h and macro.h. - (input-scrub.o): Depend upon sb.h. - (read.o): Depend upon sb.h and macro.h. - - * cond.c (get_mri_string): New static function. - (s_ifc): New function. - * read.c (potable): Add ifc and ifnc. - * read.h (s_ifc): Declare. - - * app.c (do_scrub_begin): In MRI mode, set lex of ' to - LEX_IS_STRINGQUOTE. - -Mon Aug 21 13:41:33 1995 Michael Meissner - - * config/tc-ppc.c (md_assemble): Allow @HA, @L, and @H suffixes on - constant expressions. - -Sun Aug 20 15:54:37 1995 Jim Wilson - - * config/tc-arm.c (md_reloc_size): Add const to declaration. - -Fri Aug 18 10:58:09 1995 Ian Lance Taylor - - * read.c (s_include): In MRI mode, don't expect quotes around the - file name. - * listing.c (listing_title): Don't require the title to be quoted. - - * gasp.c (include_print_where_line): Always subtract 1 from - linecount before printing it. - (process_file): In MRI mode, lines beginning with '*' or '!' are - comments. - (do_reg): In MRI mode, don't require parentheses. - (do_include): In MRI mode, don't requires quotes. If the file can - not be found in the include path, try opening it in the current - directory. Print the file name correctly in the error message. - (chartype_init): In MRI mode, set FIRSTBIT for '.'. - (main): Set comment_char to ';' when entering MRI mode. - - * config/tc-m68k.c: Include subsegs.h. - (m68k_ip): Pass 64 rather than -1 to add_Fix in 'B' 'B' case. - (md_pcrel_from): If fx_pcrel_adjust is 64, use -1 instead. - - * config/tc-sparc.h (tc_fix_adjustable): For OBJ_AOUT case, adjust - BFD_RELOC_16 and BFD_RELOC_32 relocs. - -Wed Aug 16 14:48:44 1995 Ken Raeburn - - * as.h (alloca): Use void* declaration on HP/UX. - -Wed Aug 16 12:49:17 1995 Ian Lance Taylor - - * config/tc-sparc.c (tc_gen_reloc): If PIC, only change PCREL_S2 - to WPLT30 for an undefined or external symbol. Don't consider - PC10 or PC22 to be a PC relative reloc when choosing between - fx_addnumber and fx_offset. - - * config/tc-z8k.c (md_number_to_chars): Don't do it here, call - number_to_chars_bigendian. - * config/tc-z8k.h (TARGET_BYTES_BIG_ENDIAN): Define. - - * expr.c (operand): Add support for .startof. and .sizeof. by - using magic symbol names which the linker will recognize - specially. - * doc/as.texinfo: Take out note that .startof. and .sizeof. are - not supported. - -Tue Aug 15 15:08:49 1995 Ian Lance Taylor - - * config/tc-m68k.c (md_pseudo_table): Add MRI structured control - directives: if, if.b, if.w, if.l, else, else.s, else.l, endi, - break, break.s, break.l, next, next.s, next.l, for, for.b, for.w, - for.l, endf, repeat, until, until.b, until.w, until.l, while, - while.b, while.w, while.l, endw. - (enum mri_control_type): Define. - (struct mri_control_info): Define. - (mri_control_stack): New static variable. - (mri_control_index): New static variable. - (mri_control_label): New static function. - (push_mri_control, pop_mri_control): New static functions. - (parse_mri_condition): New static function. - (parse_mri_control_operand): New static function. - (swap_mri_condition, reverse_mri_condition): New static functions. - (build_mri_control_operand): New static function. - (parse_mri_control_expression): New static function. - (s_mri_if, s_mri_else, s_mri_endi): New static functions. - (s_mri_break, s_mri_next): New static functions. - (s_mri_for, s_mri_endf): New static functions. - (s_mri_repeat, s_mri_until): New static functions. - (s_mri_while, s_mri_endw): New static functions. - * gasp.c (mrikinfo): Remove IF. - * expr.c (get_symbol_end): Accept \001 as part of a name. - - * symbols.c (colon): Change parameter to const char *. - * symbols.h (colon): Update declaration. - -Mon Aug 14 20:51:56 1995 Ken Raeburn - - * write.c (write_contents): Always do it the BFD_FAST_SECTION_FILL - way. Reformat and reindent that code to GNU standards. - (BFD_FAST_SECTION_FILL): Don't define. - -Mon Aug 14 14:08:07 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_apply_fix): Don't try to apply BEGIN_BRTAB - or END_BRTAB fixups. - -Mon Aug 14 15:45:07 1995 Ian Lance Taylor - - * gasp.c (do_align, get_any_string): Mark as static. - (do_assigna, do_assignc, new_file): Likewise. - - * config/tc-m68k.c (s_reg): Rename local op to rop to avoid - confusion with macro op. - - * gasp.c (strip_comments): Comment out; it's not used. - (do_end): Add parameter. In MRI mode, print it out. - (do_irp): New static function. - (sub_actual): Change parameter m to formal_hash, changing type - from macro_entryh * to hash_table *. - (macro_expand_body): New static function, broken out of - macro_expand. - (macro_expand): Call macro_expand_body. - (K_*): Fully parenthesize. - (K_IRP, K_IRPC): Define. - (mrikinfo): Add IRP and IRPC. - (process_pseudo_op): In MRI mode, print out END pseudo-op. Pass - line to do_end. Handle K_IRP and K_IRPC. - - * config/tc-m68k.c (s_opt): Reset *input_line_pointer even if we - don't do anything with the option. - -Sun Aug 13 17:03:58 1995 Ian Lance Taylor - - * frags.c (frag_align): Handle absolute_section. - * write.c (record_alignment): Likewise. - - * config/tc-mips.c (macro_build): Skip insns with an inappropriate - ISA level. - -Sun Aug 13 00:35:02 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_pseudo_table): Add entries for - "begin_brtab" and "end_brtab" pseudo-ops. - (pa_brtab): New function. - (tc_gen_reloc, SOM version): Handle R_BEGIN_BRTAB and R_END_BRTAB. - (hppa_force_relocation): Force relocations for BRTAB fixups - when OBJ_SOM is defined. - -Fri Aug 11 20:34:05 1995 Ken Raeburn - - * Makefile.in (TE_OBJS): Add empty definition. - -Fri Aug 11 19:16:08 1995 Ian Lance Taylor - - * gasp.c (change_base): Don't treat ' specially in MRI mode. - (process_file): Don't warn about missing END in MRI mode. - (do_if): New static function. - (get_mri_string, do_ifc): New static functions. - (buffer_and_nest): Treat MRI mode like alternate syntax mode. - (do_aendr): Change error message in MRI mode. - (do_arepeat): Use REPT/ENDR in MRI mode. - (do_formals): In MRI mode, add special NARG formal. - (macro_expand): Various changes for MRI mode: permit a qualifier - on the macro name; set special NARG formal; permit unnamed - positional arguments; use && to concatenate named parameters; - permit \d to specify an unnamed parameter; permit named parameters - to not start with \; use == to see if a parameter exists. - (getstring): In MRI mode, allow <> to quote a string. - (K_IFEQ, K_IFNE, K_IFLT, K_IFLE, K_IFGE, K_IFGT): Define. - (K_IFC, K_IFNC): Define. - (struct keyword): Name structure used in kinfo array. - (mrikinfo): New static array. - (process_pseudo_op): Don't require leading '.' in MRI mode. - Handle new MRI pseudo-op definitions. - (add_keyword): New static function, broken out of process_init. - (process_init): Use add_keyword. In MRI mode, add mrikinfo table. - (long_options): Add "mri". - (show_usage): Mention -M/--mri. - (main): Call process_init after processing arguments. Handle -M. - * doc/gasp.texi: Document -M/--mri. - - * gasp.c: Include ansidecl.h. Make all local functions static. - Add prototypes for all static functions. - (mri): New global variable. - (sb_add_char): Change parameter c from char to int. - (sb_add_string): Make parameter s into a const pointer. - (sb_add_buffer): Likewise. - (checkconst): Change parameter op from char to int. - (exp_get_abs): Make parameter emsg into a const pointer. - (do_res): Change parameter type from char to int. - (buffer_and_nest): Make parameters from and to into const - pointers. - (do_sdata): Change parameter type from char to int. - (new_file): Make parameter name into a const pointer. - (do_define): Make parameter string into a const pointer. - - * config/tc-h8300.c (md_number_to_chars): Don't do it here, call - number_to_chars_bigendian. - * config/tc-h8300.h (TARGET_BYTES_BIG_ENDIAN): Define. - -Fri Aug 11 13:23:56 1995 Michael Meissner - - * write.h (struct fix): Add new field fx_no_overflow. - - * write.c (fixup_segment): If fx_no_overflow is non-zero, don't - complain if the addend is too large. - - * config/tc-ppc.c (md_assemble): Set fx_no_overflow if the half - word relocations BFD_RELOC_{LO16,HI16,HI16_S}. - -Thu Aug 10 20:56:38 1995 Ken Raeburn - - * read.c (s_mri_sect) [BFD_ASSEMBLER]: Fix typos in choosing and - setting section flags. - -Thu Aug 10 00:38:11 1995 Ian Lance Taylor - - * doc/as.texinfo: Add documentation for MRI compatibility mode. - * doc/as.1: Likewise. - - * config/tc-m68k.c (m68k_ip): When recognizing '#', use isbyte and - iword rather than expr8 and expr16. When recognizing 'M', use - issbyte rather than expr8. When recognizing 'Q' and 't', just - check for O_constant rather than using expr8. - * config/m68k-parse.h (expr8, expr16): Don't define. - * Makefile.in (m68k-parse.o): Depend upon m68k-parse.h, not - m68k-parse.y. - - * read.c (potable): Add spc, ttl, xcom, xref. - (s_mri_sect): New function. - * read.h (s_mri_sect): Declare. - * config/obj-coff.c (obj_coff_section) (both versions): In MRI - mode, call s_mri_sect. - (obj_pseudo_table): Add sect.s and section.s. Move sect outside - of ifndef BFD_ASSEMBLER. - * config/obj-elf.c (elf_pseudo_table): Add section.s, sect, - sect.s. - (obj_elf_section): In MRI mode, call s_mri_sect. - * config/tc-m68k.c (md_pseudo_table): Add restore, save. - (struct save_opts): Define. - (save_stack): New static variable. - (s_save, s_restore): New static functions. - - * read.c (s_set): Remove unused local ptr. - (hex_float): Check target_big_endian. - (equals): Remove unused local p. - - * config/tc-a29k.h (TARGET_BYTES_BIG_ENDIAN): Define. - * config/tc-h8500.h (TARGET_BYTES_BIG_ENDIAN): Define. - * config/tc-hppa.h (TARGET_BYTES_BIG_ENDIAN): Define. - * config/tc-i860.h (TARGET_BYTES_BIG_ENDIAN): Define. - * config/tc-m68k.h (TARGET_BYTES_BIG_ENDIAN): Define. - * config/tc-m88k.h (TARGET_BYTES_BIG_ENDIAN): Define. - * config/tc-tahoe.h (TARGET_BYTES_BIG_ENDIAN): Define. - * config/tc-sh.c (little): Set target_big_endian. - (md_begin): Likewise. - (md_parse_option): Likewise. - (build_relax): Check target_big_endian rather than shl. - (build_Mytes, md_atof): Likewise. - (md_convert_frag, md_apply_fix): Likewise. - (md_number_to_chars): Likewise. - -Wed Aug 9 10:51:48 1995 Ian Lance Taylor - - * config/tc-m68k.c (m68k_abspcadd): New static variable. - (m68k_quick): New static variable. - (m68k_rel32): New static variable. - (md_pseudo_table): Add opt and reg. - (m68k_ip): Permit absolute symbols in 'l'/'L' recognition. Check - m68k_quick in 'M' and 'Q' recognition. Check m68k_abspcadd in - DISP handling. Check m68k_rel32 in BASE/POST/PRE handling. - (md_begin): In MRI mode, initialize m68k_abspcadd and m68k_rel32. - In MRI mode, change unsized branch aliases to be variable sized. - (struct opt_action): Define. - (opt_table): Define. - (s_opt): New static function. - (skip_to_comma): New static function. - (opt_chip): New static function. - (opt_list): New static function. - (opt_list_symbols): New static function. - (s_reg): New static function. - * as.h (flag_keep_locals): Change from unsigned char to int. - (flag_no_warnings): Likewise. - - * read.c (mri_line_label): Make non-static. - (potable): Add nopage, page, plen. - (s_org): Error if in MRI mode. - * read.h (mri_line_label): Declare. - * listing.c (listing_nopage): New function. - * listing.h (listing_nopage): Declare. - - * symbols.c (symbol_begin): Set sy_frag of abs_symbol to - &zero_address_frag. - - * write.c (adjust_reloc_syms): Check that symbol is not NULL - before checking sy_mri_common. - (fixup_segment): Likewise. - * config/obj-coff.c (fixup_segment): Likewise. - - * read.c (abs_section_offset): New global variable. - (potable): Add offset, struct. - (do_org): New static function; handle changing the origin in the - absolute section. - (s_org): Use do_org. - (s_set): Likewise. - (equals): Likewise. - (s_space): In absolute_section, just increase abs_section_offset. - (s_struct): New function. - (emit_expr): Handle absolute_section specially. - * read.h (abs_section_offset): Declare. - (s_struct): Declare. - * frags.c (frag_more): Warn if in absolute_section. - (frag_now_fix): In absolute_section, return abs_section_offset. - * subsegs.c (subseg_change): If switching to absolute_section, - just set now_seg and now_subseg. - (subseg_set_rest): Special handling when switching to or from - absolute_section. - - * config/tc-m68k.c (m68k_float_copnum): New static variable. - (md_pseudo_table): Add fopt and mask2. - (m68k_ip): Use m68k_float_copnum, not COPNUM, when setting - coprocessor register to use. In case 'I' when checking operands, - correct coprocessor register numbers. In case 'I' when setting - operands, don't add 1. - (s_fopt): New static function. - * config/m68k-parse.h (COPNUM): Don't define. - - * read.c (potable): Add ifeq, ifge, ifgt, ifle, iflt, ifne. - Change if to pass O_ne to s_if. - (read_a_source_file): Don't define an label without a colon if - ignore_input returns true. - * cond.c (s_if): Treat argument as an operatorT describing how to - compare the argument against zero. - (ignore_input): Don't require an initial dot in MRI mode, or if - NO_PSEUDO_DOT is defined. - - * read.c (potable): Add dcb, dcb.b, dcb.d, dcb.l, dcb.s, dcb.w, - dcb.x, ds.d, ds.p, ds.s, ds.x, elsec, endc, fail, format, llen, - noformat. - (read_a_source_file): If pseudo-op handler is s_end, quit - immediately. - (s_end): New function. - (s_fail): New function. - (s_float_space): New function. - (hex_float): New static function. - (float_cons): Use hex_float. - * read.h (s_fail): Declare. - (s_float_space): Declare. - * cond.c (s_end): Remove. - * listing.c (listing_psize): Treat argument as indicating whether - a height is expected. - - * read.c (mri_pending_align): New static variable. - (read_a_source_file): Handle mri_pending_align. - (cons): Set mri_pending_align if appropriate. - - * configure.in: Move random special target handling before - possible break. - * configure: Rebuild. - -Tue Aug 8 23:41:25 1995 Alan Modra - - * configure.in: Consistently use ${target_cpu_type} rather than - ${cpu_type} after the loop. - * configure: Rebuild. - * Makefile.in (targ-cpu.o): Use @target_cpu_type@ rather than - @cpu_type@. - -Tue Aug 8 17:27:17 1995 Ken Raeburn - - * expr.h (operatorT): Remove comma after last enumerator value. - - * config/obj-vms.c: Some whitespace cleanup from Pat Rankin. - - * as.h (alloca): If __STDC__, declare void* instead of char*. - - Wed Aug 2 18:54:37 1995 Pat Rankin - - * config/obj-vms.c (Flush_VMS_Object_Record_Buffer, - Close_VMS_Object_File): Reorganize the `#if !VMS' cross-assmebler - support code. - (Close_VMS_Object_File): Call Set_VMS_Object_File_Record to flush - output buffer--just in case--before closing the file. - -Tue Aug 8 13:07:05 1995 Ian Lance Taylor - - * config/tc-m68k.c (archs): Add 68ec000, 68hc000, 68hc001, - 68ec020, 68ec030, 68ec040, and 68330. - (md_pseudo_table): Add chip and comline. - (m68k_init_after_args): Use strcasecmp when comparing default_cpu - against architectures. - (mri_chip, s_chip): New static functions. - - * struc-symbol.h (struct symbol): Add sy_mri_common bit. - * read.h (mri_comon_symbol): Declare. - (s_mri_common): Declare. - * read.c (mri_line_label): New static variable. - (mri_common_symbol): New global variable. - (potable): Add "common" and "common.s". - (read_a_source_file): In MRI mode, set mri_line_label for a label - at the start of a line. - (s_mri_common): New function. - (s_space): Handle mri_common_symbol. - * symbols.c (colon): Change return value from void to symbolS *, - and return new symbol. If mri_common_symbol is set, attach the - new symbol to it. - (resolve_symbol_value): Handle an sy_mri_common symbol. - * symbols.h (colon): Change return value in declaration. - * subsegs.c (subseg_set_rest): Clear mri_common_symbol. - (subseg_set (both versions)): Likewise. - * frags.c (frag_more): Warn if mri_common_symbol is not NULL. - * write.c (adjust_reloc_syms): Skip sy_mri_common symbols. - (write_object_file): Discard sy_mri_common symbols. - (fixup_segment): Change relocations against sy_mri_common symbols - to be against the common symbol itself. - * config/obj-coff.c (yank_symbols): Discard sy_mri_common symbols. - (fixup_segment): Change relocations against sy_mri_common symbols - to be against the common symbol itself. - * config/obj-aout.c (obj_crawl_symbol_chain): Discard - sy_mri_common symbols. - - * doc/c-m68k.texi: Add documentation for CPU specific options, and - for Motorola syntax. - - * config/m68k-parse.y (motorola_operand): For (%pc), set mode to - DISP, not BASE. - -Tue Aug 8 02:31:38 1995 Ken Raeburn - - * write.c (relax_align): Add extra padding for linkrelax only if - LINKER_RELAXING_SHRINKS_ONLY is defined. - * config/tc-i960.h (LINKER_RELAXING_SHRINKS_ONLY): Define it. - * doc/internals.texi (Relaxation): Write up some stuff on linker - relaxing and LINKER_RELAXING_SHRINKS_ONLY. - -Mon Aug 7 17:18:10 1995 Ian Lance Taylor - - * config/m68k-parse.y: New file: bison grammar for m68k operands, - including support for Motorola syntax. - * config/m68k-parse.h: New file; definitions shared between - m68k-parse.y and tc-m68k.c. - * config/tc-m68k.c: Include m68k-parse.h. - (enum operand_type): Move to m68k-parse.h, where it is named - m68k_operand_type. Rename all uses. Rearrange somewhat. Add - FPREG. Rename AOFF to DISP. Rename AINDX to BASE. Rename APODX - to POST. Rename APRDX to PRE. Remove AMIND. Rename MSCR to - CONTROL. Remove DINDR. - (struct m68k_exp): Move to m68k-parse.h. Remove e_beg, e_end and - e_seg fields. Rename e_exp to exp. Rename e_siz to size, and - change type to enum m68k_size. Change all uses. - (enum _register): Move to m68k-parse.h, where it is named - m68k_register. Rename all uses. Add ZDATA0-7 and ZADDR0-7. - (struct m68k_op): Move to m68k-parse.h. Change all fields. - (seg): Don't define. - (add_exp): Remove. - (FAIL, OK): Remove. - (m68k_reg_parse): Move to m68k-parse.y, and rewrite. - (SKIP_WHITE, SKIP_W): Remove. - (try_moto_index, try_index): Remove. - (m68k_ip_op): Move to m68k-parse.y, and rewrite to use grammar. - (main): Remove obsolete test function. - (m68k_ip): Extensive changes to use new grammar. - (get_regs): Remove. - (crack_operand): m68k_ip_op now returns 0 on success. - (init_table): Add ssp, zd0-7 and za0-7. - (md_assemble): Make er const. Correct loop over operands when - looking for error message. - (md_begin): Set alt_notend_table for '(' and '@'. - (get_num): Expression is already parsed. Don't set seg. - * configure.in: If cpu_type is m68k, put m68k-parse.o in - extra-objects. - * configure: Rebuild. - * Makefile.in (DISTSTUFF): Add m68k-parse.c. - (BISON): Use ../bison/bison if it exists. - (BISONFLAGS): Define as empty. - (TARG_CPU_DEP_m68k): Depend upon $(srcdir)/config/m68k-parse.h. - (m68k-parse.c, m68k-parse.o): New targets. - -Mon Aug 7 02:54:20 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-sh.c (parse_reg): Handle new FP registers. - (get_specific): Handle new operand types. - -Fri Aug 4 12:29:21 1995 Ian Lance Taylor - - * expr.c (op_encoding): Make non-const. Don't set '"' to - O_bit_not. - (expr_begin): Set op_encoding['"'] in MRI mode. - -Wed Aug 2 18:39:43 1995 Ian Lance Taylor - - * config/tc-m68k.c: Remove BREAK_UP_BIG_DECL stuff. - (struct m68k_incant): Change m_operands field to be const. - (struct m68k_it): Change args field to be const. - (m68k_ip): Change local variable s to be const. - (opcode_ptr): Remove. - (md_begin): Use m68k_numopcodes, not numopcodes. Use - m68k_opcodes, not removed opcode_ptr. Use m68k_numaliases, not - numaliases. - -Tue Aug 1 17:35:26 1995 Ian Lance Taylor - - * config/tc-m68k.c (init_table): Add "control", "status", "iaddr", - "sfcr", and "dfcr" as synonyms for existing entries. - (md_begin): In MRI mode, force flag_reg_prefix_optional to 1. - (md_parse_option): Removed unused locals i and arch. Change type - of arch (another one) to unsigned long. - (tc_coff_sizemachdep): Add return after abort to avoid warning. - - Initial support for MRI style labels and expressions. - * as.h (flag_mri): Declare/define. - * as.c (show_usage): Mention -M and its synonym --mri. - (parse_args): Add 'M' to std_shortopts. Add "mri" to - std_longopts. Set flag_mri if -M is seen. - (main): Call parse_args before input_scrub_begin. Call - expr_begin. - * app.c (do_scrub_begin): Don't set lex for '"' or '\'' in MRI - mode. Do set lex for ';', '*', and '!' in MRI mode. - (do_scrub_next_char): Remove MRI ifdef in LEX_IS_WHITESPACE case. - In MRI mode, keep spaces between labels and colons. Remove MRI - ifndef around LEX_IS_ONECHAR_QUOTE case. In MRI mode, don't use - '!' or '*' as comment characters even if they are in - comment_chars. - * read.h (lex_type): No longer const. - * read.c: Include libiberty.h. - (lex_type): No longer const. - (read_begin): In MRI mode, set lex_type of '?' to 3. - (potable): Add dc, dc.b, dc.d, dc.l, dc.s, dc.w, dc.x, ds, ds.b, - ds.l, ds.w, and xdef. - (read_a_source_file): Change LABELS_WITHOUT_COLON ifdef to check - for MRI mode at runtime rather than compile time. Handle the EQU - pseudo-op in MRI mode. Remove bogus MRI ifdef around done_pseudo. - Change NO_PSEUDO_DOT ifdef to also take effect for MRI mode at - runtime. - (cons): In MRI mode, always call parse_mri_cons rather than - TC_PARSE_CONS_EXPRESSION. - (parse_mri_cons): Always compile, not just when MRI is defined. - Call TC_PARSE_CONS_EXPRESSION, not expression, when the input is - not a string constant. Handle A and E modifiers. - (float_cons): Accept :xxxx, where the x's are hex digits. - * expr.h (operatorT): Add O_eq, O_ne, O_lt, O_le, O_ge, O_gt. - (expr_begin): Declare. - * expr.c (integer_constant): In MRI mode, if the base was not - specified, look for a suffix on the number to set the base. - (mri_char_constant): New static function. - (operand): Remove MRI ifdef. In MRI mode, do various things: Pass - 0 as the base when calling integer_constant if there was no - prefix. Check for a hex constant suffix if when a leading '0' is - seen. Don't accept 0x or 0b as a prefix. Check for E'chars' and - A'chars'. Handle MRI character constants. Treat '"' as the - unary bitwise not operator. Treat $ as the program counter, or as - the prefix for a hex constant. Treat % as the prefix for a binary - constant and @ as the prefix for an octal constant. Treat : as - the prefix for a hex constant. - (op_encoding): Set '"' to O_bit_not, '<' to O_lt, and '>' to O_gt. - (op_rank): No longer const. Change rank values. - (expr_begin): New function. - (operator): New static function. - (expr): Use operator. Don't bother to mention the operator in - warnings. Remove bogus #if 0 code. Handle new operatorT values. - * atof-generic.c (atof_generic): In MRI mode, accept underscores - around the exponent in floating point numbers. - * symbols.h (symbols_case_sensitive): Declare. - * symbols.c (symbols_case_sensitive): New global variable. - (symbol_create): Check symbols_case_sensitive. - (symbol_find_base): Likewise. - (resolve_symbol_value): Handle new operatorT values. - (print_expr_1): Likewise. - (S_IS_LOCAL): In MRI mode, names beginning with two '?' characters - are local. - -Tue Aug 1 11:35:18 1995 steve chamberlain - - * tc-sh.c (md_convert_frag): Make some error messages more - explict. - -Mon Jul 31 21:40:47 1995 Ken Raeburn - - Sat Jul 29 18:55:23 1995 Pat Rankin - - * config/obj-vms.c (COPY_SHORT, COPY_LONG, PUT_SHORT, PUT_LONG): - Make expansion be safe for use in expressions. - (PUT_COUNTED_STRING): Bracket expansion with `do {...} while (0)' - rather than just `{...}'. - -Mon Jul 31 18:19:26 1995 steve chamberlain - - * gasp.c (main): Parse -I option. - (do_include): Look through include list. - * gasp.c (change_base): Don't modify numbers in strings. - -Mon Jul 31 12:16:21 1995 Ian Lance Taylor - - * config/tc-ppc.h (SUB_SEGMENT_ALIGN): Define. From Niclas - Andersson . - -Thu Jul 27 20:47:12 1995 Ken Raeburn - - * config/obj-coff.c (fixup_segment): Don't do further pcrel - processing after converting difference of two symbols in the - same segment. From Jim Wilson. - - * configure.in (i386-*-linuxoldld): Add as synonym for - i386-*-linux*aout*. From Fred Fish. - * configure: Regenerated. - -Thu Jul 27 16:14:56 1995 Pat Rankin - - * config/obj-vms.c (enum ps_type {ps_TEXT,ps_DATA,ps_COMMON, - ps_CONST}): New constants. - (VMS_Psect_Spec): Use them instead of literal strings. - (vms_write_object_file, global_symbol_directory): Adjust callers. - -Wed Jul 26 18:31:35 1995 Pat Rankin - - * config/obj-vms.c (const_flag): Change from char to unsigned char. - * config/obj-vms.h (const_flag): Ditto. - (struct nlist): Replace union n_un and n_un.{n_name,n_next,n_strx} - fields with just n_name; delete field n_value; change n_other from - char to unsigned char and n_desc from short to int; insert explicit - padding for alignment. - -Mon Jul 24 20:06:17 1995 Ken Raeburn - - * subsegs.h (struct seg_info_trash): Make bitfield types valid. - - * config/obj-coff.c (fixup_segment): Local add_number should not - be declared register since its address is taken for - MD_APPLY_FIX3. - - Fri Jul 21 15:28:18 1995 Pat Rankin - - Split huge vms_write_object_file routine into managable pieces. - - * config/obj-vms.c (vms_fixup_text_section, synthesize_data_segment, - vms_fixup_data_section, global_symbol_directory, local_symbols_DST, - vms_build_DST): New routines. - (vms_write_object_file): Call them. - (struct vms_obj_state): New file scope variable used by the above. - -Mon Jul 24 14:10:24 1995 Ian Lance Taylor - - * config/tc-sh.c (md_pseudo_table): Add "uses". - (s_uses): New static function. - (sh_coff_frob_file): New function. - (md_convert_frag): Call subseg_change before calling fix_new. - (sh_handle_align): New function. - (SWITCH_TABLE): Define. - (sh_force_relocation): New function. - (md_apply_fix): Handle R_SH_USES, R_SH_COUNT and R_SH_ALIGN. - (sh_coff_reloc_mangle): Likewise. Also handle switch table - entries. - * config/tc-sh.h (HANDLE_ALIGN): Define. - (sh_handle_align): Declare. - (TC_FORCE_RELOCATION): Define. - (sh_force_relocation): Declare. - (TC_COUNT_RELOC): Simplify; rely on TC_FORCE_RELOCATION instead. - (tc_frob_file): Define. - (sh_coff_frob_file): Declare. - * config/obj-coff.c (write_object_file): Call tc_frob_file if it - is defined. - (fixup_mdeps): Call HANDLE_ALIGN if it is defined. - (TC_FORCE_RELOCATION): Define if not defined. - (fixup_segment): Use TC_FORCE_RELOCATION to decide whether to - clear the symbol fields of fixP. - -Fri Jul 21 22:38:00 1995 Michael Meissner - - * config/tc-ppc.c (ppc_elf_suffix): Add support for R_PPC_SDAREL - relocation. - (md_apply_fix3): Ditto. - -Thu Jul 20 13:00:56 1995 Ken Raeburn - - * config/tc-m68k.c (md_convert_frag): Rename argument seg to sec, - since seg is a macro name in this file. - - * configure.in (arm-*-riscix*): Don't set emulation. - -Wed Jul 19 16:08:29 1995 Doug Evans - - * config/obj-coff.h (TE_PE): Delete. - * config/tc-arm.h (BYTE_ORDER): Delete. - (TARGET_FORMAT): Provide value for OBJ_COFF and TE_PE. - (ARM_BI_ENDIAN): Define if OBJ_COFF and TE_PE. - * config/tc-arm.c (byte_order): Delete. - (md_number_to_chars): Reference target_big_endian, not byte_order. - (md_chars_to_number): Likewise. - (md_longopts): Add -EB/-EL if ARM_BI_ENDIAN. - (md_parse_options): Recognize -EB/-EL. - (md_show_usage): List -EB/-EL. - -Wed Jul 19 11:49:25 1995 Ian Lance Taylor - - * gasp.c (process_assigns): Use toupper before comparing against - upper case letter. - (whatcond): Likewise. - - * config/tc-sh.c (sh_relax): Rename from relax, and make global. - Renamed all uses. - (insert): Pass a size of 2, not 4. - (build_relax): Remove unused len variable. - (md_show_usage): Mention -little option. - (md_convert_frag): Add segT argument. Rewrite to generate relocs - rather than to generate complete instructions here. - (md_apply_fix): Adjust and clarify R_SH_PCRELIMM8BY4 case for - changes in insert and md_pcrel_from. Add cases for R_SH_PCDISP - and R_SH_PCDISP8BY2. - (md_pcrel_from): Don't subtract 1, add 2. - (tc_coff_fix2rtype): Remove. - (sh_coff_reloc_mangle): New function. - * config/tc-sh.h (TC_COFF_FIX2RTYPE): Just return fx_r_type. - (sh_relax): Declare. - (TC_COUNT_RELOC): If relaxing, count PC relative relocs. - (TC_RELOC_MANGLE): Define. - (sh_coff_reloc_mangle): Declare. - (tc_coff_sizemachdep): Declare. - * tc.h (md_convert_frag): Add segT parameter to non BFD_ASSEMBLER - declaration. - * write.c (cvt_frag_to_fill): Add sec argument to non - BFD_ASSEMBLER version. Pass it to md_convert_frag. - (write_object_file): Pass SEG_TEXT to cvs_frag_to_fill. - * config/obj-coff.c (do_relocs_for): Pass segment info to - TC_RELOC_MANGLE. - (fixup_mdeps): Pass segment type to md_convert_frag. - * config/tc-a29k.c (md_convert_frag): Add segT argument. - * config/tc-h8300.c (md_convert_frag): Likewise. - * config/tc-h8500.c (md_convert_frag): Likewise. - * config/tc-i386.c (md_convert_frag): Likewise. - * config/tc-i860.c (md_convert_frag): Likewise. - * config/tc-i960.c (md_convert_frag): Likewise. - * config/tc-m68k.c (md_convert_frag): Likewise. - * config/tc-m88k.h (md_convert_frag): Likewise. - * config/tc-ns32k.c (md_convert_frag): Likewise. - * config/tc-tahoe.c (md_convert_frag): Likewise. - * config/tc-vax.c (md_convert_frag): Likewise. - * config/tc-w65.c (md_convert_frag): Likewise. - * config/tc-z8k.c (md_convert_frag): Likewise. - * config/tc-h8300.h (TC_RELOC_MANGLE): Add segment argument. - * config/tc-h8500.h (TC_RELOC_MANGLE): Likewise. - * config/tc-w65.h (TC_RELOC_MANGLE): Likewise. - * config/tc-z8k.h (TC_RELOC_MANGLE): Likewise. - -Mon Jul 17 15:02:54 1995 Pat Rankin - - * config/obj-vms.c (Current_Routine, Text_Psect): Delete as file - scope variables. - (Define_Routine, Define_Local_Symbols): Take Current_Routine and - Text_Psect as arguments. - (VMS_DBG_Define_Routine): Delete. - (VMS_TBT_Block_End): Change `Size' argument from int to valueT. - (vms_write_object_file: text and data fixup loops): Difference - of two symbols has type offsetT rather than int; convert with - md_number_to_chars before passing to VMS_Store_Immediate_Data. - (vms_write_object_file: debug symbol loop): Call Define_Routine - instead of VMS_DBG_Define_Routine. - -Sat Jul 15 00:01:35 1995 Michael Meissner - - * config/tc-ppc.c (ppc_elf_suffix): Add @fixup so that the - compiler can mark which relocs not to complain about with - -mrelocatable. - (ppc_elf_validate_fix): Add .fixup to sections not to complain - about, and also don't complain for BFD_RELOC_CTOR relocations in - writable non-code segments. - (md_apply_fix): Treat BFD_RELOC_CTOR just like BFD_RELOC_32. - -Fri Jul 14 19:54:28 1995 Ian Lance Taylor - - Add support for SPARC SunOS PIC: - * config/tc-sparc.h (sparc_pic_code): Always declare, not just - when OBJ_ELF. - (TC_RELOC_RTSYM_LOC_FIXUP): Define when OBJ_AOUT. - (tc_fix_adjustable): New definition for OBJ_AOUT. - * config/tc-sparc.c (sparc_pic_code): Always define, not just when - OBJ_ELF. - (md_apply_fix): Adjust reloc addend for OBJ_AOUT and PIC. In - BFD_RELOC_32_PCREL_S2 case, don't increment val for an external - symbol when PIC. - (tc_gen_reloc): Generate different PIC relocs when OBJ_AOUT, as - well as when OBJ_ELF. - (md_shortopts): If OBJ_AOUT, include `k'. - (md_parse_option): If OBJ_AOUT, handle 'k'. - (md_show_usage): Mention -k if OBJ_AOUT, and -KPIC if OBJ_ELF. - (md_pcrel_from): Don't add in size for an external symbol when - PIC. - -Thu Jul 13 21:16:43 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.h (UNDEFINED_DIFFERENCE_OK): Define for SOM. - * write.c (adjust_reloc_syms): Set sy_used_in_reloc for both - symbols in a fixup where a defined symbol is subtracted from an - undefined symbol (when UNDEFINED_DIFFERENCE_OK is defined). - (fixup_segment): Do nothing for the difference of two symbols if - UNDEFINED_DIFFERENCE_OK is defined. - -Wed Jul 12 23:33:40 1995 Ian Lance Taylor - - * config/obj-coff.c (fixup_segment): Support MD_APPLY_FIX3. - -Wed Jul 12 01:12:12 1995 Ken Raeburn - - * write.c (fix_new): Use int, not short int, for argument type. - (fix_new_exp): Ditto. - - * configure.in (arm-*-riscix*): Don't set emulations. - - * config/tc-mips.c (NO_ECOFF_DEBUGGING): Define if ECOFF_DEBUGGING - wasn't previously defined. - (s_extern): Don't set ecoff_extern_size if NO_ECOFF_DEBUGGING. - (nopic_need_relax): Don't check it if NO_ECOFF_DEBUGGING. - (macro_build) [!USE_STDARG]: Don't use variadic prototype. - (mips_local_label) [NO_ECOFF_DEBUGGING]: Don't preserve potential - ECOFF debugging symbols. - - * emul.h (struct emulation): Use unsigned, not unsigned char, for - bitfields. - * obj.h (struct format_ops): Likewise. - - * config/tc-arm.c (symbol_make_empty) [BFD_ASSEMBLER]: Set - udata.p, not udata. - -Tue Jul 11 14:30:19 1995 Ian Lance Taylor - - * doc/c-mips.texi: Document -m4010 and -mno-4010. - -Tue Jul 11 14:28:55 1995 Jeff Spiegel - - * config/tc-mips.c (mips_4010): New static variable. - (interlocks): New static variable. - (md_begin): Check for a cpu of "r4010". Set mips_4010 correctly. - If mips_4650 or mips_4010, set interlocks. - (append_insn): Check interlocks, not mips_4650. - (mips_emit_delays): Likewise. - (mips_ip): Only permit INSN_4010 instructions if mips_4010. - (md_longopts): Add "m4010" and "no-m4010". - (md_parse_option): Accept -mcpu=r4010. Handle -m4010 and - -no-m4010. - (md_show_usage): Document -m4010 and -no-m4010. - -Tue Jul 11 13:22:50 1995 Ian Lance Taylor - - * ecoff.c (struct efdr): Add new field fake. - (init_file): Initialize fake. - (add_file): Add new parameter fake. Change all callers. - (ecoff_build_debug): Don't warn about a missing .end for a fake - file. - -Mon Jul 10 16:01:31 1995 Ken Raeburn - - * doc/as.texinfo: Split out most cpu chapters... - * doc/c-*.texi: ...to here. - - * read.c (po_hash): Now static. - -Mon Jul 10 13:47:22 1995 Ian Lance Taylor - - Based on patches from H.J. Lu : - * config/tc-i386.c (md_apply_fix3): Rename from md_apply_fix1. - Accept pointer to value and segment. Fix OBJ_ELF PCREL case to - handle global defined symbols correctly. - (md_apply_fix): Remove both versions. - * config/tc-i386.h (MD_APPLY_FIX3): Define. - - * configure.in: When switching on ${cpu}, use ${cpu}, not - $[target_cpu}, in default case. - * configure: Rebuild. - -Sat Jul 8 13:27:55 1995 Ian Lance Taylor - - * write.c (fixup_segment): Call resolve_symbol_value on - sub_symbolP, in case it isn't in the symbol table. - -Fri Jul 7 11:17:27 1995 Ian Lance Taylor - - * read.c (s_lcomm): For .lcomm 1, set align to 0, not 1. - - * config/obj-coff.c (coff_frob_symbol): If SF_GET_FUNCTION, set - BSF_FUNCTION. - (symbol_globalP, symbol_global_lastP): New global variables. - (yank_symbols): Sort defined global symbols to the end, just - before the undefined symbols. - (glue_symbols): Add two arguments, and use them instead of - referring directly to global variables. - (crawl_symbols): Call glue_symbols twice, once for defined globals - and once for undefined. Add corresponding know calls. - - * app.c (do_scrub_next_char): Always accept \v. Don't make it - conditional on BACKSLASH_V. - * read.c (next_char_of_string): Likewise. - * config/obj-bout.h (BACKSLASH_V): Don't define. - * config/tc-mips.h (BACKSLASH_V): Don't define. - - Add SPARC ELF PIC support. - * write.c (fixup_segment): Pass fixP to TC_RELOC_RTSYM_LOC_FIXUP, - not fixP->fx_r_type. - * config/tc-sparc.c (sparc_pic_code): New global variable. - (md_apply_fix): If generating PIC, adjust fx_addnumber for any non - PC relative reloc. - (tc_gen_reloc): If generating PIC, adjust various reloc types. - Remove fx_pcrel assert, since it is no longer true. - (md_parse_option): Handle -K PIC. - * config/tc-sparc.h (sparc_pic_code): Declare if OBJ_ELF. - (TC_RELOC_RTSYM_LOC_FIXUP): Define if OBJ_ELF. - (tc_fix_adjustable): Don't adjust PC relative relocs if PIC. - * config/tc-i386.h (TC_RELOC_RTSYM_LOC_FIXUP): Take a fixp, not a - reloc type. - - * Makefile.in (Makefile): Add dependency on conf.in, so that conf - is rebuilt when conf.in changes. - -Thu Jul 6 16:49:38 1995 Ken Raeburn - - * All files: Updated FSF address. - -Thu Jul 6 16:30:34 1995 Jim Wilson - - * ecoff.c (add_file): Don't collapse multiple .file commands into - a single file structure. - (ecoff_build_lineno): Set ilineBase to sum of previous file's - ilineBase and cline. - -Thu Jul 6 12:54:27 1995 Ian Lance Taylor - - Patches from Jerry Blakely : - * as.c (listing_filename): New static variable. - (show_usage): Mention -a=file. - (parse_args): Support = option of -a to set name of listing file. - (main): Pass listing_filename to listing_print. - * listing.c (list_file): New static variable. - (various): Replace printf with fprintf to list_file. - (listing_print): If name argument is not NULL, open it as - list_file. - * doc/as.texinfo, doc/as.1: Document -a=file. - - * config/tc-sparc.c (s_reserve): Don't permit redefinition, even - if the symbol was already in bss_section. Fix warning message. - - * listing.c (struct file_info_struct): Rename end_pending field to - at_end. - (file_info): Initialize at_end, not end_pending. - (buffer_line): If at_end set, just return immediately. Don't - worry about end_pending cases. Set at_end when EOF is read. - (print_source): Check at_end, not end_pending. - (listing_listing): Likewise. - - * config/tc-alpha.h (alpha_do_align): Don't declare. - (md_do_align): Don't define. - (tc_frob_label): Define. - (alpha_define_label): Declare. - (md_flush_pending_output): Define. - (alpha_flush_pending_output): Declare. - * config/tc-alpha.c (insn_label): New static variable. - (auto_align): New static variable. - (md_pseudo_table): Add cases for .text, .data, .align, .byte, - .hword, .int, .long, .octa, .quad, .short, .word, .double, .float, - and .single. Change .t_floating, .s_floating, .f_floating, - .g_floating, and .d_floating to use s_alpha_float_cons rather than - float_cons. - (s_alpha_text, s_alpha_data): New static functions. - (s_rdata, s_sdata): Clear insn_label and set auto_align. - (s_gprel32): If auto_align, align. Clear insn_label. - (emit_insn): Clear insn_label. - (s_alpha_align): New static function. - (alpha_align): Make static. Take label argument. - (alpha_flush_pending_output): New static function. - (s_alpha_cons, s_alpha_float_cons): New static functions. - (alpha_define_label): New function. - -Wed Jul 5 22:49:31 1995 Ken Raeburn - - * conf.in: Regenerate with autoreconf. - - Mon Jul 3 19:47:53 1995 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.h (vms_resolve_symbol_redef): Use full prototype. - (vms_check_for_special_label, tc_frob_label): Move them to group - with other prototypes. - [WANT_VMS_OBJ_DEFS]: Only define the many OBJ_x, DBG_x, and DST_x - macros when this is defined. - * config/obj-vms.c: Fully prototype all local functions. - [symbolS, fragS]: Use consistently instead of their struct tags. - [WANT_VMS_OBJ_DEFS]: Define this. - (s_const): Make definition correctly match actual usage. - (VMS_stab_parse): Make `expected_type' arg be int rather than char. - (get_VMS_time_on_unix): Define as `static void'. - (hash_string): Make definition match actual usage; argument is - `char const *' rather than `unsigned char *'. - (VMS_Case_Hack_Symbol, VMS_Modify_Psect_Attributes, VMS_Psect_Spec, - VMS_Global_Symbol_Spec): Declare string args as `const char *'. - [IS_GXX_VTABLE]: New macro. - (vms_write_object_file: GSD loop): Use it. - (vms_write_object_file: data segment): Reorganize `fill' loop. - -Wed Jul 5 12:01:49 1995 Ian Lance Taylor - - * config/tc-sparc.c (md_shortopts): Add "K:" if OBJ_ELF. - (md_parse_option): If OBJ_ELF, check for -K. Die if -K PIC, since - PIC code is not currently supported. - - * as.c (parse_args): Change std_shortopts to be an array rather - than a constant string. Only include 'K' if WORKING_DOT_WORD is - not defined. Only check for 'K' in that case as well. - * as.h (flag_warn_displacement): Only declare if WORKING_DOT_WORD - is not defined. - - * conf.in: Add undef of HAVE_SBRK. - - * config/obj-coff.c (obj_coff_line): Call listing_source_line, in - both BFD_ASSEMBLER and non BFD_ASSEMBLER versions of the function. - - * symbols.c (S_SET_EXTERNAL): Warn if symbol is weak. - (S_CLEAR_EXTERNAL): Likewise. - (S_SET_WEAK): Warn if symbol is global. - - * config/obj-aout.c (obj_aout_frob_symbol): Warn about an attempt - to put an undefined symbol into a set. - - * Makefile.in: Remove @configure_input@; it's not needed in - files named Makefile. - - * config/tc-m88k.c (md_pseudo_table): Add ".set" so that the - explicit pseudo-op works, while continuing to treat "set" as an - instruction. - - * ecoff.c (ecoff_debugging_seen): New global variable. - (ecoff_directive_def): Set ecoff_debugging_seen. - (ecoff_stab): Likewise. - * ecoff.h: Make idempotent. - (ecoff_debugging_seen): Declare. - * config/tc-mips.c: Include ecoff.h. - (mips_debug): New static variable. - (s_stringer, s_mips_space): Remove unneeded declarations. - (md_parse_option): In case 'g', set mips_debug to debugging level. - (mips_local_label): New function. - * tc-mips.h (LOCAL_LABEL): Call mips_local_label. - (mips_local_label): Declare. - -Wed Jul 5 00:59:22 1995 Fred Fish (fnf@cygnus.com) - - * as.c (main): Only use sbrk when HAVE_SBRK defined. - * configure.in: Add test for sbrk. - * configure: Regenerate using autoconf 2.4. - -Mon Jul 3 15:58:16 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.h (MAX_RELOC_EXPANSION): Bump to 6. - * config/tc-hppa.c (tc_gen_reloc, SOM version): Handle - relocations for the difference of two (possibly external) - symbols. - (hppa_fix_adjustable): For SOM, reject reductions involving - the difference of two symbols. - (hppa_force_relocation): Force relocations for expressions - involving the difference of two symbols. - -Mon Jul 3 14:22:59 1995 Steve Chamberlain - - * configure[.in] (i386-*-win32): New host and target. - -Thu Jun 29 17:25:43 1995 Steve Chamberlain - - Support for long filenames non-bfd coff. - * config/obj-coff.c (filename_list_head, filename_list_tail): New. - (yank_symbols): Notice and record filenames which are too long. - (w_strings): Write out filename strings. - (c_dot_file_symbols): Put long filenames onto list. - -Wed Jun 28 17:33:13 1995 Steve Chamberlain - - * config/obj-coff.c (fixup_segment): PE doesn't use - the strange common symbol format that other 386s formats - do. - * config/tc-i386.c (md_begin): If LEX_AT defined then - '@' is in the set of identifiers. - (i386_operand): If LEX_AT, then don't look for @goto stuff. - * config/te-pe.h: Define LEX_AT. - -Wed Jun 28 17:49:59 1995 Ken Raeburn - - * doc/as.texinfo (H8/500 Floating Point): Indicate that IEEE FP - numbers are for the standard emulation code. - (SH Floating Point): Ditto. - (Overview): Describe new --emulation option for MIPS. - * doc/*.m4: Deleted. - -Thu Jun 22 19:26:25 1995 Ken Raeburn - - Sun May 7 11:53:41 MDT 1995 Bryan Ford - - * configure.in: Added i386-*-moss* target. - -Thu Jun 22 14:41:23 1995 Michael Meissner - - * write.c (write_object_file): Cast decode_local_label_name - argument to char * to avoid warning. - -Wed Jun 21 18:07:59 1995 Ken Raeburn - - Changes from Andreas Schwab : - * config/tc-m68k.c (insword): Increment the frag offsets. - (struct m68k_it): Add reloc[].pcrel_fix field to hold pc-rel - fixup. - (add_fix): Accept additional parameter, the pc-rel fixup. All - callers changed. Fix offset address if width == 'b'. - (m68k_ip) [case AINDX]: Allow explicit size spec. Don't make the - outer displacement pc-relative. - (md_pcrel_from): Make it relative to the first extension word of - the operand. - (opcode_ptr): Make it a macro if DO_BREAK_UP_BIG_DECL is - undefined. - (md_convert_frag_1): Don't reference fragP->fr_opcode[2..]. - (md_estimate_size_before_relax) [case TAB (FBRANCH, SZ_UNDEF)]: - Turn on long bit. - (m68k_ip) [case 'C']: Don't set set long bit, set it in the opcode - table. - (md_estimate_size_before_relax) [case TAB (PCINDEX, SZ_UNDEF)]: - Variable part increases by four, not six. - * write.c (fixup_segment) [TC_M68K]: Don't do further pcrel - processing after converting difference of two symbols in the - same segment. - - * write.c (fixup_segment): Don't conditionalize the pcrel fix on - TC_M68K. - - * config/tc-sparc.c (sparc_ip, case 'A'): If ASI is not a "#" - value, don't shift it an extra time. - -Wed Jun 21 14:18:37 1995 Steve Chamberlain - - * gasp.c (do_print, do_form, buffer_and_nest): Use case insensitive - string compares. - -Tue Jun 20 14:55:02 1995 Ken Raeburn - - * config/obj-coff.c (write_object_file): Cast time() argument to - time_t *. - -Tue Jun 20 12:00:53 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_build_unwind_subspace): Fix typo in last - change. - -Mon Jun 19 15:27:17 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_build_unwind_subspace): Zero out memory - from frag_more calls. - -Thu Jun 15 16:53:37 1995 Stan Shebs - - * config/obj-coff.c: Don't use "bfd/" when including libbfd.h - and libcoff.h. - (fill_section): Call PROGRESS. - * Makefile.in (INCLUDES): Add bfd srcdir. - - * mpw-config.in: Add bfd_gas flag and set for each config. - (i386-unknown-go32, m68k-unknown-coff): Recognize. - * mpw-make.in (HACK_O_RAMA, OBJ_COFF_OMIT_TIMESTAMP): Add to - config.h. - -Thu Jun 15 10:04:26 1995 Doug Evans - - * config/tc-arm.h (LOCAL_LABEL): Prepend '.' if not OBJ_AOUT. - (FAKE_LABEL_NAME): Likewise. - -Mon Jun 12 22:25:39 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_ip): Check for invalid register in single - precision fmpyadd and fmpysub instructions. - -Thu Jun 8 19:33:02 1995 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.c (myname): Delete all references. - (VMS_stab_parse, Write_VMS_MHD_Records, VMS_Case_Hack_Symbol): - Replace printf calls with as_tsktsk. - (PUT_LONG, PUT_SHORT): Use COPY_LONG, COPY_SHORT. - (VMS_Store_Immediate_Data): Move second buffer capacity check - below bottom of loop; first check at top suffices for loop itself. - (find_file): Remove redundant pointer checks in first two loops; - replace third loop with pointer to last list element determined - in first loop. - -Tue Jun 6 13:53:06 1995 Ken Raeburn - - * config/tc-sparc.c (sparc_ip): Handle defined absolute symbols as - ASI values. - - * config/obj-vms.c (vms_write_object_file, case N_DATA): Use - strcmp against FAKE_LABEL_NAME instead of checking third - character. (Suggested by Pat Rankin.) - -Mon Jun 5 20:10:46 1995 Pat Rankin (rankin@eql.caltech.edu) - - Add support for N_ABS and N_ABS|N_EXT type symbols. - - * config/obj-vms.h (LSY_S_M_{DEF,REL}, ENV_S_M_{DEF,NESTED}): - New macros for local symbols (from and ). - * config/obj-vms.c (Current_Environment): New file-scope variable. - (VMS_Local_Environment_Setup): New routine. - (GBLSYM_LCL): New macro. - (VMS_Global_Symbol_Spec): Handle local symbols too. - (VMS_Psect_Spec): Set GLOBALVALUE_BIT for absolute symbols. - (VMS_Emit_Globalvalues): Handle local and global absolute symbols. - (VMS_Store_PIC_Symbol_Reference): Ditto. - (vms_write_object_file: GSD symbol loop): Ditto. - -Mon Jun 5 16:10:40 1995 Steve Chamberlain - - * config/tc-arm.h (LOCAL_LABELS_FB): Define. - -Mon Jun 5 02:17:58 1995 Ken Raeburn - - * configure.in (i386-*-gnu*): Always use GNU ELF config. - -Wed May 31 17:49:18 1995 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.c (obj_crawl_symbol_chain): Update *symbolPP - in `else' clause when removing a symbol. Also, revise comments - to match the code. - (vms_write_object_file (GSD symbol loop, case N_DATA)): Never - output symbol definitions for local numeric labels. - -Tue May 30 18:29:10 1995 Richard Earnshaw (rearnsha@armltd.co.uk) - - * configure.in (architecture variants, cases armeb and arm*): Remove - spaces round assignment to endian. - -Tue May 30 12:31:31 1995 Ken Raeburn - - * write.c (write_object_file): Check for undefined local dollar - and fb labels. - - * symbols.c (decode_local_label_name): Extract instance number - from the correct location. - -Sat May 27 21:28:49 1995 J.T. Conklin - - * config/te-dpx2.h: Include obj-format.h. - (COFF_MAGIC): Renamed from FILE_HEADER_MAGIC. - -Wed May 24 13:45:32 1995 Steve Chamberlain - - * configure, configure.in, config/obj-coff.c, config/obj-coff.h: - Add support for ARM pe - -Tue May 23 17:00:32 1995 Doug Evans - - * config/tc-sparc.c (tc_gen_reloc): Handle BFD_RELOC_SPARC_WDISP16 - and BFD_RELOC_SPARC_WDISP19. - -Tue May 23 19:18:33 1995 Ken Raeburn - - * as.c (parse_args) [! USE_EMULATIONS]: Always print an error - message. - - * doc/internals.texi: Document obj_app_file and - TARGET_BYTES_BIG_ENDIAN. - -Mon May 22 20:03:23 1995 Ken Raeburn - - * ecoff.c (ecoff_stab): Add extra leading argument, for 4 May - change. - * ecoff.h (ecoff_stab): Fix declaration. - * obj.h (format_ops.process_stab): Include prototype. - * config/obj-elf.h (OBJ_PROCESS_STAB): Pass through seg argument. - * config/obj-ecoff.h (OBJ_PROCESS_STAB): Ditto. - - * config/e-mipself.c (mipself): New emulation mode, doesn't change - endianness from configured default. - * config/e-mipsecoff.c (mipsecoff): Ditto. - * configure.in (mips ecoff/elf targets): Include them. - * as.c (mipself, mipsecoff): Declare. - - * as.c (emulation_name): New variable. - (select_emulation_mode): Set emulation_name. Don't change argv. - (parse_args): Handle --emulation; complain if the supplied name - isn't what select_emulation_name came up with. - -Sun May 21 21:36:17 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c: Reverse changes from Dec. 19th which - changed the way unwinds were built for ELF. Rely on relocation - symbol reductions to avoid placing the end of function marker - symbols into the object file's symbol table. - -Sat May 20 12:31:36 1995 Ken Raeburn - - Added improved VMS support from Pat Rankin: - - Fri 19 May 16:51:40 1995 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.h (AOUT_STABS): Define. - - * config/obj-vms.c (fpush, rpush): New routines. - (push): Replaced by the above. - (find_symbol): Slight reorganization to expose tail recursion. - - Fri Mar 17 18:40:36 1995 Pat Rankin (rankin@eql.caltech.edu) - - * Makefile.in (VMS_OTHER_OBJS): delete this. - * vmsconf.sh (make-gas.com): build ../libiberty/liberty.olb - first if necessary; link gas against it. - -Fri May 19 16:37:39 1995 Richard Earnshaw (rearnsha@armltd.co.uk) - - * gasp.c (istrue): Correctly test for string inequality. - -Thu May 18 04:25:11 1995 Ken Raeburn - - Wed May 10 14:28:16 1995 Richard Earnshaw (rearnsha@armltd.co.uk) - - * config/tc-arm.c (CP_T_{Pre,UD,WB}): Define, bits in co-processor - instructions. - ([ls]fm_flags): Correct error in bitmasks. - (cp_address_required_here): Delete second parameter, FLAGS. All - callers changed. Remove all dead code referring to FLAGS. If - address is just "[Reg]" then convert into a PRE-INCREMENT UP format. - (do_fp_ldmstm): Handle full-descending and empty-ascending stack - formats explicitly. - - * config/tc-arm.c (internalError): Define. - (ARM_{1,2,250,3,6,7,7DM,ANY,2UP,ALL,3UP,6UP,LONGMUL}): Define processor - variants. - (FPU_{CORE,FPA10,FPA11,NONE,ALL,MEMMULTI}): Define floating point - variants. - ({CPU,FPU}_DEFAULT): Define. - (cpu_variant): New variable. - (asm_flg): Change more_flags to flag_bits. - Add prototypes for new functions. - (FLAG_{S,P,B,T,ED,FD,FA,EA,IB,IA,DB,DA,L}): Delete. - (s_flag[], ldst_flags[], byte_flag[], cmp_flags[], ldm_flags[], - stm_flags[], lfm_flags[], sfm_flags[], round_flags[], except_flags[], - cplong_flag[]): New variables. - (asm_opcode, insns[]): New format, add version support. - (arm_flg_hsh): Delete. - (do_mul, do_mla): Remove "Warning" from warning messages. - (do_arit): Simplify. - (do_swap): Make error message more appropriate. - (md_begin): Build hash tables starting at first entry in tables. - (md_number_to_chars): Cope with big/little-endian selection. - (md_chars_to_number): New function. - (md_apply_fix): Rewrite to make endian independent. - (tc_gen_reloc): Better error messages. - (md_assemble): Reject opcodes forbidden by the currently selected cpu - variant. Rewrite handling code for instruction flags. - (md_shortopts): Add option "m:". - (md_parse_option): Get the desired cpu/fpu variant. - - From: David Taylor (dtaylor@armltd.co.uk) - * configure.in (architecture variants): Check for "armeb" and "arm*", - set endianness accordingly. - * read.c (read_a_source_file): New hooks md_start_line_hook and - md_after_pass_hook. - * config/arm-{big,lit}.mt: New files - * config/tc-arm.h ({LITTLE,BIG}_ENDIAN, BYTE_ORDER): Define. - (TARGET_FORMAT): Select depending on endianness and emulation and - object format. - (md_after_pass_hook, md_start_line_hook): Define. - * config/tc-arm.c: Include subsegs.h, symbols.h and listing.h. - (shift[]): Add uppper case equivalents. - (CP_T_[XY], TRANS_BIT): Define. - (conds[]): Delete initial NULL entry, add "lo" entry as synonym for - "cc". - (LONGEST_FLAG, flags[]): Delete. - (arm_psr): New structure. - (psrs[]): New variable. - (PSR_ALL): Define. - (LONGEST_INST): Bump to 5. - (LITERAL_MASK, COND_MASK, OPCODE_MASK, DATA_OP_SHIFT): Define. - (OPCODE_{AND,EOR,SUB,RSB,ADD,ADC,SBC,RSC,TST,TEQ,CMP,CMN,ORR,MOV,BIC, - MVN}): Define. - (insns[]): Add smull, umull, smlal, umlal, ldfm, stfm, msr and mrs - instructions. Add nop and adr pseudo ops. - (reg_table): Add APCS register name variants. - (arm_psr_hsh): New hash table. - (md_pseudo_table): Add "ltorg", "pool", "extend", "ldouble" and - "packed". - (MAX_LITERAL_POOL_SIZE): Define. - (struct literalS): New structure. - (literals, next_literal_pool_place, lit_pool_num, current_poolP): New - variables. - (add_to_lit_pool, symbol_locate, symbol_make_empty): New functions. - (validate_immediate): Return FAIL on failure. - (s_ltorg): New function. - (psr_required_here, psrf_required_here): New functions. - (cp_address_required_here): New parameter, flag, all callers changed. - If flag is non-zero, restrict the legal addressing modes. - (do_nop, do_mrs, do_msr, do_mull): New functions. - (negate_data_op): New function. - (data_op2): accept #x,y meaning x rotated right by y, but only when - suitable constants. If immediate is not legal, try changing the - opcode. - (do_adr): New function. - (do_ldst): accept "ldr reg, =expr". Put expr in the pool if it can't - be done as an immediate. - (do_fp_ldst): Use CP_T_[XY], not immediate values. - (do_fp_ldmstm): New function. - (arm_psr_parse): New function. - (output_inst): Use INSN_SIZE in call to md_number_to_chars. - (md_assemble): Add hack so that "Label instruction" causes alignment of - the label. - (arm_after_pass_hook, arm_start_line_hook, arm_frob_symbol): New - functions. - -Wed May 17 05:25:16 1995 Michael Meissner - - * config/tc-ppc.c (md_show_usage): Add \'s at end of lines in - strings for non-GCC compilers. - -Tue May 16 19:36:00 1995 Ken Raeburn - - * config/obj-ecoff.c (ecoff_pop_insert): New function. - (ecoff_format_ops): Use it. - (obj_ecoff_frob_symbol): Now static. - -Wed May 17 00:59:12 1995 Andrew Cagney - aka Noid - - * config/tc-ppc.c (md_begin): Was assuming that an instruction was - bigendian and hence 16bit relocs withing instructions would - ALWAYS be at addresses i+2-i+3. In LE mode it is i+0-i+1. - -Tue May 16 16:29:58 1995 Ken Raeburn - - * config/obj-multi.h (obj_frob_symbol, obj_frob_file, S_GET_SIZE, - S_SET_SIZE, S_GET_ALIGN, S_SET_ALIGN, obj_copy_symbol_attributes, - OBJ_PROCESS_STAB): New macros. - * config/tc-mips.c: Protect against redefining them also when - including obj-elf.h. Test only OBJ_ELF for including elf/mips.h. - (mips_init_after_args): New function. Set byte_order here. - (md_parse_option): Not here. - (byte_order): Don't bother initializing. - * config/tc-mips.h (mips_init_after_args): Declare. - (tc_init_after_args): New macro. - - * read.c (s_lcomm): Do ELF/ECOFF test at run time, not compile - time. - -Fri May 12 14:17:47 1995 Steve Chamberlain - - Initial support for PE object files. - * configure.in, configure (i386-*-pe, i386-*-*nt): Add. - * config/obj-coff.c (fixup_segment): Cope with PE wierdness. - * config/obj-coff.h (TE_PE): New target format. - -Thu May 11 14:58:21 1995 Ken Raeburn - - * config/obj-elf.c (NEED_ECOFF_DEBUG): Define if ECOFF_DEBUGGING - was defined by header files. Test in preprocessor conditionals - instead of ECOFF_DEBUGGING. - (ecoff_debug_pseudo_table): Make empty if NEED_ECOFF_DEBUG is not - defined. - (obj_read_begin_hook, obj_symbol_new_hook, elf_frob_symbol, - elf_frob_file): Only call ecoff routines if NEED_ECOFF_DEBUG is - defined. - (elf_ecoff_set_ext, elf_get_extr, elf_set_index): Define only if - NEED_ECOFF_DEBUG is defined. - (elf_format_ops): Reference elf_ecoff_set_ext only if - NEED_ECOFF_DEBUG. - -Wed May 10 18:09:12 1995 Ken Raeburn - - * Makefile.in (OBJS): Include @extra_objects@. - (obj-elf.o, obj-ecoff.o, e-mipself.o, e-mipsecoff.o): New rules - for building these independently. - * emul-target.h, config/e-mipself.c, config/e-mipsecoff.c: New - files. - - * acconfig.h (DEFAULT_EMULATION, EMULATIONS, USE_EMULATIONS, - OBJ_MAYBE_*, I386COFF, M68KCOFF, M88KCOFF): New macros. - * aclocal.m4 (GAS_UNIQ): New macro. - - * as.c (emulations, n_emulations) [USE_EMULATIONS]: New variable. - (select_emulation_mode, default_emul_bfd_name, common_emul_init) - [USE_EMULATIONS]: New functions. - (main) [USE_EMULATIONS]: Call select_emulation_mode before other - initialization. - * emul.h: New file. - * as.h [USE_EMULATIONS]: Include it. - - * configure.in: Handle enable-targets option. Iterate over target - list, building up a list of object file formats and emulation - configurations. (Only supports emulations for MIPS CPU so far.) - If multiple formats are needed, set obj_format to multi and add - format config files to extra_files. If emulation modes are - needed, add the relevant files to extra_files. - - * configure.in: Define I386COFF, M68KCOFF, M88KCOFF for those - configurations. - - * ecoff.c (ecoff_generate_asm_lineno): Filename argument now - points to const. - * ecoff.h (ecoff_generate_asm_lineno): Updated declaration. - - * obj.h (obj_read_begin_hook): Don't declare function if it's - already a macro. - - * read.c (s_space, cons, stringer): If md_flush_pending_output is - defined, call it on entry. - * config/obj-elf.c (obj_elf_section): If md_flush_pending_output - is defined, call it on entry. If md_elf_section_change_hook is - defined, call it before returning normally. - - * read.h (target_big_endian): Declare. - - * obj.h (struct format_ops): Added new function pointer fields - ecoff_set_ext, read_begin_hook, symbol_new_hook. - (ecoff_format_ops, elf_format_ops): Declare. - * config/obj-elf.c (elf_s_get_size, elf_s_set_size, - elf_s_get_align, elf_s_set_align, elf_copy_symbol_attributes, - elf_sec_sym_ok_for_reloc): New functions. - (elf_format_ops): New variable. - (elf_frob_symbol): Now takes additional int* argument. - * config/obj-elf.h (elf_frob_symbol): Update declaration. - (elf_pop_insert): Declare. - (obj_pop_insert): Define to call elf_pop_insert. - * config/obj-ecoff.c (ecoff_sec_sym_ok_for_reloc, - obj_ecoff_frob_symbol): New functions. - (ecoff_format_ops): New variable. - - * config/te-generic.h: If OBJ_HEADER is defined, use it as the - filename to include in place of obj-format.h. - * config/te-multi.h: New file, copied from te-generic.h. - * config/obj-elf.c (OBJ_HEADER): Define it to "obj-elf.h". - * config/obj-ecoff.c (OBJ_HEADER): Define it to "obj-ecoff.h". - - * config/obj-elf.c (ECOFF_DEBUGGING): Default to 0. - (obj_read_begin_hook, obj_symbol_new_hook, elf_frob_symbol, - elf_frob_file): Test it at run time. - (obj_ecoff_set_ext, elf_get_extr, elf_set_index): Define - unconditionally. - (elf_pseudo_table): Renamed from obj_pseudo_table, now static. - (ecoff_debug_pseudo_table): Split off into separate table. Define - it unconditionally. - (elf_pop_insert): New function. - * config/obj-elf.h (elf_pop_insert): Declare. - (obj_pop_insert): New macro. - (obj_ecoff_set_ext) [!OBJ_MAYBE_ELF]: Define to elf_ecoff_set_ext. - * config/obj-ecoff.h (obj_ecoff_set_ext): Define to ecoff_set_ext. - - * config/tc-mips.h: Protect against multiple inclusions. - (mips_pop_insert): Declare. - (md_pop_insert): Call it. - - * config/tc-mips.c: If OBJ_MAYBE_ELF is defined, include - obj-elf.h, but preserve OUTPUT_FLAVOR and protect some other - macros from redefinition. - (ECOFF_DEBUGGING): Default to 0. All references changed to - run-time tests or made unconditional. - (s_stringer, s_mips_space, s_elf_section): Deleted. - (md_pseudo_table): Don't refer to them. Split table into three - sections, for MIPS, non-ECOFF_DEBUGGING, and ELF. - (mips_pop_insert): New function. - (mips_flush_pending_output): New function. - (mips_enable_auto_align): New function. - * config/tc-mips.h (mips_pop_insert): Declare. - (md_pop_insert): New macro. - (mips_flush_pending_output): Declare. - (md_flush_pending_output): New macro. - (mips_enable_auto_align): Declare. - (md_elf_section_change_hook): New macro, calls - mips_enable_auto_align. - -Tue May 9 17:07:41 1995 Michael Meissner - - * configure.in: Add little endian PowerPC support. - * configure: Rebuild with autoconf. - * config/ppc-big.mt: New file for big endian PowerPC systems. - * config/ppc-lit.mt: New file for little endian PowerPC systems. - - * config/tc-ppc.h (target_big_endian): Declare. - (TARGET_FORMAT): Deal with little and big endian ELF variants. - (TARGET_BYTES_BIG_ENDIAN): Define as 1, not empty. - - * config/tc-ppc.c (ppc_big_endian): Delete variable, use - target_big_endian instead. - (md_parse_option): Parse -mlittle and -mlittle-endian to use - little endian support. Parse -mbig and -mbig-endian to use big - endian support. - (md_show_usage): Update to reflect current switches. - (ppc_set_cpu): Recognize powerpcle as little endian PowerPC. Use - as_fatal, not abort if unknown machine. - -Tue May 9 10:58:41 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_apply_fix): Cast *valp to an integer when - comparing against signed values. - (hppa_force_relocation): Make "distance" an integer. - -Tue May 9 00:47:03 1995 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * obj.h (struct format_ops) [BFD_ASSEMBLER]: New type. - (this_format) [BFD_ASSEMBLER]: Declare new variable, if not - already defined as a macro. - -Mon May 8 21:44:13 1995 Ken Raeburn - - * subsegs.h (seg_info): Provide dummy version for - non-BFD_ASSEMBLER, non-MANY_SEGMENTS configuration. It should - never get invoked, but this is easier than conditionalizing some - of the uses. - (struct seg_info_trash): Dummy type used by above to make code - compile. - -Fri May 5 14:47:13 1995 Ken Raeburn - - * config/obj-coff.h (SEPARATE_STAB_SECTIONS): Define to 1, not - empty. - * config/obj-elf.h (SEPARATE_STAB_SECTIONS): Ditto. - * config/obj-som.h (SEPARATE_STAB_SECTIONS): Ditto. - -Thu May 4 19:26:55 1995 Ken Raeburn - - * stabs.c (get_stab_string_offset): Always define. If - SEPARATE_STAB_SECTIONS isn't set, abort. - (SEPARATE_STAB_SECTIONS): Default to zero. - (aout_process_stab): New function, split out from s_stab_generic. - (OBJ_PROCESS_STAB) [AOUT_STABS]: Define to call aout_process_stab, - if not already defined. - (s_stab_generic): Test SEPARATE_STAB_SECTIONS at run time. If - it's not set, and OBJ_PROCESS_STAB isn't defined, abort. Always - pass six arguments to OBJ_PROCESS_STAB. - * read.h (get_stab_string_offset): Declare unconditionally. - * config/obj-aout.h (AOUT_STABS): Define. - * config/obj-bout.h (AOUT_STABS): Define. - * config/obj-ecoff.h (OBJ_PROCESS_STAB): Add new first argument, - ignored. - * config/obj-elf.h (OBJ_PROCESS_STAB) [ECOFF_DEBUGGING]: Ditto. - - * config/obj-ecoff.h (ECOFF_DEBUGGING): Define to 1, not empty. - * config/obj-elf.h (ECOFF_DEBUGGING): Ditto. Test value, not - whether it's defined. - -Wed May 3 21:38:20 1995 Ken Raeburn - - * as.h (LOCAL_LABELS_DOLLAR, LOCAL_LABELS_FB): If not already - defined, define them to zero. - * config/tc-*.h, config/te-*.h: If defining them, define them to - be 1 instead of empty. - * expr.c (integer_constant, operand): Test them at run time - instead of compile time. - * read.c (read_a_source_file): Ditto. - * symbols.c (colon): Ditto. - (dollar_*, define_dollar_label, fb_*): Define unconditionally. - * symbols.h (dollar_*, define_dollar_label, fb_*): Declare - unconditionally. - -Wed May 3 13:08:53 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_apply_fix): Do nothing for an out of range - PC relative call since those only occur in cases where the linker - can fix them up. - (hppa_force_relocation): Force relocations for out of range PC - relative calls. - -Tue May 2 16:34:47 1995 Jeff Law (law@snake.cs.utah.edu) - - * configure (hppa*-*-lites*): Handle just like hppa*-*-*elf*. - * configure.in: Likewise. - -Tue May 2 11:22:00 1995 Ken Raeburn - - * read.c (pop_insert): New function. - (pop_override_ok, pop_table_name): New variables. - (md_pop_insert, obj_pop_insert): New macros. - (pobegin): Use them. - - * config/tc-mips.c: Use USE_STDARG and USE_VARARGS instead of - NO_STDARG &c. - - * read.c (target_big_endian): If TARGET_BYTES_BIG_ENDIAN is - defined, initialize to 1. - * config/tc-mips.c (mips_target_format): Changed to a function, - checking flavor and byte order at run time. - (md_parse_option, cases OPTION_EB and OPTION_EL): Set - target_big_endian here. - (md_begin): Not here. - * config/tc-mips.h (mips_target_format): Adjust declaration. - (TARGET_FORMAT): Call mips_target_format. - - * config/tc-mips.h (USE_GLOBAL_POINTER_OPT): Define in terms of - OUTPUT_FLAVOR. - * config/tc-mips.c (g_switch_value, g_switch_seen): Define - unconditionally. - (md_begin, mips_ip, md_parse_option, s_change_sec, s_option, - s_abicalls, nopic_need_relax): Check USE_GLOBAL_POINTER_OPT at run - time, instead of compiling conditionally on GPOPT. - (GPOPT): Don't define. - (md_shortopts): Always include -G. - (RDATA_SECTION_NAME): Select at run time. - (md_begin): Test for ELF format at run time instead of compile time. - (mips_ip, s_change_sec): Ditto. - (md_parse_option, cases OPTION_CALL_SHARED and OPTION_NON_SHARED): - Ditto. - (OPTION_CALL_SHARED, OPTION_NON_SHARED, mips_regmask_frag): Define - unconditionally. - -Tue May 2 00:17:04 1995 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * Makefile.in (TARG_CPU_DEP_*): New variables. - (targ-cpu.o): Depend on one, selected by autoconf substitution, - instead of TARG_CPU_DEPENDENTS. - * configure.in: Substitute $cpu_type, $obj_format, $atof, and - $emulation into Makefile.in. - * config/h8300.mt: Deleted. - * config/h8500.mt: Deleted. - * config/i386coff.mt (TARG_CPU_DEPENDENTS): Deleted. - * config/m68k.mt: Deleted. - * config/m68kcoff.mt (TARG_CPU_DEPENDENTS): Deleted. - * config/m88kcoff.mt (TARG_CPU_DEPENDENTS): Deleted. - * config/mips-big.mt (TARG_CPU_DEPENDENTS): Deleted. - * config/mips-lit.mt (TARG_CPU_DEPENDENTS): Deleted. - * config/sh.mt: Deleted. - * config/w65.mt: Deleted. - * config/z8k.mt: Deleted. - - * config/te-dpx2.h (dpx2): Deleted unused macro. - * config/te-generic.h (TE_GENERIC): Ditto. - * config/te-go32.h (TE_GO32): Ditto. - * config/te-hp300.h (TE_HP300): Ditto. - * config/te-hppa.h (PA, _TE_PA_H): Ditto. - * config/te-ic960.h (TE_IC960): Ditto. - * config/te-nbsd532.h (TE_NETBSD532): Ditto. - * config/te-pc532mach.h (TE_PC532MACH): Ditto. - * config/te-ppcnw.h (TE_PPCNW): Ditto. - * config/te-sco386.h (scounix): Ditto. - -Mon May 1 15:59:56 1995 Ken Raeburn - - * read.c (s_app_file): If obj_app_file is defined, call it with - string as argument. Don't call c_dot_file_symbol or - elf_file_symbol. - * config/obj-coff.h (obj_app_file): Define as c_dot_file_symbol. - * config/obj-elf.h (obj_app_file): Define as elf_file_symbol. - - * as.h (OUTPUT_FLAVOR): Don't define here. - * config/obj-aout.h (OUTPUT_FLAVOR) [BFD_ASSEMBLER]: Define. - * config/obj-bout.h (OUTPUT_FLAVOR): Define. - * config/obj-coff.h (OUTPUT_FLAVOR) [BFD_ASSEMBLER]: Define. - * config/obj-ecoff.h (OUTPUT_FLAVOR): Define. - * config/obj-elf.h (OUTPUT_FLAVOR): Define. - -Thu Apr 27 20:07:33 1995 Doug Evans - - * Makefile.in (RUNTEST): Use one in srcdir if present. - (RUNTESTFLAGS): Define. - -Wed Apr 26 15:54:10 1995 Ken Raeburn - - Support for more portable alignment handling in assembly code, - based on patches from Bryan Ford : - * read.c (potable): Added balign and p2align, for aligning by - bytes or powers of two independent of what ".align" does for a - given target. - * doc/as.texinfo: Document them. - -Tue Apr 25 11:12:04 1995 Rob Savoye - - * configure, configure.in: Look for m68k-*-vxworks* rather than - just m68k-wrs-vxworks so gas can be configured for - m68k-vxworks5.1. - -Fri Apr 21 15:19:06 1995 Ken Raeburn - - * config/tc-sh.c (md_apply_fix): If fx_r_type is zero, handle - fx_size of 1, and abort on unrecognized sizes. - - * config/tc-m68k.c (m68k_ip): Fix bug in last change regarding - non-isvar case. - -Sun Apr 16 01:52:52 1995 Ken Raeburn - - * config/tc-m68k.h (md_relax_table, TC_GENERIC_RELAX_TABLE): - Missed this one in 11 Apr changes. - - * config/tc-i386.h (TC_GENERIC_RELAX_TABLE): Fix typo. - -Thu Apr 13 18:18:08 1995 Ken Raeburn - - * config/tc-sh.c (md_convert_frag): Instead of aborting on large - displacements, print an error message. Don't invoke the code that - followed the abort call until it's been verified. - - * config/tc-m68k.c (md_show_usage): Add 68060 to list. Split cpu - list into three lines. - -Thu Apr 13 14:34:36 1995 Torbjorn Granlund - - * tc-m68k.c (m68k_init_after_args): Test for m68360. - (md_parse_option): Likewise. - (md_show_usage): Mention m68360. - * tc-m68k.h (TARGET_WORD_SIZE): Define. - (TARGET_ARCH): Define. - - * expr.c (integer_constant): If TARGET_WORD_SIZE is defined, - sign-extend appropriately. - -Thu Apr 13 11:20:17 1995 Michael Meissner - - * config/tc-ppc.c (ppc_elf_validate_fix): Properly use PARAMS to - hide prototype from non-ANSI compilers, and don't use ANSI syntax - for arguments. - -Wed Apr 12 12:20:19 1995 Stan Shebs - - * mpw-config.in (TDEFINES): Put empty definition into - makefile fragment. - * mpw-make.in (xmalloc.c.o): Remove. - (as.new): Depend on Version.r. - (Version.r): Generate from version info. - - * mpw-make.in: Delete references to hex-value.c. - - * mpw-config.in: Add mapping from configs to object file formats, - get VERSION from Makefile.in and add to mk.tmp. - (mips-idt-ecoff) [TDEFINES]: Add TARGET_BYTES_BIG_ENDIAN. - * mpw-make.in (VERSION, gC): Don't define. - (ALL_CFLAGS): Remove -d flags. - (config.h): Remove definition of MPW, add HAVE_STDARG_H, - BFD_ASSEMBLER. - - * mpw-make.in (ALL_CFLAGS): Add definition of HAVE_STDARG_H, - include of ::libiberty:. - (config.h): Ifdef contents on GAS_VERSION. - - * mpw-make.in (as.c): Compile with C not gC. - (config-stamp): Touch correctly. - (install-only): New target. - (install): Depend on all and install-only. - - * mpw-config.in: Parse target and use to generate forward includes - to tc-, obj-, and atof- files, use te-generic.h for emulation. - * mpw-make.in (VERSION): Define. - (as.c): Compile with GCC. - (TARG_OBJECTS, CLIBS): Define. - (as.new): Use LDFLAGS, TARG_OBJECTS, CLIBS and EXTRALIBS in link - command. - (config.h, config-stamp): Build. - - * mpw-make.in (C, CFLAGS): Removed definitions. - (ALL_CFLAGS): Define. - Set default rule to use {CC} instead of {C}. - - * mpw-make.in (install): Moved here from mpw-build.in. - * mpw-build.in: Removed, functionality in mpw-make.in - - * mpw-make.in (CFLAGS): Add more include paths. - - * mpw-config.in (varargs.h, sys/*.h): Don't create when - configuring. - * mpw-make.in (CFLAGS): Add -w flag. - - * mpw-make.in: Replace 8-bit chars with their names. - - * mpw-config.in: New file, MPW version of configure.in. - * mpw-make.in: New file, MPW version of Makefile.in. - -Tue Apr 11 01:42:36 1995 Ken Raeburn - - * configure.in: Require at least autoconf 2.3, because earlier - versions lose on some AIX versions. - * configure: Regenerated. - - * configure.in: Add m68k-*-elf. - * config/tc-m68k.c (comment_chars) [OBJ_ELF]: Include '#'. - (md_pseudo_table) [OBJ_ELF]: Ignore "swbeg". - (md_begin): Set alt_notend_table['&'], so svr4-style immediate - operands are accepted. - (md_apply_fix): Argument VALP should point to valueT. - (md_convert_frag): Argument SEC should be type segT. - (md_shortopts) [OBJ_ELF]: Accept 'Q' with an argument. - (md_parse_option): Ignore it. - (md_convert_frag_1): Add in frag address for the symbol in the - displacement calculation. - * config/tc-m68k.h (TARGET_FORMAT) [OBJ_ELF]: Use "elf32-m68k". - (TARGET_ARCH): Define. - (REGISTER_PREFIX_OPTIONAL) [OBJ_ELF]: Default to 0. - (LOCAL_LABEL, FAKE_LABEL_NAME, REGISTER_PREFIX_OPTIONAL): Handle - these the same way for OBJ_ELF as for M68KCOFF. - - * gdbinit.in: Add breakpoint in as_abort. - - * write.c (cvt_frag_to_fill): If offset is less than zero, - complain about it specifically, instead of reporting an assertion - failure. - (relax_segment): Complain about .org backwards, then ignore it. - Do generic rs_machine_dependent relaxation only if - TC_GENERIC_RELAX_TABLE is defined, and use its value for the base - of the table. - * tc.h (md_relax_table): Delete declaration. - * as.h (struct relax_type): Add forward declaration for type. - * config/tc-a29k.c: Deleted md_relax_table. - * config/tc-{alpha,arm,h8300,hppa,i860,m88k,mips,ppc,sparc,z8k}.c: - Ditto. - * config/tc-{h8500,i386,i960,ns32k,sh,tahoe,vax,w65}.h: Declare - md_relax_table here, and define TC_GENERIC_RELAX_TABLE to expand - to md_relax_table. - * config/tc-h8500.c (md_relax_table): No longer const. - * config/tc-w65.c (md_relax_table): Ditto. - * config/tc-sparc.c (md_short_jump_size, md_long_jump_size): - Deleted. - * doc/internals.texi: Describe TC_GENERIC_RELAX_TABLE and - WORKING_DOT_WORD. Mention md_*_jump_size (but description needs - to be fleshed out later). Note m68k PCINDEX mode has been checked - in. - -Mon Apr 10 15:57:42 1995 Ken Raeburn - - * config/tc-mips.c (nopic_need_relax): New static function, split - out from md_estimate_size_before_relax. - (md_estimate_size_before_relax): Call it. - (load_address, macro): In NO_PIC branches, if nopic_need_relax - returns nonzero, don't attempt GP optimization. - - * config/tc-m68k.c (PCINDEX): New macro. - (md_relax_table): No longer const. Add PCINDEX entries. - (m68k_ip): For AINDX with simple symbol operand, generate a - PCINDEX frag if PC is used, or do normal non-AINDX processing for - address register. - (m68k_init_after_args): If cpu is 68000 or 68010, fix - md_relax_table to prevent relaxation of PCINDEX/BYTE mode to - SHORT, since they don't support that mode. - (md_convert_frag_1, case PCLEA/LONG): Add 4 to offset, not 2. Add - support for new PCINDEX modes. - (md_estimate_size_before_relax): Process PCINDEX/SZ_UNDEF mode. - - * config/tc-m68k.c (md_convert_frag_1, case PCLEA/SHORT): Add 2 to - offset. - (m68k_ip, case most punctuation/AOFF): If using PC, call add_frag - using PCLEA. - - * config/tc-m68k.c: Don't explicitly include config.h. Deleted a - bunch of "#if 0" code and useless comments. - (struct m68k_cpu): New type. - (archs, n_archs): New variables, with single list of name/enum - mapping and aliases. - (m68k_ip): Delete the table here. - (m68k_init_after_args): Use the new table here instead of - open-coding it. - (md_parse_option, case 'm'): Ditto. - - * doc/Makefile.in (Makefile): Fix rule for running config.status. - (internals.dvi, internals.ps, internals.ps4): New targets, not - built by default. - - * doc/internals.texi: Add loud disclaimer. Refill to 79 columns, - specify fill-column in local-variables section. Change - subheadings to subsections so they can be cross-referenced. - Describe broken words, frags, frag chains, generic relaxation, - relax table, m68k relaxation, m68k addressing modes, test suite - code. Add a few words about various file formats. - - * doc/as.texinfo (m68k): Recommend using `%' with registers as the - normal case, instead of the exceptional case. - -Thu Mar 30 14:38:47 1995 H.J. Lu (hjl@nynexst.com) - - * configure.in: Change linux to default to elf. Using - i[345]86-*-linuxaout will defaults to a.out. - * configure: Rebuild. - -Wed Mar 29 17:16:30 1995 Torbjorn Granlund - - * config/tc-m68k.c (md_apply_fix_2): Cast negative offsets to offsetT - (for hosting on 64 bit machines). - -Tue Mar 21 16:53:27 1995 Ian Lance Taylor - - * config/tc-mips.c (md_show_usage): Mention -mips4 and -m4650. - -Fri Mar 17 16:47:13 1995 Stan Shebs - - * write.c (write_object_file): Add PROGRESS macros. - -Fri Mar 17 12:40:34 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_comm): Make sure to always reset the frag - and section for common symbols. - -Thu Mar 16 17:26:18 1995 Michael Meissner - - * config/tc-ppc.c (ppc_elf_validate_fix): Allow non PC relative - pointers in the .ctors and .dtors section also when using the - -mrelocatable option. - (md_parse_option): Support -m403 as a PowerPC computer. - (md_show_usage): Ditto. - -Wed Mar 15 14:45:42 1995 Ian Lance Taylor - - * ecoff.c (ecoff_build_debug): The cur_scope field of a fil_ptr - may be NULL when given strange input. Don't core dump. - -Tue Mar 14 21:36:34 1995 Ian Lance Taylor - - * config/tc-mips.c (load_register): Don't use addiu for dli of an - unsigned seemingly negative number. Don't bother shifting a zero - value. - (mips_ip): For case 'j', if there are more alternatives, and the - ISA level is at least 3, don't accept an unsigned seemingly - negative number. - -Tue Mar 14 19:16:43 1995 Ken Raeburn - - * read.c (s_app_line): Fix last patch to deal with a line number - of 1. - -Tue Mar 14 17:00:57 1995 Michael Meissner - - * config/tc-ppc.c (ppc_elf_validate_fix): Use as_warn_where, not - as_bad_where to give a warning instead of an error. - -Mon Mar 13 17:03:46 1995 Pat Rankin (rankin@eql.caltech.edu) - - * config/tc-vax.c (md_assemble): issue a warning if a constant - is used as an operand where an immediate value is not allowed. - -Fri Mar 10 19:21:19 1995 Ken Raeburn - - * config/obj-coff.c: Redo my 10 Jan change, but get it right this - time. :-) - (fixup_segment): If linkrelax is set, just return. - (write_object_file): Don't treat h8300 and z8k specially with - regard to fixups. - * config/tc-h8300.c (md_begin): Set linkrelax. - * config/tc-z8k.c (md_begin): Ditto. - -Thu Mar 9 18:01:37 1995 Ian Lance Taylor - - * config/obj-coff.c (coff_header_append): Check return value of - bfd_coff_swap_scnhdr_out. - -Thu Mar 9 13:51:30 1995 Doug Evans - - Delete this patch, it breaks the h8300 assembler. - Tue Jan 10 13:34:14 1995 Ken Raeburn - * config/obj-coff.c (write_object_file): Don't treat h8300 and z8k - specially with regard to fixups. - -Thu Mar 9 12:28:18 1995 Michael Meissner - - * config/tc-ppc.c (mrelocatable): Change type to boolean. - (md_begin): Set the EF_PPC_RELOCATABLE if -mrelocatable. - -Wed Mar 8 15:39:39 1995 Ian Lance Taylor - - * config/tc-mips.c (md_begin): Check for a cpu string of r8000 or - r10000. If mips_isa is 4, set the machine number to 8000. - (append_insn): If mips_isa is at least 4, don't generate nops for - coprocessor delays. Check INSN_READ_FPR_R when setting - mips_cprmask[1]. - (mips_emit_delays): If mips_isa is at least 4, don't generate nops - for coprocessor delays. - (mips_ip): Check for INSN_ISA4 instructions. Handle new argument - types 'h', 'R', 'N', and 'M'. - (md_longopts): Accept "mips4". - (md_parse_option): Handle -mips4, and -mcpu=10000 and -mcpu=8000. - (s_mipsset): Permit .set mips4. - -Wed Mar 8 09:36:05 1995 Michael Meissner - - * config/tc-ppc.c (ppc_elf_validate_fix): Allow .stab sections to - have non PC relative relocations with -mrelocatable. - -Wed Mar 8 02:57:53 1995 Ken Raeburn - - * config/tc-m68k.c (opcode_ptr): Return pointer to const. - (md_begin): Make hash table errors fatal. Process opcode aliases - after main opcode table. - (md_apply_fix_2, case 4): Recode setting of lower_limit to avoid - gcc warning. - -Tue Mar 7 16:07:10 1995 Ian Lance Taylor - - * doc/as.texinfo: Add documentation for SPARC V9, from Doug Evans - . - -Mon Mar 6 09:58:34 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c: Change all occurences of pa-89 with pa-11 to - be consistent with current naming conventions. - (md_begin): Set a default architecture and machine type. - (pa_ip): If the current instruction specifies a newer machine type - than the current machine type, then update the current machine - type. - (need_pa11_opcode): Likewise. - -Sun Mar 5 19:38:09 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_ip, case 'z'): Don't lose argument - relocation bits for absolute calls. - -Fri Mar 3 17:41:50 1995 Ken Raeburn - - * config/tc-h8300.* (md_operand): Change empty function to empty - macro. - - * config/tc-h8300.c (build_bytes): Make H8/300-H warning message - clearer. - - * write.c (write_contents): If bfd_set_section_contents fails, - print a message and exit, instead of aborting. - -Fri Mar 3 16:26:19 1995 Michael Meissner - - * tc.h (md_apply_fix3): If MD_APPLY_FIX3 is defined, declare - md_apply_fix3. - - * write.c (fixup_segment): If MD_APPLY_FIX3 is defined, call - md_apply_fix3 with the normal 2 arguments and the current segment - pointer instead of md_apply_fix. - - * config/tc-ppc.h (MD_APPLY_FIX3): Define. - - * config/tc-ppc.c (ppc_elf_validate_fix): Warn if -mrelocatable - and a non PC relative relocation that isn't in the .got2 segment - was performed. - (md_apply_fix3): Rename from md_apply_fix and take segment pointer - as third argument. If ELF object format, call ppc_elf_validate_fix - for normal relocations. - (md_parse_option): If ELF object format, recognize the - -mrelocatable switch. - -Thu Mar 2 16:34:44 1995 Ian Lance Taylor - - * config/tc-i386.h (AOUT_MACHTYPE): Define as 100, not 0. - -Tue Feb 28 18:29:27 1995 Ken Raeburn - - * config/tc-arm.c, config/tc-arm.h (md_operand): Replaced empty - function in .c file with empty macro in .h file. - * config/tc-h8500.*, config/tc-hppa.*, config/tc-i386.*, - config/tc-i860.*, config/tc-i960.*, config/tc-ns32k.*, - config/tc-ppc.*, config/tc-sh.*, config/tc-sparc.*, - config/tc-tahoe.*, config/tc-vax.*, config/tc-w65.*, - config/tc-z8k.*: Ditto. - * config/tc-m68k.*: Ditto. - - * config/tc-m68k.c (mote_pseudo_table): Removed dots from opcode - names. - - * read.c (s_app_line): Ignore non-positive line numbers. - -Tue Feb 28 15:34:14 1995 Ian Lance Taylor - - * config/tc-i386.c (tc_i386_fix_adjustable): Don't adjust PLT or - GOT relocs either. - -Mon Feb 27 13:03:41 1995 Kung Hsu - - * configure.in: add a29k-*-vxworks configuration. - -Fri Feb 24 14:41:15 1995 Ian Lance Taylor - - * config/tc-mips.c (load_register): Take dbl argument to determine - handling of signed 32 bit values in 64 bit modes. Change all - callers. - (macro): Handle M_DLI and M_DLA_AB. - -Wed Feb 22 23:10:56 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_apply_fix): Don't subtract the value of the - add symbol if it's a common symbol (the value of a common symbol - is its size, not a value in the traditional sense). - -Wed Feb 22 21:12:28 1995 Ian Lance Taylor - - * config/tc-mips.c (append_insn): If listing_prev_line is called, - call frag_grow to make sure there is still room for a variant. - -Fri Feb 17 14:50:08 1995 Ian Lance Taylor - - * config/tc-mips.c (md_pseudo_table): Add 2byte, 4byte and 8byte - if OBJ_ELF. From gary@Intrepid.COM (Gary Funck). - - * config/obj-elf.c (elf_frob_symbol): Warn if a symbol is both - weak and common. - * config/obj-aout.c (obj_aout_frob_symbol): Likewise. - -Fri Feb 17 12:43:47 1995 Michael Meissner - - * config/tc-ppc.c (md_pseudo_table): Don't redefine byte under - ELF. - (ppc_elf_cons): Don't support @pcrel any more, since DIFF_EXPR_OK - allows the normal expressions to generate it. - (md_apply_fix): Convert BFD_RELOC_32 with pcrel bit set into - BFD_RELOC_32_PCREL. Abort if either BFD_RELOC_16 or BFD_RELOC_8 - need PC relative relocations. - - * config/tc-ppc.h (DIFF_EXPR_OK): Define to allow PC relative - expressions to be handled. - -Thu Feb 16 14:30:13 1995 Doug Evans - - * expr.c (operand): Move md_operand handling to default case - (so it works). - -Wed Feb 15 16:08:47 1995 Jason Molenda - - * config/tc-h8500.c (tc_coff_symbol_emit_hook): Add ignored - parameter, to match prototype. - -Wed Feb 15 15:07:00 1995 Michael Meissner - - * config/tc-ppc.c (md_pseudo_table): If ELF, go to ppc_elf_cons - instead of cons. - (md_show_usage): Show all of the PowerPc options. - (ppc_elf_suffix): New function to recognize ELF suffixes that - specify a relocation, such as @GOT. - (ppc_elf_cons): Replacement for the standard cons function that - knows about the ELF suffixes. - (ppc_fixup): Add reloc field to hold non-standard relocation. - (md_assemble): Handle ELF suffixes like @GOT. - (md_create_short_jump): Dummy in case WORKING_DOT_WORD is not - defined. - (md_create_long_jump): Ditto. - (md_short_jump_size): Ditto. - (md_long_jump_size): Ditto. - (md_apply_fix): Handle BFD_RELOC_32_PCREL, BFD_RELOC_LO16, - BFD_RELOC_HI16, BFD_RELOC_HI16_S, BFD_RELOC_PPC_TOC16, and - BFD_RELOC_16 relocations. If relocation can not be found, print - the decimal value of the relocation. - -Wed Feb 15 11:46:02 1995 Ian Lance Taylor - - * config/tc-mips.c (md_apply_fix): Accept BFD_RELOC_16, for - DWARF. From gary@Intrepid.COM (Gary Funck). - - * config/tc-mips.c (macro): Handle M_U{L,S}D[_A] (unaligned double - loads and stores). - - * config/tc-i386.c (tc_i386_fix_adjustable): Do adjust global - symbols if OBJ_AOUT. - - * config/tc-mips.c (macro): Don't use the target register as a - base register when building the address for M_L{W,D}{L,R}_AB. - -Mon Feb 13 14:44:32 1995 Ian Lance Taylor - - * config/tc-mips.c (KT0, KT1): Define. - (mips_ip): Recognize $kt0 and $kt1 as register names. - - * config/tc-sparc.h (tc_fix_adjustable): Define if OBJ_ELF. - * config/tc-sparc.c (md_apply_fix): If OBJ_ELF, subtract out the - value of a defined symbol; the value was added in by - fixup_segment. This was previously corrected, if the reloc was - changed to be against a section symbol, in tc_gen_reloc. - -Fri Feb 10 14:04:04 1995 Ian Lance Taylor - - * config/tc-i386.c (tc_i386_fix_adjustable): Use S_IS_EXTERN - rather than !S_IS_LOCAL. - -Thu Feb 9 18:16:34 1995 Ian Lance Taylor - - * config/tc-i386.c (md_assemble): Adjust conditions for changing - BFD_RELOC_32 to BFD_RELOC_386_GOTPC to handle a switch in frags. - Patch originally from Rob Ryan . - - * config/tc-i386.c: Include subsegs.h. - (tc_i386_fix_adjustable): Declare return value. - (i386_operand): Don't use an assignment directly as a condition. - -Thu Feb 9 10:37:13 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_apply_fix): In some cases subtract the - value of the add symbol from valp. Offsets braindamage in the - "machine independent" fixup_segment. - -Wed Feb 8 18:51:23 1995 Ken Raeburn - - * messages.c (as_abort): New function. - * as.h (as_abort): Declare it. - (abort): New macro. - - Thu Jan 19 18:10:05 1995 Pat Rankin (rankin@eql.caltech.edu) - - * config/vms-conf.h (HAVE_UNISTD_H): define it unconditionally. - * config-gas.com: test for availability of ; create a - rudimentary one if necessary. - -Tue Feb 7 13:34:46 1995 Michael Meissner - - * configure.in: Add powerpc-*-eabi support, which is the same as - powerpc-*-elf. - (configure): Rebuild with autoconf. - -Mon Feb 6 03:37:00 1995 Ken Raeburn - - Changes from Bryan Ford for i386 - 16-bit and msdos support: - * config/tc-i386.c (flag_16bit_code): New variable. - (set_16bit_code_flag): New function. - (md_pseudo_table): Added entries "code16" and "code32". - (md_assemble): Ensure that correct data-size prefixes get emitted, - based on the current mode. Ensure that 32-bit addressing will - always be done. Move segment-prefix handling code. (Why?) Use - 16-bit jumps for 16-bit code, 32-bit jumps for 32-bit code. - * config/tc-i386.h (MAX_PREFIXES): Bump to 5. - (Data16, Data32): Define. - * doc/as.texinfo (i386-16bit): New node. - * configure.in (i386-*-msdos*): New target, using a.out format. - * configure: Regenerated. - -Thu Feb 2 15:21:24 1995 Ken Raeburn - - * config/tc-m68k.c (cpu32_control_regs): New macro. - (m68k_init_after_args): Use it, for cpu32 processors. - - Tue Jan 31 17:20:45 1995 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.c (vms_tir_stack_psect): new routine; - (VMS_Set_Data, VMS_Set_Psect, VMS_Store_PIC_Symbol_Reference, - VMS_TBT_Routine_Begin, VMS_TBT_Line_PC_Correlation): use it; - (VMS_Global_Symbol_Spec, VMS_Procedure_Entry_Pt): treat - Psect_Number as `unsigned'. - - Thu Jan 26 17:06:28 1995 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.c: performance tuning. - (VMS_Symbol_type_list): convert from single list head to small - array of list heads; - (SYMTYP_HASH): new macro for accessing VMS_Symbol_type_list[]; - (find_symbol, setup_basic_type, VMS_typedef_parse): use it; - (VMS_RSYM_Parse): move S_GET_VALUE() inside switch to avoid - calling it for uninteresting cases. - -Wed Feb 1 23:52:45 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_apply_fix): Go ahead and call - hppa_field_adjust to get a new value for R_DATA_ONE_SYMBOL - relocations in SOM. - (hppa_fix_adjustable): Refine somewhat. - -Fri Jan 27 21:29:53 1995 Michael Meissner - - * config/tc-ppc.h (NO_STRING_ESCAPES): Don't define if we are - using ELF. - -Thu Jan 26 19:03:42 1995 Ken Raeburn - - * config/tc-h8300.c (get_specific): Add parens around | inside &. - (skip_colonthing): Set L_8 if ":8" is specified. - -Thu Jan 26 18:38:01 1995 Ian Lance Taylor - - * config/tc-ppc.c (md_begin): Permit mfdec to be duplicated on the - 601. Check that the error return from hash_insert is "exists". - -Thu Jan 26 11:35:33 1995 Michael Meissner - - * configure: Add support for configuring powerpc-*-eabi. - - * config/tc-ppc.c (GOT_symbol): Define if object format is ELF. - - * config/tc-ppc.h (GLOBAL_OFFSET_TABLE_NAME): Define if object - format is ELF and not defined to be "_GLOBAL_OFFSET_TABLE_". - -Wed Jan 25 16:23:13 1995 Jim Wilson - - * tc-sh.c (little): Add argument IGNORE to avoid compiler warnings. - (md_pseudo_table): Add space for consistent formatting. - (COND8_RANGE, COND12_RANGE): Delete unused macros. - (COND8_F, COND8_M, COND12_F, COND12_M, UNCOND12_F, UNCOND12_M): - Correct minimum and maximum branch offsets. Add comments explaining - why these numbers are correct. - -Wed Jan 25 15:32:09 1995 David Edelsohn - - * config/tc-ppc.c (md_parse_option): Accept mpwr2 as a synonym for - mpwrx; mppc32, m603, and m604 as synonyms for mppc; and mppc64 and - m620 for PowerPC64 mode. - (ppc_symbol_new_hook): Add T0 as synonym for TC0 suffix. - -Tue Jan 24 16:44:23 1995 Ken Raeburn - - * config/tc-vax.c (vip): Introduce new ptr-to-const local variable - for scanning operand string. - - Sat Jan 21 17:50:38 1995 Pat Rankin (rankin@eql.caltech.edu) - - * config/vax-inst.h (struct vop, fields `vop_warn', `vop_error'): - make them pointers to const char; - (struct vit, field `vit_error'): ditto. - * config/atof-vax.c (md_atof): rename local `littlenum_pointer' - to `littlenumP' to avoid shadowing file scope variable. - * config/tc-vax.c (vip_begin, vip_op_defaults, vip_op_1): make - string arguments be pointers to const char; - (vip): make `alloperr' const char *; - (vip_op): make `err' and `wrn' const char *; rename `access' to - `access_mode' to avoid shadowing library function. - * config/obj-vms.c (`symbol_name'): make it const char *; - (get_struct_name): cast one use of `symbol_name' to char * - [caller guarantees that it won't modify the pointer's target]; - (PUT_COUNTED_STRING): use pointer to const char; - (VMS_typedef_parse): make `pnt2' const char *; - (Write_VMS_MHD_Records): make `cp' const char *; - (VMS_Modify_Psect_Attributes, array `Attributes'): make const, - and make field `Name' pointer to const char; - - * as.h (`seg_name[]' declaration): pointers to const char; - (struct _pseudo_type, field `poc_name'): pointer to const char. - * subsegs.c (`seg_name[]' definition): ditto; - * hash.c (hash_ask): rename argument `access' to `access_type' - to avoid shadowing library function. - * write.c (variable `the_object_file'): move from file scope - to block scope within write_object_file(); free it after use; - (fixup_segment): conditionally exclude it for OBJ_VMS. - (cvt_frag_to_fill): rename argument `headers' to `headersP' - to avoid shadowing file scope variable. - -Mon Jan 23 21:42:39 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_ip, case 'D'): Fix typo which caused - miscompilation of "diag" instructions. - -Mon Jan 23 15:51:41 1995 Ken Raeburn - - * configure: Regenerated. - - * config/tc-mips.c: Include libiberty.h. - -Mon Jan 23 14:07:58 1995 Ian Lance Taylor - - * config/tc-sh.h (tc_init_after_args): Don't define. - * config/tc-sh.c (md_begin): Remove unused variable table. - (md_assemble): Remove unused variable p. - (md_convert_frag): Cast fr_address to unsigned long for printf. - (md_apply_fix): Use as_warn_where rather than as_warn. - (sh_init_after_args): Remove empty function. - - * configure.in (i386-*-gnu*elf*): New target. - -Sat Jan 21 19:02:23 1995 Ian Lance Taylor - - * hash.c (hash_ask): If we find the slot after wrapping around, - break out of the loop. Fixes bug in Jan 18 change. - -Fri Jan 20 17:07:31 1995 Ken Raeburn - - * hash.c (hash_code): Undo last change. - -Thu Jan 19 14:49:47 1995 Ken Raeburn - - * config/tc-alpha.c (alpha_ip): Initialize local variables to keep - gcc quiet. - (gpdisp_hi16_howto): Don't use "const" with reloc_howto_type. - (in_range_signed): Add parens around subtraction inside shift. - * gasp.c (do_data): Initialize local variable "opname". - (istrue): Provide a default case to set "res" and keep "gcc -Wall" - quiet. - * write.c (write_contents): Deleted unused variable. - (print_symbol_value_1): Declare. - * hash.c (hash_ask): Delete disabled non-strcmp version of the - code, and automatic variables used only in those sections. - * write.c (chain_frchains_together_1): Only define local variable - "prev_fix" if BFD_ASSEMBLER. - * flonum-konst.c (dummy1): Return void. - * config/tc-vax.c (md_assemble): Remove two comparisons of - unsigned numbers versus zero. - * as.h (bcopy): If neither memcpy nor bcopy is defined as a macro, - define to use memcpy. - - * config/tc-alpha.c, config/alpha-opcode.h: Revert 2 June changes. - Turns out we never got the assignment done after all. - - Cleanup of VAX and VMS code, from Pat Rankin: - * config/obj-vms.c: Changed exported function names to lower case. - (Changed call sites in write.c.) Declare VMS system function - names used, conditional on actually being on VMS. Changed many - functions that returned no useful value to now be declared to - return void. Removed many unused variables. Supply missing - return statements or values. Supply `default' case in switch - statements. Ensure local variables get initialized. - * config/tc-vax.c: Minor changes to silence "gcc -Wall". - * config/obj-vms.h, config/tc-vax.h: Added some missing - declarations. - -Wed Jan 18 13:49:26 1995 Ken Raeburn - - * atof-generic.c (flonum_print) [TRACE]: New function. - (atof_generic) [TRACE]: Print multiplier before multiplication, - and print multiplication result before and after copy. - - * flonum-mult.c (flonum_multip): Avoid sign extension problems - around multiplication operation. - - * atof-generic.c (ASSUME_DECIMAL_MARK_IS_DOT): Define. - (atof_generic) [ASSUME_DECIMAL_MARK_IS_DOT]: Check for '.' - explicitly instead of calling strchr. - - * config/tc-sparc.c (sparc_ip): When scanning successive opcode - table entries, check names for pointer equality before doing - string comparisons. - - * hash.c (hash_ask): Call strcmp instead of expanding it inline. - (hash_code): Replaced with a version from bfd. - - * config/obj-coff.c (write_object_file): If COFF_FLAGS isn't - defined, default it to zero. - -Wed Jan 18 12:16:07 1995 Ian Lance Taylor - - * write.c (fix_new_internal): Clear fx_bsr on those targets which - use it. - - * expr.c (operand): Parenthesize && within ||. - * listing.c (listing_newline): Likewise. - (list_symbol_table): Use %lu to print sizeof. - * symbols.c: Comment out unused function indent. - (print_symbol_value_1): Cast pointer to unsigned long for printf. - * config/obj-coff.c (do_relocs_for): Only declare symbol_ptr if it - will be used. - * config/tc-h8300.c (md_begin): Remove unused variable reg. - (get_operand): Declare type of parameter direction. Remove unused - variable size. - (get_specific): Fix comment to avoid nested comments. - (check_operand): Cast X_add_number to unsigned long for printf. - (build_bytes): Remove unused local variables output_ptr, part, and - high. - (build_bytes): Cast X_add_number to unsigned long for printf. - (clever_message): Remove unused variable scan. - (md_assemble): Remove unused variable i. - (tc_coff_sizemachdep): Remove unused function. - * tc-h8300.h (tc_reloc_mangle): Declare. - -Tue Jan 17 10:58:06 1995 Ian Lance Taylor - - * config/tc-mips.c (mips_4650): New static variable. - (md_begin): Handle a cpu string of "4650". If mips_4650 was not - initialized, set it to 0. - (append_insn): Don't insert nops around HI and LO on a 4650. - (mips_emit_delays): Likewise. - (mips_ip): Use INSN_ISA mask to check ISA of instruction. Check - for INSN_4650. - (md_longopts): Add m4650 and no-m4650. - (md_parse_option): Handle mips-cpu=4650. Handle -m4650 and - -no-m4650. - * doc/as.texinfo: Document new MIPS options. - -Sat Jan 14 23:48:13 1995 Steve Chamberlain - - * config/tc-w65.c, config/tc-w65.h, config/w65.mt: Newfiles. - * config/obj-coff.h: Cope with w65. - * configure, configure.in: Recognize w65. - -Thu Jan 12 17:56:24 1995 Ken Raeburn - - * app.c (do_scrub_next_char) [__GNUC__ && __OPTIMIZE__]: If `get' - function is scrub_from_file, call scrub_from_file directly, and - get gcc's inlining capability into the act. - - * Makefile.in (VMS_OTHER_OBJS): Add ../libiberty/hex.o. - (OBJS): Delete hex-value.o. - (REAL_SOURCES): Delete hex-value.c. - (hex-value.o): Delete dependencies. - * hex-value.c: Deleted. - * as.c (main): Call hex_init. - * expr.c, config/tc-mips.c: Include libiberty.h. Replace - hex_value array references with hex_* macros. - -Wed Jan 11 17:51:38 1995 Ken Raeburn - - * config/tc-h8300.h (COFF_FLAGS): Don't define. - * config/tc-h8500.h (COFF_FLAGS), config/tc-sh.h (COFF_FLAGS), - config/tc-z8k.h (COFF_FLAGS): Ditto. - - * config/obj-coff.c (KEEP_RELOC_INFO): Make sure it's always - defined. - - * config/tc-m68k.c (m68k_ip, cases AOFF and AINDEX): Don't - generate 68020 addressing modes for a 68000 processor. - (md_estimate_size_before_relax, cases PCREL and PCLEA): Ditto. - -Tue Jan 10 13:34:14 1995 Ken Raeburn - - * config/obj-coff.c (write_object_file): Don't treat h8300 and z8k - specially with regard to fixups. - -Mon Jan 9 16:22:28 1995 Ken Raeburn - - * config/tc-mips.c (RELAX_RELOC1, RELAX_RELOC2): Cast values to - bfd_vma before subtracting. - - * config/obj-coff.c (size_section): Handle rs_space like rs_fill, - but make sure fr_symbol is null. - (fill_section): Ditto. - -Sun Jan 8 16:14:19 1995 Ian Lance Taylor - - * config/tc-mips.c (mips_ip): Fix handling of floating point - values when GPOPT is not defined. - -Fri Jan 6 16:59:41 1995 Ken Raeburn - - * gasp.c: Include string.h. Put config.h before other includes. - - * config/tc-alpha.c (alpha_ip): Delay calls to emit_add64 until - after any remaining operands are also known to match. - -Fri Dec 30 18:21:41 1994 Ken Raeburn - - * listing.c (list_symbol_table): Build a format string based on - the size of the value to be printed, as long as "unsigned long" is - at least as wide, after handling the special case of 4-byte - values. - - * Makefile.in (dependencies): Make $(OBJS) depend on as.h and - everything it includes. Delete those files from per-file - dependencies. - - * as.h (relax_substateT): Now defined to be unsigned int. - (relax_stateT): Separate typedef from enum definition. - (enum _relax_state): Reordered for better punctuation. Added new - values rs_align_code and rs_space. - (lineno, struct lineno_struct): Unused, deleted. - - * as.h: No longer include assert.h. - (as_assert): Declare. - (assert): New definition, calls as_assert longer needed. - (__PRETTY_FUNCTION__): Provide default for older versions of gcc. - * messages.c (as_assert): New function. - * gdbinit.in: Put a breakpoint there. - - * read.c (s_space): Rewrite to handle general expressions. - Generate rs_space frags for non-constant values. - * write.c (cvt_frag_to_fill): Treat rs_align_code and rs_space - like rs_align and rs_org. Verify that fr_offset is non-negative, - and force frag type to rs_fill only after assertion checks. - (relax_segment): Treat rs_align_code like rs_align. Treat - rs_space like rs_org in the first switch; in the second, force the - operand to a constant, and use it for the growth size. - -Wed Dec 28 20:57:37 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_subspace): For sections with the ZERO - attribute, set the "bss" field in the appropriate seginfo structure. - -Wed Dec 28 15:01:01 1994 Ken Raeburn - - * subsegs.h: Include obstack.h. - -Tue Dec 27 18:16:04 1994 Ken Raeburn - - * as.h (struct frag): Enable align* components now. - -Tue Dec 20 14:56:31 1994 Ken Raeburn - - * frags.c (frag_init): Call obstack_begin on `frags'. - * subsegs.c (subsegs_begin): Don't do it here. - * as.c (main): Call frag_init before subsegs_begin. - - * frags.c (frag_append_1_char): New function. - * frags.h (frag_append_1_char): Declare it. - (FRAG_APPEND_1_CHAR): Call it. Old definition is commented out - for now. - - * as.h (struct frag): Added (but commented out) new fields for - tracking current alignment. - (frag_now_fix): Changed macro to function declaration. - * frags.c (frag_now_fix): Define function here. - (frag_new): Use it instead of accessing `frags' directly. - * frags.h (frags): Change comment to indicate it shouldn't be - accessed directly. - * subsegs.h (struct frchain): New field frch_obstack, intended to - eventually replace global `frags' obstack. - * subsegs.c (subseg_set_rest): Use frag_now_fix instead of - accessing `frags' directly. Initialize fields of new frchainS - explicitly instead of with memset. - * config/obj-coff.c (obj_coff_ln) [!BFD_ASSEMBLER]: Use - frag_now_fix. - * config/tc-mips.c (s_loc), config/obj-vms.c - (vms_resolve_symbol_redef), symbols.c (colon): Likewise. - - * config/tc-m68k.c (md_apply_fix_2): Use offsetT and addressT - instead of long and unsigned long. - (md_apply_fix): Cast value before passing it. - - * config/obj-aout.h, config/obj-coff.c, config/obj-elf.h, - config/obj-som.h, config/tc-h8500.c, config/tc-hppa.c, - config/tc-hppa.h, config/tc-sh.c, config/tc-z8k.c: Don't rely on - use of ".." when including header files. - - * config/obj-coff.c (fixup_segment): Reformat condition in an `if' - statement. - - * Makefile.in (SUBDIR_INCLUDES): Deleted. - -Tue Dec 20 13:40:36 1994 Ian Lance Taylor - - * config/obj-coff.h: Include bfd/libcoff.h, not libcoff.h. - -Mon Dec 19 16:53:36 1994 Ian Lance Taylor - - * config/tc-mips.c (load_register): Rewrite to handle O_big 64 bit - constants. - (mips_ip): Accept O_big constants in case 'I'. Change case - 'i'/'j' to treat an O_big constant as an out of range value. - -Mon Dec 19 14:15:07 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_subspace): Make sure SEC_HAS_CONTENTS is - clear for a section with the "ZERO" attribute. - - * Reduce useless symbols for ELF in an attempt to make smaller - objects and speed up the linker. - * config/tc-hppa.c (struct call_info): Replace end_symbol field - with a size field. - (hppa_elf_mark_end_function): Delete unneeded function. - (pa_build_unwind_subspace): For the 2nd unwind relocation, use - the function symbol + function size instead of a special symbol - for the end of the function. - (process_exit): Compute the function size here. Don't call - hppa_elf_mark_end_of_function anymore. - (pa_procend): Likewise. - (hppa_fix_adjustable): Only reject 32bit relocations for SOM. - (elf_hppa_final_processing): Simplify. - -Mon Dec 19 13:49:07 1994 Ken Raeburn - - * configure.in: Recognize mips-sony-bsd and mips-dec-bsd, but - reject other vendors until we can be sure we're consistent with - bfd. - - * config/obj-vms.c (Create_VMS_Object_File): Instead of formatting - a buffer to pass to `error', just call `as_fatal' directly. - (VMS_Psect_Spec): Ditto. - (VMS_TBT_Module_Begin, VMS_TBT_Source_File, gen1, - VMS_typedef_parse, VMS_LSYM_Parse, VMS_Emit_Globalvalues): Call - as_tsktsk instead of printf. - (VMS_TBT_Module_Begin, VMS_TBT_Line_PC_Correlation, - VMS_TBT_Source_File, VMS_TBT_Source_Lines, - VMS_Store_Repeated_Data, VMS_Check_For_Main): Use explicit - integers rather than sizeof expressions using basic integer types, - in case host and target aren't the same. Use memcpy or COPY_* - macros instead of possibly unaligned word or longword assignment. - - * config/obj-vms.h (OBJ_SYMFIELD_TYPE): New macro. - * config/obj-vms.c (VMS_Store_PIC_Symbol_Reference, - VMS_Check_For_Main, VMS_write_object_file): Use sy_obj instead of - forcing sy_number to hold a pointer. - -Fri Dec 16 14:40:16 1994 Ken Raeburn - - * config/tc-sh.c (md_begin): Don't fill in md_relax_table here. - (md_relax_table): Use static initialization. - - * config/tc-h8300.c (parse_exp, get_operands, clever_message, - md_assemble, tc_crawl_symbol_chain, md_undefined_symbol, - tc_headers_hook, md_operand, md_number_to_chars): Don't use DEFUN. - - * Makefile.in (CHECKFLAGS): Don't pass AS_FOR_TARGET, - CC_FOR_TARGET, OBJDUMP_FOR_TARGET, NM_FOR_TARGET; they're not - used. - (AS_FOR_TARGET, CC_FOR_TARGET, OBJDUMP, OBJDUMP_FOR_TARGET, NM, - NM_FOR_TARGET): Don't define. - (VMS_OTHER_OBJS): Add xmalloc.o and xexit.o from libiberty. - (tooldir): Use exec_prefix, not libdir. - -Fri Dec 16 11:07:10 1994 Stan Shebs - - * config/obj-coff.h: Include libcoff.h, not ../bfd/libcoff.h. - - * as.h: Include progress.h. - * as.c (main): Call START_PROGRESS and END_PROGRESS. - (main, perform_an_assembly_pass): Call PROGRESS. - -Fri Dec 16 00:46:08 1994 Ian Lance Taylor - - * write.c (adjust_reloc_syms): Use bfd_is_und_section and - bfd_is_abs_section rather than comparing against &bfd_und_section - and &bfd_abs_section. - -Thu Dec 15 15:27:14 1994 Jim Wilson - - * config/tc-sh.c (md_begin): Use a local variable when - initializing md_relax_table to avoid errors about modifying a - const data structure. - -Tue Dec 13 15:42:27 1994 Ian Lance Taylor - - * config/tc-ppc.c (tc_gen_reloc): Remove OBJ_ELF hack which - appears to no longer be needed. - -Tue Dec 13 08:04:15 1994 Ian Lance Taylor - - * config/tc-mips.c (macro_build): Accept BFD_RELOC_PCREL* without - requiring that the X_op_symbol be in the text_section. - (macro): Change the test for a legel expression difference to - correspond to changes in pseudo_set in read.c. - -Fri Dec 9 21:04:17 1994 Ken Raeburn - - * write.c (write_relocs) [RELOC_EXPANSION_POSSIBLE]: Use - bfd_install_relocation. - - * ecoff.c (ecoff_set_gp_prolog_size): If there is no current - routine, just return. - - * config/tc-alpha.c (alpha_ip, case 'B', subcase 'c'): Use opcode - value from pattern instead of assuming jsr. - * config/alpha-opcode.h (jmp): Add a "1,Bc" form. - -Thu Dec 8 17:48:25 1994 Ken Raeburn - - * Makefile.in (NM_FOR_TARGET): Use ../binutils/nm.new, not just - plain nm. - - * configure.in (ns32k-pc532-mach*): Select correct emulation. - (mips-sony-bsd*): Use ecoff. - (mips-*-gnu*): New target, using aout format, from Roland McGrath. - * configure: Regenerated. - -Tue Nov 29 13:58:10 1994 Ken Raeburn - - Use libiberty version of xmalloc: - * Makefile.in (REAL_SOURCES): Delete xmalloc.c. - (OBJS): Delete xmalloc.o. - (xmalloc.o): Delete dependencies. - * as.c (main): Call xmalloc_set_program_name once program name is - known. - - * config/tc-alpha.c (in_range_signed, in_range_unsigned): New - routines, split from in_range. - (in_range): Deleted. All calls changed to in_range_*signed. - (create_lita_section): Macro deleted. Single use expanded in - place. - (alpha_ip): Handle `t' and `8' operand types. - (md_apply_fix): Handle BFD_RELOC_12_PCREL. Print name of - unhandled relocation types. - * config/alpha-opcode.h: Added HALT and DRAINA. Disabled MOVI, - since it doesn't work, and isn't supported by the native - assembler. - - * input-scrub.c: Change wording of a comment to avoid interference - with Cygnus source-control tools. - - * as.h (errno) [NEED_DECLARATION_ERRNO]: Declare. - - * config/tc-m68k.c (init_table): List buscr and pcr control - registers. - (m68k_ip, case 'J'): Handle them. - - Delete signal handler code. It's been disabled since March 1993 - without complaints. - * as.c: Don't include signal.h. - (got_sig): Unused function deleted, declaration deleted. - (SIGTY): Macro deleted. - (main): Deleted disabled code for establishing signal handler. - -Mon Nov 28 11:37:35 1994 Doug Evans - - * app.c (do_scrub_next_char): Insert missing newline at end of file - like warning says we do. - -Mon Nov 28 00:11:15 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.h (pa_check_eof): Declare new extern function. - (tc_frob_file): Define to call pa_check_eof. - - * config/tc-hppa.c (pa_check_current_space_and_subspace): New - function to verify the current space and subspace are reasonable. - Call for the appropriate pseudo-ops and before instruction parsing. - (pa_check_eof): New function to verify enter/exit and proc/procend - pairs match at EOF. - (pa_code): Simplify. - - * config/obj-som.c: Delete #if 0 code. - -Wed Nov 23 19:36:09 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * config/obj-coff.h (TARGET_FORMAT): Select between coff-shl and - coff-sh. - * config/sh.mh (TARG_CPU_DEPENDENTS): Get it right. - * config/tc-sh.c (little): New function. - (md_parse_option): Notice new option. - (build_relax, build_Mytes, md_atof, md_convert_frag, md_apply_fix): - Cope with little endian data. - * config/tc-sh.h (COFF_MAGIC, LISTING_HEADER): Endian dependent. - -Wed Nov 23 10:54:38 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (tc_gen_reloc, ELF variant): Revert last - change. The real bug was in bfd/elfcode.h and has been fixed. - -Tue Nov 22 23:31:20 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (tc_gen_reloc, ELF variant): Add section->vma - to the relocation's offset. - -Tue Nov 22 14:37:58 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * Makefile.in (INSTALL_XFORM): Fix typo. - -Tue Nov 22 10:23:25 1994 J.T. Conklin - - * config/tc-alpha.c (s_alpha_set): Ignore the .set (no)move and - .set (no)volatile directives. - -Tue Nov 15 21:44:13 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_subspace): Make sure to always reset - current_subspace. - (pa_text, pa_data): Likewise. - - * config/tc-hppa.c (pa_align): New function. Aligns the current - offset within the current subspace along with updating the - alignment of the subspace itself. - (pa_subspace): Default alignment to one byte rathern than zero - bytes to avoid setting alignment to log2(0). - (md_pseudo_table): Use pa_alignment for .align. - -Tue Nov 15 15:24:45 1994 Ken Raeburn - - * messages.c (as_fatal): Always put a space after "fatal error:" - when printing message. - -Tue Nov 15 11:10:43 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.h (obj_frob_symbol): Delete. - (tc_frob_symbol): Make definition conditional on OBJ_SOM or - OBJ_ELF. For ELF subtract out symbol->section->vma for non common - symbols. - -Wed Nov 9 14:53:03 1994 Ken Raeburn - - * config/te-delta.h: New file, derived from te-sysv32.h. - -Wed Nov 9 11:52:44 1994 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-ppc.c (ppc_bf): Always set coff_line_base. - -Mon Nov 7 01:58:49 1994 Ken Raeburn - - * Makefile.in (VERSION): Bump to 2.5.3. - - * configure.in: Compare generic cpu name against "sparc", not - "sparc*", since sparc variants should be changed to "sparc". - * configure: Regenerated with autoconf 2.1. - - * config/tc-a29k.c (octal, toHex): Variables deleted. - (isoctal): Macro deleted. - (md_begin): Don't initialize them. - (machine_ip, case 'P'/'A'): For absolute operand, generate an - error message if it's out of range. - (md_apply_fix, case RELOC_JUMPTARG): Check range for PC-relative - jumps. - (md_apply_fix): Delete code inside "#if 0". - -Thu Nov 3 20:20:40 1994 Ken Raeburn - - * config/go32.mh: Unused file deleted. - - * read.c (get_absolute_expression): Indicate that the error may - merely be that the expression can't currently be reduced. - -Thu Nov 3 16:09:59 1994 J.T. Conklin (jtc@rtl.cygnus.com) - - * config/tc-m68k.h (TARGET_FORMAT): If TE_NetBSD define as - "a.out-m68k-netbsd". - * config/tc-sparc.h (TARGET_FORMAT): If TE_NetBSD define as - "a.out-sparc-netbsd". - - * config/te-nbsd.h: New file, NetBSD target emulation - * config/te-netbsd.h: Removed. - * configure.in (i[345]86-*-netbsd*,m68*-*-netbsd*,sparc*-*-netbsd*): - Set bfd_gas. Use nbsd emulation. - -Thu Nov 3 17:44:47 1994 Ken Raeburn - - Changes from net 2.5.2 release branch: - - * configure.in: Put AC_DEFINE(sparcv9) on its own line, so that - the shell variable settings associated with it are permanent. For - CPUs requiring bfd_gas=yes, select it based on CPU only, not - individual target names. Handle m68k-hp-hpux*, not just -hpux. - - * config/tc-z8k.c (tc_coff_symbol_emit_hook): Add dummy argument - to match prototype in obj-coff.h. - - * configure.in: Skip tests for defining WANT_FOPEN_BIN and - IBM_COMPILER_SUX. - * acconfig.h: Deleted them. - * configure, conf.in: Rebuild with autoconf 2.0. - * config/go32.cfg, config/vms-conf.h: Updated. - - * config/tc-m68k.c (md_apply_fix_2, md_convert_frag_1): Always use - IBM_COMPILER_SUX version of code, with comments indicating why. - - * listing.c (file_info): Use text mode when opening file for read. - Use "r" directly, no macro. - * input-file.c (input_file_open): Don't use FOPEN_RT, just use - "r". - * read.c (s_include): Ditto. - * output-file.c (output_file_create): Try both "wb" and "w", don't - bother with FOPEN_* macros. - * as.h: Don't include fopen-*.h. - - * config/alpha-opcode.h: Make "ret" with no operands equivalent to - "ret zero,(ra)", to match OSF1 and to be consistent with both - one-operand forms. - - Patches from DJ Delorie: - * as.h (alloca): undef alloca before defining it just in case - * config/go32.cfg: new file for autoconf values - * config/te-go32.h: new file - * configure.bat: new for autoconf - - * config/tc-i386.c (md_assemble): Fix typo in GOTPC check; had = - for ==. - - * configure.in: If target_frag doesn't exist, use /dev/null. - - * as.c (parse_args): For non-VMS systems, re-add `v' to - std_shortopts. Add "verbose" to list of long options. - - * write.c (adjust_reloc_syms): When generating an absolute section - symbol as a placeholder, don't mark it as used in a relocation - entry, here. - - * Makefile.in (comparison): Compare using makefile code from gcc, - stripped down to discard subdir stuff and adapted to give a - non-zero exit status if either file differs. - -Thu Nov 3 15:43:02 1994 Ian Lance Taylor - - * config/tc-mips.c (load_address): Fix RELAX_ENCODE arguments for - NO_PIC case. - -Tue Nov 1 16:10:59 1994 Ian Lance Taylor - - * config/tc-mips.c (s_change_sec): If not GPOPT, don't permit - switching to the readonly data section. - - * ecoff.c (ecoff_directive_type): Fix warning message. - -Sun Oct 30 00:57:35 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_proc): Delete disabled code to put each - proc in its own subspace, we're not going to use it. - -Tue Oct 25 14:44:33 1994 Ian Lance Taylor - - * config/tc-mips.c (macro): Ensure that mips2 case of M_LI_DD in - .rdata does not become a variant frag. - - * config/tc-mips.c (mips_cpu): Initialize to -1. - (md_begin): Don't mips_cpu if it was already set. - (md_parse_option): For -mipsN, don't set mips_cpu if it was - already set. For -mcpu=, just set mips_cpu, not mips_isa. - -Fri Oct 21 20:42:29 1994 Ian Lance Taylor - - * config/tc-mips.c (md_pseudo_table): If OBJ_ELF, handle .section. - (s_elf_section): New static function. - * ecoff.c (ecoff_build_symbols): Don't abort if we don't recognize - the section when setting the storage class; default to sc_Data. - -Thu Oct 20 00:43:38 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_apply_fix): Set new_val to 8 for all - fixups to branch instructions (not just pc-relative ones) which - will generate SOM relocations. - -Wed Oct 19 13:41:56 1994 Ian Lance Taylor - - * config/tc-a29k.c: Include ctype.h with angle brackets. - (define_some_regs): Add new special register names defined on the - 29040. - (parse_operand): Add argument opt. If non-zero, don't warn about - a missing operand. - (machine_ip): If handling argument type 'I', pass opt as non-zero - to parse_operand. Handle new optional operand type 'I'. - (md_undefined_symbol): Handle special register names (srNN). - -Tue Oct 18 00:45:24 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * write.c (renumber_sections): New static BFD_ASSEMBLER function. - (write_object_file): Call it after removing gas created sections. - -Mon Oct 17 18:06:05 1994 Ian Lance Taylor - - * symbols.c (symbol_create): Use udata.p, not just udata. - * config/obj-elf.c (obj_ecoff_set_ext): Likewise. - (elf_get_extr): Likewise. - - * read.c (read_a_source_file): The second argument to as_where is - unsigned int *, not int *. - -Mon Oct 17 02:26:32 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c: Eliminate all uses of fx_addnumber. - (tc_gen_reloc): Simplify. It's no longer necessary to set a - reloc's addend field to zero for function symbols. - (md_apply_fix): Simplify. For fixups which will require a SOM - reloc, just clear out the necessary bits in the output file. - -Fri Oct 14 19:06:46 1994 Ken Raeburn - - * Makefile.in (BISON): Use bison -y, not bison. - -Thu Oct 13 19:22:54 1994 Ken Raeburn - - * Makefile.in (VERSION): Updated to 2.5. - (clean-here): Delete stamp-mk.com. - (distclean): Delete .gdbinit. - * Version 2.5 released. - -Wed Oct 12 20:30:51 1994 Ken Raeburn - - * config/te-nbsd532.h: Renamed from te-netbsd532.h. - * configure.in, configure: Adjusted. - -Wed Oct 12 16:33:38 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * config/cplus-dem.c: Removed. It isn't used. Even if it was, - it's better to use the one in libiberty. - -Wed Oct 12 18:48:39 1994 Ken Raeburn - - * symbols.c (resolve_symbol_value, case O_symbol): Undo last - change; it breaks the rs6000 support, and doesn't seem to be - needed. - -Wed Oct 12 11:56:50 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * config/tc-i386.h,te-netbsd532.h (TARGET_FORMAT): Changed to - a.out--netbsd to match corresponding changes in BFD. - -Wed Oct 12 11:06:11 1994 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-ppc.c (ppc_fix_adjustable): Resolve symbol values - rather than explicitly adding the frag address. - * config/obj-coff.c (coff_frob_symbol): Add a zero entry to mark - the end of the line numbers; this replaces the zero entry which - used to be added by coff_add_linesym, removed Oct 7. - (coff_adjust_section_syms): Ignore sections with no seginfo. - -Wed Oct 12 01:41:37 1994 Ken Raeburn - - * Makefile.in (bootstrap, bootstrap2, bootstrap3): Create a - "stage" symlink to the appropriate stage* directory, and use it - instead in the -B options. - (comparison): Revert yesterday's change. - -Tue Oct 11 16:48:11 1994 Ken Raeburn - - * config/tc-sparc.c (tc_gen_reloc): For non-a.out relocations, if - pc-relative, use fx_offset only, ignore address of relocation. - -Tue Oct 11 15:24:00 1994 Ian Lance Taylor - - * config/tc-mips.c (mips_ip): Don't use S_IS_LOCAL when checking - for an embedded PIC switch expression, since the definition of - S_IS_LOCAL was changed. - -Tue Oct 11 15:05:11 1994 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * Makefile.in (comparison): When comparing as.new or gasp.new, try - running the binary through sed to avoid differences due to - "stage1" or "stage2" having been written into the binary. - -Sat Oct 8 01:48:04 1994 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - ELF symbol size handling, based on code from Eric Youngdale: - * config/obj-elf.h (OBJ_SYMFIELD_TYPE): New macro. Adds an - expression pointer to the symbol structure, used for `size' - expressions that couldn't be reduced to constants when initially - processed. - (elf_frob_symbol): Declare. - (obj_frob_symbol): Call elf_frob_symbol always, rather than - ecoff_frob_symbol only if ECOFF_DEBUGGING defined. - * config/obj-elf.c (obj_symbol_new_hook): Deleted unused code. - Clear sy_obj field. - (obj_elf_size): Deleted unused code. If size is non-reducible - expression, allocate some storage for the sy_obj field and copy - the expression. - (elf_frob_symbol): New function. Computes sizes, calls - ecoff_frob_symbol if appropriate. - - * write.c (fixup_segment): For i386 elf and coff (for now), don't - add in value of symbol from another defined section of the file. - -Fri Oct 7 17:54:02 1994 Ken Raeburn - - * config/tc-m88k.h (TC_KEEP_FX_OFFSET): Define. - * config/obj-coff.c (do_relocs_for): Test only TC_KEEP_FX_OFFSET, - rather than both it and TC_M88K. - (coff_adjust_section_syms): New function. - (coff_frob_section): For non-empty sections, create aux entry for - the section symbol, indicating the size. - (n_line_nos): New variable. - (add_lineno): Increment it. - (coff_add_linesym): Increment n_line_nos, don't call add_lineno. - (coff_frob_file): New function; map coff_adjust_section_syms over - sections. - (obj_coff_line): Only reset line_base for .bf symbols. - * config/obj-coff.h (coff_adjust_section_syms, coff_frob_file): - Declare. - (obj_frob_file): New macro. - - * config/obj-coff.h (OBJ_COPY_SYMBOL_ATTRIBUTES): Renamed from - obj_frob_forward_symbol, and rewritten for new parameter list. - - Mon Oct 3 21:02:38 1994 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.h (S_IS_LOCAL): fix obsolete flagseen[] reference. - -Wed Oct 5 11:49:26 1994 Ian Lance Taylor - - * config/obj-ecoff.c (obj_pseudo_table): Accept .esize and .etype - as synonyms for .size and .type. - -Wed Oct 5 00:08:10 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-coff.c (coff_frob_section): Remove assert about - section alignment. - * config/tc-sparc.c (md_section_align): Use section alignment, not - xvec align_power_min field. - -Fri Sep 30 19:05:20 1994 Pat Rankin (rankin@eql.caltech.edu) - - * vmsconf.sh (make-gas.com): handle DCL verification to enable - sensible feedback to the user while gas is being built. - -Fri Sep 30 16:23:31 1994 Ken Raeburn - - * Makefile.in (DISTSTUFF): New variable, listing only make-gas.com - for now. - (diststuff): New target; builds DISTSTUFF. - (realclean): Separate target, depend on clean and distclean, then - delete DISTSTUFF. - * make-gas.com: Deleted. - - * config/tc-i386.c (i386_validate_fix) [BFD_ASSEMBLER]: New - function. Converts reloc for "foo-GOT" to BFD_RELOC_386_GOTOFF - reloc for "foo". - (i386_operand): Don't look up section symbol for - undefined_section. - (reloc): Always permit return of 8- and 16-bit relocation types. - Add a space after "pc-relative" in the error message. - (tc_i386_fix_adjustable) [BFD_ASSEMBLER]: Reject - BFD_RELOC_386_GOTOFF relocs. - (i386_operand): For any GOTOFF reloc, convert it to a BFD_RELOC_32 - with a "foo-GOT" value. - * config/tc-i386.h (i386_validate_fix): Declare it. - (TC_VALIDATE_FIX): New macro -- call it. - (NOP_OPCODE): Cast to `char' to avoid compiler warnings. - - * as.h: If __STDC__ is not defined and varargs.h is available, use - it rather than stdarg.h. - - * write.h (struct fix): Added new bitfield fx_plt, for fixups - referring to PLT entries. - * write.c (fix_new_internal): Initialize fx_plt to zero. - (adjust_reloc_syms): Re-fetch `sym' after top of reduction loop. - Don't adjust fx_offset by frag address, since S_GET_VALUE now - includes the frag address. - (fixup_segment): Changed local var PCREL to type int, added PLT. - If PC-relative fixup refers to a PLT entry for a symbol in the - current section, don't reduce it. - - * write.c (adjust_reloc_syms): Exit loop through a label. If - DEBUG5 is defined, print out each fixup before and after - processing. - (fixup_segment): If DEBUG5 is defined, print out each fixup before - and after processing. - (print_fixup): Added prototype. Show address on first line. Show - fx_offset and fx_subsy. [!BFD_ASSEMBLER]: Only show fx_r_type if - NEED_FX_R_TYPE is defined. - - * symbols.c (print_symbol_value_1): Check S_IS_LOCAL, S_IS_EXTERN, - S_IS_DEBUG, S_IS_DEFINED also. - -Thu Sep 29 18:57:06 1994 Ken Raeburn - - * Makefile.in (all): Depend on .gdbinit. - (.gdbinit): Rebuild from gdbinit.in by running config.status. - - * gdbinit.in: Define new function "pf". Fix doc on "pe" and "ps". - - * write.c (print_fixup): Print source location on first line. - Show fx_r_type and fx_addsy fields. - -Wed Sep 28 14:56:39 1994 Ken Raeburn - - * configure.in: Set bfd_gas for all sparc targets in one place, - instead of separately for each. Correctly handle user-supplied - "--enable-bfd-gas" option. - - * gdbinit.in: Move "break abort" to end, in case gdb complains. - - * as.h (PRINTF_WHERE_LIKE, PRINT_LIKE) [USE_STDARG, !__GNUC__]: - Use PARAMS macro. - - * symbols.c (resolve_symbol_value, case O_symbol): Don't do any - processing if add_symbol is undefined or in expr_section. - (resolve_symbol_value, case O_add): For symbol plus - constant-valued symbol, convert to O_symbol and re-reduce. - (S_GET_VALUE): If symbol needs resolving, resolve it. - (indent_level): No longer static. - (print_symbol_value_1): Don't print frag address if it matches - zero_address_frag. Don't print "resolving" if already resolved. - Print segment name. Don't call print_expr_1 on an undefined - symbol. - (print_expr_1): Fix whitespace before printing X_add_number. - - * expr.c (make_expr_symbol): No longer static. Use symbol_create, - not symbol_new, for symbols holding expression values. - * expr.h (make_expr_symbol): Move declaration here. - * write.c (fix_new_exp): Handle O_add by creating an - expression-valued symbol, and calling fix_new_exp recursively. - (adjust_reloc_syms): If a fixup's symbol value is a sum of an - undefined symbol and a constant, fold the constant into the fixup, - and refer to the undefined symbol directly. Then process the - fixup again from scratch. - (write_object_file): Before calling adjust_reloc_syms, make a pass - through the symbol list trying to resolve values. - - * write.c (print_fixup): New routine, for debugging. - (write_relocs): Call bfd_install_relocation. Deleted various - hacks for working around problems with bfd_perform_relocation. - - * Makefile.in (VERSION): Update to 2.4.90. - -Wed Sep 28 11:50:40 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * Makefile.in (gasp.o): Depends upon config.h. - - * config/tc-mips.c: Include subsegs.h. - (md_apply_fix): If an unconditional b or bal overflows, and we are - not assembling PIC code, replace it with a j or jal. - - * config/tc-mips.c (md_apply_fix): Correct branch overflow test. - Use as_bad_where and as_warn_where rather than as_bad and as_warn. - -Mon Sep 26 17:15:59 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * write.c (write_relocs): Add file name and line number to - as_fatal calls. Handle bfd_reloc_overflow case specifically when - RELOC_EXPANSION_POSSIBLE. - -Fri Sep 23 16:11:28 1994 Ken Raeburn - - * as.h (USE_STDARG, USE_VARARGS): Define one or neither of these - here. Use them for deciding which PRINTF*LIKE macro definitions - to use. - * messages.c: Use them, instead of NO_STDARG, NO_VARARGS. - [!USE_STDARG && !USE_VARARGS] (va_alist, va_dcl, ...): Provide - default definitions matching what we were doing before. - (as_tsktsk): Remove the non-stdarg, non-varargs version, and - always use the varargs form if not using stdarg. It's safe to - always use vfprintf, because libiberty will provide it if the - native system doesn't. Also, always make format be const. - (as_warn, as_warn_where, as_bad, as_bad_where, as_fatal): Ditto. - -Fri Sep 23 14:42:34 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-mips.c (load_register): Always use addiu when adding a - constant to $zero--no need to use daddiu. - (macro): Hack the -mips3 overflow tests to not fail when offsetT - is only 32 bits. - - * symbols.h (copy_symbol_attributes): Declare. - -Thu Sep 22 21:58:24 1994 Ken Raeburn - - * listing.c: Bugfixes based in part on patches from Paul - Kranenburg. - (listing_newline): Check filename as well as line number when - deciding whether to record it. - (list_symbol_table) [S_IS_REGISTER]: Check that S_IS_REGISTER is - false (if defined) as well as checking for reg_section. - (listing_listing): Iterate fetching lines while line number is too - low, and we haven't run off the end of the input file. - - * config/vms-conf.h: Changed HAVE_DELETE to HAVE_REMOVE. - -Thu Sep 22 13:39:10 1994 Kung Hsu (kung@x1.cygnus.com) - - * ecoff.c (ecoff_generate_asm_lineno): check if - current_stabs_filename is NULL before strcmp. - * read.c (read_a_source_file): fix a bug in generate_asm_lineno - checking. - -Wed Sep 21 18:17:35 1994 Ken Raeburn - - * config/ho-*.h: Now-unused files deleted. - - * symbols.c (copy_symbol_attributes): New function. Copies BFD - symbol flags and calls OBJ_COPY_SYMBOL_ATTRIBUTES. - (resolve_symbol_value, case O_symbol): Call it, if X_add_number is - zero. Don't call obj_frob_forward_symbol. - * read.c (pseudo_set): Call copy_symbol_attributes, but only if - X_add_number is zero. - * config/obj-elf.h (obj_frob_forward_symbol): Deleted. - - * config/tc-i960.c: Lots of whitespace, comment reformatting, - using GNU indent. - (strchr): Don't declare. - [BFD_ASSEMBLER]: Don't compile md_convert_frag, - md_estimate_size_before_relax, md_ri_to_chars, - md_create_short_jump, md_create_long_jump. - (brtab_emit): Use data_section, not SEG_DATA. - - Mon Sep 19 17:14:44 1994 Pat Rankin (rankin@eql.caltech.edu) - - * config/vms-conf.h: new file, manually derived from conf.in. - * config-gas.com: use it, and eliminate obsolete "host.h". - -Wed Sep 21 11:11:30 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-ppc.c (ppc_current_block): New static variable. - (ppc_stabx): Set sy_tc.within of a C_STSYM symbol to - ppc_current_block. Don't move around any stab symbol, just those - for common symbols. - (ppc_bs): Set ppc_current_block. - (ppc_es): Clear ppc_current_block. - (ppc_frob_symbol): Set the value of a C_STSYM symbol to the offset - from the csect of the enclosing block. - - * config/tc-mips.c (insns_since_cache_access): Remove. - (append_insn): Remove setting of insns_since_cache_access, and - special 4600 handling; it turns out not to be required. - -Tue Sep 20 16:13:18 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-mips.c (md_shortopts): Remove E. - (md_longopts): Add EB and EL. - (md_parse_option): Handle -EB and -EL as separate options, rather - than as a single -E option with an argument. - -Mon Sep 19 12:42:05 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (hppa_fix_adjustable): Reject reductions - involving global symbols too. - -Mon Sep 19 12:12:46 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * as.h: Test NEED_DECLARATION_*, not NEED_*_DECLARATION. - - * configure.in: Test for remove, not delete. Fix cross-assembler - test. - * as.h: Test HAVE_REMOVE, not HAVE_DELETE; define unlink to - remove, not delete. - - * read.c (pseudo_set, case O_symbol): If - OBJ_COPY_SYMBOL_ATTRIBUTES is defined, invoke it. - [BFD_ASSEMBLER]: Copy BSF_FUNCTION setting too. - * config/obj-elf.h (OBJ_COPY_SYMBOL_ATTRIBUTES): Define. - - Wed Aug 10 19:15:30 1994 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.h (DSG_S_C_UBITU, DST_K_VFLAGS_DSC, DST_K_TS_ATOM, - many others): new macros; values obtained from "DSTRECRDS.SDL". - * config/obj-vms.h (various): use them. - (USE_BITSTRING_DESCRIPTOR): new macro, for selecting bitfield - representation (only enum bitfields can avoid being bitstrings). - (bitfield_suffix, setup_basic_type): new routines. - (VMS_typedef_parse): use them. Now recognize bitfields of all - integral types, not just type `int'. Caveat: the representation - used for bitfields still does not work for objects placed in - registers, and gcc's optimizer sometimes puts small structs there. - - Tue Jun 14 17:31:44 1994 Pat Rankin (rankin@eql.caltech.edu) - - * read.c (s_text) [#if OBJ_VMS]: clear the IN_DEFAULT_SECTION - bit from const_flag. - * config/obj-vms.h (IN_DEFAULT_SECTION): define this macro. - (tc_frob_label): define this to call vms_check_for_special_label, - and declare the latter. - * config/obj-vms.c (vax_g_doubles): declare this file-scope - variable. - (const_flag): initialize to IN_DEFAULT_SECTION instead of 0. - (vms_check_for_special_label): new routine (tc_frob_label). - (VMS_TBT_Routine_End): don't bother checking for `gcc_compiled.' - and `gcc2_compiled.' labels; they won't reach here any more. - (VMS_typedef_parse) [case 'r']: for types `double' and `complex - double', use `vax_g_doubles' flag to select type of double. - (VMS_write_object_file) [traceback setup]: don't pass symbols - with the IN_DEFAULT_SECTION attribute to the TBT_Routine_Begin - and TBT_Routine_End functions. - - Mon Jun 6 20:52:20 1994 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.c (VMS_TBT_Routine_End): cache the result of - S_GET_VALUE() to avoid many repeated function calls. - (VMS_Check_For_Main) [#if HACK_DEC_C_STARTUP]: capitalize - _C$MAIN_ARGS in advance, in case -h3 (leave symbol name as-is) - gets requested. [All the HACK_DEC_C_STARTUP code appears to - be obsolete; gcc does it automatically for vms target. It's - also misnamed, because it is for the "VAX C" run-time library, - not the newer "DEC C" one which has much different startup code.] - {various}: use `S_SET_xxx(symbol,new_value)' rather than - `S_GET_xxx(symbol) = new_value'. - -Mon Sep 19 12:05:03 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/obj-coff.c (c_dot_file_symbol): Use bfd_abs_section_ptr, - not &bfd_abs_section. - -Thu Sep 15 18:36:34 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * expr.c (clean_up_expression): Use addressT, not bfd_vma. - -Tue Sep 13 20:05:47 1994 Jeff Law (law@snake.cs.utah.edu) - - * expr.c (expr): Don't reduce the difference of two symbols in the - same frag if the symbols are not in normal sections. - - * config/obj-som.h (S_SET_OTHER, S_SET_TYPE): Delete a.out crud. - (S_SET_DESC, S_GET_OTHER, S_GET_TYPE, S_GET_DESC): Likewise. - (obj_attach_unwind_info): Do not define. Not needed anymore. - * config/tc-hppa.c: Delete whitespace at EOL. - (struct hppa_fix_struct): Delete fx_unwind field and all references. - (fix_new_hppa): Last arg is now a pointer to an int. Do not - call obj_attach_unwind_info anymore. For SOM R_ENTRY and R_EXIT - fixups, store 32bits of unwind information in the fx_addnumber - field of the fixup. - (md_assemble, pa_entry, process_exit, pa_procend): For SOM R_ENTRY - and R_EXIT fixups, pass a NULL pointer to fix_new_hppa, and a - pointer to 32 bits of unwind info. - (tc_gen_reloc): For SOM R_ENTRY and R_EXIT fixups, set the symbol - pointer to the dummy symbol; set the addend field to fx_addnumber. - (pa_comm, pa_equ, pa_type_args, pa_import): Use bfd_XXX_section_ptr - rather than &bfd_XXX_section. - -Tue Sep 13 21:15:36 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/tc-i386.c (md_apply_fix_1): For GOTPC relocs, decrement - value by one; discard adjustments previously being made. From - Eric Youngdale. - - VMS- and Vax-related changes from Pat Rankin: - * Makefile.in (VMS_OTHER_OBJS): add concat, getopt, and getopt1. - * vmsconf.sh: no longer have make-gas.com echo text about needing - to modify the gcc-vms driver when intending to use with gcc 1.x. - * as.c (parse_options): suppress 'v' from std_short_options and - eliminate VMS-specific conditional initialization; - [default case]: check for '-v' if md_parse_options doesn't recognize - an option; - [default case, #if VMS]: check for filename argument when '-v' seen; - [case 'v']: delete. - * config/tc-vax.c (md_assemble): don't rely on `this_add_number' - for O_big literal operands (double floats and long long ints); - [VMS, md_shortopts]: add second colon after 'v'; - (md_parse_options) [VMS, case 'v']: check for argument, so - caller can handle `-v' w/o arg. - -Tue Sep 13 16:45:08 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * config/obj-coff.c (do_relocs_for): If TC_KEEP_FX_OFFSET - is defined, put the tx_offset into the r_offset. - * config/tc-sh.c (line_comment_chars): Add # - (tc_reloc_mangle): Deleted. - * config/tc-sh.h (TC_KEEP_FX_OFFSET): Define. - (TC_RELOC_MANGLE): Delete. - -Tue Sep 13 16:20:36 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * flonum-konst.c: Change preprocessor tests of HO_VMS to just VMS. - * hex-value.c: Ditto. - * config/obj-vms.c: Ditto. - - * config/tc-sparc.c (sparc_ip): Replace as_bad/exit sequence with - a call to as_fatal. - * config/tc-i860.c (i860_ip): Ditto. - * config/tc-hppa.c (pa_ip): Ditto. - * config/tc-alpha.c (alpha_ip): Ditto. - * as.c (parse_args): Ditto. - - * config/tc-mips.c (mips_ip): Replace as_warn/exit sequence with a - call to as_fatal. - - * write.c (write_contents): Use EXIT_FAILURE. - * output-file.c (output_file_create, output_file_close, - output_file_create, output_file_close): Ditto. - * messages.c (as_fatal): Ditto. - * config/obj-som.c (obj_som_version, obj_som_copyright): Ditto. - * config/obj-ieee.c (write_object_file): Ditto. - * config/obj-coff.c (write_object_file): Ditto. - * config/tc-vax.c (main): Use EXIT_SUCCESS. - * config/tc-m68k.c (main): Ditto. - - * hash.c (main): Pass a value to exit(). - - * as.h (EXIT_SUCCESS, EXIT_FAILURE): Moved here. - * as.c: ...from here. - (parse_args): Use them always. - (main): Use exit rather than return. - - * Makefile.in (*_FOR_TARGET, INSTALL_XFORM, install, uninstall): - Rewrite handling of program_transform_name. - - * configure.in: Test for functions unlink and delete. - * as.h: If unlink isn't available but delete is, define unlink to - be delete. - - Update for autoconf 1.118: - * gdbinit.in: New file, created from old .gdbinit. - * .gdbinit: Deleted. - * aclocal.m4 (GAS_GDBINIT): Deleted. - * configure.in: Don't use it. Instead, generate .gdbinit from - gdbinit.in. Don't substitute cpu_type, obj_format, emulation, - atof. Switched order of AC_LINK_FILES arguments. Use AC_PREREQ - to ensure that older versions of autoconf aren't used. - * Makefile.in: Added @configure_input@ line. - (configure): Deleted rule. - -Tue Sep 13 12:08:20 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/obj-coff.c (fixup_segment): After handling the difference - of two symbols from the same segment, set fx_subsy to NULL, to - satisfy existing TC_COUNT_RELOC macros. - -Tue Sep 13 01:47:08 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * aclocal.m4 (GAS_GDBINIT): New macro. - * configure.in: Use it. - * configure: Regenerated. - -Mon Sep 12 20:56:38 1994 Ken Raeburn (raeburn@kr-laptop.cygnus.com) - - * .gdbinit (pe, ps): Define new commands. - * symbols.c (indent_level): New static variable. - (indent, print_expr_1, print_symbol_value_1, print_symbol_value, - print_expr): New functions. - - * Makefile.in (config-stamp): Add a "this file generated by make" - message to config.h. - - PIC implementation for i386-linux, based on code from Eric - Youngdale and Paul Kranenburg, with some work of my own: - - * write.c (fixup_segment): Test TC_RELOC_RTSYM_LOC_FIXUP on fixup - before processing same-section pcrel relocations. - (TC_RELOC_RTSYM_LOC_FIXUP): Default to 1. - - * expr.c (make_expr_symbol): If operator is O_symbol and - X_add_number is zero, just return the symbol. If operator is - O_constant, resolve the symbol's value before returning. - (operand): Permit use of "[]" for grouping. - (clean_up_expression): For difference of two symbols in the same - frag, add the difference of their offsets into X_add_number. - (expr): Reduce difference of two symbols in same frag to their - difference. - - * config/tc-i386.c (TC_RELOC): New macro. - (struct _i386_insn): New field disp_reloc. - (GOT_symbol): New variable. - (operand_special_chars): Added square-brackets and at-sign. - (reloc) [BFD_ASSEMBLER]: Added new argument OTHER; if it is not - NO_RELOC, just return it. - (reloc) [! BFD_ASSEMBLER]: Add third argument to dummy macro. - (BFD_RELOC_386_PLT32, _GOT32, _GOTOFF) [! BFD_ASSEMBLER]: More - dummy macros. - (tc_i386_fix_adjustable): New function. Returns zero if symbol in - fixup is not local, to prevent relocations against externals from - being dropped. - (md_assemble): Initialize disp_reloc field to NO_RELOC. Pass - disp_reloc field to reloc() function, and use TC_RELOC to generate - value to pass to fix_new_exp. - (md_assemble): Change 32-bit reloc against GOT_symbol into a GOTPC - reloc. - (i386_operand): Initialize disp_reloc field to NO_RELOC. Handle - @GOTOFF, @PLT, @GOT operands. For GOTOFF relocations with local - symbols, force generation of the section symbol. - (md_estimate_size_before_relax): If GOT_symbol exists, decide - we're generating PIC code, and convert relocations against - undefined symbols from PCREL to PLT32. - (md_apply_fix_1) [OBJ_ELF]: Fix up values for dynamic-linking - relocs. - (md_undefined_symbol): Notice GLOBAL_OFFSET_TABLE_NAME and set - and return GOT_symbol if it matches. - (F, MAP): Move macro definitions outside function. - (tc_gen_reloc): Only switch on size and pcrel if code wasn't - already supplied as PLT32. GOT32, GOTOFF, or GOTPC. Convert - BFD_RELOC_32 using GOT_symbol into GOTPC. - * config/tc-i386.h (TC_RELOC, tc_fix_adjustable, - TC_RELOC_GLOBAL_OFFSET_TABLE, TC_RELOC_RTSYM_LOC_FIXUP): New - macros. - (NEED_FX_R_TYPE): Define. - (LOCAL_LABEL): Accept ".X" prefix too. - (GLOBAL_OFFSET_TABLE_NAME): Default to "_GLOBAL_OFFSET_TABLE_". - -Mon Sep 12 17:51:39 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/obj-elf.c (obj_elf_type): Rewrite to accept syntax - reportedly to be used on Irix 6. - - * config/tc-mips.c (md_pseudo_table): Handle .globl and .global. - (s_mips_globl): New static function; needed for Irix 5 support. - * ecoff.c (ecoff_build_symbols): If BSF_FUNCTION is set for an - external symbol with no type, set the type to st_Proc rather than - st_Global. Don't set the index of an external st_Proc or - st_StaticProc symbol unless it is also a local symbol. - - * read.c (read_a_source_file): The second argument to as_where is - unsigned int *, not int *. - -Thu Sep 8 17:18:24 1994 Kung Hsu (kung@mexican.cygnus.com) - - * config/obj-ecoff.h : Change names to OBJ_GENERATE_ASM_LINENO, - and generate_asm_lineno. - * config/obj-elf.h : ditto. - * read.h : ditto. - * read.c (read_a_source_file): if no file when inst is read, set - generate_asm_lineno to true. - * ecoff.h : change name to generate_asm_lineno and add function - ecoff_no_current_file. - * ecoff.c : change name to generate_asm_lineno. - * ecoff.c (ecoff_generate_asm_lineno) : new function, to generate - ecoff style line for asm file. - -Thu Sep 8 19:43:49 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/obj-coff.c (size_section): Do an fprintf to stderr rather - than a printf. - (fixup_segment): Use as_bad_where rather than as_bad. - -Wed Sep 7 17:21:12 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * config/tc-{h8300,sh}.[ch] (tc_coff_symbol_emit): Function doing - nothing becomes macro doing nothing. - -Wed Sep 7 19:10:09 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * Makefile.in (Makefile): Depend on config.status. - (config.status): Run config.status from . instead of srcdir. - - * config/tc-i386.c (tc_gen_reloc): Use bfd_get_reloc_code_name to - display the name of the relocation type that couldn't be handled. - * config/tc-sparc.c (tc_gen_reloc): Likewise. - * config/tc-alpha.c (tc_gen_reloc): Likewise. Deleted abort call - after call to as_fatal. - - * configure.in (i386-*-linux*): Don't set bfd_gas. - - * Makefile.in (CC_FOR_TARGET, NM_FOR_TARGET, OBJDUMP_FOR_TARGET, - install, uninstall): Don't use "brokensed" hack any more, the new - autoconf code should never let program_transform_name be empty. - - Update for autoconf beta 1.112: - * aclocal.m4 (GAS_CHECK_DECL_NEEDED, GAS_WORKING_ASSERT): New - macros. - * configure.in: Use them. Use AC_ARG_PROGRAM (now provided by - autoconf) instead of my hacked-up AC_PROGRAM_TRANSFORM_NAME. Move - test for CROSS_COMPILE just before AC_FUNC_ALLOCA, and emit a - message to try to ease confusion about autoconf's - "cross-compiling" message. - * acconfig.h (NEED_DECLARATION_MALLOC, NEED_DECLARATION_FREE, - NEED_DECLARATION_ERRNO): Renamed from NEED_*_DECLARATION. - * configure, conf.in: Regenerated. - -Wed Sep 7 12:49:55 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * configure.in: Check ${host} and ${target} rather than - ${host_canon} and ${target_canon}. - * configure: Likewise. - -Tue Sep 6 11:42:38 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-mips.c (mips_cpu): New static variable. - (insns_since_cache_access): New static variable. - (md_begin): Set mips_cpu as well as mips_isa. - (append_insn): If mips_cpu is 4600, require four nop instructions - between an instruction which accesses the cache and certain CACHE - instructions. Keep track of the number of instructions seen since - an instruction which accesses the cache. - (md_parse_option): Set mips_cpu as well as mips_isa. - -Mon Sep 5 07:09:00 1994 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * doc/Makefile.in (VPATH): Define using @srcdir@. - (prefix, program_transform_name, exec_prefix): Use autoconf style - @-substitutions. - -Sun Sep 04 17:58:10 1994 Richard Earnshaw (rwe@pegasus.esprit.ec.org) - - * config/ho-riscix.h, config/tc-arm.c, config/tc-arm.h: New files - * configure.in: Recognize the arm. - -Fri Sep 2 16:05:50 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * ecoff.c (add_file): Don't try to generate line numbers if the - symbol table has been frozen. - -Thu Sep 1 19:48:01 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * aclocal.m4 (AC_PROG_CC): Use AC_DEFUN, and omit AC_PROVIDE. - - * configure.in: Handle user-specified bfd-assembler option with - separate variable from preferred configuration, until the two are - resolved. Indicate bfd_gas=preferred for linux a.out. Use - AC_PROGRAM_TRANSFORM_NAME, for which a patch has been sent to djm. - * Makefile.in (target_alias, program_transform_name): Define, - using autoconf @-substitutions. - -Wed Aug 31 17:43:06 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * atof-generic.c: Deleted alloca handling here. - - * Makefile.in (prefix, exec_prefix): Use @-subtitutions. - - * aclocal.m4 (AC_OUTPUT_LINKS): Deleted redefinition, since - autoconf 1.109 has this fixed. - * configure.in: Don't change quote characters around AC_MSG_ERROR - invocation. Don't use AC_HEADER_STDC, since it requires running a - program. Cache NEED_*_DECLARATION values. - * configure, conf.in: Regenerated with a modified autoconf 1.109. - - * as.h (volatile): Don't test or define here; not needed. - (alloca): Replace alloca-conf.h inclusion with code recommended in - autoconf documentation. Include config.h first. - -Wed Aug 31 11:20:48 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/obj-coff.h (S_IS_DEFINED): Absolute symbols are defined - also. - - * configure.in, configure: Initialize bfd_gas to no. - -Tue Aug 30 19:31:14 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * as.h: Include alloca-conf.h from "libiberty", not - "../libiberty". - -Mon Aug 29 16:11:30 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-ppc.c (md_apply_fix): Don't generate a reloc when a - symbol is used as an offset into a CSECT that is not a TOC. These - types of loads are generated by gcc -mminimal-toc. - -Sun Aug 28 13:22:52 1994 Ken Raeburn (raeburn@rtl.cygnus.com) - - * as.h (flag_*): Added comments describing meanings of some of - these variables. - (struct frag): Add some comments about the ns32k-specific fields - and why they're here. - (SIZEOF_STRUCT_FRAG): Cast addresses to char*, not int. - (flag_print_statistics): Declare. - - * as.c (parse_args): Set flag_print_statistics instead of - statistics_flag. Options array is now const. Added new option - "dump-config"; if specified, print TARGET_ALIAS, TARGET_CANONICAL, - TARGET_CPU, TARGET_OBJ_FORMAT, and TARGET_FORMAT, if defined. - (main): Change test to check flag_print_statistics. - (statistics_flag): Deleted. - - * frags.c (frag_variant): Removed PCREL_ADJUST and BSR arguments. - Always initialize them to zero. - * frags.h (frag_variant): Fixed prototype. - * config/tc-i960.c (get_cdisp): Don't pass the extra zero args. - * config/tc-ns32k.c (convert_iif): Don't pass the arguments; cache - the value of frag_now and fill in the fields later. - - * Makefile.in (distclean, realclean): Remove new - configure-generated files. - -Sat Aug 27 20:26:12 1994 Ken Raeburn (raeburn@kr-laptop.cygnus.com) - - Conversion to autoconf: - * acconfig.h, aclocal.m4: New files. - * configure.in: Rewritten (except for some target-specific code) - for autoconf. - * conf.in, configure: New files, generated from the above. - * Makefile.in: Changed magic sequence indicating insertion of - makefile fragments. - (VPATH, srcdir, CC, LIBS, OBJS dependencies): Use @-substitutions - from configure. - (LINKED_HEADERS): Deleted a.out.gnu.h, a.out.h, and host.h. - (config.status, configure): Rewrite rules. - (config-stamp): Depend on conf. Skip variables that configure is - now substituting itself. - (*.o dependencies): Deleted host.h. - (distclean, realclean): Don't delete host.h. - * as.c: Don't include stdio.h, string.h, sys/types.h. Include - signal.h after as.h. - * as.h: Include alloca-conf.h first. Include ctype.h, string.h, - strings.h, stdlib.h, unistd.h, sys/types.h, fopen-bin.h, - fopen-same.h, as suggested by autoconf test results. - [BROKEN_ASSERT]: Don't include assert.h. - (strdup): Declare. - (volatile, const): Define if not __STDC__ and not already defined. - (malloc, realloc) [NEED_MALLOC_DECLARATION]: Declare. - (free) [NEED_FREE_DECLARATION]: Declare. - * gasp.c: Include config.h, stdlib.h (if HAVE_STDLIB_H). Don't - include host.h. - (malloc) [NEED_MALLOC_DECLARATION]: Declare. - * messages.c: Include as.h first. Include errno.h only if - HAVE_ERRNO_H. If HAVE_VARARGS_H and not __STDC__, undefine - HAVE_STDARG_H. Set NO_STDARG and NO_VARARGS as appropriate. - * doc/Makefile.in (srcdir, INSTALL, INSTALL_PROGRAM, - INSTALL_DATA): Use autoconf @-substitutions. - - * input-file.c: Don't include assert.h here, 'cause as.h already - includes it. - - * config/tc-alpha.c: Added various prototypes for static - functions. - (in_range): New function, tests whether a value can fit in an - N-bit field. - (build_mem, build_operate_n): New functions for constructing - opcode values. - (emit_sll_n, emit_ldah_num, emit_addq_r, emit_lda_n): New - functions for emitting single instructions, no longer requiring a - recursive call to md_assemble. - (emit_add64): New function for expanding a REG:=REG+CONST - operation into one or more instructions, to handle wide constants. - (clear_insn): New variable. - (md_begin): Fill it in with zeros and BFD_RELOC_NONE values. - (alpha_ip): Use it to initialize local variable insns. - (alpha_ip, label "immediate" and cases 'P', 'G'): Use emit_add64 - for calculations. - -Fri Aug 26 14:46:15 1994 Ken Raeburn (raeburn@kr-laptop.cygnus.com) - - * subsegs.c (section_symbol): Reverse still-wrong test of - EMIT_SECTION_SYMBOLS. - - * write.c (BFD_FAST_SECTION_FILL): Always define. - (write_contents): If fill_size is 1, use memset instead of looping - calling memcpy. - -Wed Aug 24 12:46:08 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-mips.h (LOCAL_LABEL): Define as 0, for compatibility - with native MIPS assembler. - * configure.in (mips-*-irix*): Don't set emulation. - * config/te-irix.h: Remove. - - * ecoff.c (ecoff_symbol_new_hook): Don't add a new file if we - haven't seen any input files yet. - * config/tc-alpha.c (md_begin): Just call symbol_create, rather - than calling symbol_new and then removing the symbol from the - list. - - * as.c (main): Move a inside the #if 0 block which uses it. - * ecoff.c (current_stabs_filename): Make const. - * frags.h (frag_align_pattern): Declare. - * gasp.c (new_file): Cast isp to long, and use %ld to print it. - * config/tc-alpha.h (md_operand): Add cast to void. - (alpha_do_align): Declare argument types. - (tc_get_register): Declare. - (alpha_frob_ecoff_data): Declare. - * config/tc-alpha.c: Include . - (s_mask): Don't declare; does not exist. - (line_comment_chars): Remove /* from descriptive comment. - (tc_get_register): Remove unused local reg. - (tc_gen_reloc): Don't bother to compare unsigned to zero. - (s_base): Correct warning to actually print register number. - (md_begin): Remove unused locals retval, lose, and i. - (alpha_fix_adjustable): Move default case inside switch to avoid - warning. - (load_symbol_address): Remove unused locals reloc_addr, p, sym, - and addend. - (emit_byte_manip_r): Declare types for all arguments. - (emit_extract_r, emit_insert_r, emit_mask_r): Likewise. - (emit_sign_extend, emit_bis_r, s_proc): Likewise. - (alpha_ip): Use sprint_value to print offsetT value. Remove - unused local size. Remove unused label get_macro. - (alpha_do_align): Make fill const. - (md_apply_fix): Remove unused label check_zov. - - * configure.in: Recognize i586 as a synonym for i[34]86. - -Tue Aug 23 12:32:14 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/obj-coff.c (c_line_new): Change line_number argument from - unsigned short to int so that the type in the prototype matches - the promoted type in the definition. - (stack_delete): Comment out; not used. - * config/obj-coff.h (tc_coff_symbol_emit_hook): Declare if not - BFD_ASSEMBLER, not if BFD_ASSEMBLER. Declare argument type. - * config/tc-m68k.h (tc_coff_sizemachdep): Declare. - * config/tc-m68k.c (tc_coff_symbol_emit_hook): Add ignored - argument. - -Tue Aug 16 01:48:20 1994 Jeff Law (law@snake.cs.utah.edu) - - * gas/config/tc-hppa.c (pa_comm): Undo last change. Set sy_frag for - the common symbol to the zero address frag (the correct fix). - -Tue Aug 16 01:48:20 1994 Jeff Law (law@snake.cs.utah.edu) - - * gas/config/tc-hppa.c (pa_comm): Undo last change. Set sy_frag for - the common symbol to the zero address frag (the correct fix). - - * config/tc-hppa.c (pa_comm): Set sy_resolved for the common - symbol. - -Fri Aug 12 17:51:48 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-mips.c (md_begin): Drop "el" from the end of - TARGET_CPU. Check for mips64orion. - -Tue Aug 9 19:43:45 1994 Stu Grossman (grossman@cygnus.com) - - * configure.in: Recognize ppc-*-netware. - * config/te-ppcnw.h: New file to support Power-PC/Netware - configurations. Currently, it just enables the use of backslash - escapes in string directives. - -Tue Aug 9 11:12:13 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-ppc.c (ppc_stabx): Call expression directly, rather - than via pseudo_set. If expression is a symbol, move stab symbol - to just after symbol from expression. - - * ecoff.c (ecoff_build_procs): Don't force adr of first fdr to be - zero. Undoes change of June 4, 1993. - - * config/tc-mips.c (md_parse_option): Accept -mcpu=4400, 4600, and - orion. - -Mon Aug 8 16:28:08 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * as.h: Remove FOPEN_WB patch of Aug 6. - * configure.in: Configure for ho-go32 correctly. - * config/ho-go32.h: Fix copyright. - -Mon Aug 8 11:59:51 1994 Jeff Law (law@snake.cs.utah.edu) - - * gas/config/tc-hppa.c (md_pseudo_table): Delete redundant - upper-case versions of the pseudo-ops. - -Mon Aug 8 13:42:16 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-sparc.c (md_apply_fix): If we are going to generate a - non PC relative reloc, don't put the addend in the object file. - -Sat Aug 6 01:15:02 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * as.h: If FOPEN_WB is not defined, do the right thing in a go32 - environment. - -Mon Jul 11 11:34:52 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * config/tc-h8300.c (pint): New function for handling varying - size of int pseudo op. - * doc/as.texinfo: Fix typo describing .h8300h pseduop. - -Mon Aug 1 02:40:43 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (create_new_space): Initialize sd_subspaces - field in the space chain. - - * config/tc-hppa.c (tc_gen_reloc): Cast return value from - hppa_gen_reloc_type. - -Thu Jul 28 15:45:37 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/tc-sparc.c (sparc_ip): Check more carefully for - conflicting architectures. - (md_parse_option) [NO_V9]: Complain if v9 was selected. - (md_show_usage): Derive architecture list in usage message from - architecture_pname array. - (cypress): Macro deleted. - (op_hash): Don't initialize. - (s_common): Use bfd_und_section_ptr instead of bfd_und_section. - - * config/tc-sparc.c (BSR): New function. - (sparc_ip): Use it for right-shift operations of 32 bits or more. - - * config/tc-sparc.c (sparc_ip): Implement new operand type 'x'. - -Tue Jul 26 18:21:24 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/obj-coff.h: Moved common includes and TARGET_FORMAT - definitions together. - (WORKING_DOT_WORD, WARN_SIGNED_OVERFLOW_WORD, - OBJ_COFF_OMIT_OPTIONAL_HEADER, BFD_HEADERS, BFD) [!BFD_ASSEMBLER]: - Moved these definitions to the start of the file, before the - includes. - (SYMBOLS_NEED_BACKPOINTERS, OBJ_COFF_MAX_AUXENTRIES): Always - define these. - (S_GET_ZEROES): Deleted. - (S_SET_ZEROES): Moved to obj-coff.c. - - * config/obj-coff.c (obj_coff_* psuedo-op fns): Deleted - forward declarations. - (obj_pseudo_table): Moved to one version end of file, - conditionalized internally. - (stack typedef, stack_init, stack_delete, stack_push, stack_pop, - tag_hash, tag_init, tag_insert, tag_find, tag_find_or_make): Moved - to one combined version at top of file, unconditional. Deleted - forward declarations. - (s_get_name): Moved one copy of declarations to start of file. - (def_symbol_in_progress): Ditto. Don't initialize. - (S_SET_ZEROES): Moved here from obj-coff.h. - (write_object_file): If TC_COFF_SET_MACHINE is defined, call it on - the file headers. - - * config/obj-coff.c (seg_info_off_by_4): Now const and static. - (SEG_INFO_FROM_SEG_NUMBER): Unused macro deleted. - (previous_file_symbol, def_symbol_in_progress, symbol_externP, - symbol_extern_lastP, last_functionP) [!BFD_ASSEMBLER]: Don't - bother explicitly initializing to zero value. - - * config/obj-coff.c (fixup_segment) [TC_I960]: Use SF_GET_BALNAME - and SF_GET_CALLNAME instead of the TC_S_IS_ versions. - - * config/tc-i960.h (TC_COFF_SET_MACHINE): New macro. Calls - tc_headers_hook. - - * config/tc-i960.c (targ_has_iclass): Use I_CX | I_CX2 where I_CX - was used previously. - (tc_headers_hook): If I_CX2 is found, set flags to F_I960CA. - - * config/tc-i960.c (po_hash): Declaration deleted. - (next_object_file_charP): Ditto. - (regnames, aregs, coj): Now const. - (parse_memop): Static array def_scale now const. - (md_begin): Cast away const when passing hash routines addresses - of values in regnames or aregs. - (md_longopts): Added "link-relax" and "no-relax" hyphenated forms. - Continue to accept one-word forms. - (struct tabentry, arch_tab): Moved to top level from inside - md_parse_option. Now const. - (md_show_usage): Use arch_tab to generate usage message. Print - hyphenated forms of relax options. - - * config/tc-i960.h (DEFINE_I960_AOUT, TC_S_IS_*, TC_S_*_SYSPROC, - TC_S_FORCE_TO_*): Moved from here... - * config/tc-i960.c: ... to here. Changed DEFINE_I960_AOUT stuff - to test OBJ_AOUT and OBJ_BOUT directly. - - * config/tc-i960.h (CTRL, COBR, COJ, REG, MEM*, FBRA, CALLJ, - M1-M3, REG_OPC, R_*, SFR, LIT, FP, OP, R, RS, RL, RSL, F, - {R,F}{,L}{2,4}, M, SFR_OK, LIT_OK, FP_OK, REG_ALIGN, MEMOP, I_*): - Macros deleted. - - * config/tc-i960.c (ARCH_JX): Define. - (arch_tab): Include JX. - (targ_has_sfr, targ_has_iclass): Handle JX. - (tc_headers_hook): Set flags to F_I960JX for i960JX. - -Fri Jul 15 15:36:51 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * subsegs.c (section_symbol): Had last change backwards. - -Thu Jul 14 13:21:06 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/atof-ns32k.c: Deleted. - - * config/obj-aout.c (obj_aout_frob_symbol): Use - bfd_ind_section_ptr and bfd_und_section_ptr. - - * subsegs.c (subseg_set_rest): Compare segT values directly, - without casting to int first. - - * config/tc-ns32k.c (md_begin): Return value from hash_insert - should be pointer to const. Don't call exit explicitly after - calling as_fatal; it won't return. - (convert_iif): Make local variable j be pointer to bit_fixS, since - that's how it's used. - (encode_operand, case 'b'): Ignore sprintf return value. Don't try - converting freeptr to int and back. - - Merged in NS32K support update from Ian Dall (dall@hfrd.dsto.gov.au): - - * config/te-pc532mach.h: New file. pc532-mach target emulation. - - * config/te-netbsd532.h: New file. Netbsd532 target emulation. - - * config/tc-ns32k.h: Add definition of NOP_OPCODE. - - * config/tc-ns32k.h: Add prototype for fix_new_ns32k_exp. - - * config/tc-ns32k.h: Add BFD_ASSEMBLER support. - - * config/tc-ns32k.c (tc_gen_reloc): New function for BFD_ASSEMBLER. - - * config/tc-ns32k.c (fix_new_ns32k_exp): Get reloc type - differently for BFD_ASSEMBLER. - - * config/tc-ns32k.c (md_estimate_size_before_relax): Get reloc - type differently for BFD_ASSEMBLER. - - * config/tc-ns32k.c (md_create_long_jump): Size of opcode is one - not 2. - - * config/tc-ns32k.c (md_convert_frag): Code for the BFD_ASSEMBLER - case. Also use smart md_pcrel_adjust function. - - * config/tc-ns32k.c (md_apply_fix): Code for the BFD_ASSEMBLER - case. Also use smart md_fix_pcrel_adjust function. - - * config/tc-ns32k.c (md_fix_pcrel_adjust): New function which can - find offset from opcode to operand even if in another frag - and in the presence of relaxing. - - * config/tc-ns32k.c (md_pcrel_adjust): New function which can - find offset from opcode to operand even if in another frag - and in the presence of relaxing. - - * config/tc-ns32k.c (md_number_to_disp): Check ranges properly. - - * config/tc-ns32k.c (md_atof): use atof_ieee instead of special - atof_ns32k. - - * config/tc-ns32k.c (reloc): New (static) function for - BFD_ASSEMBLER. - - * config/tc-ns32k.c (convert_iif): More correct pc relative code. - md_relax must be able to find opcode address even if in another frag. - - * config/tc-ns32k.c: More extensive comments. - - * config/tc-ns32k.c (encode_operand): Support new operand classes I - and Z. Drop Q. - - * config/tc-ns32k.c (fix_new_ns32k_exp): new function and - corresponding prototype. - - * config/tc-ns32k.c: make 32532 default machine instead of 32032. - - * config/tc-ns32k.c: include opcode/ns32k.h after as.h - - * aout_gnu.h: r_disp needs to be 2 bits for TC_NS32K - - * write.h: fx_im_disp needs to be 2 bits big for TC_NS32K - - * write.c (relax_segment): Use TC_PCREL_ADJUST macro (if defined) - instead of adding pcrel_adjust. - - * write.c (write_object_file): Adjust to_addr for the - BROKEN_DOT_WORD feature for the BFD_ASSEMBLER case. - - * write.c (write_object_file): Use TC_CONS_FIX_NEW if it is defined. - - * write.c (write_contents): Add code (currently if - BFD_FAST_SECTION_FILL is defined) to make large fills a lot faster. - - * configure.in: Remove ns32k from special FP list. All the ns32k - series use ieee float. - - * configure.in: Add ns32k-pc532-mach and ns32k-pc532-netbsd targets - - * as.h: include expr.h before targ-env.h. Some target dependent file - want to use expr structures. - -Wed Jul 13 14:49:05 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-m68k.c (m68k_ip): Change rp to be a const pointer. - (md_parse_option): Clear cpu field of current_architecture before - setting a new cpu type. Clear no_68881 for m68881 or m68882. - Clear no_68851 for m68851. - -Tue Jul 12 21:27:05 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/ho-sysv.h (realloc): Declare. - - * symbols.c (symbol_create): New function, most of the guts of the - old symbol_new function. - (symbol_new): Now just checks symbol_table_frozen, calls - symbol_create, and enters the symbol into the symbol table. - * subsegs.c (section_symbol): If EMIT_SECTION_SYMBOLS is not true, - and the symbol table is frozen, call symbol_create instead of - symbol_new. - * symbols.h (symbol_create, symbol_table_frozen): Declare. - - * symbols.c (symbol_clear_list_pointers): Always a function now. - * struc-symbol.h (symbol_clear_list_pointers): Deleted macro - version. - - * symbols.c (debug_verify_symchain): New macro, defined to be - verify_symbol_chain or a cast to void, depending on DEBUG_SYMS. - (many functions): Invoke debug_verify_symchain unconditionally. - -Tue Jul 12 12:06:42 1994 Kung Hsu (kung@x1.cygnus.com) - - * config/obj-ecoff.h: change calling interface of - OBJ_GENERATE_ASM_LINE_STAB. - * config/obj-elf.h: ditto. - * read.c (read_a_source_file): ditto. - * ecoff.h: change calling interface of - ecoff_generate_asm_line_stab. - * ecoff.c (add_file): record of filename to handle case of include - files, also change default built-in type from int to void for - asm file. - * ecoff.c (ecoff_generate_asm_line_stab): handle case of include - files. - -Mon Jul 11 17:20:23 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-mips.c (macro): In case M_LA_AB, SVR4_PIC, large - constant, and case ldd_std, set mips_optimize to 2 temporarily to - avoid inserting an unexpected nop instruction. - -Sat Jul 9 00:05:12 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.c (ecoff_build_lineno): Handle count correctly for last - line number. - -Fri Jul 8 15:22:07 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * gasp.c (process_pseudo_op): Pass right args to do do_aif. - (get_any_string): New arg 'pretend_quote'. - (get_and_process, do_formals, macro_expand, do_sdata, - process_pseudo_op): Use new arg. - -Fri Jul 8 12:23:44 1994 Kung Hsu (kung@mexican.cygnus.com) - - * config/obj-ecoff.h: define macro OBJ_GENERATE_ASM_LINE_STAB. - * config/obj-elf.h: ditto. - * read.c (read_a_source_file): generate line stabs for asm file. - * read.h: add extern generate_asm_line_stab. - * ecoff.h : add prototype for ecoff_generate_asm_line_stab(). - * ecoff.c (add_file): if there's no filename provided, set switch - to generate line stabs for .s file. - * ecoff.c (add_procedure): add stabs symbol for .ent directive. - * ecoff.c (generate_ecoff_stab): creates an artificial stabs. - * ecoff.c (generate_asm_line_stab): generate a artifitial label - for each line and generate a stabn for the line. - -Thu Jul 7 17:04:03 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * gasp.c (get_any_string): Cope with getting a string with an - alternate base specifier. - (do_aif, do_aelse): Only enable output if expression is true and previous - level was on. - (chartype_init): Add BASEBIT chartype. - (process_pseudo_op): Notice nesteed AIFs. - -Thu Jul 7 12:30:22 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * h8300.c (do_a_fix_imm): Code for 2 bit reloc type using in trapa - insn. (fix pr 5165, 5174) - -Thu Jul 7 11:31:32 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (R_DLT_REL): If it isn't defined, then define - to an appropriate value to avoid losing on old hpux systems. - - * config/tc-hppa.c (hppa_fix_adjustable): Reject reductions for - symbols in DLT relative relocs. - (tc_gen_reloc): Zero out the addend field for DLT relative relocs. - -Wed Jul 6 01:07:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-ppc.c (ppc_tc): If not OBJ_COFF, force TOC entry to - align to a four byte boundary. - -Tue Jul 5 15:42:09 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/tc-alpha.c (load_expression): Handle 32-bit addends. - (gpdisp_hi16_howto): Now points to const. - (load_insn_table, alpha_ip): Fix uses of const. - - * doc/internals.texi: Updates to COFF description. Added "@end - defmac" as needed, and some extra heading and "@bye" so it'll - format as a separate document. - -Tue Jul 5 13:54:00 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/obj-elf.h (S_GET_ALIGN, S_SET_ALIGN): Define. - * config/obj-elf.c (obj_elf_common): Set alignment of common - symbol. - * config/tc-sparc.c (s_common): If OBJ_ELF, set alignment of - common symbol. - -Mon Jul 4 18:29:43 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (is_complex): New macro. - (cons_fix_new_hppa): "Handle" complex expressions. - -Fri Jul 1 00:48:12 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-coff.c (write_object_file): Set s_align field from - section_alignment array. - -Thu Jun 30 15:05:28 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * write.c (write_object_file): Use bfd_com_section_ptr. - * as.h (absolute_section, undefined_section): Use new BFD macros - bfd_abs_section_ptr and bfd_und_section_ptr. - -Thu Jun 30 14:36:37 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * config/tc-mips.c (macro): For M_LI_SS, decide how to handle it - based on contents of imm_expr and offset_expr, rather than - mips_pic. For M_LI_DD, decide how to handle it based on segment - name of offset_expr, rather than mips_pic. - (mips_ip): If g_switch_value < 4, use immediate values for 'l'. - If g_switch_value < 8, use .rdata rather than .lit for 'L'. - -Wed Jun 29 17:30:46 1994 Stan Shebs (shebs@andros.cygnus.com) - - * as.c (show_usage): Break long string into shorter ones. - (parse_args): Add -v, prints version id and continues. - * config/tc-mips.c (md_show_usage): Break long string. - -Mon Jun 27 09:47:16 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * config/tc-i386.c (md_parse_option): Handle "-V" and "-Q" if - OBJ_ELF is defined. - -Sun Jun 26 16:30:48 1994 Stan Shebs (shebs@andros.cygnus.com) - - * as.c (main) [HOST_SPECIAL_INIT]: New hook, for host-specific - initialization. - -Wed Jun 22 00:24:55 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.h (obj_frob_symbol): Define for OBJ_ELF. - More gas/bfd lossage exposed by the new linker code. - -Tue Jun 21 11:32:18 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * subsegs.c (subseg_change): Clear seginfo after allocating it. - (subseg_get): Pass actual size of seginfo to memset. - - * subsegs.c (abs_seg_info, und_seg_info): Define if BFD_ASSEMBLER. - (subseg_change): Store seg_info for bfd_abs_section_ptr in - abs_seg_info, and store seg_info for bfd_und_section_ptr in - und_seg_info. - (subseg_get): Likewise. Also, don't set output_section if it is - already set. - (seg_info): Define as function. - * subsegs.h (seg_info): Declare as function rather than defining - as macro. - * write.c (relax_and_size_seg): Call seg_info rather than - bfd_get_section_userdata. - -Mon Jun 20 16:30:54 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * configure.in (ppc-*-elf*): New target, like -sysv4*. - - * expr.c (operand): If "0f" is followed by '\0', don't do eol - checks. - -Mon Jun 20 15:17:43 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * ecoff.c (ecoff_build_aux): Call swap_tir_out and swap_rndx_out - via backend pointer, not directly. - -Fri Jun 17 18:05:06 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (config-stamp): Make sure there is at least one - element in the for loop. - -Fri Jun 17 11:01:04 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c: Misc trivial changes to make gcc -Wall happy. - - * config/tc-hppa.h (elf_hppa_final_processing): Declare. - -Wed Jun 15 20:44:46 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * as.c (parse_args): Cast xmalloc return value. - - * Makefile.in (config-stamp): If $(defs) contains multiple words, - emit a #define line for each. - * configure.in: For sparc64 target, use sparc cpu files and add - sparcv9 to extra_defs. No longer treat sparc64-*-aout* specially. - - * config/tc-sparc.c (membar_masks): Now static and const. - (md_show_usage) [!NO_V9]: Add -Av9 to usage message. - (current_architecture) [sparcv9]: Initialize to v9. - (md_begin) [sparcv9]: Don't bother changing it unconditionally - here. - (s_reserve): Don't pass unexpected argument to as_bad with - bad-segment message. - - * as.h (bfd_alloc_by_size_t) [BFD_ASSEMBLER]: Declare. - - * config/atof-ieee.c (int_to_gen): Commented out unused routine. - - * config/tc-vax.c (md_assemble): Removed check of operand section. - - Fri Jun 3 17:25:08 1994 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.h (DBG_S_C_COMPLX4, DBG_S_C_COMPLX8): define - these new VMS symbol-type macros for `complex float' and - `complex double' support. Their values come from the existing - DSC$K_DTYPE_FC and DSC$K_DTYPE_DC macros in . - (DBG_S_C_REAL8_G, DBG_S_C_COMPLX8_G): G_float versions of - REAL8 and COMPLX8; not used yet, because gcc outputs the same - .stabs for `double' regardless of whether `-mg' is used. - * config/obj-vms.c (VMS_typedef_parse) [case 'r']: add entries - for gcc2's predefined types "complex float", "complex double", - and "complex long double" (identical to complex double). - -Wed Jun 15 12:32:55 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-coff.c (coff_frob_symbol): Use C_STAT for the .text - section symbol, not C_LABEL. - - * config/tc-mips.c (mips_ip): Permit a modifier in 'o' case, and - permit non constant expressions in 'u' case. Lets ``lui - $8,%hi(foo); lw $8,%lo(foo)($8)'' work correctly. - -Mon Jun 13 12:08:52 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-aout.c (obj_aout_frob_symbol): Warn about an attempt - to put a common symbol in a set. - -Sat Jun 11 16:41:21 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - Add weak symbols as an extension to a.out. - * read.c (pseudo_set): Only preserve external bit for OBJ_AOUT and - OBJ_BOUT if not BFD_ASSEMBLER. - * config/aout_gnu.h (N_WEAKU, N_WEAKA, N_WEAKT, N_WEAKD, N_WEAKB): - Define as in ../include/aout/aout64.h. - * config/obj-aout.h (OBJ_SYMFIELD_TYPE): If not BFD_ASSEMBLER, - define as char. - (S_GET_WEAK, S_SET_WEAK): Define if not BFD_ASSEMBLER. - * config/obj-aout.c (obj_pseudo_table): Add "weak". - (obj_emit_symbols): Adjust type of weak symbols. - (obj_aout_weak): New static function. - -Fri Jun 10 13:48:49 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-elf.c (obj_elf_section): Don't set any flags based on - the type of a special section. - - * config/ho-sunos.h: Include . Don't declare malloc, - realloc, free, or atol. - -Wed Jun 8 06:28:37 1994 Bill Cox (bill@cygnus.com) - - * Makefile.in (check): Delete as.new dependency, so that - regression test doesn't trigger an assembler build. - -Tue Jun 7 13:33:18 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (mostlyclean, realclean): New targets. - * doc/Makefile.in, testsuite/Makefile.in: Likewise. - -Mon Jun 6 13:10:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (RDATA_SECTION_NAME): Define. - (macro): Correct M_LI_SS SVR4_PIC/EMBEDDED_PIC case. After M_LI_D - or M_L_DOB or label dob, force a new frag to avoid getting - confused in tc_gen_reloc. - (mips_ip): Use RDATA_SECTION_NAME, not .rdata. - (s_change_sec): Likewise. - -Fri Jun 3 23:35:36 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * read.c (emit_expr): Use memset to zero out memory, rather than - going through md_number_to_chars. This permits handling symbolic - arguments when the size is larger than sizeof (valueT), if - TC_CONS_FIX_NEW is prepared to handle the case (as it is on MIPS). - -Fri Jun 3 12:50:13 1994 David J. MacKenzie (djm@rtl.cygnus.com) - - * as.c (show_usage), config/tc-alpha.c (md_show_usage), - config/tc-mips.c (md_show_usage): Fix up messages. - - * as.h: Replace flagseen with separate variables. - * as.c (parse_args): Set them. Don't accept -1 option, or -v - explicitly (it's a synonym for --version). - * as.c, input-scrub.c, messages.c, read.c, symbols.c, write.c, - config/obj-aout.c, config/obj-aout.h, config/obj-bout.c, - config/obj-bout.h, config/obj-coff.c, config/obj-coff.h, - config/obj-vms.c, config/tc-hppa.c, config/tc-i386.c, - config/tc-i960.c, config/tc-m68k.c, config/tc-mips.c, - config/tc-vax.c: Use the new flag variables instead of flagseen. - * config/tc-vax.c [OBJ_VMS]: Recognize -+, -1, -v, and document in - usage. - - * as.c (show_usage): Remove target specific messages; - instead, call md_show_usage. - (parse_args): Use getopt_long_only. Take pointers to argc and - argv. - (main): Pass parse_args pointers. - * as.h: Remove 3 variables that are redundant with flagseen. - * as.c, messages.c: Change their users to use flagseen. - Define getopt stuff. - * tc.h: Update md_parse_option decl. Add md_show_usage decl. - * config/tc-*.c: Add md_shortopts, md_longopts, - md_longopts_size, md_show_usage. Change calling convention for - md_parse_option. Remove md_parse_long_option. - * config/tc-ns32k.c: Rename `struct option' to `struct ns32k_option'. - * config/tc-i386.h: Don't define md_parse_option. - -Thu Jun 2 13:54:46 1994 David J. Mackenzie (djm@rtl.cygnus.com) - - * as.c (show_usage): New function. - (parse_args): Code moved from main. - Recognize --help and --version. - * config/tc-ns32k.h: Define TC_NS32K. - * doc/as.texinfo: Document all of the target-independent command - line options. - -Thu Jun 2 12:07:25 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * gasp.c (hash_new_table): Clear newly allocated table. - - * config/tc-m68k.c (enum _register): Add 68060 control registers - BUSCR and PCR. - (last_movec_reg): New macro. - (m68000_control_regs, m68010_control_regs, m68020_control_regs, - m68040_control_regs, m68060_control_regs): New arrays. - (control_regs): New pointer. - (m68k_ip): Use control_regs instead of testing CPU every time. - Use last_movec_reg too. In error messages, handle 68060, and - print 68060 for mfloat, too. - (m68k_init_after_args): Handle "68060". Use m68040up for making - m68851 choice. Set control_regs. - (md_parse_option): Handle "68060". - * configure.in: Setting cpu_type, recognize m68060 too. - - * config/obj-coff.c (fixup_segment) [!BFD_ASSEMBLER] - [DIFF_EXPR_OK]: Do conversion to pc-relative for difference, even - if pcrel is already set. - - * read.c (potable): Add this_gcc_requires_the_gnu_assembler in all - lower-case, in case we're ignoring case of opcodes in the input - file. - - * doc/as.texinfo (.section): Document as unavailable for a.out - type formats. - - * config/tc-alpha.c (machine): New variable. - (load_insn): New macro. - (load_insn_table): New function. - (md_begin): Call load_insn_table, once for basic instructions and - once for appropriate PAL instruction table. - (md_parse_option): Set `machine' based on -m##### arguments. - * config/alpha-opcode.h (alpha_pal21064_opcodes): Split out from - alpha_opcodes. - (alpha_pal21164_opcodes): New table. - (NUM21064OPCODES, NUM21164OPCODES): New macros. - - * configure.in (target i386-*-netbsd0.8): Use 386bsd emulation. - - * doc/Makefile.in (install-info-gasp): Use $$dir when installing - file. - -Wed Jun 1 10:48:19 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_ip): Force floating point values to be - aligned correctly. - -Fri May 27 10:05:53 1994 Ken Raeburn (raeburn@cygnus.com) - - Merged in changes from gas-2.3 net release: - - * Makefile.in (VERSION): Updated to cygnus-2.3.1. - - * config/obj-vms.c: Replaced unchecked uses of malloc with - xmalloc. - - * listing.c (list_symbol_table): Only test BFD64, not - BFD_ASSEMBLER too. - - * config/obj-coff.c (fixup_segment) [BFD_ASSEMBLER] - [DIFF_EXPR_OK]: Don't check pcrel, just convert it. - - * config/obj-vms.c: Removed lots of extra semicolons after - compound statements. - (strchr): Don't declare here. - - * config/ho-vax.h (realloc): Declare. - - * config/ho-vms.h (strchr, strdup): Declare. - - * config/tc-sparc.c (md_parse_option) [OBJ_ELF]: Accept and ignore - option `-q'. - - Wed May 18 20:50:35 1994 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.h (DBG_S_C_SQUAD, DBG_S_C_UQUAD): define these - new VMS symbol-type macros; signed and unsigned quadword integers, - for `long long' support. Their values come from the existing - DSC$K_DTYPE_QU and DSC$K_DTYPE_Q macros in . The - VMS debugger now recognizes `long long' variables correctly. - * config/obj-vms.c (VMS_typedef_parse) [case 'r']: add entries - for gcc2's predefined types "long double" (same as double, as - per gcc's current state), "long long int", "long long unsigned - int", and final `otherwise' case (to avoid uninitialized type - and size fields). [caveat: predefined types "complex int", - "complex float", "complex double", and "complex long double" are - still missing.] - - * config/ho-vms.h (EXIT_FAILURE): define as 0x10000002 instead - of 0, because the latter indicates success rather than failure - when passed to `exit' or return from `main' compiled by gcc2. - - * config/obj-vms.c (array_suffix, generate_suffix): replace two - hardcoded `0xa3's with macro DBG_S_C_ADVANCED_TYPE from obj-vms.h. - (VMS_typedef_parse): eliminate redundant if-then-else when - allocating new symbol entry and linking it to VMS_Symbol_type_list. - - Tue May 17 20:47:31 1994 Pat Rankin (rankin@eql.caltech.edu) - - * config/obj-vms.c (Write_VMS_MHD_Records): don't try to interpret - the contents of the GAS_VERSION string when falling back to it for - language processor identification. - - * make-gas.com, vmsconf.sh (ENVIRON): fix misspelling of - `psect_attr' in linker options. - - Wed May 11 22:32:00 1994 DJ Delorie (dj@ctron.com) - - * configure.bat: update to latest makefile.in - * config/te-go32.h: [new] go32's environment - -Fri May 20 17:59:34 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * as.h: Don't declare parameters for strstr. - -Thu May 19 15:40:13 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-sparc.c (md_section_align): Don't change the size if - OBJ_ELF. - -Wed May 18 13:08:07 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (install): Redirect ln output to /dev/null. If ln - fails on gasp, install gasp.new, not gasp. - -Wed May 18 09:16:36 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_ip): Use R_HPPA_ABS_CALL, not R_HPPA for - absolute calls. - -Tue May 17 12:50:46 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_parse_fp_cmp_cond): Report an error - on a partial completer match. - -Mon May 16 12:03:49 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c: Change .hppa_unwind to .PARISC.unwind - throughout code. - (is_complex): Delete definition and support for complex relocation - types. - (tc_gen_reloc): Delete special unwind crud for ELF. Simplify and - rewrite ELF code based on 94-02-02 PA ELF draft spec. - (pa_build_unwind_subspace): Use standard PARISC_DIR32 relocs for - the unwind descriptors. - -Fri May 6 14:13:15 1994 Steve Chamberlain (sac@cygnus.com) - - * config/go32.mh: New makefile fragment for go32 crossing. - * configure.in (host==go32): Use new fragment. - -Fri May 6 14:35:58 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * gasp.c: Include libiberty.h. - (main): Remove unused variable i. - - * config/tc-ppc.c (md_begin): When using -many, permit comparison - instructions to appear multiple times in the opcode table. - -Thu May 5 19:14:43 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * Makefile.in (VERSION): Update to 2.2.90. - - * symbols.c (symbol_new) [BFD_ASSEMBLER]: Don't permit additions - to the symbol table if it's already been set in the output bfd. - (symbol_begin) [! EMIT_SECTION_SYMBOLS] [RELOC_REQUIRES_SYMBOL]: - Don't use bfd_abs_section.symbol for gas absolute symbol. - - * doc/Makefile.in (distclean, clean-dvi, clean-info): Delete gasp - files too. - -Thu May 5 18:12:51 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_emit_delays): Make call to - mips_no_prev_insn unconditional. - -Thu May 5 17:25:38 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/obj-coff*.*: Merged coffbfd versions into coff versions, - with a single "#ifdef BFD_ASSEMBLER" controlling most of it for - now. Deleted obj-coffbfd.* files. - * configure.in: Always use obj-coff.* for COFF targets. - -Wed May 4 13:34:11 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/te-dpx2.h (TARGET_FORMAT, REGISTER_PREFIX_OPTIONAL): - Define. - * configure.in (m68k-bull-sysv3*): Enable. - - * config/coff_gnu.h: Deleted. - -Wed May 4 11:29:17 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-m68k.h (TARGET_FORMAT): If not TE_SUN3, define as - "a.out-zero.big". - - * config/obj-coffbfd.c (fixup_segment): Make common symbol and PC - relative adjustments when TE_LYNX is defined as well as when - TC_I386 is defined. - -Wed May 4 02:29:21 1994 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * as.h (strstr): Restore declaration. - (subseg_get) [BFD_ASSEMBLER]: Declare. - - * write.c (write_object_file): If obj_adjust_symtab is defined, - invoke it. Then call set_symtab, and finally invoke *_frob_file - hooks. - * config/obj-coff.c (coff_adjust_symtab): Renamed from - coff_frob_file. - * config/obj-coff.h (coff_adjust_symtab): Changed declaration - accordingly. - (obj_adjust_symtab): Macro also changed. - - * configure.in (i386-*-gnu*): New target, handled like i386-mach. - -Tue May 3 21:04:16 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/obj-coff.h (TARGET_FORMAT) [TC_I960]: Select little - endian version. - - * config/obj-coffbfd.h (TARGET_FORMAT) [TC_I960]: Ditto. - - * config/obj-coff.c (coff_frob_section): Round up the size of - every section to a multiple of the alignment, so that BFD doesn't - surprise us. - - Eliminate many simple differences between the two COFF back ends: - - * config/obj-coffbfd.c: Removed all uses of DEFUN and DEFUN_VOID. - Made minor stylistic changes, deleted some register declarations. - (stack_top): Deleted. - (symbol_to_chars): Use absolute_section and reg_section instead of - the corresponding SEG_* symbols. - (obj_coff_endef, tag_find_or_make, fixup_segment): Likewise. - (stack typedef, stack_init, stack_delete, stack_push, stack_pop): - Moved to just after pseudo-op table. All functions now static. - (stack_delete): Removed declaration. - (tag_init, tag_insert, tag_find_or_make, tag_find): Moved to just - after stack functions. - * config/obj-coffbfd.h: Reordered some declarations and macros. - (stack_init, stack_delete, stack_push, stack_pop): Don't declare. - (stack typedef): Deleted. - (SYMBOLS_NEED_BACKPOINTERS): Always undef then define; don't test. - (SYM_AUXENT): New macro. - (SA_GET_*, SA_SET_*): Define in terms of SYM_AUXENT when feasible. - (SF_GET_*, SF_SET_*): Define in terms of SF_GET when feasible. - (SA_GET_SYM_TAGNDX, SA_GET_SYM_ENDNDX, SA_SET_SYM_TAGNDX, - SA_SET_SYM_ENDNDX, object_headers typedef, data_section_header, - text_section_header): Delete non-BFD_HEADERS versions, since we - always define that symbol now. - - * config/obj-coff.c (stack_top): Deleted. - (obj_coff_endef, obj_coff_dim, obj_coff_line, obj_coff_size, - obj_coff_scl, obj_coff_tag, obj_coff_type, obj_coff_val): Change - argument name from "ignored" to "ignore". - (obj_coff_val): Use frag_now_fix. - (obj_pseudo_table): Removed IGNORE_DEBUG version, since it doesn't - get used. - (stack typedef, stack_init, stack_delete, stack_push, stack_pop): - Moved to just after pseudo-op table. All functions now static. - (tag_init, tag_insert, tag_find_or_make, tag_find): Moved to just - after stack functions. - * config/obj-coff.h: Reordered some declarations and macros. - Protected against multiple inclusions. - (stack_init, stack_delete, stack_push, stack_pop): Don't declare. - (stack typedef): Deleted. - (SYMBOLS_NEED_BACKPOINTERS): Always undef then define; don't test. - (stdoutput): Deleted declaration. - (TARGET_FORMAT) [TC_I386]: Don't define if already defined. - -Mon May 2 17:09:24 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * subsegs.h (segment_info_type): Use fix_tail field even if - BFD_ASSEMBLER. - * subsegs.c (subseg_change): Initialize fix_tail field. - (subseg_get): Likewise. - * write.c (frags_chained): New static variable. - (fix_new_internal): If frags_chained is set, use fix_root and - fix_tail from seg_info (now_seg), rather than frchain_now. - (chain_frchains_together_1): Set fix_tail field. - (chain_frchains_together): Set frags_chained. - -Thu Apr 28 01:39:15 1994 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * config/tc-mips.c (s_option): Only refer to g_switch_* variables - if GPOPT is defined. - (s_abicalls): Ditto. - (md_apply_fix): Cast char* to unsigned char* to avoid pointer - mismatch. - -Wed Apr 27 11:06:32 1994 Steve Chamberlain (sac@cygnus.com) - - * configure.in (i386-*-go32): Uses coff now. - * gasp.c (main): Now takes -D on command line. - (show_usage): Describe new options. - -Tue Apr 26 17:10:30 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * listing.c (list_symbol_table): Print "NO DEFINED SYMBOLS" and - "NO UNDEFINED SYMBOLS" if there aren't any, instead of displaying - the header with an empty list. - - * config/obj-coffbfd.c (fill_section): Check COFF_NOLOAD_PROBLEM - also before setting STYP_NOLOAD for .bss section. - - * config/tc-m68k.c (flag_reg_prefix_optional): New variable. - Initialized to value of REGISTER_PREFIX_OPTIONAL, if defined, or - zero. - (m68k_reg_parse): If flag_reg_prefix_optional is set, permit - register prefix to be absent. - (m68k_ip_op): Accept `&' also for immediate constants. - (insert_reg): Don't bother with (two!?) sanity checks of the - symbol table when inserting each register. - (m68k_parse_long_option): New function. Set - flag_reg_prefix_optional if "register-prefix-optional" is passed. - * config/tc-m68k.h (REGISTER_PREFIX): Always define if not already - defined. - (OPTIONAL_REGISTER_PREFIX): Don't define. - (REGISTER_PREFIX_OPTIONAL): If not already defined, define as zero - or one depending on M68KCOFF. - - Some changes to help Apollo support, from troy@cbme.unsw.edu.au: - * config/tc-m68k.c (DATA, ADDR, SP, FPREG, COPNUM, BAD, BAC): - Define as macros instead of enumerators, since the Apollo compiler - can't handle "enumVal1, enumVal2 = enumVal1" when defining an enum - type. - (make_pcrel_absolute) [NO_PCREL_RELOCS]: New function. - (tc_coff_fix2rtype) [NO_PCREL_RELOCS]: Generate only R_RELBYTE, - R_DIR16, and R_DIR32 relocs. - * config/tc-m68k.h [TE_APOLLO] (COFF_MAGIC, COFF_AOUTHDR_MAGIC): - Use Apollo versions. - [TE_APOLLO] (OBJ_COFF_OMIT_OPTIONAL_HEADER): Undefine. That is, - do include the optional header for Apollo target. - (COFF_MAGIC): Don't define as MC68MAGIC if it's already defined. - - * config/tc-m68k.h [TE_DELTA] (LEX_PCT): Define as 1, so that `%' - can be used within a label name. - - * config/tc-m68k.h (m68k_init_after_args): Declare. - (tc_init_after_args): Define as m68k_init_after_args. - * config/tc-m68k.c (m68k_init_after_args): New function, - containing one-shot code from md_assemble. Added warning for - combination of 68040 and 68851. - (md_assemble): Startup-time code deleted. - -Mon Apr 25 16:19:17 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * doc/Makefile.in (clean, distclean): Remove asconfig.texi. - -Sun Apr 24 00:13:08 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_ip): 13 bit immediate constant (for break - instruction) is unsigned. - -Fri Apr 22 17:58:22 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-ecoff.c (ecoff_frob_file): Use bfd_ecoff_set_gp_value - and bfd_ecoff_set_regmasks to set the GP value and the register - masks, rather than using the now obsolete fake .reginfo section. - -Fri Apr 22 15:17:06 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * listing.c (list_symbol_table): Don't print register symbols as - undefined. - - * config/obj-coff.c (obj_symbol_new_hook): Don't need to strip - underscores, since symbol_new will already have done it. - * config/obj-coffbfd.c (obj_symbol_new_hook): Ditto. - - * as.c (main): If tc_init_after_args is defined, invoke it after - all arguments have been processed. - - Some changes to help Apollo support, from troy@cbme.unsw.edu.au: - * as.c (perform_an_assembly_pass) [TE_APOLLO]: Create .wtext - section instead of .text. Call create_target_segments. - * read.c (demand_copy_string): No longer static. - -Thu Apr 21 15:50:04 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (append_insn): Permit branches to be switched - with the preceding instruction even if .set nobopt has been seen. - .set nobopt actually controls whether to bring up an instruction - from the branch target, which gas does not currently support. - -Wed Apr 20 18:46:14 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/obj-coff.h, config/obj-coff.c: Deleted all code used only - when BFD_ASSEMBLER is not defined, and all conditionals relating - to such code. No such targets remain. - - Fixes for stabs-in-coff: - * config/obj-coff.c: Include subsegs.h. - (coff_frob_section): New function. - (obj_coff_init_stab_section): New function. - * config/obj-coff.h (obj_coff_init_stab_section, - coff_frob_section): Declare. - (obj_frob_section): New macro; uses coff_frob_section. - (INIT_STAB_SECTION): New macro; uses obj_coff_init_stab_section. - - * config/tc-sparc.c (md_section_align): Always round up to - multiple of alignment power specified in bfd target vector. - - * gasp.c: Include ctype.h. - -Mon Apr 18 21:08:01 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * doc/Makefile.in, doc/as.texinfo: Renamed asdoc-config.texi to - asconfig.texi. - - * doc/Makefile.in (install-info-as, install-info-gasp): Get file - names from source directory without pathname. - - * config/obj-vms.c (VMS_write_object_file): While looking for - register mask, skip empty fill frags caused by enabling listing - output. - - * config/ho-sysv.h: Include string.h. - - * doc/internals.texi: New (well, recently added) file. Just added - info on as_warn and friends. - -Mon Apr 18 14:28:22 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_parse_space_stmt): Use the built-in - defaults for defined, private, and spnum fields for the - $TEXT$ and $PRIVATE$ spaces. Do not clobber spnum. Do - not reset the segment if just updating a space. - (pa_spaces_begin): Set BFD section flags for all built-in - subspaces. - -Fri Apr 15 10:51:51 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.c (first_proc_ptr): New static variable. - (add_procedure): Set first_proc_ptr if it hasn't been set. - (ecoff_build_lineno): If the first procedure does not start at - address zero, insert a dummy line to compensate. - - * Makefile.in (bootstrap, bootstrap2, bootstrap3): Make gasp.new - as well as as.new. - -Thu Apr 14 15:12:36 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * expr.c (operand): Try to parse "0f" and "0b" sequences as - floating point and binary numbers respectively; if it doesn't - work, treat them as local labels. - - * Makefile.in: Make $(OBJS) depend on $(ALL_OBJ_DEPS). - * configure.in: Set ALL_OBJ_DEPS in output Makefile. - - Based on suggestions from - (Charles Bailey): - * vmsconf.sh: In generated file, get ".obj" suffix right, build - source files from other directories into objects in the current - directory, and specify PSECT attributes explicitly to linker. - Also added missing label. - * Makefile.in (stamp-mk.com): Reference new variable - VMS_OTHER_OBJS for list of non-local object files, instead of - listing them here. - (VMS_OTHER_OBJS): New variable, added more libiberty files. - * make-gas.com: Regenerated. - - * config/ho-vms.h (unlink): Define as delete. - - * config-gas.com: Fix quoting on TARGET_CANONICAL definition. - Delete files before creating them. - -Thu Apr 14 13:34:24 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (de-stage1, de-stage2, de-stage3): Use rm -f. - - * config/tc-mips.h (DIFF_EXPR_OK): Define. - * config/tc-mips.c (macro_build): Permit BFD_RELOC_PCREL_LO16 for - certain cases of 'i', 'j' and 'o'. Change 'u' to take an - argument, the reloc type. - (load_register): Pass reloc type to macro_build for 'u'. - (macro): Likewise. For M_LA_AB permit a difference expression - when generating embedded PIC code between an arbitrary symbol and - a symbol in the .text section. - (mips_force_relocation): Force BFD_RELOC_PCREL_HI16_S and - BFD_RELOC_PCREL_LO16 to be emitted. - (md_apply_fix): Check that most relocs are not PC relative. - Handle BFD_RELOC_PCREL_HI16_S and BFD_RELOC_PCREL_LO16. - (tc_gen_reloc): Change #error to as_fatal. Handle - BFD_RELOC_PCREL_LO16 and BFD_RELOC_PCREL_HI16_S. - -Tue Apr 12 18:25:13 1994 Stan Shebs (shebs@andros.cygnus.com) - - * subsegs.c (subsegs_begin): Call memset with args in the correct - order. - (subseg_get): Clear newly allocated seginfo, set its pointer slots - to NULL instead of 0. - -Mon Apr 11 09:00:57 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_procend): Handle case where label was - defined after the .proc directive. - - * config/tc-hppa.c (pa_procend): Give an error if we encounter a - procend for a procedure without a name. - -Thu Apr 7 14:28:30 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (macro): Pass NULL for expression argument to - macro_build for nori case. - (SWITCH_TABLE): Define. - (mips_force_relocation): Force a relocation for a switch table - entry. - (md_apply_fix): Write switch table entry value into file. - (tc_gen_reloc): Use BFD_RELOC_GPREL32 for a switch table entry, - and set the addend to the difference between the reloc address and - the subtrahend. - -Thu Apr 7 10:38:18 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.h (elf_tc_symbol): Delete. No longer used. - (elf_tc_make_sections): Likewise. - (hppa_tc_make_sections, hppa_tc_symbol): Delete extern decls. - - * config/tc-hppa.c (hppa_tc_make_sections): Delete function. - (hppa_tc_symbol): Likewise. - - * config/obj-elf.c (elf_frob_file): Delete elf_tc_symbol and - elf_tc_make_sections stuff. It was there to support PA braindamage - which has been fixed, and in the case of elf_tc_make_sections is - redundant with elf_tc_final_processing. - -Wed Apr 6 20:48:30 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * configure.in (hppa*-*-*elf*): Don't require "-hp-" for the - manufacturer. - -Tue Apr 5 15:48:03 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_ip): For case 'o', when generating - embedded PIC code, accept the difference between two local symbols - as being constant. - (mips_force_relocation): Only force a reloc to be generated for a - PC relative fixup. - (md_apply_fix): For BFD_RELOC_32 and BFD_RELOC_LO16, put the fixup - value into the file if the fixup will not generate a reloc. - -Tue Apr 5 11:14:14 1994 Ken Raeburn (raeburn@rtl.cygnus.com) - - * config/tc-sparc.c (s_reserve): If section passed isn't bss, - don't spew remainder of input file in error message. - (tc_gen_reloc): If bfd_reloc_type_lookup returns null, print error - message with reloc type and try to process remainder of file. - - * doc/Makefile.in (install-info-as, install-info-gasp): New - targets, now explicitly checking $(srcdir) for info files. - (install-info): Depend on both of them; do nothing more. - -Mon Apr 4 17:06:04 1994 Jeffrey A. Law (law@cygnus.com) - - * config/tc-hppa.c (tc_gen_reloc): Fix thinko in ELF version. - -Mon Apr 4 12:39:23 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-ppc.c (ppc_insert_operand): Check PPC_OPERAND_SIGNED - flag rather than signedp field. Only permit extended range if - PPC_OPERAND_SIGNOPT flag is set and assembling in 32 bit mode. - Based on patch from David Edelsohn (edelsohn@npac.syr.edu). - - * config/tc-ppc.c (ppc_size): New static variable. - (ppc_arch): Check for PPC_OPCODE_PPC before PPC_OPCODE_POWER. - (md_begin): If an instruction has a size specific flag set, only - add it if we are assembling that size. - -Thu Mar 31 16:51:16 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-sparc.c (tc_gen_reloc): Add a gruesome hack to get - cross section PC relative relocs right for COFF and ELF. - -Mon Mar 28 14:38:23 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/obj-coff.h (SEPARATE_STAB_SECTIONS): Always define. - (OBJ_PROCESS_STAB): Don't define. - -Mon Mar 28 12:40:25 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-aout.c (obj_aout_frob_symbols): Don't let BFD clobber - the type of symbol set symbols which happen to be in the absolute - or undefined section. - -Mon Mar 28 12:35:00 1994 David Edelsohn (edelsohn@npac.syr.edu) - - * config/tc-ppc.c (md_parse_option): Add -mpwrx (POWER/2 aka - RIOS2), -mpwr (POWER aka RIOS1), -mppc (PowerPC aka MPC603/604), - and -many (all architectures). - -Sun Mar 27 14:04:19 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (tc_gen_reloc): Set addend for relocation - involving a function symbol which is not a plabel to zero. - (md_apply_fix): Never pass a function symbol to field_adjust. - -Fri Mar 25 17:35:49 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-aout.c (obj_aout_frob_symbol): If N_EXT is set for an - N_INDR symbol, set BSF_EXPORT and clear BSF_LOCAL. - - * config/tc-mips.c (append_insn): If EMBEDDED_PIC, don't swap a - branch with an instruction that uses $at, in case the branch is - later expanded. - (macro): If EMBEDDED_PIC, case M_JAL_A may use $at. - (md_pcrel_from): If not OBJ_AOUT, return 4 for an undefined symbol - to make it pcrel_offset. - (tc_gen_reloc): If not OBJ_AOUT, set the reloc addend to - reloc->address; another gruesome hack to get gas reloc handling to - do the right thing. - -Thu Mar 24 21:29:29 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/tc-alpha.c (alpha_ip): Only set GP prolog size if using - PV register. - (T12): New macro. - (emit_insn): New function. - (md_assemble): Call it. - (alpha_force_relocation): Handle BFD_RELOC_26, for call_pal - instructions. - (lituse_pending): New variable. Set by anything that generates a - LITERAL reloc, cleared by anything that generates a LITUSE reloc, - tested by code that might want to emit a LITUSE reloc. - (emit_unaligned_io): New function. Currently calls md_assemble, - but it should eventually be converted to generate the insn itself - and call emit_insn directly. - (emit_load_unal, emit_store_unal, emit_byte_manip_r, - emit_extract_r, emit_insert_r, emit_mask_r, emit_sign_extend, - emit_bis_r): Likewise. - (alpha_ip, case 'I'): Handle with BFD_RELOC_23. - (alpha_ip, label get_macro): Don't emit the final instruction if - the opcode is zero. - (alpha_ip, case 'B', subcase 'd'): New case, for subword and - unaligned memory access macros. - (md_apply_fix): Handle BFD_RELOC_26. Generate an error message if - the value can't be resolved. - -Wed Mar 23 16:06:08 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (md_parse_option): For -membedded-pic, force - the -G value to 0x7fffffff. For SVR4 PIC options, don't call - bfd_set_gp_size here, it's done in md_begin. Don't permit -G with - -membedded-pic. - (mips_force_relocation): New function. - (md_apply_fix): Set fixP->fx_done appropriately. - (s_change_sec): For EMBEDDED_PIC, change .data and .rdata to - .sdata. - * config/tc-mips.h (TC_FORCE_RELOCATION): Define. - (mips_force_relocation): Declare. - (TC_HANDLE_FX_DONE): Define. - -Tue Mar 22 13:58:37 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (enum mips_pic_level): New enum. - (mips_pic): Change from int to enum mips_pic_level. Change all - uses (0 becomes NO_PIC, 2 becomes SVR4_PIC). - (load_address): Handle EMBEDDED_PIC. - (macro): Handle EMBEDDED_PIC in all PIC cases. - (md_parse_option): Accept -membedded-pic to use EMBEDDED_PIC. If - OBJ_ELF, accept -KPIC and -call_shared to use SVR4_PIC and accept - -non_shared to use NO_PIC (this is how the Irix 5 assembler - works). Do not permit -G with SVR4_PIC. - (s_abicalls): Warn if -G was used, and force -G 0. - (tc_gen_reloc): Set reloc->addend to 0 for a PC relative reloc for - anything but a.out, not just for ELF. For ECOFF, don't generate a - BFD_RELOC_16_PCREL_S2 reloc unless using EMBEDDED_PIC. - - * config/obj-ecoff.h (obj_sec_sym_ok_for_reloc): Define to be 1. - -Sun Mar 20 16:31:55 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (create_new_space): Use ints, not chars as - parameters to avoid losing when compiling with HP CC. - (create_new_subspace, update_subspace, fix_new_hppa): Likewise. - -Sun Mar 20 14:43:14 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * Makefile.in (config-stamp): If `defs' is defined, emit a - preprocessor directive to create a macro named by this value into - config.new; don't explicitly go for BFD_ASSEMBLER. - * configure.in: Define `defs', not `BFDDEF'. Set it to - MANY_SEGMENTS for any obj-coffbfd target. - * config/obj-coffbfd.h (BFD_HEADERS, BFD): Define. - * config/i386coff.mt (TDEFINES): Don't define BFD, MANY_SEGMENTS, - or BFD_HEADERS. - (LOCAL_LOADLIBES): Deleted. - * config/m68kcoff.mt (TDEFINES): Don't define those macros. - * config/m88kcoff.mt (TDEFINES): Ditto. - * config/ebmon29k.mt: Deleted. - * config/h8300hds.mt: Deleted. - * config/ic960coff.mt: Deleted. - * config/sparc.mt: Deleted. - * config/h8300.mt (LOCAL_LOADLIBES, TDEFINES): Deleted. - * config/h8500.mt (LOCAL_LOADLIBES, TDEFINES): Deleted. - * config/sh.mt (LOCAL_LOADLIBES, TDEFINES): Deleted. - * config/z8k.mt (LOCAL_LOADLIBES): Deleted. - (TDEFINES): Don't define the coffbfd macros. - - * Makefile.in: Insert makefile fragments before OBJS definition. - (OBJS): Add $(TE_OBJS). - - * config/obj-coff.c (obj_pseudo_table): Supply "section" - unconditionally. - - * write.c (set_symtab): Define only if BFD_ASSEMBLER. - -Sun Mar 20 12:06:05 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * Makefile.in (STAGESTUFF): Add gasp.new. - -Fri Mar 18 20:09:16 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * write.c (symbol_table_frozen): New variable, to be set after - bfd_set_symtab is called. - (dump_section_relocs): Note whether a symbol is a section symbol - or not. - (adjust_reloc_syms): For now, always supply an absolute symbol for - fixups without symbols but not yet `done'. Use section_symbol to - get the symbol, instead of going directly for abs_symbol. - (write_relocs) [DEBUG4]: Abort if any symbol referred to by a - reloc is not a section symbol and is not in the symbol table. - (set_symtab): New function, broken out from write_object_file. - Counts symbol table instead of relying on an earlier count. - (write_object_file): Call set_symtab, but do it after potentially - invoking the *_frob_file macros. Don't bother counting symbols. - Call symbol_remove, instead of expanding it in place. Moved the - conditionalized `object_file_size' declaration down to - conditionalized block where it's used. When using the absolute - symbol for a fixup without a symbol, set sy_used_in_reloc. - (write_object_file) [BFD_ASSEMBLER]: Call section_symbol to get - the correct symbol for the absolute section. - - * subsegs.c (section_symbol): Use symbol_new instead of - symbol_make, since we may want it to go into the symbol table. - Make the new symbol have internal linkage. If - obj_sec_sym_ok_for_reloc says it's okay, use the BFD section - symbol with the newly created GAS symbol. - (obj_sec_sym_ok_for_reloc): Default to always returning 0. - * config/obj-aout.h (obj_sec_sym_ok_for_reloc) [BFD_ASSEMBLER]: - New macro. - * config/obj-elf.h (obj_sec_sym_ok_for_reloc): New macro. - - * config/tc-sparc.c: Include subsegs.h. - (in_signed_range): New function. - (sparc_ip): Use it. - (sparc_ip, case 'i'): Use BFD_RELOC_SPARC13, not _BASE13. - (sparc_ip, label "immediate"): Reject constants for pcrel - instructions only if the relocation type indicates a "call" - instruction and the offset is within range of a "jmpl %g0". If - it's not in range, use the absolute section symbol plus an offset. - (md_apply_fix): Use in_signed_range. Combined _SPARC13 and - _BASE13 cases. - (tc_gen_reloc): Permit BFD_RELOC_SPARC13. - - * config/ic960coff.mt (TDEFINES): Fixed typo (MANY_SECTIONS, not - MANY_SEGMENTS). - - * configure.in: Eliminated all targets using obj-coff but not - defining BFD_ASSEMBLER; I think all such targets that are - supported will be matched by real CPU-OS combinations earlier in - the case statement. - (targets *-*-coff*, *-sysv*, *-*-sco*, *-*-sysv32): Deleted. Made - some comments about the dpx2 configuration, but left it disabled, - since it couldn't be reached before. - (target a29k-amd-ebmonold): Deleted. - -Thu Mar 17 13:36:09 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_import): Correctly handle importing of an - already defined symbol. - -Wed Mar 16 17:11:37 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_ip): Only accept overly large values for - the 'j' operand if there are no further alternatives for this - instruction. - - * config/obj-coffbfd.c (adjust_stab_section): Initialize - stabstrseg to SEG_UNKNOWN, not -1. After loop, check whether it - is not SEG_UNKNOWN rather than checking whether it is >= 0. - - * config/tc-mips.c (mips_align): Take new argument, label, and use - it instead of global insn_label. - (s_align, s_cons, s_float_cons, s_gpword): Save insn_label before - call to mips_emit_delay and pass it to mips_align. - -Wed Mar 16 11:54:12 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_equ): Handle both .reg and .equ correctly. - - * config/tc-hppa.c (pa_callinfo): Accept "millicode" as an - argument to a .callinfo directive. Don't loop forever on errors. - - * config/tc-hppa.c (pa_equ): Use pa_parse_number so that we can - use pre-defined registers as arguments. - -Mon Mar 14 14:29:45 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * write.c (write_object_file): Check both S_IS_LOCAL and - S_IS_EXTERNAL when deciding whether to discard a symbol. - - * config-gas.com: Scan Makefile.in, not version.c, for current - version number. Delete all versions of temp files when finished - with them. Create config.h. - - * config/obj-vms.c (VMS_Initialized_Data_Size): Cache symbol - values to reduce number of lookups with S_GET_VALUE. Skip debug - symbols to avoid "a really nasty bug". (From Holger Teutsch, - holger@botbso.rhein-main.de.) - (VMS_write_object_file): For "__vt.*" symbols, set S_GET_OTHER - field. (Also from Holger Teutsch.) Watch for a would-be register - mask that spans frags. - - * config/obj-coffbfd.c (obj_coff_line): Set symbol lnno field with - this_base, not line_base. (Patch from Andreas Arens, - ari@obelix.av.rwth-aachen.de.) - - * config/obj-aout.c (obj_crawl_symbol_chain): Retain symbols that - look local if they're exported or undefined. Used to be done for - i960 only. - - * read.c (s_lcomm, s_comm): Print symbol name being redefined. - Get it from the looked-up symbol, instead of using the string from - the input stream, which is no longer null-terminated. - (LEX_PCT): New macro, defaults to 0. - (lex_type): Use it for `%'. - - * config/tc-vax.c (md_parse_option): Handle `-h#' option for VMS. - (vip_op): Now static, and returns void. Callers changed. Added - forward decl. - (vip): Ditto. Call as_fatal directly if a program bug is - detected. - (op_hash): Let default initialization suffice. - - * Makefile.in (literal.o): Provide dependencies. - - * configure.in: Set new makefile variable OPCODES_LIB. - * Makefile.in (LIBS): Use it. - - * Makefile.in (make-gas.com, stamp-mk.com): New targets. - * vmsconf.sh: New file. - * make-gas.com: Regenerated from new script. - - * configure.in (sparc*-*-lynxos*): Handle any version number - suffix after "lynxos". Set emulation to lynx. - -Mon Mar 14 11:30:49 1994 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * config/obj-coff.c (obj_coff_section): Delete declaration. - -Fri Mar 11 22:25:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-ppc.c (md_pcrel_from): Return 0 for undefined ELF - symbols. - (ppc_is_toc_sym): Change .toc to .got. - (md_apply_fix): Change handling of ELF relocs. - (tc_gen_reloc): Likewise. - -Fri Mar 11 17:42:20 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/obj-vms.c (Close_VMS_Object_File): Add comment pointing - out some code that doesn't belong in this file. - - * config/obj-vms.h: Include aout/stab_gnu.h. - (N_GSYM, ..., N_LENG): Deleted. - (NO_RELOC): Undefine before defining as part of enum reloc_type. - - * config/tc-alpha.c: Add comment questioning need for all the - characters in FLT_CHARS. - - * as.c (main) [OBJ_VMS]: Don't call output_file_close. - - * config/obj-ecoff.c (ecoff_frob_file): Set strict order for - sections with recognized names, before computing VMA values. - -Fri Mar 11 17:56:23 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_ip): Accept numbers between 0x8000 and - 0xffff for 'j' to be compatible with MIPS assembler. These - numbers are actually treated as negative. - -Thu Mar 10 13:36:29 1994 Doug Evans (dje@canuck.cygnus.com) - - * config/tc-sparc.h (LOCAL_LABEL): Local labels are .Lfoo. - -Tue Mar 8 21:17:12 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/obj-coff.c: Minor formatting/stylistic changes, plus: - (obj_coff_section): Declare. - (obj_pseudo_table): Make it available only if MANY_SECTIONS. - (obj_symbol_to_chars) [CROSS_COMPILE]: Some attemps to make this - work. It still doesn't. It now fails to compile, instead of - silently compiling to do nothing. - * config/obj-coff.h (SEPARATE_STAB_SECTIONS): Define only if - MANY_SECTIONS. - (OBJ_PROCESS_STAB) [! MANY_SECTIONS]: New macro, just emits - warning. - - Handle Alpha load-immediate-FP pseudo-instructions: - * config/alpha-opcode.h (ldif, ldig, ldis, ldit): New patterns. - * config/tc-alpha.c (lit8_sec, lit4_sec, lit8_sym, lit4_sym): New - variables. - (create_literal_section): New function. - (create_lita_section): Now a macro. - (get_lit8_offset, get_lit4_offset): New functions. - (maybe_set_gp): New function. - (select_gp_value): Call it. - (load_expression): Preserve addend if symbol is a section symbol. - (alpha_ip): Handle new operand type `F' for floating-point - constants; store them in .lit{4,8} sections. - (alpha_ip, case 'G'): Emit LITUSE relocations for symbol exprs. - - * config/tc-i386.c (smallest_imm_type): Never return Imm1. - -Tue Mar 8 14:18:15 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * config/obj-coffbfd.c (w_strings): Only copy strings out if - their symbols are going to be written. - -Tue Mar 8 11:49:27 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * messages.c (as_perror): Declare arguments const. - * as.h (as_perror): Change declaration. - -Mon Mar 7 16:08:25 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (load_address): When calling frag_grow, allow - for the (up to) two nops which may be inserted by append_insn if - mips_optimize is 0. - (macro): Likewise. - -Thu Mar 3 11:37:55 1994 Doug Evans (dje@canuck.cygnus.com) - - * config/atof-ieee.c (make_invalid_floating_point_number): - Add cast to avoid warning from gcc. - -Wed Mar 2 10:31:01 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c: Add a few casts to make HP C compiler happy. - - * config/obj-som.c (obj_som_version, obj_som_copyright): Be - prepared - to handle an error from bfd_som_attach_aux_hdr. - - * config/tc-hppa.h: Wrap ELF specific decls inside an ifdef. - -Mon Feb 28 15:03:26 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/tc-alpha.c (md_atof): Omit warning about FP values. - (line_comment_chars): Add ! to list. - (md_apply_fix): Do process 32- and 64-bit relocations. - - * config/obj-coffbfd.c (obj_coff_lcomm): Put "#if 0" around the - unused parts (most of the function). - (obj_coff_init_stab_section): Cast alloca result. - - * configure.in (i960-*-coff, i960-*-vxworks5.*): Use coffbfd, and - gas_target ic960coff. - * config/ic960coff.mt: New file. - * config/obj-coffbfd.h [TC_I960]: Include coff/i960.h. - (TARGET_FORMAT) [TC_I960]: Use coff-Intel-little. - * config/te-ic960.h (CROSS_COMPILE): Don't undef this. We'll - always build little-endian object files. - * config/tc-i960.c (md_reloc_size): Don't define at all if BFD or - BFD_ASSEMBLER is defined. - (mem_fmt): Since COFF doesn't handle callx relocations yet, treat - them like normal 32-bit relocations. - (md_apply_fix): For callx relocations, store zero. - (tc_bout_fix_to_chars): Store symbol index for all callx - relocations, regardless of link-relax setting. - (tc_coff_fix2rtype, tc_coff_sizemachdep): New functions. - (i960_handle_align) [! OBJ_BOUT]: If link-relax option is - selected, print an error message and clear it. - * config/tc-i960.h (BFD_ARCH, COFF_FLAGS, COFF_MAGIC, - TC_COUNT_RELOC, TC_COFF_FIX2RTYPE, TC_COFF_SIZEMACHDEP, - tc_fix_adjustable): New macros. - (tc_coff_fix2rtype, tc_coff_sizemachdep): Declare. - -Fri Feb 25 20:56:57 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (hppa_tc_symbol): Call PA ELF BFD version. - (hppa_tc_make_sections): Likewise. - (pa_build_symextn_section): Delete unused function. - (hppa_tc_make_symextn_section): Likewise. - (pa_export): Delete call to pa_build_symextn_section. - - * config/tc-hppa.h (hppa_tc_symbol): Add extern decl. - (elf_hppa_final_processing): Delete extern decl. - (hppa_tc_symbol): Delete extern decl. - -Fri Feb 25 13:15:31 1994 Ian Lance Taylor (ian@cygnus.com) - - * config/obj-coffbfd.c (fill_section): Correct test for whether to - fill a section (from Minh Tran-Le ). - -Thu Feb 24 11:30:26 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * configure.in: Don't require version number for i386-*-mach. - - * read.c (potable): Added ".this_GCC_requires_the_GNU_assembler", - which is ignored by gas, but will cause other assemblers to choke. - Intended for use by gcc ports that require gas instead of native - assemblers. - -Thu Feb 24 07:10:31 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/ho-hppaosf.h: Fix braino in test for ANSI-C. - -Wed Feb 23 16:51:43 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * write.c (write_contents): Give the user a reasonable error - message rather than "assertion failed" if bfd_set_section_contents - fails. - -Tue Feb 22 10:07:32 1994 Ken Raeburn (raeburn@rtl.cygnus.com) - - * config/ho-mach3.h: New file. - -Mon Feb 21 11:41:18 1994 Ian Lance Taylor (ian@cygnus.com) - - * ecoff.c (ecoff_build_debug): Don't set hdr->magic here. It is - now set in bfd/ecofflink.c:ecoff_write_symhdr. - - * config/obj-coffbfd.c (write_object_file): use bfd_get_error (), - not bfd_error. - * config/obj-elf.c (elf_frob_file): Likewise. - - * read.c (s_lcomm): Use an alignment power of 3 for 8 byte .lcomm - variables. - - * config/ho-hpux.h (BROKEN_ASSERT): Define if not __GNUC__. - - * read.c (read_a_source_file): Use correct arguments to memcpy - (broken 19 Jul 1993). From kjd@pescadero.stanford.edu (Kenneth - Duda). - -Sun Feb 20 18:01:54 1994 Ian Lance Taylor (ian@lisa.cygnus.com) - - * config/obj-coff.h (obj_coff_section): Declare. - * config/obj-coff.c (obj_pseudo_table): For "section", use - obj_coff_section. - (obj_coff_section): Rewrite. - -Fri Feb 18 14:16:32 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * configure.in (i386-*-mach3*): New target; uses BFD. - * config/te-mach.h: New file. - * config/obj-aout.c (obj_aout_frob_file): New function. - * config/obj-aout.h (obj_aout_frob_file): Declare it. - (frob_file): New macro. - * config/tc-i386.c (md_apply_fix_1) [TE_Mach]: Don't adjust - pcrel32 relocations. - * config/tc-i386.h (TARGET_FORMAT) [TE_Mach]: Use a.out-mach3. - - * write.c (write_object_file): Removed register declarations. - -Thu Feb 17 16:25:18 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - Some support for PowerPC ELF. - * configure.in: If cpu is powerpc*, use ppc. - (ppc-*-sysv4*): Use object format elf. - * config/tc-ppc.h: Only declare a number of things if OBJ_COFF is - defined. - (TARGET_ARCH): Make it call ppc_arch. - (ppc_arch): Declare. - (TARGET_FORMAT): Set based on OBJ_COFF or OBJ_ELF. - (NO_STRING_ESCAPES): Define. - (LOCAL_LABEL, FAKE_LABEL_NAME): Define for OBJ_ELF. - * config/tc-ppc.c: Only define a number of functions of OBJ_COFF - is defined. - (md_pseudo_table): Most pseudo-ops are OBJ_COFF specific. Added - OBJ_COFF specific "bi" and "ei". - (md_parse_option): Fix handling of -u. Make -m601 set - PPC_OPCODE_601. If OBJ_ELF, accept -V and -Q. - (ppc_set_cpu): New function. - (ppc_arch): New function. - (md_begin): Call ppc_set_cpu. - (ppc_insert_operand): For a signed operand accept an unsigned - value, for IBM compatibility. - (ppc_byte): Don't call stringer for strings; instead, treat two - double quotes as a single double quote. - (ppc_comm): Set sy_tc.output for a .lcomm symbol. - (ppc_biei): New function. - (ppc_tc): If not OBJ_COFF, ignore first argument. - (ppc_fix_adjustable): Call as_bad_where, not as_bad. - (ppc_is_toc_sym): New function. - (md_apply_fix): Use ppc_is_toc_sym. Handle BFD_RELOC_16 and - BFD_RELOC_8. - -Thu Feb 17 09:29:37 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * messages.c (as_perror) [BFD_ASSEMBLER]: Use bfd_get_error and - bfd_set_error and new error names. - -Tue Feb 15 20:23:20 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * configure.in: Support i960-vxworks versions > 5.0 as coff. - Default is still bout if no version is specified. - - * atof-generic.c (atof_generic): Use switch and strcasecmp instead - of large number of compares when looking for inf/nan values. - -Fri Feb 11 13:13:27 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (macro): Do unaligned loads and stores - correctly when big endian, and give errors on overflow rather than - generating incorrect code. - -Thu Feb 10 11:24:20 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * as.c: Include libiberty.h. - - * read.c (do_align): Don't define label just_record_alignment - unless it might be used. - - * as.c (main): If md_parse_long_option is defined, call it with a - long option. - * config/tc-mips.h (md_parse_long_option): Define. - * config/tc-mips.c (mips_trap): New static variable. - (md_begin): Report an error if mips_trap is set at ISA level 1. - (macro): If mips_trap, use trap instructions instead of break - instructions for overflow and divide by zero detection. - (mips_parse_long_option): New function. Support --trap, - --no-break, --break and --no-trap. - * doc/as.texinfo: Document new options. - - * read.c (potable): Add "zero". - * config/tc-i386.c (md_pseudo_table): Remove "zero". - * config/tc-m88k.c (md_pseudo_table): Likewise. - -Thu Feb 10 01:24:27 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/tc-sparc.c (sparc_ip): Reject integer values for - pc-relative operand fields. This forces "call 0" to become "jmpl - %g0,%o7" with no relocations needed. - -Wed Feb 9 13:08:32 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * as.h (xmalloc, xrealloc): Declare using PTR rather than char *. - * xmalloc.c (xmalloc, xrealloc): Use PTR rather than char *. - - * app.c (do_scrub_next_char): If NO_STRING_ESCAPES is defined, - don't treat backslash specially inside strings. - * read.c (next_char_of_string): Likewise. - -Wed Feb 9 09:42:45 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config/obj-coffbfd.c (obj_coff_init_stab_section): Use memset - instead of memcpy to zero the initial stab symbol, duh. - * config/obj-elf.c (obj_elf_init_stab_section): Ditto. - * config/obj-som.c (obj_som_init_stab_section): Ditto. - -Tue Feb 8 17:25:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * write.c (fixup_segment): Use as_bad_where, not as_bad. - - * subsegs.c (subseg_set_rest): Call memset with the arguments in - the right order. Explicitly clear fix_root and fix_tail fields. - -Tue Feb 8 16:00:25 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/obj-coff.c (coff_frob_symbol): For abs_symbol, set *punt - and do nothing else. - - * symbols.c (symbol_begin): Initialize value of abs_symbol - properly. - - * write.c (adjust_reloc_syms): Use abs_symbol instead of calling - section_symbol. - - * ecoff.c (ecoff_build_debug): Fix "/*" in comment to silence - complaint from "gcc -Wall". - - * configure.in (alpha-*-netware*): New target, like alpha-*-osf*. - - * config/tc-alpha.c (GP_ADJUSTMENT): Move definition to start of - file. - (tc_gen_reloc): Remove uninitialized variable `code', and code - that tried to use it (incorrectly). For LITERAL reloc, set addend - to negative of GP value. - (load_symbol_address): Don't adjust return value by GP_ADJUSTMENT. - - * write.c (write_relocs): Print some sensible error message if - bfd_perform_relocation returns bfd_reloc_overflow. - -Mon Feb 7 15:49:24 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * configure.in (hppa*-*elf*): New configuration for PA ELF. - (hppa*-*-osf*): Default object format is SOM. - -Mon Feb 7 16:07:35 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/tc-alpha.c (md_atof): Warn that floating-point values - might not assemble properly. - - * configure.in (target alpha-*-osf*): Don't set "dev=yes" any - more. - - * config/tc-alpha.c (load_expression): Parenthesize operations in - range checking, to avoid precedence questions. - - * config/tc-alpha.c (addr32): New static variable. - (md_parse_option): Set it for "-32addr". - (load_symbol_address): If addr32 is set, use ldl instead of ldq. - - * atof-generic.c (atof_generic): Calculate maximum_useful_digits - and more_than_enough_bits_for_digits in integer arithmetic, to - eliminate the only sources of dependence on floating point - support, which doesn't work yet on the Alpha. - -Mon Feb 7 03:56:05 1994 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * ecoff.c (ecoff_build_debug) [TC_ALPHA]: Specify version stamp as - 0x30b for Alpha for now, until ".verstamp" is handled. - - * literal.c (add_to_literal_pool): Use seginfo->frchainP, which - actually refers to the literal pool section, rather than - frchain_now, which refers to whatever section the assembler was - in. - - * write.c (fixup_segment): Only do range checking if size of fixup - is smaller than word size. Otherwise, we always wind up with - zeros. - - * config/tc-alpha.c (md_section_align): Change second argument and - return type to valueT, to agree with tc.h. - (alpha_do_align): Local static array nop_pattern is now unsigned - char, to avoid overflow warnings. - * config/tc-alpha.h (md_section_align): Delete declaration. - - * config/obj-ecoff.c (ecoff_frob_file): Ensure that ecoff_data for - output bfd is non-null before indirecting through it. - - * config/tc-alpha.c (alpha_frob_ecoff_data): Renamed from - alpha_frob_file. - * config/tc-alpha.h (tc_frob_file): Macro deleted. - * config/obj-ecoff.c (ecoff_frob_file) [TC_ALPHA]: Call - alpha_frob_ecoff_data, then fill in optional-header info with gp - value and register masks. - -Sun Feb 6 16:13:47 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * configure.in (hiux): Fixes from m-kasahr@sramhc.sra.co.JP. - - * config/obj-som.c (obj_som_init_stab_section): Same change - as coffbfd and elf below. Zero the initial stab symbol after - allocating it. - -Sat Feb 5 12:30:32 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config/obj-coffbfd.c (obj_coff_init_stab_section): Zero the - initial stab symbol after allocating it. - * config/obj-elf.c (obj_elf_init_stab_section): Ditto. - -Sat Feb 5 11:53:31 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_ip): addb[tf] should only accept - non-negated condition completers. Add support for addb pseudo-op - which accepts both negated and non-negated completers. - -Sat Feb 5 00:15:49 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * configure.in (rs6000*): Use cpu_type ppc. - (ppc-*-aix*): New target; use coff and force bfd_gas. - * config/tc-ppc.h, config/tc-ppc.c: New files for PowerPC/POWER - (RS/6000) support. At the moment, only XCOFF is supported. - - * config/obj-coff.c (SA_SET_SYM_ENDNDX): Made non-static. - (S_SET_DATA_TYPE): Likewise. - (coff_last_function): Renamed from local static last_functionP in - coff_frob_symbol and made externally visible. - (coff_frob_symbol): New local static set_end; use it to try to - avoid calling SA_SET_SYM_ENDNDX on a symbol that will be punted. - * config/obj-coff.h (S_SET_DATA_TYPE): Declare. - (SA_SET_SYM_ENDNDX): Declare. - (coff_last_function): Declare. - - * expr.c (operand): If DOLLAR_DOT is defined, accept `$' as - equivalent to `.' to mean the current location. - - * read.c (LEX_BR): If not defined, define as 0. - (lex_type): Use LEX_BR as the type of `{',`}',`[',`]'. - - * symbols.c (symbol_new): If tc_canonicalize_symbol_name is - defined, call it with preserved_copy_of_name. If - tc_symbol_new_hook is defined, call it on the new symbol. - (symbol_find_base): If tc_canonicalize_symbol_name is defined, - call it on a copy of the name argument. - - * write.c (write_object_file): Simplified usage of obj_frob_symbol - and tc_frob_symbol. Always call both if the symbol is going to be - output. - - * write.c (relax_segment): Use %ld rather than %d when printing - fragP->fr_var, and cast it to long. - - Changed relocs to be based on subsegments (when BFD_ASSEMBLER). - * subsegs.h (struct frchain): If BFD_ASSEMBLER, added new fields - fix_root and fix_tail. - (segment_info_type): If BFD_ASSEMBLER, don't define fix_tail - field. - * write.c (fix_new_internal): If BFD_ASSEMBLER, set fix_rootP and - fix_tailP based on frchain_now, not seg_info (now_seg). - (chain_frchains_together_1): Chain the subsegment relocs together. - * subsegs.c (subseg_change): Don't clear fix_tail field. - (subseg_get): Likewise. - * literal.c (add_to_literal_pool): Look through the relocs via - frchain_now, not seginfo. - -Thu Feb 3 23:07:30 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-ecoff.h (TARGET_SYMBOL_FIELDS): Changed - ecoff_undefined to ecoff_extern_size. - * config/obj-elf.h (ELF_TARGET_SYMBOL_FIELDS): Likewise. - * config/tc-mips.c (s_extern): Set ecoff_extern_size to the - external symbol size, rathern than setting the symbol value. - (md_estimate_size_before_relax): Check both ecoff_extern_size and - symbol value to see if GP referencing can be used. - * ecoff.c (ecoff_symbol_new_hook): Clear ecoff_extern_size, not - ecoff_undefined. - (ecoff_frob_symbol): Don't check ecoff_undefined. - (ecoff_build_symbols): Get size of an undefined symbol from - sym->ecoff_extern_size, not S_GET_VALUE (sym). - -Wed Feb 2 13:55:08 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * Makefile.in: Avoid bug in losing hpux sed. - -Wed Feb 2 11:40:11 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (file_mips_isa): New static variable. - (md_begin): Set it. - (s_mipsset): Add support for .set mipN to set the ISA level. - - * gasp.c (kinfo): Fully bracket initializer. - -Tue Feb 1 19:28:12 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * gasp.c (malloc): Don't declare, since host.h or system header - files may declare it differently. - - * config/atof-ieee.c (int_to_gen): Now static. - - * config/ho-i386aix.h: Include sys/types.h and stdlib.h, not - ho-sysv.h. Based loosely on a patch from Minh Tran-Le. - -Tue Feb 1 10:50:17 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * gasp.c: Include host.h. - -Tue Feb 1 12:13:01 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_ip): Make an unsupported instruction a - warning, not an error. - - * config/obj-coff.c (dot_text_symbol, dot_data_symbol, - dot_bss_symbol): Don't define if BFD_ASSEMBLER. - (obj_symbol_to_chars): bfd_coff_swap_aux_out now takes more - arguments. - (coff_line_base): Renamed from line_base. Changed all uses. - (coff_add_linesym): Renamed from add_line_sym. Made non-static. - Changed all uses. - * config/obj-coff.h: If TC_PPC, include coff/rs6000.h. - (S_SET_STORAGE_CLASS, S_GET_STORAGE_CLASS): Declare if - BFD_ASSEMBLER. - (coff_line_base): Declare. - (coff_add_linesym): Declare if BFD_ASSEMBLER. - * config/obj-coffbfd.c (symbol_to_chars): bfd_coff_swap_aux_out - now takes more arguments. - -Mon Jan 31 17:55:14 1994 Stan Shebs (shebs@andros.cygnus.com) - - * as.c (statistics_flag): Renamed from quiet_flag. - (main): Get statistics with --statistics instead of -noquiet. - -Mon Jan 31 07:19:30 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * Makefile.in: Support for Gnu ASsembler Preprocessor. - * gasp.c: New file. - * read.c (s_lcomm): Align lcomm data. - * config/tc-z8k.c (tc_reloc_mangle): Don't allow subtraction - from different sections. - -Sun Jan 30 14:58:26 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * write.c (write_object_file): If tc_frob_file is defined, call it - just before calling obj_frob_file. - * config/tc-alpha.c (alpha_gp_value): Renamed from gp_value - (references changed), and made non-static. - (getExpression): Return void. - (select_gp_value): Abort if gp_value is non-zero. Delete call to - non-existent bfd_set_gp_value. - (alpha_validate_fix): Function deleted. - (alpha_frob_symbol): Function deleted. - (alpha_local_label): Function deleted. - (alpha_frob_file): Renamed from alpha_end. - * config/tc-alpha.h (alpha_frob_symbol, alpha_validate_fix, - alpha_local_label, alpha_end): Declarations deleted. - (alpha_gp_value, alpha_frob_file): Declare. - (tc_frob_symbol, TC_VALIDATE_FIX, md_end): Macros deleted. - (LOCAL_LABEL): Move code here from tc-alpha.c:alpha_local_label. - (md_convert_frag): Simplified slightly. - (tc_frob_file): New macro. - - * read.c (do_align): New function, most of guts of s_align_* - functions. Look for md_do_align macro, give it a chance to bypass - all but recording of section alignment. - (s_align_bytes, s_align_ptwo): Call do_align. - (s_lcomm) [TC_ALPHA]: Align object to largest power of two that - divides object size. - - * frags.c (frag_align_pattern): New function. - (frag_align): Rewrite for clarity. - - * config/tc-vax.c (md_assemble): Handle O_constant expression. - (vip_begin): Returns pointer to const char. Cast hash_insert arg - to PTR to avoid compiler complaints about const. - (md_begin): Local variable errtxt must point to const. - - * configure.in: Handle host vax-*-ultrix* like vax-*-bsd*. Don't - bother with *-*-ultrix or *-*-sysv*, except *-*-sysv, since only - the last has an existing host support file. Do handle vax-bsd and - vax-ultrix targets. - -Fri Jan 28 11:26:40 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-coff.c (obj_coff_section_header_append): Do not - declare if BFD_ASSEMBLER. - (stack_pop): Correct test for stack underflow. - (obj_coff_endef, obj_coff_dim, obj_coff_line, obj_coff_size, - obj_coff_scl, obj_coff_tag, obj_coff_type, obj_coff_val): Declare - type of ignored argument to avoid gcc warning. - (align): Removed unused function. - -Thu Jan 27 18:14:19 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/tc-alpha.c, config/tc-alpha.h, config/alpha-opcode.h: New - files, based on port of gas-1.38 contributed by CMU, using a.out - variant. Updated for gas-2.x and ECOFF. Floating-point constants - are still broken, bootstrap testing incomplete. - - * literal.c: Comment changes. - - * listing.c (listing_source_file): Check for null listing_tail - before indirecting through it. - - * expr.h (struct expressionS): Added struct tag. - - * as.h: If __GNUC__ and inline are both undefined, define inline - away. - - * write.c (cvt_frag_to_fill): Don't assume that fr_var for - rs_align or rs_org frags will be 1. - (relax_segment): For rs_align, if fr_var is not 1, complain if - required padding is not a multiple of the size of the pad pattern. - (fixup_segment): Leave gp-relative relocations alone. For pcrel - relocations referring to the same segment, clear fx_pcrel when - clearing fx_addsy. - * as.h: Adjust comments on rs_align. - - * atof-generic.c: Some reformatting. - (atof_generic): Be careful when mixing signed/unsigned values of - different sizes. - - * write.c, config/obj-{aout,bout,coff*}.c, config/tc-sparc.c: - Query the fx_done field instead of fx_addsy to see if the fixup - still needs to be applied. Set fx_done and clear fx_addsy both, - for now. If TC_HANDLES_FX_DONE isn't defined, assume md_apply_fix - will only clear fx_addsy, and set fx_done accordingly after - returning. - * config/tc-sparc.h (TC_HANDLES_FX_DONE): Define. - * config/tc-sparc.c (md_apply_fix): Set fx_done for non-pcrel fix - with no fx_addsy. - - * symbols.c (dot_text_symbol, dot_data_symbol, dot_bss_symbol): - Deleted. - (symbol_begin): Moved to end of file, so function inlining can - work better. - (fb_label_count, fb_label_max): Default C static initializers are - sufficient. - * symbols.h (dot_text_symbol, dot_data_symbol, dot_bss_symbol): - Declarations deleted. - * config/obj-coff.c (dot_text_symbol, dot_data_symbol, - dot_bss_symbol): Defined here, static. - - * config/obj-aout.c [BFD_ASSEMBLER]: Undef NO_RELOC before - including aout/aout64.h. - - * write.c (write_object_file): If EMIT_SECTION_SYMBOLS is false, - don't write out a section symbol even if it's used in a - relocation; assume relocations will handle section numbers - somehow. Rename "punt_it" label to "punt_it_if_unused" to reflect - it's true use. - (EMIT_SECTION_SYMBOLS): Default to 1. - (adjust_reloc_syms): Don't create a new symbol for an absolute - reference; just use the absolute section symbol. - (write_relocs): Make printout of reloc values dependent on flag - DEBUG3, not DEBUG2. - * config/obj-aout.h (EMIT_SECTION_SYMBOLS): Define as 0. - * config/obj-ecoff.h (EMIT_SECTION_SYMBOLS): Ditto. - -Thu Jan 27 16:43:51 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * read.c (lex_type): No longer make '{' a valid character for - symbol names. - - * as.c (main): Print long values using %ld. - - * messages.c (as_warn_internal): New static function. - (as_warn, 3 versions): Use as_warn_internal. - (as_warn_where, 3 versions): New function. - * as.h (as_warn_where): Declare. - -Tue Jan 25 18:30:34 1994 Stan Shebs (shebs@andros.cygnus.com) - - * as.c (quiet_flag): New flag. - (main): If -noquiet given, display execution time and memory used. - -Tue Jan 25 15:53:11 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * doc/{all.texi,as.texinfo}: Add documentation for HPPA port. - -Mon Jan 24 19:18:23 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.c (ecoff_frob_symbol): New function. Put undefined - symbols of known size in the undefined section. Put small common - symbols in a .scommon section. - * ecoff.h (ecoff_frob_symbol): Declare. - * config/obj-ecoff.h (obj_frob_symbol): Define. - * config/obj-elf.c (obj_elf_write_symbol_p, obj_elf_write_symbol, - obj_elf_frob_symbol): Removed unused functions. - * config/obj-elf.h (obj_frob_symbol, obj_write_symbol): Removed - unused macros. - (obj_elf_frob_symbol, obj_elf_write_symbol): Removed declarations - of unused functions. - (obj_frob_symbol): Define if ECOFF_DEBUGGING. - - * tc-mips.c (g_switch_seen): New static variable. - (md_parse_option): Set g_switch_seen for -G option. - (s_option): If creating PIC code, force the GP size to be 0. Warn - if -G switch used with a non-zero value. - - * symbols.c (S_IS_COMMON): Use bfd_is_com_section rather than - comparing against bfd_com_section. - -Mon Jan 24 14:12:25 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * read.c (s_lcomm): Treat Alpha like MIPS in handling of .sbss - section. - -Thu Jan 20 13:17:58 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * expr.c (operand): For floating point operand with unusual fp - char from FLT_CHARS, preserve the character. Patch from Lisa - Repka. - -Wed Jan 19 23:15:24 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (md_pseudo_table): Add all data allocation - pseudo-ops: .hword, .int, .long, .octa, .quad, .short, .single. - -Tue Jan 18 15:51:59 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * config/obj-coffbfd.c (obj_coff_endef): For C_EFCN, C_BLOCK and - C_FCN assume .val has been set to . - -Tue Jan 18 16:19:58 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c: Disable multiple $CODE$ subspace code. It - confuses GDB for some unknown reason. - * cofnig/obj-som.c: Likewise. - -Tue Jan 18 19:05:32 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * literal.c (add_to_literal_pool): Handle duplicates of values - already written to literal pool. - -Tue Jan 18 17:23:52 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-aout.c (obj_aout_frob_symbol): Try to get symbols - with explicitly marked stabs through BFD: if a symbol marked - N_UNDF | N_EXT is in the absolute section, move it to the - undefined section; move a symbol marked N_INDR into - bfd_ind_section and set the BSF_INDIRECT flag; set the - BSF_WARNING flag for a symbol makred N_WARNING. - -Mon Jan 17 15:40:23 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (ecoff_set_gp_prolog_size): Declare. - * ecoff.c (ecoff_set_gp_prolog_size): Return type is void. - -Mon Jan 17 00:18:55 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_ip): Explicitly check for comma before 'u' - and 'f' template operand. - - * config/tc-hppa.c (pa_ip): Handle 'N', 'O', 'o', '0', '1', 'u', - and '2' in copr and sfu instruction templates. - -Sun Jan 16 16:44:23 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * as.h (subseg_force_new): Add prototype. - -Sat Jan 15 09:20:55 1994 Doug Evans (dje@canuck.cygnus.com) - - * app.c (do_scrub_next_char): Allow lines like " foolab :". - - * read.c (emit_expr): Fix computation of mask. - * config/obj-elf.c (obj_elf_section): Fix loop termination test. - -Thu Jan 13 16:15:15 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * ecoff.c (ecoff_set_gp_prolog_size): New function. - (current_file_idx): New static variable. - (add_file): Use and increment current_file_idx instead of indx - parameter. - - * struc-symbol.h (struct symbol): Make all bitfields unsigned. - - * config/tc-i960.c (i960_validate_fix): Added argument - add_symbolPP. Indirect through it to get "add_symbolP". - * config/tc-i960.h (i960_validate_fix): Supply prototype. - (TC_VALIDATE_FIX): Pass address of add_symbolP. - - * configure.in (i386-*-netbsd*): New target, using te-netbsd.h. - (i386-*-netbsd0.8): New target, like 386bsd. - - * configure.in: Set BFDDEF in Makefile to "define" or "undef". - * Makefile.in (config.h): Protect against multiple inclusions. - Define or undef BFD_ASSEMBLER as specified by $(BFDDEF). - (ALL_CFLAGS): Omit $(BFDDEF). - * as.h: Include config.h. - (struct symbol): Added forward declaration. - (add_to_literal_pool): Fix declaration. - * as.c: Don't include config.h. - - * literal.c (add_to_literal_pool): Take symbol and addend as - arguments, instead of expression, for now. Fix calculation of - offset to return. - - * subsegs.h (segment_info_type) [NEED_LITERAL_POOL]: Add field - literal_pool_size. - -Thu Jan 13 12:14:21 1994 Jeffrey A. Law (law@snake.cs.utah.edu - - * subsegs.c (subseg_get): Accept new argument "force_new". If - set then a new segment is always created. All callers changed. - (subseg_force_new): New function. Similar to subseg_new, but - always force a new segment to be created. - - * config/obj-som.c (som_frob_file): Call adjust_code_sections - for each section. - (adjust_code_sections): New function. Adjusts the VMA for all the - $CODE$ subspaces. - - * config/tc-hppa.c (md_assemble): Also handle creating a fixup - for the unwind descriptors if a function's label follows the - .PROC and .ENTRY directives. - (pa_entry): Don't set BSF_FUNCTION for the label symbol here; it - is done elsewhere. Don't create a fixup for the unwind - descriptors if the function's label has not been defined yet. - (pa_proc): For SOM, place each procedure within a new $CODE$ - subspace. Adjust the segment and frag for the associated - function label if it exists. - -Wed Jan 12 22:05:33 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (hppa_fix_struct): Add new "segment" field. - (hppa_fix_new): Initialize segment field. - (md_apply_fix): Do nothing for pc-relative fixup which involves - crossing a segment boundary. - (pa_procend): Undefine the current label after handling .PROC - and .PROCEND directives. - (dummy_symbol): Make type "symbolS *". Change references as - appropriate. - -Wed Jan 12 13:29:31 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * read.c (read_a_source_file): Cast array argument to unsigned - char. - * write.c (adjust_reloc_syms): Remove unused variable symseginfo. - (write_object_file): Don't define punt_it if it won't be used. - (fixup_segment): Don't define skip if it won't be used. - - * config/tc-mips.h (TARGET_FORMAT): Define as mips_target_format. - (mips_target_format): Declare. - * config/tc-mips.c (mips_target_format): Define with appropriate - default definition. - (md_parse_option): If -EL or -EB is used, change byte_order and - mips_target_format as appropriate. - -Tue Jan 11 21:52:36 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * app.c (do_scrub_next_char): Another attempt to fix bugs - dealing with labels without colons (for HPPA and MRI). - -Tue Jan 11 17:01:06 1994 Doug Evans (dje@canuck.cygnus.com) - - * config/tc-sparc.c (sparc_ip): Truncate args to %hi/%lo to 32 bits. - - * expr.c (integer_constant): Fix computation of too_many_digits. - Variable digit_2 renamed to start. Fix check for whether number - will fit in 32 bits. - * read.c (emit_expr): Use valueT instead of long. - -Tue Jan 11 13:01:20 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-elf.c: If TC_MIPS, include elf/mips.h. - (special_sections): Define. - (obj_elf_special_section): Get default types and attributes from - list of special sections. - * config/tc-mips.c (ELF_TC_SPECIAL_SECTIONS): Define. - - * config/obj-ecoff.c (ecoff_frob_file): Force .sdata and .sbss - sections to be close together. - - * config/tc-mips.c (macro): Corrected $at warnings in a couple of - spots. - - * listing.c (listing_prev_line): New function. - * listing.c: Include subsegs.h. - (listing_prev_line): New function. - (calc_hex): Reset byte_in_frag to zero for each new frag. - * config/tc-mips.c (append_insn): Call listing_prev_line after - emitting nop instructions. - * Makefile.in (listing.o): Depends upon subsegs.h. - -Mon Jan 10 09:52:23 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_ip): Put check for missing label on .PROC - here. Handle case where label may be defined after the .PROC. - (pa_proc): It is not an error if the procedure's label isn't - defined before the .PROC directive. - -Sun Jan 9 04:43:30 1994 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * config/te-netbsd.h: New file. - * config/tc-i386.h (TARGET_FORMAT) [TE_NetBSD]: Use bfd target - a.out-netbsd-386 for this configuration. - -Fri Jan 7 17:38:28 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.c (ecoff_stab): Don't clobber the ECOFF symbol information - with the associated stabs information. - (ecoff_build_symbols): Never set the type of stabs symbols to - st_Global. Don't update the symbol index or ifd if the gas symbol - is not the same as the ECOFF symbol (which is now the case for - stabs symbols). - -Fri Jan 7 11:14:07 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config/tc-mips.c (macro): Add a LOSING_COMPILER ifdef that - splits the function. - (macro2): New function, if LOSING_COMPILER defined. - -Fri Jan 7 09:38:25 1994 Steve Chamberlain (sac@cygnus.com) - - * config/obj-coffbfd.c (fill_section): Don't ever fill past the - end of a section. (write_object_file): Temporary fix - setup - stdoutput. - -Thu Jan 6 18:05:21 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/tc-sparc.c (tc_gen_reloc): Fix handling of addends in - non-pcrel_offset relocations. - -Thu Jan 6 01:06:40 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_ip): Warn about using $1 as well as $at - without .set noat. - -Wed Jan 5 14:22:22 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * literal.c: New file. - * Makefile.in (REAL_SOURCES, OBJS): List it. - - * as.h (DEBUG): Don't define. - (struct expressionS, struct fix): Declare in case they're used in - prototypes. - (add_to_literal_pool) [BFD_ASSEMBLER]: Declare. - - * config/tc-mips.h (TARGET_FORMAT) [OBJ_AOUT]: Fix for new names - in bfd. - - * subsegs.c (subseg_get): New function. Creates segment if - needed, returns pointer, but doesn't change current segment. - (subseg_new): Use it. - -Tue Jan 4 15:12:43 1994 Stan Shebs (shebs@andros.cygnus.com) - - * Makefile.in (INCLUDES): Add $(srcdir)/.. to places to search. - * config/obj-ecoff.c: Include files as "bfd/" instead of "../bfd/". - * app.c, flonum.h, hex-value.c (const): Change #if to be more - portable. - -Tue Jan 4 22:11:34 1994 Rob Savoye (rob@darkstar.cygnus.com) - - * config/ho-vsta.h, configure.in: Add support for VSTa - micro-kernel. - -Thu Dec 30 15:27:16 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * write.c (write_relocs): bfd_perform_relocation now takes an - additional argument, to return an error string (which we ignore). - -Wed Dec 29 14:37:26 1993 Ken Raeburn (raeburn@cujo.cygnus.com) - - * write.h (struct fix): Field tc_fix_data should be type PTR, not - void*, for compatibility with non-ANSI compilers. Added - single-bit field "fx_done". - -Sun Dec 26 14:31:47 1993 Torbjorn Granlund (tege@adder.cygnus.com) - - * tc-hppa.c (pre_defined_registers): Convert to lower case. - Delete spurious register names "%r4L", etc. - (selector_table): Sort and convert to lower case. - (cons_fix_new_hppa): `reloc_type' => `rel_type'. - (pa_ip): Always use strcmp for non-text and strcasecmp for text. - (reg_name_search): Rewrite to call strcasecmp only once per - iteration. - (pa_chk_field_selector): Rewrite to use binary search. - (pa_parse_neg_add_cmpltr): Use strcasecmp for completer comparisons. - (pa_parse_space_stmt): $TEXT$ and $PRIVATE$ are symbols; use case - sensitive comparisons. - (pa_parse_space_stmt): Canonicalize strncasecmp arg to lower case. - (pa_space): "$text$" => "$TEXT$"; "$private$" => "$PRIVATE$". Use - case sensitive comparison for all symbolic names. - (pa_subspace): Canonicalize strncasecmp arg to lower case. - (pa_subspace_start): Use case sensitive comparison for symbolic names. - -Mon Dec 20 10:37:48 1993 Ken Raeburn (raeburn@cujo.cygnus.com) - - * write.c (adjust_reloc_syms) [RELOC_REQUIRES_SYMBOL]: If no - symbol is present (i.e., relocation against absolute), create a - phony local symbol, and use it in the reloc. - (fixup_segment): When adjusting a reloc with an absolute symbol, - have TC_FORCE_RELOCATION control clearing add_symbolP too. - * config/tc-sparc.h (RELOC_REQUIRES_SYMBOL): Define, for OBJ_COFF. - - * symbols.c (S_IS_EXTERNAL, S_IS_LOCAL): Don't use both BSF_EXPORT - and BSF_GLOBAL, since they're the same. - - * as.c (main): Only invoke md_end if it's defined as a macro. - * tc.h (md_end): Don't declare it. - * config/tc-*.[ch] (md_end): Deleted, in cases where it doesn't do - anything. - * config/tc-vax.c (vip_end): Deleted null function. - * config/tc-mips.c (md_mips_end): Renamed from md_end. - * config/tc-mips.h (md_mips_end): Declare. - (md_end): New macro, calls md_mips_end. - - * write.c (write_object_file): Don't close output file. - * as.c (main): Close output file (if needed) after calling - listing_print, which should be after calling write_object_file, - which sets the frag addresses. - - * config/obj-coff.c (obj_coff_dim, obj_coff_endef, obj_coff_line, - obj_coff_scl, obj_coff_size, obj_coff_tag, obj_coff_type, - obj_coff_val): Add unused int argument to satisfy prototypes; goes - with Ian's 10 Sep changes. - (S_GET_DATA_TYPE, S_SET_DATA_TYPE, S_GET_STORAGE_CLASS, - S_SET_STORAGE_CLASS): Now function instead of macros. - (obj_emit_lineno) [BFD_ASSEMBLER]: Deleted. - (tag_insert): Local var ERROR_STRING is const. Use "const" not - "CONST" for argument NAME. Fixed prototype. - (coff_frob_symbol): Removed explicit "#if 1" directive. If - S_IS_EXTERNAL, set storage class to C_EXT. - (s_get_name): Use "const" not "CONST". - * config/obj-coff.h (S_GET_DATA_TYPE, S_SET_DATA_TYPE, - S_GET_STORAGE_CLASS, S_SET_STORAGE_CLASS): Deleted. - (obj_emit_lineno): Declare only for non-BFD_ASSEMBLER. For - BFD_ASSEMBLER, define as macro that aborts. - (obj_extra_stuff, tc_headers_hook): Declare only for - non-BFD_ASSEMBLER. - (coff_frob_symbol): Fix prototype. - -Sun Dec 19 00:37:20 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.c (tc_gen_reloc): Test of pcrel_offset had sense - reversed. - -Thu Dec 16 21:13:11 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_begin): Initialize "dummy_label". - (tc_gen_reloc, SOM version): For relocations which have no symbol, - set sym_ptr_ptr to dummy_label. Avoids lossage in generic BFD code. - -Thu Dec 16 16:07:56 1993 Ken Raeburn (raeburn@cujo.cygnus.com) - - * read.c (lex_type): No longer make '[' a valid character for - symbol names. - - * config/tc-vax.c (tc_aout_fix_to_chars): Local variable - NBYTES_R_LENGTH now const. - - * config/obj-*.c, config/tc-*.c: Omit superfluous "return" - statements at ends of functions. Don't check for null return from - hash_new, since it won't return at all if there's no memory - available. Also, check for null return from hash_insert, rather - than zero-length string, as success indicator. - - * subsegs.c (section_symbol): New function. - * subsegs.h (section_symbol): Declare. - * write.c (adjust_reloc_syms): Use it. - -Wed Dec 15 15:39:53 1993 Ken Raeburn (raeburn@cujo.cygnus.com) - - * Makefile.in (RUNTEST): New variable. - (CHECKFLAGS): Pass it down. - - * ecoff.c (ecoff_directive_frame): Permit extra trailing operands; - unused for now, but supplied by Alpha OSF1 compiler. - - * as.h: Protect against multiple inclusions. - (int_to_gen): Don't declare. - - * config/atof-vax.c (atof_vax): NULL is not a valid character - constant. - -Tue Dec 14 21:38:25 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * configure.in (hppa*-*-osf*): Do not consider this a developmental - configuration. - - * config/tc-hppa.c (md_apply_fix): Handle cases where no - relocation will be emitted for 32bit formats. - -Mon Dec 13 23:33:40 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_apply_fix): Do not call hppa_field_adjust - for any of the 'T' field selectors. - -Sat Dec 11 11:23:12 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * config/tc-h8500.c (build_bytes): Get reloc type right for a - %page operation. (md_assemble): Don't modify input_line_pointer. - (mdcoff_sizemachdep): New function. - * config/tc-h8500.h (TC_COFF_SIZEMACHDEP): New macro. - * config/tc-z8k.c (get_operand): Delete bogus check. - -Wed Dec 8 16:31:51 1993 Ken Raeburn (raeburn@rtl.cygnus.com) - - * write.c (number_to_chars_*): Delete bogus range check. - - * output-file.c (TARGET_ARCH): No default. - -Tue Dec 7 16:02:53 1993 Steve Chamberlain (sac@jonny.cygnus.com) - - * config/tc-sh.c (md_convert_frag): Truncate disps before calling - md_number_to_chars. (md_assemble): Don't modify - input_line_pointer. - -Mon Dec 6 11:49:03 1993 Doug Evans (dje@canuck.cygnus.com) - - * config/tc-h8300.c (md_assemble): Don't update input_line_pointer. - -Mon Dec 6 11:20:02 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/obj-som.[ch] (obj_read_begin_hook): Remove last change. - Breaks with the HP compilers. - - * config/tc-hppa.c (struct call_info): Remove fields which were - set but never used. Remove all code which sets those fields. - (struct subspace_dictionary_chain): Likewise. - (struct space_dictionary_chain): Likewise. - (pa_desc): Delete useless function. Delete all references. - (hppa_tc_make_sections): No need to count the number of symbols for - the symbol extension section. - -Sun Dec 5 17:05:29 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/obj-som.c (obj_som_version): Pass version string to - SOM BFD backend. - (obj_som_copyright): New function. Much like obj_som_version. - - * config/tc-hppa.c (obj_copyright): Define as appropriate for - SOM and ELF. - (pa_copyright): Just a stub now. - - * config/obj-som.c (obj_read_begin_hook): Delete unused function. - * config/obj-som.h (obj_read_begin_hook): Provide dummy definition. - (TARGET_SYMBOL_FIELDS): Delete. SOM isn't making use of them. - - * config/tc-hppa.c (tc_gen_reloc, SOM version): Handle relocation - expansion due to rounding mode selectors. Handle R_[RDSN]_MODE - relocations for selecting the current rounding mode. - - * config/tc-hppa.c (evaluate_absolute): Support e_rrsel and - e_rlsel field selectors. - -Fri Dec 3 18:33:24 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-elf.h: If ECOFF_DEBUGGING, undef - SEPARATE_STAB_SECTIONS and INIT_STAB_SECTION, and define - OBJ_PROCESS_STAB to call ecoff_stab. - * config/obj-elf.c: Don't compile obj_elf_init_stab_section if - INIT_STAB_SECTION is not defined. - -Fri Dec 3 10:56:40 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_apply_fix): Delete old wrapper function. - (md_apply_fix_1): Rename to md_apply_fix. Fix argument decls. - Fix comments in various places. Always return a value. - Avoid dereferencing a NULL fx_addsy. - (hppa_force_relocation): Avoid dereferencing a NULL fx_addsy. - - Fri Dec 3 09:47:30 1993 Pete Hoogenboom (hoogen@cs.utah.edu) - - * tc-hppa.c: (tc_gen_reloc): Addend for a plabel relocation should - be either 0 or 2 (no static link or static link required). Always - assume no static link. - -Thu Dec 2 11:52:21 1993 Ken Raeburn (raeburn@cygnus.com) - - * config/tc-sparc.c (tc_gen_reloc): Make adjustment to addend be - dependent on howto fields, not on format flavour. - - * struc-symbol.h (struct symbol): New fields sy_obj and sy_tc, - defined as types OBJ_SYMFIELD_TYPE and TC_SYMFIELD_TYPE, if those - macros are defined. - * config/obj-coff.h (TC_SYMFIELD_TYPE, OBJ_SYMFIELD_TYPE): Define. - (TARGET_SYMBOL_FIELDS, I960_SYM_FIELDS): Don't define. - (sy_tc, sy_obj): Define so that the fields look like they used to, - until all references get changed. - - * write.c (fixup_segment): Lots of variables no longer register. - Reordered some code for easier reading. - * config/obj-coff.c (obj_coff_dim): dim_index no longer register. - Deleted superfluous return statement. - (obj_coff_line, obj_coff_size, obj_coff_scl, obj_coff_type, - obj_coff_val, tag_init, tag_insert): Deleted superfluous return - statement. - (align, obj_coff_section): Deleted debugging printfs. - * config/tc-i386.c (md_assemble): Discard some register decls. - Use assignment rather than memcpy to copy template. - (op_hash, reg_hash, prefix_hash): Default C initialization of - statics is sufficient. - * config/tc-sparc.c (print_insn): Array Reloc is now const, and - points to const. - - * config/obj-coff.h (TARGET_FORMAT): Only use coff-sparc-lynx if - TE_LYNX; use coff-sparc otherwise. - [USE_NATIVE_HEADERS]: Delete this code; it isn't used. - - * write.c (fixup_segment): Call TC_VALIDATE_FIX, if defined, - before processing a fixup. Call TC_ADJUST_RELOC_COUNT just before - returning. Remove some i960-coff-specific code. - (TC_ADJUST_RELOC_COUNT): Default to doing nothing. - * config/tc-i960.h (TC_ADJUST_RELOC_COUNT) [OBJ_COFF]: Define. - (i960_validate_fix): Declare. - (TC_VALIDATE_FIX): Define. - * config/tc-i960.c (i960_validate_fix): New function. - - * write.c (number_to_chars_littleendian): New function. Write out - bytes in little endian order, doing size and range checking. - (number_to_chars_bigendian): New function, similar. - * write.h: Declare them. - * config/tc-*.c (md_number_to_chars): Use them. - * config/tc-vax.c (md_apply_fix): Ditto. - * config/tc-i386.c (md_apply_fix): Ditto. - - * config/obj-coff.c: Rearranged code for handling line number - data. - (line_fsym): Renamed from function_lineoff in BFD_ASSEMBLER case, - since the usage is different from non-BFD_ASSEMBLER case. - (in_function, clear_function, set_function): New macros, to - combine some of the functionality implemented in differnet ways in - BFD_ASSEMBLER and non-... code. Used in other functions that used - to check function_lineoff &c. - (obj_emit_lineno): Split into two copies, one for BFD_ASSEMBLER, - one for not. Non-BFD_ASSEMBLER version now has temporary variable - to contain char* pointer pointed to by char** argument. Always - follow CROSS_COMPILE code; easier to read that way. - (obj_coff_ln): Don't call add_lineno or c_line_new if appline is - set. - (obj_coff_endef) [BFD_ASSEMBLER]: Don't do anything special for - ".bf", it's been done elsewhere. - (coff_frob_symbol): If ilne number data is pending, call - add_linesym to flush it. - (coff_frob_file): Don't do that here. - * config/obj-coff.h (coff_frob_file): Declare. - (obj_frob_file): Define, to call it. - - * config/tc-sparc.h (md_create_short_jump, md_create_long_jump, - md_estimate_size_before_relax: Define them as macros calling - as_fatal. - * config/tc-sparc.c: Don't define them as functions. - - * configure.in: Handle target alpha-*-osf*. (No cpu files yet.) - -Wed Dec 1 23:37:14 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * Makefile (clean): Depend on clean-here. - -Wed Dec 1 11:35:21 1993 Ken Raeburn (raeburn@cujo.cygnus.com) - - * config/ho-go32.h: Include fopen-bin.h. - * as.h: If FOPEN_WB isn't defined, include fopen-same.h. - * output-file.c (output_file_create): Use FOPEN_WB instead of "w". - * input-file.c (input_file_open): Use FOPEN_RT instead of "r". - * listing.c (file_info): Use FOPEN_RB instead of "rb". - * read.c (s_include): Use FOPEN_RT instead of "r". - - * stabs.c: Include obstack.h. - - * tc.h (md_create_long_jump): Don't declare if it's already - defined as a macro. - (md_create_short_jump, md_estimate_size_before_relax): Ditto. - - * messages.c (as_perror) [BFD_ASSEMBLER]: Use bfd_errmsg instead - of strerror. Clear bfd_error. - - * config/te-lynx.h (LOCAL_LABELS_FB): Define, if not already - defined. - -Wed Dec 1 10:41:56 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (hppa_elf_mark_end_of_function): New function. - (pa_process_exit, pa_procend): Call it for ELF objects. - -Wed Dec 1 12:10:41 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (macro): Subtract 8 from offset in non PIC l.d - case. See comment. From wilson@cygnus.com: for M_L_DAB, set - coproc before doing goto ld. - -Tue Nov 30 13:40:30 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * write.c (TC_FORCE_RELOCATION): Provide a default definition. - (fixup_segment): Allow the target machine to specify that a - relocation must be generated for a particular fixup. Remove - #ifndef TC_HPPA hack. - - * config/tc-hppa.h (TC_FORCE_RELOCATION): Define. - - * config/tc-hppa.c (md_apply_fix_1): Never change fx_addsy to - be NULL. Only fixup_segment is supposed to do that. - (hppa_force_relocation): New function. - -Tue Nov 30 11:21:41 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (stabs.o): Added dependencies. - - * config/obj-ecoff.c (ecoff_frob_file): Don't call bfd_set_symtab. - -Sun Nov 28 12:11:40 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * app.c (do_scrub_next_char): Output a TAB before any - .app* directive. - - * config/tc-hppa.c (fix_new_hppa): Make sure a sub_symbol - exists before trying to peek at its name. - (pa_space): Do not call pa_align_subseg. See hppa/unsorted/align3.s - for testcase. - (pa_align_subseg): Delete unused/unwanted function. - -Sat Nov 27 22:49:07 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * read.c (read_a_source_file): Fix test for when to stick a colon - on the end of a label. Make code conditional on either MRI or - LABELS_WITHOUT_COLONS. - - * app.c (do_scrub_next_char): If a line begins with whitespace, leave - the single whitespace character alone. Eat all others. - - * config/tc-hppa.h (LABELS_WITHOUT_COLONS): Define. - -Wed Nov 24 01:22:54 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_procend): Do not call process_exit. - (exit_processing_complete): Delete unwanted variable and all - references. - -Wed Nov 24 02:31:38 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.c (ecoff_setup_ext): Renamed from ecoff_build_ext. - Changed to not actually build the external symbol information, as - that is now done by the ECOFF back end. - (ecoff_build_debug): Changed accordingly. - * ecoff.h (obj_ecoff_set_ext): Declare. obj-format.c function - called by ecoff_setup_ext. - * config/obj-ecoff.c (ecoff_frob_file): If debug_info count is 0, - set corresponding pointer to NULL. Don't set raw_size and - raw_syments. - (obj_ecoff_set_sym_index): Removed. - (obj_ecoff_set_ext): New function. - * config/obj-ecoff.h (obj_set_sym_index): Don't define. - (obj_ecoff_set_sym_index): Don't declare. - * config/obj-elf.c (obj_ecoff_set_ext, elf_get_extr, - elf_set_index): New functions used for ECOFF_DEBUGGING. - (elf_frob_file): Reworked ECOFF debug generation to use - new functions in bfd/ecofflink.c. - -Sun Nov 21 23:54:52 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_def_subspaces): Only create the unwind - subspace for ELF. In the SOM world, the linker is responsible - for creating the unwind subspaces. - -Fri Nov 19 16:25:09 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-coffbfd.c: Use PARAMS rather than EXFUN. - (yank_symbols): Don't call S_SET_EXTERNAL if the storage class is - already set. Fixes .def var; .val external_var; .scl 3; .endef. - (adjust_stab_section): Make static. Declare return type. Remove - unused variables. - - * config/tc-i386.h: Declare tc_coff_fix2rtype and - tc_coff_sizemachdep. - -Fri Nov 19 04:33:59 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * write.c (write_object_file): Disable obj_check_file_symbols - hook; only back end using it wasn't using it correctly. - (write_object_file): Always call obj_frob_symbol and - tc_frob_symbol; always retain symbol if it's used by a relocation, - regardless of what these routines indicate. - * config/obj-coff.c (coff_frob_symbol): Renamed from - coff_check_file_symbols. - * config/obj-coff.h (obj_check_file_symbols): Deleted. - (coff_frob_symbol): Declare. - (obj_frob_symbol): Call it. - - * config/obj-coff.c (obj_crawl_symbol_chain, obj_emit_strings, - obj_pre_write_hook): Don't define for BFD_ASSEMBLER. - (c_section_header): Ditto. Delete superfluous return at end of - function. - - * config/obj-coff.h [TC_SPARC]: Include coff/sparc.h, and specify - coff-sparc-lynx. - (SA_GET_SYM_TAGNDX): Use BFD_HEADERS version for BFD_ASSEMBLER - too. - (c_section_header): Rewrite prototype so that it contains no - preprocessing directives. Don't declare it at all if - BFD_ASSEMBLER. - - * configure.in (sparc*-*-lynxos): New target, using coff and - BFD_ASSEMBLER. - - * stabs.c: New file. - * Makefile.in (REAL_SOURCES, OBJS): List it. - * read.c (STAB_SECTION_NAME, STAB_STRING_SECTION_NAME, - get_stab_string_offset, s_stab_generic, s_stab, s_xstab, s_desc): - Moved to new file. - - * config/tc-sparc.c (tc_gen_reloc): Handle coff files like elf - files. - -Wed Nov 17 17:23:53 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * configure.in (mips-*-irix5*): New target. Use elf and mips-big. - * config/obj-elf.c: If ECOFF_DEBUGGING, include ecoff.h. - (obj_pseudo_table): If ECOFF_DEBUGGING, define ECOFF - pseudo-ops. - (obj_read_begin_hook): If ECOFF_DEBUGGING, call - ecoff_read_begin_hook. - (obj_symbol_new_hook): If ECOFF_DEBUGGING, call - ecoff_symbol_new_hook. - (obj_elf_init_stab_section): Cast alloca result. - (elf_frob_file): If ECOFF_DEBUGGING, finish up ECOFF debugging - information and write it out into .mdebug section. - * config/obj-elf.h (ELF_TARGET_SYMBOL_FIELDS): New macro. - (TARGET_SYMBOL_FIELDS): Use ELF_TARGET_SYMBOL_FIELDS. - (ECOFF_DEBUGGING): Define if TC_MIPS. - (TARGET_SYMBOL_FIELDS): If ECOFF_DEBUGGING, override to add - fields required by ECOFF. - * config/tc-mips.c: Check ECOFF_DEBUGGING rather than - OBJ_ECOFF in many cases. - (mips_any_noreorder): New variable. - (mips_cprestore_offset): Initialize to -1. - (mips_frame_reg): New variable. - (RELAX_ENCODE, RELAX_OLD, RELAX_NEW, RELAX_RELOC1, - RELAX_RELOC2, RELAX_RELOC3, RELAX_WARN): New macros. - (md_pseudo_table): Handle "gpword" and "cpadd". - (md_begin): Initialize ok to false. If OBJ_ELF, set alignment - of text, data and bss sections to 4. Set alignment of - .reginfo section to 2. If ECOFF_DEBUGGING, create .mdebug - section. - (ALIGN_ERR, ALIGN_ERR2): Removed unused and useless alignment - check. - (append_insn, macro_build, macro_build_lui): Take place - argument. Changed all callers. - (append_insn): If appending a nop, don't emit one. - (macro_build): Changed assertion for 'i', 'j', 'o' case. - (gp_reference): Removed. - (load_address): New function. - (macro): If mips_noreorder is used, set mips_any_noreorder. - Extensive changes to handle GP and PIC symbols differently. - Build both possible code choices using a variant frag, and - make a final decision at the end of assembly when all - information is known. Added PIC support for all symbol - references. - (mips_ip): Don't permit anything but a number after $ for a - coprocessor register. Don't use .lit4 or .lit8 sections when - generating PIC code. If OBJ_ELF, set alignment of .lit4 or - .lit8 section to 4. - (md_apply_fix): Accept and ignore GOT16 and GPREL32 relocs. - (s_change_sec): Set alignment of ELF .rodata or .sdata section - to 4. - (s_mipsset): If .set noreorder, set mips_any_noreorder. - (s_cpload): Ignore .cpload if not generating PIC code. Warn - if .cpload is not in noreorder section. - (s_cprestore): Ignore .cprestore if not generating PIC code. - (s_gpword, s_cpadd): New functions. - (tc_get_register): Added frame argument; if true, set - mips_frame_reg to return value. Changed all callers. - (md_estimate_size_before_relax): Don't error out, but instead - determine how much a frag should grow. - (tc_gen_reloc): Return multiple relocs if appropriate, as - determined by md_estimate_size_before_relax. - (md_convert_frag): New function. - (mips_elf_final_processing): Set ELF header flags based on - mips_any_noreorder and mips_pic. - * config/tc-mips.h (RELOC_EXPANSION_POSSIBLE): Define. - (MAX_RELOC_EXPANSION): Define to be 3. - (md_relax_frag): Define to be 0. - (md_convert_frag): Don't define. - (tc_get_register): Changed declaration. - - * ecoff.h, ecoff.c: New files pulled out of config/obj-ecoff.c to - support generating ECOFF debugging information for MIPS ELF - targets. Compiled only if ECOFF_DEBUGGING is defined. Changed - handling of external symbols: it now always generates exactly - those external symbols that are defined in the global symbol list. - * Makefile.in (REAL_SOURCES): Added ecoff.c. - (REAL_HEADERS): Added ecoff.h. - (OBJS): Added ecoff.o. - (ecoff.o): New target. - * config/obj-ecoff.c: Almost entirely moved into ecoff.c. - Remaining code mostly just calls ecoff.c code. - * config/obj-ecoff.h: Define ECOFF_DEBUGGING. - (TARGET_SYMBOL_FIELDS): Make ecoff_symbol a pointer to a - struct localsym. - (obj_read_begin_hook, obj_symbol_new_hook): Define to call - functions in ecoff.c. - (ecoff_stab): Don't declare (now declared in ecoff.h). - (obj_set_sym_index): Define. - (obj_ecoff_set_sym_index): Declare. - - * frags.h (frag_grow): Declare. - * frags.c (frag_grow): Made non-static. - - * write.c (is_dnrange): Do not define if md_relax_frag is defined. - (relax_segment): If md_relax_frag is defined, use it to handle a - frag of type rs_machine_dependent rather than looking through - md_relax_table. - - * read.c (read_a_source_file): If we find a bad pseudo-op, - do a continue to go on to the next line rather than a break. - Removed duplicate bad pseudo-op code which was never executed. - - * read.c (s_lcomm): Do not require a comma after the name. - - * subsegs.h (segment_info_type): Changed hadone field to bitfield. - Added bss bitfield. - * as.c (perform_an_assembly_pass): Set bss flag for bss_section. - * read.c (s_lcomm): Set bss flag for .sbss section if used. - * write.c (relax_and_size_seg): Don't set SEC_HAS_CONTENTS for a - bss section. Set SEC_RELOC if there are any relocations, even for - a zero size section. - - * write.c (write_relocs): In RELOC_EXPANSION_POSSIBLE case, base - data offset on reloc[0]->address rather than reloc[j]->address, so - that multiple relocs can affect different memory locations. - - * write.c (chain_frchains_together, relax_and_size_seg, - adjust_reloc_syms, write_relocs): Make third argument PTR, not - char *, to match definition of bfd_map_over_sections. - - * app.c (do_scrub_next_char): Don't interpret a comment character - as starting a CPP line directive unless it is a '#' and is the - very first characters on the line (i.e., do not permit leading - whitespace). - - * messages.c (identify): Make file argument non-const, to match - callers. - -Tue Nov 16 20:38:21 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_ip): Fix thinko in 21bit range check. - -Sat Nov 13 18:22:48 1993 Steve Chamberlain (sac@jonny.cygnus.com) - - * config/tc-sh.c (md_apply_fix): Cope with IMM16 type too. - * config/tc-z8k.c (build_bytes, md_apply_fix): Understand nDISP7 - relocs. - -Fri Nov 12 16:51:47 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.[ch]: Fix assorted trivial indention problems. - * config/obj-som.c (obj_som_version): Add missing ';'. - (som_frob_file): Delete whitespace at EOL. - -Fri Nov 12 15:26:21 1993 Ken Raeburn (raeburn@cygnus.com) - - * Makefile.in (VERSION): Updated following 2.2 release. - -Fri Nov 12 14:52:17 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (hppa_fix_struct): Use a real type for the - field selector, rather than an int. All uses of field selectors - fixed. - (tc_gen_reloc): For SOM PLABELs, always set addend to zero for now. - (md_apply_fix_1): Do not call hppa_field_adjust for any PLABEL - field. - - Thu Nov 11 15:49:08 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (pa_type_args): For .import statements, - silently ignore attempt to change the symbol type for a function - from ST_ENTRY to ST_CODE on .import. - -Wed Nov 10 16:19:13 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * write.h (fixS): Rename fx_callj field to fx_tcbit. - * write.c, config/obj-coff.c, config/obj-coffbfd.c, - config/tc-i960.c: Corresponding changes. - -Tue Nov 9 00:49:01 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * Makefile.in (distclean): Delete config-stamp and config.h - - * config/tc-hppa.c (evaluate_absolute): Avoid relying on - ANSI-C features. - - * config/tc-hppa.c (pa_type_args): Renamed from pa_export_args. - Accept new argument "is_export". All callers changed. When - processing a .export directive for a function, do not allow - the user to set the type to "CODE", instead warn and set the - type to "ENTRY". - -Mon Nov 8 12:05:07 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_ip, printInsn): Handle 'k' (from Ted - Lemon ). - (mips_ip): Permit odd numbered floating point registers if -mips3. - (macro): Use BFD_RELOC_MIPS_LITERAL relocation for M_LI_SS. - -Mon Nov 8 07:45:01 1993 Doug Evans (dje@canuck.cygnus.com) - - * configure.in: Remove h8300h, we have multilib now. - -Mon Nov 8 06:09:18 1993 D. V. Henkel-Wallace (gumby@cirdan.cygnus.com) - - * configure.in: Support generic netware as being ELF format. - Recognise unixware if the user supplies it. - -Sun Nov 7 01:02:08 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * First cut at cleaning up PA instruction parsing. - * config/tc-hppa.c (pa_get_absolute_expression): Accept pointer to - insn structure as an argument, and a pointer to a string. All - callers changed. Always read any field selector here. Call - evaluate absolute to get a return value. - (evaluate_absolute): Addept pointer to insn structure as its - argument. All callers changed. - (INSERT_FIELD_AND_CONTINUE): New macro for inserting a bitfield - into an instruction and continuing the main pa_ip loop. - (CHECK_FIELD): New macro for simple range checking of fields. - (pa_ip): Delete unused variables. Use INSERT_FIELD_AND_CONTINUE - and CHECK_FIELD. All immediate fields now pass through - pa_get_absolute_expression which will also handle field selectors. - Delete dead code. Simplify. - (md_apply_fix_1): Use CHECK_FIELD to verify any fixes that are - applied are in range. Use bfd_put_32 rather than inserting each - byte of the fixed instrution into the buffer ourselves. - - * write.c (fixup_segment): Delete {SEG,GLOBAL}_DIFF_ALLOWED code, - it was PA specific and is no longer needed (it's now handled - within the PA backend). - * config/tc-hppa.h (SEG_DIFF_ALLOWED): Delete definition. - * config/tc-hppa.c (fix_new_hppa): If the subtract symbol for - a fixup is $global$ change it to NULL as $global$ is really only - needed long enough to determine the base type of relocation to use. - - * config/tc-hppa.c (create_new_subspace): Initialize subspace_defined. - - * config/tc-hppa.c (pa-ip, case 'z'): Make field selectors work - for 'z' operands (target of ble branch). - -Sat Nov 6 22:41:57 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c: (update_subspace): Fix type and name of last - parameter. All callers fixed. - (md_begin, pa_chk_field_selector, pa_entry): Lint. - - * config/tc-hppa.c (cons_fix_new_hppa): Reset field selector - to default state after it's been used. - -Fri Nov 5 12:08:21 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/obj-som.c (obj_som_init_stab_section): Change - space/subspace sort keys for the stab sections so as to avoid - bugs in the hp linker and pxdb. - -Thu Nov 4 17:00:05 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * write.c (chain_frchains_together): Update pointer to last - frag for a segment in the seginfo structure. - -Thu Nov 04 09:09:35 1993 Jeffrey Wheat (cassidy@cygnus.com) - - * Makefile.in: Changed RUNTESTFLAGS to RUNTEST_FLAGS - -Wed Nov 3 12:16:27 1993 Ken Raeburn (raeburn@rover.cygnus.com) - - * write.c (fixup_segment): Handle conversion of subtraction to - pc-relative addressing even if pc-relative flag is already set. - - * config/tc-m68k.c (m68k_ip_op): Use strchr, not index. Don't - declare either. - - * doc/Makefile.in (distclean): Delete intermediate files from dvi - build, but not the dvi or info files. - * Makefile.in (clean-here): New target; cleans up current - directory only. - (distclean): Use it instead of clean. - - * read.c (s_xstab): Don't use alloca. - - * messages.c (identify): New routine; print message identifying - following messages as coming from assembler. - (as_show_where, as_bad_internal, as_bad_where): Call it. - (as_fatal): Don't need to identify program any more. - -Tue Nov 2 18:04:11 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-sparc.c (sparc_ip): Add default case to reloc switch. - - * read.c (s_lcomm): Put small objects in .sbss for MIPS ELF as - well as MIPS ECOFF. - (get_stab_string_offset): Remove unused variable aligned. - -Tue Nov 2 15:07:07 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * tc-hppa.c: Add %dp and %rp as synonyms for %r27 and %r2 in the - predefined register table. - (pa_parse_number): Handle %rp in common register shortcut code. - Consistently set return value to -1 for an error. Clean up error - messages and only print them when "print_errors" is true. Handle - empty string case like the HP assembler -- assume a value of - zero. - - * config/ho-hpux.h: Do not include ho-sysv.h. Instead include - standard hpux include files to pick up various function decls. - - * config/ho-hppaosf.h: Delete _IO* macros. They are defined in - stdio.h. Delete bogus declaration of free. Get path to - alloca-conf.h right. - -Tue Nov 2 13:57:30 1993 Ken Raeburn (raeburn@rover.cygnus.com) - - * expr.c (operand): Fix checks for characters following "0b" or - "0f". - -Mon Nov 1 21:37:04 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/obj-som.h (obj_attach_unwind_info): Define as a hook - so GAS can attach unwind descriptor information to a BFD symbol. - * config/tc-hppa.c (fix_new_hppa): If necessary attach unwind - descriptor information to the BFD symbol. - (md_apply_fix): R_HPPA_ENTRY and R_HPPA_EXIT can never be "applied", - they are simply markers. Make R_HPPA_UNWIND_* handling OBJ_ELF - dependent. - (pa_build_unwind_subspace): Whole function is OBJ_ELF dependent. - (pa_entry): Build a R_HPPA_ENTRY relocation when configured for SOM. - (pa_exit): Likewise, but built a R_HPPA_EXIT relocation. Do not - build "end-of-function" symbols for SOM, they are not needed. - - * config/tc-hppa.c (process_exit): Create temporary symbols with - correct prefixes so they can be eliminated later. - - * config/tc-hppa.c (call_info struct): Delete unused "frame" field. - (pa_callinfo): Insert framesize into the unwind information as - soon as it's available. - (pa_build_unwind_subspace): Do not insert framesize into the unwind - information here. - - * Add support for marker type relocations. These mark areas - of interest to the linker. ENTRY/EXIT relocations for SOM are - an example of marker relocations. - * write.c (write_relocs): Instead of assuming size of a relocation - is 4 bytes, pick up the size from relocation itself. - (fixup_segment): Do not complain that a value is too small for - marker relocations. - - * struc-symbol.h: Add new "sy_used" field to the symbol structure. - * expr.c (operand): Set sy_used for any symbol used as an operand. - (expr): Likewise for any symbol used in an expression. - * config/tc-hppa.h (tc_frob_symbol): Define. Punt imported - symbols which are never used and absolute symbols which local scope. - - * config/obj-som.h (obj_frob_file): Define. - * config/obj-som.c (obj_som_init_stab_section): Set alignment - of stab sections. Make space for the special stab entry. - (adjust_stab_sections): Adjust the special entry in the - stabs section. - (som_frob_file): New function. Simply calls adjust_stab_sections - for each section. - -Mon Nov 1 17:54:29 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (PIC_CALL_REG, SP, FP): Define. - (mips_pic, mips_cprestore_offset): New static variables. - (md_pseudo_table): Handle .abicalls, .cpload, and .cprestore. - Ignore .bgnb and .endb. - (gp_reference): _gp_disp is never addressed off GP. - (macro_build): Ignore macros while searching for insn. For cases - i, j, and o, accept the reloc type as an argument rather than - assuming BFD_RELOC_LO16. Don't try to convert BFD_RELOC_LO16 to - BFD_RELOC_MIPS_GPREL. Added new case a. - (set_at, load_register, macro): Changed calls to macro_build to - pass new argument for i, j and o cases. - (macro): Handle M_JAL_1, M_JAL_2 and M_JAL_A. These require - special handling when generating SVR4 PIC code. - (mips_ip, tc_get_register, s_frame): Use macros FP, SP, GP and AT - rather than hard coded constants. - (md_apply_fix): Handle BFD_RELOC_MIPS_LITERAL and - BFD_RELOC_MIPS_CALL16. - (s_option): Set mips_pic based on .option picN. - (s_abicalls): New function; set mips_pic to 2. - (s_cpload): New function; handle .cpload. - (s_cprestore): New function; handle .cprestore. - - * config/obj-ecoff.c (obj_pseudo_table): Add entries for .bgnb, - .endb and .verstamp, setting them to s_ignore. - -Sun Oct 31 00:36:40 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (subspace_dictionary_chain): Add new ssd_defined - field. Define SUBSPACE_DEFINED accessor macro. - (pa_subspace): Allow user to override subspace attributes for - built-in subspaces. Set ssd_defined at the end of fcn -- that - way the attributes can only be changed once. Pass newly allocated - name to is_defined_subspace, not a pointer to the input line. - Fix typo in space/subspace rework. - (is_defined_subspace): Delete unused 2nd arg. All callers changed. - - * config/tc-hppa.c (pa_import): If currently in the text segment - and a symbol is imported without type information, set BSF_FUNCTION - for the symbol. - * write.c (relax_and_size_seg): Correct test to determine if - the section's size was rounded up. - - * config/obj-som.h (obj_set_symbol_type): Define a hook so GAS - can properly set all the SOM symbol types. - * config/tc-hppa.c (pa_symbol_type): New enum to represent the - symbol types which can be set from an IMPORT/EXPORT statement. - (pa_export_args): Set the pa_symbol_type type based on arguments. - If defined, call obj_set_symbol_type to pass this information on - to the BFD backend. - - * read.c (get_stab_string_offset): Set SEC_DEBUGGING for any - stab section we make. - (s_stab_generic): Likewise. - -Sat Oct 30 14:26:20 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * Allow backends to override the value of the fake label. - * write.h (LOCAL_LABEL): Delete DOT_LABEL_PREFIX code. Instead - assume backends will define LOCAL_LABEL if anything other than - 'L' is used to denote a local label. - (FAKE_LABEL_NAME): New macro. Defines the default name used for - the "fake" label. - * expr.c (make_expr_symbol): Delete DOT_LABEL_PREFIX code - and instead simply use the string defined by FAKE_LABEL_NAME. - (operand): Likewise. - * read.c (s_stab_generic): Likewise. - * config/tc-hppa.h (FAKE_LABEL_NAME): Define as L$0\001 so it's - known to be a local label. - * config/tc-i386.h (DOT_LABEL_PREFIX): Delete. - (LOCAL_LABEL, FAKE_LABEL_NAME): Define. - * config/tc-m68k.h (DOT_LABEL_PREFIX): Delete. - (LOCAL_LABEL, FAKE_LABEL_NAME): Define. - * config/te-sco386.h (DOT_LABEL_PREFIX): Delete. - (LOCAL_LABEL, FAKE_LABEL_NAME): Define. - - Rework space/subspace handling in PA code to fully support - SOM spaces/subspaces. - * config/tc-hppa.c (USE_ALIASES): New object-format dependent define - to control the use of space/subspace name aliases. - (update_subspace): Accept space chain entry for containing space - as a new parameter. All callers changed. - (pa_get_label): Use current_space rather than pa_segment_to_space. - (pa_define_label): Likewise. - (pa_undefine_label): Likewise. - (md_begin): Change into the (possibly modified) text_section. - (pa_parse_space_stmt): Create a new segment/space if create_flag - is true, and the space name is not one of the two predefined spaces. - (pa_subspace): Use current_space rather than a lookup via - pa_segment_to_space. Reset BFD section flags as required by - the .subspace directive. Likewise for the section alignment. - Pass the current space to update_subspace and create_new_subspace. - (pa_spaces_begin): Only use space/subspace aliases if USE_ALIASES - is true. When not using aliases, create a BFD section for each - subspace encountered. When not using aliases replace the default - text, data, and bss segments with new ones. - (create_new_subspace): When not using aliases each subspace has a - section/segment and subsegments are not needed, so set the subsegment - to zero. - - * config/tc-hppa.c (pa_parse_space_stmt): If needed, call - obj_set_section_attributes to pass space attributes to the - BFD backend. - (create_new_space): Likewise. - (create_new_subspace): Likewise for subspace attributes using - obj_set_subsection_attributes. - (update_subspace): Likewise for subspace attributes using - obj_set_subsection_attributes. - - * config/tc-hppa.c (pa_parse_space_stmt): Get segment and sort key - for $TEXT$ and $PRIVATE$ from the default space structure. - - * config/tc-hppa.c (pa_export_args): Always set BSF_FUNCTION - as appropriate for the given type. - - * config/tc-hppa.c (tc_gen_reloc): Preliminary stab at handling - SOM relocations. - - * config/tc-hppa.c (pa_comm): Delete incorrect check for symbol - redefinition. - - * config/obj-som.[ch]: New files for SOM support. Note SOM - support is not yet complete in GAS or BFD. - - * config/ho-hppabsd.h: Delete IO* macros, they are defined in - stdio.h. Delete declaration of free. Include stdlib.h, unistd.h, - and string.h. - -Fri Oct 29 13:26:12 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * Allow backends to override the section names used for embedded - stabs support. Needed for SOM. - * read.c (STAB_SECTION_NAME): Default the name of the stab section - to ".stab". - (STAB_STRING_SECTION_NAME): Likewise for the stab strings section. - (get_stab_string_offset): Is now passed the full name for the - stab string section rather than a name prefix. All references - changed. - (s_stab_generic): New argument for the stab string section name. - all references changed. - (s_xstab): Append "str" to the stab section name to get the - stab string section name. - * config/obj-coffbfd.c (obj_coff_init_stab_section): Append "str" - to stab section name to get the stab string section name. Pass - the full name of the stab string section to get_stab_string_offset. - * config/obj-elf.c (obj_elf_init_stab_section): Likewise. - - * config/tc-hppa.c (md_begin): Disable "-R" option to fold - textand data segments. Warn user "-R" is unsupported on the - PA. - -Thu Oct 28 12:36:13 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/tc-hppa.c (md_pseudo_table): Default alignment is 8 for - .align and .ALIGN directives. - - * config/tc-hppa.c (pa_space): Do not report an error for a .space - directive which does not define a "well-known" space and does - not include a space number as an argument. - - * config/tc-hppa.c (pa_def_subspaces): Correct initialization of the - "defined", "loadable", "code_only" and "space_index" fields. - (pa_def_spaces): Correct initialization of the "spnum", "defined", - and "private" fields. - - * write.h (struct fix): Add new tc_fix_data field for the various - backends to attach machine dependent fixup information to. - * write.c (fix_new_internal): Initialize new tc_fix_data field. - * config/tc-hppa.c (hppa_fix_struct): Delete unnecessary fix_fixP and - fx_next fields. - (hppa_find_hppa_fix): Delete unnecessary function. Fix all - callers to get HPPA fixup information from the tc_fix_data field - in the GAS fixup. - (hppa_fix_root): Delete unnecessary variable. - (fix_new_hppa): Attach HPPA fixup data to the GAS fixup. - - * config/tc-hppa.c (pa_set_start_symbol); Delete unwanted - function. Fix all callers. - (subspace_dictionary_chain): Delete unused ssd_start_sym field. - - * config/tc-hppa.c (hppa_fix_adjustable): New function to determine - if a particular fixup is adjustable. - * config/tc-hppa.h (tc_fix_adjustable): Call hppa_fix_adjustable to - perform the real work. - - * config/tc-hppa.h (RELOC_EXPANSION_POSSIBLE): Move definition out - of OBJ_XXX conditionals. - (MAX_RELOC_EXPANSION): Likewise. - - * config/tc-hppa.c (log2): Renamed from is_power_of_2. Fix all - callers. Now returns log2 (N) for positive N which are an exact - power of two or -1 for an error. - - * config/tc-hppa.c (pa_callinfo): Range check values provided for - ENTRY_GR, ENTRY_FR and ENTRY_SR. Properly adjust vaues before - inserting them into the unwind table. - - * config/tc-hppa.c (NEEDS_FIXUP): Delete definition and all references. - (hppa_gen_reloc_type): New object format dependent macro. - (pa_ip): Delete tons of code which was either OBJ_SOM or OBJ_ELF - conditional. The code can (and will) be shared between SOM & ELF - formats in the near future. - (cons_fix_new_hppa, md_apply_fix_1): Likewise. - (pa_build_unwind_subspace, process_exit, pa_exit): Likewise. - (tc_gen_reloc): Use hppa_gen_reloc rather than an object format - specific call. - - * config/tc-hppa.c (pa_comm): Set the segment for a common symbol - to bfd_und_section. - - * config/obj-elf.h (obj_elf_version): Add extern prototype. - - * configure.in (hppa-*-bsd*): New configuration. - BFD is always used for GAS generating SOM objects. - - * write.c (adjust_reloc_syms): Set sy_used_in_reloc if an - adjustment is rejected by the target machine. - - * config/tc-hppa.c (pa_big_cons): Delete function and its - declaration. All callers changed to use pa_cons. - - * write.c (fixup_segment): Fix indention and open/close brace - problem. - - From Pete Hoogenboom: - * config/tc-hppa.c (md_atof): Return a NULL on success rather than - an empty string. - - * config/tc-hppa.c (pa_parse_space_stmt): Advance - input_line_poitner when an invalid argument is encountered. - -Thu Oct 28 13:09:26 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-a29k.c (md_begin): When opcodes are mashed together in - the table, require that the one without bit 0x1000000 set come - first. Require further that it be case 'b' or 'P'. The a29k - opcode table already meets these constraints. - (machine_ip): When handling case 'i' or 'A', make sure that the - appropriate opcode really exists by looking at the next entry in - the opcode table. - -Wed Oct 27 11:48:56 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-m68k.c (m68k_ip): Adjust offsets for PC relative - fixups. Add 6 for long 7.3 case, 2 for short 7.2 case. - - * config/obj-ecoff.c (obj_ecoff_ent): Ignore an optional number - after a .ent directive. - - * config/tc-mips.c (mips_ip): Handle '>' case (shift amount - between 32 and 63 for double shift instruction). Do & 0x1f rather - than % 32. - (printInsn): Handle '>'. - -Tue Oct 26 16:58:36 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-ns32k.c (tc_aout_fix_to_chars): Output the symbol - number in the right place. Untested. Probably does not work for - cross assembly. From cagney@cs.adelaide.edu.au (Andrew Cagney). - - * config/tc-m68k.c (md_apply_fix_2): Error if a short branch uses - an illegal offset of 0 or -1. - - * config/obj-elf.c (obj_elf_init_stab_section): Align .stab - section to a longword boundary. - -Tue Oct 26 10:24:31 1993 Ken Raeburn (raeburn@cygnus.com) - - * Makefile.in (CHECKFLAGS): Pass down RUNTESTFLAGS. - - From Jeff Law: - * config/tc-hppa.c (tc_gen_reloc): ELF32_HPPA_R_ADDEND -> - HPPA_R_ADDEND. - -Mon Oct 25 14:06:17 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-sparc.c (sparc_ip): Fix up membar argument handling. - -Mon Oct 25 11:17:58 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * config/tc-sh.c (build_Mbytes): Write the relocs to the correct - address. (md_assemble): Make error handling a bit more graceful. - (md_apply_fix): Don't warn on non aligned displacement. - - * config/tc-z8k.c (get_specific, built_bytes): Understand all the - aspects of lda. - -Mon Oct 25 10:20:31 1993 Ken Raeburn (raeburn@rover.cygnus.com) - - * doc/Makefile.in (install-info): Use "$<*" so VPATH will find - as.info* even if they're in $(srcdir) (e.g., for FSF - distributions). - - * write.c (write_relocs): For relocs that are pc_relative and - pcrel_offset and not partial_inplace, adjust reloc->addend to - compensate for a bfd_perform_relocation bug. - - * config/tc-sparc.h: Removed remaining non-BFD_ASSEMBLER code. - * config/tc-sparc.c: Ditto. - (tc_gen_reloc): Include fx_offset for pcrel fixups. - -Sun Oct 24 16:49:00 1993 Jim Wilson (wilson@x1.cygnus.com) - - * tc-mips.c (md_pseudo_table): Add dword pseudo op. - -Fri Oct 22 20:40:56 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * messages.c: replaced all variables called Format with 'format', - for consistency throughout - - * configure.in: handle mips*- instead of mips, mips*el for little - endian configurations - -Fri Oct 22 14:45:49 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * input-scrub.c (physical_input_file, logical_input_file, - physical_input_line, logical_input_line): Made static. - (as_where): Return current file name and line number, don't print - them out. - * messages.c (as_show_where): New static function. Other - functions use it instead of as_where. - (as_bad_internal): New static function. - (as_bad): Use as_bad_internal. - (as_bad_where): New function, like as_bad but taking a file name - and line number. - * as.h (as_bad_where): Declare. - (as_where): Change prototype for new arguments. - * write.h (fixS): Added fields fx_file and fx_line. - * write.c (fix_new_internal): Save file and line number in fix. - (fixup_segment): Use as_bad_where, not as_bad. - * input-file.c (f_in, file_name): Made static. - * cond.c (struct file_line): Just use file and line fields. - (s_else): Use as_where and as_bad_where, not get_file_line and - set_file_line. - (get_file_line, set_file_line): Removed. - * listing.c (listing_newline): Use as_where. - * config/obj-coffbfd.c (obj_coff_init_stab_section): Use as_where. - * config/obj-ecoff.c (add_file): Use as_where. - * config/obj-elf.c (obj_elf_init_stab_section): Use as_where. - * config/tc-m68k.c (md_apply_fix_2): Use as_bad_where. - * config/tc-mips.c (tc_gen_reloc): Use as_bad_where, not assert. - -Thu Oct 21 12:52:01 1993 Ken Raeburn (raeburn@cygnus.com) - - * config/tc-m68k.h: Don't define REGISTER_PREFIX or - OPTIONAL_REGISTER_PREFIX if either is already defined. - - * config/tc-m68k.c (m68k_ip): Delete some code in "#if 0". - - * configure.in: Set bfd_gas for all sparc targets. Added facility - for keeping or rejecting configurations still under development; - default is to assume production environment, and reject configs - still being worked on. Mark Elf configurations (except sparc and - i386) as developmental. Deleted cases matching some generic names - in favor of more specific names. (E.g., when we get Alpha - support, we'll still only support VMS for Vax.) - - * config/tc-sparc.h (md_end): New macro. - * config/tc-sparc.c (md_end): Function deleted. - (BFD_RELOC_*): Delete macros that used to help keep the non-bfd - version compiling. All sparc targets will use bfd now. - * tc.h (md_end): Don't declare if it's defined as a macro. - - Changes from Jeff Law and Peter Hoogenboom: - - * read.c (next_char_of_string): Limit octal character constants to - three digits. - - * config/tc-hppa.h: Major cleanup. Use GNU-style comments. Warn - against placing additional object-file dependent code here. Warn - against contaminating all of GAS with the internals of tc-hppa.c - through inclusion of tc-hppa.h. Delete all forward declarations - for functions only used within tc-hppa.c, likewise for structures, - variables, and #defines. Try to group OBJ_ELF and OBJ_SOM - conditional code in a few small places. - - * config/tc-hppa.c: Major cleanup. Use GNU-style comments. Group - structures, global variables, forward declarations together. - Reduce (or in some cases eliminate) OBJ_ELF and OBJ_SOM - conditional code -- try to group conditional code together - into a few places. Make all functions and variables which - are only used within tc-hppa.c static. PARAMize all functions. - Add comments to functions. Delete unused functions, variables, - #defines, etc. Delete unused members within structures. Delete - ldil;ble hacks -- it is believed they were installed to work - around old gas bugs. Avoid using mixed case for local - functions, variables, and structures. Fix formatting problems - not found by GNU-indent. Add FIXME notices for things which - should be worked on the near future. Delete lots of old - useless (1.36 PA-SOM) code. - - * config/tc-hppa.c: (fix_new_hppa): Initialize the fx_r_type - field of the fixS structure. Needed to build unwind - descriptors correctly. - - * write.c: (fixup_segment): Allow expressions such as - sym1-sym2+const as long as sym2 is $global$. - - * write.c (adjust_reloc_syms): Provide a hook so that a target - cpu configuration can reject certain relocation reductions. - * tc-hppa.h (tc_fix_adjustable): New macro. Only accept relocations - which do not involve function symbols. - - * config/tc-hppa.h: Reindent with GNU-indent. Delete references - to OBJ_OSFROSE. Fix typos (OBJ_SOME -> OBJ_SOM). Delete unused - STAB_FIXUP macro. - * config/tc-hppa.c: Likewise. - - * config/tc-hppa.c (md_apply_fix_1): Use elf_symbol_type, instead - of elf32_symbol_type. - (pa_export_args): Likewise. - (elf_hppa_final_processing): Likewise. - (pa_desc): Do not call obj_elf_desc. (Is pa_desc even needed - anymore?) - (hppa_tc_make_sections): Do not declare elf_get_symtab_map any - ore. - - * config/tc-hppa.c: (md_section_align): Align all sections to - a multiple of the section alignment rather than always a - multiple of 8. - - * config/tc-hppa.c (hppa_tc_symbol): If the argument relocation - bits are zero (eg they specify no relocations), then do not even - bother adding their entries to thesymextn section. - -Thu Oct 21 15:44:55 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-sparc.c (md_parse_option): Accept and ignore -sparc - option, which is used by the SunOS make default .s.o rule. - -Wed Oct 20 12:26:33 1993 Ken Raeburn (raeburn@rover.cygnus.com) - - * config/tc-sparc.c (sparc_ip, label "immediate"): Convert relocs - operating on upper 32 bits of immediate constants to lower-half - relocs with adjusted constants. - -Tue Oct 19 18:13:26 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-m68k.h (AOUT_MACHTYPE): Define to be external variable - m68k_aout_machtype. - * config/tc-m68k.c (omagic): Remove obsolete and unused variable. - (m68k_aout_machtype): New variable, if OBJ_AOUT. - (md_assemble): Initialize m68k_aout_machtype based on - current_architecture, if OBJ_AOUT. - (md_parse_option): Remove obsolete reference to omagic. - -Thu Oct 14 16:51:00 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (md_pseudo_table): Ignore .livereg pseudo-op. - (s_option): Ignore .option O* and .option pic*. - (s_ent): Skip whitespace between symbol and optional digit. - (my_getSmallExpression): Handle ($xx) correctly: assume 0($xx). - - * app.c (do_scrub_next_char): Always accept 'x' and 'X' as escape - characters in state 6. - * read.c (next_char_of_string): Accept \Xh* and \xh* where h* are - hexidecimal digits. - - * config/tc-i386.c (md_apply_fix_1): Make cross segment calls work - for ELF by hacking around bizarre bfd_perform_relocation behaviour - that I don't dare change. - -Thu Oct 14 11:33:25 1993 Michael Meissner (meissner@osf.org) - - * config/tc-i386.c: (md_begin): Do not zero static arrays. Don't - call strchr for each character to see if it is a special char, - instead add a second loop over special_chars. Set alignment - of text, data and bss sections to 4. - (pi, te, pt, pe, ps): Add declarations so that DEBUG386 can be - used again. - (reloc): Don't return 8 and 16 bit non-PC relative relocations on - ELF, since the ELF object format does not have these type of - relocations. Change the abort into as as_bad and return - BFD_RELOC_NONE to silence compiler warnings. - (md_assemble): Keep track of the instruction size. Allow white - space between the $ and the constant for compatibility with older - gases and other assemblers. - (i386_operand): Skip spaces between $ and expression. - (tc_gen_reloc): Don't allow anything but 32 bit relocations on - ELF. Convert abort into an as_bad and assert into as_fatal. - -Wed Oct 13 16:50:55 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-coffbfd.c (fixup_segment) [DIFF_EXPR_OK]: If - sub_symbolP is in the current segment, convert to a PC-relative - fixup and discard the symbol. - -Wed Oct 13 14:00:02 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-ecoff.c (ecoff_build_symbols): Handle st_End symbol - for st_StaticProc just like st_Proc. - - * write.c (relax_and_size_all_segments): Moved #endif for OBJ_BOUT - so that OBJ_BOUT doesn't forget to adjust all the fragments in the - .bss section. - -Tue Oct 12 17:26:15 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c: If OBJ_ELF, include elf/mips.h. - (mips_regmask_frag): New static variable, if OBJ_ELF. - (md_begin): If OBJ_ELF, create .reginfo section and set - mips_regmask_frag to a frag. - (mips_elf_final_processing): New function, if OBJ_ELF. Set - mips_regmask_frag to register mask information. - * config/tc-mips.h (elf_tc_final_processing): New macro, defined - if OBJ_ELF. - -Tue Oct 12 03:33:26 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * messages.c (as_fatal): Use myname when printing messages. - - * config/tc-i960.c (md_begin): Use null pointer, not empty string, - as initial "return" value in case hashing isn't needed. - - * config/tc-a29k.c (md_atof): Return null, not empty string, on - success. - * config/tc-h8300.c (md_atof), config/tc-h8500.c (md_atof), - config/tc-hppa.c (md_atof), config/tc-i860.c (md_atof), - config/tc-i960.c (md_atof), config/tc-m88k.c (md_atof), - config/tc-ns32k.c (md_atof), config/tc-sh.c (md_atof): Ditto. - -Mon Oct 11 16:46:31 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - fix for pr 3571 - * config/tc-h8300.c (get_specific): Special action if 8 bit - address seen. (check_operand): Don't complain if truncating top - bits of an 8 bit address. (build_bytes): Allow an immediate and - an absolute in the same insn. - -Mon Oct 11 17:18:51 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * write.c (write_contents): Don't crash if seginfo is NULL. - - * config/obj-ecoff.c (ecoff_frob_file): Write out register masks - by modifying .reginfo section, not by directly modifying BFD - backend data. - -Mon Oct 11 14:11:32 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * config/ho-sunos.h: remove extern time declaration - -Mon Oct 11 16:14:43 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * messages.c (as_fatal): Do mention that it's the assembler that - got the fatal error. - -Fri Oct 8 14:09:35 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_gprmask, mips_cprmask): New variables to - hold register masks. - (md_begin): Initialize them to zero. - (append_insn): Update mips_gprmask and mips_cprmask. Also add - register variables pinfo and prev_pinfo. - * config/tc-mips.h (mips_gprmask, mips_cprmask): Declare. - * config/obj-ecoff.c (ecoff_frob_file): If TC_MIPS, set gprmask - and cprmask from mips_gprmask and mips_cprmask. - - * config/tc-mips.h: Define TARGET_FORMAT if OBJ_ELF. - * config/tc-mips.c (GPOPT): Define if OBJ_ECOFF or OBJ_ELF. - (various): Change all references to GP references to apply if - GPOPT, not if OBJ_ECOFF. - (s_change_sec): Rearrange somewhat. If OBJ_ELF, use .rodata - instead of .rdata. If OBJ_ELF, set section flags for .rodata and - .sdata sections. - (s_frame, s_loc, s_mask): Comment out entire functions, rather - than just body. They're not used anyhow. - * configure.in: Set cpu_type to mips for mips*. Accept - mips-*-elfl* and mips-*-elf*. - -Thu Oct 7 18:36:29 1993 Michael Meissner (meissner@osf.org) - - * config/obj-elf.c (obj_elf_common): Allow the alignment field to - not be specified. - -Wed Oct 6 13:01:34 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (cons_fix_new_mips): New function. Turn - BFD_RELOC_64 into BFD_RELOC_32. - * config/tc-mips.h (TC_CONS_FIX_NEW): Define. - (cons_fix_new_mips): Declare. - - Changes to let cons handle bignums like general expressions. - * expr.h (expressionS): New field X_unsigned. - * expr.c (operand): Initialize X_unsigned to 1. Set it to 0 for - unary minus case. - (expr) Fix typo resultP to right if missing operand. Set - X_unsigned to 1 when building new expression. - * read.c (potable): Make "octa" and "quad" call cons, not - big_cons. - (cons): Handle bignums. If given an O_constant (small integer) to - fill a big space, turn it into a bignum. - (parse_bitfield_cons): Set X_unsigned field. - (bignum_low, bignum_limit, bignum_high, grow_bignum, big_cons): - Removed. - * read.h (big_cons): Remove prototype. - * symbols.c (resolve_symbol_value): Don't give a warning if a - symbol in expr_section can not be resolved. - (S_SET_VALUE): Clear X_unsigned. - * write.c (write_object_file): If resolve_symbol_value failed on a - symbol we are writing out, give a warning. - * config/tc-h8500.c (parse_reglist): Set X_unsigned. - * config/tc-hppa.c (md_pseudo_table): Change "octa" and "quad" to - call pa_cons, not pa_big_cons. - (pa_big_cons): Remove. - * config/tc-hppa.h (pa_big_cons): Remove declaration. - * config/tc-i960.c (md_pseudo_table): Change "quad" to call cons, - not big_cons. - -Tue Oct 5 10:53:36 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * doc/as.texinfo (Copying): new node, to handle the recent changes - in the texinfo/gpl.texinfo file - -Mon Oct 4 17:10:15 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * read.c (big_cons): Handle "0" correctly. - - * config/tc-mips.c (md_begin): Set target_big_endian correctly. - -Mon Oct 4 15:37:57 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-m68k.c (m68k_ip): Mode 7.3 operand using PC should - have pc-relative fixup. - (md_parse_option): Move "-k" case down near "-pic" case. - - * configure.in: Alphabetize list of cpu type alternatives. Enable - OS values of "linux*elf*" and "linux*coff*" to select those - formats, with linux emulation. Don't bother checking for upper- - or mixed-case versions of "ose". - -Thu Sep 30 11:05:35 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * config/z8k.c (md_pseudo_table): add "unseg". - -Wed Sep 29 16:15:11 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * config/m88k-opcode.h (m88k_opcodes): correct a few mistakes - found while extending the dissassembler. - -Tue Sep 28 12:02:04 1993 Stan Shebs (shebs@rtl.cygnus.com) - - * configure.in: Split i386 LynxOS out from other coff targets, - add a specific Lynx emulation. - Add m68k LynxOS target. - * config/tc-i386.c: Define specific Lynx target format. - * config/tc-m68k.c: Define specific Lynx target format. - * config/te-lynx.h: New file. - - * config/obj-coffbfd.h: Don't set TARGET_FORMAT to be - "coff-{i386,m68k}" if TARGET_FORMAT already defined. - (INIT_STAB_SECTION): Define. - * config/obj-coffbfd.c: Include . - (write_object_file): Look for .stab sections and call - adjust_stab_section. - (adjust_stab_section): New function, fills in the first symbol - of a stab section with number of symbols and string table size. - (obj_coff_init_stab_section): New function, creates the initial - symbol for a stab section. - -Mon Sep 27 15:21:55 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/atof-vax.c (md_atof): Return null on success instead of - empty string. - * config/atof-tahoe.c (md_atof): Ditto. - * read.c (float_cons): Expect a null pointer for success, not an - empty string. - - * hash.c (hash_insert, hash_jam, hash_grow): Return null pointer - on success, instead of empty string. All callers changed. - - * config/tc-vax.c: Use PARAMS in declarations. - (vip_op): Use NULL instead of empty string for success in error - and warning fields. - -Sun Sep 26 23:45:29 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * expr.c (expr) [DIFF_EXPR_OK]: Permit subtraction of two symbols - in different defined segments. - - * write.c (relax_segment): Localize "aim" variable. If - DIFF_EXPR_OK, don't impose checks on symbol segment types. - (fixup_segment) [DIFF_EXPR_OK]: If sub_symbolP is in the current - segment, convert to a PC-relative fixup and discard the symbol. - - * config/tc-m68k.c (flag_want_pic): New variable, mostly ignored. - (md_parse_option) [TE_SUN3]: Set it for "-k". - (m68k_ip): Generate proper fixup for mode 7.3. - * config/tc-m68k.h (DIFF_EXPR_OK): Define. - -Sat Sep 25 05:08:19 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-m68k.c (struct m68k_incant, getone, gettwo): Moved - earlier in the file. - (insop, add_exp): Now defined as functions, for readability. - (insop): Now takes two arguments; callers changed. - -Fri Sep 24 12:37:59 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * config/tc-m88k.c (get_o6): new function. - (get_bf, get_cmp, get_cnd, get_cr, get_fcr, get_imm16, get_reg, - get_vec9, getval, get_pcr, calcop, match_name): make static and - prototype. - (s_file): remove extraneous forward decl. - (md_begin): add const to retval decl. - (calcop): cope with instructions without arguments. Handle 'o' - type argument, the o6 field of the prot insn. - (md_estimate_size_before_relax): return a dummy value. - - * config/m88k-opcode.h (m88k_opcodes): comment change; o6 field is - in bits 10 through 7. flt.[dxs]s requires an r register in the - second argument. New instruction lda.x. New instruction muls - (alias for mul). - -Fri Sep 24 13:43:30 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (distclean): Recurse like clean. - * doc/Makefile.in (distclean): New target. - - * config/tc-mips.c (md_begin): Set BFD architecture and machine - based on MIPS ISA level. - -Thu Sep 23 17:58:58 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * as.c (main): "exhausted", not "exhuasted". - - * struc-symbol.h (struct symbol): Add sy_used_in_reloc field. - * write.c (adjust_reloc_syms): Set sy_used_in_reloc. - (write_object_file): Never strip symbols with sy_used_in_reloc - set. - - * config/obj-elf.c (obj_elf_section): Rewrote to handle both - Solaris and SVR4 style .section pseudo-ops. - (obj_elf_ident): Set SEC_READONLY for .comment section. - * config/tc-sparc.c (md_apply_fix): If this is ELF, and we're - generating a reloc, don't apply a fix. - -Thu Sep 23 13:16:58 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-coffbfd.c (relax_align): Now static. - -Mon Sep 20 19:23:35 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * read.c (get_stab_string_offset): Make non-static. Make - arguments const. Don't align strings to 4 byte boundaries. - * read.h: Declare get_stab_string_offset. - * config/obj-elf.c (obj_elf_section): Set SEC_ALLOC as well as - SEC_LOAD for progbits section. - (obj_elf_init_stab_section): New function. - (adjust_stab_sections): Add casts to avoid warnings. - * config/obj-elf.h (INIT_STAB_SECTION): Call - obj_elf_init_stab_section. - (OBJ_PROCESS_STAB): Removed definition. - -Fri Sep 17 18:12:34 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-elf.h (S_GET_SIZE): Define. - (obj_frob_forward_symbol): Define. - * config/tc-i386.c (line_comment_chars): Initialize in all cases. - -Thu Sep 16 14:23:08 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * tc.h: Declare tc_gen_reloc differently depending upon - RELOC_EXPANSION_POSSIBLE. - * config/obj-elf.c (obj_elf_section): Only set flags when first - creating the section. - -Wed Sep 15 12:15:53 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (append_insn): Don't swap a trap instruction - with a branch. - -Tue Sep 14 13:31:04 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-elf.c (obj_elf_data, obj_elf_text): New functions; - set previous_section and previous_subsection and then call s_data - and s_text, respectively. - (obj_pseudo_table): Add data and text. - (obj_elf_section): Add SEC_LOAD to default initialization of - flags. Treat .rodata1 like .rodata. Set SEC_LOAD as well as - SEC_ALLOC for "alloc" string. Don't bother trying to find the - section; just use subseg_new. - - * read.c (change_to_section): Removed. This is now done by - subseg_new. - (get_stab_string_offset): Rearranged somewhat. Create the section - using subseg_new. Store the string index in seg_info, rather than - in a static variable. Force the first string to be empty. Use - frag_more rather than FRAG_APPEND_1_CHAR. - (s_stab_generic): Rewrote. - * subsegs.h (segment_info_type): Added stabu union. - * subsegs.c (subseg_new): Initialize stab_string_size to 0. - * config/obj-aout.c: Don't include aout/stab_gnu.h. - (obj_aout_stab, obj_aout_desc): Removed. - (obj_pseudo_table): Removed desc and stabX entries. - * config/obj-bout.c: Same changes as config/obj-aout.c. - * config/obj-bout.h (S_SET_TYPE): Define. - (tc_bout_fix_to_chars): Declare. - * config/obj-coff.c (obj_coff_stab): Removed. - (obj_pseudo_table): Removed desc and stabX entries. - * config/obj-coff.h (SEPARATE_STAB_SECTIONS): Define. - * config/obj-coffbfd.c (current_stab_symbol): Removed. - * config/obj-coffbfd.h (obj_symbol_type): Removed n_strx, n_type, - n_other, n_desc and n_value fields. - (S_{S,G}ET_{OFFSET,OTHER,TYPE,DESC}): Removed. - (MAKE_STAB_SYMBOL): Removed. - * config/obj-ecoff.c (obj_ecoff_stab): Renamed to ecoff_stab. - Changed arguments and removed parsing code. - (obj_pseudo_table): Removed stabX entries. - * config/obj-ecoff.h (ecoff_stab): Declare. - (OBJ_PROCESS_STAB): Define. - * config/obj-elf.c: Don't include aout/stab_gnu.h. - (obj_elf_stab, obj_elf_xstab, obj_elf_desc, - elf_stab_symbol_string, elf_stab_symbol, obj_elf_stab_generic): - Removed. - (obj_pseudo_table): Removed desc, stabX and xstabs entries. - (obj_elf_version): Use subseg_new, not bfd_make_section. Don't - set SEC_LOAD for .note section. - (adjust_stab_sections): Get frag pointer from seg_info, rather - than looking through frags. - * config/obj-elf.h (S_{S,G}ET_{OTHER,TYPE,DESC}): Removed. - (SEPARATE_STAB_SECTIONS, INIT_STAB_SECTION, OBJ_PROCESS_STAB): - Define. - * config/obj-vms.c (obj_aout_stab): Removed. - (obj_pseudo_table): Removed stabX entries. - * config/obj-vms.h (S_SET_TYPE): Define. - - * as.h: Declare listing. - * read.c: Don't declare listing. - (emit_expr): Cast fix_new_exp argument. - (parse_bitfield_cons): Correct printf format. - * symbols.c (symbol_new): Add cast to avoid warning. - * write.h: Declare text_last_frag and data_last_frag. - * config/obj-bout.c (obj_bout_line): Added dummy argument. - * config/obj-coffbfd.c: Add some casts to avoid warnings. - * config/tc-a29k.c: Likewise. - * config/tc-i960.c: Likewise. Also fully bracket structure - initializations, fix printf formats, and remove unused variables. - -Mon Sep 13 16:48:38 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * read.c (s_desc): Only compile and use if S_SET_DESC is defined. - * struc-symbol.h: Declare verify_symbol_chain and - verify_symbol_chain_2 even if not SYMBOLS_NEED_BACKPOINTERS. - * symbols.c (verify_symbol_chain): Removed useless expression. - * write.c (headers, the_object_file): Only use if not - BFD_ASSEMBLER and not BFD. - (fixup_segment, cvs_frag_to_fill): Only use if BFD_ASSEMBLER or - not BFD. - (merge_data_into_text): Only use if BFD_ASSEMBLER or (not BFD and - not OBJ_AOUT). - * write.h: Declare relax_segment. - * config/obj-coffbfd.c (stack_pop, stack_push, stack_init): Made - static. - (stack_top): Commented out, since it's not used. - Fixed up pseudo-op functions to take an ignored int argument. - (size_section): Added default BAD_CASE to switch. - Changed bzero calls to memset. - * config/obj-coffbfd.h (S_IS_LOCAL): Call strchr on S_GET_NAME - (s), not on s itself. - * config/tc-a29k.c (s_use): Take ignored int argument. Only - define if OBJ_COFF is not defined. - * config/tc-i386.c: (fits_in_signed_byte, smallest_imm_type): Make - argument signed again. - * config/tc-m68k.c (s_bss, s_even, s_proc): Take ignored int - argument. - (m68k_ip): Fully bracket initialization of archs. - Correct several formats for __LINE__ to be %d rather than %s. - (init_table): Fully bracket initialization. - Cast values larger than 0x7f assigned to fr_opcode to char. - - * subsegs.c: Renamed non-BFD_ASSEMBLER subseg_new to subseg_set. - Wrote non-BFD_ASSEMBLER subseg_new. Now subseg_new always takes a - section name, and subseg_set always takes a segT. Changed all - callers as appropriate. - * config/obj-coffbfd.c (change_to_section): Renamed to - obj_coff_add_segment. Corrected. Made callers use subseg_new. - * config/obj-coffbfd.h (obj_segment_name, obj_add_segment): - Define. - -Mon Sep 13 13:15:03 1993 Doug Evans (dje@canuck.cygnus.com) - - * config/tc-sparc.h (LOCAL_LABEL): Remove test for name[0] == 'L'. - -Fri Sep 10 11:22:08 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-elf.h (S_SET_SIZE): Actually set the size. - - Gcc lint. - * Added a number of casts to function calls. - * app.c (do_scrub_begin), as.c (main), expr.c (integer_constant, - operand, expr), read.c (read_begin, HANDLE_CONDITIONAL_ASSEMBLY, - read_a_source_file, s_align_bytes, demand_empty_rest_of_line, - ignore_rest_of_line, big_cons, is_it_end_of_statement, s_ignore), - read.h (is_name_beginner, is_part_of_name), config/obj-elf.c - (obj_elf_section), config/tc-i386.c (parse_register), - config/tc-sparc.c (isoctal, s_proc): Cast char - array indices to unsigned char. - * app.c (process_escape): Make static. Add prototype. Change - argument from char to int. - * as.c: Include output-file.h for prototypes. Comment out unused - function got_sig. - * Makefile.in (as.o): Depend on output-file.h. - * as.h (BAD_CASE): Cast val argument to long, and use %ld. - (pseudo_typeS): Add prototype to poc_handler field. - (print_version_id): Add prototype. - (xmalloc, xrealloc): Change size arguments to unsigned long. - (do_scrub_next_char): Add prototypes for function arguments. - (had_errors, had_warnings, scrub_from_file): Remove duplicate - declarations. - * atof-generic.c (atof_generic): Make size variables unsigned. - * cond.c (ignore_input): Removed unused local variable ptr. - * expr.c (floating_constant, integer_constant): Make static. Add - prototypes. - * flonum-copy.c (flonum_copy): Make size variables unsigned. - * frags.h: Add prototype for frag_init. - * hash.h, hash.c: Change hash values from char * to PTR, make hash - strings const, make returned error strings const char *. Added - prototypes for functions. - * input-file.h, input-file.c (input_file_buffer_size): Return - unsigned int. - * input-scrub.c (buffer_length): Make unsigned. - (input_scrub_push, input_scrub_pop): Make static. - * listing.c (list_symbol_table): Cast sprintf argument to unsigned - long and use %lx. Print name of segment rather than address of - structure. - (listing_list, listing_title): Change argument to int. - (listing_eject, listing_flags, listing_psize): Add int argument. - * listing.h: Corresponding declaration changes. - * obj.h (obj_emit_symbols): Rename prototype argument to avoid - shadowing. - * read.h: Change get_absolute_expression prototype to return - offsetT. Add prototype for next_char_of_string. Various - prototype changes. - * read.c: Remove prototype for next_char_of_string. - (pobegin): Make errtxt const. Make new_length, tmp_len and num - unsigned. - (s_abort, s_align_ptwo, s_comm, s_data, s_app_line, s_fill, - s_globl, s_lsym, s_org, s_set, s_text, s_desc): Add int argument. - Change all callers. - (s_comm): Change temp from valueT to offsetT. Cast to long when - printing and use %ld (only for error messages anyhow). - (s_long, s_int): Remove unused functions. - (cons): Change argument to int. - (emit_expr): Use %lx when printing longs. - (get_absolute_expression): Return offsetT, not long. - (get_stab_string_offset): Comment out unless - SEPARATE_STAB_SECTIONS. - (s_stab_generic): Remove unused offset. Define seg_is_new only - if SEPARATE_STAB_SECTIONS. Use toP only in local block. - * struc-symbol.h (verify_symbol_chain_2): Add prototype. - * symbols.c: Remove nested comment. - (symbol_new): Rename value to valu. - (colon): Use %ld and cast to long in error message. - * symbols.h: Remove duplicate verify_symbol_chain declaration. - * tc.h: Remove unused md_emit_relocations declaration. - (tc_gen_reloc): Add declaration. - * write.c (cvt_frag_to_fill): Change first argument name depending - on BFD_ASSEMBLER. - (write_relocs): Remove unused offset, frags. Remove tc_gen_reloc - declarations. Make n unsigned. - (write_contents): Remove unused i, n, relocs, fixp. Rename frags - to f to avoid shadowing. - (write_object_file): Define fragP only if not BFD_ASSEMBLER or not - WORKING_DOT_WORD. Remove unused keep. Only declare punt and - punt_it if they will be used. Make i and n unsigned. - (fixup_segment): Cast to long and use %ld in error message. - * xmalloc.c (xmalloc, xrealloc): Make size argument unsigned. - * config/obj-aout.h: Remove nested comment. Add prototype for - obj_aout_frob_symbol. - (obj_aout_line, obj_aout_desc): Add int argument. - * config/obj-ecoff.c: Changed build routines to use an unsigned - offset. - (add_string): Make len unsigned long. - (obj_ecoff_stab): Use %lu in error message. - * config/obj-elf.c (obj_elf_common): Comment out unused label - allocate_bss. - (obj_elf_frob_symbol): Return 0 (currently broken). - (obj_elf_desc, obj_elf_version, obj_elf_size, obj_elf_type, - obj_elf_ident, obj_elf_weak, obj_elf_local, obj_elf_common, - obj_elf_line, obj_elf_previous): Add int argument. - (obj_elf_write_symbol_p): Make static. - * config/obj-elf.h (obj_elf_write_symbol): Add prototype. - * config/tc-hppa.h: Remove declarations of functions declared in - read.h. - * config/tc-i386.c (ENCODE_RELAX_STATE): Cast to relax_substateT. - (s_bss): Add int argument. - (fits_in_signed_byte, smallest_imm_type): Make argument unsigned. - (dummy): Remove unused function. - (md_assemble): Rename local o to op to avoid shadowing. - (tc_gen_reloc): Rename local reloc to rel to avoid shadowing. - * config/tc-m68k.c (s_data1, s_data2): Add int argument. - * config/tc-mips.c (mips_ip, md_apply_fix): Cast to long and use - %ld in error messages. - * config/tc-sparc.c: Remove duplicate declarations. - (getExpression): Rewrite condition to avoid empty conditional - body. - (s_reg, s_proc, s_reserve, s_common, s_seg, s_xword): Add int - argument. - -Thu Sep 9 17:10:00 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - Changes from Jeff Law: - - * config/tc-hppa.c (md_assemble): Fix typo. - (pa_ip): Delete unused variables and labels. Do not check for - unsigned values being < 0, it can't happen. - (is_same_frag): Return a value in recursive call case. - (pa_callinfo): Delete unused variables and labels. - (pa_comm): Likewise. - (pa_copyright): Likewise. - (pa_export): Likewise. - (pa_import): Likewise. - (pa_param): Likewise. - (pa_space): Likewise. - (pa_subspace): Likewise. - -Thu Sep 9 15:05:34 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * read.c (get_stab_string_offset, s_stab_generic): If - BFD_ASSEMBLER, call subseg_set rather than subseg_new. - -Wed Sep 8 15:09:17 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-elf.c (obj_elf_section): Set SEC_LOAD when using - default flag values. - -Tue Sep 7 10:22:52 1993 Stan Shebs (shebs@rtl.cygnus.com) - - * read.c: (change_to_section): Don't include body if not MANY_SECTIONS. - - * read.c: (s_stab, s_xstab, s_desc): New functions to parse - various stab-related directives. - * read.h: (s_stab, s_xstab, s_desc): New function prototypes. - * write.c: (merge_data_into_text): Fix ifdef tangle. - * config/obj-coffbfd.c (current_stab_symbol): Fake symbol - for stab reader to use. - * config/obj-coffbfdh.h (obj_symbol_type): Added fields for - stab reader, macros to access. - -Fri Sep 3 16:44:03 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-elf.h (elf_symbol): No longer special-cased on - sparcv9, since elf_symbol_type is now independent of size. - - * config/obj-elf.h (elf_symbol): Fixed name of elf_symbol_type. - - * config/tc-hppa.h (struct default_subspace_dict, struct - default_space_dict): Field "sort" is now unsigned char. - - * config/tc-hppa.c (pa_def_subspaces, pa_def_spaces): Align - columns for easier reading. - (bcmp, index): Deleted USG-specific definitions. Should be dealt - with in ho-*.h, or in libiberty. Changed mention of index to - strchr. - (label_symbolP, label_symbol_defined, callinfo_found, - within_entry_exit, exit_processing_complete, within_procedure, - pa_def_subspaces, pa_def_spaces, pa_pseudo_op_moves_pc, - label_symbols_rootP, pa_get_label, pa_label_is_defined, - pa_undefine_label): Now static. - (movers): Now const, in addition to pointing to const data. - * config/tc-hppa.h (label_symbolS_rootP, pa_get_label, - pa_label_is_defined, pa_undefine_label, pa_pseudo_op_moves_pc): - Delete declarations. - - Merged more changes from Jeff Law and Pete Hoogenboom: - - * config/tc-hppa.c (pa_def_subspaces, pa_def_subspaces): Remove - entries for .stab and .stabstr. - - * config/obj-elf.c: (elf_stab_symbol_string): Set the - SEC_LOAD attribute for the .stabstr section. - (obj_elf_stab_generic): Set the SEC_LOAD attribute for the - .stab section. - (obj_elf_stab_generic): Change '#if 1' to '#if 0'. - (obj_elf_stab_generic): Incorrect byte count on call to - md_number_to_chars function. - - * config/tc-hppa.c (hppa_tc_symbol): Static functions need - argument relocation bits too. - - * config/tc-hppa.c (pa_stringer): Correctly handle escaping - characters which should appear unaltered in the output string (for - example an escaped double-quote). - - * config/tc-hppa.c (pa_parse_nonneg_cmpsub_cmpltr): Always - initialize name. - (pa_parse_neg_cmpsub_cmpltr): Likewise. - (pa_parse_nonneg_add_cmpltr): Likewise. - (pa_parse_neg_add_cmpltr): Likewise. - - * config/tc-hppa.h (parse_cons_expression_hppa): Remove prototype - for now. - (cons_fix_new_hppa): Likewise. - * config/tc-hppa.c (md_apply_fix): Fix type of valp to match - prototype. - - * config/tc-hppa.c: Include libhppa.h. - - * config/tc-hppa.h: Delete extern declarations of functions - found in libhppa.h. - - * config/tc-hppa.c (pa_space): Rework to avoid unwanted #ifdef - OBJ_ELF conditionals. - * config/tc-hppa.h (LOCAL_LABEL): Correctly identify local labels - on the PA. - -Thu Sep 2 10:43:57 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (macro_build): Accept 'z', and ignore it. - (macro): Use "z,s,t" for div instructions to match corresponding - change in opcode table. - (mips_ip): Added 'z'--must be zero register. - -Wed Sep 1 15:56:42 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * write.c (write_relocs) [RELOC_EXPANSION_POSSIBLE]: Declare - tc_gen_reloc correctly. - - * configure.in: Use "case" instead of "if" when possible. Rewrote - Makefile editing to reduce work done. Treat "hppa*" as "hppa". - -Wed Sep 1 12:19:07 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * config/obj-coffbfd.c (obj_coff_section): add 'd' as an alias for - section type of data. 'd' seems to be used for m88k. - -Wed Aug 25 22:33:22 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_align, s_stringer, s_cons, s_float_cons, - s_mips_space): Set insn_label to NULL to avoid changing it at the - next .align statement. - (append_insn): Don't swap jal with instruction that sets the - register that jal sets. - -Wed Aug 25 16:15:57 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * configure.in: recognize m88110. - -Wed Aug 25 13:37:46 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - Merged changes from Pete Hoogenboom and Jeff Law at Utah: - * config/tc-hppa.c (pa_build_unwind_subspace): SEC_ALLOC should - not be on for .hppa_unwind. - (md_pseudo_table): .PARAM and .param are valid pseudo-ops for GAS. - (pa_param): New function to handle .PARAM directives. - (pa_ip): Pass "isbranch" argument down to pa_parse_*_compltr - functions. Handle '|' for movb; allow movb,n. - (pa_parse_nonneg_cmpsub_cmpltr): Delete old useless - version. Handle cases where no completer exists for - comb,n or addb,n. - (pa_parse_neg_cmpsub_cmpltr): Handle cases where no - completer exists for comb,n or addb,n. Make logic - mirror that of pa_parse_nonneg_cmpsub_cmpltr. - (pa_parse_nonneg_add_cmpltr): Likewise. - (pa_parse_neg_add_cmpltr): Likewise. - * tc-hppa.h (pa_param): Declare. - -Tue Aug 24 15:41:35 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-hppa.c (hppa_tc_make_symextn_section): Now static. - Added forward declaration. - - Merged changes from Pete Hoogenboom and Jeff Law at Utah: - - * config/obj-elf.c (elf_frob_file): Arguments were incorrect on - call to elf_tc_make_sections. - (obj_elf_version): A .note section shouldn't have the SEC_ALLOC - attribute. - - * config/tc-hppa.c (hppa_tc_make_sections): Add some processing to - handle symbol extension sections. - - * config/tc-hppa.c (pa_build_symextn_section): New function to - create a symbol extension section. - (pa_export_args): Make call to pa_build_symextn_section. - (hppa_tc_symbol, hppa_tc_make_sections, - hppa_tc_make_symextn_section): New functions. - * config/tc-hppa.h: Update elf_tc_symbol and elf_tc_make_sections - macros. - - * read.c (emit_expr): Place check for TC_CONS_FIX_NEW in the - BFD_ASSEMBLER branch as well. - - * config/tc-hppa.h: If ELF is the target object format, define - some ELF- and hppa-specific types and constants. - - * config/tc-hppa.c (getExpression): Fix a typo. - - * read.c (read_a_source_file): Use TC_EQUAL_IN_INSN to determine - if a `=' is part of an instruction. - (read_a_source_file): Handle case where end-of-line markers are - also used within instructions. - * config/tc-hppa.h (TC_EQUAL_IN_INSN, TC_EOL_IN_INSN): Define. - - * config/tc-hppa.c (md_apply_fix_1): Keep relocations for - out-of-range branches/'calls using "bl" or calls which may need - argument relocation stubs. Do not need/keep relocations for - conditional branches. - (elf_hppa_final_processing): Fix calculation of function size. - - * config/obj-elf.c (obj_elf_version): Mark .note section as - READONLY. - - * config/tc-hppa.c (parse_cons_expression_hppa): Pass exp, not the - address of exp, to expression. - (pa_build_unwind_subspace): Turn SEC_HAS_CONTENTS flag on. - (md_apply_fix_1): Delete unwanted comments. - (process_exit): Symbols marking the end of a function are always - BSF_LOCAL. - - * config/tc-hppa.c: Include elf32-hppa.h from BFD tree. - (pa_space): Declare and initialize gdb_section. - - * config/obj-elf.c (elf_frob_file): Change - elf_tc_final_processing_hook to elf_tc_final_processing. - - * config/tc-hppa.c (fix_new_hppa): Fix argument list to match - argument type declarations. - (getExpression): Fix typo. - (pa_export_args): Change elf_symbol_type to elf32_symbol_type. - (elf_hppa_final_processing): Likewise. Name changed from - elf_hppa_final_processing_hook. - (start_symbol_root, start_symbol_last): Deleted. - - * config/tc-hppa.h (TC_PARSE_CONS_EXPRESSION): Fix typo. - - * config/tc-hppa.h: Replace "symbolS" with "struct symbol" to - avoid changing include ordering. - - * config/tc-hppa.c (pa_ip, case 'y'): Handle just like 't'. - -Mon Aug 23 12:47:58 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (set_at): Added unsignedp argument. Use - load_register. - (set_at_unsigned): Removed; changed callers to use set_at. - (load_register): Removed unused ip argument. Changed callers. - (append_insn): Don't swap branch and branch likely. - (macro_build): Handle 'u'. - (load_register): Handle 64 bit constants. - (macro): Added M_DABS, removed M_ABSU. Numerous changes to - support 64 bit constants. - (mips_ip): Use hex constants in range checks for clarity. - (md_number_to_chars): Support 8 byte values. - -Fri Aug 20 16:50:59 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * config/tc-m88k.h: updated copyrights. - (TC_CONS_RELOC): declare to be RELOC_32. - -Fri Aug 20 11:16:44 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_isa): New static variable. - (md_begin): Initialize mips_isa based on TARGET_CPU. Don't sanity - check macros. Set text alignment and GP size here. - (md_assemble): Don't set text alignment and GP size here. - (append_insn): Don't insert NOPs for load delays if mips_isa >= 2. - Use the right mask and shift for WRITE_FPR_T and WRITE_FPR_S. Add - a NOP after a branch likely. - (mips_emit_delays): Don't insert NOPS for load delays if mips_isa - >= 2. - (macro): Support r6000 and r4000 macros. - (mips_ip): Check insn ISA level against mips_isa before using it. - Added 'x' case for ignored register. - (md_parse_option): Handle -mipsN and -mcpu=XX. - -Fri Aug 20 01:26:52 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-i386.c (md_pseudo_table) [OBJ_ELF]: Handle ".zero". - -Thu Aug 19 12:15:18 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.c (s_local): Function moved and renamed... - * config/obj-elf.c (obj_elf_local): ...to here. - * config/tc-sparc.c (md_pseudo_table), config/obj-elf.c - (obj_pseudo_table): Move handling of ".local". - - * tc.h (md_parse_option): Don't declare if defined as a macro. - - * config/tc-i386.h (NO_RELOC) [BFD_ASSEMBLER]: Define as - BFD_RELOC_NONE. - (md_parse_option): New macro, converted from function. - * config/tc-i386.c (md_parse_option): Function deleted. - (comment_chars) [OBJ_ELF]: Include "/". - (line_comment_chars) [OBJ_ELF || TE_I386AIX]: Don't include "/". - (md_assemble): Cast 0xe9 to char explicitly, to avoid compiler - warning. - (md_assemble, md_estimate_size_before_relax, md_create_long_jump): - Call reloc for fix_new type, or use correct enumerator, instead of - always using NO_RELOC. - (i386_operand): Change "ifndef I386COFF" to "ifdef OBJ_AOUT" for - tests for valid section. - (md_convert_frag) [BFD_ASSEMBLER]: Compensate for frag start - address. - (md_apply_fix_1) [BFD_ASSEMBLER]: For pc-relative reloc with - symbol, compensate for location of reloc. - (reloc, BFD_RELOC_32, BFD_RELOC_32_PCREL) [!BFD_ASSEMBLER]: Define - to return zero. - -Wed Aug 18 16:51:29 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-elf.c: Undef NO_RELOC before including aout/aout64.h. - (obj_elf_weak): New function. - (obj_pseudo_table): Handle ".weak". - (obj_elf_section): If section directive includes a string, ignore - it for now. Accept "progbits" flag. - (obj_elf_type): Accept `@' before flag name. - - * write.c (relax_and_size_seg) [BFD_ASSEMBLER]: Get rid of `if(1)' - condition. - (fixup_segment) [BFD_ASSEMBLER]: Use bfd_is_com_section, rather - than checking for bfd_com_section directly. - (fixup_segment): Simplify range check. - (fixup_segment) [OBJ_COFF && TC_I960]: Simplify cpp condition - test. - - * symbols.h (S_SET_WEAK): Declare. - * symbols.c (S_SET_WEAK): New function. - (S_SET_EXTERNAL, S_CLEAR_EXTERNAL): Don't bother with BSF_EXPORT, - it's not a separate flag any more. Clear BSF_WEAK. - - * read.c (potable): Treat "string" like "asciz". - -Wed Aug 18 15:30:29 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (append_insn): Don't swap branch instructions - if .set nobopt or .set volatile. - (gp_reference): .lit8 and .lit4 are accessed via the GP register. - (macro): Added cases M_LI_S, M_LI_SS. Fixed M_LI_D and M_LI_DD. - (mips_ip): Added cases 'F', 'L', 'f', 'l' for floating point. - * config/obj-ecoff.c: Renamed some variables to avoid shadow - warnings. - -Mon Aug 16 14:16:02 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * config/obj-coff.h (S_IS_COMMON): add missing backslash - - * configure.in (z8k-*-{coff,sim}): use coffbfd for this target - -Thu Aug 12 11:47:58 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (mips_ip): Suggested by - davidj@ICSI.Berkeley.EDU (David Johnson): Don't accept symbolic - names for 'E' and 'G' argument types (coprocessor registers) and - don't warn if $1 is used on the coprocessor. - (macro): Handle M_{L,S}WC{0,2,3}_AB correctly. - -Mon Aug 9 12:09:14 1993 Doug Evans (dje@canuck.cygnus.com) - - * read.c (emit_expr): Use BFD_RELOC_16 for 2-byte values. - * config/tc-sparc.c (md_apply_fix, tc_gen_reloc): Handle - BFD_RELOC_16. - * config/tc-sparc.h (WORKING_DOT_WORD): Define. - -Mon Aug 9 13:36:22 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * write.c (merge_data_into_text): Define only if BFD_ASSEMBLER is - defined or BFD is not. - (relax_and_size_all_segments): Declare local variable fragP. - -Fri Aug 6 15:22:53 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.c (md_apply_fix, case BFD_RELOC_32): Fill in - bytes with real values, not zeros. - -Fri Aug 6 10:57:59 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * configure.in (mips-*-riscos*, mips-*-sysv*): New (untested) - targets, using ecoff and mips-big. - - * config/tc-mips.c (mips_ip): From davidj@ICSI.Berkeley.EDU (David - Johnson): Added case for 'C' for coprocessor instruction codes. - -Thu Aug 5 13:08:56 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.c (md_apply_fix, case BFD_RELOC_64): Fill in - bytes with real values, not zeros. - (md_pseudo_table): Call cons for .uaxword. - - * config/obj-elf.c (obj_pseudo_table): Handle ".8byte". - - * read.c (emit_expr): Use BFD_RELOC_64 for 8-byte expressions. - - * write.c (write_object_file): Test DEBUG_SYMS instead of DEBUG - for verifying symbol chain. - (merge_data_into_text, relax_and_size_all_segments): New - functions, split out from write_object_file. - -Tue Aug 3 15:43:55 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-elf.c (obj_elf_stab_generic, in disabled code): If - debug section is new, allocate an extra 12 bytes at its start. If - ".stabs" type is N_SO, fill in filename symbol field of that first - entry. Return early if "goof", to simplify later code slightly. - (adjust_stab_sections): New function. - (elf_frob_file): Apply adjust_stab_sections to each section. - - * config/obj-elf.c (obj_elf_section, obj_elf_previous): No longer - static. - * config/obj-elf.h (obj_elf_section, obj_elf_previous): Declare. - * config/tc-sparc.c (md_pseudo_table): Call them for "pushsection" - and "popsection", and call cons for "uaword" and "uahalf". - - * config/obj-elf.c (obj_elf_version): Use English in error - messages. - -Tue Aug 3 11:29:06 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/obj-ecoff.c: Updated for BFD ECOFF changes. Now gets the - swapping routines and external structure sizes via the - ecoff_backend information. No longer includes coff/mips.h. - -Mon Aug 2 17:35:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-ecoff.c (get_tag): Save tag name in permanent memory - and in hash_ptr->string. - - * app.c (do_scrub_next_char): Reset state to 0 after .appline if - file name is not seen. - -Mon Aug 2 11:51:41 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.c (md_apply_fix, case BFD_RELOC_64): New case, - parallel to BFD_RELOC_32. - (tc_gen_reloc): Accept BFD_RELOC_64. - -Thu Jul 29 22:21:28 1993 Ian Lance Taylor (ian@cygnus.com) - - * write.c: Don't use short int in a prototype. - - * expr.c (operand): Make return value simply depend on contents of - returned expression. - -Thu Jul 29 18:38:37 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * configure.in: sparc*-aout and sparc*-vxworks are BFD assemblers - -Thu Jul 29 18:38:37 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * config/ho-sunos.h: remove some old function decls that conflict - w/ ANSI, and which weren't needed anyway - -Wed Jul 28 16:34:55 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-elf.h (obj_frob_symbol): Renamed from tc_frob_symbol, - and disabled since it breaks Ian's new symbol-value code. - - * expr.c (integer_constant): Accept more digits if BFD64. - -Wed Jul 28 11:30:05 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-m68k.c (m68k_ip): If we have a normal constant when we - expect a bignum, turn it into a bignum. Output extra zeroes - before a short bignum, rather than after. - -Tue Jul 27 15:54:27 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * symbols.c (symbol_new): Conditionalize verify_symbol_chain call - on DEBUG_SYMS, not DEBUG. - (symbol_remove): Likewise. - (symbol_insert): Likewise. - -Tue Jul 27 08:45:05 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-mips.c (mips_optimize): New static variable. - (append_insn): If mips_optimize == 0, always insert NOP - instructions. If mips_optimize < 2, don't swap branches. - (md_parse_option): If -Ox or -gx, set mips_optimize accordingly. - -Mon Jul 26 18:02:43 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * Makefile.in (clean): if testsuite does not exist, then skip it. - -Fri Jul 23 14:13:25 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-mips.c (prev_insn_unreordered, - prev_prev_insn_unreordered): New static variables. - (append_insn): Don't swap branch instruction if - prev_prev_insn_unreordered (see comment). - (mips_no_prev_insn): Clear the unreordered variables. - (s_mipsset): When turning on reordering, set the unreordered - variables. - -Fri Jul 23 13:09:44 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-elf.c (obj_elf_section): Sections ".init" and ".fini" - are also magic, and have special default flag settings. - (obj_elf_frob_symbol): Since the return value from this function - isn't used, don't bother calling obj_elf_write_symbol_p, since it - doesn't accomplish anything else. - - * config/tc-sparc.c (md_section_align): Round up section size only - for a.out format. - - * symbols.c: Don't define DEBUG by default. - -Thu Jul 22 12:09:41 1993 Ian Lance Taylor (ian@cygnus.com) - - * write.c (fix_new_exp): Handle a O_uminus expression. - - * expr.c (expr): Don't let absolute_section override - undefined_section for the return value. - - * read.c (read_a_source_file): In NO_PSEUDO_DOT case, if we find a - pseudo-op with a poc_handler field of NULL, ignore it and treat it - as an instruction instead. - * config/tc-m88k.c (md_pseudo_table): Add "set" with a NULL - poc_handler field. - - * config/tc-h8500.c (md_begin): Use a local variable when - initializing md_relax_table to avoid warnings about modifying a - supposedly const data structure. - -Thu Jul 22 10:58:51 1993 Brendan Kehoe (brendan@lisa.cygnus.com) - - * config/obj-aout.c: Only include aout/aout64.h if BFD_ASSEMBLER - is defined. - -Wed Jul 21 17:32:02 1993 Fred Fish (fnf@deneb.cygnus.com) - - * configure.in (case ${host}): Map *-*-sysv4* to gas_host=sysv. - * configure.in (case ${generic_target}): Add i[34]86-*-sysv4* - case to set obj_format=elf. Must go before i386-*-sysv* case that - sets obj_format=coffbsd. Add *-*-sysv4* to *-*-elf and - *-*-solaris case, and move to before *-sysv* case that wants to - set obj_format to coff. - * config/tc-i386.c (i386_operand): Change all 'exp.X_op' to - 'exp->X_op'. - * config/tc-i386.c (md_apply_fix): Fix valp to be 'valueT *' for - BFD_ASSEMBLER case. - -Wed Jul 21 12:47:51 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-aout.c: Include aout/aout64.h. - (obj_aout_frob_symbol): Set BSF_DEBUGGING for a constructor - symbol, so that BFD doesn't tamper with the type. - - * read.c (read_a_source_file): If NO_PSEUDO_DOT is defined, look - up opcodes as pseudo-ops even if they don't start with '.'. - * config/tc-m88k.h (NO_PSEUDO_DOT): Define. - * config/tc-m88k.c (md_assemble): Removed special pseudo-op - handling. - (md_apply_fix): Set fx_offset to the upper 16 bits of the reloc. - Output the low 16 bits for RELOC_HI16, not the high 16 bits. - * config/obj-coffbfd.c (do_relocs_for): If TC_M88K, set the - r_offset field of the reloc to the fixup offset. - (fixup_segments): If TC_M88K, don't warn about fixup overflows. - * doc/as.texinfo: Minor updates. - -Tue Jul 20 19:28:56 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Extensive changes to permit symbols to contain any expression - type and to delay the computation of the expression until the - value is actually needed. This permits setting symbols to values - calculated based on object code size. Expressions were changed to - no longer be in a section, to stop the overloading of segment and - expression type that previously occurred. - - * as.c (big_section, pass1_section, diff_section, absent_section): - Removed. - (expr_section): Added (used for dummy symbols which hold - intermediate expression values). - (perform_an_assembly_pass): Create expr_section, do not create the - sections now removed. - * as.h (segT): Removed SEG_ABSENT, SEG_PASS1, SEG_BIG, and - SEG_DIFFERENCE. Added SEG_EXPR. - (SEG_NORMAL): Corresponding changes. - * subsegs.c (seg_name, subsegs_begin): Changed accordingly. - * write.c (write_object_file): Ditto. - * config/obj-aout.c (seg_N_TYPE): Ditto. - * config/obj-bout.c (seg_N_TYPE): Ditto. - * config/obj-coff.c (seg_N_TYPE): Ditto. - * config/obj-coffbfd.c (seg_N_TYPE): Ditto. - * config/obj-vms.c (seg_N_TYPE): Ditto. - - * expr.h (operatorT): Moved in from expr.c, added some values. - (expressionS): Added X_op field, removed X_seg field; renamed - X_subtract_symbol to X_op_symbol. - * expr.c: Extensive changes to assign expression types rather than - sections and to simplify the parsing. - * write.c (fix_new_internal): New static function. - (fix_new): Removed sub_symbol argument. - (fix_new_exp): New function, takes expression argument. - * write.h: Prototype changes for fix_new and fix_new_exp. - * cond.c (s_if): Changed accordingly. - * read.c (s_lsym, pseudo_set, emit_expr, parse_bitfield_cons, - parse_repeat_cons, get_segmented_expression, - get_known_segmented_expression, get_absolute_expression): Ditto. - * symbols.c (resolve_symbol_value, S_GET_VALUE, S_SET_VALUE): - Ditto. - * write.c (write_object_file): Ditto. - * config/obj-coff.c (obj_coff_def, obj_coff_val): Ditto. - * config/obj-coffbfd.c (obj_coff_def, obj_coff_val, - obj_coff_endef, yank_symbols): Ditto. - * config/obj-elf.c (obj_elf_stab_generic, obj_elf_size): Ditto. - * config/tc-a29k.c (md_assemble, parse_operand, machine_ip, - print_insn, md_operand): Ditto. - * config/tc-h8300.c (parse_exp, colonmod24, check_operand, - do_a_fix_imm, build_bytes): Ditto. - * config/tc-h8500.c (parse_exp, skip_colonthing, parse_reglist, - get_specific, check, insert, md_convert_frag): Ditto. - * config/tc-hppa.c (the_insn, fix_new_hppa, cons_fix_new_hppa, - md_assemble, pa_ip, getExpression, getAbsoluteExpression, - evaluateAbsolute, pa_build_unwind_subspace, pa_entry, - process_exit): Ditto. - * config/tc-hppa.h (STAB_FIXUP, is_DP_relative, is_PC_relative, - is_complex): Ditto. - * config/tc-i386.c (pe, md_assemble, i386_operand, - md_estimate_size_before_relax, md_create_long_jump): Ditto. - * config/tc-i860.c (md_assemble, getExpression, print_insn): - Ditto. - * config/tc-i960.c (parse_expr, subs, segs, md_convert_frag, - get_cdisp, mem_fmt, parse_ldconst, relax_cobr, s_sysproc, - i960_handle_align): Ditto. - * config/tc-m68k.c (struct m68k_exp, struct m68k_it, seg, op, - subs, add_fix, isvar, m68k_ip, md_assemble, md_convert_frag_1, - md_estimate_size_before_relax, md_create_long_jump, get_num): - Ditto. - * config/tc-m88k.c (md_assemble, get_imm16, get_pcr, - md_create_short_jump, md_create_long_jump): Ditto. - * config/tc-mips.c (md_assemble, append_insn, gp_reference, - macro_build, macro, my_getExpression): Ditto. Also removed - get_optional_absolute_expression; just use get_absolute_expression - instead. - * config/tc-ns32k.c (get_addr_mode, evaluate_expr, convert_iif, - fix_new_ns32k, fix_new_ns32k_exp, cons_fix_new_ns32k): Ditto. - * config/tc-ns32k.h (fix_new_ns32k prototype): Ditto. - * config/tc-sh.c (parse_exp, check, insert, md_convert_frag): - Ditto. - * config/tc-sparc.c (md_assemble, sparc_ip, getExpression, - print_insn): Ditto. - * config/tc-tahoe.c (struct top, md_estimate_size_before_relax, - tip_op, md_assemble): Ditto. - * config/tc-vax.c (seg_of_operand, md_assemble, - md_estimate_size_before_relax, md_create_long_jump): Ditto. - * config/tc-z8k.c (parse_exp, check_operand, newfix): Ditto. - -Tue Jul 20 12:17:16 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * configure.in: i386-lynx is the same as i386-coff - -Mon Jul 19 15:21:20 1993 Ken Raeburn (raeburn@rtl.cygnus.com) - - * config/obj-elf.c (obj_elf_previous): New function. - (previous_section, previous_subsection): New vars. - (obj_elf_section): Save current place in case DWARF code wants us - to pop back to it. Handle unquoted section name as well as quoted - section name. Don't crash on invalid strings. - (obj_pseudo_table): Handle new pseudos "previous", "2byte", and - "4byte". - - * config/obj-elf.h: Don't include struc-symbol.h. - (obj_elf_frob_symbol): Declare arg as struct symbol *. - - * tc-sparc.h (LOCAL_LABEL) [OBJ_ELF]: Local labels can start with - "L" or "_.L_". - - * write.c (write_relocs): New function, split off from - write_contents. Use memset instead of bzero. - (write_object_file): Apply write_relocs to each section before - applying write_contents. - - * read.c (read_begin): Call obstack_begin with values closer to 1K - multiples. - (read_a_source_file, big_cons, float_cons): Use memcpy instead of - bcopy. - -Mon Jul 19 14:30:00 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/tc-m68k.c (m68k_ip_op): Don't decrement strend when - calculating opP->isiz; this permits the expression size to be - determined as well, later on. - - * expr.c (clean_up_expression): Don't cancel the subtraction of - undefined symbols. - - * read.c (s_data), config/obj-coffbfd.c (obj_coff_data): If -R, - switch to text section rather than data section. - -Mon Jul 19 12:35:39 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-m68k.c (m68k_ip, case AINDX): Add 6 to operand - expression (to take the pc-rel instruction itself into account) - before using the expression, instead of after. - -Fri Jul 16 08:56:04 1993 Ian Lance Taylor (ian@cygnus.com) - - * read.c (float_cons): Simplified parsing logic. If - REPEAT_CONS_EXPRESSIONS is defined, accept a repeat count. - - * symbols.c (colon): Rather than a special case for TC_HPPA, - use new macro tc_frob_label. - * config/tc-hppa.h (tc_frob_label): Define. - - * config/tc-mips.c: Many changes to support simple assembler - optimization. - (insn_label, prev_insn, prev_prev_insn, dummy_opcode, - prev_insn_valid, prev_insn_frag, prev_insn_where, - prev_insn_fixp, prev_insn_is_delay_slot): New static - variables. - (insn_uses_reg, mips_no_prev_insn, mips_emit_delays, - mips_align, s_stringer, s_mips_space): New static functions. - (mips_define_label): New global function. - (md_pseudo_table): For "ascii", "asciz", "asciiz", call - s_stringer. Changed argument to float_cons from 0 or 1 to 'f' - or 'd'. For "space" call s_mips_space. - (md_begin): Call mips_no_prev_insn. - (append_insn): Only insert necessary NOP instructions. - (macro): Call mips_emit_delays before setting mips_noreorder. - Increment and decrement mips_noreorder rather than using - save_reorder_condition. Don't bother to use noreorder in - M_L_DOB and M_L_DAB, since append_insn will not insert a NOP. - (md_atof): Handle floating point numbers correctly for both - big and little endian targets. - (s_align, s_cons): Call mips_align rather than frag_align. - (s_change_seg, s_cons): Call mips_emit_delays. - (s_float_cons): Let float_cons do the work. - (s_mipsset): Call mips_emit_delays when setting noreorder. - * config/tc-mips.h (tc_frob_label): Define to be - mips_define_label. - - * config/obj-ecoff.c (ecoff_build_symbols, ecoff_build_procs, - ecoff_frob_files): Consistently use S_GET_VALUE rather than - bfd_asymbol_value. Warn if taking difference of symbols in - different segments. - -Thu Jul 15 11:51:03 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/obj-ecoff.c (ecoff_frob_file): Discard all open scopes, - with a warning. - - * config/obj-coffbfd.c (fixup_segment): If TC_M88K, don't adjust - by md_pcrel_from if we are relocating against a symbol (we still - need md_pcrel_from for a PC relative relocation within the same - file). - * config/tc-m88k.c (md_pcrel_from): Corrected return value. - (omagic): Removed unused variable. - - * Preliminary support for m88k-coff. - * configure.in (m88k-*-coff*): New target. Use coffbfd and - m88kcoff. - * config/m88kcoff.mt: New file. - * read.c (lex_type): New macro LEX_AT to set lex type of '@'. - (pseudo_set): Handle difference of symbols in different fragments - by saving the entire expression as the value of the symbol. - * symbols.c (resolve_symbol_value): Resolve difference - expressions. - * config/obj-coffbfd.c (obj_pseudo_table): If TC_M88K, accept - "sdef" as a synonym for "def". - * config/obj-coffbfd.h: If TC_M88K, include coff/m88k.h and set - TARGET_FORMAT. - (S_IS_LOCAL): Any symbol which includes \001 in the name is local. - * config/tc-m88k.c, config/tc-m88k.h: Numerous changes to bring - m88k port up to date, and to add COFF support. - -Wed Jul 14 15:09:32 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Removed sy_forward and replaced it with an undefined expression - as the value of a symbol. - * struc-symbol.h (struct symbol): Removed sy_forward field. Added - sy_resolved and sy_resolving single bit fields. - * symbols.c (symbol_new): Don't initialize sy_forward field. - (resolve_symbol_value): New function to adjust symbol value by - fragment address, using recursion to resolve forward symbols. - * symbols.h: Added prototype for new function. - * read.c (pseudo_set): Set symbolP->sy_value to an undefined - expression rather than setting symbolP->sy_forward. - * write.c (write_object_file): Use resolve_symbol_value on - symbols, keeping the common case (the old behaviour) inline. - * config/obj-aout.c (obj_aout_frob_symbol): Removed sy_forward - handling (subsumed by write.c change). - * config/obj-coff.c, config/obj-coffbfd.c (obj_coff_val): Set - sy_value rather than sy_forward. - * config/obj-coffbfd.c (obj_coff_endef, yank_symbols): Check - expression segment rather than sy_forward. - (yank_symbols): Use resolve_symbol_value. - (crawl_symbols): Removed extra pass over symbols. - * config/obj-aout.c, config/obj-bout.c, config/obj-coff.c, - config/obj-vms.c (obj_crawl_symbol_chain): Removed extra pass over - symbols which handled sy_forward; use resolve_symbol_value - instead. - * config/obj-coff.h, config/obj-coffbfd.h (obj_frob_forward_symbol): - Define. - * config/obj-elf.c (obj_elf_stab_generic): Check expression - segment rather than sy_forward. - * config/obj-vms.c (VMS_Check_For_Main): Don't initialize - sy_forward; do initialize sy_resolved and sy_resolving. - * config/tc-hppa.h (STAB_FIXUP): Use sy_value, not sy_forward. - - * Changes to keep a full expression as the value of a symbol, not - just a longword: - * struc-symbol.h: New field sy_value. - * as.h: Include expr.h before struc-symbol.h. - * expr.h: Use struct symbol rather than symbolS. - * symbols.c (S_GET_VALUE, S_SET_VALUE): Rewrote to retrieve value - of sy_value field; compile unconditionally, not just if - BFD_ASSEMBLER. - * symbols.h: Compile S_{SG}ET_VALUE prototypes unconditionally. - * write.c (write_object_file): Set BFD symbol value to gas symbol - value. - * config/obj-aout.h, config/obj-bout.h, config/obj-coff.h, - config/obj-coffbfd.h, config/obj-generic.h, config/obj-vms.h - (S_GET_VALUE, S_SET_VALUE): Removed macro definitions. - * config/obj-ieee.c (S_GET_VALUE, S_SET_VALUE): Removed. - * config/obj-coff.h, obj-coffbfd.h: Rewrote several macros to use - S_GET_VALUE rather than ost_entry.n_value. - * config/obj-aout.c (obj_symbol_to_chars), config/obj-bout.c - (obj_symbol_to_chars), config/obj-coff.c (obj_symbol_to_chars), - config/obj-coffbfd.c (symbol_to_chars): Get value to write out - using S_GET_VALUE--don't assume it is already set. - * config/obj-ieee.c (do_symbols): Set BFD symbol value to gas - symbol value. - * config/obj-vms.c (various): Don't assign directly to - S_GET_VALUE; use S_SET_VALUE instead. - -Wed Jul 14 09:35:23 1993 Doug Evans (dje@canuck.cygnus.com) - - * configure.in: Make sparc64-*-aout* use bfd gas. - - * configure.in: Recognize h8300h. - -Tue Jul 13 12:09:44 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * config/tc-h8500.c (line_comment_chars): Add hash. - (parse_exp, skip_colonthing, build_bytes): Add support for - R_H8500_HIGH16 relocation type. - -Mon Jul 12 11:15:34 1993 Ken Raeburn (raeburn@deneb.cygnus.com) - - * config/obj-elf.c (obj_elf_section): Allow `@' to introduce an - attribute name. Handle `execinstr' attribute. - -Mon Jul 12 07:22:28 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-mips.c (mips_ip): Don't warn on 'i' or 'j' mismatch if - there is another alternative for the instruction. - -Fri Jul 9 17:31:34 1993 Roland H. Pesch (pesch@fowanton.cygnus.com) - - * doc/as.texinfo: updates for H8/300H - -Thu Jul 8 14:41:43 1993 Mark Eichin (eichin@cygnus.com) - - * config/tc-i960.c (md_create_short_jump, md_create_long_jump, - md_number_to_chars, md_section_align): Adjusted to use valueT, - addressT, to match tc.h. - -Thu Jul 8 14:15:05 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.c (s_common): Revamp to handle both syntaxes, - independent of format. - -Thu Jul 8 07:25:25 1993 Doug Evans (dje@canuck.cygnus.com) - - * config/tc-h8300.h (TC_CONS_RELOC): Use R_RELLONG if h8/300h. - -Wed Jul 7 18:11:07 1993 david d `zoo' zuhn (zoo at rtl.cygnus.com) - - * configure.in: define CROSS=-DCROSS_COMPILE if it is a cross - build; also recognize h8300-*-coff - -Wed Jul 7 10:21:24 1993 Ian Lance Taylor (ian@cygnus.com) - - * symbols.c (fb_label_instance, fb_label_instance_inc): Don't dump - core just because somebody uses a label before it is defined. - - * config/mips-opcode.h: Moved to opcode/mips.h. - * config/tc-mips.c: Include opcode/mips.h rather than - mips-opcode.h. - (append_insn): An extra NOP is only needed after instructions - which set HI or LO, not after instructions which read it. - (macro_build, mips_ip): Support new 'E', 'G' and 'B' arguments. - (macro): cfc1 and ctc1 now take "t,G" rather than "t,d". - * config/tc-mips.h (struct mips_opcode): Don't define. - * config/mips-big.mt, config/mips-lit.mt (TARG_CPU_DEPENDENTS): - Set to $(srcdir)/../include/opcode/mips.h. - - Get the MIPS assembler up to speed with other gas changes: - - * config/obj-ecoff.c (ecoff_set_vma, ecoff_frob_symbol): - Removed; don't change the symbol value. - (ecoff_build_symbols, ecoff_build_procs, ecoff_frob_file): Use - bfd_asymbol_value rather than S_GET_VALUE to include section - vma in symbol value. - (ecoff_frob_file): Ignore BSF_SECTION_SYM symbols, since ECOFF - doesn't output them. Set the vma of sections. - * config/obj-ecoff.h: Don't define obj_frob_symbol. - * config/tc-mips.c (tc_gen_reloc): Adjustment by section vma is no - longer necessary. - (various): use valueT rather than long. - -Wed Jul 7 08:33:30 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.h (ENV64): Define for v9. - - * config/tc-sparc.c (s_xword): For numbers, call big_cons. - (sparc_ip, md_apply_fix, tc_gen_reloc): Handle some sparc64 - relocation types. - (md_number_to_chars): Handle 8-byte value. - - * config/obj-elf.h (elf_symbol): For v9, use 64-bit symbol type. - - * as.h (valueT): Typedef moved here. - * struc-symbol.h (valueT): ...from here. - * write.c (write_object_file): Locals from_addr, to_addr, - table_addr are now addressT. Supply prototype for bfd_alloc for - now. - (fixup_segment): Local add_number is now valueT. Correct some - range-checking bugs. - (relax_align): Type `int' should be sufficient for the exponent. - (fix_new): Argument offset is type offsetT. Locals size and - newsize are type valueT. - * write.h (struct fix): Fields fx_offset and fx_addnumber are now - type valueT. - (fix_new): Fix prototype. - * symbols.c (symbol_new): Symbol value is type valueT. - (S_SET_VALUE, S_GET_VALUE): Likewise. - (S_IS_*): Specify int return type explicitly. - * symbols.h (symbol_new, S_GET_VALUE, S_SET_VALUE): Fixed - prototypes. - * read.c (s_comm): Values read are type valueT. - * expr.h (expressionS): Field X_add_number is an offsetT. - * tc.h (md_create_long_jump, md_create_short_jump, - md_section_align): Addresses are now type addressT. - (md_number_to_chars, md_apply_fix): Pass value as valueT. - * config/tc-i386.c (md_create_short_jump, md_create_long_jump, - md_number_to_chars, md_section_align): Adjusted. - * config/tc-sparc.c (sparc_ip): Initialize `len' variable to make - gcc shut up. - (md_create_short_jump, md_create_long_jump, md_number_to_chars, - md_section_align): Adjusted. - - * config/tc-sparc.c (s_reserve): Permit use for other than a.out - format. - (s_common): Handle Solaris-2 version. - - * config/ho-generic.h (free): Returns void if __STDC__. - - * config/obj-elf.h (obj_elf_frob_symbol, elf_frob_file, - elf_file_symbol): Declare. - - * expr.c (floating_constant, integer_constant): Now return void. - -Thu Jul 1 12:13:43 1993 Ian Lance Taylor (ian@cygnus.com) - - * configure.in: Match on sparc*-fujitsu-none rather than - sparclite*-fujitsu-none. - -Wed Jun 30 11:12:02 1993 Ian Lance Taylor (ian@cygnus.com) - - * read.c (cons): Conditionalize parsing of expression. Move - putting value into object file into separate function. Separate - out MRI and WANT_BITFIELDS cases into separate functions. - (emit_expr): New function to write data into object file. - Conditionalize on TC_CONS_FIX_NEW and TC_CONS_RELOC rather than on - processor types. - (parse_bitfield_cons): New function to parse bitfield expressions - as used by i960 assemblers. Only compiled if - BITFIELD_CONS_EXPRESSIONS is defined. - (parse_mri_cons): New function to parse MRI style strings. Only - compiled if MRI is defined. - (parse_repeat_cons): New function to parse repeat counts. Only - compiled if REPEAT_CONS_EXPRESSIONS is defined. - * read.h (emit_expr): Added declaration of new function. - * config/tc-a29k.h (TC_CONS_RELOC): Define to be RELOC_32. - * config/tc-h8300.h (TC_CONS_RELOC): Define to be R_RELWORD. - * config/tc-hppa.c (parse_cons_expression_hppa): New function to - parse a HPPA expression, rather than special case in cons - function. - (cons_fix_new_hppa): New function to emit an HPPA fixup, rather - than special case in emit_expr function. - * config/tc-hppa.h (TC_PARSE_CONS_EXPRESSION, TC_CONS_FIX_NEW): - Define to use new functions from tc-hppa.c. - * config/tc-i960.h (BITFIELD_CONS_EXPRESSIONS): Define. - (WANT_BITFIELDS): Removed; now obsolete. - * config/tc-mips.h (REPEAT_CONS_EXPRESSIONS): Define. - * config/tc-ns32k.c (cons_fix_new_ns32k): New function to emit an - NS32K fixup, rather than special case in emit_expr function. - * config/tc-ns32k.h (TC_CONS_FIX_NEW): Define to be - cons_fix_new_ns32k. Also use PARAMS rather than checking - __STDC__. - * config/tc-sparc.h (TC_CONS_RELOC): Define to RELOC_32. - - * write.c (relax_and_size_seg, adjust_reloc_syms, write_contents): - Don't core dump if gas has no information about a section. - -Wed Jun 30 06:21:27 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.c (md_begin): If sparcv9 is defined, reset - current_architecture to v9 automatically. - - * config/tc-sparc.h (TARGET_FORMAT): Use elf64-sparc for v9. - - * config/tc-sparc64.h, config/tc-sparc64.c: New files. - * configure.in: Use sparc64 cpu files for v9, and default to elf - format. - - * write.c (relax_and_size_seg): Always fully process a section. - Section size is last frag's (vm)address plus its size. If no - relocations are present, force SEC_RELOC flag clear. - (dump_section_relocs): New debugging routine. - (adjust_reloc_syms): New routine, broken out from write_contents. - Don't adjust relocs that are already relative to section symbol. - Look for obj_fix_adjustable macro to know what else to skip, - instead of obj_write_symbol. Look for section symbol stored in - section information. - (write_object_file): Map adjust_reloc_syms over all sections. - (write_contents): Clear SEC_RELOC flag if no relocations are - found. - - * as.h (__PTR_TO_INT, __INT_TO_PTR): New versions for Saber, to - keep it quiet. - - * write.c (remove_subsegs): Don't define for BFD_ASSEMBLER. - -Fri Jun 25 14:42:53 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * Makefile.in (all, dvi, info, install-info, clean-info): do not - echo recursion lines. - (install-info, clean-info): collapse into the dvi and info rule. - -Fri Jun 25 10:47:24 1993 Doug Evans (dje@canuck.cygnus.com) - - * config/tc-sparc.c (sparc_ip): Remove support for %d/%q fp regs. - All fp regs are now specified as %f. - (priv_reg_table): fpq -> fq. - -Fri Jun 25 03:43:06 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) - - * as.h (strstr): Disable declaration for now. - (fprint_value, sprint_value): Declare. - - * subsegs.c (subseg_new_rest): Use memset to clear new frag. - (subseg_new) [BFD_ASSEMBLER]: Initialize all seginfo fields. - - * expr.c (expr_part): Made sanity checks a.out-specific. - (expr): Disabled sanity checks. - - * subsegs.h (segment_info_type) [BFD_ASSEMBLER]: Add field for - section symbol. - * subsegs.c (subseg_change): Initialize section symbol pointer - when setting up a new section. - - * symbols.c (symbol_new) [BFD_ASSEMBLER]: Point BFD symbol's udata - field back at gas symbol structure. - - * symbols.c (colon): Cast obstack_next_free value to char* before - doing arithmetic on it. - * subsegs.c (subseg_new_rest): Likewise. - * as.h (frag_now_fix): Likewise. - - * config/obj-elf.c (elf_file_symbol): Use subseg_new instead of - calling bfd_make_section_old_way directly, and call subseg_set - instead of subseg_change. Now returns void. - (obj_elf_write_symbol): Only check local symbols for now. - (elf_stab_symbol): Now static and void, and disabled until it - works completely. - (obj_elf_size): For expression values, fail silently for now. - (obj_symbol_new_hook): Do nothing. - - * config/tc-sparc.c (tc_gen_reloc): Handle BFD_RELOC_SPARC_WDISP22 - relocation. - (s_local) [OBJ_ELF]: New function. - (md_pseudo_table) [OBJ_ELF]: Call it for "local". - (s_common): Rearrange to handle Solaris .common pseudo, which may - sometimes use bss space instead of common. - * config/obj-elf.h (TARGET_SYMBOL_FIELDS): Add new `local' field. - -Thu Jun 24 16:33:53 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: set host config to hpux for hppa*-hp-hpux - -Thu Jun 24 13:35:06 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) - - * app.c (app_pop, app_push): Fix bug reported by Chris Arthur. - -Tue Jun 22 01:04:23 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) - - * subsegs.c (subseg_new): Don't special-case a.out -R flag here. - * config/obj-aout.c (s_sect): Do it here. - - * as.h (BAD_CASE): Don't make some lame compilers think we want - substitution inside strings. - - * as.c (print_version_id): New function, split off from main. - (main): Call it. - * config/tc-sparc.c (md_parse_option) [OBJ_ELF]: Print version id - for -V. Ignore -Q and -s options for now. - -Mon Jun 21 17:37:59 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: make installation & builds work again for crosses - -Sun Jun 20 18:18:26 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) - - * listing.c (list_symbol_table): Rewrite to print wide (>32 bits) - symbol values correctly. - - * write.c (write_object_file): Deleted unused variables. - (fixup_segment): Use sprint_value. - - * messages.c (sprint_value, fprint_value): New routines. - - * config/obj-elf.c (elf_stab_symbol): Now returns void. - (obj_elf_stab_generic): Fix typo in logic. - - * Makefile.in (INCLUDES): Look in ../bfd for bfd.h. - - * as.h (addressT, offsetT): New types, using BFD types if - available. - (relax_addressT, struct frag): Use them. - * struc-symbol.h (valueT, struct broken_word): Likewise. - - * as.h (subseg_new) [BFD_ASSEMBLER]: Name argument is const. - * subsegs.c (subseg_new) [BFD_ASSEMBLER]: Name argument is const. - -Thu Jun 17 16:53:56 1993 david d `zoo' zuhn (zoo@cygnus.com) - - * Makefile.in: canonicalize install.sh; for use within - this directory (and subdirs) - -Sun Jun 20 02:34:04 1993 Ashley Saulsbury (ans@sics.se) - - * m88k-opcode.h : fixed tiny tiny mistake - xcr was incorrectly - specified, should have both S1 and S2 fields identical - If only finding the problem was as fast as fixing the bug !!!! - -Tue Jun 15 16:01:57 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * write.c (write_contents): Do write out non-loadable sections. - Debug sections can fall in this category. - - * read.c (s_app_file): Call elf_file_symbol for ELF files. - * config/obj-elf.c (elf_file_symbol): New function. - - * config/obj-elf.c (elf_stab_symbol_string): Renamed from pa_..., - added argument to specify section base name. - (obj_elf_stab_generic): Renamed from ..._stab. New argument - specifies section base name. - (obj_elf_stab): New function, calls obj_elf_stab_generic with - ".stab" as section base name. - (obj_elf_xstab): New function, calls obj_elf_stab_generic. - (obj_elf_type): Handle "object". Use bitwise-or to merge in - symbol flags rather than simply replacing, so global/local flags - are preserved. - (obj_elf_ident): Rewrite. - -Tue Jun 15 17:03:25 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: remove parentdir support; use INSTALL_XFORM - -Wed Jun 9 11:26:07 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-i386.c (md_pseudo_table): .align uses a power of two - for any a.out target, not just Linux and 386BSD. - * config/tc-i386.h (DOT_LABEL_PREFIX): Do not define for any a.out - target. - -Mon Jun 7 13:33:19 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-m88k.c: Don't include flonum.h, md.h, m88k.h. They - don't exist or duplicate other inclusions. - - * config/tc-vax.h (NO_RELOC): Define. - -Mon Jun 7 09:55:03 1993 Doug Evans (dje@canuck.cygnus.com) - - * config/tc-sparc.c (sparc_ip): Fix parsing of asi number. - Fix error message. - -Sat Jun 5 19:32:52 1993 Torbjorn Granlund (tege@nada.kth.se) - - * gas/config/m88k-opcode.h (m88k_opcodes): Add 88110 instructions. - * gas/config/tc-m88k.c (get_reg): New arg reg_prefix. Compare first - char to reg_prefix instead of to 'r'. - (calcop): Change calls to get_reg. - (calcop): Handle new case 'x' to set reg_prefix. - (calcop): Set reg_prefix to 'r' after each call to get_reg. - (cmpslot): Add 88110 conditions. - - * gas/config/m88k-opcode.h: Swap cases for "rot" for consistency. - - * gas/config/tc-m88k.c (get_bf): Always restore input_line_pointer - before returning. - - * gas/config/m88k-opcode.h (m88k_opcodes): Make equal mnemonics - adjacent; mov.s and mov.d swapped. - (m88k_opcodes): Fix typo `r2' -> `2'. - -Fri Jun 4 15:59:31 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * config/h8300.c: Support for H8/300-H opcodes. - - * config/obj-coffbfd.c (w_strings): String table length is 4 - bytes, no matter what the host int size is. - - * configure.in (alpha-*-osf*): New. - -Fri Jun 4 07:51:18 1993 Ian Lance Taylor (ian@cygnus.com) - - * configure.in (mips-*-ecoffl*): New target; use ecoff and - mips-lit. - (mips-*-ecoff*): Added trailing '*'. - - * config/obj-ecoff.c (ecoff_build_procs): Force the adr of the - first FDR in a file to be zero. - -Thu Jun 3 14:09:59 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (VERSION): Jump to 2.1.4. - - * config/ho-hppabsd.h: New file, from Peter Hoogenboom. - - * config/tc-mips.c (md_assemble): Call bfd_set_gp_size only for - ECOFF format. - -Tue Jun 1 15:21:57 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-m68k.c (md_assemble): The 68040 cpu doesn't want a - separate '851 mmu. - - * config/obj-elf.c, config/obj-elf.h: Update for new type, macro, - and routine names. Assuming 32 bits for now. - - * config/obj-elf.c (elf_frob_file): Look for macro - elf_tc_final_processing_hook, instead of assuming a function - always exists. - * config/tc-hppa.c (elf_hppa_final_processing_hook): Renamed from - tc_final_processing_hook. - * config/tc-hppa.h (elf_tc_final_processing_hook): Use it. - - * config/tc-hppa.h (elf_tc_symbol, elf_tc_make_sections): Macros - moved here from obj-elf.h. - * config/obj-elf.h: Don't include CPU-specific header files. - -Sun May 30 16:49:37 1993 Peter Hoogenboom (hoogen@fast.cs.utah.edu) - - * configure.in: configurations should match on 'hppa*' not 'hppa'. - - * read.c: Add support for HPPA assembly language syntax (denoted - with '#ifdef TC_HPPA'). - - * symbols.c: Add support for HPPA assembly language syntax (denoted - with '#ifdef TC_HPPA'). - - * write.c (write_contents): Add support for HPPA-style - relocations. - - * config/obj-elf.c: Stab symbols weren't written properly. - (obj_elf_version): - (obj_elf_desc): - (obj_elf_write_symbol): - (obj_elf_write_symbol_p): - (obj_elf_frob_symbol): - (elf_stab_symbol): - (elf_frob_file): - - * config/tc-hppa.c: Support for HPPA symbol extension sections. - Remove some unused code. Support for HPPA assembly language - syntax. - - * app.c: - - * symbols.c: - - * config/obj-elf.h: - (obj_write_symbol): - (obj_frob_file): - (elf_tc_symbol): - (elf_tc_make_sections): - - * config/tc-hppa.h: - -Sun May 30 21:44:45 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * config/obj-ecoff.c (obj_read_begin_hook, add_file): Assume - hash_new will have succeeded if it returns. - * config/tc-a29k.c (md_begin): Likewise. - - * config/tc-i386.c (tc_aout_fix_to_chars): Now nbytes_r_length is - const. - (mode_from_disp_size, opcode_suffic_to_type): Now inline under - gcc. - (fits_in_{signed,unsigned}_{byte,word}): Likewise. - - * expr.c: Delete register declarations; gcc ignores them anyways. - -Fri May 28 19:03:32 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * hash.c (hash_new): Use xmalloc, since many callers don't check - for failure. - -Thu May 27 13:02:15 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * frags.c (zero_address_frag, bss_address_frag): These are - external. - - * tc.h (md_reloc_size): This is const. - * config/tc-{a29k,h8300,h8500,i386,i860,i960,m68k,ns32k,z8k}.c - (md_reloc_size): Now const. - - * config/aout_gnu.h (enum machine_type, enum reloc_type): Delete - trailing commas. - * as.h (enum _segT): Ditto. - - * struc-symbol.h (N_TYPE_seg): This should be const. - -Thu May 27 11:43:59 1993 Michael Meissner (meissner@osf.org) - - * config/obj-ecoff.c (add_file): Cast file_name to char * in - listing_source_file call. - - * config/obj-elf.c (elf_stab_symbol_string): Cast first argument - of subseg_new call to eliminate const attribute. - (obj_elf_stab): Ditto. - (obj_symbol_new_hook): Cast first argument of bzero call to char *. - - * read.c (s_align_bytes): Properly record alignment. - - * expr.c (__): Undefine __ macro before use, since OSF/1 uses it - for the prototype/no prototype macro. - - * as.c (got_sig): Don't do return ((SIGTY) 0), SIGTY might well be - void. - - * as.h (relax_stateT enum): Delete trailing comma. - -Thu May 27 11:07:50 1993 Ian Lance Taylor (ian@cygnus.com) - - * app.c (do_scrub_begin): Let line_comment_chars override - comment_chars. - (do_scrub_next_char): If a line comment character is not at the - start of a line, treat it as a comment character if it is one. - For a CPP line comment use pseudo-op .appline rather than .line. - * input-scrub.c (logical_input_line): Make int rather than - unsigned. - (input_scrub_push, input_scrub_begin): Initialize - logical_input_line to -1 rather than 0. - (bump_line_counters): Increment logical_input_line. - (new_logical_line): If line_number is -2, decrement - logical_input_line. - (as_where): Use logical_input_line even if it is 0. - * read.h (s_app_file prototype): Now takes an int argument. - * read.c (potable): Make .appfile call s_app_file with 1. New - .appline pseudo-op calls s_app_line. - (s_app_file): If .appfile, call new_logical_line with -2 to - account for newline inserted by do_scrub_next_char. If listing, - call listing_source_file. - (s_app_line): New function to handle fake pseudo-op .appline. - * config/obj-coff.c (obj_pseudo_table): Make .appline call - obj_coff_ln. - (obj_coff_ln): Added argument to indicate whether .appline. - * config/obj-coffbfd.c (obj_pseudo_table): Make .appline call - obj_coff_ln. - (obj_coff_ln): Added argument to indicate whether .appline. - * config/tc-mips.c (s_file): Pass argument to s_app_file. - -Tue May 25 11:59:07 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/obj-bout.h (S_GET_VALUE): Removed unnecessary cast. - -Thu May 20 19:14:24 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-m68k.c (md_apply_fix_2): Straighten out check for - invalid values. - -Wed May 19 07:33:17 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * config/tc-h5000.c (build_bytes): Understand @rd mode and build - relocations correctly. - -Mon May 17 15:06:26 1993 Ken Raeburn (raeburn@deneb.cygnus.com) - - * Makefile.in (FLAGS_TO_PASS): Leave out TEXI2DVI for now, because - it's wrong. - - * config/tc-m68k.c (md_apply_fix_2): Apply range checks and warn - if value is out of range. - - Patch from Minh Tran-Le: - * config/tc-i386.c (i386_operand): For in/out port register used - as base reg, include InOutPortReg in operand type. - (MATCH): Accept overlap value of InOutPortReg. - -Mon May 17 09:29:34 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/obj-ecoff.c (add_file, obj_ecoff_loc, obj_ecoff_stab): - Add calls to listing routines to produce combined source/assembler - listings. - (obj_ecoff_stab): Create a file pointer if none used yet. - (ecoff_frob_file): Set symcount to correct value. - -Fri May 14 06:53:33 1993 Ken Raeburn (raeburn@deneb.cygnus.com) - - * Makefile.in (VERSION): Bump to version 2.1, in preparation for - release. - - * config/obj-aout.h (H_GET_HEADER_SIZE, H_SET_SYMBOL_TABLE_SIZE): - Define in terms of constants, not C structure sizes. - - * config/tc-rs6000.c, config/tc-rs6000.h: Delete empty files. - -Thu May 13 17:01:55 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-aout.c (obj_header_append): Don't define if it's - defined as a macro. - * config/obj-hp300.h (obj_header_append): Define it as a macro. - * config/obj-hp300.c (hp300_header_append): New function. - - * Makefile.in (distclean): Don't bother cleaning up doc files; - they aren't going to be in this directory. - -Thu May 13 07:51:35 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/obj-ecoff.c (ecoff_build_symbols): Handle absolute - symbols. - - * tc.h (TC_COFF_SIZEMACHDEP): Don't define here. - * config/tc-sh.h (TC_COFF_SIZEMACHDEP): Define here instead. - -Mon May 10 06:01:12 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * config/obj-vms.c (VMS_Symbol_type_list): Don't bother with - initialization. - - * configure.in (targets): Treat m68*-*-sysv* like m68k-*-coff. - -Wed May 5 14:00:49 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-mips.c (macro): Correct floating point double word - loads and stores for big endian target. - -Wed May 5 08:39:21 1993 Ken Raeburn (raeburn@deneb.cygnus.com) - - * config/tc-i386.c: Replace SEG_* with *_section, fix up subseg_* - calls. Deleted some unused code. - * config/obj-coff.c: Likewise. - - ELF support, mostly contributed by Utah: - * config/obj-elf.c (obj_elf_section, obj_elf_stab, obj_elf_line, - obj_elf_type): Rewrite. - (obj_elf_frob_symbol, elf_stab_symbol_string, elf_stab_symbol, - obj_elf_desc, obj_elf_version, obj_symbol_new_hook, obj_elf_size): - New functions. - (obj_elf_ident): Dummy. - * config/obj-elf.h (FALSE, TRUE, S_*, tc_frob_symbol, - TARGET_SYMBOL_FIELDS): New macros. - (gdb_section): New variable decl. - - * config/tc-i386.c (md_atof): Return zero, not empty string, on - success. - - BFD_ASSEMBLER conditional changes: - * config/obj-coff.c (lineno_rootP, seg_N_TYPE, *_section_header): - Don't define these. - (SA_SET_SYM_ENDNDX, SA_SET_SYM_TAGNDX): New functions. - (fetch_coff_debug_section): Ditto. - (obj_coff_endef): Call fetch_coff_debug_section. - (struct line_no): New type. - (c_symbol_merge): New way for copying aux fields. - (c_dot_file_symbol): Put symbol in absolute section, and set flag - BSF_DEBUGGING. - (function_lineoff): New symbol. - (function_lineoff, text_lineno_number, our_lineno_number, - lineno_lastP): Don't define. - (c_line_new): Don't define. - (obj_emit_lineno, obj_coff_endef): Use abort calls as, uh, - placeholders, until - line-number recording gets implemented. - (obj_new_symbol_hook): New code for handling aux fields. - (add_lineno, add_linesym): New functions. - (obj_coff_ln): Call add_lineno, not c_line_new. - (obj_coff_endef): New code for handling symbol names. New lineno - code. Look for section name "*DEBUG*" for debugging section. - (align, coff_check_file_symbols, obj_coff_section, - coff_frob_file): New functions. - * config/obj-coff.h: Reordered some includes. - (BYTE_ORDERING, FILE_HEADER_MAGIC, seg_N_TYPE, N_TYPE_seg, - DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE, AOUTHDR, AOUTHDRSIZE): Don't - define these. - (TARGET_SYMBOL_FIELDS, I960_SYM_FIELDS): New macros. - (SYM_AUXENT): New macro (for non-BFD_ASSEMBLER too) for accessing - aux entries. Most SA_* macros now use it unconditionally. - (S_*): Use `bsym' field, and access BFD private data. - (SF_*): Use `sy_flags' symbol field for most of these. - (H_*, object_headers, lineno, lineno_*P, OBJ_EMIT_LINENO): Don't - define. - (*_section_header): Don't define. - * config/tc-i386.c (md_convert_frag, md_apply_fix): Changed - interface. - (tc_gen_reloc) [I386COFF]: New function. - (tc_aout_fix_to_chars, tc_coff_fix2rtype): Don't define. - * config/tc-i386.h (TARGET_ARCH, TARGET_BYTES_BIG_ENDIAN): New - macros. - - * config/obj-coff.c (stack_init): Don't do assignments inside - conditions. - (obj_coff_def): Simplified handling of symbol name a bit. - (tag_insert): Name argument is now pointer to CONST. - (obj_crawl_symbol_chain): Commented out. - - * config/obj-coff.h: Use PARAMS macro in prototypes. - - * write.c (relax_and_size_seg) [BFD_ASSEMBLER]: Don't indirect - through frchainP pointer if it is null. - - * configure.in: Warn if BFD mode is explicitly turned off but is - required by specified target. - (mips ecoff targets): Don't need to set bfd_gas here; it gets - taken care of later. - - * config/obj-coffbfd.c (crawl_symbols): Don't clear sy_forward - field. - (yank_symbols): Merge symbols only if sy_forward is null. - - * config/tc-m68k.h (AOUT_MACHTYPE): Don't define if already - defined. - - * tc.h (md_convert_frag) [BFD_ASSEMBLER]: Section arg is not - pointer. - * config/tc-m68k.c (md_convert_frag) [BFD_ASSEMBLER]: Ditto. - - * config/tc-sparc.h (LOCAL_LABEL) [OBJ_ELF]: Anything starting - with "." is a local label. - - * config/te-hppa.h, config/tc-hppa.h, config/tc-hppa.c: New config - files. - - * config/te-linux.h, config/te-386bsd.h: New config files. - * configure.in (i386-*-linux, i386-*-bsd): Use them. - * config/tc-i386.h (TARGET_FORMAT): Select format based on target - environment. - (DOT_LABEL_PREFIX): Don't define for 386bsd or Linux. - -Wed May 5 13:14:01 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/obj-ecoff.c (init_file): Set fMerge to 0 since dbx seems - to want it that way. - (ecoff_build_symbols): Turn local st_Proc symbols into - st_StaticProc symbols. Set index field of external st_Proc and - st_staticProc symbols correctly. - * config/tc-mips.h (NO_LISTING): Don't define. People might want - listings. - -Tue May 4 21:22:54 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-hp300.h, config/obj-hp300.c, config/te-hp300.h: New - files. - * configure.in (m68k-*-hpux): Use them. - - * config/obj-aout.c (obj_pre_write_hook): Use AOUT_VERSION if - defined, otherwise zero. - - * config/aout_gnu.h (OMAGIC): Don't define if already defined. - -Mon May 3 15:59:32 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * config/tc-sparc.c (sparc_ip): Allow any abs expression as an - address space number. - -Wed Apr 28 19:11:22 1993 Ken Raeburn (raeburn@deneb.cygnus.com) - - * config/obj-aout.h (TARGET_DEFAULT): Don't default this at all. - - * config/tc-a29k.c: Include ctype.h. - (define_some_regs): Added special-purpose registers for 29050. - - * config/tc-i386.c (comment_chars) [TE_I386AIX]: Include "/". - - * config/obj-coffbfd.c (fill_section): Don't set STYP_REG here. - (change_to_section): Set it here instead. - -Wed Apr 28 13:40:29 1993 Ian Lance Taylor (ian@rtl.cygnus.com) - - * config/obj-ecoff.c (obj_symbol_new_hook): Make up a .file if one - hasn't been seen yet. - (add_ecoff_symbol): Don't refer to cur_file_ptr if it is NULL. - -Mon Apr 26 18:29:05 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * config/tc-sh.ch, config/tc-sh.h: New files supporting Hitachi - SH. - -Mon Apr 26 12:28:27 1993 Ian Lance Taylor (ian@cygnus.com) - - * expr.c (operand): Fix unary plus operator (previously was the - same as '~' operator!). - -Wed Apr 21 00:20:11 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * write.c (cvt_frag_to_fill): Define even if BFD is defined. - (write_object_file): Do define if BFD_ASSEMBLER. Invoke - obj_check_file_symbols if defined. Call verify_symbol_chain_2 - instead of open-coding it. Fix some bugs in patching up symbol - chain. - (relax_segment): Make some code we "ought to be able to" use for - all targets no longer conditionalized on ns32k target; instead, do - it always, and if the appropriate conditions fail, abort. - - * symbols.c (DEBUG): Enabled. - (symbol_new): Make sure bfd_make_empty_symbol works. - (verify_symbol_chain_2): New function; takes one symbol as - argument, anywhere in the chain. - (dollar_label*): Use default initializers. - - * as.c (perform_an_assembly_pass): Call md_begin here... - (main): ...and not here. - - * config/tc-m68k.h (TARGET_FORMAT): Use a.out-sunos-big for a.out. - (tc_frob_symbol): New macro: Get rid of symbols in reg_section. - - * config/tc-m68k.c (omagic): Don't define for BFD_ASSEMBLER. - (add_fix, add_frag): Now functions instead of macros. - (m68k_reg_parse, m68k_ip, md_estimate_size_before_relax, get_num, - s_data1, s_data2, s_bss): Use new *_section names, for - compatibility with BFD_ASSEMBLER mode; rewrite switch statements - to handle non-integral segT. - (tc_coff_fix2rtype, tc_aout_fix_to_chars, - tc_coff_symbol_emit_hook): Don't define for BFD_ASSEMBLER. - (tc_gen_reloc): New routine for BFD_ASSEMBLER. - (md_apply_fix, md_apply_fix_2): Renamed old md_apply_fix to - md_apply_fix_2; new md_apply_fix definition varies interface - depending on BFD_ASSEMBLER. - (md_convert_frag, md_convert_frag_1): Likewise. Use new *_section - names. - - * config/obj-vms.c: Include config.h. - (version_string): Delete declaration. - (Write_VMS_MHD_Records): Use GAS_VERSION instead. - (vms_resolve_symbol_redef): New function, taken from VMS code in - symbols.c. - (_doprnt): Deleted. - (VMS_Store_Struct, VMS_Def_Struct, VMS_Set_Struct, - VMS_TBT_Block_End, get_VMS_time_on_unix, generate_suffix, - VMS_Psect_Spec): Fixed to compile under traditional C. - * config/obj-vms.h: Use PARAMS macro. - (vms_resolve_symbol_redef): Declare. - (RESOLVE_SYMBOL_REDEFINITION): New macro. - * symbols.c (colon): Remove some VMS-specific code, look for - RESOLVE_SYMBOL_REDEFINITION macro instead. - - * config/tc-m68k.c (m68k_ip): Don't try expanding DBcc - instructions. - - * config/tc-i386.c: Reordered some functions so inlining might - work. Use PARAMS in function declarations. - (reloc): New routine. - (md_assemble): Rearrange switch statements to work with - non-integral segT. - - * struc-symbol.h [BFD_ASSEMBLER]: Undefine - SYMBOLS_NEED_BACKPOINTERS before defining it. - - * subsegs.c (subseg_new_rest): Now static. - - * read.c (pseudo_set): Better error message for difference of - symbols in different frags. - - * Makefile.in (check): Pass down some new variables, indicating - pathname or program name for cc, nm, objdump. - - * as.h (OUTPUT_FLAVOR): New macro. - * config/tc-sparc.c (tc_gen_reloc): Use OUTPUT_FLAVOR. - - * configure.in: Initialize bfd_gas properly. Warn that ELF - support is incomplete. - -Thu Apr 15 22:39:05 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * read.c (float_cons): Accept null pointer return from md_atof. - * config/tc-m68k.c (md_atof): Return null for success. - * config/tc-sparc.c (md_atof): Ditto. - -Thu Apr 15 16:04:39 1993 Roland H. Pesch (pesch@fowanton.cygnus.com) - - * doc/as.texinfo: formatting and comment cleanups; show SPARC - alternative options in same style as other machines; simplify some - conditional use; include GPL as separate file (from texinfo dir) - - * doc/Makefile.in: (as.info) include directory containing GPL in - makeinfo search path - - * doc/h8.texi: new file; conditional settings for GAS manual - on Hitachi chips - -Tue Apr 13 15:31:40 1993 Roland H. Pesch (pesch@fowanton.cygnus.com) - - * doc/as.texinfo: mention SPARC architecture options. - -Fri Apr 9 17:43:11 1993 Ken Raeburn (raeburn@cygnus.com) - - * configure.in: Rearranged whitespace in per-host/per-target - sections. Added hooks for dropping in HPPA support (not included - yet). Separate out overrides of variables based on target format - and bfd-gas selection from actual target-specific commands. Add - error message for recognized but unsupported format name. - -Fri Apr 9 09:05:47 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/obj-ecoff.h (ecoff_build_lineno): Make ilineMax in - symbolic header match cline in FDR; the native linker seems to - want that. - -Thu Apr 8 15:51:28 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * doc/Makefile.in: as.texinfo is in $(srcdir). Use - $(srcdir)/as.texinfo explicitly in several places - -Thu Apr 8 15:15:02 1993 Roland H. Pesch (pesch@fowanton.cygnus.com) - - * doc/Makefile.in: update dvi, clean targets for new source - file structure - -Thu Apr 8 12:52:46 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/ho-decstatn.h: Define BROKEN_ASSERT if not __GNUC__, - rather than undefining know. - * configure.in: Match ultrix*, not just ultrix. - -Wed Apr 7 20:18:10 1993 Roland H. Pesch (pesch@fowanton.cygnus.com) - - * doc/as.texinfo: converted conditional markup to use new - Texinfo facilities, avoiding m4. - - * doc/as-all.texinfo, all.m4, pretex.m4: deleted. - - * doc/Makefile.in: recast doc configuration to use a link to an - included texinfo file. - - * doc/all.texi: settings for generic form of documentation. - -Tue Apr 6 11:56:21 1993 Ian Lance Taylor (ian@cygnus.com) - - * read.c (cons): Zero out frag when creating reloc. - -Mon Apr 5 09:41:58 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-mips.c (gp_reference): Certain magic symbols can never - be referenced off the GP register. - - * app.c (do_scrub_next_char): Handle states 9 and 10 correctly - when dealing with characters of type LEX_IS_TWOCHAR_COMMENT_1ST, - LEX_IS_STRINGQUOTE, and LEX_IS_ONECHAR_QUOTE. - - * config/te-irix.h: New file; irix needs a different LOCAL_LABEL - definition from other MIPS targets. - * configure.in (mips-*-irix): Use emulation irix. - -Sun Apr 4 15:21:09 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * config/tc-h8500.c: Get relax size of branch instructions right, - (get_operand): Parse @sp+ correctly. - -Fri Apr 2 15:59:49 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * subsegs.h (segment_info_type) [BFD_ASSEMBLER]: Don't include - COFF section header field. - - * configure.in: Print error message if host or target is not - supported. - - * configure.in: If with-bfd-assembler, use obj-coff instead of - obj-coffbfd. - - * config/ho-generic.h: Include string.h. - -Fri Apr 2 08:54:57 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-mips.h (LOCAL_LABEL): Treat any label starting with - '$' as local, for any object file format. - - * config/tc-mips.c (macro): Optimizations to branching code and a - couple of bug fixes from ralphc@pyrps5.eng.pyramid.com (Ralph - Campbell). - - * config/ho-irix.h: New file; if not gcc, define BROKEN_ASSERT. - * configure.in (mips-sgi-irix*): Set gas_host to irix. - -Wed Mar 31 17:53:54 1993 Ian Lance Taylor (ian@cygnus.com) - - * subsegs.c (subseg_new): Set output_section of new section. - * as.c (perform_an_assemly_pass): Don't set output_section here. - * expr.c (expr_part, expr): Turn off section assertions for ECOFF, - since it has additional sections. - * read.c (s_lcomm): For MIPS ECOFF, put small objects in .sbss, - not bss_section. - * config/obj-ecoff.h (TARGET_SYMBOL_FIELDS): Added - ecoff_undefined field. - * config/obj-ecoff.c (obj_symbol_new_hook): Initialize - ecoff_undefined field. - (add_file): If using stabs, just output a stabs symbol rather than - creating a new fdr. - (obj_ecoff_begin, obj_ecoff_bend): Ignore line number by reading - it with get_absolute_expression, rather than skipping it by hand. - (obj_ecoff_loc): If using stabs, just output a stabs symbol rather - than ECOFF line number information. - (obj_ecoff_stab): Accept non-zero values for stabs line number. - (ecoff_build_symbols): Set ifilesym correctly. Set storage class - to small, undefined and/or readonly sections if appropriate. - Don't output symbol names containing \001 characters. - (ecoff_frob_file): Make sure at least one fdr is output. - * config/tc-mips.h: Define TC_MIPS. - * config/tc-mips.c (g_switch_value): New static variable. - (md_assemble): Set gp size of output BFD. - (gp_reference): New function; returns 1 if expression can be - accesssed via gp. Always returns 0 if not using ECOFF. - (macro_build): Convert BFD_RELOC_LO16 to BFD_RELOC_MIPS_GPREL if - possible. - (macro): Generate sequences using gp if possible. - (md_parse_option): Ignore -EL and -EB. Parse -G. - (md_apply_fix): Added BFD_RELOC_MIPS_GPREL to ignored case. - (s_change_sec): Handle .rdata and .sdata for ECOFF. - (s_extern): Mark symbol as external. Set ecoff_undefined field. - -Tue Mar 30 10:11:41 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * output-file.c (output_file_create): Don't call as_perror for - filename rejected by application. - - * as.c (main) [BFD_ASSEMBLER]: If errors occur, close and unlink - the output file. - - * doc/as.texinfo: Don't use @value in node names for the moment; - references don't appear to work right. - - * as.h (const, volatile): Put these definitions back, and use - them. - - * doc/as.texinfo: First pass at using new texinfo features -- - variables, conditional tests. Far from complete. - -Mon Mar 29 16:05:40 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * read.c: Temporary hack to handle some 64-bit constants. This - should be redone later. - (target_big_endian): Declare. - (big_cons): If it's set, reverse order of bytes being copied. - * config/tc-sparc.c (md_begin): Set target_big_endian. - - * read.c (s_ignore): Delete declaration of is_end_of_line. - - * config/obj-coffbfd.c (yank_symbols): Build list of file symbol - forward pointers properly. - -Mon Mar 29 13:47:33 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * config/obj-coffbfd.c (do_relocs_for): Fix bug where nrelocs - wasn't being stored into scnhdr. - * config/obj-coffbfd.h: Add prototype of s_get_segment. - * read.c (TC_START_LABEL): Default definition. - (read_a_source_file): Use TC_START_LABEL macro to work out - if a label has been seen. - -Mon Mar 29 12:56:56 1993 Ian Lance Taylor (ian@cygnus.com) - - * configure.in: Set BFDDEF and BFDLIB at the top of Makefile, not - the bottom (make expands variables in dependencies when the - dependencies are read, not when they are used). - - * config/obj-coffbfd.c (fill_section): Don't set NOLOAD bit for - a29k .bss section; the mondfe program doesn't like it. - -Sun Mar 28 08:12:53 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * config/tc-m68k.c: Use PARAMS macro, and use CONST instead of - const. - (current_architecture): Don't need initializer. - -Fri Mar 26 08:12:48 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * doc/none.m4: Define Z8000. - * doc/Makefile.in (as-*.texinfo): Refer to $(srcdir). Remove the - texinfo file before recreating it. - (TEXI2DVI): Need to set TEXINPUTS if "make as.dvi" is to work in - this directory. - (srcdir): Delete second, bogus definition. - (as.info): Look for as-*.texinfo in current directory rather than - in $(srcdir). - (as.dvi): Ditto. - (dvi): New rule. - * doc/configure.in: Create links to all as-*.texinfo files in the - source directory, if that's not the current directory. - - * configure.in (per-host): Accept MIPS host with BSD version - number. - (per-target): Classify i486 as i386. Use generic cpu_type instead - of target_cpu in selecting format etc. - - * app.c (do_scrub_next_char): Use .appfile, not .app-file. - * read.c (potable): Change .app-file to .appfile. - - * config/ho-decstatn.h: Renamed from ho-decstation.h. - * configure.in: Adjusted. - - * config/obj-bfd-sunos.*: Unused; deleted. - - * Makefile.in (version.c, vers-stamp): Deleted. - (config.h): Define GAS_VERSION. - * as.c (version_string): Deleted declaration. - (main): Look for GAS_VERSION instead. - - * doc/as.texinfo: Updated description of -a* (listing) options, - and describe how to pass them through from gcc. - - * config/obj-coffbfd.c (do_relocs_for): Don't allocate storage or - process relocs if there aren't any relocs to process. Avoids - malloc/free bug on SCO too. - - * as.h: Move local include files below system include files, to - avoid some redefinition complaints on some systems. - (const, volatile): Don't need these conditionally defined if we - use CONST and VOLATILE from ansidecl.h. - (seg_name): Use CONST, not const. - -Fri Mar 26 10:22:04 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-mips.c: Reindented to GNU standards. - -Thu Mar 25 08:59:14 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/obj-coffbfd.c (do_relocs_for): Remove a29k special case. - (fixup_segment): Add a29k special case; the linker is not prepared - to see a segment offset here. - - * app.c (do_scrub_next_char): Added new state, 10, modifying state - 9 to only keep a space in between identifier characters. - -Wed Mar 24 02:16:22 1993 david d `zoo' zuhn (zoo at poseidon.cygnus.com) - - * Makefile.in: add dvi target; as-$(config).texinfo might live in - srcdir, might be in objdir. - - * doc/Makefile.in: dvi depends on as.dvi - -Mon Mar 22 23:59:13 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: add installcheck target - -Mon Mar 22 16:25:57 1993 Jim Wilson (wilson@sphagnum.cygnus.com) - - * config/tc-sparc.c (sparc_ip): Add support for membar mask names. - Add missing colons in prefetch error messages. Add support for - ASI names. - -Mon Mar 22 10:19:00 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/tc-mips.c (macro): Use $AT for any floating point load. - -Sat Mar 20 12:50:51 1993 Ken Raeburn (raeburn@urth.cygnus.com) - - * config/tc-m68k.c (m68k_ip): For operand type 'M', reject - bignums, but don't emit error message. - -Fri Mar 19 21:02:19 1993 Jim Wilson (wilson@sphagnum.cygnus.com) - - * Makefile.in (targ-cpu.o): Depend on config.h. - -Wed Mar 17 16:44:06 1993 Ian Lance Taylor (ian@cygnus.com) - - * app.c (do_scrub_next_char): Added new state, 9, to avoid - dropping a space immediately following an identifier. - * expr.c, write.c: Rewrote assert expressions to not use multiple - lines; I don't think that can be done portably. - * config/tc-mips.c (macro): Use $AT if target register is zero in - load instruction, which it can be for a floating point load. - -Mon Mar 15 12:17:28 1993 Ian Lance Taylor (ian@cygnus.com) - - * write.c (write_contents): Compute the relocs before writing out - the section contents. - * config/obj-ecoff.h, config/obj-ecoff.c: Numerous changes to get - symbol table and values right. - * config/tc-mips.h (LOCAL_LABEL): If OBJ_ECOFF, any label starting - with $L is local. - * config/tc-mips.c (tc_gen_reloc): If OBJ_ECOFF, adjust the addend - by the section vma. - - * config/z8k.mt (TARG_CPU_DEPENDENTS): The relevant file is - z8k-opc.h, not z8k.h. - - * config/obj-coffbfd.c (obj_coff_endef): Correct test for .bf - symbol. - -Fri Mar 12 18:33:36 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: recognize sparc-sun-solaris2* instead of -solaris2 - -Fri Mar 12 12:00:07 1993 Ian Lance Taylor (ian@cygnus.com) - - * expr.c, write.c: Ultrix native 4.2 cc requires assert condition - to be on a single line. - -Thu Mar 11 17:56:22 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (config.h): Create file, writing out definitions of - target cpu, alias, and canonical name. - (ALL_CFLAGS): No longer define TARGET_CPU. - - * Makefile.in (check): Print a message, instead of quitting - silently. - - * as.c (main): Don't catch any signals, for now. - - * version.c: Deleted. - * Makefile.in: Generate it, putting in only the version number - itself. - (VERSION): New variable. - * as.c: Include config.h. - (main): Reformatted version string. Include target alias. Don't - print if not requested (i.e., unknown -v argument). - - * as.c (stralloc): Deleted. - (main): Call strdup instead. - - * configure.in: Handle all 68300 series chips. - * config/tc-m68k.c: Include config.h. - (md_assemble): Assume TARGET_CPU is defined. Accept some 68300 - series cpus as defaults. - (md_parse_option): Accept some m68300 series CPUs as defaults. - -Wed Mar 10 17:41:16 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * as.c (EXIT_SUCCESS, EXIT_FAILURE): Define to normal values if - not already defined. - (main, got_sig): Use them. - * config/ho-vms.h (EXIT_SUCCESS, EXIT_FAILURE): Reverse default - values. - -Tue Mar 9 07:40:06 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/obj-ecoff.c, config/obj-ecoff.h: Preliminary ECOFF - support. - - * config/tc-mips.h (TARGET_FORMAT): Define based on OBJ_AOUT vs. - OBJ_ECOFF as well as TARGET_BYTES_*_ENDIAN. - (struct loc, struct proc, struct file): Moved to tc-mips.c within - #ifndef OBJ_ECOFF block, since ECOFF uses different versions. - * config/tc-mips.c: Rearranged for ECOFF support. Added - prototypes for all static functions. Moved existing minimal - debugging format support info #ifndef OBJ_ECOFF blocks. - (macro_build_lui): Eliminated sign_extend argument, because ECOFF - does not support a non sign extended high 16 bits reloc. Adjusted - all callers accordingly. - (tc_get_register): Renamed from get_register, and made non-static. - - * config/mips-big.mt, config/mips-lit.mt: New files. Define - TARGET_BYTES_BIG_ENDIAN and TARGET_BYTES_LITTLE_ENDIAN, - respectively. - * configure.in (mips-*-bsd*): Use gas_target mips-lit. - (mips-*-ultrix*, mips-*-irix*, mips-*-ecoff): New targets, using - obj_format ecoff and gas_target mips-lit or mips-big. - -Tue Mar 9 07:43:01 1993 Ken Raeburn (raeburn@cygnus.com) - - * version.c: Bump to version 2.0.1. - -Tue Mar 9 07:40:06 1993 Ian Lance Taylor (ian@cygnus.com) - - * write.c (chain_frchains_together): Check that seg_info (section) - is not NULL. - (write_object_file): Call obj_frob_file after setting the symbols, - not before. - -Tue Mar 9 00:00:00 1993 Ken Raeburn (raeburn@cygnus.com) - - * Version 2.0 released. - -Mon Mar 8 14:57:10 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-i386.h (TC_COUNT_RELOC): Look for fx_addsy only. - -Fri Mar 5 09:05:55 1993 Ian Lance Taylor (ian@cygnus.com) - - * read.h: Define stringer here. - read.c, config/obj-ieee.c, config/obj-tcm88k.c: Not any of these - places. - -Thu Mar 4 11:52:23 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * read.c (s_space): Multiply repeat count by mult, not fill. - -Thu Mar 4 05:20:42 1993 Ken Raeburn (raeburn@cygnus.com) - - * read.c: Include ctype.h. - -Wed Mar 3 10:41:46 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - Patches from Eric Youngdale: - * make-gas.com: Find obstack.obj if it's not in the current - directory. - * read.c (s_ignore): Don't declare is_end_of_line. It's - redundant, and triggers a VMS gcc compiler bug. - - * write.c (write_object_file): Macro SUB_SEGMENT_ALIGN now takes - current segment as an argument. (Ignored in all cases but VMS.) - All callers and definitions changed. - -Tue Mar 2 11:56:19 1993 Ian Lance Taylor (ian@cygnus.com) - - * listing.c: Cleaned up a bit, added prototypes, made NO_LISTING - case compile again. - -Tue Mar 2 08:53:34 1993 Ken Raeburn (raeburn@cygnus.com) - - * config/tc-m68k.c (isbyte): Accept all values from -255 to +255, - so "~0x80" won't be rejected. - - * config/obj-elf.c: No longer include elf/reloc.h. - (obj_elf_section): Set SEC_READONLY and SEC_CODE for text section. - (obj_elf_stab, obj_elf_desc): Deleted do-nothing and commented-out - routines. - (obj_elf_xstab): New routine. - (obj_elf_set_size): Call as_warn, not fprintf. Pass desired - argument to s_ignore. Put "#if 0" around unused code. - (obj_pseudo_table): Use s_ignore instead of do-nothing routines. - Call elf_xstabs for .stabs and .xstabs operators. - - * config/tc-sparc.h (TARGET_FORMAT) [OBJ_ELF]: Now "elf32-sparc". - - * write.c (relax_and_size_seg): Set SEC_RELOC only if fixups are - present. - - * configure.in: mips-bsd configuration was missing format spec. - Should use aout. - - * Makefile.in (Makefile): Depends on configure.in. - - * config/tc-mips.c (append_insn): Don't check for alignment of - frag in memory; alignment of instructions in section is a separate - matter. - - * config/tc-mips.c (macro_build_lui): Fix some assumptions of ANSI - C availability. - - * listing.h: Always provide function declarations, not macros, so - pcc won't lose. - -Tue Mar 2 00:50:43 1993 John Gilmore (gnu@cygnus.com) - - * CONTRIBUTORS: Update Gilmore entry. - -Mon Mar 1 12:03:16 1993 Jim Wilson (wilson@sphagnum.cygnus.com) - - * config/tc-sparc.c (sparc_ip): Correctly assemble prefetch - instructions. Accept integer prefetch function numbers. - -Wed Feb 24 14:58:19 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.c (s_xword): Now call big_cons, so large - constants are accepted, but symbolic values are not. GCC will not - generate the latter currently. - - * frags.c (frag_init): New function. - (zero_address_frag, bss_address_frag): Now initialized at run - time. - * as.c (main): Call frag_init. - -Wed Feb 24 10:32:42 1993 Ian Lance Taylor (ian@cygnus.com) - - * app.c (do_scrub_next_char): In LEX_IS_LINE_COMMENT_START case: - Don't unget ch2 if we didn't get it. - -Wed Feb 24 04:14:07 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * doc/Makefile.in (TEXIDIR): Updated for new layout. - - * config/tc-sparc.c (s_common): Add support for ELF version. - (tc_gen_reloc) [BFD_ASSEMBLER]: New function. - * config/tc-sparc.h (TARGET_ARCH, TARGET_FORMAT) [BFD_ASSEMBLER]: - New macros. - (md_convert_frag): New macro. - - * config/tc-m68k.c (m68k_ip): For PC-relative addressing of a - symbol, fix the offset so "+2" isn't required. - - * config/tc-i960.c (line_comment_chars, line_separator_chars): - Define as common/bss. - (op_hash, reg_hash, areg_hash, iclasses_seen, br_cnt): Default C - initializers are sufficient. - - * config/obj-aout.h [BFD_ASSEMBLER]: Include libaout.h from bfd. - (TARGET_FORMAT) [BFD_ASSEMBLER]: Default to "a.out". - (S_SET_*, S_GET_*, obj_frob_symbol) [BFD_ASSEMBLER]: New macros. - (S_SET_TYPE) [!BFD_ASSEMBLER]: New macro. - * config/obj-aout.c: Use PARAMS macro for declarations. Remove - "IGNORE_DEBUG" conditional, since both branches are identical. - Use S_SET_TYPE, S_GET_TYPE, and S_GET_DESC instead of directly - referencing symbol structure members. - (obj_aout_frob_symbol) [BFD_ASSEMBLER]: New function. - - * as.h (struct frag): Reordered a couple of fields for better - packing. - - * write.c (record_alignment) [BFD_ASSEMBLER]: Record it in the - section info. - (write_contents) [BFD_ASSEMBLER]: New function. - (write_object_file) [BFD_ASSEMBLER]: Always handle -R here. Call - fix_new with BFD_RELOC_NONE instead of 0 or NO_RELOC. Call - obj_frob_file, obj_frob_symbol, tc_frob_symbol if defined. - (fixup_segment): Make sure common-section symbols get treated the - same as undefined symbols. - (fix_new) [BFD_ASSEMBLER]: Argument r_type is of type - bfd_reloc_code_real_type. Use seg_fix_{root,tail}P derived from - section info. - * write.h (fix_new): Update prototype. - - * tc.h (md_operand, md_convert_frag, tc_headers_hook, - md_section_align, md_undefined_symbol): Don't provide prototypes - if these are defined as macros. - (md_convert_frag) [BFD_ASSEMBLER]: BFD version needs bfd and - section passed. - - * symbols.c (symbol_new): Argument NAME is now pointer to const. - Simplified STRIP_UNDERSCORE code. Remove assumptions about null - pointers in freshly allocated storage. [BFD_ASSEMBLER]: Get new - BFD symbol. - (colon): Display other/desc fields of redefined symbol only if - S_GET_OTHER and S_GET_DESC are defined. - (symbol_make): Argument NAME is now pointer to const. - (symbol_find, symbol_find_base): Likewise. - (S_IS_*, S_GET_*, S_SET_*) [BFD_ASSEMBLER]: New functions. - * symbols.h: Fix prototypes for new const arguments. Add - prototypes for BFD_ASSEMBLER S_* functions. - - * subsegs.c (subseg_change) [BFD_ASSEMBLER]: BFD version of code - for changing to an existing section. - (subseg_new_rest) [BFD_ASSEMBLER]: Split off from subseg_new, - called by subseg_new and subseg_set. - (subseg_new) [BFD_ASSEMBLER]: Rewritten to change to new section, - given section name and subseg number. - (subseg_set) [BFD_ASSEMBLER]: New function; change to a possibly - new section/subsection. - - * read.c: Don't include ctype.h. - (cons) [BFD_ASSEMBLER]: For undefined symbols, use BFD_RELOC_32 - for now; should be machine-dependent. - - * configure.in: Accept *-*-elf and *-*-solaris* as ELF format - targets, forcing BFD use. - -Wed Feb 17 18:59:03 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.c: Use PARAMS macro for static function - declarations. Use BFD_RELOC_ macros everywhere, with - compatibility macros declared for non-BFD mode. - (struct sparc_it) [BFD_ASSEMBLER]: Use bfd_reloc_code_real_type - instead of enum reloc_type. - (emit_sparc_reloc): Commented-out function deleted. - (md_convert_frag): Deleted. - (tc_aout_pre_write_hook): Don't define for BFD_ASSEMBLER. - (md_apply_fix): Changed calling sequence (conditionally) for BFD - version. - * config/tc-sparc.h (md_convert_frag): New macro. - - * config/obj-aout.c (obj_aout_stab): Refer to undefined_section, - not SEG_UNKNOWN. Use S_SET_TYPE, S_GET_TYPE, S_GET_DESC instead - of referencing fields directly. - - * write.c (cvt_frag_to_fill): New function; extracted from - write_object_file. - (write_object_file) [! BFD_ASSEMBLER]: Call it. - (relax_and_size_seg) [BFD_ASSEMBLER]: New function; relax section - and set its size and flags. - - * struc-symbol.h (struct symbol) [BFD_ASSEMBLER]: Replace some - fields with BFD equivalents. Turn on back-pointers, and add - target-specific fields at end. - -Thu Feb 11 09:20:37 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/obj-coffbfd.c (fill_section): Don't set vaddr here. - (write_object_file): Set it here instead, so that fixup_segment - can see the correct value. - -Mon Feb 8 13:56:17 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * write.c (write_object_file): Check for errors and warnings and - bail out before processing contents. - (chain_frchains_together_1): New function, does most of the work - of remove_subsegs. - (chain_frchains_together) [BFD_ASSEMBLER]: New function. - (remove_subsegs) [! BFD]: Call it. - (write_object_file) [BFD_ASSEMBLER]: Converted to use BFD - structures and routines. - - * config/obj-elf.*: New files. - - * config/mips.mt, config/rs6000.mt: Deleted. - - * config/h8300.mt: Don't specify compiler here. - - * config/z8k.mt: The z8k code depends on the z8k opcode table, - not the h8300 one. - * config/tc-z8k.h: Comment fix. - - * write.c: Reordered some functions for better inlining. - (fixup_segment): Linkrelax code is no longer conditional on - TC_I960. - -Thu Feb 4 12:45:16 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * config/{h8500.mt, tc-h8500.c, tc-h8500.h, obj-coffbfd.c, - obj-coffbfd.h}: support for the H8/500 - -Wed Feb 3 19:28:18 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-vms.h (SUB_SEGMENT_ALIGN): Define VMS version here. - * write.c (write_object_file): Not here. - (fix_new): Initialize fx_addnumber. - - * listing.c: Don't include target-cpu.h explicitly, since as.h - includes it. - -Thu Jan 28 00:35:40 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * write.h [BFD_ASSEMBLER]: Don't declare next_object_file_charP, - *_fix_root, *_fix_tail, seg_fix_rootP, seg_fix_tailP. - (struct fix): Reordered fields for compactness and efficiency. - Converted some logical fields to 1-bit fields. - - * config/obj-aout.h: Use PARAMS. - [BFD_ASSEMBLER]: Don't define/declare AOUT_MACHTYPE, seg_N_TYPE, - N_TYPE_seg, DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE. - - * read.c: Don't include listing.h; as.h includes it. Removed - DONTDEF code. - [BFD_ASSEMBLER]: Include subsegs.h. - (old_buffer, new_broken_words): Default initialization is - sufficient. - - * output-file.c [BFD_ASSEMBLER]: Include bfd.h, default TARGET_MACH - to 0, define stdoutput. - (output_file_create) [BFD_ASSEMBLER]: Call bfd_perror on failure. - Call bfd_set_arch_mach. - (output_file_close) [BFD_ASSEMBLER]: Call bfd_close, not - bfd_close_all_done. Call bfd_perror on failure. - (output_file_append) [BFD_ASSEMBLER]: Don't define. - - * config/m68kcoff.mt (LOCAL_LOADLIBES): Delete definition. - - * subsegs.h (segment_info_type): Always define. Omit field scnhdr - if not MANY_SEGMENTS. Define new field bfd_section if - BFD_ASSEMBLER. - (seg_info): New macro. - - * expr.c, input-scrub.c: Use PARAMS macro. Deleted unused - variables, and some irrelevant comments. - - * Makefile.in (ALL_CFLAGS): Include $(BFDDEF). - (LIBS): Include $(BFDLIB). Don't bother with $(CLIB). - * configure.in: Permit --with-bfd-assembler now, with a warning. - Variable need_bfd is now a boolean, as is new variable bfd_gas. - Set BFDDEF and BFDLIB in Makefile when appropriate. - - * as.c: Removed "#ifdef DONTDEF" and "#ifdef comment" code. - (main): Refer to flag_always_generate_output instead of - flagseen['Z']. - - * as.c (main) [BFD_ASSEMBLER]: Open output bfd. - (*_section) [BFD_ASSEMBLER]: Define them. - (perform_an_assembly_pass) [BFD_ASSEMBLER]: Initialize them, and - set section flags when appropriate. - * as.h (SEG_NORMAL) [BFD_ASSEMBLER]: Require that the specified - section is not absolute, undefined, or an assembler internal one. - (absolute_section, undefined_section): Always define. - * expr.c, read.c, symbols.c: Refer to *_section, not SEG_*; break - switch statements into if-else trees. - * symbols.c [MANY_SEGMENTS]: Deleted redundant definitions of - SEG_BSS and SEG_DATA. - - * as.h (frag_now_fix): New macro. - * symbols.c (colon): Use it. - -Wed Jan 27 21:43:53 PST 1993 Ralph Campbell (ralphc@pyramid.com) - - * config/tc-mips.c: Added mips support for mips-dec-bsd. - * config/tc-mips.h: Added mips support for mips-dec-bsd. - * config/ho-mipsbsd.h: Added mips support for mips-dec-bsd. - * config/mips-opcode.h: Added mips support for mips-dec-bsd. - * configure.in: Added mips support for mips-dec-bsd. - * atof-generic.c: Define TRUE and FALSE if not defined. - -Thu Jan 21 12:48:19 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * version.c: Bumped version number to 1.93.05. - -Wed Jan 20 17:11:53 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/obj-coff.c (obj_emit_relocations): Don't use #elif. - (obj_emit_lineno): Don't need return at end of void function. - (obj_symbol_new_hook): Ditto. - - * config/tc-m68k.c: Removed some unused code. - (tc_aout_fix_to_chars): Array nbytes_r_length is now const. - - * config/tc-m68k.h (TC_COUNT_RELOC): Don't emit reloc if only - offset field is set. - -Fri Jan 8 05:44:49 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-sparc.c (sparc_ip): For %uhi and %ulo, if not - ENV64, emit no reloc. - (md_pseudo_table): For ".xword", call s_xword. - (s_xword): New function. - - * config/tc-sparc.c (architecture_requested, warn_on_bump, - md_relax_table): Use default zero initialization. - (s_reserve): Since SEG_E2 is equivalent to SEG_BSS, just use the - latter, instead of selecting with preprocessor conditionals. - -Thu Jan 7 08:58:21 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: recognise all sparclite variants - -Thu Jan 7 05:25:25 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * read.c (s_data) [!BFD_ASSEMBLER]: Fix typo in 4 Jan change -- - accidentally changed to use subseg_change where it should have - been subseg_new. - -Tue Jan 5 08:42:16 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * expr.c (operand): If character other than comma or newline is a - logical end-of-line character, use the newline case. - From Eric Youngdale: - (operand): Set X_add_number field for floating-point numbers. - (operand): Treat zero byte as end-of-operand. - - * configure.in (per-target): Look for with_bfd_assembler option. - For now, only accept "no", until the merge is done. - - Merged changes from Eric Youngdale (youngdale@v6550c.nrl.navy.mil): - * as.c, flonum-konst.c, hex-value.c, input-file.c, version.c, - config/obj-aout.h, config/obj-vms.c: VMS -> HO_VMS. - * read.c: Finish conversion to S_* macros in the VMS only - parts of the program. Add "const" modifier to hex_value. - * as.c, read.c, symbols.c, write.c: Change "ifdef VMS" to - "ifdef OBJ_VMS". - * expr.c: Add "const" modifier to hex_value. - * symbols.c: Finish conversion to S_* macros in the VMS only - parts of the program. Add "const" modifier to - md_[long,short]_jump_size. Remove declaration of const_flag - (which will be declared in obj-vms.h). - * write.c: Add "const" modifier to md_[long,short]_jump_size. - Fix arguments to VMS_write_object_file. - * config-gas.com: New file. Script for VMS systems to set up the - configuration to build gas for VMS, and create config.status. - * make-gas.com: Redone to work with new scheme. - * obj-vms.c: Patch to fix bug where we were not correctly parsing the - stabs directives. - * obj-vms.c: Define macros COPY_LONG and COPY_SHORT which - will swap bytes if needed on a big endian system. Use throughout - as needed. - * obj-vms.c (obj_aout_stab): Add code to generate listing file. - * obj-vms.c (VMS_typedef_parse): Add alias to correctly handle certain - types of malformed stabs. Change parsing algorithm so that we are - more certain of having all of the information that we need on hand. - * obj-vms.c (final_forward_reference): New function, used to help - resolve the data types of as many struct elements as possible - when some part of the struct is not fully defined by the compiler. - * obj-vms.c (VMS_LSYM_Parse): Correctly handle case of continuation - stabs directives. - * obj-vms.c (VMS_write_object_file): Define all vtable psects - as symbols as well in the object file. Look for external functions - that start with "__vt.", and turn them into variables, since the - g++ compiler is incapable of doing this. - * tc-vax.c: Add '1' option for backward compatibility with older GCC - versions. - * bignum-copy.c (bignum_copy): Fix bug where we pad with zeroes. - * input-scrub.c (as_where): Fix bug where as would crash if we did not - have the name of the source file yet. - * config/ho-vms.h: define HO_VMS, not HO_VAX. - -Mon Jan 4 05:17:26 1993 Ken Raeburn (raeburn@cygnus.com) - - * read.c (s_data): Always use "data_section", since it'll map to - SEG_DATA or SEG_E1 if needed. - (s_lcomm): Likewise with bss_section. - (s_fill): Use memset, not bzero. - -Thu Dec 31 04:29:27 1992 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * read.c: Deleted some code under "#ifdef DONTDEF" that was for - handling GDB symbol table data. - - * config/obj-aout.h (segment_name): Delete definition. - (seg_name): Delete declaration. - * config/obj-bout.h (segment_name, seg_name): Ditto. - * config/obj-vms.h (segment_name, seg_name): Ditto. - * config/obj-coff.h (segment_name): Ditto. - * config/obj-coffbfd.h (segment_name): Ditto. - - * Changes for BFD_ASSEMBLER: - * obj.h (obj_crawl_symbol_chain): Declare only if not - BFD_ASSEMBLER. - (obj_header_append, obj_pre_write_hook): Ditto. - * as.h (stdoutput): New var, defined only if BFD_ASSEMBLER. - (segT) [BFD_ASSEMBLER]: New typedef for "asection *". - (segment_name) If BFD_ASSEMBLER, look up BFD section name; - otherwise, use seg_name array. - (seg_name): Declare only if not BFD_ASSEMBLER. - (section_alignment): Declare only if not BFD_ASSEMBLER. - (big_section, reg_section, pass1_section, diff_section, - absent_section, text_section, data_section, bss_section): If - BFD_ASSEMBLER, declare as variables; otherwise, declare as macros, - mapping to segT enum values. - (tc_aout_fix_to_chars, next_object_file_charP): Force parse errors - if these are used or defined, if BFD_ASSEMBLER. - (subseg_set, subseg_new) [BFD_ASSEMBLER]: Functionality of old - subseg_new split into two functions. - (SEG_NORMAL): For BFD_ASSEMBLER, always return true, for now. - - * as.h (volatile): Don't define if already defined. - (had_errors, had_warnings): Provide prototypes for ANSI C even if - NO_STDARG. - (as_bad, as_fatal, as_tsktsk, as_warn): For GNU C version 2, - declare with format attribute for -Wformat checking. - -Wed Dec 30 10:18:57 1992 Ian Lance Taylor (ian@cygnus.com) - - * app.c, config/tc-*.c: Don't include read.h, since it is already - included by as.h. - - * These are based on patches from Minh Tran-le - . - * configure.in (i[34]86-ibm-aix*): Accept i486 for host. Use - obj_format coffbfd and gas_target i386coff for target. - (i[34]86-*-isc*): New host (uses sysv). - * config/i386aix.mt: Removed (no longer used). - * config/mh-i386aix (RANLIB): Use true rather than /bin/true. - (MINUS_G): Removed. - (LDFLAGS): Added, defined as -shlib. - * config/te-i386aix.h (REVERSE_SORT_RELOCS): Undefine. - * config/te-sco386.h (LOCAL_LABEL): Don't define. - (DOT_LABEL_PREFIX): Define. - * expr.c (operand): If DOT_LABEL_PREFIX, use .L0\001 as a label - name rather than L0\001. - * read.c (s_lcomm): Make a frag in SEG_BSS rather than using - local_bss_counter. - * symbols.c, symbols.h (local_bss_counter): Removed. - * write.c (write_object_file): bss no longer uses - local_bss_counter. Pass correct data and bss size to - VMS_write_object_file. - * config/obj-vms.c (VMS_write_object_file): Accept bss size as - argument, rather than using local_bss_counter. - * config/tc-m88k.c (s_bss): Don't use local_bss_counter. - * config/tc-sparc.c (s_reserve): Don't use local_bss_counter. - * config/obj-coffbfd.c (had_lineno, had_reloc): Removed. - (size_section): Restored sanity check. - (do_relocs_for): Base section address on s_paddr rather than - computing it. Adjust a29k R_IHIHALF special case to account for - section paddr (used to require paddr to be zero). If there are no - reclos, set s_relptr to 0. Set relocation size in object_headers. - (fill_section): Always set s_vaddr here, removing - ZERO_BASED_SEGMENTS case. Force s_scnptr for bss to 0. Don't set - NOLOAD for i386 .bss, because it confuses the SVR3 native linker. - Set STYP_INFO for .comment. - (coff_header_append): Use object headers and H_{SET,GET}_* macros. - Make aouthdr writing depend on OBJ_COFF_OMIT_OPTIONAL_HEADER. - (crawl_symbols): Handle 8 character section name correctly. Use - H_{SET,GET}_* macros. - (do_linenos_for): Set lineno size in object_headers. - (write_object_file): Use H_{SET,GET}_* macros. Don't bother to - set s_vaddr here. If string_byte_count remains 4, set it back to - 0, and only write strings out if there are some. Call - fill_section before do_relocs_for and do_linenos_for. - (obj_coff_section): Handle optional quoted second argument giving - section characteristics. - (obj_coff_bss): Added to handle .bss. - (obj_coff_ident): Added to handle .ident (puts string in .comment - section). - (obj_coff_lcomm): Put common symbols in .bss, not .data. - (fixup_mdeps): Change to segment. Call frag_wane after - md_convert_frag. - (fixup_segment): Explicitly check S_IS_COMMON before making 386 - adjustment (already happened only for common symbols, but this is - clearer). - * config/obj-coffbfd.h (OBJ_COFF_OMIT_OPTIONAL_HEADER): Define. - * config/tc-i386.c (s_bss): Don't use if I386COFF. - (md_pseudo_table): Ignore .optim and .noopt. - (tc_coff_sizemachdep): New function. - * config/tc-i386.h (REVERSE_SORT_RELOCS): Undef, for SVR3 - compatibility. - (LOCAL_LABEL): Removed definition. - (DOT_LABEL_PREFIX): Defined. - -Mon Dec 28 10:32:05 1992 Ken Raeburn (raeburn@cygnus.com) - - * app.c (app_push): Use memcpy, not bcopy. - (do_scrub_next_char): For \", return " not '. - (symbol_chars): Now const. - - * expr.c (operand): If not LOCAL_LABELS_FB, don't look for "0f" - and "0b". If LOCAL_LABELS_DOLLAR, check for "0$". - - * config/obj-coff.h: Don't use #elif. - - * config/ho-sunos.h: Don't include sys/stdtypes.h; 4.0.3 doesn't - have it. (Reported by Noah Friedman, friedman@gnu.ai.mit.edu.) - -Wed Dec 16 12:12:33 1992 Ian Lance Taylor (ian@cygnus.com) - - * write.c, obj-ieee.c: don't define SUB_SEGMENT_ALIGN if it is - already defined. - -Tue Dec 15 12:40:11 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * app.c (do_scrub_begin): allow single quote strings if so - configured. - - * config/*z8k*: checkpoint - -Sun Dec 13 00:04:38 1992 Ian Lance Taylor (ian@cygnus.com) - - * read.c (read_a_source_file): avoid calling xmalloc (0). - -Sat Dec 12 15:26:34 1992 Ian Lance Taylor (ian@cygnus.com) - - * listing.c: Call xmalloc, not malloc; don't declare malloc. - - * Changes to support SCO 3.2v4: - * read.c (s_align_bytes, s_align_ptwo): If not SEG_DATA or - SEG_BSS, fill with NOP_OPCODE. - * config/i386coff.mt: Add opcode/i386.h to TARG_CPU_DEPENDENTS. - * config/obj-coffbfd.c (do_relocs_for): Increment addr even if not - using ZERO_BASED_SEGMENTS. - (fill_section): If ZERO_BASED_SEGMENTS, set segment addresses, but - never set segment address for SEG_E2 (.bss) and don't write out - SEG_E2 contents. Set .init and .fini sections to STYP_TEXT. - (obj_coff_endef): Don't merge labels or symbols awaiting forward - definitions, and don't merge tags with non-tags. Check for .bf - rather than just checking whether the second character is b and - the third character is f. - (obj_coff_val): gcc can generate values which we don't handle - correctly; discard information for now, since it only affects the - debugging information. - (tag_find_or_name): Don't insert tags in the symbol table. - (yank_symbols): Don't merge labels. - (write_object_file): Don't define SUB_SEGMENT_ALIGN if it is - already defined. Fill subsegments with NOP_OPCODE, not 0. Don't - set segment address if ZERO_BASED_SEGMENTS. - (obj_coff_section): Accept and ignore a trailing quoted string, as - used in AT&T i386 syntax. - (fixup_segment): Take segment as argument. On the i386, adjust PC - relative addends by the segment vaddr. - * tc-i386.h: Define SUB_SEGMENT_ALIGN. - * tc-a29k.h: Define ZERO_BASED_SEGMENTS. - * tc-i386.c: (i386_operand): If I386COFF, accept any segment type. - -Tue Dec 8 00:06:48 1992 Ken Raeburn (raeburn@rtl.cygnus.com) - - * config/obj-coffbfd.c: Include libcoff.h. - - * version.c: Now version 1.93. - -Mon Dec 7 00:39:09 1992 Ken Raeburn (raeburn@cygnus.com) - - * config/tc-i386.c (md_pseudo_table): For 386bsd and linux, do - power-of-two alignment for .align. - - * as.h: If BROKEN_ASSERT, just redefine `assert' to be trivial, - and leave everything else alone. - -Fri Dec 4 16:58:42 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (as.new): Don't bother saving as.old. - - * write.c: Conditionalize on OBJ_VMS, not VMS. - (magic_number_for_object_file): Don't define if OBJ_VMS. - - * config/obj-vms.c: Changes for traditional C. - -Thu Dec 3 01:24:07 1992 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * config/ho-generic.h (malloc, realloc): Declare. - - * Lots of comment/whitespace changes. - - * write.h (struct fix): Some fields reordered, narrowed. - - * read.c (MASK_CHAR): Define using C types, not magic number. - - * as.c, input-file.c: Deleted some unused code. - - * app.c, as.h: Doc fix. - - * flonum-konst.c, flonum-mult.c: Include ansidecl.h. - - * as.h (xmalloc): Argument is long. - - * xmalloc.c (error): Remove declaration; as.h takes care of it. - - * doc/as.texinfo: Regrouped documentation of some command-line - options. Updated options documentation for m68k. Some minor - wording/punctuation changes. - -Mon Nov 30 11:42:11 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * configure.in: Accept target OS "vms". - - * symbols.c: Merged ANSI and non-ANSI function decls, using - PARAMS macro. - - * xmalloc.c: Just include as.h, don't bother trying to figure out - other header files. - - * strstr.c, strerror.c: Deleted. - * Makefile.in: Deleted references. - - * config/tc-ns32k.c: Don't include header file for string - declarations; leave that to ho-*.h. - -Fri Nov 27 04:11:36 1992 Ken Raeburn (raeburn at cambridge-laptop.cygnus.com) - - * config/coff_gnu.h [TC_I860]: Guesses for reloc type values, - imported from FSF sources. - - * messages.c (strerror): Declare unconditionally. - - * as.h: Delete alloca and register definitions. - - * config/atof-ieee.c (mask): Now const. - - * obstack.c, obstack.h: Deleted. - - * as.h (flag_readonly_data_in_text): New flag. - * as.c (main): Set it for -R. - - * as.h (flag_suppress_warnings): New flag. - * as.c (main): Set it for -W. - * messages.c (as_warn): Check it instead of flagseen['W']. - - * as.h (flag_always_generate_output): New flag. - * as.c (main): Set it for -Z. - - * config/tc-sparc.h: Define NEED_FX_R_TYPE. - * config/tc-a29k.h: Ditto. - * write.h (struct fix): Don't conditionalize fx_r_type field on TC - macros. - - * as.h: Merged ANSI and non-ANSI function decls, using PARAMS - macro. - * bignum.h, expr.h, flonum.h, frags.h, input-file.h, listing.h, - obj.h, output-file.h, read.h, struc-symbol.h, symbols.h, tc.h, - write.h: Likewise. - * read.c: Likewise. - - * xmalloc.c: Conditionalize on HAVE_MALLOC_H, not USG. Fold in - xrealloc from xrealloc.c. - * xrealloc.c: Deleted. - * Makefile.in (REAL_SOURCES, OBJS): Adjusted. - - * configure.in: For host CPU a29k, rs6000, vax, consider using bsd - or vms ho- files. - - * config/ho-sysv.h (setbuffer, HO_USG): Deleted. - - * config/atof-ieee.c (atof_ieee): Exponent field isn't a pointer; - don't initialize it with NULL. - - * config/ho-vax.h (M_VAX): Deleted; was unused. - - * README-vms, config/ho-vms.h, config/obj-vms.c, config/obj-vms.h: - New files imported from FSF version, contributed by Eric Youngdale. - * README-vms-dbg, config/vms: Deleted. - - * ChangeLog, config/ChangeLog: Merged. - - * config/*tahoe*, configure.in: Tahoe support brought in from FSF - version. - - * input-file.c (input_file_open): Eliminate call to setvbuf. - [USG] (setbuffer): Deleted macro. - -Mon Nov 23 11:00:16 1992 Ken Raeburn (raeburn@cygnus.com) - - * all files: Whitespace changes for GNU indentation style, done by - GNU `indent'. Some cleanup still needed, especially of comments. - - * configure.in: No te-386bsd.h file exists; don't try to use it. - - * obj-coff.c (obj_coff_endef): Use as_warn, not fprintf. - - * tc-m68k.c (md_assemble): Don't complain about 68000 with 68881; - could be doing emulation. - -Thu Nov 19 11:47:19 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - z8000 documentation - * doc/Makefile.in, doc/all.m4, doc/as-all.texinfo, doc/as.texinfo: - all modified. - -Tue Nov 10 09:49:24 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (as.o, obj-format.o): added dependency on subsegs.h. - - * subsegs.h: add extern to segment_info declaration. - - * read.h: added extern declarations for comment_chars, - line_comment_chars, and line_separator_chars. - read.c, app.c: removed definitions of comment_chars, - line_comment_chars, and line_separator_chars. - - * tc-m68k.c (m68k_reg_parse): If REGISTER_PREFIX isn't defined, - still accept (but don't require) OPTIONAL_REGISTER_PREFIX before - the register name. - (insert_reg): put REGISTER_PREFIX before register names before - putting them in the symbol table. - * tc-m68k.h (OPTIONAL_REGISTER_PREFIX): Define to be "%", if not - M68KCOFF. - - * obj-coffbfd.c (fill_section): set STYP_NOLOAD bit for .bss - section. - - * atof-ieee.c, atof-ns32k.c, tc-*.c: made EXP_CHARS, FLT_CHARS, - comment_chars, line_comment_chars and line_seperator_chars - consistently const, and always initialized them. Included read.h. - -Thu Nov 5 17:55:41 1992 Jim Wilson (wilson@sphagnum.cygnus.com) - - * tc-sparc.c (sparc_ip): Add code to flag error if an absolute - constant will not fit in an immediate field. - (md_apply_fix, RELOC_BASE13 case): Check for relocation overflow. - -Wed Nov 4 07:50:46 1992 Ken Raeburn (raeburn@cygnus.com) - - * obj-coff.c (callj_table): Delete global variable. - (obj_emit_relocations): Define it locally here, and only if - TC_I960 is defined. - - * tc-m68k.c (m68k_reg_parse): Underscore is part of a symbol name. - (m68k_ip): Don't warn about bignum used as float bit-pattern. - - * obj-coff.c: Replaced ANSI and non-ANSI function declarations - with a single set using PARAMS macro. - - * tc-i960.c (tc_bout_fix_to_chars): Bit-field fixups want a length - of 2. - - * tc-i960.c: Missed a couple of 0->NO_RELOC conversions. - - * tc-i960.h (N_BALNAME, N_CALLNAME): Define as char-type values, - so widening works consistently. - -Wed Oct 28 08:52:34 1992 Ken Raeburn (raeburn@cygnus.com) - - * version.c: Put conditional "const" before version_string, not - before dummy function for VMS. Now version 1.91.03. - - * app.c (do_scrub_next_char): Need double-\ before `000' to show - printed rep of null character. - -Fri Oct 23 14:40:38 1992 Ian Lance Taylor (ian@cygnus.com) - - * obj-coffbfd.c (write_object_file): check return value of - bfd_close_all_done. - -Tue Oct 20 12:18:08 1992 Ian Lance Taylor (ian@cygnus.com) - - * Support for i386-sysv. - obj-coffbfd.c (do_relocs_for, write_object_file): set segment - addresses to reasonable sizes. New define ZERO_BASED_SEGMENTS can - be used to set them all to zero as was done before. - (fill_section): segment addresses now set in write_object_file. - (fill_section): Don't set STYP_NOLOAD for .bss section. - (fixup_segment): 386 uses strange common symbol format. - tc-i386.c (tc_coff_fix2rtype): use R_DIR32, not R_RELLONG, for - compatibility with SVR3.2 linker. - * configure.in: i386-sysv and i386-sco use coffbfd. - - * app.c (do_scrub_next_char): discard whitespace after a label. - -Sat Oct 10 12:33:45 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: differentiate between SunOS 4 and Solaris2 for Sun4 - hosts, use the sysv configuration for solaris2 - -Mon Oct 5 09:28:57 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - fix i960+non-bfd coff bit rot. - * obj-coff.c (c_dot_file_symbol, obj_coff_ln, obj_coff_line): - support for C source listings. (obj_coff_endef): look in the right - part of the symbol for the symbol name - - * tc-m68k.c (get_num): make it work for all segments, not just the - first three. - -Mon Oct 5 03:30:36 1992 Mark Eichin (eichin at tweedledumber.cygnus.com) - - * configure.in: recognize i386-*-bsd emulation. - -Thu Oct 1 23:05:12 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: use the cpu-vendor-os triple for host and target - -Tue Sep 29 12:22:52 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * obj-coffbfd.c (write_object_file): don't fixup for the z8k - * tc-z8k.c: lots of bug fixes - -Tue Sep 29 10:51:55 1992 Ian Lance Taylor (ian@cygnus.com) - - * tc-i960.h, tc-i960.c: avoid the ANSI preprocessor addition - #elif, since it is not supported by old compilers. - ho-rs6000.h, tc-m68k.c: the native RS/6000 compiler miscompiles a - couple of expressions in tc-m68k.c. - -Mon Sep 28 21:18:24 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * read.c (cons): If NO_RELOC is defined, use it. - - * tc-i960.c (get_cdisp): Use NO_RELOC, not 0, in call to fix_new. - -Fri Sep 25 18:18:52 1992 Ian Lance Taylor (ian@cygnus.com) - - * tc-m68k.h: if M68KCOFF, define DOT_LABEL_PREFIX (to require - local labels to start with a .) and set REGISTER_PREFIX to %. - tc-m68k.c (m68k_reg_parse): accept REGISTER_PREFIX if defined. - -Fri Sep 25 17:53:43 1992 John Gilmore (gnu@cygnus.com) - - * messages.c: Comment changes. - -Fri Sep 25 14:12:58 1992 Ken Raeburn (raeburn@kyriath.cygnus.com) - - * as.h: Test if __STDC__ is defined only, don't test its value. - * messages.c: If __STDC__ is not defined, define NO_STDARG. - -Thu Sep 24 12:42:32 1992 Brendan Kehoe (brendan@rtl.cygnus.com) - - * listing.c (debugging_pseudo): Add stabs and stabn as things to - ignore. - -Tue Sep 22 13:02:07 1992 Sean Eric Fagan (sef@cygnus.com) - - * obj-coffbfd.c (do_relocs_for,fill_section): now allocate all - sections starting from zero, rather than making them consecutive. - This makes subsequent reloc calculations easier, esp if the object - format doesn't understand addends. (obj_coff_lcomm): (maybe temporarily) - allocate lcomm in .data rather than in .bss. It seems that some - tools can't cope with a non-zero sized bss before linkage. - -Tue Sep 22 15:10:51 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * tc-m68k.c: Replace "enum m68k_architecture" with "int" - throughout. That enum no longer means what we thought it meant. - - * tc-m68k.c (md_assemble, md_parse_option): Handle new - "-mno-688[58]1" options. - - * tc-m68k.c: Added CPU32 support. - -Fri Sep 18 08:02:18 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * tc-m68k.c (m68k_ip): An(disp) is not pc relative. - -Tue Sep 15 17:25:05 1992 Jim Wilson (wilson@sphagnum.cygnus.com) - - * Makefile.in (as.new): Remove dependence on LOCAL_LOADLIBES. - Change LIBDEPS dependence to LIBS. - -Tue Sep 15 15:32:02 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (install): if $(tooldir) exists, install as in - $(tooldir)/bin. - -Sun Sep 13 20:30:10 1992 Ian Lance Taylor (ian@cygnus.com) - - * Added WARN_SIGNED_OVERFLOW_WORD define to give an error if any - .word is < -32768 or > 32767. The -J flag causes the error to be - ignored. This is to catch over-sized switches generated by gcc on - systems which don't support the broken .word hack. - as.c (main): permit -J if WARN_SIGNED_OVERFLOW_WORD. - write.c (fixup_segment): check for signed .word overflow if - WARN_SIGNED_OVERFLOW_WORD. - - * write.c (fixup_segment): fixed missing parens in expression - checking for byte or word overflow. - - * obj-coffbfd.h: define WARN_SIGNED_OVERFLOW_WORD. - obj-coffbfd.c (fixup_segment): check for signed .word overflow if - WARN_SIGNED_OVERFLOW_WORD. - - * obj-coffbfd.c (fixup_segment): fixed missing parens in - expression checking for byte or word overflow. - -Fri Sep 11 10:21:04 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - Support for i386 coff - * obj-coffbfd.h : added stuff - * tc-i386.c (tc_coff_fix2rtype): new function - * tc-i386.h : new coff defines - -Thu Sep 10 09:23:15 1992 Ian Lance Taylor (ian@cygnus.com) - - * input-scrub.c (input_scrub_push): call input_file_begin, not - input_scrub_begin. - messages.c (as_perror): print ": " between the passed in error and - the strerror, like perror does. - -Wed Sep 9 11:06:25 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: use gas_target instead of modifying target_cpu. - From Steve Chamberlain: - Makefile.in: Handle m68*-*-coff*. - read.c, read.h: add mult argument to s_space - - * tc-m68k.c (m68k_ip, m68k_ip_op, get_num, try_moto_index): merge - Motorola and MIT syntax; gas can now assemble either type of - file. - tc-m68kmote.c, tc-m68kmote.h: removed now superfluous files. - From Steve Chamberlain: - m68kcoff.mt: for m68k COFF. - obj-coffbfd.c: (fixup_mdeps) added - (size_section) removed bad sanity check - (fill_section) added rs_machine_dependent case - (write_object_file) call fixup_mdeps - (fixup_segment) set fx_subsy to 0. - obj-coffbfd.h: define WORKING_DOT_WORD (too hard to support) and - handle m68k. - tc-m68k.c, config/tc-m68k.h: added m68k COFF support and Motorala - pseudo ops. - -Tue Sep 8 17:10:58 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (LIBS): Include opcode library. - -Fri Sep 4 18:20:56 1992 Ken Raeburn (raeburn@cygnus.com) - - * config/tc-m68k.c (get_num, case SEG_BIG): If only small integers - including zero are accepted, pass +0.0. - -Sun Aug 30 21:24:46 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: map "as" through program_transform_name when - installing. - - * doc/Makefile.in: map "as" through program_transform_name when - installing. - -Sat Aug 29 12:11:12 1992 Jim Wilson (wilson@sphagnum.cygnus.com) - - * Makefile.in (as.new): Depend on LOCAL_LOADLIBES. - -Fri Aug 28 16:25:22 1992 Ian Lance Taylor (ian@cygnus.com) - - * obj-bout.h, obj-bout.c (obj_header_append, obj_symbol_to_chars), - tc-i960.c (md_ri_to_chars): Always output bout object file in - little endian byte order (used to use endianness of host). - -Tue Aug 25 15:50:48 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * config/tc-m68k.c (init_table): Now const. Always include 68851 - data, so that "bc" is available to 68040 cache instructions. - Added "tt0", "tt1", and 68ec030 variants. - (md_assemble): Complain if 68000 (only) and 68881 are specified. - (enum _register): Added TT0, TT1. - (m68k_ip, cases '3' and 't'): Handle new operand type codes. Pass - line number correctly in "internal error" messages. Don't print - architecture-mismatch message for operand errors. - - From Colin Smith (colin@wrs.com): - * config/tc-m68k.c (m68k_ip, case '_'): Use addword twice rather - than install_operand. - -Tue Aug 25 15:13:48 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * listing.c (buffer_line): rewind to the start of include - files, they might be included twice. - - * z8k.c, z8k.h, z8k.mt: z8000 support stuff - -Mon Aug 24 12:45:43 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: defined TARGET_CPU for C code so that it can choose - one element of a family. - - * tc-m68k.c: use TARGET_CPU to choose default cpu type. - - * te-generic.h: default to LOCAL_LABELS_DOLLAR and LOCAL_LABELS_FB - so that we can assemble hand-written libgcc code. - -Fri Aug 21 14:38:44 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * messages.c (as_warn): Use fputs, not fprintf, with a buffer that - has already been formatted (but may still contain %-characters). - (as_bad): Likewise. - -Wed Aug 19 11:20:59 1992 Ian Lance Taylor (ian@cygnus.com) - - * tc-m68k.c, tc-m68kmote.c: the cas2 instruction is supposed to be - written with indirection on the last two operands, which can be - either data or address registers. Added a new operand type 'r' - which accepts either register type. Added '(' to notend stuff in - tc-m68kmote.c to accept (a0):(a2) in cas2 instruction. - -Wed Aug 19 09:25:09 1992 Ken Raeburn (raeburn@cygnus.com) - - * as.h (enum _relax_state): Start off at one, not zero, to better - catch uninitialized-variable errors. - (linkrelax): Declare new variable. - - * messages.c (warning_count, error_count): Default initializer is - sufficient. - - * write.c: Merged some declarations, using PARMS macro. - (text_frag_root, data_frag_root, bss_frag_root, text_last_frag, - data_last_frag): No longer static. - (write_object_file, case rs_align or rs_org): If HANDLE_ALIGN is - defined, call it. Change segments before calling fixup_segment. - (relax_align): If linkrelax, provide extra padding. - - * obj-bout.c (obj_emit_relocations): Emit alignment relocs despite - their not having symbols associated. - - * tc-i960.c (norelax, instrument_branches): Default initializer is - sufficient. - (linkrelax): Delete variable definition. - (mem_fmt): Call fix_new with NO_RELOC. - (tc_bout_fix_to_chars): Handle alignment relocs. - (i960_handle_align): New function. - * tc-i960.h (linkrelax): Delete declaration. - (HANDLE_ALIGN): New macro; calls i960_handle_align. - (NEED_FX_R_TYPE, NO_RELOC): New macros. - -Tue Aug 18 14:59:21 1992 Ken Raeburn (raeburn@cygnus.com) - - * config/sparc.mt: New file. Grab sparc opcode table from bfd - library. - -Tue Aug 18 14:16:38 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: always create installation directories. Removed - MINUS_G, set CFLAGS to default to -g, added FLAGS_TO_PASS, passed - FLAGS_TO_PASS to recursive makes. - - * doc/Makefile.in: always create installation directories. - -Mon Aug 17 15:09:56 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * input-scrub.c (input_scrub_pop, input_scrub_push): memcpy was - being used with args swapped, causing occasional lossage when - refilling buffers after an include file. - -Mon Aug 17 13:18:51 1992 Ken Raeburn (raeburn@cygnus.com) - - * messages.c (as_tsktsk): Use correct ANSI form for stdarg - version. Discard bogus DONTDEF version. - (as_warn, as_bad, as_fatal): Likewise. - -Fri Aug 14 18:31:14 1992 Ken Raeburn (raeburn@cygnus.com) - - * config/tc-m68k.c (m68k_ip): If instruction is invalid for the - selected architecture, print a message saying so and listing what - processors support it, rather than saying "operands mismatch". - -Thu Aug 13 13:53:19 1992 Ken Raeburn (raeburn@cygnus.com) - - * as.h [BROKEN_ASSERT]: If defined, turn off all assertion checks. - - * config/ho-rs6000.h (M_RS6000): Don't define it. - (free): Declare it. - (BROKEN_ASSERT): Define it if not __STDC__. - -Tue Aug 11 12:58:14 1992 Ken Raeburn (raeburn@cygnus.com) - - * sparc.mt: New file. - -Mon Aug 10 14:37:08 1992 Per Bothner (bothner@cygnus.com) - - * tc-m68k.c: ".align N" means align to N-byte boundary *only* - if TN_SUN3; otherwise align to 2**N-byte bounary. - -Thu Aug 6 12:10:39 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * read.c (s_fill): make the .fill size clamped error a warn and - fix bug where 0's were always placed. - - * config/tc-h8300.c: if a :8 is seen after an operand, fill top - two bytes of any constant with 0xff: - -Wed Aug 5 12:02:40 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * config/tc-m68k.c (md_pseudo_table): fix the .align thing - the right way; for just the 68k. Sun 3 .align is nbytes, not ptwo. - -Wed Aug 5 01:54:34 1992 John Gilmore (gnu at cygnus.com) - - * tc-m68k.c (try_index): Error if index scaling specified and - assembling for an older CPU than a 68020. - -Sat Aug 1 19:10:13 1992 Ken Raeburn (raeburn@cygnus.com) - - * config/tc-sparc.c (tc_aout_fix_to_chars): If pc-relative, take - fx_offset into account. - -Fri Jul 31 21:53:28 1992 Ken Raeburn (raeburn@cygnus.com) - - * configure.in (mips host): Accept "ultrix" with version number. - - * expr.c (floating_constant): Separate "=-" to avoid confusing - ancient or broken compilers. - - * config/tc-m68k.c (m68k_ip): Mismatch error could also indicate - processor/opcode mismatch, so reword the error message. - (md_assemble): If no CPU has been set (even if FPU/PMMU - characteristics have been), default to 68020. Don't need extra - quotes around error string. - -Fri Jul 31 12:26:34 1992 Jim Wilson (wilson@sphagnum.cygnus.com) - - * read.c (potable): Revert sac's incorrect change made Jul 13. - Align really is supposed to be ptwo not nbytes. - -Mon Jul 20 02:51:59 1992 D. V. Henkel-Wallace (gumby@cygnus.com) - - * Makefile.in: _Do_ include libiberty. (from sef) - -Fri Jul 17 15:15:28 1992 Ken Raeburn (raeburn@cygnus.com) - - * expr.c (integer_constant): Handle "0f" and "0b" label references - properly. - -Thu Jul 16 08:20:17 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * write.c (fixup_segment): if relaxing, don't do anything. - * config/obj-bout.[ch] : maintain the a_relaxable file header info - * config/tc-i960.c: new option -linkrelax - -Mon Jul 13 14:11:36 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * expr.c (expr): allow SEG_BSS in expressions - * read.c (potable): align should be nbytes, not ptwo! - * write.c (write_object_file): extra glue for new bss attributes - (relax_segment): SEG_BSS is ok now - * config/tc-m68k.c (m68k_ip_op): can now parse more @( modes - -Mon Jul 6 17:09:32 1992 Steve Chamberlain (sac@cygnus.com) - - * obj-coffbfd.c (fill_section): mark .lit sections as STYP_LIT - -Mon Jun 1 16:20:22 1992 Michael Tiemann (tiemann@cygnus.com) - - * configure.in: recognize m680x0 as having sun3 emulation mode for - vxworks environment. - - -Tue Jun 30 20:25:54 1992 D. V. Henkel-Wallace (gumby@cygnus.com) - - * Makefile.in: Add program_suffix (parallel to program_prefix) - -Wed Jun 24 10:57:54 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * app.c (process_escape): new function to handle escapes the right - way, (do_scrub_next_char): use new function - * cond.c (s_ifdef): do ifdef/ifndef right - * read.c (s_fill): make the , expressions optional like the doc - says - * config/tc-h8300.[ch]: better warnings - -Tue Jun 9 07:54:54 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * subsegs.c (subsegs_begin): create bss0_frchainP in the same was - as data0_frchainP - - * write.c (write_object_file): various changes to handle data in - the BSS segment in much the same was as stuff in the DATA segment. - - * tc-m68k.c (m68kip): Fix typo so that only arch's >=68020 do - pcrel data stuff. (md_estimate_size_before_relax): when relaxing a - 68010 bxx into a bra+6 jmpxx, put the bytes of the jmp opcode into - the right place. (s_bss): Don't put .bss stuff into SEG_DATA, put - it into SEG_BSS - -Thu Jun 4 11:59:13 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * expr.c(expr): allow SEG_REGISTER in expressions. - * read.c(pseudo_set): register expressions can be the source of a - set. - * subsegs.c (subseg_new): Now -R forces all changes to SEG_DATA to - goto SEG_TEXT (if a.out) - * write.c (write_object_file): If a.out don't use the old way for - -R. - * config/obj-a.out (s_sect): complain if the user tries to use a - subsegment with a value which might interfere with out -R hackery. - * config/tc-m68k.c (m68k_reg_parse): lookup names in symbol table - rather than use ugly if tree. (init_regtable): insert register - names into symbol table. - -Tue Jun 2 16:47:09 1992 Steve Chamberlain (sac@cygnus.com) - - * write.c (write_object_file): keep the fix_tail clean, which - fixes a bug in -R where relocations were being lost. - -Mon Jun 1 16:20:22 1992 Michael Tiemann (tiemann@cygnus.com) - - * configure.in: recognize m680x0 as having sun3 emulation mode for - vxworks environment. - -Sun May 31 05:33:00 1992 david d `zoo' zuhn (zoo@cygnus.com) - - * configure.in: recognize m680x0 as an m68k - -Thu May 28 11:22:02 1992 Jim Wilson (wilson@sphagnum.cygnus.com) - - * configure.in: Recognize sparclite as a sparc variant. - - * tc-sparc.c: Use new ARCHITECTURES_CONFLICT_P macro. Mention new - -Asparclite flag. - -Tue May 26 16:47:56 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * config/tc-a29k.c: lint - * listing.c, expr.c: patches from Andrew Smith - -Thu May 14 17:22:48 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * doc/Makefile.in: use m4 rather than gm4. - -Mon May 4 18:56:19 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * obj-coffbfd.c: use is a synonym for section, (do_relocs_for): - calc the base of relocs correctly. - * tc-a29k.c (parse_operand): allow expressions to be in any section. - -Mon Apr 27 13:13:31 1992 K. Richard Pixley (rich@cygnus.com) - - * as.c, write.c: use -K rather than -k for the broken word warning - option. - -Tue Apr 21 13:35:30 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in: do not print recursion lines. - -Wed Apr 15 21:19:31 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * Makefile.in: the tooldir copy of gas goes directly in tooldir. - -Tue Apr 14 14:50:22 1992 Ken Raeburn (Raeburn@Cygnus.COM) - - * write.c (write_object_file): For b.out format, round up section - start addresses to match required alignment. - -Thu Apr 9 05:45:29 1992 Ken Raeburn (Raeburn@Cygnus.COM) - - * Makefile.in (install): Install into $(tooldir)/bin, since that's - where gcc looks for it. - -Tue Apr 7 15:12:15 1992 Sean Eric Fagan (sef@cygnus.com) - - * Makefile.in: Changed some lines to be less confusing for some - makes. - - * input-file.c: Conditionalize on _IOFBF, not VMS. - - * read.c, write.c: Change a series of ifdef/elif to - ifdef/else/ifdef etc. - -Fri Mar 27 12:21:16 1992 K. Richard Pixley (rich@cygnus.com) - - * symbols.c (fb_label_init): fix sizeof to memset. - -Fri Mar 13 15:45:44 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in: install the man page. - - * Makefile.in: pass down MAKEINFO explicitly on info. - - * doc/Makefile.in: use $(MAKEINFO) not makeinfo. - -Fri Mar 13 08:03:03 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * flonum-const.c: renamed flonum-konst.c to stop dos name - conflict. - -Thu Mar 12 04:42:38 1992 K. Richard Pixley (rich@cygnus.com) - - * tc-m68k.h, te-sun3.h: moved LOCAL_LABELS_FB definition from - tc-m68k.h to te-sun3.h. - -Wed Mar 11 23:32:42 1992 K. Richard Pixley (rich@cygnus.com) - - * configure.in: vxworks68 gets te-sun3.h. - - * expr.c: remove limitation that local_labels_dollar or - local_labels_fb must be < 10. - - * symbols.c: remove local_labels_dollar, replace with a function - interface for a sparse array. All users adjusted. - - * te-sun3.h: add LOCAL_LABELS_DOLLAR. - -Sat Mar 7 00:06:25 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * doc/Makefile.in: commented out line for building as-all.texinfo. - This is temporary. - - * doc/as.texinfo, doc/as-all.texinfo: added menu item hooks. - -Fri Mar 6 21:57:18 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in: added check target. - -Tue Mar 3 15:45:56 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * Makefile.in: added tooldir and program_prefix. - -Sun Mar 1 04:43:19 1992 Michael Tiemann (tiemann@cygnus.com) - - * write.{c,h} (fix_new): Make these declarations consistent. - -Sat Feb 29 13:59:10 1992 Michael Tiemann (tiemann@cygnus.com) - - * Makefile.in (strerror.o): Add rule so that broken Sun make can - work in subdirs. - -Wed Feb 26 19:26:28 1992 Steve Chamberlain (sac at thepub.cygnus.com) - - * read.c, obj-coffbfd.c : fix h8300 specific bit rot - - * expr.c (operand): if can't work out what sort of operand it is, - then look through FLT_CHARS for a hint. - -Wed Feb 26 18:04:40 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in, configure.in: removed traces of namesubdir, - -subdirs, $(subdir), $(unsubdir), some rcs triggers. Forced - copyrights to '92, changed some from Cygnus to FSF. - - * doc/Makefile.in, doc/configure.in: removed traces of namesubdir, - -subdirs, $(subdir), $(unsubdir), some rcs triggers. Forced - copyrights to '92, changed some from Cygnus to FSF. - -Tue Feb 25 14:17:15 1992 Steve Chamberlain (sac at rtl.cygnus.com) - - * expr.c: If an expression is single comma, then return with - SEG_ABSENT rather than an error - since the sparc front end does - really strange things with things like fbge,a - - * as.h: include bfd.h if using many sections - * expr.c: LOCAL_LABELS_FB had been changed to lower case - so - local labels didn't work. - * listing.c (list_symbol_table): don't core dump when there's no - symbol there. - * write.c, write.h: call fix_new with the right number of args on - the H8. - * config/tc-h8300.[ch] : fix bugs reported by HMSI, and make - errors nices - -Sat Feb 22 12:26:28 1992 Steve Chamberlain (sac at rtl.cygnus.com) - - * app.c: MRI compatibility - allow single quote to start a string. - * as.c: fix typo recently introduced. - * as.h : Don't include aout/reloc.h - it's not right for COFF! - * expr.c: Much rewriting, to accomodate MRI syntax for - expressions. Also easier to read now. - * listing.c: Put back defuns - * read.c: modified to accept MRI syntax, put back listing pseudo - ops so that an assembler built with NO_LISTING ignores list ops - rather than pukes. - * write.c, write.h: fixs - only keep a reloc type in a fix if the target - machine is a SPARC or a 29K. - * config/obj-aout.c: added s_sect pseudo op - * config/obj-coffbfd.c: lints, set the filehdr flags right and - fill in the timestamp. - * config/obj-coffbfd.h: Since we don't include aout/reloc.h - anymore, define all the relocs which the tc- bit will use so we - can translate from them to the coff types. - * config/tc-a29k.c: reloc_type isn't ane enum any more - * config/tc-m68k.c: Added NO_RELOC definition. - -Fri Feb 21 06:21:07 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * Makefile.in: put header files before C source for TAGS; remove - references to non-existent syscalls.h. - - * read.c, write.c subsegs.c: back out the .bss changes. - - * obj-aout.c: do not include stab.gnu.h if NO_LISTING. - - * tc-i860.c, a.out.gnu.h: move i860 relocs to a proper place. - - * a.out.h: removed. - -Fri Feb 21 01:08:48 1992 Minh Tran-Le (TRANLE@INTELLICORP.COM) - - * symbols.c (local_label_name): symbols now start with ^A. - - * read.c, subsegs.c, write.c obj-coff.c: added handling of - `.bss` pseudo op for unitialized data. The new gcc (1.37.9x) - generate these sections. .align: will use NOP_OPCODE or 0 - for padding. This is just for being nice to the - disassembler. - - * expr.c (operand): changed to generate local label "\001L0" - starting with a ^A so that it is recognized as a local label. - - * as.c (perform_an_assembly_pass): zero bss_fix_root, too. - - * tc-i386.c: tc-i386.c: added handling of the following opcodes: - i/o opcodes - inb, inw, outb and outw. string manipulation with - att syntax - scmp, slod, smov, ssca, ssto. - - * obj-coff.c: (for aix386) Moved the symbols .text, .data and .bss - to just after .file . - - In obj_crawl_symbol_chain() where it tries to put the external - symbols apart, with the condition: - (!S_IS_DEFINED(symbolP) && - !S_IS_DEBUG(symbolP) && - !SF_GET_STATICS(symbolP)) - it was moving too many symbols out. So I switch it back to the - condition: - (S_GET_STORAGE_CLASS(symbolP) == C_EXT && !SF_GET_FUNCTION(symbolP)) - - In obj_emit_relocations() added the conditional on KEEP_RELOC_INFO - so that we don't use the F_RELFLG which make the linker complain - that somebody has stripped the relocation info. - - Also, the AIX ld program require that the relocation table - is sorted by r_vaddr like the standard ATT assembler does. - - [he also changed the sizeof(struct ...)'s into the coff - style FOOSZ macros. I'm not sure this is right, but I can't - remember why. xoxorich.] - -Fri Feb 21 01:08:48 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in, configure.in, doc: use the doc. Build it, install - it, clean it, etc. - -Tue Feb 18 02:21:25 1992 K. Richard Pixley (rich at cygnus.com) - - * read.c: white space and comments only. - - * configure.in: use the new atof-ns32.c for ns32k. - - * write.c: comment change only. - - * tc-m88k.[hc]: pulled in from hack's unfinished work. These - aren't yet integrated. - - * tc-i860.[hc]: blew off the dust. Something must still be done - about conflicting relocation types. - - * tc-ns32k.c: Replaced previous tc_aout_fix_to_chars stub with the - real thing. - - * tc-i960.c, tc-sparc.c: white space and comments only. - - * tc-a29k.h: delete duplicate macro definition. - - * new file atof-ns32k.c copied from hack's last unreleased gas. - -Mon Feb 17 07:51:06 1992 K. Richard Pixley (rich at cygnus.com) - - * config/tc-ns32k.c: actually make tc_aout_fix_to_chars work - rather than abort. - - * nearly everything. flush ChangeLog, package as gas-1.92.1. - ChangeLog's prior to this are sketchy at best. I have logs. - They just aren't ChangeLogs. diff --git a/gas/ChangeLog-9697 b/gas/ChangeLog-9697 deleted file mode 100644 index dd2af824556..00000000000 --- a/gas/ChangeLog-9697 +++ /dev/null @@ -1,5960 +0,0 @@ -Wed Dec 31 12:29:47 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (md_relax_table): Correct branch ranges. - -Mon Dec 22 13:06:05 1997 Joel Sherrill - - * configure.in (i386*-go32-rtems*): Fix to be the same as - i[3456]86-go32. - * configure: Rebuild. - -Mon Dec 22 12:54:07 1997 Ian Lance Taylor - - * config/tc-mips.c (macro): The 4650 doesn't permit M_LDC1_AB, - M_SDC1_AB, M_L_DOB, M_L_DAB, M_S_DAB, or M_S_DOB. - (mips_ip): Always check for FP_D, not just for instructions that - are not part of the regular ISA. - -Thu Dec 18 16:49:28 1997 Richard Henderson - - * config/tc-d10v.c (build_insn): Make `number' a long for 64-bit hosts. - -Thu Dec 18 16:42:57 1997 Richard Henderson - - * config/tc-alpha.c (cpu_types): 21164pc/pca56 does not have CIX. - -Wed Dec 17 21:23:07 1997 Jeffrey A Law (law@cygnus.com) - - * expr.c (integer_constant 32bit bignum): Mask off bits outside - the range we care about. - -Wed Dec 17 15:29:03 1997 Michael Meissner - - * config/tc-d30v.c (md_shortopts): Add 'n' and 'N' options. - (exec_type_enum): Enumeration giving all of the exec types. - (warn_nops): New static variable to give nop warning level. - ({cur,prev}_mul32_p): New static variable to keep track of whether - the current/previous instruction is a 32-bit multiply. - (Optimizing): Make static. - (NOP{2,_LEFT,_RIGHT}): Macros for word of nops and left/right - nops. - (d30v_insert_operand): Delete declaration of unused function. - (write_2_short): Make exec_type argument enum, not int. - (parallel_ok): Ditto. - (check_range): Delete unused variable(s). - (build_insn): Ditto. - (find_format): Ditto. - (md_apply_fix3): Ditto. - (md_show_usage): Document -n and -N. - (md_parse_option): Parse -n and -N. - (write_1_short): If -n, warn about adding a nop. Use - NOP_{LEFT,RIGHT}. - (write_2_short): Use enumeration values instead of hard coded - integers. Reset exec_type for default operations. For explicit - parallel operations, call parallel_ok to make sure everything is - ok. If writing out a parallel operation, and the previous - instruction was a 32-bit multiply, indicate current instruction - is. - (parallel_ok): Allow add/tx ... to be done in parallel with - another add/tx ... assuming the gpr registers don't overlap. - (md_assemble): Use exec type enumeration values, not hard coded - ints. Check for loads or 16-bit multiplies following in the next - cycle after a 32-bit multiply. Add nops if that is the case. - (do_assemble): Copy prev_mul32_p to cur_mul32_p, and set - cur_mul32_p if current instruction is a 32-bit multiply. - (find_format): Change spacing and layout. - -Tue Dec 16 16:55:45 1997 Fred Fish - - * config/tc-tic80.c (tic80_relax): New static variable. - (md_longopts): Add new OPTION_RELAX and OPTION_NO_RELAX options. - (md_parse_option): Handle new relax options. - (md_show_usage): Document new relax options. - (find_opcode): Don't use short forms of PC relative branches if - tic80_relax is set. - -Tue Dec 16 15:26:03 1997 Michael Meissner - - * config/tc-d30v.c (parallel_ok): Remove non-register bits from - used/set flag fields. Make flag vars unsigned long. Use - FLAG_A{0,1} for accumulators. Allow any 2 insns to be done in - parallel if they use the same conditional flag with reversed - meaning. Allow 2 add/sub insns that set the carry or overflow - flags but do not query them to be done in parallel. Don't allow 2 - word store operations to be done in parallel with ADDppp or - SUBppp. Don't allow loads to be done in parallel with 16 bit - multiplies. - -Tue Dec 16 09:20:43 1997 Nick Clifton - - * config/tc-arm.c: Prevent use of interworking support for - non-COFF targets. - -Mon Dec 15 15:20:32 1997 Nick Clifton - - * doc/all.texi: Add M32R cpu. - - * doc/as.texinfo: Add documentation of m32r processor. - - * doc/c-m32r.texi: New file, documenting m32r specific features. - - -Mon Dec 15 10:32:28 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mips.c (mips_ip): Correctly insert 'P' operands into - the instruction. - -Fri Dec 12 11:44:20 1997 Fred Fish - - * config/tc-tic80.c (build_insn): Handle instructions that have - long (32 bit) PC relative offsets. Fix places that previously - misused R_MPPCR for 15 bit offsets to use the new R_MPPCR15W type. - (md_apply_fix): Add case to handle long PC relative offsets. - -Fri Dec 12 10:35:01 1997 Nick Clifton - - * doc/c-arm.texi (ARM Options): Document support for new ARM - processor names. - - * config/tc-arm.c (md_parse_option): Add support for new ARM - processor names. - -Thu Dec 11 17:46:50 1997 Richard Henderson - - * config/tc-m68k.c (m68k_ip): Don't overwrite opcode table data. - (insop, m68k_ip): Make `opcode' const so it doesn't happen again. - -Fri Dec 5 11:23:59 1997 Nick Clifton - - * config/tc-v850.c (md_assemble): Fix BFD_RELOC_32 against a - symbol + offset. - - * config/tc-v850.h (ELF_TC_SPECIAL_SECTIONS): Use - SHT_V850_{S|T|Z}COMMON to mark special common sections. - -Tue Dec 2 17:05:13 1997 Nick Clifton - - * config/tc-v850.c: Brought up to date with the branch. - -Mon Dec 1 20:24:18 1997 J"orn Rennecke - - * config/tc-sh.c (SWITCH_TABLE_CONS): Handle (fix)->fx_size == 1. - (SWITCH_TABLE): Handle BFD_RELOC_8. - (md_apply_fix): #ifndef BFD_ASSEMBLER code: Handle fixP->fx_size == 1. - (coff_reloc_map): Add BFD_RELOC_8_PCREL entry. - (sh_coff_reloc_mangle): SWITCH_TABLE case: Handle BFD_RELOC_8. - -Sat Nov 22 16:19:22 1997 Richard Henderson - - * tc-alpha.c (range_signed_16, range_signed_32): Work around an - apparent bug in gcc's long long support crossing from x86. - -Sat Nov 22 14:26:09 1997 Nick Clifton - - * config/tc-arm.c: Brought up to date with latest changes on arm - branch. - -Sat Nov 22 15:50:09 1997 Klaus Kaempf - - * config-gas.com: Get version info from configure.in. - - * makefile.vms: include depend.obj in OBJS. - - * config/tc-alpha.c (s_alpha_section): Remove ".lcomm" handling. - - * config/tc-alpha.c (alpha_basereg_clobbered): Remove variable and - all corresponding code. - -Thu Nov 20 15:06:08 1997 Richard Earnshaw - - * config/tc-arm.h (TARGET_FORMAT for generic a.out targets): Allow - run-time endian selection. - -Wed Nov 19 17:44:42 1997 Richard Henderson - - * tc-sh.c (parse_reg): Properly quote for fv4. - -Wed Nov 19 23:46:18 1997 Ian Lance Taylor - - * symbols.c (resolve_symbol_value): Add missing breaks in case on - symbol value operator. - -Tue Nov 18 18:45:14 1997 J"orn Rennecke - - * config/tc-d10v.c (parallel_ok, find_opcode): - Split OPERAND_FLAG into OPERAND_FFLAG and OPERAND_CFLAG. - -Sun Nov 16 10:05:07 1997 Fred Fish - - * config/obj-coff.c (fixup_segment): Cast second arg of - md_apply_fix3 call to type "valueT *". - -Thu Nov 13 13:53:10 1997 Andrew Cagney - - * configure.in (emulations): Make FreeBSD an aout / i386bsd - variant. - * configure: Re-generate. - -Thu Nov 13 11:07:14 1997 Gavin Koch - - * config/tc-mips.c (macro_build): Use the membership field - for INSN_MACRO's. - (mips_ip): Same. - -Thu Nov 13 02:04:55 1997 J"orn Rennecke - - * config/tc-d10v.c (find_opcode): For OPCODE_FAKE, add check for - first argument if it's supposed to be a register. - -Tue Nov 11 19:25:05 1997 J"orn Rennecke - - * app.c (do_scrub_chars): If d10v, re-insert a space before - a '#' when in state 10. - -Tue Nov 11 13:33:15 1997 Ian Lance Taylor - - * config/tc-h8300.c: Include "subsegs.h". - (tc_reloc_mangle): Handle references to symbols which are not - being output, so that references to `.' work. - -Mon Nov 10 13:43:33 1997 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Call add_fix when needed for '_' - case. - - * macro.c (sub_actual): If we don't find a parameter for an &, - just substitute &. - -Fri Nov 7 21:29:32 1997 Ken Raeburn - - * config/tc-mips.c (mips_ip): In default case, call as_bad - instead of fprintf, to get "assembler messages:" message output - before instead of after. - -Fri Nov 7 10:36:22 1997 Doug Evans - - * frags.h: Handle multiple inclusion. - -Wed Nov 5 10:51:49 1997 Doug Evans - - Based on a patch from Ian.Dall@dsto.defence.gov.au. - * as.h (struct frag, frag support): Moved from here. - * frags.h: To here. - (struct frag, member tc_frag_data): New member if TC_FRAG_TYPE - is defined. - (struct frag, member fr_cgen): Renamed from fr_targ.cgen. - * cgen.c (cgen_asm_finish_insn): Update. - * config/tc-m32r.c (md_estimate_size_before_relax): Update. - * config/tc-m32r.h (TC_FRAG_INIT): Renamed from md_init_frag. - (md_convert_frag): Ditto. - * config/tc-ns32k.h (TC_FRAG_TYPE): Define. - (frag_opcode_frag,frag_opcode_offset,frag_bsr): Update. - (TC_FRAG_INIT): Update. - -Tue Nov 4 16:35:57 1997 Ian Dall - - * write.c (print_fixup): Use TC_FIX_DATA_PRINT (if defined) to - print out MD fields of fix. - * frags.c (frag_var, frag_variant): Use TC_FRAG_INIT macro (if - defined) to initialize MD fields in frag. - * as.h (struct frag, ns32k support): Rename ns32k to fr_ns32k. - Delete pcrel_adjust. Add fr_opcode_fragP, fr_opcode_offset. - * config/tc-ns32k.h: Add comments. Remove obsolete - BFD_FAST_SECTION_FILL definition, change prototypes for - fix_new_ns32k and fix_new_ns32k_exp to add new arguments - opcode_frag and opcode_offset and remove pcrel_adjust. - (TC_FIX_TYPE): add opcode_fragP and opcode_offset fields. - (TC_FIX_DATA_PRINT): new macro to print out TC_FIX_TYPE. - (TC_FRAG_INIT): new macro to initialize machine dependent field in - frags. - (frag_opcode_frag, frag_opcode_offset, frag_bsr): macros to access - MD fields in frag structure. - (fix_im_disp, fix_bit_fixP, fix_opcode_frag, fix_opcode_offset, - fix_bsr): macros to access MD fields in fix structure. - * config/tc-ns32k.c: Avoid overlength lines. Align comments. Don't - use struct opcode_location as these fields are now in the frag - structure. - (convert_iif): Call frag_more as it is needed instead - of trying to allocate for the whole insn. Avoid call of frag_more - with negative argument. - (md_pcrel_adjust, md_fix_pcrel_adjust, md_apply_fix, - md_estimate_size_before_relax, md_pcrel_from, - tc_aout_fix_to_chars): use accessor macros to get md fields in fix - and frag structures. - (fix_new_ns32k, fix_new_ns32k_exp): add new arguments opcode_frag and - opcode_offset and remove pcrel_adjust. - (convert_iif, cons_fix_new_ns32k): call fix_new_ns32k, - fix_new_ns32k_exp with changed arguments. - -Mon Nov 3 13:30:17 1997 Gavin Koch - - * tc-mips.c (md_begin): Reorganize setting of default values so - that mips_cpu depends on TARGET_CPU, and mips_opts.isa depends on - mips_cpu. - (md_parse_option): Remove all code that sets defaults; md_begin - handles all of this now. - -Sun Nov 2 14:46:09 1997 Ian Lance Taylor - - * Makefile.am (STAGESTUFF): Change bin_PROGRAMS to - noinst_PROGRAMS. - (bootstrap, bootstrap2, bootstrap3): Likewise. - * Makefile.in: Rebuild. - - * config/tc-ppc.c (ppc_fix_adjustable): Don't adjust relocs in the - TOC section to be against the csect. - -Fri Oct 31 18:19:55 1997 Ken Raeburn - - * config/tc-mips.c (validate_mips_insn): New function, checks - match versus mask bits, and also verifies that all bits to be - output are actually specified somewhere. - (md_begin): Call it for 32-bit instructions, instead of doing - match/mask check here. In case of failure, print a message, but - check the rest of the opcode table before exiting. - -Thu Oct 30 13:46:20 1997 Nick Clifton - - * config/tc-arm.c (md_apply_fix3): Fix thumb ADR pseudo op. Patch - from Tony Thompson at ARM: athompso@arm.com - -Thu Oct 30 11:11:26 1997 Michael Meissner - - * config/tc-d30v.c (build_insn): Allow odd registers for ld2w and - friends. - -Fri Oct 24 15:56:47 1997 Ian Lance Taylor - - * config/tc-ppc.c (md_assemble): When handling @l, always sign - extend if the operand expects a signed value. - - * config/tc-mips.h (LOCAL_LABELS_DOLLAR): Don't define; use - default which is to permit dollar labels. - -Fri Oct 24 11:19:22 1997 Jakub Jelinek - - * config/tc-sparc.c (sparc_memory_model): New variable. - (md_longopts): Add -TSO/-PSO/-RMO options. - (md_parse_options): Handle them. - (sparc_elf_final_processing): For 64 ELF, set required - memory ordering in e_flags. Default to RMO and let the user - override it through command line. - - * config/tc-sparc.h (elf_tc_final_processing): Add. - -Wed Oct 22 17:42:12 1997 Richard Henderson - - * config/tc-sparc.c (v9a_asr_table): New variable. - (sparc_ip): Handle v9a asr's. - Patch from David Miller . - -Wed Oct 22 17:22:59 1997 Richard Henderson - - * config/tc-sparc.h (md_do_align): New macro. - * config/tc-sparc.c (sparc_handle_align): Handle rs_align_code. - Patch from Jakub Jelinek . - -Wed Oct 22 12:51:18 1997 Ian Lance Taylor - - * config/tc-sh.c (sh_small): New variable. - (OPTION_SMALL): Define. - (md_longopts): Add "small". - (md_parse_option): Handle OPTION_SMALL. - (md_show_usage): Mention -small. - * config/tc-sh.h (sh_small): Declare. - (SUB_SEGMENT_ALIGN): Handle sh_small. - * config/obj-coff.h (TARGET_FORMAT): Check sh_small in TC_SH - case. - - * config/tc-mips.c (macro): Correct handling of constant in M_LI_D - case in little endian mode. - -Tue Oct 21 10:20:11 1997 Doug Evans - - * config/tc-sparc.c (md_apply_fix3, cases ..._H44, ..._HIX22): Leave - overflow signalling to linker. - -Mon Oct 20 14:54:06 1997 Klaus K"ampf - - * makefile.vms: Fix for dec c. - - * config-gas.com: Give explanation for dec c setup in error - message. - - * config/tc-alpha.c (s_alpha_comm): Make .comm symbols separate - sections on openvms/alpha. - - * config/obj-evax.c: support .weak pseudo-op - -Mon Oct 20 10:13:32 1997 Doug Evans - - * config/tc-sparc.c (default_arch_size): New static local. - (struct sparc_arch): Rename arch_size to default_arch_size. - New member user_option_p. - (sparc_arch_table): Always include v9, v9a. New entry v9-64. - (init_default_arch): Check whether default arch is valid. - Set default_arch_size in addition to sparc_arch_size. - (OPTION_32,OPTION_64): Define. - (md_longopts): New entries for -32, -64. - (md_parse_option): Handle them. - (md_show_usage): Print them. Ensure init_default_arch called. - * configure.in (sparc64): Set arch to v9-64. - * configure: Regenerated. - -Sun Oct 19 13:50:50 1997 Ian Lance Taylor - - * write.c (subsegs_finish): New function, broken out of - write_object_file. - (write_object_file): Some code moves into subsegs_finish. - * write.c (subsegs_finish): Declare. - * as.c (main): Call subsegs_finish. - - * read.c (s_include): Check for error return from - demand_copy_string. - -Tue Oct 14 20:50:58 1997 Richard Henderson - - * read.c (get_line_sb): Accept any eol marker while scanning macros. - -Tue Oct 14 19:12:45 1997 Richard Henderson - - * config/tc-alpha.h (DIFF_EXPR_OK): Define. - * config/tc-i386.h (DIFF_EXPR_OK): Define. - * config/tc-alpha.c (md_apply_fix): Notice fx_pcrel and substitute - the correct relocation when it exists. - * config/tc-i386.c (md_apply_fix3): Likewise. - - * config/tc-ppc.h: Correct typo in comment. - * config/tc-v850.h: Likewise. - -Fri Oct 10 16:09:35 1997 Andrew Cagney - - * config/tc-d10v.c (parallel_ok): Allow parallel instruction issue - when second instruction is writing to first instructions inputs. - -Mon Oct 13 15:27:17 1997 Richard Henderson - - * ecoff.c (PAGE_SIZE): Double to 8k as a hack to allow some C++ - templated programs to build with -g. - -Fri Oct 10 17:48:29 1997 Nick Clifton - - * config/tc-v850.c (md_relax_table): Add support for relaxing - unconditional branches. This patch is courtesy of Jim Wilson. - (md_convert_frag): Fix relaxing of branches. This patch is - courtesy of Jim Wilson. - (md_assemble): Create different fixups for conditional and - unconditional branches. This patch is courtesy of Jim Wilson. - (md_estimate_size_before_relax): Estimate size of variable part of - fixup based on whether it is for a conditional or an unconditional - branch. This patch is courtesy of Jim Wilson. - (v850_sdata, v850_tdata, v850_zdata, v850_sbss, v850_tbss, - v850_zbss, v850_rosdata, v850_rozdata, v850_bss): Add call to - obj_elf_section_change_hook(). - (v850_comm): New function. - (md_pseudo_table): Add new pseudo ops .zcomm, .scomm and .tcomm. - (md_begin): Add bss flag to seg_info of bss sections. - - Add support for .scommon, .tcommon and .zcommon sections. - - * config/tc-v850.h (ELF_TC_SPECIAL_SECTIONS): Add .scommon, - .zcommon, .tbss, .call_table_data and .call_table_text. - -Fri Oct 10 15:01:14 1997 Doug Evans - - * configure.in (sparc): Set DEFAULT_ARCH from correct target. - * configure: Regenerated. - -Fri Oct 10 11:22:45 1997 Martin M. Hunt - - * config/tc-d10v.c: Fixes to make sure the AT_WORD - expression is not confused with -1. - -Fri Oct 10 11:54:50 1997 Andrew Cagney - - * config/tc-d10v.c (parallel_ok): Flag SP as modified for @-sp - operand - OPERAND_ATMINUS. - -Fri Oct 10 00:47:44 1997 Michael Meissner - - * config/tc-d10v.c (parallel_ok): Note that auto increment and - decrement modify the index register. - -Thu Oct 9 15:17:50 1997 Ian Lance Taylor - - From Robin Kirkham : - * config/tc-m68k.c (archs): Add 68306, 68307, 68322, 68356, 68334, - 68336, 68341, 68349. - * doc/c-m68k.texi (M68K-Opts): Add -m68ec000 -m68hc000 -m68hc001 - -m68306, -m68307, -m68322, -m68356, -m68ec020, -m68ec030, - -m68ec040, -m68ec060, -m68330, -m68334, -m68336, -m68341, - -m68349. - - * doc/Makefile.am (CPU_DOCS): Define. - (as.info): Depend upon $(CPU_DOCS). - * doc/Makefile.in: Rebuild. - - * configure.in: Remove AM_PROG_INSTALL; it's called by - AM_INIT_AUTOMAKE. - * configure: Rebuild. - -Thu Oct 9 01:44:36 1997 J"orn Rennecke - - * tc-d10v.h (TC_START_LABEL): Don't define. - (tc_frob_label): Define. - -Thu Oct 9 00:07:23 1997 J"orn Rennecke - - * config/tc-d10v.c (write_2_short): Fix bug that wouldn't allow - to pair a branch and link with anything but an exe instruction. - -Wed Oct 8 16:28:53 1997 Richard Henderson - - * config/tc-alpha.c (load_expression): Disable the sym+const .got - optimization to reduce the alignment surprises for gcc. - -Wed Oct 8 16:11:15 1997 Doug Evans - - * config/obj-coff.h (TC_SPARC): Don't define TARGET_FORMAT. - * config/tc-sparc.c (sparc_target_format): Handle coff here. - (sparc_ip): Add %hix,%lox. - (md_apply_fix3): Call as_bad_where, not as_bad. - Add support for BFD_RELOC_SPARC_{HIX22,LOX10}. - (tc_gen_reloc): Add support for BFD_RELOC_SPARC_{HIX22,LOX10}. - -Wed Oct 8 12:33:32 1997 Richard Henderson - - * configure.in: Change alpha-*-* to alpha*-*-*; config.guess now - recognizes alphaev5 etc. - * configure: Rebuild. - -Wed Oct 8 00:04:05 1997 Gavin Koch - - * config/tc-mips.c (md_begin): Replace the TARGET_CPU value - of mipsr3900 with mipstx39. - - * config/tc-mips.c (mips_ip): Don't print the 'opcode requires - -mipsXX message' if the insn isn't an ISA insn. - -Tue Oct 7 12:48:30 1997 Doug Evans - - * config/tc-sparc.h (TARGET_FORMAT support): Moved to tc-sparc.c. - Redefine TARGET_FORMAT to call sparc_target_format. - * config/tc-sparc.c (in_unsigned_range): New function. - (sparc_arch_size): Make static. - (sparc_target_format): New function. - (sparc_ip): Delete variable immediate_max. Rewrite %hi/etc reloc - handling. Add support for %hh,%hm,%lm,%h44,%m44,%l44. - (output_insn): Set `fx_no_overflow'. - (md_apply_fix3): Handle BFD_RELOC_SPARC_{7,H44,M44,L44}. - (tc_gen_reloc): Likewise. - -Mon Oct 6 14:04:50 1997 Nick Clifton - - * config/tc-v850.c (v850_section): Remove. - - * config/obj-elf.c (obj_elf_section): Enhance error message. - -Fri Oct 3 15:40:38 1997 Ian Lance Taylor - - * config/tc-mips.c: Undef OBJ_COPY_SYMBOL_ATTRIBUTES before - including obj-elf.h in OBJ_MAYBE_ELF case. - (mips_target_format): Return NULL after abort to avoid warning. - - * ecoff.c (generate_ecoff_stab): Remove unused static function. - - * expr.c (operator): Accept ==. From Anders Blomdell - . - - * config/atof-ieee.c (gen_to_words): When generating a denormal - number, handle an overflow into the smallest normalized number. - -Mon Sep 29 15:24:52 1997 J"orn Rennecke - - * as.h, input-scrub.c (new_logical_line): New return value. - * read.c (s_app_file): Don't note the same file several times - in a row. - -Thu Sep 25 13:08:02 1997 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Remove ` operand specifier. - -Wed Sep 24 16:54:40 1997 Joel Sherrill - - * configure.in (sh*-*-rtems*): New target, like sh-*-elf*. - * configure: Rebuild. - -Wed Sep 24 11:30:25 1997 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Handle q and v operand specifiers. - - * doc/c-i386.texi (i386-Float): Remove incorrect assertion that - fn* instructions do not insert implicit fwait. This was changed - Jan 29, 1996. - - * config/m68k-parse.y (yylex): Permit an expression to be used for - the scale factor. - - * Makefile.am (EXTRA_as_new_SOURCES): Set to config/m68k-parse.y, - not m68k-parse.y. - * Makefile.in: Rebuild. - - * aclocal.m4: Rebuild with new libtool. - * configure: Rebuild. - -Tue Sep 23 17:48:09 1997 Ian Lance Taylor - - * app.c (do_scrub_chars): Clear mri_state at end of .mri - pseudo-op. - - * config/tc-mips.c (hilo_interlocks): Change from a static - variable to a macro, so that it varies with the variables upon - which it depends. - (gpr_interlocks, cop_interlocks): Likewise. - (md_begin): Don't initialize them. - -Fri Sep 19 17:08:41 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_assemble): Use strcasecomp instead - of strcmp where appropriate. - -Thu Sep 18 14:11:56 1997 Nick Clifton - - * config/tc-v850.c (md_assemble): Cope with a zero data area - relocation with a constant offset. - (md_assemble): Produce error message when special data area - relocations are used on instructions which do not support them. - (md_assemble): Reset processor mask if defined by command line - switch. - -Thu Sep 18 11:24:01 1997 Doug Evans - - * config/tc-sparc.c: Reorganize file. - (parse_keyword_arg): Allow numbers in reg names. - (SPECIAL_CASE_NONE): New macro. - (md_assemble): Use it. - (lookup_arch,init_default_arch): New functions. - (default_arch,default_init_p,sparc_arch_table): New static locals. - (sparc_arch_size): New static local. - (max_architecture): Initialize in init_default_arch. - (md_parse_options): Call init_default_arch if necessary. - Rewrite -xarch/-A processing. - (md_show_usage): Print -A values from sparc_arch_table. - (md_begin): Call init_default_arch if necessary. - (sparc_md_end): Handle both 32 and 64 bit environments. - * config/tc-sparc.h (TARGET_FORMAT): Likewise. - * acconfig.h (SPARC_V9,SPARC_ARCH64): Delete. - (DEFAULT_ARCH): Add. - * config.in: Regenerate. - * configure.in (sparc): Default DEFAULT_ARCH based on target cpu. - (SPARC_V9,SPARC_ARCH64): Delete. - * configure: Regenerate. - * config/vms-conf.h (SPARC_V9,SPARC_ARCH64): Delete. - -Wed Sep 17 16:54:20 1997 Nick Clifton - - * config/tc-v850.c (v850_reloc_prefix): Recoded to use CHECK_ () - macro. - (handle_tdaoff, handle_zdaoff, handle_sdaoff): New functions. - - * config/tc-v850.c (md_assemble): Corrected typo. - * config/tc-v850.c Add new sections: call_table_data and - call_table_text. - (v850_reloc_prefix): Add support for ctoff() relocation prefix. - (handle_ctoff): New Function. - - * doc/c-v850.texi (V850 Opcodes): Document call table relocations. - -Tue Sep 16 14:18:22 1997 Nick Clifton - - * config/tc-v850.c (v850_reloc_prefix): Add support for a 16 bit - displacement from the tiny data area pointer. - -Mon Sep 15 21:28:09 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (fix_new_hppa): Make declaration match - definition. - -Mon Sep 15 18:33:06 1997 Nick Clifton - - * config/tc-v850.c (processor_mask): New variable. - (set_machine, md_parse_option): Set processor_mask. - (md_assemble): Check that instruction is available to target - processor. - - * config/tc-v850.h (TARGET_PROCESSOR): New constant. - -Mon Sep 15 11:28:04 1997 Ken Raeburn - - Merge in work from Martin Hunt: - - * config/tc-d30v.c (build_insn): For mvfsys and mvtsys, - CR is 0 for PSWL and PSWH. - - * config/tc-d30v.c (do_assemble): Don't accept - illegal condition codes for cmpu instruction. - - * config/tc-d30v.c: Add support for BFD_RELOC_D30V_9_PCREL - used in d*i instructions. - - * config/tc-d30v.c (check_size): New function. Check - relocations for overflows. - (md_pcrel_from_section): Fix relocations between sections. - (md_apply_fix3): Use new relocation types for 15 and 21 - bit relocations in the right container. Needed because - the address of the instruction is not eight-byte aligned - but the relocations must be. - - * config/tc-d30v.c (md_apply_fix3): Check for overflow. - (find_format): If ".s" or ".l" are used, don't try - to compute branch sizes. - - * config/tc-d30v.c (do_assemble): Check for ".s" or - ".l" extensions to opcode names. - (find_format): Generate the correct instructions when - ".s" or ".l" are used. - - * config/tc-d30v.c (build_insn): Check for odd registers - on instructions that require even registers. - - * config/tc-d30v.h (md_start_line_hook): Define. - * config/tc-d30v.c (md_start_line_hook): New hook. - Checks the beginning of each line for a ".". If it - finds one, assume a pseudo-op and flush any unwritten - instructions. - - * config/tc-d30v.c (md_apply_fix3): Fix problem - with determining when fixups were done. - - * config/tc-d30v.c (build_insn): Fix bug where the numeric - part of a symbol (for example, "foo+8") was being written - into the instruction. - (md_pseudo_table): Change .word to be 32 bits and add - .hword as 16 bits. - - * config/tc-d30v.c (parallel_ok): Check to see if first - instruction is a jump. - - * config/tc-d30v.c (parallel_ok): Major code reorganization. - -Wed Sep 10 10:07:08 1997 Nick Clifton - - * config/tc-v850.c (md_assemble): Corrected spelling mistake. - * configure.in (emulations): Add v850 emulation. - -Tue Sep 9 17:14:33 1997 Doug Evans - - * Makefile.am (CPU_TYPES): Add arc. - (TARGET_CPU_CFILES): Add tc-arc.c. - (TARGET_CPU_HFILES): Add tc-arc.h. - (dependencies): Rebuild. - * Makefile.in: Rebuild. - * configure.in: Recognize arc-*-elf*. - * configure: Regenerated. - * config/tc-arc.[ch]: New files. - -Tue Sep 9 10:19:37 1997 Nick Clifton - - * doc/c-v850.texi (V850 Opcodes): Document hi0() reloc prefix. - Correct description of hi() reloc prefix. - - * doc/c-v850.texi (V850 Opcodes): Document new reloc prefix. - * config/tc-v850.c (v850_reloc_prefix): Add hilo() reloc prefix. - * config/tc-v850.c (md_assemble): Add support for BFD_RELOC_32. - - * doc/c-v850.texi: Document new pseudo ops and command line - options. - - * config/tc-v850.c (set_machine): New function. - * config/tc-v850.c (.v850): New pseudo op. - * config/tc-v850.c (.v850e): New pseudo op. - * config/tc-v850.c (.v850ea): New pseudo op. - - -Mon Sep 8 23:08:04 1997 Ian Lance Taylor - - Support -alh and -ald for DWARF 1: - * listing.c (struct list_info_struct): Add debugging field. - (listing_newline): Initialize the debugging field. If ELF, if the - section starts with .debug or .line, set the debugging field in - the listing structure. - (debugging_pseudo): Add list parameter. Change all callers. If - the debugging field is set, consider it to be a debugging pseudo. - If ELF, skip blank lines between debugging lines. - * read.c (emit_expr): If ELF, look for line numbers. - (stringer): If ELF, look for file names. - -Mon Sep 8 12:33:40 1997 Nick Clifton - - * config/tc-v850.c (v850_insert_operand): Only test for overflow - if there is no insert function. - - * config/tc-v850.h (TARGET_MACHINE): New constant. - - * config/tc-v850.c (v850_insert_operand): Add - -mwarn_unsigned_overflow. - (md_begin): Set BFD machine number based on machine variable. - (md_parse_option): Add -mv850, -mv850e and -mv850ea options. - -Mon Sep 8 11:20:46 1997 Ian Lance Taylor - - * as.h: Don't declare alloca if it is a macro. - * macro.c: Likewise. - -Sun Sep 7 00:30:19 1997 Richard Henderson - - * config/tc-alpha.c (md_parse_option): Move m[] out to top level and - rename to cpu_types[]. - (s_alpha_arch): New function. - (md_pseudo_table): Add "arch". - - * config/tc-alpha.c (md_begin): Merge the two loops through the - opcode table. - (s_alpha_proc): Add initial SKIP_WHITESPACE. - (s_alpha_set): Likewise. Use get_symbol_end instead local while loop. - -Sat Sep 6 19:38:12 1997 Fred Fish - - * read.h (s_lcomm_bytes): Add prototype (for real this time). - -Thu Sep 4 12:10:01 1997 Ian Lance Taylor - - * config/obj-elf.c (elf_frob_symbol): Only set BSF_OBJECT for - symbols on Irix. - -Wed Sep 3 11:21:33 1997 Nick Clifton - - * config/tc-v850.c: Remove BFD_RELOC_V850_16_PCREL. - -Tue Sep 2 18:32:30 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (md_convert_frag): PC relative instructions arex - relative to the next instruction, not the current instruction. - (md_assemble): Similarly. - -Tue Sep 2 15:58:52 1997 Nick Clifton - - * doc/c-v850.texi: Explanations of offsets in SDA/ZDA areas - correcetd. - - * config/tc-v850.c: Add support for SDA/TDA/ZDA sections. - (v850_reloc_prefix): Duplicate code eliminated. Add code to - recognise special instructions. - (md_assemble): Calculation of the size of a fixups corrected. - - * config/tc-v850.h (ELF_TC_SPECIAL_SECTIONS): Add SDA/TDA/ZDA - sections. - -Tue Sep 2 15:40:56 1997 Andrew Cagney - - * config/tc-v850.c (md_assemble): Use opcode->name instead of - opcode->opcode as the sentinal. Zero is a valid opcode. - -Tue Aug 26 16:51:14 1997 Ian Lance Taylor - - * doc/as.texinfo (Machine Dependencies): Add v850 to menu. - * doc/c-v850.texi: Change node name to match other chapter nodes. - -Tue Aug 26 09:46:22 1997 Nick Clifton - - * doc/c-v850.texi (V850 Opcodes): Correct name for tiny data area - pointer. - -Tue Aug 26 12:23:25 1997 Ian Lance Taylor - - * expr.c (integer_constant): If BFD64, don't make a bignum if the - number will fit in 64 bits. - - * config/tc-alpha.c (load_expression): Check explicitly for O_big, - rather than calling abort. - - * as.h: Don't define alloca if __GNUC__. Just declare it. - * macro.c: Copy alloca handling from as.h. - - * config/tc-i386.c (i386_align_code): Correct 16 bit noops. From - Gabriel Paubert . - - * config/tc-i386.c (md_assemble): In JumpByte case, when looking - for a WORD_PREFIX_OPCODE, change it to ADDR_PREFIX_OPCODE if this - is jcxz or a loop instruction. - -Mon Aug 25 16:04:14 1997 Nick Clifton - - * config/tc-v850.c (pre_defined_registers): Add 'hp' as alias for - r2. - (md_begin): Set up machine architecture and type. - -Mon Aug 25 14:25:48 1997 Ian Lance Taylor - - * symbols.c (resolve_symbol_value): Store the value back into the - symbol expression, to handle add or subtract simplification - correctly. Handle O_symbol_rva. Add default case. - - * config/tc-ppc.c (ppc_change_csect): Temporarily lower the - chunksize while creating the new subsection. - * as.c (chunksize): Initialize to zero. - * subsegs.c (subseg_set_rest): Change 5000 to chunksize when - calling obstack_begin. - -Mon Aug 25 11:21:48 1997 Nick Clifton - - * config/tc-v850.c (md_assemble): Restore input_line_pointer upon - exit. - - * config/tc-v850.c (parse_register_list): Support constant - expressions as register lists. - -Mon Aug 25 10:19:34 1997 Nick Clifton - - * doc/c-v850.texi: Change the major node to v850 Machine - Dependencies. - -Fri Aug 22 11:16:14 1997 Nick Clifton - - * doc/as.texinfo: Add inclusion of c-v850.texi - - * doc/c-v850.texi: New file. - - * read.c (is_end_of_line): Make NUL character be considered to be - a line terminator. - -Fri Aug 22 10:45:33 1997 Nick Clifton - - * config/tc-v850.c (parse_register_list): Add support for curly - brace syntax. - (cc_names): Add "e" and "ne" conditions. - -Thu Aug 21 11:00:36 1997 Nick Clifton - - * app.c (do_scrub_chars): Support a double dash as starting a - comment that extends to end of line. - -Thu Aug 21 10:54:27 1997 Nick Clifton - - * config/tc-v850.c (v850_section, v850_bss, v850_offset): New - functions. - (md_pseudo_table): New pseudo ops: .bss, .offset, .section - -Thu Aug 21 00:59:53 1997 Doug Evans - - * config/tc-m32r.c (md_estimate_size_before_relax): Update recorded - insn when changing to a different instruction. - -Wed Aug 20 00:45:20 1997 J"orn Rennecke - - * tc-sh.c (parse_reg, get_specific, build_Mytes): Add SH4 - floating point extensions. - (parse_reg): parse sgr and dbr. - -Tue Aug 19 17:07:34 1997 Nick Clifton - - * config/tc-v850.c (system_register_name): Support numbers for - system register IDs. - -Tue Aug 19 08:59:12 1997 Fred Fish - - * read.c (s_lcomm_internal): Renamed from s_lcomm, added arg to - flag when alignment is in bytes instead of power of 2, and code to - use that flag to convert alignment to bytes. - (s_lcomm, s_lcomm_bytes): New helpers that call s_lcomm_internal. - * read.h (s_lcomm_bytes): Add prototype. - * config/obj-coff.c (write_object_file): If ALIGNMENT_IN_S_FLAGS is - defined, write alignment to alignment bits in section header s_flags - rather than the s_align field. - * config/obj-coff.h (ALIGNMENT_IN_S_FLAGS): Define for TC_TIC80. - * config/tc-tic80.c (md_pseudo_table): Use s_lcomm_bytes for bss - pseudo, instead of s_lcomm which wants a power of two for alignment. - -Mon Aug 18 20:42:23 1997 Richard Henderson - - * macro.c (check_macro): use alloca instead of xmalloc to plug leak. - -Mon Aug 18 20:33:06 1997 Richard Henderson - - * as.c (show_usage): Add -am. - * input-scrub.c (input_scrub_include_sb): Don't add leading \n - if we've already got one. - * listing.c (struct list_info_struct): Add line_contents. - (listing_newline): Put unused argument to work: if non-null, save it... - (listing_listing): ... and regurgitate during listing instead of line - from file. - * listing.h (LISTING_MACEXP): New define. - (LISTING_NEWLINE): Argument is NULL. - * read.c (read_a_source_file): If expanding macros, break up input - lines and pass them to listing_newline. - * doc/as.texinfo: Document -ac and -am. - - * cond.c (s_ifc): Add missing demand_empty_rest_of_line. - -Mon Aug 18 11:26:36 1997 Nick Clifton - - * config/tc-v850.c (md_apply_fix3): Add support for new 16 bit PC - relative reloc. - -Mon Aug 18 11:24:21 1997 Nick Clifton - - * config/tc-v850.c: Remove support_v850e flag and command line - option. - - * configure.in (emulations): Add support for v850e target - - * configure (emulations): Add support for v850e target - -Mon Aug 18 11:24:21 1997 Nick Clifton - - * config/tc-v850.c: Remove support_v850ea flag and command line - option. - - * configure.in (emulations): Add support for v850ea target - - * configure (emulations): Add support for v850ea target - -Fri Aug 15 14:00:13 1997 Ian Lance Taylor - - * Makefile.am (check-DEJAGNU): Don't cd into testsuite until after - setting EXPECT and TCL_LIBRARY. - * Makefile.in: Rebuild. - - * as.h (enum debug_info_type): Define. - (debug_type): Declare. - * as.c (debug_type): New global variable. - (show_usage): Add --gstabs. - (parse_args): Handle --gstabs. - * read.c (generate_asm_lineno): Remove. - (read_a_source_file): Output stabs debugging if appropriate. - Change checks of generate_asm_lineno to check debug_type. Only - generate ECOFF debugging if ECOFF_DEBUGGING is defined. - * read.h (generate_asm_lineno): Don't declare. - (stabs_generate_asm_lineno): Declare. - * stabs.c (stabs_generate_asm_lineno): New function. - * ecoff.c (add_file): Use debug_type, not generate_asm_lineno. - Don't turn off debugging. - (add_file): Remove old #if 0 code. - (ecoff_new_file): Set debug_type, not generate_asm_lineno. - (ecoff_directive_end): Don't generate stabs line symbols. - (ecoff_generate_asm_lineno): Don't check stabs_seen. Don't set - generate_asm_lineno. - (line_label_cnt): Remove. - (ecoff_generate_asm_line_stab): Remove. - * ecoff.h (ecoff_generate_asm_line_stab): Don't declare. - * doc/as.texinfo, doc/as.1: Document --gstabs. - -Wed Aug 13 18:58:56 1997 Nick Clifton - - * config/tc-v850.c (md_assemble, md_show_usage, md_parse_option): - Add support for v850ea instructions. - - * config/tc-v850.c (md_assemble, md_show_usage, md_parse_option): - Add support for v850e instructions. - - * config/tc-v850.c (md_assemble): Fix error recovery to reload - text of entire opcode. - -Tue Aug 12 10:27:34 1997 Richard Henderson - - * doc/internals.texi: Document rs_leb128. - -Tue Aug 12 12:17:03 1997 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Give an error message for SIZE_BYTE - in ABSL case, rather than calling abort. - -Mon Aug 11 21:48:00 1997 Richard Henderson - - * as.h (enum _relax_state): Add rs_leb128. - * read.c (potable): Add sleb128 and uleb128. - (sizeof_*leb128, output_*leb128, emit_leb128_expr, s_leb128): New - functions. - * read.h: Update prototypes. - * symbols.c (resolve_symbol_value): Streamline quite a bit. Return - the symbol value, add a second FINALIZE argument that prevents - changes from being comitted. Update all callers. - * write.c (cvt_frag_to_fill, relax_segment): Handle rs_leb128. - * doc/as.texinfo: Document the new pseudos. - -Sun Aug 10 14:51:49 1997 Ian Lance Taylor - - * Makefile.am (MOSTLYCLEANFILES): Add site.bak, site.exp, stage, - stage1, and stage2. - (DISTCLEANFILES): Define. - * doc/Makefile.am (DISTCLEANFILES): Define. - * Makefile.in, doc/Makefile.in: Rebuild. - -Wed Aug 6 00:30:30 1997 Ian Lance Taylor - - * configure.in: Define TARGET_BYTES_BIG_ENDIAN if endian is set. - Don't set targ or gas_target. Define SCO_ELF and - TARGET_SOLARIS_COMMENT when appropriate. Don't substitute for - target_frag. - * Makefile.am: Remove @target_frag@. - (INCLUDES): Remove $(INTERNAL_CFLAGS), $(CROSS), $(HDEFINES), and - $(TDEFINES). - (dep-am): Mark as phony. - * acconfig.h: Add TARGET_BYTES_BIG_ENDIAN, TARGET_SOLARIS_COMMENT, - and SCO_ELF. - * config/arm-big.mt, config/arm-lit.mt: Remove. - * config/mips-big.mt, config/mips-lit.mt: Remove. - * config/ppc-big.mt, config/ppc-lit.mt: Remove. - * config/ppc-sol.mt: Remove. - * config/i386coff.mt, config/m68kcoff.mt: Remove. - * config/m88kcoff.mt: Remove. - * config/sco5.mt: Remove. - * configure, config.in, Makefile.in: Rebuild. - - * Makefile.am ($(srcdir)/config/m68k-parse.h): New target, to - further try to circumvent the .y.h rule. - * Makefile.in: Rebuild. - -Tue Aug 5 12:32:07 1997 Ian Lance Taylor - - * Makefile.am: New file, based on old Makefile.in. - * acinclude.m4: New file, from old aclocal.m4. - * configure.in: Call AM_INIT_AUTOMAKE and AM_PROG_LIBTOOL. Remove - shared library handling; now handled by libtool. Replace - AC_CONFIG_HEADER with AM_CONFIG_HEADER. Call AC_PROG_YACC, - AC_PROG_LEX, and AC_DECL_YYTEXT. Call AM_MAINTAINER_MODE, - AM_CYGWIN32, and AM_EXEEXT. Don't call CY_CYGWIN32 or CY_EXEEXT. - * config.in: New file, created by autoheader. - * conf.in: Remove. - * acconfig.h: Mention PACKAGE, VERSION, and USING_CGEN. - * stamp-h.in: New file. - * as.c (print_version_id): Change GAS_VERSION to VERSION. - (parse_args): Likewise. - * config/obj-vms.c: (Write_VMS_MHD_Records): Likewise. - * doc/Makefile.am: New file, based on old doc/Makefile.in. - * Makefile.in, doc/Makefile.in: Now built with automake. - * aclocal.m4: Now built with aclocal. - * configure: Rebuild. - - * cond.c (s_else): If not listing false conditionals, turn listing - off in the false branch of the else. - -Mon Aug 4 11:28:35 1997 Ian Lance Taylor - - * config/tc-mips.c (macro): Fix handling of a double load from a - symbol plus an offset. - - * ecoff.c (ecoff_build_symbols): Set fMerge to 0 for an FDR which - has an associated external symbol. - -Sun Aug 3 23:23:59 1997 Richard Henderson - - * config/tc-alpha.c (s_alpha_ucons): New function. - (md_pseudo_table): Add unaligned data pseudos for DWARF. - -Thu Jul 31 15:13:43 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (md_assemble): Ignore the rest of the current - line if we encounter an error. - - * config/tc-v850.c (md_assemble): Sign extend constants value - for hi and hi0 expressions. - (v850_insert_operand): Enable range checking for generic 16bit - operands. - -Tue Jul 29 14:20:43 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (md_assemble): Turn on fx_no_overflow for - LO16, HI16 and HI16_S relocs. - -Mon Jul 28 18:41:41 1997 Rob Savoye - - * configure.in: Use CYGWIN and EXEEXT autoconf macro to look for - win32 dependencies. - * configure: Regenerated with autoconf 2.12. - * Makefile.in: Add $(EXEEXT) to all executables. - -Fri Jul 25 10:54:43 1997 Jeffrey A Law (law@cygnus.com) - - * tc-hppa.c (md_apply_fix): Improve warnings for out of range - unconditional branches. - (hppa_fix_adjustable): Don't adjust anything with a RR% or LR% - field selector. - -Thu Jul 24 15:21:49 1997 Doug Evans - - * tc-sparc.c (md_begin): Cast sparc_opcodes to PTR for hash_insert. - -Thu Jul 24 17:51:29 1997 Ian Lance Taylor - - * macro.c (define_macro): Make sure the index is in range before - checking for '('. - -Thu Jul 24 12:13:19 1997 Fred Fish - - * config/tc-tic80.c (build_insn): Remove "extended" and replace with - "fx" and "fxfrag". Add "ffrag". Change code to initialize and use - the right f/ffrag and fx/fxfrag pairs since instruction may be split - across frags. - -Tue Jul 22 18:38:56 1997 Robert Hoehne - - * config/te-go32.h (USE_ALIGN_PTWO): Define. - * config/tc-i386.c (md_pseudo_table): If USE_ALIGN_PTWO is - defined, use s_align_ptwo for .align. - * configure.in (i386-*-msdosdjgpp*): New target. - (i386-*-go32*): Set em to go32 and targ to coffgo32. - * configure: Rebuild. - -Tue Jul 22 12:41:40 1997 Doug Evans - - * config/tc-sparc.c (last_opcode): New static local. - (md_assemble): Don't issue "FP branch in delay slot" warning if - the delay slot has been annulled. - -Tue Jul 22 13:25:13 1997 Ian Lance Taylor - - * config/tc-m68k.c (md_apply_fix_2): Check for PC relative reloc - code if BFD_ASSEMBLER. - -Mon Jul 21 08:57:17 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (system_registers): Fix ordering of registers. - -Tue Jul 15 16:29:54 1997 Fred Fish - - * config/tc-tic80.c (build_insn): Initialize extended word to zero - when it will be filled in later by relocation information. - -Mon Jul 14 23:10:58 1997 Ian Lance Taylor - - * config/tc-mips.c (macro_build): Restore check of fmt argument. - (mips_ip): Fix ISA checks. - -Mon Jul 14 19:30:55 1997 Fred Fish - - * config/tc-tic80.c (build_insn): Fix endianness problem with - O_big operands. - -Sun Jul 13 20:43:46 1997 Ian Lance Taylor - - * config/tc-mips.c (check_absolute_expr): Change warning to - error. - -Fri Jul 11 10:18:47 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mips.c (macro_build): Refine code to check if an - instruction is available on a particular cpu variant. - (mips_ip): Likewise. - -Mon Jul 7 22:53:08 1997 Ian Lance Taylor - - * config/tc-i386.c (tc_i386_fix_adjustable): Change ifndef - OBJ_AOUT to ifdef OBJ_ELF. - (md_apply_fix3): When mangling 32 bit PC relative reloc for - BFD_ASSEMBLER, handle one ELF case for COFF as well, and add a PE - case. - * write.c (fixup_segment): Change special case for i386-coff to - not apply for i386-pe. - * config/obj-coff.c (coff_adjust_section_syms): Only count fixups - which were not done. - (coff_frob_file_after_relocs): Rename from coff_frob_file. - (coff_format_ops): Initialize frob_file_after_relocs field rather - than frob_file field. - * config/obj-coff.h (coff_frob_file): Don't declare. - (coff_frob_file_after_relocs): Declare. - (obj_frob_file): Don't define. - (obj_frob_file_after_relocs): Define. - * configure.in: Set bfd_gas to yes for i386-*-cygwin32. - * configure: Rebuild. - -Wed Jul 2 12:05:00 1997 Ian Lance Taylor - - * config/obj-coff.c (fixup_segment): Never subtract section - address from PC relative reloc which will be fully resolved. - -Tue Jul 1 15:23:07 1997 Jeffrey A Law (law@cygnus.com) - - * ecoff.c (page_type): Renamed from page_t to avoid conflict - with hpux10 header files. - -Mon Jun 30 12:27:28 1997 Ian Lance Taylor - - From Jason Merrill : - * read.c (do_align): If BFD_ASSEMBLER, only use NOP_OPCODE if - SEC_CODE is set. - * config/tc-i386.h (md_maybe_text): Define. - (md_do_align): Use md_maybe_text. - -Fri Jun 27 19:15:27 1997 Michael Meissner - - * config/tc-ppc.h (tc_fix_adjustable): Only check for GOT type - relocations, don't check for symbol being external, weak, etc. - -Mon Jun 16 19:12:51 1997 Geoff Keating - - * config/tc-ppc.h (tc_fix_adjustable): Don't let the assembler - calculate relocations to any external symbol, because we might be - linking a shared object and the symbol might be overriden or moved - (for instance, moved into a static executable's .bss section). - (GLOBAL_OFFSET_TABLE_NAME): Delete. This is an i386 wierdness. - - * config/tc-ppc.h (tc_fix_adjustable): GOT-based relocations can't - be calculated by the assembler. - - * config/tc-ppc.c (md_apply_fix3): Handle @plt or @local branch - whose destination lies in the same file, by ignoring the @plt or - @local and aiming the branch at its destination. - -Mon Jun 16 13:59:18 1997 H.J. Lu - - * symbols.c (copy_symbol_attributes): Copy BSF_OBJECT flag. - * config/obj-elf.h (OBJ_COPY_SYMBOL_ATTRIBUTES): Copy size - expression. - - * config/obj-multi.h (OBJ_COPY_SYMBOL_ATTRIBUTES): Define instead - of obj_copy_symbol_attributes. - -Mon Jun 16 12:45:56 1997 Ian Lance Taylor - - * config/tc-ppc.c (ppc_insert_operand): In 32 bit mode, with a - signed operand, sign extend a 32 bit value to the host size. - - * Makefile.in (CFLAGS): Subsitute from configure script. From - Jeff Makey . - - * config/tc-i386.c (i386_operand): Use alloca rather than a fixed - buffer size to make a copy of the symbol. - - * Makefile.in (OBJS): Put @extra_objects@ on the same line as - macro.o. - -Thu Jun 12 12:16:20 1997 Ian Lance Taylor - - * write.c (write_object_file): In non BFD_ASSEMBLER code, as we - step through the frags calling cvt_frag_to_fill, switch to - SEG_DATA when we reach data_frag_root. - -Tue Jun 10 17:08:34 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_assemble): Allow an empty register - list for instructions which use register lists. - -Tue Jun 10 11:18:09 1997 H.J. Lu - - * config/tc-arm.c (md_apply_fix3): Make temp unsigned long. - - * config/tc-arm.c (arm_adjust_symtab): Only set storage classes if - OBJ_COFF. - - * config/tc-arm.c: Add prototypes for many static functions. - (struct asm_opcode ): Add prototypes for parms field. - (struct thumb_opcode ): Likewise. - (fp_op2): Remove unused flags parameter. - (output_inst): Make static. - (arm_after_pass_hook): Remove unused ignore parameter. - * config/tc-arm.h (arm_after_pass_hook): Declare. - (arm_start_line_hook): Declare. - (arm_frob_label): Declare. - -Mon Jun 9 12:55:45 1997 H.J. Lu - - * depend.c (wrap_output): new prototype. - -Mon Jun 9 12:52:44 1997 Ian Lance Taylor - - * config/tc-sh.c (md_apply_fix): Check for overflow. - - * config/tc-m68k.c (md_section_align): If a.out and BFD, force - section size to be aligned. - -Fri Jun 6 17:15:55 1997 Ian Lance Taylor - - * config/tc-sh.h (md_cons_align): Define. - (sh_cons_align): Declare. - * config/tc-sh.c (md_pseudo_table): Add .uaword and .ualong. - (sh_no_align_cons): New static variable. - (s_uacons): New static function. - (sh_cons_align): New function. - (sh_handle_align): Warn about misaligned data. - * doc/c-sh.texi: Document .uaword and .ualong. - -Thu Jun 5 15:38:17 1997 Ian Lance Taylor - - * macro.c (macro_expand): In MRI mode, treat single quote as a - separator character when checking for a positional argument. - -Tue Jun 3 16:15:13 1997 Nick Clifton - - * config/tc-arm.c (md_parse_option): Merge in changes from - armT-970328-branch. - - * config/tc-arm.h: Merge in changes from armT-970328-branch. - - * configure.in (emulations): Add Thumb architecture support from - armT-9703-28-branch. - -Mon Jun 2 16:25:07 1997 Nick Clifton - - * doc/all.texi: Add enabling of ARM documentation. - - * doc/as.texinfo: Add ARM documentation from armT-970328-branch. - -Mon Jun 2 11:55:12 1997 Gavin Koch - - * config/tc-mips.c: Added r3900 support. - -Thu May 29 12:58:26 1997 Ben Pfaff - - * as.c: (parse_args) `-t' option requires an argument. - -Wed May 28 15:45:07 1997 Nick Clifton - - * config/tc-arm.c (md_begin): Change call to - coff_arm_bfd_set_private_flags() to a call to - bfd_set_private_flags(). - -Wed May 28 16:17:34 1997 Ian Lance Taylor - - * Makefile.in: Rebuild dependencies. - - * config/tc-i386.c (tc_gen_reloc): Don't try to convert the type - of a BFD_RELOC_RVA reloc. - -Wed May 28 10:48:14 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (tc_fix_adjustable): Reject absolute calls/jumps. - (hppa_force_relocation): Force a relocation for an absolute - call/jump. - -Mon May 26 13:24:25 1997 Ian Lance Taylor - - * doc/as.texinfo: Don't use @value in section names or index - entries; it confuses texinfo.tex. - -Fri May 23 00:09:35 1997 Tom Tromey - - * doc/as.texinfo: Updated for -MD option. - * Makefile.in (CFILES): Added depend.c. - (OBJS): Added depend.o. - * as.h (start_dependencies, register_dependency, - print_dependencies): New declarations. - * depend.c: New file. - * as.c (parse_args): Added -MD option. - (main): Call print_dependencies. - (show_usage): Added help for -MD. - * read.c (s_app_file): Call register_dependency. - (s_include): Call register_dependency when file is found. - (read_a_source_file): Call register_dependency. - -Wed May 21 17:39:28 1997 Ian Lance Taylor - - * config/obj-coff.c (symbol_to_chars): If TE_PE, don't add the - section address to the symbol value. - -Tue May 20 11:23:31 1997 Gavin Koch - - * config/tc-mips.c (macro_build,mips_ip): Move the INSN_ISA field - into the new membership field. - -Thu May 15 10:00:53 1997 Nick Clifton - - * config/tc-arm.c (md_begin): If no cpu type is specified on the - command line then the ARM7 is now chosen by default when setting - the BFD machine and architecture. - -Wed May 14 09:54:53 1997 Nick Clifton - - * config/tc-arm.c (global variables): Added 'uses_apcs_26' flag to - hold APCS selection. - (md_begin): Added code to generate flags to be set into the COFF - header and the calls to the BFD functions to do this. - (md_parse_option, md_show_usage): Added new command line - options -mapcs-32, -mapcs-26, -marmv2, -marmv2a, -marmv3, - -marmv3m, -marmv4, -marmv4t. - - * tc-arm.h (LOCAL_LABEL): Removed the definition of this macro - as it is never used. - -Tue May 13 22:26:14 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (md_convert_frag): Prefix temporary - label name with ".". - * config/tc-mn10300.c (md_convert_frag): Likewise. - -Tue May 13 14:44:39 1997 Ian Lance Taylor - - * config/tc-mips.c (set_at): Check for bignum. - (check_absolute_expr, macro, mips16_macro): Likewise. - -Tue May 13 10:45:56 1997 Fred Fish - - * config/tc-tic80.c (md_apply_fix): Check PC relative relocations - for overflow/underflow, only insert lower 15 bits into instruction. - -Mon May 12 13:33:08 1997 H.J. Lu - - * config/tc-i386.c (pi): Check for RegMMX. - -Thu May 8 11:10:15 1997 Ian Lance Taylor - - * expr.c (expr): When subtracting values in the same frag, - subtract X_add_number rather than adding it. - -Wed May 7 15:39:48 1997 Ian Lance Taylor - - * config/obj-coff.c (write_object_file): Just pass NULL to - md_do_align, not the address of a char holding NOP_OPCODE. - - * config/tc-mips.c (macro): Handle constants for M_LI_D and - M_LI_DD. - (mips_ip): For 'F', 'L', 'f', and 'l', generate a constant rather - than an address if the floating point value looks sufficiently - simple. - -Tue May 6 12:18:09 1997 Ian Lance Taylor - - * config/tc-i386.c (md_section_align): If a.out and BFD, force - section size to be aligned. - -Mon May 5 17:16:55 1997 Ian Lance Taylor - - * cond.c: Include "macro.h". - (struct conditional_frame): Add macro_nest field. - (initialize_cframe): Initialize macro_nest. - (cond_finish_check): Add nest parameter. Change all callers. - (cond_exit_macro): New function. - * as.h (cond_finish_check): Update declaration. - (cond_exit_macro): Declare. - * input-scrub.c (macro_nest): Make globally visible. - (input_scrub_next_buffer): Call cond_finish_check. - * macro.h (macro_nest): Declare. - * read.c (s_mexit): Call cond_exit_macro. - - * config/tc-i386.h (RegMMX): Define. - * config/tc-i386.c (pi): Check for all register types. - (type_names): Add RegMMX. - (md_assemble): Handle RegMMX. - -Wed Apr 30 12:47:00 1997 Manfred Hollstein - - * config/obj-coff.c (c_section_symbol): Clear the LOCAL bit #ifdef - TE_DELTA. - -Tue Apr 29 20:23:10 1997 Jim Wilson - - * config/tc-mips.c (nopic_need_relax): Add new parameter - before_relaxing. Use it when testing ecoff_extern_size. - (load_address, macro, md_estimate_size_before_relax): Fix all - callers. - -Tue Apr 29 19:54:36 1997 Richard Henderson - - * config/obj-elf.c (elf_pseudo_table): Add "subsection". - (obj_elf_subsection): New static function. - -Tue Apr 29 19:52:47 1997 Ian Lance Taylor - - * config/obj-coff.c (coff_header_append): Don't reset string_size - each time through the loop. - -Fri Apr 25 14:17:46 1997 H.J. Lu - - * Makefile.in (DISTSTUFF): Add itbl-parse.h. - -Fri Apr 25 12:03:15 1997 Ian Lance Taylor - - * doc/internals.texi (Porting GAS): Correct documentation for - current configure handling of targ-cpu.h, et. al. - (CPU backend): Document listing macros. - - * listing.c (data_buffer): Set size based on other listing macros, - rather than always using 100. - (data_buffer_size): Remove static variable. - (calc_hex): Make data_buffer_size a local variable. Don't leave - any slop when filling data_buffer. - -Mon Apr 21 15:33:19 1997 Ian Lance Taylor - - * doc/c-mips.texi: Document .set autoextend. - -Sat Apr 19 23:09:25 1997 Niklas Hallqvist - - * configure.in (i386-*-openbsd*, m68k-*-openbsd*, - mips-dec-openbsd*, ppc-*-*bsd*, ns32k-pc532-openbsd*, - sparc-*-openbsd*): New targets. - * configure: Rebuild. - -Sat Apr 19 22:52:03 1997 Jim Wilson - - * config/obj-elf.c (elf_frob_symbol): If TC_MIPS, set BSF_OBJECT - for all undefined symbols. - -Fri Apr 18 13:37:35 1997 Ian Lance Taylor - - * config/tc-ppc.c (ppc_fix_adjustable): Handle zero length csects - correctly. - -Fri Apr 18 11:51:35 1997 Niklas Hallqvist - - * configure.in (alpha*-*-openbsd*): New target. - * configure: Rebuild. - -Thu Apr 17 13:59:47 1997 Per Fogelstrom - - * configure.in (mips-*-openbsd*): New target. - * configure: Rebuild. - -Wed Apr 16 12:31:24 1997 Martin Hunt - - * config/tc-d30v.c (parallel_ok): Fix parallel checking - for instructions using conditional execution. - -Tue Apr 15 18:11:44 1997 Gavin Koch - - * config/tc-mips.c (insn_uses_reg): Correct test for fpr pairs. - -Tue Apr 15 13:04:47 1997 Ian Lance Taylor - - * Makefile.in (srcroot): Remove. - (INSTALL): Set to @INSTALL@. - (INSTALL_XFORM, INSTALL_XFORM1): Remove. - (all, dvi): Don't set srcroot. - (install): Depend upon as.new, gasp.new, and installdirs. Use - $(program_transform_name) directly, rather than using - $(INSTALL_XFORM) and $(INSTALL_XFORM1). - (installdirs): New target. - * doc/Makefile.in (INSTALL_XFORM1): Remove. - (install): Depend upon installdirs. Use $(program_transform_name) - directly, rather than using $(INSTALL_XFORM) and - $(INSTALL_XFORM1). - (installdirs): New target. - (install-info-as): Run mkinstalldirs. - (install-info-gasp): Likewise. - -Mon Apr 14 11:59:08 1997 Ian Lance Taylor - - * Makefile.in (INSTALL): Change install.sh to install-sh. - - * symbols.c (resolve_symbol_value): Check for division by zero. - - From Thomas Graichen : - * Makefile.in: Always use $(SHELL) when running move-if-change. - * configure.in: Use ${CONFIG_SHELL} when running $ac_config_sub. - * configure: Rebuild. - -Thu Apr 10 14:40:00 1997 Doug Evans - - * cgen.c (cgen_parse_operand): Renamed from cgen_asm_parse_operand. - New argument `want'. Update enum cgen_parse_operand_result values. - Initialize if CGEN_PARSE_OPERAND_INIT. - * config/tc-m32r.c (md_begin): Set cgen_parse_operand_fn. - (md_assemble): Call cgen_asm_init_parse. - Update call to m32r_cgen_assemble_insn, call as_bad if assembly failed. - -Wed Apr 9 11:49:41 1997 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Handle #j. - -Tue Apr 8 16:37:57 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_convert_frag): Create fixup at the - right address for call label:32,regs,imm. - -Mon Apr 7 14:58:22 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (pa_subspace_start): If OBJ_ELF, then always return - zero. - * config/tc-hppa.h (tc_frob_symbol): Don't reset the value of the - symbol for OBJ_ELF anymore. - -Mon Apr 7 10:54:59 1997 Doug Evans - - * Makefile.in: Regenerate dependencies. - (TARG_CPU): New variable. - (cgen.o): Depend on cgen.h, $(TARG_CPU)-opc.h. - (.dep1): Delete creating of cgen-opc.h. - (.tcdep): Put proper contents in cgen-opc.h. - * configure.in (m32r): Delete setting of extra_files, extra_links. - (AC_OUTPUT): Create cgen-opc.h. - * configure: Regenerated. - -Sat Apr 5 13:19:12 1997 Klaus Kaempf - - * makefile.vms: Update to build gasp.exe. - -Fri Apr 4 16:10:02 1997 Doug Evans - - * write.c (relax_frag): Make non-static. - * write.h (relax_frag): Add prototype for. - * config/tc-m32r.h (md_do_align): New arg `max'. - * config/tc-m32r.c (m32r_do_align): Likewise. - Update calls to frag_align, frag_align_pattern. - (fill_insn): Update call to m32r_do_align. - (m32r_scomm): Update call to frag_align. - - * config/tc-m32r.[ch]: New files. - * cgen.c: New file. - * Makefile.in (CPU_TYPES): Add m32r. - (TARGET_CPU_CFILES): Add tc-m32r.c. - (TARGET_CPU_HFILES): Add tc-m32r.h. - (DISTCLEAN_HERE): Add cgen-opc.h. - (.dep1,.tcdep): Create empty cgen-opc.h. - (cgen.o): Add dependencies. - (dependencies): Regenerate. - * as.h (struct frag): New member fr_targ. - (fr_pcrel_adjust,fr_bsr): Move into union fr_targ.ns32k. - * conf.in (USING_CGEN): New macro. - * configure.in (m32r-*-*): Add entry for. - Add cgen.o to extra_objects. - * configure: Regenerate. - * frags.c (frag_var): fr_pcrel_adjust renamed to - fr_targ.ns32k.pcrel_adjust. fr_bsr renamed to fr_targ.ns32k.bsr. - (frag_variant): Likewise. - * write.c (relax_frag): Likewise. - * config/tc-ns32k.c (*): Likewise. - -Fri Apr 4 13:26:10 1997 Ian Lance Taylor - - * config/tc-hppa.h (TC_EOL_IN_INSN): Check explicitly for '!', - rather than for any end of line character. - - * config/tc-hppa.c (tc_gen_reloc): If hppa_ren_reloc_type fails, - call abort (i.e., as_abort) rather than crashing. - - * config/tc-mips.c: Protect uses of STO_MIPS16 with an ifdef of - OBJ_ELF, rather than of S_GET_OTHER. - - * Makefile.in (DISTCLEAN_HERE): Add site.exp and site.bak. - -Thu Apr 3 13:16:18 1997 Ian Lance Taylor - - * Makefile.in (VERSION): Set to 2.8.1. - - * Branched binutils 2.8. - -Wed Apr 2 12:24:10 1997 Ian Lance Taylor - - * COPYING: Update FSF address. - - * config/tc-mips.c (mips16_macro): Handle M_DMUL and M_MUL. - -Tue Apr 1 18:29:47 1997 Jim Wilson - - * config/tc-mips.c (md_begin): Don't set interlocks for 4100. - -Tue Apr 1 16:24:28 1997 Klaus Kaempf - - * config-gas.com: Update to handle both vax and alpha. - * makefile.vms: Update to use config-gas. - * conf-a-gas.com: Remove file. - -Tue Apr 1 16:08:21 1997 Ian Lance Taylor - - * Makefile.in: Remove unnecessary itbl-parse.h, ibtl-parse.c, and - itbl-lex.c dependencies. Remove rules for itbl-lex.o, - itbl-parse.o, and itbl-ops.o; just use the normal .c.o rule. - -Tue Apr 1 11:25:56 1997 Michael Meissner - - * config/tc-tic80.c (line_comment_char): Make '#' start comments - at the beginning of a line for compatibility with .S files where - cpp leaves the filename transitions beginning with '#'. - -Tue Apr 1 00:07:30 1997 Ian Lance Taylor - - * config/tc-m68k.c: Only compile tc_coff_symbol_emit_hook and - tc_coff_sizemachdep if OBJ_COFF. - -Mon Mar 31 23:53:44 1997 H.J. Lu - - * config/tc-ppc.c (register_name): Declare. - -Mon Mar 31 16:31:04 1997 Joel Sherrill - - * configure.in (hppa*-*-rtems*): New target, like hppa-*-*elf*. - * configure: Rebuild. - -Mon Mar 31 14:15:19 1997 Ian Lance Taylor - - * config/tc-mips.c (mips_pseudo_table): Add "stabn". - (mips16_mark_labels): New static function. - (append_insn): Call mips16_mark_labels. - (mips_emit_delays): Likewise. - (s_insn): Likewise. Don't call mips_clear_insn_labels. - (s_mips_stab): New static function. - - * configure.in: Use ELF for mips-*-gnu*. - * configure: Rebuild. - -Mon Mar 31 14:01:40 1997 Philippe De Muyter - - * config/tc-m68k.h (TARGET_FORMAT): Set to "coff-m68k-sysv" if - TE_DELTA. - -Fri Mar 28 18:03:19 1997 Alan Modra - - * configure.in: Add AC_ARG_ENABLE for commonbfdlib. If it is set, - set OPCODES_LIB to empty. - * configure: Rebuild. - -Fri Mar 28 15:25:24 1997 H.J. Lu - - * configure.in (sparc-*-linux*aout*, sparc-*-linux*): New - targets. - * configure: Rebuild. - -Fri Mar 28 13:08:33 1997 Ian Lance Taylor - - * itbl-parse.y (yyerror): Make static. Declare. - - From Ralf Baechle : - * configure.in: Set emulations for mips-*-linux*-*. - * configure: Rebuild. - - * config/tc-mips.c (struct mips_set_options): Define. - (mips_opts): New static variable. - (mips_isa): Remove. Now a field in mips_opts. Change all - references. - (mips16, mips16_autoextend, mips_warn_about_macros): Likewise. - (mips_noreorder, mips_nomove, mips_noat, mips_nobopt): Likewise. - (struct mips_option_stack): Define. - (mips_opts_stack): New static variable. - (s_mipsset): Add support for .set push and .set pop. - * doc/c-mips.texi: Document .set push and .set pop. - - * config/obj-elf.c (obj_elf_section_change_hook): New function. - * config/obj-elf.h (obj_elf_section_change_hook): Declare it. - * config/tc-mips.c (s_change_sec): Call it if OBJ_ELF. - -Thu Mar 27 12:23:56 1997 Ian Lance Taylor - - * as.c (parse_args): Update copyright date in version message. - - * Makefile.in (clean-here): Remove dependency files. - - * read.c (s_comm): Check S_IS_COMMON as well as S_IS_DEFINED. - (s_mri_common): Check S_IS_COMMON unconditionally. - * symbols.c (colon): Check S_IS_COMMON as well as S_IS_DEFINED. - * config/tc-alpha.c (s_alpha_comm): Likewise. - * config/tc-mips.c (nopic_need_relax): Likewise. - * config/tc-ppc.c (ppc_elf_lcomm): Likewise. - (ppc_pe_comm): Likewise. - * config/obj-elf.c (obj_elf_common): Likewise. Set segment of - common symbol to bfd_com_section_ptr. - * config/tc-sparc.c (s_common): Likewise. - (tc_gen_reloc): Likewise. - -Thu Mar 27 00:29:46 1997 Martin M. Hunt - - * config/tc-d30v.c (md_apply_fix3): Get the relocs right. - -Wed Mar 26 13:35:15 1997 H.J. Lu - - * config/tc-i386.c (tc_i386_fix_adjustable): Only define if - BFD_ASSEMBLER. - -Wed Mar 26 11:32:51 1997 Ian Lance Taylor - - * input-scrub.c (input_scrub_next_buffer): Handle very long input - lines correctly. - - * listing.c (print_lines): Add lineno parameter. Change all - callers. - (listing_listing): Only call calc_hex for the right line. - (listing_list): Set the new edict based on the current edict, in - order to handle listing commands in macros correctly. - - * config/tc-mips.c (insn_uses_reg): Map register numbers in mips16 - instructions. - - * cond.c (cond_finish_check): New function. - * as.h (cond_finish_check): Declare. - * as.c (main): Call cond_finish_check. - -Tue Mar 25 14:45:54 1997 Martin M. Hunt - - * config/tc-d30v.c (md_assemble): If two instructions - are supposed to be assembled in parallel and the first one is - long, print an error and stop. - (md_apply_fix3): Don't calculate absolute relocs. Just write - them out. - -Mon Mar 24 12:11:18 1997 Ian Lance Taylor - - * config/tc-i386.h (iclrKludge): Define. - * config/tc-i386.c (md_assemble): Handle iclrKludge. - - * config/tc-alpha.h (tc_frob_file_before_adjust): Define if - OBJ_ECOFF. - (alpha_frob_file_before_adjust): Declare if OBJ_ECOFF. - * config/tc-alpha.c (alpha_debug): New static variable. - (md_parse_option): Set alpha_debug if -g is seen. - (alpha_frob_file_before_adjust): New function if OBJ_ECOFF. - -Sun Mar 23 18:03:31 1997 Martin M. Hunt - - * config/tc-d30v.c (build_insn): Enable range-checking code. - (postfix): Stop at space or comma. - (md_assemble): Change error message. - -Sat Mar 22 13:44:28 1997 Ian Lance Taylor - - * Makefile.in: Added automatic dependency building. - * dep-in.sed: New file. - -Fri Mar 21 15:42:37 1997 Ian Lance Taylor - - * config/obj-ieee.c (segment_name): Don't define function if this - is a macro. - - * config/obj-coff.h (DO_STRIP): Don't define. - * config/tc-h8300.h (DO_STRIP): Don't define. - * config/tc-h8500.h (DO_STRIP): Don't define. - * config/tc-w65.h (DO_STRIP): Don't define. - * config/tc-z8k.h (DO_STRIP): Don't define. - - * symbols.c (colon): Call obj_frob_label if it is defined. - * config/obj-vms.h (obj_frob_label): Rename from tc_frob_label. - - * configure.in: Don't set files and links. Don't call - AC_LINK_FILES. Substitute te_file. Create targ-cpu.h, - obj-format.h, targ-env.h, and itbl-cpu.h in AC_OUTPUT. - * configure: Rebuild. - * Makefile.in (TARG_CPU_C): New variable. - (TARG_CPU_O, TARG_CPU_H): New variables. - (OBJ_FORMAT_C, OBJ_FORMAT_O, OBJ_FORMAT_H): New variables. - (TARG_ENV_H, ATOF_TARG_C, ATOF_TARG_O): New variables. - (SOURCES): Rename from REAL_SOURCES. Delete old definition. - (LINKED_SOURCES): Remove. - (HEADERS): Rename from REAL_HEADERS. Delete old definition. - (LINKED_HEADERS): Remove. - (OBJS): Use $(TARG_CPU_O), etc., rather than targ-cpu.o, etc. - ($(OBJS)): Depend upon $(TARG_ENV_H), etc., rather than - targ-cpu.h, etc. - ($(TARG_CPU_O), $(OBJ_FORMAT_O) $(ATOF_TARG_O)): New targets. - (targ-cpu.o, obj-format.o, atof-targ.o): Remove targets. - (itbl-cpu.h): Remove target. - (DISTCLEAN_HERE): Remove targ-cpu.c, obj-format.c, atof-targ.c, - atof-targ.h. - -Thu Mar 20 19:18:58 1997 Ian Lance Taylor - - * doc/as.texinfo (Symbol Names): Don't use obsolete @ctrl macro. - -Thu Mar 20 16:49:14 1997 Andreas Schwab - - * config/tc-m68k.c (mri_chip): Replace calls to get_symbol_end by - open coded loop that does not require the name to start with a - name beginner. - -Thu Mar 20 13:42:01 1997 H.J. Lu - - * frags.c (frag_var): Change offset parameter to offsetT. - (frag_variant): Likewise. - * frags.h (frag_variant, frag_var): Update declarations. - * config/tc-m68k.c (struct m68k_it): Change foff field to - offsetT. - (add_frag): Change off parameter to offsetT. - * Several files: Add casts to calls to frag_var. - - * Makefile.in (m68k-parse.c): Depend upon itbl-parse.c, to - serialize a parallel make. - (itbl-parse.h): Split target out from itbl-parse.c. - -Thu Mar 20 12:48:45 1997 Philippe De Muyter - - * config/m68k-parse.y (motorola_operand): Allow (zdireg,EXPR). - - * config/te-delta.h (COFF_COMMON_ADDEND): Define. - * config/obj-coff.c (fixup_segment): Check COFF_COMMON_ADDEND when - storing the value of a common symbol. - -Wed Mar 19 11:37:57 1997 Philippe De Muyter - - * config/obj-coff.c (glue_symbols): Unused variable symbolP - removed. - (crawl_symbols): Do not modify symbol_rootP and symbol_lastP here; - that is done by symbol_remove and symbol_insert. - - * config/obj-coff.h (S_IS_LOCAL): Return 0 for a debugging - symbol. - -Wed Mar 19 11:06:29 1997 Ian Lance Taylor - - * config/tc-mips.c (load_register): In 32 bit mode, when not - dealing with a 64 bit number, permit the upper 32 bits to be set - even if bit 31 is not set. - -Tue Mar 18 23:30:14 1997 Ian Lance Taylor - - * read.c (potable): Add "equiv". - (s_set): Handle .equiv based on argument. - * doc/as.texinfo (Equiv): New node to document .equiv. - (Err): New node to document .err. - -Tue Mar 18 15:50:13 1997 H.J. Lu - - * Many files: Add function prototypes. - * as.c (show_usage, parse_args): Make static. - * frags.h (frag_alloc): Declare. - * subsegs.c (subseg_set_rest): Don't declare frag_alloc. - * symbols.c (dollar_label_instance): Change return type to long. - * symbols.h (print_symbol_value): Declare. - (print_expr, print_expr_1, print_symbol_value_1): Declare. - * write.c (fix_new_exp): Don't declare make_expr_symbol. - (remove_subsegs, relax_frag): Make static. - * config/atof-vax.c (atof_vax_sizeof): Change letter to int. - (what_kind_of_float): Likewise. - (atof_vax): Make static. Change what_kind to int. - (md_atof): Change what_statement_type to int. - * config/obj-ecoff.h (obj_ecoff_set_ext): Declare. - * config/tc-alpha.c (vax_md_atof): Declare. - (md_atof): Don't declare atof_ieee and vax_md_atof. - * config/tc-i386.c (set_16bit_code_flag): Make static. - * config/tc-i386.h (tc_i386_fix_adjustable): Declare. - * config/tc-m68k.c (add_fix): Change width to int. - (insert_reg): Change regname to const. - (md_atof): Don't declare atof_ieee. - (demand_empty_rest_of_line): Don't declare. - * config/tc-m88k.c (md_atof): Don't declare atof_ieee. - * config/tc-sparc.c (cmp_reg_entry): Change args to const PTR. - (parse_keyword_arg): Change lookup_fn to take const arg. - (md_atof): Don't declare atof_ieee. - * config/tc-sparc.h: Add ifdef for multiple inclusion. - (tc_aout_pre_write_hook): Don't declare. - -Mon Mar 17 11:21:09 1997 Ian Lance Taylor - - * as.h (bfd_alloc_by_size_t): Don't declare. - * Many files: Use xmalloc rather than bfd_alloc_by_size_t. - -Sun Mar 16 13:49:21 1997 Philippe De Muyter - - * symbols.c (symbol_new): Don't call debug_verify_symchain. - (symbol_append): Set sy_next and sy_previous when adding a single - symbol to an empty list. Call debug_verify_symchain. - (verify_symbol_chain): Use assert, not know. - -Sat Mar 15 20:27:12 1997 Fred Fish - - * NEWS: Note BeOS support. - * configure.in: (ppc-*-beos): New target, use coff as object format. - * configure: Regenerate with autoconf. - -Sat Mar 15 19:14:02 1997 Ian Lance Taylor - - * config/tc-mips.c (md_apply_fix): Improve error message for out - of range branch. - - * Makefile.in: Add dependencies on obstack.h where needed. - -Fri Mar 14 15:33:38 1997 Ian Lance Taylor - - * config/tc-mips.c (md_estimate_size_before_relax): Handle the - case of a symbol equated to another symbol when using SVR4_PIC. - - * Makefile.in (TARG_CPU_DEP_sparc): Add opcode/sparc.h. - -Thu Mar 13 11:20:51 1997 Ian Lance Taylor - - * read.c (read_a_source_file): Call LISTING_NEWLINE before - HANDLE_CONDITIONAL_ASSEMBLY when handling an MRI line label. - - * config/obj-elf.c (obj_elf_data): Call md_flush_pending_output - and md_elf_section_change_hook if they are defined. - (obj_elf_text, obj_elf_previous): Likewise. - -Wed Mar 12 11:40:20 1997 Ian Lance Taylor - - * config/obj-multi.h (struct elf_obj_sy): Define if - OBJ_MAYBE_ELF. - (OBJ_SYMFIELD_TYPE): Define as struct elf_obj_sy if - OBJ_MAYBE_ELF. - * config/obj-elf.h (struct elf_obj_sy): Don't define if - OBJ_SYMFIELD_TYPE is defined. - - * doc/as.texinfo (bss): Improve description of .bss section. In - ELF or COFF, you are permitted to switch into the section. - (Comm): Rewrite description of common symbols. - (Lcomm): Mention that some targets permit a third argument. - -Tue Mar 11 01:13:31 1997 Ian Lance Taylor - - * config/tc-ppc.c (ppc_elf_lcomm): Don't call S_CLEAR_EXTERNAL. - - * symbols.c (colon): Change type of local to int. From Alan Modra - . - - * config/tc-m88k.c (m88k_do_align): Don't use a special nop - alignment if a zero fill pattern was explicitly specified. - * config/tc-sh.c (sh_do_align): Likewise. - - * read.c (equals): Always permit register names to be redefined. - - * config/tc-mips.c (mips_fix_adjustable): Permit a reloc against a - mips16 symbol to be adjusted if a symbol is being subtracted from - it. - - From Eric Youngdale : - * config/obj-elf.c (obj_elf_symver): Check for duplicate or - illegal symbol version names. - (elf_frob_symbol): Check for external default versions. - -Sun Mar 9 23:49:12 1997 Ian Lance Taylor - - From Eric Youngdale : - * config/obj-elf.h (struct elf_obj_sy): Define. - (OBJ_SYMFIELD_TYPE): Define to elf_obj_sy struct. Change all - users. - * config/obj-elf.c (obj_elf_symver): Just record the name. - (obj_symbol_new_hook): Initialized versioned_name field. - (elf_frob_symbol): If there is a versioned_name, either rename the - symbol, or add an alias with that name. - -Thu Mar 6 13:55:32 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_relax_table): Define. - (md_convert_frag): Implement. - (md_assemble): Handle relaxable operands/instructions correctly. - (md_estimate_size_before_relax): Implement. - * config/tc-mn10300.h (TC_GENERIC_RELAX_TABLE): Define. - - * config/tc-mn10200.c (md_relax_table): Fix typos. - - * config/tc-mn10300.c (md_assemble): Don't use any MN10300 specific - relocs anymore. Tweak fx_offset for pc-relative relocs. - -Wed Mar 5 15:46:16 1997 Ian Lance Taylor - - * cond.c (s_ifc): Call mri_comment_field and mri_comment_end when - in MRI mode. - -Tue Mar 4 19:34:21 1997 Fred Fish - - * config/tc-tic80.c (md_pseudo_table): Add "sect" and "section" - pseudo-ops. - * config/tc-tic80.c (md_begin): Declare external variable - coff_flags and insert an F_AR32WR bit into it. - -Tue Mar 4 10:01:04 1997 Ian Lance Taylor - - * read.c (equals): Add reassign parameter. Change all callers. - * read.h (equals): Update declaration. - -Sat Mar 1 01:04:04 1997 Ian Lance Taylor - - * config/tc-mips.c (mips16_extended_frag): Don't assume that we - can rely on the frag address to determine whether a frag is - earlier or later. - -Fri Feb 28 14:40:00 1997 Ian Lance Taylor - - * write.h (LOCAL_LABEL): Only define if not BFD_ASSEMBLER. - (S_LOCAL_NAME): Likewise. - (FAKE_LABEL_NAME): Define unconditionally. - * symbols.c (colon): Call bfd_is_local_label, not LOCAL_LABEL, if - BFD_ASSEMBLER. - (S_IS_LOCAL): Call bfd_is_local_label_name, not LOCAL_LABEL. - * config/tc-*.h: Only define LOCAL_LABEL if not BFD_ASSEMBLER. - Don't define FAKE_LABEL_NAME. - * config/te-ic960.h: Likewise. - * config/tc-mips.h (tc_frob_file_before_adjust): Define. - (mips_frob_file_before_adjust): Declare. - * config/tc-mips.c (mips_frob_file_before_adjust): New function. - (mips_local_label): Remove. - - * config/te-sco386.h: Remove; not used. - -Thu Feb 27 15:39:16 1997 Fred Fish - - * config/tc-tic80 (md_pseudo_table): Add align pseudo op to do - byte alignment rather than power-of-two alignment that is the - GAS default. - -Thu Feb 27 13:29:04 1997 Ian Lance Taylor - - * config/tc-m68k.c (md_assemble): Handle a reloc width of 'W'. - - * gasp.c (hash_add_to_string_table): Correct misspelling in error - message, and add newline. - (process_file): Don't process assignments in the label if this is - a equ or assign pseudo-op. - (process_pseudo_op): Swap first argument to do_assign for K_ASSIGN - and K_EQU, to match documentation. - -Thu Feb 27 12:00:03 1997 Michael Meissner - - * config/obj-coff.c (obj_coff_section): Add 'r' section attribute - to denote read-only data sections. - -Thu Feb 27 00:26:33 1997 Ian Lance Taylor - - * config/obj-elf.c (obj_elf_common): Set BSF_OBJECT in flags. - * config/tc-sparc.c (s_common): Likewise, if BFD_ASSEMBLER. - - * expr.c (operand): Simplify 0b handling. Don't treat 0b as a - binary number if the next character is '+' or '-'. - -Wed Feb 26 20:47:12 1997 Fred Fish - - * config/tc-tic80.c (FLT_CHARS): Change from "dD" to "fF". - (find_opcode): Match operands that can be floats. - (build_insn): Handle O_big (float) expressions and build - correct opcode. - -Wed Feb 26 18:19:00 1997 Stan Shebs - - * configure.in (mips*-*-lnews*): New target, also make empty - emulation list for this target. - * configure: Update. - * tc-mips.c (ECOFF_LITTLE_FORMAT): Define. - (mips_target_format): Use. - * te-lnews.h: New file. - -Wed Feb 26 15:33:46 1997 Fred Fish - - * config/tc-tic80.c (find_opcode, build_insn): Changes to match - operands with :m or :s modifiers and generate the right opcodes - for them. - -Wed Feb 26 11:56:11 1997 Ian Lance Taylor - - * Makefile.in (itbl-parse.c itbl-parse.h): Use $(BISON) and - $(BISONFLAGS), not $(YACC) and $(YACCFLAGS). - -Tue Feb 25 22:02:23 1997 Philippe De Muyter - - * config/tc-m68k.c (instring): Useless local declaration of - crack_operand removed. - * expr.h (expressionS): Changed type of X_op field to operatorT if - __GNUC__. - -Tue Feb 25 13:17:27 1997 Ian Lance Taylor - - Based on patches from Robert Lipe : - * configure.in: Add i386coff and i386elf to emulation list. - * configure: Rebuild. - * as.c (i386coff, i386elf): Declare. - * obj.h (coff_format_ops): Declare. - * config/obj-coff.c (OBJ_HEADER): Define. - (coff_obj_symbol_new_hook): Rename from obj_symbol_new_hook. - (coff_obj_read_begin_hook): Rename from obj_read_begin_hook. - (obj_pseudo_table): Add "version". - (coff_pop_insert): New static function. - (coff_sec_sym_ok_for_reloc): New static function. - (no_func): New static function. - (coff_format_ops): New variable. - * config/obj-coff.h (coff_obj_symbol_new_hook): Declare. - (obj_symbol_new_hook): Define. - (coff_obj_read_begin_hook): Declare. - (obj_read_begin_hook): Define. - * config/tc-i386.h (i386_target_format): Declare. - * config/tc-i386.c: Check OBJ_MAYBE_ELF as well as OBJ_ELF; check - OUTPUT_FLAVOR when appropriate. - (i386_target_format): New function. - * Makefile.in (obj-coff.o): New target. - (e-i386coff.o, e-i386elf.o): New targets. - - From Stephen Williams : - * config/tc-i960.h (TC_SYMFIELD_TYPE): Define if OBJ_COFF. - (_tc_get_bal_of_call): Don't declare. - (tc_get_bal_of_call): Declare as function, don't define as macro. - * config/tc-i960.c (tc_set_bal_of_call): If OBJ_COFF, store balP - in sy_tc field, not x_balntry field. - (tc_get_bal_of_call): Rename from _tc_get_bal_of_call. Change - return type to symbolS *. If OBJ_COFF, retrieve value from sy_tc - field, not x_balntry field. - - * config/obj-elf.c (obj_elf_section): Permit a .note section to - have the SHF_ALLOC attribute. - - * Makefile.in ($(OBJS)): Don't depend upon $(IT_HDRS). - (TARG_CPU_DEP_mips): Depend upon $(srcdir)/itbl-ops.h. - (itbl-lex.o): Depend upon itbl-parse.h. - - * itbl-parse.y (yyerror): Change return type to int. Change to - use old style function declaration. - - * Makefile.in (itbl-lex.o): Remove -Wall. - (itbl-parse.o): Likewise. - - * cond.c (s_ifdef): If we should omit conditionals from listings, - call listing_list. - (s_if, s_ifc, s_endif, s_else, s_ifeqs): Likewise. - * listing.c (list_info_struct): Add EDICT_NOLIST_NEXT. - (listing_listing): Handle EDICT_NOLIST_NEXT. - (listing_list): An argument of 2 means EDICT_NOLIST_NEXT. - * listing.h (LISTING_NOCOND): Define. - (LISTING_SKIP_COND): Define. - * as.c (show_usage): Mention c as a suboption of -a. - (parse_args): Handle c as a suboption of -a. - * doc/as.texinfo: Document -alc. - -Mon Feb 24 23:34:14 1997 Fred Fish - - * config/tc-tic80.c (md_apply_fix): Handle R_ABS type fixups. - -Mon Feb 24 18:27:43 1997 Eric Youngdale - - * doc/as.texinfo: Document .symver. - -Mon Feb 24 15:19:57 1997 Martin M. Hunt - - * config/tc-d10v.c: Change pre_defined_registers to - d10v_predefined_registers and reg_name_cnt to d10v_reg_name_cnt. - -Mon Feb 24 10:40:45 1997 Fred Fish - - * config/obj-coff.c: Fix typo in comment section. - * config/tc-tic80.c (md_pseudo_table): Add entry for bss, which takes - an additional alignment argument. - (find_opcode): Allow O_symbol relocs for any 32 bit field, not just - base relative ones. - (build_insn): Handle O_symbol relocs for any 32 bit field, not just - base relative ones. - -Mon Feb 24 02:23:00 1997 Dawn Perchik - - * Makefile.in: Remove dependancies on itbl-cpu.h. - * as.c: Define stubs for itbl_parse and itbl_init if HAVE_ITBL_CPU - is not defined. - -Mon Feb 24 02:03:00 1997 Dawn Perchik - - * itbl-ops.h: Include as.h. - -Mon Feb 24 01:04:00 1997 Dawn Perchik - - * as.c: Remove -t option. - * configure, configure.in: Move itbl-cpu.h to mips specific configure. - * itbl-ops.h: Include itbl-cpu.h only if HAVE_ITBL_CPU is defined. - * config/tc-mips.h: Define HAVE_ITBL_CPU. - -Sun Feb 23 18:01:00 1997 Dawn Perchik - - * itbl-ops.c: Don't define DEBUG. - -Sun Feb 23 17:49:00 1997 Dawn Perchik - - * Makefile.in: Update itbl-test.c to reflect its new location. - -Sun Feb 23 15:50:00 1997 Dawn Perchik - - * itbl-ops.c: Add test for itbl_have_entries. - * config/tc-mips.c: Remove test for itbl_have_entries. - * config/tc-mips.h: Define tc_init_after_args to mips_init_after_args. - -Sun Feb 23 18:13:19 1997 Ian Lance Taylor - - * Makefile.in (DISTSTUFF): Remove itbl-parse.y, itbl-lex.l, and - itbl-ops.c. Add itbl-parse.c and itbl-lex.c. - (LEX, LEXFLAGS): Define. - * itbl-ops.c (append_insns_as_macros): Remove bogus ASSERT. - -Sat Feb 22 21:25:00 1997 Dawn Perchik - - * itbl-parse.y: Fix indentation mistakes from indent program. - * itbl-lex.l: Fix indentation mistakes from indent program. - * itbl-ops.h: Add include for ansidecl.h. - Add PARAMS around function arguments. - Add declaration for itbl_have_entries. - * itbl-ops.c: Add PARAMS around function arguments. - * Makefile.in: Add itbl build rules. - Add dependancies for itbl files to mips target. - * as.c: Add itbl support. - Add new option "--insttbl" for dynamically extending instruction set. - * as.h: Declare insttbl_file_name; - the name of file defining extensions to the basic instruction set - * configure.in, configure: Add itbl-parse.o, itbl-lex.o, and - itbl-ops.o to extra_objects for mips configuration. - Add include file link from itbl-cpu.h to - config/itbl-${target_cpu_type}.h. - * config/tc-mips.c: Allow copz instructions. - Add notes for future additions to the itbl support. - Add debug macros. - (macro): Call itbl_assemble to assemble itbl instructions. - See if an unknown register is specified in an itbl entry. - -Sat Feb 22 20:53:01 1997 Fred Fish - * doc/internals.texi (CPU backend): Fix typo in md_section_align - description. - * config/tc-tic80.h (NEED_FX_R_TYPE): Define. - * config/tc-tic80.c (find_opcode): Add code to support O_symbol - operands. - (build_insn): Grab a frag early so we can use the address in - fixups. Take one's complement of BITNUM values before insertion - in opcode. Add code to support O_symbol operands. - (md_apply_fix): Replace unimplemented warning with implementation. - (md_pcrel_from): Ditto. - (tc_coff_fix2rtype): Ditto. - -Fri Feb 21 14:34:31 1997 Martin M. Hunt - - * config/tc-d30v.c (parallel_ok): New function. - * config/tc-d30v.h: Define TARGET_BYTES_BIG_ENDIAN. - * config/tc-d10v.c (md_pcrel_from_section): Return 0 if - relocation is in different section. - -Fri Feb 21 10:08:25 1997 Jim Wilson - - * tc-mips.c (mips_ip): If configured for an embedded ELF system, - don't set the section alignment to 2**4. - -Fri Feb 21 11:55:03 1997 Ian Lance Taylor - - * config/tc-m68k.c (line_comment_chars): Add '*'. - - * app.c (LEX_IS_TWOCHAR_COMMENT_2ND): Don't define. - (do_scrub_begin): Don't set lex['*']. - (do_scrub_chars): When handling LEX_IS_TWOCHAR_COMMENT_1ST, don't - check for LEX_IS_TWOCHAR_COMMENT_2ND. Instead, just check for - a literal '*'. - - * configure.in: Set em=svr4 for m68k-*-sysv4*. - * configure: Rebuild. - * config/te-svr4.h: New file. - * config/tc-m68k.c (m68k_comment_chars): Only include `#' if - TE_SVR4 or TE_DELTA. - -Thu Feb 20 22:24:39 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (md_convert_frag): Create a fixup for the - short conditional branch around a long unconditional branch. - -Thu Feb 20 13:56:00 1997 Ian Lance Taylor - - * config/obj-coff.c (obj_coff_ln [both versions]): Call - new_logical_line. - - * config/tc-arm.c (fix_new_arm): Use make_expr_symbol to handle a - complex expression. - - * symbols.c (resolve_symbol_value): If both left and right - operands are undefined, warn about both of them. - -Wed Feb 19 00:53:28 1997 Ian Lance Taylor - - Based on patches from Eric Youngdale : - * config/obj-elf.c (elf_pseudo_table): Add "symver". - (obj_elf_symver): New static function. - * config/obj-elf.h (OBJ_COPY_SYMBOL_ATTRIBUTES): Copy the st_other - field. - - * write.c (relax_segment): Make type and printf format agree. - - * read.c (get_line_sb): Don't end the line on a semicolon inside a - string. - -Tue Feb 18 18:42:51 1997 Martin M. Hunt - - * config/tc-d30v.c, config/tc-d30v.h: New files. - - * configure: Rebuilt. - - * configure.in: Add case for d30v. - -Sun Feb 16 17:47:29 1997 Fred Fish - - * config/tc-alpha.h (md_operand): Define with a null expansion, - like all the other targets. - * doc/internals.texi (CPU backend): Add missing word in - md_flush_pending_output description. Fix typo in md_convert_frag - description. - * config/tc-tic80: Minor comment additions/changes. - -Fri Feb 14 18:09:59 1997 Philippe De Muyter - - * config/tc-m68k.c (LOCAL_LABEL): Macro redefined if TE_DELTA. - (tc_canonicalize_symbol_name): Macro defined if TE_DELTA. - * config/obj-coff.c (obj_coff_def): Use - tc_canonicalize_symbol_name if defined. - (obj_coff_tag, obj_coff_val): Likewise. - * expr.c (operand): Reject '~' as operator if is_name_beginner. - -Fri Feb 14 17:24:48 1997 Ian Lance Taylor - - Based on notes from Peter Eriksson . The target - does not actually work, though: - * configure.in (i386-sequent-bsd*): New target. - * configure: Rebuild. - * config/tc-dynix.h: New file. - * config/tc-i386.h: Define TARGET_FORMAT if TE_DYNIX. - - * read.c (do_align): Add max parameter. Change all callers. - Remove useless static variables. - (s_align): New static function. Do common portion of - s_align_bytes and s_align_ptwo. - (s_align_bytes, s_align_ptwo): Just call s_align. - * frags.c (frag_align): Add max parameter. Change all callers. - (frag_align_pattern): Likewise. - * frags.h (frag_align, frag_align_pattern): Update declarations. - * write.c (relax_segment): Limit alignment change to fr_subtype. - Fix some types to be addressT. - * config/obj-coff.c (size_section): Likewise. - * config/obj-ieee.c (size_section): Likewise. - * config/tc-d10v.h (md_do_align): Add max parameter. - * config/tc-i386.h (md_do_align): Likewise. - * config/tc-m88k.h (md_do_align): Likewise. - * config/tc-m88k.c (m88k_do_align): Likewise. - * config/tc-sh.h (md_do_align): Likewise. - * config/tc-sh.c (sh_do_align): Likewise. - * as.h: Improve comments on rs_align and rs_align_code. - * doc/as.texinfo: Document new alignment arguments. - * doc/internals.texi (Frags): Document use of fr_subtype field for - rs_align and rs_align_code. - -Fri Feb 14 15:56:06 1997 Gavin Koch - - * config/tc-mips.c: Changed opcode parsing. - -Thu Feb 13 20:02:16 1997 Fred Fish - - * config/{tc-alpha.h, tc-d10v.h, tc-generic.h, tc-i960.h, - tc-mn10200.h, tc-mn10300.h, tc-sh.h, tc-vax.h, tc-w65.h}: - Add default definition of zero for TARGET_BYTES_BIG_ENDIAN. - * config/{tc-arm.h, tc-hppa.h, tc-i386.h, tc-mips.h, tc-ns32k.h, - tc-ppc.h, tc-sparc.h}: Move definition of TARGET_BYTES_BIG_ENDIAN - to a location consistent with the rest of the target include files. - * config/tc-i386.c: Remove misleading comment. - * doc/internals.texi (CPU backend): Add description of function - md_undefined_symbol. - * config/tc-tic80.c: Add code to insert predefined symbols into the - symbol table so they can be parsed by the standard expression parser. - Remove custom code that use to parse them. - * config/tc-tic80.h: Move definition of TARGET_BYTES_BIG_ENDIAN - to a location consistent with the rest of the target include files. - -Thu Feb 13 21:44:18 1997 Klaus Kaempf - - * as.h: GNU c provides unlink() function. - - Unify section handling on openVMS/Alpha: - * config/tc-alpha.c(s_alpha_link): Remove. - (s_alpha_section): New function. - Remove case-hacking of symbols - Add .code_address pseudo-op. - (BFD_RELOC_ALPHA_CODEADDR): New relocation. - (s_alpha_code_address): New function. - (alpha_ctors_section, alpha_dtors_section): New sections for C++ - static constructors/destructors. - Add debug code for crash debugs, to be removed when traceback code - is added to object code. - (s_alpha_name): New function for .name pseudo-op. - (alpha_print_token): New function to print token expressions with - alpha specific extensions. - - * makefile.vms: Allow compilation with current gcc snapshot. - -Thu Feb 13 16:29:04 1997 Fred Fish - - * doc/Makefile.in (TEXI2DVI): Set to just name of program. - (DVIPS): Set to dvips. - (ps, as.ps, gasp.ps): New targets. - (internals.info, gasp.dvi, internals.dvi): Set both TEXINPUTS - and MAKEINFO env variables. - (internals.ps): Use DVIPS macro. - (clean): Remove core and backup files. - (distclean): Remove temporary files from building internals. - (clean-dvi): Ditto. - * doc/internals.texi (Frags): Fix typo. - (GAS processing): Ditto. - (CPU backend): Ditto. - * ecoff.c (init_file): Use TARGET_BYTES_BIG_ENDIAN value directly. - * mpw-config.in: Define TARGET_BYTES_BIG_ENDIAN as 1. - * read.c: Remove ugly hack that dealt with config files not - correctly defining TARGET_BYTES_BIG_ENDIAN. - (target_big_endian): Use TARGET_BYTES_BIG_ENDIAN directly. - * config/arm-big.mt: Define TARGET_BYTES_BIG_ENDIAN to 1. - * config/arm-lit.mt: Define TARGET_BYTES_BIG_ENDIAN to 0. - * config/mips-big.mt: Define TARGET_BYTES_BIG_ENDIAN to 1. - * config/mips-lit.mt: Define TARGET_BYTES_BIG_ENDIAN to 0. - * config/ppc-lit.mt: Define TARGET_BYTES_BIG_ENDIAN to 1. - * config/ppc-sol.mt: Replace TARGET_BYTES_LITTLE_ENDIAN - with TARGET_BYTES_BIG_ENDIAN defined to 0. - * config/tc-arm.h: Remove use of TARGET_BYTES_LITTLE_ENDIAN - and simplify. Test value of TARGET_BYTES_BIG_ENDIAN, not just - whether it is defined or not. - * config/tc-mips.h: Remove use of TARGET_BYTES_LITTLE_ENDIAN. - * config/tc-ppc.h: Remove use of TARGET_BYTES_LITTLE_ENDIAN - and simplify. Test value of TARGET_BYTES_BIG_ENDIAN, not just - whether it is defined or not. - * config/tic80.h (TARGET_FORMAT): Define to coff-tic80. - (TARGET_BYTES_BIG_ENDIAN): Define to 0. - -Thu Feb 13 14:40:16 1997 Doug Evans - - * write.c (write_relocs): Correct text in as_fatal error message, - bfd_perform_relocation -> bfd_install_relocation. - -Thu Feb 13 14:48:03 1997 Philippe De Muyter - - * config/tc-m68k.c (LEX_TILDE): Define if TE_DELTA. - * read.c (LEX_TILDE): Define if not defined. - (lex_type): Use LEX_TILDE. - * expr.c (get_symbol_end): Check first char with is_name_beginner, - not is_part_of_name. - -Thu Feb 13 11:40:58 1997 Ian Lance Taylor - - * config/tc-sparc.c (md_show_usage): Add missing backslash at end - of continued line. - - * config/tc-mips.c (mips16_extended_frag): Correct base address - for an extended PC relative instruction. - (md_convert_frag): Likewise. - - * config/tc-mips.c (prev_nop_frag): New static variable. - (prev_nop_frag_holds): New static variable. - (prev_nop_frag_required): New static variable. - (prev_nop_frag_since): New static variable. - (append_insn): If we aren't reordering, and prev_nop_frag is not - NULL, and we don't need any nops, then decrease the size of - prev_nop_frag. Don't insert nops because of instructions in - noreorder sections. Remember whether the previous instructions - where in noreorder sections even when not reordering. - (mips_no_prev_insn): Add preserver parameter. Change all - callers. Refer prev_nop_frag variables when appropriate. - (mips_emit_delays): Set up prev_nop_frag. - (s_mipsset): Clear prev_nop_frag if reordering. - -Wed Feb 12 14:36:29 1997 Ian Lance Taylor - - * config/tc-mips.c (append_insn): Remove useless code which - handled swapping a mips16 jump with a mips16 instruction with a - reloc. - - * config/tc-mips.c (md_parse_option): When debugging, set - mips_optimize to 1, not 0. - - * config/tc-mips.c (mips16_ip): Handle an extend operand. - - * config/tc-mips.c (my_getExpression): In mips16 mode, if it looks - like the expression was based on `.', adjust the value of the - symbol. - - * config/tc-mips.c (append_insn): Warn about an attempt to put an - extended instruction in a delay slot when not reordering. - (md_convert_frag): Warn if an extended instruction appears in a - delay slot. - - * config/tc-mips.c (mips_pseudo_table): Add "insn". - (s_insn): New static function. - * doc/c-mips.texi: Document .insn. - - * config/tc-mips.c (md_begin): Add the general registers to the - symbol table. - (mips16_ip): First parse the expression, and then see whether it - came up with a register, rather than trying to first see whether - we are looking at a register. - -Tue Feb 11 15:13:39 1997 Fred Fish - - * config/tc-tic80.c: Numerous changes and additions to flesh - out functions that were previously just stubs, and fix some - problems found using the new TIc80 testsuite cases. - -Tue Feb 11 15:52:22 1997 Ian Lance Taylor - - * config/tc-mips.c (mips16_ip): Handle %gprel modifier. - (md_apply_fix): Handle BFD_RELOC_MIPS16_GPREL. - - * config/tc-mips.c (append_insn): Output jump instruction as a - pair of 2 byte instructions, rather than as a single 4 byte - instruction. - -Mon Feb 10 22:06:00 1997 Dawn Perchik (dawn@cygnus.com) - - * itbl-ops.c, itbl-lex.l, itbl-parse.y, itbl-ops.h, - config/itbl-mips.h: Add copyright message and fix indentation. - -Mon Feb 10 18:09:00 1997 Dawn Perchik (dawn@cygnus.com) - - * itbl-ops.c: New file. Add support for dynamically read - instruction registers, opcodes and formats. Build internal table - for new instructions and provide callbacks for assembler and - disassembler. - * itbl-lex.l, itbl-parse.y: Lex and yacc parsers for instruction - spec table. - * itbl-ops.h: New file. Header file for itbl support. - * config/itbl-mips.h: New file. Mips specific definitions for - itbl support. - -Fri Feb 7 09:52:34 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (md_assemble): If a constant operand won't - fit into the constant field of a relaxable operand, then it does - not match. - -Thu Feb 6 20:08:12 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (md_estimate_size_before_relax): Treat - a jsr target in a different section just like a jsr to - an undefined target. - -Thu Feb 6 16:52:57 1997 Ian Lance Taylor - - * config/tc-mips.c (mips_fix_adjustable): Don't adjust relocations - against any mips16 symbols, not just externally visible ones. - (md_apply_fix): Corresponding change. - -Wed Feb 5 11:11:06 1997 Ian Lance Taylor - - * config/tc-mips.c (mips16_ip): Accept floating point registers in - the operand of the exit instruction. - -Tue Feb 4 14:12:39 1997 Ian Lance Taylor - - * symbols.c (resolve_symbol_value): If we leave an equated symbol - as O_symbol, copy over the segment. - -Mon Feb 3 12:35:54 1997 Ian Lance Taylor - - * config/tc-mips.c (md_apply_fix): If we aren't adjusting this - fixup to be against the section symbol, adjust the value - accordingly. - - * symbols.c (resolve_symbol_value): Don't change X_add_number for - an equated symbol. - * write.c (write_relocs): Avoid looping on equated symbols. - Adjust fx_offset by X_add_number for each symbol. - * config/obj-coff.c (do_relocs_for): Avoid looping on equated - symbols. - (fixup_segment): Add a loop to track down equated symbols and - adjust fx_offset appropriately. - -Fri Jan 31 15:21:02 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (md_relax_table): Add entries to allow - jmp -> bra relaxing. - (md_convert_frag): Handle jmp->bra relaxing. - (md_assemble): Handle jmp->bra relaxing. - (md_estimate_size_before_relax): Likewise. - -Fri Jan 31 13:15:05 1997 Alan Modra - - * config/tc-i386.c (i386_align_code): Add comments explaining the - nop instructions. - -Fri Jan 31 10:46:14 1997 Ian Lance Taylor - - * config/tc-sparc.c (enforce_aligned_data): New static variable. - (sparc_cons_align): Don't do anything unless enforce_aligned_data - is set. - (md_longopts): Add "enforce-aligned-data". - (md_show_usage): Mention --enforce-aligned-data. - * doc/c-sparc.texi (Sparc-Aligned-Data): New node; document - enforce-aligned-data. - - * config/tc-ppc.c (md_pseudo_table): If OBJ_XCOFF, add "long", - "word", and "short". - (ppc_xcoff_cons): New static function. - - * write.c (relax_segment): Give an error if a .space symbol is - common or undefined. - - * read.c (read_a_source_file): Don't handle mri_pending_align if - the handler is s_globl or s_ignore. - -Thu Jan 30 11:46:59 1997 Fred Fish - - * config/tc-d10v.c (find_opcode): Remove unused variable "numops". - * config/tc-tic80.c: Many additions to previous placeholder file. - * config/tc-tic80.h: Ditto. - -Thu Jan 30 12:28:18 1997 Alan Modra - - * config/tc-i386.c (i386_align_code): Improve the nop patterns. - -Thu Jan 30 12:08:40 1997 Ian Lance Taylor - - * config/tc-mips.c (mips_fix_adjustable): New function. - * config/tc-mips.h (tc_fix_adjustable): Call mips_fix_adjustable. - (mips_fix_adjustable): Declare. - - Ideas from Srinivas Addagarla : - * read.c (read_a_source_file): After doing an mri_pending_align, - adjust the line_label if there is one. - (s_space): Set mri_pending_align if an odd number of bytes were - output. - -Wed Jan 29 15:31:12 1997 Martin M. Hunt - - * config/tc-d10v.h (md_do_align): Add this hook to call - d10v_cleanup() when a ".align" is detected. - - * config/tc-d10v.c (find_opcode): Correctly calculate - branch displacement when .aligns are present. - -Wed Jan 29 09:42:11 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (md_relax_table): Define. - (md_convert_frag): Implement. - (md_assemble): Handle relaxable operands/instructions correctly. - (md_estimate_size_before_relax): Implement. - * config/tc-mn10200.h (TC_GENERIC_RELAX_TABLE): Define. - -Tue Jan 28 15:27:28 1997 Ian Lance Taylor - - * config/tc-mips.c (append_insn): Give an error for jumps to a - misaligned address. - (md_apply_fix): Make a branch to an odd address an error rather - than a warning. - - * config/tc-mips.c (md_convert_frag): If the user explicitly - requested an extended opcode, pass warn as true to mips16_immed. - - * config/tc-mips.c (mips16_ip): Handle a missing expression like - an explicit 0, so that explicitly extended instructions work - correctly. - -Mon Jan 27 17:41:20 1997 Ian Lance Taylor - - * ecoff.c (ecoff_build_symbols): Don't generate a local ECOFF - symbol for a common symbol. - -Wed Jan 22 10:39:39 1997 Doug Evans - - Patch presumed to have been checked in awhile ago but wasn't. - Mon Nov 25 10:45:14 1996 Doug Evans - * write.c: Delete "ifndef md_relax_frag" around is_dnrange. - (relax_segment, case rs_org): Move code inside braces. Move locals - target,after inside too. - (relax_segment, case rs_machine_dependent): Guts moved to ... - (relax_frag): New function. - Call md_prepare_relax_scan if defined. - -Mon Jan 20 10:56:47 1997 Andreas Schwab - - * config/tc-m68k.c (m68k_ip): Reject pc-relative addresses for the - 'p' operand specifier. - -Mon Jan 20 10:39:36 1997 J.T. Conklin - - * config/tc-m68k.c (HAVE_LONG_BRANCH): New macro, returns true for - m68k family cpus which support long branch addressing modes. - (m68k_ip, md_convert_frag_1, md_estimate_size_before_relax, - md_create_long_jump): Use it. - -Mon Jan 20 12:42:06 1997 Ian Lance Taylor - - * config/tc-mips.c (md_begin): Don't set SEC_ALLOC or SEC_LOAD for - the .reginfo or .MIPS.options section if configured for an - embedded target. - - * config/tc-mips.c (md_begin): Don't set interlocks for - mips_4650. - -Wed Jan 15 13:51:50 1997 Ian Lance Taylor - - * read.c (read_a_source_file): Make sure the symbol ends with - whitespace before checking whether the next character is '='. - -Tue Jan 14 15:07:27 1997 Robert Lipe - - * config/tc-i386.c (sco_id): Moved from here... - * config/obj-elf.c (sco_id): ...to here. Adding the identifier - really is an SCO ELF specific thing, not just a SCO x86 specific - thing. - -Mon Jan 13 22:43:01 1997 Michael Meissner - - * configure.in (tic80-*-*): Don't require 'coff'. - * configure: Regenerate. - -Thu Jan 9 09:08:43 1997 Ian Lance Taylor - - * read.c (emit_expr): Check for overflow of a negative value - correctly. - * write.c (fixup_segment): Likewise. - * config/obj-coff.c (fixup_segment): Likewise. - - * config/tc-m68k.c (struct label_line): Define. - (labels, current_label): New static variables. - (md_assemble): Mark current_label as text, and clear it. - (m68k_frob_label): New function. - (m68k_flush_pending_output): New function. - (m68k_frob_symbol): New function. - * config/tc-m68k.h (tc_frob_label): Define. - (md_flush_pending_output): Define. - (tc_frob_symbol): Don't warn, just call m68k_frob_symbol. - (tc_frob_coff_symbol): Likewise. - - * read.c (read_a_source_file): When defining a macro in MRI mode, - don't add the symbol to the symbol table. - -Tue Jan 7 11:21:42 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (tc_gen_reloc): Handle sym1-sym2 fixups - here since fixup_segment doesn't (linkrelax is set). - * config/tc-mn10200.c (tc_gen_reloc): Likewise. - -Mon Jan 6 15:19:32 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (md_assemble): Tweak fx_offset for pc-relative - relocs. - -Fri Jan 3 16:47:08 1997 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (struct hppa_fix_struct): Tweak fx_r_field's type - to avoid warnings with the native HP compiler. - (fix_new_hppa): Similarly for the r_type argument. - (pa_build_unwind_subspace, hppa_elf_mark_end_of_function): Enclose - in an #if OBJ_ELF to keep gcc -Wall quiet. - (md_apply_fix): Always initialize "result". - - * config/tc-mn10200.c (md_assemble): Generate relocations. - -Fri Jan 3 18:17:23 1997 Andreas Schwab - - * config/tc-m68k.c (s_even): Adjust the alignment of the current - section. - -Fri Jan 3 17:10:33 1997 Richard Henderson - - * config/obj-elf.c (elf_file_symbol): When using ECOFF debugging, - pass on the new file hook. - - * config/tc-alpha.c (alpha_fix_adjustable): Not quite the same as - !alpha_force_relocation, as local LITERALs can be adjusted to be - relative to the section. - -Fri Jan 3 12:09:24 1997 Ian Lance Taylor - - * config/obj-coff.c (yank_symbols): If tc_frob_coff_symbol is - defined, call it. - * config/tc-m68k.h (tc_frob_symbol): Check whether text label is - aligned to odd boundary. - (tc_frob_coff_symbol): Define. - - * doc/as.texinfo (Set): Change parenthesized @xref to @pxref. - - * macro.c (macro_expand_body): In MRI mode, just copy a single &. - - * config/tc-m68k.c (m68k_ip): Call frag_grow before adding a - PCINDEX frag. From Ronald F. Guilmette . - - * config/tc-m68k.c (m68k_ip): Accept 'B' as a size for an - immediate value. - (md_assemble): If the size is 'B', set fx_signed. - (md_apply_fix_2): Use fx_signed when checking for overflow. - - * write.h (struct fix): Add fx_signed field. - * write.c (fix_new_internal): Initialize fx_no_overflow and - fx_signed fields. - (fixup_segment): Use fx_signed when checking for overflow. - * config/obj-coff.c (fixup_segment): Check fx_no_overflow and - fx_signed when checking for overflow. - -Thu Jan 2 13:37:29 1997 Ian Lance Taylor - - * NOTES, NOTES.config: Removed. These are rarely, if ever, - updated, and all the useful information is in doc/internals.texi. - - Based on patch from Ronald F. Guilmette : - * read.c (read_a_source_file): Check for conditional operators - before doing an MRI pending alignment. - * config/tc-m68k.h (m68k_conditional_pseudoop): Declare. - (tc_conditional_pseudop): Define. - * config/tc-m68k.c (m68k_conditional_pseudop): New function. - * doc/internals.texi (CPU backend): Describe - tc_conditional_pseudoop. - - Based on patch from Ronald F. Guilmette : - * config/tc-m68k.c (m68k_rel32_from_cmdline): New static - variable. - (md_begin): Check m68k_rel32_from_cmdline before setting - m68k_rel32. - (m68k_mri_mode_change): Likewise. - (md_longopts): Add --disp-size-default-16 and - --disp-size-default-32. - (md_parse_option): Handle new options. - (md_show_usage): Mention new options. - * doc/c-m68k.texi (M68K-Opts): Document new options. - - Based on patch from Ronald F. Guilmette : - * config/tc-m68k.c (m68k_index_width_default): New static - variable. - (m68k_ip): Use m68k_index_width_default to set the size of a base - register whose size was not given. - (md_longopts): Add --base-size-default-16 and - --base-size-default-32. - (md_parse_option): Handle new options. - (md_show_usage): Mention new options. - * doc/c-m68k.texi (M68K-Opts): Document new options. - - * doc/c-mips.texi: Mention ISA level 4, and the -mips16 option. - - * configure.in: Recognize mips-*-linux* target. - * configure: Rebuild. - - * config/tc-mips.c (load_register): Rewrite 64 bit handling to - work if valueT is only 32 bits. - - * config/tc-mips.c: Throughout, check target_big_endian rather - than byte_order. - (byte_order): Remove. - (mips_init_after_args): Remove. - * config/tc-mips.h (LITTLE_ENDIAN, BIG_ENDIAN): Don't define. - (mips_init_after_args): Don't declare. - (tc_init_after_args): Don't define. - - * config/tc-mips.h (tc_frob_after_relocs): Define if - OBJ_MAYBE_ELF. - (mips_elf_final_processing): Likewise. - (ELF_TC_SPECIAL_SECTIONS): Likewise. - -Tue Dec 31 15:12:35 1996 Michael Meissner - - * config/tc-v850.c (md_assemble): If this is sst.{h,w} or - sld.{h,w} and the operand is relocatable, adjust the adend by - shifting it right one bit. - -Tue Dec 31 12:56:41 1996 Ian Lance Taylor - - * read.c (read_a_source_file): Check mri_pending_align after - checking for a macro. From Ronald F. Guilmette - . - - * Makefile.in (ALL_CFLAGS): Add -D_GNU_SOURCE. - - * config/tc-sparc.c (md_apply_fix3): Rename from md_apply_fix, and - add segment argument. If OBJ_ELF, treat a relocation against a - symbol in a linkonce section like a relocation against an external - symbol. - * config/tc-sparc.h (MD_APPLY_FIX3): Define. - -Mon Dec 30 11:35:40 1996 Ian Lance Taylor - - * config/tc-mips.c (mips16_macro): Add case for M_ABS. - -Fri Dec 27 22:51:51 1996 Fred Fish - - * NOTES.config (Implementation): as.h #define's "GAS" not "gas", - includes config.h instead of host.h, tc.h instead of tp.h, and - targ-env.h instead of target-environment.h. - Also, obj-format.h includes targ-cpu.h instead of - target-processor.h. - * configure.in (case ${generic_target}): Add tic80-*-coff entry. - * configure: Rebuild with autoconf. - * config/obj-coff.h (coff/tic80.h): Include if TC_TIC80 defined. - (TARGET_FORMAT): Define to "coff-tic80". - * config/tc-tic80.c: New file for TIc80 support. - * config/tc-tic80.h: New file for TIc80 support. - -Fri Dec 27 11:42:29 1996 Ian Lance Taylor - - * doc/as.texinfo (M): Mention explicitly that -M changes macro - handling. - -Thu Dec 19 12:06:08 1996 Ian Lance Taylor - - * write.c (adjust_reloc_syms): If the fixup symbol has been - equated to an undefined symbol, convert the fixup to being against - the target symbol. Remove obsolete code handling a special case - for i386 PIC. - -Wed Dec 18 22:54:39 1996 Stan Shebs - - * mpw-make.sed: Use NewFolderRecursive for installation. - -Wed Dec 18 16:00:42 1996 Martin M. Hunt - - * config/tc-d10v.c (do_assemble): Correct previous bug fix. - -Wed Dec 18 15:27:40 1996 Martin M. Hunt - - * config/tc-d10v.c (md_assemble): Fix bug which caused - second instruction in a line to be case sensitize. - -Wed Dec 18 10:08:46 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (mn10200_insert_operand): Don't - range check operands with MN10200_OPERAND_NOCHECK set. - (check_operand): Likewise. - -Tue Dec 17 10:59:32 1996 Ian Lance Taylor - - * config/tc-mips.c: Undo part of last Friday's alignment changes. - (md_begin): Always align the text section to a four byte - boundary. - (append_insn): Remove call to record_align. - - * config/tc-mips.c (insn_label): Remove. - (struct insn_label_list): Define. - (insn_labels, free_insn_labels): New static variables. - (mips_clear_insn_labels): New static function. - (append_insn): Mark all mips16 text labels, and make them odd. - Handle all labels after emitting a nop, not just one. Call - mips_clear_insn_labels rather than just clearing insn_label. - (mips_emit_delays): Add insns parameter, and use it to decide - whether to mark mips16 labels. Handle all labels, not just one. - Force mips16 labels to be odd. Change all callers. - (mips16_immed): Don't check for an odd branch target. - (md_apply_fix): Don't check mips16 mode for a branch reloc. - (mips16_extended_frag): Ignore the low bit in a branch target. - (md_convert_frag): Likewise. - (mips_no_prev_insn): Call mips_clear_insn_labels rather than just - clearing insn_label. - (mips_align, mips_flush_pending_output, s_cons): Likewise. - (s_float_cons, s_gpword): Likewise. - (s_align): Use insn_labels rather than insn_label. - (s_cons, s_float_cons, s_gpword): Likewise. - (mips_frob_file_after_relocs): New function. - (mips_define_label): Rewrite to add to insn_labels list. - * config/tc-mips.h (tc_frob_file_after_relocs): Define. - * ecoff.c (ecoff_build_symbols): If the size of a function comes - out odd, increment it. - - * config/tc-mips.c (append_insn): Only update prev_insn when not - reordering if place is NULL. - - * config/tc-mips.c (mips16_ip): Check for a missing expression - when using the register indirect addressing mode. - -Mon Dec 16 10:08:46 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c (mn10200_insert_operand): Don't - check 24bit operands for overflow. - (check_operand): Likewise. - -Mon Dec 16 11:50:40 1996 Ian Lance Taylor - - * doc/as.texinfo (Section): Document how to use the .section - pseudo-op for COFF and ELF. - -Sun Dec 15 15:26:37 1996 Ian Lance Taylor - - * write.c (adjust_reloc_syms): Fix linkonce check for ELF. - -Sat Dec 14 22:37:27 1996 Ian Lance Taylor - - * config/tc-mips.c (prev_insn_reloc_type): New static variable. - (RELAX_MIPS16_ENCODE): Add dslot and jal_dslot arguments, and - store them. Adjust other RELAX_MIPS16 macros. - (RELAX_MIPS16_DSLOT): Define. - (RELAX_MIPS16_JAL_DSLOT): Define. - (append_insn): Pass new arguments to RELAX_MIPS16_ENCODE. Correct - handling of whether previous instruction has a fixup. Set - prev_insn_reloc_type. - (mips_no_prev_insn): Clear prev_insn_reloc_type. - (mips16_extended_frag): Use the right base address for a PC - relative add or load. - (md_convert_frag): Likewise. If a PC relative add or load is - used, record the alignment for the section. - -Fri Dec 13 13:00:33 1996 Ian Lance Taylor - - * write.c (adjust_reloc_syms): Don't reduce a reloc against a - linkonce section into a reloc against the section symbol. - - * config/tc-mips.c (mips16_macro): Remove nop instructions after - branch instructions. - - * config/tc-mips.c (md_begin): If configured for an embedded ELF - system, don't set the section alignment to 2**4. - (s_change_sec): Likewise. - (append_insn): Call record_alignment for the section. - (md_section_align): Don't align the section size for an embedded - ELF system. - -Thu Dec 12 16:40:47 1996 Ian Lance Taylor - - * write.c (adjust_reloc_syms): Make sure that symbols are - resolved; expression symbols may have been skipped. - * config/obj-coff.c (fixup_segment): Likewise. - -Thu Dec 12 15:18:21 1996 Michael Meissner - - * config/tc-ppc.c (ppc_elf_suffix): Move @plt to - BFD_RELOC_24_PLT_PCREL relocation. - (md_apply_fix3): Support BFD_RELOC_24_PLT_PCREL. - -Tue Dec 10 13:51:55 1996 Martin M. Hunt - - * config/tc-d10v.c (write_2_short): Remove code that called - parallel_ok() when the programmer specified parallel instructions. - -Tue Dec 10 12:23:19 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_assemble): Update to handle endianness - issues correctly. - - * config/tc-mn10200.c (md_assemble): Opcode 0x0 is valid! - * config/tc-mn10300.c (md_assemble): Likewise. - -Tue Dec 10 11:37:14 1996 Ian Lance Taylor - - * config/tc-mips.c (append_insn): Make sure there is enough room - in a frag after a mips16 instruction to switch it with a jump - instruction. - - * config/tc-mips.c (mips16_extended_frag): Give an error for an - attempt to use a non absolute symbol in an extending frag. - -Mon Dec 9 16:48:20 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10200.c: Flesh out assembler support for MN10200. - * config/tc-mn10200.h: Likewise. - -Mon Dec 9 17:09:42 1996 Ian Lance Taylor - - * app.c (do_scrub_chars): At the end of a C comment, pass space to - UNGET rather than PUT. Set old_state before setting state to -2. - - * config/tc-mips.c (mips16_extended_frag): Avoid an infinite loop - when extending because the value is exactly maxtiny + 1. - - * config/tc-mips.c (RELAX_MIPS16_ENCODE): Add small and ext - arguments, and store them. Adjust other RELAX_MIPS16 macros. - (RELAX_MIPS16_USER_SMALL): Define. - (RELAX_MIPS16_USER_EXT): Define. - (mips16_small, mips16_ext): New static variables. - (append_insn): Pass mips16_small and mips16_ext to - RELAX_MIPS16_ENCODE. - (mips16_ip): Set mips16_small and mips16_ext. - (mips16_immed): Don't check mips16_autoextend. - (mips16_extended_frag): Check USER_SMALL and USER_EXT. - - * write.c (write_relocs): Print an error for an out of range - fixup, rather than calling abort. - - * as.c (main): Unlink the output file if there are errors while - generating the fixups. - -Fri Dec 6 18:48:13 1996 Ian Lance Taylor - - * config/tc-mips.c (mips16_extended_frag): Don't call - S_GET_VALUE. - (md_convert_frag): Call resolve_symbol_value before calling - S_GET_VALUE, and don't add in the frag address. - - * config/tc-mips.c (mips16_immed): Add file and line parameters, - and use them when reporting errors. Change all callers. - -Fri Dec 6 15:36:32 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c: Fix various gcc -Wall warnings. - Remove '$' prefixing for registers. - -Fri Dec 6 00:55:48 1996 Martin - - * config/tc-d10v.c (md_assemble): Check to see if prev_seg - is initialized before using it. - (d10v_cleanup): No longer uses its argument, so make it void. - - * config/tc-d10v.h (d10v_cleanup): Change prototype. - -Thu Dec 5 11:03:31 1996 Ian Lance Taylor - - * write.c (fixup_segment): Don't discard the symbol for a PC - relative fixup to an absolute symbol. - -Wed Dec 4 15:42:41 1996 Martin M. Hunt - - * config/tc-d10v.c (md_assemble, d10v_cleanup): Fix bug - with multiple sections. - -Wed Dec 4 13:00:07 1996 Ian Lance Taylor - - * config/tc-mips.c (md_longopts): Rename mips-16 to mips16, and - no-mips-16 to no-mips16. - (s_mipsset): Accept .set mips16 and .set nomips16. - -Wed Dec 4 10:35:33 1996 Michael Meissner - - * config/tc-ppc.c (ppc_elf_suffix): Take expressionS pointer - argument, and check for +/- constant following the suffix, folding - it into the expression. - (ppc_elf_cons): Change ppc_elf_suffix calls. - (md_assemble): Ditto. - (shlib): Replace boolean mrelocatable with enumeration shlib. - (md_parse_option): Discriminate between PIC style shared libraries - and -mrelocatable. - (ppc_elf_validate_fix): Don't report warnings for PIC style shared - libraries. - -Tue Dec 3 23:18:29 1996 Michael Meissner - - * config/tc-ppc.h ({tc,ppc}_comment_chars): Define, so that we can - change the comment characters. - - * config/tc-ppc.c (comment_chars): Delete in favor of - tc_comment_chars. - (ppc_{eabi,solaris}_comment_chars): Eabi and Solaris versions of - comment chars. - (ppc_comment_chars): Select appropriate comment chars by default. - (msolaris): New flag for -m{,no-}solaris. - (md_parse_option): Recognize -K pic. Add support for - -m{,no-}solaris. - (md_show_usage): Update. - (md_begin): Do not set ELF flags if Solaris. - (ppc_elf_suffix): @local sets R_PPC_LOCAL24PC relocation. - (md_apply_fix3): Add support for R_PPC_LOCAL24PC. - -Mon Dec 2 13:48:57 1996 Ian Lance Taylor - - * as.c (main): Correct handling of flag_always_generate_output. - -Sun Dec 1 21:46:05 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (tc_gen_reloc): Get the addend from - fx_offset, not fx_addnumber. - - * config/tc-mn10300.h (tc_fix_adjustable): Don't do any - reloc adjustments. - -Sat Nov 30 17:34:48 1996 Eliot Dresselhaus - - * config/tc-i386.c: Correct misspelling: balenced to balanced. - -Wed Nov 27 13:25:39 1996 Ian Lance Taylor - - * config/tc-mips.c (md_section_align): Check for an alignment of - 4, not an alignment of 16. Corrects August 7 patch. - -Tue Nov 26 10:33:16 1996 Ian Lance Taylor - - * configure, conf.in: Rebuild with autoconf 2.12. - - * config/tc-ppc.c (ppc_elf_lcomm): Don't give an error if no - alignment is specified. - - Add support for mips16 (16 bit MIPS implementation): - * config/tc-mips.c: Extensive additions for mips16 support, not - listed here. - (RELAX_OLD, RELAX_NEW): Use only 7 bits each. - (insn_uses_reg): Change last parameter to an enum. - * config/tc-mips.h (LOCAL_LABELS_DOLLAR): Define as 0. - (md_relax_frag): Define as mips_relax_frag. - (mips_relax_frag): Declare. - (struct mips_cl_insn): Add use_extend and extend fields. - (tc_fix_adjustable): Define. - * config/obj-elf.h (S_GET_OTHER): Define. - (S_SET_OTHER): Define. - -Mon Nov 25 18:02:29 1996 J.T. Conklin - - * config/tc-m68k.c (m68k_ip): Implement cases for new <, >, m, n, - o and p operand specifiers. - -Mon Nov 25 10:45:14 1996 Doug Evans - - * write.c: Delete "ifndef md_relax_frag" around is_dnrange. - (relax_segment, case rs_org): Move code inside braces. Move locals - target,after inside too. - (relax_segment, case rs_machine_dependent): Guts moved to ... - (relax_frag): New function. - Call md_prepare_relax_scan if defined. - * config/tc-m68k.h (md_prepare_relax_scan): Renamed from - M68K_AIM_KLUDGE. - -Mon Nov 25 08:49:36 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (address_registers): Use '$' as register - prefix instead of '%'. - (data_registers, other_registers, md_assemble): Likewise. - - * config/tc-mn10300.c (address_registers): Use '%' prefix for regs. - (data_registers, other_registers, md_assemble): Likewise. - - * config/tc-mn10300.c (md_assemble): Correctly determine the - correct location and type for each relocation. - (md_pcrel_from): Simplify. - -Fri Nov 22 15:42:26 1996 Ian Lance Taylor - - * config/tc-sh.c (md_convert_frag): Improve warning when branch is - converted into branch around branch. - -Thu Nov 21 11:56:11 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.h (DIFF_EXPR_OK): Don't define this. - (tc_fix_adjustable): Don't adjust relocs against weak symbols or - pc-relative relocs. - * config/tc-mn10300.c (md_begin): Set linkrelax. - (md_assemble): Create fixups as needed. - (md_apply_fix3): Gut. It shouldn't ever get called anymore. - -Tue Nov 19 17:48:06 1996 Michael Meissner - - * config/tc-d10v.c (parallel_ok): When automatically converting - serial ops to parallel, do not consider a branch as the first - instruction. - -Tue Nov 19 13:35:22 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_assemble): Handle MN10300_OPERAND_REG_LIST. - -Mon Nov 18 15:26:55 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (mn10300_insert_operand): Provide prototype - via PARAMS. - (check_operand): Likewise. - -Mon Nov 18 15:22:28 1996 Michael Meissner - - * config/tc-d10v.c (parallel_ok): Branch and link instructions - modify r13. - (write_2_short): Call parallel_ok to check whether two short - instructions the user requested execute in parallel, can be - executed that way. - -Thu Nov 14 11:17:49 1996 Martin M. Hunt - - * config/tc-d10v.c (write_2_short): Fix bug that wouldn't - allow a branch and link in parallel with an exe instruction. - -Fri Nov 8 13:55:03 1996 Martin M. Hunt - - * doc/c-d10v.texi: Add info on @word modifier. - -Wed Nov 6 13:46:07 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (mn10300_insert_operand): MN10300_OPERAND_SPLIT - operands are assumed to be 32bits. Use "bits" field to hold the - number of bits in the main instruction word for MN10300_OPERAND_SPLIT. - (mn10300_check_operand): MN10300_OPERAND_SPLIT operands are assumed - to be 32bits. - - * config/tc-mn10300.c (mn10300_insert_operand): Shift low part - of a MN10300_OPERAND_SPLIT operand by operand->shift. - - * config/tc-mn10300.c (mn10300_insert_operand): Handle - MN10300_OPERAND_SPLIT. - -Tue Nov 5 13:30:40 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_assemble): Insert operands into - the extension part of the instruction if necessary. - (mn10300_insert_operand): Accept pointer to extension word - argument. Make insn a pointer argument too. Return type - is now void. All callers changed. - -Mon Nov 4 12:53:40 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (mn10300_insert_operand): Handle - repeated register operands. - -Fri Nov 1 10:42:49 1996 Ian Lance Taylor - - * doc/as.texinfo: Added section on reporting bugs. - - * config/tc-alpha.c: Change uses of void * to PTR. Change the - alpha_macro emit field to expect a const argument, and change the - arg field to be const. Fix some spacing to follow the GNU - standard. - -Fri Nov 1 10:32:03 1996 Richard Henderson - - * config/tc-alpha.c (md_parse_option): Add knowledge of 21164pc - (pca56) and 21264 (ev6) cpus. - (md_apply_fix): Private relocation types are now negative. - (alpha_force_relocation): Likewise. - (tc_gen_reloc): Likewise. - (emit_insn): Likewise. - (emit_ldXu): Do the right thing when the hardware can do byte insns. - (emit_stX): Likewise. - (emit_sextX): Likewise. - -Thu Oct 31 16:33:21 1996 Ian Lance Taylor - - * config/obj-coff.c (do_relocs_for): Call resolve_symbol_value on - a symbol found in a reloc. - - * symbols.c (resolve_symbol_value): Improve the error message if - an undefined symbol is used in an expression. - -Wed Oct 30 20:15:35 1996 Ian Lance Taylor - - * doc/internals.texi: Rewrite, and add a lot of documentation. - * doc/Makefile.in (internals.info): New target. - -Wed Oct 30 14:55:57 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.h (tc_fix_adjustable): Don't adjust relocs - against weak symbols. - -Tue Oct 29 12:28:16 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (md_assemble): Don't lose for relaxable - addresses like .+6. - - * config/tc-v850.c (md_convert_frag): Make sure we insert the - fixup at the right address within the frag. - - * config/tc-v850.c (md_convert_frag): Don't set fragP->fr_fix - to an absolute value, instead increment it as needed. - - * config/tc-v850.h (TC_GENERIC_RELAX_TABLE): Define. - * config/tc-v850.c: Fix some indention problems. - (md_relax_table): Define for D9->D99 branch displacement - relaxing. - (md_convert_frag): Do something useful instead of aborting. - (md_estimate_size_before_relax): Likewise. - (md_assemble): Note if the matching instruction has a relaxable - operand. If it does, allocate frag with frag_var and don't - do any fixups. - -Mon Oct 28 10:48:40 1996 Martin M. Hunt - - * config/tc-d10v.h (md_cleanup): New function. This is needed to - write out any buffered instructions when a ".end" is found. - -Mon Oct 28 10:43:45 1996 Martin M. Hunt - - * read.c (read_a_source_file): New hook md_cleanup(). - -Fri Oct 25 00:01:00 1996 Ian Lance Taylor - - * write.c (fix_new_exp): Use make_expr_symbol to build an - expression symbol for a complex fixup. - -Thu Oct 24 14:31:04 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (v850_reloc_prefix): Several disgusting - hacks to improve parsing of complex hi, lo, zda, etc - expressions. - (md_assemble): Don't demand and eat a trailing ')' after finding - a v850 relocation prefix. Sign extend the constant in a - BFD_RELOC_LO16 expression. Do eat a trailing ')' after a complete - operand. - (parse_cons_expression_v850): Don't eat a trailing ')' after - finding a v850 relocation prefix. - - * config/tc-v850.h (TC_PARSE_CONS_EXPRESSION): Define. - (TC_CONS_FIX_NEW): Likewise. - * config/tc-v850.c (parse_cons_expression_v850): New function. - (cons_fix_new_v850): Likewise. - - * config/tc-v850.h (tc_fix_adjustable): Don't adjust TDA relocs. - -Wed Oct 23 18:20:29 1996 Ian Lance Taylor - - * config/tc-ppc.c (md_apply_fix3): Give a better warning message - for an unknown relocation type. - -Wed Oct 23 16:21:28 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (md_pseudo_table): Add .word; allocates - 4 bytes of space. - -Tue Oct 22 22:01:25 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (md_assemble): Handle TDAOFF relocs - differently for movea & sst/sld insns. - -Tue Oct 22 17:09:32 1996 Michael Meissner - - * config/tc-d10v.c (parallel_ok): Don't allow illegal combinations - of instructions. - -Tue Oct 22 11:28:39 1996 Ian Lance Taylor - - * obj.h (struct format_ops): Add frob_file_after_relocs field. - * config/obj-multi.h (obj_frob_file_after_relocs): Define. - * config/obj-ecoff.c (ecoff_format_ops): Initialize new - frob_file_after_relocs field. - * config/obj-elf.c (elf_format_ops): Likewise. - * config/tc-mips.c: Undefine obj_frob_file_after_relocs before - including obj-elf.h. - -Mon Oct 21 11:38:30 1996 Ian Lance Taylor - - * config/tc-mips.c (cons_fix_new_mips): Only treat 8 byte reloc - specially if not ELF. - (md_apply_fix): Handle BFD_RELOC_64. - (tc_gen_reloc): Handle BFD_RELOC_64. - - * config/tc-i386.c (md_apply_fix3): Don't increment value for a PC - relative reloc when BFD_ASSEMBLER and OBJ_AOUT (more ugly gas - reloc hacking). - - * config/obj-aout.h (S_IS_DEFINE): non BFD_ASSEMBLER version: - Don't check S_GET_OTHER. - -Fri Oct 18 14:06:26 1996 Ian Lance Taylor - - * config/tc-mips.c (mips_ip): Accept an odd floating point - register with l.s or s.s. - - * config/obj-aout.c (obj_pseudo_table): Use obj_aout_type for - .type pseudo-op. - (obj_aout_type): New static function. - -Thu Oct 17 17:55:17 1996 Ian Lance Taylor - - * Makefile.in ($(OBJS)): Depend upon libiberty.h. - -Wed Oct 16 11:28:31 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (v850_reloc_prefix): Recognize zdaoff, tdaoff - and sdaoff expressions. - - * write.c (fixup_segment): Don't add symbol value to addend if - TC_V850 and OBJ_ELF. - * config/tc-v850.h (tc_fix_adjustable): Don't adjust any - pc-relative fixups. - - * config/tc-v850.c (md_pcrel_from): Undo yesterday's changes. - (md_pcrel_from_section): Likewise. - * config/tc-v850.h (MD_PCREL_FROM_SECTION): Likewise. - -Tue Oct 15 23:19:00 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (md_pcrel_from): Delete unused function. - (md_pcrel_from_section): New function. - * config/tc-v850.h (MD_PCREL_FROM_SECTION): Define. - -Mon Oct 14 13:59:12 1996 Ian Lance Taylor - - * config/tc-mips.c (load_register): Add cast to offsetT when using - a constant with &~. - -Mon Oct 14 11:24:28 1996 Richard Henderson - - * config/obj-elf.c (elf_frob_file): Move ECOFF debug processing to ... - (elf_frob_file_after_relocs): ... here. New function. - * config/obj-elf.h (obj_from_file_after_relocs): New macro. - * write.c (write_object_file): Call *frob_after_relocs after the - call to write_relocs. - - * config/tc-alpha.c: Use new BFD_RELOC_ALPHA_ELF_LITERAL reloc. - - * config/tc-alpha.c (load_expression): Don't SET_VALUE on the section - symbol, as this messes up linking. Instead, expand the recursive call - inline and change up the appropriate bits to get the 0x8000 offset - in the reloc addend. - -Thu Oct 10 17:30:31 1996 Ian Lance Taylor - - * config/tc-sparc.h (tc_fix_adjustable): Permit the difference of - two symbols in the same segment to be adjusted. - - * configure.in: Don't get confused by CPU-VENDOR-linux-gnu. - * configure: Rebuild. - -Thu Oct 10 17:22:18 1996 Michael Meissner - - * config/tc-ppc.c (ppc_insert_operand): Change most warnings into - errors. - (ppc_elf_validate_fix): Ditto. - (md_assemble): Ditto. - (ppc_tc): Ditto. - (ppc_pe_section): Ditto. - (ppc_frob_symbol): Ditto. - -Thu Oct 10 12:05:45 1996 Jeffrey A Law (law@cygnus.com) - - * config/mn10300.c (md_assemble): Pass an extra shift count - to mn10300_insert_operand based on the opcode format. - (mn10300_insert_operand): Accept and use extra shift count - parameter. - - * config/tc-mn10300.c (md_assemble): Use FMT_* macros for - formats rather than hard-coded constants. - - * config/tc-mn10300.c (md_assemble): Format D5 instructions - are 7 bytes long. Write out instructions in big-endian format. - -Tue Oct 8 14:56:15 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.c (md_assemble): Tweak further so - that all instructions are parsed correctly. - -Tue Oct 8 13:02:21 1996 Ian Lance Taylor - - * as.h: Include libiberty.h. - (xmalloc, xrealloc): Don't declare. - * as.c: Don't include libiberty.h. - * expr.c, read.c, stabs.c, config/obj-coff.c: Likewise. - * config/tc-mips.c: Likewise. - * messages.c: Likewise. - (xstrerror): Don't declare. - * xmalloc.c: Remove. - -Mon Oct 7 16:53:23 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10300.h (pre_defined_registers) Remove. - (system_registers, cc_names): Likewise. - (address_registers, data_registers, other_registers): New register - arrays. - (register_name, system_register_name, cc_name): Remove. - (mn10300_reloc_prefix): Likewise. - (data_register_name): New function. - (address_register_name, other_register_name): Likewise. - (md_assemble): Rough cut at parsing operands. Remove lots of - unwanted code. - (md_apply_fix3): Disable for now. - -Mon Oct 7 11:38:34 1996 Andreas Schwab - - * config/tc-m68k.c (select_control_regs): New function, extracted - out of m68k_init_after_args. - (m68k_init_after_args): Use it. - (mri_chip): Use it here as well to update set of allowed control - regs for movec. - -Mon Oct 7 11:24:29 1996 Ian Lance Taylor - - * config/obj-elf.c (elf_begin): New function. - (obj_elf_section): Add the section symbol to the symbol table. - * config/obj-elf.h (obj_begin): Define. - (elf_begin): Declare. - * as.c (perform_an_assembly_pass): Call obj_begin if it is - defined. - -Fri Oct 4 18:37:32 1996 Ian Lance Taylor - - * config/obj-coff.c (fixup_segment): Subtract the section address - from a PC relative reloc if TC_M68K. - -Thu Oct 3 15:15:30 1996 Ian Lance Taylor - - * config/tc-sparc.c (md_pseudo_table): Make .uahalf, .uaword, and - .uaxword available even if not OBJ_ELF. - (md_atof): Remove unused local variable wordP. - -Thu Oct 3 00:16:50 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-mn10x00.c, config/tc-mn10x00.h: New files - for Matsushita MN10x00 support. - * configure.in: Recognize mn10x00-*-* - * configure: Rebuilt. - -Wed Oct 2 15:54:03 1996 Klaus Kaempf - - * obj-evax.h: move openvms definitions from here to tc-alpha.c. - * tc-alpha.c: add support for vms_case_hack like in vax/vms. - (load_expression): track clobbering of base reg before jmp/jsr. - (s_alpha_file): pass case_hack flags and source filename via - symbol table to bfd. - * tc-alpha.h (TC_CONS_FIX_NEW): define - -Tue Oct 1 16:16:01 1996 Joel Sherrill - - * configure.in (mips-*-rtems*): New target, like mips-*-elf*. - * configure: Rebuild. - -Tue Oct 1 12:37:48 1996 Ian Lance Taylor - - * read.c (s_macro): Warn if a macro has the same name as a - pseudo-op. - (s_space): In m68k MRI mode, align to a word boundary. - * macro.c (define_macro): Add namep parameter. Change all - callers. - * macro.h (define_macro): Update declaration. - - * as.c (show_usage): Print bug report address. - (parse_args): Change version printing to match current GNU - standards. - * gasp.c (show_usage): Print bug report address. - (main): Change version printing to match current GNU standards. - - * config/tc-m68k.c (init_table): Correct access control unit - register numbers. From Ken Rose . - - * config/tc-alpha.c: Add some static function prototypes. - (alpha_macros): Move to top of file. Make static. - (alpha_num_macros): Move to top of file. - -Tue Oct 1 09:36:19 1996 Stu Grossman (grossman@critters.cygnus.com) - - * tc-v850.h: Define LOCAL_LABEL to recognise _.L_* symbols - generated by DWARF. - -Sat Sep 28 03:38:08 1996 Ian Lance Taylor - - * listing.c (list_symbol_table): Remove bogus code in BFD64 case, - and just call sprintf_vma. - -Thu Sep 26 16:04:11 1996 Ian Lance Taylor - - * expr.c (expr): Change >>= to >> (fix typo). (From meissner). - -Tue Sep 24 19:05:08 1996 Ian Lance Taylor - - * read.c (float_cons): Call md_flush_pending_output if it is - defined. - -Tue Sep 24 12:22:18 1996 Martin M. Hunt - - * config/tc-d10v.c (md_operand): Created. Allows operands to - start with '#'. - * config/tc-d10v.h (md_operand): Undefined. - -Mon Sep 23 12:13:18 1996 Ian Lance Taylor - - * config/tc-m68k.c (add_fix): Treat a width of '3' like 'B'. - (md_assemble): A fixup width of '3' means a 1 byte reloc. - -Thu Sep 19 12:21:24 1996 Ian Lance Taylor - - * config/obj-coff.c (fixup_segment): Don't adjust PC relative - reloc for the i960 for a reloc in the same section. This undoes - one of the two changes made Aug 19. - -Wed Sep 18 12:11:58 1996 Ian Lance Taylor - - * config/obj-coff.c (obj_coff_endef): Both versions: Move C_STAT - symbols to the position of the debugging information. - -Mon Sep 16 11:41:40 1996 Ian Lance Taylor - - * expr.c (expr): Always use unsigned right shifts for >>. - -Thu Sep 12 10:25:45 1996 James G. Smith - - * config/tc-arm.c (md_apply_fix3): Update two thumb instruction - slots when processing BL fixups. - - * config/tc-arm.c (output_inst): Ensure Thumb BL fixup is marked - on the first half of the instruction. - -Wed Sep 11 00:09:35 1996 Ian Lance Taylor - - * ecoff.c (ecoff_stab): Create an expression symbol for a complex - stabs expression, rather than giving an error. - - * ecoff.c (ecoff_new_file): Don't do anything if we are still in - the same file. - -Tue Sep 10 11:45:37 1996 Ian Lance Taylor - - * config/tc-mips.c (append_insn): Fill in the value for a constant - jump, rather than creating a reloc. - -Mon Sep 9 10:57:42 1996 Ian Lance Taylor - - * config/tc-mips.c (append_insn): Don't swap an instruction which - sets a condition code with an instruction which uses a condition - code. - (mips_ip): In cases 'N' and 'M', look for $fccN rather than an - immediate value. - - * config/tc-mips.c (md_begin): Recognize r5000 for cpu. - (mips_ip): Give a better error message if the ISA level is wrong. - (md_parse_option): Recognize -mcpu=[v][r]5000. - -Sat Sep 7 13:25:55 1996 James G. Smith - - * config/tc-mips.c (COUNT_TOP_ZEROES): Added macro to count - leading zeroes. - (load_register): Ensure hi32 bits are not lost during lo32bit - processing. Fix shift offset that was overflowing into the next - instruction field. Add code to generate shorter sequences for - constants with a single contiguous seqeuence of ones. - -Fri Sep 6 17:07:12 1996 Martin M. Hunt - - * config/tc-d10v.c (d10v_dot_word): New function to support - "@word" with the word pseudo-op. - (md_apply_fix3): Cleanup and changes to support correct sizes - for 16 and 18-bit relocs. - -Fri Sep 6 16:00:29 1996 Doug Evans - - * configure.in (sparc-*-aout): Set `em'. - * configure: Regenerated. - * config/te-sparcaout.h: New file. - * config/tc-sparc.h (TARGET_BYTES_BIG_ENDIAN): Define. - Ifdef TE_SPARCOUT define TARGET_FORMAT and SPARC_BIENDIAN. - * config/tc-sparc.c (INSN_BIG_ENDIAN): New macro. - (SPECIAL_CASE_{SETSW,SETX}): Define. - ({NOP,OR,FMOVS,SETHI,SLLX,SRA}_INSN): Define. - (md_begin): Delete setting of `target_big_endian'. - (output_insn): New function. - (md_assemble): Rewrite. Add `setx' support. - (sparc_ip): Handle `0' operand char. Recognize setuw, setsw, setx - special cases. - (md_atof): Add little endian support. - (md_number_to_chars): Likewise. - (md_apply_fix): Likewise. - (md_longopts): Recognize -EL,-EB ifdef SPARC_BIENDIAN. - (md_parse_option): Likewise. - (md_show_usage): Print -EL, -EB ifdef SPARC_BIENDIAN. - -Thu Sep 5 13:40:29 1996 Ian Lance Taylor - - * ecoff.c (ecoff_new_file): New function. - * ecoff.h (ecoff_new_file): Declare. - * config/obj-ecoff.h (obj_app_file): Define. - -Thu Sep 5 13:39:25 1996 Richard Henderson - - * config/tc-alpha.c (load_expression): Bias the .lit8 section - symbol by 32k so that our 16-bit signed offset can address the - entire chunk. Reported by . - -Wed Sep 4 10:23:20 1996 Ian Lance Taylor - - * config/tc-mips.c (load_register): Remove unused variable tmp. - -Wed Sep 4 11:24:29 1996 James G. Smith - - * config/tc-mips.c (load_register): Remove unnecessary code that - was causing the high 32bits of 64bit constants to be lost. - -Tue Sep 3 13:52:56 1996 Martin M. Hunt - - * config/tc-d10v.c: Added changes to support function - pointers and "@word" syntax. - -Tue Sep 3 11:57:18 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c: Remove commented out and #if 0'd code. - (v850_reloc_prefix): Provide prototype. - (postfix, get_reloc, build_insn): Remove prototypes for nonexistant - functions. - (md_begin, md_assemble, md_apply_fix3): Remove unused variables. - (md_assemble): Add default to case statement. - -Sat Aug 31 16:03:00 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (md_assemble): Compute size of the instrction - from the opcode. - - * config/tc-v850.c (md_apply_fix3): Do simple byte, short and - word fixups too. - -Fri Aug 30 23:50:08 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (md_apply_fix3): Use little endian get/put - routines to fetch/store the updated instruction from/to memory. - (v850_insert_operand): If the operand has a specialized insert - routine, call it. - -Fri Aug 30 18:35:26 1996 J.T. Conklin - - * config/tc-v850.c (reg_name_search): Align calling convention to - be like identical function found in tc-ppc.c. - (get_reloc): Removed. - (v850_reloc_prefix): New function, parse lo(), hi() and hi0(). - (md_assemble): emit fixups. - (md_pcrel_from): renamed from md_pcrel_from_section, emit proper - displacement. - (md_apply_fix3): handle fixups/relocs. - * config/tc-v850.h (MD_PCREL_FROM_SECTION): Removed definition. - -Fri Aug 30 18:12:00 1996 Ian Lance Taylor - - Add SH ELF support. - * configure.in (sh-*-elf*): New target. - * config/tc-sh.h (TARGET_ARCH): Define. - (WORKING_DOT_WORD): Define. - (TC_COFF_FIX2RTYPE): Only define if OBJ_COFF. - (BFD_ARCH, COFF_MAGIC, TC_COUNT_RELOC): Likewise. - (TC_RELOC_MANGLE, tc_coff_symbol_emit_hook): Likewise. - (DO_NOT_STRIP, NEED_FX_R_TYPE, TC_KEEP_FX_OFFSET): Likewise. - (TC_COFF_SIZEMACHDEP, tc_frob_file): Likewise. - (SUB_SEGMENT_ALIGN): Likewise. - (RELOC_32): Don't define. - (tc_frob_file_before_adjust): Define if BFD_ASSEMBLER. - (target_big_endian): Declare if OBJ_ELF. - (TARGET_FORMAT): Define if OBJ_ELF. - * config/tc-sh.c: Use BFD reloc codes instead of SH COFF reloc - numbers throughout. - (tc_crawl_symbol_chain): Only define if OBJ_COFF. - (tc_headers_hook, tc_coff_sizemachdep): Likewise. - (struct sh_count_relocs): Define. - (sh_count_relocs): New static function, broken out of - sh_frob_file. Add BFD_ASSEMBLER code. - (sh_frob_section): Likewise. - (sh_frob_file): Call sh_frob_section. - (md_convert_frag): If BFD_ASSEMBLER, change type of headers, and - call section_symbol rather than seg_info (seg)->dot. - (md_section_align): Add OBJ_ELF version. - (SWITCH_TABLE_CONS): Define. - (SWITCH_TABLE): Use SWITCH_TABLE_CONS. - (md_apply_fix): Change parameter types if BFD_ASSEMBLER. Only - handle fx_r_type == 0 if not BFD_ASSEMBLER. Return 0 if - BFD_ASSEMBLER. - (struct reloc_map): Define if not BFD_ASSEMBLER. - (coff_reloc_map): Likewise. - (sh_coff_reloc_mangle): Use coff_reloc_map to convert fx_r_type. - (tc_gen_reloc): New function if BFD_ASSEMBLER. - * write.c (write_relocs): Ifdef out fx_where test which triggers - inappropriately for SH ELF. - (write_object_file): Call tc_frob_file_before_adjust and - obj_frob_file_before_adjust if they are defined. - - * write.c (write_object_file): Use BFD_RELOC_16, not - BFD_RELOC_NONE, when calling fix_new_exp for a broken word. - - * read.c (emit_expr): Fix conversion of byte count to BFD reloc - code. - -Fri Aug 30 14:47:38 1996 Martin M. Hunt - - * config/tc-d10v.c (find_opcode): Fix problem with calculating - branch sizes in across sections. - -Fri Aug 30 00:44:13 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-850.c (md_assemble): Handle hi() correctly. Handle - hi0() too. - -Wed Aug 28 23:11:08 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (md_begin): Deal with end of opcode - table marker. - -Wed Aug 28 19:20:04 1996 Martin M. Hunt - - * config/tc-d10v.c (find_opcode): Fix a bug which could generate - the wrong opcode for cases like st2w where there are many forms - of the same instruction. - -Tue Aug 27 13:53:22 1996 Ian Lance Taylor - - * expr.c (operand): If md_parse_name is defined, call it before - calling symbol_find_or_make. - * config/tc-ppc.h (md_parse_name): Define. - (ppc_parse_name): Declare. - * config/tc-ppc.c (reg_name_search): Add regs and regcount - parameters. - (register_name): Update call to reg_name_search. - (cr_operand): New static variable. - (cr_names): New static const array. - (ppc_parse_name): New function. - (md_assemble): If PPC_OPERAND_CR is set in the operand flags, set - cr_operand before calling expression. - -Tue Aug 27 09:05:50 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (tc_gen_reloc): Add new argument to - hppa_gen_reloc_type call. - -Mon Aug 26 18:24:51 1996 Martin M. Hunt - - * config/tc-d10v.c: Fixed ".word". Fixed problem with range checking - on addresses. Improved error messages. - * doc/c-d10v.texi: Added docs for register pairs. - -Mon Aug 26 13:39:27 1996 Martin M. Hunt - - * config/tc-d10v.c (parallel_ok): Fix bug in parallel - checking code. - -Mon Aug 26 14:38:22 1996 Ian Lance Taylor - - * ecoff.c (init_file): Initialize fMerge to 1. - (add_file): Restore old file merging code, but only merge files if - fMerge is set. - (ecoff_directive_loc): Clear fMerge field of current file. - (ecoff_generate_asm_lineno): Likewise. - -Fri Aug 23 11:40:47 1996 Martin M. Hunt - - * doc/c-d10v.texi: Fix typo. - -Fri Aug 23 10:41:32 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-v850.c (md_assemble): Correct bit masking for - hi and lo expressions. - - * config/tc-v850.c (md_assemble): Rough cut at demanding - "ep" or "r30" in sst and sld instructions. - (md_apply_fix3): Don't abort. Just warn that we don't - have relocs yet. - - * config/tc-v850.c (CC_NAME_CNT): Define. - (cc_name): New function. - (md_assemble): Handle V850_OPERAND_CC correctly. - - * config/tc-v850.c (md_assemble): Don't forget to initialize - "insn"! - - * config/tc-v850.c (reg_name_search): Generalize to search - any given register table. - (register_name): Pass appropriate table and size to reg_name_search. - (system_register_name): New function. - (SYSREG_NAME_CNT): Define. - (md_assemble): Handle operands which are system registers. - - * config/tc-v850.c (md_assemble): If we find a register, but the - opcode doesn't want a register, then we don't have a match. - (md_assemble): Get size of the instruction from the opcode table. - -Thu Aug 22 10:20:30 1996 Ian Lance Taylor - - * configure.in: Set and substitute HLDENV. - * configure: Rebuild. - * Makefile.in (HLDENV): New variable. - (as.new): Use $(HLDENV). - - * ecoff.c (ecoff_directive_endef): Avoid a division by zero error - if an array dimension is not known. - -Thu Aug 22 10:50:00 1996 Martin M. Hunt - - * config/tc-d10v.c: Fix a reloc bug caused by my last change. - * doc/c-d10v.texi: Cleanup. - -Tue Aug 20 15:15:16 1996 J.T. Conklin - - * config/tc-v850.c: New file. - * config/tc-v850.h: New file. - * configure (v850-*-elf): New target. - * configure.in (v850-*-elf): New target. - -Wed Aug 21 15:50:54 1996 Martin M. Hunt - - * doc/c-d10v.texi: New file. - * doc/all.texi: Added D10V stuff. - * doc/as.texinfo: Added D10V stuff. - -Tue Aug 20 14:10:02 1996 Martin M. Hunt - - * config/tc-d10v.c: All references to defined symbols should - now use the optimal instruction. .float and .double now work. - -Mon Aug 19 14:41:36 1996 Ian Lance Taylor - - * config/obj-coff.c (fixup_segment): Adjust PC relative reloc by - section address for the i960 as is done for the i386. - -Thu Aug 15 16:37:59 1996 Stan Shebs - - * mpw-config.in: Add wildcards for config matching, add mips-*-* - case, forward-include bfd/elf-bfd.h. - -Thu Aug 15 13:24:30 1996 Martin M. Hunt - - * config/tc-d10v.c: Add additional information to the opcode - table to help determinine which instructions can be done - in parallel. - -Thu Aug 15 17:01:31 1996 James G. Smith - - * config/tc-arm.c: Major changes to add Thumb support, with lots - of change input from . - Reverted to INSN_SIZE macro, rather than insn_size variable. - (insns): Added ARM "bx" instruction support. - (tinsns): Added Thumb instruction definition structure. - (arm_tops_hsh): Added hash structure for Thumb opcodes. - (md_pseudo_table): Added ".arm", ".thumb" and ".code" pseudo-ops. - (opcode_select,s_arm,s_thumb,s_code): Added. - (decode_shift): Allow upper-case RRX. - (do_ldst): Simpler halfword support. - (do_ldmstm): Improved. - (reg_list, do_bx, thumb_reg, thumb_add_sub, thumb_shift, - thumb_mov_compare, thumb_load_store, do_t_arit, do_t_add, - do_t_asr, do_t_branch, do_t_bx, do_t_compare, do_t_ldmstm, - do_t_ldrb, do_t_ldrh, do_t_lds, do_t_lsl, do_t_lsr, do_t_mov, - do_t_push_pop, do_t_str, do_t_strb, do_t_strh, do_t_sub, do_t_swi, - do_t_adr): Added. - (md_apply_fix3): Add support for BFD_RELOC_ARM_THUMB_* relocations. - (md_parse_option): Add support for -mthumb. - (md_show_usage): Updated to reflect new command line option. - (arm_data_in_code, arm_canonicalize_symbol_name): Added. - * config/tc-arm.h: Provide TC_FIX_TYPE to allow private ARM - fragment information to be held. - -Thu Aug 15 16:12:00 1996 Richard Earnshaw (rearnsha@armltd.co.uk) - - * tc-arm.c (md_apply_fix3): Also set fixP->fx_done if fx_addsy is - non-null, but is a constant. - (fix_new_arm): Call make_expr_symbol to make the expression symbol - so that error reporting will work correctly. - -Wed Aug 14 10:37:21 1996 Ian Lance Taylor - - * config/tc-i386.c (tc_i386_fix_adjustable): Don't adjust relocs - against weak symbols. - -Tue Aug 13 17:39:24 1996 Ian Lance Taylor - - * config/tc-ppc.h (TC_FORCE_RELOCTION): Define if OBJ_XCOFF. - (ppc_force_relocation): Declare if OBJ_XCOFF. - * config/tc-ppc.c (ppc_force_relocation): New function if - OBJ_XCOFF. - -Mon Aug 12 16:49:43 1996 Ian Lance Taylor - - * config/tc-mips.h (BYTE_ORDER): Don't define. No longer used. - -Fri Aug 9 17:48:28 1996 Martin M. Hunt - - * config/tc-d10v.c: Fix problem with relocs. - -Fri Aug 9 14:16:14 1996 Ian Lance Taylor - - * config/tc-sh.c (sh_do_align): If not BFD_ASSEMBLER, always align - with nops if not in data_section or bss_section. - -Thu Aug 8 12:32:56 1996 Klaus Kaempf - - Add support for openVMS/Alpha. - * as.h (PRINTF_LIKE): Don't define if VMS, for now. - * config/obj-evax.c: New file. - * config/obj-evax.h: New file. - * config/tc-alpha.c: Add support for EVAX format if OBJ_EVAX is - defined. - * config/tc-alpha.h: Add support for EVAX format if OBJ_EVAX is - defined. Add case for bfd_target_evax_flavour. - * config/vms-a-conf.h: New file. - * conf-a-gas.com: New file. - * configure.in: Add target alpha-*-*vms*. - * configure: Rebuild. - * makefile.vms: New file. - * read.c (s_lcomm): Align bss_seg on 8 byte boundary if OBJ_EVAX. - Don't call ffs on openVMS/Alpha. - -Wed Aug 7 14:19:03 1996 Philippe De Muyter - - * configure.in: Make GAS_CHECK_DECL_NEEDED include or - if they exist. Call GAS_CHECK_DECL_NEEDED on strstr - and sbrk. - * acconfig.h (NEED_DECLARATION_STRSTR): New macro. - (NEED_DECLARATION_SBRK): New macro. - * configure, conf.in: Rebuild. - * as.h: Only include if HAVE_STRINGS_H. - (strstr): Declare if NEED_DECLARATION_STRSTR. - * as.c: If HAVE_SBRK and NEED_DECLARATION_SBRK, declare sbrk. - -Wed Aug 7 11:50:26 1996 Ian Lance Taylor - - * symbols.c (resolve_symbol_value): Handle addition or subtraction - by a constant before entering the main switch. Reject attempts to - apply an arithmetic function to non-absolute symbols, except for - the special case of subtraction of two symbols in the same - section. - - * config/tc-mips.c (md_section_align): Do align if OBJ_ELF, but - not to more than a 16 byte boundary. - - * config/tc-i386.c (tc_gen_reloc): Accept all relocs; remove - #ifndef OBJ_ELF lines. From Eric Valette . - (tc_gen_reloc): If out of memory call as_fatal rather than - assert. If no howto found, call as_bad_where rather than - as_fatal. Change the error message slightly. Set howto to a - non-NULL value in order to keep going. - -Tue Aug 6 12:58:03 1996 Martin M. Hunt - - * config/tc-d10v.c: Added code to support 32-bit fixups for stabs. - -Tue Aug 6 11:15:26 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-h8300.c (get_specific): New operand "size" derived - from ".b", ".w" and ".l" extensions. All callers changed. If - the base instruction has no operands, then use the size to - determine which specific instruction to use. - -Mon Aug 5 14:21:10 1996 Ian Lance Taylor - - * config/tc-i960.c (mem_fmt): Call parse_expr before emit. - -Fri Aug 2 11:23:31 1996 Ian Lance Taylor - - * config/tc-mips.c (md_section_align): Don't change addr if - OBJ_ELF. - -Thu Aug 1 23:51:52 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c: Revert yesterday's changes. - -Wed Jul 31 14:46:11 1996 Martin M. Hunt - - * config/tc-d10v.c: Disable range checking on 16-bit values. - -Wed Jul 31 16:27:19 1996 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Set ok_arch for every instruction, - not just the ones that don't match. - -Wed Jul 31 11:45:15 1996 Martin M. Hunt - - * config/tc-d10v.c: Fixed bugs in short relocs and range checking. - -Wed Jul 31 15:41:42 1996 James G. Smith - - * config/tc-arm.c: Changed INSN_SIZE to variable insn_size, as - pre-cursor to adding Thumb support. Also added cpu_variant flag - information to each of the asm_flg structures. - (md_parse_option): Updated ARM7 parsing to allow 't' for - thumb/halfword support, aswell as 'm' for long multiply. - (md_show_usage): Updated help message. - (md_assemble): Check that instruction flags are applicated to the - current cpu variant. - (md_apply_fix3, tc_gen_reloc): Add BFD_RELOC_ARM_OFFSET_IMM8 and - BFD_RELOC_ARM_HWLITERAL relocation support for new halfword and - signextension instructions. - (do_ldst): Generate halfword and signextension variants if - mnemonic flags match. - (ldst_extend): Do not allow shifts in the offset field of halfword - or signextension instructions. - (validate_offset_imm): Provide check on halfword and signextension - immediate range. - (add_to_lit_pool): Merge identical literal pool values. - -Tue Jul 30 14:28:23 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (selector_table): Add 'E' selector. - (cons_fix_new_hppa): Don't coke on e_esel. - (tc_gen_reloc, SOM version): Handle R_COMP2 when used - to help generate exception handling tables. - (md_apply_fix): Don't try to apply fixups with an e_esel - selector. - (hppa_fix_adjustable): Fixups with e_esel selectors - are not adjustable. - -Tue Jul 30 15:51:41 1996 Ian Lance Taylor - - * config/tc-sparc.c (md_pseudo_table): Add 2byte, 4byte, and 8byte - pseudo-ops. - -Fri Jul 26 11:43:03 1996 Martin M. Hunt - - * config/tc-d10v.c: Added lots of error checking. Added hacks - to support accumulator shifts. - -Fri Jul 26 11:56:08 1996 Ian Lance Taylor - - * symbols.c (S_SET_EXTERNAL): Let .weak override. - (S_CLEAR_EXTERNAL): Likewise. - (S_SET_WEAK): Remove error; just let .weak override. - -Thu Jul 25 15:22:51 1996 Martin M. Hunt - - * config/tc-d10v.c (md_assemble): Now handles multiline - instructions. - -Thu Jul 25 12:03:33 1996 Martin M. Hunt - - * config/tc-d10v.c: Fix packaging bug. Added range checking. - Added kludge for divs instruction. Fixed minor problem with - multiple text sections. - * config/tc-d10v.h (d10v_cleanup): Change prototype. - -Tue Jul 23 10:49:36 1996 Martin M. Hunt - - * config/tc-d10v.c (md_apply_fix3): Fix all instruction - addresses to be right-shifted by 2. - -Mon Jul 22 11:32:36 1996 Martin M. Hunt - - * config/tc-d10v.c: Many changes to get relocs working. - (register_name): No longer creates a symbol for register names. - (pre_defined_registers): moved to opcodes/d10v-opc.c. - (d10v_insert_operand): Now works correctly for either container. - * config/tc-d10v.h (d10v_cleanup): Declare. - -Mon Jul 22 14:01:33 1996 Ian Lance Taylor - - * config/tc-mips.c (tc_gen_reloc): BFD_RELOC_PCREL_HI16_S and - BFD_RELOC_PCREL_LO16 are expected to be PC relative. - -Mon Jul 22 12:46:55 1996 Richard Henderson - - * tc-alpha.c: Patches to track current minimum alignment to reduce - the number of fragments created with frag_align. - (alpha_current_align): New static variable. - (s_alpha_text): Reset alignment to 0. - (s_alpha_data, s_alpha_rdata, s_alpha_sdata): Likewise. - (s_alpha_stringer, s_alpha_space): New functions. - (s_alpha_cons, alpha_flush_pending_output): Remove functions. - (alpha_cons_align): New function to replace both of them. - (emit_insn): Only align if alpha_current_align is less than 2; - reset alpha_current_align to 2. - (s_alpha_gprel32): Likewise. - (s_alpha_section): New function. Basically duplicate the other - alpha section change hooks. Only define for ELF. - (s_alpha_float_cons): Simplify alignment handling. - (md_pseudo_table): Only define "rdata" and "sdata" if OBJ_ECOFF. - If OBJ_ELF, define "section", "section.s", "sect", and "sect.s". - Don't define the s_alpha_cons pseudo-ops. Do define - s_alpha_stringer and s_alpha_space pseudo-ops. - (alpha_align): Skip if less than current default alignment. Set - default alignment. - * tc-alpha.h (md_flush_pending_output): Remove. - (md_cons_align): Add. - - * tc-alpha.c: Add oodles of function description comments. - (md_bignum_to_chars): Remove; there are no callers. - (md_show_usage): Mention some more variants. - -Thu Jul 18 15:54:54 1996 Ian Lance Taylor - - From Andrew Gierth : - * configure.in (sparc-*-sysv4*): New target. - * configure: Rebuild. - - * config/tc-sparc.c (md_pseudo_table): Change uahalf, uaword, and - uaxword to use s_uacons. - (sparc_no_align_cons): New static variable. - (s_uacons): New static function. - (sparc_cons_align): If sparc_no_align_cons is set, just clear it - and return. - - * config/tc-sparc.c (s_common): Remove unused label allocate_bss. - - * configure.in: Add mips-*-irix6* target. Handle Irix 6 like Irix - 5 with regard to shared libraries. - * configure: Rebuild. - - * config/tc-m68k.c (m68k_ip): Use the correct length when - allocating space for the unsupported architecture error message. - -Thu Jul 18 12:57:10 1996 Michael Meissner - - * configure.in (d10v-*-*): Allow d10v-*-*, don't require d10v-*-elf*. - -Wed Jul 17 14:25:13 1996 Martin M. Hunt - - * config/tc-d10v.c: New file. - * config/tc-d10v.h: New file. - * configure (d10v-*-elf): New target. - * configure.in (d10v-*-elf): New target. - -Fri Jul 12 20:54:19 1996 Michael Meissner - - * config/tc-ppc.c (md_parse_option): Recognize -K PIC. - -Wed Jul 10 12:39:08 1996 Richard Henderson - - * config/tc-alpha.c (alpha_align): Change fill parameter - to a pointer. Take NULL as 0 or nop depending on section. Change - all callers. - (s_alpha_align): Rename local variables. - - * doc/as.texinfo (.align): Document action of omitted - fill parameter. - -Wed Jul 10 00:23:30 1996 Ian Lance Taylor - - * config/tc-ppc.c (md_apply_fix3): Give a useful error message - when an unsupported PC relative reloc is seen, rather than calling - abort. - - * app.c (do_scrub_chars): Remove not_cpp_line local variable. - Instead, check state when '#' comment is seen. - -Mon Jul 8 14:11:49 1996 Ian Lance Taylor - - * config/tc-mips.c (mips_regmask_frag): Only define if OBJ_ELF or - OBJ_MAYBE_ELF. - (tc_gen_reloc): If fixup was changed to be PC relative, change - reloc type accordingly. Use name of reloc in error message. - - * as.h: Don't define const or volatile. - * flonum.h: Don't define const. - - * config/tc-m68k.c (tc_gen_reloc): Change the code appropriately - if fx_pcrel is set. Correct setting the addend case in the - OBJ_ELF case (from Andreas Schwab - ). - (md_show_usage): Correct -mfc5200 to -m5200. - -Fri Jul 5 10:32:58 1996 J.T. Conklin - - * doc/c-m68k.texi: Document -m5200 flag. - * doc/as.texinfo: Likewise. - - * config/tc-m68k.c (m68k_ip): The coldfire does not support 8x - scale factor. - -Fri Jul 5 11:07:24 1996 Ian Lance Taylor - - * symbols.c (S_SET_EXTERNAL): Change as_warn to as_bad. - (S_CLEAR_EXTERNAL, S_SET_WEAK): Likewise. - -Thu Jul 4 11:59:46 1996 Ian Lance Taylor - - * Makefile.in (VERSION): Set to cygnus-2.7.1. - - * Released binutils 2.7. - -Thu Jul 4 10:11:33 1996 James G. Smith - - * config/tc-mips.c (mips_ip): Only perform range check when - dealing with O_constant expressions. - -Wed Jul 3 15:02:21 1996 J.T. Conklin - - * m68k-parse.h (m68k_register): Add new coldfile control - registers. - - * config/tc-m68k.c (mcf5200_control_regs): New variable, - array of control registers for the coldfire. - (cpu_of_arch): Added mcf5200. - (archs): Added mcf5200. - (init_table): Add new control registers. - (m68k_ip): Added support for new control registers. - (m68k_init_after_args): Likewise. - - * config/tc-m68k.c (md_show_usage): Add -m5200 to usage text. - -Wed Jul 3 16:05:50 1996 Ian Lance Taylor - - * read.h (is_it_end_of_statement): Declare. - * read.c (is_it_end_of_statement): Remove declaration. - - * config/tc-ppc.c (ppc_elf_suffix): Correct parenthesization of || - within &&. - (md_assemble): Fix handling of @l with an unsigned constant. Add - default case to reloc switch. - - * config/tc-i386.h (AOUT_MACHTYPE): Define as 0 if TE_386BSD. - - Based on patches from Tom Quiggle : - * ecoff.c (last_lineno): New static variable. - (add_procedure): Set last_lineno. - (ecoff_directive_loc): Likewise. - (ecoff_generate_asm_lineno): Likewise. - (ecoff_fix_loc): New function. - * ecoff.h (ecoff_fix_loc): Declare. - * config/tc-mips.c (append_insn): When inserting nops, and using - ECOFF debugging, call ecoff_fix_loc. - -Tue Jul 2 23:02:12 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-h8300.c (build_bytes): If an operand type is - marked as SRC_IN_DST retrieve it from the "destination" op. - -Sat Jun 29 13:38:31 1996 Ian Lance Taylor - - * configure.in (arm-*-riscix*): Set emulation to riscix. - * configure: Rebuild. - * config/te-riscix.h: New file to define TE_RISCIX. - - * config/tc-sh.h (SUB_SEGMENT_ALIGN): Define. - -Fri Jun 28 15:14:31 1996 Ian Lance Taylor - - * Makefile.in (config.status): Just run config.status as other - tools do. - -Fri Jun 28 11:09:38 1996 Stan Shebs - - * mpw-config.in (TARGET_OS): Add definition to conf. - -Thu Jun 27 20:39:40 1996 James G. Smith - - * config/tc-mips.c (append_insn): Parenthesize - cop_interlocks expressions. - -Thu Jun 27 12:18:26 1996 Ian Lance Taylor - - * listing.c (listing_print): Close the listing file if it is not - stdout. Close the other files opened for the listing. - - * config/tc-sparc.h (md_cons_align): Define. - (sparc_cons_align): Declare. - (HANDLE_ALIGN): Define. - (sparc_handle_align): Declare. - * config/tc-sparc.c (sparc_cons_align): New function. - (sparc_handle_align): New function. - * read.c (cons_worker): Call md_cons_align if it is defined. - - * as.h (struct frag): Add fr_file and fr_line fields. - * frags.c (frag_new): Set fr_file and fr_line. - (frag_var): Likewise. - (frag_variant): Likewise. - - * as.h (struct frag): Remove unused align_mask and align_offset - fields. - - * listing.c (calc_hex): Offset by fr_fix when examining fr_var. - From . - -Wed Jun 26 13:21:34 1996 Ian Lance Taylor - - * configure.in (mips-*-osf*): New target. - * configure: Rebuild. - - * config/tc-m68k.c: Add 68ec060 as a synonym for 68060. - -Wed Jun 26 16:23:08 1996 James G. Smith - - * config/tc-mips.c: Added cop_interlocks, to avoid NOP insertion - between co-processor comparisons and branches for the VR4300. - -Mon Jun 24 18:02:50 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) - - * Makefile.in (bindir, libdir, datadir, mandir, infodir, includedir, - INSTALL_PROGRAM, INSTALL_DATA): Use autoconf-set values. - (docdir): Removed. - * configure.in (AC_PREREQ): autoconf 2.5 or higher. - * doc/Makefile.in (bindir, libdir, datadir, mandir, infodir, - includedir): Use autoconf set values. - (docdir): Removed. - -Mon Jun 24 11:58:14 1996 Ian Lance Taylor - - * listing.c (listing_eject): Don't do anything if listing is 0. - (listing_list): Likewise. - (listing_source_line): Likewise. - (listing_title): Don't save title if listing is 0. - (listing_source_file): Check listing rather than listing_tail. - - * configure.in: On alpha*-*-osf*, link against libbfd.a if not - using shared libraries. - * configure: Rebuild. - -Fri Jun 21 18:22:23 1996 Ian Lance Taylor - - * config/tc-mips.c (mips_ip): In case 'i'/'j', don't require an - absolute expression if a relocation type was specified. - -Fri Jun 21 17:40:16 1996 Joel Sherrill - - * configure.in: Add support for *-*-rtems* configurations. - * configure: Rebuild. - -Fri Jun 21 16:01:18 1996 Richard Henderson - - * configure.in: Add alpha-*-linuxecoff* target. Use elf for - alpha-*-linux* target. Force bfd_gas for alpha-*. Require - opcodes library for alpha. - * configure: Rebuild with autoconf 2.10. - * config/tc-alpha.c: Substantial rewrite to add ELF support and - use new opcode table. - * config/tc-alpha.h (md_undefined_symbol): Don't define. - (LOCAL_LABEL): Define differently if OBJ_ELF. - (FAKE_LABEL_NAME): Define if OBJ_ELF. - * config/alpha-opcode.h: Remove. - * config/obj-elf.h: If TC_ALPHA, define ECOFF_DEBUGGING. - * Makefile.in (TARG_CPU_DEP_alpha): Depend upon - include/opcode/alpha.h rather than config/alpha-opcode.h. - -Thu Jun 20 19:10:28 1996 Ian Lance Taylor - - * config/obj-aout.c (obj_emit_relocations): Give an error if the - relocation symbol was not resolved. - * config/obj-coff.c (do_relocs_for): Likewise. - - * write.c (adjust_reloc_syms): Refetch the symbol section after - calling S_GET_VALUE, since it may have changed. - - * expr.c (struct expr_symbol_line): Define. - (expr_symbol_lines): New static variable. - (make_expr_symbol): Add entry to expr_symbol_lines. - (expr_symbol_where): New function. - * expr.h: Use extern on function declarations. - (expr_symbol_where): Declare. - * symbols.c (resolve_symbol_value): Try to use expr_symbol_where - rather than printing the meaningless name of an expression - symbol. - -Thu Jun 20 15:57:41 1996 Ken Raeburn - - * config/tc-i386.c (md_number_to_chars): Deleted. - * config/tc-i386.h (md_number_to_chars): New macro. - - * config/tc-alpha.c (build_operate_n, build_mem): Moved earlier in - the file. - (load_symbol_address, load_expression): Use build_mem. - (build_operate): New function. - (emit_addq_r): Use it. - - Wed Mar 13 22:14:14 1996 Pat Rankin - - * symbols.c (colon): #if VMS, use S_SET_OTHER to store `const_flag'. - - Tue Mar 5 14:31:45 1996 Pat Rankin - - * config/tc-vax.h (NOP_OPCODE): Define. - - Sun Feb 4 21:01:03 1996 Pat Rankin - - * config/obj-vms.h (S_IS_COMMON): Define. - (S_IS_LOCAL): Check for \002 as well as \001. - (LONGWORD_ALIGNMENT): New macro. - (SUB_SEGMENT_ALIGN): Use it. - - Fri Jan 26 17:44:09 1996 Pat Rankin - - * config/vms-conf.h: Reconcile with conf.in. - -Wed Jun 19 11:31:50 1996 Ian Lance Taylor - - * write.c (is_dnrange): Only define if TC_GENERIC_RELAX_TABLE is - defined. - - * doc/as.texinfo: Document that any number of hex digits can - follow \x. - - * as.c (struct defsym_list): Define. - (defsyms): New static variable. - (parse_args): Just put --defsym arguments on defsyms list, rather - than defining them. - (main): Define defsyms after output file is created. - - * config/tc-m68k.c (m68k_ip): Reject PRE and POST indexing mode on - cpu32. From Eric Norum . - - * config/tc-mips.c (mips_ip): In cases 'I', 'i', and 'j', set - insn_error rather than calling check_absolute_expr. - - * as.c (emulation_name): Remove unused static variable. - (default_emul_bfd_name): Add return NULL to avoid warning. - * ecoff.c (ecoff_stab): Remove unused variables name and - name_end. - * frags.c (frag_new): Remove unused variable tmp. - * hash.c (hash_grow): Parenthesize + within <<. - (hash_print_statistics): Use %lu, not %d, to print unsigned - long variables. - * messages.c: Include "libiberty.h". - (fprint_value): Add cast to avoid printf warning. - (sprint_value): Likewise. - * read.c: Include "ecoff.h". - (emit_expr): Add casts to avoid printf warnings. - * read.h: Use extern for function declarations. - (pop_insert): Declare. - * stabs.c: Include "ecoff.h". - * subsegs.c (subseg_set_rest): Remove unused variables tmp, - former_last_fragP, and new_fragP. - * subsegs.h (subsegs_print_statistics): Declare. - * symbols.c (debug_verify_symchain): Change macro to discard - arguments. - * write.c (dump_section_relocs): Likewise. - * write.h: Use extern for function declarations. - (write_print_statistics): Declare. - * config/e-mipsecoff.c (mipsecoff_bfd_name): Return NULL to avoid - warning. - * config/e-mipself.c (mipself_bfd_name): Likewise. - * config/obj-elf.h (elf_ecoff_set_ext): Declare. - - * config/tc-sparc.h (TC_RELOC_RTSYM_LOC_FIXUP): If OBJ_ELF, always - emit relocations against external symbols. - - * config/tc-alpha.c (tc_gen_reloc): Output a sensible error - message if bfd_reloc_type_lookup fails, rather than calling - assert. - - * config/tc-alpha.c (alpha_force_relocation): Add - BFD_RELOC_12_PCREL to switch. - -Tue Jun 18 20:29:57 1996 Doug Evans - - * config/tc-i386.h (LOCAL_LABEL,FAKE_LABEL_NAME): Use defaults for - TE_PE (Lfoo, not .Lfoo). - -Tue Jun 18 17:13:33 1996 Ian Lance Taylor - - * read.c (s_fill): Don't warn about a zero repeat count. - - * config/tc-mips.c (mips_ip): Don't warn about using AT as a - coprocessor register. - - * config/tc-i386.c (md_assemble): When checking the size of a - register to set the size of an instruction, do a bitwise and with - Reg8 and Reg16 rather than requiring the type to be exactly Reg8 - or Reg16. - -Tue Jun 18 13:19:51 1996 Jeffrey A. Law - - * config/tc-h8300.c (parse_reg): Tweak error messages. - (build_bytes): Likewise. - (skip_colonthing): Handle :32 suffix. - (get_specific): Promote L_24 to L_32 if it makes a match. - Don't always promote L_8 to L_16. - (do_a_fix_imm): Clean up L_32 and L_24 handling. - - * config/tc-h8300.c (Smode): New variable. - (h8300hmode): Turn off Hmode. - (h8300smode): New function. Turn on Smode and Hmode. - (md_pseudo_table): New ".h8300s" pseudo-op. - (parse_reg): Handle "exr" register. - (get_operand): Handle bizarre syntax for "stm.l" and "ldm.l". - Handle "mach" and "machl" operands for ldmac. - (get_specific): Handle "stm.l" and "ldm.l". - (build_bytes): Handle "stm.l" and "ldm.l"; handle MACREG operands. - * config/tc-h8300.h (COFF_MAGIC): Handle H8/S magic number. - (Smode): Declare. - -Mon Jun 17 15:50:53 1996 J.T. Conklin - - * doc/as.texinfo: Reorder chapter of machine dependent options so - that it is sorted by chip name. - - * doc/as.texinfo: Use consistant spelling of Vax. - * doc/c-vax.texi: Likewise. - -Mon Jun 17 11:26:56 1996 Jeffrey A. Law - - * config/tc-hppa.c (md_pseudo_table): Add ".begin_try" and ".end_try" - pseudo ops. - (tc_gen_reloc, SOM version): Handle R_BEGIN_TRY and R_END_TRY. - (md_apply_fix): Likewise. - (pa_try): New function. - (hppa_force_relocation): Force relocs for BEGIN_TRY and END_TRY. - -Sun Jun 16 22:57:47 1996 Jeffrey A. Law - - * config/tc-hppa.c (md_pseudo_table): Add ".level" pseudo op. - (pa_level): New function. - -Fri Jun 14 20:06:44 1996 Ian Lance Taylor - - * listing.c (listing_newline): Don't do anything if listing is 0. - -Thu Jun 13 17:50:54 1996 Ian Lance Taylor - - * subsegs.c (section_symbol): If symbol_table_frozen is set, call - symbol_create, not symbol_new. - -Wed Jun 12 14:10:44 1996 Ian Lance Taylor - - * write.c (adjust_reloc_syms): Don't set sy_used_in_reloc for an - absolute symbol unless TC_FORCE_RELOCATION returns true. - - * config/obj-coff.c (previous_file_symbol): Remove BFD_ASSEMBLER - version. - (c_dot_file_symbol): BFD_ASSEMBLER version: Don't set the value of - the symbol to a pointer. Don't set previous_file_symbol. - Simplify symbol list rearrangement. - (coff_frob_symbol): Don't do anything with C_FILE symbols. - (coff_adjust_symtab): Don't check previous_file_symbol. - -Mon Jun 10 14:52:29 1996 Michael Meissner - - * config/tc-ppc.c (ppc_elf_lcomm): New function for .lcomm - directive. - (md_pseudo_table): Add ppc_elf_lcomm. - -Mon Jun 10 11:45:51 1996 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Accept ABSL for 'O', so that `bfextu - d0{24:1},d0' works without an immediate prefix on the bit numbers. - (md_begin): Add digits to alt_notend_table. - (md_parse_option): Make s a const pointer. - - * config/tc-sparc.c (md_pseudo_table): Add "empty". - (s_empty): New static function. - - * config/obj-coff.c (struct filename_list): Only define if not - BFD_ASSEMBLER. - (filename_list_head, filename_list_tail): Likewise. - (c_section_symbol): Remove unused BFD_ASSEMBLER version. - (obj_coff_endef, BFD_ASSEMBLER version): Don't set the debugging - flag for C_MOS, C_MOE, C_MOU, or C_EOS symbols, since they should - have a section of N_ABS rather than N_DEBUG. If we do a merge, - remove the new symbol from the list. - (obj_coff_endef, both versions): Call tag_insert even if there is - an old symbol with the same name, if the old symbol does not - happen to be a tag. - (coff_frob_symbol): Check SF_GET_TAG, C_EOF, and C_FILE outside of - the SF_GET_DEBUG condition. Don't call SA_SET_SYM_ENDNDX with a - symbol that will be moved to the end of the symbol list. - (coff_adjust_section_syms): Always call section_symbol for .text, - .data, and .bss. - (coff_frob_section): Likewise. Also, remove unused variable - strname. - - * config/tc-ns32k.c (convert_iif): Call frag_grow rather than - manipulating frags directly. - (md_number_to_field): Adjust mem_ptr correctly if ENDIAN is - defined. - - * app.c (do_scrub_chars): If '/' is LINE_COMMENT_START, check - whether the next character is '*' before checking whether we are - at the start of a line. Permit LINE_COMMENT_START to start a - comment in state 1 (seen some whitespace) as well, to match the - documentation. - - * gasp.c (do_align): Permit a fill value for .align. - -Wed Jun 5 17:09:26 1996 Ian Lance Taylor - - * read.c (next_char_of_string): Warn if a newline is seen in the - middle of a string. Call bump_line_counters when appropriate. - -Wed Jun 5 17:08:36 1996 Richard Henderson - - * symbols.c (colon): Use LOCAL_LABEL. - -Tue Jun 4 10:55:16 1996 Tom Tromey - - * Makefile.in (install): Don't check to see if tooldir exists. - Make $(tooldir) and $(tooldir)/bin. - -Tue Jun 4 10:14:53 1996 Michael Meissner - - * config/ppc-sol.mt (TDEFINES): Don't turn on -mregnames by - default. - -Mon Jun 3 11:34:41 1996 Ian Lance Taylor - - * config/tc-mips.c (mips_ip): Don't call as_warn if we are setting - insn_error. Don't put the string "ERROR" in insn_error. Set - insn_error rather than calling as_warn for an unsupported opcode. - -Sat Jun 1 21:51:55 1996 Ian Lance Taylor - - * config/tc-mips.c (md_parse_option): Check for a 64 bit format - before permitting -64. - * output-file.c (output_file_create): Remove duplicate - bfd_perror. - -Fri May 31 01:08:06 1996 Ian Lance Taylor - - * config/tc-mips.c (md_begin): If -64, create a .MIPS.options - section rather than a .reginfo section. - (mips_elf_final_processing): If -64, write out 64 bit RegInfo - information. - - * config/tc-mips.c (load_register): If mips_isa < 3, permit a 32 - bit value with the high bit set. - -Thu May 30 19:00:19 1996 Ian Lance Taylor - - * read.c (s_lcomm): Set section flags for .sbss section. - - * config/tc-mips.c (mips_64): New static variable. - (mips_target_format): If mips_64, return elf64 targets rather than - elf32 ones. - (md_longopts): Add "32" and "64". - (md_parse_option): Handle -32 and -64. - (md_show_usage): Mention -32 and -64. - (cons_fix_new_mips): If mips_64, don't convert an 8 byte reloc to - a 4 byte one. - -Thu May 30 10:36:19 1996 Michael Meissner - - * config/tc-ppc.c (comment_chars): Make '!' a comment character - for Solaris compatibility. - - * stabs.c (s_stab_generic): Under PowerPC Solaris, convert a - .stabd with 4 arguments into a .stabn. - -Wed May 29 16:43:16 1996 Ian Lance Taylor - - * config/tc-mips.c (macro): When passing X_add_number to - macro_build, cast it to int first. - -Tue May 28 13:29:39 1996 Ian Lance Taylor - - * config/tc-z8k.c (md_apply_fix): Handle fx_r_type of 0, as - created by emit_expr. - - * symbols.c (symbol_create): If bfd_make_empty_symbol fails, call - as_perror rather than assert. - -Fri May 24 18:24:11 1996 Ian Lance Taylor - - * config/tc-mips.c (mips_ip): Mark sections created to hold - floating point information as read only. - -Fri May 24 12:07:54 1996 David Edelsohn - - * config/tc-ppc.c (ppc_set_cpu): Change defaults to match AIX. - -Thu May 23 17:34:24 1996 Michael Meissner - - * read.c (potable): Add .skip as a synonym for .space. - - * stabs.c (s_stab_generic): For PowerPC ELF, allow .stabd to take - 4 arguments, providing the 4th argument is 0, to allow - compatibility with the Solaris assembler. - -Thu May 16 15:51:48 1996 Ian Lance Taylor - - * config/tc-sh.h (struct sh_segment_info_type): Define. - (TC_SEGMENT_INFO_TYPE): Define. - (sh_frob_label): Declare. - (tc_frob_label): Define. - (sh_flush_pending_output): Declare. - (md_flush_pending_output): Define. - * config/tc-sh.c (md_assemble): If relaxing, emit a R_SH_CODE - reloc before the instruction if necessary. - (sh_frob_label): New function. - (sh_flush_pending_output): New function. - (sh_coff_frob_file): Ignore ALIGN, CODE, DATA, and LABEL relocs - when looking for the reloc for the target of .uses. - (md_convert_frag): Fix printf format (%0xlx to 0x%lx). - (sh_force_relocation): Force CODE, DATA, and LABEL relocs to be - emitted. - (md_apply_fix): Ignore CODE, DATA, and LABEL relocs. - (sh_coff_reloc_mangle): Force CODE, DATA, and LABEL relocs to use - the absolute symbol. - - * subsegs.h (segment_info_type): Add tc_segment_info_data field if - TC_SEGMENT_INFO_TYPE is defined. - -Wed May 15 12:23:53 1996 Ian Lance Taylor - - * config/tc-i386.c (md_assemble): Make sure the opcode suffix - matches the register size. - -Wed May 15 08:33:37 1996 Jeffrey A Law (law@cygnus.com) - - * config/obj-coff.c (count_entries_in_chain): Ignore Fixups with - fx_done set. - (do_relocs_for): Likewise. - (fixup_segment): Don't just quit if linkrelax is set. Try to - apply non pc-relative sym1-sym2 fixups, even if linkrelax is - nonzero. - -Fri May 10 14:16:59 1996 Michael Meissner - - * config/tc-ppc.c (ppc_elf_validate_fix): Allow GOT and section - relative relocations with -mrelocatable. Also allow unfixed - relocs in .ex_shared. - -Tue May 7 11:24:10 1996 Ian Lance Taylor - - * config/obj-coff.c (yank_symbols): Check that FNAME_OFFSET is - non-zero before assuming this is a long file name. - (w_strings): Likewise. - (c_dot_file_symbol): Set FNAME_OFFSET to 1 for a long file name. - - * config/obj-coff.c (w_strings): Move declaration of i inside - #ifdef block which uses it. - -Tue May 7 00:49:58 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-h8300.c (do_a_fix_imm): Rename last argument to - "relaxmode". Output relocs which identify various relaxing - possibilities for mov.[bwl] instructions. - (build_bytes): Pass in a relaxing mode to do_a_fix_imm. - -Mon May 6 15:26:28 1996 Doug Evans - - * config/tc-arm.h (TC_HANDLES_FX_DONE): Define. - (MD_APPLY_FIX3): Define. - * config/tc-arm.c (my_get_expression): Only watch for bad segments - if OBJ_AOUT. - (md_apply_fix3): Renamed from md_apply_fix. - If pcrel reloc and symbol is in different section, undo effects - of md_pcrel_from. - -Sat May 4 12:49:35 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (hppa_fix_adjustable): Don't adjust - any reloc with an LR% or RR% field selector for SOM. - -Sat May 4 11:26:19 1996 Ian Lance Taylor - - * Makefile.in: Add subsegs.h to appropriate TARG_CPU_DEP_* - variables. - -Fri May 3 17:58:31 1996 Ian Lance Taylor - - * config/obj-coff.c (coff_frob_symbol): Don't merge a symbol with - SF_GET_STATICS set. - (yank_symbols): Likewise. - -Wed May 1 13:38:17 1996 Ian Lance Taylor - - * subsegs.h (segment_info_type): If MANY_SEGMENTS and not - BFD_ASSEMBLER, add name field. - * config/obj-coff.c: Include "libiberty.h". - (coff_header_append): Handle long section names. - (crawl_symbols): Just use the name field for the symbol name, - without worrying about null byte termination. - (w_strings): Handle long section names. - (write_object_file): Likewise. Also, use the name field, rather - than scnhdr.s_name. - (obj_coff_add_segment): Permit long section names. - (obj_coff_init_stab_section): Use the name field, rather than - scnhdr.s_name. - (adjust_stab_section): Likewise. - * config/te-pe.h (COFF_LONG_SECTION_NAMES): Define. - - * config/tc-i960.c (brtab_emit): Don't set fx_im_disp field. - (mem_fmt): Likewise. - (md_apply_fix): Don't check fx_im_disp field. - -Thu Apr 25 11:39:51 1996 Ian Lance Taylor - - * configure.in: Add * after sparc*-*-vxworks. - * configure: Rebuild. - - * app.c (do_scrub_begin): If tc_comment_chars is not defined, - define it to comment_chars. Use tc_comment_chars rather than - comment_chars. - (do_scrub_chars): Use tc_comment_chars rather than comment_chars. - * config/tc-m68k.h (tc_comment_chars): Define. - (m68k_comment_chars): Declare. - * config/tc-m68k.c (m68k_comment_chars): Rename from - comment_chars. Change into a pointer rather than an array. - (md_longopts): Add "bitwise-or". - (md_parse_option): Handle OPTION_BITWISE_OR. - (md_show_usage): Mention --bitwise-or. - * doc/c-m68k.texi: Document --bitwise-or. - -Wed Apr 24 11:28:38 1996 Ian Lance Taylor - - * config/tc-m68k.c (m68k_ip): Prevent attempts to use long offsets - in 68000 mode. - - * config/obj-coff.c (obj_coff_section): BFD_ASSEMBLER version: - call demand_empty_rest_of_line. Non BFD_ASSEMBLER version: - correct handling of input line pointer, and call - demand_empty_rest_of_line. - -Mon Apr 22 18:02:37 1996 Doug Evans - - * config/tc-sparc.c (in_bitfield_range): New static function. - (sparc_ip): New cases X,Y. Use SPARC_OPCODE_ARCH_V9_P. - (md_apply_fix, cases BFD_RELOC_32_PCREL_S2, - BFD_RELOC_SPARC_{WDISP16,WDISP19}): Fix undefined code. - (md_apply_fix): New cases BFD_RELOC_SPARC_[56]. - (tc_gen_reloc): New cases BFD_RELOC_SPARC_[56]. - -Thu Apr 18 18:58:33 1996 Ian Lance Taylor - - * config/obj-coff.c: BFD_ASSEMBLER: - (coff_last_bf): New static variable. - (coff_frob_symbol): Set endndx of a .bf symbol. - Non BFD_ASSEMBLER: - (obj_coff_endef): Call SF_SET_PROCESS on a .bf symbol. - (last_bfP): New static variable. - (yank_symbols): Set endndx of a .bf symbol. - -Thu Apr 18 11:53:58 1996 Michael Meissner - - * config/tc-ppc.c (md_parse_option): Add support for Solaris's -le - and -s options. Add -be for good measure. - -Wed Apr 17 12:31:01 1996 Ian Lance Taylor - - * read.c (s_space): Support non-constant fill value. Handle fill - value correctly for a size other than 1. - -Tue Apr 16 15:17:40 1996 Doug Evans - - * config/tc-arm.c (my_get_float_expression): Update call to - gen_to_words, X_PRECISION changed from 6 to 5. - -Tue Apr 16 10:25:42 1996 Michael Meissner - - * config/tc-ppc.c (register_name,reg_name_search): Move register - name lookup from PE specific code to all targets. Add support for - -mregnames/-mno-regnames to control whether register names are - expanded or not. - (md_assemble): Call register_name for all platforms. - (md_parse_option): Add support for -mregnames/-mno-regnames. - - * configure.in (powerpcle*-*-solaris): Add support. - (powerpc*-*-linux): Ditto. - * configure: Regenerate. - - * config/ppc-sol.mt: New config file for PowerPC Solaris. - -Mon Apr 15 12:26:33 1996 Ian Lance Taylor - - * config/tc-mips.c (mips_frob_file): Permit multiple %hi relocs to - be associated with a single %lo reloc. - - * config/tc-mips.c (load_address): Cast X_add_number to valueT - before comparing against MAX_GPREL_OFFSET, so that negative - numbers are handled correctly. - (macro): Likewise. - -Thu Apr 11 12:39:02 1996 Ian Lance Taylor - - * config/tc-sparc.c (last_insn): New static variable. - (md_assemble): Warn about putting floating point branches in a - delay slot. If architecture is less than v9, insert NOP - instructions between floating point instructions and floating - point branches. (The SunOS assembler does both these operations.) - Save the last instruction opcode. - (sparc_ip): Add pinsn parameter. Change caller. - - * config/tc-m68k.c (md_estimate_size_before_relax): Correct check - for byte jump to next instruction to skip empty frags. - -Wed Apr 10 16:48:12 1996 Ian Lance Taylor - - * config/tc-alpha.c (alpha_ip): If we are going to call emit_add64 - for addq with a 16 bit signed value, just emit a lda instruction - instead. - -Wed Apr 10 14:34:49 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-h8300.c (do_a_fix_imm): Don't cut off high bits - of a 32bit operand. - -Mon Apr 8 14:42:53 1996 Ian Lance Taylor - - * configure.in: Permit --enable-shared to specify a list of - directories. - * configure: Rebuild. - -Fri Apr 5 17:01:35 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-h8300.c (get_specific): Remove some #if 0 code. - (build_bytes): Remove all ABSMOV related code; it's unnecessary. - -Fri Apr 5 15:13:10 1996 Andreas Schwab - - * config/atof-ieee.c: Fix handling of denormalized extended - precision numbers and overflow/underflow detection. - (MAX_PRECISION, X_PRECISION, P_PRECISION): Changed from 6 to 5, to - not include the 16 bit gap in the m68k extended precision format. - -Fri Apr 5 14:29:23 1996 Ian Lance Taylor - - * configure.in: Add i386-*-freebsdelf* target; from John Polstra - . - * configure: Rebuild. - -Fri Apr 5 18:39:28 1996 James G. Smith - - * config/tc-mips.c: Allow non-zero offsets from .sdata symbols to - be accessed using the $gp register. - * config/tc-mips.h (MAX_GPREL_OFFSET): Added. - -Wed Apr 3 10:56:14 1996 Doug Evans - - * config/tc-sparc.c (sparc_md_end): Set bfd machine number to - bfd_mach_sparc_sparclet if current_architecture is sparclet. - -Mon Apr 1 16:55:44 1996 Ian Lance Taylor - - * read.c (get_line_sb): Bump line counters based on - input_line_pointer[-1], not *input_line_pointer. Don't bother to - call LISTING_NEWLINE. - (s_macro): Don't call demand_empty_rest_of_line. - * app.c (do_scrub_chars): When handling C style comments, unget - ch2 rather than ch. - -Fri Mar 29 16:15:06 1996 Ian Lance Taylor - - * read.h (enum linkonce_type): Define. - (s_linkonce): Declare. - * read.c (potable): Add "linkonce". - (s_linkonce): New function. - * subsegs.h (segment_info_type): Add linkonce field to - MANY_SEGMENTS && ! BFD_ASSEMBLER section. - * config/obj-coff.h (obj_handle_link_once): Define if TE_PE. - (obj_coff_pe_handle_link_once): Declare if TE_PE. - * config/obj-coff.c: If TE_PE and not BFD_ASSEMBLER, #include - "coff/pe.h". - (obj_coff_pe_handle_link_once): New function, defined if TE_PE. - (c_section_symbol): If TE_PE, set the x_comdat field in the aux - entry based on the linkonce field in segment_info. - * doc/as.texinfo: Document .linkonce. - -Fri Mar 29 11:31:27 1996 J.T. Conklin (jtc@lisa.cygnus.com) - - * doc/as.1: Changed to be recognized by catman -w on Solaris. - -Thu Mar 28 15:27:47 1996 Ian Lance Taylor - - * stabs.c (s_stab_generic): Call the listing functions before - doing the rest of the processing, which may involve freeing the - string. Pass string, not string + stroff, to OBJ_PROCESS_STAB in - SEPARATE_STAB_SECTIONS case. - - * config/tc-hppa.c: Remove nested comment. - (tc_gen_reloc): Move label done inside the ifdef in which it is - used. - (md_apply_fix): Pass pointers to correct types to libhppa.h - functions. Always return a value. - - * config/tc-mips.h (tc_frob_file): Define. - (mips_frob_file): Declare. - * config/tc-mips.c (struct mips_hi_fixup): Define. - (mips_hi_fixup_list): New static variable. - (imm_unmatched_hi): New static variable. - (md_assemble): Clear imm_reloc, imm_unmatched_hi, and - offset_reloc. Pass imm_unmatched_hi to append_insn. - (append_insn): Add unmatched_hi parameter. If it is set, add the - new fixup to mips_hi_fixup_list. Change all callers. - (mips_ip): Set imm_unmatched_hi when appropriate. - (mips_frob_file): New function. - -Thu Mar 28 11:47:59 1996 Doug Evans - - * configure.in (sparc-*-solaris2*): Renamed from sparc*-*-solaris2*. - * configure: Regenerated. - -Tue Mar 26 18:19:12 1996 Ian Lance Taylor - - * as.c (main): Call bfd_set_error_program_name. - -Fri Mar 22 11:13:00 1996 Ian Lance Taylor - - * as.h (strdup): Don't declare. - * stabs.c: Include libiberty.h - (get_stab_string_offset): Use xstrdup rather than strdup. - (s_stab_generic): Likewise. - * as.c (parse_args): Likewise. - * read.c (s_mri_sect): Likewise. - - * gasp.c (change_base): Recognize \(...) construct documented to - pass through enclosed characters literally through to the output. - (process_assigns): Likewise. Also, be more careful to avoid - looking past the end of the buffer. - -Thu Mar 21 13:18:43 1996 Ian Lance Taylor - - * config/tc-i386.c (md_parse_option): If OBJ_ELF, ignore -k for - FreeBSD compatibility. From John Polstra . - -Wed Mar 20 18:13:32 1996 Andreas Schwab - - * doc/as.texinfo, doc/c-i960.texi: Fix typos. - -Wed Mar 20 17:05:16 1996 David Mosberger-Tang - - * config/alpha-opcode.h: Added cvtst instruction. - -Mon Mar 18 13:12:46 1996 Ian Lance Taylor - - * ecoff.c (ecoff_stab): Don't try to make a symbol out of the stab - string. Extract the addend from the result of expression. - -Fri Mar 15 17:10:43 1996 Ian Lance Taylor - - * app.c (do_scrub_chars): If whitespace is seen in state 11, and - LABELS_WITHOUT_COLONS is not defined, and we are not in m68k MRI - mode, change the state to 3 rather than 1. - -Thu Mar 14 18:18:25 1996 Ian Lance Taylor - - * config/obj-coff.h (C_REGISTER_SECTION): Change from 20 to 50, to - correspond to 11 March change. - -Thu Mar 14 15:27:10 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-h8300.c (build_bytes, MEMIND case): Generate - an R_MEM_INDIRECT reloc rather than R_RELBYTE. - -Tue Mar 12 12:21:10 1996 Ian Lance Taylor - - * configure: Rebuild with autoconf 2.8. - -Mon Mar 11 18:57:12 1996 Ian Lance Taylor - - * config/atof-ieee.c (gen_to_words): Improve handling of - X_PRECISION numbers. Based on patches from Andreas Schwab - . - -Mon Mar 11 09:59:53 1996 Steve Chamberlain - - * as.h (SEG_NORMAL, SEG_LIST): Bump segment limit from 10 to 40. - (SEG_LAST): New. - * subsegs.c (MANY_SEGMENTS): Increase segment limit. - * obj-coff.c (seg_N_TYPE, seg_info_off_by_4): Likewise. - (do_relocs_for, w_symbols, obj_coff_add_segment, do_linenos_for, - crawl_symbols, coff_header_append): Loop to SEG_LAST rather than - SEG_E9. - -Thu Mar 7 15:17:39 1996 Doug Evans - - * config/tc-sparc.c (sparc_ip): Handle operand char 'O' (neg reg). - -Thu Mar 7 09:19:15 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (SUBSEG_MILLI): Define. - (pa_def_subspaces): Add $MILLICODE$. - (pa_spaces_begin): Set section flags for $MILLICODE$. - -Wed Mar 6 14:11:30 1996 Ian Lance Taylor - - * config/obj-elf.c (obj_elf_section): Only SEC_LOAD if the type is - not SHT_NOBITS. Don't tamper with flags based on type if a - special section was found (revert Feb 29 change). - - * config/tc-sh.c (sh_do_align): Only align using the nop pattern - if aligning to a longword boundary or greater. - -Tue Mar 5 15:10:43 1996 Jim Wilson - - * config/tc-sh.c (sh_do_align): Pass 1 not 2 to frag_align. - -Mon Mar 4 20:50:57 1996 Steve Chamberlain - - * configure.in (i386-*-cygwin32): Don't use bfd_gas. - * configure: Regenerated. - -Mon Mar 4 10:13:06 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c: Add default definitions for R_N0SEL and - R_N1SEL since they're not defined for old versions of hpux. - - * config/tc-hppa.c (tc_gen_reloc): Fix typo in R_COMP2 code. - Set "sym_ptr_ptr" and "addend" fields to dummy values for - R_N0SEL and R_N1SEL. - -Fri Mar 1 10:20:52 1996 Andreas Schwab - - * flonum-konst.c: Add two more constants for 1e+-2048 and - 1e+-4096, and correct the other constants. - - * symbols.c (resolve_symbol_value): Handle O_logical_not. - -Thu Feb 29 13:58:35 1996 Michael Meissner - - * config/obj-elf.c (obj_elf_section): Allow predefined section - types to set the nobits type. Avoid a shadowed declaration. - -Wed Feb 28 15:38:56 1996 Jeffrey A Law (law@cygnus.com) - - * config/tc-hppa.c (hppa_fix_adjustable): For SOM, don't - reduce relocs using e_nlrsel field selectors. - - * write.c (fix_new_exp): Don't use #elif. Some compilers - don't handle it. - - * config/tc-hppa.c (selector_table): Add "n", "nl", and "nlr" to - the selector table. - (pa_chk_field_selector): Handle new field selectors for SOM. - -Tue Feb 27 14:42:27 1996 Andreas Schwab - - * configure.in (m68k-*-linux*aout*, m68k-*-linux*): New targets. - * configure: Rebuild. - * config/te-linux.h (LOCAL_LABELS_FB): Define. - * config/tc-m68k.h (TARGET_FORMAT) [TE_LINUX]: Define to - "a.out-m68k-linux". - * config/tc-m68k.c (comment_chars): Don't include '#' if TE_LINUX - is defined. - -Mon Feb 26 18:58:58 1996 Stan Shebs - - * mpw-make.sed: Update to handle shared library support. - -Mon Feb 26 10:34:10 1996 Doug Evans - - * config/tc-sparc.c (sparc_ip): Print all architectures that support - the insn on mismatch. - -Fri Feb 23 21:44:39 1996 Rob Savoye - - * configure.in: Add support for a29-coff. - * configure: Rebuild. - -Thu Feb 22 16:39:43 1996 Ian Lance Taylor - - * config/tc-sh.c (sh_coff_frob_file): Don't consider the address - of the section when looking for the R_SH_USES fixup, because the - frag addresses have not yet been adjusted. - - * gdbinit.in: Set a breakpoint on as_warn_where. - - * config/tc-mips.c (macro): Add missing arguments to macro_build - omitted in last change. From Jim Wilson . - -Wed Feb 21 17:00:32 1996 Ian Lance Taylor - - * config/tc-h8300.c (tc_reloc_mangle): Change reloc based on size - if it is TC_CONS_RELOC. Set a size of 4 to R_RELLONG. - -Wed Feb 21 09:25:39 1996 Doug Evans - - * config/tc-sparc.c (sparc_ip): Recognize %asr0 for v8. - -Tue Feb 20 21:48:03 1996 Doug Evans - - * config/tc-sparc.c (parse_keyword_arg): Accept leading '%'. - (sparc_ip): Accept %asr[1..31] for v8 and %asr[%16..31] for v9. - Recognize [uU] format args as sparclet cpregs. - -Tue Feb 20 22:25:55 1996 Ian Lance Taylor - - * config/tc-sh.c (sh_handle_align): Don't emit R_SH_ALIGN relocs - in bss_section. - -Mon Feb 19 14:16:24 1996 Ian Lance Taylor - - * config/tc-sparc.h (TC_RELOC_RTSYM_LOC_FIXUP): Check S_IS_WEAK as - well as S_IS_EXTERNAL. - (tc_fix_adjustable): Likewise. - * config/tc-sparc.c (md_apply_fix): In OBJ_ELF case, check for - S_IS_WEAK as well as S_IS_EXTERNAL when deciding whether to return - early. - (tc_gen_reloc): Check S_IS_WEAK as wel as S_IS_EXTERNAL when - deciding whether to convert BFD_RELOC_32_PCREL_S2 if PIC. - -Mon Feb 19 02:15:57 1996 Doug Evans - - * config/tc-sparc.c (max_architecture): Change to sparclite for - 32 bit arch. - (default_compatible): Delete. - (sparc_ffs): New function. - (md_begin): Only call SPARC_OPCODE_CONFLICT_P once. - (sparc_ip): Rewrite architecture match and bump logic. - -Sun Feb 18 15:03:50 1996 Ian Lance Taylor - - * configure.in: Check for 'do not mix' from native linker before - trying to use -rpath. - * configure: Rebuild. - -Fri Feb 16 16:53:31 1996 Ian Lance Taylor - - * config/obj-coff.h (SF_ADJ_LNNOPTR): Define (non BFD_ASSEMBLER). - (SF_GET_ADJ_LNNOPTR): Define (non BFD_ASSEMBLER). - (SF_SET_ADJ_LNNOPTR): Define (non BFD_ASSEMBLER). - * config/obj-coff.c (obj_coff_endef): Set ADJ_LNNOPTR when LNNOPTR - is set. - (w_symbols): If ADJ_LNNOPTR is set, add the section lnnoptr field - to the symbol lnnoptr field, to get the correct file offset. - -Thu Feb 15 14:48:38 1996 Michael Meissner - - * config/obj-elf.c (elf_frob_symbol): On the PowerPC, force all - symbols that are not function, file, or section symbols to be - object types. - -Thu Feb 15 11:20:18 1996 Ian Lance Taylor - - * configure: Set and substitute RPATH_ENVVAR. - * configure: Rebuild. - * Makefile.in (RPATH_ENVVAR): New variable. - (check): Use $(RPATH_ENVVAR) rather than LD_LIBRARY_PATH. - - * configure.in: Accept i686. From H.J. Lu : i386 - doesn't need opcodes. If configuring shared, opcodes needs bfd. - * configure: Rebuild. - -Wed Feb 14 16:33:12 1996 Martin Anantharaman - - * read.c (s_mri_sect): Don't return '\0' in type. Set all - appropriate flags in BFD section. - - * configure.in (m68k-*-psos*): New target. - * configure: Rebuild. - * config/te-psos.h: New file. - * config/tc-m68k.c (comment_chars): Don't include '#' if TE_PSOS - is defined. - -Wed Feb 14 13:43:24 1996 Ian Lance Taylor - - From Alan Modra : - * configure.in: Remove duplicate setting of cpu_type. Check - whether opcodes library is required for on all targets, not just - primary one. - * configure: Rebuild. - - * config/tc-mips.c (mips_big_got): New static variable. - (s_extern): Don't declare. - (reg_needs_delay): New static function. - (macro_build): Permit GOT/CALL_HI/LO relocs. - (macro_build_lui): If place is not NULL, use the number in the - expression. - (load_address): Handle mips_big_got case. - (macro): Handle mips_big_got for M_LA_AB, M_JAL_A, and load and - store macros. - (OPTION_XGOT): Define. - (md_longopts): Add "xgot" if OBJ_ELF. - (md_parse_option): Handle -xgot. - (md_show_usage): Mention -xgot. - (md_apply_fix): Permit GOT/CALL_HI/LO relocs. - (tc_gen_reloc): Handle GOT/CALL_HI/LO relocs. - -Wed Feb 14 11:22:27 1996 Andreas Schwab - - * config/tc-m68k.c (m68k_ip) [operand kind '#']: When fixing - the byte relocation, point it to the low byte of the word. - -Tue Feb 13 15:31:18 1996 Ian Lance Taylor - - * configure.in: Set HDLFLAGS for *-*-hpux with --enable-shared. - * configure: Rebuild. - -Mon Feb 12 15:53:46 1996 Doug Evans - - * configure.in: Recognize any sparc* cpu. - * configure: Regenerated. - -Mon Feb 12 15:41:21 1996 Ian Lance Taylor - - * read.c (potable): Add "mri" and ".mri". - (s_mri): New function. - * read.h (s_mri): Declare. - * app.c (scrub_m68k_mri): New static variable. - (mri_pseudo): New static variable. - (do_scrub_begin): Add m68k_mri parameter. Use it rather than - flag_m68k_mri. Initialize scrub_m68k_mri. - (mri_state, mri_last_ch): New static variables. - (struct app_save): Add scrub_m68k_mri, mri_state, and mri_last_ch - fields. - (app_push): Save new fields. - (app_pop): Restore new fields. - (do_scrub_chars): Check scrub_m68k_mri rather than flag_mri_mri. - If TC_M68K, use a trivial state machine to look for occurrences of - the .mri pseudo-op, and change the mode appropriately. - * as.h (do_scrub_begin): Update prototype. - * input-scrub.c (input_scrub_begin): Pass flag_m68k_mri to - do_scrub_begin. - * config/tc-m68k.c (reg_prefix_optional_seen): New static - variable. - (m68k_mri_mode_change): New function. - (md_parse_option): Set reg_prefix_optional_seen. - * config/tc-m68k.h (m68k_mri_mode_change): Declare. - (MRI_MODE_CHANGE): Define. - * doc/as.texinfo: Document .mri pseudo-op. - - * app.c (do_scrub_chars): In MRI mode, don't treat '#' as a - comment character. - -Mon Feb 12 15:16:29 1996 Andreas Schwab - - Support for OBJ_ELF on m68k, mostly inside #ifdef OBJ_ELF: - * config/m68k-parse.h (enum pic_relocation): Define. - (struct m68k_exp): Add pic_reloc field. - * config/tc-m68k.h (TC_RELOC_RTSYM_LOC_FIXUP): Define. - (tc_fix_adjustable): Define to call tc_m68k_fix_adjustable. - (NO_RELOC): Define to BFD_RELOC_NONE if BFD_ASSEMBLER, to zero - otherwise. - * config/tc-m68k.c: Delete definition of NO_RELOC. - (struct m68k_it): Add pic_reloc field. - (add_fix): Copy over pic_reloc field. - (md_pseudo_table): Interpret .align parameter as byte count. - (mote_pseudo_table): Likewise. - (tc_m68k_fix_adjustable): New function. - (get_reloc_code): New function. - (md_assemble): Use it as last argument to fix_new_exp. - (md_apply_fix_2): For a relocation against a symbol don't put the - addend into the data. - (tc_gen_reloc): Different addend computation for OBJ_ELF. - (m68k_ip): Don't relax an operand that requires pic relocation. - (md_begin): Align .text, .data and .bss on 4 byte boundary by - default. - * write.c (fixup_segment): Don't add symbol value to addend if - TC_M68K and OBJ_ELF. - * config/m68k-parse.y (yylex): Handle @PLTPC, etc. - (motorola_operand): Add rule for `(zapc, EXPR)'. - -Mon Feb 12 10:07:33 1996 David Mosberger-Tang - - * ecoff.c (ecoff_directive_weakext): Fixed so that whitespace - *really* is permissible before the comma. - -Mon Feb 12 00:12:13 1996 Ian Lance Taylor - - * config/tc-sh.c (sh_do_align): Align to a 2 byte boundary before - inserting nop instructions. - -Fri Feb 9 10:54:19 1996 Ian Lance Taylor - - * config/te-aux.h: Change include of aux.h to aux-coff.h. - -Thu Feb 8 20:02:58 1996 Ian Lance Taylor - - * config/tc-i960.c (tc_coff_symbol_emit_hook): Correct storage - class setting for a CALLNAME symbol in COFF. - - * read.c (potable): Pass negative numbers for new .balign[wl] and - .p2align[wl] pseudo-ops. - (s_align_bytes): Treat a negative argument as specifying the fill - length. - (s_align_ptwo): Likewise. - -Wed Feb 7 14:12:03 1996 Ian Lance Taylor - - * read.c (potable): Add balignw, balignl, p2alignw, and p2alignl. - (do_align): Take new len parameter. Change all callers. Pass it - to md_do_align. - (s_align_bytes): Arg now indicates the length of the fill pattern. - (s_align_ptwo): Likewise. - * config/obj-coff.c (write_object_file): Pass length to - md_do_align. - * config/tc-i386.h (md_do_align): Take new len parameter. - * config/tc-m88k.h (md_do_align): Likewise. - * config/tc-m88k.c (m88k_do_align): Likewise. - * config/tc-sh.h (md_do_align): Likewise. - * config/tc-sh.c (sh_do_align): Likewise. - * doc/as.texinfo: Document new pseudo-ops. - - * config/obj-coff.c (fixup_mdeps): Divide offset by fr_var, as is - done in cvt_frag_to_fill. - - * config/tc-sh.h (sh_do_align): Declare. - (md_do_align): Define. - * config/tc-sh.c (sh_do_align): New function. - - * ecoff.c (ecoff_build_lineno): Don't try to store the address - difference if the next address is before the current one. - - * config/tc-m68k.c (struct m68k_cpu): Add alias field. - (archs): Initialize new field. - (m68k_ip): Don't list alias names when listing CPUs which support - an instruction. - - * as.c (main): Call parse_args before read_begin. - * app.c (do_scrub_chars): If flag_m68k_mri, don't put a dot in - front of generated pseudo-ops. - * read.c (potable): Ignore "name". - (s_app_file): Permit a single quote after the string, since one - may appear in m68k MRI mode. - - * configure.in: Check for --enable-shared. If linking against - shared BFD and opcodes, fix library name on SunOS, and try to set - -rpath reasonably. - * configure: Rebuild. - -Tue Feb 6 15:16:17 1996 Ian Lance Taylor - - * as.h (flag_m68k_mri): Declare. - * as.c (parse_args): If TC_M68K, set flag_m68k_mri for -M. - * Many files: For MRI syntax that is specific to the m68k MRI - assembler, check flag_m68k_mri rather than flag_mri or - MRI_MODE_NEEDS_PSEUDO_DOT. - -Mon Feb 5 16:29:11 1996 Ian Lance Taylor - - * config/tc-i960.c (ARCH_HX): Define. - (arch_tab): Add HX. - (targ_has_sfr): Handle ARCH_HX. - (targ_has_iclass): Handle ARCH_HX. - (tc_coff_fix2rtype): Add return 0 to avoid warning. - (tc_headers_hook): If the architecture was specified explicitly, - use it when setting the flags. Set the extern variable coff_flags - rather than headers->filehdr.f_flags, since the latter is set - unconditionally in obj-coff.c. - (i960_handle_align): Remove unused variable fixp. - - Support for building bfd and opcodes as shared libraries, based on - patches from Alan Modra : - * configure.in: Set OPCODES and BFD to search directories. - Substitute OPCODES_DEP and BFDDEP. On SunOS, set HLDFLAGS. - * configure: Rebuild. - * Makefile.in (LDFLAGS, HLDFLAGS): New variables. - (LIBDEPS): New variable. - (as.new0: Depend upon $(LIBDEPS) rather than $(LIBS). Use - $(HLDFLAGS) in link. - (check): Set LD_LIBRARY_PATH in the environment. - -Fri Feb 2 17:41:53 1996 Michael Meissner - - * config/tc-ppc.h (ELF_TC_SPECIAL_SECTIONS): Make .sdata2, .sbss2, - .PPC.EMB.sdata0, and .PPC.EMB.sbss0 sections all default to - read-only, not read/write. - -Fri Feb 2 14:09:25 1996 Alan Modra - - * Makefile.in (INSTALL_XFORM): Remove -e. - -Fri Feb 2 12:32:15 1996 Ian Lance Taylor - - * write.c (write_relocs): Use S_IS_DEFINED and S_IS_COMMON rather - than comparing S_GET_SEGMENT to undefined_section. - (write_object_file): Skip symbols which were equated to an - undefined or common symbol. - * symbols.c (resolve_symbol_value): Use S_IS_DEFINED and - S_IS_COMMON rather than comparing S_GET_SEGMENT to - undefined_section. - (S_GET_VALUE): Likewise. Avoid recursion problems if S_IS_DEFINED - or S_IS_COMMON call S_GET_VALUE. - * config/obj-aout.h (S_IS_COMMON): Define if not BFD_ASSEMBLER. - * config/obj-aout.c (obj_emit_relocations): If a reloc is equated - to an undefined or common symbol, convert the reloc to be against - the target symbol. - (obj_crawl_symbol_chain): Skip symbols which were equated to an - undefined or common symbol. - * config/obj-bout.h (S_IS_COMMON): Define if not BFD_ASSEMBLER. - * config/obj-bout.c (obj_emit_relocations): If a reloc is equated - to an undefined or common symbol, convert the reloc to be against - the target symbol. - (obj_crawl_symbol_chain): Skip symbols which were equated to an - undefined or common symbol. - * config/obj-coff.c (do_relocs_for): Use S_IS_DEFINED and - S_IS_COMMON rather than comparing S_GET_SEGMENT to - undefined_section. - (yank_symbols): Skip symbols which were equated to an undefined or - common symbol. - -Thu Feb 1 15:34:32 1996 Ian Lance Taylor - - * config/obj-aout.h (S_IS_LOCAL): Check for \002 as well as \001. - * config/obj-bout.h (S_IS_LOCAL): Likewise. - - * configure.in: Make sure we only add m68k-parse.o to - ${extra_objects} once, no matter how many m68k targets have been - enabled. - * configure: Rebuild. - -Wed Jan 31 18:31:46 1996 Steve Chamberlain - - * configure.in (i386-*-cygwin32, ppc-*-cygwin32): New. - * configure: Rebuild. - -Wed Jan 31 14:03:17 1996 Richard Henderson - - * config/tc-m68k.c (md_pseudo_table): Add "extend" and "ldouble". - * doc/c-m68k.texi: Document .extend and .ldouble. - - * configure.in (m68*-apple-aux*): New target. - * config/te-aux.h: New file. - * config/obj-coff.c (compare_external_relocs): New static function - if TE_AUX. - (do_relocs_for): Sort relocs if TE_AUX. - (fixup_segment): If TE_AUX, store common symbol value in segment. - * config/tc-m68k.h (TARGET_FORMAT): Define if TE_AUX. - -Wed Jan 31 12:24:58 1996 Ian Lance Taylor - - * config/obj-coff.h (S_IS_LOCAL): Check for \002 as well as \001. - - * config/tc-mips.c (s_mips_globl): Set BSF_OBJECT if it is not - BSF_FUNCTION. - (s_cpload): Set BSF_OBJECT for _gp_disp symbol. - * read.c (s_lcomm): If S_SET_SIZE is defined, set the size of the - symbol. - * ecoff.c (add_procedure): Set the BSF_FUNCTION flag. - (ecoff_build_symbols): If S_SET_SIZE is defined, set the size of - an undefined symbol and the size of a function symbol. - * config/obj-elf.c (elf_frob_symbol): If TC_MIPS, set BSF_OBJECT - for all common symbols. - -Tue Jan 30 12:35:24 1996 Ken Raeburn - - * config/tc-i960.c (parse_memop): In MRI mode, don't use implicit - scaling of index. - - * expr.c (operand): Accept 0x hex constants in MRI mode if not on - m68k. - -Mon Jan 29 12:21:30 1996 Ian Lance Taylor - - * config/obj-elf.c (obj_elf_type): Set BSF_OBJECT flag for a type - of object. From Ronald F. Guilmette . - - * ecoff.c (localsym_t): Add addend field. - (add_ecoff_symbol): Add addend argument. Change all callers. - (coff_sym_value): Make static. - (coff_sym_addend): New static variable. - (ecoff_directive_def): Initialize coff_sym_addend. - (ecoff_directive_val): Accept symbol + constant. - (ecoff_directive_endef): Pass coff_sym_addend to add_ecoff_symbol. - (ecoff_build_symbols): Include the addend in the symbol value. - -Fri Jan 26 19:28:52 1996 Kim Knuttila - - * config/tc-ppc.c (md_assemble): Ignore overflow on - BFD_RELOC_16_GOTOFF and BFD_RELOC_PPC_TOC16. - -Fri Jan 26 16:14:17 1996 Michael Meissner - - * config/tc-ppc.c (md_apply_fix3): SDA21 relocations are now 4 - bytes in size, so offset appropriately in big endian mode when - writing the bottom 2 bytes. - -Thu Jan 25 20:26:23 1996 Doug Evans - - * config/tc-sparc.c (default_compatible): New static local. - (md_begin): Initialize it. Rewrite warn_on_bump handling. - (sparc_ip): If no architecture or -bump specified, don't mark as - mismatched those in default_compatible. - -Thu Jan 25 12:21:53 1996 Ian Lance Taylor - - SCO ELF support from Robert Lipe : - * configure.in (i386-*-sco*elf*): Use fmt elf, targ sco5. - * configure: Rebuild. - * config/sco5.mt: New file; set TDEFINES to -DSCO_ELF. - * config/tc-i386.c (sco_id): New function, if SCO_ELF. - * config/tc-i386.h (tc_init_after_args): Define if SCO_ELF. - (sco_id): Declare if SCO_ELF. - -Thu Jan 25 03:10:53 1996 Doug Evans - - * config/tc-sparc.c (initial_architecture,can_bump_v9_p): Deleted. - ({max,warn_after}_architecture): New static locals. - (md_begin): Replace NUMOPCODES with sparc_num_opcodes. - If both architecture and -bump requested, set max_architecture to max. - (sparc_md_end): Simplify. - (sparc_ip): Replace references to can_bump_v9_p with max_architecture. - Rewrite code to bump architecture and check for conflicts. - (md_longopts): Recognize -xarch={v8plus,v8plusa} for compatibility - with Solaris assembler. - (md_parse_option): Likewise. Call sparc_opcode_lookup_arch. - (md_show_usage): Update. - -Wed Jan 24 22:11:03 1996 Doug Evans - - * Makefile.in (RUNTEST): Fix reference to $${srcdir}. - -Mon Jan 22 09:21:36 1996 Doug Evans - - * config/tc-sparc.h (TARGET_FORMAT): Use #ifdef SPARC_ARCH64 instead of - #ifdef sparcv9 when choosing value. - (ENV64): Delete. - (md_end): Define. - (sparc_md_end): Declare. - * config/tc-sparc.c (SPARC_V9): Renamed from sparcv9. - (initial_architecture): New static local. - (can_bump_v9_p): Likewise. - (NO_V9): Delete all occurrences. - (sparc_md_end): New function. - (sparc_ip): New local v9_arg_p. Rework fp reg number test. - Don't bump architecture to v9 unless can_bump_v9_p set. - (md_parse_option): -A passed, set can_bump_v9_p accordingly. - * configure.in (sparc64 target cpu): Don't set obj_format here. - (SPARC_V9): Renamed from sparcv9. - (sparc64-*-elf*): Define SPARC_ARCH64. - * configure: Regenerated. - * acconfig.h (SPARC_V9): Renamed from sparcv9. - (SPARC_ARCH64): Add. - * conf.in: Regenerated. - * config/vmsconf.h: Update. - -Mon Jan 22 17:24:47 1996 James G. Smith - - * config/tc-mips.c (load_register): Optimise "dli" loads. - (md_show_usage): add "-mcpu=vr4100" to help text. - -Mon Jan 22 11:53:00 1996 Ian Lance Taylor - - * symbols.c (resolve_symbol_value): If a symbol is equated to an - undefined symbol, preserve the X_op of O_symbol. - (S_GET_VALUE): Fix check to permit this case. - * write.c (write_relocs): If a reloc is against an undefined - symbol equated to another symbol, change the reloc to be against - the latter symbol. - * config/obj-coff.c (do_relocs_for): Likewise. - - * config/tc-ppc.c (ppc_csect): An unnamed csect is storage class - XMC_PR. - -Mon Jan 22 10:59:48 1996 Michael Meissner - - * config/obj-elf.c (elf/ppc.h): Include elf/ppc.h if target - computer is PowerPC. - - * config/tc-ppc.c (md_apply_fix3): Add more embedded relocations. - - * config/tc-ppc.h (ELF_TC_SPECIAL_SECTIONS): Add sections - mentioned in the eabi. - -Thu Jan 18 17:58:19 1996 Kim Knuttila - - * config/tc-ppc.c (ppc_reldata): Changed alignement on reldata_section - * config/tc-ppc.c (ppc_pdata): Changed the alignment on pdata_section - -Mon Jan 15 17:43:42 1996 Michael Meissner - - * config/tc-ppc.c (mapping): Add more relocation suffixes. - -Sun Jan 14 21:29:36 1996 Michael Meissner - - * config/tc-ppc.c (ppc_elf_validate_fix): Allow .gcc_except_table - as a section it is ok to have unadorned -mrelocatable pointers in. - -Sat Jan 13 11:09:08 1996 Michael Meissner - - * config/tc-ppc.c (ppc_section*): Wrap these functions inside - #ifdef OBJ_ELF. - -Fri Jan 12 15:32:07 1996 Michael Meissner - - * config/obj-elf.c (obj_elf_section): Add hooks so machine - dependent section attributes can be handled. - - * config/tc-ppc.h: (md_elf_section_{letter,type,word,flags}): New - macros to add support for exclude section flag and ordered section - type. - - * config/tc-ppc.c (ppc_elf_section_{letter,type,word,flags}): New - functions to add support for exclude section flag and ordered - section type. - -Fri Jan 12 12:04:00 1996 Ian Lance Taylor - - * subsegs.c (section_symbol): Don't try to look up the section - symbol in the hash table. It should be possible to have a symbol - with the same name as a section, but no connection to it. - - * read.c (cons_worker): Only call mri_comment_end from flag_mri. - From James Carlson . - - * expr.c (operand): Skip whitespace after a close parenthesis. - From James Carlson . - -Tue Jan 2 12:43:23 1996 Jim Wilson - - * config/tc-sh.c (md_apply_fix): Call as_bad_where instead of - as_warn_where for relocation overflow. - (parse_reg): Accept register name only if next character is - not alphanumeric. - -For older changes see ChangeLog-9295 diff --git a/gas/Makefile.am b/gas/Makefile.am deleted file mode 100644 index 79a5c9fec92..00000000000 --- a/gas/Makefile.am +++ /dev/null @@ -1,1843 +0,0 @@ -## Process this file with automake to generate Makefile.in - -## Work around apparent automake bug. -INTLLIBS = @INTLLIBS@ - -AUTOMAKE_OPTIONS = cygnus dejagnu - -SUBDIRS = doc po - -tooldir = $(exec_prefix)/$(target_alias) - -YACC = `if [ -f ../bison/bison ] ; then echo ../bison/bison -y -L../bison/bison ; else echo bison -y ; fi` -LEX = `if [ -f ../flex/flex ] ; then echo ../flex/flex ; else echo flex ; fi` - -WARN_CFLAGS = @WARN_CFLAGS@ -AM_CFLAGS = $(WARN_CFLAGS) - -MKDEP = gcc -MM - -TARG_CPU = @target_cpu_type@ -TARG_CPU_C = $(srcdir)/config/tc-@target_cpu_type@.c -TARG_CPU_O = tc-@target_cpu_type@.o -TARG_CPU_H = $(srcdir)/config/tc-@target_cpu_type@.h -OBJ_FORMAT_C = $(srcdir)/config/obj-@obj_format@.c -OBJ_FORMAT_O = obj-@obj_format@.o -OBJ_FORMAT_H = $(srcdir)/config/obj-@obj_format@.h -TARG_ENV_H = $(srcdir)/config/te-@te_file@.h -ATOF_TARG_C = $(srcdir)/config/atof-@atof@.c -ATOF_TARG_O = atof-@atof@.o - -# use @target_cpu_type@ for refering to configured target name -IT_HDRS=itbl-parse.h $(srcdir)/itbl-ops.h -IT_SRCS=itbl-parse.c itbl-lex.c $(srcdir)/itbl-ops.c -IT_DEPS=$(srcdir)/itbl-parse.y $(srcdir)/itbl-lex.l $(srcdir)/config/itbl-@target_cpu_type@.h -IT_OBJS=itbl-parse.o itbl-lex.o itbl-ops.o - -# CPU types. This is only used for dependency information. - -CPU_TYPES = \ - a29k \ - alpha \ - arc \ - arm \ - d10v \ - d30v \ - fr30 \ - h8300 \ - h8500 \ - hppa \ - i370 \ - i386 \ - i860 \ - i960 \ - m32r \ - m68k \ - m88k \ - mcore \ - mips \ - mn10200 \ - mn10300 \ - ns32k \ - pj \ - ppc \ - sh \ - sparc \ - tahoe \ - tic30 \ - tic80 \ - vax \ - w65 \ - v850 \ - z8k - -# Object format types. This is only used for dependency information. -# We deliberately omit som, since it does not work as a cross assembler. - -OBJ_FORMATS = \ - aout \ - bout \ - coff \ - ecoff \ - elf \ - evax \ - hp300 \ - ieee \ - vms - -# This is an sh case which sets valid according to whether the CPU -# type in the shell variable c and the OS type in the shell variable o -# are supported. This helps cuts down on the amount of dependency -# information. - -CPU_OBJ_VALID = \ - valid= ; \ - case $$o in \ - aout) \ - case $$c in \ - a29k | arm | i386 | i860 | m68k | mips | ns32k | sparc | tahoe | tic30 | vax) \ - valid=yes ;; \ - esac ;; \ - bout) \ - case $$c in \ - i960) valid=yes ;; \ - esac ;; \ - coff) valid=yes ;; \ - ecoff) \ - case $$c in \ - mips | alpha) valid=yes ;; \ - esac ;; \ - elf) valid=yes ;; \ - evax) \ - case $$c in \ - alpha) valid=yes ;; \ - esac ;; \ - hp300) \ - case $$c in \ - m68k) valid=yes ;; \ - esac ;; \ - vms) \ - case $$c in \ - vax) valid=yes ;; \ - esac ;; \ - esac; - -# This is like CPU_OBJ_VALID, for the obj=multi case. - -CPU_MULTI_VALID = \ - valid= ; \ - case $$c in \ - i386 | mips) valid=yes ;; \ - esac; - -# Regular source files. - -GAS_CFILES = \ - app.c \ - as.c \ - atof-generic.c \ - bignum-copy.c \ - cond.c \ - depend.c \ - dwarf2dbg.c \ - ecoff.c \ - ehopt.c \ - expr.c \ - flonum-copy.c \ - flonum-konst.c \ - flonum-mult.c \ - frags.c \ - hash.c \ - input-file.c \ - input-scrub.c \ - listing.c \ - literal.c \ - macro.c \ - messages.c \ - output-file.c \ - read.c \ - sb.c \ - stabs.c \ - subsegs.c \ - symbols.c \ - write.c - -CFILES = $(GAS_CFILES) gasp.c itbl-ops.c - -HFILES = \ - as.h \ - asintl.h \ - bignum.h \ - bit_fix.h \ - cgen.h \ - dwarf2dbg.h \ - ecoff.h \ - emul-target.h \ - emul.h \ - expr.h \ - flonum.h \ - frags.h \ - hash.h \ - input-file.h \ - itbl-ops.h \ - listing.h \ - macro.h \ - obj.h \ - output-file.h \ - read.h \ - sb.h \ - struc-symbol.h \ - subsegs.h \ - symbols.h \ - tc.h \ - write.h - -# CPU files in config. - -TARGET_CPU_CFILES = \ - config/tc-a29k.c \ - config/tc-alpha.c \ - config/tc-arc.c \ - config/tc-arm.c \ - config/tc-d10v.c \ - config/tc-d30v.c \ - config/tc-fr30.c \ - config/tc-h8300.c \ - config/tc-h8500.c \ - config/tc-hppa.c \ - config/tc-i370.c \ - config/tc-i386.c \ - config/tc-i860.c \ - config/tc-i960.c \ - config/tc-m32r.c \ - config/tc-m68k.c \ - config/tc-m88k.c \ - config/tc-mcore.c \ - config/tc-mips.c \ - config/tc-mn10200.c \ - config/tc-mn10300.c \ - config/tc-ns32k.c \ - config/tc-pj.c \ - config/tc-ppc.c \ - config/tc-sh.c \ - config/tc-sparc.c \ - config/tc-tahoe.c \ - config/tc-tic30.c \ - config/tc-tic80.c \ - config/tc-vax.c \ - config/tc-w65.c \ - config/tc-v850.c \ - config/tc-z8k.c - -TARGET_CPU_HFILES = \ - config/tc-a29k.h \ - config/tc-alpha.h \ - config/tc-arc.h \ - config/tc-arm.h \ - config/tc-d10v.h \ - config/tc-d30v.h \ - config/tc-fr30.h \ - config/tc-h8300.h \ - config/tc-h8500.h \ - config/tc-hppa.h \ - config/tc-i370.h \ - config/tc-i386.h \ - config/tc-i860.h \ - config/tc-i960.h \ - config/tc-m32r.h \ - config/tc-m68k.h \ - config/tc-m88k.h \ - config/tc-mcore.h \ - config/tc-mips.h \ - config/tc-mn10200.h \ - config/tc-mn10300.h \ - config/tc-ns32k.h \ - config/tc-pj.h \ - config/tc-ppc.h \ - config/tc-sh.h \ - config/tc-sparc.h \ - config/tc-tahoe.h \ - config/tc-tic30.h \ - config/tc-tic80.h \ - config/tc-vax.h \ - config/tc-w65.h \ - config/tc-v850.h \ - config/tc-z8k.h - -# OBJ files in config - -OBJ_FORMAT_CFILES = \ - config/obj-aout.c \ - config/obj-bout.c \ - config/obj-coff.c \ - config/obj-ecoff.c \ - config/obj-elf.c \ - config/obj-evax.c \ - config/obj-hp300.c \ - config/obj-ieee.c \ - config/obj-som.c \ - config/obj-vms.c - -OBJ_FORMAT_HFILES = \ - config/obj-aout.h \ - config/obj-bout.h \ - config/obj-coff.h \ - config/obj-ecoff.h \ - config/obj-elf.h \ - config/obj-evax.h \ - config/obj-hp300.h \ - config/obj-ieee.h \ - config/obj-som.h \ - config/obj-vms.h - -# Emulation header files in config - -TARG_ENV_HFILES = \ - config/te-386bsd.h \ - config/te-aux.h \ - config/te-delta.h \ - config/te-delt88.h \ - config/te-dpx2.h \ - config/te-dynix.h \ - config/te-epoc-pe.h \ - config/te-generic.h \ - config/te-go32.h \ - config/te-hp300.h \ - config/te-hppa.h \ - config/te-i386aix.h \ - config/te-ic960.h \ - config/te-linux.h \ - config/te-lnews.h \ - config/te-lynx.h \ - config/te-mach.h \ - config/te-macos.h \ - config/te-multi.h \ - config/te-nbsd.h \ - config/te-nbsd532.h \ - config/te-pc532mach.h \ - config/te-pe.h \ - config/te-ppcnw.h \ - config/te-psos.h \ - config/te-riscix.h \ - config/te-sparcaout.h \ - config/te-sun3.h \ - config/te-svr4.h \ - config/te-sysv32.h - -# Multi files in config - -MULTI_CFILES = \ - config/e-i386aout.c \ - config/e-i386coff.c \ - config/e-i386elf.c \ - config/e-mipsecoff.c \ - config/e-mipself.c - -CONFIG_OBJS = \ - $(TARG_CPU_O) \ - $(OBJ_FORMAT_O) \ - $(ATOF_TARG_O) \ - $(extra_objects) - -GENERIC_OBJS = \ - app.o \ - as.o \ - atof-generic.o \ - bignum-copy.o \ - cond.o \ - depend.o \ - dwarf2dbg.o \ - ehopt.o \ - expr.o \ - flonum-konst.o \ - flonum-copy.o \ - flonum-mult.o \ - frags.o \ - hash.o \ - input-file.o \ - input-scrub.o \ - literal.o \ - messages.o \ - output-file.o \ - read.o \ - subsegs.o \ - symbols.o \ - write.o \ - listing.o \ - ecoff.o \ - stabs.o \ - sb.o \ - macro.o - -OBJS = $(CONFIG_OBJS) $(GENERIC_OBJS) - -POTFILES = $(MULTI_CFILES) $(TARGET_ENV_HFILES) $(OBJ_FORMAT_HFILES) \ - $(OBJ_FORMAT_CFILES) $(TARGET_CPU_HFILES) $(TARGET_CPU_CFILES) \ - $(HFILES) $(CFILES) $(GAS_CFILES) -po/POTFILES.in: @MAINT@ Makefile - for file in $(POTFILES); do echo $$file; done | sort > tmp \ - && mv tmp $(srcdir)/po/POTFILES.in - -noinst_PROGRAMS = as-new gasp-new -noinst_SCRIPTS = $(GDBINIT) -EXTRA_SCRIPTS = .gdbinit - -$(srcdir)/make-gas.com: stamp-mk.com -stamp-mk.com: vmsconf.sh Makefile - sh $(srcdir)/vmsconf.sh $(GENERIC_OBJS) > new-make.com - $(SHELL) $(srcdir)/../move-if-change new-make.com $(srcdir)/make-gas.com - touch stamp-mk.com - -EXTRA_DIST = make-gas.com - -DISTSTUFF = make-gas.com m68k-parse.c itbl-parse.c itbl-parse.h itbl-lex.c -diststuff: $(DISTSTUFF) info - -DISTCLEANFILES = targ-cpu.h obj-format.h targ-env.h itbl-cpu.h cgen-desc.h - -# Now figure out from those variables how to compile and link. - -BASEDIR = $(srcdir)/.. -BFDDIR = $(BASEDIR)/bfd -INCDIR = $(BASEDIR)/include - -# This is the variable actually used when we compile. -# Specify the directories to be searched for header files. -# Both . and srcdir are used, in that order, -# so that tm.h and config.h will be found in the compilation -# subdirectory rather than in the source directory. -INCLUDES = -D_GNU_SOURCE -I. -I$(srcdir) -I../bfd -I$(srcdir)/config -I$(INCDIR) -I$(srcdir)/.. -I$(BFDDIR) -I$(srcdir)/../intl -I../intl -DLOCALEDIR="\"$(prefix)/share/locale\"" - -# This should be parallel to INCLUDES, but should replace $(srcdir) -# with $${srcdir}, and should work in a subdirectory. This is used -# when building dependencies, because the dependency building is done -# in a subdirectory. -DEP_INCLUDES = -D_GNU_SOURCE -I.. -I$${srcdir} -I../../bfd -I$${srcdir}/config -I$${srcdir}/../include -I$${srcdir}/.. -I$${srcdir}/../bfd -I$${srcdir}/../intl -I../../intl -DLOCALEDIR="\"$(prefix)/share/locale\"" - -# How to link with both our special library facilities -# and the system's installed libraries. - -GASLIBS = @OPCODES_LIB@ @BFDLIB@ ../libiberty/libiberty.a - -# Files to be copied away after each stage in building. -STAGESTUFF = *.o $(noinst_PROGRAMS) - -$(OBJS): @ALL_OBJ_DEPS@ - -as_new_SOURCES = $(GAS_CFILES) -as_new_LDADD = $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ - $(extra_objects) $(GASLIBS) $(INTLLIBS) -as_new_DEPENDENCIES = $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ - $(extra_objects) $(GASLIBS) $(INTLDEPS) - -# Stuff that every object file depends upon. If anything is removed -# from this list, remove it from dep-in.sed as well. -$(OBJS): config.h as.h $(TARG_ENV_H) $(OBJ_FORMAT_H) $(TARG_CPU_H) flonum.h \ - expr.h write.h frags.h hash.h read.h symbols.h tc.h \ - obj.h listing.h bignum.h bit_fix.h $(INCDIR)/libiberty.h asintl.h - -gasp_new_SOURCES = gasp.c macro.c sb.c hash.c -gasp_new_LDADD = ../libiberty/libiberty.a $(INTLLIBS) -gasp_new_DEPENDENCIES = ../libiberty/libiberty.a $(INTLDEPS) - -EXPECT = `if [ -f $${rootme}/../expect/expect ] ; then \ - echo $${rootme}/../expect/expect ; \ - else echo expect ; fi` - -RUNTEST = `if [ -f $${srcdir}/../dejagnu/runtest ] ; then \ - echo $${srcdir}/../dejagnu/runtest ; else echo runtest; \ - fi` -RUNTESTFLAGS= - -check-DEJAGNU: site.exp - if [ -d testsuite ]; then \ - true; \ - else \ - mkdir testsuite; \ - fi - rm -f testsuite/site.exp - cp site.exp testsuite/site.exp - rootme=`pwd`; export rootme; \ - srcdir=`cd ${srcdir}; pwd` ; export srcdir ; \ - EXPECT=${EXPECT} ; export EXPECT ; \ - if [ -f $(top_builddir)/../expect/expect ]; then \ - TCL_LIBRARY=`cd $(top_srcdir)/../tcl/library && pwd`; \ - export TCL_LIBRARY; \ - fi; \ - runtest=$(RUNTEST); \ - cd testsuite; \ - if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ - $$runtest --tool $(DEJATOOL) --srcdir $${srcdir}/testsuite \ - $(RUNTESTFLAGS); \ - else echo "WARNING: could not find \`runtest'" 1>&2; :;\ - fi - -# The implicit .c.o rule doesn't work for these, perhaps because of -# the variables, or perhaps because the sources are not on vpath. -$(TARG_CPU_O): $(TARG_CPU_C) $(TARG_CPU_DEP_@target_cpu_type@) - $(COMPILE) -c $(TARG_CPU_C) -$(ATOF_TARG_O): $(ATOF_TARG_C) - $(COMPILE) -c $(ATOF_TARG_C) - -# ecoff.c only has full dependencies when ECOFF_DEBUGGING is defined, -# so the automatic dependency stuff doesn't work. -ecoff.o : ecoff.c ecoff.h $(INCDIR)/coff/internal.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h $(INCDIR)/coff/symconst.h \ - $(INCDIR)/aout/stab_gnu.h - -# We need all these explicit rules for the multi stuff. Because of -# these rules, we don't need one for OBJ_FORMAT_O. - -obj-aout.o : $(srcdir)/config/obj-aout.c - $(COMPILE) -c $(srcdir)/config/obj-aout.c -obj-bout.o : $(srcdir)/config/obj-bout.c - $(COMPILE) -c $(srcdir)/config/obj-bout.c -obj-coff.o: $(srcdir)/config/obj-coff.c - $(COMPILE) -c $(srcdir)/config/obj-coff.c -obj-ecoff.o : $(srcdir)/config/obj-ecoff.c - $(COMPILE) -c $(srcdir)/config/obj-ecoff.c -obj-elf.o : $(srcdir)/config/obj-elf.c - $(COMPILE) -c $(srcdir)/config/obj-elf.c -obj-evax.o : $(srcdir)/config/obj-evax.c - $(COMPILE) -c $(srcdir)/config/obj-evax.c -obj-hp300.o : $(srcdir)/config/obj-hp300.c - $(COMPILE) -c $(srcdir)/config/obj-hp300.c -obj-ieee.o : $(srcdir)/config/obj-ieee.c - $(COMPILE) -c $(srcdir)/config/obj-ieee.c -obj-multi.o : $(srcdir)/config/obj-multi.c - $(COMPILE) -c $(srcdir)/config/obj-multi.c -obj-som.o : $(srcdir)/config/obj-som.c - $(COMPILE) -c $(srcdir)/config/obj-som.c -obj-vms.o : $(srcdir)/config/obj-vms.c - $(COMPILE) -c $(srcdir)/config/obj-vms.c - -e-mipself.o : $(srcdir)/config/e-mipself.c - $(COMPILE) -c $(srcdir)/config/e-mipself.c -e-mipsecoff.o : $(srcdir)/config/e-mipsecoff.c - $(COMPILE) -c $(srcdir)/config/e-mipsecoff.c -e-i386aout.o: $(srcdir)/config/e-i386aout.c - $(COMPILE) -c $(srcdir)/config/e-i386aout.c -e-i386coff.o: $(srcdir)/config/e-i386coff.c - $(COMPILE) -c $(srcdir)/config/e-i386coff.c -e-i386elf.o: $(srcdir)/config/e-i386elf.c - $(COMPILE) -c $(srcdir)/config/e-i386elf.c - -# The m68k operand parser. - -EXTRA_as_new_SOURCES = config/m68k-parse.y - -# If m68k-parse.y is in a different directory, then ylwrap will use an -# absolute path when it invokes yacc, which will cause yacc to put the -# absolute path into the generated file. That's a pain when it comes -# to generating snapshots, because it introduces spurious diffs. -# Since when we make the snapshots $(srcdir) = ".", we check for that -# case and handle it differently. This means that anybody who -# configures with $(srcdir) = "." will have to set their path in the -# debugger if they want to debug m68k-parse.y. This is bad, but on -# the other hand it's good that people who use the prebuilt -# m68k-parse.c don't get a spurious absolute path. -m68k-parse.c: $(srcdir)/config/m68k-parse.y - f=$(srcdir)/config/m68k-parse.y; \ - if [ $$f = "./config/m68k-parse.y" ]; then \ - ln -s config/m68k-parse.y . > /dev/null 2>/dev/null || \ - ln config/m68k-parse.y . > /dev/null 2>/dev/null || \ - cp config/m68k-parse.y . >/dev/null 2>/dev/null; \ - f=m68k-parse.y; \ - else true; fi; \ - $(SHELL) $(YLWRAP) "$(YACC)" $$f y.tab.c m68k-parse.c --; \ - if [ $$f = "m68k-parse.y" ]; then \ - rm -f m68k-parse.y; \ - else true; fi -m68k-parse.o: m68k-parse.c $(srcdir)/config/m68k-parse.h - -# Don't let the .y.h rule clobber m68k-parse.h. -m68k-parse.h: ; @true -$(srcdir)/config/m68k-parse.h: ; @true - -# The instruction table specification lexical analyzer and parser. - -itbl-lex.c: $(srcdir)/itbl-lex.l -itbl-lex.o: itbl-lex.c itbl-parse.h - -itbl-parse.o: itbl-parse.c itbl-parse.h $(srcdir)/itbl-ops.h - -itbl-ops.o: $(srcdir)/itbl-ops.c $(srcdir)/itbl-ops.h itbl-parse.h - -itbl-parse.c itbl-parse.h: $(srcdir)/itbl-parse.y - $(SHELL) $(YLWRAP) "$(YACC)" $(srcdir)/itbl-parse.y y.tab.c itbl-parse.c y.tab.h itbl-parse.h -- -d - -# stand-alone itbl assembler & disassembler - -EXTRA_PROGRAMS = itbl-test -itbl_test_SOURCES = itbl-parse.y itbl-lex.l -itbl_test_LDADD = itbl-tops.o itbl-test.o $(GASLIBS) @LEXLIB@ - -itbl-tops.o: $(srcdir)/itbl-ops.c $(srcdir)/itbl-ops.h itbl-parse.h - $(COMPILE) -o itbl-tops.o -DSTAND_ALONE -c $(srcdir)/itbl-ops.c - -itbl-test.o: $(srcdir)/testsuite/gas/all/itbl-test.c $(srcdir)/itbl-ops.h - $(COMPILE) -c -DSTAND_ALONE $(srcdir)/testsuite/gas/all/itbl-test.c - -# CGEN interface. - -CGEN_CPU_PREFIX = @cgen_cpu_prefix@ - -cgen.o: cgen.c cgen.h cgen-desc.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/cgen.h \ - $(srcdir)/../opcodes/$(CGEN_CPU_PREFIX)-desc.h \ - $(srcdir)/../opcodes/$(CGEN_CPU_PREFIX)-opc.h - -# Remake the info files. - -MOSTLYCLEANFILES = $(STAGESTUFF) core stamp-mk.com \ - testsuite/*.o testsuite/*.out testsuite/gas.log testsuite/gas.sum \ - testsuite/site.exp site.bak site.exp stage stage1 stage2 - -CLEANFILES = dep.sed DEPTC DEPTCA DEPOBJ DEPOBJA DEP2 DEP2a DEP1 DEPA DEP DEPDIR - -.PHONY: install-exec-local install-data-local -.PHONY: install-exec-bindir install-exec-tooldir - -install-exec-local: install-exec-bindir @install_tooldir@ - -install-exec-bindir: $(noinst_PROGRAMS) - $(mkinstalldirs) $(bindir) - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed -e 's/$(EXEEXT)$$//' -e 's/-new//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed -e 's/$(EXEEXT)$$//' -e 's/-new//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - else :; fi; \ - done - -install-exec-tooldir: install-exec-bindir $(noinst_PROGRAMS) - $(mkinstalldirs) $(tooldir)/bin - n=`echo as | sed '$(transform)'`; \ - if [ "$(bindir)/$$n$(EXEEXT)" != "$(tooldir)/bin/as$(EXEEXT)" ]; then \ - rm -f $(tooldir)/bin/as$(EXEEXT); \ - ln $(bindir)/$$n$(EXEEXT) $(tooldir)/bin/as$(EXEEXT) >/dev/null 2>/dev/null \ - || $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) as-new$(EXEEXT) $(tooldir)/bin/as$(EXEEXT); \ - else \ - true ; \ - fi - -# These exist for maintenance purposes. - -.PHONY: bootstrap bootstrap2 bootstrap3 stage1 stage2 stage3 comparison - -bootstrap: as-new - $(MAKE) stage1 - rm -f stage && ln -s stage1 stage - $(MAKE) CC="$(CC)" CFLAGS="-O -Bstage/ $(CFLAGS)" libdir=$(libdir) ALLOCA= $(noinst_PROGRAMS) - $(MAKE) stage2 - rm -f stage && ln -s stage2 stage - $(MAKE) CC="$(CC)" CFLAGS="-O -Bstage/ $(CFLAGS)" libdir=$(libdir) ALLOCA= $(noinst_PROGRAMS) - $(MAKE) comparison against=stage2 - -bootstrap2: - rm -f stage && ln -s stage1 stage - $(MAKE) CC="$(CC)" CFLAGS="-O -Bstage/ $(CFLAGS)" libdir=$(libdir) ALLOCA= $(noinst_PROGRAMS) - $(MAKE) stage2 - rm -f stage && ln -s stage2 stage - $(MAKE) CC="$(CC)" CFLAGS="-O -Bstage/ $(CFLAGS)" libdir=$(libdir) ALLOCA= $(noinst_PROGRAMS) - $(MAKE) comparison against=stage2 - -bootstrap3: - rm -f stage && ln -s stage2 stage - $(MAKE) CC="$(CC)" CFLAGS="-O -Bstage/ $(CFLAGS)" libdir=$(libdir) ALLOCA= $(noinst_PROGRAMS) - $(MAKE) comparison against=stage2 - -# Copy the object files from a particular stage into a subdirectory. -stage1: - -mkdir stage1 - -mv $(STAGESTUFF) stage1 - if [ -f stage1/as-new$(EXEEXT) -a ! -f stage1/as$(EXEEXT) ] ; then (cd stage1 ; ln -s as-new$(EXEEXT) as$(EXEEXT)) ; fi - -stage2: - -mkdir stage2 - -mv $(STAGESTUFF) stage2 - if [ -f stage2/as-new$(EXEEXT) -a ! -f stage2/as$(EXEEXT) ] ; then (cd stage2 ; ln -s as-new$(EXEEXT) as$(EXEEXT)) ; fi - -stage3: - -mkdir stage3 - -mv $(STAGESTUFF) stage3 - if [ -f stage3/as-new$(EXEEXT) -a ! -f stage3/as$(EXEEXT) ] ; then (cd stage3 ; ln -s as-new as$(EXEEXT)) ; fi - -against=stage2 - -# This rule is derived from corresponding code in the Makefile.in for gcc. -# The "tail +16c" is to bypass headers which may include timestamps or -# temporary assembly file names. -comparison: - x=0 ; \ - for file in *.o ; do \ - tail +16c ./$$file > tmp-foo1; \ - if tail +16c ${against}/$$file > tmp-foo2 2>/dev/null ; then \ - if cmp tmp-foo1 tmp-foo2 ; then \ - true ; \ - else \ - echo $$file differs ; \ - x=1 ; \ - fi ; \ - else true; fi ; \ - done ; \ - exit $$x - -rm -f tmp-foo* - -.PHONY: de-stage1 de-stage2 de-stage3 - -de-stage1: - - (cd stage1 ; rm -f as$(EXEEXT) ; mv -f * ..) - - rmdir stage1 - -de-stage2: - - (cd stage2 ; rm -f as$(EXEEXT) ; mv -f * ..) - - rmdir stage2 - -de-stage3: - - (cd stage3 ; rm -f as$(EXEEXT) ; mv -f * ..) - - rmdir stage3 - -# Automatic dependency computation. This is a real pain, because the -# dependencies change based on target_cpu_type and obj_format. We -# currently ignore any dependencies caused by emulation files. - -DEP_FILE_DEPS = $(CFILES) $(HFILES) $(TARGET_CPU_CFILES) \ - $(TARGET_CPU_HFILES) $(OBJ_FORMAT_CFILES) $(OBJ_FORMAT_HFILES) - -DEP: dep.sed $(DEP_FILE_DEPS) DEPTC DEPOBJ DEP2 - rm -f DEP1 - srcdir=`cd $(srcdir); pwd`; \ - $(MAKE) MKDEP="$(MKDEP)" srcdir="$${srcdir}" VPATH="$${srcdir}" DEP1 - rm -rf DEPDIR - sed -f dep.sed < DEP1 > DEPA - sed -f dep.sed < DEPTC >> DEPA - sed -f dep.sed < DEPOBJ >> DEPA - sed -f dep.sed < DEP2 >> DEPA - echo '$$(OBJS): $$(DEP_@target''_cpu_type@_@obj''_format@)' >> DEPA - echo '$$(TARG_CPU_O): $$(DEPTC_@target''_cpu_type@_@obj''_format@)' >> DEPA - echo '$$(OBJ_FORMAT_O): $$(DEPOBJ_@target''_cpu_type@_@obj''_format@)' >> DEPA - echo '# IF YOU PUT ANYTHING HERE IT WILL GO AWAY' >> DEPA - mv -f DEPA $@ - -DEP1: $(CFILES) $(MULTI_CFILES) - if [ -d DEPDIR ]; then true; else mkdir DEPDIR; fi - srcdir=`cd $(srcdir); pwd`; \ - cd DEPDIR; \ - echo '' > targ-cpu.h; \ - echo '' > obj-format.h; \ - echo '' > targ-env.h; \ - echo '' > itbl-cpu.h; \ - echo '' > itbl-parse.h; \ - echo '# DO NOT DELETE THIS LINE -- mkdep uses it.' > DEP; \ - echo '# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.' >> DEP; \ - $(MKDEP) -DBFD_ASSEMBLER -I. -I.. -I$${srcdir} -I../../bfd $(DEP_INCLUDES) $? >> DEP - mv -f DEPDIR/DEP $@ - -# Work out the special dependencies for the tc-*.c files. -DEPTC: $(TARGET_CPU_CFILES) - rm -f DEPTCA - if [ -d DEPDIR ]; then true; else mkdir DEPDIR; fi - srcdir=`cd $(srcdir); pwd`; \ - cd DEPDIR; \ - for c in $(CPU_TYPES); do \ - for o in $(OBJ_FORMATS); do \ - $(CPU_OBJ_VALID) \ - if [ x$${valid} = xyes ]; then \ - echo '#include "tc-'"$${c}"'.h"' > targ-cpu.h; \ - echo '#include "obj-'"$${o}"'.h"' > obj-format.h; \ - echo '#include "te-generic.h"' > targ-env.h; \ - echo '' > itbl-cpu.h; \ - echo '' > itbl-parse.h; \ - echo '#include "opcodes/'"$${c}"'-desc.h"' > cgen-desc.h; \ - rm -f dummy.c; \ - cp $${srcdir}/config/tc-$${c}.c dummy.c; \ - $(MKDEP) -DBFD_ASSEMBLER -I. -I.. -I$${srcdir} -I../../bfd $(DEP_INCLUDES) dummy.c | \ - sed -e "s/dummy.o: dummy.c/DEPTC_$${c}_$${o} =/" >> ../DEPTCA; \ - rm -f dummy.c; \ - else true; fi; \ - done; \ - done - echo 'DEPTC_hppa_som = $$(srcdir)/config/tc-hppa.h subsegs.h \' >> DEPTCA - echo ' $$(INCDIR)/obstack.h $$(BFDDIR)/libhppa.h \' >> DEPTCA - echo ' $$(INCDIR)/opcode/hppa.h $$(BFDDIR)/som.h' >> DEPTCA -# We don't try to handle all multi cases. - for c in $(CPU_TYPES); do \ - $(CPU_MULTI_VALID) \ - if [ x$${valid} = xyes ]; then \ - o=ecoff; \ - $(CPU_OBJ_VALID) \ - echo 'DEPTC_'"$${c}"'_multi = \' >> DEPTCA; \ - echo '$$(DEPTC_'"$${c}"'_coff) \' >> DEPTCA; \ - if [ x$${valid} = xyes ]; then \ - echo '$$(DEPTC_'"$${c}"'_ecoff) \' >> DEPTCA; \ - else true; fi; \ - echo '$$(DEPTC_'"$${c}"'_elf)' >> DEPTCA; \ - else true; fi; \ - done - mv -f DEPTCA DEPTC - -# Work out the special dependencies for the obj-*.c files. -DEPOBJ: $(OBJ_FORMAT_CFILES) - rm -f DEPOBJA - if [ -d DEPDIR ]; then true; else mkdir DEPDIR; fi - srcdir=`cd $(srcdir); pwd`; \ - cd DEPDIR; \ - for c in $(CPU_TYPES); do \ - for o in $(OBJ_FORMATS); do \ - $(CPU_OBJ_VALID) \ - if [ x$${valid} = xyes ]; then \ - echo '#include "tc-'"$${c}"'.h"' > targ-cpu.h; \ - echo '#include "obj-'"$${o}"'.h"' > obj-format.h; \ - echo '#include "te-generic.h"' > targ-env.h; \ - echo '' > itbl-cpu.h; \ - echo '' > itbl-parse.h; \ - rm -f dummy.c; \ - cp $${srcdir}/config/obj-$${o}.c dummy.c; \ - $(MKDEP) -DBFD_ASSEMBLER -I. -I.. -I$${srcdir} -I../../bfd $(DEP_INCLUDES) dummy.c | \ - sed -e "s/dummy.o: dummy.c/DEPOBJ_$${c}_$${o} =/" >> ../DEPOBJA; \ - rm -f dummy.c; \ - else true; fi; \ - done; \ - done - echo 'DEPOBJ_hppa_som = $$(srcdir)/config/obj-som.h subsegs.h \' >> DEPOBJA - echo ' $$(INCDIR)/obstack.h $$(BFDDIR)/libhppa.h \' >> DEPOBJA - echo ' $$(BFDDIR)/som.h $$(INCDIR)/aout/stab_gnu.h \' >> DEPOBJA - echo ' $$(INCDIR)/aout/stab.def' >> DEPOBJA -# We don't try to handle all multi cases. - for c in $(CPU_TYPES); do \ - $(CPU_MULTI_VALID) \ - if [ x$${valid} = xyes ]; then \ - o=ecoff; \ - $(CPU_OBJ_VALID) \ - echo 'DEPOBJ_'"$${c}"'_multi = \' >> DEPOBJA; \ - echo '$$(DEPOBJ_'"$${c}"'_coff) \' >> DEPOBJA; \ - if [ x$${valid} = xyes ]; then \ - echo '$$(DEPOBJ_'"$${c}"'_ecoff) \' >> DEPOBJA; \ - else true; fi; \ - echo '$$(DEPOBJ_'"$${c}"'_elf)' >> DEPOBJA; \ - else true; fi; \ - done - mv -f DEPOBJA DEPOBJ - -# Work out the dependencies for each CPU/OBJ combination. -# Note that SOM is a special case, because it only works native. -DEP2: $(TARGET_CPU_HFILES) $(OBJ_FORMAT_HFILES) - rm -f DEP2a - if [ -d DEPDIR ]; then true; else mkdir DEPDIR; fi - srcdir=`cd $(srcdir); pwd`; \ - cd DEPDIR; \ - for c in $(CPU_TYPES); do \ - for o in $(OBJ_FORMATS); do \ - $(CPU_OBJ_VALID) \ - if [ x$${valid} = xyes ]; then \ - echo '#include "tc-'"$${c}"'.h"' > targ-cpu.h; \ - echo '#include "obj-'"$${o}"'.h"' > dummy.c; \ - $(MKDEP) -DBFD_ASSEMBLER -I. -I.. -I$${srcdir} -I../../bfd $(DEP_INCLUDES) dummy.c | \ - sed -e "s/dummy.o: dummy.c/DEP_$${c}_$${o} =/" >> ../DEP2a; \ - else true; fi; \ - done; \ - done - echo 'DEP_hppa_som = $$(BFDDIR)/som.h' >> DEP2a -# We don't try to handle all multi cases. - for c in $(CPU_TYPES); do \ - $(CPU_MULTI_VALID) \ - if [ x$${valid} = xyes ]; then \ - o=ecoff; \ - $(CPU_OBJ_VALID) \ - echo 'DEP_'"$${c}"'_multi = \' >> DEP2a; \ - echo '$$(DEP_'"$${c}"'_coff) \' >> DEP2a; \ - if [ x$${valid} = xyes ]; then \ - echo '$$(DEP_'"$${c}"'_ecoff) \' >> DEP2a; \ - else true; fi; \ - echo '$$(DEP_'"$${c}"'_elf)' >> DEP2a; \ - else true; fi; \ - done - mv -f DEP2a DEP2 - -dep.sed: dep-in.sed config.status - srcdir=`cd $(srcdir); pwd`; \ - sed <$(srcdir)/dep-in.sed >dep.sed \ - -e "s!@INCDIR@!$${srcdir}/../include!" \ - -e "s!@BFDDIR@!$${srcdir}/../bfd!" \ - -e "s!@SRCDIR@!$${srcdir}!" - -dep: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < Makefile > tmp-Makefile - cat DEP >> tmp-Makefile - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile Makefile - -dep-in: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < $(srcdir)/Makefile.in > tmp-Makefile.in - cat DEP >> tmp-Makefile.in - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile.in $(srcdir)/Makefile.in - -dep-am: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < $(srcdir)/Makefile.am > tmp-Makefile.am - cat DEP >> tmp-Makefile.am - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile.am $(srcdir)/Makefile.am - -.PHONY: dep dep-in dep-am - -# DO NOT DELETE THIS LINE -- mkdep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. -app.o: app.c $(INCDIR)/bin-bugs.h emul.h -as.o: as.c $(INCDIR)/bin-bugs.h emul.h subsegs.h $(INCDIR)/obstack.h \ - output-file.h sb.h macro.h -atof-generic.o: atof-generic.c $(INCDIR)/bin-bugs.h \ - emul.h -bignum-copy.o: bignum-copy.c $(INCDIR)/bin-bugs.h emul.h -cond.o: cond.c $(INCDIR)/bin-bugs.h emul.h macro.h \ - sb.h $(INCDIR)/obstack.h -depend.o: depend.c $(INCDIR)/bin-bugs.h emul.h -dwarf2dbg.o: dwarf2dbg.c $(INCDIR)/bin-bugs.h emul.h \ - dwarf2dbg.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/elf/dwarf2.h -ecoff.o: ecoff.c $(INCDIR)/bin-bugs.h emul.h ecoff.h -ehopt.o: ehopt.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/elf/dwarf2.h -expr.o: expr.c $(INCDIR)/bin-bugs.h emul.h $(INCDIR)/obstack.h -flonum-copy.o: flonum-copy.c $(INCDIR)/bin-bugs.h emul.h -flonum-konst.o: flonum-konst.c -flonum-mult.o: flonum-mult.c -frags.o: frags.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h -hash.o: hash.c $(INCDIR)/bin-bugs.h emul.h $(INCDIR)/obstack.h -input-file.o: input-file.c $(INCDIR)/bin-bugs.h emul.h \ - input-file.h -input-scrub.o: input-scrub.c $(INCDIR)/bin-bugs.h emul.h \ - input-file.h sb.h -listing.o: listing.c $(INCDIR)/bin-bugs.h emul.h input-file.h \ - subsegs.h -literal.o: literal.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h -macro.o: macro.c sb.h macro.h -messages.o: messages.c $(INCDIR)/bin-bugs.h emul.h -output-file.o: output-file.c $(INCDIR)/bin-bugs.h emul.h \ - output-file.h -read.o: read.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h sb.h macro.h ecoff.h -sb.o: sb.c sb.h -stabs.o: stabs.c $(INCDIR)/bin-bugs.h emul.h $(INCDIR)/obstack.h \ - subsegs.h ecoff.h $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def -subsegs.o: subsegs.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h -symbols.o: symbols.c $(INCDIR)/bin-bugs.h emul.h $(INCDIR)/obstack.h \ - subsegs.h struc-symbol.h -write.o: write.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h output-file.h -gasp.o: gasp.c $(INCDIR)/bin-bugs.h sb.h macro.h -itbl-ops.o: itbl-ops.c itbl-ops.h $(INCDIR)/bin-bugs.h \ - emul.h itbl-parse.h -e-i386aout.o: $(srcdir)/config/e-i386aout.c $(INCDIR)/bin-bugs.h \ - emul.h emul-target.h -e-i386coff.o: $(srcdir)/config/e-i386coff.c $(INCDIR)/bin-bugs.h \ - emul.h emul-target.h -e-i386elf.o: $(srcdir)/config/e-i386elf.c $(INCDIR)/bin-bugs.h \ - emul.h emul-target.h -e-mipsecoff.o: $(srcdir)/config/e-mipsecoff.c $(INCDIR)/bin-bugs.h \ - emul.h emul-target.h -e-mipself.o: $(srcdir)/config/e-mipself.c $(INCDIR)/bin-bugs.h \ - emul.h emul-target.h -DEPTC_a29k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-a29k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/a29k.h -DEPTC_a29k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-a29k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/a29k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/a29k.h -DEPTC_a29k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-a29k.h \ - emul.h $(INCDIR)/opcode/a29k.h -DEPTC_alpha_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-alpha.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h struc-symbol.h ecoff.h $(INCDIR)/opcode/alpha.h \ - $(srcdir)/config/atof-vax.c -DEPTC_alpha_ecoff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-ecoff.h \ - $(srcdir)/config/tc-alpha.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h emul.h subsegs.h $(INCDIR)/obstack.h \ - struc-symbol.h $(INCDIR)/opcode/alpha.h $(srcdir)/config/atof-vax.c -DEPTC_alpha_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-alpha.h \ - emul.h subsegs.h $(INCDIR)/obstack.h struc-symbol.h \ - ecoff.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h \ - $(INCDIR)/opcode/alpha.h $(INCDIR)/elf/alpha.h $(INCDIR)/elf/reloc-macros.h \ - $(srcdir)/config/atof-vax.c -DEPTC_alpha_evax = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-evax.h \ - $(srcdir)/config/tc-alpha.h emul.h subsegs.h $(INCDIR)/obstack.h \ - struc-symbol.h ecoff.h $(INCDIR)/opcode/alpha.h $(srcdir)/config/atof-vax.c -DEPTC_arc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-arc.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/arc.h $(INCDIR)/elf/arc.h \ - $(INCDIR)/elf/reloc-macros.h -DEPTC_arc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/arc.h \ - $(INCDIR)/elf/arc.h $(INCDIR)/elf/reloc-macros.h -DEPTC_arm_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-arm.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h -DEPTC_arm_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-arm.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/arm.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h -DEPTC_arm_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arm.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/elf/arm.h \ - $(INCDIR)/elf/reloc-macros.h -DEPTC_d10v_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-d10v.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/d10v.h $(INCDIR)/elf/ppc.h \ - $(INCDIR)/elf/reloc-macros.h -DEPTC_d10v_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d10v.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/d10v.h \ - $(INCDIR)/elf/ppc.h $(INCDIR)/elf/reloc-macros.h -DEPTC_d30v_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-d30v.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/d30v.h -DEPTC_d30v_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d30v.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/d30v.h -DEPTC_fr30_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-fr30.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/symcat.h $(srcdir)/../opcodes/fr30-desc.h \ - $(INCDIR)/opcode/cgen.h $(srcdir)/../opcodes/fr30-opc.h \ - cgen.h -DEPTC_fr30_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-fr30.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/symcat.h \ - $(srcdir)/../opcodes/fr30-desc.h $(INCDIR)/opcode/cgen.h \ - $(srcdir)/../opcodes/fr30-opc.h cgen.h -DEPTC_h8300_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-h8300.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/h8300.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/h8300.h -DEPTC_h8300_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8300.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/h8300.h -DEPTC_h8500_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-h8500.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/h8500.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/h8500-opc.h -DEPTC_h8500_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8500.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/h8500-opc.h -DEPTC_hppa_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-hppa.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(BFDDIR)/libhppa.h $(BFDDIR)/libbfd.h \ - $(INCDIR)/opcode/hppa.h -DEPTC_i370_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i370.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h struc-symbol.h $(INCDIR)/opcode/i370.h -DEPTC_i370_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i370.h \ - emul.h subsegs.h $(INCDIR)/obstack.h struc-symbol.h \ - $(INCDIR)/opcode/i370.h $(INCDIR)/elf/i370.h -DEPTC_i386_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-i386.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/i386.h -DEPTC_i386_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i386.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/i386.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/i386.h -DEPTC_i386_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i386.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/i386.h -DEPTC_i860_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-i860.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/i860.h -DEPTC_i860_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i860.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/opcode/i860.h -DEPTC_i860_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i860.h \ - emul.h $(INCDIR)/opcode/i860.h -DEPTC_i960_bout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-bout.h \ - $(srcdir)/config/tc-i960.h emul.h $(INCDIR)/obstack.h \ - $(INCDIR)/opcode/i960.h -DEPTC_i960_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i960.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/i960.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h $(INCDIR)/opcode/i960.h -DEPTC_i960_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i960.h \ - emul.h $(INCDIR)/obstack.h $(INCDIR)/opcode/i960.h -DEPTC_m32r_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m32r.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/symcat.h $(srcdir)/../opcodes/m32r-desc.h \ - $(INCDIR)/opcode/cgen.h $(srcdir)/../opcodes/m32r-opc.h \ - cgen.h -DEPTC_m32r_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m32r.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/symcat.h \ - $(srcdir)/../opcodes/m32r-desc.h $(INCDIR)/opcode/cgen.h \ - $(srcdir)/../opcodes/m32r-opc.h cgen.h -DEPTC_m68k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-m68k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h $(INCDIR)/opcode/m68k.h \ - $(srcdir)/config/m68k-parse.h -DEPTC_m68k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m68k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/m68k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h $(INCDIR)/opcode/m68k.h \ - $(srcdir)/config/m68k-parse.h -DEPTC_m68k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m68k.h \ - emul.h $(INCDIR)/obstack.h subsegs.h $(INCDIR)/opcode/m68k.h \ - $(srcdir)/config/m68k-parse.h $(INCDIR)/elf/m68k.h \ - $(INCDIR)/elf/reloc-macros.h -DEPTC_m68k_hp300 = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-hp300.h \ - $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-m68k.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h $(INCDIR)/opcode/m68k.h $(srcdir)/config/m68k-parse.h -DEPTC_m88k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m88k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/m88k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/config/m88k-opcode.h -DEPTC_m88k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m88k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/config/m88k-opcode.h -DEPTC_mcore_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mcore.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/mcore.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/mcore-opc.h -DEPTC_mcore_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mcore.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/mcore-opc.h \ - $(INCDIR)/elf/mcore.h $(INCDIR)/elf/reloc-macros.h -DEPTC_mips_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-mips.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/mips.h \ - itbl-ops.h $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/elf/mips.h $(INCDIR)/elf/reloc-macros.h ecoff.h \ - $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h -DEPTC_mips_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mips.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/mipspe.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/mips.h \ - itbl-ops.h $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/elf/mips.h $(INCDIR)/elf/reloc-macros.h ecoff.h \ - $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h -DEPTC_mips_ecoff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-ecoff.h \ - $(srcdir)/config/tc-mips.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h emul.h subsegs.h $(INCDIR)/obstack.h \ - $(INCDIR)/opcode/mips.h itbl-ops.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/mips.h \ - $(INCDIR)/elf/reloc-macros.h -DEPTC_mips_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mips.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/mips.h \ - itbl-ops.h $(INCDIR)/elf/mips.h $(INCDIR)/elf/reloc-macros.h \ - ecoff.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h -DEPTC_mn10200_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mn10200.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/mn10200.h -DEPTC_mn10200_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10200.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/mn10200.h -DEPTC_mn10300_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mn10300.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/mn10300.h -DEPTC_mn10300_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10300.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/mn10300.h -DEPTC_ns32k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-ns32k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/ns32k.h $(INCDIR)/obstack.h -DEPTC_ns32k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-ns32k.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/opcode/ns32k.h \ - $(INCDIR)/obstack.h -DEPTC_ns32k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h \ - emul.h $(INCDIR)/opcode/ns32k.h $(INCDIR)/obstack.h -DEPTC_pj_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-pj.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/opcode/pj.h -DEPTC_pj_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-pj.h \ - emul.h $(INCDIR)/opcode/pj.h -DEPTC_ppc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-ppc.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/rs6000.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/ppc.h -DEPTC_ppc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ppc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/ppc.h \ - $(INCDIR)/elf/ppc.h $(INCDIR)/elf/reloc-macros.h -DEPTC_sh_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-sh.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sh.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/sh-opc.h -DEPTC_sh_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/sh-opc.h \ - $(INCDIR)/elf/sh.h $(INCDIR)/elf/reloc-macros.h -DEPTC_sparc_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-sparc.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/sparc.h -DEPTC_sparc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-sparc.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sparc.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/sparc.h -DEPTC_sparc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sparc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/sparc.h \ - $(INCDIR)/elf/sparc.h $(INCDIR)/elf/reloc-macros.h -DEPTC_tahoe_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-tahoe.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h $(INCDIR)/opcode/tahoe.h -DEPTC_tahoe_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tahoe.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - $(INCDIR)/opcode/tahoe.h -DEPTC_tahoe_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tahoe.h \ - emul.h $(INCDIR)/obstack.h $(INCDIR)/opcode/tahoe.h -DEPTC_tic30_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-tic30.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/tic30.h -DEPTC_tic30_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tic30.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/tic30.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/tic30.h -DEPTC_tic30_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic30.h \ - emul.h $(INCDIR)/opcode/tic30.h -DEPTC_tic80_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tic80.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/tic80.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/tic80.h -DEPTC_tic80_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic80.h \ - emul.h $(INCDIR)/opcode/tic80.h -DEPTC_vax_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-vax.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(srcdir)/config/vax-inst.h $(INCDIR)/obstack.h \ - $(INCDIR)/opcode/vax.h -DEPTC_vax_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-vax.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(srcdir)/config/vax-inst.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/vax.h -DEPTC_vax_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-vax.h \ - emul.h $(srcdir)/config/vax-inst.h $(INCDIR)/obstack.h \ - $(INCDIR)/opcode/vax.h -DEPTC_vax_vms = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-vms.h \ - $(srcdir)/config/tc-vax.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def emul.h $(srcdir)/config/vax-inst.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/vax.h -DEPTC_w65_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-w65.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/w65.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/w65-opc.h -DEPTC_w65_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-w65.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/w65-opc.h -DEPTC_v850_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-v850.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/v850.h -DEPTC_v850_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-v850.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/v850.h -DEPTC_z8k_coff = $(srcdir)/../opcodes/z8k-opc.h $(INCDIR)/bin-bugs.h \ - $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-z8k.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/z8k.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h emul.h -DEPTC_z8k_elf = $(srcdir)/../opcodes/z8k-opc.h $(INCDIR)/bin-bugs.h \ - $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h \ - $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \ - $(srcdir)/config/tc-z8k.h emul.h -DEPTC_hppa_som = $(srcdir)/config/tc-hppa.h subsegs.h \ - $(INCDIR)/obstack.h $(BFDDIR)/libhppa.h $(INCDIR)/opcode/hppa.h \ - $(BFDDIR)/som.h -DEPTC_i386_multi = $(DEPTC_i386_coff) $(DEPTC_i386_elf) -DEPTC_mips_multi = $(DEPTC_mips_coff) $(DEPTC_mips_ecoff) \ - $(DEPTC_mips_elf) -DEPOBJ_a29k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-a29k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_a29k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-a29k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/a29k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_a29k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-a29k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_alpha_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-alpha.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_alpha_ecoff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-ecoff.h \ - $(srcdir)/config/tc-alpha.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h emul.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h $(BFDDIR)/libecoff.h -DEPOBJ_alpha_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-alpha.h \ - emul.h subsegs.h $(INCDIR)/obstack.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h $(INCDIR)/elf/alpha.h $(INCDIR)/elf/reloc-macros.h \ - $(INCDIR)/aout/aout64.h -DEPOBJ_alpha_evax = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-evax.h \ - $(srcdir)/config/tc-alpha.h emul.h -DEPOBJ_arc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-arc.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_arc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_arm_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-arm.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_arm_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-arm.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/arm.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_arm_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arm.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_d10v_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-d10v.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_d10v_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d10v.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_d30v_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-d30v.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_d30v_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d30v.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_fr30_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-fr30.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_fr30_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-fr30.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_h8300_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-h8300.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/h8300.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_h8300_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8300.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_h8500_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-h8500.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/h8500.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_h8500_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8500.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_hppa_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-hppa.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_i370_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i370.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_i370_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i370.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/elf/i370.h \ - $(INCDIR)/aout/aout64.h -DEPOBJ_i386_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-i386.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_i386_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i386.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/i386.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_i386_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i386.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_i860_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-i860.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_i860_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i860.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_i860_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i860.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_i960_bout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-bout.h \ - $(srcdir)/config/tc-i960.h emul.h $(INCDIR)/obstack.h -DEPOBJ_i960_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i960.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/i960.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_i960_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i960.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_m32r_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m32r.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_m32r_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m32r.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_m68k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-m68k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_m68k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m68k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/m68k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_m68k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m68k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_m68k_hp300 = $(srcdir)/config/obj-aout.c $(INCDIR)/bin-bugs.h \ - $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-m68k.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/aout/aout64.h \ - $(INCDIR)/obstack.h -DEPOBJ_m88k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m88k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/m88k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_m88k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m88k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_mcore_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mcore.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/mcore.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_mcore_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mcore.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_mips_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-mips.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_mips_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mips.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/mipspe.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_mips_ecoff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-ecoff.h \ - $(srcdir)/config/tc-mips.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h emul.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h $(BFDDIR)/libecoff.h -DEPOBJ_mips_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mips.h \ - emul.h subsegs.h $(INCDIR)/obstack.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h $(INCDIR)/elf/mips.h $(INCDIR)/elf/reloc-macros.h \ - $(INCDIR)/aout/aout64.h -DEPOBJ_mn10200_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mn10200.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_mn10200_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10200.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_mn10300_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mn10300.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_mn10300_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10300.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_ns32k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-ns32k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_ns32k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-ns32k.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_ns32k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_pj_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-pj.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_pj_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-pj.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_ppc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-ppc.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/rs6000.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_ppc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ppc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/elf/ppc.h \ - $(INCDIR)/elf/reloc-macros.h $(INCDIR)/aout/aout64.h -DEPOBJ_sh_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-sh.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sh.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_sh_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_sparc_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-sparc.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_sparc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-sparc.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sparc.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_sparc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sparc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_tahoe_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-tahoe.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_tahoe_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tahoe.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_tahoe_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tahoe.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_tic30_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-tic30.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_tic30_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tic30.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/tic30.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_tic30_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic30.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_tic80_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tic80.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/tic80.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_tic80_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic80.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_vax_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-vax.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h -DEPOBJ_vax_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-vax.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_vax_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-vax.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_vax_vms = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-vms.h \ - $(srcdir)/config/tc-vax.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def emul.h subsegs.h $(INCDIR)/obstack.h -DEPOBJ_w65_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-w65.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/w65.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_w65_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-w65.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_v850_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-v850.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h -DEPOBJ_v850_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-v850.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_z8k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-z8k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/z8k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h -DEPOBJ_z8k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-z8k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h -DEPOBJ_hppa_som = $(srcdir)/config/obj-som.h subsegs.h \ - $(INCDIR)/obstack.h $(BFDDIR)/libhppa.h $(BFDDIR)/som.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def -DEPOBJ_i386_multi = $(DEPOBJ_i386_coff) $(DEPOBJ_i386_elf) -DEPOBJ_mips_multi = $(DEPOBJ_mips_coff) $(DEPOBJ_mips_ecoff) \ - $(DEPOBJ_mips_elf) -DEP_a29k_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-a29k.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_a29k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-a29k.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/a29k.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_a29k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-a29k.h -DEP_alpha_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-alpha.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_alpha_ecoff = $(srcdir)/config/obj-ecoff.h $(srcdir)/config/tc-alpha.h \ - ecoff.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h -DEP_alpha_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-alpha.h -DEP_alpha_evax = $(srcdir)/config/obj-evax.h $(srcdir)/config/tc-alpha.h -DEP_arc_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-arc.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_arc_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arc.h -DEP_arm_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-arm.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_arm_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-arm.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/arm.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_arm_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arm.h -DEP_d10v_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-d10v.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_d10v_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d10v.h -DEP_d30v_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-d30v.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_d30v_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d30v.h -DEP_fr30_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-fr30.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_fr30_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-fr30.h -DEP_h8300_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-h8300.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/h8300.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_h8300_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8300.h -DEP_h8500_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-h8500.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/h8500.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_h8500_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8500.h -DEP_hppa_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-hppa.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_i370_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-i370.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_i370_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i370.h -DEP_i386_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-i386.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_i386_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-i386.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/i386.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_i386_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i386.h -DEP_i860_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-i860.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_i860_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-i860.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_i860_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i860.h -DEP_i960_bout = $(srcdir)/config/obj-bout.h $(srcdir)/config/tc-i960.h -DEP_i960_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-i960.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/i960.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_i960_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i960.h -DEP_m32r_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-m32r.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_m32r_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m32r.h -DEP_m68k_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-m68k.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_m68k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-m68k.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/m68k.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_m68k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m68k.h -DEP_m68k_hp300 = $(srcdir)/config/obj-hp300.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-m68k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_m88k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-m88k.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/m88k.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_m88k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m88k.h -DEP_mcore_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-mcore.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/mcore.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_mcore_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mcore.h -DEP_mips_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-mips.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_mips_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-mips.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/mipspe.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_mips_ecoff = $(srcdir)/config/obj-ecoff.h $(srcdir)/config/tc-mips.h \ - ecoff.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h -DEP_mips_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mips.h -DEP_mn10200_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-mn10200.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_mn10200_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10200.h -DEP_mn10300_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-mn10300.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_mn10300_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10300.h -DEP_ns32k_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-ns32k.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_ns32k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-ns32k.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_ns32k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h -DEP_pj_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-pj.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_pj_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-pj.h -DEP_ppc_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-ppc.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/rs6000.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_ppc_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ppc.h -DEP_sh_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-sh.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/sh.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_sh_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh.h -DEP_sparc_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-sparc.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_sparc_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-sparc.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/sparc.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_sparc_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sparc.h -DEP_tahoe_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-tahoe.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_tahoe_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-tahoe.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_tahoe_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tahoe.h -DEP_tic30_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-tic30.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_tic30_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-tic30.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/tic30.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_tic30_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic30.h -DEP_tic80_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-tic80.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/tic80.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_tic80_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic80.h -DEP_vax_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-vax.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h -DEP_vax_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-vax.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_vax_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-vax.h -DEP_vax_vms = $(srcdir)/config/obj-vms.h $(srcdir)/config/tc-vax.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def -DEP_w65_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-w65.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/w65.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_w65_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-w65.h -DEP_v850_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-v850.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h -DEP_v850_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-v850.h -DEP_z8k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-z8k.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/z8k.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h -DEP_z8k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-z8k.h -DEP_hppa_som = $(BFDDIR)/som.h -DEP_i386_multi = $(DEP_i386_coff) $(DEP_i386_elf) -DEP_mips_multi = $(DEP_mips_coff) $(DEP_mips_ecoff) \ - $(DEP_mips_elf) -$(OBJS): $(DEP_@target_cpu_type@_@obj_format@) -$(TARG_CPU_O): $(DEPTC_@target_cpu_type@_@obj_format@) -$(OBJ_FORMAT_O): $(DEPOBJ_@target_cpu_type@_@obj_format@) -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/gas/Makefile.in b/gas/Makefile.in deleted file mode 100644 index f4ad64330a0..00000000000 --- a/gas/Makefile.in +++ /dev/null @@ -1,2646 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = . - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_alias = @build_alias@ -build_triplet = @build@ -host_alias = @host_alias@ -host_triplet = @host@ -target_alias = @target_alias@ -target_triplet = @target@ -ALL_OBJ_DEPS = @ALL_OBJ_DEPS@ -AS = @AS@ -BFDLIB = @BFDLIB@ -CATALOGS = @CATALOGS@ -CATOBJEXT = @CATOBJEXT@ -CC = @CC@ -DATADIRNAME = @DATADIRNAME@ -DLLTOOL = @DLLTOOL@ -EXEEXT = @EXEEXT@ -GDBINIT = @GDBINIT@ -GMOFILES = @GMOFILES@ -GMSGFMT = @GMSGFMT@ -GT_NO = @GT_NO@ -GT_YES = @GT_YES@ -INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ -INSTOBJEXT = @INSTOBJEXT@ -INTLDEPS = @INTLDEPS@ -INTLOBJS = @INTLOBJS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKINSTALLDIRS = @MKINSTALLDIRS@ -MSGFMT = @MSGFMT@ -OBJDUMP = @OBJDUMP@ -OPCODES_LIB = @OPCODES_LIB@ -PACKAGE = @PACKAGE@ -POFILES = @POFILES@ -POSUB = @POSUB@ -RANLIB = @RANLIB@ -USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ -USE_NLS = @USE_NLS@ -VERSION = @VERSION@ -atof = @atof@ -cgen_cpu_prefix = @cgen_cpu_prefix@ -extra_objects = @extra_objects@ -install_tooldir = @install_tooldir@ -l = @l@ -obj_format = @obj_format@ -target_cpu_type = @target_cpu_type@ -te_file = @te_file@ - -INTLLIBS = @INTLLIBS@ - -AUTOMAKE_OPTIONS = cygnus dejagnu - -SUBDIRS = doc po - -tooldir = $(exec_prefix)/$(target_alias) - -YACC = `if [ -f ../bison/bison ] ; then echo ../bison/bison -y -L../bison/bison ; else echo bison -y ; fi` -LEX = `if [ -f ../flex/flex ] ; then echo ../flex/flex ; else echo flex ; fi` - -WARN_CFLAGS = @WARN_CFLAGS@ -AM_CFLAGS = $(WARN_CFLAGS) - -MKDEP = gcc -MM - -TARG_CPU = @target_cpu_type@ -TARG_CPU_C = $(srcdir)/config/tc-@target_cpu_type@.c -TARG_CPU_O = tc-@target_cpu_type@.o -TARG_CPU_H = $(srcdir)/config/tc-@target_cpu_type@.h -OBJ_FORMAT_C = $(srcdir)/config/obj-@obj_format@.c -OBJ_FORMAT_O = obj-@obj_format@.o -OBJ_FORMAT_H = $(srcdir)/config/obj-@obj_format@.h -TARG_ENV_H = $(srcdir)/config/te-@te_file@.h -ATOF_TARG_C = $(srcdir)/config/atof-@atof@.c -ATOF_TARG_O = atof-@atof@.o - -# use @target_cpu_type@ for refering to configured target name -IT_HDRS = itbl-parse.h $(srcdir)/itbl-ops.h -IT_SRCS = itbl-parse.c itbl-lex.c $(srcdir)/itbl-ops.c -IT_DEPS = $(srcdir)/itbl-parse.y $(srcdir)/itbl-lex.l $(srcdir)/config/itbl-@target_cpu_type@.h -IT_OBJS = itbl-parse.o itbl-lex.o itbl-ops.o - -# CPU types. This is only used for dependency information. - -CPU_TYPES = \ - a29k \ - alpha \ - arc \ - arm \ - d10v \ - d30v \ - fr30 \ - h8300 \ - h8500 \ - hppa \ - i370 \ - i386 \ - i860 \ - i960 \ - m32r \ - m68k \ - m88k \ - mcore \ - mips \ - mn10200 \ - mn10300 \ - ns32k \ - pj \ - ppc \ - sh \ - sparc \ - tahoe \ - tic30 \ - tic80 \ - vax \ - w65 \ - v850 \ - z8k - - -# Object format types. This is only used for dependency information. -# We deliberately omit som, since it does not work as a cross assembler. - -OBJ_FORMATS = \ - aout \ - bout \ - coff \ - ecoff \ - elf \ - evax \ - hp300 \ - ieee \ - vms - - -# This is an sh case which sets valid according to whether the CPU -# type in the shell variable c and the OS type in the shell variable o -# are supported. This helps cuts down on the amount of dependency -# information. - -CPU_OBJ_VALID = \ - valid= ; \ - case $$o in \ - aout) \ - case $$c in \ - a29k | arm | i386 | i860 | m68k | mips | ns32k | sparc | tahoe | tic30 | vax) \ - valid=yes ;; \ - esac ;; \ - bout) \ - case $$c in \ - i960) valid=yes ;; \ - esac ;; \ - coff) valid=yes ;; \ - ecoff) \ - case $$c in \ - mips | alpha) valid=yes ;; \ - esac ;; \ - elf) valid=yes ;; \ - evax) \ - case $$c in \ - alpha) valid=yes ;; \ - esac ;; \ - hp300) \ - case $$c in \ - m68k) valid=yes ;; \ - esac ;; \ - vms) \ - case $$c in \ - vax) valid=yes ;; \ - esac ;; \ - esac; - - -# This is like CPU_OBJ_VALID, for the obj=multi case. - -CPU_MULTI_VALID = \ - valid= ; \ - case $$c in \ - i386 | mips) valid=yes ;; \ - esac; - - -# Regular source files. - -GAS_CFILES = \ - app.c \ - as.c \ - atof-generic.c \ - bignum-copy.c \ - cond.c \ - depend.c \ - dwarf2dbg.c \ - ecoff.c \ - ehopt.c \ - expr.c \ - flonum-copy.c \ - flonum-konst.c \ - flonum-mult.c \ - frags.c \ - hash.c \ - input-file.c \ - input-scrub.c \ - listing.c \ - literal.c \ - macro.c \ - messages.c \ - output-file.c \ - read.c \ - sb.c \ - stabs.c \ - subsegs.c \ - symbols.c \ - write.c - - -CFILES = $(GAS_CFILES) gasp.c itbl-ops.c - -HFILES = \ - as.h \ - asintl.h \ - bignum.h \ - bit_fix.h \ - cgen.h \ - dwarf2dbg.h \ - ecoff.h \ - emul-target.h \ - emul.h \ - expr.h \ - flonum.h \ - frags.h \ - hash.h \ - input-file.h \ - itbl-ops.h \ - listing.h \ - macro.h \ - obj.h \ - output-file.h \ - read.h \ - sb.h \ - struc-symbol.h \ - subsegs.h \ - symbols.h \ - tc.h \ - write.h - - -# CPU files in config. - -TARGET_CPU_CFILES = \ - config/tc-a29k.c \ - config/tc-alpha.c \ - config/tc-arc.c \ - config/tc-arm.c \ - config/tc-d10v.c \ - config/tc-d30v.c \ - config/tc-fr30.c \ - config/tc-h8300.c \ - config/tc-h8500.c \ - config/tc-hppa.c \ - config/tc-i370.c \ - config/tc-i386.c \ - config/tc-i860.c \ - config/tc-i960.c \ - config/tc-m32r.c \ - config/tc-m68k.c \ - config/tc-m88k.c \ - config/tc-mcore.c \ - config/tc-mips.c \ - config/tc-mn10200.c \ - config/tc-mn10300.c \ - config/tc-ns32k.c \ - config/tc-pj.c \ - config/tc-ppc.c \ - config/tc-sh.c \ - config/tc-sparc.c \ - config/tc-tahoe.c \ - config/tc-tic30.c \ - config/tc-tic80.c \ - config/tc-vax.c \ - config/tc-w65.c \ - config/tc-v850.c \ - config/tc-z8k.c - - -TARGET_CPU_HFILES = \ - config/tc-a29k.h \ - config/tc-alpha.h \ - config/tc-arc.h \ - config/tc-arm.h \ - config/tc-d10v.h \ - config/tc-d30v.h \ - config/tc-fr30.h \ - config/tc-h8300.h \ - config/tc-h8500.h \ - config/tc-hppa.h \ - config/tc-i370.h \ - config/tc-i386.h \ - config/tc-i860.h \ - config/tc-i960.h \ - config/tc-m32r.h \ - config/tc-m68k.h \ - config/tc-m88k.h \ - config/tc-mcore.h \ - config/tc-mips.h \ - config/tc-mn10200.h \ - config/tc-mn10300.h \ - config/tc-ns32k.h \ - config/tc-pj.h \ - config/tc-ppc.h \ - config/tc-sh.h \ - config/tc-sparc.h \ - config/tc-tahoe.h \ - config/tc-tic30.h \ - config/tc-tic80.h \ - config/tc-vax.h \ - config/tc-w65.h \ - config/tc-v850.h \ - config/tc-z8k.h - - -# OBJ files in config - -OBJ_FORMAT_CFILES = \ - config/obj-aout.c \ - config/obj-bout.c \ - config/obj-coff.c \ - config/obj-ecoff.c \ - config/obj-elf.c \ - config/obj-evax.c \ - config/obj-hp300.c \ - config/obj-ieee.c \ - config/obj-som.c \ - config/obj-vms.c - - -OBJ_FORMAT_HFILES = \ - config/obj-aout.h \ - config/obj-bout.h \ - config/obj-coff.h \ - config/obj-ecoff.h \ - config/obj-elf.h \ - config/obj-evax.h \ - config/obj-hp300.h \ - config/obj-ieee.h \ - config/obj-som.h \ - config/obj-vms.h - - -# Emulation header files in config - -TARG_ENV_HFILES = \ - config/te-386bsd.h \ - config/te-aux.h \ - config/te-delta.h \ - config/te-delt88.h \ - config/te-dpx2.h \ - config/te-dynix.h \ - config/te-epoc-pe.h \ - config/te-generic.h \ - config/te-go32.h \ - config/te-hp300.h \ - config/te-hppa.h \ - config/te-i386aix.h \ - config/te-ic960.h \ - config/te-linux.h \ - config/te-lnews.h \ - config/te-lynx.h \ - config/te-mach.h \ - config/te-macos.h \ - config/te-multi.h \ - config/te-nbsd.h \ - config/te-nbsd532.h \ - config/te-pc532mach.h \ - config/te-pe.h \ - config/te-ppcnw.h \ - config/te-psos.h \ - config/te-riscix.h \ - config/te-sparcaout.h \ - config/te-sun3.h \ - config/te-svr4.h \ - config/te-sysv32.h - - -# Multi files in config - -MULTI_CFILES = \ - config/e-i386aout.c \ - config/e-i386coff.c \ - config/e-i386elf.c \ - config/e-mipsecoff.c \ - config/e-mipself.c - - -CONFIG_OBJS = \ - $(TARG_CPU_O) \ - $(OBJ_FORMAT_O) \ - $(ATOF_TARG_O) \ - $(extra_objects) - - -GENERIC_OBJS = \ - app.o \ - as.o \ - atof-generic.o \ - bignum-copy.o \ - cond.o \ - depend.o \ - dwarf2dbg.o \ - ehopt.o \ - expr.o \ - flonum-konst.o \ - flonum-copy.o \ - flonum-mult.o \ - frags.o \ - hash.o \ - input-file.o \ - input-scrub.o \ - literal.o \ - messages.o \ - output-file.o \ - read.o \ - subsegs.o \ - symbols.o \ - write.o \ - listing.o \ - ecoff.o \ - stabs.o \ - sb.o \ - macro.o - - -OBJS = $(CONFIG_OBJS) $(GENERIC_OBJS) - -POTFILES = $(MULTI_CFILES) $(TARGET_ENV_HFILES) $(OBJ_FORMAT_HFILES) \ - $(OBJ_FORMAT_CFILES) $(TARGET_CPU_HFILES) $(TARGET_CPU_CFILES) \ - $(HFILES) $(CFILES) $(GAS_CFILES) - - -noinst_PROGRAMS = as-new gasp-new -noinst_SCRIPTS = $(GDBINIT) -EXTRA_SCRIPTS = .gdbinit - -EXTRA_DIST = make-gas.com - -DISTSTUFF = make-gas.com m68k-parse.c itbl-parse.c itbl-parse.h itbl-lex.c - -DISTCLEANFILES = targ-cpu.h obj-format.h targ-env.h itbl-cpu.h cgen-desc.h - -# Now figure out from those variables how to compile and link. - -BASEDIR = $(srcdir)/.. -BFDDIR = $(BASEDIR)/bfd -INCDIR = $(BASEDIR)/include - -# This is the variable actually used when we compile. -# Specify the directories to be searched for header files. -# Both . and srcdir are used, in that order, -# so that tm.h and config.h will be found in the compilation -# subdirectory rather than in the source directory. -INCLUDES = -D_GNU_SOURCE -I. -I$(srcdir) -I../bfd -I$(srcdir)/config -I$(INCDIR) -I$(srcdir)/.. -I$(BFDDIR) -I$(srcdir)/../intl -I../intl -DLOCALEDIR="\"$(prefix)/share/locale\"" - -# This should be parallel to INCLUDES, but should replace $(srcdir) -# with $${srcdir}, and should work in a subdirectory. This is used -# when building dependencies, because the dependency building is done -# in a subdirectory. -DEP_INCLUDES = -D_GNU_SOURCE -I.. -I$${srcdir} -I../../bfd -I$${srcdir}/config -I$${srcdir}/../include -I$${srcdir}/.. -I$${srcdir}/../bfd -I$${srcdir}/../intl -I../../intl -DLOCALEDIR="\"$(prefix)/share/locale\"" - -# How to link with both our special library facilities -# and the system's installed libraries. - -GASLIBS = @OPCODES_LIB@ @BFDLIB@ ../libiberty/libiberty.a - -# Files to be copied away after each stage in building. -STAGESTUFF = *.o $(noinst_PROGRAMS) - -as_new_SOURCES = $(GAS_CFILES) -as_new_LDADD = $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ - $(extra_objects) $(GASLIBS) $(INTLLIBS) - -as_new_DEPENDENCIES = $(TARG_CPU_O) $(OBJ_FORMAT_O) $(ATOF_TARG_O) \ - $(extra_objects) $(GASLIBS) $(INTLDEPS) - - -gasp_new_SOURCES = gasp.c macro.c sb.c hash.c -gasp_new_LDADD = ../libiberty/libiberty.a $(INTLLIBS) -gasp_new_DEPENDENCIES = ../libiberty/libiberty.a $(INTLDEPS) - -EXPECT = `if [ -f $${rootme}/../expect/expect ] ; then \ - echo $${rootme}/../expect/expect ; \ - else echo expect ; fi` - - -RUNTEST = `if [ -f $${srcdir}/../dejagnu/runtest ] ; then \ - echo $${srcdir}/../dejagnu/runtest ; else echo runtest; \ - fi` - -RUNTESTFLAGS = - -# The m68k operand parser. - -EXTRA_as_new_SOURCES = config/m68k-parse.y - -# stand-alone itbl assembler & disassembler - -EXTRA_PROGRAMS = itbl-test -itbl_test_SOURCES = itbl-parse.y itbl-lex.l -itbl_test_LDADD = itbl-tops.o itbl-test.o $(GASLIBS) @LEXLIB@ - -# CGEN interface. - -CGEN_CPU_PREFIX = @cgen_cpu_prefix@ - -# Remake the info files. - -MOSTLYCLEANFILES = $(STAGESTUFF) core stamp-mk.com \ - testsuite/*.o testsuite/*.out testsuite/gas.log testsuite/gas.sum \ - testsuite/site.exp site.bak site.exp stage stage1 stage2 - - -CLEANFILES = dep.sed DEPTC DEPTCA DEPOBJ DEPOBJA DEP2 DEP2a DEP1 DEPA DEP DEPDIR - -against = stage2 - -# Automatic dependency computation. This is a real pain, because the -# dependencies change based on target_cpu_type and obj_format. We -# currently ignore any dependencies caused by emulation files. - -DEP_FILE_DEPS = $(CFILES) $(HFILES) $(TARGET_CPU_CFILES) \ - $(TARGET_CPU_HFILES) $(OBJ_FORMAT_CFILES) $(OBJ_FORMAT_HFILES) - -DEPTC_a29k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-a29k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/a29k.h - -DEPTC_a29k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-a29k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/a29k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/a29k.h - -DEPTC_a29k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-a29k.h \ - emul.h $(INCDIR)/opcode/a29k.h - -DEPTC_alpha_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-alpha.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h struc-symbol.h ecoff.h $(INCDIR)/opcode/alpha.h \ - $(srcdir)/config/atof-vax.c - -DEPTC_alpha_ecoff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-ecoff.h \ - $(srcdir)/config/tc-alpha.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h emul.h subsegs.h $(INCDIR)/obstack.h \ - struc-symbol.h $(INCDIR)/opcode/alpha.h $(srcdir)/config/atof-vax.c - -DEPTC_alpha_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-alpha.h \ - emul.h subsegs.h $(INCDIR)/obstack.h struc-symbol.h \ - ecoff.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h \ - $(INCDIR)/opcode/alpha.h $(INCDIR)/elf/alpha.h $(INCDIR)/elf/reloc-macros.h \ - $(srcdir)/config/atof-vax.c - -DEPTC_alpha_evax = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-evax.h \ - $(srcdir)/config/tc-alpha.h emul.h subsegs.h $(INCDIR)/obstack.h \ - struc-symbol.h ecoff.h $(INCDIR)/opcode/alpha.h $(srcdir)/config/atof-vax.c - -DEPTC_arc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-arc.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/arc.h $(INCDIR)/elf/arc.h \ - $(INCDIR)/elf/reloc-macros.h - -DEPTC_arc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/arc.h \ - $(INCDIR)/elf/arc.h $(INCDIR)/elf/reloc-macros.h - -DEPTC_arm_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-arm.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h - -DEPTC_arm_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-arm.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/arm.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h - -DEPTC_arm_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arm.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/elf/arm.h \ - $(INCDIR)/elf/reloc-macros.h - -DEPTC_d10v_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-d10v.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/d10v.h $(INCDIR)/elf/ppc.h \ - $(INCDIR)/elf/reloc-macros.h - -DEPTC_d10v_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d10v.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/d10v.h \ - $(INCDIR)/elf/ppc.h $(INCDIR)/elf/reloc-macros.h - -DEPTC_d30v_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-d30v.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/d30v.h - -DEPTC_d30v_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d30v.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/d30v.h - -DEPTC_fr30_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-fr30.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/symcat.h $(srcdir)/../opcodes/fr30-desc.h \ - $(INCDIR)/opcode/cgen.h $(srcdir)/../opcodes/fr30-opc.h \ - cgen.h - -DEPTC_fr30_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-fr30.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/symcat.h \ - $(srcdir)/../opcodes/fr30-desc.h $(INCDIR)/opcode/cgen.h \ - $(srcdir)/../opcodes/fr30-opc.h cgen.h - -DEPTC_h8300_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-h8300.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/h8300.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/h8300.h - -DEPTC_h8300_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8300.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/h8300.h - -DEPTC_h8500_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-h8500.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/h8500.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/h8500-opc.h - -DEPTC_h8500_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8500.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/h8500-opc.h - -DEPTC_hppa_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-hppa.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(BFDDIR)/libhppa.h $(BFDDIR)/libbfd.h \ - $(INCDIR)/opcode/hppa.h - -DEPTC_i370_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i370.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h struc-symbol.h $(INCDIR)/opcode/i370.h - -DEPTC_i370_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i370.h \ - emul.h subsegs.h $(INCDIR)/obstack.h struc-symbol.h \ - $(INCDIR)/opcode/i370.h $(INCDIR)/elf/i370.h - -DEPTC_i386_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-i386.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/i386.h - -DEPTC_i386_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i386.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/i386.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/i386.h - -DEPTC_i386_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i386.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/i386.h - -DEPTC_i860_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-i860.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/i860.h - -DEPTC_i860_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i860.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/opcode/i860.h - -DEPTC_i860_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i860.h \ - emul.h $(INCDIR)/opcode/i860.h - -DEPTC_i960_bout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-bout.h \ - $(srcdir)/config/tc-i960.h emul.h $(INCDIR)/obstack.h \ - $(INCDIR)/opcode/i960.h - -DEPTC_i960_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i960.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/i960.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h $(INCDIR)/opcode/i960.h - -DEPTC_i960_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i960.h \ - emul.h $(INCDIR)/obstack.h $(INCDIR)/opcode/i960.h - -DEPTC_m32r_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m32r.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/symcat.h $(srcdir)/../opcodes/m32r-desc.h \ - $(INCDIR)/opcode/cgen.h $(srcdir)/../opcodes/m32r-opc.h \ - cgen.h - -DEPTC_m32r_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m32r.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/symcat.h \ - $(srcdir)/../opcodes/m32r-desc.h $(INCDIR)/opcode/cgen.h \ - $(srcdir)/../opcodes/m32r-opc.h cgen.h - -DEPTC_m68k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-m68k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h $(INCDIR)/opcode/m68k.h \ - $(srcdir)/config/m68k-parse.h - -DEPTC_m68k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m68k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/m68k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h $(INCDIR)/opcode/m68k.h \ - $(srcdir)/config/m68k-parse.h - -DEPTC_m68k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m68k.h \ - emul.h $(INCDIR)/obstack.h subsegs.h $(INCDIR)/opcode/m68k.h \ - $(srcdir)/config/m68k-parse.h $(INCDIR)/elf/m68k.h \ - $(INCDIR)/elf/reloc-macros.h - -DEPTC_m68k_hp300 = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-hp300.h \ - $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-m68k.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h $(INCDIR)/opcode/m68k.h $(srcdir)/config/m68k-parse.h - -DEPTC_m88k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m88k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/m88k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/config/m88k-opcode.h - -DEPTC_m88k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m88k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/config/m88k-opcode.h - -DEPTC_mcore_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mcore.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/mcore.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/mcore-opc.h - -DEPTC_mcore_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mcore.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/mcore-opc.h \ - $(INCDIR)/elf/mcore.h $(INCDIR)/elf/reloc-macros.h - -DEPTC_mips_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-mips.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/mips.h \ - itbl-ops.h $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/elf/mips.h $(INCDIR)/elf/reloc-macros.h ecoff.h \ - $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h - -DEPTC_mips_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mips.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/mipspe.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/mips.h \ - itbl-ops.h $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/elf/mips.h $(INCDIR)/elf/reloc-macros.h ecoff.h \ - $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h - -DEPTC_mips_ecoff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-ecoff.h \ - $(srcdir)/config/tc-mips.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h emul.h subsegs.h $(INCDIR)/obstack.h \ - $(INCDIR)/opcode/mips.h itbl-ops.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/mips.h \ - $(INCDIR)/elf/reloc-macros.h - -DEPTC_mips_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mips.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/mips.h \ - itbl-ops.h $(INCDIR)/elf/mips.h $(INCDIR)/elf/reloc-macros.h \ - ecoff.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h - -DEPTC_mn10200_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mn10200.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/mn10200.h - -DEPTC_mn10200_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10200.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/mn10200.h - -DEPTC_mn10300_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mn10300.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/mn10300.h - -DEPTC_mn10300_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10300.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/mn10300.h - -DEPTC_ns32k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-ns32k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/ns32k.h $(INCDIR)/obstack.h - -DEPTC_ns32k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-ns32k.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/opcode/ns32k.h \ - $(INCDIR)/obstack.h - -DEPTC_ns32k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h \ - emul.h $(INCDIR)/opcode/ns32k.h $(INCDIR)/obstack.h - -DEPTC_pj_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-pj.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/opcode/pj.h - -DEPTC_pj_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-pj.h \ - emul.h $(INCDIR)/opcode/pj.h - -DEPTC_ppc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-ppc.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/rs6000.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/ppc.h - -DEPTC_ppc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ppc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/ppc.h \ - $(INCDIR)/elf/ppc.h $(INCDIR)/elf/reloc-macros.h - -DEPTC_sh_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-sh.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sh.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/sh-opc.h - -DEPTC_sh_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/sh-opc.h \ - $(INCDIR)/elf/sh.h $(INCDIR)/elf/reloc-macros.h - -DEPTC_sparc_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-sparc.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/sparc.h - -DEPTC_sparc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-sparc.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sparc.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/sparc.h - -DEPTC_sparc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sparc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/sparc.h \ - $(INCDIR)/elf/sparc.h $(INCDIR)/elf/reloc-macros.h - -DEPTC_tahoe_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-tahoe.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h $(INCDIR)/opcode/tahoe.h - -DEPTC_tahoe_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tahoe.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - $(INCDIR)/opcode/tahoe.h - -DEPTC_tahoe_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tahoe.h \ - emul.h $(INCDIR)/obstack.h $(INCDIR)/opcode/tahoe.h - -DEPTC_tic30_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-tic30.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/tic30.h - -DEPTC_tic30_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tic30.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/tic30.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/tic30.h - -DEPTC_tic30_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic30.h \ - emul.h $(INCDIR)/opcode/tic30.h - -DEPTC_tic80_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tic80.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/tic80.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/opcode/tic80.h - -DEPTC_tic80_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic80.h \ - emul.h $(INCDIR)/opcode/tic80.h - -DEPTC_vax_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-vax.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(srcdir)/config/vax-inst.h $(INCDIR)/obstack.h \ - $(INCDIR)/opcode/vax.h - -DEPTC_vax_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-vax.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(srcdir)/config/vax-inst.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/vax.h - -DEPTC_vax_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-vax.h \ - emul.h $(srcdir)/config/vax-inst.h $(INCDIR)/obstack.h \ - $(INCDIR)/opcode/vax.h - -DEPTC_vax_vms = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-vms.h \ - $(srcdir)/config/tc-vax.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def emul.h $(srcdir)/config/vax-inst.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/vax.h - -DEPTC_w65_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-w65.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/w65.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/w65-opc.h - -DEPTC_w65_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-w65.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/w65-opc.h - -DEPTC_v850_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-v850.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/v850.h - -DEPTC_v850_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-v850.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/opcode/v850.h - -DEPTC_z8k_coff = $(srcdir)/../opcodes/z8k-opc.h $(INCDIR)/bin-bugs.h \ - $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-z8k.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/z8k.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h emul.h - -DEPTC_z8k_elf = $(srcdir)/../opcodes/z8k-opc.h $(INCDIR)/bin-bugs.h \ - $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h \ - $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \ - $(srcdir)/config/tc-z8k.h emul.h - -DEPTC_hppa_som = $(srcdir)/config/tc-hppa.h subsegs.h \ - $(INCDIR)/obstack.h $(BFDDIR)/libhppa.h $(INCDIR)/opcode/hppa.h \ - $(BFDDIR)/som.h - -DEPTC_i386_multi = $(DEPTC_i386_coff) $(DEPTC_i386_elf) -DEPTC_mips_multi = $(DEPTC_mips_coff) $(DEPTC_mips_ecoff) \ - $(DEPTC_mips_elf) - -DEPOBJ_a29k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-a29k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_a29k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-a29k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/a29k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_a29k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-a29k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_alpha_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-alpha.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_alpha_ecoff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-ecoff.h \ - $(srcdir)/config/tc-alpha.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h emul.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h $(BFDDIR)/libecoff.h - -DEPOBJ_alpha_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-alpha.h \ - emul.h subsegs.h $(INCDIR)/obstack.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h $(INCDIR)/elf/alpha.h $(INCDIR)/elf/reloc-macros.h \ - $(INCDIR)/aout/aout64.h - -DEPOBJ_alpha_evax = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-evax.h \ - $(srcdir)/config/tc-alpha.h emul.h - -DEPOBJ_arc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-arc.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_arc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_arm_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-arm.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_arm_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-arm.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/arm.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_arm_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arm.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_d10v_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-d10v.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_d10v_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d10v.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_d30v_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-d30v.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_d30v_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d30v.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_fr30_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-fr30.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_fr30_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-fr30.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_h8300_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-h8300.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/h8300.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_h8300_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8300.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_h8500_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-h8500.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/h8500.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_h8500_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8500.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_hppa_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-hppa.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_i370_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i370.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_i370_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i370.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/elf/i370.h \ - $(INCDIR)/aout/aout64.h - -DEPOBJ_i386_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-i386.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_i386_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i386.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/i386.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_i386_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i386.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_i860_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-i860.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_i860_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i860.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_i860_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i860.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_i960_bout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-bout.h \ - $(srcdir)/config/tc-i960.h emul.h $(INCDIR)/obstack.h - -DEPOBJ_i960_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-i960.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/i960.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_i960_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i960.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_m32r_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m32r.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_m32r_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m32r.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_m68k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-m68k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_m68k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m68k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/m68k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_m68k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m68k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_m68k_hp300 = $(srcdir)/config/obj-aout.c $(INCDIR)/bin-bugs.h \ - $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-m68k.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/aout/aout64.h \ - $(INCDIR)/obstack.h - -DEPOBJ_m88k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-m88k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/m88k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_m88k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m88k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_mcore_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mcore.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/mcore.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_mcore_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mcore.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_mips_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-mips.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_mips_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mips.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/mipspe.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_mips_ecoff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-ecoff.h \ - $(srcdir)/config/tc-mips.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h emul.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h $(BFDDIR)/libecoff.h - -DEPOBJ_mips_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mips.h \ - emul.h subsegs.h $(INCDIR)/obstack.h ecoff.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h $(INCDIR)/elf/mips.h $(INCDIR)/elf/reloc-macros.h \ - $(INCDIR)/aout/aout64.h - -DEPOBJ_mn10200_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mn10200.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_mn10200_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10200.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_mn10300_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-mn10300.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_mn10300_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10300.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_ns32k_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-ns32k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_ns32k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-ns32k.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_ns32k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_pj_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-pj.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_pj_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-pj.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_ppc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-ppc.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/rs6000.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_ppc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ppc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/elf/ppc.h \ - $(INCDIR)/elf/reloc-macros.h $(INCDIR)/aout/aout64.h - -DEPOBJ_sh_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-sh.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sh.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_sh_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_sparc_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-sparc.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_sparc_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-sparc.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sparc.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_sparc_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sparc.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_tahoe_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-tahoe.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_tahoe_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tahoe.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_tahoe_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tahoe.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_tic30_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-tic30.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_tic30_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tic30.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/tic30.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_tic30_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic30.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_tic80_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-tic80.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/tic80.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_tic80_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic80.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_vax_aout = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-vax.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h - -DEPOBJ_vax_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-vax.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_vax_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-vax.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_vax_vms = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-vms.h \ - $(srcdir)/config/tc-vax.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def emul.h subsegs.h $(INCDIR)/obstack.h - -DEPOBJ_w65_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-w65.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/w65.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_w65_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-w65.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_v850_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-v850.h $(INCDIR)/coff/internal.h \ - $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h emul.h $(INCDIR)/obstack.h \ - subsegs.h - -DEPOBJ_v850_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-v850.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_z8k_coff = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-coff.h \ - $(srcdir)/config/tc-z8k.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/z8k.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \ - emul.h $(INCDIR)/obstack.h subsegs.h - -DEPOBJ_z8k_elf = $(INCDIR)/bin-bugs.h $(srcdir)/config/obj-elf.h \ - $(BFDDIR)/elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-z8k.h \ - emul.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h - -DEPOBJ_hppa_som = $(srcdir)/config/obj-som.h subsegs.h \ - $(INCDIR)/obstack.h $(BFDDIR)/libhppa.h $(BFDDIR)/som.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def - -DEPOBJ_i386_multi = $(DEPOBJ_i386_coff) $(DEPOBJ_i386_elf) -DEPOBJ_mips_multi = $(DEPOBJ_mips_coff) $(DEPOBJ_mips_ecoff) \ - $(DEPOBJ_mips_elf) - -DEP_a29k_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-a29k.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_a29k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-a29k.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/a29k.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_a29k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-a29k.h - -DEP_alpha_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-alpha.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_alpha_ecoff = $(srcdir)/config/obj-ecoff.h $(srcdir)/config/tc-alpha.h \ - ecoff.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h - -DEP_alpha_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-alpha.h - -DEP_alpha_evax = $(srcdir)/config/obj-evax.h $(srcdir)/config/tc-alpha.h -DEP_arc_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-arc.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_arc_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arc.h - -DEP_arm_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-arm.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_arm_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-arm.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/arm.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_arm_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-arm.h - -DEP_d10v_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-d10v.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_d10v_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d10v.h - -DEP_d30v_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-d30v.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_d30v_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-d30v.h - -DEP_fr30_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-fr30.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_fr30_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-fr30.h - -DEP_h8300_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-h8300.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/h8300.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_h8300_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8300.h - -DEP_h8500_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-h8500.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/h8500.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_h8500_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-h8500.h - -DEP_hppa_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-hppa.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_i370_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-i370.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_i370_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i370.h - -DEP_i386_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-i386.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_i386_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-i386.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/i386.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_i386_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i386.h - -DEP_i860_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-i860.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_i860_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-i860.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_i860_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i860.h - -DEP_i960_bout = $(srcdir)/config/obj-bout.h $(srcdir)/config/tc-i960.h -DEP_i960_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-i960.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/i960.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_i960_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-i960.h - -DEP_m32r_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-m32r.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_m32r_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m32r.h - -DEP_m68k_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-m68k.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_m68k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-m68k.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/m68k.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_m68k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m68k.h - -DEP_m68k_hp300 = $(srcdir)/config/obj-hp300.h $(srcdir)/config/obj-aout.h \ - $(srcdir)/config/tc-m68k.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_m88k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-m88k.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/m88k.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_m88k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-m88k.h - -DEP_mcore_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-mcore.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/mcore.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_mcore_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mcore.h - -DEP_mips_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-mips.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_mips_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-mips.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/mipspe.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_mips_ecoff = $(srcdir)/config/obj-ecoff.h $(srcdir)/config/tc-mips.h \ - ecoff.h $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h - -DEP_mips_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mips.h - -DEP_mn10200_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-mn10200.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_mn10200_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10200.h - -DEP_mn10300_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-mn10300.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_mn10300_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-mn10300.h - -DEP_ns32k_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-ns32k.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_ns32k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-ns32k.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_ns32k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h - -DEP_pj_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-pj.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_pj_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-pj.h - -DEP_ppc_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-ppc.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/rs6000.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_ppc_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ppc.h - -DEP_sh_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-sh.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/sh.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_sh_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh.h - -DEP_sparc_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-sparc.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_sparc_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-sparc.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/sparc.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_sparc_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sparc.h - -DEP_tahoe_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-tahoe.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_tahoe_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-tahoe.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_tahoe_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tahoe.h - -DEP_tic30_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-tic30.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_tic30_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-tic30.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/tic30.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_tic30_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic30.h - -DEP_tic80_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-tic80.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/tic80.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_tic80_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-tic80.h - -DEP_vax_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-vax.h \ - $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h - -DEP_vax_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-vax.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_vax_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-vax.h - -DEP_vax_vms = $(srcdir)/config/obj-vms.h $(srcdir)/config/tc-vax.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def - -DEP_w65_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-w65.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/w65.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_w65_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-w65.h - -DEP_v850_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-v850.h \ - $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h - -DEP_v850_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-v850.h - -DEP_z8k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-z8k.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/z8k.h $(BFDDIR)/libcoff.h \ - $(INCDIR)/bfdlink.h - -DEP_z8k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/bfdlink.h $(srcdir)/config/tc-z8k.h - -DEP_hppa_som = $(BFDDIR)/som.h -DEP_i386_multi = $(DEP_i386_coff) $(DEP_i386_elf) -DEP_mips_multi = $(DEP_mips_coff) $(DEP_mips_ecoff) \ - $(DEP_mips_elf) - -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = ${GDBINIT} -noinst_PROGRAMS = as-new$(EXEEXT) gasp-new$(EXEEXT) -PROGRAMS = $(noinst_PROGRAMS) - - -DEFS = @DEFS@ -I. -I$(srcdir) -I. -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -itbl_test_OBJECTS = itbl-parse.o itbl-lex.o -itbl_test_DEPENDENCIES = itbl-tops.o itbl-test.o \ -../libiberty/libiberty.a -itbl_test_LDFLAGS = -as_new_OBJECTS = app.o as.o atof-generic.o bignum-copy.o cond.o \ -depend.o dwarf2dbg.o ecoff.o ehopt.o expr.o flonum-copy.o \ -flonum-konst.o flonum-mult.o frags.o hash.o input-file.o input-scrub.o \ -listing.o literal.o macro.o messages.o output-file.o read.o sb.o \ -stabs.o subsegs.o symbols.o write.o -as_new_LDFLAGS = -gasp_new_OBJECTS = gasp.o macro.o sb.o hash.o -gasp_new_LDFLAGS = -SCRIPTS = $(noinst_SCRIPTS) - -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LEXLIB = @LEXLIB@ -YLWRAP = $(top_srcdir)/../ylwrap -CFLAGS = @CFLAGS@ -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ -DIST_COMMON = README ./stamp-h.in COPYING ChangeLog Makefile.am \ -Makefile.in NEWS acinclude.m4 aclocal.m4 config.in config/m68k-parse.c \ -configure configure.in gdbinit.in itbl-lex.c itbl-parse.c - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -SOURCES = $(itbl_test_SOURCES) $(as_new_SOURCES) $(EXTRA_as_new_SOURCES) $(gasp_new_SOURCES) -OBJECTS = $(itbl_test_OBJECTS) $(as_new_OBJECTS) $(gasp_new_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .S .c .l .lo .o .s .y -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in acinclude.m4 - cd $(srcdir) && $(ACLOCAL) - -config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck -$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) - cd $(srcdir) && $(AUTOCONF) - -config.h: stamp-h - @if test ! -f $@; then \ - rm -f stamp-h; \ - $(MAKE) stamp-h; \ - else :; fi -stamp-h: $(srcdir)/config.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES= CONFIG_HEADERS=config.h:config.in \ - $(SHELL) ./config.status - @echo timestamp > stamp-h 2> /dev/null -$(srcdir)/config.in: @MAINTAINER_MODE_TRUE@$(srcdir)/stamp-h.in - @if test ! -f $@; then \ - rm -f $(srcdir)/stamp-h.in; \ - $(MAKE) $(srcdir)/stamp-h.in; \ - else :; fi -$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOHEADER) - @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null - -mostlyclean-hdr: - -clean-hdr: - -distclean-hdr: - -rm -f config.h - -maintainer-clean-hdr: -${GDBINIT}: $(top_builddir)/config.status gdbinit.in - cd $(top_builddir) && CONFIG_FILES=$@:gdbinit.in CONFIG_HEADERS= $(SHELL) ./config.status - -mostlyclean-noinstPROGRAMS: - -clean-noinstPROGRAMS: - -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) - -distclean-noinstPROGRAMS: - -maintainer-clean-noinstPROGRAMS: - -.c.o: - $(COMPILE) -c $< - -.s.o: - $(COMPILE) -c $< - -.S.o: - $(COMPILE) -c $< - -mostlyclean-compile: - -rm -f *.o core *.core - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -.c.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -.s.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -.S.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -maintainer-clean-libtool: - -itbl-test$(EXEEXT): $(itbl_test_OBJECTS) $(itbl_test_DEPENDENCIES) - @rm -f itbl-test$(EXEEXT) - $(LINK) $(itbl_test_LDFLAGS) $(itbl_test_OBJECTS) $(itbl_test_LDADD) $(LIBS) - -as-new$(EXEEXT): $(as_new_OBJECTS) $(as_new_DEPENDENCIES) - @rm -f as-new$(EXEEXT) - $(LINK) $(as_new_LDFLAGS) $(as_new_OBJECTS) $(as_new_LDADD) $(LIBS) - -gasp-new$(EXEEXT): $(gasp_new_OBJECTS) $(gasp_new_DEPENDENCIES) - @rm -f gasp-new$(EXEEXT) - $(LINK) $(gasp_new_LDFLAGS) $(gasp_new_OBJECTS) $(gasp_new_LDADD) $(LIBS) -.l.c: - $(LEX) $(AM_LFLAGS) $(LFLAGS) $< && mv $(LEX_OUTPUT_ROOT).c $@ -.y.c: - $(SHELL) $(YLWRAP) "$(YACC)" $< y.tab.c $*.c y.tab.h $*.h -- $(AM_YFLAGS) $(YFLAGS) -config/m68k-parse.h: config/m68k-parse.c -itbl-parse.h: itbl-parse.c - - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. - -@SET_MAKE@ - -all-recursive install-data-recursive install-exec-recursive \ -installdirs-recursive install-recursive uninstall-recursive install-info-recursive \ -check-recursive installcheck-recursive info-recursive dvi-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ - rev="$$subdir $$rev"; \ - test "$$subdir" = "." && dot_seen=yes; \ - done; \ - test "$$dot_seen" = "no" && rev=". $$rev"; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: tags-recursive $(HEADERS) $(SOURCES) config.in $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)config.in$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.in $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - -rm -rf $(distdir) - GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz - mkdir $(distdir)/=build - mkdir $(distdir)/=inst - dc_install_base=`cd $(distdir)/=inst && pwd`; \ - cd $(distdir)/=build \ - && ../configure --srcdir=.. --prefix=$$dc_install_base \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) dist - -rm -rf $(distdir) - @banner="$(distdir).tar.gz is ready for distribution"; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes" -dist: distdir - -chmod -R a+r $(distdir) - GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) - -rm -rf $(distdir) -dist-all: distdir - -chmod -R a+r $(distdir) - GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) - -rm -rf $(distdir) -distdir: $(DISTFILES) - -rm -rf $(distdir) - mkdir $(distdir) - -chmod 777 $(distdir) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - cp -pr $$d/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done - for subdir in $(SUBDIRS); do \ - if test "$$subdir" = .; then :; else \ - test -d $(distdir)/$$subdir \ - || mkdir $(distdir)/$$subdir \ - || exit 1; \ - chmod 777 $(distdir)/$$subdir; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ - || exit 1; \ - fi; \ - done - -DEJATOOL = $(PACKAGE) - -RUNTESTDEFAULTFLAGS = --tool $(DEJATOOL) --srcdir $$srcdir -site.exp: Makefile - @echo 'Making a new site.exp file...' - @test ! -f site.bak || rm -f site.bak - @echo '## these variables are automatically generated by make ##' > $@-t - @echo '# Do not edit here. If you wish to override these values' >> $@-t - @echo '# edit the last section' >> $@-t - @echo 'set tool $(DEJATOOL)' >> $@-t - @echo 'set srcdir $(srcdir)' >> $@-t - @echo 'set objdir' `pwd` >> $@-t - @echo 'set host_alias $(host_alias)' >> $@-t - @echo 'set host_triplet $(host_triplet)' >> $@-t - @echo 'set target_alias $(target_alias)' >> $@-t - @echo 'set target_triplet $(target_triplet)' >> $@-t - @echo 'set build_alias $(build_alias)' >> $@-t - @echo 'set build_triplet $(build_triplet)' >> $@-t - @echo '## All variables above are generated by configure. Do Not Edit ##' >> $@-t - @test ! -f site.exp || sed '1,/^## All variables above are.*##/ d' site.exp >> $@-t - @test ! -f site.exp || mv site.exp site.bak - @mv $@-t site.exp -info-am: -info: info-recursive -dvi-am: -dvi: dvi-recursive -check-am: - $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU -check: check-recursive -installcheck-am: -installcheck: installcheck-recursive -install-info-am: -install-info: install-info-recursive -all-recursive-am: config.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -install-exec-am: install-exec-local -install-exec: install-exec-recursive - -install-data-am: -install-data: install-data-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-recursive -uninstall-am: -uninstall: uninstall-recursive -all-am: Makefile $(PROGRAMS) $(SCRIPTS) config.h -all-redirect: all-recursive-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: installdirs-recursive -installdirs-am: - - -mostlyclean-generic: - -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - -test -z "itbl-lexlconfig/m68k-parsehconfig/m68k-parsecitbl-parsehitbl-parsec" || rm -f itbl-lexl config/m68k-parseh config/m68k-parsec itbl-parseh itbl-parsec -mostlyclean-am: mostlyclean-hdr mostlyclean-noinstPROGRAMS \ - mostlyclean-compile mostlyclean-libtool \ - mostlyclean-tags mostlyclean-generic - -mostlyclean: mostlyclean-recursive - -clean-am: clean-hdr clean-noinstPROGRAMS clean-compile clean-libtool \ - clean-tags clean-generic mostlyclean-am - -clean: clean-recursive - -distclean-am: distclean-hdr distclean-noinstPROGRAMS distclean-compile \ - distclean-libtool distclean-tags distclean-generic \ - clean-am - -rm -f libtool - -distclean: distclean-recursive - -rm -f config.status - -maintainer-clean-am: maintainer-clean-hdr \ - maintainer-clean-noinstPROGRAMS \ - maintainer-clean-compile maintainer-clean-libtool \ - maintainer-clean-tags maintainer-clean-generic \ - distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-recursive - -rm -f config.status - -.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ -mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \ -clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile mostlyclean-libtool distclean-libtool \ -clean-libtool maintainer-clean-libtool install-data-recursive \ -uninstall-data-recursive install-exec-recursive \ -uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ -all-recursive check-recursive installcheck-recursive info-recursive \ -dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ -maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ -distclean-tags clean-tags maintainer-clean-tags distdir check-DEJAGNU \ -info-am info dvi-am dvi check check-am installcheck-am installcheck \ -install-info-am install-info all-recursive-am install-exec-local \ -install-exec-am install-exec install-data-am install-data install-am \ -install uninstall-am uninstall all-redirect all-am all installdirs-am \ -installdirs mostlyclean-generic distclean-generic clean-generic \ -maintainer-clean-generic clean mostlyclean distclean maintainer-clean - -po/POTFILES.in: @MAINT@ Makefile - for file in $(POTFILES); do echo $$file; done | sort > tmp \ - && mv tmp $(srcdir)/po/POTFILES.in - -$(srcdir)/make-gas.com: stamp-mk.com -stamp-mk.com: vmsconf.sh Makefile - sh $(srcdir)/vmsconf.sh $(GENERIC_OBJS) > new-make.com - $(SHELL) $(srcdir)/../move-if-change new-make.com $(srcdir)/make-gas.com - touch stamp-mk.com -diststuff: $(DISTSTUFF) info - -$(OBJS): @ALL_OBJ_DEPS@ - -# Stuff that every object file depends upon. If anything is removed -# from this list, remove it from dep-in.sed as well. -$(OBJS): config.h as.h $(TARG_ENV_H) $(OBJ_FORMAT_H) $(TARG_CPU_H) flonum.h \ - expr.h write.h frags.h hash.h read.h symbols.h tc.h \ - obj.h listing.h bignum.h bit_fix.h $(INCDIR)/libiberty.h asintl.h - -check-DEJAGNU: site.exp - if [ -d testsuite ]; then \ - true; \ - else \ - mkdir testsuite; \ - fi - rm -f testsuite/site.exp - cp site.exp testsuite/site.exp - rootme=`pwd`; export rootme; \ - srcdir=`cd ${srcdir}; pwd` ; export srcdir ; \ - EXPECT=${EXPECT} ; export EXPECT ; \ - if [ -f $(top_builddir)/../expect/expect ]; then \ - TCL_LIBRARY=`cd $(top_srcdir)/../tcl/library && pwd`; \ - export TCL_LIBRARY; \ - fi; \ - runtest=$(RUNTEST); \ - cd testsuite; \ - if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ - $$runtest --tool $(DEJATOOL) --srcdir $${srcdir}/testsuite \ - $(RUNTESTFLAGS); \ - else echo "WARNING: could not find \`runtest'" 1>&2; :;\ - fi - -# The implicit .c.o rule doesn't work for these, perhaps because of -# the variables, or perhaps because the sources are not on vpath. -$(TARG_CPU_O): $(TARG_CPU_C) $(TARG_CPU_DEP_@target_cpu_type@) - $(COMPILE) -c $(TARG_CPU_C) -$(ATOF_TARG_O): $(ATOF_TARG_C) - $(COMPILE) -c $(ATOF_TARG_C) - -# ecoff.c only has full dependencies when ECOFF_DEBUGGING is defined, -# so the automatic dependency stuff doesn't work. -ecoff.o : ecoff.c ecoff.h $(INCDIR)/coff/internal.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/ecoff.h $(INCDIR)/coff/symconst.h \ - $(INCDIR)/aout/stab_gnu.h - -# We need all these explicit rules for the multi stuff. Because of -# these rules, we don't need one for OBJ_FORMAT_O. - -obj-aout.o : $(srcdir)/config/obj-aout.c - $(COMPILE) -c $(srcdir)/config/obj-aout.c -obj-bout.o : $(srcdir)/config/obj-bout.c - $(COMPILE) -c $(srcdir)/config/obj-bout.c -obj-coff.o: $(srcdir)/config/obj-coff.c - $(COMPILE) -c $(srcdir)/config/obj-coff.c -obj-ecoff.o : $(srcdir)/config/obj-ecoff.c - $(COMPILE) -c $(srcdir)/config/obj-ecoff.c -obj-elf.o : $(srcdir)/config/obj-elf.c - $(COMPILE) -c $(srcdir)/config/obj-elf.c -obj-evax.o : $(srcdir)/config/obj-evax.c - $(COMPILE) -c $(srcdir)/config/obj-evax.c -obj-hp300.o : $(srcdir)/config/obj-hp300.c - $(COMPILE) -c $(srcdir)/config/obj-hp300.c -obj-ieee.o : $(srcdir)/config/obj-ieee.c - $(COMPILE) -c $(srcdir)/config/obj-ieee.c -obj-multi.o : $(srcdir)/config/obj-multi.c - $(COMPILE) -c $(srcdir)/config/obj-multi.c -obj-som.o : $(srcdir)/config/obj-som.c - $(COMPILE) -c $(srcdir)/config/obj-som.c -obj-vms.o : $(srcdir)/config/obj-vms.c - $(COMPILE) -c $(srcdir)/config/obj-vms.c - -e-mipself.o : $(srcdir)/config/e-mipself.c - $(COMPILE) -c $(srcdir)/config/e-mipself.c -e-mipsecoff.o : $(srcdir)/config/e-mipsecoff.c - $(COMPILE) -c $(srcdir)/config/e-mipsecoff.c -e-i386aout.o: $(srcdir)/config/e-i386aout.c - $(COMPILE) -c $(srcdir)/config/e-i386aout.c -e-i386coff.o: $(srcdir)/config/e-i386coff.c - $(COMPILE) -c $(srcdir)/config/e-i386coff.c -e-i386elf.o: $(srcdir)/config/e-i386elf.c - $(COMPILE) -c $(srcdir)/config/e-i386elf.c - -# If m68k-parse.y is in a different directory, then ylwrap will use an -# absolute path when it invokes yacc, which will cause yacc to put the -# absolute path into the generated file. That's a pain when it comes -# to generating snapshots, because it introduces spurious diffs. -# Since when we make the snapshots $(srcdir) = ".", we check for that -# case and handle it differently. This means that anybody who -# configures with $(srcdir) = "." will have to set their path in the -# debugger if they want to debug m68k-parse.y. This is bad, but on -# the other hand it's good that people who use the prebuilt -# m68k-parse.c don't get a spurious absolute path. -m68k-parse.c: $(srcdir)/config/m68k-parse.y - f=$(srcdir)/config/m68k-parse.y; \ - if [ $$f = "./config/m68k-parse.y" ]; then \ - ln -s config/m68k-parse.y . > /dev/null 2>/dev/null || \ - ln config/m68k-parse.y . > /dev/null 2>/dev/null || \ - cp config/m68k-parse.y . >/dev/null 2>/dev/null; \ - f=m68k-parse.y; \ - else true; fi; \ - $(SHELL) $(YLWRAP) "$(YACC)" $$f y.tab.c m68k-parse.c --; \ - if [ $$f = "m68k-parse.y" ]; then \ - rm -f m68k-parse.y; \ - else true; fi -m68k-parse.o: m68k-parse.c $(srcdir)/config/m68k-parse.h - -# Don't let the .y.h rule clobber m68k-parse.h. -m68k-parse.h: ; @true -$(srcdir)/config/m68k-parse.h: ; @true - -# The instruction table specification lexical analyzer and parser. - -itbl-lex.c: $(srcdir)/itbl-lex.l -itbl-lex.o: itbl-lex.c itbl-parse.h - -itbl-parse.o: itbl-parse.c itbl-parse.h $(srcdir)/itbl-ops.h - -itbl-ops.o: $(srcdir)/itbl-ops.c $(srcdir)/itbl-ops.h itbl-parse.h - -itbl-parse.c itbl-parse.h: $(srcdir)/itbl-parse.y - $(SHELL) $(YLWRAP) "$(YACC)" $(srcdir)/itbl-parse.y y.tab.c itbl-parse.c y.tab.h itbl-parse.h -- -d - -itbl-tops.o: $(srcdir)/itbl-ops.c $(srcdir)/itbl-ops.h itbl-parse.h - $(COMPILE) -o itbl-tops.o -DSTAND_ALONE -c $(srcdir)/itbl-ops.c - -itbl-test.o: $(srcdir)/testsuite/gas/all/itbl-test.c $(srcdir)/itbl-ops.h - $(COMPILE) -c -DSTAND_ALONE $(srcdir)/testsuite/gas/all/itbl-test.c - -cgen.o: cgen.c cgen.h cgen-desc.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/opcode/cgen.h \ - $(srcdir)/../opcodes/$(CGEN_CPU_PREFIX)-desc.h \ - $(srcdir)/../opcodes/$(CGEN_CPU_PREFIX)-opc.h - -.PHONY: install-exec-local install-data-local -.PHONY: install-exec-bindir install-exec-tooldir - -install-exec-local: install-exec-bindir @install_tooldir@ - -install-exec-bindir: $(noinst_PROGRAMS) - $(mkinstalldirs) $(bindir) - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed -e 's/$(EXEEXT)$$//' -e 's/-new//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p|sed -e 's/$(EXEEXT)$$//' -e 's/-new//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - else :; fi; \ - done - -install-exec-tooldir: install-exec-bindir $(noinst_PROGRAMS) - $(mkinstalldirs) $(tooldir)/bin - n=`echo as | sed '$(transform)'`; \ - if [ "$(bindir)/$$n$(EXEEXT)" != "$(tooldir)/bin/as$(EXEEXT)" ]; then \ - rm -f $(tooldir)/bin/as$(EXEEXT); \ - ln $(bindir)/$$n$(EXEEXT) $(tooldir)/bin/as$(EXEEXT) >/dev/null 2>/dev/null \ - || $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) as-new$(EXEEXT) $(tooldir)/bin/as$(EXEEXT); \ - else \ - true ; \ - fi - -# These exist for maintenance purposes. - -.PHONY: bootstrap bootstrap2 bootstrap3 stage1 stage2 stage3 comparison - -bootstrap: as-new - $(MAKE) stage1 - rm -f stage && ln -s stage1 stage - $(MAKE) CC="$(CC)" CFLAGS="-O -Bstage/ $(CFLAGS)" libdir=$(libdir) ALLOCA= $(noinst_PROGRAMS) - $(MAKE) stage2 - rm -f stage && ln -s stage2 stage - $(MAKE) CC="$(CC)" CFLAGS="-O -Bstage/ $(CFLAGS)" libdir=$(libdir) ALLOCA= $(noinst_PROGRAMS) - $(MAKE) comparison against=stage2 - -bootstrap2: - rm -f stage && ln -s stage1 stage - $(MAKE) CC="$(CC)" CFLAGS="-O -Bstage/ $(CFLAGS)" libdir=$(libdir) ALLOCA= $(noinst_PROGRAMS) - $(MAKE) stage2 - rm -f stage && ln -s stage2 stage - $(MAKE) CC="$(CC)" CFLAGS="-O -Bstage/ $(CFLAGS)" libdir=$(libdir) ALLOCA= $(noinst_PROGRAMS) - $(MAKE) comparison against=stage2 - -bootstrap3: - rm -f stage && ln -s stage2 stage - $(MAKE) CC="$(CC)" CFLAGS="-O -Bstage/ $(CFLAGS)" libdir=$(libdir) ALLOCA= $(noinst_PROGRAMS) - $(MAKE) comparison against=stage2 - -# Copy the object files from a particular stage into a subdirectory. -stage1: - -mkdir stage1 - -mv $(STAGESTUFF) stage1 - if [ -f stage1/as-new$(EXEEXT) -a ! -f stage1/as$(EXEEXT) ] ; then (cd stage1 ; ln -s as-new$(EXEEXT) as$(EXEEXT)) ; fi - -stage2: - -mkdir stage2 - -mv $(STAGESTUFF) stage2 - if [ -f stage2/as-new$(EXEEXT) -a ! -f stage2/as$(EXEEXT) ] ; then (cd stage2 ; ln -s as-new$(EXEEXT) as$(EXEEXT)) ; fi - -stage3: - -mkdir stage3 - -mv $(STAGESTUFF) stage3 - if [ -f stage3/as-new$(EXEEXT) -a ! -f stage3/as$(EXEEXT) ] ; then (cd stage3 ; ln -s as-new as$(EXEEXT)) ; fi - -# This rule is derived from corresponding code in the Makefile.in for gcc. -# The "tail +16c" is to bypass headers which may include timestamps or -# temporary assembly file names. -comparison: - x=0 ; \ - for file in *.o ; do \ - tail +16c ./$$file > tmp-foo1; \ - if tail +16c ${against}/$$file > tmp-foo2 2>/dev/null ; then \ - if cmp tmp-foo1 tmp-foo2 ; then \ - true ; \ - else \ - echo $$file differs ; \ - x=1 ; \ - fi ; \ - else true; fi ; \ - done ; \ - exit $$x - -rm -f tmp-foo* - -.PHONY: de-stage1 de-stage2 de-stage3 - -de-stage1: - - (cd stage1 ; rm -f as$(EXEEXT) ; mv -f * ..) - - rmdir stage1 - -de-stage2: - - (cd stage2 ; rm -f as$(EXEEXT) ; mv -f * ..) - - rmdir stage2 - -de-stage3: - - (cd stage3 ; rm -f as$(EXEEXT) ; mv -f * ..) - - rmdir stage3 - -DEP: dep.sed $(DEP_FILE_DEPS) DEPTC DEPOBJ DEP2 - rm -f DEP1 - srcdir=`cd $(srcdir); pwd`; \ - $(MAKE) MKDEP="$(MKDEP)" srcdir="$${srcdir}" VPATH="$${srcdir}" DEP1 - rm -rf DEPDIR - sed -f dep.sed < DEP1 > DEPA - sed -f dep.sed < DEPTC >> DEPA - sed -f dep.sed < DEPOBJ >> DEPA - sed -f dep.sed < DEP2 >> DEPA - echo '$$(OBJS): $$(DEP_@target''_cpu_type@_@obj''_format@)' >> DEPA - echo '$$(TARG_CPU_O): $$(DEPTC_@target''_cpu_type@_@obj''_format@)' >> DEPA - echo '$$(OBJ_FORMAT_O): $$(DEPOBJ_@target''_cpu_type@_@obj''_format@)' >> DEPA - echo '# IF YOU PUT ANYTHING HERE IT WILL GO AWAY' >> DEPA - mv -f DEPA $@ - -DEP1: $(CFILES) $(MULTI_CFILES) - if [ -d DEPDIR ]; then true; else mkdir DEPDIR; fi - srcdir=`cd $(srcdir); pwd`; \ - cd DEPDIR; \ - echo '' > targ-cpu.h; \ - echo '' > obj-format.h; \ - echo '' > targ-env.h; \ - echo '' > itbl-cpu.h; \ - echo '' > itbl-parse.h; \ - echo '# DO NOT DELETE THIS LINE -- mkdep uses it.' > DEP; \ - echo '# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.' >> DEP; \ - $(MKDEP) -DBFD_ASSEMBLER -I. -I.. -I$${srcdir} -I../../bfd $(DEP_INCLUDES) $? >> DEP - mv -f DEPDIR/DEP $@ - -# Work out the special dependencies for the tc-*.c files. -DEPTC: $(TARGET_CPU_CFILES) - rm -f DEPTCA - if [ -d DEPDIR ]; then true; else mkdir DEPDIR; fi - srcdir=`cd $(srcdir); pwd`; \ - cd DEPDIR; \ - for c in $(CPU_TYPES); do \ - for o in $(OBJ_FORMATS); do \ - $(CPU_OBJ_VALID) \ - if [ x$${valid} = xyes ]; then \ - echo '#include "tc-'"$${c}"'.h"' > targ-cpu.h; \ - echo '#include "obj-'"$${o}"'.h"' > obj-format.h; \ - echo '#include "te-generic.h"' > targ-env.h; \ - echo '' > itbl-cpu.h; \ - echo '' > itbl-parse.h; \ - echo '#include "opcodes/'"$${c}"'-desc.h"' > cgen-desc.h; \ - rm -f dummy.c; \ - cp $${srcdir}/config/tc-$${c}.c dummy.c; \ - $(MKDEP) -DBFD_ASSEMBLER -I. -I.. -I$${srcdir} -I../../bfd $(DEP_INCLUDES) dummy.c | \ - sed -e "s/dummy.o: dummy.c/DEPTC_$${c}_$${o} =/" >> ../DEPTCA; \ - rm -f dummy.c; \ - else true; fi; \ - done; \ - done - echo 'DEPTC_hppa_som = $$(srcdir)/config/tc-hppa.h subsegs.h \' >> DEPTCA - echo ' $$(INCDIR)/obstack.h $$(BFDDIR)/libhppa.h \' >> DEPTCA - echo ' $$(INCDIR)/opcode/hppa.h $$(BFDDIR)/som.h' >> DEPTCA -# We don't try to handle all multi cases. - for c in $(CPU_TYPES); do \ - $(CPU_MULTI_VALID) \ - if [ x$${valid} = xyes ]; then \ - o=ecoff; \ - $(CPU_OBJ_VALID) \ - echo 'DEPTC_'"$${c}"'_multi = \' >> DEPTCA; \ - echo '$$(DEPTC_'"$${c}"'_coff) \' >> DEPTCA; \ - if [ x$${valid} = xyes ]; then \ - echo '$$(DEPTC_'"$${c}"'_ecoff) \' >> DEPTCA; \ - else true; fi; \ - echo '$$(DEPTC_'"$${c}"'_elf)' >> DEPTCA; \ - else true; fi; \ - done - mv -f DEPTCA DEPTC - -# Work out the special dependencies for the obj-*.c files. -DEPOBJ: $(OBJ_FORMAT_CFILES) - rm -f DEPOBJA - if [ -d DEPDIR ]; then true; else mkdir DEPDIR; fi - srcdir=`cd $(srcdir); pwd`; \ - cd DEPDIR; \ - for c in $(CPU_TYPES); do \ - for o in $(OBJ_FORMATS); do \ - $(CPU_OBJ_VALID) \ - if [ x$${valid} = xyes ]; then \ - echo '#include "tc-'"$${c}"'.h"' > targ-cpu.h; \ - echo '#include "obj-'"$${o}"'.h"' > obj-format.h; \ - echo '#include "te-generic.h"' > targ-env.h; \ - echo '' > itbl-cpu.h; \ - echo '' > itbl-parse.h; \ - rm -f dummy.c; \ - cp $${srcdir}/config/obj-$${o}.c dummy.c; \ - $(MKDEP) -DBFD_ASSEMBLER -I. -I.. -I$${srcdir} -I../../bfd $(DEP_INCLUDES) dummy.c | \ - sed -e "s/dummy.o: dummy.c/DEPOBJ_$${c}_$${o} =/" >> ../DEPOBJA; \ - rm -f dummy.c; \ - else true; fi; \ - done; \ - done - echo 'DEPOBJ_hppa_som = $$(srcdir)/config/obj-som.h subsegs.h \' >> DEPOBJA - echo ' $$(INCDIR)/obstack.h $$(BFDDIR)/libhppa.h \' >> DEPOBJA - echo ' $$(BFDDIR)/som.h $$(INCDIR)/aout/stab_gnu.h \' >> DEPOBJA - echo ' $$(INCDIR)/aout/stab.def' >> DEPOBJA -# We don't try to handle all multi cases. - for c in $(CPU_TYPES); do \ - $(CPU_MULTI_VALID) \ - if [ x$${valid} = xyes ]; then \ - o=ecoff; \ - $(CPU_OBJ_VALID) \ - echo 'DEPOBJ_'"$${c}"'_multi = \' >> DEPOBJA; \ - echo '$$(DEPOBJ_'"$${c}"'_coff) \' >> DEPOBJA; \ - if [ x$${valid} = xyes ]; then \ - echo '$$(DEPOBJ_'"$${c}"'_ecoff) \' >> DEPOBJA; \ - else true; fi; \ - echo '$$(DEPOBJ_'"$${c}"'_elf)' >> DEPOBJA; \ - else true; fi; \ - done - mv -f DEPOBJA DEPOBJ - -# Work out the dependencies for each CPU/OBJ combination. -# Note that SOM is a special case, because it only works native. -DEP2: $(TARGET_CPU_HFILES) $(OBJ_FORMAT_HFILES) - rm -f DEP2a - if [ -d DEPDIR ]; then true; else mkdir DEPDIR; fi - srcdir=`cd $(srcdir); pwd`; \ - cd DEPDIR; \ - for c in $(CPU_TYPES); do \ - for o in $(OBJ_FORMATS); do \ - $(CPU_OBJ_VALID) \ - if [ x$${valid} = xyes ]; then \ - echo '#include "tc-'"$${c}"'.h"' > targ-cpu.h; \ - echo '#include "obj-'"$${o}"'.h"' > dummy.c; \ - $(MKDEP) -DBFD_ASSEMBLER -I. -I.. -I$${srcdir} -I../../bfd $(DEP_INCLUDES) dummy.c | \ - sed -e "s/dummy.o: dummy.c/DEP_$${c}_$${o} =/" >> ../DEP2a; \ - else true; fi; \ - done; \ - done - echo 'DEP_hppa_som = $$(BFDDIR)/som.h' >> DEP2a -# We don't try to handle all multi cases. - for c in $(CPU_TYPES); do \ - $(CPU_MULTI_VALID) \ - if [ x$${valid} = xyes ]; then \ - o=ecoff; \ - $(CPU_OBJ_VALID) \ - echo 'DEP_'"$${c}"'_multi = \' >> DEP2a; \ - echo '$$(DEP_'"$${c}"'_coff) \' >> DEP2a; \ - if [ x$${valid} = xyes ]; then \ - echo '$$(DEP_'"$${c}"'_ecoff) \' >> DEP2a; \ - else true; fi; \ - echo '$$(DEP_'"$${c}"'_elf)' >> DEP2a; \ - else true; fi; \ - done - mv -f DEP2a DEP2 - -dep.sed: dep-in.sed config.status - srcdir=`cd $(srcdir); pwd`; \ - sed <$(srcdir)/dep-in.sed >dep.sed \ - -e "s!@INCDIR@!$${srcdir}/../include!" \ - -e "s!@BFDDIR@!$${srcdir}/../bfd!" \ - -e "s!@SRCDIR@!$${srcdir}!" - -dep: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < Makefile > tmp-Makefile - cat DEP >> tmp-Makefile - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile Makefile - -dep-in: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < $(srcdir)/Makefile.in > tmp-Makefile.in - cat DEP >> tmp-Makefile.in - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile.in $(srcdir)/Makefile.in - -dep-am: DEP - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < $(srcdir)/Makefile.am > tmp-Makefile.am - cat DEP >> tmp-Makefile.am - $(SHELL) $(srcdir)/../move-if-change tmp-Makefile.am $(srcdir)/Makefile.am - -.PHONY: dep dep-in dep-am - -# DO NOT DELETE THIS LINE -- mkdep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. -app.o: app.c $(INCDIR)/bin-bugs.h emul.h -as.o: as.c $(INCDIR)/bin-bugs.h emul.h subsegs.h $(INCDIR)/obstack.h \ - output-file.h sb.h macro.h -atof-generic.o: atof-generic.c $(INCDIR)/bin-bugs.h \ - emul.h -bignum-copy.o: bignum-copy.c $(INCDIR)/bin-bugs.h emul.h -cond.o: cond.c $(INCDIR)/bin-bugs.h emul.h macro.h \ - sb.h $(INCDIR)/obstack.h -depend.o: depend.c $(INCDIR)/bin-bugs.h emul.h -dwarf2dbg.o: dwarf2dbg.c $(INCDIR)/bin-bugs.h emul.h \ - dwarf2dbg.h subsegs.h $(INCDIR)/obstack.h $(INCDIR)/elf/dwarf2.h -ecoff.o: ecoff.c $(INCDIR)/bin-bugs.h emul.h ecoff.h -ehopt.o: ehopt.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h $(INCDIR)/elf/dwarf2.h -expr.o: expr.c $(INCDIR)/bin-bugs.h emul.h $(INCDIR)/obstack.h -flonum-copy.o: flonum-copy.c $(INCDIR)/bin-bugs.h emul.h -flonum-konst.o: flonum-konst.c -flonum-mult.o: flonum-mult.c -frags.o: frags.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h -hash.o: hash.c $(INCDIR)/bin-bugs.h emul.h $(INCDIR)/obstack.h -input-file.o: input-file.c $(INCDIR)/bin-bugs.h emul.h \ - input-file.h -input-scrub.o: input-scrub.c $(INCDIR)/bin-bugs.h emul.h \ - input-file.h sb.h -listing.o: listing.c $(INCDIR)/bin-bugs.h emul.h input-file.h \ - subsegs.h -literal.o: literal.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h -macro.o: macro.c sb.h macro.h -messages.o: messages.c $(INCDIR)/bin-bugs.h emul.h -output-file.o: output-file.c $(INCDIR)/bin-bugs.h emul.h \ - output-file.h -read.o: read.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h sb.h macro.h ecoff.h -sb.o: sb.c sb.h -stabs.o: stabs.c $(INCDIR)/bin-bugs.h emul.h $(INCDIR)/obstack.h \ - subsegs.h ecoff.h $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def -subsegs.o: subsegs.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h -symbols.o: symbols.c $(INCDIR)/bin-bugs.h emul.h $(INCDIR)/obstack.h \ - subsegs.h struc-symbol.h -write.o: write.c $(INCDIR)/bin-bugs.h emul.h subsegs.h \ - $(INCDIR)/obstack.h output-file.h -gasp.o: gasp.c $(INCDIR)/bin-bugs.h sb.h macro.h -itbl-ops.o: itbl-ops.c itbl-ops.h $(INCDIR)/bin-bugs.h \ - emul.h itbl-parse.h -e-i386aout.o: $(srcdir)/config/e-i386aout.c $(INCDIR)/bin-bugs.h \ - emul.h emul-target.h -e-i386coff.o: $(srcdir)/config/e-i386coff.c $(INCDIR)/bin-bugs.h \ - emul.h emul-target.h -e-i386elf.o: $(srcdir)/config/e-i386elf.c $(INCDIR)/bin-bugs.h \ - emul.h emul-target.h -e-mipsecoff.o: $(srcdir)/config/e-mipsecoff.c $(INCDIR)/bin-bugs.h \ - emul.h emul-target.h -e-mipself.o: $(srcdir)/config/e-mipself.c $(INCDIR)/bin-bugs.h \ - emul.h emul-target.h -$(OBJS): $(DEP_@target_cpu_type@_@obj_format@) -$(TARG_CPU_O): $(DEPTC_@target_cpu_type@_@obj_format@) -$(OBJ_FORMAT_O): $(DEPOBJ_@target_cpu_type@_@obj_format@) -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/gas/NEWS b/gas/NEWS deleted file mode 100644 index 03f554c8fbb..00000000000 --- a/gas/NEWS +++ /dev/null @@ -1,307 +0,0 @@ --*- text -*- - -Changes in 2.10: - -Support for ATMEL AVR. - -Support for IBM 370 ELF. Somewhat experimental. - -Support for numbers with suffixes. - -Added support for breaking to the end of repeat loops. - -Added support for parallel instruction syntax (DOUBLEBAR_PARALLEL). - -New .elseif pseudo-op added. - -New --fatal-warnings option. - -picoJava architecture support added. - -Motorola MCore 210 processor support added. - -A new pseudo-op .intel_syntax has been implemented to allow gas to parse i386 -assembly programs with intel syntax. - -New pseudo-ops .func,.endfunc to aid in debugging user-written assembler code. - -Added -gdwarf2 option to generate DWARF 2 debugging information. - -Full 16-bit mode support for i386. - -Greatly improved instruction operand checking for i386. This change will -produce errors or warnings on incorrect assembly code that previous versions of -gas accepted. If you get unexpected messages from code that worked with older -versions of gas, please double check the code before reporting a bug. - -Weak symbol support added for COFF targets. - -Mitsubishi D30V support added. - -Texas Instruments c80 (tms320c80) support added. - -i960 ELF support added. - -Changes in 2.9: - -Texas Instruments c30 (tms320c30) support added. - -The assembler now optimizes the exception frame information generated by egcs -and gcc 2.8. The new --traditional-format option disables this optimization. - -Added --gstabs option to generate stabs debugging information. - -The -a option takes a new suboption, m (e.g., -alm) to expand macros in a -listing. - -Added -MD option to print dependencies. - -Changes in 2.8: - -BeOS support added. - -MIPS16 support added. - -Motorola ColdFire 5200 support added (configure for m68k and use -m5200). - -Alpha/VMS support added. - -m68k options --base-size-default-16, --base-size-default-32, ---disp-size-default-16, and --disp-size-default-32 added. - -The alignment directives now take an optional third argument, which is the -maximum number of bytes to skip. If doing the alignment would require skipping -more than the given number of bytes, the alignment is not done at all. - -The ELF assembler has a new pseudo-op, .symver, used for symbol versioning. - -The -a option takes a new suboption, c (e.g., -alc), to skip false conditionals -in listings. - -Added new pseudo-op, .equiv; it's like .equ, except that it is an error if the -symbol is already defined. - -Changes in 2.7: - -The PowerPC assembler now allows the use of symbolic register names (r0, etc.) -if -mregnames is used. Symbolic names preceded by a '%' (%r0, etc.) can be -used any time. PowerPC 860 move to/from SPR instructions have been added. - -Alpha Linux (ELF) support added. - -PowerPC ELF support added. - -m68k Linux (ELF) support added. - -i960 Hx/Jx support added. - -i386/PowerPC gnu-win32 support added. - -SCO ELF support added. For OpenServer 5 targets (i386-unknown-sco3.2v5) the -default is to build COFF-only support. To get a set of tools that generate ELF -(they'll understand both COFF and ELF), you must configure with -target=i386-unknown-sco3.2v5elf. - -m88k-motorola-sysv3* support added. - -Changes in 2.6: - -Gas now directly supports macros, without requiring GASP. - -Gas now has an MRI assembler compatibility mode. Use -M or --mri to select MRI -mode. The pseudo-op ``.mri 1'' will switch into the MRI mode until the ``.mri -0'' is seen; this can be convenient for inline assembler code. - -Added --defsym SYM=VALUE option. - -Added -mips4 support to MIPS assembler. - -Added PIC support to Solaris and SPARC SunOS 4 assembler. - -Changes in 2.4: - -Converted this directory to use an autoconf-generated configure script. - -ARM support, from Richard Earnshaw. - -Updated VMS support, from Pat Rankin, including considerably improved debugging -support. - -Support for the control registers in the 68060. - -Handles (ignores) a new directive ".this_GCC_requires_the_GNU_assembler", to -provide for possible future gcc changes, for targets where gas provides some -features not available in the native assembler. If the native assembler is -used, it should become obvious pretty quickly what the problem is. - -Usage message is available with "--help". - -The GNU Assembler Preprocessor (gasp) is included. (Actually, it was in 2.3 -also, but didn't get into the NEWS file.) - -Weak symbol support for a.out. - -A bug in the listing code which could cause an infinite loop has been fixed. -Bugs in listings when generating a COFF object file have also been fixed. - -Initial i386-svr4 PIC implementation from Eric Youngdale, based on code by Paul -Kranenburg. - -Improved Alpha support. Immediate constants can have a much larger range now. -Support for the 21164 has been contributed by Digital. - -Updated ns32k (pc532-mach, netbsd532) support from Ian Dall. - -Changes in 2.3: - -Mach i386 support, by David Mackenzie and Ken Raeburn. - -RS/6000 and PowerPC support by Ian Taylor. - -VMS command scripts (make-gas.com, config-gas.com) have been worked on a bit, -based on mail received from various people. The `-h#' option should work again -too. - -HP-PA work, by Jeff Law. Note, for the PA, gas-2.3 has been designed to work -with gdb-4.12 and gcc-2.6. As gcc-2.6 has not been released yet, a special -version of gcc-2.5.8 has been patched to work with gas-2.3. You can retrieve -this special version of gcc-2.5.8 via anonymous ftp from jaguar.cs.utah.edu -in the "dist" directory. - -Vax support in gas fixed for BSD, so it builds and seems to run a couple simple -tests okay. I haven't put it through extensive testing. (GNU make is -currently required for BSD 4.3 builds.) - -Support for the DEC Alpha, running OSF/1 (ECOFF format). The gas support is -based on code donated by CMU, which used an a.out-based format. I'm afraid the -alpha-a.out support is pretty badly mangled, and much of it removed; making it -work will require rewriting it as BFD support for the format anyways. - -Irix 5 support. - -The test suites have been fixed up a bit, so that they should work with a -couple different versions of expect and dejagnu. - -Symbols' values are now handled internally as expressions, permitting more -flexibility in evaluating them in some cases. Some details of relocation -handling have also changed, and simple constant pool management has been added, -to make the Alpha port easier. - -New option "--statistics" for printing out program run times. This is intended -to be used with the gcc "-Q" option, which prints out times spent in various -phases of compilation. (You should be able to get all of them printed out with -"gcc -Q -Wa,--statistics", I think.) - ----------------------------------------------------------------- - -Changes in 2.2: - -RS/6000 AIX and MIPS SGI Irix 5 support has been added. - -Configurations that are still in development (and therefore are convenient to -have listed in configure.in) still get rejected without a minor change to -gas/Makefile.in, so people not doing development work shouldn't get the -impression that support for such configurations is actually believed to be -reliable. - -The program name (usually "as") is printed when a fatal error message is -displayed. This should prevent some confusion about the source of occasional -messages about "internal errors". - -ELF support is falling into place. Support for the 386 should be working. -Support for SPARC Solaris is in. HPPA support from Utah is being integrated. - -Symbol values are maintained as expressions instead of being immediately boiled -down to add-symbol, sub-symbol, and constant. This permits slightly more -complex calculations involving symbols whose values are not alreadey known. - -DBX-style debugging info ("stabs") is now supported for COFF formats. -If any stabs directives are seen in the source, GAS will create two new -sections: a ".stab" and a ".stabstr" section. The format of the .stab -section is nearly identical to the a.out symbol format, and .stabstr is -its string table. For this to be useful, you must have configured GCC -to generate stabs (by defining DBX_DEBUGGING_INFO), and must have a GDB -that can use the stab sections (4.11 or later). - -LynxOS, on i386 and m68k platforms, is now supported. SPARC LynxOS -support is in progress. - ----------------------------------------------------------------- - -Changes in 2.1: - -Several small fixes for i386-aix (PS/2) support from Minh Tran-Le have been -incorporated, but not well tested yet. - -Altered the opcode table split for m68k; it should require less VM to compile -with gcc now. - -Some minor adjustments to add (Convergent Technologies') Miniframe support, -suggested by Ronald Cole. - -HPPA support (running OSF only, not HPUX) has been contributed by Utah. This -includes improved ELF support, which I've started adapting for SPARC Solaris -2.x. Integration isn't completely, so it probably won't work. - -HP9000/300 support, donated by HP, has been merged in. - -Ian Taylor has finished the MIPS ECOFF (Ultrix, Irix) support. - -Better error messages for unsupported configurations (e.g., hppa-hpux). - -Test suite framework is starting to become reasonable. - ----------------------------------------------------------------- - -Changes in 2.0: - -Mostly bug fixes. - -Some more merging of BFD and ELF code, but ELF still doesn't work. - ----------------------------------------------------------------- - -Changes in 1.94: - -BFD merge is partly done. Adventurous souls may try giving configure the -"--with-bfd-assembler" option. Currently, ELF format requires it, a.out format -accepts it; SPARC CPU accepts it. It's the default only for OS "elf" or -"solaris". (ELF isn't really supported yet. It needs work. I've got some -code from Utah for HP-PA ELF, and from DG for m88k ELF, but they're not fully -merged yet.) - -The 68K opcode table has been split in half. It should now compile under gcc -without consuming ridiculous amounts of memory. - -A couple data structures have been reduced in size. This should result in -saving a little bit of space at runtime. - -Support for MIPS, from OSF and Ralph Campbell, has been merged in. The OSF -code provided ROSE format support, which I haven't merged in yet. (I can make -it available, if anyone wants to try it out.) Ralph's code, for BSD 4.4, -supports a.out format. We don't have ECOFF support in just yet; it's coming. - -Support for the Hitachi H8/500 has been added. - -VMS host and target support should be working now, thanks chiefly to Eric -Youngdale. - ----------------------------------------------------------------- - -Changes in 1.93.01: - -For m68k, support for more processors has been added: 68040, CPU32, 68851. - -For i386, .align is now power-of-two; was number-of-bytes. - -For m68k, "%" is now accepted before register names. For COFF format, which -doesn't use underscore prefixes for C labels, it is required, so variable "a0" -can be distinguished from the register. - -Last public release was 1.38. Lots of configuration changes since then, lots -of new CPUs and formats, lots of bugs fixed. - - -Local variables: -fill-column: 79 -End: diff --git a/gas/README b/gas/README deleted file mode 100644 index 4ac27db82fe..00000000000 --- a/gas/README +++ /dev/null @@ -1,274 +0,0 @@ - README for GAS - -A number of things have changed since version 1 and the wonderful world of gas -looks very different. There's still a lot of irrelevant garbage lying around -that will be cleaned up in time. Documentation is scarce, as are logs of the -changes made since the last gas release. My apologies, and I'll try to get -something useful. - -Unpacking and Installation - Summary -==================================== - -See ../binutils/README. - -To build just the assembler, make the target all-gas. - -Documentation -============= - -The GAS release includes texinfo source for its manual, which can be processed -into `info' or `dvi' forms. - -The DVI form is suitable for printing or displaying; the commands for doing -this vary from system to system. On many systems, `lpr -d' will print a DVI -file. On others, you may need to run a program such as `dvips' to convert the -DVI file into a form your system can print. - -If you wish to build the DVI file, you will need to have TeX installed on your -system. You can rebuild it by typing: - - cd gas/doc - make as.dvi - -The Info form is viewable with the GNU Emacs `info' subsystem, or the -standalone `info' program, available as part of the GNU Texinfo distribution. -To build the info files, you will need the `makeinfo' program. Type: - - cd gas/doc - make info - -Specifying names for hosts and targets -====================================== - - The specifications used for hosts and targets in the `configure' -script are based on a three-part naming scheme, but some short -predefined aliases are also supported. The full naming scheme encodes -three pieces of information in the following pattern: - - ARCHITECTURE-VENDOR-OS - - For example, you can use the alias `sun4' as a HOST argument or in a -`--target=TARGET' option. The equivalent full name is -`sparc-sun-sunos4'. - - The `configure' script accompanying GAS does not provide any query -facility to list all supported host and target names or aliases. -`configure' calls the Bourne shell script `config.sub' to map -abbreviations to full names; you can read the script, if you wish, or -you can use it to test your guesses on abbreviations--for example: - - % sh config.sub sun4 - sparc-sun-sunos411 - % sh config.sub sun3 - m68k-sun-sunos411 - % sh config.sub decstation - mips-dec-ultrix42 - % sh config.sub hp300bsd - m68k-hp-bsd - % sh config.sub i386v - i386-unknown-sysv - % sh config.sub i786v - Invalid configuration `i786v': machine `i786v' not recognized - - -`configure' options -=================== - - Here is a summary of the `configure' options and arguments that are -most often useful for building GAS. `configure' also has several other -options not listed here. - - configure [--help] - [--prefix=DIR] - [--srcdir=PATH] - [--host=HOST] - [--target=TARGET] - [--with-OPTION] - [--enable-OPTION] - -You may introduce options with a single `-' rather than `--' if you -prefer; but you may abbreviate option names if you use `--'. - -`--help' - Print a summary of the options to `configure', and exit. - -`-prefix=DIR' - Configure the source to install programs and files under directory - `DIR'. - -`--srcdir=PATH' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--host=HOST' - Configure GAS to run on the specified HOST. Normally the - configure script can figure this out automatically. - - There is no convenient way to generate a list of all available - hosts. - -`--target=TARGET' - Configure GAS for cross-assembling programs for the specified - TARGET. Without this option, GAS is configured to assemble .o files - that run on the same machine (HOST) as GAS itself. - - There is no convenient way to generate a list of all available - targets. - -`--enable-OPTION' - These flags tell the program or library being configured to - configure itself differently from the default for the specified - host/target combination. See below for a list of `--enable' - options recognized in the gas distribution. - -`configure' accepts other options, for compatibility with configuring -other GNU tools recursively; but these are the only options that affect -GAS or its supporting libraries. - -The `--enable' options recognized by software in the gas distribution are: - -`--enable-targets=...' - This causes one or more specified configurations to be added to those for - which BFD support is compiled. Currently gas cannot use any format other - than its compiled-in default, so this option is not very useful. - -`--enable-bfd-assembler' - This causes the assembler to use the new code being merged into it to use - BFD data structures internally, and use BFD for writing object files. - For most targets, this isn't supported yet. For most targets where it has - been done, it's already the default. So generally you won't need to use - this option. - -Supported platforms -=================== - -At this point I believe gas to be ansi only code for most target cpu's. That -is, there should be relatively few, if any host system dependencies. So -porting (as a cross-assembler) to hosts not yet supported should be fairly -easy. Porting to a new target shouldn't be too tough if it's a variant of one -already supported. - -Native assembling should work on: - - sun3 - sun4 - 386bsd - bsd/386 - delta (m68k-sysv from Motorola) - delta88 (m88k-sysv from Motorola) - GNU/linux - m68k hpux 8.0 (hpux 7.0 may be a problem) - vax bsd, ultrix, vms - hp9000s300 - decstation - irix 4 - irix 5 - miniframe (m68k-sysv from Convergent Technologies) - i386-aix (ps/2) - hppa (hpux 4.3bsd, osf1) - AIX - unixware - sco 3.2v4.2 - sco openserver 5.0 (a.k.a. 3.2v5.0 ) - sparc solaris - ns32k (netbsd, lites) - -I believe that gas as a cross-assembler can currently be targetted for -most of the above hosts, plus - - decstation-bsd (a.out format, to be used in BSD 4.4) - ebmon29k - go32 (DOS on i386, with DJGPP -- old a.out version) - h8/300, h8/500 (Hitachi) - i386-aix (ps/2) - i960-coff - mips ecoff (decstation-ultrix, iris, mips magnum, mips-idt-ecoff) - Mitsubishi d10v and d30v - nindy960 - powerpc EABI - SH (Hitachi) - sco386 - TI tic30 and tic80 - vax bsd or ultrix? - vms - vxworks68k - vxworks960 - z8000 (Zilog) - -MIPS ECOFF support has been added, but GAS will not run a C-style -preprocessor. If you want that, rename your file to have a ".S" suffix, and -run gcc on it. Or run "gcc -xassembler-with-cpp foo.s". - -Support for ELF should work now for sparc, hppa, i386, alpha, m68k, -MIPS, powerpc. - -Support for sequent (ns32k), tahoe, i860, m88k may be suffering from bitrot. - -If you try out gas on some host or target not listed above, please let me know -the results, so I can update the list. - -Compiler Support Hacks -====================== - -On a few targets, the assembler has been modified to support a feature -that is potentially useful when assembling compiler output, but which -may confuse assembly language programmers. If assembler encounters a -.word pseudo-op of the form symbol1-symbol2 (the difference of two -symbols), and the difference of those two symbols will not fit in 16 -bits, the assembler will create a branch around a long jump to -symbol1, and insert this into the output directly before the next -label: The .word will (instead of containing garbage, or giving an -error message) contain (the address of the long jump)-symbol2. This -allows the assembler to assemble jump tables that jump to locations -very far away into code that works properly. If the next label is -more than 32K away from the .word, you lose (silently); RMS claims -this will never happen. If the -K option is given, you will get a -warning message when this happens. - - -REPORTING BUGS IN GAS -===================== - -Bugs in gas should be reported to bug-gnu-utils@gnu.org. They may be -cross-posted to bug-gcc if they affect the use of gas with gcc. They -should not be reported just to bug-gcc, since I don't read that list, -and therefore wouldn't see them. - -If you report a bug in GAS, please remember to include: - -A description of exactly what went wrong, and exactly what should have -happened instead. - -The type of machine (VAX, 68020, etc) and operating system (BSD, SunOS, DYNIX, -VMS, etc) GAS was running on. - -The configuration name(s) given to the "configure" script. The -"config.status" file should have this information. - -The options given to GAS at run time. - -The actual input file that caused the problem. - -It is silly to report a bug in GAS without including an input file for GAS. -Don't ask us to generate the file just because you made it from files you -think we have access to. - -1. You might be mistaken. -2. It might take us a lot of time to install things to regenerate that file. -3. We might get a different file from the one you got, and might not see any - bug. - -To save us these delays and uncertainties, always send the input file for the -program that failed. A smaller test case that demonstrates the problem is of -course preferable, but be sure it is a complete input file, and that it really -does demonstrate the problem; but if paring it down would cause large delays -in filing the bug report, don't bother. - -If the input file is very large, and you are on the internet, you may want to -make it avaliable for anonymous FTP instead of mailing it. If you do, include -instructions for FTP'ing it in your bug report. - -If you expect to be contributing a large number of test cases, it would be -helpful if you would look at the test suite included in the release (based on -the Deja Gnu testing framework, available from the usual ftp sites) and write -test cases to fit into that framework. This is certainly not required. diff --git a/gas/README-vms b/gas/README-vms deleted file mode 100644 index 796c603b4f3..00000000000 --- a/gas/README-vms +++ /dev/null @@ -1,248 +0,0 @@ - This document explains a couple of things that are specific to VMS. -There are currently two "chapters", the first deals with cross-assembly -issues, and the second deals with the VMS debugger and GNU-CC. - - -*********************************************************************** -****************** Notes for Cross Assembly with VMS ****************** -*********************************************************************** - - If you wish to build gas on a non-VMS system to cross-assemble, -you should use: - -configure ${hosttype} -target=vms - -and then follow the usual procedure. The object files generated on -Unix will be correct from a binary point of view, but the real trick is -getting them to the VMS machine. The format of the object file is -a variable-length record, but each record contains binary data. gas -writes the records in the same format that VMS would expect, -namely a two-byte count followed by that number of bytes. - - If you try to copy the file to a VMS system using ftp, the ftp -protocol will screw up the file by looking for nulls (record terminator for -unix) and it will insert it's own record terminators at that point. This -will obviously corrupt the file. - - If you try to transfer the file with ftp in binary mode, the -file itself will not be corrupt, but VMS will think that the file contains -fixed-length records of 512 bytes. You can use the public-domain FILE -utility to change this with a command like: - -$FILE foo.o/type=variable - -If you do not have this utility available, the following program can be -used to perform this task: - - #include - - #define RME$C_SETRFM 1 - - struct FAB * fab; - - main(int argc, char * argv[]){ - int i, status; - fab = (struct FAB*) malloc(sizeof(struct FAB)); - *fab = cc$rms_fab; /* initialize FAB*/ - fab->fab$b_fac = FAB$M_PUT; - fab->fab$l_fop |= FAB$M_ESC; - fab->fab$l_ctx = RME$C_SETRFM; - fab->fab$w_ifi = 0; - for(i=1;ifab$l_fna = argv[i]; - fab->fab$b_fns = strlen(argv[i]); - status = sys$open(fab,0,0); - if((status & 7) != 1) lib$signal(status); - fab->fab$b_rfm = FAB$C_VAR; - status = sys$modify(fab,0,0); - if((status & 7) != 1) lib$signal(status); - status = sys$close(fab,0,0); - if((status & 7) != 1) lib$signal(status); - }; - } - - If you have NFS running on the VMS system, what you need to do -depends upon which NFS software you are running on the VMS system. There -are a number of different TCP/IP packages for VMS available, and only very -limited testing has been performed. In the tests that has been done so -far, the contents of the file will always be correct when transferring the -file via NFS, but the record attributes may or may not be correct. - - One proprietary TCP/IP/NFS package for VMS is known to -automatically fix the record attributes of the object file if you NFS mount -a unix disk from the VMS system, and if the file has a ".obj" extension on -the unix system. Other TCP/IP packages might do this for you as well, but -they have not been checked. - -No matter what method you use to get the file to the VMS system, it is -always a good idea to check to make sure that it is the correct type by -doing a "$dir/full" on the object file. The desired record attributes will -be "None". Undesirable record attributes will be "Stream-LF" or anything -else. - -Once you get the files on the VMS system, you can check their integrity -with the "$anal/obj" command. (Naturally at some point you should rename -the .o files to .obj). As far as the debugger is concerned, the records -will be correct, but the debugger will not be able to find the source files, -since it only has the file name, and not the full directory specification. -You must give the debugger some help by telling it which directories to -search for the individual files - once you have done this you should be -able to proceed normally. - - It is a good idea to use names for your files which will be valid -under VMS, since otherwise you will have no way of getting the debugger to -find the source file when deugging. - -The reason for this is that the object file normally contins specific -information that the debugger can use to positively identify a file, and if -you are assembling on a unix system this information simply does not exist -in a meaningful way. You must help the debugger by using the "SET FILE=" -command to tell the debugger where to look for source files. The debugger -records will be correct, except that the debugger will not be initially -able to find the source files. You can use the "SET FILE" command to tell -the debugger where to look for the source files. - -I have only tested this with a SVr4 i486 machine, and everything seems to -work OK, with the limited testing that I have done. Other machines may -or may not work. You should read the chapters on cross-compilers in the gcc -manual before fooling with this. Since gas does not need to do any floating -point arithmetic, the floating point constants that are generated here should -be correct - the only concern is with constant folding in the main compiler. -The range and precision of floats and doubles are similar on the 486 (with -a builtin 80387) and the VAX, although there is a factor of 2 to 4 -difference in the range. The double, as implemented on the 486, is quite -similar to the G_FLOAT on the VAX. - -*********************************************************************** -****************** Notes for using GNU CC with the VMS debugger******** -*********************************************************************** - - - 1) You should be aware that GNU-C, as with any other decent compiler, -will do things when optimization is turned on that you may not expect. -Sometimes intermediate results are not written to variables, if they are only -used in one place, and sometimes variables that are not used at all will not be -written to the symbol table. Also, parameters to inline functions are often -inaccessible. You can see the assembly code equivalent by using KP7 in the -debugger, and from this you can tell if in fact a variable should have the -value that you expect. You can find out if a variable lives withing a register -by doing a 'show symbol/addr'. - - 2) Overly complex data types, such as: - -int (*(*(*(*(*(* sarr6)[1])[1])[2])[3])[4])[5]; - -will not be debugged properly, since the debugging record overflows an internal -debugger buffer. gcc-as will convert these to *void as far as the debugger -symbol table is concerned, which will avoid any problems, and the assembler -will give you a message informing you that this has happened. - - 3) You must, of course, compile and link with /debug. If you link -without debug, you still get traceback table in the executable, but there is no -symbol table for variables. - - 4) Included in the patches to VMS.C are fixes to two bugs that are -unrelated to the changes that I have made. One of these made it impossible to -debug small programs sometimes, and the other caused the debugger to become -confused about which routine it was in, and give this incorrect info in -tracebacks. - - 5) If you are using the GNU-C++ compiler, you should modify the -compiler driver file GNU_CC:[000000]GCC.COM (or GXX.COM). If you have a -seperate GXX.COM, then you need to change one line in GXX.COM to: -$ if f$locate("D",p2) .ne. P2_Length then Debug = " ""-G0""" - Notice zero---> ^ -If you are using a GCC.COM that does both C and C++, add the following lines to -GCC.COM: - -$! -$! Use old style debugging records for VMS -$! -$ if (Debug.nes."" ).and. Plus then Debug = " ""-G0""" - -after the variables Plus and Debug are set. The reason for this, is that C++ -compiler by default generates debugging records that are more complex, -with many new syntactical elements that allow for the new features of the -language. The -G0 switch tells the C++ compiler to use the old style debugging -records. Until the debugger understands C++ there is not any point to try and -use the expanded syntax. - - 6) When you have nested scopes, i.e.: -main(){ - int i; - {int i; - {int i; -};};} -and you say "EXAM i" the debugger needs to figure out which variable you -actually want to reference. I have arranged things to define a block to the -debugger when you use brackets to enter a new scope, so in the example above, -the variables would be described as: -TEST\main\i -TEST\main\$0\i -TEST\main\$0\$0\i -At each level, the block name is a number with a dollar sign prefix, the -numbers start with 0 and count upward. When you say EXAM i, the debugger looks -at the current PC, and decides which block it is currently in. It works from -the innermost level outward until it finds a block that has the variable "i" -defined. You can always specify the scope explicitly. - - 7) With C++, there can be a lot of inline functions, and it would be -rather restrictive to force the user to debug the program by converting all of -the inline functions to normal functions. What I have done is to essentially -"add" (with the debugger) source lines from the include files that contain the -inline functions. Thus when you step into an inline function it appears as if -you have called the function, and you can examine variables and so forth. -There are several *very* important differences, however. First of all, since -there is no function call involved, you cannot step over the inline function -call - you always step into it. Secondly, since the same source lines are used -in many locations, there is a seperate copy of the source for *each* usage. -Without this, breakpoints do not work, since we must have a 1-to-1 mapping -between source lines and PC. - Since you cannot step over inline function calls, it can be a real pain -if you are not really interested in what is going on for that function call. -What I have done is to use the "-D" switch for the assembler to toggle the -following behavior. With the "-D" switch, all inline functions are included in -the object file, and you can debug everything. Without the "-D" switch -(default case with VMS implementation), inline functions are included *only* if -they did not come from system header files (i.e. from GNU_CC_INCLUDE: or -GNU_GXX_INCLUDE:). Thus, without the switch the user only debugs his/her own -inline functions, and not the system ones. (This is especially useful if you do -a lot of stream I/O in C++). This probably will not provide enough granularity -for many users, but for now this is still somewhat experimental, and I would -like to reflect upon it and get some feedback before I go any further. -Possible solutions include an interactive prompting, a logical name, or a new -command line option in gcc.c (which is then passed through somehow to the guts -of the assembler). - The inline functions from header files appear after the source code -for the source file. This has the advantage that the source file itself is -numbered with the same line numbers that you get with an editor. In addition, -the entire header file is not included, since the assembler makes a list of -the min and max source lines that are used, and only includes those lines from -the first to the last actually used. (It is easy to change it to include the -whole file). - - 8) When you are debugging C++ objects, the object "this" is refered to -as "$this". Actually, the compiler writes it as ".this", but the period is -not good for the debugger, so I have a routine to convert it to a $. (It -actually converts all periods to $, but only for variables, since this was -intended to allow us to access "this". - - 9) If you use the asm("...") keyword for global symbols, you will not -be able to see that symbol with the debugger. The reason is that there are two -records for the symbol stored in the data structures of the assembler. One -contains the info such as psect number and offset, and the other one contains -the information having to do with the data type of the variable. In order to -debug as symbol, you need to be able to coorelate these records, and the only -way to do this is by name. The record with the storage attributes will take -the name used in the asm directive, and the record that specifies the data type -has the actual variable name, and thus when you use the asm directive to change -a variable name, the symbol becomes invisible. - - 10) Older versions of the compiler ( GNU-C 1.37.92 and earlier) place -global constants in the text psect. This is unfortunate, since to the linker -this appears to be an entry point. I sent a patch to the compiler to RMS, -which will generate a .const section for these variables, and patched the -assembler to put these variables into a psect just like that for normal -variables, except that they are marked NOWRT. static constants are still -placed in the text psect, since there is no need for any external access. diff --git a/gas/acinclude.m4 b/gas/acinclude.m4 deleted file mode 100644 index 31a2c1632f1..00000000000 --- a/gas/acinclude.m4 +++ /dev/null @@ -1,56 +0,0 @@ -dnl GAS_CHECK_DECL_NEEDED(name, typedefname, typedef, headers) -AC_DEFUN(GAS_CHECK_DECL_NEEDED,[ -AC_MSG_CHECKING(whether declaration is required for $1) -AC_CACHE_VAL(gas_cv_decl_needed_$1, -AC_TRY_LINK([$4], -[ -typedef $3; -$2 x; -x = ($2) $1; -], gas_cv_decl_needed_$1=no, gas_cv_decl_needed_$1=yes))dnl -AC_MSG_RESULT($gas_cv_decl_needed_$1) -if test $gas_cv_decl_needed_$1 = yes; then - AC_DEFINE([NEED_DECLARATION_]translit($1, [a-z], [A-Z]), 1, - [Define if $1 is not declared in system header files.]) -fi -])dnl -dnl -dnl Some non-ANSI preprocessors botch requoting inside strings. That's bad -dnl enough, but on some of those systems, the assert macro relies on requoting -dnl working properly! -dnl GAS_WORKING_ASSERT -AC_DEFUN(GAS_WORKING_ASSERT, -[AC_MSG_CHECKING([for working assert macro]) -AC_CACHE_VAL(gas_cv_assert_ok, -AC_TRY_LINK([#include -#include ], [ -/* check for requoting problems */ -static int a, b, c, d; -static char *s; -assert (!strcmp(s, "foo bar baz quux")); -/* check for newline handling */ -assert (a == b - || c == d); -], gas_cv_assert_ok=yes, gas_cv_assert_ok=no))dnl -AC_MSG_RESULT($gas_cv_assert_ok) -test $gas_cv_assert_ok = yes || AC_DEFINE(BROKEN_ASSERT, 1, [assert broken?]) -])dnl -dnl -dnl Since many Bourne shell implementations lack subroutines, use this -dnl hack to simplify the code in configure.in. -dnl GAS_UNIQ(listvar) -AC_DEFUN(GAS_UNIQ, -[_gas_uniq_list="[$]$1" -_gas_uniq_newlist="" -dnl Protect against empty input list. -for _gas_uniq_i in _gas_uniq_dummy [$]_gas_uniq_list ; do - case [$]_gas_uniq_i in - _gas_uniq_dummy) ;; - *) case " [$]_gas_uniq_newlist " in - *" [$]_gas_uniq_i "*) ;; - *) _gas_uniq_newlist="[$]_gas_uniq_newlist [$]_gas_uniq_i" ;; - esac ;; - esac -done -$1=[$]_gas_uniq_newlist -])dnl diff --git a/gas/aclocal.m4 b/gas/aclocal.m4 deleted file mode 100644 index 4b4ca84b06c..00000000000 --- a/gas/aclocal.m4 +++ /dev/null @@ -1,980 +0,0 @@ -dnl aclocal.m4 generated automatically by aclocal 1.4 - -dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without -dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. - -dnl GAS_CHECK_DECL_NEEDED(name, typedefname, typedef, headers) -AC_DEFUN(GAS_CHECK_DECL_NEEDED,[ -AC_MSG_CHECKING(whether declaration is required for $1) -AC_CACHE_VAL(gas_cv_decl_needed_$1, -AC_TRY_LINK([$4], -[ -typedef $3; -$2 x; -x = ($2) $1; -], gas_cv_decl_needed_$1=no, gas_cv_decl_needed_$1=yes))dnl -AC_MSG_RESULT($gas_cv_decl_needed_$1) -if test $gas_cv_decl_needed_$1 = yes; then - AC_DEFINE([NEED_DECLARATION_]translit($1, [a-z], [A-Z]), 1, - [Define if $1 is not declared in system header files.]) -fi -])dnl -dnl -dnl Some non-ANSI preprocessors botch requoting inside strings. That's bad -dnl enough, but on some of those systems, the assert macro relies on requoting -dnl working properly! -dnl GAS_WORKING_ASSERT -AC_DEFUN(GAS_WORKING_ASSERT, -[AC_MSG_CHECKING([for working assert macro]) -AC_CACHE_VAL(gas_cv_assert_ok, -AC_TRY_LINK([#include -#include ], [ -/* check for requoting problems */ -static int a, b, c, d; -static char *s; -assert (!strcmp(s, "foo bar baz quux")); -/* check for newline handling */ -assert (a == b - || c == d); -], gas_cv_assert_ok=yes, gas_cv_assert_ok=no))dnl -AC_MSG_RESULT($gas_cv_assert_ok) -test $gas_cv_assert_ok = yes || AC_DEFINE(BROKEN_ASSERT, 1, [assert broken?]) -])dnl -dnl -dnl Since many Bourne shell implementations lack subroutines, use this -dnl hack to simplify the code in configure.in. -dnl GAS_UNIQ(listvar) -AC_DEFUN(GAS_UNIQ, -[_gas_uniq_list="[$]$1" -_gas_uniq_newlist="" -dnl Protect against empty input list. -for _gas_uniq_i in _gas_uniq_dummy [$]_gas_uniq_list ; do - case [$]_gas_uniq_i in - _gas_uniq_dummy) ;; - *) case " [$]_gas_uniq_newlist " in - *" [$]_gas_uniq_i "*) ;; - *) _gas_uniq_newlist="[$]_gas_uniq_newlist [$]_gas_uniq_i" ;; - esac ;; - esac -done -$1=[$]_gas_uniq_newlist -])dnl - -# Do all the work for Automake. This macro actually does too much -- -# some checks are only needed if your package does certain things. -# But this isn't really a big deal. - -# serial 1 - -dnl Usage: -dnl AM_INIT_AUTOMAKE(package,version, [no-define]) - -AC_DEFUN(AM_INIT_AUTOMAKE, -[AC_REQUIRE([AC_PROG_INSTALL]) -PACKAGE=[$1] -AC_SUBST(PACKAGE) -VERSION=[$2] -AC_SUBST(VERSION) -dnl test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi -ifelse([$3],, -AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) -AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) -AC_REQUIRE([AM_SANITY_CHECK]) -AC_REQUIRE([AC_ARG_PROGRAM]) -dnl FIXME This is truly gross. -missing_dir=`cd $ac_aux_dir && pwd` -AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) -AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) -AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) -AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) -AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) -AC_REQUIRE([AC_PROG_MAKE_SET])]) - -# -# Check to make sure that the build environment is sane. -# - -AC_DEFUN(AM_SANITY_CHECK, -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "[$]*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "[$]*" != "X $srcdir/configure conftestfile" \ - && test "[$]*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "[$]2" = conftestfile - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -rm -f conftest* -AC_MSG_RESULT(yes)]) - -dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) -dnl The program must properly implement --version. -AC_DEFUN(AM_MISSING_PROG, -[AC_MSG_CHECKING(for working $2) -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if ($2 --version) < /dev/null > /dev/null 2>&1; then - $1=$2 - AC_MSG_RESULT(found) -else - $1="$3/missing $2" - AC_MSG_RESULT(missing) -fi -AC_SUBST($1)]) - - -# serial 40 AC_PROG_LIBTOOL -AC_DEFUN(AC_PROG_LIBTOOL, -[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl - -# Save cache, so that ltconfig can load it -AC_CACHE_SAVE - -# Actually configure libtool. ac_aux_dir is where install-sh is found. -CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ -LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ -LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ -DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ -${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ -$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ -|| AC_MSG_ERROR([libtool configure failed]) - -# Reload cache, that may have been modified by ltconfig -AC_CACHE_LOAD - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -# Redirect the config.log output again, so that the ltconfig log is not -# clobbered by the next message. -exec 5>>./config.log -]) - -AC_DEFUN(AC_LIBTOOL_SETUP, -[AC_PREREQ(2.13)dnl -AC_REQUIRE([AC_ENABLE_SHARED])dnl -AC_REQUIRE([AC_ENABLE_STATIC])dnl -AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([AC_PROG_RANLIB])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_LD])dnl -AC_REQUIRE([AC_PROG_NM])dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -dnl - -case "$target" in -NONE) lt_target="$host" ;; -*) lt_target="$target" ;; -esac - -# Check for any special flags to pass to ltconfig. -libtool_flags="--cache-file=$cache_file" -test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" -test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" -test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" -test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" -test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" -ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], -[libtool_flags="$libtool_flags --enable-dlopen"]) -ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], -[libtool_flags="$libtool_flags --enable-win32-dll"]) -AC_ARG_ENABLE(libtool-lock, - [ --disable-libtool-lock avoid locking (might break parallel builds)]) -test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" -test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case "$lt_target" in -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, - [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; - -ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], -[*-*-cygwin* | *-*-mingw*) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -]) -esac -]) - -# AC_LIBTOOL_DLOPEN - enable checks for dlopen support -AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) - -# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's -AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) - -# AC_ENABLE_SHARED - implement the --enable-shared flag -# Usage: AC_ENABLE_SHARED[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_SHARED, [dnl -define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(shared, -changequote(<<, >>)dnl -<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl -]) - -# AC_DISABLE_SHARED - set the default shared flag to --disable-shared -AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_SHARED(no)]) - -# AC_ENABLE_STATIC - implement the --enable-static flag -# Usage: AC_ENABLE_STATIC[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_STATIC, [dnl -define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(static, -changequote(<<, >>)dnl -<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_static=AC_ENABLE_STATIC_DEFAULT)dnl -]) - -# AC_DISABLE_STATIC - set the default static flag to --disable-static -AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_STATIC(no)]) - - -# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag -# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl -define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(fast-install, -changequote(<<, >>)dnl -<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_fast_install=yes ;; -no) enable_fast_install=no ;; -*) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl -]) - -# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install -AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl -AC_ENABLE_FAST_INSTALL(no)]) - -# AC_PROG_LD - find the path to the GNU or non-GNU linker -AC_DEFUN(AC_PROG_LD, -[AC_ARG_WITH(gnu-ld, -[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], -test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -ac_prog=ld -if test "$ac_cv_prog_gcc" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by GCC]) - ac_prog=`($CC -print-prog-name=ld) 2>&5` - case "$ac_prog" in - # Accept absolute paths. -changequote(,)dnl - [\\/]* | [A-Za-z]:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' -changequote([,])dnl - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(ac_cv_path_LD, -[if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - ac_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - ac_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$ac_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) -else - AC_MSG_RESULT(no) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -AC_PROG_LD_GNU -]) - -AC_DEFUN(AC_PROG_LD_GNU, -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi]) -]) - -# AC_PROG_NM - find the path to a BSD-compatible name lister -AC_DEFUN(AC_PROG_NM, -[AC_MSG_CHECKING([for BSD-compatible nm]) -AC_CACHE_VAL(ac_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - ac_cv_path_NM="$NM" -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" - for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -B" - break - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -p" - break - else - ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm -fi]) -NM="$ac_cv_path_NM" -AC_MSG_RESULT([$NM]) -]) - -# AC_CHECK_LIBM - check for math library -AC_DEFUN(AC_CHECK_LIBM, -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -LIBM= -case "$lt_target" in -*-*-beos* | *-*-cygwin*) - # These system don't have libm - ;; -*-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") - AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") - ;; -*) - AC_CHECK_LIB(m, main, LIBM="-lm") - ;; -esac -]) - -# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for -# the libltdl convenience library, adds --enable-ltdl-convenience to -# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor -# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed -# to be `${top_builddir}/libltdl'. Make sure you start DIR with -# '${top_builddir}/' (note the single quotes!) if your package is not -# flat, and, if you're not using automake, define top_builddir as -# appropriate in the Makefiles. -AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - case "$enable_ltdl_convenience" in - no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; - "") enable_ltdl_convenience=yes - ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; - esac - LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la - INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) -]) - -# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for -# the libltdl installable library, and adds --enable-ltdl-install to -# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor -# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed -# to be `${top_builddir}/libltdl'. Make sure you start DIR with -# '${top_builddir}/' (note the single quotes!) if your package is not -# flat, and, if you're not using automake, define top_builddir as -# appropriate in the Makefiles. -# In the future, this macro may have to be called after AC_PROG_LIBTOOL. -AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl - AC_CHECK_LIB(ltdl, main, - [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], - [if test x"$enable_ltdl_install" = xno; then - AC_MSG_WARN([libltdl not installed, but installation disabled]) - else - enable_ltdl_install=yes - fi - ]) - if test x"$enable_ltdl_install" = x"yes"; then - ac_configure_args="$ac_configure_args --enable-ltdl-install" - LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la - INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) - else - ac_configure_args="$ac_configure_args --enable-ltdl-install=no" - LIBLTDL="-lltdl" - INCLTDL= - fi -]) - -dnl old names -AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl -AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl -AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl -AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl -AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl -AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl -AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl - -dnl This is just to silence aclocal about the macro not being used -ifelse([AC_DISABLE_FAST_INSTALL])dnl - -# Like AC_CONFIG_HEADER, but automatically create stamp file. - -AC_DEFUN(AM_CONFIG_HEADER, -[AC_PREREQ([2.12]) -AC_CONFIG_HEADER([$1]) -dnl When config.status generates a header, we must update the stamp-h file. -dnl This file resides in the same directory as the config header -dnl that is generated. We must strip everything past the first ":", -dnl and everything past the last "/". -AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl -ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, -<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, -<>; do - case " <<$>>CONFIG_HEADERS " in - *" <<$>>am_file "*<<)>> - echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx - ;; - esac - am_indx=`expr "<<$>>am_indx" + 1` -done<<>>dnl>>) -changequote([,]))]) - - -dnl AM_PROG_LEX -dnl Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT -AC_DEFUN(AM_PROG_LEX, -[missing_dir=ifelse([$1],,`cd $ac_aux_dir && pwd`,$1) -AC_CHECK_PROGS(LEX, flex lex, "$missing_dir/missing flex") -AC_PROG_LEX -AC_DECL_YYTEXT]) - -# This file is derived from `gettext.m4'. The difference is that the -# included macros assume Cygnus-style source and build trees. - -# Macro to add for using GNU gettext. -# Ulrich Drepper , 1995. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 3 - -AC_DEFUN(CY_WITH_NLS, - [AC_MSG_CHECKING([whether NLS is requested]) - dnl Default is enabled NLS - AC_ARG_ENABLE(nls, - [ --disable-nls do not use Native Language Support], - USE_NLS=$enableval, USE_NLS=yes) - AC_MSG_RESULT($USE_NLS) - AC_SUBST(USE_NLS) - - USE_INCLUDED_LIBINTL=no - - dnl If we use NLS figure out what method - if test "$USE_NLS" = "yes"; then - AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if NLS is requested]) - AC_MSG_CHECKING([whether included gettext is requested]) - AC_ARG_WITH(included-gettext, - [ --with-included-gettext use the GNU gettext library included here], - nls_cv_force_use_gnu_gettext=$withval, - nls_cv_force_use_gnu_gettext=no) - AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) - - nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" - if test "$nls_cv_force_use_gnu_gettext" != "yes"; then - dnl User does not insist on using GNU NLS library. Figure out what - dnl to use. If gettext or catgets are available (in this order) we - dnl use this. Else we have to fall back to GNU NLS library. - dnl catgets is only used if permitted by option --with-catgets. - nls_cv_header_intl= - nls_cv_header_libgt= - CATOBJEXT=NONE - - AC_CHECK_HEADER(libintl.h, - [AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc, - [AC_TRY_LINK([#include ], [return (int) gettext ("")], - gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)]) - - if test "$gt_cv_func_gettext_libc" != "yes"; then - AC_CHECK_LIB(intl, bindtextdomain, - [AC_CACHE_CHECK([for gettext in libintl], - gt_cv_func_gettext_libintl, - [AC_TRY_LINK([], [return (int) gettext ("")], - gt_cv_func_gettext_libintl=yes, - gt_cv_func_gettext_libintl=no)])]) - fi - - if test "$gt_cv_func_gettext_libc" = "yes" \ - || test "$gt_cv_func_gettext_libintl" = "yes"; then - AC_DEFINE(HAVE_GETTEXT, 1, - [Define as 1 if you have gettext and don't want to use GNU gettext.]) - AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl - if test "$MSGFMT" != "no"; then - AC_CHECK_FUNCS(dcgettext) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; - return _nl_msg_cat_cntr], - [CATOBJEXT=.gmo - DATADIRNAME=share], - [CATOBJEXT=.mo - DATADIRNAME=lib]) - INSTOBJEXT=.mo - fi - fi - ]) - - dnl In the standard gettext, we would now check for catgets. - dnl However, we never want to use catgets for our releases. - - if test "$CATOBJEXT" = "NONE"; then - dnl Neither gettext nor catgets in included in the C library. - dnl Fall back on GNU gettext library. - nls_cv_use_gnu_gettext=yes - fi - fi - - if test "$nls_cv_use_gnu_gettext" = "yes"; then - dnl Mark actions used to generate GNU NLS library. - INTLOBJS="\$(GETTOBJS)" - AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - AC_SUBST(MSGFMT) - USE_INCLUDED_LIBINTL=yes - CATOBJEXT=.gmo - INSTOBJEXT=.mo - DATADIRNAME=share - INTLDEPS='$(top_builddir)/../intl/libintl.a' - INTLLIBS=$INTLDEPS - LIBS=`echo $LIBS | sed -e 's/-lintl//'` - nls_cv_header_intl=libintl.h - nls_cv_header_libgt=libgettext.h - fi - - dnl Test whether we really found GNU xgettext. - if test "$XGETTEXT" != ":"; then - dnl If it is no GNU xgettext we define it as : so that the - dnl Makefiles still can work. - if $XGETTEXT --omit-header /dev/null 2> /dev/null; then - : ; - else - AC_MSG_RESULT( - [found xgettext programs is not GNU xgettext; ignore it]) - XGETTEXT=":" - fi - fi - - # We need to process the po/ directory. - POSUB=po - else - DATADIRNAME=share - nls_cv_header_intl=libintl.h - nls_cv_header_libgt=libgettext.h - fi - - # If this is used in GNU gettext we have to set USE_NLS to `yes' - # because some of the sources are only built for this goal. - if test "$PACKAGE" = gettext; then - USE_NLS=yes - USE_INCLUDED_LIBINTL=yes - fi - - dnl These rules are solely for the distribution goal. While doing this - dnl we only have to keep exactly one list of the available catalogs - dnl in configure.in. - for lang in $ALL_LINGUAS; do - GMOFILES="$GMOFILES $lang.gmo" - POFILES="$POFILES $lang.po" - done - - dnl Make all variables we use known to autoconf. - AC_SUBST(USE_INCLUDED_LIBINTL) - AC_SUBST(CATALOGS) - AC_SUBST(CATOBJEXT) - AC_SUBST(DATADIRNAME) - AC_SUBST(GMOFILES) - AC_SUBST(INSTOBJEXT) - AC_SUBST(INTLDEPS) - AC_SUBST(INTLLIBS) - AC_SUBST(INTLOBJS) - AC_SUBST(POFILES) - AC_SUBST(POSUB) - ]) - -AC_DEFUN(CY_GNU_GETTEXT, - [AC_REQUIRE([AC_PROG_MAKE_SET])dnl - AC_REQUIRE([AC_PROG_CC])dnl - AC_REQUIRE([AC_PROG_RANLIB])dnl - AC_REQUIRE([AC_ISC_POSIX])dnl - AC_REQUIRE([AC_HEADER_STDC])dnl - AC_REQUIRE([AC_C_CONST])dnl - AC_REQUIRE([AC_C_INLINE])dnl - AC_REQUIRE([AC_TYPE_OFF_T])dnl - AC_REQUIRE([AC_TYPE_SIZE_T])dnl - AC_REQUIRE([AC_FUNC_ALLOCA])dnl - AC_REQUIRE([AC_FUNC_MMAP])dnl - - AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \ -unistd.h values.h sys/param.h]) - AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \ -__argz_count __argz_stringify __argz_next]) - - if test "${ac_cv_func_stpcpy+set}" != "set"; then - AC_CHECK_FUNCS(stpcpy) - fi - if test "${ac_cv_func_stpcpy}" = "yes"; then - AC_DEFINE(HAVE_STPCPY, 1, [Define if you have the stpcpy function]) - fi - - AM_LC_MESSAGES - CY_WITH_NLS - - if test "x$CATOBJEXT" != "x"; then - if test "x$ALL_LINGUAS" = "x"; then - LINGUAS= - else - AC_MSG_CHECKING(for catalogs to be installed) - NEW_LINGUAS= - for lang in ${LINGUAS=$ALL_LINGUAS}; do - case "$ALL_LINGUAS" in - *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; - esac - done - LINGUAS=$NEW_LINGUAS - AC_MSG_RESULT($LINGUAS) - fi - - dnl Construct list of names of catalog files to be constructed. - if test -n "$LINGUAS"; then - for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done - fi - fi - - dnl The reference to in the installed file - dnl must be resolved because we cannot expect the users of this - dnl to define HAVE_LOCALE_H. - if test $ac_cv_header_locale_h = yes; then - INCLUDE_LOCALE_H="#include " - else - INCLUDE_LOCALE_H="\ -/* The system does not provide the header . Take care yourself. */" - fi - AC_SUBST(INCLUDE_LOCALE_H) - - dnl Determine which catalog format we have (if any is needed) - dnl For now we know about two different formats: - dnl Linux libc-5 and the normal X/Open format - if test -f $srcdir/po2tbl.sed.in; then - if test "$CATOBJEXT" = ".cat"; then - AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen) - - dnl Transform the SED scripts while copying because some dumb SEDs - dnl cannot handle comments. - sed -e '/^#/d' $srcdir/$msgformat-msg.sed > po2msg.sed - fi - dnl po2tbl.sed is always needed. - sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ - $srcdir/po2tbl.sed.in > po2tbl.sed - fi - - dnl In the intl/Makefile.in we have a special dependency which makes - dnl only sense for gettext. We comment this out for non-gettext - dnl packages. - if test "$PACKAGE" = "gettext"; then - GT_NO="#NO#" - GT_YES= - else - GT_NO= - GT_YES="#YES#" - fi - AC_SUBST(GT_NO) - AC_SUBST(GT_YES) - - MKINSTALLDIRS="\$(srcdir)/../../mkinstalldirs" - AC_SUBST(MKINSTALLDIRS) - - dnl *** For now the libtool support in intl/Makefile is not for real. - l= - AC_SUBST(l) - - dnl Generate list of files to be processed by xgettext which will - dnl be included in po/Makefile. But only do this if the po directory - dnl exists in srcdir. - if test -d $srcdir/po; then - test -d po || mkdir po - if test "x$srcdir" != "x."; then - if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then - posrcprefix="$srcdir/" - else - posrcprefix="../$srcdir/" - fi - else - posrcprefix="../" - fi - rm -f po/POTFILES - sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ - < $srcdir/po/POTFILES.in > po/POTFILES - fi - ]) - -# Search path for a program which passes the given test. -# Ulrich Drepper , 1996. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 1 - -dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, -dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) -AC_DEFUN(AM_PATH_PROG_WITH_TEST, -[# Extract the first word of "$2", so it can be a program name with args. -set dummy $2; ac_word=[$]2 -AC_MSG_CHECKING([for $ac_word]) -AC_CACHE_VAL(ac_cv_path_$1, -[case "[$]$1" in - /*) - ac_cv_path_$1="[$]$1" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in ifelse([$5], , $PATH, [$5]); do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if [$3]; then - ac_cv_path_$1="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" -dnl If no 4th arg is given, leave the cache variable unset, -dnl so AC_PATH_PROGS will keep looking. -ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" -])dnl - ;; -esac])dnl -$1="$ac_cv_path_$1" -if test -n "[$]$1"; then - AC_MSG_RESULT([$]$1) -else - AC_MSG_RESULT(no) -fi -AC_SUBST($1)dnl -]) - -# Check whether LC_MESSAGES is available in . -# Ulrich Drepper , 1995. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 1 - -AC_DEFUN(AM_LC_MESSAGES, - [if test $ac_cv_header_locale_h = yes; then - AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, - [AC_TRY_LINK([#include ], [return LC_MESSAGES], - am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) - if test $am_cv_val_LC_MESSAGES = yes; then - AC_DEFINE(HAVE_LC_MESSAGES, 1, - [Define if your locale.h file contains LC_MESSAGES.]) - fi - fi]) - -# Add --enable-maintainer-mode option to configure. -# From Jim Meyering - -# serial 1 - -AC_DEFUN(AM_MAINTAINER_MODE, -[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) - dnl maintainer-mode is disabled by default - AC_ARG_ENABLE(maintainer-mode, -[ --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer], - USE_MAINTAINER_MODE=$enableval, - USE_MAINTAINER_MODE=no) - AC_MSG_RESULT($USE_MAINTAINER_MODE) - AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes) - MAINT=$MAINTAINER_MODE_TRUE - AC_SUBST(MAINT)dnl -] -) - -# Define a conditional. - -AC_DEFUN(AM_CONDITIONAL, -[AC_SUBST($1_TRUE) -AC_SUBST($1_FALSE) -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi]) - diff --git a/gas/app.c b/gas/app.c deleted file mode 100644 index 2613e7440b3..00000000000 --- a/gas/app.c +++ /dev/null @@ -1,1307 +0,0 @@ -/* This is the Assembler Pre-Processor - Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* Modified by Allen Wirfs-Brock, Instantiations Inc 2/90 */ -/* App, the assembler pre-processor. This pre-processor strips out excess - spaces, turns single-quoted characters into a decimal constant, and turns - # into a .line \n.file - pair. This needs better error-handling. */ - -#include -#include "as.h" /* For BAD_CASE() only */ - -#if (__STDC__ != 1) -#ifndef const -#define const /* empty */ -#endif -#endif - -#ifdef TC_M68K -/* Whether we are scrubbing in m68k MRI mode. This is different from - flag_m68k_mri, because the two flags will be affected by the .mri - pseudo-op at different times. */ -static int scrub_m68k_mri; -#else -#define scrub_m68k_mri 0 -#endif - -/* The pseudo-op which switches in and out of MRI mode. See the - comment in do_scrub_chars. */ -static const char mri_pseudo[] = ".mri 0"; - -#if defined TC_ARM && defined OBJ_ELF -/* The pseudo-op for which we need to special-case `@' characters. - See the comment in do_scrub_chars. */ -static const char symver_pseudo[] = ".symver"; -static const char * symver_state; -#endif - -static char lex[256]; -static const char symbol_chars[] = -"$._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - -#define LEX_IS_SYMBOL_COMPONENT 1 -#define LEX_IS_WHITESPACE 2 -#define LEX_IS_LINE_SEPARATOR 3 -#define LEX_IS_COMMENT_START 4 -#define LEX_IS_LINE_COMMENT_START 5 -#define LEX_IS_TWOCHAR_COMMENT_1ST 6 -#define LEX_IS_STRINGQUOTE 8 -#define LEX_IS_COLON 9 -#define LEX_IS_NEWLINE 10 -#define LEX_IS_ONECHAR_QUOTE 11 -#ifdef TC_V850 -#define LEX_IS_DOUBLEDASH_1ST 12 -#endif -#ifdef TC_M32R -#define DOUBLEBAR_PARALLEL -#endif -#ifdef DOUBLEBAR_PARALLEL -#define LEX_IS_DOUBLEBAR_1ST 13 -#endif -#define IS_SYMBOL_COMPONENT(c) (lex[c] == LEX_IS_SYMBOL_COMPONENT) -#define IS_WHITESPACE(c) (lex[c] == LEX_IS_WHITESPACE) -#define IS_LINE_SEPARATOR(c) (lex[c] == LEX_IS_LINE_SEPARATOR) -#define IS_COMMENT(c) (lex[c] == LEX_IS_COMMENT_START) -#define IS_LINE_COMMENT(c) (lex[c] == LEX_IS_LINE_COMMENT_START) -#define IS_NEWLINE(c) (lex[c] == LEX_IS_NEWLINE) - -static int process_escape PARAMS ((int)); - -/* FIXME-soon: The entire lexer/parser thingy should be - built statically at compile time rather than dynamically - each and every time the assembler is run. xoxorich. */ - -void -do_scrub_begin (m68k_mri) - int m68k_mri ATTRIBUTE_UNUSED; -{ - const char *p; - int c; - - lex[' '] = LEX_IS_WHITESPACE; - lex['\t'] = LEX_IS_WHITESPACE; - lex['\r'] = LEX_IS_WHITESPACE; - lex['\n'] = LEX_IS_NEWLINE; - lex[';'] = LEX_IS_LINE_SEPARATOR; - lex[':'] = LEX_IS_COLON; - -#ifdef TC_M68K - scrub_m68k_mri = m68k_mri; - - if (! m68k_mri) -#endif - { - lex['"'] = LEX_IS_STRINGQUOTE; - -#if ! defined (TC_HPPA) && ! defined (TC_I370) - /* I370 uses single-quotes to delimit integer, float constants */ - lex['\''] = LEX_IS_ONECHAR_QUOTE; -#endif - -#ifdef SINGLE_QUOTE_STRINGS - lex['\''] = LEX_IS_STRINGQUOTE; -#endif - } - - /* Note: if any other character can be LEX_IS_STRINGQUOTE, the loop - in state 5 of do_scrub_chars must be changed. */ - - /* Note that these override the previous defaults, e.g. if ';' is a - comment char, then it isn't a line separator. */ - for (p = symbol_chars; *p; ++p) - { - lex[(unsigned char) *p] = LEX_IS_SYMBOL_COMPONENT; - } /* declare symbol characters */ - - for (c = 128; c < 256; ++c) - lex[c] = LEX_IS_SYMBOL_COMPONENT; - -#ifdef tc_symbol_chars - /* This macro permits the processor to specify all characters which - may appears in an operand. This will prevent the scrubber from - discarding meaningful whitespace in certain cases. The i386 - backend uses this to support prefixes, which can confuse the - scrubber as to whether it is parsing operands or opcodes. */ - for (p = tc_symbol_chars; *p; ++p) - lex[(unsigned char) *p] = LEX_IS_SYMBOL_COMPONENT; -#endif - - /* The m68k backend wants to be able to change comment_chars. */ -#ifndef tc_comment_chars -#define tc_comment_chars comment_chars -#endif - for (p = tc_comment_chars; *p; p++) - { - lex[(unsigned char) *p] = LEX_IS_COMMENT_START; - } /* declare comment chars */ - - for (p = line_comment_chars; *p; p++) - { - lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START; - } /* declare line comment chars */ - - for (p = line_separator_chars; *p; p++) - { - lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR; - } /* declare line separators */ - - /* Only allow slash-star comments if slash is not in use. - FIXME: This isn't right. We should always permit them. */ - if (lex['/'] == 0) - { - lex['/'] = LEX_IS_TWOCHAR_COMMENT_1ST; - } - -#ifdef TC_M68K - if (m68k_mri) - { - lex['\''] = LEX_IS_STRINGQUOTE; - lex[';'] = LEX_IS_COMMENT_START; - lex['*'] = LEX_IS_LINE_COMMENT_START; - /* The MRI documentation says '!' is LEX_IS_COMMENT_START, but - then it can't be used in an expression. */ - lex['!'] = LEX_IS_LINE_COMMENT_START; - } -#endif - -#ifdef TC_V850 - lex['-'] = LEX_IS_DOUBLEDASH_1ST; -#endif -#ifdef DOUBLEBAR_PARALLEL - lex['|'] = LEX_IS_DOUBLEBAR_1ST; -#endif -#ifdef TC_D30V - /* must do this is we want VLIW instruction with "->" or "<-" */ - lex['-'] = LEX_IS_SYMBOL_COMPONENT; -#endif -} /* do_scrub_begin() */ - -/* Saved state of the scrubber */ -static int state; -static int old_state; -static char *out_string; -static char out_buf[20]; -static int add_newlines; -static char *saved_input; -static int saved_input_len; -static char input_buffer[32 * 1024]; -static const char *mri_state; -static char mri_last_ch; - -/* Data structure for saving the state of app across #include's. Note that - app is called asynchronously to the parsing of the .include's, so our - state at the time .include is interpreted is completely unrelated. - That's why we have to save it all. */ - -struct app_save - { - int state; - int old_state; - char * out_string; - char out_buf[sizeof (out_buf)]; - int add_newlines; - char * saved_input; - int saved_input_len; -#ifdef TC_M68K - int scrub_m68k_mri; -#endif - const char * mri_state; - char mri_last_ch; -#if defined TC_ARM && defined OBJ_ELF - const char * symver_state; -#endif - }; - -char * -app_push () -{ - register struct app_save *saved; - - saved = (struct app_save *) xmalloc (sizeof (*saved)); - saved->state = state; - saved->old_state = old_state; - saved->out_string = out_string; - memcpy (saved->out_buf, out_buf, sizeof (out_buf)); - saved->add_newlines = add_newlines; - if (saved_input == NULL) - saved->saved_input = NULL; - else - { - saved->saved_input = xmalloc (saved_input_len); - memcpy (saved->saved_input, saved_input, saved_input_len); - saved->saved_input_len = saved_input_len; - } -#ifdef TC_M68K - saved->scrub_m68k_mri = scrub_m68k_mri; -#endif - saved->mri_state = mri_state; - saved->mri_last_ch = mri_last_ch; -#if defined TC_ARM && defined OBJ_ELF - saved->symver_state = symver_state; -#endif - - /* do_scrub_begin() is not useful, just wastes time. */ - - state = 0; - saved_input = NULL; - - return (char *) saved; -} - -void -app_pop (arg) - char *arg; -{ - register struct app_save *saved = (struct app_save *) arg; - - /* There is no do_scrub_end (). */ - state = saved->state; - old_state = saved->old_state; - out_string = saved->out_string; - memcpy (out_buf, saved->out_buf, sizeof (out_buf)); - add_newlines = saved->add_newlines; - if (saved->saved_input == NULL) - saved_input = NULL; - else - { - assert (saved->saved_input_len <= (int) (sizeof input_buffer)); - memcpy (input_buffer, saved->saved_input, saved->saved_input_len); - saved_input = input_buffer; - saved_input_len = saved->saved_input_len; - free (saved->saved_input); - } -#ifdef TC_M68K - scrub_m68k_mri = saved->scrub_m68k_mri; -#endif - mri_state = saved->mri_state; - mri_last_ch = saved->mri_last_ch; -#if defined TC_ARM && defined OBJ_ELF - symver_state = saved->symver_state; -#endif - - free (arg); -} /* app_pop() */ - -/* @@ This assumes that \n &c are the same on host and target. This is not - necessarily true. */ -static int -process_escape (ch) - int ch; -{ - switch (ch) - { - case 'b': - return '\b'; - case 'f': - return '\f'; - case 'n': - return '\n'; - case 'r': - return '\r'; - case 't': - return '\t'; - case '\'': - return '\''; - case '"': - return '\"'; - default: - return ch; - } -} - -/* This function is called to process input characters. The GET - parameter is used to retrieve more input characters. GET should - set its parameter to point to a buffer, and return the length of - the buffer; it should return 0 at end of file. The scrubbed output - characters are put into the buffer starting at TOSTART; the TOSTART - buffer is TOLEN bytes in length. The function returns the number - of scrubbed characters put into TOSTART. This will be TOLEN unless - end of file was seen. This function is arranged as a state - machine, and saves its state so that it may return at any point. - This is the way the old code used to work. */ - -int -do_scrub_chars (get, tostart, tolen) - int (*get) PARAMS ((char *, int)); - char *tostart; - int tolen; -{ - char *to = tostart; - char *toend = tostart + tolen; - char *from; - char *fromend; - int fromlen; - register int ch, ch2 = 0; - - /*State 0: beginning of normal line - 1: After first whitespace on line (flush more white) - 2: After first non-white (opcode) on line (keep 1white) - 3: after second white on line (into operands) (flush white) - 4: after putting out a .line, put out digits - 5: parsing a string, then go to old-state - 6: putting out \ escape in a "d string. - 7: After putting out a .appfile, put out string. - 8: After putting out a .appfile string, flush until newline. - 9: After seeing symbol char in state 3 (keep 1white after symchar) - 10: After seeing whitespace in state 9 (keep white before symchar) - 11: After seeing a symbol character in state 0 (eg a label definition) - -1: output string in out_string and go to the state in old_state - -2: flush text until a '*' '/' is seen, then go to state old_state -#ifdef TC_V850 - 12: After seeing a dash, looking for a second dash as a start of comment. -#endif -#ifdef DOUBLEBAR_PARALLEL - 13: After seeing a vertical bar, looking for a second vertical bar as a parallel expression seperator. -#endif - */ - - /* I added states 9 and 10 because the MIPS ECOFF assembler uses - constructs like ``.loc 1 20''. This was turning into ``.loc - 120''. States 9 and 10 ensure that a space is never dropped in - between characters which could appear in a identifier. Ian - Taylor, ian@cygnus.com. - - I added state 11 so that something like "Lfoo add %r25,%r26,%r27" works - correctly on the PA (and any other target where colons are optional). - Jeff Law, law@cs.utah.edu. - - I added state 13 so that something like "cmp r1, r2 || trap #1" does not - get squashed into "cmp r1,r2||trap#1", with the all important space - between the 'trap' and the '#1' being eliminated. nickc@cygnus.com */ - - /* This macro gets the next input character. */ - -#define GET() \ - (from < fromend \ - ? * (unsigned char *) (from++) \ - : (saved_input = NULL, \ - fromlen = (*get) (input_buffer, sizeof input_buffer), \ - from = input_buffer, \ - fromend = from + fromlen, \ - (fromlen == 0 \ - ? EOF \ - : * (unsigned char *) (from++)))) - - /* This macro pushes a character back on the input stream. */ - -#define UNGET(uch) (*--from = (uch)) - - /* This macro puts a character into the output buffer. If this - character fills the output buffer, this macro jumps to the label - TOFULL. We use this rather ugly approach because we need to - handle two different termination conditions: EOF on the input - stream, and a full output buffer. It would be simpler if we - always read in the entire input stream before processing it, but - I don't want to make such a significant change to the assembler's - memory usage. */ - -#define PUT(pch) \ - do \ - { \ - *to++ = (pch); \ - if (to >= toend) \ - goto tofull; \ - } \ - while (0) - - if (saved_input != NULL) - { - from = saved_input; - fromend = from + saved_input_len; - } - else - { - fromlen = (*get) (input_buffer, sizeof input_buffer); - if (fromlen == 0) - return 0; - from = input_buffer; - fromend = from + fromlen; - } - - while (1) - { - /* The cases in this switch end with continue, in order to - branch back to the top of this while loop and generate the - next output character in the appropriate state. */ - switch (state) - { - case -1: - ch = *out_string++; - if (*out_string == '\0') - { - state = old_state; - old_state = 3; - } - PUT (ch); - continue; - - case -2: - for (;;) - { - do - { - ch = GET (); - - if (ch == EOF) - { - as_warn (_("end of file in comment")); - goto fromeof; - } - - if (ch == '\n') - PUT ('\n'); - } - while (ch != '*'); - - while ((ch = GET ()) == '*') - ; - - if (ch == EOF) - { - as_warn (_("end of file in comment")); - goto fromeof; - } - - if (ch == '/') - break; - - UNGET (ch); - } - - state = old_state; - UNGET (' '); - continue; - - case 4: - ch = GET (); - if (ch == EOF) - goto fromeof; - else if (ch >= '0' && ch <= '9') - PUT (ch); - else - { - while (ch != EOF && IS_WHITESPACE (ch)) - ch = GET (); - if (ch == '"') - { - UNGET (ch); - if (scrub_m68k_mri) - out_string = "\n\tappfile "; - else - out_string = "\n\t.appfile "; - old_state = 7; - state = -1; - PUT (*out_string++); - } - else - { - while (ch != EOF && ch != '\n') - ch = GET (); - state = 0; - PUT (ch); - } - } - continue; - - case 5: - /* We are going to copy everything up to a quote character, - with special handling for a backslash. We try to - optimize the copying in the simple case without using the - GET and PUT macros. */ - { - char *s; - int len; - - for (s = from; s < fromend; s++) - { - ch = *s; - /* This condition must be changed if the type of any - other character can be LEX_IS_STRINGQUOTE. */ - if (ch == '\\' - || ch == '"' - || ch == '\'' - || ch == '\n') - break; - } - len = s - from; - if (len > toend - to) - len = toend - to; - if (len > 0) - { - memcpy (to, from, len); - to += len; - from += len; - } - } - - ch = GET (); - if (ch == EOF) - { - as_warn (_("end of file in string: inserted '\"'")); - state = old_state; - UNGET ('\n'); - PUT ('"'); - } - else if (lex[ch] == LEX_IS_STRINGQUOTE) - { - state = old_state; - PUT (ch); - } -#ifndef NO_STRING_ESCAPES - else if (ch == '\\') - { - state = 6; - PUT (ch); - } -#endif - else if (scrub_m68k_mri && ch == '\n') - { - /* Just quietly terminate the string. This permits lines like - bne label loop if we haven't reach end yet - */ - state = old_state; - UNGET (ch); - PUT ('\''); - } - else - { - PUT (ch); - } - continue; - - case 6: - state = 5; - ch = GET (); - switch (ch) - { - /* Handle strings broken across lines, by turning '\n' into - '\\' and 'n'. */ - case '\n': - UNGET ('n'); - add_newlines++; - PUT ('\\'); - continue; - - case '"': - case '\\': - case 'b': - case 'f': - case 'n': - case 'r': - case 't': - case 'v': - case 'x': - case 'X': - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - break; -#if defined(IGNORE_NONSTANDARD_ESCAPES) | defined(ONLY_STANDARD_ESCAPES) - default: - as_warn (_("Unknown escape '\\%c' in string: Ignored"), ch); - break; -#else /* ONLY_STANDARD_ESCAPES */ - default: - /* Accept \x as x for any x */ - break; -#endif /* ONLY_STANDARD_ESCAPES */ - - case EOF: - as_warn (_("End of file in string: '\"' inserted")); - PUT ('"'); - continue; - } - PUT (ch); - continue; - - case 7: - ch = GET (); - state = 5; - old_state = 8; - if (ch == EOF) - goto fromeof; - PUT (ch); - continue; - - case 8: - do - ch = GET (); - while (ch != '\n' && ch != EOF); - if (ch == EOF) - goto fromeof; - state = 0; - PUT (ch); - continue; - } - - /* OK, we are somewhere in states 0 through 4 or 9 through 11 */ - - /* flushchar: */ - ch = GET (); - - recycle: - -#if defined TC_ARM && defined OBJ_ELF - /* We need to watch out for .symver directives. See the comment later - in this function. */ - if (symver_state == NULL) - { - if ((state == 0 || state == 1) && ch == symver_pseudo[0]) - symver_state = symver_pseudo + 1; - } - else - { - /* We advance to the next state if we find the right - character. */ - if (ch != '\0' && (*symver_state == ch)) - ++symver_state; - else if (*symver_state != '\0') - /* We did not get the expected character, or we didn't - get a valid terminating character after seeing the - entire pseudo-op, so we must go back to the beginning. */ - symver_state = NULL; - else - { - /* We've read the entire pseudo-op. If this is the end - of the line, go back to the beginning. */ - if (IS_NEWLINE (ch)) - symver_state = NULL; - } - } -#endif /* TC_ARM && OBJ_ELF */ - -#ifdef TC_M68K - /* We want to have pseudo-ops which control whether we are in - MRI mode or not. Unfortunately, since m68k MRI mode affects - the scrubber, that means that we need a special purpose - recognizer here. */ - if (mri_state == NULL) - { - if ((state == 0 || state == 1) - && ch == mri_pseudo[0]) - mri_state = mri_pseudo + 1; - } - else - { - /* We advance to the next state if we find the right - character, or if we need a space character and we get any - whitespace character, or if we need a '0' and we get a - '1' (this is so that we only need one state to handle - ``.mri 0'' and ``.mri 1''). */ - if (ch != '\0' - && (*mri_state == ch - || (*mri_state == ' ' - && lex[ch] == LEX_IS_WHITESPACE) - || (*mri_state == '0' - && ch == '1'))) - { - mri_last_ch = ch; - ++mri_state; - } - else if (*mri_state != '\0' - || (lex[ch] != LEX_IS_WHITESPACE - && lex[ch] != LEX_IS_NEWLINE)) - { - /* We did not get the expected character, or we didn't - get a valid terminating character after seeing the - entire pseudo-op, so we must go back to the - beginning. */ - mri_state = NULL; - } - else - { - /* We've read the entire pseudo-op. mips_last_ch is - either '0' or '1' indicating whether to enter or - leave MRI mode. */ - do_scrub_begin (mri_last_ch == '1'); - mri_state = NULL; - - /* We continue handling the character as usual. The - main gas reader must also handle the .mri pseudo-op - to control expression parsing and the like. */ - } - } -#endif - - if (ch == EOF) - { - if (state != 0) - { - as_warn (_("end of file not at end of a line; newline inserted")); - state = 0; - PUT ('\n'); - } - goto fromeof; - } - - switch (lex[ch]) - { - case LEX_IS_WHITESPACE: - do - { - ch = GET (); - } - while (ch != EOF && IS_WHITESPACE (ch)); - if (ch == EOF) - goto fromeof; - - if (state == 0) - { - /* Preserve a single whitespace character at the - beginning of a line. */ - state = 1; - UNGET (ch); - PUT (' '); - break; - } - -#ifdef KEEP_WHITE_AROUND_COLON - if (lex[ch] == LEX_IS_COLON) - { - /* only keep this white if there's no white *after* the colon */ - ch2 = GET (); - UNGET (ch2); - if (!IS_WHITESPACE (ch2)) - { - state = 9; - UNGET (ch); - PUT (' '); - break; - } - } -#endif - if (IS_COMMENT (ch) - || ch == '/' - || IS_LINE_SEPARATOR (ch)) - { - if (scrub_m68k_mri) - { - /* In MRI mode, we keep these spaces. */ - UNGET (ch); - PUT (' '); - break; - } - goto recycle; - } - - /* If we're in state 2 or 11, we've seen a non-white - character followed by whitespace. If the next character - is ':', this is whitespace after a label name which we - normally must ignore. In MRI mode, though, spaces are - not permitted between the label and the colon. */ - if ((state == 2 || state == 11) - && lex[ch] == LEX_IS_COLON - && ! scrub_m68k_mri) - { - state = 1; - PUT (ch); - break; - } - - switch (state) - { - case 0: - state++; - goto recycle; /* Punted leading sp */ - case 1: - /* We can arrive here if we leave a leading whitespace - character at the beginning of a line. */ - goto recycle; - case 2: - state = 3; - if (to + 1 < toend) - { - /* Optimize common case by skipping UNGET/GET. */ - PUT (' '); /* Sp after opco */ - goto recycle; - } - UNGET (ch); - PUT (' '); - break; - case 3: - if (scrub_m68k_mri) - { - /* In MRI mode, we keep these spaces. */ - UNGET (ch); - PUT (' '); - break; - } - goto recycle; /* Sp in operands */ - case 9: - case 10: - if (scrub_m68k_mri) - { - /* In MRI mode, we keep these spaces. */ - state = 3; - UNGET (ch); - PUT (' '); - break; - } - state = 10; /* Sp after symbol char */ - goto recycle; - case 11: - if (LABELS_WITHOUT_COLONS || flag_m68k_mri) - state = 1; - else - { - /* We know that ch is not ':', since we tested that - case above. Therefore this is not a label, so it - must be the opcode, and we've just seen the - whitespace after it. */ - state = 3; - } - UNGET (ch); - PUT (' '); /* Sp after label definition. */ - break; - default: - BAD_CASE (state); - } - break; - - case LEX_IS_TWOCHAR_COMMENT_1ST: - ch2 = GET (); - if (ch2 == '*') - { - for (;;) - { - do - { - ch2 = GET (); - if (ch2 != EOF && IS_NEWLINE (ch2)) - add_newlines++; - } - while (ch2 != EOF && ch2 != '*'); - - while (ch2 == '*') - ch2 = GET (); - - if (ch2 == EOF || ch2 == '/') - break; - - /* This UNGET will ensure that we count newlines - correctly. */ - UNGET (ch2); - } - - if (ch2 == EOF) - as_warn (_("end of file in multiline comment")); - - ch = ' '; - goto recycle; - } - else - { - if (ch2 != EOF) - UNGET (ch2); - if (state == 9 || state == 10) - state = 3; - PUT (ch); - } - break; - - case LEX_IS_STRINGQUOTE: - if (state == 10) - { - /* Preserve the whitespace in foo "bar" */ - UNGET (ch); - state = 3; - PUT (' '); - - /* PUT didn't jump out. We could just break, but we - know what will happen, so optimize a bit. */ - ch = GET (); - old_state = 3; - } - else if (state == 9) - old_state = 3; - else - old_state = state; - state = 5; - PUT (ch); - break; - -#ifndef IEEE_STYLE - case LEX_IS_ONECHAR_QUOTE: - if (state == 10) - { - /* Preserve the whitespace in foo 'b' */ - UNGET (ch); - state = 3; - PUT (' '); - break; - } - ch = GET (); - if (ch == EOF) - { - as_warn (_("end of file after a one-character quote; \\0 inserted")); - ch = 0; - } - if (ch == '\\') - { - ch = GET (); - if (ch == EOF) - { - as_warn (_("end of file in escape character")); - ch = '\\'; - } - else - ch = process_escape (ch); - } - sprintf (out_buf, "%d", (int) (unsigned char) ch); - - /* None of these 'x constants for us. We want 'x'. */ - if ((ch = GET ()) != '\'') - { -#ifdef REQUIRE_CHAR_CLOSE_QUOTE - as_warn (_("Missing close quote: (assumed)")); -#else - if (ch != EOF) - UNGET (ch); -#endif - } - if (strlen (out_buf) == 1) - { - PUT (out_buf[0]); - break; - } - if (state == 9) - old_state = 3; - else - old_state = state; - state = -1; - out_string = out_buf; - PUT (*out_string++); - break; -#endif - - case LEX_IS_COLON: -#ifdef KEEP_WHITE_AROUND_COLON - state = 9; -#else - if (state == 9 || state == 10) - state = 3; - else if (state != 3) - state = 1; -#endif - PUT (ch); - break; - - case LEX_IS_NEWLINE: - /* Roll out a bunch of newlines from inside comments, etc. */ - if (add_newlines) - { - --add_newlines; - UNGET (ch); - } - /* fall thru into... */ - - case LEX_IS_LINE_SEPARATOR: - state = 0; - PUT (ch); - break; - -#ifdef TC_V850 - case LEX_IS_DOUBLEDASH_1ST: - ch2 = GET(); - if (ch2 != '-') - { - UNGET (ch2); - goto de_fault; - } - /* read and skip to end of line */ - do - { - ch = GET (); - } - while (ch != EOF && ch != '\n'); - if (ch == EOF) - { - as_warn (_("end of file in comment; newline inserted")); - } - state = 0; - PUT ('\n'); - break; -#endif -#ifdef DOUBLEBAR_PARALLEL - case LEX_IS_DOUBLEBAR_1ST: - ch2 = GET(); - if (ch2 != '|') - { - UNGET (ch2); - goto de_fault; - } - /* Reset back to state 1 and pretend that we are parsing a line from - just after the first white space. */ - state = 1; - PUT ('|'); - PUT ('|'); - break; -#endif - case LEX_IS_LINE_COMMENT_START: - /* FIXME-someday: The two character comment stuff was badly - thought out. On i386, we want '/' as line comment start - AND we want C style comments. hence this hack. The - whole lexical process should be reworked. xoxorich. */ - if (ch == '/') - { - ch2 = GET (); - if (ch2 == '*') - { - old_state = 3; - state = -2; - break; - } - else - { - UNGET (ch2); - } - } /* bad hack */ - - if (state == 0 || state == 1) /* Only comment at start of line. */ - { - int startch; - - startch = ch; - - do - { - ch = GET (); - } - while (ch != EOF && IS_WHITESPACE (ch)); - if (ch == EOF) - { - as_warn (_("end of file in comment; newline inserted")); - PUT ('\n'); - break; - } - if (ch < '0' || ch > '9' || state != 0 || startch != '#') - { - /* Not a cpp line. */ - while (ch != EOF && !IS_NEWLINE (ch)) - ch = GET (); - if (ch == EOF) - as_warn (_("EOF in Comment: Newline inserted")); - state = 0; - PUT ('\n'); - break; - } - /* Loks like `# 123 "filename"' from cpp. */ - UNGET (ch); - old_state = 4; - state = -1; - if (scrub_m68k_mri) - out_string = "\tappline "; - else - out_string = "\t.appline "; - PUT (*out_string++); - break; - } - -#ifdef TC_D10V - /* All insns end in a char for which LEX_IS_SYMBOL_COMPONENT is true. - Trap is the only short insn that has a first operand that is - neither register nor label. - We must prevent exef0f ||trap #1 to degenerate to exef0f ||trap#1 . - We can't make '#' LEX_IS_SYMBOL_COMPONENT because it is already - LEX_IS_LINE_COMMENT_START. However, it is the only character in - line_comment_chars for d10v, hence we can recognize it as such. */ - /* An alternative approach would be to reset the state to 1 when - we see '||', '<'- or '->', but that seems to be overkill. */ - if (state == 10) PUT (' '); -#endif - /* We have a line comment character which is not at the - start of a line. If this is also a normal comment - character, fall through. Otherwise treat it as a default - character. */ - if (strchr (tc_comment_chars, ch) == NULL - && (! scrub_m68k_mri - || (ch != '!' && ch != '*'))) - goto de_fault; - if (scrub_m68k_mri - && (ch == '!' || ch == '*' || ch == '#') - && state != 1 - && state != 10) - goto de_fault; - /* Fall through. */ - case LEX_IS_COMMENT_START: -#if defined TC_ARM && defined OBJ_ELF - /* On the ARM, `@' is the comment character. - Unfortunately this is also a special character in ELF .symver - directives (and .type, though we deal with those another way). So - we check if this line is such a directive, and treat the character - as default if so. This is a hack. */ - if ((symver_state != NULL) && (*symver_state == 0)) - goto de_fault; -#endif - do - { - ch = GET (); - } - while (ch != EOF && !IS_NEWLINE (ch)); - if (ch == EOF) - as_warn (_("end of file in comment; newline inserted")); - state = 0; - PUT ('\n'); - break; - - case LEX_IS_SYMBOL_COMPONENT: - if (state == 10) - { - /* This is a symbol character following another symbol - character, with whitespace in between. We skipped - the whitespace earlier, so output it now. */ - UNGET (ch); - state = 3; - PUT (' '); - break; - } - - if (state == 3) - state = 9; - - /* This is a common case. Quickly copy CH and all the - following symbol component or normal characters. */ - if (to + 1 < toend - && mri_state == NULL -#if defined TC_ARM && defined OBJ_ELF - && symver_state == NULL -#endif - ) - { - char *s; - int len; - - for (s = from; s < fromend; s++) - { - int type; - - ch2 = * (unsigned char *) s; - type = lex[ch2]; - if (type != 0 - && type != LEX_IS_SYMBOL_COMPONENT) - break; - } - if (s > from) - { - /* Handle the last character normally, for - simplicity. */ - --s; - } - len = s - from; - if (len > (toend - to) - 1) - len = (toend - to) - 1; - if (len > 0) - { - PUT (ch); - if (len > 8) - { - memcpy (to, from, len); - to += len; - from += len; - } - else - { - switch (len) - { - case 8: *to++ = *from++; - case 7: *to++ = *from++; - case 6: *to++ = *from++; - case 5: *to++ = *from++; - case 4: *to++ = *from++; - case 3: *to++ = *from++; - case 2: *to++ = *from++; - case 1: *to++ = *from++; - } - } - ch = GET (); - } - } - - /* Fall through. */ - default: - de_fault: - /* Some relatively `normal' character. */ - if (state == 0) - { - state = 11; /* Now seeing label definition */ - } - else if (state == 1) - { - state = 2; /* Ditto */ - } - else if (state == 9) - { - if (lex[ch] != LEX_IS_SYMBOL_COMPONENT) - state = 3; - } - else if (state == 10) - { - if (ch == '\\') - { - /* Special handling for backslash: a backslash may - be the beginning of a formal parameter (of a - macro) following another symbol character, with - whitespace in between. If that is the case, we - output a space before the parameter. Strictly - speaking, correct handling depends upon what the - macro parameter expands into; if the parameter - expands into something which does not start with - an operand character, then we don't want to keep - the space. We don't have enough information to - make the right choice, so here we are making the - choice which is more likely to be correct. */ - PUT (' '); - } - - state = 3; - } - PUT (ch); - break; - } - } - - /*NOTREACHED*/ - - fromeof: - /* We have reached the end of the input. */ - return to - tostart; - - tofull: - /* The output buffer is full. Save any input we have not yet - processed. */ - if (fromend > from) - { - saved_input = from; - saved_input_len = fromend - from; - } - else - saved_input = NULL; - - return to - tostart; -} - -/* end of app.c */ diff --git a/gas/as.c b/gas/as.c deleted file mode 100644 index 9bac61da19c..00000000000 --- a/gas/as.c +++ /dev/null @@ -1,1084 +0,0 @@ -/* as.c - GAS main program. - Copyright (C) 1987, 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* - * Main program for AS; a 32-bit assembler of GNU. - * Understands command arguments. - * Has a few routines that don't fit in other modules because they - * are shared. - * - * - * bugs - * - * : initialisers - * Since no-one else says they will support them in future: I - * don't support them now. - * - */ - -#include "ansidecl.h" - -#define COMMON - -#include "as.h" -#include "subsegs.h" -#include "output-file.h" -#include "sb.h" -#include "macro.h" - -#ifdef HAVE_ITBL_CPU -#include "itbl-ops.h" -#else -#define itbl_parse(itbl_file) 1 -#define itbl_init() -#endif - -#ifdef HAVE_SBRK -#ifdef NEED_DECLARATION_SBRK -extern PTR sbrk (); -#endif -#endif - -static void show_usage PARAMS ((FILE *)); -static void parse_args PARAMS ((int *, char ***)); -static void dump_statistics PARAMS ((void)); -static void perform_an_assembly_pass PARAMS ((int argc, char **argv)); -static int macro_expr PARAMS ((const char *, int, sb *, int *)); - -int listing; /* true if a listing is wanted */ - -static char *listing_filename = NULL; /* Name of listing file. */ - -/* Type of debugging to generate. */ - -enum debug_info_type debug_type = DEBUG_NONE; - -/* Maximum level of macro nesting. */ - -int max_macro_nest = 100; - -char *myname; /* argv[0] */ -#ifdef BFD_ASSEMBLER -segT reg_section, expr_section; -segT text_section, data_section, bss_section; -#endif - -/* The default obstack chunk size. If we set this to zero, the - obstack code will use whatever will fit in a 4096 byte block. */ -int chunksize = 0; - -/* To monitor memory allocation more effectively, make this non-zero. - Then the chunk sizes for gas and bfd will be reduced. */ -int debug_memory = 0; - -/* We build a list of defsyms as we read the options, and then define - them after we have initialized everything. */ - -struct defsym_list -{ - struct defsym_list *next; - char *name; - valueT value; -}; - -static struct defsym_list *defsyms; - -/* Keep a record of the itbl files we read in. */ - -struct itbl_file_list -{ - struct itbl_file_list *next; - char *name; -}; - -static struct itbl_file_list *itbl_files; - -#ifdef USE_EMULATIONS -#define EMULATION_ENVIRON "AS_EMULATION" - -extern struct emulation mipsbelf, mipslelf, mipself; -extern struct emulation mipsbecoff, mipslecoff, mipsecoff; -extern struct emulation i386coff, i386elf, i386aout; - -static struct emulation *const emulations[] = { EMULATIONS }; -static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]); - -static void select_emulation_mode PARAMS ((int, char **)); - -static void -select_emulation_mode (argc, argv) - int argc; - char **argv; -{ - int i; - char *p, *em = 0; - - for (i = 1; i < argc; i++) - if (!strncmp ("--em", argv[i], 4)) - break; - - if (i == argc) - goto do_default; - - p = strchr (argv[i], '='); - if (p) - p++; - else - p = argv[i+1]; - - if (!p || !*p) - as_fatal (_("missing emulation mode name")); - em = p; - - do_default: - if (em == 0) - em = getenv (EMULATION_ENVIRON); - if (em == 0) - em = DEFAULT_EMULATION; - - if (em) - { - for (i = 0; i < n_emulations; i++) - if (!strcmp (emulations[i]->name, em)) - break; - if (i == n_emulations) - as_fatal (_("unrecognized emulation name `%s'"), em); - this_emulation = emulations[i]; - } - else - this_emulation = emulations[0]; - - this_emulation->init (); -} - -const char * -default_emul_bfd_name () -{ - abort (); - return NULL; -} - -void -common_emul_init () -{ - this_format = this_emulation->format; - - if (this_emulation->leading_underscore == 2) - this_emulation->leading_underscore = this_format->dfl_leading_underscore; - - if (this_emulation->default_endian != 2) - target_big_endian = this_emulation->default_endian; - - if (this_emulation->fake_label_name == 0) - { - if (this_emulation->leading_underscore) - this_emulation->fake_label_name = "L0\001"; - else - /* What other parameters should we test? */ - this_emulation->fake_label_name = ".L0\001"; - } -} -#endif - -void -print_version_id () -{ - static int printed; - if (printed) - return; - printed = 1; - -#ifdef BFD_ASSEMBLER - fprintf (stderr, _("GNU assembler version %s (%s) using BFD version %s"), - VERSION, TARGET_ALIAS, BFD_VERSION); -#else - fprintf (stderr, _("GNU assembler version %s (%s)"), VERSION, TARGET_ALIAS); -#endif - fprintf (stderr, "\n"); -} - -static void -show_usage (stream) - FILE *stream; -{ - fprintf (stream, _("Usage: %s [option...] [asmfile...]\n"), myname); - - fprintf (stream, _("\ -Options:\n\ - -a[sub-option...] turn on listings\n\ - Sub-options [default hls]:\n\ - c omit false conditionals\n\ - d omit debugging directives\n\ - h include high-level source\n\ - l include assembly\n\ - m include macro expansions\n\ - n omit forms processing\n\ - s include symbols\n\ - L include line debug statistics (if applicable)\n\ - =FILE list to FILE (must be last sub-option)\n")); - - fprintf (stream, _("\ - -D produce assembler debugging messages\n")); - fprintf (stream, _("\ - --defsym SYM=VAL define symbol SYM to given value\n")); -#ifdef USE_EMULATIONS - { - int i; - char *def_em; - - fprintf (stream, "\ - --em=["); - for (i = 0; i < n_emulations-1; i++) - fprintf (stream, "%s | ", emulations[i]->name); - fprintf (stream, "%s]\n", emulations[i]->name); - - def_em = getenv (EMULATION_ENVIRON); - if (!def_em) - def_em = DEFAULT_EMULATION; - fprintf (stream, _("\ - emulate output (default %s)\n"), def_em); - } -#endif - fprintf (stream, _("\ - -f skip whitespace and comment preprocessing\n")); - fprintf (stream, _("\ - --gstabs generate stabs debugging information\n")); - fprintf (stream, _("\ - --gdwarf2 generate DWARF2 debugging information\n")); - fprintf (stream, _("\ - --help show this message and exit\n")); - fprintf (stream, _("\ - -I DIR add DIR to search list for .include directives\n")); - fprintf (stream, _("\ - -J don't warn about signed overflow\n")); - fprintf (stream, _("\ - -K warn when differences altered for long displacements\n")); - fprintf (stream, _("\ - -L,--keep-locals keep local symbols (e.g. starting with `L')\n")); - fprintf (stream, _("\ - -M,--mri assemble in MRI compatibility mode\n")); - fprintf (stream, _("\ - --MD FILE write dependency information in FILE (default none)\n")); - fprintf (stream, _("\ - -nocpp ignored\n")); - fprintf (stream, _("\ - -o OBJFILE name the object-file output OBJFILE (default a.out)\n")); - fprintf (stream, _("\ - -R fold data section into text section\n")); - fprintf (stream, _("\ - --statistics print various measured statistics from execution\n")); - fprintf (stream, _("\ - --strip-local-absolute strip local absolute symbols\n")); - fprintf (stream, _("\ - --traditional-format Use same format as native assembler when possible\n")); - fprintf (stream, _("\ - --version print assembler version number and exit\n")); - fprintf (stream, _("\ - -W --no-warn suppress warnings\n")); - fprintf (stream, _("\ - --warn don't suppress warnings\n")); - fprintf (stream, _("\ - --fatal-warnings treat warnings as errors\n")); - fprintf (stream, _("\ - --itbl INSTTBL extend instruction set to include instructions\n\ - matching the specifications defined in file INSTTBL\n")); - fprintf (stream, _("\ - -w ignored\n")); - fprintf (stream, _("\ - -X ignored\n")); - fprintf (stream, _("\ - -Z generate object file even after errors\n")); - fprintf (stream, _("\ - --listing-lhs-width set the width in words of the output data column of\n\ - the listing\n")); - fprintf (stream, _("\ - --listing-lhs-width2 set the width in words of the continuation lines\n\ - of the output data column; ignored if smaller than\n\ - the width of the first line\n")); - fprintf (stream, _("\ - --listing-rhs-width set the max width in characters of the lines from\n\ - the source file\n")); - fprintf (stream, _("\ - --listing-cont-lines set the maximum number of continuation lines used\n\ - for the output data column of the listing\n")); - - md_show_usage (stream); - - fputc ('\n', stream); - fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); -} - -/* - * Since it is easy to do here we interpret the special arg "-" - * to mean "use stdin" and we set that argv[] pointing to "". - * After we have munged argv[], the only things left are source file - * name(s) and ""(s) denoting stdin. These file names are used - * (perhaps more than once) later. - * - * check for new machine-dep cmdline options in - * md_parse_option definitions in config/tc-*.c - */ - -static void -parse_args (pargc, pargv) - int *pargc; - char ***pargv; -{ - int old_argc, new_argc; - char **old_argv, **new_argv; - - /* Starting the short option string with '-' is for programs that - expect options and other ARGV-elements in any order and that care about - the ordering of the two. We describe each non-option ARGV-element - as if it were the argument of an option with character code 1. */ - - char *shortopts; - extern CONST char *md_shortopts; - static const char std_shortopts[] = - { - '-', 'J', -#ifndef WORKING_DOT_WORD - /* -K is not meaningful if .word is not being hacked. */ - 'K', -#endif - 'L', 'M', 'R', 'W', 'Z', 'f', 'a', ':', ':', 'D', 'I', ':', 'o', ':', -#ifndef VMS - /* -v takes an argument on VMS, so we don't make it a generic - option. */ - 'v', -#endif - 'w', 'X', - /* New option for extending instruction set (see also --itbl below) */ - 't', ':', - '\0' - }; - struct option *longopts; - extern struct option md_longopts[]; - extern size_t md_longopts_size; - static const struct option std_longopts[] = { -#define OPTION_HELP (OPTION_STD_BASE) - {"help", no_argument, NULL, OPTION_HELP}, - {"keep-locals", no_argument, NULL, 'L'}, - {"mri", no_argument, NULL, 'M'}, -#define OPTION_NOCPP (OPTION_STD_BASE + 1) - {"nocpp", no_argument, NULL, OPTION_NOCPP}, -#define OPTION_STATISTICS (OPTION_STD_BASE + 2) - {"statistics", no_argument, NULL, OPTION_STATISTICS}, -#define OPTION_VERSION (OPTION_STD_BASE + 3) - {"version", no_argument, NULL, OPTION_VERSION}, -#define OPTION_DUMPCONFIG (OPTION_STD_BASE + 4) - {"dump-config", no_argument, NULL, OPTION_DUMPCONFIG}, -#define OPTION_VERBOSE (OPTION_STD_BASE + 5) - {"verbose", no_argument, NULL, OPTION_VERBOSE}, -#define OPTION_EMULATION (OPTION_STD_BASE + 6) - {"emulation", required_argument, NULL, OPTION_EMULATION}, -#define OPTION_DEFSYM (OPTION_STD_BASE + 7) - {"defsym", required_argument, NULL, OPTION_DEFSYM}, -#define OPTION_INSTTBL (OPTION_STD_BASE + 8) - /* New option for extending instruction set (see also -t above). - The "-t file" or "--itbl file" option extends the basic set of - valid instructions by reading "file", a text file containing a - list of instruction formats. The additional opcodes and their - formats are added to the built-in set of instructions, and - mnemonics for new registers may also be defined. */ - {"itbl", required_argument, NULL, OPTION_INSTTBL}, -#define OPTION_LISTING_LHS_WIDTH (OPTION_STD_BASE + 9) - {"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH}, -#define OPTION_LISTING_LHS_WIDTH2 (OPTION_STD_BASE + 10) - {"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH2}, -#define OPTION_LISTING_RHS_WIDTH (OPTION_STD_BASE + 11) - {"listing-rhs-width", required_argument, NULL, OPTION_LISTING_RHS_WIDTH}, -#define OPTION_LISTING_CONT_LINES (OPTION_STD_BASE + 12) - {"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES}, -#define OPTION_DEPFILE (OPTION_STD_BASE + 13) - {"MD", required_argument, NULL, OPTION_DEPFILE}, -#define OPTION_GSTABS (OPTION_STD_BASE + 14) - {"gstabs", no_argument, NULL, OPTION_GSTABS}, -#define OPTION_STRIP_LOCAL_ABSOLUTE (OPTION_STD_BASE + 15) - {"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE}, -#define OPTION_TRADITIONAL_FORMAT (OPTION_STD_BASE + 16) - {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT}, -#define OPTION_GDWARF2 (OPTION_STD_BASE + 17) - {"gdwarf2", no_argument, NULL, OPTION_GDWARF2}, - {"no-warn", no_argument, NULL, 'W'}, -#define OPTION_WARN (OPTION_STD_BASE + 18) - {"warn", no_argument, NULL, OPTION_WARN}, -#define OPTION_WARN_FATAL (OPTION_STD_BASE + 19) - {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL} - }; - - /* Construct the option lists from the standard list and the - target dependent list. */ - shortopts = concat (std_shortopts, md_shortopts, (char *) NULL); - longopts = (struct option *) xmalloc (sizeof (std_longopts) + md_longopts_size); - memcpy (longopts, std_longopts, sizeof (std_longopts)); - memcpy ((char *) longopts + sizeof (std_longopts), - md_longopts, md_longopts_size); - - /* Make a local copy of the old argv. */ - old_argc = *pargc; - old_argv = *pargv; - - /* Initialize a new argv that contains no options. */ - new_argv = (char **) xmalloc (sizeof (char *) * (old_argc + 1)); - new_argv[0] = old_argv[0]; - new_argc = 1; - new_argv[new_argc] = NULL; - - while (1) - { - /* getopt_long_only is like getopt_long, but '-' as well as '--' can - indicate a long option. */ - int longind; - int optc = getopt_long_only (old_argc, old_argv, shortopts, longopts, - &longind); - - if (optc == -1) - break; - - switch (optc) - { - default: - /* md_parse_option should return 1 if it recognizes optc, - 0 if not. */ - if (md_parse_option (optc, optarg) != 0) - break; - /* `-v' isn't included in the general short_opts list, so check for - it explicity here before deciding we've gotten a bad argument. */ - if (optc == 'v') - { -#ifdef VMS - /* Telling getopt to treat -v's value as optional can result - in it picking up a following filename argument here. The - VMS code in md_parse_option can return 0 in that case, - but it has no way of pushing the filename argument back. */ - if (optarg && *optarg) - new_argv[new_argc++] = optarg, new_argv[new_argc] = NULL; - else -#else - case 'v': -#endif - case OPTION_VERBOSE: - print_version_id (); - break; - } - /*FALLTHRU*/ - - case '?': - exit (EXIT_FAILURE); - - case 1: /* File name. */ - if (!strcmp (optarg, "-")) - optarg = ""; - new_argv[new_argc++] = optarg; - new_argv[new_argc] = NULL; - break; - - case OPTION_HELP: - show_usage (stdout); - exit (EXIT_SUCCESS); - - case OPTION_NOCPP: - break; - - case OPTION_STATISTICS: - flag_print_statistics = 1; - break; - - case OPTION_STRIP_LOCAL_ABSOLUTE: - flag_strip_local_absolute = 1; - break; - - case OPTION_TRADITIONAL_FORMAT: - flag_traditional_format = 1; - break; - - case OPTION_VERSION: - /* This output is intended to follow the GNU standards document. */ - printf (_("GNU assembler %s\n"), VERSION); - printf (_("Copyright 1997 Free Software Foundation, Inc.\n")); - printf (_("\ -This program is free software; you may redistribute it under the terms of\n\ -the GNU General Public License. This program has absolutely no warranty.\n")); - printf (_("This assembler was configured for a target of `%s'.\n"), - TARGET_ALIAS); - exit (EXIT_SUCCESS); - - case OPTION_EMULATION: -#ifdef USE_EMULATIONS - if (strcmp (optarg, this_emulation->name)) - as_fatal (_("multiple emulation names specified")); -#else - as_fatal (_("emulations not handled in this configuration")); -#endif - break; - - case OPTION_DUMPCONFIG: - fprintf (stderr, _("alias = %s\n"), TARGET_ALIAS); - fprintf (stderr, _("canonical = %s\n"), TARGET_CANONICAL); - fprintf (stderr, _("cpu-type = %s\n"), TARGET_CPU); -#ifdef TARGET_OBJ_FORMAT - fprintf (stderr, _("format = %s\n"), TARGET_OBJ_FORMAT); -#endif -#ifdef TARGET_FORMAT - fprintf (stderr, _("bfd-target = %s\n"), TARGET_FORMAT); -#endif - exit (EXIT_SUCCESS); - - case OPTION_DEFSYM: - { - char *s; - long i; - struct defsym_list *n; - - for (s = optarg; *s != '\0' && *s != '='; s++) - ; - if (*s == '\0') - as_fatal (_("bad defsym; format is --defsym name=value")); - *s++ = '\0'; - i = strtol (s, (char **) NULL, 0); - n = (struct defsym_list *) xmalloc (sizeof *n); - n->next = defsyms; - n->name = optarg; - n->value = i; - defsyms = n; - } - break; - - case OPTION_INSTTBL: - case 't': - { - /* optarg is the name of the file containing the instruction - formats, opcodes, register names, etc. */ - struct itbl_file_list *n; - - if (optarg == NULL) - { - as_warn ( _("No file name following -t option\n") ); - break; - } - - n = (struct itbl_file_list *) xmalloc (sizeof *n); - n->next = itbl_files; - n->name = optarg; - itbl_files = n; - - /* Parse the file and add the new instructions to our internal - table. If multiple instruction tables are specified, the - information from this table gets appended onto the existing - internal table. */ - itbl_files->name = xstrdup (optarg); - if (itbl_parse (itbl_files->name) != 0) - { - fprintf (stderr, _("Failed to read instruction table %s\n"), - itbl_files->name); - exit (EXIT_SUCCESS); - } - } - break; - - case OPTION_DEPFILE: - start_dependencies (optarg); - break; - - case OPTION_GSTABS: - debug_type = DEBUG_STABS; - break; - - case OPTION_GDWARF2: - debug_type = DEBUG_DWARF2; - break; - - case 'J': - flag_signed_overflow_ok = 1; - break; - -#ifndef WORKING_DOT_WORD - case 'K': - flag_warn_displacement = 1; - break; -#endif - - case 'L': - flag_keep_locals = 1; - break; - - case OPTION_LISTING_LHS_WIDTH: - listing_lhs_width = atoi(optarg); - if (listing_lhs_width_second < listing_lhs_width) - listing_lhs_width_second = listing_lhs_width; - break; - case OPTION_LISTING_LHS_WIDTH2: - { - int tmp = atoi(optarg); - if (tmp > listing_lhs_width) - listing_lhs_width_second = tmp; - } - break; - case OPTION_LISTING_RHS_WIDTH: - listing_rhs_width = atoi(optarg); - break; - case OPTION_LISTING_CONT_LINES: - listing_lhs_cont_lines = atoi(optarg); - break; - - case 'M': - flag_mri = 1; -#ifdef TC_M68K - flag_m68k_mri = 1; -#endif - break; - - case 'R': - flag_readonly_data_in_text = 1; - break; - - case 'W': - flag_no_warnings = 1; - break; - - case OPTION_WARN: - flag_no_warnings = 0; - flag_fatal_warnings = 0; - break; - - case OPTION_WARN_FATAL: - flag_no_warnings = 0; - flag_fatal_warnings = 1; - break; - - case 'Z': - flag_always_generate_output = 1; - break; - - case 'a': - if (optarg) - { - while (*optarg) - { - switch (*optarg) - { - case 'c': - listing |= LISTING_NOCOND; - break; - case 'd': - listing |= LISTING_NODEBUG; - break; - case 'h': - listing |= LISTING_HLL; - break; - case 'l': - listing |= LISTING_LISTING; - break; - case 'm': - listing |= LISTING_MACEXP; - break; - case 'n': - listing |= LISTING_NOFORM; - break; - case 's': - listing |= LISTING_SYMBOLS; - break; - case '=': - listing_filename = xstrdup (optarg + 1); - optarg += strlen (listing_filename); - break; - default: - as_fatal (_("invalid listing option `%c'"), *optarg); - break; - } - optarg++; - } - } - if (!listing) - listing = LISTING_DEFAULT; - break; - - case 'D': - /* DEBUG is implemented: it debugs different */ - /* things from other people's assemblers. */ - flag_debug = 1; - break; - - case 'f': - flag_no_comments = 1; - break; - - case 'I': - { /* Include file directory */ - char *temp = xstrdup (optarg); - add_include_dir (temp); - break; - } - - case 'o': - out_file_name = xstrdup (optarg); - break; - - case 'w': - break; - - case 'X': - /* -X means treat warnings as errors */ - break; - } - } - - free (shortopts); - free (longopts); - - *pargc = new_argc; - *pargv = new_argv; -} - -static long start_time; - -int -main (argc, argv) - int argc; - char **argv; -{ - int macro_alternate; - int macro_strip_at; - int keep_it; - - start_time = get_run_time (); - -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - if (debug_memory) - { -#ifdef BFD_ASSEMBLER - extern long _bfd_chunksize; - _bfd_chunksize = 64; -#endif - chunksize = 64; - } - -#ifdef HOST_SPECIAL_INIT - HOST_SPECIAL_INIT (argc, argv); -#endif - - myname = argv[0]; - xmalloc_set_program_name (myname); - - START_PROGRESS (myname, 0); - -#ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME -#define OBJ_DEFAULT_OUTPUT_FILE_NAME "a.out" -#endif - - out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME; - - hex_init (); -#ifdef BFD_ASSEMBLER - bfd_init (); - bfd_set_error_program_name (myname); -#endif - -#ifdef USE_EMULATIONS - select_emulation_mode (argc, argv); -#endif - - PROGRESS (1); - symbol_begin (); - frag_init (); - subsegs_begin (); - parse_args (&argc, &argv); - read_begin (); - input_scrub_begin (); - expr_begin (); - - if (flag_print_statistics) - xatexit (dump_statistics); - - macro_alternate = 0; - macro_strip_at = 0; -#ifdef TC_I960 - macro_strip_at = flag_mri; -#endif -#ifdef TC_A29K - /* For compatibility with the AMD 29K family macro assembler - specification. */ - macro_alternate = 1; - macro_strip_at = 1; -#endif - - macro_init (macro_alternate, flag_mri, macro_strip_at, macro_expr); - - PROGRESS (1); - -#ifdef BFD_ASSEMBLER - output_file_create (out_file_name); - assert (stdoutput != 0); -#endif - -#ifdef tc_init_after_args - tc_init_after_args (); -#endif - - itbl_init (); - - /* Now that we have fully initialized, and have created the output - file, define any symbols requested by --defsym command line - arguments. */ - while (defsyms != NULL) - { - symbolS *sym; - struct defsym_list *next; - - sym = symbol_new (defsyms->name, absolute_section, defsyms->value, - &zero_address_frag); - symbol_table_insert (sym); - next = defsyms->next; - free (defsyms); - defsyms = next; - } - - PROGRESS (1); - - perform_an_assembly_pass (argc, argv); /* Assemble it. */ - - cond_finish_check (-1); - -#ifdef md_end - md_end (); -#endif - - if (seen_at_least_1_file () - && (flag_always_generate_output || had_errors () == 0)) - keep_it = 1; - else - keep_it = 0; - -#if defined (BFD_ASSEMBLER) || !defined (BFD) - /* This used to be done at the start of write_object_file in - write.c, but that caused problems when doing listings when - keep_it was zero. This could probably be moved above md_end, but - I didn't want to risk the change. */ - subsegs_finish (); -#endif - - if (keep_it) - write_object_file (); - -#ifndef NO_LISTING - listing_print (listing_filename); -#endif - -#ifndef OBJ_VMS /* does its own file handling */ -#ifndef BFD_ASSEMBLER - if (keep_it) -#endif - output_file_close (out_file_name); -#endif - - if (flag_fatal_warnings && had_warnings() > 0 && had_errors () == 0) - as_bad (_("%d warnings, treating warnings as errors"), had_warnings()); - - if (had_errors () > 0 && ! flag_always_generate_output) - keep_it = 0; - - if (!keep_it) - unlink (out_file_name); - - input_scrub_end (); - - END_PROGRESS (myname); - - /* Use xexit instead of return, because under VMS environments they - may not place the same interpretation on the value given. */ - if (had_errors () > 0) - xexit (EXIT_FAILURE); - - /* Only generate dependency file if assembler was successful. */ - print_dependencies (); - - xexit (EXIT_SUCCESS); -} - -static void -dump_statistics () -{ -#ifdef HAVE_SBRK - char *lim = (char *) sbrk (0); -#endif - long run_time = get_run_time () - start_time; - - fprintf (stderr, _("%s: total time in assembly: %ld.%06ld\n"), - myname, run_time / 1000000, run_time % 1000000); -#ifdef HAVE_SBRK - fprintf (stderr, _("%s: data size %ld\n"), - myname, (long) (lim - (char *) &environ)); -#endif - - subsegs_print_statistics (stderr); - write_print_statistics (stderr); - symbol_print_statistics (stderr); - read_print_statistics (stderr); - -#ifdef tc_print_statistics - tc_print_statistics (stderr); -#endif -#ifdef obj_print_statistics - obj_print_statistics (stderr); -#endif -} - - -/* perform_an_assembly_pass() - * - * Here to attempt 1 pass over each input file. - * We scan argv[*] looking for filenames or exactly "" which is - * shorthand for stdin. Any argv that is NULL is not a file-name. - * We set need_pass_2 TRUE if, after this, we still have unresolved - * expressions of the form (unknown value)+-(unknown value). - * - * Note the un*x semantics: there is only 1 logical input file, but it - * may be a catenation of many 'physical' input files. - */ -static void -perform_an_assembly_pass (argc, argv) - int argc; - char **argv; -{ - int saw_a_file = 0; -#ifdef BFD_ASSEMBLER - flagword applicable; -#endif - - need_pass_2 = 0; - -#ifndef BFD_ASSEMBLER -#ifdef MANY_SEGMENTS - { - unsigned int i; - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - segment_info[i].fix_root = 0; - } - /* Create the three fixed ones */ - { - segT seg; - -#ifdef TE_APOLLO - seg = subseg_new (".wtext", 0); -#else - seg = subseg_new (".text", 0); -#endif - assert (seg == SEG_E0); - seg = subseg_new (".data", 0); - assert (seg == SEG_E1); - seg = subseg_new (".bss", 0); - assert (seg == SEG_E2); -#ifdef TE_APOLLO - create_target_segments (); -#endif - } - -#else /* not MANY_SEGMENTS */ - text_fix_root = NULL; - data_fix_root = NULL; - bss_fix_root = NULL; -#endif /* not MANY_SEGMENTS */ -#else /* BFD_ASSEMBLER */ - /* Create the standard sections, and those the assembler uses - internally. */ - text_section = subseg_new (TEXT_SECTION_NAME, 0); - data_section = subseg_new (DATA_SECTION_NAME, 0); - bss_section = subseg_new (BSS_SECTION_NAME, 0); - /* @@ FIXME -- we're setting the RELOC flag so that sections are assumed - to have relocs, otherwise we don't find out in time. */ - applicable = bfd_applicable_section_flags (stdoutput); - bfd_set_section_flags (stdoutput, text_section, - applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC - | SEC_CODE | SEC_READONLY)); - bfd_set_section_flags (stdoutput, data_section, - applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC - | SEC_DATA)); - bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC); - seg_info (bss_section)->bss = 1; - subseg_new (BFD_ABS_SECTION_NAME, 0); - subseg_new (BFD_UND_SECTION_NAME, 0); - reg_section = subseg_new ("*GAS `reg' section*", 0); - expr_section = subseg_new ("*GAS `expr' section*", 0); - -#endif /* BFD_ASSEMBLER */ - - subseg_set (text_section, 0); - - /* This may add symbol table entries, which requires having an open BFD, - and sections already created, in BFD_ASSEMBLER mode. */ - md_begin (); - -#ifdef obj_begin - obj_begin (); -#endif - - argv++; /* skip argv[0] */ - argc--; /* skip argv[0] */ - while (argc--) - { - if (*argv) - { /* Is it a file-name argument? */ - PROGRESS (1); - saw_a_file++; - /* argv->"" if stdin desired, else->filename */ - read_a_source_file (*argv); - } - argv++; /* completed that argv */ - } - if (!saw_a_file) - read_a_source_file (""); -} /* perform_an_assembly_pass() */ - -/* The interface between the macro code and gas expression handling. */ - -static int -macro_expr (emsg, idx, in, val) - const char *emsg; - int idx; - sb *in; - int *val; -{ - char *hold; - expressionS ex; - - sb_terminate (in); - - hold = input_line_pointer; - input_line_pointer = in->ptr + idx; - expression (&ex); - idx = input_line_pointer - in->ptr; - input_line_pointer = hold; - - if (ex.X_op != O_constant) - as_bad ("%s", emsg); - - *val = (int) ex.X_add_number; - - return idx; -} - -/* end of as.c */ diff --git a/gas/as.h b/gas/as.h deleted file mode 100644 index 2106b339ab1..00000000000 --- a/gas/as.h +++ /dev/null @@ -1,677 +0,0 @@ -/* as.h - global header file - Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef GAS -#define GAS 1 -/* - * I think this stuff is largely out of date. xoxorich. - * - * CAPITALISED names are #defined. - * "lowercaseH" is #defined if "lowercase.h" has been #include-d. - * "lowercaseT" is a typedef of "lowercase" objects. - * "lowercaseP" is type "pointer to object of type 'lowercase'". - * "lowercaseS" is typedef struct ... lowercaseS. - * - * #define DEBUG to enable all the "know" assertion tests. - * #define SUSPECT when debugging hash code. - * #define COMMON as "extern" for all modules except one, where you #define - * COMMON as "". - * If TEST is #defined, then we are testing a module: #define COMMON as "". - */ - -#include "config.h" -#include "bin-bugs.h" - -/* This is the code recommended in the autoconf documentation, almost - verbatim. If it doesn't work for you, let me know, and notify - djm@gnu.ai.mit.edu as well. */ -/* Added #undef for DJ Delorie. The right fix is to ensure that as.h - is included first, before even any system header files, in all files - that use it. KR 1994.11.03 */ -/* Added void* version for STDC case. This is to be compatible with - the declaration in bison.simple, used for m68k operand parsing. - --KR 1995.08.08 */ -/* Force void* decl for hpux. This is what Bison uses. --KR 1995.08.16 */ - -/* AIX requires this to be the first thing in the file. */ -#ifdef __GNUC__ -# ifndef alloca -# ifdef __STDC__ -extern void *alloca (); -# else -extern char *alloca (); -# endif -# endif -#else -# if HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -# if !defined (__STDC__) && !defined (__hpux) -extern char *alloca (); -# else -extern void *alloca (); -# endif /* __STDC__, __hpux */ -# endif /* alloca */ -# endif /* _AIX */ -# endif /* HAVE_ALLOCA_H */ -#endif - -/* Now, tend to the rest of the configuration. */ - -/* System include files first... */ -#include -#include -#ifdef HAVE_STRING_H -#include -#else -#ifdef HAVE_STRINGS_H -#include -#endif -#endif -#ifdef HAVE_STDLIB_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_SYS_TYPES_H -/* for size_t, pid_t */ -#include -#endif - -#include -/* The first getopt value for machine-independent long options. - 150 isn't special; it's just an arbitrary non-ASCII char value. */ -#define OPTION_STD_BASE 150 -/* The first getopt value for machine-dependent long options. - 170 gives the standard options room to grow. */ -#define OPTION_MD_BASE 170 - -#ifdef DEBUG -#undef NDEBUG -#endif -#if !defined (__GNUC__) || __GNUC_MINOR__ <= 5 -#define __PRETTY_FUNCTION__ ((char*)0) -#endif -#if 0 - -/* Handle lossage with assert.h. */ -#ifndef BROKEN_ASSERT -#include -#else /* BROKEN_ASSERT */ -#ifndef NDEBUG -#define assert(p) ((p) ? 0 : (as_assert (__FILE__, __LINE__, __PRETTY_FUNCTION__), 0)) -#else -#define assert(p) ((p), 0) -#endif -#endif /* BROKEN_ASSERT */ - -#else - -#define assert(P) ((P) ? 0 : (as_assert (__FILE__, __LINE__, __PRETTY_FUNCTION__), 0)) -#undef abort -#define abort() as_abort (__FILE__, __LINE__, __PRETTY_FUNCTION__) - -#endif - - -/* Now GNU header files... */ -#include -#ifdef BFD_ASSEMBLER -#include -#endif -#include - -/* Define the standard progress macros. */ -#include - -/* This doesn't get taken care of anywhere. */ -#ifndef __MWERKS__ /* Metrowerks C chokes on the "defined (inline)" */ -#if !defined (__GNUC__) && !defined (inline) -#define inline -#endif -#endif /* !__MWERKS__ */ - -/* Other stuff from config.h. */ -#ifdef NEED_DECLARATION_STRSTR -extern char *strstr (); -#endif -#ifdef NEED_DECLARATION_MALLOC -extern PTR malloc (); -extern PTR realloc (); -#endif -#ifdef NEED_DECLARATION_FREE -extern void free (); -#endif -#ifdef NEED_DECLARATION_ERRNO -extern int errno; -#endif -#ifdef NEED_DECLARATION_ENVIRON -extern char **environ; -#endif - -/* This is needed for VMS. */ -#if ! defined (HAVE_UNLINK) && defined (HAVE_REMOVE) -#define unlink remove -#endif - -/* Hack to make "gcc -Wall" not complain about obstack macros. */ -#if !defined (memcpy) && !defined (bcopy) -#define bcopy(src,dest,size) memcpy(dest,src,size) -#endif - -/* Make Saber happier on obstack.h. */ -#ifdef SABER -#undef __PTR_TO_INT -#define __PTR_TO_INT(P) ((int)(P)) -#undef __INT_TO_PTR -#define __INT_TO_PTR(P) ((char *)(P)) -#endif - -#ifndef __LINE__ -#define __LINE__ "unknown" -#endif /* __LINE__ */ - -#ifndef __FILE__ -#define __FILE__ "unknown" -#endif /* __FILE__ */ - -#ifndef FOPEN_WB -#ifdef GO32 -#include "fopen-bin.h" -#else -#include "fopen-same.h" -#endif -#endif - -#ifndef EXIT_SUCCESS -#define EXIT_SUCCESS 0 -#define EXIT_FAILURE 1 -#endif - -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free xfree - -#define xfree free - -#include "asintl.h" - -#define BAD_CASE(val) \ -{ \ - as_fatal(_("Case value %ld unexpected at line %d of file \"%s\"\n"), \ - (long) val, __LINE__, __FILE__); \ - } - -#include "flonum.h" - -/* These are assembler-wide concepts */ - -#ifdef BFD_ASSEMBLER -extern bfd *stdoutput; -typedef bfd_vma addressT; -typedef bfd_signed_vma offsetT; -#else -typedef unsigned long addressT; -typedef long offsetT; -#endif - -/* Type of symbol value, etc. For use in prototypes. */ -typedef addressT valueT; - -#ifndef COMMON -#ifdef TEST -#define COMMON /* declare our COMMONs storage here. */ -#else -#define COMMON extern /* our commons live elswhere */ -#endif -#endif -/* COMMON now defined */ - -#ifdef DEBUG -#ifndef know -#define know(p) assert(p) /* Verify our assumptions! */ -#endif /* not yet defined */ -#else -#define know(p) /* know() checks are no-op.ed */ -#endif - -/* input_scrub.c */ - -/* - * Supplies sanitised buffers to read.c. - * Also understands printing line-number part of error messages. - */ - - -/* subsegs.c Sub-segments. Also, segment(=expression type)s.*/ - -#ifndef BFD_ASSEMBLER - -#ifdef MANY_SEGMENTS -#include "bfd.h" -#define N_SEGMENTS 40 -#define SEG_NORMAL(x) ((x) >= SEG_E0 && (x) <= SEG_E39) -#define SEG_LIST SEG_E0,SEG_E1,SEG_E2,SEG_E3,SEG_E4,SEG_E5,SEG_E6,SEG_E7,SEG_E8,SEG_E9,\ - SEG_E10,SEG_E11,SEG_E12,SEG_E13,SEG_E14,SEG_E15,SEG_E16,SEG_E17,SEG_E18,SEG_E19,\ - SEG_E20,SEG_E21,SEG_E22,SEG_E23,SEG_E24,SEG_E25,SEG_E26,SEG_E27,SEG_E28,SEG_E29,\ - SEG_E30,SEG_E31,SEG_E32,SEG_E33,SEG_E34,SEG_E35,SEG_E36,SEG_E37,SEG_E38,SEG_E39 -#define SEG_TEXT SEG_E0 -#define SEG_DATA SEG_E1 -#define SEG_BSS SEG_E2 -#define SEG_LAST SEG_E39 -#else -#define N_SEGMENTS 3 -#define SEG_NORMAL(x) ((x) == SEG_TEXT || (x) == SEG_DATA || (x) == SEG_BSS) -#define SEG_LIST SEG_TEXT,SEG_DATA,SEG_BSS -#endif - -typedef enum _segT - { - SEG_ABSOLUTE = 0, - SEG_LIST, - SEG_UNKNOWN, - SEG_GOOF, /* Only happens if AS has a logic error. */ - /* Invented so we don't crash printing */ - /* error message involving weird segment. */ - SEG_EXPR, /* Intermediate expression values. */ - SEG_DEBUG, /* Debug segment */ - SEG_NTV, /* Transfert vector preload segment */ - SEG_PTV, /* Transfert vector postload segment */ - SEG_REGISTER /* Mythical: a register-valued expression */ - } segT; - -#define SEG_MAXIMUM_ORDINAL (SEG_REGISTER) -#else -typedef asection *segT; -#define SEG_NORMAL(SEG) ((SEG) != absolute_section \ - && (SEG) != undefined_section \ - && (SEG) != reg_section \ - && (SEG) != expr_section) -#endif -typedef int subsegT; - -/* What subseg we are accreting now? */ -COMMON subsegT now_subseg; - -/* Segment our instructions emit to. */ -COMMON segT now_seg; - -#ifdef BFD_ASSEMBLER -#define segment_name(SEG) bfd_get_section_name (stdoutput, SEG) -#else -extern char const *const seg_name[]; -#define segment_name(SEG) seg_name[(int) (SEG)] -#endif - -#ifndef BFD_ASSEMBLER -extern int section_alignment[]; -#endif - -#ifdef BFD_ASSEMBLER -extern segT reg_section, expr_section; -/* Shouldn't these be eliminated someday? */ -extern segT text_section, data_section, bss_section; -#define absolute_section bfd_abs_section_ptr -#define undefined_section bfd_und_section_ptr -#else -#define reg_section SEG_REGISTER -#define expr_section SEG_EXPR -#define text_section SEG_TEXT -#define data_section SEG_DATA -#define bss_section SEG_BSS -#define absolute_section SEG_ABSOLUTE -#define undefined_section SEG_UNKNOWN -#endif - -/* relax() */ - -enum _relax_state - { - /* Variable chars to be repeated fr_offset times. - Fr_symbol unused. Used with fr_offset == 0 for a - constant length frag. */ - rs_fill = 1, - - /* Align. The fr_offset field holds the power of 2 to which to - align. The fr_var field holds the number of characters in the - fill pattern. The fr_subtype field holds the maximum number of - bytes to skip when aligning, or 0 if there is no maximum. */ - rs_align, - - /* Align code. The fr_offset field holds the power of 2 to which - to align. This type is only generated by machine specific - code, which is normally responsible for handling the fill - pattern. The fr_subtype field holds the maximum number of - bytes to skip when aligning, or 0 if there is no maximum. */ - rs_align_code, - - /* Org: Fr_offset, fr_symbol: address. 1 variable char: fill - character. */ - rs_org, - -#ifndef WORKING_DOT_WORD - /* JF: gunpoint */ - rs_broken_word, -#endif - - /* machine-specific relaxable (or similarly alterable) instruction */ - rs_machine_dependent, - - /* .space directive with expression operand that needs to be computed - later. Similar to rs_org, but different. - fr_symbol: operand - 1 variable char: fill character */ - rs_space, - - /* A DWARF leb128 value; only ELF uses this. The subtype is 0 for - unsigned, 1 for signed. */ - rs_leb128, - - /* Exception frame information which we may be able to optimize. */ - rs_cfa - }; - -typedef enum _relax_state relax_stateT; - -/* This type is used in prototypes, so it can't be a type that will be - widened for argument passing. */ -typedef unsigned int relax_substateT; - -/* Enough bits for address, but still an integer type. - Could be a problem, cross-assembling for 64-bit machines. */ -typedef addressT relax_addressT; - -/* main program "as.c" (command arguments etc) */ - -COMMON unsigned char flag_no_comments; /* -f */ -COMMON unsigned char flag_debug; /* -D */ -COMMON unsigned char flag_signed_overflow_ok; /* -J */ -#ifndef WORKING_DOT_WORD -COMMON unsigned char flag_warn_displacement; /* -K */ -#endif - -/* True if local symbols should be retained. */ -COMMON int flag_keep_locals; /* -L */ - -/* True if we are assembling in MRI mode. */ -COMMON int flag_mri; - -/* Should the data section be made read-only and appended to the text - section? */ -COMMON unsigned char flag_readonly_data_in_text; /* -R */ - -/* True if warnings should be inhibited. */ -COMMON int flag_no_warnings; /* -W */ - -/* True if warnings count as errors. */ -COMMON int flag_fatal_warnings; /* --fatal-warnings */ - -/* True if we should attempt to generate output even if non-fatal errors - are detected. */ -COMMON unsigned char flag_always_generate_output; /* -Z */ - -/* This is true if the assembler should output time and space usage. */ -COMMON unsigned char flag_print_statistics; - -/* True if local absolute symbols are to be stripped. */ -COMMON int flag_strip_local_absolute; - -/* True if we should generate a traditional format object file. */ -COMMON int flag_traditional_format; - -/* name of emitted object file */ -COMMON char *out_file_name; - -/* name of file defining extensions to the basic instruction set */ -COMMON char *insttbl_file_name; - -/* TRUE if we need a second pass. */ -COMMON int need_pass_2; - -/* TRUE if we should do no relaxing, and - leave lots of padding. */ -COMMON int linkrelax; - -/* TRUE if we should produce a listing. */ -extern int listing; - -/* Type of debugging information we should generate. We currently - support stabs, ECOFF, and DWARF2. */ - -enum debug_info_type - { - DEBUG_UNSPECIFIED, - DEBUG_NONE, - DEBUG_STABS, - DEBUG_ECOFF, - DEBUG_DWARF, - DEBUG_DWARF2 - }; - -extern enum debug_info_type debug_type; - -/* Maximum level of macro nesting. */ -extern int max_macro_nest; - -/* Obstack chunk size. Keep large for efficient space use, make small to - increase malloc calls for monitoring memory allocation. */ -extern int chunksize; - -struct _pseudo_type - { - /* assembler mnemonic, lower case, no '.' */ - const char *poc_name; - /* Do the work */ - void (*poc_handler) PARAMS ((int)); - /* Value to pass to handler */ - int poc_val; - }; - -typedef struct _pseudo_type pseudo_typeS; - -/* Prefer varargs for non-ANSI compiler, since some will barf if the - ellipsis definition is used with a no-arguments declaration. */ -#if defined (HAVE_VARARGS_H) && !defined (__STDC__) -#undef HAVE_STDARG_H -#endif - -#if defined (HAVE_STDARG_H) -#define USE_STDARG -#endif -#if !defined (USE_STDARG) && defined (HAVE_VARARGS_H) -#define USE_VARARGS -#endif - -#ifdef USE_STDARG -#if (__GNUC__ >= 2) && !defined(VMS) -/* for use with -Wformat */ - -#if __GNUC_MINOR__ < 6 -/* Support for double underscores in attribute names was added in gcc - 2.6, so avoid them if we are using an earlier version. */ -#define __printf__ printf -#define __format__ format -#endif - -#define PRINTF_LIKE(FCN) \ - void FCN (const char *format, ...) \ - __attribute__ ((__format__ (__printf__, 1, 2))) -#define PRINTF_WHERE_LIKE(FCN) \ - void FCN (char *file, unsigned int line, const char *format, ...) \ - __attribute__ ((__format__ (__printf__, 3, 4))) - -#else /* __GNUC__ < 2 || defined(VMS) */ - -#define PRINTF_LIKE(FCN) void FCN PARAMS ((const char *format, ...)) -#define PRINTF_WHERE_LIKE(FCN) void FCN PARAMS ((char *file, \ - unsigned int line, \ - const char *format, ...)) - -#endif /* __GNUC__ < 2 || defined(VMS) */ - -#else /* ! USE_STDARG */ - -#define PRINTF_LIKE(FCN) void FCN () -#define PRINTF_WHERE_LIKE(FCN) void FCN () - -#endif /* ! USE_STDARG */ - -PRINTF_LIKE (as_bad); -PRINTF_LIKE (as_fatal); -PRINTF_LIKE (as_tsktsk); -PRINTF_LIKE (as_warn); -PRINTF_WHERE_LIKE (as_bad_where); -PRINTF_WHERE_LIKE (as_warn_where); - -void as_assert PARAMS ((const char *, int, const char *)); -void as_abort PARAMS ((const char *, int, const char *)); - -void fprint_value PARAMS ((FILE *file, addressT value)); -void sprint_value PARAMS ((char *buf, addressT value)); - -int had_errors PARAMS ((void)); -int had_warnings PARAMS ((void)); - -void print_version_id PARAMS ((void)); -char *app_push PARAMS ((void)); -char *atof_ieee PARAMS ((char *str, int what_kind, LITTLENUM_TYPE * words)); -char *input_scrub_include_file PARAMS ((char *filename, char *position)); -extern void input_scrub_insert_line PARAMS((const char *line)); -extern void input_scrub_insert_file PARAMS((char *path)); -char *input_scrub_new_file PARAMS ((char *filename)); -char *input_scrub_next_buffer PARAMS ((char **bufp)); -int do_scrub_chars PARAMS ((int (*get) (char *, int), char *to, int tolen)); -int gen_to_words PARAMS ((LITTLENUM_TYPE * words, int precision, - long exponent_bits)); -int had_err PARAMS ((void)); -int ignore_input PARAMS ((void)); -void cond_finish_check PARAMS ((int)); -void cond_exit_macro PARAMS ((int)); -int seen_at_least_1_file PARAMS ((void)); -void app_pop PARAMS ((char *arg)); -void as_howmuch PARAMS ((FILE * stream)); -void as_perror PARAMS ((const char *gripe, const char *filename)); -void as_where PARAMS ((char **namep, unsigned int *linep)); -void bump_line_counters PARAMS ((void)); -void do_scrub_begin PARAMS ((int)); -void input_scrub_begin PARAMS ((void)); -void input_scrub_close PARAMS ((void)); -void input_scrub_end PARAMS ((void)); -int new_logical_line PARAMS ((char *fname, int line_number)); -void subsegs_begin PARAMS ((void)); -void subseg_change PARAMS ((segT seg, int subseg)); -segT subseg_new PARAMS ((const char *name, subsegT subseg)); -segT subseg_force_new PARAMS ((const char *name, subsegT subseg)); -void subseg_set PARAMS ((segT seg, subsegT subseg)); -#ifdef BFD_ASSEMBLER -segT subseg_get PARAMS ((const char *, int)); -#endif -int subseg_text_p PARAMS ((segT)); - -void start_dependencies PARAMS ((char *)); -void register_dependency PARAMS ((char *)); -void print_dependencies PARAMS ((void)); - -struct expressionS; -struct fix; -typedef struct symbol symbolS; -struct relax_type; -typedef struct frag fragS; - -#ifdef BFD_ASSEMBLER -/* literal.c */ -valueT add_to_literal_pool PARAMS ((symbolS *, valueT, segT, int)); -#endif - -int check_eh_frame PARAMS ((struct expressionS *, unsigned int *)); -int eh_frame_estimate_size_before_relax PARAMS ((fragS *)); -int eh_frame_relax_frag PARAMS ((fragS *)); -void eh_frame_convert_frag PARAMS ((fragS *)); - -#include "expr.h" /* Before targ-*.h */ - -/* this one starts the chain of target dependant headers */ -#include "targ-env.h" - -#include "write.h" -#include "frags.h" -#include "hash.h" -#include "read.h" -#include "symbols.h" - -#include "tc.h" -#include "obj.h" - -#ifdef USE_EMULATIONS -#include "emul.h" -#endif -#include "listing.h" - -#ifdef TC_M68K -/* True if we are assembling in m68k MRI mode. */ -COMMON int flag_m68k_mri; -#else -#define flag_m68k_mri 0 -#endif - -#ifndef NUMBERS_WITH_SUFFIX -#define NUMBERS_WITH_SUFFIX 0 -#endif - -#ifndef LOCAL_LABELS_DOLLAR -#define LOCAL_LABELS_DOLLAR 0 -#endif - -#ifndef LOCAL_LABELS_FB -#define LOCAL_LABELS_FB 0 -#endif - -#ifndef LABELS_WITHOUT_COLONS -#define LABELS_WITHOUT_COLONS 0 -#endif - -#ifndef NO_PSEUDO_DOT -#define NO_PSEUDO_DOT 0 -#endif - -#ifndef TEXT_SECTION_NAME -#define TEXT_SECTION_NAME ".text" -#define DATA_SECTION_NAME ".data" -#define BSS_SECTION_NAME ".bss" -#endif - -#ifndef OCTETS_PER_BYTE_POWER -#define OCTETS_PER_BYTE_POWER 0 -#endif -#ifndef OCTETS_PER_BYTE -#define OCTETS_PER_BYTE (1< - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifdef HAVE_LOCALE_H -# include -#endif - -#ifdef ENABLE_NLS -# include -# define _(String) gettext (String) -# ifdef gettext_noop -# define N_(String) gettext_noop (String) -# else -# define N_(String) (String) -# endif -#else -/* Stubs that do something close enough. */ -# define textdomain(String) (String) -# define gettext(String) (String) -# define dgettext(Domain,Message) (Message) -# define dcgettext(Domain,Message,Type) (Message) -# define bindtextdomain(Domain,Directory) (Domain) -# define _(String) (String) -# define N_(String) (String) -#endif diff --git a/gas/atof-generic.c b/gas/atof-generic.c deleted file mode 100644 index de29f21341f..00000000000 --- a/gas/atof-generic.c +++ /dev/null @@ -1,636 +0,0 @@ -/* atof_generic.c - turn a string of digits into a Flonum - Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 1998 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include -#include - -#include "as.h" - -#ifndef FALSE -#define FALSE (0) -#endif -#ifndef TRUE -#define TRUE (1) -#endif - -#ifdef TRACE -static void flonum_print PARAMS ((const FLONUM_TYPE *)); -#endif - -#define ASSUME_DECIMAL_MARK_IS_DOT - -/***********************************************************************\ - * * - * Given a string of decimal digits , with optional decimal * - * mark and optional decimal exponent (place value) of the * - * lowest_order decimal digit: produce a floating point * - * number. The number is 'generic' floating point: our * - * caller will encode it for a specific machine architecture. * - * * - * Assumptions * - * uses base (radix) 2 * - * this machine uses 2's complement binary integers * - * target flonums use " " " " * - * target flonums exponents fit in a long * - * * - \***********************************************************************/ - -/* - - Syntax: - - ::= - ::= '+' | '-' | {empty} - ::= - | - | - | - - ::= {empty} - | - - ::= | - ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' - ::= {one character from "string_of_decimal_exponent_marks"} - ::= {one character from "string_of_decimal_marks"} - - */ - -int -atof_generic (address_of_string_pointer, - string_of_decimal_marks, - string_of_decimal_exponent_marks, - address_of_generic_floating_point_number) - /* return pointer to just AFTER number we read. */ - char **address_of_string_pointer; - /* At most one per number. */ - const char *string_of_decimal_marks; - const char *string_of_decimal_exponent_marks; - FLONUM_TYPE *address_of_generic_floating_point_number; -{ - int return_value; /* 0 means OK. */ - char *first_digit; - unsigned int number_of_digits_before_decimal; - unsigned int number_of_digits_after_decimal; - long decimal_exponent; - unsigned int number_of_digits_available; - char digits_sign_char; - - /* - * Scan the input string, abstracting (1)digits (2)decimal mark (3) exponent. - * It would be simpler to modify the string, but we don't; just to be nice - * to caller. - * We need to know how many digits we have, so we can allocate space for - * the digits' value. - */ - - char *p; - char c; - int seen_significant_digit; - -#ifdef ASSUME_DECIMAL_MARK_IS_DOT - assert (string_of_decimal_marks[0] == '.' - && string_of_decimal_marks[1] == 0); -#define IS_DECIMAL_MARK(c) ((c) == '.') -#else -#define IS_DECIMAL_MARK(c) (0 != strchr (string_of_decimal_marks, (c))) -#endif - - first_digit = *address_of_string_pointer; - c = *first_digit; - - if (c == '-' || c == '+') - { - digits_sign_char = c; - first_digit++; - } - else - digits_sign_char = '+'; - - switch (first_digit[0]) - { - case 'n': - case 'N': - if (!strncasecmp ("nan", first_digit, 3)) - { - address_of_generic_floating_point_number->sign = 0; - address_of_generic_floating_point_number->exponent = 0; - address_of_generic_floating_point_number->leader = - address_of_generic_floating_point_number->low; - *address_of_string_pointer = first_digit + 3; - return 0; - } - break; - - case 'i': - case 'I': - if (!strncasecmp ("inf", first_digit, 3)) - { - address_of_generic_floating_point_number->sign = - digits_sign_char == '+' ? 'P' : 'N'; - address_of_generic_floating_point_number->exponent = 0; - address_of_generic_floating_point_number->leader = - address_of_generic_floating_point_number->low; - - first_digit += 3; - if (!strncasecmp ("inity", first_digit, 5)) - first_digit += 5; - - *address_of_string_pointer = first_digit; - - return 0; - } - break; - } - - number_of_digits_before_decimal = 0; - number_of_digits_after_decimal = 0; - decimal_exponent = 0; - seen_significant_digit = 0; - for (p = first_digit; - (((c = *p) != '\0') - && (!c || !IS_DECIMAL_MARK (c)) - && (!c || !strchr (string_of_decimal_exponent_marks, c))); - p++) - { - if (isdigit ((unsigned char) c)) - { - if (seen_significant_digit || c > '0') - { - ++number_of_digits_before_decimal; - seen_significant_digit = 1; - } - else - { - first_digit++; - } - } - else - { - break; /* p -> char after pre-decimal digits. */ - } - } /* For each digit before decimal mark. */ - -#ifndef OLD_FLOAT_READS - /* Ignore trailing 0's after the decimal point. The original code here - * (ifdef'd out) does not do this, and numbers like - * 4.29496729600000000000e+09 (2**31) - * come out inexact for some reason related to length of the digit - * string. - */ - if (c && IS_DECIMAL_MARK (c)) - { - unsigned int zeros = 0; /* Length of current string of zeros */ - - for (p++; (c = *p) && isdigit ((unsigned char) c); p++) - { - if (c == '0') - { - zeros++; - } - else - { - number_of_digits_after_decimal += 1 + zeros; - zeros = 0; - } - } - } -#else - if (c && IS_DECIMAL_MARK (c)) - { - for (p++; - (((c = *p) != '\0') - && (!c || !strchr (string_of_decimal_exponent_marks, c))); - p++) - { - if (isdigit ((unsigned char) c)) - { - /* This may be retracted below. */ - number_of_digits_after_decimal++; - - if ( /* seen_significant_digit || */ c > '0') - { - seen_significant_digit = TRUE; - } - } - else - { - if (!seen_significant_digit) - { - number_of_digits_after_decimal = 0; - } - break; - } - } /* For each digit after decimal mark. */ - } - - while (number_of_digits_after_decimal - && first_digit[number_of_digits_before_decimal - + number_of_digits_after_decimal] == '0') - --number_of_digits_after_decimal; -#endif - - if (flag_m68k_mri) - { - while (c == '_') - c = *++p; - } - if (c && strchr (string_of_decimal_exponent_marks, c)) - { - char digits_exponent_sign_char; - - c = *++p; - if (flag_m68k_mri) - { - while (c == '_') - c = *++p; - } - if (c && strchr ("+-", c)) - { - digits_exponent_sign_char = c; - c = *++p; - } - else - { - digits_exponent_sign_char = '+'; - } - - for (; (c); c = *++p) - { - if (isdigit ((unsigned char) c)) - { - decimal_exponent = decimal_exponent * 10 + c - '0'; - /* - * BUG! If we overflow here, we lose! - */ - } - else - { - break; - } - } - - if (digits_exponent_sign_char == '-') - { - decimal_exponent = -decimal_exponent; - } - } - - *address_of_string_pointer = p; - - - - number_of_digits_available = - number_of_digits_before_decimal + number_of_digits_after_decimal; - return_value = 0; - if (number_of_digits_available == 0) - { - address_of_generic_floating_point_number->exponent = 0; /* Not strictly necessary */ - address_of_generic_floating_point_number->leader - = -1 + address_of_generic_floating_point_number->low; - address_of_generic_floating_point_number->sign = digits_sign_char; - /* We have just concocted (+/-)0.0E0 */ - - } - else - { - int count; /* Number of useful digits left to scan. */ - - LITTLENUM_TYPE *digits_binary_low; - unsigned int precision; - unsigned int maximum_useful_digits; - unsigned int number_of_digits_to_use; - unsigned int more_than_enough_bits_for_digits; - unsigned int more_than_enough_littlenums_for_digits; - unsigned int size_of_digits_in_littlenums; - unsigned int size_of_digits_in_chars; - FLONUM_TYPE power_of_10_flonum; - FLONUM_TYPE digits_flonum; - - precision = (address_of_generic_floating_point_number->high - - address_of_generic_floating_point_number->low - + 1); /* Number of destination littlenums. */ - - /* Includes guard bits (two littlenums worth) */ -#if 0 /* The integer version below is very close, and it doesn't - require floating point support (which is currently buggy on - the Alpha). */ - maximum_useful_digits = (((double) (precision - 2)) - * ((double) (LITTLENUM_NUMBER_OF_BITS)) - / (LOG_TO_BASE_2_OF_10)) - + 2; /* 2 :: guard digits. */ -#else - maximum_useful_digits = (((precision - 2)) - * ( (LITTLENUM_NUMBER_OF_BITS)) - * 1000000 / 3321928) - + 2; /* 2 :: guard digits. */ -#endif - - if (number_of_digits_available > maximum_useful_digits) - { - number_of_digits_to_use = maximum_useful_digits; - } - else - { - number_of_digits_to_use = number_of_digits_available; - } - - /* Cast these to SIGNED LONG first, otherwise, on systems with - LONG wider than INT (such as Alpha OSF/1), unsignedness may - cause unexpected results. */ - decimal_exponent += ((long) number_of_digits_before_decimal - - (long) number_of_digits_to_use); - -#if 0 - more_than_enough_bits_for_digits - = ((((double) number_of_digits_to_use) * LOG_TO_BASE_2_OF_10) + 1); -#else - more_than_enough_bits_for_digits - = (number_of_digits_to_use * 3321928 / 1000000 + 1); -#endif - - more_than_enough_littlenums_for_digits - = (more_than_enough_bits_for_digits - / LITTLENUM_NUMBER_OF_BITS) - + 2; - - /* Compute (digits) part. In "12.34E56" this is the "1234" part. - Arithmetic is exact here. If no digits are supplied then this - part is a 0 valued binary integer. Allocate room to build up - the binary number as littlenums. We want this memory to - disappear when we leave this function. Assume no alignment - problems => (room for n objects) == n * (room for 1 - object). */ - - size_of_digits_in_littlenums = more_than_enough_littlenums_for_digits; - size_of_digits_in_chars = size_of_digits_in_littlenums - * sizeof (LITTLENUM_TYPE); - - digits_binary_low = (LITTLENUM_TYPE *) - alloca (size_of_digits_in_chars); - - memset ((char *) digits_binary_low, '\0', size_of_digits_in_chars); - - /* Digits_binary_low[] is allocated and zeroed. */ - - /* - * Parse the decimal digits as if * digits_low was in the units position. - * Emit a binary number into digits_binary_low[]. - * - * Use a large-precision version of: - * (((1st-digit) * 10 + 2nd-digit) * 10 + 3rd-digit ...) * 10 + last-digit - */ - - for (p = first_digit, count = number_of_digits_to_use; count; p++, --count) - { - c = *p; - if (isdigit ((unsigned char) c)) - { - /* - * Multiply by 10. Assume can never overflow. - * Add this digit to digits_binary_low[]. - */ - - long carry; - LITTLENUM_TYPE *littlenum_pointer; - LITTLENUM_TYPE *littlenum_limit; - - littlenum_limit = digits_binary_low - + more_than_enough_littlenums_for_digits - - 1; - - carry = c - '0'; /* char -> binary */ - - for (littlenum_pointer = digits_binary_low; - littlenum_pointer <= littlenum_limit; - littlenum_pointer++) - { - long work; - - work = carry + 10 * (long) (*littlenum_pointer); - *littlenum_pointer = work & LITTLENUM_MASK; - carry = work >> LITTLENUM_NUMBER_OF_BITS; - } - - if (carry != 0) - { - /* - * We have a GROSS internal error. - * This should never happen. - */ - as_fatal (_("failed sanity check.")); - } - } - else - { - ++count; /* '.' doesn't alter digits used count. */ - } - } - - - /* - * Digits_binary_low[] properly encodes the value of the digits. - * Forget about any high-order littlenums that are 0. - */ - while (digits_binary_low[size_of_digits_in_littlenums - 1] == 0 - && size_of_digits_in_littlenums >= 2) - size_of_digits_in_littlenums--; - - digits_flonum.low = digits_binary_low; - digits_flonum.high = digits_binary_low + size_of_digits_in_littlenums - 1; - digits_flonum.leader = digits_flonum.high; - digits_flonum.exponent = 0; - /* - * The value of digits_flonum . sign should not be important. - * We have already decided the output's sign. - * We trust that the sign won't influence the other parts of the number! - * So we give it a value for these reasons: - * (1) courtesy to humans reading/debugging - * these numbers so they don't get excited about strange values - * (2) in future there may be more meaning attached to sign, - * and what was - * harmless noise may become disruptive, ill-conditioned (or worse) - * input. - */ - digits_flonum.sign = '+'; - - { - /* - * Compute the mantssa (& exponent) of the power of 10. - * If sucessful, then multiply the power of 10 by the digits - * giving return_binary_mantissa and return_binary_exponent. - */ - - LITTLENUM_TYPE *power_binary_low; - int decimal_exponent_is_negative; - /* This refers to the "-56" in "12.34E-56". */ - /* FALSE: decimal_exponent is positive (or 0) */ - /* TRUE: decimal_exponent is negative */ - FLONUM_TYPE temporary_flonum; - LITTLENUM_TYPE *temporary_binary_low; - unsigned int size_of_power_in_littlenums; - unsigned int size_of_power_in_chars; - - size_of_power_in_littlenums = precision; - /* Precision has a built-in fudge factor so we get a few guard bits. */ - - decimal_exponent_is_negative = decimal_exponent < 0; - if (decimal_exponent_is_negative) - { - decimal_exponent = -decimal_exponent; - } - - /* From now on: the decimal exponent is > 0. Its sign is separate. */ - - size_of_power_in_chars = size_of_power_in_littlenums - * sizeof (LITTLENUM_TYPE) + 2; - - power_binary_low = (LITTLENUM_TYPE *) alloca (size_of_power_in_chars); - temporary_binary_low = (LITTLENUM_TYPE *) alloca (size_of_power_in_chars); - memset ((char *) power_binary_low, '\0', size_of_power_in_chars); - *power_binary_low = 1; - power_of_10_flonum.exponent = 0; - power_of_10_flonum.low = power_binary_low; - power_of_10_flonum.leader = power_binary_low; - power_of_10_flonum.high = power_binary_low + size_of_power_in_littlenums - 1; - power_of_10_flonum.sign = '+'; - temporary_flonum.low = temporary_binary_low; - temporary_flonum.high = temporary_binary_low + size_of_power_in_littlenums - 1; - /* - * (power) == 1. - * Space for temporary_flonum allocated. - */ - - /* - * ... - * - * WHILE more bits - * DO find next bit (with place value) - * multiply into power mantissa - * OD - */ - { - int place_number_limit; - /* Any 10^(2^n) whose "n" exceeds this */ - /* value will fall off the end of */ - /* flonum_XXXX_powers_of_ten[]. */ - int place_number; - const FLONUM_TYPE *multiplicand; /* -> 10^(2^n) */ - - place_number_limit = table_size_of_flonum_powers_of_ten; - - multiplicand = (decimal_exponent_is_negative - ? flonum_negative_powers_of_ten - : flonum_positive_powers_of_ten); - - for (place_number = 1;/* Place value of this bit of exponent. */ - decimal_exponent;/* Quit when no more 1 bits in exponent. */ - decimal_exponent >>= 1, place_number++) - { - if (decimal_exponent & 1) - { - if (place_number > place_number_limit) - { - /* The decimal exponent has a magnitude so great - that our tables can't help us fragment it. - Although this routine is in error because it - can't imagine a number that big, signal an - error as if it is the user's fault for - presenting such a big number. */ - return_value = ERROR_EXPONENT_OVERFLOW; - /* quit out of loop gracefully */ - decimal_exponent = 0; - } - else - { -#ifdef TRACE - printf ("before multiply, place_number = %d., power_of_10_flonum:\n", - place_number); - - flonum_print (&power_of_10_flonum); - (void) putchar ('\n'); -#endif -#ifdef TRACE - printf ("multiplier:\n"); - flonum_print (multiplicand + place_number); - (void) putchar ('\n'); -#endif - flonum_multip (multiplicand + place_number, - &power_of_10_flonum, &temporary_flonum); -#ifdef TRACE - printf ("after multiply:\n"); - flonum_print (&temporary_flonum); - (void) putchar ('\n'); -#endif - flonum_copy (&temporary_flonum, &power_of_10_flonum); -#ifdef TRACE - printf ("after copy:\n"); - flonum_print (&power_of_10_flonum); - (void) putchar ('\n'); -#endif - } /* If this bit of decimal_exponent was computable.*/ - } /* If this bit of decimal_exponent was set. */ - } /* For each bit of binary representation of exponent */ -#ifdef TRACE - printf ("after computing power_of_10_flonum:\n"); - flonum_print (&power_of_10_flonum); - (void) putchar ('\n'); -#endif - } - - } - - /* - * power_of_10_flonum is power of ten in binary (mantissa) , (exponent). - * It may be the number 1, in which case we don't NEED to multiply. - * - * Multiply (decimal digits) by power_of_10_flonum. - */ - - flonum_multip (&power_of_10_flonum, &digits_flonum, address_of_generic_floating_point_number); - /* Assert sign of the number we made is '+'. */ - address_of_generic_floating_point_number->sign = digits_sign_char; - - } - return return_value; -} - -#ifdef TRACE -static void -flonum_print (f) - const FLONUM_TYPE *f; -{ - LITTLENUM_TYPE *lp; - char littlenum_format[10]; - sprintf (littlenum_format, " %%0%dx", sizeof (LITTLENUM_TYPE) * 2); -#define print_littlenum(LP) (printf (littlenum_format, LP)) - printf ("flonum @%p %c e%ld", f, f->sign, f->exponent); - if (f->low < f->high) - for (lp = f->high; lp >= f->low; lp--) - print_littlenum (*lp); - else - for (lp = f->low; lp <= f->high; lp++) - print_littlenum (*lp); - printf ("\n"); - fflush (stdout); -} -#endif - -/* end of atof_generic.c */ diff --git a/gas/bignum-copy.c b/gas/bignum-copy.c deleted file mode 100644 index 2bffcbfea4c..00000000000 --- a/gas/bignum-copy.c +++ /dev/null @@ -1,80 +0,0 @@ -/* bignum_copy.c - copy a bignum - Copyright (C) 1987, 1990, 1991, 1992 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "as.h" - -/* - * bignum_copy () - * - * Copy a bignum from in to out. - * If the output is shorter than the input, copy lower-order littlenums. - * Return 0 or the number of significant littlenums dropped. - * Assumes littlenum arrays are densely packed: no unused chars between - * the littlenums. Uses memcpy() to move littlenums, and wants to - * know length (in chars) of the input bignum. - */ - -/* void */ -int -bignum_copy (in, in_length, out, out_length) - register LITTLENUM_TYPE *in; - register int in_length; /* in sizeof(littlenum)s */ - register LITTLENUM_TYPE *out; - register int out_length; /* in sizeof(littlenum)s */ -{ - int significant_littlenums_dropped; - - if (out_length < in_length) - { - LITTLENUM_TYPE *p; /* -> most significant (non-zero) input - littlenum. */ - - memcpy ((void *) out, (void *) in, - (unsigned int) out_length << LITTLENUM_SHIFT); - for (p = in + in_length - 1; p >= in; --p) - { - if (*p) - break; - } - significant_littlenums_dropped = p - in - in_length + 1; - - if (significant_littlenums_dropped < 0) - { - significant_littlenums_dropped = 0; - } - } - else - { - memcpy ((char *) out, (char *) in, - (unsigned int) in_length << LITTLENUM_SHIFT); - - if (out_length > in_length) - { - memset ((char *) (out + in_length), - '\0', - (unsigned int) (out_length - in_length) << LITTLENUM_SHIFT); - } - - significant_littlenums_dropped = 0; - } - - return (significant_littlenums_dropped); -} /* bignum_copy() */ - -/* end of bignum-copy.c */ diff --git a/gas/bignum.h b/gas/bignum.h deleted file mode 100644 index e3b2f167998..00000000000 --- a/gas/bignum.h +++ /dev/null @@ -1,52 +0,0 @@ -/* bignum.h-arbitrary precision integers - Copyright (C) 1987, 1992 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/***********************************************************************\ - * * - * Arbitrary-precision integer arithmetic. * - * For speed, we work in groups of bits, even though this * - * complicates algorithms. * - * Each group of bits is called a 'littlenum'. * - * A bunch of littlenums representing a (possibly large) * - * integer is called a 'bignum'. * - * Bignums are >= 0. * - * * - \***********************************************************************/ - -#define LITTLENUM_NUMBER_OF_BITS (16) -#define LITTLENUM_RADIX (1 << LITTLENUM_NUMBER_OF_BITS) -#define LITTLENUM_MASK (0xFFFF) -#define LITTLENUM_SHIFT (1) -#define CHARS_PER_LITTLENUM (1 << LITTLENUM_SHIFT) -#ifndef BITS_PER_CHAR -#define BITS_PER_CHAR (8) -#endif - -typedef unsigned short LITTLENUM_TYPE; - -/* JF truncated this to get around a problem with GCC */ -#define LOG_TO_BASE_2_OF_10 (3.3219280948873623478703194294893901758651) -/* WARNING: I haven't checked that the trailing digits are correct! */ - -/* lengths are in sizeof(littlenum)s */ - -int bignum_copy PARAMS ((LITTLENUM_TYPE * in, int in_length, - LITTLENUM_TYPE * out, int out_length)); - -/* end of bignum.h */ diff --git a/gas/bit_fix.h b/gas/bit_fix.h deleted file mode 100644 index 6a729a700c6..00000000000 --- a/gas/bit_fix.h +++ /dev/null @@ -1,51 +0,0 @@ -/* write.h - - Copyright (C) 1987, 1992 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* The bit_fix was implemented to support machines that need variables - to be inserted in bitfields other than 1, 2 and 4 bytes. - Furthermore it gives us a possibillity to mask in bits in the symbol - when it's fixed in the objectcode and check the symbols limits. - - The or-mask is used to set the huffman bits in displacements for the - ns32k port. - The acbi, addqi, movqi, cmpqi instruction requires an assembler that - can handle bitfields. Ie handle an expression, evaluate it and insert - the result in an some bitfield. ( ex: 5 bits in a short field of a opcode) - */ - -#ifndef __bit_fix_h__ -#define __bit_fix_h__ - -struct bit_fix - { - int fx_bit_size; /* Length of bitfield */ - int fx_bit_offset; /* Bit offset to bitfield */ - long fx_bit_base; /* Where do we apply the bitfix. - If this is zero, default is assumed. */ - long fx_bit_base_adj; /* Adjustment of base */ - long fx_bit_max; /* Signextended max for bitfield */ - long fx_bit_min; /* Signextended min for bitfield */ - long fx_bit_add; /* Or mask, used for huffman prefix */ - }; -typedef struct bit_fix bit_fixS; - -#endif /* __bit_fix_h__ */ - -/* end of bit_fix.h */ diff --git a/gas/cgen.c b/gas/cgen.c deleted file mode 100644 index e15e1b65346..00000000000 --- a/gas/cgen.c +++ /dev/null @@ -1,664 +0,0 @@ -/* GAS interface for targets using CGEN: Cpu tools GENerator. - Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include -#include "ansidecl.h" -#include "libiberty.h" -#include "bfd.h" -#include "symcat.h" -#include "cgen-desc.h" -#include "as.h" -#include "subsegs.h" -#include "cgen.h" - -/* Opcode table descriptor, must be set by md_begin. */ - -CGEN_CPU_DESC gas_cgen_cpu_desc; - -/* Callback to insert a register into the symbol table. - A target may choose to let GAS parse the registers. - ??? Not currently used. */ - -void -cgen_asm_record_register (name, number) - char * name; - int number; -{ - /* Use symbol_create here instead of symbol_new so we don't try to - output registers into the object file's symbol table. */ - symbol_table_insert (symbol_create (name, reg_section, - number, & zero_address_frag)); -} - -/* We need to keep a list of fixups. We can't simply generate them as - we go, because that would require us to first create the frag, and - that would screw up references to ``.''. - - This is used by cpu's with simple operands. It keeps knowledge of what - an `expressionS' is and what a `fixup' is out of CGEN which for the time - being is preferable. - - OPINDEX is the index in the operand table. - OPINFO is something the caller chooses to help in reloc determination. */ - -struct fixup -{ - int opindex; - int opinfo; - expressionS exp; -}; - -static struct fixup fixups [GAS_CGEN_MAX_FIXUPS]; -static int num_fixups; - -/* Prepare to parse an instruction. - ??? May wish to make this static and delete calls in md_assemble. */ - -void -gas_cgen_init_parse () -{ - num_fixups = 0; -} - -/* Queue a fixup. */ - -static void -queue_fixup (opindex, opinfo, expP) - int opindex; - expressionS * expP; -{ - /* We need to generate a fixup for this expression. */ - if (num_fixups >= GAS_CGEN_MAX_FIXUPS) - as_fatal (_("too many fixups")); - fixups[num_fixups].exp = * expP; - fixups[num_fixups].opindex = opindex; - fixups[num_fixups].opinfo = opinfo; - ++ num_fixups; -} - -/* The following three functions allow a backup of the fixup chain to be made, - and to have this backup be swapped with the current chain. This allows - certain ports, eg the m32r, to swap two instructions and swap their fixups - at the same time. */ -/* ??? I think with cgen_asm_finish_insn (or something else) there is no - more need for this. */ - -static struct fixup saved_fixups [GAS_CGEN_MAX_FIXUPS]; -static int saved_num_fixups; - -void -gas_cgen_save_fixups () -{ - saved_num_fixups = num_fixups; - - memcpy (saved_fixups, fixups, sizeof (fixups[0]) * num_fixups); - - num_fixups = 0; -} - -void -gas_cgen_restore_fixups () -{ - num_fixups = saved_num_fixups; - - memcpy (fixups, saved_fixups, sizeof (fixups[0]) * num_fixups); - - saved_num_fixups = 0; -} - -void -gas_cgen_swap_fixups () -{ - int tmp; - struct fixup tmp_fixup; - - if (num_fixups == 0) - { - gas_cgen_restore_fixups (); - } - else if (saved_num_fixups == 0) - { - gas_cgen_save_fixups (); - } - else - { - tmp = saved_num_fixups; - saved_num_fixups = num_fixups; - num_fixups = tmp; - - for (tmp = GAS_CGEN_MAX_FIXUPS; tmp--;) - { - tmp_fixup = saved_fixups [tmp]; - saved_fixups [tmp] = fixups [tmp]; - fixups [tmp] = tmp_fixup; - } - } -} - -/* Default routine to record a fixup. - This is a cover function to fix_new. - It exists because we record INSN with the fixup. - - FRAG and WHERE are their respective arguments to fix_new_exp. - LENGTH is in bits. - OPINFO is something the caller chooses to help in reloc determination. - - At this point we do not use a bfd_reloc_code_real_type for - operands residing in the insn, but instead just use the - operand index. This lets us easily handle fixups for any - operand type. We pick a BFD reloc type in md_apply_fix. */ - -fixS * -gas_cgen_record_fixup (frag, where, insn, length, operand, opinfo, symbol, offset) - fragS * frag; - int where; - const CGEN_INSN * insn; - int length; - const CGEN_OPERAND * operand; - int opinfo; - symbolS * symbol; - offsetT offset; -{ - fixS * fixP; - - /* It may seem strange to use operand->attrs and not insn->attrs here, - but it is the operand that has a pc relative relocation. */ - - fixP = fix_new (frag, where, length / 8, symbol, offset, - CGEN_OPERAND_ATTR_VALUE (operand, CGEN_OPERAND_PCREL_ADDR), - (bfd_reloc_code_real_type) - ((int) BFD_RELOC_UNUSED - + (int) operand->type)); - fixP->fx_cgen.insn = insn; - fixP->fx_cgen.opinfo = opinfo; - - return fixP; -} - -/* Default routine to record a fixup given an expression. - This is a cover function to fix_new_exp. - It exists because we record INSN with the fixup. - - FRAG and WHERE are their respective arguments to fix_new_exp. - LENGTH is in bits. - OPINFO is something the caller chooses to help in reloc determination. - - At this point we do not use a bfd_reloc_code_real_type for - operands residing in the insn, but instead just use the - operand index. This lets us easily handle fixups for any - operand type. We pick a BFD reloc type in md_apply_fix. */ - -fixS * -gas_cgen_record_fixup_exp (frag, where, insn, length, operand, opinfo, exp) - fragS * frag; - int where; - const CGEN_INSN * insn; - int length; - const CGEN_OPERAND * operand; - int opinfo; - expressionS * exp; -{ - fixS * fixP; - - /* It may seem strange to use operand->attrs and not insn->attrs here, - but it is the operand that has a pc relative relocation. */ - - fixP = fix_new_exp (frag, where, length / 8, exp, - CGEN_OPERAND_ATTR_VALUE (operand, CGEN_OPERAND_PCREL_ADDR), - (bfd_reloc_code_real_type) - ((int) BFD_RELOC_UNUSED - + (int) operand->type)); - fixP->fx_cgen.insn = insn; - fixP->fx_cgen.opinfo = opinfo; - - return fixP; -} - -/* Used for communication between the next two procedures. */ -static jmp_buf expr_jmp_buf; - -/* Callback for cgen interface. Parse the expression at *STRP. - The result is an error message or NULL for success (in which case - *STRP is advanced past the parsed text). - WANT is an indication of what the caller is looking for. - If WANT == CGEN_ASM_PARSE_INIT the caller is beginning to try to match - a table entry with the insn, reset the queued fixups counter. - An enum cgen_parse_operand_result is stored in RESULTP. - OPINDEX is the operand's table entry index. - OPINFO is something the caller chooses to help in reloc determination. - The resulting value is stored in VALUEP. */ - -const char * -gas_cgen_parse_operand (cd, want, strP, opindex, opinfo, resultP, valueP) - CGEN_CPU_DESC cd; - enum cgen_parse_operand_type want; - const char ** strP; - int opindex; - int opinfo; - enum cgen_parse_operand_result * resultP; - bfd_vma * valueP; -{ -#ifdef __STDC__ - /* These are volatile to survive the setjmp. */ - char * volatile hold; - enum cgen_parse_operand_result * volatile resultP_1; -#else - static char * hold; - static enum cgen_parse_operand_result * resultP_1; -#endif - const char * errmsg = NULL; - expressionS exp; - - if (want == CGEN_PARSE_OPERAND_INIT) - { - gas_cgen_init_parse (); - return NULL; - } - - resultP_1 = resultP; - hold = input_line_pointer; - input_line_pointer = (char *) * strP; - - /* We rely on md_operand to longjmp back to us. - This is done via gas_cgen_md_operand. */ - if (setjmp (expr_jmp_buf) != 0) - { - input_line_pointer = (char *) hold; - * resultP_1 = CGEN_PARSE_OPERAND_RESULT_ERROR; - return "illegal operand"; - } - - expression (& exp); - - * strP = input_line_pointer; - input_line_pointer = hold; - - /* FIXME: Need to check `want'. */ - - switch (exp.X_op) - { - case O_illegal : - errmsg = _("illegal operand"); - * resultP = CGEN_PARSE_OPERAND_RESULT_ERROR; - break; - case O_absent : - errmsg = _("missing operand"); - * resultP = CGEN_PARSE_OPERAND_RESULT_ERROR; - break; - case O_constant : - * valueP = exp.X_add_number; - * resultP = CGEN_PARSE_OPERAND_RESULT_NUMBER; - break; - case O_register : - * valueP = exp.X_add_number; - * resultP = CGEN_PARSE_OPERAND_RESULT_REGISTER; - break; - default : - queue_fixup (opindex, opinfo, & exp); - * valueP = 0; - * resultP = CGEN_PARSE_OPERAND_RESULT_QUEUED; - break; - } - - return errmsg; -} - -/* md_operand handler to catch unrecognized expressions and halt the - parsing process so the next entry can be tried. - - ??? This could be done differently by adding code to `expression'. */ - -void -gas_cgen_md_operand (expressionP) - expressionS * expressionP; -{ - longjmp (expr_jmp_buf, 1); -} - -/* Finish assembling instruction INSN. - BUF contains what we've built up so far. - LENGTH is the size of the insn in bits. - RELAX_P is non-zero if relaxable insns should be emitted as such. - Otherwise they're emitted in non-relaxable forms. - The "result" is stored in RESULT if non-NULL. */ - -void -gas_cgen_finish_insn (insn, buf, length, relax_p, result) - const CGEN_INSN * insn; - CGEN_INSN_BYTES_PTR buf; - unsigned int length; - int relax_p; - finished_insnS * result; -{ - int i; - int relax_operand; - char * f; - unsigned int byte_len = length / 8; - - /* ??? Target foo issues various warnings here, so one might want to provide - a hook here. However, our caller is defined in tc-foo.c so there - shouldn't be a need for a hook. */ - - /* Write out the instruction. - It is important to fetch enough space in one call to `frag_more'. - We use (f - frag_now->fr_literal) to compute where we are and we - don't want frag_now to change between calls. - - Relaxable instructions: We need to ensure we allocate enough - space for the largest insn. */ - - if (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAX)) - abort (); /* These currently shouldn't get here. */ - - /* Is there a relaxable insn with the relaxable operand needing a fixup? */ - - relax_operand = -1; - if (relax_p && CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAXABLE)) - { - /* Scan the fixups for the operand affected by relaxing - (i.e. the branch address). */ - - for (i = 0; i < num_fixups; ++ i) - { - if (CGEN_OPERAND_ATTR_VALUE (cgen_operand_lookup_by_num (gas_cgen_cpu_desc, fixups[i].opindex), - CGEN_OPERAND_RELAX)) - { - relax_operand = i; - break; - } - } - } - - if (relax_operand != -1) - { - int max_len; - fragS * old_frag; - -#ifdef TC_CGEN_MAX_RELAX - max_len = TC_CGEN_MAX_RELAX (insn, byte_len); -#else - max_len = CGEN_MAX_INSN_SIZE; -#endif - /* Ensure variable part and fixed part are in same fragment. */ - /* FIXME: Having to do this seems like a hack. */ - frag_grow (max_len); - - /* Allocate space for the fixed part. */ - f = frag_more (byte_len); - - /* Create a relaxable fragment for this instruction. */ - old_frag = frag_now; - - frag_var (rs_machine_dependent, - max_len - byte_len /* max chars */, - 0 /* variable part already allocated */, - /* FIXME: When we machine generate the relax table, - machine generate a macro to compute subtype. */ - 1 /* subtype */, - fixups[relax_operand].exp.X_add_symbol, - fixups[relax_operand].exp.X_add_number, - f); - - /* Record the operand number with the fragment so md_convert_frag - can use gas_cgen_md_record_fixup to record the appropriate reloc. */ - old_frag->fr_cgen.insn = insn; - old_frag->fr_cgen.opindex = fixups[relax_operand].opindex; - old_frag->fr_cgen.opinfo = fixups[relax_operand].opinfo; - if (result) - result->frag = old_frag; - } - else - { - f = frag_more (byte_len); - if (result) - result->frag = frag_now; - } - - /* If we're recording insns as numbers (rather than a string of bytes), - target byte order handling is deferred until now. */ -#if CGEN_INT_INSN_P - cgen_put_insn_value (gas_cgen_cpu_desc, f, length, *buf); -#else - memcpy (f, buf, byte_len); -#endif - - /* Create any fixups. */ - for (i = 0; i < num_fixups; ++i) - { - fixS *fixP; - const CGEN_OPERAND *operand = - cgen_operand_lookup_by_num (gas_cgen_cpu_desc, fixups[i].opindex); - - /* Don't create fixups for these. That's done during relaxation. - We don't need to test for CGEN_INSN_RELAX as they can't get here - (see above). */ - if (relax_p - && CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAXABLE) - && CGEN_OPERAND_ATTR_VALUE (operand, CGEN_OPERAND_RELAX)) - continue; - -#ifndef md_cgen_record_fixup_exp -#define md_cgen_record_fixup_exp gas_cgen_record_fixup_exp -#endif - - fixP = md_cgen_record_fixup_exp (frag_now, f - frag_now->fr_literal, - insn, length, operand, - fixups[i].opinfo, - & fixups[i].exp); - if (result) - result->fixups[i] = fixP; - } - - if (result) - { - result->num_fixups = num_fixups; - result->addr = f; - } -} - -/* Apply a fixup to the object code. This is called for all the - fixups we generated by the call to fix_new_exp, above. In the call - above we used a reloc code which was the largest legal reloc code - plus the operand index. Here we undo that to recover the operand - index. At this point all symbol values should be fully resolved, - and we attempt to completely resolve the reloc. If we can not do - that, we determine the correct reloc code and put it back in the fixup. */ - -/* FIXME: This function handles some of the fixups and bfd_install_relocation - handles the rest. bfd_install_relocation (or some other bfd function) - should handle them all. */ - -int -gas_cgen_md_apply_fix3 (fixP, valueP, seg) - fixS * fixP; - valueT * valueP; - segT seg; -{ - char * where = fixP->fx_frag->fr_literal + fixP->fx_where; - valueT value; - /* canonical name, since used a lot */ - CGEN_CPU_DESC cd = gas_cgen_cpu_desc; - - /* FIXME FIXME FIXME: The value we are passed in *valuep includes - the symbol values. Since we are using BFD_ASSEMBLER, if we are - doing this relocation the code in write.c is going to call - bfd_install_relocation, which is also going to use the symbol - value. That means that if the reloc is fully resolved we want to - use *valuep since bfd_install_relocation is not being used. - However, if the reloc is not fully resolved we do not want to use - *valuep, and must use fx_offset instead. However, if the reloc - is PC relative, we do want to use *valuep since it includes the - result of md_pcrel_from. This is confusing. */ - - if (fixP->fx_addsy == (symbolS *) NULL) - { - value = * valueP; - fixP->fx_done = 1; - } - else if (fixP->fx_pcrel) - value = * valueP; - else - { - value = fixP->fx_offset; - if (fixP->fx_subsy != (symbolS *) NULL) - { - if (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section) - value -= S_GET_VALUE (fixP->fx_subsy); - else - { - /* We don't actually support subtracting a symbol. */ - as_bad_where (fixP->fx_file, fixP->fx_line, - _("expression too complex")); - } - } - } - - if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED) - { - int opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED; - const CGEN_OPERAND *operand = cgen_operand_lookup_by_num (cd, opindex); - const char *errmsg; - bfd_reloc_code_real_type reloc_type; - CGEN_FIELDS *fields = alloca (CGEN_CPU_SIZEOF_FIELDS (cd)); - const CGEN_INSN *insn = fixP->fx_cgen.insn; - - /* If the reloc has been fully resolved finish the operand here. */ - /* FIXME: This duplicates the capabilities of code in BFD. */ - if (fixP->fx_done - /* FIXME: If partial_inplace isn't set bfd_install_relocation won't - finish the job. Testing for pcrel is a temporary hack. */ - || fixP->fx_pcrel) - { - CGEN_CPU_SET_FIELDS_BITSIZE (cd) (fields, CGEN_INSN_BITSIZE (insn)); - CGEN_CPU_SET_VMA_OPERAND (cd) (cd, opindex, fields, (bfd_vma) value); - -#if CGEN_INT_INSN_P - { - CGEN_INSN_INT insn_value = - cgen_get_insn_value (cd, where, CGEN_INSN_BITSIZE (insn)); - - /* ??? 0 is passed for `pc' */ - errmsg = CGEN_CPU_INSERT_OPERAND (cd) (cd, opindex, fields, - &insn_value, (bfd_vma) 0); - cgen_put_insn_value (cd, where, CGEN_INSN_BITSIZE (insn), - insn_value); - } -#else - /* ??? 0 is passed for `pc' */ - errmsg = CGEN_CPU_INSERT_OPERAND (cd) (cd, opindex, fields, where, - (bfd_vma) 0); -#endif - if (errmsg) - as_bad_where (fixP->fx_file, fixP->fx_line, "%s", errmsg); - } - - if (fixP->fx_done) - return 1; - - /* The operand isn't fully resolved. Determine a BFD reloc value - based on the operand information and leave it to - bfd_install_relocation. Note that this doesn't work when - partial_inplace == false. */ - - reloc_type = md_cgen_lookup_reloc (insn, operand, fixP); - if (reloc_type != BFD_RELOC_NONE) - { - fixP->fx_r_type = reloc_type; - } - else - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("unresolved expression that must be resolved")); - fixP->fx_done = 1; - return 1; - } - } - else if (fixP->fx_done) - { - /* We're finished with this fixup. Install it because - bfd_install_relocation won't be called to do it. */ - switch (fixP->fx_r_type) - { - case BFD_RELOC_8: - md_number_to_chars (where, value, 1); - break; - case BFD_RELOC_16: - md_number_to_chars (where, value, 2); - break; - case BFD_RELOC_32: - md_number_to_chars (where, value, 4); - break; - /* FIXME: later add support for 64 bits. */ - default: - as_bad_where (fixP->fx_file, fixP->fx_line, - _("internal error: can't install fix for reloc type %d (`%s')"), - fixP->fx_r_type, bfd_get_reloc_code_name (fixP->fx_r_type)); - break; - } - } - else - { - /* bfd_install_relocation will be called to finish things up. */ - } - - /* Tuck `value' away for use by tc_gen_reloc. - See the comment describing fx_addnumber in write.h. - This field is misnamed (or misused :-). */ - fixP->fx_addnumber = value; - - return 1; -} - -/* Translate internal representation of relocation info to BFD target format. - - FIXME: To what extent can we get all relevant targets to use this? */ - -arelent * -gas_cgen_tc_gen_reloc (section, fixP) - asection * section; - fixS * fixP; -{ - arelent * reloc; - - reloc = (arelent *) xmalloc (sizeof (arelent)); - - reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type); - if (reloc->howto == (reloc_howto_type *) NULL) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("internal error: can't export reloc type %d (`%s')"), - fixP->fx_r_type, bfd_get_reloc_code_name (fixP->fx_r_type)); - return NULL; - } - - assert (!fixP->fx_pcrel == !reloc->howto->pc_relative); - - reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy); - - /* Use fx_offset for these cases */ - if ( fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY - || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT) - reloc->addend = fixP->fx_offset; - else - reloc->addend = fixP->fx_addnumber; - - reloc->address = fixP->fx_frag->fr_address + fixP->fx_where; - return reloc; -} diff --git a/gas/cgen.h b/gas/cgen.h deleted file mode 100644 index 2bc1732247f..00000000000 --- a/gas/cgen.h +++ /dev/null @@ -1,94 +0,0 @@ -/* GAS cgen support. - Copyright (C) 1998, 1999 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef GAS_CGEN_H -#define GAS_CGEN_H - -/* Opcode table handle. */ -extern CGEN_CPU_DESC gas_cgen_cpu_desc; - -/* Maximum number of fixups in an insn. - If you need to change this, allow target to override and do so there. */ -#define GAS_CGEN_MAX_FIXUPS 3 - -/* Struct defining result of gas_cgen_finish_insn. */ -typedef struct { - /* frag containing the insn */ - fragS * frag; - /* Address of insn in frag. */ - char * addr; - /* Number of fixups this insn has. */ - int num_fixups; - /* Array of fixups. */ - fixS * fixups[GAS_CGEN_MAX_FIXUPS]; -} finished_insnS; - -/* Callback for operand parsing. - The result is an error message or NULL for success. - The parsed value is stored in the bfd_vma *. */ -extern const char * gas_cgen_parse_operand - PARAMS ((CGEN_CPU_DESC, enum cgen_parse_operand_type, - const char **, int, int, enum cgen_parse_operand_result *, - bfd_vma *)); - -/* Call this from md_assemble to initialize the assembler callback. */ -extern void gas_cgen_init_parse PARAMS ((void)); - -extern void gas_cgen_save_fixups PARAMS ((void)); -extern void gas_cgen_restore_fixups PARAMS ((void)); -extern void gas_cgen_swap_fixups PARAMS ((void)); - -/* Add a register to the assembler's hash table. - This makes lets GAS parse registers for us. - ??? This isn't currently used, but it could be in the future. */ -extern void cgen_asm_record_register PARAMS ((char *, int)); - -/* After CGEN_SYM (assemble_insn) is done, this is called to - output the insn and record any fixups. */ -extern void gas_cgen_finish_insn PARAMS ((const CGEN_INSN *, - CGEN_INSN_BYTES_PTR, unsigned int, - int, finished_insnS *)); - -/* Record a fixup. */ -extern fixS * gas_cgen_record_fixup PARAMS ((fragS *, int, const CGEN_INSN *, - int, const CGEN_OPERAND *, int, - symbolS *, offsetT)); -extern fixS * gas_cgen_record_fixup_exp PARAMS ((fragS *, int, const CGEN_INSN *, - int, const CGEN_OPERAND *, int, - expressionS *)); - -/* md_apply_fix3 handler */ -extern int gas_cgen_md_apply_fix3 PARAMS ((fixS *, valueT *, segT)); - -/* tc_gen_reloc handler */ -extern arelent *gas_cgen_tc_gen_reloc PARAMS ((asection *, fixS *)); - -/* Target supplied routine to lookup a reloc. */ -extern bfd_reloc_code_real_type -md_cgen_lookup_reloc PARAMS ((const CGEN_INSN *, const CGEN_OPERAND *, - fixS *)); - -/* Optional target supplied routine to record a fixup for an expression. */ -extern fixS * -md_cgen_record_fixup_exp PARAMS ((fragS *, int, const CGEN_INSN *, int, - const CGEN_OPERAND *, int, - expressionS *)); - -#endif /* GAS_CGEN_H */ diff --git a/gas/cond.c b/gas/cond.c deleted file mode 100644 index 025ca51b11a..00000000000 --- a/gas/cond.c +++ /dev/null @@ -1,537 +0,0 @@ -/* cond.c - conditional assembly pseudo-ops, and .include - Copyright (C) 1990, 91, 92, 93, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include "as.h" -#include "macro.h" - -#include "obstack.h" - -/* This is allocated to grow and shrink as .ifdef/.endif pairs are scanned. */ -struct obstack cond_obstack; - -struct file_line -{ - char *file; - unsigned int line; -}; - -/* We push one of these structures for each .if, and pop it at the - .endif. */ - -struct conditional_frame -{ - /* The source file & line number of the "if". */ - struct file_line if_file_line; - /* The source file & line of the "else". */ - struct file_line else_file_line; - /* The previous conditional. */ - struct conditional_frame *previous_cframe; - /* Have we seen an else yet? */ - int else_seen; - /* Whether we are currently ignoring input. */ - int ignoring; - /* Whether a conditional at a higher level is ignoring input. */ - int dead_tree; - /* Macro nesting level at which this conditional was created. */ - int macro_nest; -}; - -static void initialize_cframe PARAMS ((struct conditional_frame *cframe)); -static char *get_mri_string PARAMS ((int, int *)); - -static struct conditional_frame *current_cframe = NULL; - -void -s_ifdef (arg) - int arg; -{ - register char *name; /* points to name of symbol */ - register symbolS *symbolP; /* Points to symbol */ - struct conditional_frame cframe; - - SKIP_WHITESPACE (); /* Leading whitespace is part of operand. */ - name = input_line_pointer; - - if (!is_name_beginner (*name)) - { - as_bad (_("invalid identifier for \".ifdef\"")); - obstack_1grow (&cond_obstack, 0); - ignore_rest_of_line (); - } - else - { - char c; - - c = get_symbol_end (); - symbolP = symbol_find (name); - *input_line_pointer = c; - - initialize_cframe (&cframe); - cframe.ignoring = cframe.dead_tree || !((symbolP != 0) ^ arg); - current_cframe = ((struct conditional_frame *) - obstack_copy (&cond_obstack, &cframe, - sizeof (cframe))); - - if (LISTING_SKIP_COND () - && cframe.ignoring - && (cframe.previous_cframe == NULL - || ! cframe.previous_cframe->ignoring)) - listing_list (2); - - demand_empty_rest_of_line (); - } /* if a valid identifyer name */ -} /* s_ifdef() */ - -void -s_if (arg) - int arg; -{ - expressionS operand; - struct conditional_frame cframe; - int t; - char *stop = NULL; - char stopc; - - if (flag_mri) - stop = mri_comment_field (&stopc); - - SKIP_WHITESPACE (); /* Leading whitespace is part of operand. */ - - if (current_cframe != NULL && current_cframe->ignoring) - { - operand.X_add_number = 0; - while (! is_end_of_line[(unsigned char) *input_line_pointer]) - ++input_line_pointer; - } - else - { - expression (&operand); - if (operand.X_op != O_constant) - as_bad (_("non-constant expression in \".if\" statement")); - } - - switch ((operatorT) arg) - { - case O_eq: t = operand.X_add_number == 0; break; - case O_ne: t = operand.X_add_number != 0; break; - case O_lt: t = operand.X_add_number < 0; break; - case O_le: t = operand.X_add_number <= 0; break; - case O_ge: t = operand.X_add_number >= 0; break; - case O_gt: t = operand.X_add_number > 0; break; - default: - abort (); - return; - } - - /* If the above error is signaled, this will dispatch - using an undefined result. No big deal. */ - initialize_cframe (&cframe); - cframe.ignoring = cframe.dead_tree || ! t; - current_cframe = ((struct conditional_frame *) - obstack_copy (&cond_obstack, &cframe, sizeof (cframe))); - - if (LISTING_SKIP_COND () - && cframe.ignoring - && (cframe.previous_cframe == NULL - || ! cframe.previous_cframe->ignoring)) - listing_list (2); - - if (flag_mri) - mri_comment_end (stop, stopc); - - demand_empty_rest_of_line (); -} /* s_if() */ - -/* Get a string for the MRI IFC or IFNC pseudo-ops. */ - -static char * -get_mri_string (terminator, len) - int terminator; - int *len; -{ - char *ret; - char *s; - - SKIP_WHITESPACE (); - s = ret = input_line_pointer; - if (*input_line_pointer == '\'') - { - ++s; - ++input_line_pointer; - while (! is_end_of_line[(unsigned char) *input_line_pointer]) - { - *s++ = *input_line_pointer++; - if (s[-1] == '\'') - { - if (*input_line_pointer != '\'') - break; - ++input_line_pointer; - } - } - SKIP_WHITESPACE (); - } - else - { - while (*input_line_pointer != terminator - && ! is_end_of_line[(unsigned char) *input_line_pointer]) - ++input_line_pointer; - s = input_line_pointer; - while (s > ret && (s[-1] == ' ' || s[-1] == '\t')) - --s; - } - - *len = s - ret; - return ret; -} - -/* The MRI IFC and IFNC pseudo-ops. */ - -void -s_ifc (arg) - int arg; -{ - char *stop = NULL; - char stopc; - char *s1, *s2; - int len1, len2; - int res; - struct conditional_frame cframe; - - if (flag_mri) - stop = mri_comment_field (&stopc); - - s1 = get_mri_string (',', &len1); - - if (*input_line_pointer != ',') - as_bad (_("bad format for ifc or ifnc")); - else - ++input_line_pointer; - - s2 = get_mri_string (';', &len2); - - res = len1 == len2 && strncmp (s1, s2, len1) == 0; - - initialize_cframe (&cframe); - cframe.ignoring = cframe.dead_tree || ! (res ^ arg); - current_cframe = ((struct conditional_frame *) - obstack_copy (&cond_obstack, &cframe, sizeof (cframe))); - - if (LISTING_SKIP_COND () - && cframe.ignoring - && (cframe.previous_cframe == NULL - || ! cframe.previous_cframe->ignoring)) - listing_list (2); - - if (flag_mri) - mri_comment_end (stop, stopc); - - demand_empty_rest_of_line (); -} - -void -s_elseif (arg) - int arg; -{ - expressionS operand; - int t; - - if (current_cframe == NULL) - { - as_bad (_("\".elseif\" without matching \".if\" - ignored")); - - } - else if (current_cframe->else_seen) - { - as_bad (_("\".elseif\" after \".else\" - ignored")); - as_bad_where (current_cframe->else_file_line.file, - current_cframe->else_file_line.line, - _("here is the previous \"else\"")); - as_bad_where (current_cframe->if_file_line.file, - current_cframe->if_file_line.line, - _("here is the previous \"if\"")); - } - else - { - as_where (¤t_cframe->else_file_line.file, - ¤t_cframe->else_file_line.line); - - if (!current_cframe->dead_tree) - { - current_cframe->ignoring = !current_cframe->ignoring; - if (LISTING_SKIP_COND ()) - { - if (! current_cframe->ignoring) - listing_list (1); - else - listing_list (2); - } - } /* if not a dead tree */ - } /* if error else do it */ - - - SKIP_WHITESPACE (); /* Leading whitespace is part of operand. */ - - if (current_cframe != NULL && current_cframe->ignoring) - { - operand.X_add_number = 0; - while (! is_end_of_line[(unsigned char) *input_line_pointer]) - ++input_line_pointer; - } - else - { - expression (&operand); - if (operand.X_op != O_constant) - as_bad (_("non-constant expression in \".elseif\" statement")); - } - - switch ((operatorT) arg) - { - case O_eq: t = operand.X_add_number == 0; break; - case O_ne: t = operand.X_add_number != 0; break; - case O_lt: t = operand.X_add_number < 0; break; - case O_le: t = operand.X_add_number <= 0; break; - case O_ge: t = operand.X_add_number >= 0; break; - case O_gt: t = operand.X_add_number > 0; break; - default: - abort (); - return; - } - - current_cframe->ignoring = current_cframe->dead_tree || ! t; - - if (LISTING_SKIP_COND () - && current_cframe->ignoring - && (current_cframe->previous_cframe == NULL - || ! current_cframe->previous_cframe->ignoring)) - listing_list (2); - - demand_empty_rest_of_line (); -} - -void -s_endif (arg) - int arg ATTRIBUTE_UNUSED; -{ - struct conditional_frame *hold; - - if (current_cframe == NULL) - { - as_bad (_("\".endif\" without \".if\"")); - } - else - { - if (LISTING_SKIP_COND () - && current_cframe->ignoring - && (current_cframe->previous_cframe == NULL - || ! current_cframe->previous_cframe->ignoring)) - listing_list (1); - - hold = current_cframe; - current_cframe = current_cframe->previous_cframe; - obstack_free (&cond_obstack, hold); - } /* if one pop too many */ - - if (flag_mri) - { - while (! is_end_of_line[(unsigned char) *input_line_pointer]) - ++input_line_pointer; - } - - demand_empty_rest_of_line (); -} /* s_endif() */ - -void -s_else (arg) - int arg ATTRIBUTE_UNUSED; -{ - if (current_cframe == NULL) - { - as_bad (_(".else without matching .if - ignored")); - - } - else if (current_cframe->else_seen) - { - as_bad (_("duplicate \"else\" - ignored")); - as_bad_where (current_cframe->else_file_line.file, - current_cframe->else_file_line.line, - _("here is the previous \"else\"")); - as_bad_where (current_cframe->if_file_line.file, - current_cframe->if_file_line.line, - _("here is the previous \"if\"")); - } - else - { - as_where (¤t_cframe->else_file_line.file, - ¤t_cframe->else_file_line.line); - - if (!current_cframe->dead_tree) - { - current_cframe->ignoring = !current_cframe->ignoring; - if (LISTING_SKIP_COND ()) - { - if (! current_cframe->ignoring) - listing_list (1); - else - listing_list (2); - } - } /* if not a dead tree */ - - current_cframe->else_seen = 1; - } /* if error else do it */ - - if (flag_mri) - { - while (! is_end_of_line[(unsigned char) *input_line_pointer]) - ++input_line_pointer; - } - - demand_empty_rest_of_line (); -} /* s_else() */ - -void -s_ifeqs (arg) - int arg; -{ - char *s1, *s2; - int len1, len2; - int res; - struct conditional_frame cframe; - - s1 = demand_copy_C_string (&len1); - - SKIP_WHITESPACE (); - if (*input_line_pointer != ',') - { - as_bad (_(".ifeqs syntax error")); - ignore_rest_of_line (); - return; - } - - ++input_line_pointer; - - s2 = demand_copy_C_string (&len2); - - res = len1 == len2 && strncmp (s1, s2, len1) == 0; - - initialize_cframe (&cframe); - cframe.ignoring = cframe.dead_tree || ! (res ^ arg); - current_cframe = ((struct conditional_frame *) - obstack_copy (&cond_obstack, &cframe, sizeof (cframe))); - - if (LISTING_SKIP_COND () - && cframe.ignoring - && (cframe.previous_cframe == NULL - || ! cframe.previous_cframe->ignoring)) - listing_list (2); - - demand_empty_rest_of_line (); -} /* s_ifeqs() */ - -int -ignore_input () -{ - char *s; - - s = input_line_pointer; - - if (NO_PSEUDO_DOT || flag_m68k_mri) - { - if (s[-1] != '.') - --s; - } - else - { - if (s[-1] != '.') - return (current_cframe != NULL) && (current_cframe->ignoring); - } - - /* We cannot ignore certain pseudo ops. */ - if (((s[0] == 'i' - || s[0] == 'I') - && (!strncasecmp (s, "if", 2) - || !strncasecmp (s, "ifdef", 5) - || !strncasecmp (s, "ifndef", 6))) - || ((s[0] == 'e' - || s[0] == 'E') - && (!strncasecmp (s, "else", 4) - || !strncasecmp (s, "endif", 5) - || !strncasecmp (s, "endc", 4)))) - return 0; - - return (current_cframe != NULL) && (current_cframe->ignoring); -} /* ignore_input() */ - -static void -initialize_cframe (cframe) - struct conditional_frame *cframe; -{ - memset (cframe, 0, sizeof (*cframe)); - as_where (&cframe->if_file_line.file, - &cframe->if_file_line.line); - cframe->previous_cframe = current_cframe; - cframe->dead_tree = current_cframe != NULL && current_cframe->ignoring; - cframe->macro_nest = macro_nest; -} - -/* Give an error if a conditional is unterminated inside a macro or - the assembly as a whole. If NEST is non negative, we are being - called because of the end of a macro expansion. If NEST is - negative, we are being called at the of the input files. */ - -void -cond_finish_check (nest) - int nest; -{ - if (current_cframe != NULL && current_cframe->macro_nest >= nest) - { - if (nest >= 0) - as_bad (_("end of macro inside conditional")); - else - as_bad (_("end of file inside conditional")); - as_bad_where (current_cframe->if_file_line.file, - current_cframe->if_file_line.line, - _("here is the start of the unterminated conditional")); - if (current_cframe->else_seen) - as_bad_where (current_cframe->else_file_line.file, - current_cframe->else_file_line.line, - _("here is the \"else\" of the unterminated conditional")); - } -} - -/* This function is called when we exit out of a macro. We assume - that any conditionals which began within the macro are correctly - nested, and just pop them off the stack. */ - -void -cond_exit_macro (nest) - int nest; -{ - while (current_cframe != NULL && current_cframe->macro_nest >= nest) - { - struct conditional_frame *hold; - - hold = current_cframe; - current_cframe = current_cframe->previous_cframe; - obstack_free (&cond_obstack, hold); - } -} - -/* end of cond.c */ diff --git a/gas/config-gas.com b/gas/config-gas.com deleted file mode 100644 index cf5248af5da..00000000000 --- a/gas/config-gas.com +++ /dev/null @@ -1,186 +0,0 @@ -$!config-gas.com -$! This file sets things up to build gas on a VMS system to generate object -$! files for a VMS system. We do not use the configure script, since we -$! do not have /bin/sh to execute it. -$! -$! -$ gas_host="vms" -$ arch_indx = 1 + ((f$getsyi("CPU").ge.128).and.1) ! vax==1, alpha==2 -$ arch = f$element(arch_indx,"|","|VAX|Alpha|") -$ if arch.eqs."VAX" -$ then -$ cpu_type="vax" -$ obj_format="vms" -$ atof="vax" -$ else -$ cpu_type="alpha" -$ obj_format="evax" -$ atof="ieee" -$ endif -$ emulation="generic" -$! -$ DELETE = "delete/noConfirm" -$ ECHO = "write sys$output" -$! -$! Target specific information -$ call make "targ-cpu.h" "[.config]tc-''cpu_type'.h" -$ call make "targ-env.h" "[.config]te-''emulation'.h" -$! -$! Code to handle the object file format. -$ call make "obj-format.h" "[.config]obj-''obj_format'.h" -$! -$! (not currently used for vax or alpha) -$ call make "itbl-cpu.h" "[.config]itbl-''cpu_type'.h" -$! -$! -$! Create the file version.opt, which helps identify the executable. -$! -$if f$trnlnm("IFILE$").nes."" then close/noLog ifile$ -$search CONFIGURE.IN "AM_INIT_AUTOMAKE"/Exact/Output=config-gas-tmp.tmp -$open ifile$ config-gas-tmp.tmp -$read ifile$ line -$close ifile$ -$DELETE config-gas-tmp.tmp;* -$! Discard "AM_INIT_AUTOMAKE(gas, " and ")" parts. -$ijk=f$locate(",",line)+2 -$line=f$extract(ijk,f$length(line)-ijk,line) -$ijk=f$locate(")",line) -$line=f$extract(0,ijk,line) -$! -$ if f$search("version.opt").nes."" then DELETE version.opt;* -$copy _NL: version.opt -$open/Append ifile$ version.opt -$write ifile$ "identification="+""""+line+"""" -$close ifile$ -$! -$! Now write config.h. -$! -$ if f$search("config.h").nes."" then DELETE config.h;* -$copy _NL: config.h -$open/Append ifile$ config.h -$write ifile$ "/* config.h. Generated by config-gas.com. */ -$write ifile$ "#ifndef VERSION" -$write ifile$ "#define VERSION """,line,"""" -$write ifile$ "#endif" -$write ifile$ "/*--*/" -$if arch .eqs. "VAX" -$then -$append [.config]vms-conf.h ifile$: -$else -$ append [.config]vms-a-conf.h ifile$: -$endif -$close ifile$ -$ECHO "Created config.h." -$! -$! Check for, and possibly make, header file . -$! -$ if f$search("tmp-chk-h.*").nes."" then DELETE tmp-chk-h.*;* -$!can't use simple `#include HDR' with `gcc /Define="HDR="' -$!because the 2.6.[0-3] preprocessor handles it wrong (VMS-specific gcc bug) -$ create tmp-chk-h.c -int tmp_chk_h; /* guarantee non-empty output */ -#ifdef HAVE_STDIO_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_UNIXIO_H -#include -#endif -#ifdef HAVE_UNIXLIB_H -#include -#endif -$ on warning then continue -$ CHECK = "call tmp_chk_h" -$ CHECK "HAVE_STDIO_H" -$ if .not.$status -$ then type sys$input: - -? could not compile . - - If you're compiling with DEC C or VAX C, create config.status as an - empty file and start gnu make again. - - If you're compiling with GNU C, there is some setup problem and - gas configuration cannot proceed. - -$ DELETE tmp-chk-h.c;* -$ exit %x002C -$ endif -$! -$ CHECK "HAVE_UNISTD_H" -$ if .not.$status -$ then -$ if f$trnlnm("HFILE$").nes."" then close/noLog hfile$ -$ CHECK "HAVE_UNIXIO_H" -$ got_unixio = ($status .and. 1) -$ CHECK "HAVE_UNIXLIB_H" -$ got_unixlib = ($status .and. 1) -$ create []unistd.h !with rudimentary contents -/* substitute for building gas */ -#ifndef UNISTD_H -#define UNISTD_H - -$ open/Append hfile$ []unistd.h -$ if got_unixio -$ then write hfile$ "#include " -$ else append sys$input: hfile$: -/* some of the routines normally prototyped in */ -extern int creat(), open(), close(), read(), write(); -extern int access(), dup(), dup2(), fstat(), stat(); -extern long lseek(); -$ endif -$ write hfile$ "" -$ if got_unixlib -$ then write hfile$ "#include " -$ else append sys$input: hfile$: -/* some of the routines normally prototyped in */ -extern char *sbrk(), *getcwd(), *cuserid(); -extern int brk(), chdir(), chmod(), chown(), mkdir(); -extern unsigned getuid(), umask(); -$ endif -$ append sys$input: hfile$: - -#endif /*UNISTD_H*/ -$ close hfile$ -$ ECHO "Created ""[]unistd.h""." -$ endif !gcc '#include ' failed -$ DELETE tmp-chk-h.c;* -$ -$tmp_chk_h: subroutine -$ set noOn -$ hname = f$edit("<" + (p1 - "HAVE_" - "_H") + ".h>","LOWERCASE") -$ write sys$output "Checking for ''hname'." -$ if f$search("tmp-chk-h.obj").nes."" then DELETE tmp-chk-h.obj;* -$ define/noLog sys$error _NL: !can't use /User_Mode here due to gcc -$ define/noLog sys$output _NL: ! driver's use of multiple image activation -$ gcc /Include=([],[-.include]) /Define=("''p1'") tmp-chk-h.c -$!can't just check $status; gcc 2.6.[0-3] preprocessor doesn't set it correctly -$ ok = (($status.and.1).and.(f$search("tmp-chk-h.obj").nes."")) .or. %x10000000 -$ deassign sys$error !restore, more or less -$ deassign sys$output -$ if ok then DELETE tmp-chk-h.obj;* -$ exit ok -$ endsubroutine !tmp_chk_h -$ -$! -$! Done -$! -$ if f$search("config.status") .nes. "" then DELETE config.status;* -$ open/write cfile []config.status -$ write cfile "Links are now set up for use with a "+arch+" running VMS." -$ close cfile -$ type []config.status -$exit -$! -$! -$make: subroutine -$ if f$search(p1).nes."" then DELETE 'p1';* -$ create 'p1' -$ if f$trnlnm("IFILE$").nes."" then close/noLog ifile$ -$ open/Append ifile$ 'p1' -$ write ifile$ "#include ""''f$string(p2 - "[.config]")'""" -$ close ifile$ -$ ECHO "Created ''p1' for ''p2'." -$endsubroutine !make diff --git a/gas/config.in b/gas/config.in deleted file mode 100644 index 81f2adac60b..00000000000 --- a/gas/config.in +++ /dev/null @@ -1,273 +0,0 @@ -/* config.in. Generated automatically from configure.in by autoheader. */ - -/* Define if using alloca.c. */ -#undef C_ALLOCA - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. - This function is required for alloca.c support on those systems. */ -#undef CRAY_STACKSEG_END - -/* Define if you have alloca, as a function or macro. */ -#undef HAVE_ALLOCA - -/* Define if you have and it should be used (not on Ultrix). */ -#undef HAVE_ALLOCA_H - -/* Define if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define as __inline if that's what the C compiler calls it. */ -#undef inline - -/* Define to `long' if doesn't define. */ -#undef off_t - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - -/* Define to `unsigned' if doesn't define. */ -#undef size_t - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown - */ -#undef STACK_DIRECTION - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if lex declares yytext as a char * by default, not a char[]. */ -#undef YYTEXT_POINTER - -/* Define if you have the __argz_count function. */ -#undef HAVE___ARGZ_COUNT - -/* Define if you have the __argz_next function. */ -#undef HAVE___ARGZ_NEXT - -/* Define if you have the __argz_stringify function. */ -#undef HAVE___ARGZ_STRINGIFY - -/* Define if you have the dcgettext function. */ -#undef HAVE_DCGETTEXT - -/* Define if you have the getcwd function. */ -#undef HAVE_GETCWD - -/* Define if you have the getpagesize function. */ -#undef HAVE_GETPAGESIZE - -/* Define if you have the munmap function. */ -#undef HAVE_MUNMAP - -/* Define if you have the putenv function. */ -#undef HAVE_PUTENV - -/* Define if you have the remove function. */ -#undef HAVE_REMOVE - -/* Define if you have the sbrk function. */ -#undef HAVE_SBRK - -/* Define if you have the setenv function. */ -#undef HAVE_SETENV - -/* Define if you have the setlocale function. */ -#undef HAVE_SETLOCALE - -/* Define if you have the stpcpy function. */ -#undef HAVE_STPCPY - -/* Define if you have the strcasecmp function. */ -#undef HAVE_STRCASECMP - -/* Define if you have the strchr function. */ -#undef HAVE_STRCHR - -/* Define if you have the unlink function. */ -#undef HAVE_UNLINK - -/* Define if you have the header file. */ -#undef HAVE_ARGZ_H - -/* Define if you have the header file. */ -#undef HAVE_ERRNO_H - -/* Define if you have the header file. */ -#undef HAVE_LIMITS_H - -/* Define if you have the header file. */ -#undef HAVE_LOCALE_H - -/* Define if you have the header file. */ -#undef HAVE_MALLOC_H - -/* Define if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define if you have the header file. */ -#undef HAVE_NL_TYPES_H - -/* Define if you have the header file. */ -#undef HAVE_STDARG_H - -/* Define if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define if you have the header file. */ -#undef HAVE_STRING_H - -/* Define if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define if you have the header file. */ -#undef HAVE_VALUES_H - -/* Define if you have the header file. */ -#undef HAVE_VARARGS_H - -/* Name of package */ -#undef PACKAGE - -/* Version number of package */ -#undef VERSION - -/* Define if defaulting to ELF on SCO 5. */ -#undef SCO_ELF - -/* Use ELF stabs for MIPS, not ECOFF stabs */ -#undef MIPS_STABS_ELF - -/* Define if default target is PowerPC Solaris. */ -#undef TARGET_SOLARIS_COMMENT - -/* Define as 1 if big endian. */ -#undef TARGET_BYTES_BIG_ENDIAN - -/* Default architecture. */ -#undef DEFAULT_ARCH - -/* Using cgen code? */ -#undef USING_CGEN - -/* Using i386 COFF? */ -#undef I386COFF - -/* Using m68k COFF? */ -#undef M68KCOFF - -/* Using m88k COFF? */ -#undef M88KCOFF - -/* a.out support? */ -#undef OBJ_MAYBE_AOUT - -/* b.out support? */ -#undef OBJ_MAYBE_BOUT - -/* COFF support? */ -#undef OBJ_MAYBE_COFF - -/* ECOFF support? */ -#undef OBJ_MAYBE_ECOFF - -/* ELF support? */ -#undef OBJ_MAYBE_ELF - -/* generic support? */ -#undef OBJ_MAYBE_GENERIC - -/* HP300 support? */ -#undef OBJ_MAYBE_HP300 - -/* IEEE support? */ -#undef OBJ_MAYBE_IEEE - -/* SOM support? */ -#undef OBJ_MAYBE_SOM - -/* VMS support? */ -#undef OBJ_MAYBE_VMS - -/* Use emulation support? */ -#undef USE_EMULATIONS - -/* Supported emulations. */ -#undef EMULATIONS - -/* Default emulation. */ -#undef DEFAULT_EMULATION - -/* old COFF support? */ -#undef MANY_SEGMENTS - -/* Use BFD interface? */ -#undef BFD_ASSEMBLER - -/* Target alias. */ -#undef TARGET_ALIAS - -/* Canonical target. */ -#undef TARGET_CANONICAL - -/* Target CPU. */ -#undef TARGET_CPU - -/* Target vendor. */ -#undef TARGET_VENDOR - -/* Target OS. */ -#undef TARGET_OS - -/* Define if you have the stpcpy function */ -#undef HAVE_STPCPY - -/* Define if your locale.h file contains LC_MESSAGES. */ -#undef HAVE_LC_MESSAGES - -/* Define to 1 if NLS is requested */ -#undef ENABLE_NLS - -/* Define as 1 if you have gettext and don't want to use GNU gettext. */ -#undef HAVE_GETTEXT - -/* Compiling cross-assembler? */ -#undef CROSS_COMPILE - -/* assert broken? */ -#undef BROKEN_ASSERT - -/* Define if strstr is not declared in system header files. */ -#undef NEED_DECLARATION_STRSTR - -/* Define if malloc is not declared in system header files. */ -#undef NEED_DECLARATION_MALLOC - -/* Define if free is not declared in system header files. */ -#undef NEED_DECLARATION_FREE - -/* Define if sbrk is not declared in system header files. */ -#undef NEED_DECLARATION_SBRK - -/* Define if environ is not declared in system header files. */ -#undef NEED_DECLARATION_ENVIRON - -/* Define if errno is not declared in system header files. */ -#undef NEED_DECLARATION_ERRNO - diff --git a/gas/config/aout_gnu.h b/gas/config/aout_gnu.h deleted file mode 100644 index badf9cb21c7..00000000000 --- a/gas/config/aout_gnu.h +++ /dev/null @@ -1,455 +0,0 @@ -/* This file is aout_gnu.h - - Copyright (C) 1987-1992 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef __A_OUT_GNU_H__ -#define __A_OUT_GNU_H__ - -/* There are two main flavours of a.out, one which uses the standard - relocations, and one which uses extended relocations. - - Today, the extended reloc uses are - TC_SPARC, TC_A29K - - each must define the enum reloc_type - -*/ - -#define USE_EXTENDED_RELOC (defined(TC_SPARC) || defined(TC_A29K)) - -#if defined(TC_SPARC) || defined(TC_A29K) -enum reloc_type - { - RELOC_8, RELOC_16, RELOC_32,/* simple relocations */ - RELOC_DISP8, RELOC_DISP16, RELOC_DISP32, /* pc-rel displacement */ - RELOC_WDISP30, RELOC_WDISP22, - RELOC_HI22, RELOC_22, - RELOC_13, RELOC_LO10, - RELOC_SFA_BASE, RELOC_SFA_OFF13, - RELOC_BASE10, RELOC_BASE13, RELOC_BASE22, /* P.I.C. (base-relative) */ - RELOC_PC10, RELOC_PC22, /* for some sort of pc-rel P.I.C. (?) */ - RELOC_JMP_TBL, /* P.I.C. jump table */ - RELOC_SEGOFF16, /* reputedly for shared libraries somehow */ - RELOC_GLOB_DAT, RELOC_JMP_SLOT, RELOC_RELATIVE, - RELOC_10, RELOC_11, - RELOC_WDISP2_14, - RELOC_WDISP19, - RELOC_HHI22, - RELOC_HLO10, - - /* 29K relocation types */ - RELOC_JUMPTARG, RELOC_CONST, RELOC_CONSTH, - - RELOC_WDISP14, RELOC_WDISP21, - - NO_RELOC - }; - -#endif /* TC_SPARC or TC_A29K */ - - -#define __GNU_EXEC_MACROS__ - -#ifndef __STRUCT_EXEC_OVERRIDE__ - -/* This is the layout on disk of a Unix V7, Berkeley, SunOS, Vax Ultrix - "struct exec". Don't assume that on this machine, the "struct exec" - will lay out the same sizes or alignments. */ - -struct exec_bytes - { - unsigned char a_info[4]; - unsigned char a_text[4]; - unsigned char a_data[4]; - unsigned char a_bss[4]; - unsigned char a_syms[4]; - unsigned char a_entry[4]; - unsigned char a_trsize[4]; - unsigned char a_drsize[4]; - }; - -/* How big the "struct exec" is on disk */ -#define EXEC_BYTES_SIZE (8 * 4) - -/* This is the layout in memory of a "struct exec" while we process it. */ - -struct exec -{ - unsigned long a_info; /* Use macros N_MAGIC, etc for access */ - unsigned a_text; /* length of text, in bytes */ - unsigned a_data; /* length of data, in bytes */ - unsigned a_bss; /* length of uninitialized data area for file, in bytes */ - unsigned a_syms; /* length of symbol table data in file, in bytes */ - unsigned a_entry; /* start address */ - unsigned a_trsize; /* length of relocation info for text, in bytes */ - unsigned a_drsize; /* length of relocation info for data, in bytes */ -}; - -#endif /* __STRUCT_EXEC_OVERRIDE__ */ - -/* these go in the N_MACHTYPE field */ -/* These symbols could be defined by code from Suns...punt 'em */ -#undef M_UNKNOWN -#undef M_68010 -#undef M_68020 -#undef M_SPARC -enum machine_type - { - M_UNKNOWN = 0, - M_68010 = 1, - M_68020 = 2, - M_SPARC = 3, - /* skip a bunch so we don't run into any of sun's numbers */ - M_386 = 100, - M_29K = 101, - M_RS6000 = 102, /* IBM RS/6000 */ - /* HP/BSD formats */ - M_HP200 = 200, /* hp200 (68010) BSD binary */ - M_HP300 = 300, /* hp300 (68020+68881) BSD binary */ - M_HPUX23 = 0x020C /* hp200/300 HPUX binary */ - }; - -#define N_MAGIC(exec) ((exec).a_info & 0xffff) -#define N_MACHTYPE(exec) ((enum machine_type)(((exec).a_info >> 16) & 0xff)) -#define N_FLAGS(exec) (((exec).a_info >> 24) & 0xff) -#define N_SET_INFO(exec, magic, type, flags) \ - ((exec).a_info = ((magic) & 0xffff) \ - | (((int)(type) & 0xff) << 16) \ - | (((flags) & 0xff) << 24)) -#define N_SET_MAGIC(exec, magic) \ - ((exec).a_info = (((exec).a_info & 0xffff0000) | ((magic) & 0xffff))) - -#define N_SET_MACHTYPE(exec, machtype) \ - ((exec).a_info = \ - ((exec).a_info&0xff00ffff) | ((((int)(machtype))&0xff) << 16)) - -#define N_SET_FLAGS(exec, flags) \ - ((exec).a_info = \ - ((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24)) - -/* Code indicating object file or impure executable. */ -#ifndef OMAGIC -#define OMAGIC 0407 -#endif -/* Code indicating pure executable. */ -#define NMAGIC 0410 -/* Code indicating demand-paged executable. */ -#define ZMAGIC 0413 - -/* Virtual Address of text segment from the a.out file. For OMAGIC, - (almost always "unlinked .o's" these days), should be zero. - For linked files, should reflect reality if we know it. */ - -#ifndef N_TXTADDR -#define N_TXTADDR(x) (N_MAGIC(x)==OMAGIC? 0 : TEXT_START_ADDR) -#endif - -#ifndef N_BADMAG -#define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ - && N_MAGIC(x) != NMAGIC \ - && N_MAGIC(x) != ZMAGIC) -#endif - -/* By default, segment size is constant. But on some machines, it can - be a function of the a.out header (e.g. machine type). */ -#ifndef N_SEGSIZE -#define N_SEGSIZE(x) SEGMENT_SIZE -#endif - -/* This complexity is for encapsulated COFF support */ -#ifndef _N_HDROFF -#define _N_HDROFF(x) (N_SEGSIZE(x) - sizeof (struct exec)) -#endif - -#ifndef N_TXTOFF -#define N_TXTOFF(x) (N_MAGIC(x) == ZMAGIC ? \ - _N_HDROFF((x)) + sizeof (struct exec) : \ - sizeof (struct exec)) -#endif - - -#ifndef N_DATOFF -#define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text ) -#endif - -#ifndef N_TRELOFF -#define N_TRELOFF(x) ( N_DATOFF(x) + (x).a_data ) -#endif - -#ifndef N_DRELOFF -#define N_DRELOFF(x) ( N_TRELOFF(x) + (x).a_trsize ) -#endif - -#ifndef N_SYMOFF -#define N_SYMOFF(x) ( N_DRELOFF(x) + (x).a_drsize ) -#endif - -#ifndef N_STROFF -#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms ) -#endif - -/* Address of text segment in memory after it is loaded. */ -#ifndef N_TXTADDR -#define N_TXTADDR(x) 0 -#endif - -#ifndef N_DATADDR -#define N_DATADDR(x) \ - (N_MAGIC(x)==OMAGIC? (N_TXTADDR(x)+(x).a_text) \ - : (N_SEGSIZE(x) + ((N_TXTADDR(x)+(x).a_text-1) & ~(N_SEGSIZE(x)-1)))) -#endif - -/* Address of bss segment in memory after it is loaded. */ -#define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data) - -struct nlist - { - union - { - char *n_name; - struct nlist *n_next; - long n_strx; - } - n_un; - unsigned char n_type; - char n_other; - short n_desc; - unsigned long n_value; - }; - -#define N_UNDF 0 -#define N_ABS 2 -#define N_TEXT 4 -#define N_DATA 6 -#define N_BSS 8 -#define N_COMM 0x12 /* common (visible in shared lib commons) */ -#define N_FN 0x1F /* File name of a .o file */ - -/* Note: N_EXT can only usefully be OR-ed with N_UNDF, N_ABS, N_TEXT, - N_DATA, or N_BSS. When the low-order bit of other types is set, - (e.g. N_WARNING versus N_FN), they are two different types. */ -#define N_EXT 1 -#define N_TYPE 036 -#define N_STAB 0340 - -/* The following type indicates the definition of a symbol as being - an indirect reference to another symbol. The other symbol - appears as an undefined reference, immediately following this symbol. - - Indirection is asymmetrical. The other symbol's value will be used - to satisfy requests for the indirect symbol, but not vice versa. - If the other symbol does not have a definition, libraries will - be searched to find a definition. */ - -#define N_INDR 0xa - -/* The following symbols refer to set elements. - All the N_SET[ATDB] symbols with the same name form one set. - Space is allocated for the set in the text section, and each set - element's value is stored into one word of the space. - The first word of the space is the length of the set (number of elements). - - The address of the set is made into an N_SETV symbol - whose name is the same as the name of the set. - This symbol acts like a N_DATA global symbol - in that it can satisfy undefined external references. */ - -/* These appear as input to LD, in a .o file. */ -#define N_SETA 0x14 /* Absolute set element symbol */ -#define N_SETT 0x16 /* Text set element symbol */ -#define N_SETD 0x18 /* Data set element symbol */ -#define N_SETB 0x1A /* Bss set element symbol */ - -/* This is output from LD. */ -#define N_SETV 0x1C /* Pointer to set vector in data area. */ - -/* Warning symbol. The text gives a warning message, the next symbol - in the table will be undefined. When the symbol is referenced, the - message is printed. */ - -#define N_WARNING 0x1e - -/* Weak symbols. These are a GNU extension to the a.out format. The - semantics are those of ELF weak symbols. Weak symbols are always - externally visible. The N_WEAK? values are squeezed into the - available slots. The value of a N_WEAKU symbol is 0. The values - of the other types are the definitions. */ -#define N_WEAKU 0x0d /* Weak undefined symbol. */ -#define N_WEAKA 0x0e /* Weak absolute symbol. */ -#define N_WEAKT 0x0f /* Weak text symbol. */ -#define N_WEAKD 0x10 /* Weak data symbol. */ -#define N_WEAKB 0x11 /* Weak bss symbol. */ - -/* This structure describes a single relocation to be performed. - The text-relocation section of the file is a vector of these structures, - all of which apply to the text section. - Likewise, the data-relocation section applies to the data section. */ - -/* The following enum and struct were borrowed from SunOS's - /usr/include/sun4/a.out.h and extended to handle - other machines. It is currently used on SPARC and AMD 29000. - - reloc_ext_bytes is how it looks on disk. reloc_info_extended is - how we might process it on a native host. */ -#if USE_EXTENDED_RELOC - -struct reloc_ext_bytes - { - unsigned char r_address[4]; - unsigned char r_index[3]; - unsigned char r_bits[1]; - unsigned char r_addend[4]; - }; - - -#define RELOC_EXT_BITS_EXTERN_BIG 0x80 -#define RELOC_EXT_BITS_EXTERN_LITTLE 0x01 - -#define RELOC_EXT_BITS_TYPE_BIG 0x1F -#define RELOC_EXT_BITS_TYPE_SH_BIG 0 -#define RELOC_EXT_BITS_TYPE_LITTLE 0xF8 -#define RELOC_EXT_BITS_TYPE_SH_LITTLE 3 - -#define RELOC_EXT_SIZE 12 /* Bytes per relocation entry */ - -struct reloc_info_extended -{ - unsigned long r_address; - unsigned int r_index:24; -# define r_symbolnum r_index - unsigned r_extern:1; - unsigned:2; - /* RS/6000 compiler does not support enum bitfield - enum reloc_type r_type:5; */ - enum reloc_type r_type; - long int r_addend; -}; - -#else - -/* The standard, old-fashioned, Berkeley compatible relocation struct */ - - - -#ifdef TC_I860 -/* NOTE: three bits max, see struct reloc_info_i860.r_type */ -enum i860_reloc_type - { - NO_RELOC = 0, BRADDR, LOW0, LOW1, LOW2, LOW3, LOW4, SPLIT0, SPLIT1, SPLIT2, RELOC_32, - }; - -typedef enum i860_reloc_type reloc_type; - -/* NOTE: two bits max, see reloc_info_i860.r_type */ -enum highlow_type - { - NO_SPEC = 0, PAIR, HIGH, HIGHADJ, - }; - - -struct reloc_info_i860 -{ - unsigned long r_address; - /* - * Using bit fields here is a bad idea because the order is not portable. :-( - */ - unsigned int r_symbolnum:24; - unsigned int r_pcrel:1; - unsigned int r_extern:1; - /* combining the two field simplifies the argument passing in "new_fix()" */ - /* and is compatible with the existing Sparc #ifdef's */ - /* r_type: highlow_type - bits 5,4; reloc_type - bits 3-0 */ - unsigned int r_type:6; - long r_addend; -}; - -#endif /* TC_I860 */ - - -struct reloc_std_bytes - { - unsigned char r_address[4]; - unsigned char r_index[3]; - unsigned char r_bits[1]; - }; - -#define RELOC_STD_BITS_PCREL_BIG 0x80 -#define RELOC_STD_BITS_PCREL_LITTLE 0x01 - -#define RELOC_STD_BITS_LENGTH_BIG 0x60 -#define RELOC_STD_BITS_LENGTH_SH_BIG 5 /* To shift to units place */ -#define RELOC_STD_BITS_LENGTH_LITTLE 0x06 -#define RELOC_STD_BITS_LENGTH_SH_LITTLE 1 - -#define RELOC_STD_BITS_EXTERN_BIG 0x10 -#define RELOC_STD_BITS_EXTERN_LITTLE 0x08 - -#define RELOC_STD_BITS_BASEREL_BIG 0x08 -#define RELOC_STD_BITS_BASEREL_LITTLE 0x08 - -#define RELOC_STD_BITS_JMPTABLE_BIG 0x04 -#define RELOC_STD_BITS_JMPTABLE_LITTLE 0x04 - -#define RELOC_STD_BITS_RELATIVE_BIG 0x02 -#define RELOC_STD_BITS_RELATIVE_LITTLE 0x02 - -#define RELOC_STD_SIZE 8 /* Bytes per relocation entry */ - -#endif /* USE_EXTENDED_RELOC */ - -#ifndef CUSTOM_RELOC_FORMAT -struct relocation_info -{ - /* Address (within segment) to be relocated. */ - int r_address; - /* The meaning of r_symbolnum depends on r_extern. */ - unsigned int r_symbolnum:24; - /* Nonzero means value is a pc-relative offset - and it should be relocated for changes in its own address - as well as for changes in the symbol or section specified. */ - unsigned int r_pcrel:1; - /* Length (as exponent of 2) of the field to be relocated. - Thus, a value of 2 indicates 1<<2 bytes. */ - unsigned int r_length:2; - /* 1 => relocate with value of symbol. - r_symbolnum is the index of the symbol - in file's the symbol table. - 0 => relocate with the address of a segment. - r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS - (the N_EXT bit may be set also, but signifies nothing). */ - unsigned int r_extern:1; - /* The next three bits are for SunOS shared libraries, and seem to - be undocumented. */ -#ifdef TC_NS32K - unsigned int r_bsr:1; - unsigned int r_disp:2; -#else - unsigned int r_baserel:1; /* Linkage table relative */ - unsigned int r_jmptable:1; /* pc-relative to jump table */ - unsigned int r_relative:1; /* "relative relocation" */ -#endif /* TC_NS32K */ - /* unused */ - unsigned int r_pad:1; /* Padding -- set to zero */ -}; - -#endif /* CUSTOM_RELOC_FORMAT */ - -#endif /* __A_OUT_GNU_H__ */ - -/* end of aout_gnu.h */ diff --git a/gas/config/atof-ieee.c b/gas/config/atof-ieee.c deleted file mode 100644 index dcda1bcb6a2..00000000000 --- a/gas/config/atof-ieee.c +++ /dev/null @@ -1,715 +0,0 @@ -/* atof_ieee.c - turn a Flonum into an IEEE floating point number - Copyright (C) 1987, 92, 93, 94, 95, 96, 97, 98, 1999 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include "as.h" - -/* Flonums returned here. */ -extern FLONUM_TYPE generic_floating_point_number; - -static int next_bits PARAMS ((int)); -static void unget_bits PARAMS ((int)); -static void make_invalid_floating_point_number PARAMS ((LITTLENUM_TYPE *)); - -extern const char EXP_CHARS[]; -/* Precision in LittleNums. */ -/* Don't count the gap in the m68k extended precision format. */ -#define MAX_PRECISION (5) -#define F_PRECISION (2) -#define D_PRECISION (4) -#define X_PRECISION (5) -#define P_PRECISION (5) - -/* Length in LittleNums of guard bits. */ -#define GUARD (2) - -static const unsigned long mask[] = -{ - 0x00000000, - 0x00000001, - 0x00000003, - 0x00000007, - 0x0000000f, - 0x0000001f, - 0x0000003f, - 0x0000007f, - 0x000000ff, - 0x000001ff, - 0x000003ff, - 0x000007ff, - 0x00000fff, - 0x00001fff, - 0x00003fff, - 0x00007fff, - 0x0000ffff, - 0x0001ffff, - 0x0003ffff, - 0x0007ffff, - 0x000fffff, - 0x001fffff, - 0x003fffff, - 0x007fffff, - 0x00ffffff, - 0x01ffffff, - 0x03ffffff, - 0x07ffffff, - 0x0fffffff, - 0x1fffffff, - 0x3fffffff, - 0x7fffffff, - 0xffffffff, -}; - - -static int bits_left_in_littlenum; -static int littlenums_left; -static LITTLENUM_TYPE *littlenum_pointer; - -static int -next_bits (number_of_bits) - int number_of_bits; -{ - int return_value; - - if (!littlenums_left) - return (0); - if (number_of_bits >= bits_left_in_littlenum) - { - return_value = mask[bits_left_in_littlenum] & *littlenum_pointer; - number_of_bits -= bits_left_in_littlenum; - return_value <<= number_of_bits; - - if (--littlenums_left) - { - bits_left_in_littlenum = LITTLENUM_NUMBER_OF_BITS - number_of_bits; - --littlenum_pointer; - return_value |= (*littlenum_pointer >> bits_left_in_littlenum) & mask[number_of_bits]; - } - } - else - { - bits_left_in_littlenum -= number_of_bits; - return_value = mask[number_of_bits] & (*littlenum_pointer >> bits_left_in_littlenum); - } - return (return_value); -} - -/* Num had better be less than LITTLENUM_NUMBER_OF_BITS */ -static void -unget_bits (num) - int num; -{ - if (!littlenums_left) - { - ++littlenum_pointer; - ++littlenums_left; - bits_left_in_littlenum = num; - } - else if (bits_left_in_littlenum + num > LITTLENUM_NUMBER_OF_BITS) - { - bits_left_in_littlenum = num - (LITTLENUM_NUMBER_OF_BITS - bits_left_in_littlenum); - ++littlenum_pointer; - ++littlenums_left; - } - else - bits_left_in_littlenum += num; -} - -static void -make_invalid_floating_point_number (words) - LITTLENUM_TYPE *words; -{ - as_bad (_("cannot create floating-point number")); - words[0] = (LITTLENUM_TYPE) ((unsigned) -1) >> 1; /* Zero the leftmost bit */ - words[1] = (LITTLENUM_TYPE) -1; - words[2] = (LITTLENUM_TYPE) -1; - words[3] = (LITTLENUM_TYPE) -1; - words[4] = (LITTLENUM_TYPE) -1; - words[5] = (LITTLENUM_TYPE) -1; -} - -/************************************************************************\ - * Warning: this returns 16-bit LITTLENUMs. It is up to the caller * - * to figure out any alignment problems and to conspire for the * - * bytes/word to be emitted in the right order. Bigendians beware! * - * * -\************************************************************************/ - -/* Note that atof-ieee always has X and P precisions enabled. it is up - to md_atof to filter them out if the target machine does not support - them. */ - -/* Returns pointer past text consumed. */ -char * -atof_ieee (str, what_kind, words) - char *str; /* Text to convert to binary. */ - int what_kind; /* 'd', 'f', 'g', 'h' */ - LITTLENUM_TYPE *words; /* Build the binary here. */ -{ - /* Extra bits for zeroed low-order bits. The 1st MAX_PRECISION are - zeroed, the last contain flonum bits. */ - static LITTLENUM_TYPE bits[MAX_PRECISION + MAX_PRECISION + GUARD]; - char *return_value; - /* Number of 16-bit words in the format. */ - int precision; - long exponent_bits; - FLONUM_TYPE save_gen_flonum; - - /* We have to save the generic_floating_point_number because it - contains storage allocation about the array of LITTLENUMs where - the value is actually stored. We will allocate our own array of - littlenums below, but have to restore the global one on exit. */ - save_gen_flonum = generic_floating_point_number; - - return_value = str; - generic_floating_point_number.low = bits + MAX_PRECISION; - generic_floating_point_number.high = NULL; - generic_floating_point_number.leader = NULL; - generic_floating_point_number.exponent = 0; - generic_floating_point_number.sign = '\0'; - - /* Use more LittleNums than seems necessary: the highest flonum may - have 15 leading 0 bits, so could be useless. */ - - memset (bits, '\0', sizeof (LITTLENUM_TYPE) * MAX_PRECISION); - - switch (what_kind) - { - case 'f': - case 'F': - case 's': - case 'S': - precision = F_PRECISION; - exponent_bits = 8; - break; - - case 'd': - case 'D': - case 'r': - case 'R': - precision = D_PRECISION; - exponent_bits = 11; - break; - - case 'x': - case 'X': - case 'e': - case 'E': - precision = X_PRECISION; - exponent_bits = 15; - break; - - case 'p': - case 'P': - - precision = P_PRECISION; - exponent_bits = -1; - break; - - default: - make_invalid_floating_point_number (words); - return (NULL); - } - - generic_floating_point_number.high - = generic_floating_point_number.low + precision - 1 + GUARD; - - if (atof_generic (&return_value, ".", EXP_CHARS, - &generic_floating_point_number)) - { - make_invalid_floating_point_number (words); - return (NULL); - } - gen_to_words (words, precision, exponent_bits); - - /* Restore the generic_floating_point_number's storage alloc (and - everything else). */ - generic_floating_point_number = save_gen_flonum; - - return return_value; -} - -/* Turn generic_floating_point_number into a real float/double/extended. */ -int -gen_to_words (words, precision, exponent_bits) - LITTLENUM_TYPE *words; - int precision; - long exponent_bits; -{ - int return_value = 0; - - long exponent_1; - long exponent_2; - long exponent_3; - long exponent_4; - int exponent_skippage; - LITTLENUM_TYPE word1; - LITTLENUM_TYPE *lp; - LITTLENUM_TYPE *words_end; - - words_end = words + precision; -#ifdef TC_M68K - if (precision == X_PRECISION) - /* On the m68k the extended precision format has a gap of 16 bits - between the exponent and the mantissa. */ - words_end++; -#endif - - if (generic_floating_point_number.low > generic_floating_point_number.leader) - { - /* 0.0e0 seen. */ - if (generic_floating_point_number.sign == '+') - words[0] = 0x0000; - else - words[0] = 0x8000; - memset (&words[1], '\0', - (words_end - words - 1) * sizeof (LITTLENUM_TYPE)); - return (return_value); - } - - /* NaN: Do the right thing */ - if (generic_floating_point_number.sign == 0) - { - if (precision == F_PRECISION) - { - words[0] = 0x7fff; - words[1] = 0xffff; - } - else if (precision == X_PRECISION) - { -#ifdef TC_M68K - words[0] = 0x7fff; - words[1] = 0; - words[2] = 0xffff; - words[3] = 0xffff; - words[4] = 0xffff; - words[5] = 0xffff; -#else /* ! TC_M68K */ -#ifdef TC_I386 - words[0] = 0xffff; - words[1] = 0xc000; - words[2] = 0; - words[3] = 0; - words[4] = 0; -#else /* ! TC_I386 */ - abort (); -#endif /* ! TC_I386 */ -#endif /* ! TC_M68K */ - } - else - { - words[0] = 0x7fff; - words[1] = 0xffff; - words[2] = 0xffff; - words[3] = 0xffff; - } - return return_value; - } - else if (generic_floating_point_number.sign == 'P') - { - /* +INF: Do the right thing */ - if (precision == F_PRECISION) - { - words[0] = 0x7f80; - words[1] = 0; - } - else if (precision == X_PRECISION) - { -#ifdef TC_M68K - words[0] = 0x7fff; - words[1] = 0; - words[2] = 0; - words[3] = 0; - words[4] = 0; - words[5] = 0; -#else /* ! TC_M68K */ -#ifdef TC_I386 - words[0] = 0x7fff; - words[1] = 0x8000; - words[2] = 0; - words[3] = 0; - words[4] = 0; -#else /* ! TC_I386 */ - abort (); -#endif /* ! TC_I386 */ -#endif /* ! TC_M68K */ - } - else - { - words[0] = 0x7ff0; - words[1] = 0; - words[2] = 0; - words[3] = 0; - } - return (return_value); - } - else if (generic_floating_point_number.sign == 'N') - { - /* Negative INF */ - if (precision == F_PRECISION) - { - words[0] = 0xff80; - words[1] = 0x0; - } - else if (precision == X_PRECISION) - { -#ifdef TC_M68K - words[0] = 0xffff; - words[1] = 0; - words[2] = 0; - words[3] = 0; - words[4] = 0; - words[5] = 0; -#else /* ! TC_M68K */ -#ifdef TC_I386 - words[0] = 0xffff; - words[1] = 0x8000; - words[2] = 0; - words[3] = 0; - words[4] = 0; -#else /* ! TC_I386 */ - abort (); -#endif /* ! TC_I386 */ -#endif /* ! TC_M68K */ - } - else - { - words[0] = 0xfff0; - words[1] = 0x0; - words[2] = 0x0; - words[3] = 0x0; - } - return (return_value); - } - /* - * The floating point formats we support have: - * Bit 15 is sign bit. - * Bits 14:n are excess-whatever exponent. - * Bits n-1:0 (if any) are most significant bits of fraction. - * Bits 15:0 of the next word(s) are the next most significant bits. - * - * So we need: number of bits of exponent, number of bits of - * mantissa. - */ - bits_left_in_littlenum = LITTLENUM_NUMBER_OF_BITS; - littlenum_pointer = generic_floating_point_number.leader; - littlenums_left = (1 - + generic_floating_point_number.leader - - generic_floating_point_number.low); - /* Seek (and forget) 1st significant bit */ - for (exponent_skippage = 0; !next_bits (1); ++exponent_skippage);; - exponent_1 = (generic_floating_point_number.exponent - + generic_floating_point_number.leader - + 1 - - generic_floating_point_number.low); - /* Radix LITTLENUM_RADIX, point just higher than - generic_floating_point_number.leader. */ - exponent_2 = exponent_1 * LITTLENUM_NUMBER_OF_BITS; - /* Radix 2. */ - exponent_3 = exponent_2 - exponent_skippage; - /* Forget leading zeros, forget 1st bit. */ - exponent_4 = exponent_3 + ((1 << (exponent_bits - 1)) - 2); - /* Offset exponent. */ - - lp = words; - - /* Word 1. Sign, exponent and perhaps high bits. */ - word1 = ((generic_floating_point_number.sign == '+') - ? 0 - : (1 << (LITTLENUM_NUMBER_OF_BITS - 1))); - - /* Assume 2's complement integers. */ - if (exponent_4 <= 0) - { - int prec_bits; - int num_bits; - - unget_bits (1); - num_bits = -exponent_4; - prec_bits = LITTLENUM_NUMBER_OF_BITS * precision - (exponent_bits + 1 + num_bits); -#ifdef TC_I386 - if (precision == X_PRECISION && exponent_bits == 15) - { - /* On the i386 a denormalized extended precision float is - shifted down by one, effectively decreasing the exponent - bias by one. */ - prec_bits -= 1; - num_bits += 1; - } -#endif - - if (num_bits >= LITTLENUM_NUMBER_OF_BITS - exponent_bits) - { - /* Bigger than one littlenum */ - num_bits -= (LITTLENUM_NUMBER_OF_BITS - 1) - exponent_bits; - *lp++ = word1; - if (num_bits + exponent_bits + 1 > precision * LITTLENUM_NUMBER_OF_BITS) - { - /* Exponent overflow */ - make_invalid_floating_point_number (words); - return (return_value); - } -#ifdef TC_M68K - if (precision == X_PRECISION && exponent_bits == 15) - *lp++ = 0; -#endif - while (num_bits >= LITTLENUM_NUMBER_OF_BITS) - { - num_bits -= LITTLENUM_NUMBER_OF_BITS; - *lp++ = 0; - } - if (num_bits) - *lp++ = next_bits (LITTLENUM_NUMBER_OF_BITS - (num_bits)); - } - else - { - if (precision == X_PRECISION && exponent_bits == 15) - { - *lp++ = word1; -#ifdef TC_M68K - *lp++ = 0; -#endif - *lp++ = next_bits (LITTLENUM_NUMBER_OF_BITS - num_bits); - } - else - { - word1 |= next_bits ((LITTLENUM_NUMBER_OF_BITS - 1) - (exponent_bits + num_bits)); - *lp++ = word1; - } - } - while (lp < words_end) - *lp++ = next_bits (LITTLENUM_NUMBER_OF_BITS); - - /* Round the mantissa up, but don't change the number */ - if (next_bits (1)) - { - --lp; - if (prec_bits >= LITTLENUM_NUMBER_OF_BITS) - { - int n = 0; - int tmp_bits; - - n = 0; - tmp_bits = prec_bits; - while (tmp_bits > LITTLENUM_NUMBER_OF_BITS) - { - if (lp[n] != (LITTLENUM_TYPE) - 1) - break; - --n; - tmp_bits -= LITTLENUM_NUMBER_OF_BITS; - } - if (tmp_bits > LITTLENUM_NUMBER_OF_BITS - || (lp[n] & mask[tmp_bits]) != mask[tmp_bits] - || (prec_bits != (precision * LITTLENUM_NUMBER_OF_BITS - - exponent_bits - 1) -#ifdef TC_I386 - /* An extended precision float with only the integer - bit set would be invalid. That must be converted - to the smallest normalized number. */ - && !(precision == X_PRECISION - && prec_bits == (precision * LITTLENUM_NUMBER_OF_BITS - - exponent_bits - 2)) -#endif - )) - { - unsigned long carry; - - for (carry = 1; carry && (lp >= words); lp--) - { - carry = *lp + carry; - *lp = carry; - carry >>= LITTLENUM_NUMBER_OF_BITS; - } - } - else - { - /* This is an overflow of the denormal numbers. We - need to forget what we have produced, and instead - generate the smallest normalized number. */ - lp = words; - word1 = ((generic_floating_point_number.sign == '+') - ? 0 - : (1 << (LITTLENUM_NUMBER_OF_BITS - 1))); - word1 |= (1 - << ((LITTLENUM_NUMBER_OF_BITS - 1) - - exponent_bits)); - *lp++ = word1; -#ifdef TC_I386 - /* Set the integer bit in the extended precision format. - This cannot happen on the m68k where the mantissa - just overflows into the integer bit above. */ - if (precision == X_PRECISION) - *lp++ = 1 << (LITTLENUM_NUMBER_OF_BITS - 1); -#endif - while (lp < words_end) - *lp++ = 0; - } - } - else - *lp += 1; - } - - return return_value; - } - else if ((unsigned long) exponent_4 >= mask[exponent_bits]) - { - /* - * Exponent overflow. Lose immediately. - */ - - /* - * We leave return_value alone: admit we read the - * number, but return a floating exception - * because we can't encode the number. - */ - make_invalid_floating_point_number (words); - return return_value; - } - else - { - word1 |= (exponent_4 << ((LITTLENUM_NUMBER_OF_BITS - 1) - exponent_bits)) - | next_bits ((LITTLENUM_NUMBER_OF_BITS - 1) - exponent_bits); - } - - *lp++ = word1; - - /* X_PRECISION is special: on the 68k, it has 16 bits of zero in the - middle. Either way, it is then followed by a 1 bit. */ - if (exponent_bits == 15 && precision == X_PRECISION) - { -#ifdef TC_M68K - *lp++ = 0; -#endif - *lp++ = (1 << (LITTLENUM_NUMBER_OF_BITS - 1) - | next_bits (LITTLENUM_NUMBER_OF_BITS - 1)); - } - - /* The rest of the words are just mantissa bits. */ - while (lp < words_end) - *lp++ = next_bits (LITTLENUM_NUMBER_OF_BITS); - - if (next_bits (1)) - { - unsigned long carry; - /* - * Since the NEXT bit is a 1, round UP the mantissa. - * The cunning design of these hidden-1 floats permits - * us to let the mantissa overflow into the exponent, and - * it 'does the right thing'. However, we lose if the - * highest-order bit of the lowest-order word flips. - * Is that clear? - */ - - /* #if (sizeof(carry)) < ((sizeof(bits[0]) * BITS_PER_CHAR) + 2) - Please allow at least 1 more bit in carry than is in a LITTLENUM. - We need that extra bit to hold a carry during a LITTLENUM carry - propagation. Another extra bit (kept 0) will assure us that we - don't get a sticky sign bit after shifting right, and that - permits us to propagate the carry without any masking of bits. - #endif */ - for (carry = 1, lp--; carry && (lp >= words); lp--) - { - carry = *lp + carry; - *lp = carry; - carry >>= LITTLENUM_NUMBER_OF_BITS; - } - if (precision == X_PRECISION && exponent_bits == 15) - { - /* Extended precision numbers have an explicit integer bit - that we may have to restore. */ - if (lp == words) - { -#ifdef TC_M68K - /* On the m68k there is a gap of 16 bits. We must - explicitly propagate the carry into the exponent. */ - words[0] += words[1]; - words[1] = 0; - lp++; -#endif - /* Put back the integer bit. */ - lp[1] |= 1 << (LITTLENUM_NUMBER_OF_BITS - 1); - } - } - if ((word1 ^ *words) & (1 << (LITTLENUM_NUMBER_OF_BITS - 1))) - { - /* We leave return_value alone: admit we read the - * number, but return a floating exception - * because we can't encode the number. - */ - *words &= ~(1 << (LITTLENUM_NUMBER_OF_BITS - 1)); - /* make_invalid_floating_point_number (words); */ - /* return return_value; */ - } - } - return (return_value); -} - -#if 0 /* unused */ -/* This routine is a real kludge. Someone really should do it better, - but I'm too lazy, and I don't understand this stuff all too well - anyway. (JF) */ -static void -int_to_gen (x) - long x; -{ - char buf[20]; - char *bufp; - - sprintf (buf, "%ld", x); - bufp = &buf[0]; - if (atof_generic (&bufp, ".", EXP_CHARS, &generic_floating_point_number)) - as_bad (_("Error converting number to floating point (Exponent overflow?)")); -} -#endif - -#ifdef TEST -char * -print_gen (gen) - FLONUM_TYPE *gen; -{ - FLONUM_TYPE f; - LITTLENUM_TYPE arr[10]; - double dv; - float fv; - static char sbuf[40]; - - if (gen) - { - f = generic_floating_point_number; - generic_floating_point_number = *gen; - } - gen_to_words (&arr[0], 4, 11); - memcpy (&dv, &arr[0], sizeof (double)); - sprintf (sbuf, "%x %x %x %x %.14G ", arr[0], arr[1], arr[2], arr[3], dv); - gen_to_words (&arr[0], 2, 8); - memcpy (&fv, &arr[0], sizeof (float)); - sprintf (sbuf + strlen (sbuf), "%x %x %.12g\n", arr[0], arr[1], fv); - - if (gen) - { - generic_floating_point_number = f; - } - - return (sbuf); -} - -#endif - -/* end of atof-ieee.c */ diff --git a/gas/config/atof-tahoe.c b/gas/config/atof-tahoe.c deleted file mode 100644 index 760485c5fde..00000000000 --- a/gas/config/atof-tahoe.c +++ /dev/null @@ -1,431 +0,0 @@ - -/* atof_tahoe.c - turn a string into a Tahoe floating point number - Copyright (C) 1987, 1998 Free Software Foundation, Inc. - */ - -/* This is really a simplified version of atof_vax.c. I glommed it wholesale - and then shaved it down. I don't even know how it works. (Don't you find - my honesty refreshing? bowen@cs.Buffalo.EDU (Devon E Bowen) - - I don't allow uppercase letters in the precision descrpitors. Ie 'f' and - 'd' are allowed but 'F' and 'D' aren't */ - -#include "as.h" - -/* Precision in LittleNums. */ -#define MAX_PRECISION (4) -#define D_PRECISION (4) -#define F_PRECISION (2) - -/* Precision in chars. */ -#define D_PRECISION_CHARS (8) -#define F_PRECISION_CHARS (4) - -/* Length in LittleNums of guard bits. */ -#define GUARD (2) - -static const long int mask[] = -{ - 0x00000000, - 0x00000001, - 0x00000003, - 0x00000007, - 0x0000000f, - 0x0000001f, - 0x0000003f, - 0x0000007f, - 0x000000ff, - 0x000001ff, - 0x000003ff, - 0x000007ff, - 0x00000fff, - 0x00001fff, - 0x00003fff, - 0x00007fff, - 0x0000ffff, - 0x0001ffff, - 0x0003ffff, - 0x0007ffff, - 0x000fffff, - 0x001fffff, - 0x003fffff, - 0x007fffff, - 0x00ffffff, - 0x01ffffff, - 0x03ffffff, - 0x07ffffff, - 0x0fffffff, - 0x1fffffff, - 0x3fffffff, - 0x7fffffff, - 0xffffffff -}; - - -/* Shared between flonum_gen2tahoe and next_bits */ -static int bits_left_in_littlenum; -static LITTLENUM_TYPE *littlenum_pointer; -static LITTLENUM_TYPE *littlenum_end; - -#if __STDC__ == 1 - -int flonum_gen2tahoe (int format_letter, FLONUM_TYPE * f, LITTLENUM_TYPE * words); - -#else /* not __STDC__ */ - -int flonum_gen2tahoe (); - -#endif /* not __STDC__ */ - - -static int -next_bits (number_of_bits) - int number_of_bits; -{ - int return_value; - - if (littlenum_pointer < littlenum_end) - return 0; - if (number_of_bits >= bits_left_in_littlenum) - { - return_value = mask[bits_left_in_littlenum] & *littlenum_pointer; - number_of_bits -= bits_left_in_littlenum; - return_value <<= number_of_bits; - bits_left_in_littlenum = LITTLENUM_NUMBER_OF_BITS - number_of_bits; - littlenum_pointer--; - if (littlenum_pointer >= littlenum_end) - return_value |= ((*littlenum_pointer) >> (bits_left_in_littlenum)) & - mask[number_of_bits]; - } - else - { - bits_left_in_littlenum -= number_of_bits; - return_value = mask[number_of_bits] & - ((*littlenum_pointer) >> bits_left_in_littlenum); - } - return (return_value); -} - -static void -make_invalid_floating_point_number (words) - LITTLENUM_TYPE *words; -{ - *words = 0x8000; /* Floating Reserved Operand Code */ -} - -static int /* 0 means letter is OK. */ -what_kind_of_float (letter, precisionP, exponent_bitsP) - char letter; /* In: lowercase please. What kind of float? */ - int *precisionP; /* Number of 16-bit words in the float. */ - long int *exponent_bitsP; /* Number of exponent bits. */ -{ - int retval; /* 0: OK. */ - - retval = 0; - switch (letter) - { - case 'f': - *precisionP = F_PRECISION; - *exponent_bitsP = 8; - break; - - case 'd': - *precisionP = D_PRECISION; - *exponent_bitsP = 8; - break; - - default: - retval = 69; - break; - } - return (retval); -} - -/***********************************************************************\ -* * -* Warning: this returns 16-bit LITTLENUMs, because that is * -* what the VAX thinks in. It is up to the caller to figure * -* out any alignment problems and to conspire for the bytes/word * -* to be emitted in the right order. Bigendians beware! * -* * -\***********************************************************************/ - -char * /* Return pointer past text consumed. */ -atof_tahoe (str, what_kind, words) - char *str; /* Text to convert to binary. */ - char what_kind; /* 'd', 'f', 'g', 'h' */ - LITTLENUM_TYPE *words; /* Build the binary here. */ -{ - FLONUM_TYPE f; - LITTLENUM_TYPE bits[MAX_PRECISION + MAX_PRECISION + GUARD]; - /* Extra bits for zeroed low-order bits. */ - /* The 1st MAX_PRECISION are zeroed, */ - /* the last contain flonum bits. */ - char *return_value; - int precision; /* Number of 16-bit words in the format. */ - long int exponent_bits; - - return_value = str; - f.low = bits + MAX_PRECISION; - f.high = NULL; - f.leader = NULL; - f.exponent = NULL; - f.sign = '\0'; - - if (what_kind_of_float (what_kind, &precision, &exponent_bits)) - { - return_value = NULL; /* We lost. */ - make_invalid_floating_point_number (words); - } - if (return_value) - { - memset (bits, '\0', sizeof (LITTLENUM_TYPE) * MAX_PRECISION); - - /* Use more LittleNums than seems */ - /* necessary: the highest flonum may have */ - /* 15 leading 0 bits, so could be useless. */ - f.high = f.low + precision - 1 + GUARD; - - if (atof_generic (&return_value, ".", "eE", &f)) - { - make_invalid_floating_point_number (words); - return_value = NULL; /* we lost */ - } - else - { - if (flonum_gen2tahoe (what_kind, &f, words)) - { - return_value = NULL; - } - } - } - return (return_value); -} - -/* - * In: a flonum, a Tahoe floating point format. - * Out: a Tahoe floating-point bit pattern. - */ - -int /* 0: OK. */ -flonum_gen2tahoe (format_letter, f, words) - char format_letter; /* One of 'd' 'f'. */ - FLONUM_TYPE *f; - LITTLENUM_TYPE *words; /* Deliver answer here. */ -{ - LITTLENUM_TYPE *lp; - int precision; - long int exponent_bits; - int return_value; /* 0 == OK. */ - - return_value = what_kind_of_float (format_letter, &precision, &exponent_bits); - if (return_value != 0) - { - make_invalid_floating_point_number (words); - } - else - { - if (f->low > f->leader) - { - /* 0.0e0 seen. */ - memset (words, '\0', sizeof (LITTLENUM_TYPE) * precision); - } - else - { - long int exponent_1; - long int exponent_2; - long int exponent_3; - long int exponent_4; - int exponent_skippage; - LITTLENUM_TYPE word1; - - /* JF: Deal with new Nan, +Inf and -Inf codes */ - if (f->sign != '-' && f->sign != '+') - { - make_invalid_floating_point_number (words); - return return_value; - } - /* - * All tahoe floating_point formats have: - * Bit 15 is sign bit. - * Bits 14:n are excess-whatever exponent. - * Bits n-1:0 (if any) are most significant bits of fraction. - * Bits 15:0 of the next word are the next most significant bits. - * And so on for each other word. - * - * So we need: number of bits of exponent, number of bits of - * mantissa. - */ - - bits_left_in_littlenum = LITTLENUM_NUMBER_OF_BITS; - littlenum_pointer = f->leader; - littlenum_end = f->low; - /* Seek (and forget) 1st significant bit */ - for (exponent_skippage = 0; - !next_bits (1); - exponent_skippage++) - { - } - exponent_1 = f->exponent + f->leader + 1 - f->low; - /* Radix LITTLENUM_RADIX, point just higher than f -> leader. */ - exponent_2 = exponent_1 * LITTLENUM_NUMBER_OF_BITS; - /* Radix 2. */ - exponent_3 = exponent_2 - exponent_skippage; - /* Forget leading zeros, forget 1st bit. */ - exponent_4 = exponent_3 + (1 << (exponent_bits - 1)); - /* Offset exponent. */ - - if (exponent_4 & ~mask[exponent_bits]) - { - /* - * Exponent overflow. Lose immediately. - */ - - make_invalid_floating_point_number (words); - - /* - * We leave return_value alone: admit we read the - * number, but return a floating exception - * because we can't encode the number. - */ - } - else - { - lp = words; - - /* Word 1. Sign, exponent and perhaps high bits. */ - /* Assume 2's complement integers. */ - word1 = ((exponent_4 & mask[exponent_bits]) << (15 - exponent_bits)) - | ((f->sign == '+') ? 0 : 0x8000) - | next_bits (15 - exponent_bits); - *lp++ = word1; - - /* The rest of the words are just mantissa bits. */ - for (; lp < words + precision; lp++) - { - *lp = next_bits (LITTLENUM_NUMBER_OF_BITS); - } - - if (next_bits (1)) - { - /* - * Since the NEXT bit is a 1, round UP the mantissa. - * The cunning design of these hidden-1 floats permits - * us to let the mantissa overflow into the exponent, and - * it 'does the right thing'. However, we lose if the - * highest-order bit of the lowest-order word flips. - * Is that clear? - */ - - unsigned long int carry; - - /* - #if (sizeof(carry)) < ((sizeof(bits[0]) * BITS_PER_CHAR) + 2) - Please allow at least 1 more bit in carry than is in a LITTLENUM. - We need that extra bit to hold a carry during a LITTLENUM carry - propagation. Another extra bit (kept 0) will assure us that we - don't get a sticky sign bit after shifting right, and that - permits us to propagate the carry without any masking of bits. - #endif - */ - for (carry = 1, lp--; - carry && (lp >= words); - lp--) - { - carry = *lp + carry; - *lp = carry; - carry >>= LITTLENUM_NUMBER_OF_BITS; - } - - if ((word1 ^ *words) & (1 << (LITTLENUM_NUMBER_OF_BITS - 1))) - { - make_invalid_floating_point_number (words); - /* - * We leave return_value alone: admit we read the - * number, but return a floating exception - * because we can't encode the number. - */ - } - } /* if (we needed to round up) */ - } /* if (exponent overflow) */ - } /* if (0.0e0) */ - } /* if (float_type was OK) */ - return (return_value); -} - -/* - * md_atof() - * - * In: input_line_pointer -> the 1st character of a floating-point - * number. - * 1 letter denoting the type of statement that wants a - * binary floating point number returned. - * Address of where to build floating point literal. - * Assumed to be 'big enough'. - * Address of where to return size of literal (in chars). - * - * Out: Input_line_pointer -> of next char after floating number. - * Error message, or 0. - * Floating point literal. - * Number of chars we used for the literal. - */ - -char * -md_atof (what_statement_type, literalP, sizeP) - char what_statement_type; - char *literalP; - int *sizeP; -{ - LITTLENUM_TYPE words[MAX_PRECISION]; - register char kind_of_float; - register int number_of_chars; - register LITTLENUM_TYPE *littlenum_pointer; - - switch (what_statement_type) - { - case 'f': /* .ffloat */ - case 'd': /* .dfloat */ - kind_of_float = what_statement_type; - break; - - default: - kind_of_float = 0; - break; - }; - - if (kind_of_float) - { - register LITTLENUM_TYPE *limit; - - input_line_pointer = atof_tahoe (input_line_pointer, - kind_of_float, - words); - /* - * The atof_tahoe() builds up 16-bit numbers. - * Since the assembler may not be running on - * a different-endian machine, be very careful about - * converting words to chars. - */ - number_of_chars = (kind_of_float == 'f' ? F_PRECISION_CHARS : - (kind_of_float == 'd' ? D_PRECISION_CHARS : 0)); - know (number_of_chars <= MAX_PRECISION * sizeof (LITTLENUM_TYPE)); - limit = words + (number_of_chars / sizeof (LITTLENUM_TYPE)); - for (littlenum_pointer = words; - littlenum_pointer < limit; - littlenum_pointer++) - { - md_number_to_chars (literalP, *littlenum_pointer, - sizeof (LITTLENUM_TYPE)); - literalP += sizeof (LITTLENUM_TYPE); - }; - } - else - { - number_of_chars = 0; - }; - - *sizeP = number_of_chars; - return kind_of_float ? 0 : _("Bad call to md_atof()"); -} - -/* atof_tahoe.c */ diff --git a/gas/config/atof-vax.c b/gas/config/atof-vax.c deleted file mode 100644 index 76ff0782868..00000000000 --- a/gas/config/atof-vax.c +++ /dev/null @@ -1,518 +0,0 @@ -/* atof_vax.c - turn a Flonum into a VAX floating point number - Copyright (C) 1987, 1992, 93, 95, 97, 98, 1999 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include "as.h" - -static int atof_vax_sizeof PARAMS ((int)); -static int next_bits PARAMS ((int)); -static void make_invalid_floating_point_number PARAMS ((LITTLENUM_TYPE *)); -static int what_kind_of_float PARAMS ((int, int *, long *)); -static char *atof_vax PARAMS ((char *, int, LITTLENUM_TYPE *)); - -/* Precision in LittleNums. */ -#define MAX_PRECISION (8) -#define H_PRECISION (8) -#define G_PRECISION (4) -#define D_PRECISION (4) -#define F_PRECISION (2) - -/* Length in LittleNums of guard bits. */ -#define GUARD (2) - -int flonum_gen2vax PARAMS ((int format_letter, FLONUM_TYPE * f, - LITTLENUM_TYPE * words)); - -/* Number of chars in flonum type 'letter'. */ -static int -atof_vax_sizeof (letter) - int letter; -{ - int return_value; - - /* - * Permitting uppercase letters is probably a bad idea. - * Please use only lower-cased letters in case the upper-cased - * ones become unsupported! - */ - switch (letter) - { - case 'f': - case 'F': - return_value = 4; - break; - - case 'd': - case 'D': - case 'g': - case 'G': - return_value = 8; - break; - - case 'h': - case 'H': - return_value = 16; - break; - - default: - return_value = 0; - break; - } - return (return_value); -} /* atof_vax_sizeof */ - -static const long mask[] = -{ - 0x00000000, - 0x00000001, - 0x00000003, - 0x00000007, - 0x0000000f, - 0x0000001f, - 0x0000003f, - 0x0000007f, - 0x000000ff, - 0x000001ff, - 0x000003ff, - 0x000007ff, - 0x00000fff, - 0x00001fff, - 0x00003fff, - 0x00007fff, - 0x0000ffff, - 0x0001ffff, - 0x0003ffff, - 0x0007ffff, - 0x000fffff, - 0x001fffff, - 0x003fffff, - 0x007fffff, - 0x00ffffff, - 0x01ffffff, - 0x03ffffff, - 0x07ffffff, - 0x0fffffff, - 0x1fffffff, - 0x3fffffff, - 0x7fffffff, - 0xffffffff -}; - - -/* Shared between flonum_gen2vax and next_bits */ -static int bits_left_in_littlenum; -static LITTLENUM_TYPE *littlenum_pointer; -static LITTLENUM_TYPE *littlenum_end; - -static int -next_bits (number_of_bits) - int number_of_bits; -{ - int return_value; - - if (littlenum_pointer < littlenum_end) - return 0; - if (number_of_bits >= bits_left_in_littlenum) - { - return_value = mask[bits_left_in_littlenum] & *littlenum_pointer; - number_of_bits -= bits_left_in_littlenum; - return_value <<= number_of_bits; - bits_left_in_littlenum = LITTLENUM_NUMBER_OF_BITS - number_of_bits; - littlenum_pointer--; - if (littlenum_pointer >= littlenum_end) - return_value |= ((*littlenum_pointer) >> (bits_left_in_littlenum)) & mask[number_of_bits]; - } - else - { - bits_left_in_littlenum -= number_of_bits; - return_value = mask[number_of_bits] & ((*littlenum_pointer) >> bits_left_in_littlenum); - } - return (return_value); -} - -static void -make_invalid_floating_point_number (words) - LITTLENUM_TYPE *words; -{ - *words = 0x8000; /* Floating Reserved Operand Code */ -} - -static int /* 0 means letter is OK. */ -what_kind_of_float (letter, precisionP, exponent_bitsP) - int letter; /* In: lowercase please. What kind of float? */ - int *precisionP; /* Number of 16-bit words in the float. */ - long *exponent_bitsP; /* Number of exponent bits. */ -{ - int retval; /* 0: OK. */ - - retval = 0; - switch (letter) - { - case 'f': - *precisionP = F_PRECISION; - *exponent_bitsP = 8; - break; - - case 'd': - *precisionP = D_PRECISION; - *exponent_bitsP = 8; - break; - - case 'g': - *precisionP = G_PRECISION; - *exponent_bitsP = 11; - break; - - case 'h': - *precisionP = H_PRECISION; - *exponent_bitsP = 15; - break; - - default: - retval = 69; - break; - } - return (retval); -} - -/***********************************************************************\ - * * - * Warning: this returns 16-bit LITTLENUMs, because that is * - * what the VAX thinks in. It is up to the caller to figure * - * out any alignment problems and to conspire for the bytes/word * - * to be emitted in the right order. Bigendians beware! * - * * - \***********************************************************************/ - -static char * /* Return pointer past text consumed. */ -atof_vax (str, what_kind, words) - char *str; /* Text to convert to binary. */ - int what_kind; /* 'd', 'f', 'g', 'h' */ - LITTLENUM_TYPE *words; /* Build the binary here. */ -{ - FLONUM_TYPE f; - LITTLENUM_TYPE bits[MAX_PRECISION + MAX_PRECISION + GUARD]; - /* Extra bits for zeroed low-order bits. */ - /* The 1st MAX_PRECISION are zeroed, */ - /* the last contain flonum bits. */ - char *return_value; - int precision; /* Number of 16-bit words in the format. */ - long exponent_bits; - - return_value = str; - f.low = bits + MAX_PRECISION; - f.high = NULL; - f.leader = NULL; - f.exponent = 0; - f.sign = '\0'; - - if (what_kind_of_float (what_kind, &precision, &exponent_bits)) - { - return_value = NULL; /* We lost. */ - make_invalid_floating_point_number (words); - } - - if (return_value) - { - memset (bits, '\0', sizeof (LITTLENUM_TYPE) * MAX_PRECISION); - - /* Use more LittleNums than seems */ - /* necessary: the highest flonum may have */ - /* 15 leading 0 bits, so could be useless. */ - f.high = f.low + precision - 1 + GUARD; - - if (atof_generic (&return_value, ".", "eE", &f)) - { - make_invalid_floating_point_number (words); - return_value = NULL; /* we lost */ - } - else - { - if (flonum_gen2vax (what_kind, &f, words)) - { - return_value = NULL; - } - } - } - return (return_value); -} /* atof_vax() */ - -/* - * In: a flonum, a vax floating point format. - * Out: a vax floating-point bit pattern. - */ - -int /* 0: OK. */ -flonum_gen2vax (format_letter, f, words) - int format_letter; /* One of 'd' 'f' 'g' 'h'. */ - FLONUM_TYPE *f; - LITTLENUM_TYPE *words; /* Deliver answer here. */ -{ - LITTLENUM_TYPE *lp; - int precision; - long exponent_bits; - int return_value; /* 0 == OK. */ - - return_value = what_kind_of_float (format_letter, &precision, &exponent_bits); - - if (return_value != 0) - { - make_invalid_floating_point_number (words); - } - else - { - if (f->low > f->leader) - { - /* 0.0e0 seen. */ - memset (words, '\0', sizeof (LITTLENUM_TYPE) * precision); - } - else - { - long exponent_1; - long exponent_2; - long exponent_3; - long exponent_4; - int exponent_skippage; - LITTLENUM_TYPE word1; - - /* JF: Deal with new Nan, +Inf and -Inf codes */ - if (f->sign != '-' && f->sign != '+') - { - make_invalid_floating_point_number (words); - return return_value; - } - /* - * All vaxen floating_point formats (so far) have: - * Bit 15 is sign bit. - * Bits 14:n are excess-whatever exponent. - * Bits n-1:0 (if any) are most significant bits of fraction. - * Bits 15:0 of the next word are the next most significant bits. - * And so on for each other word. - * - * All this to be compatible with a KF11?? (Which is still faster - * than lots of vaxen I can think of, but it also has higher - * maintenance costs ... sigh). - * - * So we need: number of bits of exponent, number of bits of - * mantissa. - */ - -#ifdef NEVER /******* This zeroing seems redundant - Dean 3may86 **********/ - /* - * No matter how few bits we got back from the atof() - * routine, add enough zero littlenums so the rest of the - * code won't run out of "significant" bits in the mantissa. - */ - { - LITTLENUM_TYPE *ltp; - for (ltp = f->leader + 1; - ltp <= f->low + precision; - ltp++) - { - *ltp = 0; - } - } -#endif - - bits_left_in_littlenum = LITTLENUM_NUMBER_OF_BITS; - littlenum_pointer = f->leader; - littlenum_end = f->low; - /* Seek (and forget) 1st significant bit */ - for (exponent_skippage = 0; - !next_bits (1); - exponent_skippage++);; - - exponent_1 = f->exponent + f->leader + 1 - f->low; - /* Radix LITTLENUM_RADIX, point just higher than f->leader. */ - exponent_2 = exponent_1 * LITTLENUM_NUMBER_OF_BITS; - /* Radix 2. */ - exponent_3 = exponent_2 - exponent_skippage; - /* Forget leading zeros, forget 1st bit. */ - exponent_4 = exponent_3 + (1 << (exponent_bits - 1)); - /* Offset exponent. */ - - if (exponent_4 & ~mask[exponent_bits]) - { - /* - * Exponent overflow. Lose immediately. - */ - - make_invalid_floating_point_number (words); - - /* - * We leave return_value alone: admit we read the - * number, but return a floating exception - * because we can't encode the number. - */ - } - else - { - lp = words; - - /* Word 1. Sign, exponent and perhaps high bits. */ - /* Assume 2's complement integers. */ - word1 = (((exponent_4 & mask[exponent_bits]) << (15 - exponent_bits)) - | ((f->sign == '+') ? 0 : 0x8000) - | next_bits (15 - exponent_bits)); - *lp++ = word1; - - /* The rest of the words are just mantissa bits. */ - for (; lp < words + precision; lp++) - { - *lp = next_bits (LITTLENUM_NUMBER_OF_BITS); - } - - if (next_bits (1)) - { - /* - * Since the NEXT bit is a 1, round UP the mantissa. - * The cunning design of these hidden-1 floats permits - * us to let the mantissa overflow into the exponent, and - * it 'does the right thing'. However, we lose if the - * highest-order bit of the lowest-order word flips. - * Is that clear? - */ - - unsigned long carry; - - /* - #if (sizeof(carry)) < ((sizeof(bits[0]) * BITS_PER_CHAR) + 2) - Please allow at least 1 more bit in carry than is in a LITTLENUM. - We need that extra bit to hold a carry during a LITTLENUM carry - propagation. Another extra bit (kept 0) will assure us that we - don't get a sticky sign bit after shifting right, and that - permits us to propagate the carry without any masking of bits. - #endif - */ - for (carry = 1, lp--; - carry && (lp >= words); - lp--) - { - carry = *lp + carry; - *lp = carry; - carry >>= LITTLENUM_NUMBER_OF_BITS; - } - - if ((word1 ^ *words) & (1 << (LITTLENUM_NUMBER_OF_BITS - 1))) - { - make_invalid_floating_point_number (words); - /* - * We leave return_value alone: admit we read the - * number, but return a floating exception - * because we can't encode the number. - */ - } - } /* if (we needed to round up) */ - } /* if (exponent overflow) */ - } /* if (0.0e0) */ - } /* if (float_type was OK) */ - return (return_value); -} /* flonum_gen2vax() */ - - -/* JF this used to be in vax.c but this looks like a better place for it */ - -/* - * md_atof() - * - * In: input_line_pointer->the 1st character of a floating-point - * number. - * 1 letter denoting the type of statement that wants a - * binary floating point number returned. - * Address of where to build floating point literal. - * Assumed to be 'big enough'. - * Address of where to return size of literal (in chars). - * - * Out: Input_line_pointer->of next char after floating number. - * Error message, or 0. - * Floating point literal. - * Number of chars we used for the literal. - */ - -#define MAXIMUM_NUMBER_OF_LITTLENUMS (8) /* For .hfloats. */ - -char * -md_atof (what_statement_type, literalP, sizeP) - int what_statement_type; - char *literalP; - int *sizeP; -{ - LITTLENUM_TYPE words[MAXIMUM_NUMBER_OF_LITTLENUMS]; - register char kind_of_float; - register int number_of_chars; - register LITTLENUM_TYPE *littlenumP; - - switch (what_statement_type) - { - case 'F': /* .float */ - case 'f': /* .ffloat */ - kind_of_float = 'f'; - break; - - case 'D': /* .double */ - case 'd': /* .dfloat */ - kind_of_float = 'd'; - break; - - case 'g': /* .gfloat */ - kind_of_float = 'g'; - break; - - case 'h': /* .hfloat */ - kind_of_float = 'h'; - break; - - default: - kind_of_float = 0; - break; - }; - - if (kind_of_float) - { - register LITTLENUM_TYPE *limit; - - input_line_pointer = atof_vax (input_line_pointer, - kind_of_float, - words); - /* - * The atof_vax() builds up 16-bit numbers. - * Since the assembler may not be running on - * a little-endian machine, be very careful about - * converting words to chars. - */ - number_of_chars = atof_vax_sizeof (kind_of_float); - know (number_of_chars <= MAXIMUM_NUMBER_OF_LITTLENUMS * sizeof (LITTLENUM_TYPE)); - limit = words + (number_of_chars / sizeof (LITTLENUM_TYPE)); - for (littlenumP = words; littlenumP < limit; littlenumP++) - { - md_number_to_chars (literalP, *littlenumP, sizeof (LITTLENUM_TYPE)); - literalP += sizeof (LITTLENUM_TYPE); - }; - } - else - { - number_of_chars = 0; - }; - - *sizeP = number_of_chars; - return kind_of_float ? NULL : _("Bad call to md_atof()"); -} - -/* end of atof-vax.c */ diff --git a/gas/config/e-i386aout.c b/gas/config/e-i386aout.c deleted file mode 100644 index 18fdf689c73..00000000000 --- a/gas/config/e-i386aout.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "as.h" -#include "emul.h" - -static const char * -i386aout_bfd_name () -{ - abort (); - return NULL; -} - -#define emul_bfd_name i386aout_bfd_name -#define emul_format &aout_format_ops - -#define emul_name "i386aout" -#define emul_struct_name i386aout -#define emul_default_endian 0 -#include "emul-target.h" diff --git a/gas/config/e-i386coff.c b/gas/config/e-i386coff.c deleted file mode 100644 index afed72886ac..00000000000 --- a/gas/config/e-i386coff.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "as.h" -#include "emul.h" - -static const char * -i386coff_bfd_name () -{ - abort (); - return NULL; -} - -#define emul_bfd_name i386coff_bfd_name -#define emul_format &coff_format_ops - -#define emul_name "i386coff" -#define emul_struct_name i386coff -#define emul_default_endian 0 -#include "emul-target.h" diff --git a/gas/config/e-i386elf.c b/gas/config/e-i386elf.c deleted file mode 100644 index a16701e811e..00000000000 --- a/gas/config/e-i386elf.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "as.h" -#include "emul.h" - -static const char * -i386elf_bfd_name () -{ - abort (); - return NULL; -} - -#define emul_bfd_name i386elf_bfd_name -#define emul_format &elf_format_ops - -#define emul_name "i386elf" -#define emul_struct_name i386elf -#define emul_default_endian 0 -#include "emul-target.h" diff --git a/gas/config/e-mipsecoff.c b/gas/config/e-mipsecoff.c deleted file mode 100644 index be2f71b7d46..00000000000 --- a/gas/config/e-mipsecoff.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "as.h" -#include "emul.h" - -static const char *mipsecoff_bfd_name PARAMS ((void)); - -static const char * -mipsecoff_bfd_name () -{ - abort (); - return NULL; -} - -#define emul_bfd_name mipsecoff_bfd_name -#define emul_format &ecoff_format_ops - -#define emul_name "mipsbecoff" -#define emul_struct_name mipsbecoff -#define emul_default_endian 1 -#include "emul-target.h" - -#undef emul_name -#undef emul_struct_name -#undef emul_default_endian - -#define emul_name "mipslecoff" -#define emul_struct_name mipslecoff -#define emul_default_endian 0 -#include "emul-target.h" - -#undef emul_name -#undef emul_struct_name -#undef emul_default_endian - -#define emul_name "mipsecoff" -#define emul_struct_name mipsecoff -#define emul_default_endian 2 -#include "emul-target.h" diff --git a/gas/config/e-mipself.c b/gas/config/e-mipself.c deleted file mode 100644 index eea72f5165c..00000000000 --- a/gas/config/e-mipself.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "as.h" -#include "emul.h" - -static const char *mipself_bfd_name PARAMS ((void)); - -static const char * -mipself_bfd_name () -{ - abort (); - return NULL; -} - -#define emul_bfd_name mipself_bfd_name -#define emul_format &elf_format_ops - -#define emul_name "mipsbelf" -#define emul_struct_name mipsbelf -#define emul_default_endian 1 -#include "emul-target.h" - -#undef emul_name -#undef emul_struct_name -#undef emul_default_endian - -#define emul_name "mipslelf" -#define emul_struct_name mipslelf -#define emul_default_endian 0 -#include "emul-target.h" - -#undef emul_name -#undef emul_struct_name -#undef emul_default_endian - -#define emul_name "mipself" -#define emul_struct_name mipself -#define emul_default_endian 2 -#include "emul-target.h" diff --git a/gas/config/itbl-mips.h b/gas/config/itbl-mips.h deleted file mode 100644 index f6482bd1f75..00000000000 --- a/gas/config/itbl-mips.h +++ /dev/null @@ -1,47 +0,0 @@ - -/* itbl-mips.h - - Copyright (C) 1997 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* Defines for Mips itbl cop support */ - -#include "opcode/mips.h" - -/* Values for processors will be from 0 to NUMBER_OF_PROCESSORS-1 */ -#define NUMBER_OF_PROCESSORS 4 -#define MAX_BITPOS 31 - -/* Mips specifics */ -#define MIPS_OPCODE_COP0 (0x21) /* COPz+CO, bits 31-25: 0100zz1 */ -#define MIPS_ENCODE_COP_NUM(z) ((MIPS_OPCODE_COP0|z<<1)<<25) -#define MIPS_IS_COP_INSN(insn) ((MIPS_OPCODE_COP0&(insn>>25)) \ - == MIPS_OPCODE_COP0) -#define MIPS_DECODE_COP_NUM(insn) ((~MIPS_OPCODE_COP0&(insn>>25))>>1) -#define MIPS_DECODE_COP_COFUN(insn) ((~MIPS_ENCODE_COP_NUM(3))&(insn)) - -/* definitions required by generic code */ -#define ITBL_IS_INSN(insn) MIPS_IS_COP_INSN(insn) -#define ITBL_DECODE_PNUM(insn) MIPS_DECODE_COP_NUM(insn) -#define ITBL_ENCODE_PNUM(pnum) MIPS_ENCODE_COP_NUM(pnum) - -#define ITBL_OPCODE_STRUCT mips_opcode -#define ITBL_OPCODES mips_opcodes -#define ITBL_NUM_OPCODES NUMOPCODES -#define ITBL_NUM_MACROS M_NUM_MACROS diff --git a/gas/config/m68k-parse.h b/gas/config/m68k-parse.h deleted file mode 100644 index cdb5f60eb53..00000000000 --- a/gas/config/m68k-parse.h +++ /dev/null @@ -1,325 +0,0 @@ -/* m68k-parse.h -- header file for m68k assembler - Copyright (C) 1987, 91, 92, 93, 94, 95, 96, 1999 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef M68K_PARSE_H -#define M68K_PARSE_H - -/* This header file defines things which are shared between the - operand parser in m68k.y and the m68k assembler proper in - tc-m68k.c. */ - -/* The various m68k registers. */ - -/* DATA and ADDR have to be contiguous, so that reg-DATA gives - 0-7==data reg, 8-15==addr reg for operands that take both types. - - We don't use forms like "ADDR0 = ADDR" here because this file is - likely to be used on an Apollo, and the broken Apollo compiler - gives an `undefined variable' error if we do that, according to - troy@cbme.unsw.edu.au. */ - -#define DATA DATA0 -#define ADDR ADDR0 -#define SP ADDR7 -#define BAD BAD0 -#define BAC BAC0 - -enum m68k_register -{ - DATA0 = 1, /* 1- 8 == data registers 0-7 */ - DATA1, - DATA2, - DATA3, - DATA4, - DATA5, - DATA6, - DATA7, - - ADDR0, - ADDR1, - ADDR2, - ADDR3, - ADDR4, - ADDR5, - ADDR6, - ADDR7, - - FP0, /* Eight FP registers */ - FP1, - FP2, - FP3, - FP4, - FP5, - FP6, - FP7, - - COP0, /* Co-processor #0-#7 */ - COP1, - COP2, - COP3, - COP4, - COP5, - COP6, - COP7, - - PC, /* Program counter */ - ZPC, /* Hack for Program space, but 0 addressing */ - SR, /* Status Reg */ - CCR, /* Condition code Reg */ - ACC, /* Accumulator Reg */ - MACSR, /* MAC Status Reg */ - MASK, /* Modulus Reg */ - - /* These have to be grouped together for the movec instruction to work. */ - USP, /* User Stack Pointer */ - ISP, /* Interrupt stack pointer */ - SFC, - DFC, - CACR, - VBR, - CAAR, - MSP, - ITT0, - ITT1, - DTT0, - DTT1, - MMUSR, - TC, - SRP, - URP, - BUSCR, /* 68060 added these */ - PCR, - ROMBAR, /* mcf5200 added these */ - RAMBAR0, - RAMBAR1, - MBAR, -#define last_movec_reg MBAR - /* end of movec ordering constraints */ - - FPI, - FPS, - FPC, - - DRP, /* 68851 or 68030 MMU regs */ - CRP, - CAL, - VAL, - SCC, - AC, - BAD0, - BAD1, - BAD2, - BAD3, - BAD4, - BAD5, - BAD6, - BAD7, - BAC0, - BAC1, - BAC2, - BAC3, - BAC4, - BAC5, - BAC6, - BAC7, - PSR, /* aka MMUSR on 68030 (but not MMUSR on 68040) - and ACUSR on 68ec030 */ - PCSR, - - IC, /* instruction cache token */ - DC, /* data cache token */ - NC, /* no cache token */ - BC, /* both caches token */ - - TT0, /* 68030 access control unit regs */ - TT1, - - ZDATA0, /* suppressed data registers. */ - ZDATA1, - ZDATA2, - ZDATA3, - ZDATA4, - ZDATA5, - ZDATA6, - ZDATA7, - - ZADDR0, /* suppressed address registers. */ - ZADDR1, - ZADDR2, - ZADDR3, - ZADDR4, - ZADDR5, - ZADDR6, - ZADDR7, - - /* Upper and lower half of data and address registers. Order *must* - be DATAxL, ADDRxL, DATAxU, ADDRxU. */ - DATA0L, /* lower half of data registers */ - DATA1L, - DATA2L, - DATA3L, - DATA4L, - DATA5L, - DATA6L, - DATA7L, - - ADDR0L, /* lower half of address registers */ - ADDR1L, - ADDR2L, - ADDR3L, - ADDR4L, - ADDR5L, - ADDR6L, - ADDR7L, - - DATA0U, /* upper half of data registers */ - DATA1U, - DATA2U, - DATA3U, - DATA4U, - DATA5U, - DATA6U, - DATA7U, - - ADDR0U, /* upper half of address registers */ - ADDR1U, - ADDR2U, - ADDR3U, - ADDR4U, - ADDR5U, - ADDR6U, - ADDR7U, -}; - -/* Size information. */ - -enum m68k_size -{ - /* Unspecified. */ - SIZE_UNSPEC, - - /* Byte. */ - SIZE_BYTE, - - /* Word (2 bytes). */ - SIZE_WORD, - - /* Longword (4 bytes). */ - SIZE_LONG -}; - -/* The structure used to hold information about an index register. */ - -struct m68k_indexreg -{ - /* The index register itself. */ - enum m68k_register reg; - - /* The size to use. */ - enum m68k_size size; - - /* The value to scale by. */ - int scale; -}; - -#ifdef OBJ_ELF -/* The type of a PIC expression. */ - -enum pic_relocation -{ - pic_none, /* not pic */ - pic_plt_pcrel, /* @PLTPC */ - pic_got_pcrel, /* @GOTPC */ - pic_plt_off, /* @PLT */ - pic_got_off /* @GOT */ -}; -#endif - -/* The structure used to hold information about an expression. */ - -struct m68k_exp -{ - /* The size to use. */ - enum m68k_size size; - -#ifdef OBJ_ELF - /* The type of pic relocation if any. */ - enum pic_relocation pic_reloc; -#endif - - /* The expression itself. */ - expressionS exp; -}; - -/* The operand modes. */ - -enum m68k_operand_type -{ - IMMED = 1, - ABSL, - DREG, - AREG, - FPREG, - CONTROL, - AINDR, - AINC, - ADEC, - DISP, - BASE, - POST, - PRE, - REGLST -}; - -/* The structure used to hold a parsed operand. */ - -struct m68k_op -{ - /* The type of operand. */ - enum m68k_operand_type mode; - - /* The main register. */ - enum m68k_register reg; - - /* The register mask for mode REGLST. */ - unsigned long mask; - - /* An error message. */ - const char *error; - - /* The index register. */ - struct m68k_indexreg index; - - /* The displacement. */ - struct m68k_exp disp; - - /* The outer displacement. */ - struct m68k_exp odisp; -}; - -#endif /* ! defined (M68K_PARSE_H) */ - -/* The parsing function. */ - -extern int m68k_ip_op PARAMS ((char *, struct m68k_op *)); - -/* Whether register prefixes are optional. */ -extern int flag_reg_prefix_optional; diff --git a/gas/config/m68k-parse.y b/gas/config/m68k-parse.y deleted file mode 100644 index 70a4e4fe86e..00000000000 --- a/gas/config/m68k-parse.y +++ /dev/null @@ -1,1061 +0,0 @@ -/* m68k.y -- bison grammar for m68k operand parsing - Copyright (C) 1995, 96, 1997, 1998 Free Software Foundation, Inc. - Written by Ken Raeburn and Ian Lance Taylor, Cygnus Support - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* This file holds a bison grammar to parse m68k operands. The m68k - has a complicated operand syntax, and gas supports two main - variations of it. Using a grammar is probably overkill, but at - least it makes clear exactly what we do support. */ - -%{ - -#include "as.h" -#include "tc-m68k.h" -#include "m68k-parse.h" - -/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, - etc), as well as gratuitiously global symbol names If other parser - generators (bison, byacc, etc) produce additional global names that - conflict at link time, then those parser generators need to be - fixed instead of adding those names to this list. */ - -#define yymaxdepth m68k_maxdepth -#define yyparse m68k_parse -#define yylex m68k_lex -#define yyerror m68k_error -#define yylval m68k_lval -#define yychar m68k_char -#define yydebug m68k_debug -#define yypact m68k_pact -#define yyr1 m68k_r1 -#define yyr2 m68k_r2 -#define yydef m68k_def -#define yychk m68k_chk -#define yypgo m68k_pgo -#define yyact m68k_act -#define yyexca m68k_exca -#define yyerrflag m68k_errflag -#define yynerrs m68k_nerrs -#define yyps m68k_ps -#define yypv m68k_pv -#define yys m68k_s -#define yy_yys m68k_yys -#define yystate m68k_state -#define yytmp m68k_tmp -#define yyv m68k_v -#define yy_yyv m68k_yyv -#define yyval m68k_val -#define yylloc m68k_lloc -#define yyreds m68k_reds /* With YYDEBUG defined */ -#define yytoks m68k_toks /* With YYDEBUG defined */ -#define yylhs m68k_yylhs -#define yylen m68k_yylen -#define yydefred m68k_yydefred -#define yydgoto m68k_yydgoto -#define yysindex m68k_yysindex -#define yyrindex m68k_yyrindex -#define yygindex m68k_yygindex -#define yytable m68k_yytable -#define yycheck m68k_yycheck - -#ifndef YYDEBUG -#define YYDEBUG 1 -#endif - -/* Internal functions. */ - -static enum m68k_register m68k_reg_parse PARAMS ((char **)); -static int yylex PARAMS ((void)); -static void yyerror PARAMS ((const char *)); - -/* The parser sets fields pointed to by this global variable. */ -static struct m68k_op *op; - -%} - -%union -{ - struct m68k_indexreg indexreg; - enum m68k_register reg; - struct m68k_exp exp; - unsigned long mask; - int onereg; -} - -%token DR AR FPR FPCR LPC ZAR ZDR LZPC CREG -%token INDEXREG -%token EXPR - -%type zireg zdireg -%type zadr zdr apc zapc zpc optzapc optczapc -%type optcexpr optexprc -%type reglist ireglist reglistpair -%type reglistreg - -%% - -/* An operand. */ - -operand: - generic_operand - | motorola_operand - | mit_operand - ; - -/* A generic operand. */ - -generic_operand: - DR - { - op->mode = DREG; - op->reg = $1; - } - | AR - { - op->mode = AREG; - op->reg = $1; - } - | FPR - { - op->mode = FPREG; - op->reg = $1; - } - | FPCR - { - op->mode = CONTROL; - op->reg = $1; - } - | CREG - { - op->mode = CONTROL; - op->reg = $1; - } - | EXPR - { - op->mode = ABSL; - op->disp = $1; - } - | '#' EXPR - { - op->mode = IMMED; - op->disp = $2; - } - | '&' EXPR - { - op->mode = IMMED; - op->disp = $2; - } - | reglist - { - op->mode = REGLST; - op->mask = $1; - } - ; - -/* An operand in Motorola syntax. This includes MRI syntax as well, - which may or may not be different in that it permits commutativity - of index and base registers, and permits an offset expression to - appear inside or outside of the parentheses. */ - -motorola_operand: - '(' AR ')' - { - op->mode = AINDR; - op->reg = $2; - } - | '(' AR ')' '+' - { - op->mode = AINC; - op->reg = $2; - } - | '-' '(' AR ')' - { - op->mode = ADEC; - op->reg = $3; - } - | '(' EXPR ',' zapc ')' - { - op->reg = $4; - op->disp = $2; - if (($4 >= ZADDR0 && $4 <= ZADDR7) - || $4 == ZPC) - op->mode = BASE; - else - op->mode = DISP; - } - | '(' zapc ',' EXPR ')' - { - op->reg = $2; - op->disp = $4; - if (($2 >= ZADDR0 && $2 <= ZADDR7) - || $2 == ZPC) - op->mode = BASE; - else - op->mode = DISP; - } - | EXPR '(' zapc ')' - { - op->reg = $3; - op->disp = $1; - if (($3 >= ZADDR0 && $3 <= ZADDR7) - || $3 == ZPC) - op->mode = BASE; - else - op->mode = DISP; - } - | '(' LPC ')' - { - op->mode = DISP; - op->reg = $2; - } - | '(' ZAR ')' - { - op->mode = BASE; - op->reg = $2; - } - | '(' LZPC ')' - { - op->mode = BASE; - op->reg = $2; - } - | '(' EXPR ',' zapc ',' zireg ')' - { - op->mode = BASE; - op->reg = $4; - op->disp = $2; - op->index = $6; - } - | '(' EXPR ',' zapc ',' zpc ')' - { - if ($4 == PC || $4 == ZPC) - yyerror (_("syntax error")); - op->mode = BASE; - op->reg = $6; - op->disp = $2; - op->index.reg = $4; - op->index.size = SIZE_UNSPEC; - op->index.scale = 1; - } - | '(' EXPR ',' zdireg optczapc ')' - { - op->mode = BASE; - op->reg = $5; - op->disp = $2; - op->index = $4; - } - | '(' zdireg ',' EXPR ')' - { - op->mode = BASE; - op->disp = $4; - op->index = $2; - } - | EXPR '(' zapc ',' zireg ')' - { - op->mode = BASE; - op->reg = $3; - op->disp = $1; - op->index = $5; - } - | '(' zapc ',' zireg ')' - { - op->mode = BASE; - op->reg = $2; - op->index = $4; - } - | EXPR '(' zapc ',' zpc ')' - { - if ($3 == PC || $3 == ZPC) - yyerror (_("syntax error")); - op->mode = BASE; - op->reg = $5; - op->disp = $1; - op->index.reg = $3; - op->index.size = SIZE_UNSPEC; - op->index.scale = 1; - } - | '(' zapc ',' zpc ')' - { - if ($2 == PC || $2 == ZPC) - yyerror (_("syntax error")); - op->mode = BASE; - op->reg = $4; - op->index.reg = $2; - op->index.size = SIZE_UNSPEC; - op->index.scale = 1; - } - | EXPR '(' zdireg optczapc ')' - { - op->mode = BASE; - op->reg = $4; - op->disp = $1; - op->index = $3; - } - | '(' zdireg optczapc ')' - { - op->mode = BASE; - op->reg = $3; - op->index = $2; - } - | '(' '[' EXPR optczapc ']' ',' zireg optcexpr ')' - { - op->mode = POST; - op->reg = $4; - op->disp = $3; - op->index = $7; - op->odisp = $8; - } - | '(' '[' EXPR optczapc ']' optcexpr ')' - { - op->mode = POST; - op->reg = $4; - op->disp = $3; - op->odisp = $6; - } - | '(' '[' zapc ']' ',' zireg optcexpr ')' - { - op->mode = POST; - op->reg = $3; - op->index = $6; - op->odisp = $7; - } - | '(' '[' zapc ']' optcexpr ')' - { - op->mode = POST; - op->reg = $3; - op->odisp = $5; - } - | '(' '[' EXPR ',' zapc ',' zireg ']' optcexpr ')' - { - op->mode = PRE; - op->reg = $5; - op->disp = $3; - op->index = $7; - op->odisp = $9; - } - | '(' '[' zapc ',' zireg ']' optcexpr ')' - { - op->mode = PRE; - op->reg = $3; - op->index = $5; - op->odisp = $7; - } - | '(' '[' EXPR ',' zapc ',' zpc ']' optcexpr ')' - { - if ($5 == PC || $5 == ZPC) - yyerror (_("syntax error")); - op->mode = PRE; - op->reg = $7; - op->disp = $3; - op->index.reg = $5; - op->index.size = SIZE_UNSPEC; - op->index.scale = 1; - op->odisp = $9; - } - | '(' '[' zapc ',' zpc ']' optcexpr ')' - { - if ($3 == PC || $3 == ZPC) - yyerror (_("syntax error")); - op->mode = PRE; - op->reg = $5; - op->index.reg = $3; - op->index.size = SIZE_UNSPEC; - op->index.scale = 1; - op->odisp = $7; - } - | '(' '[' optexprc zdireg optczapc ']' optcexpr ')' - { - op->mode = PRE; - op->reg = $5; - op->disp = $3; - op->index = $4; - op->odisp = $7; - } - ; - -/* An operand in MIT syntax. */ - -mit_operand: - optzapc '@' - { - /* We use optzapc to avoid a shift/reduce conflict. */ - if ($1 < ADDR0 || $1 > ADDR7) - yyerror (_("syntax error")); - op->mode = AINDR; - op->reg = $1; - } - | optzapc '@' '+' - { - /* We use optzapc to avoid a shift/reduce conflict. */ - if ($1 < ADDR0 || $1 > ADDR7) - yyerror (_("syntax error")); - op->mode = AINC; - op->reg = $1; - } - | optzapc '@' '-' - { - /* We use optzapc to avoid a shift/reduce conflict. */ - if ($1 < ADDR0 || $1 > ADDR7) - yyerror (_("syntax error")); - op->mode = ADEC; - op->reg = $1; - } - | optzapc '@' '(' EXPR ')' - { - op->reg = $1; - op->disp = $4; - if (($1 >= ZADDR0 && $1 <= ZADDR7) - || $1 == ZPC) - op->mode = BASE; - else - op->mode = DISP; - } - | optzapc '@' '(' optexprc zireg ')' - { - op->mode = BASE; - op->reg = $1; - op->disp = $4; - op->index = $5; - } - | optzapc '@' '(' EXPR ')' '@' '(' optexprc zireg ')' - { - op->mode = POST; - op->reg = $1; - op->disp = $4; - op->index = $9; - op->odisp = $8; - } - | optzapc '@' '(' EXPR ')' '@' '(' EXPR ')' - { - op->mode = POST; - op->reg = $1; - op->disp = $4; - op->odisp = $8; - } - | optzapc '@' '(' optexprc zireg ')' '@' '(' EXPR ')' - { - op->mode = PRE; - op->reg = $1; - op->disp = $4; - op->index = $5; - op->odisp = $9; - } - ; - -/* An index register, possibly suppressed, which need not have a size - or scale. */ - -zireg: - INDEXREG - | zadr - { - $$.reg = $1; - $$.size = SIZE_UNSPEC; - $$.scale = 1; - } - ; - -/* A register which may be an index register, but which may not be an - address register. This nonterminal is used to avoid ambiguity when - trying to parse something like (0,d5,a6) as compared to (0,a6,d5). */ - -zdireg: - INDEXREG - | zdr - { - $$.reg = $1; - $$.size = SIZE_UNSPEC; - $$.scale = 1; - } - ; - -/* An address or data register, or a suppressed address or data - register. */ - -zadr: - zdr - | AR - | ZAR - ; - -/* A data register which may be suppressed. */ - -zdr: - DR - | ZDR - ; - -/* Either an address register or the PC. */ - -apc: - AR - | LPC - ; - -/* Either an address register, or the PC, or a suppressed address - register, or a suppressed PC. */ - -zapc: - apc - | LZPC - | ZAR - ; - -/* An optional zapc. */ - -optzapc: - /* empty */ - { - $$ = ZADDR0; - } - | zapc - ; - -/* The PC, optionally suppressed. */ - -zpc: - LPC - | LZPC - ; - -/* ',' zapc when it may be omitted. */ - -optczapc: - /* empty */ - { - $$ = ZADDR0; - } - | ',' zapc - { - $$ = $2; - } - ; - -/* ',' EXPR when it may be omitted. */ - -optcexpr: - /* empty */ - { - $$.exp.X_op = O_absent; - $$.size = SIZE_UNSPEC; - } - | ',' EXPR - { - $$ = $2; - } - ; - -/* EXPR ',' when it may be omitted. */ - -optexprc: - /* empty */ - { - $$.exp.X_op = O_absent; - $$.size = SIZE_UNSPEC; - } - | EXPR ',' - { - $$ = $1; - } - ; - -/* A register list for the movem instruction. */ - -reglist: - reglistpair - | reglistpair '/' ireglist - { - $$ = $1 | $3; - } - | reglistreg '/' ireglist - { - $$ = (1 << $1) | $3; - } - ; - -/* We use ireglist when we know we are looking at a reglist, and we - can safely reduce a simple register to reglistreg. If we permitted - reglist to reduce to reglistreg, it would be ambiguous whether a - plain register were a DREG/AREG/FPREG or a REGLST. */ - -ireglist: - reglistreg - { - $$ = 1 << $1; - } - | reglistpair - | reglistpair '/' ireglist - { - $$ = $1 | $3; - } - | reglistreg '/' ireglist - { - $$ = (1 << $1) | $3; - } - ; - -reglistpair: - reglistreg '-' reglistreg - { - if ($1 <= $3) - $$ = (1 << ($3 + 1)) - 1 - ((1 << $1) - 1); - else - $$ = (1 << ($1 + 1)) - 1 - ((1 << $3) - 1); - } - ; - -reglistreg: - DR - { - $$ = $1 - DATA0; - } - | AR - { - $$ = $1 - ADDR0 + 8; - } - | FPR - { - $$ = $1 - FP0 + 16; - } - | FPCR - { - if ($1 == FPI) - $$ = 24; - else if ($1 == FPS) - $$ = 25; - else - $$ = 26; - } - ; - -%% - -/* The string to parse is stored here, and modified by yylex. */ - -static char *str; - -/* The original string pointer. */ - -static char *strorig; - -/* If *CCP could be a register, return the register number and advance - *CCP. Otherwise don't change *CCP, and return 0. */ - -static enum m68k_register -m68k_reg_parse (ccp) - register char **ccp; -{ - char *start = *ccp; - char c; - char *p; - symbolS *symbolp; - - if (flag_reg_prefix_optional) - { - if (*start == REGISTER_PREFIX) - start++; - p = start; - } - else - { - if (*start != REGISTER_PREFIX) - return 0; - p = start + 1; - } - - if (! is_name_beginner (*p)) - return 0; - - p++; - while (is_part_of_name (*p) && *p != '.' && *p != ':' && *p != '*') - p++; - - c = *p; - *p = 0; - symbolp = symbol_find (start); - *p = c; - - if (symbolp != NULL && S_GET_SEGMENT (symbolp) == reg_section) - { - *ccp = p; - return S_GET_VALUE (symbolp); - } - - /* In MRI mode, something like foo.bar can be equated to a register - name. */ - while (flag_mri && c == '.') - { - ++p; - while (is_part_of_name (*p) && *p != '.' && *p != ':' && *p != '*') - p++; - c = *p; - *p = '\0'; - symbolp = symbol_find (start); - *p = c; - if (symbolp != NULL && S_GET_SEGMENT (symbolp) == reg_section) - { - *ccp = p; - return S_GET_VALUE (symbolp); - } - } - - return 0; -} - -/* The lexer. */ - -static int -yylex () -{ - enum m68k_register reg; - char *s; - int parens; - int c = 0; - int tail = 0; - char *hold; - - if (*str == ' ') - ++str; - - if (*str == '\0') - return 0; - - /* Various special characters are just returned directly. */ - switch (*str) - { - case '@': - /* In MRI mode, this can be the start of an octal number. */ - if (flag_mri) - { - if (isdigit (str[1]) - || ((str[1] == '+' || str[1] == '-') - && isdigit (str[2]))) - break; - } - /* Fall through. */ - case '#': - case '&': - case ',': - case ')': - case '/': - case '[': - case ']': - return *str++; - case '+': - /* It so happens that a '+' can only appear at the end of an - operand. If it appears anywhere else, it must be a unary - plus on an expression. */ - if (str[1] == '\0') - return *str++; - break; - case '-': - /* A '-' can only appear in -(ar), rn-rn, or ar@-. If it - appears anywhere else, it must be a unary minus on an - expression. */ - if (str[1] == '\0') - return *str++; - s = str + 1; - if (*s == '(') - ++s; - if (m68k_reg_parse (&s) != 0) - return *str++; - break; - case '(': - /* A '(' can only appear in `(reg)', `(expr,...', `([', `@(', or - `)('. If it appears anywhere else, it must be starting an - expression. */ - if (str[1] == '[' - || (str > strorig - && (str[-1] == '@' - || str[-1] == ')'))) - return *str++; - s = str + 1; - if (m68k_reg_parse (&s) != 0) - return *str++; - /* Check for the case of '(expr,...' by scanning ahead. If we - find a comma outside of balanced parentheses, we return '('. - If we find an unbalanced right parenthesis, then presumably - the '(' really starts an expression. */ - parens = 0; - for (s = str + 1; *s != '\0'; s++) - { - if (*s == '(') - ++parens; - else if (*s == ')') - { - if (parens == 0) - break; - --parens; - } - else if (*s == ',' && parens == 0) - { - /* A comma can not normally appear in an expression, so - this is a case of '(expr,...'. */ - return *str++; - } - } - } - - /* See if it's a register. */ - - reg = m68k_reg_parse (&str); - if (reg != 0) - { - int ret; - - yylval.reg = reg; - - if (reg >= DATA0 && reg <= DATA7) - ret = DR; - else if (reg >= ADDR0 && reg <= ADDR7) - ret = AR; - else if (reg >= FP0 && reg <= FP7) - return FPR; - else if (reg == FPI - || reg == FPS - || reg == FPC) - return FPCR; - else if (reg == PC) - return LPC; - else if (reg >= ZDATA0 && reg <= ZDATA7) - ret = ZDR; - else if (reg >= ZADDR0 && reg <= ZADDR7) - ret = ZAR; - else if (reg == ZPC) - return LZPC; - else - return CREG; - - /* If we get here, we have a data or address register. We - must check for a size or scale; if we find one, we must - return INDEXREG. */ - - s = str; - - if (*s != '.' && *s != ':' && *s != '*') - return ret; - - yylval.indexreg.reg = reg; - - if (*s != '.' && *s != ':') - yylval.indexreg.size = SIZE_UNSPEC; - else - { - ++s; - switch (*s) - { - case 'w': - case 'W': - yylval.indexreg.size = SIZE_WORD; - ++s; - break; - case 'l': - case 'L': - yylval.indexreg.size = SIZE_LONG; - ++s; - break; - default: - yyerror (_("illegal size specification")); - yylval.indexreg.size = SIZE_UNSPEC; - break; - } - } - - yylval.indexreg.scale = 1; - - if (*s == '*' || *s == ':') - { - expressionS scale; - - ++s; - - hold = input_line_pointer; - input_line_pointer = s; - expression (&scale); - s = input_line_pointer; - input_line_pointer = hold; - - if (scale.X_op != O_constant) - yyerror (_("scale specification must resolve to a number")); - else - { - switch (scale.X_add_number) - { - case 1: - case 2: - case 4: - case 8: - yylval.indexreg.scale = scale.X_add_number; - break; - default: - yyerror (_("invalid scale value")); - break; - } - } - } - - str = s; - - return INDEXREG; - } - - /* It must be an expression. Before we call expression, we need to - look ahead to see if there is a size specification. We must do - that first, because otherwise foo.l will be treated as the symbol - foo.l, rather than as the symbol foo with a long size - specification. The grammar requires that all expressions end at - the end of the operand, or with ',', '(', ']', ')'. */ - - parens = 0; - for (s = str; *s != '\0'; s++) - { - if (*s == '(') - { - if (parens == 0 - && s > str - && (s[-1] == ')' || isalnum ((unsigned char) s[-1]))) - break; - ++parens; - } - else if (*s == ')') - { - if (parens == 0) - break; - --parens; - } - else if (parens == 0 - && (*s == ',' || *s == ']')) - break; - } - - yylval.exp.size = SIZE_UNSPEC; - if (s <= str + 2 - || (s[-2] != '.' && s[-2] != ':')) - tail = 0; - else - { - switch (s[-1]) - { - case 's': - case 'S': - case 'b': - case 'B': - yylval.exp.size = SIZE_BYTE; - break; - case 'w': - case 'W': - yylval.exp.size = SIZE_WORD; - break; - case 'l': - case 'L': - yylval.exp.size = SIZE_LONG; - break; - default: - break; - } - if (yylval.exp.size != SIZE_UNSPEC) - tail = 2; - } - -#ifdef OBJ_ELF - { - /* Look for @PLTPC, etc. */ - char *cp; - - yylval.exp.pic_reloc = pic_none; - cp = s - tail; - if (cp - 6 > str && cp[-6] == '@') - { - if (strncmp (cp - 6, "@PLTPC", 6) == 0) - { - yylval.exp.pic_reloc = pic_plt_pcrel; - tail += 6; - } - else if (strncmp (cp - 6, "@GOTPC", 6) == 0) - { - yylval.exp.pic_reloc = pic_got_pcrel; - tail += 6; - } - } - else if (cp - 4 > str && cp[-4] == '@') - { - if (strncmp (cp - 4, "@PLT", 4) == 0) - { - yylval.exp.pic_reloc = pic_plt_off; - tail += 4; - } - else if (strncmp (cp - 4, "@GOT", 4) == 0) - { - yylval.exp.pic_reloc = pic_got_off; - tail += 4; - } - } - } -#endif - - if (tail != 0) - { - c = s[-tail]; - s[-tail] = 0; - } - - hold = input_line_pointer; - input_line_pointer = str; - expression (&yylval.exp.exp); - str = input_line_pointer; - input_line_pointer = hold; - - if (tail != 0) - { - s[-tail] = c; - str = s; - } - - return EXPR; -} - -/* Parse an m68k operand. This is the only function which is called - from outside this file. */ - -int -m68k_ip_op (s, oparg) - char *s; - struct m68k_op *oparg; -{ - memset (oparg, 0, sizeof *oparg); - oparg->error = NULL; - oparg->index.reg = ZDATA0; - oparg->index.scale = 1; - oparg->disp.exp.X_op = O_absent; - oparg->odisp.exp.X_op = O_absent; - - str = strorig = s; - op = oparg; - - return yyparse (); -} - -/* The error handler. */ - -static void -yyerror (s) - const char *s; -{ - op->error = s; -} diff --git a/gas/config/m88k-opcode.h b/gas/config/m88k-opcode.h deleted file mode 100644 index 27464bc0fc9..00000000000 --- a/gas/config/m88k-opcode.h +++ /dev/null @@ -1,559 +0,0 @@ -/* m88k-opcode.h -- Instruction information for the Motorola 88000 - Contributed by Devon Bowen of Buffalo University - and Torbjorn Granlund of the Swedish Institute of Computer Science. - Copyright (C) 1989, 1990, 1991 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#if !defined(__STDC__) && !defined(const) -#define const -#endif - -/* - Character codes for op_spec field below. - Reserved for self-matching: [ ] , - - d = GRF Destination register (21:5) - x = XRF register prefix. Makes next d, 1, or 2, match an extended register. - 1 = Source register 1 (16:5) - 2 = Source register 2 (0:5) - 3 = Both source registers (same value) (0:5 and 16:5) - I = IMM16 (0:16) - b = bit field spec. (0:10) - p = 16 bit pc displ. (0:16) - P = 26 bit pc displ. (0:26) - B = bb0/bb1 condition (21:5) - M = bcnd condition (21:5) - f = fcr (5:6) - c = cr (5:6) - V = VEC9 (0:9) - o = O6 field of "prot" insn (10:7) - ? = Give warning for this insn/operand combination - */ - -/* instruction descriptor structure */ - -struct m88k_opcode -{ - unsigned int opcode; - char *name; - char *op_spec; -}; - -/* and introducing... the Motorola 88100 and 88110 instruction sets... */ - -/* By default, include the 88110 instructions. */ -#define MC88110 - -#if defined (MC88110) -#define _MC88100(OPCODE,MNEM,OP_SPEC) -#define _MC88110(OPCODE,MNEM,OP_SPEC) {OPCODE,MNEM,OP_SPEC}, -#else -#define _MC88100(OPCODE,MNEM,OP_SPEC) {OPCODE,MNEM,OP_SPEC}, -#define _MC88110(OPCODE,MNEM,OP_SPEC) -#endif - -#define _MC88xxx(OPCODE,MNEM,OP_SPEC) {OPCODE,MNEM,OP_SPEC}, - -/* Equal mnemonics must be adjacent. - More specific operand specification must go before more general. - For example, "d,1,2" must go before "d,1,I" as a register for s2 - would otherwise be considered a variable name. */ - -static struct m88k_opcode m88k_opcodes[] = -{ - /* Opcode Mnemonic Opspec */ - - _MC88xxx (0xf4007000, "add", "d,1,2") - _MC88xxx (0x70000000, "add", "d,1,I") - _MC88xxx (0xf4007200, "add.ci", "d,1,2") - _MC88xxx (0xf4007300, "add.cio", "d,1,2") - _MC88xxx (0xf4007100, "add.co", "d,1,2") - _MC88xxx (0xf4006000, "addu", "d,1,2") - _MC88xxx (0x60000000, "addu", "d,1,I") - _MC88xxx (0xf4006200, "addu.ci", "d,1,2") - _MC88xxx (0xf4006300, "addu.cio", "d,1,2") - _MC88xxx (0xf4006100, "addu.co", "d,1,2") - _MC88xxx (0xf4004000, "and", "d,1,2") - _MC88xxx (0x40000000, "and", "d,1,I") - _MC88xxx (0xf4004400, "and.c", "d,1,2") - _MC88xxx (0x44000000, "and.u", "d,1,I") - _MC88xxx (0xd0000000, "bb0", "B,1,p") - _MC88xxx (0xd4000000, "bb0.n", "B,1,p") - _MC88xxx (0xd8000000, "bb1", "B,1,p") - _MC88xxx (0xdc000000, "bb1.n", "B,1,p") - _MC88xxx (0xe8000000, "bcnd", "M,1,p") - _MC88xxx (0xec000000, "bcnd.n", "M,1,p") - _MC88xxx (0xc0000000, "br", "P") - _MC88xxx (0xc4000000, "br.n", "P") - _MC88xxx (0xc8000000, "bsr", "P") - _MC88xxx (0xcc000000, "bsr.n", "P") - _MC88xxx (0xf4008000, "clr", "d,1,2") - _MC88xxx (0xf0008000, "clr", "d,1,b") - _MC88xxx (0xf4007c00, "cmp", "d,1,2") - _MC88xxx (0x7c000000, "cmp", "d,1,I") - _MC88xxx (0xf4007800, "div", "d,1,2") - _MC88xxx (0x78000000, "div", "d,1,I") - _MC88xxx (0xf4007800, "divs", "d,1,2") - _MC88xxx (0x78000000, "divs", "d,1,I") - _MC88110 (0xf4006900, "divu.d", "d,1,2") - _MC88xxx (0xf4006800, "divu", "d,1,2") - _MC88xxx (0x68000000, "divu", "d,1,I") - _MC88xxx (0xf4009000, "ext", "d,1,2") - _MC88xxx (0xf0009000, "ext", "d,1,b") - _MC88xxx (0xf4009800, "extu", "d,1,2") - _MC88xxx (0xf0009800, "extu", "d,1,b") - _MC88xxx (0x84002800, "fadd.sss", "d,1,2") - _MC88110 (0x8400a800, "fadd.sss", "xd,x1,x2") - _MC88xxx (0x84002880, "fadd.ssd", "d,1,2") - _MC88110 (0x8400a820, "fadd.ssd", "xd,x1,x2") - _MC88110 (0x8400a840, "fadd.ssx", "xd,x1,x2") - _MC88xxx (0x84002a00, "fadd.sds", "d,1,2") - _MC88110 (0x8400a880, "fadd.sds", "xd,x1,x2") - _MC88xxx (0x84002a80, "fadd.sdd", "d,1,2") - _MC88110 (0x8400a8a0, "fadd.sdd", "xd,x1,x2") - _MC88110 (0x8400a8c0, "fadd.sdx", "xd,x1,x2") - _MC88110 (0x8400a900, "fadd.sxs", "xd,x1,x2") - _MC88110 (0x8400a920, "fadd.sxd", "xd,x1,x2") - _MC88110 (0x8400a940, "fadd.sxx", "xd,x1,x2") - _MC88xxx (0x84002820, "fadd.dss", "d,1,2") - _MC88110 (0x8400aa00, "fadd.dss", "xd,x1,x2") - _MC88xxx (0x840028a0, "fadd.dsd", "d,1,2") - _MC88110 (0x8400aa20, "fadd.dsd", "xd,x1,x2") - _MC88110 (0x8400aa40, "fadd.dsx", "xd,x1,x2") - _MC88xxx (0x84002a20, "fadd.dds", "d,1,2") - _MC88110 (0x8400aa80, "fadd.dds", "xd,x1,x2") - _MC88xxx (0x84002aa0, "fadd.ddd", "d,1,2") - _MC88110 (0x8400aaa0, "fadd.ddd", "xd,x1,x2") - _MC88110 (0x8400aac0, "fadd.ddx", "xd,x1,x2") - _MC88110 (0x8400ab00, "fadd.dxs", "xd,x1,x2") - _MC88110 (0x8400ab20, "fadd.dxd", "xd,x1,x2") - _MC88110 (0x8400ab40, "fadd.dxx", "xd,x1,x2") - _MC88110 (0x8400ac00, "fadd.xss", "xd,x1,x2") - _MC88110 (0x8400ac20, "fadd.xsd", "xd,x1,x2") - _MC88110 (0x8400ac40, "fadd.xsx", "xd,x1,x2") - _MC88110 (0x8400ac80, "fadd.xds", "xd,x1,x2") - _MC88110 (0x8400aca0, "fadd.xdd", "xd,x1,x2") - _MC88110 (0x8400acc0, "fadd.xdx", "xd,x1,x2") - _MC88110 (0x8400ad00, "fadd.xxs", "xd,x1,x2") - _MC88110 (0x8400ad20, "fadd.xxd", "xd,x1,x2") - _MC88110 (0x8400ad40, "fadd.xxx", "xd,x1,x2") - _MC88xxx (0x84003a80, "fcmp.sdd", "d,1,2") - _MC88110 (0x8400ba80, "fcmp.sdd", "d,x1,x2") - _MC88xxx (0x84003a00, "fcmp.sds", "d,1,2") - _MC88110 (0x8400ba00, "fcmp.sds", "d,x1,x2") - _MC88110 (0x8400bb00, "fcmp.sdx", "d,x1,x2") - _MC88xxx (0x84003880, "fcmp.ssd", "d,1,2") - _MC88110 (0x8400b880, "fcmp.ssd", "d,x1,x2") - _MC88xxx (0x84003800, "fcmp.sss", "d,1,2") - _MC88110 (0x8400b800, "fcmp.sss", "d,x1,x2") - _MC88110 (0x8400b900, "fcmp.ssx", "d,x1,x2") - _MC88110 (0x8400bc80, "fcmp.sxd", "d,x1,x2") - _MC88110 (0x8400bc00, "fcmp.sxs", "d,x1,x2") - _MC88110 (0x8400bd00, "fcmp.sxx", "d,x1,x2") - _MC88110 (0x84003aa0, "fcmpu.sdd", "d,1,2") - _MC88110 (0x8400baa0, "fcmpu.sdd", "d,x1,x2") - _MC88110 (0x84003a20, "fcmpu.sds", "d,1,2") - _MC88110 (0x8400ba20, "fcmpu.sds", "d,x1,x2") - _MC88110 (0x8400bb20, "fcmpu.sdx", "d,x1,x2") - _MC88110 (0x840038a0, "fcmpu.ssd", "d,1,2") - _MC88110 (0x8400b8a0, "fcmpu.ssd", "d,x1,x2") - _MC88110 (0x84003820, "fcmpu.sss", "d,1,2") - _MC88110 (0x8400b820, "fcmpu.sss", "d,x1,x2") - _MC88110 (0x8400b920, "fcmpu.ssx", "d,x1,x2") - _MC88110 (0x8400bca0, "fcmpu.sxd", "d,x1,x2") - _MC88110 (0x8400bc20, "fcmpu.sxs", "d,x1,x2") - _MC88110 (0x8400bd20, "fcmpu.sxx", "d,x1,x2") - _MC88110 (0x84000880, "fcvt.ds", "d,2") - _MC88110 (0x84008880, "fcvt.ds", "xd,x2") - _MC88110 (0x840088c0, "fcvt.dx", "xd,x2") - _MC88110 (0x84000820, "fcvt.sd", "d,2") - _MC88110 (0x84008820, "fcvt.sd", "xd,x2") - _MC88110 (0x84008840, "fcvt.sx", "xd,x2") - _MC88110 (0x84008920, "fcvt.xd", "xd,x2") - _MC88110 (0x84008900, "fcvt.xs", "xd,x2") - _MC88xxx (0x84007000, "fdiv.sss", "d,1,2") - _MC88110 (0x8400f000, "fdiv.sss", "xd,x1,x2") - _MC88xxx (0x84007080, "fdiv.ssd", "d,1,2") - _MC88110 (0x8400f020, "fdiv.ssd", "xd,x1,x2") - _MC88110 (0x8400f040, "fdiv.ssx", "xd,x1,x2") - _MC88xxx (0x84007200, "fdiv.sds", "d,1,2") - _MC88110 (0x8400f080, "fdiv.sds", "xd,x1,x2") - _MC88xxx (0x84007280, "fdiv.sdd", "d,1,2") - _MC88110 (0x8400f0a0, "fdiv.sdd", "xd,x1,x2") - _MC88110 (0x8400f0c0, "fdiv.sdx", "xd,x1,x2") - _MC88110 (0x8400f100, "fdiv.sxs", "xd,x1,x2") - _MC88110 (0x8400f120, "fdiv.sxd", "xd,x1,x2") - _MC88110 (0x8400f140, "fdiv.sxx", "xd,x1,x2") - _MC88xxx (0x84007020, "fdiv.dss", "d,1,2") - _MC88110 (0x8400f200, "fdiv.dss", "xd,x1,x2") - _MC88xxx (0x840070a0, "fdiv.dsd", "d,1,2") - _MC88110 (0x8400f220, "fdiv.dsd", "xd,x1,x2") - _MC88110 (0x8400f240, "fdiv.dsx", "xd,x1,x2") - _MC88xxx (0x84007220, "fdiv.dds", "d,1,2") - _MC88110 (0x8400f280, "fdiv.dds", "xd,x1,x2") - _MC88xxx (0x840072a0, "fdiv.ddd", "d,1,2") - _MC88110 (0x8400f2a0, "fdiv.ddd", "xd,x1,x2") - _MC88110 (0x8400f2c0, "fdiv.ddx", "xd,x1,x2") - _MC88110 (0x8400f300, "fdiv.dxs", "xd,x1,x2") - _MC88110 (0x8400f320, "fdiv.dxd", "xd,x1,x2") - _MC88110 (0x8400f340, "fdiv.dxx", "xd,x1,x2") - _MC88110 (0x8400f400, "fdiv.xss", "xd,x1,x2") - _MC88110 (0x8400f420, "fdiv.xsd", "xd,x1,x2") - _MC88110 (0x8400f440, "fdiv.xsx", "xd,x1,x2") - _MC88110 (0x8400f480, "fdiv.xds", "xd,x1,x2") - _MC88110 (0x8400f4a0, "fdiv.xdd", "xd,x1,x2") - _MC88110 (0x8400f4c0, "fdiv.xdx", "xd,x1,x2") - _MC88110 (0x8400f500, "fdiv.xxs", "xd,x1,x2") - _MC88110 (0x8400f520, "fdiv.xxd", "xd,x1,x2") - _MC88110 (0x8400f540, "fdiv.xxx", "xd,x1,x2") - _MC88xxx (0xf400ec00, "ff0", "d,2") - _MC88xxx (0xf400e800, "ff1", "d,2") - _MC88xxx (0x80004800, "fldcr", "d,f") - _MC88xxx (0x84002020, "flt.ds", "d,2") - _MC88110 (0x84002220, "flt.ds", "xd,2") - _MC88xxx (0x84002000, "flt.ss", "d,2") - _MC88110 (0x84002200, "flt.ss", "xd,2") - _MC88110 (0x84002240, "flt.xs", "xd,2") - _MC88xxx (0x84000000, "fmul.sss", "d,1,2") - _MC88110 (0x84008000, "fmul.sss", "xd,x1,x2") - _MC88xxx (0x84000080, "fmul.ssd", "d,1,2") - _MC88110 (0x84008020, "fmul.ssd", "xd,x1,x2") - _MC88110 (0x84008040, "fmul.ssx", "xd,x1,x2") - _MC88xxx (0x84000200, "fmul.sds", "d,1,2") - _MC88110 (0x84008080, "fmul.sds", "xd,x1,x2") - _MC88xxx (0x84000280, "fmul.sdd", "d,1,2") - _MC88110 (0x840080a0, "fmul.sdd", "xd,x1,x2") - _MC88110 (0x840080c0, "fmul.sdx", "xd,x1,x2") - _MC88110 (0x84008100, "fmul.sxs", "xd,x1,x2") - _MC88110 (0x84008120, "fmul.sxd", "xd,x1,x2") - _MC88110 (0x84008140, "fmul.sxx", "xd,x1,x2") - _MC88xxx (0x84000020, "fmul.dss", "d,1,2") - _MC88110 (0x84008200, "fmul.dss", "xd,x1,x2") - _MC88xxx (0x840000a0, "fmul.dsd", "d,1,2") - _MC88110 (0x84008220, "fmul.dsd", "xd,x1,x2") - _MC88110 (0x84008240, "fmul.dsx", "xd,x1,x2") - _MC88xxx (0x84000220, "fmul.dds", "d,1,2") - _MC88110 (0x84008280, "fmul.dds", "xd,x1,x2") - _MC88xxx (0x840002a0, "fmul.ddd", "d,1,2") - _MC88110 (0x840082a0, "fmul.ddd", "xd,x1,x2") - _MC88110 (0x840082c0, "fmul.ddx", "xd,x1,x2") - _MC88110 (0x84008300, "fmul.dxs", "xd,x1,x2") - _MC88110 (0x84008320, "fmul.dxd", "xd,x1,x2") - _MC88110 (0x84008340, "fmul.dxx", "xd,x1,x2") - _MC88110 (0x84008400, "fmul.xss", "xd,x1,x2") - _MC88110 (0x84008420, "fmul.xsd", "xd,x1,x2") - _MC88110 (0x84008440, "fmul.xsx", "xd,x1,x2") - _MC88110 (0x84008480, "fmul.xds", "xd,x1,x2") - _MC88110 (0x840084a0, "fmul.xdd", "xd,x1,x2") - _MC88110 (0x840084c0, "fmul.xdx", "xd,x1,x2") - _MC88110 (0x84008500, "fmul.xxs", "xd,x1,x2") - _MC88110 (0x84008520, "fmul.xxd", "xd,x1,x2") - _MC88110 (0x84008540, "fmul.xxx", "xd,x1,x2") - _MC88110 (0x840078a0, "fsqrt.dd", "d,2") - _MC88110 (0x8400f8a0, "fsqrt.dd", "xd,x2") - _MC88110 (0x84007880, "fsqrt.ds", "d,2") - _MC88110 (0x8400f880, "fsqrt.ds", "xd,x2") - _MC88110 (0x8400f8c0, "fsqrt.dx", "xd,x2") - _MC88110 (0x84007820, "fsqrt.sd", "d,2") - _MC88110 (0x8400f820, "fsqrt.sd", "xd,x2") - _MC88110 (0x84007800, "fsqrt.ss", "d,2") - _MC88110 (0x8400f800, "fsqrt.ss", "xd,x2") - _MC88110 (0x8400f840, "fsqrt.sx", "xd,x2") - _MC88110 (0x8400f920, "fsqrt.xd", "xd,x2") - _MC88110 (0x8400f900, "fsqrt.xs", "xd,x2") - _MC88110 (0x8400f940, "fsqrt.xx", "xd,x2") - _MC88xxx (0x80008800, "fstcr", "3,f") - _MC88xxx (0x84003000, "fsub.sss", "d,1,2") - _MC88110 (0x8400b000, "fsub.sss", "xd,x1,x2") - _MC88xxx (0x84003080, "fsub.ssd", "d,1,2") - _MC88110 (0x8400b020, "fsub.ssd", "xd,x1,x2") - _MC88110 (0x8400b040, "fsub.ssx", "xd,x1,x2") - _MC88xxx (0x84003200, "fsub.sds", "d,1,2") - _MC88110 (0x8400b080, "fsub.sds", "xd,x1,x2") - _MC88xxx (0x84003280, "fsub.sdd", "d,1,2") - _MC88110 (0x8400b0a0, "fsub.sdd", "xd,x1,x2") - _MC88110 (0x8400b0c0, "fsub.sdx", "xd,x1,x2") - _MC88110 (0x8400b100, "fsub.sxs", "xd,x1,x2") - _MC88110 (0x8400b120, "fsub.sxd", "xd,x1,x2") - _MC88110 (0x8400b140, "fsub.sxx", "xd,x1,x2") - _MC88xxx (0x84003020, "fsub.dss", "d,1,2") - _MC88110 (0x8400b200, "fsub.dss", "xd,x1,x2") - _MC88xxx (0x840030a0, "fsub.dsd", "d,1,2") - _MC88110 (0x8400b220, "fsub.dsd", "xd,x1,x2") - _MC88110 (0x8400b240, "fsub.dsx", "xd,x1,x2") - _MC88xxx (0x84003220, "fsub.dds", "d,1,2") - _MC88110 (0x8400b280, "fsub.dds", "xd,x1,x2") - _MC88xxx (0x840032a0, "fsub.ddd", "d,1,2") - _MC88110 (0x8400b2a0, "fsub.ddd", "xd,x1,x2") - _MC88110 (0x8400b2c0, "fsub.ddx", "xd,x1,x2") - _MC88110 (0x8400b300, "fsub.dxs", "xd,x1,x2") - _MC88110 (0x8400b320, "fsub.dxd", "xd,x1,x2") - _MC88110 (0x8400b340, "fsub.dxx", "xd,x1,x2") - _MC88110 (0x8400b400, "fsub.xss", "xd,x1,x2") - _MC88110 (0x8400b420, "fsub.xsd", "xd,x1,x2") - _MC88110 (0x8400b440, "fsub.xsx", "xd,x1,x2") - _MC88110 (0x8400b480, "fsub.xds", "xd,x1,x2") - _MC88110 (0x8400b4a0, "fsub.xdd", "xd,x1,x2") - _MC88110 (0x8400b4c0, "fsub.xdx", "xd,x1,x2") - _MC88110 (0x8400b500, "fsub.xxs", "xd,x1,x2") - _MC88110 (0x8400b520, "fsub.xxd", "xd,x1,x2") - _MC88110 (0x8400b540, "fsub.xxx", "xd,x1,x2") - _MC88xxx (0x8000c800, "fxcr", "d,3,f") - _MC88xxx (0x8400fc01, "illop1", "") - _MC88xxx (0x8400fc02, "illop2", "") - _MC88xxx (0x8400fc03, "illop3", "") - _MC88xxx (0x84004880, "int.sd", "d,2") - _MC88110 (0x8400c880, "int.sd", "d,x2") - _MC88xxx (0x84004800, "int.ss", "d,2") - _MC88110 (0x8400c800, "int.ss", "d,x2") - _MC88110 (0x8400c900, "int.sx", "d,x2") - _MC88xxx (0xf400c000, "jmp", "2") - _MC88xxx (0xf400c400, "jmp.n", "2") - _MC88xxx (0xf400c800, "jsr", "2") - _MC88xxx (0xf400cc00, "jsr.n", "2") - _MC88xxx (0xf4001400, "ld", "d,1,2") - _MC88xxx (0xf4001600, "ld", "d,1[2]") - _MC88xxx (0x14000000, "ld", "d,1,I") - _MC88110 (0xf0001600, "ld", "xd,1[2]") - _MC88110 (0xf0001400, "ld", "xd,1,2") - _MC88110 (0x04000000, "ld", "xd,1,I") - _MC88xxx (0xf4001e00, "ld.b", "d,1[2]") - _MC88xxx (0xf4001c00, "ld.b", "d,1,2") - _MC88xxx (0x1c000000, "ld.b", "d,1,I") - _MC88xxx (0xf4001d00, "ld.b.usr", "d,1,2") - _MC88xxx (0xf4001f00, "ld.b.usr", "d,1[2]") - _MC88xxx (0xf4000e00, "ld.bu", "d,1[2]") - _MC88xxx (0xf4000c00, "ld.bu", "d,1,2") - _MC88xxx (0x0c000000, "ld.bu", "d,1,I") - _MC88xxx (0xf4000d00, "ld.bu.usr", "d,1,2") - _MC88xxx (0xf4000f00, "ld.bu.usr", "d,1[2]") - _MC88xxx (0xf4001200, "ld.d", "d,1[2]") - _MC88xxx (0xf4001000, "ld.d", "d,1,2") - _MC88xxx (0x10000000, "ld.d", "d,1,I") - _MC88110 (0xf0001200, "ld.d", "xd,1[2]") - _MC88110 (0xf0001000, "ld.d", "xd,1,2") - _MC88110 (0x00000000, "ld.d", "xd,1,I") - _MC88xxx (0xf4001100, "ld.d.usr", "d,1,2") - _MC88xxx (0xf4001300, "ld.d.usr", "d,1[2]") - _MC88110 (0xf0001100, "ld.d.usr", "xd,1,2") - _MC88110 (0xf0001300, "ld.d.usr", "xd,1[2]") - _MC88xxx (0xf4001a00, "ld.h", "d,1[2]") - _MC88xxx (0xf4001800, "ld.h", "d,1,2") - _MC88xxx (0x18000000, "ld.h", "d,1,I") - _MC88xxx (0xf4001900, "ld.h.usr", "d,1,2") - _MC88xxx (0xf4001b00, "ld.h.usr", "d,1[2]") - _MC88xxx (0xf4000a00, "ld.hu", "d,1[2]") - _MC88xxx (0xf4000800, "ld.hu", "d,1,2") - _MC88xxx (0x08000000, "ld.hu", "d,1,I") - _MC88xxx (0xf4000900, "ld.hu.usr", "d,1,2") - _MC88xxx (0xf4000b00, "ld.hu.usr", "d,1[2]") - _MC88xxx (0xf4001500, "ld.usr", "d,1,2") - _MC88xxx (0xf4001700, "ld.usr", "d,1[2]") - _MC88110 (0xf0001500, "ld.usr", "xd,1,2") - _MC88110 (0xf0001700, "ld.usr", "xd,1[2]") - _MC88110 (0xf0001a00, "ld.x", "xd,1[2]") - _MC88110 (0xf0001800, "ld.x", "xd,1,2") - _MC88110 (0x3c000000, "ld.x", "xd,1,I") - _MC88110 (0xf0001900, "ld.x.usr", "xd,1,2") - _MC88110 (0xf0001b00, "ld.x.usr", "xd,1[2]") - _MC88xxx (0xf4003600, "lda", "d,1[2]") - _MC88xxx (0xf4006000, "lda", "?d,1,2") /* Output addu */ - _MC88xxx (0x60000000, "lda", "?d,1,I") /* Output addu */ - _MC88xxx (0xf4006000, "lda.b", "?d,1[2]") /* Output addu */ - _MC88xxx (0xf4006000, "lda.b", "?d,1,2") /* Output addu */ - _MC88xxx (0x60000000, "lda.b", "?d,1,I") /* Output addu */ - _MC88xxx (0xf4003200, "lda.d", "d,1[2]") - _MC88xxx (0xf4006000, "lda.d", "?d,1,2") /* Output addu */ - _MC88xxx (0x60000000, "lda.d", "?d,1,I") /* Output addu */ - _MC88110 (0xf4003e00, "lda.x", "d,1[2]") - _MC88xxx (0xf4003a00, "lda.h", "d,1[2]") - _MC88xxx (0xf4006000, "lda.h", "?d,1,2") /* Output addu */ - _MC88xxx (0x60000000, "lda.h", "?d,1,I") /* Output addu */ - _MC88xxx (0x80004000, "ldcr", "d,c") - _MC88xxx (0xf400a000, "mak", "d,1,2") - _MC88xxx (0xf000a000, "mak", "d,1,b") - _MC88xxx (0x48000000, "mask", "d,1,I") - _MC88xxx (0x4c000000, "mask.u", "d,1,I") - _MC88110 (0x8400c000, "mov.s", "d,x2") - _MC88110 (0x84004200, "mov.s", "xd,2") - _MC88110 (0x8400c080, "mov.d", "d,x2") - _MC88110 (0x84004280, "mov.d", "xd,2") - _MC88110 (0x8400c300, "mov", "xd,x2") - _MC88xxx (0xf4006c00, "mul", "d,1,2") - _MC88xxx (0x6c000000, "mul", "d,1,I") - _MC88xxx (0xf4006e00, "muls", "d,1,2") - _MC88xxx (0x6c000000, "muls", "d,1,I") - _MC88xxx (0xf4006c00, "mulu", "d,1,2") /* synonym for mul */ - _MC88xxx (0x6c000000, "mulu", "d,1,I") /* synonym for mul */ - _MC88110 (0xf4006d00, "mulu.d", "d,1,2") - _MC88xxx (0x84005080, "nint.sd", "d,2") - _MC88110 (0x8400d080, "nint.sd", "d,x2") - _MC88xxx (0x84005000, "nint.ss", "d,2") - _MC88110 (0x8400d000, "nint.ss", "d,x2") - _MC88110 (0x8400d100, "nint.sx", "d,x2") - _MC88xxx (0xf4005800, "or", "d,1,2") - _MC88xxx (0x58000000, "or", "d,1,I") - _MC88xxx (0xf4005c00, "or.c", "d,1,2") - _MC88xxx (0x5c000000, "or.u", "d,1,I") - _MC88110 (0x88002020, "padd.b", "d,1,2") - _MC88110 (0x88002040, "padd.h", "d,1,2") - _MC88110 (0x88002060, "padd", "d,1,2") - _MC88110 (0x880020a0, "padds.u.b", "d,1,2") - _MC88110 (0x880020c0, "padds.u.h", "d,1,2") - _MC88110 (0x880020e0, "padds.u", "d,1,2") - _MC88110 (0x88002120, "padds.us.b", "d,1,2") - _MC88110 (0x88002140, "padds.us.h", "d,1,2") - _MC88110 (0x88002160, "padds.us", "d,1,2") - _MC88110 (0x880021a0, "padds.s.b", "d,1,2") - _MC88110 (0x880021c0, "padds.s.h", "d,1,2") - _MC88110 (0x880021e0, "padds.s", "d,1,2") - _MC88110 (0x88003860, "pcmp", "d,1,2") - _MC88110 (0x88000000, "pmul", "d,1,2") - _MC88110 (0x88006420, "ppack.32.b", "d,1,2") - _MC88110 (0x88006240, "ppack.16.h", "d,1,2") - _MC88110 (0x88006440, "ppack.32.h", "d,1,2") - _MC88110 (0x88006160, "ppack.8", "d,1,2") - _MC88110 (0x88006260, "ppack.16", "d,1,2") - _MC88110 (0x88006460, "ppack.32", "d,1,2") - _MC88110 (0x88007800, "prot", "d,1,2") - _MC88110 (0x88007000, "prot", "d,1,o") - _MC88110 (0x88003020, "psub.b", "d,1,2") - _MC88110 (0x88003040, "psub.h", "d,1,2") - _MC88110 (0x88003060, "psub", "d,1,2") - _MC88110 (0x880030a0, "psubs.u.b", "d,1,2") - _MC88110 (0x880030c0, "psubs.u.h", "d,1,2") - _MC88110 (0x880030e0, "psubs.u", "d,1,2") - _MC88110 (0x88003120, "psubs.us.b", "d,1,2") - _MC88110 (0x88003140, "psubs.us.h", "d,1,2") - _MC88110 (0x88003160, "psubs.us", "d,1,2") - _MC88110 (0x880031a0, "psubs.s.b", "d,1,2") - _MC88110 (0x880031c0, "psubs.s.h", "d,1,2") - _MC88110 (0x880031e0, "psubs.s", "d,1,2") - _MC88110 (0x88006800, "punpk.n", "d,1") - _MC88110 (0x88006820, "punpk.b", "d,1") - _MC88110 (0x88006840, "punpk.h", "d,1") - _MC88xxx (0xf400a800, "rot", "d,1,2") - _MC88xxx (0xf000a800, "rot", "d,1,b") - _MC88xxx (0xf400fc00, "rte", "") - _MC88xxx (0xf4008800, "set", "d,1,2") - _MC88xxx (0xf0008800, "set", "d,1,b") - _MC88xxx (0xf4002600, "st", "d,1[2]") - _MC88xxx (0xf4002400, "st", "d,1,2") - _MC88xxx (0x24000000, "st", "d,1,I") - _MC88110 (0xf0002600, "st", "xd,1[2]") - _MC88110 (0xf0002400, "st", "xd,1,2") - _MC88110 (0x34000000, "st", "xd,1,I") - _MC88xxx (0xf4002e00, "st.b", "d,1[2]") - _MC88xxx (0xf4002c00, "st.b", "d,1,2") - _MC88xxx (0x2c000000, "st.b", "d,1,I") - _MC88xxx (0xf4002d00, "st.b.usr", "d,1,2") - _MC88xxx (0xf4002f00, "st.b.usr", "d,1[2]") - _MC88110 (0xf4002d80, "st.b.usr.wt", "d,1,2") - _MC88110 (0xf4002f80, "st.b.usr.wt", "d,1[2]") - _MC88110 (0xf4002c80, "st.b.wt", "d,1,2") - _MC88110 (0xf4002e80, "st.b.wt", "d,1[2]") - _MC88xxx (0xf4002200, "st.d", "d,1[2]") - _MC88xxx (0xf4002000, "st.d", "d,1,2") - _MC88xxx (0x20000000, "st.d", "d,1,I") - _MC88110 (0xf0002200, "st.d", "xd,1[2]") - _MC88110 (0xf0002000, "st.d", "xd,1,2") - _MC88110 (0x30000000, "st.d", "xd,1,I") - _MC88xxx (0xf4002100, "st.d.usr", "d,1,2") - _MC88xxx (0xf4002300, "st.d.usr", "d,1[2]") - _MC88110 (0xf0002100, "st.d.usr", "xd,1,2") - _MC88110 (0xf0002300, "st.d.usr", "xd,1[2]") - _MC88110 (0xf4002180, "st.d.usr.wt", "d,1,2") - _MC88110 (0xf4002380, "st.d.usr.wt", "d,1[2]") - _MC88110 (0xf0002180, "st.d.usr.wt", "xd,1,2") - _MC88110 (0xf0002380, "st.d.usr.wt", "xd,1[2]") - _MC88110 (0xf4002080, "st.d.wt", "d,1,2") - _MC88110 (0xf4002280, "st.d.wt", "d,1[2]") - _MC88110 (0xf0002080, "st.d.wt", "xd,1,2") - _MC88110 (0xf0002280, "st.d.wt", "xd,1[2]") - _MC88xxx (0xf4002a00, "st.h", "d,1[2]") - _MC88xxx (0xf4002800, "st.h", "d,1,2") - _MC88xxx (0x28000000, "st.h", "d,1,I") - _MC88xxx (0xf4002900, "st.h.usr", "d,1,2") - _MC88xxx (0xf4002b00, "st.h.usr", "d,1[2]") - _MC88110 (0xf4002980, "st.h.usr.wt", "d,1,2") - _MC88110 (0xf4002b80, "st.h.usr.wt", "d,1[2]") - _MC88110 (0xf4002880, "st.h.wt", "d,1,2") - _MC88110 (0xf4002a80, "st.h.wt", "d,1[2]") - _MC88xxx (0xf4002500, "st.usr", "d,1,2") - _MC88xxx (0xf4002700, "st.usr", "d,1[2]") - _MC88110 (0xf0002500, "st.usr", "xd,1,2") - _MC88110 (0xf0002700, "st.usr", "xd,1[2]") - _MC88110 (0xf4002580, "st.usr.wt", "d,1,2") - _MC88110 (0xf4002780, "st.usr.wt", "d,1[2]") - _MC88110 (0xf0002580, "st.usr.wt", "xd,1,2") - _MC88110 (0xf0002780, "st.usr.wt", "xd,1[2]") - _MC88110 (0xf4002480, "st.wt", "d,1,2") - _MC88110 (0xf4002680, "st.wt", "d,1[2]") - _MC88110 (0xf0002480, "st.wt", "xd,1,2") - _MC88110 (0xf0002680, "st.wt", "xd,1[2]") - _MC88110 (0xf0002a00, "st.x", "xd,1[2]") - _MC88110 (0xf0002800, "st.x", "xd,1,2") - _MC88110 (0x38000000, "st.x", "xd,1,I") - _MC88110 (0xf0002900, "st.x.usr", "xd,1,2") - _MC88110 (0xf0002b00, "st.x.usr", "xd,1[2]") - _MC88110 (0xf0002980, "st.x.usr.wt", "xd,1,2") - _MC88110 (0xf0002b80, "st.x.usr.wt", "xd,1[2]") - _MC88110 (0xf0002880, "st.x.wt", "xd,1,2") - _MC88110 (0xf0002a80, "st.x.wt", "xd,1[2]") - _MC88xxx (0x80008000, "stcr", "3,c") - _MC88xxx (0xf4007400, "sub", "d,1,2") - _MC88xxx (0x74000000, "sub", "d,1,I") - _MC88xxx (0xf4007600, "sub.ci", "d,1,2") - _MC88xxx (0xf4007700, "sub.cio", "d,1,2") - _MC88xxx (0xf4007500, "sub.co", "d,1,2") - _MC88xxx (0xf4006400, "subu", "d,1,2") - _MC88xxx (0x64000000, "subu", "d,1,I") - _MC88xxx (0xf4006600, "subu.ci", "d,1,2") - _MC88xxx (0xf4006700, "subu.cio", "d,1,2") - _MC88xxx (0xf4006500, "subu.co", "d,1,2") - _MC88xxx (0xf000d000, "tb0", "B,1,V") - _MC88xxx (0xf000d800, "tb1", "B,1,V") - _MC88xxx (0xf400f800, "tbnd", "1,2") - _MC88xxx (0xf8000000, "tbnd", "1,I") - _MC88xxx (0xf000e800, "tcnd", "M,1,V") - _MC88xxx (0x84005880, "trnc.sd", "d,2") - _MC88110 (0x8400d880, "trnc.sd", "d,x2") - _MC88xxx (0x84005800, "trnc.ss", "d,2") - _MC88110 (0x8400d800, "trnc.ss", "d,x2") - _MC88110 (0x8400d900, "trnc.sx", "d,x2") - _MC88xxx (0x8000c000, "xcr", "d,3,c") - _MC88xxx (0xf4000600, "xmem", "d,1[2]") - _MC88xxx (0xf4000400, "xmem", "d,1,2") - _MC88100 (0x04000000, "xmem", "?d,1,I") - _MC88xxx (0xf4000200, "xmem.bu", "d,1[2]") - _MC88xxx (0xf4000000, "xmem.bu", "d,1,2") - _MC88100 (0x00000000, "xmem.bu", "?d,1,I") - _MC88xxx (0xf4000300, "xmem.bu.usr", "d,1[2]") - _MC88xxx (0xf4000100, "xmem.bu.usr", "d,1,2") - _MC88100 (0x00000100, "xmem.bu.usr", "?d,1,I") - _MC88xxx (0xf4000700, "xmem.usr", "d,1[2]") - _MC88xxx (0xf4000500, "xmem.usr", "d,1,2") - _MC88100 (0x04000100, "xmem.usr", "?d,1,I") - _MC88xxx (0xf4005000, "xor", "d,1,2") - _MC88xxx (0x50000000, "xor", "d,1,I") - _MC88xxx (0xf4005400, "xor.c", "d,1,2") - _MC88xxx (0x54000000, "xor.u", "d,1,I") - _MC88xxx (0x00000000, "", 0) -}; - -#define NUMOPCODES ((sizeof m88k_opcodes)/(sizeof m88k_opcodes[0])) diff --git a/gas/config/obj-aout.c b/gas/config/obj-aout.c deleted file mode 100644 index eabbe924e6c..00000000000 --- a/gas/config/obj-aout.c +++ /dev/null @@ -1,692 +0,0 @@ -/* a.out object file format - Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as -published by the Free Software Foundation; either version 2, -or (at your option) any later version. - -GAS is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#define OBJ_HEADER "obj-aout.h" - -#include "as.h" -#ifdef BFD_ASSEMBLER -#undef NO_RELOC -#include "aout/aout64.h" -#endif -#include "obstack.h" - -#ifndef BFD_ASSEMBLER -/* in: segT out: N_TYPE bits */ -const short seg_N_TYPE[] = -{ - N_ABS, - N_TEXT, - N_DATA, - N_BSS, - N_UNDF, /* unknown */ - N_UNDF, /* error */ - N_UNDF, /* expression */ - N_UNDF, /* debug */ - N_UNDF, /* ntv */ - N_UNDF, /* ptv */ - N_REGISTER, /* register */ -}; - -const segT N_TYPE_seg[N_TYPE + 2] = -{ /* N_TYPE == 0x1E = 32-2 */ - SEG_UNKNOWN, /* N_UNDF == 0 */ - SEG_GOOF, - SEG_ABSOLUTE, /* N_ABS == 2 */ - SEG_GOOF, - SEG_TEXT, /* N_TEXT == 4 */ - SEG_GOOF, - SEG_DATA, /* N_DATA == 6 */ - SEG_GOOF, - SEG_BSS, /* N_BSS == 8 */ - SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_REGISTER, /* dummy N_REGISTER for regs = 30 */ - SEG_GOOF, -}; -#endif - -static void obj_aout_line PARAMS ((int)); -static void obj_aout_weak PARAMS ((int)); -static void obj_aout_type PARAMS ((int)); - -const pseudo_typeS aout_pseudo_table[] = -{ - {"line", obj_aout_line, 0}, /* source code line number */ - {"ln", obj_aout_line, 0}, /* coff line number that we use anyway */ - - {"weak", obj_aout_weak, 0}, /* mark symbol as weak. */ - - {"type", obj_aout_type, 0}, - - /* coff debug pseudos (ignored) */ - {"def", s_ignore, 0}, - {"dim", s_ignore, 0}, - {"endef", s_ignore, 0}, - {"ident", s_ignore, 0}, - {"line", s_ignore, 0}, - {"ln", s_ignore, 0}, - {"scl", s_ignore, 0}, - {"size", s_ignore, 0}, - {"tag", s_ignore, 0}, - {"val", s_ignore, 0}, - {"version", s_ignore, 0}, - - {"optim", s_ignore, 0}, /* For sun386i cc (?) */ - - /* other stuff */ - {"ABORT", s_abort, 0}, - - {NULL, NULL, 0} /* end sentinel */ -}; /* aout_pseudo_table */ - - -#ifdef BFD_ASSEMBLER - -void -obj_aout_frob_symbol (sym, punt) - symbolS *sym; - int *punt; -{ - flagword flags; - asection *sec; - int desc, type, other; - - flags = symbol_get_bfdsym (sym)->flags; - desc = aout_symbol (symbol_get_bfdsym (sym))->desc; - type = aout_symbol (symbol_get_bfdsym (sym))->type; - other = aout_symbol (symbol_get_bfdsym (sym))->other; - sec = S_GET_SEGMENT (sym); - - /* Only frob simple symbols this way right now. */ - if (! (type & ~ (N_TYPE | N_EXT))) - { - if (type == (N_UNDF | N_EXT) - && sec == &bfd_abs_section) - { - sec = bfd_und_section_ptr; - S_SET_SEGMENT (sym, sec); - } - - if ((type & N_TYPE) != N_INDR - && (type & N_TYPE) != N_SETA - && (type & N_TYPE) != N_SETT - && (type & N_TYPE) != N_SETD - && (type & N_TYPE) != N_SETB - && type != N_WARNING - && (sec == &bfd_abs_section - || sec == &bfd_und_section)) - return; - if (flags & BSF_EXPORT) - type |= N_EXT; - - switch (type & N_TYPE) - { - case N_SETA: - case N_SETT: - case N_SETD: - case N_SETB: - /* Set the debugging flag for constructor symbols so that - BFD leaves them alone. */ - symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING; - - /* You can't put a common symbol in a set. The way a set - element works is that the symbol has a definition and a - name, and the linker adds the definition to the set of - that name. That does not work for a common symbol, - because the linker can't tell which common symbol the - user means. FIXME: Using as_bad here may be - inappropriate, since the user may want to force a - particular type without regard to the semantics of sets; - on the other hand, we certainly don't want anybody to be - mislead into thinking that their code will work. */ - if (S_IS_COMMON (sym)) - as_bad (_("Attempt to put a common symbol into set %s"), - S_GET_NAME (sym)); - /* Similarly, you can't put an undefined symbol in a set. */ - else if (! S_IS_DEFINED (sym)) - as_bad (_("Attempt to put an undefined symbol into set %s"), - S_GET_NAME (sym)); - - break; - case N_INDR: - /* Put indirect symbols in the indirect section. */ - S_SET_SEGMENT (sym, bfd_ind_section_ptr); - symbol_get_bfdsym (sym)->flags |= BSF_INDIRECT; - if (type & N_EXT) - { - symbol_get_bfdsym (sym)->flags |= BSF_EXPORT; - symbol_get_bfdsym (sym)->flags &=~ BSF_LOCAL; - } - break; - case N_WARNING: - /* Mark warning symbols. */ - symbol_get_bfdsym (sym)->flags |= BSF_WARNING; - break; - } - } - else - { - symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING; - } - - aout_symbol (symbol_get_bfdsym (sym))->type = type; - - /* Double check weak symbols. */ - if (S_IS_WEAK (sym)) - { - if (S_IS_COMMON (sym)) - as_bad (_("Symbol `%s' can not be both weak and common"), - S_GET_NAME (sym)); - } -} - -void -obj_aout_frob_file () -{ - /* Relocation processing may require knowing the VMAs of the sections. - Since writing to a section will cause the BFD back end to compute the - VMAs, fake it out here.... */ - bfd_byte b = 0; - boolean x = true; - if (bfd_section_size (stdoutput, text_section) != 0) - { - x = bfd_set_section_contents (stdoutput, text_section, &b, (file_ptr) 0, - (bfd_size_type) 1); - } - else if (bfd_section_size (stdoutput, data_section) != 0) - { - x = bfd_set_section_contents (stdoutput, data_section, &b, (file_ptr) 0, - (bfd_size_type) 1); - } - assert (x == true); -} - -#else /* ! BFD_ASSEMBLER */ - -/* Relocation. */ - -/* - * emit_relocations() - * - * Crawl along a fixS chain. Emit the segment's relocations. - */ -void -obj_emit_relocations (where, fixP, segment_address_in_file) - char **where; - fixS *fixP; /* Fixup chain for this segment. */ - relax_addressT segment_address_in_file; -{ - for (; fixP; fixP = fixP->fx_next) - if (fixP->fx_done == 0) - { - symbolS *sym; - - sym = fixP->fx_addsy; - while (sym->sy_value.X_op == O_symbol - && (! S_IS_DEFINED (sym) || S_IS_COMMON (sym))) - sym = sym->sy_value.X_add_symbol; - fixP->fx_addsy = sym; - - if (! sym->sy_resolved && ! S_IS_DEFINED (sym)) - { - char *file; - unsigned int line; - - if (expr_symbol_where (sym, &file, &line)) - as_bad_where (file, line, _("unresolved relocation")); - else - as_bad (_("bad relocation: symbol `%s' not in symbol table"), - S_GET_NAME (sym)); - } - - tc_aout_fix_to_chars (*where, fixP, segment_address_in_file); - *where += md_reloc_size; - } -} - -#ifndef obj_header_append -/* Aout file generation & utilities */ -void -obj_header_append (where, headers) - char **where; - object_headers *headers; -{ - tc_headers_hook (headers); - -#ifdef CROSS_COMPILE - md_number_to_chars (*where, headers->header.a_info, sizeof (headers->header.a_info)); - *where += sizeof (headers->header.a_info); - md_number_to_chars (*where, headers->header.a_text, sizeof (headers->header.a_text)); - *where += sizeof (headers->header.a_text); - md_number_to_chars (*where, headers->header.a_data, sizeof (headers->header.a_data)); - *where += sizeof (headers->header.a_data); - md_number_to_chars (*where, headers->header.a_bss, sizeof (headers->header.a_bss)); - *where += sizeof (headers->header.a_bss); - md_number_to_chars (*where, headers->header.a_syms, sizeof (headers->header.a_syms)); - *where += sizeof (headers->header.a_syms); - md_number_to_chars (*where, headers->header.a_entry, sizeof (headers->header.a_entry)); - *where += sizeof (headers->header.a_entry); - md_number_to_chars (*where, headers->header.a_trsize, sizeof (headers->header.a_trsize)); - *where += sizeof (headers->header.a_trsize); - md_number_to_chars (*where, headers->header.a_drsize, sizeof (headers->header.a_drsize)); - *where += sizeof (headers->header.a_drsize); - -#else /* CROSS_COMPILE */ - - append (where, (char *) &headers->header, sizeof (headers->header)); -#endif /* CROSS_COMPILE */ - -} -#endif /* ! defined (obj_header_append) */ - -void -obj_symbol_to_chars (where, symbolP) - char **where; - symbolS *symbolP; -{ - md_number_to_chars ((char *) &(S_GET_OFFSET (symbolP)), S_GET_OFFSET (symbolP), sizeof (S_GET_OFFSET (symbolP))); - md_number_to_chars ((char *) &(S_GET_DESC (symbolP)), S_GET_DESC (symbolP), sizeof (S_GET_DESC (symbolP))); - md_number_to_chars ((char *) &(symbolP->sy_symbol.n_value), S_GET_VALUE (symbolP), sizeof (symbolP->sy_symbol.n_value)); - - append (where, (char *) &symbolP->sy_symbol, sizeof (obj_symbol_type)); -} - -void -obj_emit_symbols (where, symbol_rootP) - char **where; - symbolS *symbol_rootP; -{ - symbolS *symbolP; - - /* Emit all symbols left in the symbol chain. */ - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - /* Used to save the offset of the name. It is used to point - to the string in memory but must be a file offset. */ - register char *temp; - - temp = S_GET_NAME (symbolP); - S_SET_OFFSET (symbolP, symbolP->sy_name_offset); - - /* Any symbol still undefined and is not a dbg symbol is made N_EXT. */ - if (!S_IS_DEBUG (symbolP) && !S_IS_DEFINED (symbolP)) - S_SET_EXTERNAL (symbolP); - - /* Adjust the type of a weak symbol. */ - if (S_GET_WEAK (symbolP)) - { - switch (S_GET_TYPE (symbolP)) - { - case N_UNDF: S_SET_TYPE (symbolP, N_WEAKU); break; - case N_ABS: S_SET_TYPE (symbolP, N_WEAKA); break; - case N_TEXT: S_SET_TYPE (symbolP, N_WEAKT); break; - case N_DATA: S_SET_TYPE (symbolP, N_WEAKD); break; - case N_BSS: S_SET_TYPE (symbolP, N_WEAKB); break; - default: as_bad (_("%s: bad type for weak symbol"), temp); break; - } - } - - obj_symbol_to_chars (where, symbolP); - S_SET_NAME (symbolP, temp); - } -} - -#endif /* ! BFD_ASSEMBLER */ - -static void -obj_aout_line (ignore) - int ignore; -{ - /* Assume delimiter is part of expression. - BSD4.2 as fails with delightful bug, so we - are not being incompatible here. */ - new_logical_line ((char *) NULL, (int) (get_absolute_expression ())); - demand_empty_rest_of_line (); -} /* obj_aout_line() */ - -/* Handle .weak. This is a GNU extension. */ - -static void -obj_aout_weak (ignore) - int ignore; -{ - char *name; - int c; - symbolS *symbolP; - - do - { - name = input_line_pointer; - c = get_symbol_end (); - symbolP = symbol_find_or_make (name); - *input_line_pointer = c; - SKIP_WHITESPACE (); - S_SET_WEAK (symbolP); - if (c == ',') - { - input_line_pointer++; - SKIP_WHITESPACE (); - if (*input_line_pointer == '\n') - c = '\n'; - } - } - while (c == ','); - demand_empty_rest_of_line (); -} - -/* Handle .type. On {Net,Open}BSD, this is used to set the n_other field, - which is then apparently used when doing dynamic linking. Older - versions ogas ignored the .type pseudo-op, so we also ignore it if - we can't parse it. */ - -static void -obj_aout_type (ignore) - int ignore; -{ - char *name; - int c; - symbolS *sym; - - name = input_line_pointer; - c = get_symbol_end (); - sym = symbol_find (name); - *input_line_pointer = c; - if (sym != NULL) - { - SKIP_WHITESPACE (); - if (*input_line_pointer == ',') - { - ++input_line_pointer; - SKIP_WHITESPACE (); - if (*input_line_pointer == '@') - { - ++input_line_pointer; - if (strncmp (input_line_pointer, "object", 6) == 0) -#ifdef BFD_ASSEMBLER - aout_symbol (symbol_get_bfdsym (sym))->other = 1; -#else - S_SET_OTHER (sym, 1); -#endif - else if (strncmp (input_line_pointer, "function", 8) == 0) -#ifdef BFD_ASSEMBLER - aout_symbol (symbol_get_bfdsym (sym))->other = 2; -#else - S_SET_OTHER (sym, 2); -#endif - } - } - } - - /* Ignore everything else on the line. */ - s_ignore (0); -} - -#ifndef BFD_ASSEMBLER - -void -obj_crawl_symbol_chain (headers) - object_headers *headers; -{ - symbolS *symbolP; - symbolS **symbolPP; - int symbol_number = 0; - - tc_crawl_symbol_chain (headers); - - symbolPP = &symbol_rootP; /*->last symbol chain link. */ - while ((symbolP = *symbolPP) != NULL) - { - if (symbolP->sy_mri_common) - { - if (S_IS_EXTERNAL (symbolP)) - as_bad (_("%s: global symbols not supported in common sections"), - S_GET_NAME (symbolP)); - *symbolPP = symbol_next (symbolP); - continue; - } - - if (flag_readonly_data_in_text && (S_GET_SEGMENT (symbolP) == SEG_DATA)) - { - S_SET_SEGMENT (symbolP, SEG_TEXT); - } /* if pusing data into text */ - - resolve_symbol_value (symbolP, 1); - - /* Skip symbols which were equated to undefined or common - symbols. */ - if (symbolP->sy_value.X_op == O_symbol - && (! S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))) - { - *symbolPP = symbol_next (symbolP); - continue; - } - - /* OK, here is how we decide which symbols go out into the brave - new symtab. Symbols that do are: - - * symbols with no name (stabd's?) - * symbols with debug info in their N_TYPE - - Symbols that don't are: - * symbols that are registers - * symbols with \1 as their 3rd character (numeric labels) - * "local labels" as defined by S_LOCAL_NAME(name) if the -L - switch was passed to gas. - - All other symbols are output. We complain if a deleted - symbol was marked external. */ - - - if (!S_IS_REGISTER (symbolP) - && (!S_GET_NAME (symbolP) - || S_IS_DEBUG (symbolP) - || !S_IS_DEFINED (symbolP) - || S_IS_EXTERNAL (symbolP) - || (S_GET_NAME (symbolP)[0] != '\001' - && (flag_keep_locals || !S_LOCAL_NAME (symbolP))))) - { - symbolP->sy_number = symbol_number++; - - /* The + 1 after strlen account for the \0 at the - end of each string */ - if (!S_IS_STABD (symbolP)) - { - /* Ordinary case. */ - symbolP->sy_name_offset = string_byte_count; - string_byte_count += strlen (S_GET_NAME (symbolP)) + 1; - } - else /* .Stabd case. */ - symbolP->sy_name_offset = 0; - symbolPP = &symbolP->sy_next; - } - else - { - if (S_IS_EXTERNAL (symbolP) || !S_IS_DEFINED (symbolP)) - /* This warning should never get triggered any more. - Well, maybe if you're doing twisted things with - register names... */ - { - as_bad (_("Local symbol %s never defined."), decode_local_label_name (S_GET_NAME (symbolP))); - } /* oops. */ - - /* Unhook it from the chain */ - *symbolPP = symbol_next (symbolP); - } /* if this symbol should be in the output */ - } /* for each symbol */ - - H_SET_SYMBOL_TABLE_SIZE (headers, symbol_number); -} - -/* - * Find strings by crawling along symbol table chain. - */ - -void -obj_emit_strings (where) - char **where; -{ - symbolS *symbolP; - -#ifdef CROSS_COMPILE - /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */ - md_number_to_chars (*where, string_byte_count, sizeof (string_byte_count)); - *where += sizeof (string_byte_count); -#else /* CROSS_COMPILE */ - append (where, (char *) &string_byte_count, (unsigned long) sizeof (string_byte_count)); -#endif /* CROSS_COMPILE */ - - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - if (S_GET_NAME (symbolP)) - append (&next_object_file_charP, S_GET_NAME (symbolP), - (unsigned long) (strlen (S_GET_NAME (symbolP)) + 1)); - } /* walk symbol chain */ -} - -#ifndef AOUT_VERSION -#define AOUT_VERSION 0 -#endif - -void -obj_pre_write_hook (headers) - object_headers *headers; -{ - H_SET_DYNAMIC (headers, 0); - H_SET_VERSION (headers, AOUT_VERSION); - H_SET_MACHTYPE (headers, AOUT_MACHTYPE); - tc_aout_pre_write_hook (headers); -} - -void -DEFUN_VOID (s_sect) -{ - /* Strip out the section name */ - char *section_name; - char *section_name_end; - char c; - - unsigned int len; - unsigned int exp; - char *save; - - section_name = input_line_pointer; - c = get_symbol_end (); - section_name_end = input_line_pointer; - - len = section_name_end - section_name; - input_line_pointer++; - save = input_line_pointer; - - SKIP_WHITESPACE (); - if (c == ',') - { - exp = get_absolute_expression (); - } - else if (*input_line_pointer == ',') - { - input_line_pointer++; - exp = get_absolute_expression (); - } - else - { - input_line_pointer = save; - exp = 0; - } - if (exp >= 1000) - { - as_bad (_("subsegment index too high")); - } - - if (strcmp (section_name, ".text") == 0) - { - subseg_set (SEG_TEXT, (subsegT) exp); - } - - if (strcmp (section_name, ".data") == 0) - { - if (flag_readonly_data_in_text) - subseg_set (SEG_TEXT, (subsegT) exp + 1000); - else - subseg_set (SEG_DATA, (subsegT) exp); - } - - *section_name_end = c; -} - -#endif /* ! BFD_ASSEMBLER */ - -#ifdef BFD_ASSEMBLER - -/* Support for an AOUT emulation. */ - -static void aout_pop_insert PARAMS ((void)); -static int obj_aout_s_get_other PARAMS ((symbolS *)); -static int obj_aout_s_get_desc PARAMS ((symbolS *)); - -static void -aout_pop_insert () -{ - pop_insert (aout_pseudo_table); -} - -static int -obj_aout_s_get_other (sym) - symbolS *sym; -{ - return aout_symbol (symbol_get_bfdsym (sym))->other; -} - -static int -obj_aout_s_get_desc (sym) - symbolS *sym; -{ - return aout_symbol (symbol_get_bfdsym (sym))->desc; -} - - -const struct format_ops aout_format_ops = -{ - bfd_target_aout_flavour, - 1, /* dfl_leading_underscore */ - 0, /* emit_section_symbols */ - obj_aout_frob_symbol, - obj_aout_frob_file, - 0, /* frob_file_after_relocs */ - 0, /* s_get_size */ - 0, /* s_set_size */ - 0, /* s_get_align */ - 0, /* s_set_align */ - obj_aout_s_get_other, - obj_aout_s_get_desc, - 0, /* copy_symbol_attributes */ - 0, /* generate_asm_lineno */ - 0, /* process_stab */ - 0, /* sec_sym_ok_for_reloc */ - aout_pop_insert, - 0, /* ecoff_set_ext */ - 0, /* read_begin_hook */ - 0 /* symbol_new_hook */ -}; -#endif BFD_ASSEMBLER - -/* end of obj-aout.c */ diff --git a/gas/config/obj-aout.h b/gas/config/obj-aout.h deleted file mode 100644 index d08302a49bf..00000000000 --- a/gas/config/obj-aout.h +++ /dev/null @@ -1,252 +0,0 @@ -/* obj-aout.h, a.out object file format for gas, the assembler. - Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 98, 99, 2000 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2, - or (at your option) any later version. - - GAS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* Tag to validate a.out object file format processing */ -#define OBJ_AOUT 1 - -#include "targ-cpu.h" - -#ifdef BFD_ASSEMBLER - -#include "bfd/libaout.h" - -#define OUTPUT_FLAVOR bfd_target_aout_flavour - -#else /* ! BFD_ASSEMBLER */ - -#ifndef VMS -#include "aout_gnu.h" /* Needed to define struct nlist. Sigh. */ -#else -#include "a_out.h" -#endif - -#ifndef AOUT_MACHTYPE -#define AOUT_MACHTYPE 0 -#endif /* AOUT_MACHTYPE */ - -extern const short seg_N_TYPE[]; -extern const segT N_TYPE_seg[]; - -#ifndef DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE -#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE (OMAGIC) -#endif /* DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE */ - -#endif /* ! BFD_ASSEMBLER */ - -extern const pseudo_typeS aout_pseudo_table[]; - -#ifndef obj_pop_insert -#define obj_pop_insert() pop_insert (aout_pseudo_table) -#endif - -/* SYMBOL TABLE */ -/* Symbol table entry data type */ - -typedef struct nlist obj_symbol_type; /* Symbol table entry */ - -/* Symbol table macros and constants */ - -#ifdef BFD_ASSEMBLER - -#define S_SET_OTHER(S,V) \ - (aout_symbol (symbol_get_bfdsym (S))->other = (V)) -#define S_SET_TYPE(S,T) \ - (aout_symbol (symbol_get_bfdsym (S))->type = (T)) -#define S_SET_DESC(S,D) \ - (aout_symbol (symbol_get_bfdsym (S))->desc = (D)) -#define S_GET_OTHER(S) \ - (aout_symbol (symbol_get_bfdsym (S))->other) -#define S_GET_TYPE(S) \ - (aout_symbol (symbol_get_bfdsym (S))->type) -#define S_GET_DESC(S) \ - (aout_symbol (symbol_get_bfdsym (S))->desc) - -asection *text_section, *data_section, *bss_section; - -#define obj_frob_symbol(S,PUNT) obj_aout_frob_symbol (S, &PUNT) -#define obj_frob_file() obj_aout_frob_file () -extern void obj_aout_frob_symbol PARAMS ((symbolS *, int *)); -extern void obj_aout_frob_file PARAMS ((void)); - -#define obj_sec_sym_ok_for_reloc(SEC) (1) - -#else - -/* We use the sy_obj field to record whether a symbol is weak. */ -#define OBJ_SYMFIELD_TYPE char - -/* - * Macros to extract information from a symbol table entry. - * This syntaxic indirection allows independence regarding a.out or coff. - * The argument (s) of all these macros is a pointer to a symbol table entry. - */ - -/* True if the symbol is external */ -#define S_IS_EXTERNAL(s) ((s)->sy_symbol.n_type & N_EXT) - -/* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */ -#define S_IS_DEFINED(s) \ - (S_GET_TYPE (s) != N_UNDF || S_GET_DESC (s) != 0) - -#define S_IS_COMMON(s) \ - (S_GET_TYPE (s) == N_UNDF && S_GET_VALUE (s) != 0) - -#define S_IS_REGISTER(s) ((s)->sy_symbol.n_type == N_REGISTER) - -/* True if a debug special symbol entry */ -#define S_IS_DEBUG(s) ((s)->sy_symbol.n_type & N_STAB) -/* True if a symbol is local symbol name */ -#define S_IS_LOCAL(s) \ - ((S_GET_NAME (s) \ - && !S_IS_DEBUG (s) \ - && (strchr (S_GET_NAME (s), '\001') != NULL \ - || strchr (S_GET_NAME (s), '\002') != NULL \ - || (S_LOCAL_NAME(s) && !flag_keep_locals))) \ - || (flag_strip_local_absolute \ - && ! S_IS_EXTERNAL(s) \ - && S_GET_SEGMENT (s) == absolute_section)) -/* True if a symbol is not defined in this file */ -#define S_IS_EXTERN(s) ((s)->sy_symbol.n_type & N_EXT) -/* True if the symbol has been generated because of a .stabd directive */ -#define S_IS_STABD(s) (S_GET_NAME(s) == (char *)0) - -/* Accessors */ -/* The name of the symbol */ -#define S_GET_NAME(s) ((s)->sy_symbol.n_un.n_name) -/* The pointer to the string table */ -#define S_GET_OFFSET(s) ((s)->sy_symbol.n_un.n_strx) -/* The type of the symbol */ -#define S_GET_TYPE(s) ((s)->sy_symbol.n_type & N_TYPE) -/* The numeric value of the segment */ -#define S_GET_SEGMENT(s) (N_TYPE_seg[S_GET_TYPE(s)]) -/* The n_other expression value */ -#define S_GET_OTHER(s) ((s)->sy_symbol.n_other) -/* The n_desc expression value */ -#define S_GET_DESC(s) ((s)->sy_symbol.n_desc) -/* Whether the symbol is weak. */ -#define S_GET_WEAK(s) ((s)->sy_obj) - -/* Modifiers */ -/* Assume that a symbol cannot be simultaneously in more than on segment */ -/* set segment */ -#define S_SET_SEGMENT(s,seg) ((s)->sy_symbol.n_type &= ~N_TYPE,(s)->sy_symbol.n_type|=SEGMENT_TO_SYMBOL_TYPE(seg)) -/* The symbol is external */ -#define S_SET_EXTERNAL(s) ((s)->sy_symbol.n_type |= N_EXT) -/* The symbol is not external */ -#define S_CLEAR_EXTERNAL(s) ((s)->sy_symbol.n_type &= ~N_EXT) -/* Set the name of the symbol */ -#define S_SET_NAME(s,v) ((s)->sy_symbol.n_un.n_name = (v)) -/* Set the offset in the string table */ -#define S_SET_OFFSET(s,v) ((s)->sy_symbol.n_un.n_strx = (v)) -/* Set the n_type field */ -#define S_SET_TYPE(s,t) ((s)->sy_symbol.n_type = (t)) -/* Set the n_other expression value */ -#define S_SET_OTHER(s,v) ((s)->sy_symbol.n_other = (v)) -/* Set the n_desc expression value */ -#define S_SET_DESC(s,v) ((s)->sy_symbol.n_desc = (v)) -/* Mark the symbol as weak. This causes n_type to be adjusted when - the symbol is written out. */ -#define S_SET_WEAK(s) ((s)->sy_obj = 1) - -/* File header macro and type definition */ - -#define H_GET_FILE_SIZE(h) (H_GET_HEADER_SIZE(h) \ - + H_GET_TEXT_SIZE(h) \ - + H_GET_DATA_SIZE(h) \ - + H_GET_SYMBOL_TABLE_SIZE(h) \ - + H_GET_TEXT_RELOCATION_SIZE(h) \ - + H_GET_DATA_RELOCATION_SIZE(h) \ - + H_GET_STRING_SIZE(h)) - -#define H_GET_HEADER_SIZE(h) (EXEC_BYTES_SIZE) -#define H_GET_TEXT_SIZE(h) ((h)->header.a_text) -#define H_GET_DATA_SIZE(h) ((h)->header.a_data) -#define H_GET_BSS_SIZE(h) ((h)->header.a_bss) -#define H_GET_TEXT_RELOCATION_SIZE(h) ((h)->header.a_trsize) -#define H_GET_DATA_RELOCATION_SIZE(h) ((h)->header.a_drsize) -#define H_GET_SYMBOL_TABLE_SIZE(h) ((h)->header.a_syms) -#define H_GET_ENTRY_POINT(h) ((h)->header.a_entry) -#define H_GET_STRING_SIZE(h) ((h)->string_table_size) -#define H_GET_LINENO_SIZE(h) (0) - -#define H_GET_DYNAMIC(h) ((h)->header.a_info >> 31) -#define H_GET_VERSION(h) (((h)->header.a_info >> 24) & 0x7f) -#define H_GET_MACHTYPE(h) (((h)->header.a_info >> 16) & 0xff) -#define H_GET_MAGIC_NUMBER(h) ((h)->header.a_info & 0xffff) - -#define H_SET_DYNAMIC(h,v) ((h)->header.a_info = (((v) << 31) \ - | (H_GET_VERSION(h) << 24) \ - | (H_GET_MACHTYPE(h) << 16) \ - | (H_GET_MAGIC_NUMBER(h)))) - -#define H_SET_VERSION(h,v) ((h)->header.a_info = ((H_GET_DYNAMIC(h) << 31) \ - | ((v) << 24) \ - | (H_GET_MACHTYPE(h) << 16) \ - | (H_GET_MAGIC_NUMBER(h)))) - -#define H_SET_MACHTYPE(h,v) ((h)->header.a_info = ((H_GET_DYNAMIC(h) << 31) \ - | (H_GET_VERSION(h) << 24) \ - | ((v) << 16) \ - | (H_GET_MAGIC_NUMBER(h)))) - -#define H_SET_MAGIC_NUMBER(h,v) ((h)->header.a_info = ((H_GET_DYNAMIC(h) << 31) \ - | (H_GET_VERSION(h) << 24) \ - | (H_GET_MACHTYPE(h) << 16) \ - | ((v)))) - -#define H_SET_TEXT_SIZE(h,v) ((h)->header.a_text = md_section_align(SEG_TEXT, (v))) -#define H_SET_DATA_SIZE(h,v) ((h)->header.a_data = md_section_align(SEG_DATA, (v))) -#define H_SET_BSS_SIZE(h,v) ((h)->header.a_bss = md_section_align(SEG_BSS, (v))) - -#define H_SET_RELOCATION_SIZE(h,t,d) (H_SET_TEXT_RELOCATION_SIZE((h),(t)),\ - H_SET_DATA_RELOCATION_SIZE((h),(d))) - -#define H_SET_TEXT_RELOCATION_SIZE(h,v) ((h)->header.a_trsize = (v)) -#define H_SET_DATA_RELOCATION_SIZE(h,v) ((h)->header.a_drsize = (v)) -#define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->header.a_syms = (v) * 12) - -#define H_SET_ENTRY_POINT(h,v) ((h)->header.a_entry = (v)) -#define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v)) - -typedef struct - { - struct exec header; /* a.out header */ - long string_table_size; /* names + '\0' + sizeof(int) */ - } - -object_headers; - -/* line numbering stuff. */ -#define OBJ_EMIT_LINENO(a, b, c) {;} - -struct fix; -void tc_aout_fix_to_chars PARAMS ((char *where, struct fix *fixP, relax_addressT segment_address)); - -#endif - -#define obj_read_begin_hook() {;} -#define obj_symbol_new_hook(s) {;} - -#define EMIT_SECTION_SYMBOLS 0 - -#define AOUT_STABS - -/* end of obj-aout.h */ diff --git a/gas/config/obj-bout.c b/gas/config/obj-bout.c deleted file mode 100644 index dc79718620a..00000000000 --- a/gas/config/obj-bout.c +++ /dev/null @@ -1,349 +0,0 @@ -/* b.out object file format - Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 1996 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2, - or (at your option) any later version. - - GAS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include "as.h" -#include "obstack.h" -const short /* in: segT out: N_TYPE bits */ - seg_N_TYPE[] = -{ - N_ABS, - N_TEXT, - N_DATA, - N_BSS, - N_UNDF, /* unknown */ - N_UNDF, /* error */ - N_UNDF, /* expression */ - N_UNDF, /* debug */ - N_UNDF, /* ntv */ - N_UNDF, /* ptv */ - N_REGISTER, /* register */ -}; - -const segT N_TYPE_seg[N_TYPE + 2] = -{ /* N_TYPE == 0x1E = 32-2 */ - SEG_UNKNOWN, /* N_UNDF == 0 */ - SEG_GOOF, - SEG_ABSOLUTE, /* N_ABS == 2 */ - SEG_GOOF, - SEG_TEXT, /* N_TEXT == 4 */ - SEG_GOOF, - SEG_DATA, /* N_DATA == 6 */ - SEG_GOOF, - SEG_BSS, /* N_BSS == 8 */ - SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_REGISTER, /* dummy N_REGISTER for regs = 30 */ - SEG_GOOF, -}; - -static void obj_bout_line PARAMS ((int)); - -const pseudo_typeS obj_pseudo_table[] = -{ - {"line", obj_bout_line, 0}, /* source code line number */ - -/* coff debugging directives. Currently ignored silently */ - {"def", s_ignore, 0}, - {"dim", s_ignore, 0}, - {"endef", s_ignore, 0}, - {"ln", s_ignore, 0}, - {"scl", s_ignore, 0}, - {"size", s_ignore, 0}, - {"tag", s_ignore, 0}, - {"type", s_ignore, 0}, - {"val", s_ignore, 0}, - -/* other stuff we don't handle */ - {"ABORT", s_ignore, 0}, - {"ident", s_ignore, 0}, - - {NULL} /* end sentinel */ -}; /* obj_pseudo_table */ - -/* Relocation. */ - -/* - * emit_relocations() - * - * Crawl along a fixS chain. Emit the segment's relocations. - */ -void -obj_emit_relocations (where, fixP, segment_address_in_file) - char **where; - fixS *fixP; /* Fixup chain for this segment. */ - relax_addressT segment_address_in_file; -{ - for (; fixP; fixP = fixP->fx_next) - { - if (fixP->fx_done == 0 - || fixP->fx_r_type != NO_RELOC) - { - symbolS *sym; - - sym = fixP->fx_addsy; - while (sym->sy_value.X_op == O_symbol - && (! S_IS_DEFINED (sym) || S_IS_COMMON (sym))) - sym = sym->sy_value.X_add_symbol; - fixP->fx_addsy = sym; - - tc_bout_fix_to_chars (*where, fixP, segment_address_in_file); - *where += sizeof (struct relocation_info); - } /* if there's a symbol */ - } /* for each fixup */ - -} /* emit_relocations() */ - -/* Aout file generation & utilities */ - -/* Convert a lvalue to machine dependent data */ -void -obj_header_append (where, headers) - char **where; - object_headers *headers; -{ - /* Always leave in host byte order */ - - headers->header.a_talign = section_alignment[SEG_TEXT]; - - if (headers->header.a_talign < 2) - { - headers->header.a_talign = 2; - } /* force to at least 2 */ - - headers->header.a_dalign = section_alignment[SEG_DATA]; - headers->header.a_balign = section_alignment[SEG_BSS]; - - headers->header.a_tload = 0; - headers->header.a_dload = md_section_align (SEG_DATA, H_GET_TEXT_SIZE (headers)); - - headers->header.a_relaxable = linkrelax; - -#ifdef CROSS_COMPILE - md_number_to_chars (*where, headers->header.a_magic, sizeof (headers->header.a_magic)); - *where += sizeof (headers->header.a_magic); - md_number_to_chars (*where, headers->header.a_text, sizeof (headers->header.a_text)); - *where += sizeof (headers->header.a_text); - md_number_to_chars (*where, headers->header.a_data, sizeof (headers->header.a_data)); - *where += sizeof (headers->header.a_data); - md_number_to_chars (*where, headers->header.a_bss, sizeof (headers->header.a_bss)); - *where += sizeof (headers->header.a_bss); - md_number_to_chars (*where, headers->header.a_syms, sizeof (headers->header.a_syms)); - *where += sizeof (headers->header.a_syms); - md_number_to_chars (*where, headers->header.a_entry, sizeof (headers->header.a_entry)); - *where += sizeof (headers->header.a_entry); - md_number_to_chars (*where, headers->header.a_trsize, sizeof (headers->header.a_trsize)); - *where += sizeof (headers->header.a_trsize); - md_number_to_chars (*where, headers->header.a_drsize, sizeof (headers->header.a_drsize)); - *where += sizeof (headers->header.a_drsize); - md_number_to_chars (*where, headers->header.a_tload, sizeof (headers->header.a_tload)); - *where += sizeof (headers->header.a_tload); - md_number_to_chars (*where, headers->header.a_dload, sizeof (headers->header.a_dload)); - *where += sizeof (headers->header.a_dload); - md_number_to_chars (*where, headers->header.a_talign, sizeof (headers->header.a_talign)); - *where += sizeof (headers->header.a_talign); - md_number_to_chars (*where, headers->header.a_dalign, sizeof (headers->header.a_dalign)); - *where += sizeof (headers->header.a_dalign); - md_number_to_chars (*where, headers->header.a_balign, sizeof (headers->header.a_balign)); - *where += sizeof (headers->header.a_balign); - md_number_to_chars (*where, headers->header.a_relaxable, sizeof (headers->header.a_relaxable)); - *where += sizeof (headers->header.a_relaxable); -#else /* ! CROSS_COMPILE */ - append (where, (char *) &headers->header, sizeof (headers->header)); -#endif /* ! CROSS_COMPILE */ -} /* a_header_append() */ - -void -obj_symbol_to_chars (where, symbolP) - char **where; - symbolS *symbolP; -{ - md_number_to_chars ((char *) &(S_GET_OFFSET (symbolP)), S_GET_OFFSET (symbolP), sizeof (S_GET_OFFSET (symbolP))); - md_number_to_chars ((char *) &(S_GET_DESC (symbolP)), S_GET_DESC (symbolP), sizeof (S_GET_DESC (symbolP))); - md_number_to_chars ((char *) &symbolP->sy_symbol.n_value, S_GET_VALUE (symbolP), sizeof (symbolP->sy_symbol.n_value)); - - append (where, (char *) &symbolP->sy_symbol, sizeof (obj_symbol_type)); -} /* obj_symbol_to_chars() */ - -void -obj_emit_symbols (where, symbol_rootP) - char **where; - symbolS *symbol_rootP; -{ - symbolS *symbolP; - - /* - * Emit all symbols left in the symbol chain. - */ - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - /* Used to save the offset of the name. It is used to point - to the string in memory but must be a file offset. */ - char *temp; - - temp = S_GET_NAME (symbolP); - S_SET_OFFSET (symbolP, symbolP->sy_name_offset); - - /* Any symbol still undefined and is not a dbg symbol is made N_EXT. */ - if (!S_IS_DEBUG (symbolP) && !S_IS_DEFINED (symbolP)) - S_SET_EXTERNAL (symbolP); - - obj_symbol_to_chars (where, symbolP); - S_SET_NAME (symbolP, temp); - } -} /* emit_symbols() */ - -void -obj_symbol_new_hook (symbolP) - symbolS *symbolP; -{ - S_SET_OTHER (symbolP, 0); - S_SET_DESC (symbolP, 0); -} - -static void -obj_bout_line (ignore) - int ignore; -{ - /* Assume delimiter is part of expression. */ - /* BSD4.2 as fails with delightful bug, so we */ - /* are not being incompatible here. */ - new_logical_line ((char *) NULL, (int) (get_absolute_expression ())); - demand_empty_rest_of_line (); -} /* obj_bout_line() */ - -void -obj_read_begin_hook () -{ -} - -void -obj_crawl_symbol_chain (headers) - object_headers *headers; -{ - symbolS **symbolPP; - symbolS *symbolP; - int symbol_number = 0; - - tc_crawl_symbol_chain (headers); - - symbolPP = &symbol_rootP; /*->last symbol chain link. */ - while ((symbolP = *symbolPP) != NULL) - { - if (flag_readonly_data_in_text && (S_GET_SEGMENT (symbolP) == SEG_DATA)) - { - S_SET_SEGMENT (symbolP, SEG_TEXT); - } /* if pusing data into text */ - - resolve_symbol_value (symbolP, 1); - - /* Skip symbols which were equated to undefined or common - symbols. */ - if (symbolP->sy_value.X_op == O_symbol - && (! S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))) - { - *symbolPP = symbol_next (symbolP); - continue; - } - - /* OK, here is how we decide which symbols go out into the - brave new symtab. Symbols that do are: - - * symbols with no name (stabd's?) - * symbols with debug info in their N_TYPE - - Symbols that don't are: - * symbols that are registers - * symbols with \1 as their 3rd character (numeric labels) - * "local labels" as defined by S_LOCAL_NAME(name) - if the -L switch was passed to gas. - - All other symbols are output. We complain if a deleted - symbol was marked external. */ - - - if (1 - && !S_IS_REGISTER (symbolP) - && (!S_GET_NAME (symbolP) - || S_IS_DEBUG (symbolP) -#ifdef TC_I960 - /* FIXME-SOON this ifdef seems highly dubious to me. xoxorich. */ - || !S_IS_DEFINED (symbolP) - || S_IS_EXTERNAL (symbolP) -#endif /* TC_I960 */ - || (S_GET_NAME (symbolP)[0] != '\001' && (flag_keep_locals || !S_LOCAL_NAME (symbolP))))) - { - symbolP->sy_number = symbol_number++; - - /* The + 1 after strlen account for the \0 at the - end of each string */ - if (!S_IS_STABD (symbolP)) - { - /* Ordinary case. */ - symbolP->sy_name_offset = string_byte_count; - string_byte_count += strlen (S_GET_NAME (symbolP)) + 1; - } - else /* .Stabd case. */ - symbolP->sy_name_offset = 0; - symbolPP = &(symbol_next (symbolP)); - } - else - { - if (S_IS_EXTERNAL (symbolP) || !S_IS_DEFINED (symbolP)) - { - as_bad (_("Local symbol %s never defined"), S_GET_NAME (symbolP)); - } /* oops. */ - - /* Unhook it from the chain */ - *symbolPP = symbol_next (symbolP); - } /* if this symbol should be in the output */ - } /* for each symbol */ - - H_SET_SYMBOL_TABLE_SIZE (headers, symbol_number); -} - -/* - * Find strings by crawling along symbol table chain. - */ - -void -obj_emit_strings (where) - char **where; -{ - symbolS *symbolP; - -#ifdef CROSS_COMPILE - /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */ - md_number_to_chars (*where, string_byte_count, sizeof (string_byte_count)); - *where += sizeof (string_byte_count); -#else /* CROSS_COMPILE */ - append (where, (char *) &string_byte_count, (unsigned long) sizeof (string_byte_count)); -#endif /* CROSS_COMPILE */ - - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - if (S_GET_NAME (symbolP)) - append (where, S_GET_NAME (symbolP), (unsigned long) (strlen (S_GET_NAME (symbolP)) + 1)); - } /* walk symbol chain */ -} - -/* end of obj-bout.c */ diff --git a/gas/config/obj-bout.h b/gas/config/obj-bout.h deleted file mode 100644 index ec539a0cf44..00000000000 --- a/gas/config/obj-bout.h +++ /dev/null @@ -1,316 +0,0 @@ -/* b.out object file format - Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 1996 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2, - or (at your option) any later version. - - GAS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - the GNU General Public License for more details. - - You should have received a copy of the GNU General Public - License along with GAS; see the file COPYING. If not, write - to the Free Software Foundation, 59 Temple Place - Suite 330, Cambridge, MA - 02139, USA. */ - -/* - * This file is a modified version of 'a.out.h'. It is to be used in all GNU - * tools modified to support the i80960 b.out format (or tools that operate on - * object files created by such tools). - * - * All i80960 development is done in a CROSS-DEVELOPMENT environment. I.e., - * object code is generated on, and executed under the direction of a symbolic - * debugger running on, a host system. We do not want to be subject to the - * vagaries of which host it is or whether it supports COFF or a.out format, or - * anything else. We DO want to: - * - * o always generate the same format object files, regardless of host. - * - * o have an 'a.out' header that we can modify for our own purposes - * (the 80960 is typically an embedded processor and may require - * enhanced linker support that the normal a.out.h header can't - * accommodate). - * - * As for byte-ordering, the following rules apply: - * - * o Text and data that is actually downloaded to the target is always - * in i80960 (little-endian) order. - * - * o All other numbers (in the header, symbols, relocation directives) - * are in host byte-order: object files CANNOT be lifted from a - * little-end host and used on a big-endian (or vice versa) without - * modification. - * ==> THIS IS NO LONGER TRUE USING BFD. WE CAN GENERATE ANY BYTE ORDER - * FOR THE HEADER, AND READ ANY BYTE ORDER. PREFERENCE WOULD BE TO - * USE LITTLE-ENDIAN BYTE ORDER THROUGHOUT, REGARDLESS OF HOST. <== - * - * o The downloader ('comm960') takes care to generate a pseudo-header - * with correct (i80960) byte-ordering before shipping text and data - * off to the NINDY monitor in the target systems. Symbols and - * relocation info are never sent to the target. - */ - - -#define OBJ_BOUT 1 - -#define OUTPUT_FLAVOR bfd_target_aout_flavour - -#include "targ-cpu.h" - -#define OBJ_DEFAULT_OUTPUT_FILE_NAME "b.out" - -extern const short seg_N_TYPE[]; -extern const segT N_TYPE_seg[]; - -#define BMAGIC 0415 -/* We don't accept the following (see N_BADMAG macro). - * They're just here so GNU code will compile. - */ -#define OMAGIC 0407 /* old impure format */ -#define NMAGIC 0410 /* read-only text */ -#define ZMAGIC 0413 /* demand load format */ - -#ifndef DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE -#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE (BMAGIC) -#endif /* DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE */ - -/* FILE HEADER - * All 'lengths' are given as a number of bytes. - * All 'alignments' are for relinkable files only; an alignment of - * 'n' indicates the corresponding segment must begin at an - * address that is a multiple of (2**n). - */ -struct exec - { - /* Standard stuff */ - unsigned long a_magic; /* Identifies this as a b.out file */ - unsigned long a_text; /* Length of text */ - unsigned long a_data; /* Length of data */ - unsigned long a_bss; /* Length of runtime uninitialized data area */ - unsigned long a_syms; /* Length of symbol table */ - unsigned long a_entry; /* Runtime start address */ - unsigned long a_trsize; /* Length of text relocation info */ - unsigned long a_drsize; /* Length of data relocation info */ - - /* Added for i960 */ - unsigned long a_tload; /* Text runtime load address */ - unsigned long a_dload; /* Data runtime load address */ - unsigned char a_talign; /* Alignment of text segment */ - unsigned char a_dalign; /* Alignment of data segment */ - unsigned char a_balign; /* Alignment of bss segment */ - unsigned char a_relaxable; /* Contains enough info to relax */ - }; - -#define N_BADMAG(x) (((x).a_magic)!=BMAGIC) -#define N_TXTOFF(x) ( sizeof(struct exec) ) -#define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text ) -#define N_TROFF(x) ( N_DATOFF(x) + (x).a_data ) -#define N_DROFF(x) ( N_TROFF(x) + (x).a_trsize ) -#define N_SYMOFF(x) ( N_DROFF(x) + (x).a_drsize ) -#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms ) - -/* A single entry in the symbol table - */ -struct nlist - { - union - { - char *n_name; - struct nlist *n_next; - long n_strx; /* Index into string table */ - } - n_un; - unsigned char n_type; /* See below */ - char n_other; /* Used in i80960 support -- see below */ - short n_desc; - unsigned long n_value; - }; - -typedef struct nlist obj_symbol_type; - -/* Legal values of n_type - */ -#define N_UNDF 0 /* Undefined symbol */ -#define N_ABS 2 /* Absolute symbol */ -#define N_TEXT 4 /* Text symbol */ -#define N_DATA 6 /* Data symbol */ -#define N_BSS 8 /* BSS symbol */ -#define N_FN 31 /* Filename symbol */ - -#define N_EXT 1 /* External symbol (OR'd in with one of above) */ -#define N_TYPE 036 /* Mask for all the type bits */ -#define N_STAB 0340 /* Mask for all bits used for SDB entries */ - -#ifndef CUSTOM_RELOC_FORMAT -struct relocation_info - { - int r_address; /* File address of item to be relocated */ - unsigned - r_index:24, /* Index of symbol on which relocation is based*/ - r_pcrel:1, /* 1 => relocate PC-relative; else absolute - * On i960, pc-relative implies 24-bit - * address, absolute implies 32-bit. - */ - r_length:2, /* Number of bytes to relocate: - * 0 => 1 byte - * 1 => 2 bytes - * 2 => 4 bytes -- only value used for i960 - */ - r_extern:1, r_bsr:1, /* Something for the GNU NS32K assembler */ - r_disp:1, /* Something for the GNU NS32K assembler */ - r_callj:1, /* 1 if relocation target is an i960 'callj' */ - nuthin:1; /* Unused */ - }; - -#endif /* CUSTOM_RELOC_FORMAT */ - -/* - * Macros to extract information from a symbol table entry. - * This syntaxic indirection allows independence regarding a.out or coff. - * The argument (s) of all these macros is a pointer to a symbol table entry. - */ - -/* Predicates */ -/* True if the symbol is external */ -#define S_IS_EXTERNAL(s) ((s)->sy_symbol.n_type & N_EXT) - -/* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */ -#define S_IS_DEFINED(s) ((S_GET_TYPE(s) != N_UNDF) || (S_GET_DESC(s) != 0)) - -#define S_IS_COMMON(s) \ - (S_GET_TYPE (s) == N_UNDF && S_GET_VALUE (s) != 0) - -#define S_IS_REGISTER(s) ((s)->sy_symbol.n_type == N_REGISTER) - -/* True if a debug special symbol entry */ -#define S_IS_DEBUG(s) ((s)->sy_symbol.n_type & N_STAB) -/* True if a symbol is local symbol name */ -#define S_IS_LOCAL(s) \ - ((S_GET_NAME (s) \ - && !S_IS_DEBUG (s) \ - && (strchr (S_GET_NAME (s), '\001') != NULL \ - || strchr (S_GET_NAME (s), '\002') != NULL \ - || (S_LOCAL_NAME(s) && !flag_keep_locals))) \ - || (flag_strip_local_absolute \ - && !S_IS_EXTERNAL(s) \ - && S_GET_SEGMENT(s) == absolute_section)) -/* True if a symbol is not defined in this file */ -#define S_IS_EXTERN(s) ((s)->sy_symbol.n_type & N_EXT) -/* True if the symbol has been generated because of a .stabd directive */ -#define S_IS_STABD(s) (S_GET_NAME(s) == NULL) - -/* Accessors */ -/* The name of the symbol */ -#define S_GET_NAME(s) ((s)->sy_symbol.n_un.n_name) -/* The pointer to the string table */ -#define S_GET_OFFSET(s) ((s)->sy_symbol.n_un.n_strx) -/* The type of the symbol */ -#define S_GET_TYPE(s) ((s)->sy_symbol.n_type & N_TYPE) -/* The numeric value of the segment */ -#define S_GET_SEGMENT(s) (N_TYPE_seg[S_GET_TYPE(s)]) -/* The n_other expression value */ -#define S_GET_OTHER(s) ((s)->sy_symbol.n_other) -/* The n_desc expression value */ -#define S_GET_DESC(s) ((s)->sy_symbol.n_desc) - -/* Modifiers */ -/* Assume that a symbol cannot be simultaneously in more than on segment */ -/* set segment */ -#define S_SET_SEGMENT(s,seg) ((s)->sy_symbol.n_type &= ~N_TYPE,(s)->sy_symbol.n_type|=SEGMENT_TO_SYMBOL_TYPE(seg)) -/* The symbol is external */ -#define S_SET_EXTERNAL(s) ((s)->sy_symbol.n_type |= N_EXT) -/* The symbol is not external */ -#define S_CLEAR_EXTERNAL(s) ((s)->sy_symbol.n_type &= ~N_EXT) -/* Set the name of the symbol */ -#define S_SET_NAME(s,v) ((s)->sy_symbol.n_un.n_name = (v)) -/* Set the offset in the string table */ -#define S_SET_OFFSET(s,v) ((s)->sy_symbol.n_un.n_strx = (v)) -/* Set the n_other expression value */ -#define S_SET_OTHER(s,v) ((s)->sy_symbol.n_other = (v)) -/* Set the n_desc expression value */ -#define S_SET_DESC(s,v) ((s)->sy_symbol.n_desc = (v)) -/* Set the n_type value */ -#define S_SET_TYPE(s,v) ((s)->sy_symbol.n_type = (v)) - -/* File header macro and type definition */ - -#define H_GET_FILE_SIZE(h) (sizeof(struct exec) + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_SYMBOL_TABLE_SIZE(h) + \ - H_GET_TEXT_RELOCATION_SIZE(h) + \ - H_GET_DATA_RELOCATION_SIZE(h) + \ - (h)->string_table_size) - -#define H_GET_HEADER_SIZE(h) (sizeof(struct exec)) -#define H_GET_TEXT_SIZE(h) ((h)->header.a_text) -#define H_GET_DATA_SIZE(h) ((h)->header.a_data) -#define H_GET_BSS_SIZE(h) ((h)->header.a_bss) -#define H_GET_TEXT_RELOCATION_SIZE(h) ((h)->header.a_trsize) -#define H_GET_DATA_RELOCATION_SIZE(h) ((h)->header.a_drsize) -#define H_GET_SYMBOL_TABLE_SIZE(h) ((h)->header.a_syms) -#define H_GET_MAGIC_NUMBER(h) ((h)->header.a_info) -#define H_GET_ENTRY_POINT(h) ((h)->header.a_entry) -#define H_GET_STRING_SIZE(h) ((h)->string_table_size) -#define H_GET_LINENO_SIZE(h) (0) - -#ifdef EXEC_MACHINE_TYPE -#define H_GET_MACHINE_TYPE(h) ((h)->header.a_machtype) -#endif /* EXEC_MACHINE_TYPE */ -#ifdef EXEC_VERSION -#define H_GET_VERSION(h) ((h)->header.a_version) -#endif /* EXEC_VERSION */ - -#define H_SET_TEXT_SIZE(h,v) ((h)->header.a_text = (v)) -#define H_SET_DATA_SIZE(h,v) ((h)->header.a_data = (v)) -#define H_SET_BSS_SIZE(h,v) ((h)->header.a_bss = (v)) - -#define H_SET_RELOCATION_SIZE(h,t,d) (H_SET_TEXT_RELOCATION_SIZE((h),(t)),\ - H_SET_DATA_RELOCATION_SIZE((h),(d))) - -#define H_SET_TEXT_RELOCATION_SIZE(h,v) ((h)->header.a_trsize = (v)) -#define H_SET_DATA_RELOCATION_SIZE(h,v) ((h)->header.a_drsize = (v)) -#define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->header.a_syms = (v) * \ - sizeof(struct nlist)) - -#define H_SET_MAGIC_NUMBER(h,v) ((h)->header.a_magic = (v)) - -#define H_SET_ENTRY_POINT(h,v) ((h)->header.a_entry = (v)) -#define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v)) -#ifdef EXEC_MACHINE_TYPE -#define H_SET_MACHINE_TYPE(h,v) ((h)->header.a_machtype = (v)) -#endif /* EXEC_MACHINE_TYPE */ -#ifdef EXEC_VERSION -#define H_SET_VERSION(h,v) ((h)->header.a_version = (v)) -#endif /* EXEC_VERSION */ - -typedef struct - { - struct exec header; /* a.out header */ - long string_table_size; /* names + '\0' + sizeof(int) */ - } - -object_headers; - -/* unused hooks. */ -#define OBJ_EMIT_LINENO(a, b, c) {;} -#define obj_pre_write_hook(a) {;} - -#if __STDC__ -struct fix; -#endif -extern void tc_aout_fix_to_chars PARAMS ((char *where, - struct fix *fixP, - relax_addressT segment_address)); -extern void tc_bout_fix_to_chars PARAMS ((char *where, - struct fix *fixP, - relax_addressT segment_address)); - -#define AOUT_STABS - -/* end of obj-bout.h */ diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c deleted file mode 100644 index d7508680336..00000000000 --- a/gas/config/obj-coff.c +++ /dev/null @@ -1,4616 +0,0 @@ -/* coff object file format - Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - - This file is part of GAS. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#define OBJ_HEADER "obj-coff.h" - -#include "as.h" -#include "obstack.h" -#include "subsegs.h" - -/* I think this is probably always correct. */ -#ifndef KEEP_RELOC_INFO -#define KEEP_RELOC_INFO -#endif - -static void obj_coff_bss PARAMS ((int)); -const char *s_get_name PARAMS ((symbolS * s)); -static void obj_coff_ln PARAMS ((int)); -static void obj_coff_def PARAMS ((int)); -static void obj_coff_endef PARAMS ((int)); -static void obj_coff_dim PARAMS ((int)); -static void obj_coff_line PARAMS ((int)); -static void obj_coff_size PARAMS ((int)); -static void obj_coff_scl PARAMS ((int)); -static void obj_coff_tag PARAMS ((int)); -static void obj_coff_val PARAMS ((int)); -static void obj_coff_type PARAMS ((int)); -static void obj_coff_ident PARAMS ((int)); -#ifdef BFD_ASSEMBLER -static void obj_coff_loc PARAMS((int)); -#endif - -/* This is used to hold the symbol built by a sequence of pseudo-ops - from .def and .endef. */ -static symbolS *def_symbol_in_progress; - -/* stack stuff */ -typedef struct - { - unsigned long chunk_size; - unsigned long element_size; - unsigned long size; - char *data; - unsigned long pointer; - } -stack; - -static stack * -stack_init (chunk_size, element_size) - unsigned long chunk_size; - unsigned long element_size; -{ - stack *st; - - st = (stack *) malloc (sizeof (stack)); - if (!st) - return 0; - st->data = malloc (chunk_size); - if (!st->data) - { - free (st); - return 0; - } - st->pointer = 0; - st->size = chunk_size; - st->chunk_size = chunk_size; - st->element_size = element_size; - return st; -} - -#if 0 -/* Not currently used. */ -static void -stack_delete (st) - stack *st; -{ - free (st->data); - free (st); -} -#endif - -static char * -stack_push (st, element) - stack *st; - char *element; -{ - if (st->pointer + st->element_size >= st->size) - { - st->size += st->chunk_size; - if ((st->data = xrealloc (st->data, st->size)) == (char *) 0) - return (char *) 0; - } - memcpy (st->data + st->pointer, element, st->element_size); - st->pointer += st->element_size; - return st->data + st->pointer; -} - -static char * -stack_pop (st) - stack *st; -{ - if (st->pointer < st->element_size) - { - st->pointer = 0; - return (char *) 0; - } - st->pointer -= st->element_size; - return st->data + st->pointer; -} - -/* - * Maintain a list of the tagnames of the structres. - */ - -static struct hash_control *tag_hash; - -static void -tag_init () -{ - tag_hash = hash_new (); -} - -static void -tag_insert (name, symbolP) - const char *name; - symbolS *symbolP; -{ - const char *error_string; - - if ((error_string = hash_jam (tag_hash, name, (char *) symbolP))) - { - as_fatal (_("Inserting \"%s\" into structure table failed: %s"), - name, error_string); - } -} - -static symbolS * -tag_find (name) - char *name; -{ -#ifdef STRIP_UNDERSCORE - if (*name == '_') - name++; -#endif /* STRIP_UNDERSCORE */ - return (symbolS *) hash_find (tag_hash, name); -} - -static symbolS * -tag_find_or_make (name) - char *name; -{ - symbolS *symbolP; - - if ((symbolP = tag_find (name)) == NULL) - { - symbolP = symbol_new (name, undefined_section, - 0, &zero_address_frag); - - tag_insert (S_GET_NAME (symbolP), symbolP); -#ifdef BFD_ASSEMBLER - symbol_table_insert (symbolP); -#endif - } /* not found */ - - return symbolP; -} - -/* We accept the .bss directive to set the section for backward - compatibility with earlier versions of gas. */ - -static void -obj_coff_bss (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (*input_line_pointer == '\n') - subseg_new (".bss", get_absolute_expression ()); - else - s_lcomm (0); -} - -/* Handle .weak. This is a GNU extension. */ - -static void -obj_coff_weak (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *name; - int c; - symbolS *symbolP; - - do - { - name = input_line_pointer; - c = get_symbol_end (); - symbolP = symbol_find_or_make (name); - *input_line_pointer = c; - SKIP_WHITESPACE (); - -#ifdef BFD_ASSEMLER - S_SET_WEAK (symbolP); -#endif - -#ifdef TE_PE - S_SET_STORAGE_CLASS (symbolP, C_NT_WEAK); -#else - S_SET_STORAGE_CLASS (symbolP, C_WEAKEXT); -#endif - - if (c == ',') - { - input_line_pointer++; - SKIP_WHITESPACE (); - if (*input_line_pointer == '\n') - c = '\n'; - } - } - while (c == ','); - - demand_empty_rest_of_line (); -} - -#ifdef BFD_ASSEMBLER - -static void SA_SET_SYM_TAGNDX PARAMS ((symbolS *, symbolS *)); - -#define GET_FILENAME_STRING(X) \ -((char*)(&((X)->sy_symbol.ost_auxent->x_file.x_n.x_offset))[1]) - -/* @@ Ick. */ -static segT -fetch_coff_debug_section () -{ - static segT debug_section; - if (!debug_section) - { - CONST asymbol *s; - s = bfd_make_debug_symbol (stdoutput, (char *) 0, 0); - assert (s != 0); - debug_section = s->section; - } - return debug_section; -} - -void -SA_SET_SYM_ENDNDX (sym, val) - symbolS *sym; - symbolS *val; -{ - combined_entry_type *entry, *p; - - entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1]; - p = coffsymbol (symbol_get_bfdsym (val))->native; - entry->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = p; - entry->fix_end = 1; -} - -static void -SA_SET_SYM_TAGNDX (sym, val) - symbolS *sym; - symbolS *val; -{ - combined_entry_type *entry, *p; - - entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1]; - p = coffsymbol (symbol_get_bfdsym (val))->native; - entry->u.auxent.x_sym.x_tagndx.p = p; - entry->fix_tag = 1; -} - -static int -S_GET_DATA_TYPE (sym) - symbolS *sym; -{ - return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type; -} - -int -S_SET_DATA_TYPE (sym, val) - symbolS *sym; - int val; -{ - coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type = val; - return val; -} - -int -S_GET_STORAGE_CLASS (sym) - symbolS *sym; -{ - return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass; -} - -int -S_SET_STORAGE_CLASS (sym, val) - symbolS *sym; - int val; -{ - coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass = val; - return val; -} - -/* Merge a debug symbol containing debug information into a normal symbol. */ - -void -c_symbol_merge (debug, normal) - symbolS *debug; - symbolS *normal; -{ - S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug)); - S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug)); - - if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal)) - { - /* take the most we have */ - S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug)); - } - - if (S_GET_NUMBER_AUXILIARY (debug) > 0) - { - /* Move all the auxiliary information. */ - memcpy (SYM_AUXINFO (normal), SYM_AUXINFO (debug), - (S_GET_NUMBER_AUXILIARY (debug) - * sizeof (*SYM_AUXINFO (debug)))); - } - - /* Move the debug flags. */ - SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug)); -} - -void -c_dot_file_symbol (filename) - char *filename; -{ - symbolS *symbolP; - - /* BFD converts filename to a .file symbol with an aux entry. It - also handles chaining. */ - symbolP = symbol_new (filename, bfd_abs_section_ptr, 0, &zero_address_frag); - - S_SET_STORAGE_CLASS (symbolP, C_FILE); - S_SET_NUMBER_AUXILIARY (symbolP, 1); - - symbol_get_bfdsym (symbolP)->flags = BSF_DEBUGGING; - -#ifndef NO_LISTING - { - extern int listing; - if (listing) - { - listing_source_file (filename); - } - } -#endif - - /* Make sure that the symbol is first on the symbol chain */ - if (symbol_rootP != symbolP) - { - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP); - } /* if not first on the list */ -} - -/* Line number handling */ - -struct line_no { - struct line_no *next; - fragS *frag; - alent l; -}; - -int coff_line_base; - -/* Symbol of last function, which we should hang line#s off of. */ -static symbolS *line_fsym; - -#define in_function() (line_fsym != 0) -#define clear_function() (line_fsym = 0) -#define set_function(F) (line_fsym = (F), coff_add_linesym (F)) - - -void -coff_obj_symbol_new_hook (symbolP) - symbolS *symbolP; -{ - long sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type); - char * s = (char *) xmalloc (sz); - - memset (s, 0, sz); - coffsymbol (symbol_get_bfdsym (symbolP))->native = (combined_entry_type *) s; - - S_SET_DATA_TYPE (symbolP, T_NULL); - S_SET_STORAGE_CLASS (symbolP, 0); - S_SET_NUMBER_AUXILIARY (symbolP, 0); - - if (S_IS_STRING (symbolP)) - SF_SET_STRING (symbolP); - - if (S_IS_LOCAL (symbolP)) - SF_SET_LOCAL (symbolP); -} - - -/* - * Handle .ln directives. - */ - -static symbolS *current_lineno_sym; -static struct line_no *line_nos; -/* @@ Blindly assume all .ln directives will be in the .text section... */ -int coff_n_line_nos; - -static void -add_lineno (frag, offset, num) - fragS *frag; - int offset; - int num; -{ - struct line_no *new_line = - (struct line_no *) xmalloc (sizeof (struct line_no)); - if (!current_lineno_sym) - { - abort (); - } - if (num <= 0) - { - /* Zero is used as an end marker in the file. */ - as_warn (_("Line numbers must be positive integers\n")); - num = 1; - } - new_line->next = line_nos; - new_line->frag = frag; - new_line->l.line_number = num; - new_line->l.u.offset = offset; - line_nos = new_line; - coff_n_line_nos++; -} - -void -coff_add_linesym (sym) - symbolS *sym; -{ - if (line_nos) - { - coffsymbol (symbol_get_bfdsym (current_lineno_sym))->lineno = - (alent *) line_nos; - coff_n_line_nos++; - line_nos = 0; - } - current_lineno_sym = sym; -} - -static void -obj_coff_ln (appline) - int appline; -{ - int l; - - if (! appline && def_symbol_in_progress != NULL) - { - as_warn (_(".ln pseudo-op inside .def/.endef: ignored.")); - demand_empty_rest_of_line (); - return; - } - - l = get_absolute_expression (); - if (!appline) - { - add_lineno (frag_now, frag_now_fix (), l); - } - - if (appline) - new_logical_line ((char *) NULL, l - 1); - -#ifndef NO_LISTING - { - extern int listing; - - if (listing) - { - if (! appline) - l += coff_line_base - 1; - listing_source_line (l); - } - } -#endif - - demand_empty_rest_of_line (); -} - -/* .loc is essentially the same as .ln; parse it for assembler - compatibility. */ - -static void -obj_coff_loc (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - int lineno; - - /* FIXME: Why do we need this check? We need it for ECOFF, but why - do we need it for COFF? */ - if (now_seg != text_section) - { - as_warn (_(".loc outside of .text")); - demand_empty_rest_of_line (); - return; - } - - if (def_symbol_in_progress != NULL) - { - as_warn (_(".loc pseudo-op inside .def/.endef: ignored.")); - demand_empty_rest_of_line (); - return; - } - - /* Skip the file number. */ - SKIP_WHITESPACE (); - get_absolute_expression (); - SKIP_WHITESPACE (); - - lineno = get_absolute_expression (); - -#ifndef NO_LISTING - { - extern int listing; - - if (listing) - { - lineno += coff_line_base - 1; - listing_source_line (lineno); - } - } -#endif - - demand_empty_rest_of_line (); - - add_lineno (frag_now, frag_now_fix (), lineno); -} - -/* Handle the .ident pseudo-op. */ - -static void -obj_coff_ident (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - segT current_seg = now_seg; - subsegT current_subseg = now_subseg; - -#ifdef TE_PE - { - segT sec; - - /* We could put it in .comment, but that creates an extra section - that shouldn't be loaded into memory, which requires linker - changes... For now, until proven otherwise, use .rdata. */ - sec = subseg_new (".rdata$zzz", 0); - bfd_set_section_flags (stdoutput, sec, - ((SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA) - & bfd_applicable_section_flags (stdoutput))); - } -#else - subseg_new (".comment", 0); -#endif - - stringer (1); - subseg_set (current_seg, current_subseg); -} - -/* - * def() - * - * Handle .def directives. - * - * One might ask : why can't we symbol_new if the symbol does not - * already exist and fill it with debug information. Because of - * the C_EFCN special symbol. It would clobber the value of the - * function symbol before we have a chance to notice that it is - * a C_EFCN. And a second reason is that the code is more clear this - * way. (at least I think it is :-). - * - */ - -#define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';') -#define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \ - *input_line_pointer == '\t') \ - input_line_pointer++; - -static void -obj_coff_def (what) - int what ATTRIBUTE_UNUSED; -{ - char name_end; /* Char after the end of name */ - char *symbol_name; /* Name of the debug symbol */ - char *symbol_name_copy; /* Temporary copy of the name */ - unsigned int symbol_name_length; - - if (def_symbol_in_progress != NULL) - { - as_warn (_(".def pseudo-op used inside of .def/.endef: ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - SKIP_WHITESPACES (); - - symbol_name = input_line_pointer; -#ifdef STRIP_UNDERSCORE - if (symbol_name[0] == '_' && symbol_name[1] != 0) - symbol_name++; -#endif /* STRIP_UNDERSCORE */ - - name_end = get_symbol_end (); - symbol_name_length = strlen (symbol_name); - symbol_name_copy = xmalloc (symbol_name_length + 1); - strcpy (symbol_name_copy, symbol_name); -#ifdef tc_canonicalize_symbol_name - symbol_name_copy = tc_canonicalize_symbol_name (symbol_name_copy); -#endif - - /* Initialize the new symbol */ - def_symbol_in_progress = symbol_make (symbol_name_copy); - symbol_set_frag (def_symbol_in_progress, &zero_address_frag); - S_SET_VALUE (def_symbol_in_progress, 0); - - if (S_IS_STRING (def_symbol_in_progress)) - SF_SET_STRING (def_symbol_in_progress); - - *input_line_pointer = name_end; - - demand_empty_rest_of_line (); -} - -unsigned int dim_index; - -static void -obj_coff_endef (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - symbolS *symbolP; - - /* DIM BUG FIX sac@cygnus.com */ - dim_index = 0; - if (def_symbol_in_progress == NULL) - { - as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - /* Set the section number according to storage class. */ - switch (S_GET_STORAGE_CLASS (def_symbol_in_progress)) - { - case C_STRTAG: - case C_ENTAG: - case C_UNTAG: - SF_SET_TAG (def_symbol_in_progress); - /* intentional fallthrough */ - case C_FILE: - case C_TPDEF: - SF_SET_DEBUG (def_symbol_in_progress); - S_SET_SEGMENT (def_symbol_in_progress, fetch_coff_debug_section ()); - break; - - case C_EFCN: - SF_SET_LOCAL (def_symbol_in_progress); /* Do not emit this symbol. */ - /* intentional fallthrough */ - case C_BLOCK: - SF_SET_PROCESS (def_symbol_in_progress); /* Will need processing before writing */ - /* intentional fallthrough */ - case C_FCN: - { - CONST char *name; - S_SET_SEGMENT (def_symbol_in_progress, text_section); - - name = S_GET_NAME (def_symbol_in_progress); - if (name[0] == '.' && name[2] == 'f' && name[3] == '\0') - { - switch (name[1]) - { - case 'b': - /* .bf */ - if (! in_function ()) - as_warn (_("`%s' symbol without preceding function"), name); - /* Will need relocating. */ - SF_SET_PROCESS (def_symbol_in_progress); - clear_function (); - break; -#ifdef TE_PE - case 'e': - /* .ef */ - /* The MS compilers output the actual endline, not the - function-relative one... we want to match without - changing the assembler input. */ - SA_SET_SYM_LNNO (def_symbol_in_progress, - (SA_GET_SYM_LNNO (def_symbol_in_progress) - + coff_line_base)); - break; -#endif - } - } - } - break; - -#ifdef C_AUTOARG - case C_AUTOARG: -#endif /* C_AUTOARG */ - case C_AUTO: - case C_REG: - case C_ARG: - case C_REGPARM: - case C_FIELD: - SF_SET_DEBUG (def_symbol_in_progress); - S_SET_SEGMENT (def_symbol_in_progress, absolute_section); - break; - - case C_MOS: - case C_MOE: - case C_MOU: - case C_EOS: - S_SET_SEGMENT (def_symbol_in_progress, absolute_section); - break; - - case C_EXT: - case C_WEAKEXT: -#ifdef TE_PE - case C_NT_WEAK: -#endif - case C_STAT: - case C_LABEL: - /* Valid but set somewhere else (s_comm, s_lcomm, colon) */ - break; - - default: - case C_USTATIC: - case C_EXTDEF: - case C_ULABEL: - as_warn (_("unexpected storage class %d"), - S_GET_STORAGE_CLASS (def_symbol_in_progress)); - break; - } /* switch on storage class */ - - /* Now that we have built a debug symbol, try to find if we should - merge with an existing symbol or not. If a symbol is C_EFCN or - absolute_section or untagged SEG_DEBUG it never merges. We also - don't merge labels, which are in a different namespace, nor - symbols which have not yet been defined since they are typically - unique, nor do we merge tags with non-tags. */ - - /* Two cases for functions. Either debug followed by definition or - definition followed by debug. For definition first, we will - merge the debug symbol into the definition. For debug first, the - lineno entry MUST point to the definition function or else it - will point off into space when obj_crawl_symbol_chain() merges - the debug symbol into the real symbol. Therefor, let's presume - the debug symbol is a real function reference. */ - - /* FIXME-SOON If for some reason the definition label/symbol is - never seen, this will probably leave an undefined symbol at link - time. */ - - if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN - || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL - || (!strcmp (bfd_get_section_name (stdoutput, - S_GET_SEGMENT (def_symbol_in_progress)), - "*DEBUG*") - && !SF_GET_TAG (def_symbol_in_progress)) - || S_GET_SEGMENT (def_symbol_in_progress) == absolute_section - || ! symbol_constant_p (def_symbol_in_progress) - || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress), - DO_NOT_STRIP)) == NULL - || SF_GET_TAG (def_symbol_in_progress) != SF_GET_TAG (symbolP)) - { - /* If it already is at the end of the symbol list, do nothing */ - if (def_symbol_in_progress != symbol_lastP) - { - symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP); - symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, - &symbol_lastP); - } - } - else - { - /* This symbol already exists, merge the newly created symbol - into the old one. This is not mandatory. The linker can - handle duplicate symbols correctly. But I guess that it save - a *lot* of space if the assembly file defines a lot of - symbols. [loic] */ - - /* The debug entry (def_symbol_in_progress) is merged into the - previous definition. */ - - c_symbol_merge (def_symbol_in_progress, symbolP); - symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP); - - def_symbol_in_progress = symbolP; - - if (SF_GET_FUNCTION (def_symbol_in_progress) - || SF_GET_TAG (def_symbol_in_progress) - || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_STAT) - { - /* For functions, and tags, and static symbols, the symbol - *must* be where the debug symbol appears. Move the - existing symbol to the current place. */ - /* If it already is at the end of the symbol list, do nothing */ - if (def_symbol_in_progress != symbol_lastP) - { - symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP); - symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, &symbol_lastP); - } - } - } - - if (SF_GET_TAG (def_symbol_in_progress)) - { - symbolS *oldtag; - - oldtag = symbol_find_base (S_GET_NAME (def_symbol_in_progress), - DO_NOT_STRIP); - if (oldtag == NULL || ! SF_GET_TAG (oldtag)) - tag_insert (S_GET_NAME (def_symbol_in_progress), - def_symbol_in_progress); - } - - if (SF_GET_FUNCTION (def_symbol_in_progress)) - { - know (sizeof (def_symbol_in_progress) <= sizeof (long)); - set_function (def_symbol_in_progress); - SF_SET_PROCESS (def_symbol_in_progress); - - if (symbolP == NULL) - { - /* That is, if this is the first time we've seen the - function... */ - symbol_table_insert (def_symbol_in_progress); - } /* definition follows debug */ - } /* Create the line number entry pointing to the function being defined */ - - def_symbol_in_progress = NULL; - demand_empty_rest_of_line (); -} - -static void -obj_coff_dim (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - int dim_index; - - if (def_symbol_in_progress == NULL) - { - as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1); - - for (dim_index = 0; dim_index < DIMNUM; dim_index++) - { - SKIP_WHITESPACES (); - SA_SET_SYM_DIMEN (def_symbol_in_progress, dim_index, - get_absolute_expression ()); - - switch (*input_line_pointer) - { - case ',': - input_line_pointer++; - break; - - default: - as_warn (_("badly formed .dim directive ignored")); - /* intentional fallthrough */ - case '\n': - case ';': - dim_index = DIMNUM; - break; - } - } - - demand_empty_rest_of_line (); -} - -static void -obj_coff_line (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - int this_base; - - if (def_symbol_in_progress == NULL) - { - /* Probably stabs-style line? */ - obj_coff_ln (0); - return; - } - - this_base = get_absolute_expression (); - if (!strcmp (".bf", S_GET_NAME (def_symbol_in_progress))) - coff_line_base = this_base; - - S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1); - SA_SET_SYM_LNNO (def_symbol_in_progress, this_base); - - demand_empty_rest_of_line (); - -#ifndef NO_LISTING - if (strcmp (".bf", S_GET_NAME (def_symbol_in_progress)) == 0) - { - extern int listing; - - if (listing) - listing_source_line ((unsigned int) this_base); - } -#endif -} - -static void -obj_coff_size (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (def_symbol_in_progress == NULL) - { - as_warn (_(".size pseudo-op used outside of .def/.endef ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1); - SA_SET_SYM_SIZE (def_symbol_in_progress, get_absolute_expression ()); - demand_empty_rest_of_line (); -} - -static void -obj_coff_scl (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (def_symbol_in_progress == NULL) - { - as_warn (_(".scl pseudo-op used outside of .def/.endef ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - S_SET_STORAGE_CLASS (def_symbol_in_progress, get_absolute_expression ()); - demand_empty_rest_of_line (); -} - -static void -obj_coff_tag (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *symbol_name; - char name_end; - - if (def_symbol_in_progress == NULL) - { - as_warn (_(".tag pseudo-op used outside of .def/.endef ignored.")); - demand_empty_rest_of_line (); - return; - } - - S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1); - symbol_name = input_line_pointer; - name_end = get_symbol_end (); - -#ifdef tc_canonicalize_symbol_name - symbol_name = tc_canonicalize_symbol_name (symbol_name); -#endif - - /* Assume that the symbol referred to by .tag is always defined. - This was a bad assumption. I've added find_or_make. xoxorich. */ - SA_SET_SYM_TAGNDX (def_symbol_in_progress, - tag_find_or_make (symbol_name)); - if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L) - { - as_warn (_("tag not found for .tag %s"), symbol_name); - } /* not defined */ - - SF_SET_TAGGED (def_symbol_in_progress); - *input_line_pointer = name_end; - - demand_empty_rest_of_line (); -} - -static void -obj_coff_type (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (def_symbol_in_progress == NULL) - { - as_warn (_(".type pseudo-op used outside of .def/.endef ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - S_SET_DATA_TYPE (def_symbol_in_progress, get_absolute_expression ()); - - if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress)) && - S_GET_STORAGE_CLASS (def_symbol_in_progress) != C_TPDEF) - { - SF_SET_FUNCTION (def_symbol_in_progress); - } /* is a function */ - - demand_empty_rest_of_line (); -} - -static void -obj_coff_val (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (def_symbol_in_progress == NULL) - { - as_warn (_(".val pseudo-op used outside of .def/.endef ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - if (is_name_beginner (*input_line_pointer)) - { - char *symbol_name = input_line_pointer; - char name_end = get_symbol_end (); - -#ifdef tc_canonicalize_symbol_name - symbol_name = tc_canonicalize_symbol_name (symbol_name); -#endif - if (!strcmp (symbol_name, ".")) - { - symbol_set_frag (def_symbol_in_progress, frag_now); - S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ()); - /* If the .val is != from the .def (e.g. statics) */ - } - else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name)) - { - expressionS exp; - - exp.X_op = O_symbol; - exp.X_add_symbol = symbol_find_or_make (symbol_name); - exp.X_op_symbol = NULL; - exp.X_add_number = 0; - symbol_set_value_expression (def_symbol_in_progress, &exp); - - /* If the segment is undefined when the forward reference is - resolved, then copy the segment id from the forward - symbol. */ - SF_SET_GET_SEGMENT (def_symbol_in_progress); - - /* FIXME: gcc can generate address expressions here in - unusual cases (search for "obscure" in sdbout.c). We - just ignore the offset here, thus generating incorrect - debugging information. We ignore the rest of the line - just below. */ - } - /* Otherwise, it is the name of a non debug symbol and its value - will be calculated later. */ - *input_line_pointer = name_end; - } - else - { - S_SET_VALUE (def_symbol_in_progress, get_absolute_expression ()); - } /* if symbol based */ - - demand_empty_rest_of_line (); -} - -void -coff_obj_read_begin_hook () -{ - /* These had better be the same. Usually 18 bytes. */ -#ifndef BFD_HEADERS - know (sizeof (SYMENT) == sizeof (AUXENT)); - know (SYMESZ == AUXESZ); -#endif - tag_init (); -} - - -symbolS *coff_last_function; -static symbolS *coff_last_bf; - -void -coff_frob_symbol (symp, punt) - symbolS *symp; - int *punt; -{ - static symbolS *last_tagP; - static stack *block_stack; - static symbolS *set_end; - symbolS *next_set_end = NULL; - - if (symp == &abs_symbol) - { - *punt = 1; - return; - } - - if (current_lineno_sym) - coff_add_linesym ((symbolS *) 0); - - if (!block_stack) - block_stack = stack_init (512, sizeof (symbolS*)); - - if (S_IS_WEAK (symp)) - { -#ifdef TE_PE - S_SET_STORAGE_CLASS (symp, C_NT_WEAK); -#else - S_SET_STORAGE_CLASS (symp, C_WEAKEXT); -#endif - } - - if (!S_IS_DEFINED (symp) - && !S_IS_WEAK (symp) - && S_GET_STORAGE_CLASS (symp) != C_STAT) - S_SET_STORAGE_CLASS (symp, C_EXT); - - if (!SF_GET_DEBUG (symp)) - { - symbolS *real; - if (!SF_GET_LOCAL (symp) - && !SF_GET_STATICS (symp) - && (real = symbol_find_base (S_GET_NAME (symp), DO_NOT_STRIP)) - && real != symp) - { - c_symbol_merge (symp, real); - *punt = 1; - } - if (!S_IS_DEFINED (symp) && !SF_GET_LOCAL (symp)) - { - assert (S_GET_VALUE (symp) == 0); - S_SET_EXTERNAL (symp); - } - else if (S_GET_STORAGE_CLASS (symp) == C_NULL) - { - if (S_GET_SEGMENT (symp) == text_section - && symp != seg_info (text_section)->sym) - S_SET_STORAGE_CLASS (symp, C_LABEL); - else - S_SET_STORAGE_CLASS (symp, C_STAT); - } - if (SF_GET_PROCESS (symp)) - { - if (S_GET_STORAGE_CLASS (symp) == C_BLOCK) - { - if (!strcmp (S_GET_NAME (symp), ".bb")) - stack_push (block_stack, (char *) &symp); - else - { - symbolS *begin; - begin = *(symbolS **) stack_pop (block_stack); - if (begin == 0) - as_warn (_("mismatched .eb")); - else - next_set_end = begin; - } - } - if (coff_last_function == 0 && SF_GET_FUNCTION (symp)) - { - union internal_auxent *auxp; - coff_last_function = symp; - if (S_GET_NUMBER_AUXILIARY (symp) < 1) - S_SET_NUMBER_AUXILIARY (symp, 1); - auxp = SYM_AUXENT (symp); - memset (auxp->x_sym.x_fcnary.x_ary.x_dimen, 0, - sizeof (auxp->x_sym.x_fcnary.x_ary.x_dimen)); - } - if (S_GET_STORAGE_CLASS (symp) == C_EFCN) - { - if (coff_last_function == 0) - as_fatal (_("C_EFCN symbol out of scope")); - SA_SET_SYM_FSIZE (coff_last_function, - (long) (S_GET_VALUE (symp) - - S_GET_VALUE (coff_last_function))); - next_set_end = coff_last_function; - coff_last_function = 0; - } - } - if (S_IS_EXTERNAL (symp)) - S_SET_STORAGE_CLASS (symp, C_EXT); - else if (SF_GET_LOCAL (symp)) - *punt = 1; - - if (SF_GET_FUNCTION (symp)) - symbol_get_bfdsym (symp)->flags |= BSF_FUNCTION; - - /* more ... */ - } - - /* Double check weak symbols. */ - if (S_IS_WEAK (symp) && S_IS_COMMON (symp)) - as_bad (_("Symbol `%s' can not be both weak and common"), - S_GET_NAME (symp)); - - if (SF_GET_TAG (symp)) - last_tagP = symp; - else if (S_GET_STORAGE_CLASS (symp) == C_EOS) - next_set_end = last_tagP; - -#ifdef OBJ_XCOFF - /* This is pretty horrible, but we have to set *punt correctly in - order to call SA_SET_SYM_ENDNDX correctly. */ - if (! symbol_used_in_reloc_p (symp) - && ((symbol_get_bfdsym (symp)->flags & BSF_SECTION_SYM) != 0 - || (! S_IS_EXTERNAL (symp) - && ! symbol_get_tc (symp)->output - && S_GET_STORAGE_CLASS (symp) != C_FILE))) - *punt = 1; -#endif - - if (set_end != (symbolS *) NULL - && ! *punt - && ((symbol_get_bfdsym (symp)->flags & BSF_NOT_AT_END) != 0 - || (S_IS_DEFINED (symp) - && ! S_IS_COMMON (symp) - && (! S_IS_EXTERNAL (symp) || SF_GET_FUNCTION (symp))))) - { - SA_SET_SYM_ENDNDX (set_end, symp); - set_end = NULL; - } - - if (next_set_end != NULL) - { - if (set_end != NULL) - as_warn ("Warning: internal error: forgetting to set endndx of %s", - S_GET_NAME (set_end)); - set_end = next_set_end; - } - - if (! *punt - && S_GET_STORAGE_CLASS (symp) == C_FCN - && strcmp (S_GET_NAME (symp), ".bf") == 0) - { - if (coff_last_bf != NULL) - SA_SET_SYM_ENDNDX (coff_last_bf, symp); - coff_last_bf = symp; - } - - if (coffsymbol (symbol_get_bfdsym (symp))->lineno) - { - int i; - struct line_no *lptr; - alent *l; - - lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno; - for (i = 0; lptr; lptr = lptr->next) - i++; - lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno; - - /* We need i entries for line numbers, plus 1 for the first - entry which BFD will override, plus 1 for the last zero - entry (a marker for BFD). */ - l = (alent *) xmalloc ((i + 2) * sizeof (alent)); - coffsymbol (symbol_get_bfdsym (symp))->lineno = l; - l[i + 1].line_number = 0; - l[i + 1].u.sym = NULL; - for (; i > 0; i--) - { - if (lptr->frag) - lptr->l.u.offset += lptr->frag->fr_address / OCTETS_PER_BYTE; - l[i] = lptr->l; - lptr = lptr->next; - } - } -} - -void -coff_adjust_section_syms (abfd, sec, x) - bfd *abfd ATTRIBUTE_UNUSED; - asection *sec; - PTR x ATTRIBUTE_UNUSED; -{ - symbolS *secsym; - segment_info_type *seginfo = seg_info (sec); - int nlnno, nrelocs = 0; - - /* RS/6000 gas creates a .debug section manually in ppc_frob_file in - tc-ppc.c. Do not get confused by it. */ - if (seginfo == NULL) - return; - - if (!strcmp (sec->name, ".text")) - nlnno = coff_n_line_nos; - else - nlnno = 0; - { - /* @@ Hope that none of the fixups expand to more than one reloc - entry... */ - fixS *fixp = seginfo->fix_root; - while (fixp) - { - if (! fixp->fx_done) - nrelocs++; - fixp = fixp->fx_next; - } - } - if (bfd_get_section_size_before_reloc (sec) == 0 - && nrelocs == 0 - && nlnno == 0 - && sec != text_section - && sec != data_section - && sec != bss_section) - return; - secsym = section_symbol (sec); - /* This is an estimate; we'll plug in the real value using - SET_SECTION_RELOCS later */ - SA_SET_SCN_NRELOC (secsym, nrelocs); - SA_SET_SCN_NLINNO (secsym, nlnno); -} - -void -coff_frob_file_after_relocs () -{ - bfd_map_over_sections (stdoutput, coff_adjust_section_syms, (char*) 0); -} - -/* - * implement the .section pseudo op: - * .section name {, "flags"} - * ^ ^ - * | +--- optional flags: 'b' for bss - * | 'i' for info - * +-- section name 'l' for lib - * 'n' for noload - * 'o' for over - * 'w' for data - * 'd' (apparently m88k for data) - * 'x' for text - * 'r' for read-only data - * 's' for shared data (PE) - * But if the argument is not a quoted string, treat it as a - * subsegment number. - */ - -void -obj_coff_section (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - /* Strip out the section name */ - char *section_name; - char c; - char *name; - unsigned int exp; - flagword flags; - asection *sec; - - if (flag_mri) - { - char type; - - s_mri_sect (&type); - return; - } - - section_name = input_line_pointer; - c = get_symbol_end (); - - name = xmalloc (input_line_pointer - section_name + 1); - strcpy (name, section_name); - - *input_line_pointer = c; - - SKIP_WHITESPACE (); - - exp = 0; - flags = SEC_LOAD; - - if (*input_line_pointer == ',') - { - ++input_line_pointer; - SKIP_WHITESPACE (); - if (*input_line_pointer != '"') - exp = get_absolute_expression (); - else - { - ++input_line_pointer; - while (*input_line_pointer != '"' - && ! is_end_of_line[(unsigned char) *input_line_pointer]) - { - switch (*input_line_pointer) - { - case 'b': flags |= SEC_ALLOC; flags &=~ SEC_LOAD; break; - case 'n': flags &=~ SEC_LOAD; break; - case 'd': flags |= SEC_DATA | SEC_LOAD; /* fall through */ - case 'w': flags &=~ SEC_READONLY; break; - case 'x': flags |= SEC_CODE | SEC_LOAD; break; - case 'r': flags |= SEC_READONLY; break; - case 's': flags |= SEC_SHARED; break; - - case 'i': /* STYP_INFO */ - case 'l': /* STYP_LIB */ - case 'o': /* STYP_OVER */ - as_warn (_("unsupported section attribute '%c'"), - *input_line_pointer); - break; - - default: - as_warn(_("unknown section attribute '%c'"), - *input_line_pointer); - break; - } - ++input_line_pointer; - } - if (*input_line_pointer == '"') - ++input_line_pointer; - } - } - - sec = subseg_new (name, (subsegT) exp); - - if (flags != SEC_NO_FLAGS) - { - flagword oldflags; - - oldflags = bfd_get_section_flags (stdoutput, sec); - oldflags &= SEC_LINK_ONCE | SEC_LINK_DUPLICATES; - flags |= oldflags; - - if (! bfd_set_section_flags (stdoutput, sec, flags)) - as_warn (_("error setting flags for \"%s\": %s"), - bfd_section_name (stdoutput, sec), - bfd_errmsg (bfd_get_error ())); - } - - demand_empty_rest_of_line (); -} - -void -coff_adjust_symtab () -{ - if (symbol_rootP == NULL - || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE) - c_dot_file_symbol ("fake"); -} - -void -coff_frob_section (sec) - segT sec; -{ - segT strsec; - char *p; - fragS *fragp; - bfd_vma size, n_entries, mask; - bfd_vma align_power = (bfd_vma)sec->alignment_power + OCTETS_PER_BYTE_POWER; - - /* The COFF back end in BFD requires that all section sizes be - rounded up to multiples of the corresponding section alignments, - supposedly because standard COFF has no other way of encoding alignment - for sections. If your COFF flavor has a different way of encoding - section alignment, then skip this step, as TICOFF does. */ - size = bfd_get_section_size_before_reloc (sec); - mask = ((bfd_vma) 1 << align_power) - 1; -#if !defined(TICOFF) - if (size & mask) - { - size = (size + mask) & ~mask; - bfd_set_section_size (stdoutput, sec, size); - } -#endif - - /* If the section size is non-zero, the section symbol needs an aux - entry associated with it, indicating the size. We don't know - all the values yet; coff_frob_symbol will fill them in later. */ -#ifndef TICOFF - if (size != 0 - || sec == text_section - || sec == data_section - || sec == bss_section) -#endif - { - symbolS *secsym = section_symbol (sec); - - S_SET_STORAGE_CLASS (secsym, C_STAT); - S_SET_NUMBER_AUXILIARY (secsym, 1); - SF_SET_STATICS (secsym); - SA_SET_SCN_SCNLEN (secsym, size); - } - - /* @@ these should be in a "stabs.h" file, or maybe as.h */ -#ifndef STAB_SECTION_NAME -#define STAB_SECTION_NAME ".stab" -#endif -#ifndef STAB_STRING_SECTION_NAME -#define STAB_STRING_SECTION_NAME ".stabstr" -#endif - if (strcmp (STAB_STRING_SECTION_NAME, sec->name)) - return; - - strsec = sec; - sec = subseg_get (STAB_SECTION_NAME, 0); - /* size is already rounded up, since other section will be listed first */ - size = bfd_get_section_size_before_reloc (strsec); - - n_entries = bfd_get_section_size_before_reloc (sec) / 12 - 1; - - /* Find first non-empty frag. It should be large enough. */ - fragp = seg_info (sec)->frchainP->frch_root; - while (fragp && fragp->fr_fix == 0) - fragp = fragp->fr_next; - assert (fragp != 0 && fragp->fr_fix >= 12); - - /* Store the values. */ - p = fragp->fr_literal; - bfd_h_put_16 (stdoutput, n_entries, (bfd_byte *) p + 6); - bfd_h_put_32 (stdoutput, size, (bfd_byte *) p + 8); -} - -void -obj_coff_init_stab_section (seg) - segT seg; -{ - char *file; - char *p; - char *stabstr_name; - unsigned int stroff; - - /* Make space for this first symbol. */ - p = frag_more (12); - /* Zero it out. */ - memset (p, 0, 12); - as_where (&file, (unsigned int *) NULL); - stabstr_name = (char *) alloca (strlen (seg->name) + 4); - strcpy (stabstr_name, seg->name); - strcat (stabstr_name, "str"); - stroff = get_stab_string_offset (file, stabstr_name); - know (stroff == 1); - md_number_to_chars (p, stroff, 4); -} - -#ifdef DEBUG -/* for debugging */ -const char * -s_get_name (s) - symbolS *s; -{ - return ((s == NULL) ? "(NULL)" : S_GET_NAME (s)); -} - -void -symbol_dump () -{ - symbolS *symbolP; - - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - printf(_("0x%lx: \"%s\" type = %ld, class = %d, segment = %d\n"), - (unsigned long) symbolP, - S_GET_NAME(symbolP), - (long) S_GET_DATA_TYPE(symbolP), - S_GET_STORAGE_CLASS(symbolP), - (int) S_GET_SEGMENT(symbolP)); - } -} - -#endif /* DEBUG */ - -#else /* not BFD_ASSEMBLER */ - -#include "frags.h" -/* This is needed because we include internal bfd things. */ -#include - -#include "libbfd.h" -#include "libcoff.h" - -#ifdef TE_PE -#include "coff/pe.h" -#endif - -/* The NOP_OPCODE is for the alignment fill value. Fill with nop so - that we can stick sections together without causing trouble. */ -#ifndef NOP_OPCODE -#define NOP_OPCODE 0x00 -#endif - -/* The zeroes if symbol name is longer than 8 chars */ -#define S_SET_ZEROES(s,v) ((s)->sy_symbol.ost_entry.n_zeroes = (v)) - -#define MIN(a,b) ((a) < (b)? (a) : (b)) - -/* This vector is used to turn a gas internal segment number into a - section number suitable for insertion into a coff symbol table. - This must correspond to seg_info_off_by_4. */ - -const short seg_N_TYPE[] = -{ /* in: segT out: N_TYPE bits */ - C_ABS_SECTION, - 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, - C_UNDEF_SECTION, /* SEG_UNKNOWN */ - C_UNDEF_SECTION, /* SEG_GOOF */ - C_UNDEF_SECTION, /* SEG_EXPR */ - C_DEBUG_SECTION, /* SEG_DEBUG */ - C_NTV_SECTION, /* SEG_NTV */ - C_PTV_SECTION, /* SEG_PTV */ - C_REGISTER_SECTION, /* SEG_REGISTER */ -}; - -int function_lineoff = -1; /* Offset in line#s where the last function - started (the odd entry for line #0) */ - -/* structure used to keep the filenames which - are too long around so that we can stick them - into the string table */ -struct filename_list -{ - char *filename; - struct filename_list *next; -}; - -static struct filename_list *filename_list_head; -static struct filename_list *filename_list_tail; - -static symbolS *last_line_symbol; - -/* Add 4 to the real value to get the index and compensate the - negatives. This vector is used by S_GET_SEGMENT to turn a coff - section number into a segment number -*/ -static symbolS *previous_file_symbol; -void c_symbol_merge (); -static int line_base; - -symbolS *c_section_symbol (); -bfd *abfd; - -static void fixup_segment PARAMS ((segment_info_type *segP, - segT this_segment_type)); - - -static void fixup_mdeps PARAMS ((fragS *, - object_headers *, - segT)); - - -static void fill_section PARAMS ((bfd * abfd, - object_headers *, - unsigned long *)); - - -static int c_line_new PARAMS ((symbolS * symbol, long paddr, - int line_number, - fragS * frag)); - - -static void w_symbols PARAMS ((bfd * abfd, char *where, - symbolS * symbol_rootP)); - -static void adjust_stab_section PARAMS ((bfd *abfd, segT seg)); - -static void obj_coff_lcomm PARAMS ((int)); -static void obj_coff_text PARAMS ((int)); -static void obj_coff_data PARAMS ((int)); -void obj_coff_section PARAMS ((int)); - -/* When not using BFD_ASSEMBLER, we permit up to 40 sections. - - This array maps a COFF section number into a gas section number. - Because COFF uses negative section numbers, you must add 4 to the - COFF section number when indexing into this array; this is done via - the SEG_INFO_FROM_SECTION_NUMBER macro. This must correspond to - seg_N_TYPE. */ - -static const segT seg_info_off_by_4[] = -{ - SEG_PTV, - SEG_NTV, - SEG_DEBUG, - SEG_ABSOLUTE, - SEG_UNKNOWN, - SEG_E0, SEG_E1, SEG_E2, SEG_E3, SEG_E4, - SEG_E5, SEG_E6, SEG_E7, SEG_E8, SEG_E9, - SEG_E10, SEG_E11, SEG_E12, SEG_E13, SEG_E14, - SEG_E15, SEG_E16, SEG_E17, SEG_E18, SEG_E19, - SEG_E20, SEG_E21, SEG_E22, SEG_E23, SEG_E24, - SEG_E25, SEG_E26, SEG_E27, SEG_E28, SEG_E29, - SEG_E30, SEG_E31, SEG_E32, SEG_E33, SEG_E34, - SEG_E35, SEG_E36, SEG_E37, SEG_E38, SEG_E39, - (segT) 40, - (segT) 41, - (segT) 42, - (segT) 43, - (segT) 44, - (segT) 45, - (segT) 0, - (segT) 0, - (segT) 0, - SEG_REGISTER -}; - -#define SEG_INFO_FROM_SECTION_NUMBER(x) (seg_info_off_by_4[(x)+4]) - -static relax_addressT -relax_align (address, alignment) - relax_addressT address; - long alignment; -{ - relax_addressT mask; - relax_addressT new_address; - - mask = ~((~0) << alignment); - new_address = (address + mask) & (~mask); - return (new_address - address); -} - - -segT -s_get_segment (x) - symbolS * x; -{ - return SEG_INFO_FROM_SECTION_NUMBER (x->sy_symbol.ost_entry.n_scnum); -} - -/* calculate the size of the frag chain and fill in the section header - to contain all of it, also fill in the addr of the sections */ -static unsigned int -size_section (abfd, idx) - bfd *abfd ATTRIBUTE_UNUSED; - unsigned int idx; -{ - - unsigned int size = 0; - fragS *frag = segment_info[idx].frchainP->frch_root; - while (frag) - { - size = frag->fr_address; - if (frag->fr_address != size) - { - fprintf (stderr, _("Out of step\n")); - size = frag->fr_address; - } - - switch (frag->fr_type) - { -#ifdef TC_COFF_SIZEMACHDEP - case rs_machine_dependent: - size += TC_COFF_SIZEMACHDEP (frag); - break; -#endif - case rs_space: - assert (frag->fr_symbol == 0); - case rs_fill: - case rs_org: - size += frag->fr_fix; - size += frag->fr_offset * frag->fr_var; - break; - case rs_align: - case rs_align_code: - { - addressT off; - - size += frag->fr_fix; - off = relax_align (size, frag->fr_offset); - if (frag->fr_subtype != 0 && off > frag->fr_subtype) - off = 0; - size += off; - } - break; - default: - BAD_CASE (frag->fr_type); - break; - } - frag = frag->fr_next; - } - segment_info[idx].scnhdr.s_size = size; - return size; -} - - -static unsigned int -count_entries_in_chain (idx) - unsigned int idx; -{ - unsigned int nrelocs; - fixS *fixup_ptr; - - /* Count the relocations */ - fixup_ptr = segment_info[idx].fix_root; - nrelocs = 0; - while (fixup_ptr != (fixS *) NULL) - { - if (fixup_ptr->fx_done == 0 && TC_COUNT_RELOC (fixup_ptr)) - { -#ifdef TC_A29K - if (fixup_ptr->fx_r_type == RELOC_CONSTH) - nrelocs += 2; - else - nrelocs++; -#else - nrelocs++; -#endif - } - - fixup_ptr = fixup_ptr->fx_next; - } - return nrelocs; -} - -#ifdef TE_AUX - -static int compare_external_relocs PARAMS ((const PTR, const PTR)); - -/* AUX's ld expects relocations to be sorted */ -static int -compare_external_relocs (x, y) - const PTR x; - const PTR y; -{ - struct external_reloc *a = (struct external_reloc *) x; - struct external_reloc *b = (struct external_reloc *) y; - bfd_vma aadr = bfd_getb32 (a->r_vaddr); - bfd_vma badr = bfd_getb32 (b->r_vaddr); - return (aadr < badr ? -1 : badr < aadr ? 1 : 0); -} - -#endif - -/* output all the relocations for a section */ -void -do_relocs_for (abfd, h, file_cursor) - bfd * abfd; - object_headers * h; - unsigned long *file_cursor; -{ - unsigned int nrelocs; - unsigned int idx; - unsigned long reloc_start = *file_cursor; - - for (idx = SEG_E0; idx < SEG_LAST; idx++) - { - if (segment_info[idx].scnhdr.s_name[0]) - { - struct external_reloc *ext_ptr; - struct external_reloc *external_reloc_vec; - unsigned int external_reloc_size; - unsigned int base = segment_info[idx].scnhdr.s_paddr; - fixS *fix_ptr = segment_info[idx].fix_root; - nrelocs = count_entries_in_chain (idx); - - if (nrelocs) - /* Bypass this stuff if no relocs. This also incidentally - avoids a SCO bug, where free(malloc(0)) tends to crash. */ - { - external_reloc_size = nrelocs * RELSZ; - external_reloc_vec = - (struct external_reloc *) malloc (external_reloc_size); - - ext_ptr = external_reloc_vec; - - /* Fill in the internal coff style reloc struct from the - internal fix list. */ - while (fix_ptr) - { - struct internal_reloc intr; - - /* Only output some of the relocations */ - if (fix_ptr->fx_done == 0 && TC_COUNT_RELOC (fix_ptr)) - { -#ifdef TC_RELOC_MANGLE - TC_RELOC_MANGLE (&segment_info[idx], fix_ptr, &intr, - base); - -#else - symbolS *dot; - symbolS *symbol_ptr = fix_ptr->fx_addsy; - - intr.r_type = TC_COFF_FIX2RTYPE (fix_ptr); - intr.r_vaddr = - base + fix_ptr->fx_frag->fr_address + fix_ptr->fx_where; - -#ifdef TC_KEEP_FX_OFFSET - intr.r_offset = fix_ptr->fx_offset; -#else - intr.r_offset = 0; -#endif - - while (symbol_ptr->sy_value.X_op == O_symbol - && (! S_IS_DEFINED (symbol_ptr) - || S_IS_COMMON (symbol_ptr))) - { - symbolS *n; - - /* We must avoid looping, as that can occur - with a badly written program. */ - n = symbol_ptr->sy_value.X_add_symbol; - if (n == symbol_ptr) - break; - symbol_ptr = n; - } - - /* Turn the segment of the symbol into an offset. */ - if (symbol_ptr) - { - resolve_symbol_value (symbol_ptr, 1); - if (! symbol_ptr->sy_resolved) - { - char *file; - unsigned int line; - - if (expr_symbol_where (symbol_ptr, &file, &line)) - as_bad_where (file, line, - _("unresolved relocation")); - else - as_bad (_("bad relocation: symbol `%s' not in symbol table"), - S_GET_NAME (symbol_ptr)); - } - dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot; - if (dot) - { - intr.r_symndx = dot->sy_number; - } - else - { - intr.r_symndx = symbol_ptr->sy_number; - } - - } - else - { - intr.r_symndx = -1; - } -#endif - - (void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr); - ext_ptr++; - -#if defined(TC_A29K) - - /* The 29k has a special kludge for the high 16 bit - reloc. Two relocations are emited, R_IHIHALF, - and R_IHCONST. The second one doesn't contain a - symbol, but uses the value for offset. */ - - if (intr.r_type == R_IHIHALF) - { - /* now emit the second bit */ - intr.r_type = R_IHCONST; - intr.r_symndx = fix_ptr->fx_addnumber; - (void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr); - ext_ptr++; - } -#endif - } - - fix_ptr = fix_ptr->fx_next; - } - -#ifdef TE_AUX - /* Sort the reloc table */ - qsort ((PTR) external_reloc_vec, nrelocs, - sizeof (struct external_reloc), compare_external_relocs); -#endif - - /* Write out the reloc table */ - bfd_write ((PTR) external_reloc_vec, 1, external_reloc_size, - abfd); - free (external_reloc_vec); - - /* Fill in section header info. */ - segment_info[idx].scnhdr.s_relptr = *file_cursor; - *file_cursor += external_reloc_size; - segment_info[idx].scnhdr.s_nreloc = nrelocs; - } - else - { - /* No relocs */ - segment_info[idx].scnhdr.s_relptr = 0; - } - } - } - /* Set relocation_size field in file headers */ - H_SET_RELOCATION_SIZE (h, *file_cursor - reloc_start, 0); -} - - -/* run through a frag chain and write out the data to go with it, fill - in the scnhdrs with the info on the file postions -*/ -static void -fill_section (abfd, h, file_cursor) - bfd * abfd; - object_headers *h ATTRIBUTE_UNUSED; - unsigned long *file_cursor; -{ - - unsigned int i; - unsigned int paddr = 0; - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - unsigned int offset = 0; - struct internal_scnhdr *s = &(segment_info[i].scnhdr); - - PROGRESS (1); - - if (s->s_name[0]) - { - fragS *frag = segment_info[i].frchainP->frch_root; - char *buffer; - - if (s->s_size == 0) - s->s_scnptr = 0; - else - { - buffer = xmalloc (s->s_size); - s->s_scnptr = *file_cursor; - } - know (s->s_paddr == paddr); - - if (strcmp (s->s_name, ".text") == 0) - s->s_flags |= STYP_TEXT; - else if (strcmp (s->s_name, ".data") == 0) - s->s_flags |= STYP_DATA; - else if (strcmp (s->s_name, ".bss") == 0) - { - s->s_scnptr = 0; - s->s_flags |= STYP_BSS; - - /* @@ Should make the i386 and a29k coff targets define - COFF_NOLOAD_PROBLEM, and have only one test here. */ -#ifndef TC_I386 -#ifndef TC_A29K -#ifndef COFF_NOLOAD_PROBLEM - /* Apparently the SVR3 linker (and exec syscall) and UDI - mondfe progrem are confused by noload sections. */ - s->s_flags |= STYP_NOLOAD; -#endif -#endif -#endif - } - else if (strcmp (s->s_name, ".lit") == 0) - s->s_flags = STYP_LIT | STYP_TEXT; - else if (strcmp (s->s_name, ".init") == 0) - s->s_flags |= STYP_TEXT; - else if (strcmp (s->s_name, ".fini") == 0) - s->s_flags |= STYP_TEXT; - else if (strncmp (s->s_name, ".comment", 8) == 0) - s->s_flags |= STYP_INFO; - - while (frag) - { - unsigned int fill_size; - switch (frag->fr_type) - { - case rs_machine_dependent: - if (frag->fr_fix) - { - memcpy (buffer + frag->fr_address, - frag->fr_literal, - (unsigned int) frag->fr_fix); - offset += frag->fr_fix; - } - - break; - case rs_space: - assert (frag->fr_symbol == 0); - case rs_fill: - case rs_align: - case rs_align_code: - case rs_org: - if (frag->fr_fix) - { - memcpy (buffer + frag->fr_address, - frag->fr_literal, - (unsigned int) frag->fr_fix); - offset += frag->fr_fix; - } - - fill_size = frag->fr_var; - if (fill_size && frag->fr_offset > 0) - { - unsigned int count; - unsigned int off = frag->fr_fix; - for (count = frag->fr_offset; count; count--) - { - if (fill_size + frag->fr_address + off <= s->s_size) - { - memcpy (buffer + frag->fr_address + off, - frag->fr_literal + frag->fr_fix, - fill_size); - off += fill_size; - offset += fill_size; - } - } - } - break; - case rs_broken_word: - break; - default: - abort (); - } - frag = frag->fr_next; - } - - if (s->s_size != 0) - { - if (s->s_scnptr != 0) - { - bfd_write (buffer, s->s_size, 1, abfd); - *file_cursor += s->s_size; - } - free (buffer); - } - paddr += s->s_size; - } - } -} - -/* Coff file generation & utilities */ - -static void -coff_header_append (abfd, h) - bfd * abfd; - object_headers * h; -{ - unsigned int i; - char buffer[1000]; - char buffero[1000]; -#ifdef COFF_LONG_SECTION_NAMES - unsigned long string_size = 4; -#endif - - bfd_seek (abfd, 0, 0); - -#ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER - H_SET_MAGIC_NUMBER (h, COFF_MAGIC); - H_SET_VERSION_STAMP (h, 0); - H_SET_ENTRY_POINT (h, 0); - H_SET_TEXT_START (h, segment_info[SEG_E0].frchainP->frch_root->fr_address); - H_SET_DATA_START (h, segment_info[SEG_E1].frchainP->frch_root->fr_address); - H_SET_SIZEOF_OPTIONAL_HEADER (h, bfd_coff_swap_aouthdr_out(abfd, &h->aouthdr, - buffero)); -#else /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */ - H_SET_SIZEOF_OPTIONAL_HEADER (h, 0); -#endif /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */ - - i = bfd_coff_swap_filehdr_out (abfd, &h->filehdr, buffer); - - bfd_write (buffer, i, 1, abfd); - bfd_write (buffero, H_GET_SIZEOF_OPTIONAL_HEADER (h), 1, abfd); - - for (i = SEG_E0; i < SEG_LAST; i++) - { - if (segment_info[i].scnhdr.s_name[0]) - { - unsigned int size; - -#ifdef COFF_LONG_SECTION_NAMES - /* Support long section names as found in PE. This code - must coordinate with that in write_object_file and - w_strings. */ - if (strlen (segment_info[i].name) > SCNNMLEN) - { - memset (segment_info[i].scnhdr.s_name, 0, SCNNMLEN); - sprintf (segment_info[i].scnhdr.s_name, "/%lu", string_size); - string_size += strlen (segment_info[i].name) + 1; - } -#endif - - size = bfd_coff_swap_scnhdr_out (abfd, - &(segment_info[i].scnhdr), - buffer); - if (size == 0) - as_bad (_("bfd_coff_swap_scnhdr_out failed")); - bfd_write (buffer, size, 1, abfd); - } - } -} - - -char * -symbol_to_chars (abfd, where, symbolP) - bfd * abfd; - char *where; - symbolS * symbolP; -{ - unsigned int numaux = symbolP->sy_symbol.ost_entry.n_numaux; - unsigned int i; - valueT val; - - /* Turn any symbols with register attributes into abs symbols */ - if (S_GET_SEGMENT (symbolP) == reg_section) - { - S_SET_SEGMENT (symbolP, absolute_section); - } - /* At the same time, relocate all symbols to their output value */ - -#ifndef TE_PE - val = (segment_info[S_GET_SEGMENT (symbolP)].scnhdr.s_paddr - + S_GET_VALUE (symbolP)); -#else - val = S_GET_VALUE (symbolP); -#endif - - S_SET_VALUE (symbolP, val); - - symbolP->sy_symbol.ost_entry.n_value = val; - - where += bfd_coff_swap_sym_out (abfd, &symbolP->sy_symbol.ost_entry, - where); - - for (i = 0; i < numaux; i++) - { - where += bfd_coff_swap_aux_out (abfd, - &symbolP->sy_symbol.ost_auxent[i], - S_GET_DATA_TYPE (symbolP), - S_GET_STORAGE_CLASS (symbolP), - i, numaux, where); - } - return where; - -} - -void -coff_obj_symbol_new_hook (symbolP) - symbolS *symbolP; -{ - char underscore = 0; /* Symbol has leading _ */ - - /* Effective symbol */ - /* Store the pointer in the offset. */ - S_SET_ZEROES (symbolP, 0L); - S_SET_DATA_TYPE (symbolP, T_NULL); - S_SET_STORAGE_CLASS (symbolP, 0); - S_SET_NUMBER_AUXILIARY (symbolP, 0); - /* Additional information */ - symbolP->sy_symbol.ost_flags = 0; - /* Auxiliary entries */ - memset ((char *) &symbolP->sy_symbol.ost_auxent[0], 0, AUXESZ); - - if (S_IS_STRING (symbolP)) - SF_SET_STRING (symbolP); - if (!underscore && S_IS_LOCAL (symbolP)) - SF_SET_LOCAL (symbolP); -} - -/* - * Handle .ln directives. - */ - -static void -obj_coff_ln (appline) - int appline; -{ - int l; - - if (! appline && def_symbol_in_progress != NULL) - { - as_warn (_(".ln pseudo-op inside .def/.endef: ignored.")); - demand_empty_rest_of_line (); - return; - } /* wrong context */ - - l = get_absolute_expression (); - c_line_new (0, frag_now_fix (), l, frag_now); - - if (appline) - new_logical_line ((char *) NULL, l - 1); - -#ifndef NO_LISTING - { - extern int listing; - - if (listing) - { - if (! appline) - l += line_base - 1; - listing_source_line ((unsigned int) l); - } - - } -#endif - demand_empty_rest_of_line (); -} - -/* - * def() - * - * Handle .def directives. - * - * One might ask : why can't we symbol_new if the symbol does not - * already exist and fill it with debug information. Because of - * the C_EFCN special symbol. It would clobber the value of the - * function symbol before we have a chance to notice that it is - * a C_EFCN. And a second reason is that the code is more clear this - * way. (at least I think it is :-). - * - */ - -#define SKIP_SEMI_COLON() while (*input_line_pointer++ != ';') -#define SKIP_WHITESPACES() while (*input_line_pointer == ' ' || \ - *input_line_pointer == '\t') \ - input_line_pointer++; - -static void -obj_coff_def (what) - int what ATTRIBUTE_UNUSED; -{ - char name_end; /* Char after the end of name */ - char *symbol_name; /* Name of the debug symbol */ - char *symbol_name_copy; /* Temporary copy of the name */ - unsigned int symbol_name_length; - - if (def_symbol_in_progress != NULL) - { - as_warn (_(".def pseudo-op used inside of .def/.endef: ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - SKIP_WHITESPACES (); - - def_symbol_in_progress = (symbolS *) obstack_alloc (¬es, sizeof (*def_symbol_in_progress)); - memset (def_symbol_in_progress, 0, sizeof (*def_symbol_in_progress)); - - symbol_name = input_line_pointer; - name_end = get_symbol_end (); - symbol_name_length = strlen (symbol_name); - symbol_name_copy = xmalloc (symbol_name_length + 1); - strcpy (symbol_name_copy, symbol_name); -#ifdef tc_canonicalize_symbol_name - symbol_name_copy = tc_canonicalize_symbol_name (symbol_name_copy); -#endif - - /* Initialize the new symbol */ -#ifdef STRIP_UNDERSCORE - S_SET_NAME (def_symbol_in_progress, (*symbol_name_copy == '_' - ? symbol_name_copy + 1 - : symbol_name_copy)); -#else /* STRIP_UNDERSCORE */ - S_SET_NAME (def_symbol_in_progress, symbol_name_copy); -#endif /* STRIP_UNDERSCORE */ - /* free(symbol_name_copy); */ - def_symbol_in_progress->sy_name_offset = (unsigned long) ~0; - def_symbol_in_progress->sy_number = ~0; - def_symbol_in_progress->sy_frag = &zero_address_frag; - S_SET_VALUE (def_symbol_in_progress, 0); - - if (S_IS_STRING (def_symbol_in_progress)) - SF_SET_STRING (def_symbol_in_progress); - - *input_line_pointer = name_end; - - demand_empty_rest_of_line (); -} - -unsigned int dim_index; - - -static void -obj_coff_endef (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - symbolS *symbolP = 0; - /* DIM BUG FIX sac@cygnus.com */ - dim_index = 0; - if (def_symbol_in_progress == NULL) - { - as_warn (_(".endef pseudo-op used outside of .def/.endef: ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - /* Set the section number according to storage class. */ - switch (S_GET_STORAGE_CLASS (def_symbol_in_progress)) - { - case C_STRTAG: - case C_ENTAG: - case C_UNTAG: - SF_SET_TAG (def_symbol_in_progress); - /* intentional fallthrough */ - case C_FILE: - case C_TPDEF: - SF_SET_DEBUG (def_symbol_in_progress); - S_SET_SEGMENT (def_symbol_in_progress, SEG_DEBUG); - break; - - case C_EFCN: - SF_SET_LOCAL (def_symbol_in_progress); /* Do not emit this symbol. */ - /* intentional fallthrough */ - case C_BLOCK: - SF_SET_PROCESS (def_symbol_in_progress); /* Will need processing before writing */ - /* intentional fallthrough */ - case C_FCN: - S_SET_SEGMENT (def_symbol_in_progress, SEG_E0); - - if (strcmp (S_GET_NAME (def_symbol_in_progress), ".bf") == 0) - { /* .bf */ - if (function_lineoff < 0) - { - fprintf (stderr, _("`.bf' symbol without preceding function\n")); - } /* missing function symbol */ - SA_GET_SYM_LNNOPTR (last_line_symbol) = function_lineoff; - - SF_SET_PROCESS (last_line_symbol); - SF_SET_ADJ_LNNOPTR (last_line_symbol); - SF_SET_PROCESS (def_symbol_in_progress); - function_lineoff = -1; - } - /* Value is always set to . */ - def_symbol_in_progress->sy_frag = frag_now; - S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ()); - break; - -#ifdef C_AUTOARG - case C_AUTOARG: -#endif /* C_AUTOARG */ - case C_AUTO: - case C_REG: - case C_MOS: - case C_MOE: - case C_MOU: - case C_ARG: - case C_REGPARM: - case C_FIELD: - case C_EOS: - SF_SET_DEBUG (def_symbol_in_progress); - S_SET_SEGMENT (def_symbol_in_progress, absolute_section); - break; - - case C_EXT: - case C_WEAKEXT: -#ifdef TE_PE - case C_NT_WEAK: -#endif - case C_STAT: - case C_LABEL: - /* Valid but set somewhere else (s_comm, s_lcomm, colon) */ - break; - - case C_USTATIC: - case C_EXTDEF: - case C_ULABEL: - as_warn (_("unexpected storage class %d"), S_GET_STORAGE_CLASS (def_symbol_in_progress)); - break; - } /* switch on storage class */ - - /* Now that we have built a debug symbol, try to find if we should - merge with an existing symbol or not. If a symbol is C_EFCN or - absolute_section or untagged SEG_DEBUG it never merges. We also - don't merge labels, which are in a different namespace, nor - symbols which have not yet been defined since they are typically - unique, nor do we merge tags with non-tags. */ - - /* Two cases for functions. Either debug followed by definition or - definition followed by debug. For definition first, we will - merge the debug symbol into the definition. For debug first, the - lineno entry MUST point to the definition function or else it - will point off into space when crawl_symbols() merges the debug - symbol into the real symbol. Therefor, let's presume the debug - symbol is a real function reference. */ - - /* FIXME-SOON If for some reason the definition label/symbol is - never seen, this will probably leave an undefined symbol at link - time. */ - - if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN - || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL - || (S_GET_SEGMENT (def_symbol_in_progress) == SEG_DEBUG - && !SF_GET_TAG (def_symbol_in_progress)) - || S_GET_SEGMENT (def_symbol_in_progress) == absolute_section - || def_symbol_in_progress->sy_value.X_op != O_constant - || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress), DO_NOT_STRIP)) == NULL - || (SF_GET_TAG (def_symbol_in_progress) != SF_GET_TAG (symbolP))) - { - symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, - &symbol_lastP); - } - else - { - /* This symbol already exists, merge the newly created symbol - into the old one. This is not mandatory. The linker can - handle duplicate symbols correctly. But I guess that it save - a *lot* of space if the assembly file defines a lot of - symbols. [loic] */ - - /* The debug entry (def_symbol_in_progress) is merged into the - previous definition. */ - - c_symbol_merge (def_symbol_in_progress, symbolP); - /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich. */ - def_symbol_in_progress = symbolP; - - if (SF_GET_FUNCTION (def_symbol_in_progress) - || SF_GET_TAG (def_symbol_in_progress) - || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_STAT) - { - /* For functions, and tags, and static symbols, the symbol - *must* be where the debug symbol appears. Move the - existing symbol to the current place. */ - /* If it already is at the end of the symbol list, do nothing */ - if (def_symbol_in_progress != symbol_lastP) - { - symbol_remove (def_symbol_in_progress, &symbol_rootP, - &symbol_lastP); - symbol_append (def_symbol_in_progress, symbol_lastP, - &symbol_rootP, &symbol_lastP); - } /* if not already in place */ - } /* if function */ - } /* normal or mergable */ - - if (SF_GET_TAG (def_symbol_in_progress)) - { - symbolS *oldtag; - - oldtag = symbol_find_base (S_GET_NAME (def_symbol_in_progress), - DO_NOT_STRIP); - if (oldtag == NULL || ! SF_GET_TAG (oldtag)) - tag_insert (S_GET_NAME (def_symbol_in_progress), - def_symbol_in_progress); - } - - if (SF_GET_FUNCTION (def_symbol_in_progress)) - { - know (sizeof (def_symbol_in_progress) <= sizeof (long)); - function_lineoff - = c_line_new (def_symbol_in_progress, 0, 0, &zero_address_frag); - - SF_SET_PROCESS (def_symbol_in_progress); - - if (symbolP == NULL) - { - /* That is, if this is the first time we've seen the - function... */ - symbol_table_insert (def_symbol_in_progress); - } /* definition follows debug */ - } /* Create the line number entry pointing to the function being defined */ - - def_symbol_in_progress = NULL; - demand_empty_rest_of_line (); -} - -static void -obj_coff_dim (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - int dim_index; - - if (def_symbol_in_progress == NULL) - { - as_warn (_(".dim pseudo-op used outside of .def/.endef: ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1); - - for (dim_index = 0; dim_index < DIMNUM; dim_index++) - { - SKIP_WHITESPACES (); - SA_SET_SYM_DIMEN (def_symbol_in_progress, dim_index, - get_absolute_expression ()); - - switch (*input_line_pointer) - { - case ',': - input_line_pointer++; - break; - - default: - as_warn (_("badly formed .dim directive ignored")); - /* intentional fallthrough */ - case '\n': - case ';': - dim_index = DIMNUM; - break; - } - } - - demand_empty_rest_of_line (); -} - -static void -obj_coff_line (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - int this_base; - const char *name; - - if (def_symbol_in_progress == NULL) - { - obj_coff_ln (0); - return; - } - - name = S_GET_NAME (def_symbol_in_progress); - this_base = get_absolute_expression (); - - /* Only .bf symbols indicate the use of a new base line number; the - line numbers associated with .ef, .bb, .eb are relative to the - start of the containing function. */ - if (!strcmp (".bf", name)) - { -#if 0 /* XXX Can we ever have line numbers going backwards? */ - if (this_base > line_base) -#endif - { - line_base = this_base; - } - -#ifndef NO_LISTING - { - extern int listing; - if (listing) - { - listing_source_line ((unsigned int) line_base); - } - } -#endif - } - - S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1); - SA_SET_SYM_LNNO (def_symbol_in_progress, this_base); - - demand_empty_rest_of_line (); -} - -static void -obj_coff_size (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (def_symbol_in_progress == NULL) - { - as_warn (_(".size pseudo-op used outside of .def/.endef ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1); - SA_SET_SYM_SIZE (def_symbol_in_progress, get_absolute_expression ()); - demand_empty_rest_of_line (); -} - -static void -obj_coff_scl (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (def_symbol_in_progress == NULL) - { - as_warn (_(".scl pseudo-op used outside of .def/.endef ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - S_SET_STORAGE_CLASS (def_symbol_in_progress, get_absolute_expression ()); - demand_empty_rest_of_line (); -} - -static void -obj_coff_tag (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *symbol_name; - char name_end; - - if (def_symbol_in_progress == NULL) - { - as_warn (_(".tag pseudo-op used outside of .def/.endef ignored.")); - demand_empty_rest_of_line (); - return; - } - - S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1); - symbol_name = input_line_pointer; - name_end = get_symbol_end (); -#ifdef tc_canonicalize_symbol_name - symbol_name = tc_canonicalize_symbol_name (symbol_name); -#endif - - /* Assume that the symbol referred to by .tag is always defined. - This was a bad assumption. I've added find_or_make. xoxorich. */ - SA_SET_SYM_TAGNDX (def_symbol_in_progress, - (long) tag_find_or_make (symbol_name)); - if (SA_GET_SYM_TAGNDX (def_symbol_in_progress) == 0L) - { - as_warn (_("tag not found for .tag %s"), symbol_name); - } /* not defined */ - - SF_SET_TAGGED (def_symbol_in_progress); - *input_line_pointer = name_end; - - demand_empty_rest_of_line (); -} - -static void -obj_coff_type (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (def_symbol_in_progress == NULL) - { - as_warn (_(".type pseudo-op used outside of .def/.endef ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - S_SET_DATA_TYPE (def_symbol_in_progress, get_absolute_expression ()); - - if (ISFCN (S_GET_DATA_TYPE (def_symbol_in_progress)) && - S_GET_STORAGE_CLASS (def_symbol_in_progress) != C_TPDEF) - { - SF_SET_FUNCTION (def_symbol_in_progress); - } /* is a function */ - - demand_empty_rest_of_line (); -} - -static void -obj_coff_val (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (def_symbol_in_progress == NULL) - { - as_warn (_(".val pseudo-op used outside of .def/.endef ignored.")); - demand_empty_rest_of_line (); - return; - } /* if not inside .def/.endef */ - - if (is_name_beginner (*input_line_pointer)) - { - char *symbol_name = input_line_pointer; - char name_end = get_symbol_end (); - -#ifdef tc_canonicalize_symbol_name - symbol_name = tc_canonicalize_symbol_name (symbol_name); -#endif - - if (!strcmp (symbol_name, ".")) - { - def_symbol_in_progress->sy_frag = frag_now; - S_SET_VALUE (def_symbol_in_progress, (valueT) frag_now_fix ()); - /* If the .val is != from the .def (e.g. statics) */ - } - else if (strcmp (S_GET_NAME (def_symbol_in_progress), symbol_name)) - { - def_symbol_in_progress->sy_value.X_op = O_symbol; - def_symbol_in_progress->sy_value.X_add_symbol = - symbol_find_or_make (symbol_name); - def_symbol_in_progress->sy_value.X_op_symbol = NULL; - def_symbol_in_progress->sy_value.X_add_number = 0; - - /* If the segment is undefined when the forward reference is - resolved, then copy the segment id from the forward - symbol. */ - SF_SET_GET_SEGMENT (def_symbol_in_progress); - - /* FIXME: gcc can generate address expressions here in - unusual cases (search for "obscure" in sdbout.c). We - just ignore the offset here, thus generating incorrect - debugging information. We ignore the rest of the line - just below. */ - } - /* Otherwise, it is the name of a non debug symbol and - its value will be calculated later. */ - *input_line_pointer = name_end; - - /* FIXME: this is to avoid an error message in the - FIXME case mentioned just above. */ - while (! is_end_of_line[(unsigned char) *input_line_pointer]) - ++input_line_pointer; - } - else - { - S_SET_VALUE (def_symbol_in_progress, - (valueT) get_absolute_expression ()); - } /* if symbol based */ - - demand_empty_rest_of_line (); -} - -#ifdef TE_PE - -/* Handle the .linkonce pseudo-op. This is parsed by s_linkonce in - read.c, which then calls this object file format specific routine. */ - -void -obj_coff_pe_handle_link_once (type) - enum linkonce_type type; -{ - seg_info (now_seg)->scnhdr.s_flags |= IMAGE_SCN_LNK_COMDAT; - - /* We store the type in the seg_info structure, and use it to set up - the auxiliary entry for the section symbol in c_section_symbol. */ - seg_info (now_seg)->linkonce = type; -} - -#endif /* TE_PE */ - -void -coff_obj_read_begin_hook () -{ - /* These had better be the same. Usually 18 bytes. */ -#ifndef BFD_HEADERS - know (sizeof (SYMENT) == sizeof (AUXENT)); - know (SYMESZ == AUXESZ); -#endif - tag_init (); -} - -/* This function runs through the symbol table and puts all the - externals onto another chain */ - -/* The chain of globals. */ -symbolS *symbol_globalP; -symbolS *symbol_global_lastP; - -/* The chain of externals */ -symbolS *symbol_externP; -symbolS *symbol_extern_lastP; - -stack *block_stack; -symbolS *last_functionP; -static symbolS *last_bfP; -symbolS *last_tagP; - -static unsigned int -yank_symbols () -{ - symbolS *symbolP; - unsigned int symbol_number = 0; - unsigned int last_file_symno = 0; - - struct filename_list *filename_list_scan = filename_list_head; - - for (symbolP = symbol_rootP; - symbolP; - symbolP = symbolP ? symbol_next (symbolP) : symbol_rootP) - { - if (symbolP->sy_mri_common) - { - if (S_GET_STORAGE_CLASS (symbolP) == C_EXT -#ifdef TE_PE - || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK -#endif - || S_GET_STORAGE_CLASS (symbolP) == C_WEAKEXT) - as_bad (_("%s: global symbols not supported in common sections"), - S_GET_NAME (symbolP)); - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - continue; - } - - if (!SF_GET_DEBUG (symbolP)) - { - /* Debug symbols do not need all this rubbish */ - symbolS *real_symbolP; - - /* L* and C_EFCN symbols never merge. */ - if (!SF_GET_LOCAL (symbolP) - && !SF_GET_STATICS (symbolP) - && S_GET_STORAGE_CLASS (symbolP) != C_LABEL - && symbolP->sy_value.X_op == O_constant - && (real_symbolP = symbol_find_base (S_GET_NAME (symbolP), DO_NOT_STRIP)) - && real_symbolP != symbolP) - { - /* FIXME-SOON: where do dups come from? - Maybe tag references before definitions? xoxorich. */ - /* Move the debug data from the debug symbol to the - real symbol. Do NOT do the oposite (i.e. move from - real symbol to debug symbol and remove real symbol from the - list.) Because some pointers refer to the real symbol - whereas no pointers refer to the debug symbol. */ - c_symbol_merge (symbolP, real_symbolP); - /* Replace the current symbol by the real one */ - /* The symbols will never be the last or the first - because : 1st symbol is .file and 3 last symbols are - .text, .data, .bss */ - symbol_remove (real_symbolP, &symbol_rootP, &symbol_lastP); - symbol_insert (real_symbolP, symbolP, &symbol_rootP, &symbol_lastP); - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - symbolP = real_symbolP; - } /* if not local but dup'd */ - - if (flag_readonly_data_in_text && (S_GET_SEGMENT (symbolP) == SEG_E1)) - { - S_SET_SEGMENT (symbolP, SEG_E0); - } /* push data into text */ - - resolve_symbol_value (symbolP, 1); - - if (S_GET_STORAGE_CLASS (symbolP) == C_NULL) - { - if (!S_IS_DEFINED (symbolP) && !SF_GET_LOCAL (symbolP)) - { - S_SET_EXTERNAL (symbolP); - } - else if (S_GET_SEGMENT (symbolP) == SEG_E0) - { - S_SET_STORAGE_CLASS (symbolP, C_LABEL); - } - else - { - S_SET_STORAGE_CLASS (symbolP, C_STAT); - } - } - - /* Mainly to speed up if not -g */ - if (SF_GET_PROCESS (symbolP)) - { - /* Handle the nested blocks auxiliary info. */ - if (S_GET_STORAGE_CLASS (symbolP) == C_BLOCK) - { - if (!strcmp (S_GET_NAME (symbolP), ".bb")) - stack_push (block_stack, (char *) &symbolP); - else - { /* .eb */ - register symbolS *begin_symbolP; - begin_symbolP = *(symbolS **) stack_pop (block_stack); - if (begin_symbolP == (symbolS *) 0) - as_warn (_("mismatched .eb")); - else - SA_SET_SYM_ENDNDX (begin_symbolP, symbol_number + 2); - } - } - /* If we are able to identify the type of a function, and we - are out of a function (last_functionP == 0) then, the - function symbol will be associated with an auxiliary - entry. */ - if (last_functionP == (symbolS *) 0 && - SF_GET_FUNCTION (symbolP)) - { - last_functionP = symbolP; - - if (S_GET_NUMBER_AUXILIARY (symbolP) < 1) - { - S_SET_NUMBER_AUXILIARY (symbolP, 1); - } /* make it at least 1 */ - - /* Clobber possible stale .dim information. */ -#if 0 - /* Iffed out by steve - this fries the lnnoptr info too */ - bzero (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen, - sizeof (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen)); -#endif - } - if (S_GET_STORAGE_CLASS (symbolP) == C_FCN) - { - if (strcmp (S_GET_NAME (symbolP), ".bf") == 0) - { - if (last_bfP != NULL) - SA_SET_SYM_ENDNDX (last_bfP, symbol_number); - last_bfP = symbolP; - } - } - else if (S_GET_STORAGE_CLASS (symbolP) == C_EFCN) - { - /* I don't even know if this is needed for sdb. But - the standard assembler generates it, so... */ - if (last_functionP == (symbolS *) 0) - as_fatal (_("C_EFCN symbol out of scope")); - SA_SET_SYM_FSIZE (last_functionP, - (long) (S_GET_VALUE (symbolP) - - S_GET_VALUE (last_functionP))); - SA_SET_SYM_ENDNDX (last_functionP, symbol_number); - last_functionP = (symbolS *) 0; - } - } - } - else if (SF_GET_TAG (symbolP)) - { - /* First descriptor of a structure must point to - the first slot after the structure description. */ - last_tagP = symbolP; - - } - else if (S_GET_STORAGE_CLASS (symbolP) == C_EOS) - { - /* +2 take in account the current symbol */ - SA_SET_SYM_ENDNDX (last_tagP, symbol_number + 2); - } - else if (S_GET_STORAGE_CLASS (symbolP) == C_FILE) - { - /* If the filename was too long to fit in the - auxent, put it in the string table */ - if (SA_GET_FILE_FNAME_ZEROS (symbolP) == 0 - && SA_GET_FILE_FNAME_OFFSET (symbolP) != 0) - { - SA_SET_FILE_FNAME_OFFSET (symbolP, string_byte_count); - string_byte_count += strlen (filename_list_scan->filename) + 1; - filename_list_scan = filename_list_scan->next; - } - if (S_GET_VALUE (symbolP)) - { - S_SET_VALUE (symbolP, last_file_symno); - last_file_symno = symbol_number; - } /* no one points at the first .file symbol */ - } /* if debug or tag or eos or file */ - -#ifdef tc_frob_coff_symbol - tc_frob_coff_symbol (symbolP); -#endif - - /* We must put the external symbols apart. The loader - does not bomb if we do not. But the references in - the endndx field for a .bb symbol are not corrected - if an external symbol is removed between .bb and .be. - I.e in the following case : - [20] .bb endndx = 22 - [21] foo external - [22] .be - ld will move the symbol 21 to the end of the list but - endndx will still be 22 instead of 21. */ - - - if (SF_GET_LOCAL (symbolP)) - { - /* remove C_EFCN and LOCAL (L...) symbols */ - /* next pointer remains valid */ - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - - } - else if (symbolP->sy_value.X_op == O_symbol - && (! S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))) - { - /* Skip symbols which were equated to undefined or common - symbols. */ - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - } - else if (!S_IS_DEFINED (symbolP) - && !S_IS_DEBUG (symbolP) - && !SF_GET_STATICS (symbolP) - && (S_GET_STORAGE_CLASS (symbolP) == C_EXT -#ifdef TE_PE - || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK -#endif - || S_GET_STORAGE_CLASS (symbolP) == C_WEAKEXT)) - { - /* if external, Remove from the list */ - symbolS *hold = symbol_previous (symbolP); - - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - symbol_clear_list_pointers (symbolP); - symbol_append (symbolP, symbol_extern_lastP, &symbol_externP, &symbol_extern_lastP); - symbolP = hold; - } - else if (! S_IS_DEBUG (symbolP) - && ! SF_GET_STATICS (symbolP) - && ! SF_GET_FUNCTION (symbolP) - && (S_GET_STORAGE_CLASS (symbolP) == C_EXT -#ifdef TE_PE - || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK -#endif - || S_GET_STORAGE_CLASS (symbolP) == C_NT_WEAK)) - { - symbolS *hold = symbol_previous (symbolP); - - /* The O'Reilly COFF book says that defined global symbols - come at the end of the symbol table, just before - undefined global symbols. */ - - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - symbol_clear_list_pointers (symbolP); - symbol_append (symbolP, symbol_global_lastP, &symbol_globalP, - &symbol_global_lastP); - symbolP = hold; - } - else - { - if (SF_GET_STRING (symbolP)) - { - symbolP->sy_name_offset = string_byte_count; - string_byte_count += strlen (S_GET_NAME (symbolP)) + 1; - } - else - { - symbolP->sy_name_offset = 0; - } /* fix "long" names */ - - symbolP->sy_number = symbol_number; - symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP); - } /* if local symbol */ - } /* traverse the symbol list */ - return symbol_number; - -} - - -static unsigned int -glue_symbols (head, tail) - symbolS **head; - symbolS **tail; -{ - unsigned int symbol_number = 0; - - while (*head != NULL) - { - symbolS *tmp = *head; - - /* append */ - symbol_remove (tmp, head, tail); - symbol_append (tmp, symbol_lastP, &symbol_rootP, &symbol_lastP); - - /* and process */ - if (SF_GET_STRING (tmp)) - { - tmp->sy_name_offset = string_byte_count; - string_byte_count += strlen (S_GET_NAME (tmp)) + 1; - } - else - { - tmp->sy_name_offset = 0; - } /* fix "long" names */ - - tmp->sy_number = symbol_number; - symbol_number += 1 + S_GET_NUMBER_AUXILIARY (tmp); - } /* append the entire extern chain */ - - return symbol_number; -} - -static unsigned int -tie_tags () -{ - unsigned int symbol_number = 0; - symbolS *symbolP; - - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - symbolP->sy_number = symbol_number; - - if (SF_GET_TAGGED (symbolP)) - { - SA_SET_SYM_TAGNDX - (symbolP, - ((symbolS *) SA_GET_SYM_TAGNDX (symbolP))->sy_number); - } - - symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP); - } - - return symbol_number; -} - -static void -crawl_symbols (h, abfd) - object_headers *h; - bfd *abfd ATTRIBUTE_UNUSED; -{ - unsigned int i; - - /* Initialize the stack used to keep track of the matching .bb .be */ - - block_stack = stack_init (512, sizeof (symbolS *)); - - /* The symbol list should be ordered according to the following sequence - * order : - * . .file symbol - * . debug entries for functions - * . fake symbols for the sections, including .text .data and .bss - * . defined symbols - * . undefined symbols - * But this is not mandatory. The only important point is to put the - * undefined symbols at the end of the list. - */ - - /* Is there a .file symbol ? If not insert one at the beginning. */ - if (symbol_rootP == NULL - || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE) - { - c_dot_file_symbol ("fake"); - } - - /* - * Build up static symbols for the sections, they are filled in later - */ - - - for (i = SEG_E0; i < SEG_LAST; i++) - if (segment_info[i].scnhdr.s_name[0]) - segment_info[i].dot = c_section_symbol (segment_info[i].name, - i - SEG_E0 + 1); - - /* Take all the externals out and put them into another chain */ - H_SET_SYMBOL_TABLE_SIZE (h, yank_symbols ()); - /* Take the externals and glue them onto the end.*/ - H_SET_SYMBOL_TABLE_SIZE (h, - (H_GET_SYMBOL_COUNT (h) - + glue_symbols (&symbol_globalP, - &symbol_global_lastP) - + glue_symbols (&symbol_externP, - &symbol_extern_lastP))); - - H_SET_SYMBOL_TABLE_SIZE (h, tie_tags ()); - know (symbol_globalP == NULL); - know (symbol_global_lastP == NULL); - know (symbol_externP == NULL); - know (symbol_extern_lastP == NULL); -} - -/* - * Find strings by crawling along symbol table chain. - */ - -void -w_strings (where) - char *where; -{ - symbolS *symbolP; - struct filename_list *filename_list_scan = filename_list_head; - - /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */ - md_number_to_chars (where, (valueT) string_byte_count, 4); - where += 4; - -#ifdef COFF_LONG_SECTION_NAMES - /* Support long section names as found in PE. This code must - coordinate with that in coff_header_append and write_object_file. */ - { - unsigned int i; - - for (i = SEG_E0; i < SEG_LAST; i++) - { - if (segment_info[i].scnhdr.s_name[0] - && strlen (segment_info[i].name) > SCNNMLEN) - { - unsigned int size; - - size = strlen (segment_info[i].name) + 1; - memcpy (where, segment_info[i].name, size); - where += size; - } - } - } -#endif /* COFF_LONG_SECTION_NAMES */ - - for (symbolP = symbol_rootP; - symbolP; - symbolP = symbol_next (symbolP)) - { - unsigned int size; - - if (SF_GET_STRING (symbolP)) - { - size = strlen (S_GET_NAME (symbolP)) + 1; - memcpy (where, S_GET_NAME (symbolP), size); - where += size; - } - if (S_GET_STORAGE_CLASS (symbolP) == C_FILE - && SA_GET_FILE_FNAME_ZEROS (symbolP) == 0 - && SA_GET_FILE_FNAME_OFFSET (symbolP) != 0) - { - size = strlen (filename_list_scan->filename) + 1; - memcpy (where, filename_list_scan->filename, size); - filename_list_scan = filename_list_scan ->next; - where += size; - } - } -} - -static void -do_linenos_for (abfd, h, file_cursor) - bfd * abfd; - object_headers * h; - unsigned long *file_cursor; -{ - unsigned int idx; - unsigned long start = *file_cursor; - - for (idx = SEG_E0; idx < SEG_LAST; idx++) - { - segment_info_type *s = segment_info + idx; - - - if (s->scnhdr.s_nlnno != 0) - { - struct lineno_list *line_ptr; - - struct external_lineno *buffer = - (struct external_lineno *) xmalloc (s->scnhdr.s_nlnno * LINESZ); - - struct external_lineno *dst = buffer; - - /* Run through the table we've built and turn it into its external - form, take this chance to remove duplicates */ - - for (line_ptr = s->lineno_list_head; - line_ptr != (struct lineno_list *) NULL; - line_ptr = line_ptr->next) - { - - if (line_ptr->line.l_lnno == 0) - { - /* Turn a pointer to a symbol into the symbols' index */ - line_ptr->line.l_addr.l_symndx = - ((symbolS *) line_ptr->line.l_addr.l_symndx)->sy_number; - } - else - { - line_ptr->line.l_addr.l_paddr += ((struct frag *) (line_ptr->frag))->fr_address; - } - - - (void) bfd_coff_swap_lineno_out (abfd, &(line_ptr->line), dst); - dst++; - - } - - s->scnhdr.s_lnnoptr = *file_cursor; - - bfd_write (buffer, 1, s->scnhdr.s_nlnno * LINESZ, abfd); - free (buffer); - - *file_cursor += s->scnhdr.s_nlnno * LINESZ; - } - } - H_SET_LINENO_SIZE (h, *file_cursor - start); -} - - -/* Now we run through the list of frag chains in a segment and - make all the subsegment frags appear at the end of the - list, as if the seg 0 was extra long */ - -static void -remove_subsegs () -{ - unsigned int i; - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - frchainS *head = segment_info[i].frchainP; - fragS dummy; - fragS *prev_frag = &dummy; - - while (head && head->frch_seg == i) - { - prev_frag->fr_next = head->frch_root; - prev_frag = head->frch_last; - head = head->frch_next; - } - prev_frag->fr_next = 0; - } -} - -unsigned long machine; -int coff_flags; -extern void -write_object_file () -{ - int i; - const char *name; - struct frchain *frchain_ptr; - - object_headers headers; - unsigned long file_cursor; - bfd *abfd; - unsigned int addr; - abfd = bfd_openw (out_file_name, TARGET_FORMAT); - - - if (abfd == 0) - { - as_perror (_("FATAL: Can't create %s"), out_file_name); - exit (EXIT_FAILURE); - } - bfd_set_format (abfd, bfd_object); - bfd_set_arch_mach (abfd, BFD_ARCH, machine); - - string_byte_count = 4; - - for (frchain_ptr = frchain_root; - frchain_ptr != (struct frchain *) NULL; - frchain_ptr = frchain_ptr->frch_next) - { - /* Run through all the sub-segments and align them up. Also - close any open frags. We tack a .fill onto the end of the - frag chain so that any .align's size can be worked by looking - at the next frag. */ - - subseg_set (frchain_ptr->frch_seg, frchain_ptr->frch_subseg); - -#ifndef SUB_SEGMENT_ALIGN -#define SUB_SEGMENT_ALIGN(SEG) 1 -#endif -#ifdef md_do_align - md_do_align (SUB_SEGMENT_ALIGN (now_seg), (char *) NULL, 0, 0, - alignment_done); -#endif - frag_align (SUB_SEGMENT_ALIGN (now_seg), - subseg_text_p (now_seg) ? NOP_OPCODE : 0, - 0); -#ifdef md_do_align - alignment_done: -#endif - frag_wane (frag_now); - frag_now->fr_fix = 0; - know (frag_now->fr_next == NULL); - } - - - remove_subsegs (); - - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - relax_segment (segment_info[i].frchainP->frch_root, i); - } - - H_SET_NUMBER_OF_SECTIONS (&headers, 0); - - /* Find out how big the sections are, and set the addresses. */ - addr = 0; - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - long size; - - segment_info[i].scnhdr.s_paddr = addr; - segment_info[i].scnhdr.s_vaddr = addr; - - if (segment_info[i].scnhdr.s_name[0]) - { - H_SET_NUMBER_OF_SECTIONS (&headers, - H_GET_NUMBER_OF_SECTIONS (&headers) + 1); - -#ifdef COFF_LONG_SECTION_NAMES - /* Support long section names as found in PE. This code - must coordinate with that in coff_header_append and - w_strings. */ - { - unsigned int len; - - len = strlen (segment_info[i].name); - if (len > SCNNMLEN) - string_byte_count += len + 1; - } -#endif /* COFF_LONG_SECTION_NAMES */ - } - - size = size_section (abfd, (unsigned int) i); - addr += size; - - /* I think the section alignment is only used on the i960; the - i960 needs it, and it should do no harm on other targets. */ -#ifdef ALIGNMENT_IN_S_FLAGS - segment_info[i].scnhdr.s_flags |= (section_alignment[i] & 0xF) << 8; -#else - segment_info[i].scnhdr.s_align = 1 << section_alignment[i]; -#endif - - if (i == SEG_E0) - H_SET_TEXT_SIZE (&headers, size); - else if (i == SEG_E1) - H_SET_DATA_SIZE (&headers, size); - else if (i == SEG_E2) - H_SET_BSS_SIZE (&headers, size); - } - - /* Turn the gas native symbol table shape into a coff symbol table */ - crawl_symbols (&headers, abfd); - - if (string_byte_count == 4) - string_byte_count = 0; - - H_SET_STRING_SIZE (&headers, string_byte_count); - -#ifdef tc_frob_file - tc_frob_file (); -#endif - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - fixup_mdeps (segment_info[i].frchainP->frch_root, &headers, i); - fixup_segment (&segment_info[i], i); - } - - /* Look for ".stab" segments and fill in their initial symbols - correctly. */ - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - name = segment_info[i].name; - - if (name != NULL - && strncmp (".stab", name, 5) == 0 - && strncmp (".stabstr", name, 8) != 0) - adjust_stab_section (abfd, i); - } - - file_cursor = H_GET_TEXT_FILE_OFFSET (&headers); - - bfd_seek (abfd, (file_ptr) file_cursor, 0); - - /* Plant the data */ - - fill_section (abfd, &headers, &file_cursor); - - do_relocs_for (abfd, &headers, &file_cursor); - - do_linenos_for (abfd, &headers, &file_cursor); - - H_SET_FILE_MAGIC_NUMBER (&headers, COFF_MAGIC); -#ifndef OBJ_COFF_OMIT_TIMESTAMP - H_SET_TIME_STAMP (&headers, (long)time((time_t *)0)); -#else - H_SET_TIME_STAMP (&headers, 0); -#endif -#ifdef TC_COFF_SET_MACHINE - TC_COFF_SET_MACHINE (&headers); -#endif - -#ifndef COFF_FLAGS -#define COFF_FLAGS 0 -#endif - -#ifdef KEEP_RELOC_INFO - H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers) ? 0 : F_LNNO) | - COFF_FLAGS | coff_flags)); -#else - H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers) ? 0 : F_LNNO) | - (H_GET_RELOCATION_SIZE(&headers) ? 0 : F_RELFLG) | - COFF_FLAGS | coff_flags)); -#endif - - { - unsigned int symtable_size = H_GET_SYMBOL_TABLE_SIZE (&headers); - char *buffer1 = xmalloc (symtable_size + string_byte_count + 1); - - H_SET_SYMBOL_TABLE_POINTER (&headers, bfd_tell (abfd)); - w_symbols (abfd, buffer1, symbol_rootP); - if (string_byte_count > 0) - w_strings (buffer1 + symtable_size); - bfd_write (buffer1, 1, symtable_size + string_byte_count, abfd); - free (buffer1); - } - - coff_header_append (abfd, &headers); -#if 0 - /* Recent changes to write need this, but where it should - go is up to Ken.. */ - if (bfd_close_all_done (abfd) == false) - as_fatal (_("Can't close %s: %s"), out_file_name, - bfd_errmsg (bfd_get_error ())); -#else - { - extern bfd *stdoutput; - stdoutput = abfd; - } -#endif - -} - -/* Add a new segment. This is called from subseg_new via the - obj_new_segment macro. */ - -segT -obj_coff_add_segment (name) - const char *name; -{ - unsigned int i; - -#ifndef COFF_LONG_SECTION_NAMES - char buf[SCNNMLEN + 1]; - - strncpy (buf, name, SCNNMLEN); - buf[SCNNMLEN] = '\0'; - name = buf; -#endif - - for (i = SEG_E0; i < SEG_LAST && segment_info[i].scnhdr.s_name[0]; i++) - if (strcmp (name, segment_info[i].name) == 0) - return (segT) i; - - if (i == SEG_LAST) - { - as_bad (_("Too many new sections; can't add \"%s\""), name); - return now_seg; - } - - /* Add a new section. */ - strncpy (segment_info[i].scnhdr.s_name, name, - sizeof (segment_info[i].scnhdr.s_name)); - segment_info[i].scnhdr.s_flags = STYP_REG; - segment_info[i].name = xstrdup (name); - - return (segT) i; -} - -/* - * implement the .section pseudo op: - * .section name {, "flags"} - * ^ ^ - * | +--- optional flags: 'b' for bss - * | 'i' for info - * +-- section name 'l' for lib - * 'n' for noload - * 'o' for over - * 'w' for data - * 'd' (apparently m88k for data) - * 'x' for text - * 'r' for read-only data - * But if the argument is not a quoted string, treat it as a - * subsegment number. - */ - -void -obj_coff_section (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - /* Strip out the section name */ - char *section_name, *name; - char c; - unsigned int exp; - long flags; - - if (flag_mri) - { - char type; - - s_mri_sect (&type); - flags = 0; - if (type == 'C') - flags = STYP_TEXT; - else if (type == 'D') - flags = STYP_DATA; - segment_info[now_seg].scnhdr.s_flags |= flags; - - return; - } - - section_name = input_line_pointer; - c = get_symbol_end (); - - name = xmalloc (input_line_pointer - section_name + 1); - strcpy (name, section_name); - - *input_line_pointer = c; - - exp = 0; - flags = 0; - - SKIP_WHITESPACE (); - if (*input_line_pointer == ',') - { - ++input_line_pointer; - SKIP_WHITESPACE (); - - if (*input_line_pointer != '"') - exp = get_absolute_expression (); - else - { - ++input_line_pointer; - while (*input_line_pointer != '"' - && ! is_end_of_line[(unsigned char) *input_line_pointer]) - { - switch (*input_line_pointer) - { - case 'b': flags |= STYP_BSS; break; - case 'i': flags |= STYP_INFO; break; - case 'l': flags |= STYP_LIB; break; - case 'n': flags |= STYP_NOLOAD; break; - case 'o': flags |= STYP_OVER; break; - case 'd': - case 'w': flags |= STYP_DATA; break; - case 'x': flags |= STYP_TEXT; break; - case 'r': flags |= STYP_LIT; break; - default: - as_warn(_("unknown section attribute '%c'"), - *input_line_pointer); - break; - } - ++input_line_pointer; - } - if (*input_line_pointer == '"') - ++input_line_pointer; - } - } - - subseg_new (name, (subsegT) exp); - - segment_info[now_seg].scnhdr.s_flags |= flags; - - demand_empty_rest_of_line (); -} - - -static void -obj_coff_text (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - subseg_new (".text", get_absolute_expression ()); -} - - -static void -obj_coff_data (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (flag_readonly_data_in_text) - subseg_new (".text", get_absolute_expression () + 1000); - else - subseg_new (".data", get_absolute_expression ()); -} - -static void -obj_coff_ident (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - segT current_seg = now_seg; /* save current seg */ - subsegT current_subseg = now_subseg; - subseg_new (".comment", 0); /* .comment seg */ - stringer (1); /* read string */ - subseg_set (current_seg, current_subseg); /* restore current seg */ -} - -void -c_symbol_merge (debug, normal) - symbolS *debug; - symbolS *normal; -{ - S_SET_DATA_TYPE (normal, S_GET_DATA_TYPE (debug)); - S_SET_STORAGE_CLASS (normal, S_GET_STORAGE_CLASS (debug)); - - if (S_GET_NUMBER_AUXILIARY (debug) > S_GET_NUMBER_AUXILIARY (normal)) - { - S_SET_NUMBER_AUXILIARY (normal, S_GET_NUMBER_AUXILIARY (debug)); - } /* take the most we have */ - - if (S_GET_NUMBER_AUXILIARY (debug) > 0) - { - memcpy ((char *) &normal->sy_symbol.ost_auxent[0], - (char *) &debug->sy_symbol.ost_auxent[0], - (unsigned int) (S_GET_NUMBER_AUXILIARY (debug) * AUXESZ)); - } /* Move all the auxiliary information */ - - /* Move the debug flags. */ - SF_SET_DEBUG_FIELD (normal, SF_GET_DEBUG_FIELD (debug)); -} /* c_symbol_merge() */ - -static int -c_line_new (symbol, paddr, line_number, frag) - symbolS * symbol; - long paddr; - int line_number; - fragS * frag; -{ - struct lineno_list *new_line = - (struct lineno_list *) xmalloc (sizeof (struct lineno_list)); - - segment_info_type *s = segment_info + now_seg; - new_line->line.l_lnno = line_number; - - if (line_number == 0) - { - last_line_symbol = symbol; - new_line->line.l_addr.l_symndx = (long) symbol; - } - else - { - new_line->line.l_addr.l_paddr = paddr; - } - - new_line->frag = (char *) frag; - new_line->next = (struct lineno_list *) NULL; - - - if (s->lineno_list_head == (struct lineno_list *) NULL) - { - s->lineno_list_head = new_line; - } - else - { - s->lineno_list_tail->next = new_line; - } - s->lineno_list_tail = new_line; - return LINESZ * s->scnhdr.s_nlnno++; -} - -void -c_dot_file_symbol (filename) - char *filename; -{ - symbolS *symbolP; - - symbolP = symbol_new (".file", - SEG_DEBUG, - 0, - &zero_address_frag); - - S_SET_STORAGE_CLASS (symbolP, C_FILE); - S_SET_NUMBER_AUXILIARY (symbolP, 1); - - if (strlen (filename) > FILNMLEN) - { - /* Filename is too long to fit into an auxent, - we stick it into the string table instead. We keep - a linked list of the filenames we find so we can emit - them later.*/ - struct filename_list *f = ((struct filename_list *) - xmalloc (sizeof (struct filename_list))); - - f->filename = filename; - f->next = 0; - - SA_SET_FILE_FNAME_ZEROS (symbolP, 0); - SA_SET_FILE_FNAME_OFFSET (symbolP, 1); - - if (filename_list_tail) - filename_list_tail->next = f; - else - filename_list_head = f; - filename_list_tail = f; - } - else - { - SA_SET_FILE_FNAME (symbolP, filename); - } -#ifndef NO_LISTING - { - extern int listing; - if (listing) - { - listing_source_file (filename); - } - - } - -#endif - SF_SET_DEBUG (symbolP); - S_SET_VALUE (symbolP, (valueT) previous_file_symbol); - - previous_file_symbol = symbolP; - - /* Make sure that the symbol is first on the symbol chain */ - if (symbol_rootP != symbolP) - { - symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); - symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP); - } -} /* c_dot_file_symbol() */ - -/* - * Build a 'section static' symbol. - */ - -symbolS * -c_section_symbol (name, idx) - char *name; - int idx; -{ - symbolS *symbolP; - - symbolP = symbol_find_base (name, DO_NOT_STRIP); - if (symbolP == NULL) - symbolP = symbol_new (name, idx, 0, &zero_address_frag); - else - { - /* Mmmm. I just love violating interfaces. Makes me feel...dirty. */ - S_SET_SEGMENT (symbolP, idx); - symbolP->sy_frag = &zero_address_frag; - } - - S_SET_STORAGE_CLASS (symbolP, C_STAT); - S_SET_NUMBER_AUXILIARY (symbolP, 1); - - SF_SET_STATICS (symbolP); - -#ifdef TE_DELTA - /* manfred@s-direktnet.de: section symbols *must* have the LOCAL bit cleared, - which is set by the new definition of LOCAL_LABEL in tc-m68k.h. */ - SF_CLEAR_LOCAL (symbolP); -#endif -#ifdef TE_PE - /* If the .linkonce pseudo-op was used for this section, we must - store the information in the auxiliary entry for the section - symbol. */ - if (segment_info[idx].linkonce != LINKONCE_UNSET) - { - int type; - - switch (segment_info[idx].linkonce) - { - default: - abort (); - case LINKONCE_DISCARD: - type = IMAGE_COMDAT_SELECT_ANY; - break; - case LINKONCE_ONE_ONLY: - type = IMAGE_COMDAT_SELECT_NODUPLICATES; - break; - case LINKONCE_SAME_SIZE: - type = IMAGE_COMDAT_SELECT_SAME_SIZE; - break; - case LINKONCE_SAME_CONTENTS: - type = IMAGE_COMDAT_SELECT_EXACT_MATCH; - break; - } - - SYM_AUXENT (symbolP)->x_scn.x_comdat = type; - } -#endif /* TE_PE */ - - return symbolP; -} /* c_section_symbol() */ - -static void -w_symbols (abfd, where, symbol_rootP) - bfd * abfd; - char *where; - symbolS * symbol_rootP; -{ - symbolS *symbolP; - unsigned int i; - - /* First fill in those values we have only just worked out */ - for (i = SEG_E0; i < SEG_LAST; i++) - { - symbolP = segment_info[i].dot; - if (symbolP) - { - SA_SET_SCN_SCNLEN (symbolP, segment_info[i].scnhdr.s_size); - SA_SET_SCN_NRELOC (symbolP, segment_info[i].scnhdr.s_nreloc); - SA_SET_SCN_NLINNO (symbolP, segment_info[i].scnhdr.s_nlnno); - } - } - - /* - * Emit all symbols left in the symbol chain. - */ - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - /* Used to save the offset of the name. It is used to point - to the string in memory but must be a file offset. */ - register char *temp; - - /* We can't fix the lnnoptr field in yank_symbols with the other - adjustments, because we have to wait until we know where they - go in the file. */ - if (SF_GET_ADJ_LNNOPTR (symbolP)) - { - SA_GET_SYM_LNNOPTR (symbolP) += - segment_info[S_GET_SEGMENT (symbolP)].scnhdr.s_lnnoptr; - } - - tc_coff_symbol_emit_hook (symbolP); - - temp = S_GET_NAME (symbolP); - if (SF_GET_STRING (symbolP)) - { - S_SET_OFFSET (symbolP, symbolP->sy_name_offset); - S_SET_ZEROES (symbolP, 0); - } - else - { - memset (symbolP->sy_symbol.ost_entry.n_name, 0, SYMNMLEN); - strncpy (symbolP->sy_symbol.ost_entry.n_name, temp, SYMNMLEN); - } - where = symbol_to_chars (abfd, where, symbolP); - S_SET_NAME (symbolP, temp); - } - -} /* w_symbols() */ - -static void -obj_coff_lcomm (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - s_lcomm(0); - return; -#if 0 - char *name; - char c; - int temp; - char *p; - - symbolS *symbolP; - - name = input_line_pointer; - - c = get_symbol_end (); - p = input_line_pointer; - *p = c; - SKIP_WHITESPACE (); - if (*input_line_pointer != ',') - { - as_bad (_("Expected comma after name")); - ignore_rest_of_line (); - return; - } - if (*input_line_pointer == '\n') - { - as_bad (_("Missing size expression")); - return; - } - input_line_pointer++; - if ((temp = get_absolute_expression ()) < 0) - { - as_warn (_("lcomm length (%d.) <0! Ignored."), temp); - ignore_rest_of_line (); - return; - } - *p = 0; - - symbolP = symbol_find_or_make(name); - - if (S_GET_SEGMENT(symbolP) == SEG_UNKNOWN && - S_GET_VALUE(symbolP) == 0) - { - if (! need_pass_2) - { - char *p; - segT current_seg = now_seg; /* save current seg */ - subsegT current_subseg = now_subseg; - - subseg_set (SEG_E2, 1); - symbolP->sy_frag = frag_now; - p = frag_var(rs_org, 1, 1, (relax_substateT)0, symbolP, - (offsetT) temp, (char *) 0); - *p = 0; - subseg_set (current_seg, current_subseg); /* restore current seg */ - S_SET_SEGMENT(symbolP, SEG_E2); - S_SET_STORAGE_CLASS(symbolP, C_STAT); - } - } - else - as_bad(_("Symbol %s already defined"), name); - - demand_empty_rest_of_line(); -#endif -} - -static void -fixup_mdeps (frags, h, this_segment) - fragS * frags; - object_headers * h; - segT this_segment; -{ - subseg_change (this_segment, 0); - while (frags) - { - switch (frags->fr_type) - { - case rs_align: - case rs_align_code: - case rs_org: -#ifdef HANDLE_ALIGN - HANDLE_ALIGN (frags); -#endif - frags->fr_type = rs_fill; - frags->fr_offset = - ((frags->fr_next->fr_address - frags->fr_address - frags->fr_fix) - / frags->fr_var); - break; - case rs_machine_dependent: - md_convert_frag (h, this_segment, frags); - frag_wane (frags); - break; - default: - ; - } - frags = frags->fr_next; - } -} - -#if 1 - -#ifndef TC_FORCE_RELOCATION -#define TC_FORCE_RELOCATION(fix) 0 -#endif - -static void -fixup_segment (segP, this_segment_type) - segment_info_type * segP; - segT this_segment_type; -{ - register fixS * fixP; - register symbolS *add_symbolP; - register symbolS *sub_symbolP; - long add_number; - register int size; - register char *place; - register long where; - register char pcrel; - register fragS *fragP; - register segT add_symbol_segment = absolute_section; - - for (fixP = segP->fix_root; fixP; fixP = fixP->fx_next) - { - fragP = fixP->fx_frag; - know (fragP); - where = fixP->fx_where; - place = fragP->fr_literal + where; - size = fixP->fx_size; - add_symbolP = fixP->fx_addsy; - sub_symbolP = fixP->fx_subsy; - add_number = fixP->fx_offset; - pcrel = fixP->fx_pcrel; - - /* We want function-relative stabs to work on systems which - may use a relaxing linker; thus we must handle the sym1-sym2 - fixups function-relative stabs generates. - - Of course, if you actually enable relaxing in the linker, the - line and block scoping information is going to be incorrect - in some cases. The only way to really fix this is to support - a reloc involving the difference of two symbols. */ - if (linkrelax - && (!sub_symbolP || pcrel)) - continue; - -#ifdef TC_I960 - if (fixP->fx_tcbit && SF_GET_CALLNAME (add_symbolP)) - { - /* Relocation should be done via the associated 'bal' entry - point symbol. */ - - if (!SF_GET_BALNAME (tc_get_bal_of_call (add_symbolP))) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("No 'bal' entry point for leafproc %s"), - S_GET_NAME (add_symbolP)); - continue; - } - fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP); - } -#endif - - /* Make sure the symbols have been resolved; this may not have - happened if these are expression symbols. */ - if (add_symbolP != NULL && ! add_symbolP->sy_resolved) - resolve_symbol_value (add_symbolP, 1); - - if (add_symbolP != NULL) - { - /* If this fixup is against a symbol which has been equated - to another symbol, convert it to the other symbol. */ - if (add_symbolP->sy_value.X_op == O_symbol - && (! S_IS_DEFINED (add_symbolP) - || S_IS_COMMON (add_symbolP))) - { - while (add_symbolP->sy_value.X_op == O_symbol - && (! S_IS_DEFINED (add_symbolP) - || S_IS_COMMON (add_symbolP))) - { - symbolS *n; - - /* We must avoid looping, as that can occur with a - badly written program. */ - n = add_symbolP->sy_value.X_add_symbol; - if (n == add_symbolP) - break; - add_number += add_symbolP->sy_value.X_add_number; - add_symbolP = n; - } - fixP->fx_addsy = add_symbolP; - fixP->fx_offset = add_number; - } - } - - if (sub_symbolP != NULL && ! sub_symbolP->sy_resolved) - resolve_symbol_value (sub_symbolP, 1); - - if (add_symbolP != NULL - && add_symbolP->sy_mri_common) - { - know (add_symbolP->sy_value.X_op == O_symbol); - add_number += S_GET_VALUE (add_symbolP); - fixP->fx_offset = add_number; - add_symbolP = fixP->fx_addsy = add_symbolP->sy_value.X_add_symbol; - } - - if (add_symbolP) - { - add_symbol_segment = S_GET_SEGMENT (add_symbolP); - } /* if there is an addend */ - - if (sub_symbolP) - { - if (add_symbolP == NULL || add_symbol_segment == absolute_section) - { - if (add_symbolP != NULL) - { - add_number += S_GET_VALUE (add_symbolP); - add_symbolP = NULL; - fixP->fx_addsy = NULL; - } - - /* It's just -sym. */ - if (S_GET_SEGMENT (sub_symbolP) == absolute_section) - { - add_number -= S_GET_VALUE (sub_symbolP); - fixP->fx_subsy = 0; - fixP->fx_done = 1; - } - else - { -#ifndef TC_M68K - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Negative of non-absolute symbol %s"), - S_GET_NAME (sub_symbolP)); -#endif - add_number -= S_GET_VALUE (sub_symbolP); - } /* not absolute */ - - /* if sub_symbol is in the same segment that add_symbol - and add_symbol is either in DATA, TEXT, BSS or ABSOLUTE */ - } - else if (S_GET_SEGMENT (sub_symbolP) == add_symbol_segment - && SEG_NORMAL (add_symbol_segment)) - { - /* Difference of 2 symbols from same segment. Can't - make difference of 2 undefineds: 'value' means - something different for N_UNDF. */ -#ifdef TC_I960 - /* Makes no sense to use the difference of 2 arbitrary symbols - as the target of a call instruction. */ - if (fixP->fx_tcbit) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("callj to difference of 2 symbols")); - } -#endif /* TC_I960 */ - add_number += S_GET_VALUE (add_symbolP) - - S_GET_VALUE (sub_symbolP); - add_symbolP = NULL; - - if (!TC_FORCE_RELOCATION (fixP)) - { - fixP->fx_addsy = NULL; - fixP->fx_subsy = NULL; - fixP->fx_done = 1; -#ifdef TC_M68K /* is this right? */ - pcrel = 0; - fixP->fx_pcrel = 0; -#endif - } - } - else - { - /* Different segments in subtraction. */ - know (!(S_IS_EXTERNAL (sub_symbolP) && (S_GET_SEGMENT (sub_symbolP) == absolute_section))); - - if ((S_GET_SEGMENT (sub_symbolP) == absolute_section)) - { - add_number -= S_GET_VALUE (sub_symbolP); - } -#ifdef DIFF_EXPR_OK - else if (S_GET_SEGMENT (sub_symbolP) == this_segment_type -#if 0 /* Okay for 68k, at least... */ - && !pcrel -#endif - ) - { - /* Make it pc-relative. */ - add_number += (md_pcrel_from (fixP) - - S_GET_VALUE (sub_symbolP)); - pcrel = 1; - fixP->fx_pcrel = 1; - sub_symbolP = 0; - fixP->fx_subsy = 0; - } -#endif - else - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %ld."), - segment_name (S_GET_SEGMENT (sub_symbolP)), - S_GET_NAME (sub_symbolP), - (long) (fragP->fr_address + where)); - } /* if absolute */ - } - } /* if sub_symbolP */ - - if (add_symbolP) - { - if (add_symbol_segment == this_segment_type && pcrel) - { - /* - * This fixup was made when the symbol's segment was - * SEG_UNKNOWN, but it is now in the local segment. - * So we know how to do the address without relocation. - */ -#ifdef TC_I960 - /* reloc_callj() may replace a 'call' with a 'calls' or a 'bal', - * in which cases it modifies *fixP as appropriate. In the case - * of a 'calls', no further work is required, and *fixP has been - * set up to make the rest of the code below a no-op. - */ - reloc_callj (fixP); -#endif /* TC_I960 */ - - add_number += S_GET_VALUE (add_symbolP); - add_number -= md_pcrel_from (fixP); - - /* We used to do - add_number -= segP->scnhdr.s_vaddr; - if defined (TC_I386) || defined (TE_LYNX). I now - think that was an error propagated from the case when - we are going to emit the relocation. If we are not - going to emit the relocation, then we just want to - set add_number to the difference between the symbols. - This is a case that would only arise when there is a - PC relative reference from a section other than .text - to a symbol defined in the same section, and the - reference is not relaxed. Since jump instructions on - the i386 are relaxed, this could only arise with a - call instruction. */ - - pcrel = 0; /* Lie. Don't want further pcrel processing. */ - if (!TC_FORCE_RELOCATION (fixP)) - { - fixP->fx_addsy = NULL; - fixP->fx_done = 1; - } - } - else - { - switch (add_symbol_segment) - { - case absolute_section: -#ifdef TC_I960 - reloc_callj (fixP); /* See comment about reloc_callj() above*/ -#endif /* TC_I960 */ - add_number += S_GET_VALUE (add_symbolP); - add_symbolP = NULL; - - if (!TC_FORCE_RELOCATION (fixP)) - { - fixP->fx_addsy = NULL; - fixP->fx_done = 1; - } - break; - default: - - -#if defined(TC_A29K) || (defined(TE_PE) && defined(TC_I386)) || defined(TC_M88K) - /* This really should be handled in the linker, but - backward compatibility forbids. */ - add_number += S_GET_VALUE (add_symbolP); -#else - add_number += S_GET_VALUE (add_symbolP) + - segment_info[S_GET_SEGMENT (add_symbolP)].scnhdr.s_paddr; -#endif - break; - - case SEG_UNKNOWN: -#ifdef TC_I960 - if ((int) fixP->fx_bit_fixP == 13) - { - /* This is a COBR instruction. They have only a - * 13-bit displacement and are only to be used - * for local branches: flag as error, don't generate - * relocation. - */ - as_bad_where (fixP->fx_file, fixP->fx_line, - _("can't use COBR format with external label")); - fixP->fx_addsy = NULL; - fixP->fx_done = 1; - continue; - } /* COBR */ -#endif /* TC_I960 */ -#if ((defined (TC_I386) || defined (TE_LYNX) || defined (TE_AUX)) && !defined(TE_PE)) || defined (COFF_COMMON_ADDEND) - /* 386 COFF uses a peculiar format in which the - value of a common symbol is stored in the .text - segment (I've checked this on SVR3.2 and SCO - 3.2.2) Ian Taylor . */ - /* This is also true for 68k COFF on sysv machines - (Checked on Motorola sysv68 R3V6 and R3V7.1, and also on - UNIX System V/M68000, Release 1.0 from ATT/Bell Labs) - Philippe De Muyter . */ - if (S_IS_COMMON (add_symbolP)) - add_number += S_GET_VALUE (add_symbolP); -#endif - break; - - - } /* switch on symbol seg */ - } /* if not in local seg */ - } /* if there was a + symbol */ - - if (pcrel) - { -#if !defined(TC_M88K) && !(defined(TE_PE) && defined(TC_I386)) && !defined(TC_A29K) - /* This adjustment is not correct on the m88k, for which the - linker does all the computation. */ - add_number -= md_pcrel_from (fixP); -#endif - if (add_symbolP == 0) - { - fixP->fx_addsy = &abs_symbol; - } /* if there's an add_symbol */ -#if defined (TC_I386) || defined (TE_LYNX) || defined (TC_I960) || defined (TC_M68K) - /* On the 386 we must adjust by the segment vaddr as well. - Ian Taylor. - - I changed the i960 to work this way as well. This is - compatible with the current GNU linker behaviour. I do - not know what other i960 COFF assemblers do. This is not - a common case: normally, only assembler code will contain - a PC relative reloc, and only branches which do not - originate in the .text section will have a non-zero - address. - - I changed the m68k to work this way as well. This will - break existing PC relative relocs from sections which do - not start at address 0, but it will make ld -r work. - Ian Taylor, 4 Oct 96. */ - - add_number -= segP->scnhdr.s_vaddr; -#endif - } /* if pcrel */ - -#ifdef MD_APPLY_FIX3 - md_apply_fix3 (fixP, (valueT *) &add_number, this_segment_type); -#else - md_apply_fix (fixP, add_number); -#endif - - if (!fixP->fx_bit_fixP && ! fixP->fx_no_overflow) - { -#ifndef TC_M88K - /* The m88k uses the offset field of the reloc to get around - this problem. */ - if ((size == 1 - && ((add_number & ~0xFF) - || (fixP->fx_signed && (add_number & 0x80))) - && ((add_number & ~0xFF) != (-1 & ~0xFF) - || (add_number & 0x80) == 0)) - || (size == 2 - && ((add_number & ~0xFFFF) - || (fixP->fx_signed && (add_number & 0x8000))) - && ((add_number & ~0xFFFF) != (-1 & ~0xFFFF) - || (add_number & 0x8000) == 0))) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Value of %ld too large for field of %d bytes at 0x%lx"), - (long) add_number, size, - (unsigned long) (fragP->fr_address + where)); - } -#endif -#ifdef WARN_SIGNED_OVERFLOW_WORD - /* Warn if a .word value is too large when treated as a - signed number. We already know it is not too negative. - This is to catch over-large switches generated by gcc on - the 68k. */ - if (!flag_signed_overflow_ok - && size == 2 - && add_number > 0x7fff) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Signed .word overflow; switch may be too large; %ld at 0x%lx"), - (long) add_number, - (unsigned long) (fragP->fr_address + where)); -#endif - } /* not a bit fix */ - } /* For each fixS in this segment. */ -} /* fixup_segment() */ - -#endif - -/* The first entry in a .stab section is special. */ - -void -obj_coff_init_stab_section (seg) - segT seg; -{ - char *file; - char *p; - char *stabstr_name; - unsigned int stroff; - - /* Make space for this first symbol. */ - p = frag_more (12); - /* Zero it out. */ - memset (p, 0, 12); - as_where (&file, (unsigned int *) NULL); - stabstr_name = (char *) alloca (strlen (segment_info[seg].name) + 4); - strcpy (stabstr_name, segment_info[seg].name); - strcat (stabstr_name, "str"); - stroff = get_stab_string_offset (file, stabstr_name); - know (stroff == 1); - md_number_to_chars (p, stroff, 4); -} - -/* Fill in the counts in the first entry in a .stab section. */ - -static void -adjust_stab_section(abfd, seg) - bfd *abfd; - segT seg; -{ - segT stabstrseg = SEG_UNKNOWN; - const char *secname, *name2; - char *name; - char *p = NULL; - int i, strsz = 0, nsyms; - fragS *frag = segment_info[seg].frchainP->frch_root; - - /* Look for the associated string table section. */ - - secname = segment_info[seg].name; - name = (char *) alloca (strlen (secname) + 4); - strcpy (name, secname); - strcat (name, "str"); - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - name2 = segment_info[i].name; - if (name2 != NULL && strncmp(name2, name, 8) == 0) - { - stabstrseg = i; - break; - } - } - - /* If we found the section, get its size. */ - if (stabstrseg != SEG_UNKNOWN) - strsz = size_section (abfd, stabstrseg); - - nsyms = size_section (abfd, seg) / 12 - 1; - - /* Look for the first frag of sufficient size for the initial stab - symbol, and collect a pointer to it. */ - while (frag && frag->fr_fix < 12) - frag = frag->fr_next; - assert (frag != 0); - p = frag->fr_literal; - assert (p != 0); - - /* Write in the number of stab symbols and the size of the string - table. */ - bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6); - bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8); -} - -#endif /* not BFD_ASSEMBLER */ - -const pseudo_typeS coff_pseudo_table[] = -{ - {"def", obj_coff_def, 0}, - {"dim", obj_coff_dim, 0}, - {"endef", obj_coff_endef, 0}, - {"line", obj_coff_line, 0}, - {"ln", obj_coff_ln, 0}, -#ifdef BFD_ASSEMBLER - {"loc", obj_coff_loc, 0}, -#endif - {"appline", obj_coff_ln, 1}, - {"scl", obj_coff_scl, 0}, - {"size", obj_coff_size, 0}, - {"tag", obj_coff_tag, 0}, - {"type", obj_coff_type, 0}, - {"val", obj_coff_val, 0}, - {"section", obj_coff_section, 0}, - {"sect", obj_coff_section, 0}, - /* FIXME: We ignore the MRI short attribute. */ - {"section.s", obj_coff_section, 0}, - {"sect.s", obj_coff_section, 0}, - /* We accept the .bss directive for backward compatibility with - earlier versions of gas. */ - {"bss", obj_coff_bss, 0}, - {"weak", obj_coff_weak, 0}, - {"ident", obj_coff_ident, 0}, -#ifndef BFD_ASSEMBLER - {"use", obj_coff_section, 0}, - {"text", obj_coff_text, 0}, - {"data", obj_coff_data, 0}, - {"lcomm", obj_coff_lcomm, 0}, -#else - {"optim", s_ignore, 0}, /* For sun386i cc (?) */ -#endif - {"version", s_ignore, 0}, - {"ABORT", s_abort, 0}, -#ifdef TC_M88K - /* The m88k uses sdef instead of def. */ - {"sdef", obj_coff_def, 0}, -#endif - {NULL, NULL, 0} /* end sentinel */ -}; /* coff_pseudo_table */ - -#ifdef BFD_ASSEMBLER - -/* Support for a COFF emulation. */ - -static void coff_pop_insert PARAMS ((void)); - -static void -coff_pop_insert () -{ - pop_insert (coff_pseudo_table); -} - -const struct format_ops coff_format_ops = -{ - bfd_target_coff_flavour, - 0, /* dfl_leading_underscore */ - 1, /* emit_section_symbols */ - coff_frob_symbol, - 0, /* frob_file */ - coff_frob_file_after_relocs, - 0, /* s_get_size */ - 0, /* s_set_size */ - 0, /* s_get_align */ - 0, /* s_set_align */ - 0, /* s_get_other */ - 0, /* s_get_desc */ - 0, /* copy_symbol_attributes */ - 0, /* generate_asm_lineno */ - 0, /* process_stab */ - 0, /* sec_sym_ok_for_reloc */ - coff_pop_insert, - 0, /* ecoff_set_ext */ - coff_obj_read_begin_hook, - coff_obj_symbol_new_hook -}; - -#endif diff --git a/gas/config/obj-coff.h b/gas/config/obj-coff.h deleted file mode 100644 index f60ae365fb9..00000000000 --- a/gas/config/obj-coff.h +++ /dev/null @@ -1,873 +0,0 @@ -/* coff object file format - Copyright (C) 1989, 90, 91, 92, 94, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - - This file is part of GAS. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef OBJ_FORMAT_H -#define OBJ_FORMAT_H - -#define OBJ_COFF 1 - -#ifndef BFD_ASSEMBLER - -#define WORKING_DOT_WORD -#define WARN_SIGNED_OVERFLOW_WORD -#define OBJ_COFF_OMIT_OPTIONAL_HEADER -#define BFD_HEADERS -#define BFD - -#endif - -#include "targ-cpu.h" - -#include "bfd.h" - -/* This internal_lineno crap is to stop namespace pollution from the - bfd internal coff headerfile. */ -#define internal_lineno bfd_internal_lineno -#include "coff/internal.h" -#undef internal_lineno - -/* CPU-specific setup: */ - -#ifdef TC_ARM -#include "coff/arm.h" -#ifndef TARGET_FORMAT -#define TARGET_FORMAT "coff-arm" -#endif -#endif - -#ifdef TC_PPC -#ifdef TE_PE -#include "coff/powerpc.h" -#else -#include "coff/rs6000.h" -#endif -#endif - -#ifdef TC_SPARC -#include "coff/sparc.h" -#endif - -#ifdef TC_I386 -#include "coff/i386.h" - -#ifdef TE_PE -#define TARGET_FORMAT "pe-i386" -#endif - -#ifndef TARGET_FORMAT -#define TARGET_FORMAT "coff-i386" -#endif -#endif - -#ifdef TC_M68K -#include "coff/m68k.h" -#ifndef TARGET_FORMAT -#define TARGET_FORMAT "coff-m68k" -#endif -#endif - -#ifdef TC_A29K -#include "coff/a29k.h" -#define TARGET_FORMAT "coff-a29k-big" -#endif - -#ifdef TC_I960 -#include "coff/i960.h" -#define TARGET_FORMAT "coff-Intel-little" -#endif - -#ifdef TC_Z8K -#include "coff/z8k.h" -#define TARGET_FORMAT "coff-z8k" -#endif - -#ifdef TC_H8300 -#include "coff/h8300.h" -#define TARGET_FORMAT "coff-h8300" -#endif - -#ifdef TC_H8500 -#include "coff/h8500.h" -#define TARGET_FORMAT "coff-h8500" -#endif - -#ifdef TC_SH - -#ifdef TE_PE -#define COFF_WITH_PE -#endif - -#include "coff/sh.h" - -#ifdef TE_PE -#define TARGET_FORMAT "pe-shl" -#else -#define TARGET_FORMAT \ - (shl \ - ? (sh_small ? "coff-shl-small" : "coff-shl") \ - : (sh_small ? "coff-sh-small" : "coff-sh")) -#endif -#endif - -#ifdef TC_MIPS -#define COFF_WITH_PE -#include "coff/mipspe.h" -#undef TARGET_FORMAT -#define TARGET_FORMAT "pe-mips" -#endif - -#ifdef TC_M88K -#include "coff/m88k.h" -#define TARGET_FORMAT "coff-m88kbcs" -#endif - -#ifdef TC_W65 -#include "coff/w65.h" -#define TARGET_FORMAT "coff-w65" -#endif - -#ifdef TC_TIC30 -#include "coff/tic30.h" -#define TARGET_FORMAT "coff-tic30" -#endif - -#ifdef TC_TIC80 -#include "coff/tic80.h" -#define TARGET_FORMAT "coff-tic80" -#define ALIGNMENT_IN_S_FLAGS 1 -#endif - -#ifdef TC_MCORE -#include "coff/mcore.h" -#ifndef TARGET_FORMAT -#define TARGET_FORMAT "pe-mcore" -#endif -#endif - -/* Targets may also set this. Also, if BFD_ASSEMBLER is defined, this - will already have been defined. */ -#undef SYMBOLS_NEED_BACKPOINTERS -#define SYMBOLS_NEED_BACKPOINTERS 1 - -#ifndef OBJ_COFF_MAX_AUXENTRIES -#define OBJ_COFF_MAX_AUXENTRIES 1 -#endif /* OBJ_COFF_MAX_AUXENTRIES */ - -extern void coff_obj_symbol_new_hook PARAMS ((symbolS *)); -#define obj_symbol_new_hook coff_obj_symbol_new_hook - -extern void coff_obj_read_begin_hook PARAMS ((void)); -#define obj_read_begin_hook coff_obj_read_begin_hook - -/* *********************************************************************** - - This file really contains two implementations of the COFF back end. - They are in the process of being merged, but this is only a - preliminary, mechanical merging. Many definitions that are - identical between the two are still found in both versions. - - The first version, with BFD_ASSEMBLER defined, uses high-level BFD - interfaces and data structures. The second version, with - BFD_ASSEMBLER not defined, also uses BFD, but mostly for swapping - data structures and for doing the actual I/O. The latter defines - the preprocessor symbols BFD and BFD_HEADERS. Try not to let this - confuse you. - - These two are in the process of being merged, and eventually the - BFD_ASSEMBLER version should take over completely. Release timing - issues and namespace problems convinced me to merge the two - together in this fashion, a little sooner than I would have liked. - The real merge should be much better done by the time the next - release comes out. - - For now, the structure of this file is: - - #ifdef BFD_ASSEMBLER - - #else - - #endif - - Unfortunately, the common portions are very small at the moment, - and many declarations or definitions are duplicated. The structure - of obj-coff.c is similar. - - See doc/internals.texi for a brief discussion of the history, if - you care. - - Ken Raeburn, 5 May 1994 - - *********************************************************************** */ - -#ifdef BFD_ASSEMBLER - -#include "bfd/libcoff.h" - -#define OUTPUT_FLAVOR bfd_target_coff_flavour - -/* SYMBOL TABLE */ - -/* Alter the field names, for now, until we've fixed up the other - references to use the new name. */ -#ifdef TC_I960 -#define TC_SYMFIELD_TYPE symbolS * -#define sy_tc bal -#endif - -#define OBJ_SYMFIELD_TYPE unsigned long -#define sy_obj sy_flags - -#define SYM_AUXENT(S) \ - (&coffsymbol (symbol_get_bfdsym (S))->native[1].u.auxent) -#define SYM_AUXINFO(S) \ - (&coffsymbol (symbol_get_bfdsym (S))->native[1]) - -#define DO_NOT_STRIP 0 - -extern void obj_coff_section PARAMS ((int)); - -/* The number of auxiliary entries */ -#define S_GET_NUMBER_AUXILIARY(s) \ - (coffsymbol (symbol_get_bfdsym (s))->native->u.syment.n_numaux) -/* The number of auxiliary entries */ -#define S_SET_NUMBER_AUXILIARY(s,v) (S_GET_NUMBER_AUXILIARY (s) = (v)) - -/* True if a symbol name is in the string table, i.e. its length is > 8. */ -#define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0) - -extern int S_SET_DATA_TYPE PARAMS ((symbolS *, int)); -extern int S_SET_STORAGE_CLASS PARAMS ((symbolS *, int)); -extern int S_GET_STORAGE_CLASS PARAMS ((symbolS *)); -extern void SA_SET_SYM_ENDNDX PARAMS ((symbolS *, symbolS *)); - -/* Auxiliary entry macros. SA_ stands for symbol auxiliary */ -/* Omit the tv related fields */ -/* Accessors */ - -#define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l) -#define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno) -#define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size) -#define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize) -#define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr) -#define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx) -#define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]) -#define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname) -#define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen) -#define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc) -#define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno) - -#define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno=(v)) -#define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size=(v)) -#define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize=(v)) -#define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr=(v)) -#define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v)) -#define SA_SET_FILE_FNAME(s,v) strncpy(SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN) -#define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen=(v)) -#define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc=(v)) -#define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno=(v)) - -/* - * Internal use only definitions. SF_ stands for symbol flags. - * - * These values can be assigned to sy_symbol.ost_flags field of a symbolS. - * - * You'll break i960 if you shift the SYSPROC bits anywhere else. for - * more on the balname/callname hack, see tc-i960.h. b.out is done - * differently. - */ - -#define SF_I960_MASK (0x000001ff) /* Bits 0-8 are used by the i960 port. */ -#define SF_SYSPROC (0x0000003f) /* bits 0-5 are used to store the sysproc number */ -#define SF_IS_SYSPROC (0x00000040) /* bit 6 marks symbols that are sysprocs */ -#define SF_BALNAME (0x00000080) /* bit 7 marks BALNAME symbols */ -#define SF_CALLNAME (0x00000100) /* bit 8 marks CALLNAME symbols */ - -#define SF_NORMAL_MASK (0x0000ffff) /* bits 12-15 are general purpose. */ - -#define SF_STATICS (0x00001000) /* Mark the .text & all symbols */ -#define SF_DEFINED (0x00002000) /* Symbol is defined in this file */ -#define SF_STRING (0x00004000) /* Symbol name length > 8 */ -#define SF_LOCAL (0x00008000) /* Symbol must not be emitted */ - -#define SF_DEBUG_MASK (0xffff0000) /* bits 16-31 are debug info */ - -#define SF_FUNCTION (0x00010000) /* The symbol is a function */ -#define SF_PROCESS (0x00020000) /* Process symbol before write */ -#define SF_TAGGED (0x00040000) /* Is associated with a tag */ -#define SF_TAG (0x00080000) /* Is a tag */ -#define SF_DEBUG (0x00100000) /* Is in debug or abs section */ -#define SF_GET_SEGMENT (0x00200000) /* Get the section of the forward symbol. */ -/* All other bits are unused. */ - -/* Accessors */ -#define SF_GET(s) (*symbol_get_obj (s)) -#define SF_GET_DEBUG(s) (symbol_get_bfdsym (s)->flags & BSF_DEBUGGING) -#define SF_SET_DEBUG(s) (symbol_get_bfdsym (s)->flags |= BSF_DEBUGGING) -#define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK) -#define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK) -#define SF_GET_FILE(s) (SF_GET (s) & SF_FILE) -#define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS) -#define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED) -#define SF_GET_STRING(s) (SF_GET (s) & SF_STRING) -#define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL) -#define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION) -#define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS) -#define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED) -#define SF_GET_TAG(s) (SF_GET (s) & SF_TAG) -#define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT) -#define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* used by i960 */ -#define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* used by i960 */ -#define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* used by i960 */ -#define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* used by i960 */ -#define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* used by i960 */ - -/* Modifiers */ -#define SF_SET(s,v) (SF_GET (s) = (v)) -#define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK)) -#define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK)) -#define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE) -#define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS) -#define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED) -#define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING) -#define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL) -#define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL) -#define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION) -#define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS) -#define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED) -#define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG) -#define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT) -#define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* used by i960 */ -#define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* used by i960 */ -#define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* used by i960 */ -#define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* used by i960 */ -#define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* used by i960 */ - -/* -------------- Line number handling ------- */ -extern int text_lineno_number; -extern int coff_line_base; -extern int coff_n_line_nos; - -#define obj_emit_lineno(WHERE,LINE,FILE_START) abort () -extern void coff_add_linesym PARAMS ((symbolS *)); - - -void c_dot_file_symbol PARAMS ((char *filename)); -#define obj_app_file c_dot_file_symbol - -extern void coff_frob_symbol PARAMS ((symbolS *, int *)); -extern void coff_adjust_symtab PARAMS ((void)); -extern void coff_frob_section PARAMS ((segT)); -extern void coff_adjust_section_syms PARAMS ((bfd *, asection *, PTR)); -extern void coff_frob_file_after_relocs PARAMS ((void)); -#define obj_frob_symbol(S,P) coff_frob_symbol(S,&P) -#ifndef obj_adjust_symtab -#define obj_adjust_symtab() coff_adjust_symtab() -#endif -#define obj_frob_section(S) coff_frob_section (S) -#define obj_frob_file_after_relocs() coff_frob_file_after_relocs () - -extern symbolS *coff_last_function; - -/* Forward the segment of a forwarded symbol, handle assignments that - just copy symbol values, etc. */ -#ifndef OBJ_COPY_SYMBOL_ATTRIBUTES -#ifndef TE_I386AIX -#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \ - (SF_GET_GET_SEGMENT (dest) \ - ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \ - : 0) -#else -#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \ - (SF_GET_GET_SEGMENT (dest) && S_GET_SEGMENT (dest) == SEG_UNKNOWN \ - ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \ - : 0) -#endif -#endif - -/* sanity check */ - -#ifdef TC_I960 -#ifndef C_LEAFSTAT -hey ! Where is the C_LEAFSTAT definition ? i960 - coff support is depending on it. -#endif /* no C_LEAFSTAT */ -#endif /* TC_I960 */ - -#else /* not BFD_ASSEMBLER */ - -#ifdef TC_A29K -/* Allow translate from aout relocs to coff relocs */ -#define NO_RELOC 20 -#define RELOC_32 1 -#define RELOC_8 2 -#define RELOC_CONST 3 -#define RELOC_CONSTH 4 -#define RELOC_JUMPTARG 5 -#define RELOC_BASE22 6 -#define RELOC_HI22 7 -#define RELOC_LO10 8 -#define RELOC_BASE13 9 -#define RELOC_WDISP22 10 -#define RELOC_WDISP30 11 -#endif - -extern const segT N_TYPE_seg[]; - -/* Magic number of paged executable. */ -#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE 0x8300 - - -/* SYMBOL TABLE */ - -/* Symbol table entry data type */ - -typedef struct -{ - /* Basic symbol */ - struct internal_syment ost_entry; - /* Auxiliary entry. */ - union internal_auxent ost_auxent[OBJ_COFF_MAX_AUXENTRIES]; - /* obj_coff internal use only flags */ - unsigned int ost_flags; -} obj_symbol_type; - -#ifndef DO_NOT_STRIP -#define DO_NOT_STRIP 0 -#endif -/* Symbol table macros and constants */ - -/* Possible and usefull section number in symbol table - * The values of TEXT, DATA and BSS may not be portable. - */ - -#define C_ABS_SECTION N_ABS -#define C_UNDEF_SECTION N_UNDEF -#define C_DEBUG_SECTION N_DEBUG -#define C_NTV_SECTION N_TV -#define C_PTV_SECTION P_TV -#define C_REGISTER_SECTION 50 - -/* - * Macros to extract information from a symbol table entry. - * This syntaxic indirection allows independence regarding a.out or coff. - * The argument (s) of all these macros is a pointer to a symbol table entry. - */ - -/* Predicates */ -/* True if the symbol is external */ -#define S_IS_EXTERNAL(s) ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION) -/* True if symbol has been defined, ie : - section > 0 (DATA, TEXT or BSS) - section == 0 and value > 0 (external bss symbol) */ -#define S_IS_DEFINED(s) \ - ((s)->sy_symbol.ost_entry.n_scnum > C_UNDEF_SECTION \ - || ((s)->sy_symbol.ost_entry.n_scnum == C_UNDEF_SECTION \ - && S_GET_VALUE (s) > 0) \ - || ((s)->sy_symbol.ost_entry.n_scnum == C_ABS_SECTION)) -/* True if a debug special symbol entry */ -#define S_IS_DEBUG(s) ((s)->sy_symbol.ost_entry.n_scnum == C_DEBUG_SECTION) -/* True if a symbol is local symbol name */ -/* A symbol name whose name includes ^A is a gas internal pseudo symbol */ -#define S_IS_LOCAL(s) \ - ((s)->sy_symbol.ost_entry.n_scnum == C_REGISTER_SECTION \ - || (S_LOCAL_NAME(s) && ! flag_keep_locals && ! S_IS_DEBUG (s)) \ - || strchr (S_GET_NAME (s), '\001') != NULL \ - || strchr (S_GET_NAME (s), '\002') != NULL \ - || (flag_strip_local_absolute \ - && !S_IS_EXTERNAL(s) \ - && (s)->sy_symbol.ost_entry.n_scnum == C_ABS_SECTION)) -/* True if a symbol is not defined in this file */ -#define S_IS_EXTERN(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \ - && S_GET_VALUE (s) == 0) -/* - * True if a symbol can be multiply defined (bss symbols have this def - * though it is bad practice) - */ -#define S_IS_COMMON(s) ((s)->sy_symbol.ost_entry.n_scnum == 0 \ - && S_GET_VALUE (s) != 0) -/* True if a symbol name is in the string table, i.e. its length is > 8. */ -#define S_IS_STRING(s) (strlen(S_GET_NAME(s)) > 8 ? 1 : 0) - -/* True if a symbol is defined as weak. */ -#ifdef TE_PE -#define S_IS_WEAK(s) \ - ((s)->sy_symbol.ost_entry.n_sclass == C_NT_WEAK \ - || (s)->sy_symbol.ost_entry.n_sclass == C_WEAKEXT) -#else -#define S_IS_WEAK(s) \ - ((s)->sy_symbol.ost_entry.n_sclass == C_WEAKEXT) -#endif - -/* Accessors */ -/* The name of the symbol */ -#define S_GET_NAME(s) ((char*)(s)->sy_symbol.ost_entry.n_offset) -/* The pointer to the string table */ -#define S_GET_OFFSET(s) ((s)->sy_symbol.ost_entry.n_offset) -/* The numeric value of the segment */ -#define S_GET_SEGMENT(s) s_get_segment(s) -/* The data type */ -#define S_GET_DATA_TYPE(s) ((s)->sy_symbol.ost_entry.n_type) -/* The storage class */ -#define S_GET_STORAGE_CLASS(s) ((s)->sy_symbol.ost_entry.n_sclass) -/* The number of auxiliary entries */ -#define S_GET_NUMBER_AUXILIARY(s) ((s)->sy_symbol.ost_entry.n_numaux) - -/* Modifiers */ -/* Set the name of the symbol */ -#define S_SET_NAME(s,v) ((s)->sy_symbol.ost_entry.n_offset = (unsigned long)(v)) -/* Set the offset of the symbol */ -#define S_SET_OFFSET(s,v) ((s)->sy_symbol.ost_entry.n_offset = (v)) -/* The numeric value of the segment */ -#define S_SET_SEGMENT(s,v) ((s)->sy_symbol.ost_entry.n_scnum = SEGMENT_TO_SYMBOL_TYPE(v)) -/* The data type */ -#define S_SET_DATA_TYPE(s,v) ((s)->sy_symbol.ost_entry.n_type = (v)) -/* The storage class */ -#define S_SET_STORAGE_CLASS(s,v) ((s)->sy_symbol.ost_entry.n_sclass = (v)) -/* The number of auxiliary entries */ -#define S_SET_NUMBER_AUXILIARY(s,v) ((s)->sy_symbol.ost_entry.n_numaux = (v)) - -/* Additional modifiers */ -/* The symbol is external (does not mean undefined) */ -#define S_SET_EXTERNAL(s) { S_SET_STORAGE_CLASS(s, C_EXT) ; SF_CLEAR_LOCAL(s); } - -/* Auxiliary entry macros. SA_ stands for symbol auxiliary */ -/* Omit the tv related fields */ -/* Accessors */ -#define SYM_AUXENT(S) (&(S)->sy_symbol.ost_auxent[0]) - -#define SA_GET_SYM_TAGNDX(s) (SYM_AUXENT (s)->x_sym.x_tagndx.l) -#define SA_GET_SYM_LNNO(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno) -#define SA_GET_SYM_SIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size) -#define SA_GET_SYM_FSIZE(s) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize) -#define SA_GET_SYM_LNNOPTR(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr) -#define SA_GET_SYM_ENDNDX(s) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l) -#define SA_GET_SYM_DIMEN(s,i) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]) -#define SA_GET_FILE_FNAME(s) (SYM_AUXENT (s)->x_file.x_fname) -#define SA_GET_FILE_FNAME_OFFSET(s) (SYM_AUXENT (s)->x_file.x_n.x_offset) -#define SA_GET_FILE_FNAME_ZEROS(s) (SYM_AUXENT (s)->x_file.x_n.x_zeroes) -#define SA_GET_SCN_SCNLEN(s) (SYM_AUXENT (s)->x_scn.x_scnlen) -#define SA_GET_SCN_NRELOC(s) (SYM_AUXENT (s)->x_scn.x_nreloc) -#define SA_GET_SCN_NLINNO(s) (SYM_AUXENT (s)->x_scn.x_nlinno) - -/* Modifiers */ -#define SA_SET_SYM_TAGNDX(s,v) (SYM_AUXENT (s)->x_sym.x_tagndx.l=(v)) -#define SA_SET_SYM_LNNO(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_lnno=(v)) -#define SA_SET_SYM_SIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_lnsz.x_size=(v)) -#define SA_SET_SYM_FSIZE(s,v) (SYM_AUXENT (s)->x_sym.x_misc.x_fsize=(v)) -#define SA_SET_SYM_LNNOPTR(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_lnnoptr=(v)) -#define SA_SET_SYM_ENDNDX(s,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_fcn.x_endndx.l=(v)) -#define SA_SET_SYM_DIMEN(s,i,v) (SYM_AUXENT (s)->x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v)) -#define SA_SET_FILE_FNAME(s,v) strncpy(SYM_AUXENT (s)->x_file.x_fname,(v),FILNMLEN) -#define SA_SET_FILE_FNAME_OFFSET(s,v) (SYM_AUXENT (s)->x_file.x_n.x_offset=(v)) -#define SA_SET_FILE_FNAME_ZEROS(s,v) (SYM_AUXENT (s)->x_file.x_n.x_zeroes=(v)) -#define SA_SET_SCN_SCNLEN(s,v) (SYM_AUXENT (s)->x_scn.x_scnlen=(v)) -#define SA_SET_SCN_NRELOC(s,v) (SYM_AUXENT (s)->x_scn.x_nreloc=(v)) -#define SA_SET_SCN_NLINNO(s,v) (SYM_AUXENT (s)->x_scn.x_nlinno=(v)) - -/* - * Internal use only definitions. SF_ stands for symbol flags. - * - * These values can be assigned to sy_symbol.ost_flags field of a symbolS. - * - * You'll break i960 if you shift the SYSPROC bits anywhere else. for - * more on the balname/callname hack, see tc-i960.h. b.out is done - * differently. - */ - -#define SF_I960_MASK (0x000001ff) /* Bits 0-8 are used by the i960 port. */ -#define SF_SYSPROC (0x0000003f) /* bits 0-5 are used to store the sysproc number */ -#define SF_IS_SYSPROC (0x00000040) /* bit 6 marks symbols that are sysprocs */ -#define SF_BALNAME (0x00000080) /* bit 7 marks BALNAME symbols */ -#define SF_CALLNAME (0x00000100) /* bit 8 marks CALLNAME symbols */ - -#define SF_NORMAL_MASK (0x0000ffff) /* bits 12-15 are general purpose. */ - -#define SF_STATICS (0x00001000) /* Mark the .text & all symbols */ -#define SF_DEFINED (0x00002000) /* Symbol is defined in this file */ -#define SF_STRING (0x00004000) /* Symbol name length > 8 */ -#define SF_LOCAL (0x00008000) /* Symbol must not be emitted */ - -#define SF_DEBUG_MASK (0xffff0000) /* bits 16-31 are debug info */ - -#define SF_FUNCTION (0x00010000) /* The symbol is a function */ -#define SF_PROCESS (0x00020000) /* Process symbol before write */ -#define SF_TAGGED (0x00040000) /* Is associated with a tag */ -#define SF_TAG (0x00080000) /* Is a tag */ -#define SF_DEBUG (0x00100000) /* Is in debug or abs section */ -#define SF_GET_SEGMENT (0x00200000) /* Get the section of the forward symbol. */ -#define SF_ADJ_LNNOPTR (0x00400000) /* Has a lnnoptr */ -/* All other bits are unused. */ - -/* Accessors */ -#define SF_GET(s) ((s)->sy_symbol.ost_flags) -#define SF_GET_NORMAL_FIELD(s) (SF_GET (s) & SF_NORMAL_MASK) -#define SF_GET_DEBUG_FIELD(s) (SF_GET (s) & SF_DEBUG_MASK) -#define SF_GET_FILE(s) (SF_GET (s) & SF_FILE) -#define SF_GET_STATICS(s) (SF_GET (s) & SF_STATICS) -#define SF_GET_DEFINED(s) (SF_GET (s) & SF_DEFINED) -#define SF_GET_STRING(s) (SF_GET (s) & SF_STRING) -#define SF_GET_LOCAL(s) (SF_GET (s) & SF_LOCAL) -#define SF_GET_FUNCTION(s) (SF_GET (s) & SF_FUNCTION) -#define SF_GET_PROCESS(s) (SF_GET (s) & SF_PROCESS) -#define SF_GET_DEBUG(s) (SF_GET (s) & SF_DEBUG) -#define SF_GET_TAGGED(s) (SF_GET (s) & SF_TAGGED) -#define SF_GET_TAG(s) (SF_GET (s) & SF_TAG) -#define SF_GET_GET_SEGMENT(s) (SF_GET (s) & SF_GET_SEGMENT) -#define SF_GET_ADJ_LNNOPTR(s) (SF_GET (s) & SF_ADJ_LNNOPTR) -#define SF_GET_I960(s) (SF_GET (s) & SF_I960_MASK) /* used by i960 */ -#define SF_GET_BALNAME(s) (SF_GET (s) & SF_BALNAME) /* used by i960 */ -#define SF_GET_CALLNAME(s) (SF_GET (s) & SF_CALLNAME) /* used by i960 */ -#define SF_GET_IS_SYSPROC(s) (SF_GET (s) & SF_IS_SYSPROC) /* used by i960 */ -#define SF_GET_SYSPROC(s) (SF_GET (s) & SF_SYSPROC) /* used by i960 */ - -/* Modifiers */ -#define SF_SET(s,v) (SF_GET (s) = (v)) -#define SF_SET_NORMAL_FIELD(s,v)(SF_GET (s) |= ((v) & SF_NORMAL_MASK)) -#define SF_SET_DEBUG_FIELD(s,v) (SF_GET (s) |= ((v) & SF_DEBUG_MASK)) -#define SF_SET_FILE(s) (SF_GET (s) |= SF_FILE) -#define SF_SET_STATICS(s) (SF_GET (s) |= SF_STATICS) -#define SF_SET_DEFINED(s) (SF_GET (s) |= SF_DEFINED) -#define SF_SET_STRING(s) (SF_GET (s) |= SF_STRING) -#define SF_SET_LOCAL(s) (SF_GET (s) |= SF_LOCAL) -#define SF_CLEAR_LOCAL(s) (SF_GET (s) &= ~SF_LOCAL) -#define SF_SET_FUNCTION(s) (SF_GET (s) |= SF_FUNCTION) -#define SF_SET_PROCESS(s) (SF_GET (s) |= SF_PROCESS) -#define SF_SET_DEBUG(s) (SF_GET (s) |= SF_DEBUG) -#define SF_SET_TAGGED(s) (SF_GET (s) |= SF_TAGGED) -#define SF_SET_TAG(s) (SF_GET (s) |= SF_TAG) -#define SF_SET_GET_SEGMENT(s) (SF_GET (s) |= SF_GET_SEGMENT) -#define SF_SET_ADJ_LNNOPTR(s) (SF_GET (s) |= SF_ADJ_LNNOPTR) -#define SF_SET_I960(s,v) (SF_GET (s) |= ((v) & SF_I960_MASK)) /* used by i960 */ -#define SF_SET_BALNAME(s) (SF_GET (s) |= SF_BALNAME) /* used by i960 */ -#define SF_SET_CALLNAME(s) (SF_GET (s) |= SF_CALLNAME) /* used by i960 */ -#define SF_SET_IS_SYSPROC(s) (SF_GET (s) |= SF_IS_SYSPROC) /* used by i960 */ -#define SF_SET_SYSPROC(s,v) (SF_GET (s) |= ((v) & SF_SYSPROC)) /* used by i960 */ - -/* File header macro and type definition */ - -/* - * File position calculators. Beware to use them when all the - * appropriate fields are set in the header. - */ - -#ifdef OBJ_COFF_OMIT_OPTIONAL_HEADER -#define OBJ_COFF_AOUTHDRSZ (0) -#else -#define OBJ_COFF_AOUTHDRSZ (AOUTHDRSZ) -#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */ - -#define H_GET_FILE_SIZE(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h) + \ - H_GET_SYMBOL_TABLE_SIZE(h) + \ - (h)->string_table_size) -#define H_GET_TEXT_FILE_OFFSET(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ) -#define H_GET_DATA_FILE_OFFSET(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h)) -#define H_GET_BSS_FILE_OFFSET(h) 0 -#define H_GET_RELOCATION_FILE_OFFSET(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h)) -#define H_GET_LINENO_FILE_OFFSET(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_RELOCATION_SIZE(h)) -#define H_GET_SYMBOL_TABLE_FILE_OFFSET(h) \ - (long)(FILHSZ + OBJ_COFF_AOUTHDRSZ + \ - H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \ - H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \ - H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h)) - -/* Accessors */ -/* aouthdr */ -#define H_GET_MAGIC_NUMBER(h) ((h)->aouthdr.magic) -#define H_GET_VERSION_STAMP(h) ((h)->aouthdr.vstamp) -#define H_GET_TEXT_SIZE(h) ((h)->aouthdr.tsize) -#define H_GET_DATA_SIZE(h) ((h)->aouthdr.dsize) -#define H_GET_BSS_SIZE(h) ((h)->aouthdr.bsize) -#define H_GET_ENTRY_POINT(h) ((h)->aouthdr.entry) -#define H_GET_TEXT_START(h) ((h)->aouthdr.text_start) -#define H_GET_DATA_START(h) ((h)->aouthdr.data_start) -/* filehdr */ -#define H_GET_FILE_MAGIC_NUMBER(h) ((h)->filehdr.f_magic) -#define H_GET_NUMBER_OF_SECTIONS(h) ((h)->filehdr.f_nscns) -#define H_GET_TIME_STAMP(h) ((h)->filehdr.f_timdat) -#define H_GET_SYMBOL_TABLE_POINTER(h) ((h)->filehdr.f_symptr) -#define H_GET_SYMBOL_COUNT(h) ((h)->filehdr.f_nsyms) -#define H_GET_SYMBOL_TABLE_SIZE(h) (H_GET_SYMBOL_COUNT(h) * SYMESZ) -#define H_GET_SIZEOF_OPTIONAL_HEADER(h) ((h)->filehdr.f_opthdr) -#define H_GET_FLAGS(h) ((h)->filehdr.f_flags) -/* Extra fields to achieve bsd a.out compatibility and for convenience */ -#define H_GET_RELOCATION_SIZE(h) ((h)->relocation_size) -#define H_GET_STRING_SIZE(h) ((h)->string_table_size) -#define H_GET_LINENO_SIZE(h) ((h)->lineno_size) - -#ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER -#define H_GET_HEADER_SIZE(h) (sizeof(FILHDR) \ - + sizeof(AOUTHDR)\ - + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ)) -#else /* OBJ_COFF_OMIT_OPTIONAL_HEADER */ -#define H_GET_HEADER_SIZE(h) (sizeof(FILHDR) \ - + (H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ)) -#endif /* OBJ_COFF_OMIT_OPTIONAL_HEADER */ - -#define H_GET_TEXT_RELOCATION_SIZE(h) (text_section_header.s_nreloc * RELSZ) -#define H_GET_DATA_RELOCATION_SIZE(h) (data_section_header.s_nreloc * RELSZ) - -/* Modifiers */ -/* aouthdr */ -#define H_SET_MAGIC_NUMBER(h,v) ((h)->aouthdr.magic = (v)) -#define H_SET_VERSION_STAMP(h,v) ((h)->aouthdr.vstamp = (v)) -#define H_SET_TEXT_SIZE(h,v) ((h)->aouthdr.tsize = (v)) -#define H_SET_DATA_SIZE(h,v) ((h)->aouthdr.dsize = (v)) -#define H_SET_BSS_SIZE(h,v) ((h)->aouthdr.bsize = (v)) -#define H_SET_ENTRY_POINT(h,v) ((h)->aouthdr.entry = (v)) -#define H_SET_TEXT_START(h,v) ((h)->aouthdr.text_start = (v)) -#define H_SET_DATA_START(h,v) ((h)->aouthdr.data_start = (v)) -/* filehdr */ -#define H_SET_FILE_MAGIC_NUMBER(h,v) ((h)->filehdr.f_magic = (v)) -#define H_SET_NUMBER_OF_SECTIONS(h,v) ((h)->filehdr.f_nscns = (v)) -#define H_SET_TIME_STAMP(h,v) ((h)->filehdr.f_timdat = (v)) -#define H_SET_SYMBOL_TABLE_POINTER(h,v) ((h)->filehdr.f_symptr = (v)) -#define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->filehdr.f_nsyms = (v)) -#define H_SET_SIZEOF_OPTIONAL_HEADER(h,v) ((h)->filehdr.f_opthdr = (v)) -#define H_SET_FLAGS(h,v) ((h)->filehdr.f_flags = (v)) -/* Extra fields to achieve bsd a.out compatibility and for convinience */ -#define H_SET_RELOCATION_SIZE(h,t,d) ((h)->relocation_size = (t)+(d)) -#define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v)) -#define H_SET_LINENO_SIZE(h,v) ((h)->lineno_size = (v)) - -/* Segment flipping */ - -typedef struct -{ - struct internal_aouthdr aouthdr; /* a.out header */ - struct internal_filehdr filehdr; /* File header, not machine dep. */ - long string_table_size; /* names + '\0' + sizeof(int) */ - long relocation_size; /* Cumulated size of relocation - information for all sections in - bytes. */ - long lineno_size; /* Size of the line number information - table in bytes */ -} object_headers; - - - -struct lineno_list -{ - struct bfd_internal_lineno line; - char *frag; /* Frag to which the line number is related */ - struct lineno_list *next; /* Forward chain pointer */ -}; - - - - -#define obj_segment_name(i) (segment_info[(int) (i)].scnhdr.s_name) - -#define obj_add_segment(s) obj_coff_add_segment (s) - -extern segT obj_coff_add_segment PARAMS ((const char *)); - -extern void obj_coff_section PARAMS ((int)); - -extern void c_dot_file_symbol PARAMS ((char *filename)); -#define obj_app_file c_dot_file_symbol -extern void obj_extra_stuff PARAMS ((object_headers * headers)); - -extern segT s_get_segment PARAMS ((symbolS *ptr)); - -extern void c_section_header PARAMS ((struct internal_scnhdr * header, - char *name, - long core_address, - long size, - long data_ptr, - long reloc_ptr, - long lineno_ptr, - long reloc_number, - long lineno_number, - long alignment)); - -#ifndef tc_coff_symbol_emit_hook -void tc_coff_symbol_emit_hook PARAMS ((symbolS *)); -#endif - -/* sanity check */ - -#ifdef TC_I960 -#ifndef C_LEAFSTAT -hey ! Where is the C_LEAFSTAT definition ? i960 - coff support is depending on it. -#endif /* no C_LEAFSTAT */ -#endif /* TC_I960 */ -extern struct internal_scnhdr data_section_header; -extern struct internal_scnhdr text_section_header; - -/* Forward the segment of a forwarded symbol. */ -#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \ - (SF_GET_GET_SEGMENT (dest) \ - ? (S_SET_SEGMENT (dest, S_GET_SEGMENT (src)), 0) \ - : 0) - -#ifdef TE_PE -#define obj_handle_link_once(t) obj_coff_pe_handle_link_once (t) -extern void obj_coff_pe_handle_link_once (); -#endif - -#endif /* not BFD_ASSEMBLER */ - -extern const pseudo_typeS coff_pseudo_table[]; - -#ifndef obj_pop_insert -#define obj_pop_insert() pop_insert (coff_pseudo_table) -#endif - -/* In COFF, if a symbol is defined using .def/.val SYM/.endef, it's OK - to redefine the symbol later on. This can happen if C symbols use - a prefix, and a symbol is defined both with and without the prefix, - as in start/_start/__start in gcc/libgcc1-test.c. */ -#define RESOLVE_SYMBOL_REDEFINITION(sym) \ -(SF_GET_GET_SEGMENT (sym) \ - ? (sym->sy_frag = frag_now, \ - S_SET_VALUE (sym, frag_now_fix ()), \ - S_SET_SEGMENT (sym, now_seg), \ - 0) \ - : 0) - -/* Stabs in a coff file go into their own section. */ -#define SEPARATE_STAB_SECTIONS 1 - -/* We need 12 bytes at the start of the section to hold some initial - information. */ -extern void obj_coff_init_stab_section PARAMS ((segT)); -#define INIT_STAB_SECTION(seg) obj_coff_init_stab_section (seg) - -/* Store the number of relocations in the section aux entry. */ -#define SET_SECTION_RELOCS(sec, relocs, n) \ - SA_SET_SCN_NRELOC (section_symbol (sec), n) - -#endif /* OBJ_FORMAT_H */ diff --git a/gas/config/obj-ecoff.c b/gas/config/obj-ecoff.c deleted file mode 100644 index 767dc588c82..00000000000 --- a/gas/config/obj-ecoff.c +++ /dev/null @@ -1,315 +0,0 @@ -/* ECOFF object file format. - Copyright (C) 1993, 94, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - Contributed by Cygnus Support. - This file was put together by Ian Lance Taylor . - - This file is part of GAS. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#define OBJ_HEADER "obj-ecoff.h" -#include "as.h" -#include "coff/internal.h" -#include "bfd/libcoff.h" -#include "bfd/libecoff.h" - -/* Almost all of the ECOFF support is actually in ecoff.c in the main - gas directory. This file mostly just arranges to call that one at - the right times. */ - -static int ecoff_sec_sym_ok_for_reloc PARAMS ((asection *)); -static void obj_ecoff_frob_symbol PARAMS ((symbolS *, int *)); -static void ecoff_pop_insert PARAMS ((void)); - -/* These are the pseudo-ops we support in this file. Only those - relating to debugging information are supported here. - - The following pseudo-ops from the Kane and Heinrich MIPS book - should be defined here, but are currently unsupported: .aent, - .bgnb, .endb, .verstamp, .vreg. - - The following pseudo-ops from the Kane and Heinrich MIPS book are - MIPS CPU specific, and should be defined by tc-mips.c: .alias, - .extern, .galive, .gjaldef, .gjrlive, .livereg, .noalias, .option, - .rdata, .sdata, .set. - - The following pseudo-ops from the Kane and Heinrich MIPS book are - not MIPS CPU specific, but are also not ECOFF specific. I have - only listed the ones which are not already in read.c. It's not - completely clear where these should be defined, but tc-mips.c is - probably the most reasonable place: .asciiz, .asm0, .endr, .err, - .half, .lab, .repeat, .struct, .weakext. */ - -const pseudo_typeS obj_pseudo_table[] = -{ - /* COFF style debugging information. .ln is not used; .loc is used - instead. */ - { "def", ecoff_directive_def, 0 }, - { "dim", ecoff_directive_dim, 0 }, - { "endef", ecoff_directive_endef, 0 }, - { "file", ecoff_directive_file, 0 }, - { "scl", ecoff_directive_scl, 0 }, - { "size", ecoff_directive_size, 0 }, - { "esize", ecoff_directive_size, 0 }, - { "tag", ecoff_directive_tag, 0 }, - { "type", ecoff_directive_type, 0 }, - { "etype", ecoff_directive_type, 0 }, - { "val", ecoff_directive_val, 0 }, - - /* ECOFF specific debugging information. */ - { "begin", ecoff_directive_begin, 0 }, - { "bend", ecoff_directive_bend, 0 }, - { "end", ecoff_directive_end, 0 }, - { "ent", ecoff_directive_ent, 0 }, - { "fmask", ecoff_directive_fmask, 0 }, - { "frame", ecoff_directive_frame, 0 }, - { "loc", ecoff_directive_loc, 0 }, - { "mask", ecoff_directive_mask, 0 }, - - /* Other ECOFF directives. */ - { "extern", ecoff_directive_extern, 0 }, - -#ifndef TC_MIPS - /* For TC_MIPS, tc-mips.c adds this. */ - { "weakext", ecoff_directive_weakext, 0 }, -#endif - - /* These are used on Irix. I don't know how to implement them. */ - { "bgnb", s_ignore, 0 }, - { "endb", s_ignore, 0 }, - { "verstamp", s_ignore, 0 }, - - /* Sentinel. */ - { NULL } -}; - -/* Swap out the symbols and debugging information for BFD. */ - -void -ecoff_frob_file () -{ - const struct ecoff_debug_swap * const debug_swap - = &ecoff_backend (stdoutput)->debug_swap; - bfd_vma addr; - asection *sec; - HDRR *hdr; - char *buf; - char *set; - - /* Set the section VMA values. We force the .sdata and .sbss - sections to the end to ensure that their VMA addresses are close - together so that the GP register can address both of them. We - put the .bss section after the .sbss section. - - Also, for the Alpha, we must sort the sections, to make sure they - appear in the output file in the correct order. (Actually, maybe - this is a job for BFD. But the VMAs computed would be out of - whack if we computed them given our initial, random ordering. - It's possible that that wouldn't break things; I could do some - experimenting sometime and find out. - - This output ordering of sections is magic, on the Alpha, at - least. The .lita section must come before .lit8 and .lit4, - otherwise the OSF/1 linker may silently trash the .lit{4,8} - section contents. Also, .text must preceed .rdata. These differ - from the order described in some parts of the DEC OSF/1 Assembly - Language Programmer's Guide, but that order doesn't seem to work - with their linker. - - I don't know if section ordering on the MIPS is important. */ - - static const char *const names[] = { - /* text segment */ - ".text", ".rdata", ".init", ".fini", - /* data segment */ - ".data", ".lita", ".lit8", ".lit4", ".sdata", ".got", - /* bss segment */ - ".sbss", ".bss", - }; -#define n_names (sizeof (names) / sizeof (names[0])) - - addr = 0; - { - /* Sections that match names, order to be straightened out later. */ - asection *secs[n_names]; - /* Linked list of sections with non-matching names. Random ordering. */ - asection *other_sections = 0; - /* Pointer to next section, since we're destroying the original - ordering. */ - asection *next; - - int i; - - for (i = 0; i < n_names; i++) - secs[i] = 0; - for (sec = stdoutput->sections; sec != (asection *) NULL; sec = next) - { - next = sec->next; - for (i = 0; i < n_names; i++) - if (!strcmp (sec->name, names[i])) - { - secs[i] = sec; - break; - } - if (i == n_names) - { - bfd_set_section_vma (stdoutput, sec, addr); - addr += bfd_section_size (stdoutput, sec); - sec->next = other_sections; - other_sections = sec; - } - } - for (i = 0; i < n_names; i++) - if (secs[i]) - { - sec = secs[i]; - bfd_set_section_vma (stdoutput, sec, addr); - addr += bfd_section_size (stdoutput, sec); - } - for (i = n_names - 1; i >= 0; i--) - if (secs[i]) - { - sec = secs[i]; - sec->next = other_sections; - other_sections = sec; - } - stdoutput->sections = other_sections; - } - - /* Build the ECOFF debugging information. */ - assert (ecoff_data (stdoutput) != 0); - hdr = &ecoff_data (stdoutput)->debug_info.symbolic_header; - ecoff_build_debug (hdr, &buf, debug_swap); - - /* Finish up the ecoff_tdata structure. */ - set = buf; -#define SET(ptr, count, type, size) \ - if (hdr->count == 0) \ - ecoff_data (stdoutput)->debug_info.ptr = (type) NULL; \ - else \ - { \ - ecoff_data (stdoutput)->debug_info.ptr = (type) set; \ - set += hdr->count * size; \ - } - - SET (line, cbLine, unsigned char *, sizeof (unsigned char)); - SET (external_dnr, idnMax, PTR, debug_swap->external_dnr_size); - SET (external_pdr, ipdMax, PTR, debug_swap->external_pdr_size); - SET (external_sym, isymMax, PTR, debug_swap->external_sym_size); - SET (external_opt, ioptMax, PTR, debug_swap->external_opt_size); - SET (external_aux, iauxMax, union aux_ext *, sizeof (union aux_ext)); - SET (ss, issMax, char *, sizeof (char)); - SET (ssext, issExtMax, char *, sizeof (char)); - SET (external_rfd, crfd, PTR, debug_swap->external_rfd_size); - SET (external_fdr, ifdMax, PTR, debug_swap->external_fdr_size); - SET (external_ext, iextMax, PTR, debug_swap->external_ext_size); - -#undef SET - - /* Fill in the register masks. */ - { - unsigned long gprmask = 0; - unsigned long fprmask = 0; - unsigned long *cprmask = NULL; - -#ifdef TC_MIPS - /* Fill in the MIPS register masks. It's probably not worth - setting up a generic interface for this. */ - gprmask = mips_gprmask; - cprmask = mips_cprmask; -#endif - -#ifdef TC_ALPHA - alpha_frob_ecoff_data (); - - if (! bfd_ecoff_set_gp_value (stdoutput, alpha_gp_value)) - as_fatal (_("Can't set GP value")); - - gprmask = alpha_gprmask; - fprmask = alpha_fprmask; -#endif - - if (! bfd_ecoff_set_regmasks (stdoutput, gprmask, fprmask, cprmask)) - as_fatal (_("Can't set register masks")); - } -} - -/* This is called by the ECOFF code to set the external information - for a symbol. We just pass it on to BFD, which expects the swapped - information to be stored in the native field of the symbol. */ - -void -obj_ecoff_set_ext (sym, ext) - symbolS *sym; - EXTR *ext; -{ - const struct ecoff_debug_swap * const debug_swap - = &ecoff_backend (stdoutput)->debug_swap; - ecoff_symbol_type *esym; - - know (bfd_asymbol_flavour (symbol_get_bfdsym (sym)) - == bfd_target_ecoff_flavour); - esym = ecoffsymbol (symbol_get_bfdsym (sym)); - esym->local = false; - esym->native = xmalloc (debug_swap->external_ext_size); - (*debug_swap->swap_ext_out) (stdoutput, ext, esym->native); -} - -static int -ecoff_sec_sym_ok_for_reloc (sec) - asection *sec; -{ - return 1; -} - -static void -obj_ecoff_frob_symbol (sym, puntp) - symbolS *sym; - int *puntp; -{ - ecoff_frob_symbol (sym); -} - -static void -ecoff_pop_insert () -{ - pop_insert (obj_pseudo_table); -} - -const struct format_ops ecoff_format_ops = -{ - bfd_target_ecoff_flavour, - 0, /* dfl_leading_underscore */ - 1, /* emit_section_symbols */ - obj_ecoff_frob_symbol, - ecoff_frob_file, - 0, /* frob_file_after_relocs */ - 0, /* s_get_size */ - 0, /* s_set_size */ - 0, /* s_get_align */ - 0, /* s_set_align */ - 0, /* s_get_other */ - 0, /* s_get_desc */ - 0, /* copy_symbol_attributes */ - ecoff_generate_asm_lineno, - ecoff_stab, - ecoff_sec_sym_ok_for_reloc, - ecoff_pop_insert, - ecoff_set_ext, - ecoff_read_begin_hook, - ecoff_symbol_new_hook, -}; diff --git a/gas/config/obj-ecoff.h b/gas/config/obj-ecoff.h deleted file mode 100644 index 8bca254c0ce..00000000000 --- a/gas/config/obj-ecoff.h +++ /dev/null @@ -1,71 +0,0 @@ -/* ECOFF object file format header file. - Copyright (C) 1993, 94, 95, 96, 97, 1999 Free Software Foundation, Inc. - Contributed by Cygnus Support. - Written by Ian Lance Taylor . - - This file is part of GAS. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#define OBJ_ECOFF 1 - -/* Use the generic ECOFF debugging code. */ -#define ECOFF_DEBUGGING 1 - -#define OUTPUT_FLAVOR bfd_target_ecoff_flavour - -#include "targ-cpu.h" - -#include "ecoff.h" - -/* For each gas symbol we keep track of which file it came from, of - whether we have generated an ECOFF symbol for it, and whether the - symbols is undefined (this last is needed to distinguish a .extern - symbols from a .comm symbol). */ - -struct ecoff_sy_obj -{ - struct efdr *ecoff_file; - struct localsym *ecoff_symbol; - valueT ecoff_extern_size; -}; - -#define OBJ_SYMFIELD_TYPE struct ecoff_sy_obj - -/* Modify the ECOFF symbol. */ -#define obj_frob_symbol(symp, punt) ecoff_frob_symbol (symp) - -/* This is used to write the symbolic data in the format that BFD - expects it. */ -extern void ecoff_frob_file PARAMS ((void)); -#define obj_frob_file() ecoff_frob_file () - -/* We use the ECOFF functions as our hooks. */ -#define obj_read_begin_hook ecoff_read_begin_hook -#define obj_symbol_new_hook ecoff_symbol_new_hook - -/* Record file switches in the ECOFF symbol table. */ -#define obj_app_file(name) ecoff_new_file (name) - -/* At the moment we don't want to do any stabs processing in read.c. */ -#define OBJ_PROCESS_STAB(seg, what, string, type, other, desc) \ - ecoff_stab ((seg), (what), (string), (type), (other), (desc)) - -#define EMIT_SECTION_SYMBOLS 0 -#define obj_sec_sym_ok_for_reloc(SEC) 1 - -#define obj_ecoff_set_ext ecoff_set_ext -extern void obj_ecoff_set_ext PARAMS ((symbolS *, EXTR *)); diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c deleted file mode 100644 index 21fd0fa2241..00000000000 --- a/gas/config/obj-elf.c +++ /dev/null @@ -1,1922 +0,0 @@ -/* ELF object file format - Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2, - or (at your option) any later version. - - GAS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#define OBJ_HEADER "obj-elf.h" -#include "as.h" -#include "subsegs.h" -#include "obstack.h" - -#ifndef ECOFF_DEBUGGING -#define ECOFF_DEBUGGING 0 -#else -#define NEED_ECOFF_DEBUG -#endif - -#ifdef NEED_ECOFF_DEBUG -#include "ecoff.h" -#endif - -#ifdef TC_ALPHA -#include "elf/alpha.h" -#endif - -#ifdef TC_MIPS -#include "elf/mips.h" -#endif - -#ifdef TC_PPC -#include "elf/ppc.h" -#endif - -#ifdef TC_I370 -#include "elf/i370.h" -#endif - -static bfd_vma elf_s_get_size PARAMS ((symbolS *)); -static void elf_s_set_size PARAMS ((symbolS *, bfd_vma)); -static bfd_vma elf_s_get_align PARAMS ((symbolS *)); -static void elf_s_set_align PARAMS ((symbolS *, bfd_vma)); -static void elf_copy_symbol_attributes PARAMS ((symbolS *, symbolS *)); -static int elf_sec_sym_ok_for_reloc PARAMS ((asection *)); -static void adjust_stab_sections PARAMS ((bfd *, asection *, PTR)); - -#ifdef NEED_ECOFF_DEBUG -static boolean elf_get_extr PARAMS ((asymbol *, EXTR *)); -static void elf_set_index PARAMS ((asymbol *, bfd_size_type)); -#endif - -static void obj_elf_line PARAMS ((int)); -void obj_elf_version PARAMS ((int)); -static void obj_elf_size PARAMS ((int)); -static void obj_elf_type PARAMS ((int)); -static void obj_elf_ident PARAMS ((int)); -static void obj_elf_weak PARAMS ((int)); -static void obj_elf_local PARAMS ((int)); -static void obj_elf_visibility PARAMS ((int)); -static void obj_elf_symver PARAMS ((int)); -static void obj_elf_vtable_inherit PARAMS ((int)); -static void obj_elf_vtable_entry PARAMS ((int)); -static void obj_elf_subsection PARAMS ((int)); -static void obj_elf_popsection PARAMS ((int)); - -static const pseudo_typeS elf_pseudo_table[] = -{ - {"comm", obj_elf_common, 0}, - {"common", obj_elf_common, 1}, - {"ident", obj_elf_ident, 0}, - {"local", obj_elf_local, 0}, - {"previous", obj_elf_previous, 0}, - {"section", obj_elf_section, 0}, - {"section.s", obj_elf_section, 0}, - {"sect", obj_elf_section, 0}, - {"sect.s", obj_elf_section, 0}, - {"pushsection", obj_elf_section, 1}, - {"popsection", obj_elf_popsection, 0}, - {"size", obj_elf_size, 0}, - {"type", obj_elf_type, 0}, - {"version", obj_elf_version, 0}, - {"weak", obj_elf_weak, 0}, - - /* These define symbol visibility. */ - {"internal", obj_elf_visibility, STV_INTERNAL}, - {"hidden", obj_elf_visibility, STV_HIDDEN}, - {"protected", obj_elf_visibility, STV_PROTECTED}, - - /* These are used for stabs-in-elf configurations. */ - {"line", obj_elf_line, 0}, - - /* This is a GNU extension to handle symbol versions. */ - {"symver", obj_elf_symver, 0}, - - /* A GNU extension to change subsection only. */ - {"subsection", obj_elf_subsection, 0}, - - /* These are GNU extensions to aid in garbage collecting C++ vtables. */ - {"vtable_inherit", obj_elf_vtable_inherit, 0}, - {"vtable_entry", obj_elf_vtable_entry, 0}, - - /* These are used for dwarf. */ - {"2byte", cons, 2}, - {"4byte", cons, 4}, - {"8byte", cons, 8}, - - /* We need to trap the section changing calls to handle .previous. */ - {"data", obj_elf_data, 0}, - {"text", obj_elf_text, 0}, - - /* End sentinel. */ - {NULL, NULL, 0}, -}; - -static const pseudo_typeS ecoff_debug_pseudo_table[] = -{ -#ifdef NEED_ECOFF_DEBUG - /* COFF style debugging information for ECOFF. .ln is not used; .loc - is used instead. */ - { "def", ecoff_directive_def, 0 }, - { "dim", ecoff_directive_dim, 0 }, - { "endef", ecoff_directive_endef, 0 }, - { "file", ecoff_directive_file, 0 }, - { "scl", ecoff_directive_scl, 0 }, - { "tag", ecoff_directive_tag, 0 }, - { "val", ecoff_directive_val, 0 }, - - /* COFF debugging requires pseudo-ops .size and .type, but ELF - already has meanings for those. We use .esize and .etype - instead. These are only generated by gcc anyhow. */ - { "esize", ecoff_directive_size, 0 }, - { "etype", ecoff_directive_type, 0 }, - - /* ECOFF specific debugging information. */ - { "begin", ecoff_directive_begin, 0 }, - { "bend", ecoff_directive_bend, 0 }, - { "end", ecoff_directive_end, 0 }, - { "ent", ecoff_directive_ent, 0 }, - { "fmask", ecoff_directive_fmask, 0 }, - { "frame", ecoff_directive_frame, 0 }, - { "loc", ecoff_directive_loc, 0 }, - { "mask", ecoff_directive_mask, 0 }, - - /* Other ECOFF directives. */ - { "extern", ecoff_directive_extern, 0 }, - - /* These are used on Irix. I don't know how to implement them. */ - { "alias", s_ignore, 0 }, - { "bgnb", s_ignore, 0 }, - { "endb", s_ignore, 0 }, - { "lab", s_ignore, 0 }, - { "noalias", s_ignore, 0 }, - { "verstamp", s_ignore, 0 }, - { "vreg", s_ignore, 0 }, -#endif - - {NULL, NULL, 0} /* end sentinel */ -}; - -#undef NO_RELOC -#include "aout/aout64.h" - -/* This is called when the assembler starts. */ - -void -elf_begin () -{ - /* Add symbols for the known sections to the symbol table. */ - symbol_table_insert (section_symbol (bfd_get_section_by_name (stdoutput, - TEXT_SECTION_NAME))); - symbol_table_insert (section_symbol (bfd_get_section_by_name (stdoutput, - DATA_SECTION_NAME))); - symbol_table_insert (section_symbol (bfd_get_section_by_name (stdoutput, - BSS_SECTION_NAME))); -} - -void -elf_pop_insert () -{ - pop_insert (elf_pseudo_table); - if (ECOFF_DEBUGGING) - pop_insert (ecoff_debug_pseudo_table); -} - -static bfd_vma -elf_s_get_size (sym) - symbolS *sym; -{ - return S_GET_SIZE (sym); -} - -static void -elf_s_set_size (sym, sz) - symbolS *sym; - bfd_vma sz; -{ - S_SET_SIZE (sym, sz); -} - -static bfd_vma -elf_s_get_align (sym) - symbolS *sym; -{ - return S_GET_ALIGN (sym); -} - -static void -elf_s_set_align (sym, align) - symbolS *sym; - bfd_vma align; -{ - S_SET_ALIGN (sym, align); -} - -int -elf_s_get_other (sym) - symbolS *sym; -{ - return elf_symbol (symbol_get_bfdsym (sym))->internal_elf_sym.st_other; -} - -static void -elf_copy_symbol_attributes (dest, src) - symbolS *dest, *src; -{ - OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src); -} - -static int -elf_sec_sym_ok_for_reloc (sec) - asection *sec; -{ - return obj_sec_sym_ok_for_reloc (sec); -} - -void -elf_file_symbol (s) - char *s; -{ - symbolS *sym; - - sym = symbol_new (s, absolute_section, (valueT) 0, (struct frag *) 0); - symbol_set_frag (sym, &zero_address_frag); - symbol_get_bfdsym (sym)->flags |= BSF_FILE; - - if (symbol_rootP != sym) - { - symbol_remove (sym, &symbol_rootP, &symbol_lastP); - symbol_insert (sym, symbol_rootP, &symbol_rootP, &symbol_lastP); -#ifdef DEBUG - verify_symbol_chain (symbol_rootP, symbol_lastP); -#endif - } - -#ifdef NEED_ECOFF_DEBUG - ecoff_new_file (s); -#endif -} - -void -obj_elf_common (is_common) - int is_common; -{ - char *name; - char c; - char *p; - int temp, size; - symbolS *symbolP; - int have_align; - - if (flag_mri && is_common) - { - s_mri_common (0); - return; - } - - name = input_line_pointer; - c = get_symbol_end (); - /* just after name is now '\0' */ - p = input_line_pointer; - *p = c; - SKIP_WHITESPACE (); - if (*input_line_pointer != ',') - { - as_bad (_("Expected comma after symbol-name")); - ignore_rest_of_line (); - return; - } - input_line_pointer++; /* skip ',' */ - if ((temp = get_absolute_expression ()) < 0) - { - as_bad (_(".COMMon length (%d.) <0! Ignored."), temp); - ignore_rest_of_line (); - return; - } - size = temp; - *p = 0; - symbolP = symbol_find_or_make (name); - *p = c; - if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP)) - { - as_bad (_("Ignoring attempt to re-define symbol")); - ignore_rest_of_line (); - return; - } - if (S_GET_VALUE (symbolP) != 0) - { - if (S_GET_VALUE (symbolP) != (valueT) size) - { - as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %d."), - S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size); - } - } - know (symbolP->sy_frag == &zero_address_frag); - if (*input_line_pointer != ',') - have_align = 0; - else - { - have_align = 1; - input_line_pointer++; - SKIP_WHITESPACE (); - } - if (! have_align || *input_line_pointer != '"') - { - if (! have_align) - temp = 0; - else - { - temp = get_absolute_expression (); - if (temp < 0) - { - temp = 0; - as_warn (_("Common alignment negative; 0 assumed")); - } - } - if (symbol_get_obj (symbolP)->local) - { - segT old_sec; - int old_subsec; - char *pfrag; - int align; - - /* allocate_bss: */ - old_sec = now_seg; - old_subsec = now_subseg; - if (temp) - { - /* convert to a power of 2 alignment */ - for (align = 0; (temp & 1) == 0; temp >>= 1, ++align); - if (temp != 1) - { - as_bad (_("Common alignment not a power of 2")); - ignore_rest_of_line (); - return; - } - } - else - align = 0; - record_alignment (bss_section, align); - subseg_set (bss_section, 0); - if (align) - frag_align (align, 0, 0); - if (S_GET_SEGMENT (symbolP) == bss_section) - symbol_get_frag (symbolP)->fr_symbol = 0; - symbol_set_frag (symbolP, frag_now); - pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, - (offsetT) size, (char *) 0); - *pfrag = 0; - S_SET_SIZE (symbolP, size); - S_SET_SEGMENT (symbolP, bss_section); - S_CLEAR_EXTERNAL (symbolP); - subseg_set (old_sec, old_subsec); - } - else - { - allocate_common: - S_SET_VALUE (symbolP, (valueT) size); - S_SET_ALIGN (symbolP, temp); - S_SET_EXTERNAL (symbolP); - S_SET_SEGMENT (symbolP, bfd_com_section_ptr); - } - } - else - { - input_line_pointer++; - /* @@ Some use the dot, some don't. Can we get some consistency?? */ - if (*input_line_pointer == '.') - input_line_pointer++; - /* @@ Some say data, some say bss. */ - if (strncmp (input_line_pointer, "bss\"", 4) - && strncmp (input_line_pointer, "data\"", 5)) - { - while (*--input_line_pointer != '"') - ; - input_line_pointer--; - goto bad_common_segment; - } - while (*input_line_pointer++ != '"') - ; - goto allocate_common; - } - - symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT; - - demand_empty_rest_of_line (); - return; - - { - bad_common_segment: - p = input_line_pointer; - while (*p && *p != '\n') - p++; - c = *p; - *p = '\0'; - as_bad (_("bad .common segment %s"), input_line_pointer + 1); - *p = c; - input_line_pointer = p; - ignore_rest_of_line (); - return; - } -} - -static void -obj_elf_local (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *name; - int c; - symbolS *symbolP; - - do - { - name = input_line_pointer; - c = get_symbol_end (); - symbolP = symbol_find_or_make (name); - *input_line_pointer = c; - SKIP_WHITESPACE (); - S_CLEAR_EXTERNAL (symbolP); - symbol_get_obj (symbolP)->local = 1; - if (c == ',') - { - input_line_pointer++; - SKIP_WHITESPACE (); - if (*input_line_pointer == '\n') - c = '\n'; - } - } - while (c == ','); - demand_empty_rest_of_line (); -} - -static void -obj_elf_weak (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *name; - int c; - symbolS *symbolP; - - do - { - name = input_line_pointer; - c = get_symbol_end (); - symbolP = symbol_find_or_make (name); - *input_line_pointer = c; - SKIP_WHITESPACE (); - S_SET_WEAK (symbolP); - symbol_get_obj (symbolP)->local = 1; - if (c == ',') - { - input_line_pointer++; - SKIP_WHITESPACE (); - if (*input_line_pointer == '\n') - c = '\n'; - } - } - while (c == ','); - demand_empty_rest_of_line (); -} - -static void -obj_elf_visibility (visibility) - int visibility; -{ - char *name; - int c; - symbolS *symbolP; - asymbol *bfdsym; - elf_symbol_type *elfsym; - - do - { - name = input_line_pointer; - c = get_symbol_end (); - symbolP = symbol_find_or_make (name); - *input_line_pointer = c; - - SKIP_WHITESPACE (); - - bfdsym = symbol_get_bfdsym (symbolP); - elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym); - - assert (elfsym); - - elfsym->internal_elf_sym.st_other = visibility; - - if (c == ',') - { - input_line_pointer ++; - - SKIP_WHITESPACE (); - - if (*input_line_pointer == '\n') - c = '\n'; - } - } - while (c == ','); - - demand_empty_rest_of_line (); -} - - -static segT previous_section; -static int previous_subsection; - -struct section_stack -{ - struct section_stack *next; - segT seg, prev_seg; - int subseg, prev_subseg; -}; - -static struct section_stack *section_stack; - - -/* Handle the .section pseudo-op. This code supports two different - syntaxes. - - The first is found on Solaris, and looks like - .section ".sec1",#alloc,#execinstr,#write - Here the names after '#' are the SHF_* flags to turn on for the - section. I'm not sure how it determines the SHT_* type (BFD - doesn't really give us control over the type, anyhow). - - The second format is found on UnixWare, and probably most SVR4 - machines, and looks like - .section .sec1,"a",@progbits - The quoted string may contain any combination of a, w, x, and - represents the SHF_* flags to turn on for the section. The string - beginning with '@' can be progbits or nobits. There should be - other possibilities, but I don't know what they are. In any case, - BFD doesn't really let us set the section type. */ - -/* Certain named sections have particular defined types, listed on p. - 4-19 of the ABI. */ -struct special_section -{ - const char *name; - int type; - int attributes; -}; - -static struct special_section const special_sections[] = -{ - { ".bss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE }, - { ".comment", SHT_PROGBITS, 0 }, - { ".data", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, - { ".data1", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, - { ".debug", SHT_PROGBITS, 0 }, - { ".fini", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, - { ".init", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, - { ".line", SHT_PROGBITS, 0 }, - { ".note", SHT_NOTE, 0 }, - { ".rodata", SHT_PROGBITS, SHF_ALLOC }, - { ".rodata1", SHT_PROGBITS, SHF_ALLOC }, - { ".text", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, - -#ifdef ELF_TC_SPECIAL_SECTIONS - ELF_TC_SPECIAL_SECTIONS -#endif - -#if 0 - /* The following section names are special, but they can not - reasonably appear in assembler code. Some of the attributes are - processor dependent. */ - { ".dynamic", SHT_DYNAMIC, SHF_ALLOC /* + SHF_WRITE */ }, - { ".dynstr", SHT_STRTAB, SHF_ALLOC }, - { ".dynsym", SHT_DYNSYM, SHF_ALLOC }, - { ".got", SHT_PROGBITS, 0 }, - { ".hash", SHT_HASH, SHF_ALLOC }, - { ".interp", SHT_PROGBITS, /* SHF_ALLOC */ }, - { ".plt", SHT_PROGBITS, 0 }, - { ".shstrtab",SHT_STRTAB, 0 }, - { ".strtab", SHT_STRTAB, /* SHF_ALLOC */ }, - { ".symtab", SHT_SYMTAB, /* SHF_ALLOC */ }, -#endif - - { NULL, 0, 0 } -}; - -void -obj_elf_change_section (name, type, attr, push) - char *name; - int type, attr, push; -{ - int new_sec; - segT sec; - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - /* Switch to the section, creating it if necessary. */ - if (push) - { - struct section_stack *elt; - elt = xmalloc (sizeof (struct section_stack)); - elt->next = section_stack; - elt->seg = now_seg; - elt->prev_seg = previous_section; - elt->subseg = now_subseg; - elt->prev_subseg = previous_subsection; - section_stack = elt; - } - previous_section = now_seg; - previous_subsection = now_subseg; - - new_sec = bfd_get_section_by_name (stdoutput, name) == NULL; - sec = subseg_new (name, 0); - - if (new_sec) - { - flagword flags; - symbolS *secsym; - int i; - - /* See if this is one of the special sections. */ - for (i = 0; special_sections[i].name != NULL; i++) - if (strcmp (name, special_sections[i].name) == 0) - { - if (type == SHT_NULL) - type = special_sections[i].type; - else if (type != special_sections[i].type) - as_warn (_("Setting incorrect section type for %s"), name); - - if ((attr &~ special_sections[i].attributes) != 0) - { - /* As a GNU extension, we permit a .note section to be - allocatable. If the linker sees an allocateable .note - section, it will create a PT_NOTE segment in the output - file. */ - if (strcmp (name, ".note") != 0 - || attr != SHF_ALLOC) - as_warn (_("Setting incorrect section attributes for %s"), - name); - } - attr |= special_sections[i].attributes; - break; - } - - /* Convert ELF type and flags to BFD flags. */ - flags = (SEC_RELOC - | ((attr & SHF_WRITE) ? 0 : SEC_READONLY) - | ((attr & SHF_ALLOC) ? SEC_ALLOC : 0) - | (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0) - | ((attr & SHF_EXECINSTR) ? SEC_CODE : 0)); -#ifdef md_elf_section_flags - flags = md_elf_section_flags (flags, attr, type); -#endif - - /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */ - if (type == SHT_NOBITS) - seg_info (sec)->bss = 1; - - bfd_set_section_flags (stdoutput, sec, flags); - - /* Add a symbol for this section to the symbol table. */ - secsym = symbol_find (name); - if (secsym != NULL) - symbol_set_bfdsym (secsym, sec->symbol); - else - symbol_table_insert (section_symbol (sec)); - } - -#ifdef md_elf_section_change_hook - md_elf_section_change_hook (); -#endif -} - -int -obj_elf_parse_section_letters (str, len) - char *str; - size_t len; -{ - int attr = 0; - - while (len > 0) - { - switch (*str) - { - case 'a': - attr |= SHF_ALLOC; - break; - case 'w': - attr |= SHF_WRITE; - break; - case 'x': - attr |= SHF_EXECINSTR; - break; - default: - { - char *bad_msg = _("Unrecognized .section attribute: want a,w,x"); -#ifdef md_elf_section_letter - int md_attr = md_elf_section_letter (*str, &bad_msg); - if (md_attr >= 0) - attr |= md_attr; - else -#endif - { - as_warn ("%s", bad_msg); - attr = -1; - } - } - break; - } - str++, len--; - } - - return attr; -} - -int -obj_elf_section_word (str, len) - char *str; - size_t len; -{ - if (len == 5 && strncmp (str, "write", 5) == 0) - return SHF_WRITE; - if (len == 5 && strncmp (str, "alloc", 5) == 0) - return SHF_ALLOC; - if (len == 9 && strncmp (str, "execinstr", 9) == 0) - return SHF_EXECINSTR; - -#ifdef md_elf_section_word - { - int md_attr = md_elf_section_word (str, len); - if (md_attr >= 0) - return md_attr; - } -#endif - - as_warn (_("Unrecognized section attribute")); - return 0; -} - -int -obj_elf_section_type (str, len) - char *str; - size_t len; -{ - if (len == 8 && strncmp (str, "progbits", 8) == 0) - return SHT_PROGBITS; - if (len == 6 && strncmp (str, "nobits", 6) == 0) - return SHT_NOBITS; - -#ifdef md_elf_section_type - { - int md_type = md_elf_section_type (str, len); - if (md_type >= 0) - return md_type; - } -#endif - - as_warn (_("Unrecognized section type")); - return 0; -} - -void -obj_elf_section (push) - int push; -{ - char *name, *beg, *end; - int type, attr, dummy; - -#ifndef TC_I370 - if (flag_mri) - { - char mri_type; - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - previous_section = now_seg; - previous_subsection = now_subseg; - - s_mri_sect (&mri_type); - -#ifdef md_elf_section_change_hook - md_elf_section_change_hook (); -#endif - - return; - } -#endif /* ! defined (TC_I370) */ - - /* Get name of section. */ - SKIP_WHITESPACE (); - if (*input_line_pointer == '"') - { - name = demand_copy_C_string (&dummy); - if (name == NULL) - { - ignore_rest_of_line (); - return; - } - } - else - { - end = input_line_pointer; - while (0 == strchr ("\n\t,; ", *end)) - end++; - if (end == input_line_pointer) - { - as_warn (_("Missing section name")); - ignore_rest_of_line (); - return; - } - - name = xmalloc (end - input_line_pointer + 1); - memcpy (name, input_line_pointer, end - input_line_pointer); - name[end - input_line_pointer] = '\0'; - input_line_pointer = end; - } - SKIP_WHITESPACE (); - - type = SHT_NULL; - attr = 0; - - if (*input_line_pointer == ',') - { - /* Skip the comma. */ - ++input_line_pointer; - SKIP_WHITESPACE (); - - if (*input_line_pointer == '"') - { - beg = demand_copy_C_string (&dummy); - if (beg == NULL) - { - ignore_rest_of_line (); - return; - } - attr |= obj_elf_parse_section_letters (beg, strlen (beg)); - - SKIP_WHITESPACE (); - if (*input_line_pointer == ',') - { - char c; - ++input_line_pointer; - SKIP_WHITESPACE (); - c = *input_line_pointer; - if (c == '"') - { - beg = demand_copy_C_string (&dummy); - if (beg == NULL) - { - ignore_rest_of_line (); - return; - } - type = obj_elf_section_type (beg, strlen (beg)); - } - else if (c == '@' || c == '%') - { - beg = ++input_line_pointer; - c = get_symbol_end (); - *input_line_pointer = c; - type = obj_elf_section_type (beg, input_line_pointer - beg); - } - } - } - else - { - do - { - char c; - - SKIP_WHITESPACE (); - if (*input_line_pointer != '#') - { - as_warn (_("Bad .section directive - character following name is not '#'")); - ignore_rest_of_line (); - return; - } - beg = ++input_line_pointer; - c = get_symbol_end (); - *input_line_pointer = c; - - attr |= obj_elf_section_word (beg, input_line_pointer - beg); - - SKIP_WHITESPACE (); - } - while (*input_line_pointer++ == ','); - --input_line_pointer; - } - } - - demand_empty_rest_of_line (); - - obj_elf_change_section (name, type, attr, push); -} - -/* Change to the .data section. */ - -void -obj_elf_data (i) - int i; -{ -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - previous_section = now_seg; - previous_subsection = now_subseg; - s_data (i); - -#ifdef md_elf_section_change_hook - md_elf_section_change_hook (); -#endif -} - -/* Change to the .text section. */ - -void -obj_elf_text (i) - int i; -{ -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - previous_section = now_seg; - previous_subsection = now_subseg; - s_text (i); - -#ifdef md_elf_section_change_hook - md_elf_section_change_hook (); -#endif -} - -static void -obj_elf_subsection (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - register int temp; - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - previous_section = now_seg; - previous_subsection = now_subseg; - - temp = get_absolute_expression (); - subseg_set (now_seg, (subsegT) temp); - demand_empty_rest_of_line (); - -#ifdef md_elf_section_change_hook - md_elf_section_change_hook (); -#endif -} - -/* This can be called from the processor backends if they change - sections. */ - -void -obj_elf_section_change_hook () -{ - previous_section = now_seg; - previous_subsection = now_subseg; -} - -void -obj_elf_previous (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - segT new_section; - int new_subsection; - - if (previous_section == 0) - { - as_bad (_(".previous without corresponding .section; ignored")); - return; - } - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - new_section = previous_section; - new_subsection = previous_subsection; - previous_section = now_seg; - previous_subsection = now_subseg; - subseg_set (new_section, new_subsection); - -#ifdef md_elf_section_change_hook - md_elf_section_change_hook (); -#endif -} - -static void -obj_elf_popsection (xxx) - int xxx ATTRIBUTE_UNUSED; -{ - struct section_stack *top = section_stack; - - if (top == NULL) - { - as_bad (_(".popsection without corresponding .pushsection; ignored")); - return; - } - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - section_stack = top->next; - previous_section = top->prev_seg; - previous_subsection = top->prev_subseg; - subseg_set (top->seg, top->subseg); - free (top); - -#ifdef md_elf_section_change_hook - md_elf_section_change_hook (); -#endif -} - -static void -obj_elf_line (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - /* Assume delimiter is part of expression. BSD4.2 as fails with - delightful bug, so we are not being incompatible here. */ - new_logical_line ((char *) NULL, (int) (get_absolute_expression ())); - demand_empty_rest_of_line (); -} - -/* This handles the .symver pseudo-op, which is used to specify a - symbol version. The syntax is ``.symver NAME,SYMVERNAME''. - SYMVERNAME may contain ELF_VER_CHR ('@') characters. This - pseudo-op causes the assembler to emit a symbol named SYMVERNAME - with the same value as the symbol NAME. */ - -static void -obj_elf_symver (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *name; - char c; - symbolS *sym; - - name = input_line_pointer; - c = get_symbol_end (); - - sym = symbol_find_or_make (name); - - *input_line_pointer = c; - - if (symbol_get_obj (sym)->versioned_name != NULL) - { - as_bad (_("multiple .symver directives for symbol `%s'"), - S_GET_NAME (sym)); - ignore_rest_of_line (); - return; - } - - SKIP_WHITESPACE (); - if (*input_line_pointer != ',') - { - as_bad (_("expected comma after name in .symver")); - ignore_rest_of_line (); - return; - } - - ++input_line_pointer; - name = input_line_pointer; - while (1) - { - c = get_symbol_end (); - if (c != ELF_VER_CHR) - break; - *input_line_pointer++ = c; - } - - symbol_get_obj (sym)->versioned_name = xstrdup (name); - - *input_line_pointer = c; - - if (strchr (symbol_get_obj (sym)->versioned_name, ELF_VER_CHR) == NULL) - { - as_bad (_("missing version name in `%s' for symbol `%s'"), - symbol_get_obj (sym)->versioned_name, S_GET_NAME (sym)); - ignore_rest_of_line (); - return; - } - - demand_empty_rest_of_line (); -} - -/* This handles the .vtable_inherit pseudo-op, which is used to indicate - to the linker the hierarchy in which a particular table resides. The - syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */ - -static void -obj_elf_vtable_inherit (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *cname, *pname; - symbolS *csym, *psym; - char c, bad = 0; - - if (*input_line_pointer == '#') - ++input_line_pointer; - - cname = input_line_pointer; - c = get_symbol_end (); - csym = symbol_find (cname); - - /* GCFIXME: should check that we don't have two .vtable_inherits for - the same child symbol. Also, we can currently only do this if the - child symbol is already exists and is placed in a fragment. */ - - if (csym == NULL || symbol_get_frag (csym) == NULL) - { - as_bad ("expected `%s' to have already been set for .vtable_inherit", - cname); - bad = 1; - } - - *input_line_pointer = c; - - SKIP_WHITESPACE (); - if (*input_line_pointer != ',') - { - as_bad ("expected comma after name in .vtable_inherit"); - ignore_rest_of_line (); - return; - } - - ++input_line_pointer; - SKIP_WHITESPACE (); - - if (*input_line_pointer == '#') - ++input_line_pointer; - - if (input_line_pointer[0] == '0' - && (input_line_pointer[1] == '\0' - || isspace ((unsigned char) input_line_pointer[1]))) - { - psym = section_symbol (absolute_section); - ++input_line_pointer; - } - else - { - pname = input_line_pointer; - c = get_symbol_end (); - psym = symbol_find_or_make (pname); - *input_line_pointer = c; - } - - demand_empty_rest_of_line (); - - if (bad) - return; - - assert (symbol_get_value_expression (csym)->X_op == O_constant); - fix_new (symbol_get_frag (csym), - symbol_get_value_expression (csym)->X_add_number, 0, psym, 0, 0, - BFD_RELOC_VTABLE_INHERIT); -} - -/* This handles the .vtable_entry pseudo-op, which is used to indicate - to the linker that a vtable slot was used. The syntax is - ".vtable_entry tablename, offset". */ - -static void -obj_elf_vtable_entry (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *name; - symbolS *sym; - offsetT offset; - char c; - - if (*input_line_pointer == '#') - ++input_line_pointer; - - name = input_line_pointer; - c = get_symbol_end (); - sym = symbol_find_or_make (name); - *input_line_pointer = c; - - SKIP_WHITESPACE (); - if (*input_line_pointer != ',') - { - as_bad ("expected comma after name in .vtable_entry"); - ignore_rest_of_line (); - return; - } - - ++input_line_pointer; - if (*input_line_pointer == '#') - ++input_line_pointer; - - offset = get_absolute_expression (); - - fix_new (frag_now, frag_now_fix (), 0, sym, offset, 0, - BFD_RELOC_VTABLE_ENTRY); - - demand_empty_rest_of_line (); -} - -void -elf_obj_read_begin_hook () -{ -#ifdef NEED_ECOFF_DEBUG - if (ECOFF_DEBUGGING) - ecoff_read_begin_hook (); -#endif -} - -void -elf_obj_symbol_new_hook (symbolP) - symbolS *symbolP; -{ - struct elf_obj_sy *sy_obj; - - sy_obj = symbol_get_obj (symbolP); - sy_obj->size = NULL; - sy_obj->versioned_name = NULL; - -#ifdef NEED_ECOFF_DEBUG - if (ECOFF_DEBUGGING) - ecoff_symbol_new_hook (symbolP); -#endif -} - -void -obj_elf_version (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *name; - unsigned int c; - char ch; - char *p; - asection *seg = now_seg; - subsegT subseg = now_subseg; - Elf_Internal_Note i_note; - Elf_External_Note e_note; - asection *note_secp = (asection *) NULL; - int i, len; - - SKIP_WHITESPACE (); - if (*input_line_pointer == '\"') - { - ++input_line_pointer; /* -> 1st char of string. */ - name = input_line_pointer; - - while (is_a_char (c = next_char_of_string ())) - ; - c = *input_line_pointer; - *input_line_pointer = '\0'; - *(input_line_pointer - 1) = '\0'; - *input_line_pointer = c; - - /* create the .note section */ - - note_secp = subseg_new (".note", 0); - bfd_set_section_flags (stdoutput, - note_secp, - SEC_HAS_CONTENTS | SEC_READONLY); - - /* process the version string */ - - len = strlen (name); - - i_note.namesz = ((len + 1) + 3) & ~3; /* round this to word boundary */ - i_note.descsz = 0; /* no description */ - i_note.type = NT_VERSION; - p = frag_more (sizeof (e_note.namesz)); - md_number_to_chars (p, (valueT) i_note.namesz, 4); - p = frag_more (sizeof (e_note.descsz)); - md_number_to_chars (p, (valueT) i_note.descsz, 4); - p = frag_more (sizeof (e_note.type)); - md_number_to_chars (p, (valueT) i_note.type, 4); - - for (i = 0; i < len; i++) - { - ch = *(name + i); - { - FRAG_APPEND_1_CHAR (ch); - } - } - frag_align (2, 0, 0); - - subseg_set (seg, subseg); - } - else - { - as_bad (_("Expected quoted string")); - } - demand_empty_rest_of_line (); -} - -static void -obj_elf_size (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *name = input_line_pointer; - char c = get_symbol_end (); - char *p; - expressionS exp; - symbolS *sym; - - p = input_line_pointer; - *p = c; - SKIP_WHITESPACE (); - if (*input_line_pointer != ',') - { - *p = 0; - as_bad (_("expected comma after name `%s' in .size directive"), name); - *p = c; - ignore_rest_of_line (); - return; - } - input_line_pointer++; - expression (&exp); - if (exp.X_op == O_absent) - { - as_bad (_("missing expression in .size directive")); - exp.X_op = O_constant; - exp.X_add_number = 0; - } - *p = 0; - sym = symbol_find_or_make (name); - *p = c; - if (exp.X_op == O_constant) - S_SET_SIZE (sym, exp.X_add_number); - else - { - symbol_get_obj (sym)->size = - (expressionS *) xmalloc (sizeof (expressionS)); - *symbol_get_obj (sym)->size = exp; - } - demand_empty_rest_of_line (); -} - -/* Handle the ELF .type pseudo-op. This sets the type of a symbol. - There are four syntaxes: - - The first (used on Solaris) is - .type SYM,#function - The second (used on UnixWare) is - .type SYM,@function - The third (reportedly to be used on Irix 6.0) is - .type SYM STT_FUNC - The fourth (used on NetBSD/Arm and Linux/ARM) is - .type SYM,%function - */ - -static void -obj_elf_type (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *name; - char c; - int type; - const char *typename; - symbolS *sym; - - name = input_line_pointer; - c = get_symbol_end (); - sym = symbol_find_or_make (name); - *input_line_pointer = c; - - SKIP_WHITESPACE (); - if (*input_line_pointer == ',') - ++input_line_pointer; - - SKIP_WHITESPACE (); - if ( *input_line_pointer == '#' - || *input_line_pointer == '@' - || *input_line_pointer == '%') - ++input_line_pointer; - - typename = input_line_pointer; - c = get_symbol_end (); - - type = 0; - if (strcmp (typename, "function") == 0 - || strcmp (typename, "STT_FUNC") == 0) - type = BSF_FUNCTION; - else if (strcmp (typename, "object") == 0 - || strcmp (typename, "STT_OBJECT") == 0) - type = BSF_OBJECT; - else - as_bad (_("ignoring unrecognized symbol type \"%s\""), typename); - - *input_line_pointer = c; - - symbol_get_bfdsym (sym)->flags |= type; - - demand_empty_rest_of_line (); -} - -static void -obj_elf_ident (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - static segT comment_section; - segT old_section = now_seg; - int old_subsection = now_subseg; - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - if (!comment_section) - { - char *p; - comment_section = subseg_new (".comment", 0); - bfd_set_section_flags (stdoutput, comment_section, - SEC_READONLY | SEC_HAS_CONTENTS); - p = frag_more (1); - *p = 0; - } - else - subseg_set (comment_section, 0); - stringer (1); - subseg_set (old_section, old_subsection); -} - -#ifdef INIT_STAB_SECTION - -/* The first entry in a .stabs section is special. */ - -void -obj_elf_init_stab_section (seg) - segT seg; -{ - char *file; - char *p; - char *stabstr_name; - unsigned int stroff; - - /* Force the section to align to a longword boundary. Without this, - UnixWare ar crashes. */ - bfd_set_section_alignment (stdoutput, seg, 2); - - /* Make space for this first symbol. */ - p = frag_more (12); - /* Zero it out. */ - memset (p, 0, 12); - as_where (&file, (unsigned int *) NULL); - stabstr_name = (char *) alloca (strlen (segment_name (seg)) + 4); - strcpy (stabstr_name, segment_name (seg)); - strcat (stabstr_name, "str"); - stroff = get_stab_string_offset (file, stabstr_name); - know (stroff == 1); - md_number_to_chars (p, stroff, 4); - seg_info (seg)->stabu.p = p; -} - -#endif - -/* Fill in the counts in the first entry in a .stabs section. */ - -static void -adjust_stab_sections (abfd, sec, xxx) - bfd *abfd; - asection *sec; - PTR xxx ATTRIBUTE_UNUSED; -{ - char *name; - asection *strsec; - char *p; - int strsz, nsyms; - - if (strncmp (".stab", sec->name, 5)) - return; - if (!strcmp ("str", sec->name + strlen (sec->name) - 3)) - return; - - name = (char *) alloca (strlen (sec->name) + 4); - strcpy (name, sec->name); - strcat (name, "str"); - strsec = bfd_get_section_by_name (abfd, name); - if (strsec) - strsz = bfd_section_size (abfd, strsec); - else - strsz = 0; - nsyms = bfd_section_size (abfd, sec) / 12 - 1; - - p = seg_info (sec)->stabu.p; - assert (p != 0); - - bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6); - bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8); -} - -#ifdef NEED_ECOFF_DEBUG - -/* This function is called by the ECOFF code. It is supposed to - record the external symbol information so that the backend can - write it out correctly. The ELF backend doesn't actually handle - this at the moment, so we do it ourselves. We save the information - in the symbol. */ - -void -elf_ecoff_set_ext (sym, ext) - symbolS *sym; - struct ecoff_extr *ext; -{ - symbol_get_bfdsym (sym)->udata.p = (PTR) ext; -} - -/* This function is called by bfd_ecoff_debug_externals. It is - supposed to *EXT to the external symbol information, and return - whether the symbol should be used at all. */ - -static boolean -elf_get_extr (sym, ext) - asymbol *sym; - EXTR *ext; -{ - if (sym->udata.p == NULL) - return false; - *ext = *(EXTR *) sym->udata.p; - return true; -} - -/* This function is called by bfd_ecoff_debug_externals. It has - nothing to do for ELF. */ - -/*ARGSUSED*/ -static void -elf_set_index (sym, indx) - asymbol *sym ATTRIBUTE_UNUSED; - bfd_size_type indx ATTRIBUTE_UNUSED; -{ -} - -#endif /* NEED_ECOFF_DEBUG */ - -void -elf_frob_symbol (symp, puntp) - symbolS *symp; - int *puntp; -{ - struct elf_obj_sy *sy_obj; - -#ifdef NEED_ECOFF_DEBUG - if (ECOFF_DEBUGGING) - ecoff_frob_symbol (symp); -#endif - - sy_obj = symbol_get_obj (symp); - - if (sy_obj->size != NULL) - { - switch (sy_obj->size->X_op) - { - case O_subtract: - S_SET_SIZE (symp, - (S_GET_VALUE (sy_obj->size->X_add_symbol) - + sy_obj->size->X_add_number - - S_GET_VALUE (sy_obj->size->X_op_symbol))); - break; - case O_constant: - S_SET_SIZE (symp, - (S_GET_VALUE (sy_obj->size->X_add_symbol) - + sy_obj->size->X_add_number)); - break; - default: - as_bad (_(".size expression too complicated to fix up")); - break; - } - free (sy_obj->size); - sy_obj->size = NULL; - } - - if (sy_obj->versioned_name != NULL) - { - /* This symbol was given a new name with the .symver directive. - - If this is an external reference, just rename the symbol to - include the version string. This will make the relocs be - against the correct versioned symbol. - - If this is a definition, add an alias. FIXME: Using an alias - will permit the debugging information to refer to the right - symbol. However, it's not clear whether it is the best - approach. */ - - if (! S_IS_DEFINED (symp)) - { - char *p; - - /* Verify that the name isn't using the @@ syntax--this is - reserved for definitions of the default version to link - against. */ - p = strchr (sy_obj->versioned_name, ELF_VER_CHR); - know (p != NULL); - if (p[1] == ELF_VER_CHR) - { - as_bad (_("invalid attempt to declare external version name as default in symbol `%s'"), - sy_obj->versioned_name); - *puntp = true; - } - S_SET_NAME (symp, sy_obj->versioned_name); - } - else - { - symbolS *symp2; - - /* FIXME: Creating a new symbol here is risky. We're in the - final loop over the symbol table. We can get away with - it only because the symbol goes to the end of the list, - where the loop will still see it. It would probably be - better to do this in obj_frob_file_before_adjust. */ - - symp2 = symbol_find_or_make (sy_obj->versioned_name); - - /* Now we act as though we saw symp2 = sym. */ - - S_SET_SEGMENT (symp2, S_GET_SEGMENT (symp)); - - /* Subtracting out the frag address here is a hack because - we are in the middle of the final loop. */ - S_SET_VALUE (symp2, - (S_GET_VALUE (symp) - - symbol_get_frag (symp)->fr_address)); - - symbol_set_frag (symp2, symbol_get_frag (symp)); - - /* This will copy over the size information. */ - copy_symbol_attributes (symp2, symp); - - if (S_IS_WEAK (symp)) - S_SET_WEAK (symp2); - - if (S_IS_EXTERNAL (symp)) - S_SET_EXTERNAL (symp2); - } - } - - /* Double check weak symbols. */ - if (S_IS_WEAK (symp)) - { - if (S_IS_COMMON (symp)) - as_bad (_("Symbol `%s' can not be both weak and common"), - S_GET_NAME (symp)); - } - -#ifdef TC_MIPS - /* The Irix 5 and 6 assemblers set the type of any common symbol and - any undefined non-function symbol to STT_OBJECT. We try to be - compatible, since newer Irix 5 and 6 linkers care. However, we - only set undefined symbols to be STT_OBJECT if we are on Irix, - because that is the only time gcc will generate the necessary - .global directives to mark functions. */ - - if (S_IS_COMMON (symp)) - symbol_get_bfdsym (symp)->flags |= BSF_OBJECT; - - if (strstr (TARGET_OS, "irix") != NULL - && ! S_IS_DEFINED (symp) - && (symbol_get_bfdsym (symp)->flags & BSF_FUNCTION) == 0) - symbol_get_bfdsym (symp)->flags |= BSF_OBJECT; -#endif - -#if 0 /* TC_PPC */ - /* If TC_PPC is defined, we used to force the type of a symbol to be - BSF_OBJECT if it was otherwise unset. This was required by some - version of VxWorks. Thomas de Lellis says - that this is no longer needed, so it is now commented out. */ - if ((symbol_get_bfdsym (symp)->flags - & (BSF_FUNCTION | BSF_FILE | BSF_SECTION_SYM)) == 0 - && S_IS_DEFINED (symp)) - symbol_get_bfdsym (symp)->flags |= BSF_OBJECT; -#endif -} - -void -elf_frob_file () -{ - bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0); - -#ifdef elf_tc_final_processing - elf_tc_final_processing (); -#endif -} - -/* It is required that we let write_relocs have the opportunity to - optimize away fixups before output has begun, since it is possible - to eliminate all fixups for a section and thus we never should - have generated the relocation section. */ - -void -elf_frob_file_after_relocs () -{ -#ifdef NEED_ECOFF_DEBUG - if (ECOFF_DEBUGGING) - /* Generate the ECOFF debugging information. */ - { - const struct ecoff_debug_swap *debug_swap; - struct ecoff_debug_info debug; - char *buf; - asection *sec; - - debug_swap - = get_elf_backend_data (stdoutput)->elf_backend_ecoff_debug_swap; - know (debug_swap != (const struct ecoff_debug_swap *) NULL); - ecoff_build_debug (&debug.symbolic_header, &buf, debug_swap); - - /* Set up the pointers in debug. */ -#define SET(ptr, offset, type) \ - debug.ptr = (type) (buf + debug.symbolic_header.offset) - - SET (line, cbLineOffset, unsigned char *); - SET (external_dnr, cbDnOffset, PTR); - SET (external_pdr, cbPdOffset, PTR); - SET (external_sym, cbSymOffset, PTR); - SET (external_opt, cbOptOffset, PTR); - SET (external_aux, cbAuxOffset, union aux_ext *); - SET (ss, cbSsOffset, char *); - SET (external_fdr, cbFdOffset, PTR); - SET (external_rfd, cbRfdOffset, PTR); - /* ssext and external_ext are set up just below. */ - -#undef SET - - /* Set up the external symbols. */ - debug.ssext = debug.ssext_end = NULL; - debug.external_ext = debug.external_ext_end = NULL; - if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, true, - elf_get_extr, elf_set_index)) - as_fatal (_("Failed to set up debugging information: %s"), - bfd_errmsg (bfd_get_error ())); - - sec = bfd_get_section_by_name (stdoutput, ".mdebug"); - assert (sec != NULL); - - know (stdoutput->output_has_begun == false); - - /* We set the size of the section, call bfd_set_section_contents - to force the ELF backend to allocate a file position, and then - write out the data. FIXME: Is this really the best way to do - this? */ - sec->_raw_size = bfd_ecoff_debug_size (stdoutput, &debug, debug_swap); - - /* Pass BUF to bfd_set_section_contents because this will - eventually become a call to fwrite, and ISO C prohibits - passing a NULL pointer to a stdio function even if the - pointer will not be used. */ - if (! bfd_set_section_contents (stdoutput, sec, (PTR) buf, - (file_ptr) 0, (bfd_size_type) 0)) - as_fatal (_("Can't start writing .mdebug section: %s"), - bfd_errmsg (bfd_get_error ())); - - know (stdoutput->output_has_begun == true); - know (sec->filepos != 0); - - if (! bfd_ecoff_write_debug (stdoutput, &debug, debug_swap, - sec->filepos)) - as_fatal (_("Could not write .mdebug section: %s"), - bfd_errmsg (bfd_get_error ())); - } -#endif /* NEED_ECOFF_DEBUG */ -} - -#ifdef SCO_ELF - -/* Heavily plagarized from obj_elf_version. The idea is to emit the - SCO specific identifier in the .notes section to satisfy the SCO - linker. - - This looks more complicated than it really is. As opposed to the - "obvious" solution, this should handle the cross dev cases - correctly. (i.e, hosting on a 64 bit big endian processor, but - generating SCO Elf code) Efficiency isn't a concern, as there - should be exactly one of these sections per object module. - - SCO OpenServer 5 identifies it's ELF modules with a standard ELF - .note section. - - int_32 namesz = 4 ; Name size - int_32 descsz = 12 ; Descriptive information - int_32 type = 1 ; - char name[4] = "SCO" ; Originator name ALWAYS SCO + NULL - int_32 version = (major ver # << 16) | version of tools ; - int_32 source = (tool_id << 16 ) | 1 ; - int_32 info = 0 ; These are set by the SCO tools, but we - don't know enough about the source - environment to set them. SCO ld currently - ignores them, and recommends we set them - to zero. */ - -#define SCO_MAJOR_VERSION 0x1 -#define SCO_MINOR_VERSION 0x1 - -void -sco_id () -{ - - char *name; - unsigned int c; - char ch; - char *p; - asection *seg = now_seg; - subsegT subseg = now_subseg; - Elf_Internal_Note i_note; - Elf_External_Note e_note; - asection *note_secp = (asection *) NULL; - int i, len; - - /* create the .note section */ - - note_secp = subseg_new (".note", 0); - bfd_set_section_flags (stdoutput, - note_secp, - SEC_HAS_CONTENTS | SEC_READONLY); - - /* process the version string */ - - i_note.namesz = 4; - i_note.descsz = 12; /* 12 descriptive bytes */ - i_note.type = NT_VERSION; /* Contains a version string */ - - p = frag_more (sizeof (i_note.namesz)); - md_number_to_chars (p, (valueT) i_note.namesz, 4); - - p = frag_more (sizeof (i_note.descsz)); - md_number_to_chars (p, (valueT) i_note.descsz, 4); - - p = frag_more (sizeof (i_note.type)); - md_number_to_chars (p, (valueT) i_note.type, 4); - - p = frag_more (4); - strcpy (p, "SCO"); - - /* Note: this is the version number of the ELF we're representing */ - p = frag_more (4); - md_number_to_chars (p, (SCO_MAJOR_VERSION << 16) | (SCO_MINOR_VERSION), 4); - - /* Here, we pick a magic number for ourselves (yes, I "registered" - it with SCO. The bottom bit shows that we are compat with the - SCO ABI. */ - p = frag_more (4); - md_number_to_chars (p, 0x4c520000 | 0x0001, 4); - - /* If we knew (or cared) what the source language options were, we'd - fill them in here. SCO has given us permission to ignore these - and just set them to zero. */ - p = frag_more (4); - md_number_to_chars (p, 0x0000, 4); - - frag_align (2, 0, 0); - - /* We probably can't restore the current segment, for there likely - isn't one yet... */ - if (seg && subseg) - subseg_set (seg, subseg); - -} - -#endif /* SCO_ELF */ - -const struct format_ops elf_format_ops = -{ - bfd_target_elf_flavour, - 0, /* dfl_leading_underscore */ - 1, /* emit_section_symbols */ - elf_frob_symbol, - elf_frob_file, - elf_frob_file_after_relocs, - elf_s_get_size, elf_s_set_size, - elf_s_get_align, elf_s_set_align, - elf_s_get_other, - 0, /* s_get_desc */ - elf_copy_symbol_attributes, -#ifdef NEED_ECOFF_DEBUG - ecoff_generate_asm_lineno, - ecoff_stab, -#else - 0, /* generate_asm_lineno */ - 0, /* process_stab */ -#endif - elf_sec_sym_ok_for_reloc, - elf_pop_insert, -#ifdef NEED_ECOFF_DEBUG - elf_ecoff_set_ext, -#else - 0, /* ecoff_set_ext */ -#endif - elf_obj_read_begin_hook, - elf_obj_symbol_new_hook, -}; diff --git a/gas/config/obj-elf.h b/gas/config/obj-elf.h deleted file mode 100644 index 722c5fdf94d..00000000000 --- a/gas/config/obj-elf.h +++ /dev/null @@ -1,235 +0,0 @@ -/* ELF object file format. - Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - - -/* HP PA-RISC support was contributed by the Center for Software Science - at the University of Utah. */ - -#ifndef _OBJ_ELF_H -#define _OBJ_ELF_H - -#define OBJ_ELF 1 - -#ifndef OUTPUT_FLAVOR -#define OUTPUT_FLAVOR bfd_target_elf_flavour -#endif - -#include - -#define BYTES_IN_WORD 4 /* for now */ -#include "bfd/elf-bfd.h" - -#include "targ-cpu.h" - -#ifdef TC_ALPHA -#define ECOFF_DEBUGGING alpha_flag_mdebug -extern int alpha_flag_mdebug; -#endif - -/* For now, always set ECOFF_DEBUGGING for a MIPS target. */ -#ifdef TC_MIPS -#ifdef MIPS_STABS_ELF -#define ECOFF_DEBUGGING 0 -#else -#define ECOFF_DEBUGGING 1 -#endif /* MIPS_STABS_ELF */ -#endif /* TC_MIPS */ - -#ifdef OBJ_MAYBE_ECOFF -#ifndef ECOFF_DEBUGGING -#define ECOFF_DEBUGGING 1 -#endif -#endif - -/* Additional information we keep for each symbol. */ -struct elf_obj_sy -{ - /* Whether the symbol has been marked as local. */ - int local; - - /* Use this to keep track of .size expressions that involve - differences that we can't compute yet. */ - expressionS *size; - - /* The name specified by the .symver directive. */ - char *versioned_name; - -#ifdef ECOFF_DEBUGGING - /* If we are generating ECOFF debugging information, we need some - additional fields for each symbol. */ - struct efdr *ecoff_file; - struct localsym *ecoff_symbol; - valueT ecoff_extern_size; -#endif -}; - -#define OBJ_SYMFIELD_TYPE struct elf_obj_sy - -#ifndef FALSE -#define FALSE 0 -#define TRUE !FALSE -#endif - -#define obj_begin() elf_begin () -extern void elf_begin PARAMS ((void)); - -/* should be conditional on address size! */ -#define elf_symbol(asymbol) ((elf_symbol_type *)(&(asymbol)->the_bfd)) - -#ifndef S_GET_SIZE -#define S_GET_SIZE(S) \ - (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_size) -#endif -#ifndef S_SET_SIZE -#define S_SET_SIZE(S,V) \ - (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_size = (V)) -#endif - -#ifndef S_GET_ALIGN -#define S_GET_ALIGN(S) \ - (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_value) -#endif -#ifndef S_SET_ALIGN -#define S_SET_ALIGN(S,V) \ - (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_value = (V)) -#endif - -int elf_s_get_other PARAMS ((symbolS *)); -#ifndef S_GET_OTHER -#define S_GET_OTHER(S) (elf_s_get_other (S)) -#endif -#ifndef S_SET_OTHER -#define S_SET_OTHER(S,V) \ - (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_other = (V)) -#endif - -extern asection *gdb_section; - -#ifndef obj_frob_file -#define obj_frob_file elf_frob_file -#endif -extern void elf_frob_file PARAMS ((void)); - -#ifndef obj_frob_file_after_relocs -#define obj_frob_file_after_relocs elf_frob_file_after_relocs -#endif -extern void elf_frob_file_after_relocs PARAMS ((void)); - -#define obj_app_file elf_file_symbol -extern void elf_file_symbol PARAMS ((char *)); - -extern void obj_elf_section_change_hook PARAMS ((void)); - -extern void obj_elf_section PARAMS ((int)); -extern void obj_elf_previous PARAMS ((int)); -extern void obj_elf_version PARAMS ((int)); -extern void obj_elf_common PARAMS ((int)); -extern void obj_elf_data PARAMS ((int)); -extern void obj_elf_text PARAMS ((int)); - -/* BFD wants to write the udata field, which is a no-no for the - globally defined sections. */ -#ifndef obj_sec_sym_ok_for_reloc -#define obj_sec_sym_ok_for_reloc(SEC) ((SEC)->owner != 0) -#endif - -void elf_obj_read_begin_hook PARAMS ((void)); -#ifndef obj_read_begin_hook -#define obj_read_begin_hook elf_obj_read_begin_hook -#endif - -void elf_obj_symbol_new_hook PARAMS ((symbolS *)); -#ifndef obj_symbol_new_hook -#define obj_symbol_new_hook elf_obj_symbol_new_hook -#endif - -/* When setting one symbol equal to another, by default we probably - want them to have the same "size", whatever it means in the current - context. */ -#ifndef OBJ_COPY_SYMBOL_ATTRIBUTES -#define OBJ_COPY_SYMBOL_ATTRIBUTES(DEST,SRC) \ -do \ - { \ - struct elf_obj_sy *srcelf = symbol_get_obj (SRC); \ - struct elf_obj_sy *destelf = symbol_get_obj (DEST); \ - if (srcelf->size) \ - { \ - if (destelf->size == NULL) \ - destelf->size = \ - (expressionS *) xmalloc (sizeof (expressionS)); \ - *destelf->size = *srcelf->size; \ - } \ - else \ - { \ - if (destelf->size != NULL) \ - free (destelf->size); \ - destelf->size = NULL; \ - } \ - S_SET_SIZE ((DEST), S_GET_SIZE (SRC)); \ - S_SET_OTHER ((DEST), S_GET_OTHER (SRC)); \ - } \ -while (0) -#endif - -/* Stabs go in a separate section. */ -#define SEPARATE_STAB_SECTIONS 1 - -/* We need 12 bytes at the start of the section to hold some initial - information. */ -extern void obj_elf_init_stab_section PARAMS ((segT)); -#define INIT_STAB_SECTION(seg) obj_elf_init_stab_section (seg) - -#ifdef ECOFF_DEBUGGING -/* We smuggle stabs in ECOFF rather than using a separate section. - The Irix linker can not handle a separate stabs section. */ - -#undef SEPARATE_STAB_SECTIONS -#define SEPARATE_STAB_SECTIONS (!ECOFF_DEBUGGING) - -#undef INIT_STAB_SECTION -#define INIT_STAB_SECTION(seg) \ - ((void)(ECOFF_DEBUGGING ? 0 : (obj_elf_init_stab_section (seg), 0))) - -#undef OBJ_PROCESS_STAB -#define OBJ_PROCESS_STAB(seg, what, string, type, other, desc) \ - if (ECOFF_DEBUGGING) \ - ecoff_stab ((seg), (what), (string), (type), (other), (desc)) -#endif /* ECOFF_DEBUGGING */ - -extern void elf_frob_symbol PARAMS ((symbolS *, int *)); -#ifndef obj_frob_symbol -#define obj_frob_symbol(symp, punt) elf_frob_symbol (symp, &punt) -#endif - -extern void elf_pop_insert PARAMS ((void)); -#ifndef obj_pop_insert -#define obj_pop_insert() elf_pop_insert() -#endif - -#ifndef OBJ_MAYBE_ELF -#define obj_ecoff_set_ext elf_ecoff_set_ext -#ifdef ANSI_PROTOTYPES -struct ecoff_extr; -#endif -extern void elf_ecoff_set_ext PARAMS ((symbolS *, struct ecoff_extr *)); -#endif - -#endif /* _OBJ_ELF_H */ diff --git a/gas/config/obj-evax.c b/gas/config/obj-evax.c deleted file mode 100644 index e818c83b904..00000000000 --- a/gas/config/obj-evax.c +++ /dev/null @@ -1,83 +0,0 @@ -/* obj-evax.c - EVAX (openVMS/Alpha) object file format. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. - Contributed by Klaus Kämpf (kkaempf@progis.de) of - proGIS Software, Aachen, Germany. - - This file is part of GAS, the GNU Assembler - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. */ - -#define OBJ_HEADER "obj-evax.h" - -#include "as.h" - -static void s_evax_weak PARAMS ((int)); - -const pseudo_typeS obj_pseudo_table[] = -{ - { "weak", s_evax_weak, 0}, - {0, 0, 0}, -}; /* obj_pseudo_table */ - -void obj_read_begin_hook () {} - -/* Handle the weak specific pseudo-op. */ - -static void -s_evax_weak (ignore) - int ignore; -{ - char *name; - int c; - symbolS *symbolP; - char *stop = NULL; - char stopc; - - if (flag_mri) - stop = mri_comment_field (&stopc); - - do - { - name = input_line_pointer; - c = get_symbol_end (); - symbolP = symbol_find_or_make (name); - *input_line_pointer = c; - SKIP_WHITESPACE (); - S_SET_WEAK (symbolP); - if (c == ',') - { - input_line_pointer++; - SKIP_WHITESPACE (); - if (*input_line_pointer == '\n') - c = '\n'; - } - } - while (c == ','); - - if (flag_mri) - mri_comment_end (stop, stopc); - - demand_empty_rest_of_line (); -} - -/* - * Local Variables: - * comment-column: 0 - * fill-column: 131 - * End: - */ - -/* end of obj-evax.c */ diff --git a/gas/config/obj-evax.h b/gas/config/obj-evax.h deleted file mode 100644 index 745b1feff97..00000000000 --- a/gas/config/obj-evax.h +++ /dev/null @@ -1,97 +0,0 @@ -/* This file is obj-evax.h - Copyright (C) 1996, 2000 Free Software Foundation, Inc. - Contributed by Klaus Kämpf (kkaempf@progis.de) of - proGIS Software, Aachen, Germany. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. */ - -/* - * This file is obj-evax.h and is intended to be a template for - * object format specific header files. - */ - -/* define an obj specific macro off which target cpu back ends may key. */ -#define OBJ_EVAX 1 - -/* include whatever target cpu is appropriate. */ -#include "targ-cpu.h" - -#ifdef BFD_ASSEMBLER -#define OUTPUT_FLAVOR bfd_target_evax_flavour -#endif - -/* - * SYMBOLS - */ - -/* - * If your object format needs to reorder symbols, define this. When - * defined, symbols are kept on a doubly linked list and functions are - * made available for push, insert, append, and delete. If not defined, - * symbols are kept on a singly linked list, only the append and clear - * facilities are available, and they are macros. - */ - -/* #define SYMBOLS_NEED_PACKPOINTERS */ - -/* */ -typedef struct - { - void *nothing; - } -obj_symbol_type; /* should be the format's symbol structure */ - -typedef void *object_headers; - -#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE (0) /* your magic number */ - -#define OBJ_EMIT_LINENO(a,b,c) /* must be *something*. This no-op's it out. */ - -#define obj_symbol_new_hook(s) {;} - -#define S_SET_OTHER(S,V) -#define S_SET_TYPE(S,T) -#define S_SET_DESC(S,D) -#define S_GET_OTHER(S) 0 -#define S_GET_TYPE(S) 0 -#define S_GET_DESC(S) 0 - -#define PDSC_S_K_KIND_FP_STACK 9 -#define PDSC_S_K_KIND_FP_REGISTER 10 -#define PDSC_S_K_KIND_NULL 8 - -#define PDSC_S_K_MIN_STACK_SIZE 32 -#define PDSC_S_K_MIN_REGISTER_SIZE 24 -#define PDSC_S_K_NULL_SIZE 16 - -#define PDSC_S_M_BASE_REG_IS_FP 0x80 /* low byte */ -#define PDSC_S_M_NATIVE 0x10 /* high byte */ -#define PDSC_S_M_NO_JACKET 0x20 /* high byte */ - -#define LKP_S_K_SIZE 16 - -#define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) (P2VAR) = 3 - -/* - * Local Variables: - * comment-column: 0 - * fill-column: 131 - * End: - */ - -/* end of obj-evax.h */ diff --git a/gas/config/obj-generic.c b/gas/config/obj-generic.c deleted file mode 100644 index 69fc3d1dbf9..00000000000 --- a/gas/config/obj-generic.c +++ /dev/null @@ -1,41 +0,0 @@ -/* This file is obj-generic.c and is intended to be a template for - object format specific source files. - - Copyright (C) 1987-1992 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Chars that can be used to separate mant from exp in floating point nums */ -char EXP_CHARS[] = "eE"; - -/* Chars that mean this number is a floating point constant */ -/* As in 0f12.456 */ -/* or 0d1.2345e12 */ -char FLT_CHARS[] = "rRsSfFdDxXpP"; - -/* These chars start a comment anywhere in a source file (except inside - another comment */ -const char comment_chars[] = "#"; - -/* - * Local Variables: - * comment-column: 0 - * fill-column: 131 - * End: - */ - -/* end of obj-generic.c */ diff --git a/gas/config/obj-generic.h b/gas/config/obj-generic.h deleted file mode 100644 index dc18e439703..00000000000 --- a/gas/config/obj-generic.h +++ /dev/null @@ -1,80 +0,0 @@ -/* This file is obj-generic.h - Copyright (C) 1987-1992 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* - * This file is obj-generic.h and is intended to be a template for - * object format specific header files. - */ - -/* define an obj specific macro off which target cpu back ends may key. */ -#define OBJ_GENERIC 1 - -/* include whatever target cpu is appropriate. */ -#include "targ-cpu.h" - -/* - * SYMBOLS - */ - -/* - * If your object format needs to reorder symbols, define this. When - * defined, symbols are kept on a doubly linked list and functions are - * made available for push, insert, append, and delete. If not defined, - * symbols are kept on a singly linked list, only the append and clear - * facilities are available, and they are macros. - */ - -/* #define SYMBOLS_NEED_PACKPOINTERS */ - -/* */ -typedef struct - { - void *nothing; - } - -obj_symbol_type; /* should be the format's symbol structure */ - -typedef void *object_headers; - -/* symbols have names */ -#define S_GET_NAME(s) ("foo") /* get the name of a symbolP */ -#define S_SET_NAME(s,v) ; -/* symbols have segments */ -#define S_GET_SEGMENT(s) (SEG_UNKNOWN) -#define S_SET_SEGMENT(s,v) ; -/* symbols may be external */ -#define S_IS_EXTERNAL(s) (0) -#define S_SET_EXTERNAL(s) ; - -/* symbols may or may not be defined */ -#define S_IS_DEFINED(s) (0) - - -#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE (0) /* your magic number */ - -#define OBJ_EMIT_LINENO(a,b,c) /* must be *something*. This no-op's it out. */ - -/* - * Local Variables: - * comment-column: 0 - * fill-column: 131 - * End: - */ - -/* end of obj-generic.h */ diff --git a/gas/config/obj-hp300.c b/gas/config/obj-hp300.c deleted file mode 100644 index 6e9cc53927a..00000000000 --- a/gas/config/obj-hp300.c +++ /dev/null @@ -1,52 +0,0 @@ -/* This file is obj-hp300.h - Copyright (C) 1993 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "config/obj-aout.c" - -/* Aout file generation & utilities */ -void -hp300_header_append (where, headers) - char **where; - object_headers *headers; -{ - tc_headers_hook (headers); - -#define DO(FIELD) \ - { \ - md_number_to_chars (*where, headers->header.FIELD, sizeof (headers->header.FIELD)); \ - *where += sizeof (headers->header.FIELD); \ - } - - DO (a_info); - DO (a_spare1); - DO (a_spare2); - DO (a_text); - DO (a_data); - DO (a_bss); - DO (a_trsize); - DO (a_drsize); - DO (a_spare3); - DO (a_spare4); - DO (a_spare5); - DO (a_entry); - DO (a_spare6); - DO (a_spare7); - DO (a_syms); - DO (a_spare8); -} diff --git a/gas/config/obj-hp300.h b/gas/config/obj-hp300.h deleted file mode 100644 index ff4006b6040..00000000000 --- a/gas/config/obj-hp300.h +++ /dev/null @@ -1,71 +0,0 @@ -/* This file is obj-hp300.h - Copyright (C) 1993 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define __STRUCT_EXEC_OVERRIDE__ - -struct exec_bytes -{ - unsigned char a_info[4]; /* a_machtype/a_magic */ - unsigned char a_spare1[4]; - unsigned char a_spare2[4]; - unsigned char a_text[4]; /* length of text, in bytes */ - unsigned char a_data[4]; /* length of data, in bytes */ - unsigned char a_bss[4]; /* length of uninitialized data area for file, in bytes */ - unsigned char a_trsize[4]; /* length of relocation info for text, in bytes */ - unsigned char a_drsize[4]; /* length of relocation info for data, in bytes */ - unsigned char a_spare3[4]; /* HP = pascal interface size */ - unsigned char a_spare4[4]; /* HP = symbol table size */ - unsigned char a_spare5[4]; /* HP = debug name table size */ - unsigned char a_entry[4]; /* start address */ - unsigned char a_spare6[4]; /* HP = source line table size */ - unsigned char a_spare7[4]; /* HP = value table size */ - unsigned char a_syms[4]; /* length of symbol table data in file, in bytes */ - unsigned char a_spare8[4]; -}; - -/* How big the "struct exec" is on disk */ -#define EXEC_BYTES_SIZE (16 * 4) - -struct exec -{ - unsigned long a_info; - unsigned long a_spare1; - unsigned long a_spare2; - unsigned long a_text; - unsigned long a_data; - unsigned long a_bss; - unsigned long a_trsize; - unsigned long a_drsize; - unsigned long a_spare3; - unsigned long a_spare4; - unsigned long a_spare5; - unsigned long a_entry; - unsigned long a_spare6; - unsigned long a_spare7; - unsigned long a_syms; - unsigned long a_spare8; -}; - -#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE (OMAGIC) -#define AOUT_VERSION 0x02 -#define AOUT_MACHTYPE 0x0c -#define OMAGIC 0x106 - -#define obj_header_append hp300_header_append -#include "config/obj-aout.h" diff --git a/gas/config/obj-ieee.c b/gas/config/obj-ieee.c deleted file mode 100644 index 30a0798e295..00000000000 --- a/gas/config/obj-ieee.c +++ /dev/null @@ -1,627 +0,0 @@ -/* obj-format for ieee-695 records. - Copyright (C) 1991, 92, 93, 94, 95, 1997, 1998 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - - -/* - created by - - steve chamberlain steve@cygnus.com - */ - -/* - this will hopefully become the port through which bfd and gas talk, - for the moment, only ieee is known to work well. - */ - -#include "bfd.h" -#include "as.h" -#include "subsegs.h" -#include "output-file.h" -#include "frags.h" - -bfd *abfd; - -/* How many addresses does the .align take? */ -static relax_addressT -relax_align (address, alignment) - register relax_addressT address; /* Address now. */ - register long alignment; /* Alignment (binary). */ -{ - relax_addressT mask; - relax_addressT new_address; - - mask = ~((~0) << alignment); - new_address = (address + mask) & (~mask); - return (new_address - address); -} /* relax_align() */ - -/* calculate the size of the frag chain and create a bfd section - to contain all of it */ -static void -DEFUN (size_section, (abfd, idx), - bfd * abfd AND - unsigned int idx) -{ - asection *sec; - unsigned int size = 0; - fragS *frag = segment_info[idx].frag_root; - while (frag) - { - if (frag->fr_address != size) - { - printf (_("Out of step\n")); - size = frag->fr_address; - } - size += frag->fr_fix; - switch (frag->fr_type) - { - case rs_fill: - case rs_org: - size += frag->fr_offset * frag->fr_var; - break; - case rs_align: - case rs_align_code: - { - addressT off; - - off = relax_align (size, frag->fr_offset); - if (frag->fr_subtype != 0 && off > frag->fr_subtype) - off = 0; - size += off; - } - } - frag = frag->fr_next; - } - if (size) - { - char *name = segment_info[idx].name; - if (name == (char *) NULL) - { - name = ".data"; - } - segment_info[idx].user_stuff = (char *) (sec = bfd_make_section (abfd, name)); - /* Make it output through itself */ - sec->output_section = sec; - sec->flags |= SEC_HAS_CONTENTS; - bfd_set_section_size (abfd, sec, size); - } -} - -/* run through a frag chain and write out the data to go with it */ -static void -DEFUN (fill_section, (abfd, idx), - bfd * abfd AND - unsigned int idx) -{ - asection *sec = segment_info[idx].user_stuff; - if (sec) - { - fragS *frag = segment_info[idx].frag_root; - unsigned int offset = 0; - while (frag) - { - unsigned int fill_size; - unsigned int count; - switch (frag->fr_type) - { - case rs_fill: - case rs_align: - case rs_org: - if (frag->fr_fix) - { - bfd_set_section_contents (abfd, - sec, - frag->fr_literal, - frag->fr_address, - frag->fr_fix); - } - offset += frag->fr_fix; - fill_size = frag->fr_var; - if (fill_size) - { - unsigned int off = frag->fr_fix; - for (count = frag->fr_offset; count; count--) - { - bfd_set_section_contents (abfd, sec, - frag->fr_literal + - frag->fr_fix, - frag->fr_address + off, - fill_size); - off += fill_size; - } - } - break; - default: - abort (); - } - frag = frag->fr_next; - } - } -} - -/* Count the relocations in a chain */ - -static unsigned int -DEFUN (count_entries_in_chain, (idx), - unsigned int idx) -{ - unsigned int nrelocs; - fixS *fixup_ptr; - - /* Count the relocations */ - fixup_ptr = segment_info[idx].fix_root; - nrelocs = 0; - while (fixup_ptr != (fixS *) NULL) - { - fixup_ptr = fixup_ptr->fx_next; - nrelocs++; - } - return nrelocs; -} - -/* output all the relocations for a section */ -void -DEFUN (do_relocs_for, (idx), - unsigned int idx) -{ - unsigned int nrelocs; - arelent **reloc_ptr_vector; - arelent *reloc_vector; - asymbol **ptrs; - asection *section = (asection *) (segment_info[idx].user_stuff); - unsigned int i; - fixS *from; - if (section) - { - nrelocs = count_entries_in_chain (idx); - - reloc_ptr_vector = (arelent **) malloc ((nrelocs + 1) * sizeof (arelent *)); - reloc_vector = (arelent *) malloc (nrelocs * sizeof (arelent)); - ptrs = (asymbol **) malloc (nrelocs * sizeof (asymbol *)); - from = segment_info[idx].fix_root; - for (i = 0; i < nrelocs; i++) - { - arelent *to = reloc_vector + i; - asymbol *s; - reloc_ptr_vector[i] = to; - to->howto = (reloc_howto_type *) (from->fx_r_type); - -#if 0 /* We can't represent complicated things in a reloc yet */ - if (from->fx_addsy == 0 || from->fx_subsy != 0) abort(); -#endif - - s = &(from->fx_addsy->sy_symbol.sy); - to->address = ((char *) (from->fx_frag->fr_address + - from->fx_where)) - - ((char *) (&(from->fx_frag->fr_literal))); - to->addend = from->fx_offset; - /* If we know the symbol which we want to relocate to, turn - this reloaction into a section relative. - - If this relocation is pcrelative, and we know the - destination, we still want to keep the relocation - since - the linker might relax some of the bytes, but it stops - being pc relative and turns into an absolute relocation. */ - if (s) - { - if ((s->flags & BSF_UNDEFINED) == 0) - { - to->section = s->section; - - /* We can refer directly to the value field here, - rather than using S_GET_VALUE, because this is - only called after do_symbols, which sets up the - value field. */ - to->addend += s->value; - - to->sym_ptr_ptr = 0; - if (to->howto->pcrel_offset) - { - /* This is a pcrel relocation, the addend should be adjusted */ - to->addend -= to->address + 1; - } - } - else - { - to->section = 0; - *ptrs = &(from->fx_addsy->sy_symbol.sy); - to->sym_ptr_ptr = ptrs; - - if (to->howto->pcrel_offset) - { - /* This is a pcrel relocation, the addend should be adjusted */ - to->addend -= to->address - 1; - } - } - - } - else - { - to->section = 0; - } - - ptrs++; - from = from->fx_next; - } - - /* attatch to the section */ - section->orelocation = reloc_ptr_vector; - section->reloc_count = nrelocs; - section->flags |= SEC_LOAD; - } -} - -/* do the symbols.. */ -static void -DEFUN (do_symbols, (abfd), - bfd * abfd) -{ - extern symbolS *symbol_rootP; - symbolS *ptr; - asymbol **symbol_ptr_vec; - asymbol *symbol_vec; - unsigned int count = 0; - unsigned int index; - - - for (ptr = symbol_rootP; - ptr != (symbolS *) NULL; - ptr = ptr->sy_next) - { - if (SEG_NORMAL (ptr->sy_symbol.seg)) - { - ptr->sy_symbol.sy.section = - (asection *) (segment_info[ptr->sy_symbol.seg].user_stuff); - S_SET_VALUE (ptr, S_GET_VALUE (ptr) + ptr->sy_frag->fr_address); - if (ptr->sy_symbol.sy.flags == 0) - { - ptr->sy_symbol.sy.flags = BSF_LOCAL; - } - } - else - { - switch (ptr->sy_symbol.seg) - { - case SEG_ABSOLUTE: - ptr->sy_symbol.sy.flags |= BSF_ABSOLUTE; - ptr->sy_symbol.sy.section = 0; - break; - case SEG_UNKNOWN: - ptr->sy_symbol.sy.flags = BSF_UNDEFINED; - ptr->sy_symbol.sy.section = 0; - break; - default: - abort (); - } - } - ptr->sy_symbol.sy.value = S_GET_VALUE (ptr); - count++; - } - symbol_ptr_vec = (asymbol **) malloc ((count + 1) * sizeof (asymbol *)); - - index = 0; - for (ptr = symbol_rootP; - ptr != (symbolS *) NULL; - ptr = ptr->sy_next) - { - symbol_ptr_vec[index] = &(ptr->sy_symbol.sy); - index++; - } - symbol_ptr_vec[index] = 0; - abfd->outsymbols = symbol_ptr_vec; - abfd->symcount = count; -} - -/* The generic as->bfd converter. Other backends may have special case - code */ - -void -DEFUN_VOID (bfd_as_write_hook) -{ - int i; - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - size_section (abfd, i); - } - - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - fill_section (abfd, i); - - do_symbols (abfd); - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - do_relocs_for (i); - -} - -S_SET_SEGMENT (x, y) - symbolS *x; - int y; -{ - x->sy_symbol.seg = y; -} - -S_IS_DEFINED (x) - symbolS *x; -{ - if (SEG_NORMAL (x->sy_symbol.seg)) - { - return 1; - } - switch (x->sy_symbol.seg) - { - case SEG_UNKNOWN: - return 0; - default: - abort (); - } -} - -S_IS_EXTERNAL (x) -{ - abort (); -} - -S_GET_DESC (x) -{ - abort (); -} - -S_GET_SEGMENT (x) - symbolS *x; -{ - return x->sy_symbol.seg; -} - -S_SET_EXTERNAL (x) - symbolS *x; -{ - x->sy_symbol.sy.flags |= BSF_GLOBAL | BSF_EXPORT; -} - -S_SET_NAME (x, y) - symbolS *x; - char *y; -{ - x->sy_symbol.sy.name = y; -} - -S_GET_OTHER (x) -{ - abort (); -} - -S_IS_DEBUG (x) -{ - abort (); -} - -#ifndef segment_name -char * -segment_name () -{ - abort (); -} -#endif - -void -obj_read_begin_hook () -{ -} - -static void -obj_ieee_section (ignore) - int ignore; -{ - extern char *input_line_pointer; - extern char is_end_of_line[]; - char *p = input_line_pointer; - char *s = p; - int i; - /* Look up the name, if it doesn't exist, make it */ - while (*p && *p != ' ' && *p != ',' && !is_end_of_line[*p]) - { - p++; - } - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - if (segment_info[i].hadone) - { - if (strncmp (segment_info[i].name, s, p - s) == 0) - { - goto ok; - - } - } - else - break; - } - if (i == SEG_UNKNOWN) - { - as_bad (_("too many sections")); - return; - } - - segment_info[i].hadone = 1; - segment_info[i].name = malloc (p - s + 1); - memcpy (segment_info[i].name, s, p - s); - segment_info[i].name[p - s] = 0; -ok: - subseg_set (i, 0); - while (!is_end_of_line[*p]) - p++; - input_line_pointer = p; - -} - - -void cons (); -void s_ignore (); - - -void s_globl (); -const pseudo_typeS obj_pseudo_table[] = -{ - {"section", obj_ieee_section, 0}, - {"data.b", cons, 1}, - {"data.w", cons, 2}, - {"data.l", cons, 4}, - {"export", s_globl, 0}, - {"option", s_ignore, 0}, - {"end", s_ignore, 0}, - {"import", s_ignore, 0}, - {"sdata", stringer, 0}, - 0, - -}; - - - -void -obj_symbol_new_hook (symbolP) - symbolS *symbolP; -{ - symbolP->sy_symbol.sy.the_bfd = abfd; -} - - - - - -#if 1 -extern void -DEFUN_VOID (write_object_file) -{ - int i; - struct frchain *frchain_ptr; - struct frag *frag_ptr; - - abfd = bfd_openw (out_file_name, "ieee"); - - if (abfd == 0) - { - as_perror (_("FATAL: Can't create %s"), out_file_name); - exit (EXIT_FAILURE); - } - bfd_set_format (abfd, bfd_object); - bfd_set_arch_mach (abfd, bfd_arch_h8300, 0); - subseg_set (1, 0); - subseg_set (2, 0); - subseg_set (3, 0); - for (frchain_ptr = frchain_root; - frchain_ptr != (struct frchain *) NULL; - frchain_ptr = frchain_ptr->frch_next) - { - /* Run through all the sub-segments and align them up. Also close any - open frags. We tack a .fill onto the end of the frag chain so - that any .align's size can be worked by looking at the next - frag. */ - - subseg_set (frchain_ptr->frch_seg, frchain_ptr->frch_subseg); -#ifndef SUB_SEGMENT_ALIGN -#define SUB_SEGMENT_ALIGN(SEG) 2 -#endif - frag_align (SUB_SEGMENT_ALIGN (now_seg), 0, 0); - frag_wane (frag_now); - frag_now->fr_fix = 0; - know (frag_now->fr_next == NULL); - } - - /* Now build one big frag chain for each segment, linked through - fr_next. */ - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - - fragS **prev_frag_ptr_ptr; - struct frchain *next_frchain_ptr; - - /* struct frag **head_ptr = segment_info[i].frag_root;*/ - - segment_info[i].frag_root = segment_info[i].frchainP->frch_root; -#if 0 - /* Im not sure what this is for */ - for (frchain_ptr = segment_info[i].frchainP->frch_root; - frchain_ptr != (struct frchain *) NULL; - frchain_ptr = frchain_ptr->frch_next) - { - *head_ptr = frchain_ptr; - head_ptr = &frchain_ptr->next; - } - - -#endif - } - - for (i = SEG_E0; i < SEG_UNKNOWN; i++) - { - relax_segment (segment_info[i].frag_root, i); - } - - /* Now the addresses of the frags are correct within the segment */ - - bfd_as_write_hook (); - bfd_close (abfd); -} - -#endif - -H_SET_TEXT_SIZE (a, b) -{ - abort (); -} - -H_GET_TEXT_SIZE () -{ - abort (); -} - -H_SET_BSS_SIZE () -{ - abort (); -} - -H_SET_STRING_SIZE () -{ - abort (); -} - -H_SET_RELOCATION_SIZE () -{ - abort (); -} - -H_SET_MAGIC_NUMBER () -{ - abort (); -} - -H_GET_FILE_SIZE () -{ - abort (); -} - -H_GET_TEXT_RELOCATION_SIZE () -{ - abort (); -} - -/* end of obj-ieee.c */ diff --git a/gas/config/obj-ieee.h b/gas/config/obj-ieee.h deleted file mode 100644 index 4a0f126ebe4..00000000000 --- a/gas/config/obj-ieee.h +++ /dev/null @@ -1,50 +0,0 @@ -/* This file is obj-ieee.h - - Copyright (C) 1987-1992 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BFD 1 - -#include - -typedef struct -{ - asymbol sy; - int seg; -} - -obj_symbol_type; - -#define S_GET_NAME(s) (((s)->sy_symbol.sy.name)) - -typedef struct - { - int x; - } - -object_headers; - -#define DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE 1 - - -int lineno_rootP; - - -#define IEEE_STYLE - -/* end of obj-ieee.h */ diff --git a/gas/config/obj-multi.c b/gas/config/obj-multi.c deleted file mode 100644 index d115093aff3..00000000000 --- a/gas/config/obj-multi.c +++ /dev/null @@ -1,4 +0,0 @@ -/* foo */ - -#include "as.h" - diff --git a/gas/config/obj-multi.h b/gas/config/obj-multi.h deleted file mode 100644 index 42b7eb33e3c..00000000000 --- a/gas/config/obj-multi.h +++ /dev/null @@ -1,104 +0,0 @@ -/* Multiple object format emulation. - Copyright (C) 1995, 96, 97, 99, 2000 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef _OBJ_MULTI_H -#define _OBJ_MULTI_H - -#ifdef OBJ_HEADER -#include OBJ_HEADER -#else - -#include "emul.h" -#include "targ-cpu.h" - -#define OUTPUT_FLAVOR \ - (this_format->flavor) - -#define obj_frob_symbol(S,P) \ - (*this_format->frob_symbol) (S, &(P)) - -#define obj_frob_file() \ - (this_format->frob_file \ - ? (*this_format->frob_file) () \ - : (void) 0) - -#define obj_frob_file_after_relocs() \ - (this_format->frob_file_after_relocs \ - ? (*this_format->frob_file_after_relocs) () \ - : (void) 0) - -#define obj_ecoff_set_ext \ - (*this_format->ecoff_set_ext) - -#define obj_pop_insert \ - (*this_format->pop_insert) - -#define obj_read_begin_hook() \ - (this_format->read_begin_hook \ - ? (*this_format->read_begin_hook) () \ - : (void) 0) - -#define obj_symbol_new_hook(S) \ - (this_format->symbol_new_hook \ - ? (*this_format->symbol_new_hook) (S) \ - : (void) 0) - -#define obj_sec_sym_ok_for_reloc(A) \ - (this_format->sec_sym_ok_for_reloc \ - ? (*this_format->sec_sym_ok_for_reloc) (A) \ - : 0) - -#define S_GET_SIZE \ - (*this_format->s_get_size) - -#define S_SET_SIZE \ - (*this_format->s_set_size) - -#define S_GET_ALIGN \ - (*this_format->s_get_align) - -#define S_SET_ALIGN \ - (*this_format->s_set_align) - -#define S_GET_OTHER \ - (*this_format->s_get_other) - -#define S_GET_DESC \ - (*this_format->s_get_desc) - -#define OBJ_COPY_SYMBOL_ATTRIBUTES(d,s) \ - (this_format->copy_symbol_attributes \ - ? (*this_format->copy_symbol_attributes) (d, s) \ - : (void) 0) - -#define OBJ_PROCESS_STAB(SEG,W,S,T,O,D) \ - (this_format->process_stab \ - ? (*this_format->process_stab) (SEG,W,S,T,O,D) \ - : (void) 0) - -#ifdef OBJ_MAYBE_ELF -/* We need OBJ_SYMFIELD_TYPE so that symbol_get_obj is defined in symbol.c - We also need various STAB defines for stab.c */ -#include "obj-elf.h" -#endif - -#endif /* !OBJ_HEADER */ -#endif /* _OBJ_MULTI_H */ diff --git a/gas/config/obj-som.c b/gas/config/obj-som.c deleted file mode 100644 index 65d4adad58c..00000000000 --- a/gas/config/obj-som.c +++ /dev/null @@ -1,339 +0,0 @@ -/* SOM object file format. - Copyright (C) 1993, 1998 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2, - or (at your option) any later version. - - GAS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. - - Written by the Center for Software Science at the University of Utah - and by Cygnus Support. */ - -#include "as.h" -#include "subsegs.h" -#include "aout/stab_gnu.h" -#include "obstack.h" - -static void obj_som_weak PARAMS ((int)); - -const pseudo_typeS obj_pseudo_table[] = -{ - {"weak", obj_som_weak, 0} -}; - -static int version_seen = 0; -static int copyright_seen = 0; -static int compiler_seen = 0; - -/* Unused by SOM. */ -void obj_read_begin_hook () {} - -/* Handle a .compiler directive. This is intended to create the - compilation unit auxiliary header for MPE such that the linkeditor - can handle SOM extraction from archives. The format of the quoted - string is "sourcefile language version" and is delimited by blanks.*/ - -void -obj_som_compiler (unused) - int unused; -{ - char *buf; - char c; - char *filename; - char *language_name; - char *p; - char *version_id; - - if (compiler_seen) - { - as_bad ("Only one .compiler pseudo-op per file!"); - ignore_rest_of_line (); - return; - } - - SKIP_WHITESPACE (); - if (*input_line_pointer == '\"') - { - buf = input_line_pointer; - ++input_line_pointer; - while (is_a_char (next_char_of_string ())) - ; - c = *input_line_pointer; - *input_line_pointer = '\000'; - } - else - { - as_bad ("Expected quoted string"); - ignore_rest_of_line (); - return; - } - - /* Parse the quoted string into its component parts. Skip the - quote. */ - filename = buf + 1; - p = filename; - while (*p != ' ' && *p != '\000') - p++; - if (*p == '\000') - { - as_bad (".compiler directive missing language and version"); - return; - } - *p = '\000'; - - language_name = ++p; - while (*p != ' ' && *p != '\000') p++; - if (*p == '\000') - { - as_bad (".compiler directive missing version"); - return; - } - *p = '\000'; - - version_id = ++p; - while (*p != '\000') p++; - /* Remove the trailing quote. */ - *(--p) = '\000'; - - compiler_seen = 1; - if (! bfd_som_attach_compilation_unit (stdoutput, filename, language_name, - "GNU Tools", version_id)) - { - bfd_perror (stdoutput->filename); - as_fatal ("FATAL: Attaching compiler header %s", stdoutput->filename); - } - *input_line_pointer = c; - demand_empty_rest_of_line (); -} - -/* Handle a .version directive. */ - -void -obj_som_version (unused) - int unused; -{ - char *version, c; - - if (version_seen) - { - as_bad (_("Only one .version pseudo-op per file!")); - ignore_rest_of_line (); - return; - } - - SKIP_WHITESPACE (); - if (*input_line_pointer == '\"') - { - version = input_line_pointer; - ++input_line_pointer; - while (is_a_char (next_char_of_string ())) - ; - c = *input_line_pointer; - *input_line_pointer = '\000'; - } - else - { - as_bad (_("Expected quoted string")); - ignore_rest_of_line (); - return; - } - - version_seen = 1; - if (bfd_som_attach_aux_hdr (stdoutput, VERSION_AUX_ID, version) == false) - { - bfd_perror (stdoutput->filename); - as_perror (_("FATAL: Attaching version header %s"), stdoutput->filename); - exit (EXIT_FAILURE); - } - *input_line_pointer = c; - demand_empty_rest_of_line (); -} - -/* Handle a .copyright directive. This probably isn't complete, but - it's of dubious value anyway and (IMHO) not worth the time to finish. - If you care about copyright strings that much, you fix it. */ - -void -obj_som_copyright (unused) - int unused; -{ - char *copyright, c; - - if (copyright_seen) - { - as_bad (_("Only one .copyright pseudo-op per file!")); - ignore_rest_of_line (); - return; - } - - SKIP_WHITESPACE (); - if (*input_line_pointer == '\"') - { - copyright = input_line_pointer; - ++input_line_pointer; - while (is_a_char (next_char_of_string ())) - ; - c = *input_line_pointer; - *input_line_pointer = '\000'; - } - else - { - as_bad (_("Expected quoted string")); - ignore_rest_of_line (); - return; - } - - copyright_seen = 1; - if (bfd_som_attach_aux_hdr (stdoutput, COPYRIGHT_AUX_ID, copyright) == false) - { - bfd_perror (stdoutput->filename); - as_perror (_("FATAL: Attaching copyright header %s"), stdoutput->filename); - exit (EXIT_FAILURE); - } - *input_line_pointer = c; - demand_empty_rest_of_line (); -} - -/* Perform any initialization necessary for stabs support. - - For SOM we need to create the space which will contain the - two stabs subspaces. Additionally we need to set up the - space/subspace relationships and set space/subspace attributes - which BFD does not understand. */ - -void -obj_som_init_stab_section (seg) - segT seg; -{ - segT saved_seg = now_seg; - segT space; - subsegT saved_subseg = now_subseg; - char *p, *file; - unsigned int stroff; - - /* Make the space which will contain the debug subspaces. */ - space = bfd_make_section_old_way (stdoutput, "$GDB_DEBUG$"); - - /* Set SOM specific attributes for the space. In particular we set - the space "defined", "private", "sort_key", and "spnum" values. - - Due to a bug in pxdb (called by hpux linker), the sort keys - of the various stabs spaces/subspaces need to be "small". We - reserve range 72/73 which appear to work well. */ - obj_set_section_attributes (space, 1, 1, 72, 2); - bfd_set_section_alignment (stdoutput, space, 2); - - /* Set the containing space for both stab sections to be $GDB_DEBUG$ - (just created above). Also set some attributes which BFD does - not understand. In particular, access bits, sort keys, and load - quadrant. */ - obj_set_subsection_attributes (seg, space, 0x1f, 73, 0); - bfd_set_section_alignment (stdoutput, seg, 2); - - /* Make some space for the first special stab entry and zero the memory. - It contains information about the length of this file's - stab string and the like. Using it avoids the need to - relocate the stab strings. - - The $GDB_STRINGS$ space will be created as a side effect of - the call to get_stab_string_offset. */ - p = frag_more (12); - memset (p, 0, 12); - as_where (&file, (unsigned int *) NULL); - stroff = get_stab_string_offset (file, "$GDB_STRINGS$"); - know (stroff == 1); - md_number_to_chars (p, stroff, 4); - seg_info (seg)->stabu.p = p; - - /* Set the containing space for both stab sections to be $GDB_DEBUG$ - (just created above). Also set some attributes which BFD does - not understand. In particular, access bits, sort keys, and load - quadrant. */ - seg = bfd_get_section_by_name (stdoutput, "$GDB_STRINGS$"); - obj_set_subsection_attributes (seg, space, 0x1f, 72, 0); - bfd_set_section_alignment (stdoutput, seg, 2); - - subseg_set (saved_seg, saved_subseg); -} - -/* Fill in the counts in the first entry in a .stabs section. */ - -static void -adjust_stab_sections (abfd, sec, xxx) - bfd *abfd; - asection *sec; - PTR xxx; -{ - asection *strsec; - char *p; - int strsz, nsyms; - - if (strcmp ("$GDB_SYMBOLS$", sec->name)) - return; - - strsec = bfd_get_section_by_name (abfd, "$GDB_STRINGS$"); - if (strsec) - strsz = bfd_section_size (abfd, strsec); - else - strsz = 0; - nsyms = bfd_section_size (abfd, sec) / 12 - 1; - - p = seg_info (sec)->stabu.p; - assert (p != 0); - - bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6); - bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8); -} - -/* Called late in the asssembly phase to adjust the special - stab entry and to set the starting address for each code subspace. */ - -void -som_frob_file () -{ - bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0); -} - -static void -obj_som_weak (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - char *name; - int c; - symbolS *symbolP; - - do - { - name = input_line_pointer; - c = get_symbol_end (); - symbolP = symbol_find_or_make (name); - *input_line_pointer = c; - SKIP_WHITESPACE (); - S_SET_WEAK (symbolP); -#if 0 - symbol_get_obj (symbolP)->local = 1; -#endif - if (c == ',') - { - input_line_pointer++; - SKIP_WHITESPACE (); - if (*input_line_pointer == '\n') - c = '\n'; - } - } - while (c == ','); - demand_empty_rest_of_line (); -} - diff --git a/gas/config/obj-som.h b/gas/config/obj-som.h deleted file mode 100644 index 62087b125f7..00000000000 --- a/gas/config/obj-som.h +++ /dev/null @@ -1,73 +0,0 @@ -/* SOM object file format. - Copyright (C) 1993, 1994, 1995, 1998 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. - - Written by the Center for Software Science at the University of Utah - and by Cygnus Support. */ - -#ifndef _OBJ_SOM_H -#define _OBJ_SOM_H - -#define OBJ_SOM 1 - -#include -#include "bfd/som.h" -#include "targ-cpu.h" - -#ifndef FALSE -#define FALSE 0 -#define TRUE !FALSE -#endif - -/* should be conditional on address size! */ -#define som_symbol(asymbol) ((som_symbol_type *)(&(asymbol)->the_bfd)) - -extern void som_file_symbol PARAMS ((char *)); -extern void obj_som_version PARAMS ((int)); -extern void obj_som_init_stab_section PARAMS ((segT)); -extern void obj_som_copyright PARAMS ((int)); -extern void obj_som_compiler PARAMS ((int)); - -#define obj_symbol_new_hook(s) {;} - -/* SOM has several attributes for spaces/subspaces which can not - be easily expressed in BFD. We use these macros to trigger calls - into the SOM BFD backend to set these attributes. */ -#define obj_set_section_attributes bfd_som_set_section_attributes -#define obj_set_subsection_attributes bfd_som_set_subsection_attributes - -/* Likewise for symbol types. */ -#define obj_set_symbol_type bfd_som_set_symbol_type - -/* Stabs go in a separate sections. GDB expects to find them in sections - with the names $GDB_SYMBOLS$ and $GDB_STRINGS$ rather than .stab and - .stabstr. */ -#define SEPARATE_STAB_SECTIONS 1 -#define STAB_SECTION_NAME "$GDB_SYMBOLS$" -#define STAB_STRING_SECTION_NAME "$GDB_STRINGS$" - -/* We use INIT_STAB_SECTION to record the space/subspace relationships - for the various debugging sections. */ -#define INIT_STAB_SECTION(seg) obj_som_init_stab_section (seg) - -/* We'll be updating the magic 1st stab entry once the entire assembly - fail has been processed. */ -#define obj_frob_file() som_frob_file() - -#endif /* _OBJ_SOM_H */ diff --git a/gas/config/obj-vms.c b/gas/config/obj-vms.c deleted file mode 100644 index 0f08f8eb3f3..00000000000 --- a/gas/config/obj-vms.c +++ /dev/null @@ -1,5549 +0,0 @@ -/* vms.c -- Write out a VAX/VMS object file - Copyright (C) 1987, 88, 92, 94, 95, 97, 1998 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -/* Written by David L. Kashtan */ -/* Modified by Eric Youngdale to write VMS debug records for program - variables */ - -/* Want all of obj-vms.h (as obj-format.h, via targ-env.h, via as.h). */ -#define WANT_VMS_OBJ_DEFS - -#include "as.h" -#include "config.h" -#include "subsegs.h" -#include "obstack.h" - -/* What we do if there is a goof. */ -#define error as_fatal - -#ifdef VMS /* These are of no use if we are cross assembling. */ -#include /* Define File Access Block */ -#include /* Define NAM Block */ -#include /* Define XAB - all different types*/ -extern int sys$open(), sys$close(), sys$asctim(); -#endif - -/* - * Version string of the compiler that produced the code we are - * assembling. (And this assembler, if we do not have compiler info.) - */ -char *compiler_version_string; - -extern int flag_hash_long_names; /* -+ */ -extern int flag_one; /* -1; compatibility with gcc 1.x */ -extern int flag_show_after_trunc; /* -H */ -extern int flag_no_hash_mixed_case; /* -h NUM */ - -/* Flag that determines how we map names. This takes several values, and - * is set with the -h switch. A value of zero implies names should be - * upper case, and the presence of the -h switch inhibits the case hack. - * No -h switch at all sets vms_name_mapping to 0, and allows case hacking. - * A value of 2 (set with -h2) implies names should be - * all lower case, with no case hack. A value of 3 (set with -h3) implies - * that case should be preserved. */ - -/* If the -+ switch is given, then the hash is appended to any name that is - * longer than 31 characters, regardless of the setting of the -h switch. - */ - -char vms_name_mapping = 0; - -static symbolS *Entry_Point_Symbol = 0; /* Pointer to "_main" */ - -/* - * We augment the "gas" symbol structure with this - */ -struct VMS_Symbol -{ - struct VMS_Symbol *Next; - symbolS *Symbol; - int Size; - int Psect_Index; - int Psect_Offset; -}; - -struct VMS_Symbol *VMS_Symbols = 0; -struct VMS_Symbol *Ctors_Symbols = 0; -struct VMS_Symbol *Dtors_Symbols = 0; - -/* We need this to keep track of the various input files, so that we can - * give the debugger the correct source line. - */ - -struct input_file -{ - struct input_file *next; - struct input_file *same_file_fpnt; - int file_number; - int max_line; - int min_line; - int offset; - char flag; - char *name; - symbolS *spnt; -}; - -static struct input_file *file_root = (struct input_file *) NULL; - - -/* - * Styles of PSECTS (program sections) that we generate; just shorthand - * to avoid lists of section attributes. Used by VMS_Psect_Spec(). - */ -enum ps_type -{ - ps_TEXT, ps_DATA, ps_COMMON, ps_CONST, ps_CTORS, ps_DTORS -}; - -/* - * This enum is used to keep track of the various types of variables that - * may be present. - */ - -enum advanced_type -{ - BASIC, POINTER, ARRAY, ENUM, STRUCT, UNION, FUNCTION, VOID, ALIAS, UNKNOWN -}; - -/* - * This structure contains the information from the stabs directives, and the - * information is filled in by VMS_typedef_parse. Everything that is needed - * to generate the debugging record for a given symbol is present here. - * This could be done more efficiently, using nested struct/unions, but for now - * I am happy that it works. - */ -struct VMS_DBG_Symbol -{ - struct VMS_DBG_Symbol *next; - /* description of what this is */ - enum advanced_type advanced; - /* this record is for this type */ - int dbx_type; - /* For advanced types this is the type referred to. I.e., the type - a pointer points to, or the type of object that makes up an - array. */ - int type2; - /* Use this type when generating a variable def */ - int VMS_type; - /* used for arrays - this will be present for all */ - int index_min; - /* entries, but will be meaningless for non-arrays */ - int index_max; - /* Size in bytes of the data type. For an array, this is the size - of one element in the array */ - int data_size; - /* Number of the structure/union/enum - used for ref */ - int struc_numb; -}; - -#define SYMTYPLST_SIZE (1<<4) /* 16; must be power of two */ -#define SYMTYP_HASH(x) ((unsigned)(x) & (SYMTYPLST_SIZE-1)) -struct VMS_DBG_Symbol *VMS_Symbol_type_list[SYMTYPLST_SIZE]; - -/* - * We need this structure to keep track of forward references to - * struct/union/enum that have not been defined yet. When they are ultimately - * defined, then we can go back and generate the TIR commands to make a back - * reference. - */ - -struct forward_ref -{ - struct forward_ref *next; - int dbx_type; - int struc_numb; - char resolved; -}; - -struct forward_ref *f_ref_root = (struct forward_ref *) NULL; - -/* - * This routine is used to compare the names of certain types to various - * fixed types that are known by the debugger. - */ -#define type_check(X) !strcmp (symbol_name, X) - -/* - * This variable is used to keep track of the name of the symbol we are - * working on while we are parsing the stabs directives. - */ -static const char *symbol_name; - -/* We use this counter to assign numbers to all of the structures, unions - * and enums that we define. When we actually declare a variable to the - * debugger, we can simply do it by number, rather than describing the - * whole thing each time. - */ - -static structure_count = 0; - -/* This variable is used to indicate that we are making the last attempt to - parse the stabs, and that we should define as much as we can, and ignore - the rest */ - -static int final_pass; - -/* This variable is used to keep track of the current structure number - * for a given variable. If this is < 0, that means that the structure - * has not yet been defined to the debugger. This is still cool, since - * the VMS object language has ways of fixing things up after the fact, - * so we just make a note of this, and generate fixups at the end. - */ -static int struct_number; - -/* This is used to distinguish between D_float and G_float for telling - the debugger about doubles. gcc outputs the same .stabs regardless - of whether -mg is used to select alternate doubles. */ - -static int vax_g_doubles = 0; - -/* Local symbol references (used to handle N_ABS symbols; gcc does not - generate those, but they're possible with hand-coded assembler input) - are always made relative to some particular environment. If the current - input has any such symbols, then we expect this to get incremented - exactly once and end up having all of them be in environment #0. */ - -static int Current_Environment = -1; - -/* Every object file must specify an module name, which is also used by - traceback records. Set in Write_VMS_MHD_Records(). */ - -static char Module_Name[255+1]; - -/* - * Variable descriptors are used tell the debugger the data types of certain - * more complicated variables (basically anything involving a structure, - * union, enum, array or pointer). Some non-pointer variables of the - * basic types that the debugger knows about do not require a variable - * descriptor. - * - * Since it is impossible to have a variable descriptor longer than 128 - * bytes by virtue of the way that the VMS object language is set up, - * it makes not sense to make the arrays any longer than this, or worrying - * about dynamic sizing of the array. - * - * These are the arrays and counters that we use to build a variable - * descriptor. - */ - -#define MAX_DEBUG_RECORD 128 -static char Local[MAX_DEBUG_RECORD]; /* buffer for variable descriptor */ -static char Asuffix[MAX_DEBUG_RECORD]; /* buffer for array descriptor */ -static int Lpnt; /* index into Local */ -static int Apoint; /* index into Asuffix */ -static char overflow; /* flag to indicate we have written too much*/ -static int total_len; /* used to calculate the total length of variable - descriptor plus array descriptor - used for len byte*/ - -/* Flag if we have told user about finding global constants in the text - section. */ -static int gave_compiler_message = 0; - - -/* - * Global data (Object records limited to 512 bytes by VAX-11 "C" runtime) - */ -static int VMS_Object_File_FD; /* File Descriptor for object file */ -static char Object_Record_Buffer[512]; /* Buffer for object file records */ -static int Object_Record_Offset;/* Offset to end of data */ -static int Current_Object_Record_Type; /* Type of record in above */ - -/* - * Macros for moving data around. Must work on big-endian systems. - */ -#ifdef VMS /* These are more efficient for VMS->VMS systems */ -#define COPY_LONG(dest,val) ( *(long *)(dest) = (val) ) -#define COPY_SHORT(dest,val) ( *(short *)(dest) = (val) ) -#else -#define COPY_LONG(dest,val) md_number_to_chars ((dest), (val), 4) -#define COPY_SHORT(dest,val) md_number_to_chars ((dest), (val), 2) -#endif -/* - * Macros for placing data into the object record buffer. - */ -#define PUT_LONG(val) \ - ( COPY_LONG (&Object_Record_Buffer[Object_Record_Offset], (val)), \ - Object_Record_Offset += 4 ) - -#define PUT_SHORT(val) \ - ( COPY_SHORT (&Object_Record_Buffer[Object_Record_Offset], (val)), \ - Object_Record_Offset += 2 ) - -#define PUT_CHAR(val) ( Object_Record_Buffer[Object_Record_Offset++] = (val) ) - -#define PUT_COUNTED_STRING(cp) do { \ - register const char *p = (cp); \ - PUT_CHAR ((char) strlen (p)); \ - while (*p) PUT_CHAR (*p++); } while (0) - -/* - * Macro for determining if a Name has psect attributes attached - * to it. - */ -#define PSECT_ATTRIBUTES_STRING "$$PsectAttributes_" -#define PSECT_ATTRIBUTES_STRING_LENGTH 18 - -#define HAS_PSECT_ATTRIBUTES(Name) \ - (strncmp ((*Name == '_' ? Name + 1 : Name), \ - PSECT_ATTRIBUTES_STRING, \ - PSECT_ATTRIBUTES_STRING_LENGTH) == 0) - - - /* in: segT out: N_TYPE bits */ -const short seg_N_TYPE[] = -{ - N_ABS, - N_TEXT, - N_DATA, - N_BSS, - N_UNDF, /* unknown */ - N_UNDF, /* error */ - N_UNDF, /* expression */ - N_UNDF, /* debug */ - N_UNDF, /* ntv */ - N_UNDF, /* ptv */ - N_REGISTER, /* register */ -}; - -const segT N_TYPE_seg[N_TYPE + 2] = -{ /* N_TYPE == 0x1E = 32-2 */ - SEG_UNKNOWN, /* N_UNDF == 0 */ - SEG_GOOF, - SEG_ABSOLUTE, /* N_ABS == 2 */ - SEG_GOOF, - SEG_TEXT, /* N_TEXT == 4 */ - SEG_GOOF, - SEG_DATA, /* N_DATA == 6 */ - SEG_GOOF, - SEG_BSS, /* N_BSS == 8 */ - SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_REGISTER, /* dummy N_REGISTER for regs = 30 */ - SEG_GOOF, -}; - - -/* Local support routines which return a value. */ - -static struct input_file *find_file PARAMS ((symbolS *)); -static struct VMS_DBG_Symbol *find_symbol PARAMS ((int)); -static symbolS *Define_Routine PARAMS ((symbolS *,int,symbolS *,int)); - -static char *cvt_integer PARAMS ((char *,int *)); -static char *fix_name PARAMS ((char *)); -static char *get_struct_name PARAMS ((char *)); - -static offsetT VMS_Initialized_Data_Size PARAMS ((symbolS *,unsigned)); - -static int VMS_TBT_Source_File PARAMS ((char *,int)); -static int gen1 PARAMS ((struct VMS_DBG_Symbol *,int)); -static int forward_reference PARAMS ((char *)); -static int final_forward_reference PARAMS ((struct VMS_DBG_Symbol *)); -static int VMS_typedef_parse PARAMS ((char *)); -static int hash_string PARAMS ((const char *)); -static int VMS_Psect_Spec PARAMS ((const char *,int,enum ps_type, - struct VMS_Symbol *)); - -/* Local support routines which don't directly return any value. */ - -static void s_const PARAMS ((int)); -static void Create_VMS_Object_File PARAMS ((void)); -static void Flush_VMS_Object_Record_Buffer PARAMS ((void)); -static void Set_VMS_Object_File_Record PARAMS ((int)); -static void Close_VMS_Object_File PARAMS ((void)); -static void vms_tir_stack_psect PARAMS ((int,int,int)); -static void VMS_Store_Immediate_Data PARAMS ((const char *,int,int)); -static void VMS_Set_Data PARAMS ((int,int,int,int)); -static void VMS_Store_Struct PARAMS ((int)); -static void VMS_Def_Struct PARAMS ((int)); -static void VMS_Set_Struct PARAMS ((int)); -static void VMS_TBT_Module_Begin PARAMS ((void)); -static void VMS_TBT_Module_End PARAMS ((void)); -static void VMS_TBT_Routine_Begin PARAMS ((symbolS *,int)); -static void VMS_TBT_Routine_End PARAMS ((int,symbolS *)); -static void VMS_TBT_Block_Begin PARAMS ((symbolS *,int,char *)); -static void VMS_TBT_Block_End PARAMS ((valueT)); -static void VMS_TBT_Line_PC_Correlation PARAMS ((int,int,int,int)); -static void VMS_TBT_Source_Lines PARAMS ((int,int,int)); -static void fpush PARAMS ((int,int)); -static void rpush PARAMS ((int,int)); -static void array_suffix PARAMS ((struct VMS_DBG_Symbol *)); -static void new_forward_ref PARAMS ((int)); -static void generate_suffix PARAMS ((struct VMS_DBG_Symbol *,int)); -static void bitfield_suffix PARAMS ((struct VMS_DBG_Symbol *,int)); -static void setup_basic_type PARAMS ((struct VMS_DBG_Symbol *)); -static void VMS_DBG_record PARAMS ((struct VMS_DBG_Symbol *,int,int,char *)); -static void VMS_local_stab_Parse PARAMS ((symbolS *)); -static void VMS_stab_parse PARAMS ((symbolS *,int,int,int,int)); -static void VMS_GSYM_Parse PARAMS ((symbolS *,int)); -static void VMS_LCSYM_Parse PARAMS ((symbolS *,int)); -static void VMS_STSYM_Parse PARAMS ((symbolS *,int)); -static void VMS_RSYM_Parse PARAMS ((symbolS *,symbolS *,int)); -static void VMS_LSYM_Parse PARAMS ((void)); -static void Define_Local_Symbols PARAMS ((symbolS *,symbolS *,symbolS *,int)); -static void Write_VMS_MHD_Records PARAMS ((void)); -static void Write_VMS_EOM_Record PARAMS ((int,valueT)); -static void VMS_Case_Hack_Symbol PARAMS ((const char *,char *)); -static void VMS_Modify_Psect_Attributes PARAMS ((const char *,int *)); -static void VMS_Global_Symbol_Spec PARAMS ((const char *,int,int,int)); -static void VMS_Local_Environment_Setup PARAMS ((const char *)); -static void VMS_Emit_Globalvalues PARAMS ((unsigned,unsigned,char *)); -static void VMS_Procedure_Entry_Pt PARAMS ((char *,int,int,int)); -static void VMS_Set_Psect PARAMS ((int,int,int)); -static void VMS_Store_Repeated_Data PARAMS ((int,char *,int,int)); -static void VMS_Store_PIC_Symbol_Reference PARAMS ((symbolS *,int, - int,int,int,int)); -static void VMS_Fix_Indirect_Reference PARAMS ((int,int,fragS *,fragS *)); - -/* Support code which used to be inline within vms_write_object_file. */ -static void vms_fixup_text_section PARAMS ((unsigned,struct frag *,struct frag *)); -static void synthesize_data_segment PARAMS ((unsigned,unsigned,struct frag *)); -static void vms_fixup_data_section PARAMS ((unsigned,unsigned)); -static void global_symbol_directory PARAMS ((unsigned,unsigned)); -static void local_symbols_DST PARAMS ((symbolS *,symbolS *)); -static void vms_build_DST PARAMS ((unsigned)); -static void vms_fixup_xtors_section PARAMS ((struct VMS_Symbol *, int)); - - -/* The following code defines the special types of pseudo-ops that we - use with VMS. */ - -unsigned char const_flag = IN_DEFAULT_SECTION; - -static void -s_const (arg) - int arg; /* 3rd field from obj_pseudo_table[]; not needed here */ -{ - /* Since we don't need `arg', use it as our scratch variable so that - we won't get any "not used" warnings about it. */ - arg = get_absolute_expression (); - subseg_set (SEG_DATA, (subsegT) arg); - const_flag = 1; - demand_empty_rest_of_line (); -} - -const pseudo_typeS obj_pseudo_table[] = -{ - {"const", s_const, 0}, - {0, 0, 0}, -}; /* obj_pseudo_table */ - - -/* Routine to perform RESOLVE_SYMBOL_REDEFINITION(). */ - -int -vms_resolve_symbol_redef (sym) - symbolS *sym; -{ - /* - * If the new symbol is .comm AND it has a size of zero, - * we ignore it (i.e. the old symbol overrides it) - */ - if (SEGMENT_TO_SYMBOL_TYPE ((int) now_seg) == (N_UNDF | N_EXT) - && frag_now_fix () == 0) - { - as_warn (_("compiler emitted zero-size common symbol `%s' already defined"), - S_GET_NAME (sym)); - return 1; - } - /* - * If the old symbol is .comm and it has a size of zero, - * we override it with the new symbol value. - */ - if (S_IS_EXTERNAL (sym) && S_IS_DEFINED (sym) && S_GET_VALUE (sym) == 0) - { - as_warn (_("compiler redefined zero-size common symbol `%s'"), - S_GET_NAME (sym)); - sym->sy_frag = frag_now; - S_SET_OTHER (sym, const_flag); - S_SET_VALUE (sym, frag_now_fix ()); - /* Keep N_EXT bit. */ - sym->sy_symbol.n_type |= SEGMENT_TO_SYMBOL_TYPE ((int) now_seg); - return 1; - } - - return 0; -} - - -/* `tc_frob_label' handler for colon(symbols.c), used to examine the - dummy label(s) gcc inserts at the beginning of each file it generates. - gcc 1.x put "gcc_compiled."; gcc 2.x (as of 2.7) puts "gcc2_compiled." - and "__gnu_language_" and possibly "__vax__doubles". */ - -void -vms_check_for_special_label (symbolP) -symbolS *symbolP; -{ - /* Special labels only occur prior to explicit section directives. */ - if ((const_flag & IN_DEFAULT_SECTION) != 0) - { - char *sym_name = S_GET_NAME (symbolP); - - if (*sym_name == '_') - ++sym_name; - - if (!strcmp (sym_name, "__vax_g_doubles")) - vax_g_doubles = 1; -#if 0 /* not necessary */ - else if (!strcmp (sym_name, "__vax_d_doubles")) - vax_g_doubles = 0; -#endif -#if 0 /* these are potential alternatives to tc-vax.c's md_parse_options() */ - else if (!strcmp (sym_name, "gcc_compiled.")) - flag_one = 1; - else if (!strcmp (sym_name, "__gnu_language_cplusplus")) - flag_hash_long_names = 1; -#endif - } - return; -} - - -void -obj_read_begin_hook () -{ - return; -} - - -void -obj_crawl_symbol_chain (headers) - object_headers *headers; -{ - symbolS *symbolP; - symbolS **symbolPP; - int symbol_number = 0; - - symbolPP = &symbol_rootP; /* -> last symbol chain link. */ - while ((symbolP = *symbolPP) != NULL) - { - resolve_symbol_value (symbolP, 1); - - /* OK, here is how we decide which symbols go out into the - brave new symtab. Symbols that do are: - - * symbols with no name (stabd's?) - * symbols with debug info in their N_TYPE - * symbols with \1 as their 3rd character (numeric labels) - * "local labels" needed for PIC fixups - - Symbols that don't are: - * symbols that are registers - - All other symbols are output. We complain if a deleted - symbol was marked external. */ - - if (!S_IS_REGISTER (symbolP)) - { - symbolP->sy_number = symbol_number++; - symbolP->sy_name_offset = 0; - symbolPP = &(symbol_next (symbolP)); - } - else - { - if (S_IS_EXTERNAL (symbolP) || !S_IS_DEFINED (symbolP)) - { - as_bad (_("Local symbol %s never defined"), S_GET_NAME (symbolP)); - } /* oops. */ - - /* Unhook it from the chain. */ - *symbolPP = symbol_next (symbolP); - } /* if this symbol should be in the output */ - - } /* for each symbol */ - - H_SET_STRING_SIZE (headers, string_byte_count); - H_SET_SYMBOL_TABLE_SIZE (headers, symbol_number); -} /* obj_crawl_symbol_chain() */ - - - /****** VMS OBJECT FILE HACKING ROUTINES *******/ - - -/* Create the VMS object file. */ - -static void -Create_VMS_Object_File () -{ -#if defined(eunice) || !defined(VMS) - VMS_Object_File_FD = creat (out_file_name, 0777, "var"); -#else /* eunice */ - VMS_Object_File_FD = creat (out_file_name, 0, "rfm=var", - "ctx=bin", "mbc=16", "deq=64", "fop=tef", - "shr=nil"); -#endif /* eunice */ - /* Deal with errors. */ - if (VMS_Object_File_FD < 0) - as_fatal (_("Couldn't create VMS object file \"%s\""), out_file_name); - /* Initialize object file hacking variables. */ - Object_Record_Offset = 0; - Current_Object_Record_Type = -1; -} - - -/* Flush the object record buffer to the object file. */ - -static void -Flush_VMS_Object_Record_Buffer () -{ - /* If the buffer is empty, there's nothing to do. */ - if (Object_Record_Offset == 0) - return; - -#ifndef VMS /* For cross-assembly purposes. */ - { - char RecLen[2]; - - /* "Variable-length record" files have a two byte length field - prepended to each record. It's normally out-of-band, and native - VMS output will insert it automatically for this type of file. - When cross-assembling, we must write it explicitly. */ - md_number_to_chars (RecLen, Object_Record_Offset, 2); - if (write (VMS_Object_File_FD, RecLen, 2) != 2) - error (_("I/O error writing VMS object file (length prefix)")); - /* We also need to force the actual record to be an even number of - bytes. For native output, that's automatic; when cross-assembling, - pad with a NUL byte if length is odd. Do so _after_ writing the - pre-padded length. Since our buffer is defined with even size, - an odd offset implies that it has some room left. */ - if ((Object_Record_Offset & 1) != 0) - Object_Record_Buffer[Object_Record_Offset++] = '\0'; - } -#endif /* not VMS */ - - /* Write the data to the file. */ - if (write (VMS_Object_File_FD, Object_Record_Buffer, Object_Record_Offset) - != Object_Record_Offset) - error (_("I/O error writing VMS object file")); - - /* The buffer is now empty. */ - Object_Record_Offset = 0; -} - - -/* Declare a particular type of object file record. */ - -static void -Set_VMS_Object_File_Record (Type) - int Type; -{ - /* If the type matches, we are done. */ - if (Type == Current_Object_Record_Type) - return; - /* Otherwise: flush the buffer. */ - Flush_VMS_Object_Record_Buffer (); - /* Remember the new type. */ - Current_Object_Record_Type = Type; -} - - -/* Close the VMS Object file. */ - -static void -Close_VMS_Object_File () -{ - /* Flush (should never be necessary) and reset saved record-type context. */ - Set_VMS_Object_File_Record (-1); - -#ifndef VMS /* For cross-assembly purposes. */ - { - char RecLen[2]; - int minus_one = -1; - - /* Write a 2 byte record-length field of -1 into the file, which - means end-of-block when read, hence end-of-file when occurring - in the file's last block. It is only needed for variable-length - record files transferred to VMS as fixed-length record files - (typical for binary FTP; NFS shouldn't need it, but it won't hurt). */ - md_number_to_chars (RecLen, minus_one, 2); - write (VMS_Object_File_FD, RecLen, 2); - } -#else - /* When written on a VMS system, the file header (cf inode) will record - the actual end-of-file position and no inline marker is needed. */ -#endif - - close (VMS_Object_File_FD); -} - - - /****** Text Information and Relocation routines ******/ - - -/* Stack Psect base followed by signed, varying-sized offset. - Common to several object records. */ - -static void -vms_tir_stack_psect (Psect_Index, Offset, Force) - int Psect_Index; - int Offset; - int Force; -{ - int psect_width, offset_width; - - psect_width = ((unsigned) Psect_Index > 255) ? 2 : 1; - offset_width = (Force || Offset > 32767 || Offset < -32768) ? 4 - : (Offset > 127 || Offset < -128) ? 2 : 1; -#define Sta_P(p,o) (((o)<<1) | ((p)-1)) - /* byte or word psect; byte, word, or longword offset */ - switch (Sta_P(psect_width,offset_width)) - { - case Sta_P(1,1): PUT_CHAR (TIR_S_C_STA_PB); - PUT_CHAR ((char)(unsigned char) Psect_Index); - PUT_CHAR ((char) Offset); - break; - case Sta_P(1,2): PUT_CHAR (TIR_S_C_STA_PW); - PUT_CHAR ((char)(unsigned char) Psect_Index); - PUT_SHORT (Offset); - break; - case Sta_P(1,4): PUT_CHAR (TIR_S_C_STA_PL); - PUT_CHAR ((char)(unsigned char) Psect_Index); - PUT_LONG (Offset); - break; - case Sta_P(2,1): PUT_CHAR (TIR_S_C_STA_WPB); - PUT_SHORT (Psect_Index); - PUT_CHAR ((char) Offset); - break; - case Sta_P(2,2): PUT_CHAR (TIR_S_C_STA_WPW); - PUT_SHORT (Psect_Index); - PUT_SHORT (Offset); - break; - case Sta_P(2,4): PUT_CHAR (TIR_S_C_STA_WPL); - PUT_SHORT (Psect_Index); - PUT_LONG (Offset); - break; - } -#undef Sta_P -} - - -/* Store immediate data in current Psect. */ - -static void -VMS_Store_Immediate_Data (Pointer, Size, Record_Type) - const char *Pointer; - int Size; - int Record_Type; -{ - register int i; - - Set_VMS_Object_File_Record (Record_Type); - /* We can only store as most 128 bytes at a time due to the way that - TIR commands are encoded. */ - while (Size > 0) - { - i = (Size > 128) ? 128 : Size; - Size -= i; - /* If we cannot accommodate this record, flush the buffer. */ - if ((Object_Record_Offset + i + 1) >= sizeof Object_Record_Buffer) - Flush_VMS_Object_Record_Buffer (); - /* If the buffer is empty we must insert record type. */ - if (Object_Record_Offset == 0) - PUT_CHAR (Record_Type); - /* Store the count. The Store Immediate TIR command is implied by - a negative command byte, and the length of the immediate data - is abs(command_byte). So, we write the negated length value. */ - PUT_CHAR ((char) (-i & 0xff)); - /* Now store the data. */ - while (--i >= 0) - PUT_CHAR (*Pointer++); - } - /* Flush the buffer if it is more than 75% full. */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - - -/* Make a data reference. */ - -static void -VMS_Set_Data (Psect_Index, Offset, Record_Type, Force) - int Psect_Index; - int Offset; - int Record_Type; - int Force; -{ - Set_VMS_Object_File_Record (Record_Type); - /* If the buffer is empty we must insert the record type. */ - if (Object_Record_Offset == 0) - PUT_CHAR (Record_Type); - /* Stack the Psect base with its offset. */ - vms_tir_stack_psect (Psect_Index, Offset, Force); - /* Set relocation base. */ - PUT_CHAR (TIR_S_C_STO_PIDR); - /* Flush the buffer if it is more than 75% full. */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - - -/* Make a debugger reference to a struct, union or enum. */ - -static void -VMS_Store_Struct (Struct_Index) - int Struct_Index; -{ - /* We are writing a debug record. */ - Set_VMS_Object_File_Record (OBJ_S_C_DBG); - /* If the buffer is empty we must insert the record type. */ - if (Object_Record_Offset == 0) - PUT_CHAR (OBJ_S_C_DBG); - PUT_CHAR (TIR_S_C_STA_UW); - PUT_SHORT (Struct_Index); - PUT_CHAR (TIR_S_C_CTL_STKDL); - PUT_CHAR (TIR_S_C_STO_L); - /* Flush the buffer if it is more than 75% full. */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - - -/* Make a debugger reference to partially define a struct, union or enum. */ - -static void -VMS_Def_Struct (Struct_Index) - int Struct_Index; -{ - /* We are writing a debug record. */ - Set_VMS_Object_File_Record (OBJ_S_C_DBG); - /* If the buffer is empty we must insert the record type. */ - if (Object_Record_Offset == 0) - PUT_CHAR (OBJ_S_C_DBG); - PUT_CHAR (TIR_S_C_STA_UW); - PUT_SHORT (Struct_Index); - PUT_CHAR (TIR_S_C_CTL_DFLOC); - /* Flush the buffer if it is more than 75% full. */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - -static void -VMS_Set_Struct (Struct_Index) - int Struct_Index; -{ /* see previous functions for comments */ - Set_VMS_Object_File_Record (OBJ_S_C_DBG); - if (Object_Record_Offset == 0) - PUT_CHAR (OBJ_S_C_DBG); - PUT_CHAR (TIR_S_C_STA_UW); - PUT_SHORT (Struct_Index); - PUT_CHAR (TIR_S_C_CTL_STLOC); - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - - - /****** Traceback Information routines ******/ - - -/* Write the Traceback Module Begin record. */ - -static void -VMS_TBT_Module_Begin () -{ - register char *cp, *cp1; - int Size; - char Local[256]; - - /* Arrange to store the data locally (leave room for size byte). */ - cp = &Local[1]; - /* Begin module. */ - *cp++ = DST_S_C_MODBEG; - *cp++ = 0; /* flags; not used */ - /* - * Language type == "C" - * - * (FIXME: this should be based on the input...) - */ - COPY_LONG (cp, DST_S_C_C); - cp += 4; - /* Store the module name. */ - *cp++ = (char) strlen (Module_Name); - cp1 = Module_Name; - while (*cp1) - *cp++ = *cp1++; - /* Now we can store the record size. */ - Size = (cp - Local); - Local[0] = Size - 1; - /* Put it into the object record. */ - VMS_Store_Immediate_Data (Local, Size, OBJ_S_C_TBT); -} - - -/* Write the Traceback Module End record. */ - -static void -VMS_TBT_Module_End () -{ - char Local[2]; - - /* End module. */ - Local[0] = 1; - Local[1] = DST_S_C_MODEND; - /* Put it into the object record. */ - VMS_Store_Immediate_Data (Local, 2, OBJ_S_C_TBT); -} - - -/* Write a Traceback Routine Begin record. */ - -static void -VMS_TBT_Routine_Begin (symbolP, Psect) - symbolS *symbolP; - int Psect; -{ - register char *cp, *cp1; - char *Name; - int Offset; - int Size; - char Local[512]; - - /* Strip the leading "_" from the name. */ - Name = S_GET_NAME (symbolP); - if (*Name == '_') - Name++; - /* Get the text psect offset. */ - Offset = S_GET_VALUE (symbolP); - /* Set the record size. */ - Size = 1 + 1 + 4 + 1 + strlen (Name); - Local[0] = Size; - /* DST type "routine begin". */ - Local[1] = DST_S_C_RTNBEG; - /* Uses CallS/CallG. */ - Local[2] = 0; - /* Store the data so far. */ - VMS_Store_Immediate_Data (Local, 3, OBJ_S_C_TBT); - /* Make sure we are still generating a OBJ_S_C_TBT record. */ - if (Object_Record_Offset == 0) - PUT_CHAR (OBJ_S_C_TBT); - /* Stack the address. */ - vms_tir_stack_psect (Psect, Offset, 0); - /* Store the data reference. */ - PUT_CHAR (TIR_S_C_STO_PIDR); - /* Store the counted string as data. */ - cp = Local; - cp1 = Name; - Size = strlen (cp1) + 1; - *cp++ = Size - 1; - while (*cp1) - *cp++ = *cp1++; - VMS_Store_Immediate_Data (Local, Size, OBJ_S_C_TBT); -} - - -/* Write a Traceback Routine End record. - - We *must* search the symbol table to find the next routine, since the - assember has a way of reassembling the symbol table OUT OF ORDER Thus - the next routine in the symbol list is not necessarily the next one in - memory. For debugging to work correctly we must know the size of the - routine. */ - -static void -VMS_TBT_Routine_End (Max_Size, sp) - int Max_Size; - symbolS *sp; -{ - symbolS *symbolP; - int Size = 0x7fffffff; - char Local[16]; - valueT sym_value, sp_value = S_GET_VALUE (sp); - - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - if (!S_IS_DEBUG (symbolP) && S_GET_TYPE (symbolP) == N_TEXT) - { - if (*S_GET_NAME (symbolP) == 'L') - continue; - sym_value = S_GET_VALUE (symbolP); - if (sym_value > sp_value && sym_value < Size) - Size = sym_value; - - /* - * Dummy labels like "gcc_compiled." should no longer reach here. - */ -#if 0 - else - /* check if gcc_compiled. has size of zero */ - if (sym_value == sp_value && - sp != symbolP && - (!strcmp (S_GET_NAME (sp), "gcc_compiled.") || - !strcmp (S_GET_NAME (sp), "gcc2_compiled."))) - Size = sym_value; -#endif - } - } - if (Size == 0x7fffffff) - Size = Max_Size; - Size -= sp_value; /* and get the size of the routine */ - /* Record Size. */ - Local[0] = 6; - /* DST type is "routine end". */ - Local[1] = DST_S_C_RTNEND; - Local[2] = 0; /* unused */ - /* Size of routine. */ - COPY_LONG (&Local[3], Size); - /* Store the record. */ - VMS_Store_Immediate_Data (Local, 7, OBJ_S_C_TBT); -} - - -/* Write a Traceback Block Begin record. */ - -static void -VMS_TBT_Block_Begin (symbolP, Psect, Name) - symbolS *symbolP; - int Psect; - char *Name; -{ - register char *cp, *cp1; - int Offset; - int Size; - char Local[512]; - - /* Set the record size. */ - Size = 1 + 1 + 4 + 1 + strlen (Name); - Local[0] = Size; - /* DST type is "begin block"; we simulate with a phony routine. */ - Local[1] = DST_S_C_BLKBEG; - /* Uses CallS/CallG. */ - Local[2] = 0; - /* Store the data so far. */ - VMS_Store_Immediate_Data (Local, 3, OBJ_S_C_DBG); - /* Make sure we are still generating a debug record. */ - if (Object_Record_Offset == 0) - PUT_CHAR (OBJ_S_C_DBG); - /* Now get the symbol address. */ - PUT_CHAR (TIR_S_C_STA_WPL); - PUT_SHORT (Psect); - /* Get the text psect offset. */ - Offset = S_GET_VALUE (symbolP); - PUT_LONG (Offset); - /* Store the data reference. */ - PUT_CHAR (TIR_S_C_STO_PIDR); - /* Store the counted string as data. */ - cp = Local; - cp1 = Name; - Size = strlen (cp1) + 1; - *cp++ = Size - 1; - while (*cp1) - *cp++ = *cp1++; - VMS_Store_Immediate_Data (Local, Size, OBJ_S_C_DBG); -} - - -/* Write a Traceback Block End record. */ - -static void -VMS_TBT_Block_End (Size) - valueT Size; -{ - char Local[16]; - - Local[0] = 6; /* record length */ - /* DST type is "block end"; simulate with a phony end routine. */ - Local[1] = DST_S_C_BLKEND; - Local[2] = 0; /* unused, must be zero */ - COPY_LONG (&Local[3], Size); - VMS_Store_Immediate_Data (Local, 7, OBJ_S_C_DBG); -} - - -/* Write a Line number <-> Program Counter correlation record. */ - -static void -VMS_TBT_Line_PC_Correlation (Line_Number, Offset, Psect, Do_Delta) - int Line_Number; - int Offset; - int Psect; - int Do_Delta; -{ - register char *cp; - char Local[64]; - - if (Do_Delta == 0) - { - /* - * If not delta, set our PC/Line number correlation. - */ - cp = &Local[1]; /* Put size in Local[0] later. */ - /* DST type is "Line Number/PC correlation". */ - *cp++ = DST_S_C_LINE_NUM; - /* Set Line number. */ - if (Line_Number - 1 <= 255) - { - *cp++ = DST_S_C_SET_LINUM_B; - *cp++ = (char) (Line_Number - 1); - } - else if (Line_Number - 1 <= 65535) - { - *cp++ = DST_S_C_SET_LINE_NUM; - COPY_SHORT (cp, Line_Number - 1), cp += 2; - } - else - { - *cp++ = DST_S_C_SET_LINUM_L; - COPY_LONG (cp, Line_Number - 1), cp += 4; - } - /* Set PC. */ - *cp++ = DST_S_C_SET_ABS_PC; - /* Store size now that we know it, then output the data. */ - Local[0] = cp - &Local[1]; - /* Account for the space that TIR_S_C_STO_PIDR will use for the PC. */ - Local[0] += 4; /* size includes length of another longword */ - VMS_Store_Immediate_Data (Local, cp - Local, OBJ_S_C_TBT); - /* Make sure we are still generating a OBJ_S_C_TBT record. */ - if (Object_Record_Offset == 0) - PUT_CHAR (OBJ_S_C_TBT); - vms_tir_stack_psect (Psect, Offset, 0); - PUT_CHAR (TIR_S_C_STO_PIDR); - /* Do a PC offset of 0 to register the line number. */ - Local[0] = 2; - Local[1] = DST_S_C_LINE_NUM; - Local[2] = 0; /* Increment PC by 0 and register line # */ - VMS_Store_Immediate_Data (Local, 3, OBJ_S_C_TBT); - } - else - { - if (Do_Delta < 0) - { - /* - * When delta is negative, terminate the line numbers. - */ - Local[0] = 1 + 1 + 4; - Local[1] = DST_S_C_LINE_NUM; - Local[2] = DST_S_C_TERM_L; - COPY_LONG (&Local[3], Offset); - VMS_Store_Immediate_Data (Local, 7, OBJ_S_C_TBT); - return; - } - /* - * Do a PC/Line delta. - */ - cp = &Local[1]; - *cp++ = DST_S_C_LINE_NUM; - if (Line_Number > 1) - { - /* We need to increment the line number. */ - if (Line_Number - 1 <= 255) - { - *cp++ = DST_S_C_INCR_LINUM; - *cp++ = Line_Number - 1; - } - else if (Line_Number - 1 <= 65535) - { - *cp++ = DST_S_C_INCR_LINUM_W; - COPY_SHORT (cp, Line_Number - 1), cp += 2; - } - else - { - *cp++ = DST_S_C_INCR_LINUM_L; - COPY_LONG (cp, Line_Number - 1), cp += 4; - } - } - /* - * Increment the PC - */ - if (Offset <= 128) - { - /* Small offsets are encoded as negative numbers, rather than the - usual non-negative type code followed by another data field. */ - *cp++ = (char) -Offset; - } - else if (Offset <= 65535) - { - *cp++ = DST_S_C_DELTA_PC_W; - COPY_SHORT (cp, Offset), cp += 2; - } - else - { - *cp++ = DST_S_C_DELTA_PC_L; - COPY_LONG (cp, Offset), cp += 4; - } - /* Set size now that be know it, then output the data. */ - Local[0] = cp - &Local[1]; - VMS_Store_Immediate_Data (Local, cp - Local, OBJ_S_C_TBT); - } -} - - -/* Describe a source file to the debugger. */ - -static int -VMS_TBT_Source_File (Filename, ID_Number) - char *Filename; - int ID_Number; -{ - register char *cp; - int len, rfo, ffb, ebk; - char cdt[8]; - char Local[512]; -#ifdef VMS /* Used for native assembly */ - unsigned Status; - struct FAB fab; /* RMS file access block */ - struct NAM nam; /* file name information */ - struct XABDAT xabdat; /* date+time fields */ - struct XABFHC xabfhc; /* file header characteristics */ - char resultant_string_buffer[255 + 1]; - - /* - * Set up RMS structures: - */ - /* FAB -- file access block */ - memset ((char *) &fab, 0, sizeof fab); - fab.fab$b_bid = FAB$C_BID; - fab.fab$b_bln = (unsigned char) sizeof fab; - fab.fab$l_fna = Filename; - fab.fab$b_fns = (unsigned char) strlen (Filename); - fab.fab$l_nam = (char *) &nam; - fab.fab$l_xab = (char *) &xabdat; - /* NAM -- file name block */ - memset ((char *) &nam, 0, sizeof nam); - nam.nam$b_bid = NAM$C_BID; - nam.nam$b_bln = (unsigned char) sizeof nam; - nam.nam$l_rsa = resultant_string_buffer; - nam.nam$b_rss = (unsigned char) (sizeof resultant_string_buffer - 1); - /* XABs -- extended attributes blocks */ - memset ((char *) &xabdat, 0, sizeof xabdat); - xabdat.xab$b_cod = XAB$C_DAT; - xabdat.xab$b_bln = (unsigned char) sizeof xabdat; - xabdat.xab$l_nxt = (char *) &xabfhc; - memset ((char *) &xabfhc, 0, sizeof xabfhc); - xabfhc.xab$b_cod = XAB$C_FHC; - xabfhc.xab$b_bln = (unsigned char) sizeof xabfhc; - xabfhc.xab$l_nxt = 0; - /* - * Get the file information - */ - Status = sys$open (&fab); - if (!(Status & 1)) - { - as_tsktsk (_("Couldn't find source file \"%s\", status=%%X%x"), - Filename, Status); - return 0; - } - sys$close (&fab); - /* Now extract fields of interest. */ - memcpy (cdt, (char *) &xabdat.xab$q_cdt, 8); /* creation date */ - ebk = xabfhc.xab$l_ebk; /* end-of-file block */ - ffb = xabfhc.xab$w_ffb; /* first free byte of last block */ - rfo = xabfhc.xab$b_rfo; /* record format */ - len = nam.nam$b_rsl; /* length of Filename */ - resultant_string_buffer[len] = '\0'; - Filename = resultant_string_buffer; /* full filename */ -#else /* Cross-assembly */ - /* [Perhaps we ought to use actual values derived from stat() here?] */ - memset (cdt, 0, 8); /* null VMS quadword binary time */ - ebk = ffb = rfo = 0; - len = strlen (Filename); - if (len > 255) /* a single byte is used as count prefix */ - { - Filename += (len - 255); /* tail end is more significant */ - len = 255; - } -#endif /* VMS */ - - cp = &Local[1]; /* fill in record length later */ - *cp++ = DST_S_C_SOURCE; /* DST type is "source file" */ - *cp++ = DST_S_C_SRC_FORMFEED; /* formfeeds count as source records */ - *cp++ = DST_S_C_SRC_DECLFILE; /* declare source file */ - know (cp == &Local[4]); - *cp++ = 0; /* fill in this length below */ - *cp++ = 0; /* flags; must be zero */ - COPY_SHORT (cp, ID_Number), cp += 2; /* file ID number */ - memcpy (cp, cdt, 8), cp += 8; /* creation date+time */ - COPY_LONG (cp, ebk), cp += 4; /* end-of-file block */ - COPY_SHORT (cp, ffb), cp += 2; /* first free byte of last block */ - *cp++ = (char) rfo; /* RMS record format */ - /* Filename. */ - *cp++ = (char) len; - while (--len >= 0) - *cp++ = *Filename++; - /* Library module name (none). */ - *cp++ = 0; - /* Now that size is known, fill it in and write out the record. */ - Local[4] = cp - &Local[5]; /* source file declaration size */ - Local[0] = cp - &Local[1]; /* TBT record size */ - VMS_Store_Immediate_Data (Local, cp - Local, OBJ_S_C_TBT); - return 1; -} - - -/* Traceback information is described in terms of lines from compiler - listing files, not lines from source files. We need to set up the - correlation between listing line numbers and source line numbers. - Since gcc's .stabn directives refer to the source lines, we just - need to describe a one-to-one correspondence. */ - -static void -VMS_TBT_Source_Lines (ID_Number, Starting_Line_Number, Number_Of_Lines) - int ID_Number; - int Starting_Line_Number; - int Number_Of_Lines; -{ - char *cp; - int chunk_limit; - char Local[128]; /* room enough to describe 1310700 lines... */ - - cp = &Local[1]; /* Put size in Local[0] later. */ - *cp++ = DST_S_C_SOURCE; /* DST type is "source file". */ - *cp++ = DST_S_C_SRC_SETFILE; /* Set Source File. */ - COPY_SHORT (cp, ID_Number), cp += 2; /* File ID Number. */ - /* Set record number and define lines. Since no longword form of - SRC_DEFLINES is available, we need to be able to cope with any huge - files a chunk at a time. It doesn't matter for tracebacks, since - unspecified lines are mapped one-to-one and work out right, but it - does matter within the debugger. Without this explicit mapping, - it will complain about lines not existing in the module. */ - chunk_limit = (sizeof Local - 5) / 6; - if (Number_Of_Lines > 65535 * chunk_limit) /* avoid buffer overflow */ - Number_Of_Lines = 65535 * chunk_limit; - while (Number_Of_Lines > 65535) - { - *cp++ = DST_S_C_SRC_SETREC_L; - COPY_LONG (cp, Starting_Line_Number), cp += 4; - *cp++ = DST_S_C_SRC_DEFLINES_W; - COPY_SHORT (cp, 65535), cp += 2; - Starting_Line_Number += 65535; - Number_Of_Lines -= 65535; - } - /* Set record number and define lines, normal case. */ - if (Starting_Line_Number <= 65535) - { - *cp++ = DST_S_C_SRC_SETREC_W; - COPY_SHORT (cp, Starting_Line_Number), cp += 2; - } - else - { - *cp++ = DST_S_C_SRC_SETREC_L; - COPY_LONG (cp, Starting_Line_Number), cp += 4; - } - *cp++ = DST_S_C_SRC_DEFLINES_W; - COPY_SHORT (cp, Number_Of_Lines), cp += 2; - /* Set size now that be know it, then output the data. */ - Local[0] = cp - &Local[1]; - VMS_Store_Immediate_Data (Local, cp - Local, OBJ_S_C_TBT); -} - - - /****** Debugger Information support routines ******/ - - -/* This routine locates a file in the list of files. If an entry does - not exist, one is created. For include files, a new entry is always - created such that inline functions can be properly debugged. */ - -static struct input_file * -find_file (sp) - symbolS *sp; -{ - struct input_file *same_file = 0; - struct input_file *fpnt, *last = 0; - char *sp_name; - - for (fpnt = file_root; fpnt; fpnt = fpnt->next) - { - if (fpnt->spnt == sp) - return fpnt; - last = fpnt; - } - sp_name = S_GET_NAME (sp); - for (fpnt = file_root; fpnt; fpnt = fpnt->next) - { - if (strcmp (sp_name, fpnt->name) == 0) - { - if (fpnt->flag == 1) - return fpnt; - same_file = fpnt; - break; - } - } - fpnt = (struct input_file *) xmalloc (sizeof (struct input_file)); - if (!file_root) - file_root = fpnt; - else - last->next = fpnt; - fpnt->next = 0; - fpnt->name = sp_name; - fpnt->min_line = 0x7fffffff; - fpnt->max_line = 0; - fpnt->offset = 0; - fpnt->flag = 0; - fpnt->file_number = 0; - fpnt->spnt = sp; - fpnt->same_file_fpnt = same_file; - return fpnt; -} - - -/* This routine converts a number string into an integer, and stops when - it sees an invalid character. The return value is the address of the - character just past the last character read. No error is generated. */ - -static char * -cvt_integer (str, rtn) - char *str; - int *rtn; -{ - int ival = 0, sgn = 1; - - if (*str == '-') - sgn = -1, ++str; - while (*str >= '0' && *str <= '9') - ival = 10 * ival + *str++ - '0'; - *rtn = sgn * ival; - return str; -} - - -/* - * The following functions and definitions are used to generate object - * records that will describe program variables to the VMS debugger. - * - * This file contains many of the routines needed to output debugging info - * into the object file that the VMS debugger needs to understand symbols. - * These routines are called very late in the assembly process, and thus - * we can be fairly lax about changing things, since the GSD and the TIR - * sections have already been output. - */ - - -/* This routine fixes the names that are generated by C++, ".this" is a good - example. The period does not work for the debugger, since it looks like - the syntax for a structure element, and thus it gets mightily confused. - - We also use this to strip the PsectAttribute hack from the name before we - write a debugger record. */ - -static char * -fix_name (pnt) - char *pnt; -{ - char *pnt1; - - /* Kill any leading "_". */ - if (*pnt == '_') - pnt++; - - /* Is there a Psect Attribute to skip?? */ - if (HAS_PSECT_ATTRIBUTES (pnt)) - { - /* Yes: Skip it. */ - pnt += PSECT_ATTRIBUTES_STRING_LENGTH; - while (*pnt) - { - if ((pnt[0] == '$') && (pnt[1] == '$')) - { - pnt += 2; - break; - } - pnt++; - } - } - - /* Here we fix the .this -> $this conversion. */ - for (pnt1 = pnt; *pnt1 != 0; pnt1++) - if (*pnt1 == '.') - *pnt1 = '$'; - - return pnt; -} - - -/* When defining a structure, this routine is called to find the name of - the actual structure. It is assumed that str points to the equal sign - in the definition, and it moves backward until it finds the start of the - name. If it finds a 0, then it knows that this structure def is in the - outermost level, and thus symbol_name points to the symbol name. */ - -static char * -get_struct_name (str) - char *str; -{ - char *pnt; - pnt = str; - while ((*pnt != ':') && (*pnt != '\0')) - pnt--; - if (*pnt == '\0') - return (char *) symbol_name; - *pnt-- = '\0'; - while ((*pnt != ';') && (*pnt != '=')) - pnt--; - if (*pnt == ';') - return pnt + 1; - while ((*pnt < '0') || (*pnt > '9')) - pnt++; - while ((*pnt >= '0') && (*pnt <= '9')) - pnt++; - return pnt; -} - - -/* Search symbol list for type number dbx_type. - Return a pointer to struct. */ - -static struct VMS_DBG_Symbol * -find_symbol (dbx_type) - int dbx_type; -{ - struct VMS_DBG_Symbol *spnt; - - spnt = VMS_Symbol_type_list[SYMTYP_HASH (dbx_type)]; - while (spnt) - { - if (spnt->dbx_type == dbx_type) - break; - spnt = spnt->next; - } - if (!spnt || spnt->advanced != ALIAS) - return spnt; - return find_symbol (spnt->type2); -} - - -#if 0 /* obsolete */ -/* this routine puts info into either Local or Asuffix, depending on the sign - * of size. The reason is that it is easier to build the variable descriptor - * backwards, while the array descriptor is best built forwards. In the end - * they get put together, if there is not a struct/union/enum along the way - */ -static void -push (value, size1) - int value, size1; -{ - if (size1 < 0) - { - size1 = -size1; - if (Lpnt < size1) - { - overflow = 1; - Lpnt = 1; - return; - } - Lpnt -= size1; - md_number_to_chars (&Local[Lpnt + 1], value, size1); - } - else - { - if (Apoint + size1 >= MAX_DEBUG_RECORD) - { - overflow = 1; - Apoint = MAX_DEBUG_RECORD - 1; - return; - } - md_number_to_chars (&Asuffix[Apoint], value, size1); - Apoint += size1; - } -} -#endif - - -static void -fpush (value, size) - int value, size; -{ - if (Apoint + size >= MAX_DEBUG_RECORD) - { - overflow = 1; - Apoint = MAX_DEBUG_RECORD - 1; - return; - } - if (size == 1) - Asuffix[Apoint++] = (char) value; - else - { - md_number_to_chars (&Asuffix[Apoint], value, size); - Apoint += size; - } -} - -static void -rpush (value, size) - int value, size; -{ - if (Lpnt < size) - { - overflow = 1; - Lpnt = 1; - return; - } - if (size == 1) - Local[Lpnt--] = (char) value; - else - { - Lpnt -= size; - md_number_to_chars (&Local[Lpnt + 1], value, size); - } -} - - -/* This routine generates the array descriptor for a given array. */ - -static void -array_suffix (spnt2) - struct VMS_DBG_Symbol *spnt2; -{ - struct VMS_DBG_Symbol *spnt; - struct VMS_DBG_Symbol *spnt1; - int rank; - int total_size; - - rank = 0; - spnt = spnt2; - while (spnt->advanced != ARRAY) - { - spnt = find_symbol (spnt->type2); - if (!spnt) - return; - } - spnt1 = spnt; - total_size = 1; - while (spnt1->advanced == ARRAY) - { - rank++; - total_size *= (spnt1->index_max - spnt1->index_min + 1); - spnt1 = find_symbol (spnt1->type2); - } - total_size = total_size * spnt1->data_size; - fpush (spnt1->data_size, 2); /* element size */ - if (spnt1->VMS_type == DBG_S_C_ADVANCED_TYPE) - fpush (0, 1); - else - fpush (spnt1->VMS_type, 1); /* element type */ - fpush (DSC_K_CLASS_A, 1); /* descriptor class */ - fpush (0, 4); /* base address */ - fpush (0, 1); /* scale factor -- not applicable */ - fpush (0, 1); /* digit count -- not applicable */ - fpush (0xc0, 1); /* flags: multiplier block & bounds present */ - fpush (rank, 1); /* number of dimensions */ - fpush (total_size, 4); - fpush (0, 4); /* pointer to element [0][0]...[0] */ - spnt1 = spnt; - while (spnt1->advanced == ARRAY) - { - fpush (spnt1->index_max - spnt1->index_min + 1, 4); - spnt1 = find_symbol (spnt1->type2); - } - spnt1 = spnt; - while (spnt1->advanced == ARRAY) - { - fpush (spnt1->index_min, 4); - fpush (spnt1->index_max, 4); - spnt1 = find_symbol (spnt1->type2); - } -} - - -/* This routine generates the start of a variable descriptor based upon - a struct/union/enum that has yet to be defined. We define this spot as - a new location, and save four bytes for the address. When the struct is - finally defined, then we can go back and plug in the correct address. */ - -static void -new_forward_ref (dbx_type) - int dbx_type; -{ - struct forward_ref *fpnt; - fpnt = (struct forward_ref *) xmalloc (sizeof (struct forward_ref)); - fpnt->next = f_ref_root; - f_ref_root = fpnt; - fpnt->dbx_type = dbx_type; - fpnt->struc_numb = ++structure_count; - fpnt->resolved = 'N'; - rpush (DST_K_TS_IND, 1); /* indirect type specification */ - total_len = 5; - rpush (total_len, 2); - struct_number = -fpnt->struc_numb; -} - - -/* This routine generates the variable descriptor used to describe non-basic - variables. It calls itself recursively until it gets to the bottom of it - all, and then builds the descriptor backwards. It is easiest to do it - this way since we must periodically write length bytes, and it is easiest - if we know the value when it is time to write it. */ - -static int -gen1 (spnt, array_suffix_len) - struct VMS_DBG_Symbol *spnt; - int array_suffix_len; -{ - struct VMS_DBG_Symbol *spnt1; - int i; - - switch (spnt->advanced) - { - case VOID: - rpush (DBG_S_C_VOID, 1); - total_len += 1; - rpush (total_len, 2); - return 0; - case BASIC: - case FUNCTION: - if (array_suffix_len == 0) - { - rpush (spnt->VMS_type, 1); - rpush (DBG_S_C_BASIC, 1); - total_len = 2; - rpush (total_len, 2); - return 1; - } - rpush (0, 4); - rpush (DST_K_VFLAGS_DSC, 1); - rpush (DST_K_TS_DSC, 1); /* descriptor type specification */ - total_len = -2; - return 1; - case STRUCT: - case UNION: - case ENUM: - struct_number = spnt->struc_numb; - if (struct_number < 0) - { - new_forward_ref (spnt->dbx_type); - return 1; - } - rpush (DBG_S_C_STRUCT, 1); - total_len = 5; - rpush (total_len, 2); - return 1; - case POINTER: - spnt1 = find_symbol (spnt->type2); - i = 1; - if (!spnt1) - new_forward_ref (spnt->type2); - else - i = gen1 (spnt1, 0); - if (i) - { /* (*void) is a special case, do not put pointer suffix */ - rpush (DBG_S_C_POINTER, 1); - total_len += 3; - rpush (total_len, 2); - } - return 1; - case ARRAY: - spnt1 = spnt; - while (spnt1->advanced == ARRAY) - { - spnt1 = find_symbol (spnt1->type2); - if (!spnt1) - { - as_tsktsk (_("debugger forward reference error, dbx type %d"), - spnt->type2); - return 0; - } - } -/* It is too late to generate forward references, so the user gets a message. - * This should only happen on a compiler error */ - (void) gen1 (spnt1, 1); - i = Apoint; - array_suffix (spnt); - array_suffix_len = Apoint - i; - switch (spnt1->advanced) - { - case BASIC: - case FUNCTION: - break; - default: - rpush (0, 2); - total_len += 2; - rpush (total_len, 2); - rpush (DST_K_VFLAGS_DSC, 1); - rpush (1, 1); /* flags: element value spec included */ - rpush (1, 1); /* one dimension */ - rpush (DBG_S_C_COMPLEX_ARRAY, 1); - } - total_len += array_suffix_len + 8; - rpush (total_len, 2); - break; - default: /* lint suppression */ - break; - } - return 0; -} - - -/* This generates a suffix for a variable. If it is not a defined type yet, - then dbx_type contains the type we are expecting so we can generate a - forward reference. This calls gen1 to build most of the descriptor, and - then it puts the icing on at the end. It then dumps whatever is needed - to get a complete descriptor (i.e. struct reference, array suffix). */ - -static void -generate_suffix (spnt, dbx_type) - struct VMS_DBG_Symbol *spnt; - int dbx_type; -{ - static const char pvoid[6] = { - 5, /* record.length == 5 */ - DST_K_TYPSPEC, /* record.type == 1 (type specification) */ - 0, /* name.length == 0, no name follows */ - 1, 0, /* type.length == 1 {2 bytes, little endian} */ - DBG_S_C_VOID /* type.type == 5 (pointer to unspecified) */ - }; - int i; - - Apoint = 0; - Lpnt = MAX_DEBUG_RECORD - 1; - total_len = 0; - struct_number = 0; - overflow = 0; - if (!spnt) - new_forward_ref (dbx_type); - else - { - if (spnt->VMS_type != DBG_S_C_ADVANCED_TYPE) - return; /* no suffix needed */ - gen1 (spnt, 0); - } - rpush (0, 1); /* no name (len==0) */ - rpush (DST_K_TYPSPEC, 1); - total_len += 4; - rpush (total_len, 1); - /* If the variable descriptor overflows the record, output a descriptor - for a pointer to void. */ - if ((total_len >= MAX_DEBUG_RECORD) || overflow) - { - as_warn (_("Variable descriptor %d too complicated. Defined as `void *'."), - spnt->dbx_type); - VMS_Store_Immediate_Data (pvoid, 6, OBJ_S_C_DBG); - return; - } - i = 0; - while (Lpnt < MAX_DEBUG_RECORD - 1) - Local[i++] = Local[++Lpnt]; - Lpnt = i; - /* we use this for reference to structure that has already been defined */ - if (struct_number > 0) - { - VMS_Store_Immediate_Data (Local, Lpnt, OBJ_S_C_DBG); - Lpnt = 0; - VMS_Store_Struct (struct_number); - } - /* We use this for a forward reference to a structure that has yet to - be defined. We store four bytes of zero to make room for the actual - address once it is known. */ - if (struct_number < 0) - { - struct_number = -struct_number; - VMS_Store_Immediate_Data (Local, Lpnt, OBJ_S_C_DBG); - Lpnt = 0; - VMS_Def_Struct (struct_number); - COPY_LONG (&Local[Lpnt], 0L); - Lpnt += 4; - VMS_Store_Immediate_Data (Local, Lpnt, OBJ_S_C_DBG); - Lpnt = 0; - } - i = 0; - while (i < Apoint) - Local[Lpnt++] = Asuffix[i++]; - if (Lpnt != 0) - VMS_Store_Immediate_Data (Local, Lpnt, OBJ_S_C_DBG); - Lpnt = 0; -} - - - /* "novel length" type doesn't work for simple atomic types */ -#define USE_BITSTRING_DESCRIPTOR(t) ((t)->advanced == BASIC) -#undef SETUP_BASIC_TYPES - -/* This routine generates a type description for a bitfield. */ - -static void -bitfield_suffix (spnt, width) - struct VMS_DBG_Symbol *spnt; - int width; -{ - Local[Lpnt++] = 13; /* rec.len==13 */ - Local[Lpnt++] = DST_K_TYPSPEC; /* a type specification record */ - Local[Lpnt++] = 0; /* not named */ - COPY_SHORT (&Local[Lpnt], 9); /* typ.len==9 */ - Lpnt += 2; - Local[Lpnt++] = DST_K_TS_NOV_LENG; /* This type is a "novel length" - incarnation of some other type. */ - COPY_LONG (&Local[Lpnt], width); /* size in bits == novel length */ - Lpnt += 4; - VMS_Store_Immediate_Data (Local, Lpnt, OBJ_S_C_DBG); - Lpnt = 0; - /* assert( spnt->struc_numb > 0 ); */ - VMS_Store_Struct (spnt->struc_numb); /* output 4 more bytes */ -} - - -/* Formally define a builtin type, so that it can serve as the target of - an indirect reference. It makes bitfield_suffix() easier by avoiding - the need to use a forward reference for the first occurrence of each - type used in a bitfield. */ - -static void -setup_basic_type (spnt) - struct VMS_DBG_Symbol *spnt; -{ -#ifdef SETUP_BASIC_TYPES - /* This would be very useful if "novel length" fields actually worked - with basic types like they do with enumerated types. However, - they do not, so this isn't worth doing just so that you can use - EXAMINE/TYPE=(__long_long_int) instead of EXAMINE/QUAD. */ - char *p; -#ifndef SETUP_SYNONYM_TYPES - /* This determines whether compatible things like `int' and `long int' - ought to have distinct type records rather than sharing one. */ - struct VMS_DBG_Symbol *spnt2; - - /* first check whether this type has already been seen by another name */ - for (spnt2 = VMS_Symbol_type_list[SYMTYP_HASH (spnt->VMS_type)]; - spnt2; - spnt2 = spnt2->next) - if (spnt2 != spnt && spnt2->VMS_type == spnt->VMS_type) - { - spnt->struc_numb = spnt2->struc_numb; - return; - } -#endif - - /* `structure number' doesn't really mean `structure'; it means an index - into a linker maintained set of saved locations which can be referenced - again later. */ - spnt->struc_numb = ++structure_count; - VMS_Def_Struct (spnt->struc_numb); /* remember where this type lives */ - /* define the simple scalar type */ - Local[Lpnt++] = 6 + strlen (symbol_name) + 2; /* rec.len */ - Local[Lpnt++] = DST_K_TYPSPEC; /* rec.typ==type specification */ - Local[Lpnt++] = strlen (symbol_name) + 2; - Local[Lpnt++] = '_'; /* prefix name with "__" */ - Local[Lpnt++] = '_'; - for (p = symbol_name; *p; p++) - Local[Lpnt++] = *p == ' ' ? '_' : *p; - COPY_SHORT (&Local[Lpnt], 2); /* typ.len==2 */ - Lpnt += 2; - Local[Lpnt++] = DST_K_TS_ATOM; /* typ.kind is simple type */ - Local[Lpnt++] = spnt->VMS_type; /* typ.type */ - VMS_Store_Immediate_Data (Local, Lpnt, OBJ_S_C_DBG); - Lpnt = 0; -#endif /* SETUP_BASIC_TYPES */ - return; -} - - -/* This routine generates a symbol definition for a C symbol for the debugger. - It takes a psect and offset for global symbols; if psect < 0, then this is - a local variable and the offset is relative to FP. In this case it can - be either a variable (Offset < 0) or a parameter (Offset > 0). */ - -static void -VMS_DBG_record (spnt, Psect, Offset, Name) - struct VMS_DBG_Symbol *spnt; - int Psect; - int Offset; - char *Name; -{ - char *Name_pnt; - int len; - int i = 0; - - /* if there are bad characters in name, convert them */ - Name_pnt = fix_name (Name); - - len = strlen (Name_pnt); - if (Psect < 0) - { /* this is a local variable, referenced to SP */ - Local[i++] = 7 + len; - Local[i++] = spnt->VMS_type; - Local[i++] = (Offset > 0) ? DBG_C_FUNCTION_PARAM : DBG_C_LOCAL_SYM; - COPY_LONG (&Local[i], Offset); - i += 4; - } - else - { - Local[i++] = 7 + len; - Local[i++] = spnt->VMS_type; - Local[i++] = DST_K_VALKIND_ADDR; - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - i = 0; - VMS_Set_Data (Psect, Offset, OBJ_S_C_DBG, 0); - } - Local[i++] = len; - while (*Name_pnt != '\0') - Local[i++] = *Name_pnt++; - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - if (spnt->VMS_type == DBG_S_C_ADVANCED_TYPE) - generate_suffix (spnt, 0); -} - - -/* This routine parses the stabs entries in order to make the definition - for the debugger of local symbols and function parameters. */ - -static void -VMS_local_stab_Parse (sp) - symbolS *sp; -{ - struct VMS_DBG_Symbol *spnt; - char *pnt; - char *pnt1; - char *str; - int dbx_type; - - dbx_type = 0; - str = S_GET_NAME (sp); - pnt = (char *) strchr (str, ':'); - if (!pnt) - return; /* no colon present */ - pnt1 = pnt++; /* save this for later, and skip colon */ - if (*pnt == 'c') - return; /* ignore static constants */ - -/* there is one little catch that we must be aware of. Sometimes function - * parameters are optimized into registers, and the compiler, in its infiite - * wisdom outputs stabs records for *both*. In general we want to use the - * register if it is present, so we must search the rest of the symbols for - * this function to see if this parameter is assigned to a register. - */ - { - symbolS *sp1; - char *str1; - char *pnt2; - - if (*pnt == 'p') - { - for (sp1 = symbol_next (sp); sp1; sp1 = symbol_next (sp1)) - { - if (!S_IS_DEBUG (sp1)) - continue; - if (S_GET_RAW_TYPE (sp1) == N_FUN) - { - pnt2 = (char *) strchr (S_GET_NAME (sp1), ':') + 1; - if (*pnt2 == 'F' || *pnt2 == 'f') - break; - } - if (S_GET_RAW_TYPE (sp1) != N_RSYM) - continue; - str1 = S_GET_NAME (sp1); /* and get the name */ - pnt2 = str; - while (*pnt2 != ':') - { - if (*pnt2 != *str1) - break; - pnt2++; - str1++; - } - if (*str1 == ':' && *pnt2 == ':') - return; /* they are the same! lets skip this one */ - } /* for */ - pnt++; /* skip p in case no register */ - } /* if */ - } /* p block */ - - pnt = cvt_integer (pnt, &dbx_type); - spnt = find_symbol (dbx_type); - if (!spnt) - return; /*Dunno what this is*/ - *pnt1 = '\0'; - VMS_DBG_record (spnt, -1, S_GET_VALUE (sp), str); - *pnt1 = ':'; /* and restore the string */ - return; -} - - -/* This routine parses a stabs entry to find the information required - to define a variable. It is used for global and static variables. - Basically we need to know the address of the symbol. With older - versions of the compiler, const symbols are treated differently, in - that if they are global they are written into the text psect. The - global symbol entry for such a const is actually written as a program - entry point (Yuk!!), so if we cannot find a symbol in the list of - psects, we must search the entry points as well. static consts are - even harder, since they are never assigned a memory address. The - compiler passes a stab to tell us the value, but I am not sure what - to do with it. */ - -static void -VMS_stab_parse (sp, expected_type, type1, type2, Text_Psect) - symbolS *sp; - int expected_type; /* char */ - int type1, type2, Text_Psect; -{ - char *pnt; - char *pnt1; - char *str; - symbolS *sp1; - struct VMS_DBG_Symbol *spnt; - struct VMS_Symbol *vsp; - int dbx_type; - - dbx_type = 0; - str = S_GET_NAME (sp); - pnt = (char *) strchr (str, ':'); - if (!pnt) - return; /* no colon present */ - pnt1 = pnt; /* save this for later*/ - pnt++; - if (*pnt == expected_type) - { - pnt = cvt_integer (pnt + 1, &dbx_type); - spnt = find_symbol (dbx_type); - if (!spnt) - return; /*Dunno what this is*/ - /* - * Now we need to search the symbol table to find the psect and - * offset for this variable. - */ - *pnt1 = '\0'; - vsp = VMS_Symbols; - while (vsp) - { - pnt = S_GET_NAME (vsp->Symbol); - if (pnt && *pnt++ == '_' - /* make sure name is the same and symbol type matches */ - && strcmp (pnt, str) == 0 - && (S_GET_RAW_TYPE (vsp->Symbol) == type1 - || S_GET_RAW_TYPE (vsp->Symbol) == type2)) - break; - vsp = vsp->Next; - } - if (vsp) - { - VMS_DBG_record (spnt, vsp->Psect_Index, vsp->Psect_Offset, str); - *pnt1 = ':'; /* and restore the string */ - return; - } - /* The symbol was not in the symbol list, but it may be an - "entry point" if it was a constant. */ - for (sp1 = symbol_rootP; sp1; sp1 = symbol_next (sp1)) - { - /* - * Dispatch on STAB type - */ - if (S_IS_DEBUG (sp1) || (S_GET_TYPE (sp1) != N_TEXT)) - continue; - pnt = S_GET_NAME (sp1); - if (*pnt == '_') - pnt++; - if (strcmp (pnt, str) == 0) - { - if (!gave_compiler_message && expected_type == 'G') - { - char *long_const_msg = _("\ -***Warning - the assembly code generated by the compiler has placed \n\ - global constant(s) in the text psect. These will not be available to \n\ - other modules, since this is not the correct way to handle this. You \n\ - have two options: 1) get a patched compiler that does not put global \n\ - constants in the text psect, or 2) remove the 'const' keyword from \n\ - definitions of global variables in your source module(s). Don't say \n\ - I didn't warn you! \n"); - - as_tsktsk (long_const_msg); - gave_compiler_message = 1; - } - VMS_DBG_record (spnt, - Text_Psect, - S_GET_VALUE (sp1), - str); - *pnt1 = ':'; - /* fool assembler to not output this as a routine in the TBT */ - pnt1 = S_GET_NAME (sp1); - *pnt1 = 'L'; - S_SET_NAME (sp1, pnt1); - return; - } - } - } - *pnt1 = ':'; /* and restore the string */ - return; -} - - -/* Simpler interfaces into VMS_stab_parse(). */ - -static void -VMS_GSYM_Parse (sp, Text_Psect) - symbolS *sp; - int Text_Psect; -{ /* Global variables */ - VMS_stab_parse (sp, 'G', (N_UNDF | N_EXT), (N_DATA | N_EXT), Text_Psect); -} - -static void -VMS_LCSYM_Parse (sp, Text_Psect) - symbolS *sp; - int Text_Psect; -{ /* Static symbols - uninitialized */ - VMS_stab_parse (sp, 'S', N_BSS, -1, Text_Psect); -} - -static void -VMS_STSYM_Parse (sp, Text_Psect) - symbolS *sp; - int Text_Psect; -{ /* Static symbols - initialized */ - VMS_stab_parse (sp, 'S', N_DATA, -1, Text_Psect); -} - - -/* For register symbols, we must figure out what range of addresses - within the psect are valid. We will use the brackets in the stab - directives to give us guidance as to the PC range that this variable - is in scope. I am still not completely comfortable with this but - as I learn more, I seem to get a better handle on what is going on. - Caveat Emptor. */ - -static void -VMS_RSYM_Parse (sp, Current_Routine, Text_Psect) - symbolS *sp, *Current_Routine; - int Text_Psect; -{ - symbolS *symbolP; - struct VMS_DBG_Symbol *spnt; - char *pnt; - char *pnt1; - char *str; - int dbx_type; - int len; - int i = 0; - int bcnt = 0; - int Min_Offset = -1; /* min PC of validity */ - int Max_Offset = 0; /* max PC of validity */ - - for (symbolP = sp; symbolP; symbolP = symbol_next (symbolP)) - { - /* - * Dispatch on STAB type - */ - switch (S_GET_RAW_TYPE (symbolP)) - { - case N_LBRAC: - if (bcnt++ == 0) - Min_Offset = S_GET_VALUE (symbolP); - break; - case N_RBRAC: - if (--bcnt == 0) - Max_Offset = S_GET_VALUE (symbolP) - 1; - break; - } - if ((Min_Offset != -1) && (bcnt == 0)) - break; - if (S_GET_RAW_TYPE (symbolP) == N_FUN) - { - pnt = (char *) strchr (S_GET_NAME (symbolP), ':') + 1; - if (*pnt == 'F' || *pnt == 'f') break; - } - } - - /* Check to see that the addresses were defined. If not, then there - were no brackets in the function, and we must try to search for - the next function. Since functions can be in any order, we should - search all of the symbol list to find the correct ending address. */ - if (Min_Offset == -1) - { - int Max_Source_Offset; - int This_Offset; - - Min_Offset = S_GET_VALUE (sp); - Max_Source_Offset = Min_Offset; /* just in case no N_SLINEs found */ - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - switch (S_GET_RAW_TYPE (symbolP)) - { - case N_TEXT | N_EXT: - This_Offset = S_GET_VALUE (symbolP); - if (This_Offset > Min_Offset && This_Offset < Max_Offset) - Max_Offset = This_Offset; - break; - case N_SLINE: - This_Offset = S_GET_VALUE (symbolP); - if (This_Offset > Max_Source_Offset) - Max_Source_Offset = This_Offset; - break; - } - /* If this is the last routine, then we use the PC of the last source - line as a marker of the max PC for which this reg is valid. */ - if (Max_Offset == 0x7fffffff) - Max_Offset = Max_Source_Offset; - } - - dbx_type = 0; - str = S_GET_NAME (sp); - if ((pnt = (char *) strchr (str, ':')) == 0) - return; /* no colon present */ - pnt1 = pnt; /* save this for later*/ - pnt++; - if (*pnt != 'r') - return; - pnt = cvt_integer (pnt + 1, &dbx_type); - spnt = find_symbol (dbx_type); - if (!spnt) - return; /*Dunno what this is yet*/ - *pnt1 = '\0'; - pnt = fix_name (S_GET_NAME (sp)); /* if there are bad characters in name, convert them */ - len = strlen (pnt); - Local[i++] = 25 + len; - Local[i++] = spnt->VMS_type; - Local[i++] = DST_K_VFLAGS_TVS; /* trailing value specified */ - COPY_LONG (&Local[i], 1 + len); /* relative offset, beyond name */ - i += 4; - Local[i++] = len; /* name length (ascic prefix) */ - while (*pnt != '\0') - Local[i++] = *pnt++; - Local[i++] = DST_K_VS_FOLLOWS; /* value specification follows */ - COPY_SHORT (&Local[i], 15); /* length of rest of record */ - i += 2; - Local[i++] = DST_K_VS_ALLOC_SPLIT; /* split lifetime */ - Local[i++] = 1; /* one binding follows */ - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - i = 0; - VMS_Set_Data (Text_Psect, Min_Offset, OBJ_S_C_DBG, 1); - VMS_Set_Data (Text_Psect, Max_Offset, OBJ_S_C_DBG, 1); - Local[i++] = DST_K_VALKIND_REG; /* nested value spec */ - COPY_LONG (&Local[i], S_GET_VALUE (sp)); - i += 4; - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - *pnt1 = ':'; - if (spnt->VMS_type == DBG_S_C_ADVANCED_TYPE) - generate_suffix (spnt, 0); -} - - -/* This function examines a structure definition, checking all of the elements - to make sure that all of them are fully defined. The only thing that we - kick out are arrays of undefined structs, since we do not know how big - they are. All others we can handle with a normal forward reference. */ - -static int -forward_reference (pnt) - char *pnt; -{ - struct VMS_DBG_Symbol *spnt, *spnt1; - int i; - - pnt = cvt_integer (pnt + 1, &i); - if (*pnt == ';') - return 0; /* no forward references */ - do - { - pnt = (char *) strchr (pnt, ':'); - pnt = cvt_integer (pnt + 1, &i); - spnt = find_symbol (i); - while (spnt && (spnt->advanced == POINTER || spnt->advanced == ARRAY)) - { - spnt1 = find_symbol (spnt->type2); - if (spnt->advanced == ARRAY && !spnt1) - return 1; - spnt = spnt1; - } - pnt = cvt_integer (pnt + 1, &i); - pnt = cvt_integer (pnt + 1, &i); - } while (*++pnt != ';'); - return 0; /* no forward refences found */ -} - - -/* Used to check a single element of a structure on the final pass. */ - -static int -final_forward_reference (spnt) - struct VMS_DBG_Symbol *spnt; -{ - struct VMS_DBG_Symbol *spnt1; - - while (spnt && (spnt->advanced == POINTER || spnt->advanced == ARRAY)) - { - spnt1 = find_symbol (spnt->type2); - if (spnt->advanced == ARRAY && !spnt1) - return 1; - spnt = spnt1; - } - return 0; /* no forward refences found */ -} - - -/* This routine parses the stabs directives to find any definitions of dbx - type numbers. It makes a note of all of them, creating a structure - element of VMS_DBG_Symbol that describes it. This also generates the - info for the debugger that describes the struct/union/enum, so that - further references to these data types will be by number - - We have to process pointers right away, since there can be references - to them later in the same stabs directive. We cannot have forward - references to pointers, (but we can have a forward reference to a - pointer to a structure/enum/union) and this is why we process them - immediately. After we process the pointer, then we search for defs - that are nested even deeper. - - 8/15/92: We have to process arrays right away too, because there can - be multiple references to identical array types in one structure - definition, and only the first one has the definition. */ - -static int -VMS_typedef_parse (str) - char *str; -{ - char *pnt; - char *pnt1; - const char *pnt2; - int i; - int dtype; - struct forward_ref *fpnt; - int i1, i2, i3, len; - struct VMS_DBG_Symbol *spnt; - struct VMS_DBG_Symbol *spnt1; - - /* check for any nested def's */ - pnt = (char *) strchr (str + 1, '='); - if (pnt && str[1] != '*' && (str[1] != 'a' || str[2] != 'r') - && VMS_typedef_parse (pnt) == 1) - return 1; - /* now find dbx_type of entry */ - pnt = str - 1; - if (*pnt == 'c') - { /* check for static constants */ - *str = '\0'; /* for now we ignore them */ - return 0; - } - while ((*pnt <= '9') && (*pnt >= '0')) - pnt--; - pnt++; /* and get back to the number */ - cvt_integer (pnt, &i1); - spnt = find_symbol (i1); - /* first see if this has been defined already, due to forward reference */ - if (!spnt) - { - i2 = SYMTYP_HASH (i1); - spnt = (struct VMS_DBG_Symbol *) xmalloc (sizeof (struct VMS_DBG_Symbol)); - spnt->next = VMS_Symbol_type_list[i2]; - VMS_Symbol_type_list[i2] = spnt; - spnt->dbx_type = i1; /* and save the type */ - spnt->type2 = spnt->VMS_type = spnt->data_size = 0; - spnt->index_min = spnt->index_max = spnt->struc_numb = 0; - } - /* - * For structs and unions, do a partial parse, otherwise we sometimes get - * circular definitions that are impossible to resolve. We read enough - * info so that any reference to this type has enough info to be resolved. - */ - pnt = str + 1; /* point to character past equal sign */ - if (*pnt >= '0' && *pnt <= '9') - { - if (type_check ("void")) - { /* this is the void symbol */ - *str = '\0'; - spnt->advanced = VOID; - return 0; - } - if (type_check ("unknown type")) - { - *str = '\0'; - spnt->advanced = UNKNOWN; - return 0; - } - pnt1 = cvt_integer (pnt, &i1); - if (i1 != spnt->dbx_type) - { - spnt->advanced = ALIAS; - spnt->type2 = i1; - strcpy (str, pnt1); - return 0; - } - as_tsktsk (_("debugginer output: %d is an unknown untyped variable."), - spnt->dbx_type); - return 1; /* do not know what this is */ - } - - pnt = str + 1; /* point to character past equal sign */ - switch (*pnt) - { - case 'r': - spnt->advanced = BASIC; - if (type_check ("int")) - { - spnt->VMS_type = DBG_S_C_SLINT; - spnt->data_size = 4; - } - else if (type_check ("long int")) - { - spnt->VMS_type = DBG_S_C_SLINT; - spnt->data_size = 4; - } - else if (type_check ("unsigned int")) - { - spnt->VMS_type = DBG_S_C_ULINT; - spnt->data_size = 4; - } - else if (type_check ("long unsigned int")) - { - spnt->VMS_type = DBG_S_C_ULINT; - spnt->data_size = 4; - } - else if (type_check ("short int")) - { - spnt->VMS_type = DBG_S_C_SSINT; - spnt->data_size = 2; - } - else if (type_check ("short unsigned int")) - { - spnt->VMS_type = DBG_S_C_USINT; - spnt->data_size = 2; - } - else if (type_check ("char")) - { - spnt->VMS_type = DBG_S_C_SCHAR; - spnt->data_size = 1; - } - else if (type_check ("signed char")) - { - spnt->VMS_type = DBG_S_C_SCHAR; - spnt->data_size = 1; - } - else if (type_check ("unsigned char")) - { - spnt->VMS_type = DBG_S_C_UCHAR; - spnt->data_size = 1; - } - else if (type_check ("float")) - { - spnt->VMS_type = DBG_S_C_REAL4; - spnt->data_size = 4; - } - else if (type_check ("double")) - { - spnt->VMS_type = vax_g_doubles ? DBG_S_C_REAL8_G : DBG_S_C_REAL8; - spnt->data_size = 8; - } - else if (type_check ("long double")) - { - /* same as double, at least for now */ - spnt->VMS_type = vax_g_doubles ? DBG_S_C_REAL8_G : DBG_S_C_REAL8; - spnt->data_size = 8; - } - else if (type_check ("long long int")) - { - spnt->VMS_type = DBG_S_C_SQUAD; /* signed quadword */ - spnt->data_size = 8; - } - else if (type_check ("long long unsigned int")) - { - spnt->VMS_type = DBG_S_C_UQUAD; /* unsigned quadword */ - spnt->data_size = 8; - } - else if (type_check ("complex float")) - { - spnt->VMS_type = DBG_S_C_COMPLX4; - spnt->data_size = 2 * 4; - } - else if (type_check ("complex double")) - { - spnt->VMS_type = vax_g_doubles ? DBG_S_C_COMPLX8_G : DBG_S_C_COMPLX8; - spnt->data_size = 2 * 8; - } - else if (type_check ("complex long double")) - { - /* same as complex double, at least for now */ - spnt->VMS_type = vax_g_doubles ? DBG_S_C_COMPLX8_G : DBG_S_C_COMPLX8; - spnt->data_size = 2 * 8; - } - else - { - /* [pr] - * Shouldn't get here, but if we do, something - * more substantial ought to be done... - */ - spnt->VMS_type = 0; - spnt->data_size = 0; - } - if (spnt->VMS_type != 0) - setup_basic_type (spnt); - pnt1 = (char *) strchr (str, ';') + 1; - break; - case 's': - case 'u': - spnt->advanced = (*pnt == 's') ? STRUCT : UNION; - spnt->VMS_type = DBG_S_C_ADVANCED_TYPE; - pnt1 = cvt_integer (pnt + 1, &spnt->data_size); - if (!final_pass && forward_reference (pnt)) - { - spnt->struc_numb = -1; - return 1; - } - spnt->struc_numb = ++structure_count; - pnt1--; - pnt = get_struct_name (str); - VMS_Def_Struct (spnt->struc_numb); - i = 0; - for (fpnt = f_ref_root; fpnt; fpnt = fpnt->next) - if (fpnt->dbx_type == spnt->dbx_type) - { - fpnt->resolved = 'Y'; - VMS_Set_Struct (fpnt->struc_numb); - VMS_Store_Struct (spnt->struc_numb); - i++; - } - if (i > 0) - VMS_Set_Struct (spnt->struc_numb); - i = 0; - Local[i++] = 11 + strlen (pnt); - Local[i++] = DBG_S_C_STRUCT_START; - Local[i++] = DST_K_VFLAGS_NOVAL; /* structure definition only */ - COPY_LONG (&Local[i], 0L); /* hence value is unused */ - i += 4; - Local[i++] = strlen (pnt); - pnt2 = pnt; - while (*pnt2 != '\0') - Local[i++] = *pnt2++; - i2 = spnt->data_size * 8; /* number of bits */ - COPY_LONG (&Local[i], i2); - i += 4; - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - i = 0; - if (pnt != symbol_name) - { - pnt += strlen (pnt); - *pnt = ':'; - } /* replace colon for later */ - while (*++pnt1 != ';') - { - pnt = (char *) strchr (pnt1, ':'); - *pnt = '\0'; - pnt2 = pnt1; - pnt1 = cvt_integer (pnt + 1, &dtype); - pnt1 = cvt_integer (pnt1 + 1, &i2); - pnt1 = cvt_integer (pnt1 + 1, &i3); - spnt1 = find_symbol (dtype); - len = strlen (pnt2); - if (spnt1 && (spnt1->advanced == BASIC || spnt1->advanced == ENUM) - && ((i3 != spnt1->data_size * 8) || (i2 % 8 != 0))) - { /* bitfield */ - if (USE_BITSTRING_DESCRIPTOR (spnt1)) - { - /* This uses a type descriptor, which doesn't work if - the enclosing structure has been placed in a register. - Also, enum bitfields degenerate to simple integers. */ - int unsigned_type = (spnt1->VMS_type == DBG_S_C_ULINT - || spnt1->VMS_type == DBG_S_C_USINT - || spnt1->VMS_type == DBG_S_C_UCHAR - || spnt1->VMS_type == DBG_S_C_UQUAD - || spnt1->advanced == ENUM); /* (approximate) */ - Apoint = 0; - fpush (19 + len, 1); - fpush (unsigned_type ? DBG_S_C_UBITU : DBG_S_C_SBITU, 1); - fpush (DST_K_VFLAGS_DSC, 1); /* specified by descriptor */ - fpush (1 + len, 4); /* relative offset to descriptor */ - fpush (len, 1); /* length byte (ascic prefix) */ - while (*pnt2 != '\0') /* name bytes */ - fpush (*pnt2++, 1); - fpush (i3, 2); /* dsc length == size of bitfield */ - /* dsc type == un?signed bitfield */ - fpush (unsigned_type ? DBG_S_C_UBITU : DBG_S_C_SBITU, 1); - fpush (DSC_K_CLASS_UBS, 1); /* dsc class == unaligned bitstring */ - fpush (0x00, 4); /* dsc pointer == zeroes */ - fpush (i2, 4); /* start position */ - VMS_Store_Immediate_Data (Asuffix, Apoint, OBJ_S_C_DBG); - Apoint = 0; - } - else - { - /* Use a "novel length" type specification, which works - right for register structures and for enum bitfields - but results in larger object modules. */ - Local[i++] = 7 + len; - Local[i++] = DBG_S_C_ADVANCED_TYPE; /* type spec follows */ - Local[i++] = DBG_S_C_STRUCT_ITEM; /* value is a bit offset */ - COPY_LONG (&Local[i], i2); /* bit offset */ - i += 4; - Local[i++] = strlen (pnt2); - while (*pnt2 != '\0') - Local[i++] = *pnt2++; - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - i = 0; - bitfield_suffix (spnt1, i3); - } - } - else - { /* not a bitfield */ - /* check if this is a forward reference */ - if (final_pass && final_forward_reference (spnt1)) - { - as_tsktsk (_("debugger output: structure element `%s' has undefined type"), - pnt2); - continue; - } - Local[i++] = 7 + len; - Local[i++] = spnt1 ? spnt1->VMS_type : DBG_S_C_ADVANCED_TYPE; - Local[i++] = DBG_S_C_STRUCT_ITEM; - COPY_LONG (&Local[i], i2); /* bit offset */ - i += 4; - Local[i++] = strlen (pnt2); - while (*pnt2 != '\0') - Local[i++] = *pnt2++; - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - i = 0; - if (!spnt1) - generate_suffix (spnt1, dtype); - else if (spnt1->VMS_type == DBG_S_C_ADVANCED_TYPE) - generate_suffix (spnt1, 0); - } - } - pnt1++; - Local[i++] = 0x01; /* length byte */ - Local[i++] = DBG_S_C_STRUCT_END; - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - i = 0; - break; - case 'e': - spnt->advanced = ENUM; - spnt->VMS_type = DBG_S_C_ADVANCED_TYPE; - spnt->struc_numb = ++structure_count; - spnt->data_size = 4; - VMS_Def_Struct (spnt->struc_numb); - i = 0; - for (fpnt = f_ref_root; fpnt; fpnt = fpnt->next) - if (fpnt->dbx_type == spnt->dbx_type) - { - fpnt->resolved = 'Y'; - VMS_Set_Struct (fpnt->struc_numb); - VMS_Store_Struct (spnt->struc_numb); - i++; - } - if (i > 0) - VMS_Set_Struct (spnt->struc_numb); - i = 0; - len = strlen (symbol_name); - Local[i++] = 3 + len; - Local[i++] = DBG_S_C_ENUM_START; - Local[i++] = 4 * 8; /* enum values are 32 bits */ - Local[i++] = len; - pnt2 = symbol_name; - while (*pnt2 != '\0') - Local[i++] = *pnt2++; - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - i = 0; - while (*++pnt != ';') - { - pnt1 = (char *) strchr (pnt, ':'); - *pnt1++ = '\0'; - pnt1 = cvt_integer (pnt1, &i1); - len = strlen (pnt); - Local[i++] = 7 + len; - Local[i++] = DBG_S_C_ENUM_ITEM; - Local[i++] = DST_K_VALKIND_LITERAL; - COPY_LONG (&Local[i], i1); - i += 4; - Local[i++] = len; - pnt2 = pnt; - while (*pnt != '\0') - Local[i++] = *pnt++; - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - i = 0; - pnt = pnt1; /* Skip final semicolon */ - } - Local[i++] = 0x01; /* len byte */ - Local[i++] = DBG_S_C_ENUM_END; - VMS_Store_Immediate_Data (Local, i, OBJ_S_C_DBG); - i = 0; - pnt1 = pnt + 1; - break; - case 'a': - spnt->advanced = ARRAY; - spnt->VMS_type = DBG_S_C_ADVANCED_TYPE; - pnt = (char *) strchr (pnt, ';'); - if (!pnt) - return 1; - pnt1 = cvt_integer (pnt + 1, &spnt->index_min); - pnt1 = cvt_integer (pnt1 + 1, &spnt->index_max); - pnt1 = cvt_integer (pnt1 + 1, &spnt->type2); - pnt = (char *) strchr (str + 1, '='); - if (pnt && VMS_typedef_parse (pnt) == 1) - return 1; - break; - case 'f': - spnt->advanced = FUNCTION; - spnt->VMS_type = DBG_S_C_FUNCTION_ADDR; - /* this masquerades as a basic type*/ - spnt->data_size = 4; - pnt1 = cvt_integer (pnt + 1, &spnt->type2); - break; - case '*': - spnt->advanced = POINTER; - spnt->VMS_type = DBG_S_C_ADVANCED_TYPE; - spnt->data_size = 4; - pnt1 = cvt_integer (pnt + 1, &spnt->type2); - pnt = (char *) strchr (str + 1, '='); - if (pnt && VMS_typedef_parse (pnt) == 1) - return 1; - break; - default: - spnt->advanced = UNKNOWN; - spnt->VMS_type = 0; - as_tsktsk (_("debugger output: %d is an unknown type of variable."), - spnt->dbx_type); - return 1; /* unable to decipher */ - } - /* This removes the evidence of the definition so that the outer levels - of parsing do not have to worry about it. */ - pnt = str; - while (*pnt1 != '\0') - *pnt++ = *pnt1++; - *pnt = '\0'; - return 0; -} - - -/* This is the root routine that parses the stabs entries for definitions. - it calls VMS_typedef_parse, which can in turn call itself. We need to - be careful, since sometimes there are forward references to other symbol - types, and these cannot be resolved until we have completed the parse. - - Also check and see if we are using continuation stabs, if we are, then - paste together the entire contents of the stab before we pass it to - VMS_typedef_parse. */ - -static void -VMS_LSYM_Parse () -{ - char *pnt; - char *pnt1; - char *pnt2; - char *str; - char *parse_buffer = 0; - char fixit[10]; - int incomplete, pass, incom1; - struct forward_ref *fpnt; - symbolS *sp; - - pass = 0; - final_pass = 0; - incomplete = 0; - do - { - incom1 = incomplete; - incomplete = 0; - for (sp = symbol_rootP; sp; sp = symbol_next (sp)) - { - /* - * Deal with STAB symbols - */ - if (S_IS_DEBUG (sp)) - { - /* - * Dispatch on STAB type - */ - switch (S_GET_RAW_TYPE (sp)) - { - case N_GSYM: - case N_LCSYM: - case N_STSYM: - case N_PSYM: - case N_RSYM: - case N_LSYM: - case N_FUN: /*sometimes these contain typedefs*/ - str = S_GET_NAME (sp); - symbol_name = str; - pnt = str + strlen (str) - 1; - if (*pnt == '?') /* Continuation stab. */ - { - symbolS *spnext; - int tlen = 0; - - spnext = sp; - do { - tlen += strlen (str) - 1; - spnext = symbol_next (spnext); - str = S_GET_NAME (spnext); - pnt = str + strlen (str) - 1; - } while (*pnt == '?'); - tlen += strlen (str); - parse_buffer = (char *) xmalloc (tlen + 1); - strcpy (parse_buffer, S_GET_NAME (sp)); - pnt2 = parse_buffer + strlen (parse_buffer) - 1; - *pnt2 = '\0'; - spnext = sp; - do { - spnext = symbol_next (spnext); - str = S_GET_NAME (spnext); - strcat (pnt2, str); - pnt2 += strlen (str) - 1; - *str = '\0'; /* Erase this string */ - /* S_SET_NAME (spnext, str); */ - if (*pnt2 != '?') break; - *pnt2 = '\0'; - } while (1); - str = parse_buffer; - symbol_name = str; - } - if ((pnt = (char *) strchr (str, ':')) != 0) - { - *pnt = '\0'; - pnt1 = pnt + 1; - if ((pnt2 = (char *) strchr (pnt1, '=')) != 0) - incomplete += VMS_typedef_parse (pnt2); - if (parse_buffer) - { - /* At this point the parse buffer should just - contain name:nn. If it does not, then we - are in real trouble. Anyway, this is always - shorter than the original line. */ - pnt2 = S_GET_NAME (sp); - strcpy (pnt2, parse_buffer); - /* S_SET_NAME (sp, pnt2); */ - free (parse_buffer), parse_buffer = 0; - } - *pnt = ':'; /* put back colon to restore dbx_type */ - } - break; - } /*switch*/ - } /* if */ - } /*for*/ - pass++; - /* - * Make one last pass, if needed, and define whatever we can - * that is left. - */ - if (final_pass == 0 && incomplete == incom1) - { - final_pass = 1; - incom1++; /* Force one last pass through */ - } - } while (incomplete != 0 && incomplete != incom1); - /* repeat until all refs resolved if possible */ -/* if (pass > 1) printf (" Required %d passes\n", pass); */ - if (incomplete != 0) - { - as_tsktsk (_("debugger output: Unable to resolve %d circular references."), - incomplete); - } - fpnt = f_ref_root; - symbol_name = "\0"; - while (fpnt) - { - if (fpnt->resolved != 'Y') - { - if (find_symbol (fpnt->dbx_type)) - { - as_tsktsk (_("debugger forward reference error, dbx type %d"), - fpnt->dbx_type); - break; - } - fixit[0] = 0; - sprintf (&fixit[1], "%d=s4;", fpnt->dbx_type); - pnt2 = (char *) strchr (&fixit[1], '='); - VMS_typedef_parse (pnt2); - } - fpnt = fpnt->next; - } -} - - -static void -Define_Local_Symbols (s0P, s2P, Current_Routine, Text_Psect) - symbolS *s0P, *s2P; - symbolS *Current_Routine; - int Text_Psect; -{ - symbolS *s1P; /* each symbol from s0P .. s2P (exclusive) */ - - for (s1P = symbol_next (s0P); s1P != s2P; s1P = symbol_next (s1P)) - { - if (!s1P) - break; /* and return */ - if (S_GET_RAW_TYPE (s1P) == N_FUN) - { - char *pnt = (char *) strchr (S_GET_NAME (s1P), ':') + 1; - if (*pnt == 'F' || *pnt == 'f') break; - } - if (!S_IS_DEBUG (s1P)) - continue; - /* - * Dispatch on STAB type - */ - switch (S_GET_RAW_TYPE (s1P)) - { - default: - continue; /* not left or right brace */ - - case N_LSYM: - case N_PSYM: - VMS_local_stab_Parse (s1P); - break; - - case N_RSYM: - VMS_RSYM_Parse (s1P, Current_Routine, Text_Psect); - break; - } /*switch*/ - } /* for */ -} - - -/* This function crawls the symbol chain searching for local symbols that - need to be described to the debugger. When we enter a new scope with - a "{", it creates a new "block", which helps the debugger keep track - of which scope we are currently in. */ - -static symbolS * -Define_Routine (s0P, Level, Current_Routine, Text_Psect) - symbolS *s0P; - int Level; - symbolS *Current_Routine; - int Text_Psect; -{ - symbolS *s1P; - valueT Offset; - int rcount = 0; - - for (s1P = symbol_next (s0P); s1P != 0; s1P = symbol_next (s1P)) - { - if (S_GET_RAW_TYPE (s1P) == N_FUN) - { - char *pnt = (char *) strchr (S_GET_NAME (s1P), ':') + 1; - if (*pnt == 'F' || *pnt == 'f') break; - } - if (!S_IS_DEBUG (s1P)) - continue; - /* - * Dispatch on STAB type - */ - switch (S_GET_RAW_TYPE (s1P)) - { - default: - continue; /* not left or right brace */ - - case N_LBRAC: - if (Level != 0) - { - char str[10]; - sprintf (str, "$%d", rcount++); - VMS_TBT_Block_Begin (s1P, Text_Psect, str); - } - Offset = S_GET_VALUE (s1P); /* side-effect: fully resolve symbol */ - Define_Local_Symbols (s0P, s1P, Current_Routine, Text_Psect); - s1P = Define_Routine (s1P, Level + 1, Current_Routine, Text_Psect); - if (Level != 0) - VMS_TBT_Block_End (S_GET_VALUE (s1P) - Offset); - s0P = s1P; - break; - - case N_RBRAC: - return s1P; - } /*switch*/ - } /* for */ - - /* We end up here if there were no brackets in this function. - Define everything. */ - Define_Local_Symbols (s0P, (symbolS *)0, Current_Routine, Text_Psect); - return s1P; -} - - -#ifndef VMS -#include -#include -static void get_VMS_time_on_unix PARAMS ((char *)); - -/* Manufacture a VMS-like time string on a Unix based system. */ -static void -get_VMS_time_on_unix (Now) - char *Now; -{ - char *pnt; - time_t timeb; - - time (&timeb); - pnt = ctime (&timeb); - pnt[3] = 0; - pnt[7] = 0; - pnt[10] = 0; - pnt[16] = 0; - pnt[24] = 0; - sprintf (Now, "%2s-%3s-%s %s", pnt + 8, pnt + 4, pnt + 20, pnt + 11); -} -#endif /* not VMS */ - - -/* Write the MHD (Module Header) records. */ - -static void -Write_VMS_MHD_Records () -{ - register const char *cp; - register char *cp1; - register int i; -#ifdef VMS - struct { unsigned short len, mbz; char *ptr; } Descriptor; -#endif - char Now[17+1]; - - /* We are writing a module header record. */ - Set_VMS_Object_File_Record (OBJ_S_C_HDR); - /* - * *************************** - * *MAIN MODULE HEADER RECORD* - * *************************** - */ - /* Store record type and header type. */ - PUT_CHAR (OBJ_S_C_HDR); - PUT_CHAR (MHD_S_C_MHD); - /* Structure level is 0. */ - PUT_CHAR (OBJ_S_C_STRLVL); - /* Maximum record size is size of the object record buffer. */ - PUT_SHORT (sizeof (Object_Record_Buffer)); - - /* - * FIXME: module name and version should be user - * specifiable via `.ident' and/or `#pragma ident'. - */ - - /* Get module name (the FILENAME part of the object file). */ - cp = out_file_name; - cp1 = Module_Name; - while (*cp) - { - if (*cp == ']' || *cp == '>' || *cp == ':' || *cp == '/') - { - cp1 = Module_Name; - cp++; - continue; - } - *cp1++ = islower (*cp) ? toupper (*cp++) : *cp++; - } - *cp1 = '\0'; - - /* Limit it to 31 characters and store in the object record. */ - while (--cp1 >= Module_Name) - if (*cp1 == '.') - *cp1 = '\0'; - if (strlen (Module_Name) > 31) - { - if (flag_hash_long_names) - as_tsktsk (_("Module name truncated: %s\n"), Module_Name); - Module_Name[31] = '\0'; - } - PUT_COUNTED_STRING (Module_Name); - /* Module Version is "V1.0". */ - PUT_COUNTED_STRING ("V1.0"); - /* Creation time is "now" (17 chars of time string): "dd-MMM-yyyy hh:mm". */ -#ifndef VMS - get_VMS_time_on_unix (Now); -#else /* VMS */ - Descriptor.len = sizeof Now - 1; - Descriptor.mbz = 0; /* type & class unspecified */ - Descriptor.ptr = Now; - (void) sys$asctim ((unsigned short *)0, &Descriptor, (long *)0, 0); -#endif /* VMS */ - for (i = 0; i < 17; i++) - PUT_CHAR (Now[i]); - /* Patch time is "never" (17 zeros). */ - for (i = 0; i < 17; i++) - PUT_CHAR (0); - /* Force this to be a separate output record. */ - Flush_VMS_Object_Record_Buffer (); - - /* - * ************************* - * *LANGUAGE PROCESSOR NAME* - * ************************* - */ - /* Store record type and header type. */ - PUT_CHAR (OBJ_S_C_HDR); - PUT_CHAR (MHD_S_C_LNM); - /* - * Store language processor name and version (not a counted string!). - * - * This is normally supplied by the gcc driver for the command line - * which invokes gas. If absent, we fall back to gas's version. - */ - cp = compiler_version_string; - if (cp == 0) - { - cp = "GNU AS V"; - while (*cp) - PUT_CHAR (*cp++); - cp = VERSION; - } - while (*cp >= ' ') - PUT_CHAR (*cp++); - /* Force this to be a separate output record. */ - Flush_VMS_Object_Record_Buffer (); -} - - -/* Write the EOM (End Of Module) record. */ - -static void -Write_VMS_EOM_Record (Psect, Offset) - int Psect; - valueT Offset; -{ - /* - * We are writing an end-of-module record - * (this assumes that the entry point will always be in a psect - * represented by a single byte, which is the case for code in - * Text_Psect==0) - */ - Set_VMS_Object_File_Record (OBJ_S_C_EOM); - PUT_CHAR (OBJ_S_C_EOM); /* Record type. */ - PUT_CHAR (0); /* Error severity level (we ignore it). */ - /* - * Store the entry point, if it exists - */ - if (Psect >= 0) - { - PUT_CHAR (Psect); - PUT_LONG (Offset); - } - /* Flush the record; this will be our final output. */ - Flush_VMS_Object_Record_Buffer (); -} - - -/* this hash routine borrowed from GNU-EMACS, and strengthened slightly ERY*/ - -static int -hash_string (ptr) - const char *ptr; -{ - register const unsigned char *p = (unsigned char *) ptr; - register const unsigned char *end = p + strlen (ptr); - register unsigned char c; - register int hash = 0; - - while (p != end) - { - c = *p++; - hash = ((hash << 3) + (hash << 15) + (hash >> 28) + c); - } - return hash; -} - -/* - * Generate a Case-Hacked VMS symbol name (limited to 31 chars) - */ -static void -VMS_Case_Hack_Symbol (In, Out) - register const char *In; - register char *Out; -{ - long int init; - long int result; - char *pnt = 0; - char *new_name; - const char *old_name; - register int i; - int destructor = 0; /*hack to allow for case sens in a destructor*/ - int truncate = 0; - int Case_Hack_Bits = 0; - int Saw_Dollar = 0; - static char Hex_Table[16] = - {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - /* - * Kill any leading "_" - */ - if ((In[0] == '_') && ((In[1] > '9') || (In[1] < '0'))) - In++; - - new_name = Out; /* save this for later*/ - -#if barfoo /* Dead code */ - if ((In[0] == '_') && (In[1] == '$') && (In[2] == '_')) - destructor = 1; -#endif - - /* We may need to truncate the symbol, save the hash for later*/ - result = (strlen (In) > 23) ? hash_string (In) : 0; - /* - * Is there a Psect Attribute to skip?? - */ - if (HAS_PSECT_ATTRIBUTES (In)) - { - /* - * Yes: Skip it - */ - In += PSECT_ATTRIBUTES_STRING_LENGTH; - while (*In) - { - if ((In[0] == '$') && (In[1] == '$')) - { - In += 2; - break; - } - In++; - } - } - - old_name = In; -/* if (strlen (In) > 31 && flag_hash_long_names) - as_tsktsk ("Symbol name truncated: %s\n", In); */ - /* - * Do the case conversion - */ - i = 23; /* Maximum of 23 chars */ - while (*In && (--i >= 0)) - { - Case_Hack_Bits <<= 1; - if (*In == '$') - Saw_Dollar = 1; - if ((destructor == 1) && (i == 21)) - Saw_Dollar = 0; - switch (vms_name_mapping) - { - case 0: - if (isupper (*In)) { - *Out++ = *In++; - Case_Hack_Bits |= 1; - } else { - *Out++ = islower (*In) ? toupper (*In++) : *In++; - } - break; - case 3: *Out++ = *In++; - break; - case 2: - if (islower (*In)) { - *Out++ = *In++; - } else { - *Out++ = isupper (*In) ? tolower (*In++) : *In++; - } - break; - } - } - /* - * If we saw a dollar sign, we don't do case hacking - */ - if (flag_no_hash_mixed_case || Saw_Dollar) - Case_Hack_Bits = 0; - - /* - * If we have more than 23 characters and everything is lowercase - * we can insert the full 31 characters - */ - if (*In) - { - /* - * We have more than 23 characters - * If we must add the case hack, then we have truncated the str - */ - pnt = Out; - truncate = 1; - if (Case_Hack_Bits == 0) - { - /* - * And so far they are all lower case: - * Check up to 8 more characters - * and ensure that they are lowercase - */ - for (i = 0; (In[i] != 0) && (i < 8); i++) - if (isupper (In[i]) && !Saw_Dollar && !flag_no_hash_mixed_case) - break; - - if (In[i] == 0) - truncate = 0; - - if ((i == 8) || (In[i] == 0)) - { - /* - * They are: Copy up to 31 characters - * to the output string - */ - i = 8; - while ((--i >= 0) && (*In)) - switch (vms_name_mapping){ - case 0: *Out++ = islower (*In) ? toupper (*In++) : *In++; - break; - case 3: *Out++ = *In++; - break; - case 2: *Out++ = isupper (*In) ? tolower (*In++) : *In++; - break; - } - } - } - } - /* - * If there were any uppercase characters in the name we - * take on the case hacking string - */ - - /* Old behavior for regular GNU-C compiler */ - if (!flag_hash_long_names) - truncate = 0; - if ((Case_Hack_Bits != 0) || (truncate == 1)) - { - if (truncate == 0) - { - *Out++ = '_'; - for (i = 0; i < 6; i++) - { - *Out++ = Hex_Table[Case_Hack_Bits & 0xf]; - Case_Hack_Bits >>= 4; - } - *Out++ = 'X'; - } - else - { - Out = pnt; /*Cut back to 23 characters maximum */ - *Out++ = '_'; - for (i = 0; i < 7; i++) - { - init = result & 0x01f; - *Out++ = (init < 10) ? ('0' + init) : ('A' + init - 10); - result = result >> 5; - } - } - } /*Case Hack */ - /* - * Done - */ - *Out = 0; - if (truncate == 1 && flag_hash_long_names && flag_show_after_trunc) - as_tsktsk (_("Symbol %s replaced by %s\n"), old_name, new_name); -} - - -/* - * Scan a symbol name for a psect attribute specification - */ -#define GLOBALSYMBOL_BIT 0x10000 -#define GLOBALVALUE_BIT 0x20000 - - -static void -VMS_Modify_Psect_Attributes (Name, Attribute_Pointer) - const char *Name; - int *Attribute_Pointer; -{ - register int i; - register const char *cp; - int Negate; - static const struct - { - const char *Name; - int Value; - } Attributes[] = - { - {"PIC", GPS_S_M_PIC}, - {"LIB", GPS_S_M_LIB}, - {"OVR", GPS_S_M_OVR}, - {"REL", GPS_S_M_REL}, - {"GBL", GPS_S_M_GBL}, - {"SHR", GPS_S_M_SHR}, - {"EXE", GPS_S_M_EXE}, - {"RD", GPS_S_M_RD}, - {"WRT", GPS_S_M_WRT}, - {"VEC", GPS_S_M_VEC}, - {"GLOBALSYMBOL", GLOBALSYMBOL_BIT}, - {"GLOBALVALUE", GLOBALVALUE_BIT}, - {0, 0} - }; - - /* - * Kill leading "_" - */ - if (*Name == '_') - Name++; - /* - * Check for a PSECT attribute list - */ - if (!HAS_PSECT_ATTRIBUTES (Name)) - return; /* If not, return */ - /* - * Skip the attribute list indicator - */ - Name += PSECT_ATTRIBUTES_STRING_LENGTH; - /* - * Process the attributes ("_" separated, "$" terminated) - */ - while (*Name != '$') - { - /* - * Assume not negating - */ - Negate = 0; - /* - * Check for "NO" - */ - if ((Name[0] == 'N') && (Name[1] == 'O')) - { - /* - * We are negating (and skip the NO) - */ - Negate = 1; - Name += 2; - } - /* - * Find the token delimiter - */ - cp = Name; - while (*cp && (*cp != '_') && (*cp != '$')) - cp++; - /* - * Look for the token in the attribute list - */ - for (i = 0; Attributes[i].Name; i++) - { - /* - * If the strings match, set/clear the attr. - */ - if (strncmp (Name, Attributes[i].Name, cp - Name) == 0) - { - /* - * Set or clear - */ - if (Negate) - *Attribute_Pointer &= - ~Attributes[i].Value; - else - *Attribute_Pointer |= - Attributes[i].Value; - /* - * Done - */ - break; - } - } - /* - * Now skip the attribute - */ - Name = cp; - if (*Name == '_') - Name++; - } -} - - -#define GBLSYM_REF 0 -#define GBLSYM_DEF 1 -#define GBLSYM_VAL 2 -#define GBLSYM_LCL 4 /* not GBL after all... */ -#define GBLSYM_WEAK 8 - -/* - * Define a global symbol (or possibly a local one). - */ -static void -VMS_Global_Symbol_Spec (Name, Psect_Number, Psect_Offset, Flags) - const char *Name; - int Psect_Number; - int Psect_Offset; - int Flags; -{ - char Local[32]; - - /* - * We are writing a GSD record - */ - Set_VMS_Object_File_Record (OBJ_S_C_GSD); - /* - * If the buffer is empty we must insert the GSD record type - */ - if (Object_Record_Offset == 0) - PUT_CHAR (OBJ_S_C_GSD); - /* - * We are writing a Global (or local) symbol definition subrecord. - */ - PUT_CHAR ((Flags & GBLSYM_LCL) != 0 ? GSD_S_C_LSY : - ((unsigned) Psect_Number <= 255) ? GSD_S_C_SYM : GSD_S_C_SYMW); - /* - * Data type is undefined - */ - PUT_CHAR (0); - /* - * Switch on Definition/Reference - */ - if ((Flags & GBLSYM_DEF) == 0) - { - /* - * Reference - */ - PUT_SHORT (((Flags & GBLSYM_VAL) == 0) ? GSY_S_M_REL : 0); - if ((Flags & GBLSYM_LCL) != 0) /* local symbols have extra field */ - PUT_SHORT (Current_Environment); - } - else - { - int sym_flags; - - /* - * Definition - *[ assert (LSY_S_M_DEF == GSY_S_M_DEF && LSY_S_M_REL == GSY_S_M_REL); ] - */ - sym_flags = GSY_S_M_DEF; - if (Flags & GBLSYM_WEAK) - sym_flags |= GSY_S_M_WEAK; - if ((Flags & GBLSYM_VAL) == 0) - sym_flags |= GSY_S_M_REL; - PUT_SHORT (sym_flags); - if ((Flags & GBLSYM_LCL) != 0) /* local symbols have extra field */ - PUT_SHORT (Current_Environment); - /* - * Psect Number - */ - if ((Flags & GBLSYM_LCL) == 0 && (unsigned) Psect_Number <= 255) - PUT_CHAR (Psect_Number); - else - PUT_SHORT (Psect_Number); - /* - * Offset - */ - PUT_LONG (Psect_Offset); - } - /* - * Finally, the global symbol name - */ - VMS_Case_Hack_Symbol (Name, Local); - PUT_COUNTED_STRING (Local); - /* - * Flush the buffer if it is more than 75% full - */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - -/* - * Define an environment to support local symbol references. - * This is just to mollify the linker; we don't actually do - * anything useful with it. - */ -static void -VMS_Local_Environment_Setup (Env_Name) - const char *Env_Name; -{ - /* We are writing a GSD record. */ - Set_VMS_Object_File_Record (OBJ_S_C_GSD); - /* If the buffer is empty we must insert the GSD record type. */ - if (Object_Record_Offset == 0) - PUT_CHAR (OBJ_S_C_GSD); - /* We are writing an ENV subrecord. */ - PUT_CHAR (GSD_S_C_ENV); - - ++Current_Environment; /* index of environment being defined */ - - /* ENV$W_FLAGS: we are defining the next environment. It's not nested. */ - PUT_SHORT (ENV_S_M_DEF); - /* ENV$W_ENVINDX: index is always 0 for non-nested definitions. */ - PUT_SHORT (0); - - /* ENV$B_NAMLNG + ENV$T_NAME: environment name in ASCIC format. */ - if (!Env_Name) Env_Name = ""; - PUT_COUNTED_STRING ((char *)Env_Name); - - /* Flush the buffer if it is more than 75% full. */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - - -/* - * Define a psect - */ -static int -VMS_Psect_Spec (Name, Size, Type, vsp) - const char *Name; - int Size; - enum ps_type Type; - struct VMS_Symbol *vsp; -{ - char Local[32]; - int Psect_Attributes; - - /* - * Generate the appropriate PSECT flags given the PSECT type - */ - switch (Type) - { - case ps_TEXT: - /* Text psects are PIC,noOVR,REL,noGBL,SHR,EXE,RD,noWRT. */ - Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_REL|GPS_S_M_SHR|GPS_S_M_EXE - |GPS_S_M_RD); - break; - case ps_DATA: - /* Data psects are PIC,noOVR,REL,noGBL,noSHR,noEXE,RD,WRT. */ - Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_REL|GPS_S_M_RD|GPS_S_M_WRT); - break; - case ps_COMMON: - /* Common block psects are: PIC,OVR,REL,GBL,noSHR,noEXE,RD,WRT. */ - Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_OVR|GPS_S_M_REL|GPS_S_M_GBL - |GPS_S_M_RD|GPS_S_M_WRT); - break; - case ps_CONST: - /* Const data psects are: PIC,OVR,REL,GBL,noSHR,noEXE,RD,noWRT. */ - Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_OVR|GPS_S_M_REL|GPS_S_M_GBL - |GPS_S_M_RD); - break; - case ps_CTORS: - /* Ctor psects are PIC,noOVR,REL,GBL,noSHR,noEXE,RD,noWRT. */ - Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_REL|GPS_S_M_GBL|GPS_S_M_RD); - break; - case ps_DTORS: - /* Dtor psects are PIC,noOVR,REL,GBL,noSHR,noEXE,RD,noWRT. */ - Psect_Attributes = (GPS_S_M_PIC|GPS_S_M_REL|GPS_S_M_GBL|GPS_S_M_RD); - break; - default: - /* impossible */ - error (_("Unknown VMS psect type (%ld)"), (long) Type); - break; - } - /* - * Modify the psect attributes according to any attribute string - */ - if (vsp && S_GET_TYPE (vsp->Symbol) == N_ABS) - Psect_Attributes |= GLOBALVALUE_BIT; - else if (HAS_PSECT_ATTRIBUTES (Name)) - VMS_Modify_Psect_Attributes (Name, &Psect_Attributes); - /* - * Check for globalref/def/val. - */ - if ((Psect_Attributes & GLOBALVALUE_BIT) != 0) - { - /* - * globalvalue symbols were generated before. This code - * prevents unsightly psect buildup, and makes sure that - * fixup references are emitted correctly. - */ - vsp->Psect_Index = -1; /* to catch errors */ - S_SET_TYPE (vsp->Symbol, N_UNDF); /* make refs work */ - return 1; /* decrement psect counter */ - } - - if ((Psect_Attributes & GLOBALSYMBOL_BIT) != 0) - { - switch (S_GET_RAW_TYPE (vsp->Symbol)) - { - case N_UNDF | N_EXT: - VMS_Global_Symbol_Spec (Name, vsp->Psect_Index, - vsp->Psect_Offset, GBLSYM_REF); - vsp->Psect_Index = -1; - S_SET_TYPE (vsp->Symbol, N_UNDF); - return 1; /* return and indicate no psect */ - case N_DATA | N_EXT: - VMS_Global_Symbol_Spec (Name, vsp->Psect_Index, - vsp->Psect_Offset, GBLSYM_DEF); - /* In this case we still generate the psect */ - break; - default: - as_fatal (_("Globalsymbol attribute for symbol %s was unexpected."), - Name); - break; - } /* switch */ - } - - Psect_Attributes &= 0xffff; /* clear out the globalref/def stuff */ - /* - * We are writing a GSD record - */ - Set_VMS_Object_File_Record (OBJ_S_C_GSD); - /* - * If the buffer is empty we must insert the GSD record type - */ - if (Object_Record_Offset == 0) - PUT_CHAR (OBJ_S_C_GSD); - /* - * We are writing a PSECT definition subrecord - */ - PUT_CHAR (GSD_S_C_PSC); - /* - * Psects are always LONGWORD aligned - */ - PUT_CHAR (2); - /* - * Specify the psect attributes - */ - PUT_SHORT (Psect_Attributes); - /* - * Specify the allocation - */ - PUT_LONG (Size); - /* - * Finally, the psect name - */ - VMS_Case_Hack_Symbol (Name, Local); - PUT_COUNTED_STRING (Local); - /* - * Flush the buffer if it is more than 75% full - */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); - return 0; -} - - -/* Given the pointer to a symbol we calculate how big the data at the - symbol is. We do this by looking for the next symbol (local or global) - which will indicate the start of another datum. */ - -static offsetT -VMS_Initialized_Data_Size (s0P, End_Of_Data) - register symbolS *s0P; - unsigned End_Of_Data; -{ - symbolS *s1P; - valueT s0P_val = S_GET_VALUE (s0P), s1P_val, - nearest_val = (valueT) End_Of_Data; - - /* Find the nearest symbol what follows this one. */ - for (s1P = symbol_rootP; s1P; s1P = symbol_next (s1P)) - { - /* The data type must match. */ - if (S_GET_TYPE (s1P) != N_DATA) - continue; - s1P_val = S_GET_VALUE (s1P); - if (s1P_val > s0P_val && s1P_val < nearest_val) - nearest_val = s1P_val; - } - /* Calculate its size. */ - return (offsetT) (nearest_val - s0P_val); -} - - -/* Check symbol names for the Psect hack with a globalvalue, and then - generate globalvalues for those that have it. */ - -static void -VMS_Emit_Globalvalues (text_siz, data_siz, Data_Segment) - unsigned text_siz; - unsigned data_siz; - char *Data_Segment; -{ - register symbolS *sp; - char *stripped_name, *Name; - int Size; - int Psect_Attributes; - int globalvalue; - int typ, abstyp; - - /* - * Scan the symbol table for globalvalues, and emit def/ref when - * required. These will be caught again later and converted to - * N_UNDF - */ - for (sp = symbol_rootP; sp; sp = sp->sy_next) - { - typ = S_GET_RAW_TYPE (sp); - abstyp = ((typ & ~N_EXT) == N_ABS); - /* - * See if this is something we want to look at. - */ - if (!abstyp && - typ != (N_DATA | N_EXT) && - typ != (N_UNDF | N_EXT)) - continue; - /* - * See if this has globalvalue specification. - */ - Name = S_GET_NAME (sp); - - if (abstyp) - { - stripped_name = 0; - Psect_Attributes = GLOBALVALUE_BIT; - } - else if (HAS_PSECT_ATTRIBUTES (Name)) - { - stripped_name = (char *) xmalloc (strlen (Name) + 1); - strcpy (stripped_name, Name); - Psect_Attributes = 0; - VMS_Modify_Psect_Attributes (stripped_name, &Psect_Attributes); - } - else - continue; - - if ((Psect_Attributes & GLOBALVALUE_BIT) != 0) - { - switch (typ) - { - case N_ABS: - /* Local symbol references will want - to have an environment defined. */ - if (Current_Environment < 0) - VMS_Local_Environment_Setup (".N_ABS"); - VMS_Global_Symbol_Spec (Name, 0, - S_GET_VALUE (sp), - GBLSYM_DEF|GBLSYM_VAL|GBLSYM_LCL); - break; - case N_ABS | N_EXT: - VMS_Global_Symbol_Spec (Name, 0, - S_GET_VALUE (sp), - GBLSYM_DEF|GBLSYM_VAL); - break; - case N_UNDF | N_EXT: - VMS_Global_Symbol_Spec (stripped_name, 0, 0, GBLSYM_VAL); - break; - case N_DATA | N_EXT: - Size = VMS_Initialized_Data_Size (sp, text_siz + data_siz); - if (Size > 4) - error (_("Invalid data type for globalvalue")); - globalvalue = md_chars_to_number (Data_Segment + - S_GET_VALUE (sp) - text_siz , Size); - /* Three times for good luck. The linker seems to get confused - if there are fewer than three */ - VMS_Global_Symbol_Spec (stripped_name, 0, 0, GBLSYM_VAL); - VMS_Global_Symbol_Spec (stripped_name, 0, globalvalue, - GBLSYM_DEF|GBLSYM_VAL); - VMS_Global_Symbol_Spec (stripped_name, 0, globalvalue, - GBLSYM_DEF|GBLSYM_VAL); - break; - default: - as_warn (_("Invalid globalvalue of %s"), stripped_name); - break; - } /* switch */ - } /* if */ - if (stripped_name) free (stripped_name); /* clean up */ - } /* for */ - -} - - -/* - * Define a procedure entry pt/mask - */ -static void -VMS_Procedure_Entry_Pt (Name, Psect_Number, Psect_Offset, Entry_Mask) - char *Name; - int Psect_Number; - int Psect_Offset; - int Entry_Mask; -{ - char Local[32]; - - /* - * We are writing a GSD record - */ - Set_VMS_Object_File_Record (OBJ_S_C_GSD); - /* - * If the buffer is empty we must insert the GSD record type - */ - if (Object_Record_Offset == 0) - PUT_CHAR (OBJ_S_C_GSD); - /* - * We are writing a Procedure Entry Pt/Mask subrecord - */ - PUT_CHAR (((unsigned) Psect_Number <= 255) ? GSD_S_C_EPM : GSD_S_C_EPMW); - /* - * Data type is undefined - */ - PUT_CHAR (0); - /* - * Flags = "RELOCATABLE" and "DEFINED" - */ - PUT_SHORT (GSY_S_M_DEF | GSY_S_M_REL); - /* - * Psect Number - */ - if ((unsigned) Psect_Number <= 255) - PUT_CHAR (Psect_Number); - else - PUT_SHORT (Psect_Number); - /* - * Offset - */ - PUT_LONG (Psect_Offset); - /* - * Entry mask - */ - PUT_SHORT (Entry_Mask); - /* - * Finally, the global symbol name - */ - VMS_Case_Hack_Symbol (Name, Local); - PUT_COUNTED_STRING (Local); - /* - * Flush the buffer if it is more than 75% full - */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - - -/* - * Set the current location counter to a particular Psect and Offset - */ -static void -VMS_Set_Psect (Psect_Index, Offset, Record_Type) - int Psect_Index; - int Offset; - int Record_Type; -{ - /* - * We are writing a "Record_Type" record - */ - Set_VMS_Object_File_Record (Record_Type); - /* - * If the buffer is empty we must insert the record type - */ - if (Object_Record_Offset == 0) - PUT_CHAR (Record_Type); - /* - * Stack the Psect base + Offset - */ - vms_tir_stack_psect (Psect_Index, Offset, 0); - /* - * Set relocation base - */ - PUT_CHAR (TIR_S_C_CTL_SETRB); - /* - * Flush the buffer if it is more than 75% full - */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - - -/* - * Store repeated immediate data in current Psect - */ -static void -VMS_Store_Repeated_Data (Repeat_Count, Pointer, Size, Record_Type) - int Repeat_Count; - register char *Pointer; - int Size; - int Record_Type; -{ - - /* - * Ignore zero bytes/words/longwords - */ - switch (Size) - { - case 4: - if (Pointer[3] != 0 || Pointer[2] != 0) break; - /* else FALLTHRU */ - case 2: - if (Pointer[1] != 0) break; - /* else FALLTHRU */ - case 1: - if (Pointer[0] != 0) break; - /* zero value */ - return; - default: - break; - } - /* - * If the data is too big for a TIR_S_C_STO_RIVB sub-record - * then we do it manually - */ - if (Size > 255) - { - while (--Repeat_Count >= 0) - VMS_Store_Immediate_Data (Pointer, Size, Record_Type); - return; - } - /* - * We are writing a "Record_Type" record - */ - Set_VMS_Object_File_Record (Record_Type); - /* - * If the buffer is empty we must insert record type - */ - if (Object_Record_Offset == 0) - PUT_CHAR (Record_Type); - /* - * Stack the repeat count - */ - PUT_CHAR (TIR_S_C_STA_LW); - PUT_LONG (Repeat_Count); - /* - * And now the command and its data - */ - PUT_CHAR (TIR_S_C_STO_RIVB); - PUT_CHAR (Size); - while (--Size >= 0) - PUT_CHAR (*Pointer++); - /* - * Flush the buffer if it is more than 75% full - */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - - -/* - * Store a Position Independent Reference - */ -static void -VMS_Store_PIC_Symbol_Reference (Symbol, Offset, PC_Relative, - Psect, Psect_Offset, Record_Type) - symbolS *Symbol; - int Offset; - int PC_Relative; - int Psect; - int Psect_Offset; - int Record_Type; -{ - register struct VMS_Symbol *vsp = Symbol->sy_obj; - char Local[32]; - int local_sym = 0; - - /* - * We are writing a "Record_Type" record - */ - Set_VMS_Object_File_Record (Record_Type); - /* - * If the buffer is empty we must insert record type - */ - if (Object_Record_Offset == 0) - PUT_CHAR (Record_Type); - /* - * Set to the appropriate offset in the Psect. - * For a Code reference we need to fix the operand - * specifier as well, so back up 1 byte; - * for a Data reference we just store HERE. - */ - VMS_Set_Psect (Psect, - PC_Relative ? Psect_Offset - 1 : Psect_Offset, - Record_Type); - /* - * Make sure we are still generating a "Record Type" record - */ - if (Object_Record_Offset == 0) - PUT_CHAR (Record_Type); - /* - * Dispatch on symbol type (so we can stack its value) - */ - switch (S_GET_RAW_TYPE (Symbol)) - { - /* - * Global symbol - */ - case N_ABS: - local_sym = 1; - /*FALLTHRU*/ - case N_ABS | N_EXT: -#ifdef NOT_VAX_11_C_COMPATIBLE - case N_UNDF | N_EXT: - case N_DATA | N_EXT: -#endif /* NOT_VAX_11_C_COMPATIBLE */ - case N_UNDF: - case N_TEXT | N_EXT: - /* - * Get the symbol name (case hacked) - */ - VMS_Case_Hack_Symbol (S_GET_NAME (Symbol), Local); - /* - * Stack the global symbol value - */ - if (!local_sym) - { - PUT_CHAR (TIR_S_C_STA_GBL); - } - else - { - /* Local symbols have an extra field. */ - PUT_CHAR (TIR_S_C_STA_LSY); - PUT_SHORT (Current_Environment); - } - PUT_COUNTED_STRING (Local); - if (Offset) - { - /* - * Stack the longword offset - */ - PUT_CHAR (TIR_S_C_STA_LW); - PUT_LONG (Offset); - /* - * Add the two, leaving the result on the stack - */ - PUT_CHAR (TIR_S_C_OPR_ADD); - } - break; - /* - * Uninitialized local data - */ - case N_BSS: - /* - * Stack the Psect (+offset) - */ - vms_tir_stack_psect (vsp->Psect_Index, - vsp->Psect_Offset + Offset, - 0); - break; - /* - * Local text - */ - case N_TEXT: - /* - * Stack the Psect (+offset) - */ - vms_tir_stack_psect (vsp->Psect_Index, - S_GET_VALUE (Symbol) + Offset, - 0); - break; - /* - * Initialized local or global data - */ - case N_DATA: -#ifndef NOT_VAX_11_C_COMPATIBLE - case N_UNDF | N_EXT: - case N_DATA | N_EXT: -#endif /* NOT_VAX_11_C_COMPATIBLE */ - /* - * Stack the Psect (+offset) - */ - vms_tir_stack_psect (vsp->Psect_Index, - vsp->Psect_Offset + Offset, - 0); - break; - } - /* - * Store either a code or data reference - */ - PUT_CHAR (PC_Relative ? TIR_S_C_STO_PICR : TIR_S_C_STO_PIDR); - /* - * Flush the buffer if it is more than 75% full - */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); -} - - -/* - * Check in the text area for an indirect pc-relative reference - * and fix it up with addressing mode 0xff [PC indirect] - * - * THIS SHOULD BE REPLACED BY THE USE OF TIR_S_C_STO_PIRR IN THE - * PIC CODE GENERATING FIXUP ROUTINE. - */ -static void -VMS_Fix_Indirect_Reference (Text_Psect, Offset, fragP, text_frag_root) - int Text_Psect; - int Offset; - register fragS *fragP; - fragS *text_frag_root; -{ - /* - * The addressing mode byte is 1 byte before the address - */ - Offset--; - /* - * Is it in THIS frag?? - */ - if ((Offset < fragP->fr_address) || - (Offset >= (fragP->fr_address + fragP->fr_fix))) - { - /* - * We need to search for the fragment containing this - * Offset - */ - for (fragP = text_frag_root; fragP; fragP = fragP->fr_next) - { - if ((Offset >= fragP->fr_address) && - (Offset < (fragP->fr_address + fragP->fr_fix))) - break; - } - /* - * If we couldn't find the frag, things are BAD!! - */ - if (fragP == 0) - error (_("Couldn't find fixup fragment when checking for indirect reference")); - } - /* - * Check for indirect PC relative addressing mode - */ - if (fragP->fr_literal[Offset - fragP->fr_address] == (char) 0xff) - { - static char Address_Mode = (char) 0xff; - - /* - * Yes: Store the indirect mode back into the image - * to fix up the damage done by STO_PICR - */ - VMS_Set_Psect (Text_Psect, Offset, OBJ_S_C_TIR); - VMS_Store_Immediate_Data (&Address_Mode, 1, OBJ_S_C_TIR); - } -} - - -/* - * If the procedure "main()" exists we have to add the instruction - * "jsb c$main_args" at the beginning to be compatible with VAX-11 "C". - * - * FIXME: the macro name `HACK_DEC_C_STARTUP' should be renamed - * to `HACK_VAXCRTL_STARTUP' because Digital's compiler - * named "DEC C" uses run-time library "DECC$SHR", but this - * startup code is for "VAXCRTL", the library for Digital's - * older "VAX C". Also, this extra code isn't needed for - * supporting gcc because it already generates the VAXCRTL - * startup call when compiling main(). The reference to - * `flag_hash_long_names' looks very suspicious too; - * probably an old-style command line option was inadvertently - * overloaded here, then blindly converted into the new one. - */ -void -vms_check_for_main () -{ - register symbolS *symbolP; -#ifdef HACK_DEC_C_STARTUP /* JF */ - register struct frchain *frchainP; - register fragS *fragP; - register fragS **prev_fragPP; - register struct fix *fixP; - register fragS *New_Frag; - int i; -#endif /* HACK_DEC_C_STARTUP */ - - symbolP = (symbolS *) symbol_find ("_main"); - if (symbolP && !S_IS_DEBUG (symbolP) && - S_IS_EXTERNAL (symbolP) && (S_GET_TYPE (symbolP) == N_TEXT)) - { -#ifdef HACK_DEC_C_STARTUP - if (!flag_hash_long_names) - { -#endif - /* - * Remember the entry point symbol - */ - Entry_Point_Symbol = symbolP; -#ifdef HACK_DEC_C_STARTUP - } - else - { - /* - * Scan all the fragment chains for the one with "_main" - * (Actually we know the fragment from the symbol, but we need - * the previous fragment so we can change its pointer) - */ - frchainP = frchain_root; - while (frchainP) - { - /* - * Scan all the fragments in this chain, remembering - * the "previous fragment" - */ - prev_fragPP = &frchainP->frch_root; - fragP = frchainP->frch_root; - while (fragP && (fragP != frchainP->frch_last)) - { - /* - * Is this the fragment? - */ - if (fragP == symbolP->sy_frag) - { - /* - * Yes: Modify the fragment by replacing - * it with a new fragment. - */ - New_Frag = (fragS *) - xmalloc (sizeof (*New_Frag) + - fragP->fr_fix + - fragP->fr_var + - 5); - /* - * The fragments are the same except - * that the "fixed" area is larger - */ - *New_Frag = *fragP; - New_Frag->fr_fix += 6; - /* - * Copy the literal data opening a hole - * 2 bytes after "_main" (i.e. just after - * the entry mask). Into which we place - * the JSB instruction. - */ - New_Frag->fr_literal[0] = fragP->fr_literal[0]; - New_Frag->fr_literal[1] = fragP->fr_literal[1]; - New_Frag->fr_literal[2] = 0x16; /* Jsb */ - New_Frag->fr_literal[3] = 0xef; - New_Frag->fr_literal[4] = 0; - New_Frag->fr_literal[5] = 0; - New_Frag->fr_literal[6] = 0; - New_Frag->fr_literal[7] = 0; - for (i = 2; i < fragP->fr_fix + fragP->fr_var; i++) - New_Frag->fr_literal[i + 6] = - fragP->fr_literal[i]; - /* - * Now replace the old fragment with the - * newly generated one. - */ - *prev_fragPP = New_Frag; - /* - * Remember the entry point symbol - */ - Entry_Point_Symbol = symbolP; - /* - * Scan the text area fixup structures - * as offsets in the fragment may have - * changed - */ - for (fixP = text_fix_root; fixP; fixP = fixP->fx_next) - { - /* - * Look for references to this - * fragment. - */ - if (fixP->fx_frag == fragP) - { - /* - * Change the fragment - * pointer - */ - fixP->fx_frag = New_Frag; - /* - * If the offset is after - * the entry mask we need - * to account for the JSB - * instruction we just - * inserted. - */ - if (fixP->fx_where >= 2) - fixP->fx_where += 6; - } - } - /* - * Scan the symbols as offsets in the - * fragment may have changed - */ - for (symbolP = symbol_rootP; - symbolP; - symbolP = symbol_next (symbolP)) - { - /* - * Look for references to this - * fragment. - */ - if (symbolP->sy_frag == fragP) - { - /* - * Change the fragment - * pointer - */ - symbolP->sy_frag = New_Frag; - /* - * If the offset is after - * the entry mask we need - * to account for the JSB - * instruction we just - * inserted. - */ - if (S_GET_VALUE (symbolP) >= 2) - S_SET_VALUE (symbolP, - S_GET_VALUE (symbolP) + 6); - } - } - /* - * Make a symbol reference to - * "_c$main_args" so we can get - * its address inserted into the - * JSB instruction. - */ - symbolP = (symbolS *) xmalloc (sizeof (*symbolP)); - S_SET_NAME (symbolP, "_C$MAIN_ARGS"); - S_SET_TYPE (symbolP, N_UNDF); - S_SET_OTHER (symbolP, 0); - S_SET_DESC (symbolP, 0); - S_SET_VALUE (symbolP, 0); - symbolP->sy_name_offset = 0; - symbolP->sy_number = 0; - symbolP->sy_obj = 0; - symbolP->sy_frag = New_Frag; - symbolP->sy_resolved = 0; - symbolP->sy_resolving = 0; - /* this actually inserts at the beginning of the list */ - symbol_append (symbol_rootP, symbolP, - &symbol_rootP, &symbol_lastP); - - symbol_rootP = symbolP; - /* - * Generate a text fixup structure - * to get "_c$main_args" stored into the - * JSB instruction. - */ - fixP = (struct fix *) xmalloc (sizeof (*fixP)); - fixP->fx_frag = New_Frag; - fixP->fx_where = 4; - fixP->fx_addsy = symbolP; - fixP->fx_subsy = 0; - fixP->fx_offset = 0; - fixP->fx_size = 4; - fixP->fx_pcrel = 1; - fixP->fx_next = text_fix_root; - text_fix_root = fixP; - /* - * Now make sure we exit from the loop - */ - frchainP = 0; - break; - } - /* - * Try the next fragment - */ - prev_fragPP = &fragP->fr_next; - fragP = fragP->fr_next; - } - /* - * Try the next fragment chain - */ - if (frchainP) - frchainP = frchainP->frch_next; - } - } -#endif /* HACK_DEC_C_STARTUP */ - } -} - - -/* - * Beginning of vms_write_object_file(). - */ - -static -struct vms_obj_state { - - /* Next program section index to use. */ - int psect_number; - - /* Psect index for code. Always ends up #0. */ - int text_psect; - - /* Psect index for initialized static variables. */ - int data_psect; - - /* Psect index for uninitialized static variables. */ - int bss_psect; - - /* Psect index for static constructors. */ - int ctors_psect; - - /* Psect index for static destructors. */ - int dtors_psect; - - /* Number of bytes used for local symbol data. */ - int local_initd_data_size; - - /* Dynamic buffer for initialized data. */ - char *data_segment; - -} vms_obj_state; - -#define Psect_Number vms_obj_state.psect_number -#define Text_Psect vms_obj_state.text_psect -#define Data_Psect vms_obj_state.data_psect -#define Bss_Psect vms_obj_state.bss_psect -#define Ctors_Psect vms_obj_state.ctors_psect -#define Dtors_Psect vms_obj_state.dtors_psect -#define Local_Initd_Data_Size vms_obj_state.local_initd_data_size -#define Data_Segment vms_obj_state.data_segment - - -#define IS_GXX_VTABLE(symP) (strncmp (S_GET_NAME (symP), "__vt.", 5) == 0) -#define IS_GXX_XTOR(symP) (strncmp (S_GET_NAME (symP), "__GLOBAL_.", 10) == 0) -#define XTOR_SIZE 4 - - -/* Perform text segment fixups. */ - -static void -vms_fixup_text_section (text_siz, text_frag_root, data_frag_root) - unsigned text_siz; - struct frag *text_frag_root; - struct frag *data_frag_root; -{ - register fragS *fragP; - register struct fix *fixP; - offsetT dif; - - /* Scan the text fragments. */ - for (fragP = text_frag_root; fragP; fragP = fragP->fr_next) - { - /* Stop if we get to the data fragments. */ - if (fragP == data_frag_root) - break; - /* Ignore fragments with no data. */ - if ((fragP->fr_fix == 0) && (fragP->fr_var == 0)) - continue; - /* Go the the appropriate offset in the Text Psect. */ - VMS_Set_Psect (Text_Psect, fragP->fr_address, OBJ_S_C_TIR); - /* Store the "fixed" part. */ - if (fragP->fr_fix) - VMS_Store_Immediate_Data (fragP->fr_literal, - fragP->fr_fix, - OBJ_S_C_TIR); - /* Store the "variable" part. */ - if (fragP->fr_var && fragP->fr_offset) - VMS_Store_Repeated_Data (fragP->fr_offset, - fragP->fr_literal + fragP->fr_fix, - fragP->fr_var, - OBJ_S_C_TIR); - } /* text frag loop */ - - /* - * Now we go through the text segment fixups and generate - * TIR records to fix up addresses within the Text Psect. - */ - for (fixP = text_fix_root; fixP; fixP = fixP->fx_next) - { - /* We DO handle the case of "Symbol - Symbol" as - long as it is in the same segment. */ - if (fixP->fx_subsy && fixP->fx_addsy) - { - /* They need to be in the same segment. */ - if (S_GET_RAW_TYPE (fixP->fx_subsy) != - S_GET_RAW_TYPE (fixP->fx_addsy)) - error (_("Fixup data addsy and subsy don't have the same type")); - /* And they need to be in one that we can check the psect on. */ - if ((S_GET_TYPE (fixP->fx_addsy) != N_DATA) && - (S_GET_TYPE (fixP->fx_addsy) != N_TEXT)) - error (_("Fixup data addsy and subsy don't have an appropriate type")); - /* This had better not be PC relative! */ - if (fixP->fx_pcrel) - error (_("Fixup data is erroneously \"pcrel\"")); - /* Subtract their values to get the difference. */ - dif = S_GET_VALUE (fixP->fx_addsy) - S_GET_VALUE (fixP->fx_subsy); - md_number_to_chars (Local, (valueT)dif, fixP->fx_size); - /* Now generate the fixup object records; - set the psect and store the data. */ - VMS_Set_Psect (Text_Psect, - fixP->fx_where + fixP->fx_frag->fr_address, - OBJ_S_C_TIR); - VMS_Store_Immediate_Data (Local, - fixP->fx_size, - OBJ_S_C_TIR); - continue; /* done with this fixup */ - } /* if fx_subsy && fx_addsy */ - /* Size will HAVE to be "long". */ - if (fixP->fx_size != 4) - error (_("Fixup datum is not a longword")); - /* Symbol must be "added" (if it is ever - subtracted we can fix this assumption). */ - if (fixP->fx_addsy == 0) - error (_("Fixup datum is not \"fixP->fx_addsy\"")); - /* Store the symbol value in a PIC fashion. */ - VMS_Store_PIC_Symbol_Reference (fixP->fx_addsy, - fixP->fx_offset, - fixP->fx_pcrel, - Text_Psect, - fixP->fx_where + fixP->fx_frag->fr_address, - OBJ_S_C_TIR); - /* - * Check for indirect address reference, which has to be fixed up - * (as the linker will screw it up with TIR_S_C_STO_PICR)... - */ - if (fixP->fx_pcrel) - VMS_Fix_Indirect_Reference (Text_Psect, - fixP->fx_where + fixP->fx_frag->fr_address, - fixP->fx_frag, - text_frag_root); - } /* text fix loop */ -} - - -/* Create a buffer holding the data segment. */ - -static void -synthesize_data_segment (data_siz, text_siz, data_frag_root) - unsigned data_siz, text_siz; - struct frag *data_frag_root; -{ - register fragS *fragP; - char *fill_literal; - long fill_size, count, i; - - /* Allocate the data segment. */ - Data_Segment = (char *) xmalloc (data_siz); - /* Run through the data fragments, filling in the segment. */ - for (fragP = data_frag_root; fragP; fragP = fragP->fr_next) - { - i = fragP->fr_address - text_siz; - if (fragP->fr_fix) - memcpy (Data_Segment + i, fragP->fr_literal, fragP->fr_fix); - i += fragP->fr_fix; - - if ((fill_size = fragP->fr_var) != 0) - { - fill_literal = fragP->fr_literal + fragP->fr_fix; - for (count = fragP->fr_offset; count; count--) - { - memcpy (Data_Segment + i, fill_literal, fill_size); - i += fill_size; - } - } - } /* data frag loop */ - - return; -} - - -/* Perform data segment fixups. */ - -static void -vms_fixup_data_section (data_siz, text_siz) - unsigned data_siz, text_siz; -{ - register struct VMS_Symbol *vsp; - register struct fix *fixP; - register symbolS *sp; - addressT fr_address; - offsetT dif; - valueT val; - - /* Run through all the data symbols and store the data. */ - for (vsp = VMS_Symbols; vsp; vsp = vsp->Next) - { - /* Ignore anything other than data symbols. */ - if (S_GET_TYPE (vsp->Symbol) != N_DATA) - continue; - /* Set the Psect + Offset. */ - VMS_Set_Psect (vsp->Psect_Index, - vsp->Psect_Offset, - OBJ_S_C_TIR); - /* Store the data. */ - val = S_GET_VALUE (vsp->Symbol); - VMS_Store_Immediate_Data (Data_Segment + val - text_siz, - vsp->Size, - OBJ_S_C_TIR); - } /* N_DATA symbol loop */ - - /* - * Now we go through the data segment fixups and generate - * TIR records to fix up addresses within the Data Psects. - */ - for (fixP = data_fix_root; fixP; fixP = fixP->fx_next) - { - /* Find the symbol for the containing datum. */ - for (vsp = VMS_Symbols; vsp; vsp = vsp->Next) - { - /* Only bother with Data symbols. */ - sp = vsp->Symbol; - if (S_GET_TYPE (sp) != N_DATA) - continue; - /* Ignore symbol if After fixup. */ - val = S_GET_VALUE (sp); - fr_address = fixP->fx_frag->fr_address; - if (val > fixP->fx_where + fr_address) - continue; - /* See if the datum is here. */ - if (val + vsp->Size <= fixP->fx_where + fr_address) - continue; - /* We DO handle the case of "Symbol - Symbol" as - long as it is in the same segment. */ - if (fixP->fx_subsy && fixP->fx_addsy) - { - /* They need to be in the same segment. */ - if (S_GET_RAW_TYPE (fixP->fx_subsy) != - S_GET_RAW_TYPE (fixP->fx_addsy)) - error (_("Fixup data addsy and subsy don't have the same type")); - /* And they need to be in one that we can check the psect on. */ - if ((S_GET_TYPE (fixP->fx_addsy) != N_DATA) && - (S_GET_TYPE (fixP->fx_addsy) != N_TEXT)) - error (_("Fixup data addsy and subsy don't have an appropriate type")); - /* This had better not be PC relative! */ - if (fixP->fx_pcrel) - error (_("Fixup data is erroneously \"pcrel\"")); - /* Subtract their values to get the difference. */ - dif = S_GET_VALUE (fixP->fx_addsy) - S_GET_VALUE (fixP->fx_subsy); - md_number_to_chars (Local, (valueT)dif, fixP->fx_size); - /* - * Now generate the fixup object records; - * set the psect and store the data. - */ - VMS_Set_Psect (vsp->Psect_Index, - fr_address + fixP->fx_where - - val + vsp->Psect_Offset, - OBJ_S_C_TIR); - VMS_Store_Immediate_Data (Local, - fixP->fx_size, - OBJ_S_C_TIR); - break; /* done with this fixup */ - } - /* Size will HAVE to be "long". */ - if (fixP->fx_size != 4) - error (_("Fixup datum is not a longword")); - /* Symbol must be "added" (if it is ever - subtracted we can fix this assumption). */ - if (fixP->fx_addsy == 0) - error (_("Fixup datum is not \"fixP->fx_addsy\"")); - /* Store the symbol value in a PIC fashion. */ - VMS_Store_PIC_Symbol_Reference (fixP->fx_addsy, - fixP->fx_offset, - fixP->fx_pcrel, - vsp->Psect_Index, - fr_address + fixP->fx_where - - val + vsp->Psect_Offset, - OBJ_S_C_TIR); - /* Done with this fixup. */ - break; - } /* vms_symbol loop */ - - } /* data fix loop */ -} - -/* Perform ctors/dtors segment fixups. */ - -static void -vms_fixup_xtors_section (symbols, sect_no) - struct VMS_Symbol *symbols; - int sect_no; -{ - register struct VMS_Symbol *vsp; - - /* Run through all the symbols and store the data. */ - for (vsp = symbols; vsp; vsp = vsp->Next) - { - register symbolS *sp; - - /* Set relocation base. */ - VMS_Set_Psect (vsp->Psect_Index, vsp->Psect_Offset, OBJ_S_C_TIR); - - sp = vsp->Symbol; - /* Stack the Psect base with its offset. */ - VMS_Set_Data (Text_Psect, S_GET_VALUE (sp), OBJ_S_C_TIR, 0); - } - /* Flush the buffer if it is more than 75% full. */ - if (Object_Record_Offset > (sizeof (Object_Record_Buffer) * 3 / 4)) - Flush_VMS_Object_Record_Buffer (); - - return; -} - - -/* Define symbols for the linker. */ - -static void -global_symbol_directory (text_siz, data_siz) - unsigned text_siz, data_siz; -{ - register fragS *fragP; - register symbolS *sp; - register struct VMS_Symbol *vsp; - int Globalref, define_as_global_symbol; - -#if 0 - /* The g++ compiler does not write out external references to - vtables correctly. Check for this and holler if we see it - happening. If that compiler bug is ever fixed we can remove - this. - - (Jun'95: gcc 2.7.0's cc1plus still exhibits this behavior.) - - This was reportedly fixed as of June 2, 1998. */ - - for (sp = symbol_rootP; sp; sp = symbol_next (sp)) - if (S_GET_RAW_TYPE (sp) == N_UNDF && IS_GXX_VTABLE (sp)) - { - S_SET_TYPE (sp, N_UNDF | N_EXT); - S_SET_OTHER (sp, 1); - as_warn (_("g++ wrote an extern reference to `%s' as a routine.\nI will fix it, but I hope that it was note really a routine."), - S_GET_NAME (sp)); - } -#endif - - /* - * Now scan the symbols and emit the appropriate GSD records - */ - for (sp = symbol_rootP; sp; sp = symbol_next (sp)) - { - define_as_global_symbol = 0; - vsp = 0; - /* Dispatch on symbol type. */ - switch (S_GET_RAW_TYPE (sp)) - { - - /* Global uninitialized data. */ - case N_UNDF | N_EXT: - /* Make a VMS data symbol entry. */ - vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp); - vsp->Symbol = sp; - vsp->Size = S_GET_VALUE (sp); - vsp->Psect_Index = Psect_Number++; - vsp->Psect_Offset = 0; - vsp->Next = VMS_Symbols; - VMS_Symbols = vsp; - sp->sy_obj = vsp; - /* Make the psect for this data. */ - Globalref = VMS_Psect_Spec (S_GET_NAME (sp), - vsp->Size, - S_GET_OTHER (sp) ? ps_CONST : ps_COMMON, - vsp); - if (Globalref) - Psect_Number--; -#ifdef NOT_VAX_11_C_COMPATIBLE - define_as_global_symbol = 1; -#else - /* See if this is an external vtable. We want to help the - linker find these things in libraries, so we make a symbol - reference. This is not compatible with VAX-C usage for - variables, but since vtables are only used internally by - g++, we can get away with this hack. */ - define_as_global_symbol = IS_GXX_VTABLE (sp); -#endif - break; - - /* Local uninitialized data. */ - case N_BSS: - /* Make a VMS data symbol entry. */ - vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp); - vsp->Symbol = sp; - vsp->Size = 0; - vsp->Psect_Index = Bss_Psect; - vsp->Psect_Offset = S_GET_VALUE (sp) - bss_address_frag.fr_address; - vsp->Next = VMS_Symbols; - VMS_Symbols = vsp; - sp->sy_obj = vsp; - break; - - /* Global initialized data. */ - case N_DATA | N_EXT: - /* Make a VMS data symbol entry. */ - vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp); - vsp->Symbol = sp; - vsp->Size = VMS_Initialized_Data_Size (sp, text_siz + data_siz); - vsp->Psect_Index = Psect_Number++; - vsp->Psect_Offset = 0; - vsp->Next = VMS_Symbols; - VMS_Symbols = vsp; - sp->sy_obj = vsp; - /* Make its psect. */ - Globalref = VMS_Psect_Spec (S_GET_NAME (sp), - vsp->Size, - S_GET_OTHER (sp) ? ps_CONST : ps_COMMON, - vsp); - if (Globalref) - Psect_Number--; -#ifdef NOT_VAX_11_C_COMPATIBLE - define_as_global_symbol = 1; -#else - /* See N_UNDF|N_EXT above for explanation. */ - define_as_global_symbol = IS_GXX_VTABLE (sp); -#endif - break; - - /* Local initialized data. */ - case N_DATA: - { - char *sym_name = S_GET_NAME (sp); - - /* Always suppress local numeric labels. */ - if (sym_name && strcmp (sym_name, FAKE_LABEL_NAME) == 0) - break; - - /* Make a VMS data symbol entry. */ - vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp); - vsp->Symbol = sp; - vsp->Size = VMS_Initialized_Data_Size (sp, text_siz + data_siz); - vsp->Psect_Index = Data_Psect; - vsp->Psect_Offset = Local_Initd_Data_Size; - Local_Initd_Data_Size += vsp->Size; - vsp->Next = VMS_Symbols; - VMS_Symbols = vsp; - sp->sy_obj = vsp; - } - break; - - /* Global Text definition. */ - case N_TEXT | N_EXT: - { - - if (IS_GXX_XTOR (sp)) - { - vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp); - vsp->Symbol = sp; - vsp->Size = XTOR_SIZE; - sp->sy_obj = vsp; - switch ((S_GET_NAME (sp))[10]) - { - case 'I': - vsp->Psect_Index = Ctors_Psect; - vsp->Psect_Offset = (Ctors_Symbols==0)?0:(Ctors_Symbols->Psect_Offset+XTOR_SIZE); - vsp->Next = Ctors_Symbols; - Ctors_Symbols = vsp; - break; - case 'D': - vsp->Psect_Index = Dtors_Psect; - vsp->Psect_Offset = (Dtors_Symbols==0)?0:(Dtors_Symbols->Psect_Offset+XTOR_SIZE); - vsp->Next = Dtors_Symbols; - Dtors_Symbols = vsp; - break; - case 'G': - as_warn (_("Can't handle global xtors symbols yet.")); - break; - default: - as_warn (_("Unknown %s"), S_GET_NAME (sp)); - break; - } - } - else - { - unsigned short Entry_Mask; - - /* Get the entry mask. */ - fragP = sp->sy_frag; - /* First frag might be empty if we're generating listings. - So skip empty rs_fill frags. */ - while (fragP && fragP->fr_type == rs_fill && fragP->fr_fix == 0) - fragP = fragP->fr_next; - - /* If first frag doesn't contain the data, what do we do? - If it's possibly smaller than two bytes, that would - imply that the entry mask is not stored where we're - expecting it. - - If you can find a test case that triggers this, report - it (and tell me what the entry mask field ought to be), - and I'll try to fix it. KR */ - if (fragP->fr_fix < 2) - abort (); - - Entry_Mask = (fragP->fr_literal[0] & 0x00ff) | - ((fragP->fr_literal[1] & 0x00ff) << 8); - /* Define the procedure entry point. */ - VMS_Procedure_Entry_Pt (S_GET_NAME (sp), - Text_Psect, - S_GET_VALUE (sp), - Entry_Mask); - } - break; - } - - /* Local Text definition. */ - case N_TEXT: - /* Make a VMS data symbol entry. */ - if (Text_Psect != -1) - { - vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp); - vsp->Symbol = sp; - vsp->Size = 0; - vsp->Psect_Index = Text_Psect; - vsp->Psect_Offset = S_GET_VALUE (sp); - vsp->Next = VMS_Symbols; - VMS_Symbols = vsp; - sp->sy_obj = vsp; - } - break; - - /* Global Reference. */ - case N_UNDF: - /* Make a GSD global symbol reference record. */ - VMS_Global_Symbol_Spec (S_GET_NAME (sp), - 0, - 0, - GBLSYM_REF); - break; - - /* Absolute symbol. */ - case N_ABS: - case N_ABS | N_EXT: - /* gcc doesn't generate these; - VMS_Emit_Globalvalue handles them though. */ - vsp = (struct VMS_Symbol *) xmalloc (sizeof *vsp); - vsp->Symbol = sp; - vsp->Size = 4; /* always assume 32 bits */ - vsp->Psect_Index = 0; - vsp->Psect_Offset = S_GET_VALUE (sp); - vsp->Next = VMS_Symbols; - VMS_Symbols = vsp; - sp->sy_obj = vsp; - break; - - /* Anything else. */ - default: - /* Ignore STAB symbols, including .stabs emitted by g++. */ - if (S_IS_DEBUG (sp) || (S_GET_TYPE (sp) == 22)) - break; - /* - * Error otherwise. - */ - as_tsktsk (_("unhandled stab type %d"), S_GET_TYPE (sp)); - break; - } - - /* Global symbols have different linkage than external variables. */ - if (define_as_global_symbol) - VMS_Global_Symbol_Spec (S_GET_NAME (sp), - vsp->Psect_Index, - 0, - GBLSYM_DEF); - } - - return; -} - - -/* Output debugger symbol table information for symbols which - are local to a specific routine. */ - -static void -local_symbols_DST (s0P, Current_Routine) - symbolS *s0P, *Current_Routine; -{ - symbolS *s1P; - char *s0P_name, *pnt0, *pnt1; - - s0P_name = S_GET_NAME (s0P); - if (*s0P_name++ != '_') - return; - - for (s1P = Current_Routine; s1P; s1P = symbol_next (s1P)) - { -#if 0 /* redundant; RAW_TYPE != N_FUN suffices */ - if (!S_IS_DEBUG (s1P)) - continue; -#endif - if (S_GET_RAW_TYPE (s1P) != N_FUN) - continue; - pnt0 = s0P_name; - pnt1 = S_GET_NAME (s1P); - /* We assume the two strings are never exactly equal... */ - while (*pnt0++ == *pnt1++) - { - } - /* Found it if s0P name is exhausted and s1P name has ":F" or ":f" next. - Note: both pointers have advanced one past the non-matching char. */ - if ((*pnt1 == 'F' || *pnt1 == 'f') && *--pnt1 == ':' && *--pnt0 == '\0') - { - Define_Routine (s1P, 0, Current_Routine, Text_Psect); - return; - } - } -} - - -/* Construct and output the debug symbol table. */ - -static void -vms_build_DST (text_siz) - unsigned text_siz; -{ - register symbolS *symbolP; - symbolS *Current_Routine = 0; - struct input_file *Cur_File = 0; - offsetT Cur_Offset = -1; - int Cur_Line_Number = 0; - int File_Number = 0; - int Debugger_Offset = 0; - int file_available; - int dsc; - offsetT val; - - /* Write the Traceback Begin Module record. */ - VMS_TBT_Module_Begin (); - - /* - * Output debugging info for global variables and static variables - * that are not specific to one routine. We also need to examine - * all stabs directives, to find the definitions to all of the - * advanced data types, and this is done by VMS_LSYM_Parse. This - * needs to be done before any definitions are output to the object - * file, since there can be forward references in the stabs - * directives. When through with parsing, the text of the stabs - * directive is altered, with the definitions removed, so that later - * passes will see directives as they would be written if the type - * were already defined. - * - * We also look for files and include files, and make a list of - * them. We examine the source file numbers to establish the actual - * lines that code was generated from, and then generate offsets. - */ - VMS_LSYM_Parse (); - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - /* Only deal with STAB symbols here. */ - if (!S_IS_DEBUG (symbolP)) - continue; - /* - * Dispatch on STAB type. - */ - switch (S_GET_RAW_TYPE (symbolP)) - { - case N_SLINE: - dsc = S_GET_DESC (symbolP); - if (dsc > Cur_File->max_line) - Cur_File->max_line = dsc; - if (dsc < Cur_File->min_line) - Cur_File->min_line = dsc; - break; - case N_SO: - Cur_File = find_file (symbolP); - Cur_File->flag = 1; - Cur_File->min_line = 1; - break; - case N_SOL: - Cur_File = find_file (symbolP); - break; - case N_GSYM: - VMS_GSYM_Parse (symbolP, Text_Psect); - break; - case N_LCSYM: - VMS_LCSYM_Parse (symbolP, Text_Psect); - break; - case N_FUN: /* For static constant symbols */ - case N_STSYM: - VMS_STSYM_Parse (symbolP, Text_Psect); - break; - default: - break; - } /* switch */ - } /* for */ - - /* - * Now we take a quick sweep through the files and assign offsets - * to each one. This will essentially be the starting line number to - * the debugger for each file. Output the info for the debugger to - * specify the files, and then tell it how many lines to use. - */ - for (Cur_File = file_root; Cur_File; Cur_File = Cur_File->next) - { - if (Cur_File->max_line == 0) - continue; - if ((strncmp (Cur_File->name, "GNU_GXX_INCLUDE:", 16) == 0) && - !flag_debug) - continue; - if ((strncmp (Cur_File->name, "GNU_CC_INCLUDE:", 15) == 0) && - !flag_debug) - continue; - /* show a few extra lines at the start of the region selected */ - if (Cur_File->min_line > 2) - Cur_File->min_line -= 2; - Cur_File->offset = Debugger_Offset - Cur_File->min_line + 1; - Debugger_Offset += Cur_File->max_line - Cur_File->min_line + 1; - if (Cur_File->same_file_fpnt) - { - Cur_File->file_number = Cur_File->same_file_fpnt->file_number; - } - else - { - Cur_File->file_number = ++File_Number; - file_available = VMS_TBT_Source_File (Cur_File->name, - Cur_File->file_number); - if (!file_available) - { - Cur_File->file_number = 0; - File_Number--; - continue; - } - } - VMS_TBT_Source_Lines (Cur_File->file_number, - Cur_File->min_line, - Cur_File->max_line - Cur_File->min_line + 1); - } /* for */ - Cur_File = (struct input_file *) NULL; - - /* - * Scan the symbols and write out the routines - * (this makes the assumption that symbols are in - * order of ascending text segment offset) - */ - for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP)) - { - /* - * Deal with text symbols. - */ - if (!S_IS_DEBUG (symbolP) && S_GET_TYPE (symbolP) == N_TEXT) - { - /* - * Ignore symbols starting with "L", as they are local symbols. - */ - if (*S_GET_NAME (symbolP) == 'L') - continue; - /* - * If there is a routine start defined, terminate it. - */ - if (Current_Routine) - VMS_TBT_Routine_End (text_siz, Current_Routine); - - /* - * Check for & skip dummy labels like "gcc_compiled.". - * They're identified by the IN_DEFAULT_SECTION flag. - */ - if ((S_GET_OTHER (symbolP) & IN_DEFAULT_SECTION) != 0 && - S_GET_VALUE (symbolP) == 0) - continue; - /* - * Store the routine begin traceback info. - */ - VMS_TBT_Routine_Begin (symbolP, Text_Psect); - Current_Routine = symbolP; - /* - * Define symbols local to this routine. - */ - local_symbols_DST (symbolP, Current_Routine); - /* - * Done - */ - continue; - - } - /* - * Deal with STAB symbols. - */ - else if (S_IS_DEBUG (symbolP)) - { - /* - * Dispatch on STAB type. - */ - switch (S_GET_RAW_TYPE (symbolP)) - { - /* - * Line number - */ - case N_SLINE: - /* Offset the line into the correct portion of the file. */ - if (Cur_File->file_number == 0) - break; - val = S_GET_VALUE (symbolP); - /* Sometimes the same offset gets several source lines - assigned to it. We should be selective about which - lines we allow, we should prefer lines that are in - the main source file when debugging inline functions. */ - if (val == Cur_Offset && Cur_File->file_number != 1) - break; - - /* calculate actual debugger source line */ - dsc = S_GET_DESC (symbolP) + Cur_File->offset; - S_SET_DESC (symbolP, dsc); - /* - * Define PC/Line correlation. - */ - if (Cur_Offset == -1) - { - /* - * First N_SLINE; set up initial correlation. - */ - VMS_TBT_Line_PC_Correlation (dsc, - val, - Text_Psect, - 0); - } - else if ((dsc - Cur_Line_Number) <= 0) - { - /* - * Line delta is not +ve, we need to close the line and - * start a new PC/Line correlation. - */ - VMS_TBT_Line_PC_Correlation (0, - val - Cur_Offset, - 0, - -1); - VMS_TBT_Line_PC_Correlation (dsc, - val, - Text_Psect, - 0); - } - else - { - /* - * Line delta is +ve, all is well. - */ - VMS_TBT_Line_PC_Correlation (dsc - Cur_Line_Number, - val - Cur_Offset, - 0, - 1); - } - /* Update the current line/PC info. */ - Cur_Line_Number = dsc; - Cur_Offset = val; - break; - - /* - * Source file - */ - case N_SO: - /* Remember that we had a source file and emit - the source file debugger record. */ - Cur_File = find_file (symbolP); - break; - - case N_SOL: - /* We need to make sure that we are really in the actual - source file when we compute the maximum line number. - Otherwise the debugger gets really confused. */ - Cur_File = find_file (symbolP); - break; - - default: - break; - } /* switch */ - } /* if (IS_DEBUG) */ - } /* for */ - - /* - * If there is a routine start defined, terminate it - * (and the line numbers). - */ - if (Current_Routine) - { - /* Terminate the line numbers. */ - VMS_TBT_Line_PC_Correlation (0, - text_siz - S_GET_VALUE (Current_Routine), - 0, - -1); - /* Terminate the routine. */ - VMS_TBT_Routine_End (text_siz, Current_Routine); - } - - /* Write the Traceback End Module TBT record. */ - VMS_TBT_Module_End (); -} - - -/* Write a VAX/VMS object file (everything else has been done!). */ - -void -vms_write_object_file (text_siz, data_siz, bss_siz, text_frag_root, - data_frag_root) - unsigned text_siz; - unsigned data_siz; - unsigned bss_siz; - fragS *text_frag_root; - fragS *data_frag_root; -{ - register struct VMS_Symbol *vsp; - - /* - * Initialize program section indices; values get updated later. - */ - Psect_Number = 0; /* next Psect Index to use */ - Text_Psect = -1; /* Text Psect Index */ - Data_Psect = -2; /* Data Psect Index JF: Was -1 */ - Bss_Psect = -3; /* Bss Psect Index JF: Was -1 */ - Ctors_Psect = -4; /* Ctors Psect Index */ - Dtors_Psect = -5; /* Dtors Psect Index */ - /* Initialize other state variables. */ - Data_Segment = 0; - Local_Initd_Data_Size = 0; - - /* - * Create the actual output file and populate it with required - * "module header" information. - */ - Create_VMS_Object_File (); - Write_VMS_MHD_Records (); - - /* - * Create the Data segment: - * - * Since this is REALLY hard to do any other way, - * we actually manufacture the data segment and - * then store the appropriate values out of it. - * We need to generate this early, so that globalvalues - * can be properly emitted. - */ - if (data_siz > 0) - synthesize_data_segment (data_siz, text_siz, data_frag_root); - - - /******* Global Symbol Directory *******/ - - /* - * Emit globalvalues now. We must do this before the text psect is - * defined, or we will get linker warnings about multiply defined - * symbols. All of the globalvalues "reference" psect 0, although - * it really does not have anything to do with it. - */ - VMS_Emit_Globalvalues (text_siz, data_siz, Data_Segment); - /* - * Define the Text Psect - */ - Text_Psect = Psect_Number++; - VMS_Psect_Spec ("$code", text_siz, ps_TEXT, 0); - /* - * Define the BSS Psect - */ - if (bss_siz > 0) - { - Bss_Psect = Psect_Number++; - VMS_Psect_Spec ("$uninitialized_data", bss_siz, ps_DATA, 0); - } - /* - * Define symbols to the linker. - */ - global_symbol_directory (text_siz, data_siz); - /* - * Define the Data Psect - */ - if (data_siz > 0 && Local_Initd_Data_Size > 0) - { - Data_Psect = Psect_Number++; - VMS_Psect_Spec ("$data", Local_Initd_Data_Size, ps_DATA, 0); - /* - * Local initialized data (N_DATA) symbols need to be updated to the - * proper value of Data_Psect now that it's actually been defined. - * (A dummy value was used in global_symbol_directory() above.) - */ - for (vsp = VMS_Symbols; vsp; vsp = vsp->Next) - if (vsp->Psect_Index < 0 && S_GET_RAW_TYPE (vsp->Symbol) == N_DATA) - vsp->Psect_Index = Data_Psect; - } - - - if (Ctors_Symbols != 0) - { - char *ps_name = "$ctors"; - Ctors_Psect = Psect_Number++; - VMS_Psect_Spec (ps_name, Ctors_Symbols->Psect_Offset + XTOR_SIZE, - ps_CTORS, 0); - VMS_Global_Symbol_Spec (ps_name, Ctors_Psect, - 0, GBLSYM_DEF|GBLSYM_WEAK); - for (vsp = Ctors_Symbols; vsp; vsp = vsp->Next) - vsp->Psect_Index = Ctors_Psect; - } - - if (Dtors_Symbols != 0) - { - char *ps_name = "$dtors"; - Dtors_Psect = Psect_Number++; - VMS_Psect_Spec (ps_name, Dtors_Symbols->Psect_Offset + XTOR_SIZE, - ps_DTORS, 0); - VMS_Global_Symbol_Spec (ps_name, Dtors_Psect, - 0, GBLSYM_DEF|GBLSYM_WEAK); - for (vsp = Dtors_Symbols; vsp; vsp = vsp->Next) - vsp->Psect_Index = Dtors_Psect; - } - - /******* Text Information and Relocation Records *******/ - - /* - * Write the text segment data - */ - if (text_siz > 0) - vms_fixup_text_section (text_siz, text_frag_root, data_frag_root); - /* - * Write the data segment data, then discard it. - */ - if (data_siz > 0) - { - vms_fixup_data_section (data_siz, text_siz); - free (Data_Segment), Data_Segment = 0; - } - - if (Ctors_Symbols != 0) - { - vms_fixup_xtors_section (Ctors_Symbols, Ctors_Psect); - } - - if (Dtors_Symbols != 0) - { - vms_fixup_xtors_section (Dtors_Symbols, Dtors_Psect); - } - - - /******* Debugger Symbol Table Records *******/ - - vms_build_DST (text_siz); - - - /******* Wrap things up *******/ - - /* - * Write the End Of Module record - */ - if (Entry_Point_Symbol) - Write_VMS_EOM_Record (Text_Psect, S_GET_VALUE (Entry_Point_Symbol)); - else - Write_VMS_EOM_Record (-1, (valueT) 0); - - /* - * All done, close the object file - */ - Close_VMS_Object_File (); -} - -/* end of obj-vms.c */ diff --git a/gas/config/obj-vms.h b/gas/config/obj-vms.h deleted file mode 100644 index ad8fdce00dd..00000000000 --- a/gas/config/obj-vms.h +++ /dev/null @@ -1,551 +0,0 @@ -/* VMS object file format - Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 97, 1999 - Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as -published by the Free Software Foundation; either version 2, -or (at your option) any later version. - -GAS is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -/* Tag to validate a.out object file format processing */ -#define OBJ_VMS 1 - -#include "targ-cpu.h" - -#define LONGWORD_ALIGNMENT 2 - -/* This macro controls subsection alignment within a section. - * - * Under VAX/VMS, the linker (and PSECT specifications) - * take care of correctly aligning the segments. - * Doing the alignment here (on initialized data) can - * mess up the calculation of global data PSECT sizes. - */ -#define SUB_SEGMENT_ALIGN(SEG) \ - (((SEG) == data_section) ? 0 : LONGWORD_ALIGNMENT) - -/* This flag is used to remember whether we are in the const or the - data section. By and large they are identical, but we set a no-write - bit for psects in the const section. */ - -extern unsigned char const_flag; - -/* This is overloaded onto const_flag, for convenience. It's used to flag - dummy labels like "gcc2_compiled." which occur before the first .text - or .data section directive. */ - -#define IN_DEFAULT_SECTION 0x80 - -/* These are defined in obj-vms.c. */ -extern const short seg_N_TYPE[]; -extern const segT N_TYPE_seg[]; - -#undef NO_RELOC -enum reloc_type - { - NO_RELOC, RELOC_32 - }; - -#define N_BADMAG(x) (0) -#define N_TXTOFF(x) ( sizeof(struct exec) ) -#define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text ) -#define N_TROFF(x) ( N_DATOFF(x) + (x).a_data ) -#define N_DROFF(x) ( N_TROFF(x) + (x).a_trsize ) -#define N_SYMOFF(x) ( N_DROFF(x) + (x).a_drsize ) -#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms ) - -/* We use this copy of the exec header for VMS. We do not actually use it, but - what we actually do is let gas fill in the relevant slots, and when we get - around to writing an obj file, we just pick out what we need. */ - -struct exec -{ - unsigned long a_text; /* length of text, in bytes */ - unsigned long a_data; /* length of data, in bytes */ - unsigned long a_bss; /* length of uninitialized data area for file, in bytes */ - unsigned long a_trsize; /* length of relocation info for text, in bytes */ - unsigned long a_drsize; /* length of relocation info for data, in bytes */ - unsigned long a_entry; /* start address */ - unsigned long a_syms; /* length of symbol table data in file, in bytes */ -}; - -typedef struct - { - struct exec header; /* a.out header */ - long string_table_size; /* names + '\0' + sizeof(int) */ - } -object_headers; - -/* A single entry in the symbol table - * (this started as a clone of bout.h's nlist, but much was unneeded). - */ -struct nlist - { - char *n_name; - unsigned char n_type; /* See below */ - unsigned char n_other; /* used for const_flag and "default section" */ - unsigned : 16; /* padding for alignment */ - int n_desc; /* source line number for N_SLINE stabs */ - }; - -/* Legal values of n_type (see aout/stab.def for the majority of the codes). - */ -#define N_UNDF 0 /* Undefined symbol */ -#define N_ABS 2 /* Absolute symbol */ -#define N_TEXT 4 /* Text symbol */ -#define N_DATA 6 /* Data symbol */ -#define N_BSS 8 /* BSS symbol */ -#define N_FN 31 /* Filename symbol */ - -#define N_EXT 1 /* External symbol (OR'd in with one of above) */ -#define N_TYPE 036 /* Mask for all the type bits */ - -#define N_STAB 0340 /* Mask for all bits used for SDB entries */ - -#include "aout/stab_gnu.h" - -/* SYMBOL TABLE */ -/* Symbol table entry data type */ - -typedef struct nlist obj_symbol_type; /* Symbol table entry */ - -/* Symbol table macros and constants */ - -#define OBJ_SYMFIELD_TYPE struct VMS_Symbol * - -/* - * Macros to extract information from a symbol table entry. - * This syntaxic indirection allows independence regarding a.out or coff. - * The argument (s) of all these macros is a pointer to a symbol table entry. - */ - -/* True if the symbol is external */ -#define S_IS_EXTERNAL(s) ((s)->sy_symbol.n_type & N_EXT) - -/* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */ -#define S_IS_DEFINED(s) (S_GET_TYPE(s) != N_UNDF) - -#define S_IS_COMMON(s) (S_GET_TYPE(s) == N_UNDF && S_GET_VALUE(s) != 0) - -#define S_IS_REGISTER(s) ((s)->sy_symbol.n_type == N_REGISTER) - -/* True if a debug special symbol entry */ -#define S_IS_DEBUG(s) ((s)->sy_symbol.n_type & N_STAB) -/* True if a symbol is local symbol name */ -/* A symbol name whose name begin with ^A is a gas internal pseudo symbol - nameless symbols come from .stab directives. */ -#define S_IS_LOCAL(s) (S_GET_NAME(s) && \ - !S_IS_DEBUG(s) && \ - (strchr(S_GET_NAME(s), '\001') != 0 || \ - strchr(S_GET_NAME(s), '\002') != 0 || \ - (S_LOCAL_NAME(s) && !flag_keep_locals))) -/* True if a symbol is not defined in this file */ -#define S_IS_EXTERN(s) ((s)->sy_symbol.n_type & N_EXT) -/* True if the symbol has been generated because of a .stabd directive */ -#define S_IS_STABD(s) (S_GET_NAME(s) == (char *)0) - -/* Accessors */ -/* The name of the symbol */ -#define S_GET_NAME(s) ((s)->sy_symbol.n_name) -/* The pointer to the string table */ -#define S_GET_OFFSET(s) ((s)->sy_name_offset) -/* The raw type of the symbol */ -#define S_GET_RAW_TYPE(s) ((s)->sy_symbol.n_type) -/* The type of the symbol */ -#define S_GET_TYPE(s) ((s)->sy_symbol.n_type & N_TYPE) -/* The numeric value of the segment */ -#define S_GET_SEGMENT(s) (N_TYPE_seg[S_GET_TYPE(s)]) -/* The n_other expression value */ -#define S_GET_OTHER(s) ((s)->sy_symbol.n_other) -/* The n_desc expression value */ -#define S_GET_DESC(s) ((s)->sy_symbol.n_desc) - -/* Modifiers */ -/* Assume that a symbol cannot be simultaneously in more than on segment */ -/* set segment */ -#define S_SET_SEGMENT(s,seg) ((s)->sy_symbol.n_type &= ~N_TYPE,(s)->sy_symbol.n_type|=SEGMENT_TO_SYMBOL_TYPE(seg)) -/* The symbol is external */ -#define S_SET_EXTERNAL(s) ((s)->sy_symbol.n_type |= N_EXT) -/* The symbol is not external */ -#define S_CLEAR_EXTERNAL(s) ((s)->sy_symbol.n_type &= ~N_EXT) -/* Set the name of the symbol */ -#define S_SET_NAME(s,v) ((s)->sy_symbol.n_name = (v)) -/* Set the offset in the string table */ -#define S_SET_OFFSET(s,v) ((s)->sy_name_offset = (v)) -/* Set the n_other expression value */ -#define S_SET_OTHER(s,v) ((s)->sy_symbol.n_other = (v)) -/* Set the n_desc expression value */ -#define S_SET_DESC(s,v) ((s)->sy_symbol.n_desc = (v)) -/* Set the n_type expression value */ -#define S_SET_TYPE(s,v) ((s)->sy_symbol.n_type = (v)) - - -/* File header macro and type definition */ - -#define H_GET_TEXT_SIZE(h) ((h)->header.a_text) -#define H_GET_DATA_SIZE(h) ((h)->header.a_data) -#define H_GET_BSS_SIZE(h) ((h)->header.a_bss) - -#define H_SET_TEXT_SIZE(h,v) ((h)->header.a_text = md_section_align(SEG_TEXT, (v))) -#define H_SET_DATA_SIZE(h,v) ((h)->header.a_data = md_section_align(SEG_DATA, (v))) -#define H_SET_BSS_SIZE(h,v) ((h)->header.a_bss = md_section_align(SEG_BSS, (v))) - -#define H_SET_STRING_SIZE(h,v) ((h)->string_table_size = (v)) -#define H_SET_SYMBOL_TABLE_SIZE(h,v) ((h)->header.a_syms = (v) * \ - sizeof(struct nlist)) - -/* line numbering stuff. */ -#define OBJ_EMIT_LINENO(a, b, c) {;} - -#define obj_symbol_new_hook(s) {;} - -/* Force structure tags into scope so that their use in prototypes - will never be their first occurance. */ -struct fix; -struct frag; - -/* obj-vms routines visible to the rest of gas. */ - -extern void tc_aout_fix_to_chars PARAMS ((char *,struct fix *,relax_addressT)); - -extern int vms_resolve_symbol_redef PARAMS ((symbolS *)); -#define RESOLVE_SYMBOL_REDEFINITION(X) vms_resolve_symbol_redef(X) - -/* Compiler-generated label "__vax_g_doubles" is used to augment .stabs. */ -extern void vms_check_for_special_label PARAMS ((symbolS *)); -#define obj_frob_label(X) vms_check_for_special_label(X) - -extern void vms_check_for_main PARAMS ((void)); - -extern void vms_write_object_file PARAMS ((unsigned,unsigned,unsigned, - struct frag *,struct frag *)); - -/* VMS executables are nothing like a.out, but the VMS port of gcc uses - a.out format stabs which obj-vms.c then translates. */ - -#define AOUT_STABS - - -#ifdef WANT_VMS_OBJ_DEFS - -/* The rest of this file contains definitions for constants used within - the actual VMS object file. We do not use a $ in the symbols (as per - usual VMS convention) since System V gags on it. */ - -#define OBJ_S_C_HDR 0 -#define OBJ_S_C_HDR_MHD 0 -#define OBJ_S_C_HDR_LNM 1 -#define OBJ_S_C_HDR_SRC 2 -#define OBJ_S_C_HDR_TTL 3 -#define OBJ_S_C_HDR_CPR 4 -#define OBJ_S_C_HDR_MTC 5 -#define OBJ_S_C_HDR_GTX 6 -#define OBJ_S_C_GSD 1 -#define OBJ_S_C_GSD_PSC 0 -#define OBJ_S_C_GSD_SYM 1 -#define OBJ_S_C_GSD_EPM 2 -#define OBJ_S_C_GSD_PRO 3 -#define OBJ_S_C_GSD_SYMW 4 -#define OBJ_S_C_GSD_EPMW 5 -#define OBJ_S_C_GSD_PROW 6 -#define OBJ_S_C_GSD_IDC 7 -#define OBJ_S_C_GSD_ENV 8 -#define OBJ_S_C_GSD_LSY 9 -#define OBJ_S_C_GSD_LEPM 10 -#define OBJ_S_C_GSD_LPRO 11 -#define OBJ_S_C_GSD_SPSC 12 -#define OBJ_S_C_TIR 2 -#define OBJ_S_C_EOM 3 -#define OBJ_S_C_DBG 4 -#define OBJ_S_C_TBT 5 -#define OBJ_S_C_LNK 6 -#define OBJ_S_C_EOMW 7 -#define OBJ_S_C_MAXRECTYP 7 -#define OBJ_S_K_SUBTYP 1 -#define OBJ_S_C_SUBTYP 1 -#define OBJ_S_C_MAXRECSIZ 2048 -#define OBJ_S_C_STRLVL 0 -#define OBJ_S_C_SYMSIZ 31 -#define OBJ_S_C_STOREPLIM -1 -#define OBJ_S_C_PSCALILIM 9 - -#define MHD_S_C_MHD 0 -#define MHD_S_C_LNM 1 -#define MHD_S_C_SRC 2 -#define MHD_S_C_TTL 3 -#define MHD_S_C_CPR 4 -#define MHD_S_C_MTC 5 -#define MHD_S_C_GTX 6 -#define MHD_S_C_MAXHDRTYP 6 - -#define GSD_S_K_ENTRIES 1 -#define GSD_S_C_ENTRIES 1 -#define GSD_S_C_PSC 0 -#define GSD_S_C_SYM 1 -#define GSD_S_C_EPM 2 -#define GSD_S_C_PRO 3 -#define GSD_S_C_SYMW 4 -#define GSD_S_C_EPMW 5 -#define GSD_S_C_PROW 6 -#define GSD_S_C_IDC 7 -#define GSD_S_C_ENV 8 -#define GSD_S_C_LSY 9 -#define GSD_S_C_LEPM 10 -#define GSD_S_C_LPRO 11 -#define GSD_S_C_SPSC 12 -#define GSD_S_C_SYMV 13 -#define GSD_S_C_EPMV 14 -#define GSD_S_C_PROV 15 -#define GSD_S_C_MAXRECTYP 15 - -#define GSY_S_M_WEAK 1 -#define GSY_S_M_DEF 2 -#define GSY_S_M_UNI 4 -#define GSY_S_M_REL 8 - -#define LSY_S_M_DEF 2 -#define LSY_S_M_REL 8 - -#define ENV_S_M_DEF 1 -#define ENV_S_M_NESTED 2 - -#define GPS_S_M_PIC 1 -#define GPS_S_M_LIB 2 -#define GPS_S_M_OVR 4 -#define GPS_S_M_REL 8 -#define GPS_S_M_GBL 16 -#define GPS_S_M_SHR 32 -#define GPS_S_M_EXE 64 -#define GPS_S_M_RD 128 -#define GPS_S_M_WRT 256 -#define GPS_S_M_VEC 512 -#define GPS_S_K_NAME 9 -#define GPS_S_C_NAME 9 - -#define TIR_S_C_STA_GBL 0 -#define TIR_S_C_STA_SB 1 -#define TIR_S_C_STA_SW 2 -#define TIR_S_C_STA_LW 3 -#define TIR_S_C_STA_PB 4 -#define TIR_S_C_STA_PW 5 -#define TIR_S_C_STA_PL 6 -#define TIR_S_C_STA_UB 7 -#define TIR_S_C_STA_UW 8 -#define TIR_S_C_STA_BFI 9 -#define TIR_S_C_STA_WFI 10 -#define TIR_S_C_STA_LFI 11 -#define TIR_S_C_STA_EPM 12 -#define TIR_S_C_STA_CKARG 13 -#define TIR_S_C_STA_WPB 14 -#define TIR_S_C_STA_WPW 15 -#define TIR_S_C_STA_WPL 16 -#define TIR_S_C_STA_LSY 17 -#define TIR_S_C_STA_LIT 18 -#define TIR_S_C_STA_LEPM 19 -#define TIR_S_C_MAXSTACOD 19 -#define TIR_S_C_MINSTOCOD 20 -#define TIR_S_C_STO_SB 20 -#define TIR_S_C_STO_SW 21 -#define TIR_S_C_STO_L 22 -#define TIR_S_C_STO_BD 23 -#define TIR_S_C_STO_WD 24 -#define TIR_S_C_STO_LD 25 -#define TIR_S_C_STO_LI 26 -#define TIR_S_C_STO_PIDR 27 -#define TIR_S_C_STO_PICR 28 -#define TIR_S_C_STO_RSB 29 -#define TIR_S_C_STO_RSW 30 -#define TIR_S_C_STO_RL 31 -#define TIR_S_C_STO_VPS 32 -#define TIR_S_C_STO_USB 33 -#define TIR_S_C_STO_USW 34 -#define TIR_S_C_STO_RUB 35 -#define TIR_S_C_STO_RUW 36 -#define TIR_S_C_STO_B 37 -#define TIR_S_C_STO_W 38 -#define TIR_S_C_STO_RB 39 -#define TIR_S_C_STO_RW 40 -#define TIR_S_C_STO_RIVB 41 -#define TIR_S_C_STO_PIRR 42 -#define TIR_S_C_MAXSTOCOD 42 -#define TIR_S_C_MINOPRCOD 50 -#define TIR_S_C_OPR_NOP 50 -#define TIR_S_C_OPR_ADD 51 -#define TIR_S_C_OPR_SUB 52 -#define TIR_S_C_OPR_MUL 53 -#define TIR_S_C_OPR_DIV 54 -#define TIR_S_C_OPR_AND 55 -#define TIR_S_C_OPR_IOR 56 -#define TIR_S_C_OPR_EOR 57 -#define TIR_S_C_OPR_NEG 58 -#define TIR_S_C_OPR_COM 59 -#define TIR_S_C_OPR_INSV 60 -#define TIR_S_C_OPR_ASH 61 -#define TIR_S_C_OPR_USH 62 -#define TIR_S_C_OPR_ROT 63 -#define TIR_S_C_OPR_SEL 64 -#define TIR_S_C_OPR_REDEF 65 -#define TIR_S_C_OPR_DFLIT 66 -#define TIR_S_C_MAXOPRCOD 66 -#define TIR_S_C_MINCTLCOD 80 -#define TIR_S_C_CTL_SETRB 80 -#define TIR_S_C_CTL_AUGRB 81 -#define TIR_S_C_CTL_DFLOC 82 -#define TIR_S_C_CTL_STLOC 83 -#define TIR_S_C_CTL_STKDL 84 -#define TIR_S_C_MAXCTLCOD 84 - -/* - * Debugger symbol definitions: These are done by hand, as no - * machine-readable version seems - * to be available. - */ -#define DST_S_C_C 7 /* Language == "C" */ -#define DST_S_C_CXX 15 /* Language == "C++" */ -#define DST_S_C_VERSION 153 -#define DST_S_C_SOURCE 155 /* Source file */ -#define DST_S_C_PROLOG 162 -#define DST_S_C_BLKBEG 176 /* Beginning of block */ -#define DST_S_C_BLKEND 177 /* End of block */ -#define DST_S_C_ENTRY 181 -#define DST_S_C_PSECT 184 -#define DST_S_C_LINE_NUM 185 /* Line Number */ -#define DST_S_C_LBLORLIT 186 -#define DST_S_C_LABEL 187 -#define DST_S_C_MODBEG 188 /* Beginning of module */ -#define DST_S_C_MODEND 189 /* End of module */ -#define DST_S_C_RTNBEG 190 /* Beginning of routine */ -#define DST_S_C_RTNEND 191 /* End of routine */ -#define DST_S_C_DELTA_PC_W 1 /* Incr PC */ -#define DST_S_C_INCR_LINUM 2 /* Incr Line # */ -#define DST_S_C_INCR_LINUM_W 3 /* Incr Line # */ -#define DST_S_C_SET_LINUM_INCR 4 -#define DST_S_C_SET_LINUM_INCR_W 5 -#define DST_S_C_RESET_LINUM_INCR 6 -#define DST_S_C_BEG_STMT_MODE 7 -#define DST_S_C_END_STMT_MODE 8 -#define DST_S_C_SET_LINE_NUM 9 /* Set Line # */ -#define DST_S_C_SET_PC 10 -#define DST_S_C_SET_PC_W 11 -#define DST_S_C_SET_PC_L 12 -#define DST_S_C_SET_STMTNUM 13 -#define DST_S_C_TERM 14 /* End of lines */ -#define DST_S_C_TERM_W 15 /* End of lines */ -#define DST_S_C_SET_ABS_PC 16 /* Set PC */ -#define DST_S_C_DELTA_PC_L 17 /* Incr PC */ -#define DST_S_C_INCR_LINUM_L 18 /* Incr Line # */ -#define DST_S_C_SET_LINUM_B 19 /* Set Line # */ -#define DST_S_C_SET_LINUM_L 20 /* Set Line # */ -#define DST_S_C_TERM_L 21 /* End of lines */ -/* these are used with DST_S_C_SOURCE */ -#define DST_S_C_SRC_DECLFILE 1 /* Declare source file */ -#define DST_S_C_SRC_SETFILE 2 /* Set source file */ -#define DST_S_C_SRC_SETREC_L 3 /* Set record, longword value */ -#define DST_S_C_SRC_SETREC_W 4 /* Set record, word value */ -#define DST_S_C_SRC_DEFLINES_W 10 /* # of line, word counter */ -#define DST_S_C_SRC_DEFLINES_B 11 /* # of line, byte counter */ -#define DST_S_C_SRC_FORMFEED 16 /* ^L counts as a record */ -/* the following are the codes for the various data types. Anything not on - * the list is included under 'advanced_type' - */ -#define DBG_S_C_UCHAR 0x02 -#define DBG_S_C_USINT 0x03 -#define DBG_S_C_ULINT 0x04 -#define DBG_S_C_UQUAD 0x05 -#define DBG_S_C_SCHAR 0x06 -#define DBG_S_C_SSINT 0x07 -#define DBG_S_C_SLINT 0x08 -#define DBG_S_C_SQUAD 0x09 -#define DBG_S_C_REAL4 0x0a -#define DBG_S_C_REAL8 0x0b /* D_float double */ -#define DBG_S_C_COMPLX4 0x0c /* 2xF_float complex float */ -#define DBG_S_C_COMPLX8 0x0d /* 2xD_float complex double */ -#define DBG_S_C_REAL8_G 0x1b /* G_float double */ -#define DBG_S_C_COMPLX8_G 0x1d /* 2xG_float complex double */ -#define DBG_S_C_FUNCTION_ADDR 0x17 -#define DBG_S_C_ADVANCED_TYPE 0xa3 -/* Some of these are just for future reference. [pr] - */ -#define DBG_S_C_UBITA 0x01 /* unsigned, aligned bit field */ -#define DBG_S_C_UBITU 0x22 /* unsigned, unaligned bit field */ -#define DBG_S_C_SBITA 0x29 /* signed, aligned bit field */ -#define DBG_S_C_SBITU 0x2a /* signed, unaligned bit field */ -#define DBG_S_C_CSTRING 0x2e /* asciz ('\0' terminated) string */ -#define DBG_S_C_WCHAR 0x38 /* wchar_t */ -/* These are descriptor class codes. - */ -#define DSC_K_CLASS_S 0x01 /* static (fixed length) */ -#define DSC_K_CLASS_D 0x02 /* dynamic string (not via malloc!) */ -#define DSC_K_CLASS_A 0x04 /* array */ -#define DSC_K_CLASS_UBS 0x0d /* unaligned bit string */ -/* These are the codes that are used to generate the definitions of struct - * union and enum records - */ -#define DBG_S_C_ENUM_ITEM 0xa4 -#define DBG_S_C_ENUM_START 0xa5 -#define DBG_S_C_ENUM_END 0xa6 -#define DBG_S_C_STRUCT_ITEM DST_K_VFLAGS_BITOFFS /* 0xff */ -#define DBG_S_C_STRUCT_START 0xab -#define DBG_S_C_STRUCT_END 0xac -#define DST_K_TYPSPEC 0xaf /* type specification */ -/* These codes are used in the generation of the symbol definition records - */ -#define DST_K_VFLAGS_NOVAL 0x80 /* struct definition only */ -#define DST_K_VFLAGS_DSC 0xfa /* descriptor used */ -#define DST_K_VFLAGS_TVS 0xfb /* trailing value specified */ -#define DST_K_VS_FOLLOWS 0xfd /* value spec follows */ -#define DST_K_VFLAGS_BITOFFS 0xff /* value contains bit offset */ -#define DST_K_VALKIND_LITERAL 0 -#define DST_K_VALKIND_ADDR 1 -#define DST_K_VALKIND_DESC 2 -#define DST_K_VALKIND_REG 3 -#define DST_K_REG_VAX_AP 0x0c /* R12 */ -#define DST_K_REG_VAX_FP 0x0d /* R13 */ -#define DST_K_REG_VAX_SP 0x0e /* R14 */ -#define DST_V_VALKIND 0 /* offset of valkind field */ -#define DST_V_INDIRECT 2 /* offset to indirect bit */ -#define DST_V_DISP 3 /* offset to displacement bit */ -#define DST_V_REGNUM 4 /* offset to register number */ -#define DST_M_INDIRECT (1< -#include "as.h" - -#include "opcode/a29k.h" - -/* Make it easier to clone this machine desc into another one. */ -#define machine_opcode a29k_opcode -#define machine_opcodes a29k_opcodes -#define machine_ip a29k_ip -#define machine_it a29k_it - -#define IMMEDIATE_BIT 0x01000000 /* Turns RB into Immediate */ -#define ABSOLUTE_BIT 0x01000000 /* Turns PC-relative to Absolute */ -#define CE_BIT 0x00800000 /* Coprocessor enable in LOAD */ -#define UI_BIT 0x00000080 /* Unsigned integer in CONVERT */ - -/* handle of the OPCODE hash table */ -static struct hash_control *op_hash = NULL; - -struct machine_it - { - char *error; - unsigned long opcode; - struct nlist *nlistp; - expressionS exp; - int pcrel; - int reloc_offset; /* Offset of reloc within insn */ - - int reloc; - } -the_insn; - -static void machine_ip PARAMS ((char *str)); -/* static void print_insn PARAMS ((struct machine_it *insn)); */ -#ifndef OBJ_COFF -static void s_data1 PARAMS ((void)); -static void s_use PARAMS ((int)); -#endif - -const pseudo_typeS -md_pseudo_table[] = -{ - {"align", s_align_bytes, 4}, - {"block", s_space, 0}, - {"cputype", s_ignore, 0}, /* CPU as 29000 or 29050 */ - {"reg", s_lsym, 0}, /* Register equate, same as equ */ - {"space", s_ignore, 0}, /* Listing control */ - {"sect", s_ignore, 0}, /* Creation of coff sections */ -#ifndef OBJ_COFF - /* We can do this right with coff. */ - {"use", s_use, 0}, -#endif - {"word", cons, 4}, - {NULL, 0, 0}, -}; - -#if defined(BFD_HEADERS) -#ifdef RELSZ -const int md_reloc_size = RELSZ; /* Coff headers */ -#else -const int md_reloc_size = 12; /* something else headers */ -#endif -#else -const int md_reloc_size = 12; /* Not bfdized*/ -#endif - -/* This array holds the chars that always start a comment. If the - pre-processor is disabled, these aren't very useful */ -const char comment_chars[] = ";"; - -/* This array holds the chars that only start a comment at the beginning of - a line. If the line seems to have the form '# 123 filename' - .line and .file directives will appear in the pre-processed output */ -/* Note that input_file.c hand checks for '#' at the beginning of the - first line of the input file. This is because the compiler outputs - #NO_APP at the beginning of its output. */ -/* Also note that comments like this one will always work */ -const char line_comment_chars[] = "#"; - -/* We needed an unused char for line separation to work around the - lack of macros, using sed and such. */ -const char line_separator_chars[] = "@"; - -/* Chars that can be used to separate mant from exp in floating point nums */ -const char EXP_CHARS[] = "eE"; - -/* Chars that mean this number is a floating point constant */ -/* As in 0f12.456 */ -/* or 0d1.2345e12 */ -const char FLT_CHARS[] = "rRsSfFdDxXpP"; - -/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be - changed in read.c. Ideally it shouldn't have to know about it at - all, but nothing is ideal around here. */ - -/* - * anull bit - causes the branch delay slot instructions to not be executed - */ -#define ANNUL (1 << 29) - -#ifndef OBJ_COFF - -static void -s_use (ignore) - int ignore; -{ - if (strncmp (input_line_pointer, ".text", 5) == 0) - { - input_line_pointer += 5; - s_text (0); - return; - } - if (strncmp (input_line_pointer, ".data", 5) == 0) - { - input_line_pointer += 5; - s_data (0); - return; - } - if (strncmp (input_line_pointer, ".data1", 6) == 0) - { - input_line_pointer += 6; - s_data1 (); - return; - } - /* Literals can't go in the text segment because you can't read from - instruction memory on some 29k's. So, into initialized data. */ - if (strncmp (input_line_pointer, ".lit", 4) == 0) - { - input_line_pointer += 4; - subseg_set (SEG_DATA, 200); - demand_empty_rest_of_line (); - return; - } - - as_bad (_("Unknown segment type")); - demand_empty_rest_of_line (); -} - -static void -s_data1 () -{ - subseg_set (SEG_DATA, 1); - demand_empty_rest_of_line (); -} - -#endif /* OBJ_COFF */ - -/* Install symbol definition that maps REGNAME to REGNO. - FIXME-SOON: These are not recognized in mixed case. */ - -static void -insert_sreg (regname, regnum) - char *regname; - int regnum; -{ - /* FIXME-SOON, put something in these syms so they won't be output - to the symbol table of the resulting object file. */ - - /* Must be large enough to hold the names of the special registers. */ - char buf[80]; - int i; - - symbol_table_insert (symbol_new (regname, SEG_REGISTER, (valueT) regnum, - &zero_address_frag)); - for (i = 0; regname[i]; i++) - buf[i] = islower (regname[i]) ? toupper (regname[i]) : regname[i]; - buf[i] = '\0'; - - symbol_table_insert (symbol_new (buf, SEG_REGISTER, (valueT) regnum, - &zero_address_frag)); -} - -/* Install symbol definitions for assorted special registers. - See ASM29K Ref page 2-9. */ - -void -define_some_regs () -{ -#define SREG 256 - - /* Protected special-purpose register names */ - insert_sreg ("vab", SREG + 0); - insert_sreg ("ops", SREG + 1); - insert_sreg ("cps", SREG + 2); - insert_sreg ("cfg", SREG + 3); - insert_sreg ("cha", SREG + 4); - insert_sreg ("chd", SREG + 5); - insert_sreg ("chc", SREG + 6); - insert_sreg ("rbp", SREG + 7); - insert_sreg ("tmc", SREG + 8); - insert_sreg ("tmr", SREG + 9); - insert_sreg ("pc0", SREG + 10); - insert_sreg ("pc1", SREG + 11); - insert_sreg ("pc2", SREG + 12); - insert_sreg ("mmu", SREG + 13); - insert_sreg ("lru", SREG + 14); - - /* Additional protected special-purpose registers for the 29050 */ - insert_sreg ("rsn", SREG + 15); - insert_sreg ("rma0", SREG + 16); - insert_sreg ("rmc0", SREG + 17); - insert_sreg ("rma1", SREG + 18); - insert_sreg ("rmc1", SREG + 19); - insert_sreg ("spc0", SREG + 20); - insert_sreg ("spc1", SREG + 21); - insert_sreg ("spc2", SREG + 22); - insert_sreg ("iba0", SREG + 23); - insert_sreg ("ibc0", SREG + 24); - insert_sreg ("iba1", SREG + 25); - insert_sreg ("ibc1", SREG + 26); - - /* Additional registers for the 29040. */ - insert_sreg ("dba", SREG + 27); - insert_sreg ("dbc", SREG + 28); - insert_sreg ("cir", SREG + 29); - insert_sreg ("cdr", SREG + 30); - - /* Unprotected special-purpose register names */ - insert_sreg ("ipc", SREG + 128); - insert_sreg ("ipa", SREG + 129); - insert_sreg ("ipb", SREG + 130); - insert_sreg ("q", SREG + 131); - insert_sreg ("alu", SREG + 132); - insert_sreg ("bp", SREG + 133); - insert_sreg ("fc", SREG + 134); - insert_sreg ("cr", SREG + 135); - insert_sreg ("fpe", SREG + 160); - insert_sreg ("inte", SREG + 161); - insert_sreg ("fps", SREG + 162); - /* "", SREG+163); Reserved */ - insert_sreg ("exop", SREG + 164); -} - -/* This function is called once, at assembler startup time. It should - set up all the tables, etc., that the MD part of the assembler will - need. */ -void -md_begin () -{ - register const char *retval = NULL; - int lose = 0; - register int skipnext = 0; - register unsigned int i; - register char *strend, *strend2; - - /* Hash up all the opcodes for fast use later. */ - - op_hash = hash_new (); - - for (i = 0; i < num_opcodes; i++) - { - const char *name = machine_opcodes[i].name; - - if (skipnext) - { - skipnext = 0; - continue; - } - - /* Hack to avoid multiple opcode entries. We pre-locate all the - variations (b/i field and P/A field) and handle them. */ - - if (!strcmp (name, machine_opcodes[i + 1].name)) - { - if ((machine_opcodes[i].opcode & 0x01000000) != 0 - || (machine_opcodes[i + 1].opcode & 0x01000000) == 0 - || ((machine_opcodes[i].opcode | 0x01000000) - != machine_opcodes[i + 1].opcode)) - goto bad_table; - strend = machine_opcodes[i].args + strlen (machine_opcodes[i].args) - 1; - strend2 = machine_opcodes[i + 1].args + strlen (machine_opcodes[i + 1].args) - 1; - switch (*strend) - { - case 'b': - if (*strend2 != 'i') - goto bad_table; - break; - case 'P': - if (*strend2 != 'A') - goto bad_table; - break; - default: - bad_table: - fprintf (stderr, "internal error: can't handle opcode %s\n", - name); - lose = 1; - } - - /* OK, this is an i/b or A/P pair. We skip the - higher-valued one, and let the code for operand checking - handle OR-ing in the bit. */ - skipnext = 1; - } - - retval = hash_insert (op_hash, name, (PTR) &machine_opcodes[i]); - if (retval != NULL) - { - fprintf (stderr, "internal error: can't hash `%s': %s\n", - machine_opcodes[i].name, retval); - lose = 1; - } - } - - if (lose) - as_fatal (_("Broken assembler. No assembly attempted.")); - - define_some_regs (); -} - -/* Assemble a single instruction. Its label has already been handled - by the generic front end. We just parse opcode and operands, and - produce the bytes of data and relocation. */ - -void -md_assemble (str) - char *str; -{ - char *toP; - - know (str); - machine_ip (str); - toP = frag_more (4); - /* put out the opcode */ - md_number_to_chars (toP, the_insn.opcode, 4); - - /* put out the symbol-dependent stuff */ - if (the_insn.reloc != NO_RELOC) - { - fix_new_exp (frag_now, - (toP - frag_now->fr_literal + the_insn.reloc_offset), - 4, /* size */ - &the_insn.exp, - the_insn.pcrel, - the_insn.reloc); - } -} - -char * -parse_operand (s, operandp, opt) - char *s; - expressionS *operandp; - int opt; -{ - char *save = input_line_pointer; - char *new; - - input_line_pointer = s; - expression (operandp); - if (operandp->X_op == O_absent && ! opt) - as_bad (_("missing operand")); - new = input_line_pointer; - input_line_pointer = save; - return new; -} - -/* Instruction parsing. Takes a string containing the opcode. - Operands are at input_line_pointer. Output is in the_insn. - Warnings or errors are generated. */ - -static void -machine_ip (str) - char *str; -{ - char *s; - const char *args; - struct machine_opcode *insn; - char *argsStart; - unsigned long opcode; - expressionS the_operand; - expressionS *operand = &the_operand; - unsigned int reg; - - /* Must handle `div0' opcode. */ - s = str; - if (isalpha (*s)) - for (; isalnum (*s); ++s) - if (isupper (*s)) - *s = tolower (*s); - - switch (*s) - { - case '\0': - break; - - case ' ': /* FIXME-SOMEDAY more whitespace */ - *s++ = '\0'; - break; - - default: - as_bad (_("Unknown opcode: `%s'"), str); - return; - } - if ((insn = (struct machine_opcode *) hash_find (op_hash, str)) == NULL) - { - as_bad (_("Unknown opcode `%s'."), str); - return; - } - argsStart = s; - opcode = insn->opcode; - memset (&the_insn, '\0', sizeof (the_insn)); - the_insn.reloc = NO_RELOC; - - /* Build the opcode, checking as we go to make sure that the - operands match. - - If an operand matches, we modify the_insn or opcode appropriately, - and do a "continue". If an operand fails to match, we "break". */ - - if (insn->args[0] != '\0') - { - /* Prime the pump. */ - s = parse_operand (s, operand, insn->args[0] == 'I'); - } - - for (args = insn->args;; ++args) - { - switch (*args) - { - - case '\0': /* end of args */ - if (*s == '\0') - { - /* We are truly done. */ - the_insn.opcode = opcode; - return; - } - as_bad (_("Too many operands: %s"), s); - break; - - case ',': /* Must match a comma */ - if (*s++ == ',') - { - /* Parse next operand. */ - s = parse_operand (s, operand, args[1] == 'I'); - continue; - } - break; - - case 'v': /* Trap numbers (immediate field) */ - if (operand->X_op == O_constant) - { - if (operand->X_add_number < 256) - { - opcode |= (operand->X_add_number << 16); - continue; - } - else - { - as_bad (_("Immediate value of %ld is too large"), - (long) operand->X_add_number); - continue; - } - } - the_insn.reloc = RELOC_8; - the_insn.reloc_offset = 1; /* BIG-ENDIAN Byte 1 of insn */ - the_insn.exp = *operand; - continue; - - case 'b': /* A general register or 8-bit immediate */ - case 'i': - /* We treat the two cases identically since we mashed - them together in the opcode table. */ - if (operand->X_op == O_register) - goto general_reg; - - /* Make sure the 'i' case really exists. */ - if ((insn->opcode | IMMEDIATE_BIT) != (insn + 1)->opcode) - break; - - opcode |= IMMEDIATE_BIT; - if (operand->X_op == O_constant) - { - if (operand->X_add_number < 256) - { - opcode |= operand->X_add_number; - continue; - } - else - { - as_bad (_("Immediate value of %ld is too large"), - (long) operand->X_add_number); - continue; - } - } - the_insn.reloc = RELOC_8; - the_insn.reloc_offset = 3; /* BIG-ENDIAN Byte 3 of insn */ - the_insn.exp = *operand; - continue; - - case 'a': /* next operand must be a register */ - case 'c': - general_reg: - /* lrNNN or grNNN or %%expr or a user-def register name */ - if (operand->X_op != O_register) - break; /* Only registers */ - know (operand->X_add_symbol == 0); - know (operand->X_op_symbol == 0); - reg = operand->X_add_number; - if (reg >= SREG) - break; /* No special registers */ - - /* Got the register, now figure out where it goes in the - opcode. */ - switch (*args) - { - case 'a': - opcode |= reg << 8; - continue; - - case 'b': - case 'i': - opcode |= reg; - continue; - - case 'c': - opcode |= reg << 16; - continue; - } - as_fatal (_("failed sanity check.")); - break; - - case 'x': /* 16 bit constant, zero-extended */ - case 'X': /* 16 bit constant, one-extended */ - if (operand->X_op == O_constant) - { - opcode |= (operand->X_add_number & 0xFF) << 0 | - ((operand->X_add_number & 0xFF00) << 8); - continue; - } - the_insn.reloc = RELOC_CONST; - the_insn.exp = *operand; - continue; - - case 'h': - if (operand->X_op == O_constant) - { - opcode |= (operand->X_add_number & 0x00FF0000) >> 16 | - (((unsigned long) operand->X_add_number - /* avoid sign ext */ & 0xFF000000) >> 8); - continue; - } - the_insn.reloc = RELOC_CONSTH; - the_insn.exp = *operand; - continue; - - case 'P': /* PC-relative jump address */ - case 'A': /* Absolute jump address */ - /* These two are treated together since we folded the - opcode table entries together. */ - if (operand->X_op == O_constant) - { - /* Make sure the 'A' case really exists. */ - if ((insn->opcode | ABSOLUTE_BIT) != (insn + 1)->opcode) - break; - { - bfd_vma v, mask; - mask = 0x1ffff; - v = operand->X_add_number & ~ mask; - if (v) - as_bad ("call/jmp target out of range"); - } - opcode |= ABSOLUTE_BIT | - (operand->X_add_number & 0x0003FC00) << 6 | - ((operand->X_add_number & 0x000003FC) >> 2); - continue; - } - the_insn.reloc = RELOC_JUMPTARG; - the_insn.exp = *operand; - the_insn.pcrel = 1; /* Assume PC-relative jump */ - /* FIXME-SOON, Do we figure out whether abs later, after - know sym val? */ - continue; - - case 'e': /* Coprocessor enable bit for LOAD/STORE insn */ - if (operand->X_op == O_constant) - { - if (operand->X_add_number == 0) - continue; - if (operand->X_add_number == 1) - { - opcode |= CE_BIT; - continue; - } - } - break; - - case 'n': /* Control bits for LOAD/STORE instructions */ - if (operand->X_op == O_constant && - operand->X_add_number < 128) - { - opcode |= (operand->X_add_number << 16); - continue; - } - break; - - case 's': /* Special register number */ - if (operand->X_op != O_register) - break; /* Only registers */ - if (operand->X_add_number < SREG) - break; /* Not a special register */ - opcode |= (operand->X_add_number & 0xFF) << 8; - continue; - - case 'u': /* UI bit of CONVERT */ - if (operand->X_op == O_constant) - { - if (operand->X_add_number == 0) - continue; - if (operand->X_add_number == 1) - { - opcode |= UI_BIT; - continue; - } - } - break; - - case 'r': /* RND bits of CONVERT */ - if (operand->X_op == O_constant && - operand->X_add_number < 8) - { - opcode |= operand->X_add_number << 4; - continue; - } - break; - - case 'I': /* ID bits of INV and IRETINV. */ - /* This operand is optional. */ - if (operand->X_op == O_absent) - continue; - else if (operand->X_op == O_constant - && operand->X_add_number < 4) - { - opcode |= operand->X_add_number << 16; - continue; - } - break; - - case 'd': /* FD bits of CONVERT */ - if (operand->X_op == O_constant && - operand->X_add_number < 4) - { - opcode |= operand->X_add_number << 2; - continue; - } - break; - - - case 'f': /* FS bits of CONVERT */ - if (operand->X_op == O_constant && - operand->X_add_number < 4) - { - opcode |= operand->X_add_number << 0; - continue; - } - break; - - case 'C': - if (operand->X_op == O_constant && - operand->X_add_number < 4) - { - opcode |= operand->X_add_number << 16; - continue; - } - break; - - case 'F': - if (operand->X_op == O_constant && - operand->X_add_number < 16) - { - opcode |= operand->X_add_number << 18; - continue; - } - break; - - default: - BAD_CASE (*args); - } - /* Types or values of args don't match. */ - as_bad ("Invalid operands"); - return; - } -} - -/* This is identical to the md_atof in m68k.c. I think this is right, - but I'm not sure. - - Turn a string in input_line_pointer into a floating point constant - of type type, and store the appropriate bytes in *litP. The number - of LITTLENUMS emitted is stored in *sizeP . An error message is - returned, or NULL on OK. */ - -/* Equal to MAX_PRECISION in atof-ieee.c */ -#define MAX_LITTLENUMS 6 - -char * -md_atof (type, litP, sizeP) - char type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - LITTLENUM_TYPE *wordP; - char *t; - - switch (type) - { - - case 'f': - case 'F': - case 's': - case 'S': - prec = 2; - break; - - case 'd': - case 'D': - case 'r': - case 'R': - prec = 4; - break; - - case 'x': - case 'X': - prec = 6; - break; - - case 'p': - case 'P': - prec = 6; - break; - - default: - *sizeP = 0; - return "Bad call to MD_ATOF()"; - } - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - *sizeP = prec * sizeof (LITTLENUM_TYPE); - for (wordP = words; prec--;) - { - md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - return 0; -} - -/* - * Write out big-endian. - */ -void -md_number_to_chars (buf, val, n) - char *buf; - valueT val; - int n; -{ - number_to_chars_bigendian (buf, val, n); -} - -void -md_apply_fix (fixP, val) - fixS *fixP; - long val; -{ - char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; - - fixP->fx_addnumber = val; /* Remember value for emit_reloc */ - - - know (fixP->fx_size == 4); - know (fixP->fx_r_type < NO_RELOC); - - /* This is a hack. There should be a better way to handle this. */ - if (fixP->fx_r_type == RELOC_WDISP30 && fixP->fx_addsy) - { - val += fixP->fx_where + fixP->fx_frag->fr_address; - } - - switch (fixP->fx_r_type) - { - - case RELOC_32: - buf[0] = val >> 24; - buf[1] = val >> 16; - buf[2] = val >> 8; - buf[3] = val; - break; - - case RELOC_8: - buf[0] = val; - break; - - case RELOC_WDISP30: - val = (val >>= 2) + 1; - buf[0] |= (val >> 24) & 0x3f; - buf[1] = (val >> 16); - buf[2] = val >> 8; - buf[3] = val; - break; - - case RELOC_HI22: - buf[1] |= (val >> 26) & 0x3f; - buf[2] = val >> 18; - buf[3] = val >> 10; - break; - - case RELOC_LO10: - buf[2] |= (val >> 8) & 0x03; - buf[3] = val; - break; - - case RELOC_BASE13: - buf[2] |= (val >> 8) & 0x1f; - buf[3] = val; - break; - - case RELOC_WDISP22: - val = (val >>= 2) + 1; - /* FALLTHROUGH */ - case RELOC_BASE22: - buf[1] |= (val >> 16) & 0x3f; - buf[2] = val >> 8; - buf[3] = val; - break; - - case RELOC_JUMPTARG: /* 00XX00XX pattern in a word */ - if (!fixP->fx_done) - { - /* The linker tries to support both AMD and old GNU style - R_IREL relocs. That means that if the addend is exactly - the negative of the address within the section, the - linker will not handle it correctly. */ - if (fixP->fx_pcrel - && val != 0 - && val == - (fixP->fx_frag->fr_address + fixP->fx_where)) - as_bad_where - (fixP->fx_file, fixP->fx_line, - "the linker will not handle this relocation correctly"); - } - else if (fixP->fx_pcrel) - { - long v = val >> 17; - if (v != 0 && v != -1) - as_bad_where (fixP->fx_file, fixP->fx_line, - "call/jmp target out of range"); - } - else - /* this case was supposed to be handled in machine_ip */ - abort (); - buf[1] = val >> 10; /* Holds bits 0003FFFC of address */ - buf[3] = val >> 2; - break; - - case RELOC_CONST: /* 00XX00XX pattern in a word */ - buf[1] = val >> 8; /* Holds bits 0000XXXX */ - buf[3] = val; - break; - - case RELOC_CONSTH: /* 00XX00XX pattern in a word */ - buf[1] = val >> 24; /* Holds bits XXXX0000 */ - buf[3] = val >> 16; - break; - - case NO_RELOC: - default: - as_bad (_("bad relocation type: 0x%02x"), fixP->fx_r_type); - break; - } -} - -#ifdef OBJ_COFF -short -tc_coff_fix2rtype (fixP) - fixS *fixP; -{ - - switch (fixP->fx_r_type) - { - case RELOC_32: - return (R_WORD); - case RELOC_8: - return (R_BYTE); - case RELOC_CONST: - return (R_ILOHALF); - case RELOC_CONSTH: - return (R_IHIHALF); - case RELOC_JUMPTARG: - return (R_IREL); - default: - printf (_("need %o3\n"), fixP->fx_r_type); - abort (); - } /* switch on type */ - - return (0); -} - -#endif /* OBJ_COFF */ - -/* should never be called for 29k */ -void -md_convert_frag (headers, seg, fragP) - object_headers *headers; - segT seg; - register fragS *fragP; -{ - as_fatal (_("a29k_convert_frag\n")); -} - -/* should never be called for a29k */ -int -md_estimate_size_before_relax (fragP, segtype) - register fragS *fragP; - segT segtype; -{ - as_fatal (_("a29k_estimate_size_before_relax\n")); - return 0; -} - -#if 0 -/* for debugging only */ -static void -print_insn (insn) - struct machine_it *insn; -{ - char *Reloc[] = - { - "RELOC_8", - "RELOC_16", - "RELOC_32", - "RELOC_DISP8", - "RELOC_DISP16", - "RELOC_DISP32", - "RELOC_WDISP30", - "RELOC_WDISP22", - "RELOC_HI22", - "RELOC_22", - "RELOC_13", - "RELOC_LO10", - "RELOC_SFA_BASE", - "RELOC_SFA_OFF13", - "RELOC_BASE10", - "RELOC_BASE13", - "RELOC_BASE22", - "RELOC_PC10", - "RELOC_PC22", - "RELOC_JMP_TBL", - "RELOC_SEGOFF16", - "RELOC_GLOB_DAT", - "RELOC_JMP_SLOT", - "RELOC_RELATIVE", - "NO_RELOC" - }; - - if (insn->error) - { - fprintf (stderr, "ERROR: %s\n"); - } - fprintf (stderr, "opcode=0x%08x\n", insn->opcode); - fprintf (stderr, "reloc = %s\n", Reloc[insn->reloc]); - fprintf (stderr, "exp = {\n"); - fprintf (stderr, "\t\tX_add_symbol = %s\n", - insn->exp.X_add_symbol ? - (S_GET_NAME (insn->exp.X_add_symbol) ? - S_GET_NAME (insn->exp.X_add_symbol) : "???") : "0"); - fprintf (stderr, "\t\tX_op_symbol = %s\n", - insn->exp.X_op_symbol ? - (S_GET_NAME (insn->exp.X_op_symbol) ? - S_GET_NAME (insn->exp.X_op_symbol) : "???") : "0"); - fprintf (stderr, "\t\tX_add_number = %d\n", - insn->exp.X_add_number); - fprintf (stderr, "}\n"); -} - -#endif - -/* Translate internal representation of relocation info to target format. - - On sparc/29k: first 4 bytes are normal unsigned long address, next three - bytes are index, most sig. byte first. Byte 7 is broken up with - bit 7 as external, bits 6 & 5 unused, and the lower - five bits as relocation type. Next 4 bytes are long addend. */ -/* Thanx and a tip of the hat to Michael Bloom, mb@ttidca.tti.com */ - -#ifdef OBJ_AOUT - -void -tc_aout_fix_to_chars (where, fixP, segment_address_in_file) - char *where; - fixS *fixP; - relax_addressT segment_address_in_file; -{ - long r_symbolnum; - - know (fixP->fx_r_type < NO_RELOC); - know (fixP->fx_addsy != NULL); - - md_number_to_chars (where, - fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file, - 4); - - r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy) - ? S_GET_TYPE (fixP->fx_addsy) - : fixP->fx_addsy->sy_number); - - where[4] = (r_symbolnum >> 16) & 0x0ff; - where[5] = (r_symbolnum >> 8) & 0x0ff; - where[6] = r_symbolnum & 0x0ff; - where[7] = (((!S_IS_DEFINED (fixP->fx_addsy)) << 7) & 0x80) | (0 & 0x60) | (fixP->fx_r_type & 0x1F); - /* Also easy */ - md_number_to_chars (&where[8], fixP->fx_addnumber, 4); -} - -#endif /* OBJ_AOUT */ - -CONST char *md_shortopts = ""; -struct option md_longopts[] = { - {NULL, no_argument, NULL, 0} -}; -size_t md_longopts_size = sizeof(md_longopts); - -int -md_parse_option (c, arg) - int c; - char *arg; -{ - return 0; -} - -void -md_show_usage (stream) - FILE *stream; -{ -} - -/* This is called when a line is unrecognized. This is used to handle - definitions of a29k style local labels. */ - -int -a29k_unrecognized_line (c) - int c; -{ - int lab; - char *s; - - if (c != '$' - || ! isdigit ((unsigned char) input_line_pointer[0])) - return 0; - - s = input_line_pointer; - - lab = 0; - while (isdigit ((unsigned char) *s)) - { - lab = lab * 10 + *s - '0'; - ++s; - } - - if (*s != ':') - { - /* Not a label definition. */ - return 0; - } - - if (dollar_label_defined (lab)) - { - as_bad (_("label \"$%d\" redefined"), lab); - return 0; - } - - define_dollar_label (lab); - colon (dollar_label_name (lab, 0)); - input_line_pointer = s + 1; - - return 1; -} - -/* Default the values of symbols known that should be "predefined". We - don't bother to predefine them unless you actually use one, since there - are a lot of them. */ - -symbolS * -md_undefined_symbol (name) - char *name; -{ - long regnum; - char testbuf[5 + /*SLOP*/ 5]; - - if (name[0] == 'g' || name[0] == 'G' - || name[0] == 'l' || name[0] == 'L' - || name[0] == 's' || name[0] == 'S') - { - /* Perhaps a global or local register name */ - if (name[1] == 'r' || name[1] == 'R') - { - long maxreg; - - /* Parse the number, make sure it has no extra zeroes or - trailing chars. */ - regnum = atol (&name[2]); - - if (name[0] == 's' || name[0] == 'S') - maxreg = 255; - else - maxreg = 127; - if (regnum > maxreg) - return NULL; - - sprintf (testbuf, "%ld", regnum); - if (strcmp (testbuf, &name[2]) != 0) - return NULL; /* gr007 or lr7foo or whatever */ - - /* We have a wiener! Define and return a new symbol for it. */ - if (name[0] == 'l' || name[0] == 'L') - regnum += 128; - else if (name[0] == 's' || name[0] == 'S') - regnum += SREG; - return (symbol_new (name, SEG_REGISTER, (valueT) regnum, - &zero_address_frag)); - } - } - - return NULL; -} - -/* Parse an operand that is machine-specific. */ - -void -md_operand (expressionP) - expressionS *expressionP; -{ - - if (input_line_pointer[0] == '%' && input_line_pointer[1] == '%') - { - /* We have a numeric register expression. No biggy. */ - input_line_pointer += 2; /* Skip %% */ - (void) expression (expressionP); - if (expressionP->X_op != O_constant - || expressionP->X_add_number > 255) - as_bad (_("Invalid expression after %%%%\n")); - expressionP->X_op = O_register; - } - else if (input_line_pointer[0] == '&') - { - /* We are taking the 'address' of a register...this one is not - in the manual, but it *is* in traps/fpsymbol.h! What they - seem to want is the register number, as an absolute number. */ - input_line_pointer++; /* Skip & */ - (void) expression (expressionP); - if (expressionP->X_op != O_register) - as_bad (_("Invalid register in & expression")); - else - expressionP->X_op = O_constant; - } - else if (input_line_pointer[0] == '$' - && isdigit ((unsigned char) input_line_pointer[1])) - { - long lab; - char *name; - symbolS *sym; - - /* This is a local label. */ - ++input_line_pointer; - lab = (long) get_absolute_expression (); - if (dollar_label_defined (lab)) - { - name = dollar_label_name (lab, 0); - sym = symbol_find (name); - } - else - { - name = dollar_label_name (lab, 1); - sym = symbol_find_or_make (name); - } - - expressionP->X_op = O_symbol; - expressionP->X_add_symbol = sym; - expressionP->X_add_number = 0; - } - else if (input_line_pointer[0] == '$') - { - char *s; - char type; - int fieldnum, fieldlimit; - LITTLENUM_TYPE floatbuf[8]; - - /* $float(), $doubleN(), or $extendN() convert floating values - to integers. */ - - s = input_line_pointer; - - ++s; - - fieldnum = 0; - if (strncmp (s, "double", sizeof "double" - 1) == 0) - { - s += sizeof "double" - 1; - type = 'd'; - fieldlimit = 2; - } - else if (strncmp (s, "float", sizeof "float" - 1) == 0) - { - s += sizeof "float" - 1; - type = 'f'; - fieldlimit = 1; - } - else if (strncmp (s, "extend", sizeof "extend" - 1) == 0) - { - s += sizeof "extend" - 1; - type = 'x'; - fieldlimit = 4; - } - else - { - return; - } - - if (isdigit (*s)) - { - fieldnum = *s - '0'; - ++s; - } - if (fieldnum >= fieldlimit) - return; - - SKIP_WHITESPACE (); - if (*s != '(') - return; - ++s; - SKIP_WHITESPACE (); - - s = atof_ieee (s, type, floatbuf); - if (s == NULL) - return; - s = s; - - SKIP_WHITESPACE (); - if (*s != ')') - return; - ++s; - SKIP_WHITESPACE (); - - input_line_pointer = s; - expressionP->X_op = O_constant; - expressionP->X_unsigned = 1; - expressionP->X_add_number = ((floatbuf[fieldnum * 2] - << LITTLENUM_NUMBER_OF_BITS) - + floatbuf[fieldnum * 2 + 1]); - } -} - -/* Round up a section size to the appropriate boundary. */ -valueT -md_section_align (segment, size) - segT segment; - valueT size; -{ - return size; /* Byte alignment is fine */ -} - -/* Exactly what point is a PC-relative offset relative TO? - On the 29000, they're relative to the address of the instruction, - which we have set up as the address of the fixup too. */ -long -md_pcrel_from (fixP) - fixS *fixP; -{ - return fixP->fx_where + fixP->fx_frag->fr_address; -} - -/* end of tc-a29k.c */ diff --git a/gas/config/tc-a29k.h b/gas/config/tc-a29k.h deleted file mode 100644 index b60f6058257..00000000000 --- a/gas/config/tc-a29k.h +++ /dev/null @@ -1,54 +0,0 @@ -/* tc-a29k.h -- Assemble for the AMD 29000. - Copyright (C) 1989, 90, 91, 92, 93, 95, 1998 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -#define TC_A29K - -#define TARGET_BYTES_BIG_ENDIAN 1 - -#define WORKING_DOT_WORD - -#define LEX_DOLLAR 1 - -#define tc_unrecognized_line(c) a29k_unrecognized_line (c) -extern int a29k_unrecognized_line PARAMS ((int)); - -#define tc_headers_hook(a) ; /* not used */ -#define tc_headers_hook(a) ; /* not used */ -#define tc_crawl_symbol_chain(a) ; /* not used */ -#define tc_coff_symbol_emit_hook(a) ; /* not used */ - -#define AOUT_MACHTYPE 101 -#define TC_COFF_FIX2RTYPE(fix_ptr) tc_coff_fix2rtype(fix_ptr) -#define BFD_ARCH bfd_arch_a29k -#define COFF_MAGIC SIPFBOMAGIC -/* Should the reloc be output ? - on the 29k, this is true only if there is a symbol attatched. - on the h8, this is allways true, since no fixup is done -*/ -#define TC_COUNT_RELOC(x) (x->fx_addsy) -#define TC_CONS_RELOC RELOC_32 - -#define COFF_FLAGS F_AR32W -#define reloc_type int -#define NEED_FX_R_TYPE - -#define ZERO_BASED_SEGMENTS - -/* end of tc-a29k.h */ diff --git a/gas/config/tc-alpha.c b/gas/config/tc-alpha.c deleted file mode 100644 index 61dba4b8a4f..00000000000 --- a/gas/config/tc-alpha.c +++ /dev/null @@ -1,5655 +0,0 @@ -/* tc-alpha.c - Processor-specific code for the DEC Alpha AXP CPU. - Copyright (C) 1989, 93-98, 1999 Free Software Foundation, Inc. - Contributed by Carnegie Mellon University, 1993. - Written by Alessandro Forin, based on earlier gas-1.38 target CPU files. - Modified by Ken Raeburn for gas-2.x and ECOFF support. - Modified by Richard Henderson for ELF support. - Modified by Klaus K"ampf for EVAX (OpenVMS/Alpha) support. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* - * Mach Operating System - * Copyright (c) 1993 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include "as.h" -#include "subsegs.h" -#include "struc-symbol.h" -#include "ecoff.h" - -#include "opcode/alpha.h" - -#ifdef OBJ_ELF -#include "elf/alpha.h" -#endif - -#include - - -/* Local types */ - -#define TOKENIZE_ERROR -1 -#define TOKENIZE_ERROR_REPORT -2 - -#define MAX_INSN_FIXUPS 2 -#define MAX_INSN_ARGS 5 - -struct alpha_fixup -{ - expressionS exp; - bfd_reloc_code_real_type reloc; -}; - -struct alpha_insn -{ - unsigned insn; - int nfixups; - struct alpha_fixup fixups[MAX_INSN_FIXUPS]; - unsigned sequence[MAX_INSN_FIXUPS]; -}; - -enum alpha_macro_arg -{ - MACRO_EOA = 1, - MACRO_IR, - MACRO_PIR, - MACRO_OPIR, - MACRO_CPIR, - MACRO_FPR, - MACRO_EXP, - MACRO_LITERAL, - MACRO_BASE, - MACRO_BYTOFF, - MACRO_JSR -}; - -struct alpha_macro -{ - const char *name; - void (*emit) PARAMS ((const expressionS *, int, const PTR)); - const PTR arg; - enum alpha_macro_arg argsets[16]; -}; - -/* Extra expression types. */ - -#define O_pregister O_md1 /* O_register, in parentheses */ -#define O_cpregister O_md2 /* + a leading comma */ - -#ifdef RELOC_OP_P -/* Note, the alpha_reloc_op table below depends on the ordering - of O_literal .. O_gprelow. */ -#define O_literal O_md3 /* !literal relocation */ -#define O_lituse_base O_md4 /* !lituse_base relocation */ -#define O_lituse_bytoff O_md5 /* !lituse_bytoff relocation */ -#define O_lituse_jsr O_md6 /* !lituse_jsr relocation */ -#define O_gpdisp O_md7 /* !gpdisp relocation */ -#define O_gprelhigh O_md8 /* !gprelhigh relocation */ -#define O_gprellow O_md9 /* !gprellow relocation */ - -#define USER_RELOC_P(R) ((R) >= O_literal && (R) <= O_gprellow) -#endif - - -/* Macros for extracting the type and number of encoded register tokens */ - -#define is_ir_num(x) (((x) & 32) == 0) -#define is_fpr_num(x) (((x) & 32) != 0) -#define regno(x) ((x) & 31) - -/* Something odd inherited from the old assembler */ - -#define note_gpreg(R) (alpha_gprmask |= (1 << (R))) -#define note_fpreg(R) (alpha_fprmask |= (1 << (R))) - -/* Predicates for 16- and 32-bit ranges */ -/* XXX: The non-shift version appears to trigger a compiler bug when - cross-assembling from x86 w/ gcc 2.7.2. */ - -#if 1 -#define range_signed_16(x) \ - (((offsetT)(x) >> 15) == 0 || ((offsetT)(x) >> 15) == -1) -#define range_signed_32(x) \ - (((offsetT)(x) >> 31) == 0 || ((offsetT)(x) >> 31) == -1) -#else -#define range_signed_16(x) ((offsetT)(x) >= -(offsetT)0x8000 && \ - (offsetT)(x) <= (offsetT)0x7FFF) -#define range_signed_32(x) ((offsetT)(x) >= -(offsetT)0x80000000 && \ - (offsetT)(x) <= (offsetT)0x7FFFFFFF) -#endif - -/* Macros for sign extending from 16- and 32-bits. */ -/* XXX: The cast macros will work on all the systems that I care about, - but really a predicate should be found to use the non-cast forms. */ - -#if 1 -#define sign_extend_16(x) ((short)(x)) -#define sign_extend_32(x) ((int)(x)) -#else -#define sign_extend_16(x) ((offsetT)(((x) & 0xFFFF) ^ 0x8000) - 0x8000) -#define sign_extend_32(x) ((offsetT)(((x) & 0xFFFFFFFF) \ - ^ 0x80000000) - 0x80000000) -#endif - -/* Macros to build tokens */ - -#define set_tok_reg(t, r) (memset(&(t), 0, sizeof(t)), \ - (t).X_op = O_register, \ - (t).X_add_number = (r)) -#define set_tok_preg(t, r) (memset(&(t), 0, sizeof(t)), \ - (t).X_op = O_pregister, \ - (t).X_add_number = (r)) -#define set_tok_cpreg(t, r) (memset(&(t), 0, sizeof(t)), \ - (t).X_op = O_cpregister, \ - (t).X_add_number = (r)) -#define set_tok_freg(t, r) (memset(&(t), 0, sizeof(t)), \ - (t).X_op = O_register, \ - (t).X_add_number = (r)+32) -#define set_tok_sym(t, s, a) (memset(&(t), 0, sizeof(t)), \ - (t).X_op = O_symbol, \ - (t).X_add_symbol = (s), \ - (t).X_add_number = (a)) -#define set_tok_const(t, n) (memset(&(t), 0, sizeof(t)), \ - (t).X_op = O_constant, \ - (t).X_add_number = (n)) - - -/* Prototypes for all local functions */ - -static int tokenize_arguments PARAMS ((char *, expressionS *, int)); -static const struct alpha_opcode *find_opcode_match - PARAMS ((const struct alpha_opcode *, const expressionS *, int *, int *)); -static const struct alpha_macro *find_macro_match - PARAMS ((const struct alpha_macro *, const expressionS *, int *)); -static unsigned insert_operand - PARAMS ((unsigned, const struct alpha_operand *, offsetT, char *, unsigned)); -static void assemble_insn - PARAMS ((const struct alpha_opcode *, const expressionS *, int, - struct alpha_insn *)); -static void emit_insn PARAMS ((struct alpha_insn *)); -static void assemble_tokens_to_insn - PARAMS ((const char *, const expressionS *, int, struct alpha_insn *)); -static void assemble_tokens - PARAMS ((const char *, const expressionS *, int, int)); - -static int load_expression - PARAMS ((int, const expressionS *, int *, expressionS *, - const expressionS *)); - -static void emit_ldgp PARAMS ((const expressionS *, int, const PTR)); -static void emit_division PARAMS ((const expressionS *, int, const PTR)); -static void emit_lda PARAMS ((const expressionS *, int, const PTR)); -static void emit_ldah PARAMS ((const expressionS *, int, const PTR)); -static void emit_ir_load PARAMS ((const expressionS *, int, const PTR)); -static void emit_loadstore PARAMS ((const expressionS *, int, const PTR)); -static void emit_jsrjmp PARAMS ((const expressionS *, int, const PTR)); -static void emit_ldX PARAMS ((const expressionS *, int, const PTR)); -static void emit_ldXu PARAMS ((const expressionS *, int, const PTR)); -static void emit_uldX PARAMS ((const expressionS *, int, const PTR)); -static void emit_uldXu PARAMS ((const expressionS *, int, const PTR)); -static void emit_ldil PARAMS ((const expressionS *, int, const PTR)); -static void emit_stX PARAMS ((const expressionS *, int, const PTR)); -static void emit_ustX PARAMS ((const expressionS *, int, const PTR)); -static void emit_sextX PARAMS ((const expressionS *, int, const PTR)); -static void emit_retjcr PARAMS ((const expressionS *, int, const PTR)); - -static void s_alpha_text PARAMS ((int)); -static void s_alpha_data PARAMS ((int)); -#ifndef OBJ_ELF -static void s_alpha_comm PARAMS ((int)); -static void s_alpha_rdata PARAMS ((int)); -#endif -#ifdef OBJ_ECOFF -static void s_alpha_sdata PARAMS ((int)); -#endif -#ifdef OBJ_ELF -static void s_alpha_section PARAMS ((int)); -static void s_alpha_ent PARAMS ((int)); -static void s_alpha_end PARAMS ((int)); -static void s_alpha_mask PARAMS ((int)); -static void s_alpha_frame PARAMS ((int)); -static void s_alpha_prologue PARAMS ((int)); -static void s_alpha_coff_wrapper PARAMS ((int)); -#endif -#ifdef OBJ_EVAX -static void s_alpha_section PARAMS ((int)); -#endif -static void s_alpha_gprel32 PARAMS ((int)); -static void s_alpha_float_cons PARAMS ((int)); -static void s_alpha_proc PARAMS ((int)); -static void s_alpha_set PARAMS ((int)); -static void s_alpha_base PARAMS ((int)); -static void s_alpha_align PARAMS ((int)); -static void s_alpha_stringer PARAMS ((int)); -static void s_alpha_space PARAMS ((int)); - -static void create_literal_section PARAMS ((const char *, segT *, symbolS **)); -#ifndef OBJ_ELF -static void select_gp_value PARAMS ((void)); -#endif -static void alpha_align PARAMS ((int, char *, symbolS *, int)); - -#ifdef RELOC_OP_P -static void alpha_adjust_symtab_relocs PARAMS ((bfd *, asection *, PTR)); -#endif - - -/* Generic assembler global variables which must be defined by all - targets. */ - -/* Characters which always start a comment. */ -const char comment_chars[] = "#"; - -/* Characters which start a comment at the beginning of a line. */ -const char line_comment_chars[] = "#"; - -/* Characters which may be used to separate multiple commands on a - single line. */ -const char line_separator_chars[] = ";"; - -/* Characters which are used to indicate an exponent in a floating - point number. */ -const char EXP_CHARS[] = "eE"; - -/* Characters which mean that a number is a floating point constant, - as in 0d1.0. */ -#if 0 -const char FLT_CHARS[] = "dD"; -#else -/* XXX: Do all of these really get used on the alpha?? */ -char FLT_CHARS[] = "rRsSfFdDxXpP"; -#endif - -#ifdef OBJ_EVAX -const char *md_shortopts = "Fm:g+1h:HG:"; -#else -const char *md_shortopts = "Fm:gG:"; -#endif - -struct option md_longopts[] = { -#define OPTION_32ADDR (OPTION_MD_BASE) - { "32addr", no_argument, NULL, OPTION_32ADDR }, -#define OPTION_RELAX (OPTION_32ADDR+1) - { "relax", no_argument, NULL, OPTION_RELAX }, -#ifdef OBJ_ELF -#define OPTION_MDEBUG (OPTION_RELAX+1) -#define OPTION_NO_MDEBUG (OPTION_MDEBUG+1) - { "mdebug", no_argument, NULL, OPTION_MDEBUG }, - { "no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG }, -#endif - { NULL, no_argument, NULL, 0 } -}; - -size_t md_longopts_size = sizeof(md_longopts); - - -#ifdef OBJ_EVAX -#define AXP_REG_R0 0 -#define AXP_REG_R16 16 -#define AXP_REG_R17 17 -#undef AXP_REG_T9 -#define AXP_REG_T9 22 -#undef AXP_REG_T10 -#define AXP_REG_T10 23 -#undef AXP_REG_T11 -#define AXP_REG_T11 24 -#undef AXP_REG_T12 -#define AXP_REG_T12 25 -#define AXP_REG_AI 25 -#undef AXP_REG_FP -#define AXP_REG_FP 29 - -#undef AXP_REG_GP -#define AXP_REG_GP AXP_REG_PV -#endif /* OBJ_EVAX */ - -/* The cpu for which we are generating code */ -static unsigned alpha_target = AXP_OPCODE_BASE; -static const char *alpha_target_name = ""; - -/* The hash table of instruction opcodes */ -static struct hash_control *alpha_opcode_hash; - -/* The hash table of macro opcodes */ -static struct hash_control *alpha_macro_hash; - -#ifdef OBJ_ECOFF -/* The $gp relocation symbol */ -static symbolS *alpha_gp_symbol; - -/* XXX: what is this, and why is it exported? */ -valueT alpha_gp_value; -#endif - -/* The current $gp register */ -static int alpha_gp_register = AXP_REG_GP; - -/* A table of the register symbols */ -static symbolS *alpha_register_table[64]; - -/* Constant sections, or sections of constants */ -#ifdef OBJ_ECOFF -static segT alpha_lita_section; -static segT alpha_lit4_section; -#endif -#ifdef OBJ_EVAX -static segT alpha_link_section; -static segT alpha_ctors_section; -static segT alpha_dtors_section; -#endif -static segT alpha_lit8_section; - -/* Symbols referring to said sections. */ -#ifdef OBJ_ECOFF -static symbolS *alpha_lita_symbol; -static symbolS *alpha_lit4_symbol; -#endif -#ifdef OBJ_EVAX -static symbolS *alpha_link_symbol; -static symbolS *alpha_ctors_symbol; -static symbolS *alpha_dtors_symbol; -#endif -static symbolS *alpha_lit8_symbol; - -/* Literal for .litX+0x8000 within .lita */ -#ifdef OBJ_ECOFF -static offsetT alpha_lit4_literal; -static offsetT alpha_lit8_literal; -#endif - -/* The active .ent symbol. */ -#ifdef OBJ_ELF -static symbolS *alpha_cur_ent_sym; -#endif - -/* Is the assembler not allowed to use $at? */ -static int alpha_noat_on = 0; - -/* Are macros enabled? */ -static int alpha_macros_on = 1; - -/* Are floats disabled? */ -static int alpha_nofloats_on = 0; - -/* Are addresses 32 bit? */ -static int alpha_addr32_on = 0; - -/* Symbol labelling the current insn. When the Alpha gas sees - foo: - .quad 0 - and the section happens to not be on an eight byte boundary, it - will align both the symbol and the .quad to an eight byte boundary. */ -static symbolS *alpha_insn_label; - -/* Whether we should automatically align data generation pseudo-ops. - .align 0 will turn this off. */ -static int alpha_auto_align_on = 1; - -/* The known current alignment of the current section. */ -static int alpha_current_align; - -/* These are exported to ECOFF code. */ -unsigned long alpha_gprmask, alpha_fprmask; - -/* Whether the debugging option was seen. */ -static int alpha_debug; - -#ifdef OBJ_ELF -/* Whether we are emitting an mdebug section. */ -int alpha_flag_mdebug = 1; -#endif - -/* Don't fully resolve relocations, allowing code movement in the linker. */ -static int alpha_flag_relax; - -/* What value to give to bfd_set_gp_size. */ -static int g_switch_value = 8; - -#ifdef OBJ_EVAX -/* Collect information about current procedure here. */ -static struct { - symbolS *symbol; /* proc pdesc symbol */ - int pdsckind; - int framereg; /* register for frame pointer */ - int framesize; /* size of frame */ - int rsa_offset; - int ra_save; - int fp_save; - long imask; - long fmask; - int type; - int prologue; -} alpha_evax_proc; - -static int alpha_flag_hash_long_names = 0; /* -+ */ -static int alpha_flag_show_after_trunc = 0; /* -H */ - -/* If the -+ switch is given, then a hash is appended to any name that is - * longer than 64 characters, else longer symbol names are truncated. - */ - -#endif - -#ifdef RELOC_OP_P -/* A table to map the spelling of a relocation operand into an appropriate - bfd_reloc_code_real_type type. The table is assumed to be ordered such - that op-O_literal indexes into it. */ - -#define ALPHA_RELOC_TABLE(op) \ -&alpha_reloc_op[ ((!USER_RELOC_P (op)) \ - ? (abort (), 0) \ - : (int)(op) - (int)O_literal) ] - -#define LITUSE_BASE 1 -#define LITUSE_BYTOFF 2 -#define LITUSE_JSR 3 - -static const struct alpha_reloc_op_tag { - const char *name; /* string to lookup */ - size_t length; /* size of the string */ - bfd_reloc_code_real_type reloc; /* relocation before frob */ - operatorT op; /* which operator to use */ - int lituse; /* addened to specify lituse */ -} alpha_reloc_op[] = { - - { - "literal", /* name */ - sizeof ("literal")-1, /* length */ - BFD_RELOC_ALPHA_USER_LITERAL, /* reloc */ - O_literal, /* op */ - 0, /* lituse */ - }, - - { - "lituse_base", /* name */ - sizeof ("lituse_base")-1, /* length */ - BFD_RELOC_ALPHA_USER_LITUSE_BASE, /* reloc */ - O_lituse_base, /* op */ - LITUSE_BASE, /* lituse */ - }, - - { - "lituse_bytoff", /* name */ - sizeof ("lituse_bytoff")-1, /* length */ - BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF, /* reloc */ - O_lituse_bytoff, /* op */ - LITUSE_BYTOFF, /* lituse */ - }, - - { - "lituse_jsr", /* name */ - sizeof ("lituse_jsr")-1, /* length */ - BFD_RELOC_ALPHA_USER_LITUSE_JSR, /* reloc */ - O_lituse_jsr, /* op */ - LITUSE_JSR, /* lituse */ - }, - - { - "gpdisp", /* name */ - sizeof ("gpdisp")-1, /* length */ - BFD_RELOC_ALPHA_USER_GPDISP, /* reloc */ - O_gpdisp, /* op */ - 0, /* lituse */ - }, - - { - "gprelhigh", /* name */ - sizeof ("gprelhigh")-1, /* length */ - BFD_RELOC_ALPHA_USER_GPRELHIGH, /* reloc */ - O_gprelhigh, /* op */ - 0, /* lituse */ - }, - - { - "gprellow", /* name */ - sizeof ("gprellow")-1, /* length */ - BFD_RELOC_ALPHA_USER_GPRELLOW, /* reloc */ - O_gprellow, /* op */ - 0, /* lituse */ - }, -}; - -static const int alpha_num_reloc_op - = sizeof(alpha_reloc_op) / sizeof(*alpha_reloc_op); - -/* Maximum # digits needed to hold the largest sequence # */ -#define ALPHA_RELOC_DIGITS 25 - -/* Whether a sequence number is valid. */ -#define ALPHA_RELOC_SEQUENCE_OK(X) ((X) > 0 && ((unsigned)(X)) == (X)) - -/* Structure to hold explict sequence information. */ -struct alpha_literal_tag -{ - fixS *lituse; /* head of linked list of !literals */ - segT segment; /* segment relocs are in or undefined_section*/ - int multi_section_p; /* True if more than one section was used */ - unsigned sequence; /* sequence # */ - unsigned n_literals; /* # of literals */ - unsigned n_lituses; /* # of lituses */ - char string[1]; /* printable form of sequence to hash with */ -}; - -/* Hash table to link up literals with the appropriate lituse */ -static struct hash_control *alpha_literal_hash; -#endif - -/* A table of CPU names and opcode sets. */ - -static const struct cpu_type -{ - const char *name; - unsigned flags; -} cpu_types[] = -{ - /* Ad hoc convention: cpu number gets palcode, process code doesn't. - This supports usage under DU 4.0b that does ".arch ev4", and - usage in MILO that does -m21064. Probably something more - specific like -m21064-pal should be used, but oh well. */ - - { "21064", AXP_OPCODE_BASE|AXP_OPCODE_EV4 }, - { "21064a", AXP_OPCODE_BASE|AXP_OPCODE_EV4 }, - { "21066", AXP_OPCODE_BASE|AXP_OPCODE_EV4 }, - { "21068", AXP_OPCODE_BASE|AXP_OPCODE_EV4 }, - { "21164", AXP_OPCODE_BASE|AXP_OPCODE_EV5 }, - { "21164a", AXP_OPCODE_BASE|AXP_OPCODE_EV5|AXP_OPCODE_BWX }, - { "21164pc", (AXP_OPCODE_BASE|AXP_OPCODE_EV5|AXP_OPCODE_BWX - |AXP_OPCODE_MAX) }, - { "21264", (AXP_OPCODE_BASE|AXP_OPCODE_EV6|AXP_OPCODE_BWX - |AXP_OPCODE_MAX|AXP_OPCODE_CIX) }, - - { "ev4", AXP_OPCODE_BASE }, - { "ev45", AXP_OPCODE_BASE }, - { "lca45", AXP_OPCODE_BASE }, - { "ev5", AXP_OPCODE_BASE }, - { "ev56", AXP_OPCODE_BASE|AXP_OPCODE_BWX }, - { "pca56", AXP_OPCODE_BASE|AXP_OPCODE_BWX|AXP_OPCODE_MAX }, - { "ev6", AXP_OPCODE_BASE|AXP_OPCODE_BWX|AXP_OPCODE_MAX|AXP_OPCODE_CIX }, - - { "all", AXP_OPCODE_BASE }, - { 0, 0 } -}; - -/* The macro table */ - -static const struct alpha_macro alpha_macros[] = { -/* Load/Store macros */ - { "lda", emit_lda, NULL, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_LITERAL, MACRO_BASE, MACRO_EOA } }, - { "ldah", emit_ldah, NULL, - { MACRO_IR, MACRO_EXP, MACRO_EOA } }, - - { "ldl", emit_ir_load, "ldl", - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ldl_l", emit_ir_load, "ldl_l", - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ldq", emit_ir_load, "ldq", - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_LITERAL, MACRO_EOA } }, - { "ldq_l", emit_ir_load, "ldq_l", - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ldq_u", emit_ir_load, "ldq_u", - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ldf", emit_loadstore, "ldf", - { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ldg", emit_loadstore, "ldg", - { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "lds", emit_loadstore, "lds", - { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ldt", emit_loadstore, "ldt", - { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - - { "ldb", emit_ldX, (PTR)0, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ldbu", emit_ldXu, (PTR)0, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ldw", emit_ldX, (PTR)1, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ldwu", emit_ldXu, (PTR)1, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - - { "uldw", emit_uldX, (PTR)1, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "uldwu", emit_uldXu, (PTR)1, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "uldl", emit_uldX, (PTR)2, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "uldlu", emit_uldXu, (PTR)2, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "uldq", emit_uldXu, (PTR)3, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - - { "ldgp", emit_ldgp, NULL, - { MACRO_IR, MACRO_EXP, MACRO_PIR, MACRO_EOA } }, - - { "ldi", emit_lda, NULL, - { MACRO_IR, MACRO_EXP, MACRO_EOA } }, - { "ldil", emit_ldil, NULL, - { MACRO_IR, MACRO_EXP, MACRO_EOA } }, - { "ldiq", emit_lda, NULL, - { MACRO_IR, MACRO_EXP, MACRO_EOA } }, -#if 0 - { "ldif" emit_ldiq, NULL, - { MACRO_FPR, MACRO_EXP, MACRO_EOA } }, - { "ldid" emit_ldiq, NULL, - { MACRO_FPR, MACRO_EXP, MACRO_EOA } }, - { "ldig" emit_ldiq, NULL, - { MACRO_FPR, MACRO_EXP, MACRO_EOA } }, - { "ldis" emit_ldiq, NULL, - { MACRO_FPR, MACRO_EXP, MACRO_EOA } }, - { "ldit" emit_ldiq, NULL, - { MACRO_FPR, MACRO_EXP, MACRO_EOA } }, -#endif - - { "stl", emit_loadstore, "stl", - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "stl_c", emit_loadstore, "stl_c", - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "stq", emit_loadstore, "stq", - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "stq_c", emit_loadstore, "stq_c", - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "stq_u", emit_loadstore, "stq_u", - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "stf", emit_loadstore, "stf", - { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "stg", emit_loadstore, "stg", - { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "sts", emit_loadstore, "sts", - { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "stt", emit_loadstore, "stt", - { MACRO_FPR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - - { "stb", emit_stX, (PTR)0, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "stw", emit_stX, (PTR)1, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ustw", emit_ustX, (PTR)1, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ustl", emit_ustX, (PTR)2, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - { "ustq", emit_ustX, (PTR)3, - { MACRO_IR, MACRO_EXP, MACRO_OPIR, MACRO_BASE, MACRO_EOA } }, - -/* Arithmetic macros */ -#if 0 - { "absl" emit_absl, 1, { IR } }, - { "absl" emit_absl, 2, { IR, IR } }, - { "absl" emit_absl, 2, { EXP, IR } }, - { "absq" emit_absq, 1, { IR } }, - { "absq" emit_absq, 2, { IR, IR } }, - { "absq" emit_absq, 2, { EXP, IR } }, -#endif - - { "sextb", emit_sextX, (PTR)0, - { MACRO_IR, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_EOA, - /* MACRO_EXP, MACRO_IR, MACRO_EOA */ } }, - { "sextw", emit_sextX, (PTR)1, - { MACRO_IR, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_EOA, - /* MACRO_EXP, MACRO_IR, MACRO_EOA */ } }, - - { "divl", emit_division, "__divl", - { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_IR, MACRO_EOA, - /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_EXP, MACRO_EOA */ } }, - { "divlu", emit_division, "__divlu", - { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_IR, MACRO_EOA, - /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_EXP, MACRO_EOA */ } }, - { "divq", emit_division, "__divq", - { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_IR, MACRO_EOA, - /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_EXP, MACRO_EOA */ } }, - { "divqu", emit_division, "__divqu", - { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_IR, MACRO_EOA, - /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_EXP, MACRO_EOA */ } }, - { "reml", emit_division, "__reml", - { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_IR, MACRO_EOA, - /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_EXP, MACRO_EOA */ } }, - { "remlu", emit_division, "__remlu", - { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_IR, MACRO_EOA, - /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_EXP, MACRO_EOA */ } }, - { "remq", emit_division, "__remq", - { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_IR, MACRO_EOA, - /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_EXP, MACRO_EOA */ } }, - { "remqu", emit_division, "__remqu", - { MACRO_IR, MACRO_IR, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_IR, MACRO_EOA, - /* MACRO_IR, MACRO_EXP, MACRO_IR, MACRO_EOA, - MACRO_IR, MACRO_EXP, MACRO_EOA */ } }, - - { "jsr", emit_jsrjmp, "jsr", - { MACRO_PIR, MACRO_EXP, MACRO_JSR, MACRO_EOA, - MACRO_PIR, MACRO_JSR, MACRO_EOA, - MACRO_IR, MACRO_EXP, MACRO_JSR, MACRO_EOA, - MACRO_EXP, MACRO_JSR, MACRO_EOA } }, - { "jmp", emit_jsrjmp, "jmp", - { MACRO_PIR, MACRO_EXP, MACRO_JSR, MACRO_EOA, - MACRO_PIR, MACRO_JSR, MACRO_EOA, - MACRO_IR, MACRO_EXP, MACRO_JSR, MACRO_EOA, - MACRO_EXP, MACRO_JSR, MACRO_EOA } }, - { "ret", emit_retjcr, "ret", - { MACRO_IR, MACRO_EXP, MACRO_EOA, - MACRO_IR, MACRO_EOA, - MACRO_PIR, MACRO_EXP, MACRO_EOA, - MACRO_PIR, MACRO_EOA, - MACRO_EXP, MACRO_EOA, - MACRO_EOA } }, - { "jcr", emit_retjcr, "jcr", - { MACRO_IR, MACRO_EXP, MACRO_EOA, - MACRO_IR, MACRO_EOA, - MACRO_PIR, MACRO_EXP, MACRO_EOA, - MACRO_PIR, MACRO_EOA, - MACRO_EXP, MACRO_EOA, - MACRO_EOA } }, - { "jsr_coroutine", emit_retjcr, "jcr", - { MACRO_IR, MACRO_EXP, MACRO_EOA, - MACRO_IR, MACRO_EOA, - MACRO_PIR, MACRO_EXP, MACRO_EOA, - MACRO_PIR, MACRO_EOA, - MACRO_EXP, MACRO_EOA, - MACRO_EOA } }, -}; - -static const unsigned int alpha_num_macros - = sizeof(alpha_macros) / sizeof(*alpha_macros); - -/* Public interface functions */ - -/* This function is called once, at assembler startup time. It sets - up all the tables, etc. that the MD part of the assembler will - need, that can be determined before arguments are parsed. */ - -void -md_begin () -{ - unsigned int i; - - /* Verify that X_op field is wide enough. */ - { - expressionS e; - e.X_op = O_max; - assert (e.X_op == O_max); - } - - /* Create the opcode hash table */ - - alpha_opcode_hash = hash_new (); - for (i = 0; i < alpha_num_opcodes; ) - { - const char *name, *retval, *slash; - - name = alpha_opcodes[i].name; - retval = hash_insert (alpha_opcode_hash, name, (PTR)&alpha_opcodes[i]); - if (retval) - as_fatal (_("internal error: can't hash opcode `%s': %s"), name, retval); - - /* Some opcodes include modifiers of various sorts with a "/mod" - syntax, like the architecture manual suggests. However, for - use with gcc at least, we also need access to those same opcodes - without the "/". */ - - if ((slash = strchr (name, '/')) != NULL) - { - char *p = xmalloc (strlen (name)); - memcpy (p, name, slash - name); - strcpy (p + (slash - name), slash + 1); - - (void)hash_insert(alpha_opcode_hash, p, (PTR)&alpha_opcodes[i]); - /* Ignore failures -- the opcode table does duplicate some - variants in different forms, like "hw_stq" and "hw_st/q". */ - } - - while (++i < alpha_num_opcodes - && (alpha_opcodes[i].name == name - || !strcmp (alpha_opcodes[i].name, name))) - continue; - } - - /* Create the macro hash table */ - - alpha_macro_hash = hash_new (); - for (i = 0; i < alpha_num_macros; ) - { - const char *name, *retval; - - name = alpha_macros[i].name; - retval = hash_insert (alpha_macro_hash, name, (PTR)&alpha_macros[i]); - if (retval) - as_fatal (_("internal error: can't hash macro `%s': %s"), name, retval); - - while (++i < alpha_num_macros - && (alpha_macros[i].name == name - || !strcmp (alpha_macros[i].name, name))) - continue; - } - - /* Construct symbols for each of the registers */ - - for (i = 0; i < 32; ++i) - { - char name[4]; - sprintf(name, "$%d", i); - alpha_register_table[i] = symbol_create(name, reg_section, i, - &zero_address_frag); - } - for (; i < 64; ++i) - { - char name[5]; - sprintf(name, "$f%d", i-32); - alpha_register_table[i] = symbol_create(name, reg_section, i, - &zero_address_frag); - } - - /* Create the special symbols and sections we'll be using */ - - /* So .sbss will get used for tiny objects. */ - bfd_set_gp_size (stdoutput, g_switch_value); - -#ifdef OBJ_ECOFF - create_literal_section (".lita", &alpha_lita_section, &alpha_lita_symbol); - - /* For handling the GP, create a symbol that won't be output in the - symbol table. We'll edit it out of relocs later. */ - alpha_gp_symbol = symbol_create ("", alpha_lita_section, 0x8000, - &zero_address_frag); -#endif - -#ifdef OBJ_EVAX - create_literal_section (".link", &alpha_link_section, &alpha_link_symbol); -#endif - -#ifdef OBJ_ELF - if (ECOFF_DEBUGGING) - { - segT sec = subseg_new(".mdebug", (subsegT)0); - bfd_set_section_flags(stdoutput, sec, SEC_HAS_CONTENTS|SEC_READONLY); - bfd_set_section_alignment(stdoutput, sec, 3); - } -#endif /* OBJ_ELF */ - - subseg_set(text_section, 0); - -#ifdef RELOC_OP_P - /* Create literal lookup hash table. */ - alpha_literal_hash = hash_new(); -#endif -} - -/* The public interface to the instruction assembler. */ - -void -md_assemble (str) - char *str; -{ - char opname[32]; /* current maximum is 13 */ - expressionS tok[MAX_INSN_ARGS]; - int ntok, trunclen; - size_t opnamelen; - - /* split off the opcode */ - opnamelen = strspn (str, "abcdefghijklmnopqrstuvwxyz_/46819"); - trunclen = (opnamelen < sizeof (opname) - 1 - ? opnamelen - : sizeof (opname) - 1); - memcpy (opname, str, trunclen); - opname[trunclen] = '\0'; - - /* tokenize the rest of the line */ - if ((ntok = tokenize_arguments (str + opnamelen, tok, MAX_INSN_ARGS)) < 0) - { - if (ntok != TOKENIZE_ERROR_REPORT) - as_bad (_("syntax error")); - - return; - } - - /* finish it off */ - assemble_tokens (opname, tok, ntok, alpha_macros_on); -} - -/* Round up a section's size to the appropriate boundary. */ - -valueT -md_section_align (seg, size) - segT seg; - valueT size; -{ - int align = bfd_get_section_alignment(stdoutput, seg); - valueT mask = ((valueT)1 << align) - 1; - - return (size + mask) & ~mask; -} - -/* Turn a string in input_line_pointer into a floating point constant - of type type, and store the appropriate bytes in *litP. The number - of LITTLENUMS emitted is stored in *sizeP. An error message is - returned, or NULL on OK. */ - -/* Equal to MAX_PRECISION in atof-ieee.c */ -#define MAX_LITTLENUMS 6 - -extern char *vax_md_atof PARAMS ((int, char *, int *)); - -char * -md_atof (type, litP, sizeP) - char type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - LITTLENUM_TYPE *wordP; - char *t; - - switch (type) - { - /* VAX floats */ - case 'G': - /* VAX md_atof doesn't like "G" for some reason. */ - type = 'g'; - case 'F': - case 'D': - return vax_md_atof (type, litP, sizeP); - - /* IEEE floats */ - case 'f': - prec = 2; - break; - - case 'd': - prec = 4; - break; - - case 'x': - case 'X': - prec = 6; - break; - - case 'p': - case 'P': - prec = 6; - break; - - default: - *sizeP = 0; - return _("Bad call to MD_ATOF()"); - } - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - *sizeP = prec * sizeof (LITTLENUM_TYPE); - - for (wordP = words + prec - 1; prec--;) - { - md_number_to_chars (litP, (long) (*wordP--), sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - - return 0; -} - -/* Take care of the target-specific command-line options. */ - -int -md_parse_option (c, arg) - int c; - char *arg; -{ - switch (c) - { - case 'F': - alpha_nofloats_on = 1; - break; - - case OPTION_32ADDR: - alpha_addr32_on = 1; - break; - - case 'g': - alpha_debug = 1; - break; - - case 'G': - g_switch_value = atoi(arg); - break; - - case 'm': - { - const struct cpu_type *p; - for (p = cpu_types; p->name; ++p) - if (strcmp(arg, p->name) == 0) - { - alpha_target_name = p->name, alpha_target = p->flags; - goto found; - } - as_warn(_("Unknown CPU identifier `%s'"), arg); - found:; - } - break; - -#ifdef OBJ_EVAX - case '+': /* For g++. Hash any name > 63 chars long. */ - alpha_flag_hash_long_names = 1; - break; - - case 'H': /* Show new symbol after hash truncation */ - alpha_flag_show_after_trunc = 1; - break; - - case 'h': /* for gnu-c/vax compatibility. */ - break; -#endif - - case OPTION_RELAX: - alpha_flag_relax = 1; - break; - -#ifdef OBJ_ELF - case OPTION_MDEBUG: - alpha_flag_mdebug = 1; - break; - case OPTION_NO_MDEBUG: - alpha_flag_mdebug = 0; - break; -#endif - - default: - return 0; - } - - return 1; -} - -/* Print a description of the command-line options that we accept. */ - -void -md_show_usage (stream) - FILE *stream; -{ - fputs(_("\ -Alpha options:\n\ --32addr treat addresses as 32-bit values\n\ --F lack floating point instructions support\n\ --mev4 | -mev45 | -mev5 | -mev56 | -mpca56 | -mev6 | -mall\n\ - specify variant of Alpha architecture\n\ --m21064 | -m21066 | -m21164 | -m21164a | -m21164pc | -m21264\n\ - these variants include PALcode opcodes\n"), - stream); -#ifdef OBJ_EVAX - fputs (_("\ -VMS options:\n\ --+ hash encode (don't truncate) names longer than 64 characters\n\ --H show new symbol after hash truncation\n"), - stream); -#endif -} - -/* Decide from what point a pc-relative relocation is relative to, - relative to the pc-relative fixup. Er, relatively speaking. */ - -long -md_pcrel_from (fixP) - fixS *fixP; -{ - valueT addr = fixP->fx_where + fixP->fx_frag->fr_address; - switch (fixP->fx_r_type) - { - case BFD_RELOC_ALPHA_GPDISP: - case BFD_RELOC_ALPHA_GPDISP_HI16: - case BFD_RELOC_ALPHA_GPDISP_LO16: - return addr; - default: - return fixP->fx_size + addr; - } -} - -/* Attempt to simplify or even eliminate a fixup. The return value is - ignored; perhaps it was once meaningful, but now it is historical. - To indicate that a fixup has been eliminated, set fixP->fx_done. - - For ELF, here it is that we transform the GPDISP_HI16 reloc we used - internally into the GPDISP reloc used externally. We had to do - this so that we'd have the GPDISP_LO16 reloc as a tag to compute - the distance to the "lda" instruction for setting the addend to - GPDISP. */ - -int -md_apply_fix (fixP, valueP) - fixS *fixP; - valueT *valueP; -{ - char * const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where; - valueT value = *valueP; - unsigned image, size; - - switch (fixP->fx_r_type) - { - /* The GPDISP relocations are processed internally with a symbol - referring to the current function; we need to drop in a value - which, when added to the address of the start of the function, - gives the desired GP. */ - case BFD_RELOC_ALPHA_GPDISP_HI16: - { - fixS *next = fixP->fx_next; - assert (next->fx_r_type == BFD_RELOC_ALPHA_GPDISP_LO16); - - fixP->fx_offset = (next->fx_frag->fr_address + next->fx_where - - fixP->fx_frag->fr_address - fixP->fx_where); - - value = (value - sign_extend_16 (value)) >> 16; - } -#ifdef OBJ_ELF - fixP->fx_r_type = BFD_RELOC_ALPHA_GPDISP; -#endif - goto do_reloc_gp; - - case BFD_RELOC_ALPHA_GPDISP_LO16: - value = sign_extend_16 (value); - fixP->fx_offset = 0; -#ifdef OBJ_ELF - fixP->fx_done = 1; -#endif - - do_reloc_gp: - fixP->fx_addsy = section_symbol (now_seg); - md_number_to_chars (fixpos, value, 2); - break; - - case BFD_RELOC_16: - if (fixP->fx_pcrel) - fixP->fx_r_type = BFD_RELOC_16_PCREL; - size = 2; - goto do_reloc_xx; - case BFD_RELOC_32: - if (fixP->fx_pcrel) - fixP->fx_r_type = BFD_RELOC_32_PCREL; - size = 4; - goto do_reloc_xx; - case BFD_RELOC_64: - if (fixP->fx_pcrel) - fixP->fx_r_type = BFD_RELOC_64_PCREL; - size = 8; - do_reloc_xx: - if (fixP->fx_pcrel == 0 && fixP->fx_addsy == 0) - { - md_number_to_chars (fixpos, value, size); - goto done; - } - return 1; - -#ifdef OBJ_ECOFF - case BFD_RELOC_GPREL32: - assert (fixP->fx_subsy == alpha_gp_symbol); - fixP->fx_subsy = 0; - /* FIXME: inherited this obliviousness of `value' -- why? */ - md_number_to_chars (fixpos, -alpha_gp_value, 4); - break; -#endif -#ifdef OBJ_ELF - case BFD_RELOC_GPREL32: - return 1; -#endif - - case BFD_RELOC_23_PCREL_S2: - if (fixP->fx_pcrel == 0 && fixP->fx_addsy == 0) - { - image = bfd_getl32(fixpos); - image = (image & ~0x1FFFFF) | ((value >> 2) & 0x1FFFFF); - goto write_done; - } - return 1; - - case BFD_RELOC_ALPHA_HINT: - if (fixP->fx_pcrel == 0 && fixP->fx_addsy == 0) - { - image = bfd_getl32(fixpos); - image = (image & ~0x3FFF) | ((value >> 2) & 0x3FFF); - goto write_done; - } - return 1; - -#ifdef OBJ_ECOFF - case BFD_RELOC_ALPHA_LITERAL: - md_number_to_chars (fixpos, value, 2); - return 1; - - case BFD_RELOC_ALPHA_LITUSE: - return 1; -#endif -#ifdef OBJ_ELF - case BFD_RELOC_ALPHA_ELF_LITERAL: - case BFD_RELOC_ALPHA_LITUSE: - return 1; -#endif -#ifdef OBJ_EVAX - case BFD_RELOC_ALPHA_LINKAGE: - case BFD_RELOC_ALPHA_CODEADDR: - return 1; -#endif - -#ifdef RELOC_OP_P - case BFD_RELOC_ALPHA_USER_LITERAL: - case BFD_RELOC_ALPHA_USER_LITUSE_BASE: - case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF: - case BFD_RELOC_ALPHA_USER_LITUSE_JSR: - return 1; - - case BFD_RELOC_ALPHA_USER_GPDISP: - case BFD_RELOC_ALPHA_USER_GPRELHIGH: - case BFD_RELOC_ALPHA_USER_GPRELLOW: - abort (); -#endif - - default: - { - const struct alpha_operand *operand; - - if ((int)fixP->fx_r_type >= 0) - as_fatal (_("unhandled relocation type %s"), - bfd_get_reloc_code_name (fixP->fx_r_type)); - - assert (-(int)fixP->fx_r_type < (int)alpha_num_operands); - operand = &alpha_operands[-(int)fixP->fx_r_type]; - - /* The rest of these fixups only exist internally during symbol - resolution and have no representation in the object file. - Therefore they must be completely resolved as constants. */ - - if (fixP->fx_addsy != 0 - && S_GET_SEGMENT (fixP->fx_addsy) != absolute_section) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("non-absolute expression in constant field")); - - image = bfd_getl32(fixpos); - image = insert_operand(image, operand, (offsetT)value, - fixP->fx_file, fixP->fx_line); - } - goto write_done; - } - - if (fixP->fx_addsy != 0 || fixP->fx_pcrel != 0) - return 1; - else - { - as_warn_where(fixP->fx_file, fixP->fx_line, - _("type %d reloc done?\n"), (int)fixP->fx_r_type); - goto done; - } - -write_done: - md_number_to_chars(fixpos, image, 4); - -done: - fixP->fx_done = 1; - return 0; -} - -/* - * Look for a register name in the given symbol. - */ - -symbolS * -md_undefined_symbol(name) - char *name; -{ - if (*name == '$') - { - int is_float = 0, num; - - switch (*++name) - { - case 'f': - if (name[1] == 'p' && name[2] == '\0') - return alpha_register_table[AXP_REG_FP]; - is_float = 32; - /* FALLTHRU */ - - case 'r': - if (!isdigit(*++name)) - break; - /* FALLTHRU */ - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - if (name[1] == '\0') - num = name[0] - '0'; - else if (name[0] != '0' && isdigit(name[1]) && name[2] == '\0') - { - num = (name[0] - '0') * 10 + name[1] - '0'; - if (num >= 32) - break; - } - else - break; - - if (!alpha_noat_on && num == AXP_REG_AT) - as_warn(_("Used $at without \".set noat\"")); - return alpha_register_table[num + is_float]; - - case 'a': - if (name[1] == 't' && name[2] == '\0') - { - if (!alpha_noat_on) - as_warn(_("Used $at without \".set noat\"")); - return alpha_register_table[AXP_REG_AT]; - } - break; - - case 'g': - if (name[1] == 'p' && name[2] == '\0') - return alpha_register_table[alpha_gp_register]; - break; - - case 's': - if (name[1] == 'p' && name[2] == '\0') - return alpha_register_table[AXP_REG_SP]; - break; - } - } - return NULL; -} - -#ifdef OBJ_ECOFF -/* @@@ Magic ECOFF bits. */ - -void -alpha_frob_ecoff_data () -{ - select_gp_value (); - /* $zero and $f31 are read-only */ - alpha_gprmask &= ~1; - alpha_fprmask &= ~1; -} -#endif - -/* Hook to remember a recently defined label so that the auto-align - code can adjust the symbol after we know what alignment will be - required. */ - -void -alpha_define_label (sym) - symbolS *sym; -{ - alpha_insn_label = sym; -} - -/* Return true if we must always emit a reloc for a type and false if - there is some hope of resolving it a assembly time. */ - -int -alpha_force_relocation (f) - fixS *f; -{ - if (alpha_flag_relax) - return 1; - - switch (f->fx_r_type) - { - case BFD_RELOC_ALPHA_GPDISP_HI16: - case BFD_RELOC_ALPHA_GPDISP_LO16: - case BFD_RELOC_ALPHA_GPDISP: -#ifdef OBJ_ECOFF - case BFD_RELOC_ALPHA_LITERAL: -#endif -#ifdef OBJ_ELF - case BFD_RELOC_ALPHA_ELF_LITERAL: -#endif - case BFD_RELOC_ALPHA_LITUSE: - case BFD_RELOC_GPREL32: -#ifdef OBJ_EVAX - case BFD_RELOC_ALPHA_LINKAGE: - case BFD_RELOC_ALPHA_CODEADDR: -#endif -#ifdef RELOC_OP_P - case BFD_RELOC_ALPHA_USER_LITERAL: - case BFD_RELOC_ALPHA_USER_LITUSE_BASE: - case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF: - case BFD_RELOC_ALPHA_USER_LITUSE_JSR: - case BFD_RELOC_ALPHA_USER_GPDISP: - case BFD_RELOC_ALPHA_USER_GPRELHIGH: - case BFD_RELOC_ALPHA_USER_GPRELLOW: -#endif - return 1; - - case BFD_RELOC_23_PCREL_S2: - case BFD_RELOC_32: - case BFD_RELOC_64: - case BFD_RELOC_ALPHA_HINT: - return 0; - - default: - assert((int)f->fx_r_type < 0 && -(int)f->fx_r_type < (int)alpha_num_operands); - return 0; - } -} - -/* Return true if we can partially resolve a relocation now. */ - -int -alpha_fix_adjustable (f) - fixS *f; -{ -#ifdef OBJ_ELF - /* Prevent all adjustments to global symbols */ - if (S_IS_EXTERN (f->fx_addsy) || S_IS_WEAK (f->fx_addsy)) - return 0; -#endif - - /* Are there any relocation types for which we must generate a reloc - but we can adjust the values contained within it? */ - switch (f->fx_r_type) - { - case BFD_RELOC_ALPHA_GPDISP_HI16: - case BFD_RELOC_ALPHA_GPDISP_LO16: - case BFD_RELOC_ALPHA_GPDISP: - return 0; - -#ifdef OBJ_ECOFF - case BFD_RELOC_ALPHA_LITERAL: -#endif -#ifdef OBJ_ELF - case BFD_RELOC_ALPHA_ELF_LITERAL: -#endif -#ifdef RELOC_OP_P - case BFD_RELOC_ALPHA_USER_LITERAL: -#endif -#ifdef OBJ_EVAX - case BFD_RELOC_ALPHA_LINKAGE: - case BFD_RELOC_ALPHA_CODEADDR: -#endif - return 1; - - case BFD_RELOC_ALPHA_LITUSE: -#ifdef RELOC_OP_P - case BFD_RELOC_ALPHA_USER_LITUSE_BASE: - case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF: - case BFD_RELOC_ALPHA_USER_LITUSE_JSR: - case BFD_RELOC_ALPHA_USER_GPDISP: - case BFD_RELOC_ALPHA_USER_GPRELHIGH: - case BFD_RELOC_ALPHA_USER_GPRELLOW: -#endif - return 0; - - case BFD_RELOC_GPREL32: - case BFD_RELOC_23_PCREL_S2: - case BFD_RELOC_32: - case BFD_RELOC_64: - case BFD_RELOC_ALPHA_HINT: - return 1; - - default: - assert ((int)f->fx_r_type < 0 - && - (int)f->fx_r_type < (int)alpha_num_operands); - return 1; - } - /*NOTREACHED*/ -} - -/* Generate the BFD reloc to be stuck in the object file from the - fixup used internally in the assembler. */ - -arelent * -tc_gen_reloc (sec, fixp) - asection *sec ATTRIBUTE_UNUSED; - fixS *fixp; -{ - arelent *reloc; - - reloc = (arelent *) xmalloc (sizeof (arelent)); - reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); - reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; - - /* Make sure none of our internal relocations make it this far. - They'd better have been fully resolved by this point. */ - assert ((int)fixp->fx_r_type > 0); - - reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); - if (reloc->howto == NULL) - { - as_bad_where (fixp->fx_file, fixp->fx_line, - _("cannot represent `%s' relocation in object file"), - bfd_get_reloc_code_name (fixp->fx_r_type)); - return NULL; - } - - if (!fixp->fx_pcrel != !reloc->howto->pc_relative) - { - as_fatal (_("internal error? cannot generate `%s' relocation"), - bfd_get_reloc_code_name (fixp->fx_r_type)); - } - assert (!fixp->fx_pcrel == !reloc->howto->pc_relative); - -#ifdef OBJ_ECOFF - if (fixp->fx_r_type == BFD_RELOC_ALPHA_LITERAL) - { - /* fake out bfd_perform_relocation. sigh */ - reloc->addend = -alpha_gp_value; - } - else -#endif - { - reloc->addend = fixp->fx_offset; -#ifdef OBJ_ELF - /* - * Ohhh, this is ugly. The problem is that if this is a local global - * symbol, the relocation will entirely be performed at link time, not - * at assembly time. bfd_perform_reloc doesn't know about this sort - * of thing, and as a result we need to fake it out here. - */ - if ((S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)) - && !S_IS_COMMON(fixp->fx_addsy)) - reloc->addend -= symbol_get_bfdsym (fixp->fx_addsy)->value; -#endif - } - - return reloc; -} - -/* Parse a register name off of the input_line and return a register - number. Gets md_undefined_symbol above to do the register name - matching for us. - - Only called as a part of processing the ECOFF .frame directive. */ - -int -tc_get_register (frame) - int frame ATTRIBUTE_UNUSED; -{ - int framereg = AXP_REG_SP; - - SKIP_WHITESPACE (); - if (*input_line_pointer == '$') - { - char *s = input_line_pointer; - char c = get_symbol_end (); - symbolS *sym = md_undefined_symbol (s); - - *strchr(s, '\0') = c; - if (sym && (framereg = S_GET_VALUE (sym)) <= 31) - goto found; - } - as_warn (_("frame reg expected, using $%d."), framereg); - -found: - note_gpreg (framereg); - return framereg; -} - -/* This is called before the symbol table is processed. In order to - work with gcc when using mips-tfile, we must keep all local labels. - However, in other cases, we want to discard them. If we were - called with -g, but we didn't see any debugging information, it may - mean that gcc is smuggling debugging information through to - mips-tfile, in which case we must generate all local labels. */ - -#ifdef OBJ_ECOFF - -void -alpha_frob_file_before_adjust () -{ - if (alpha_debug != 0 - && ! ecoff_debugging_seen) - flag_keep_locals = 1; -} - -#endif /* OBJ_ECOFF */ - -#ifdef RELOC_OP_P - -/* Before the relocations are written, reorder them, so that user supplied - !lituse relocations follow the appropriate !literal relocations. Also - convert the gas-internal relocations to the appropriate linker relocations. - */ - -void -alpha_adjust_symtab () -{ - if (alpha_literal_hash) - { -#ifdef DEBUG2_ALPHA - fprintf (stderr, "alpha_adjust_symtab called\n"); -#endif - - /* Go over each section, reordering the relocations so that all of the - explicit LITUSE's are adjacent to the explicit LITERAL's */ - bfd_map_over_sections (stdoutput, alpha_adjust_symtab_relocs, (char *) 0); - } -} - - -/* Inner function to move LITUSE's next to the LITERAL. */ - -static void -alpha_adjust_symtab_relocs (abfd, sec, ptr) - bfd *abfd; - asection *sec; - PTR ptr; -{ - segment_info_type *seginfo = seg_info (sec); - fixS **prevP; - fixS *fixp; - fixS *next; - fixS *lituse; - int n_lituses = 0; - -#ifdef DEBUG2_ALPHA - int n = 0; - int n_literals = 0; - int n_dup_literals = 0; -#endif - - /* If seginfo is NULL, we did not create this section; don't do anything with - it. By using a pointer to a pointer, we can update the links in place. */ - if (seginfo == NULL) - return; - - /* If there are no relocations, skip the section. */ - if (! seginfo->fix_root) - return; - - /* First rebuild the fixup chain without the expicit lituse's. */ - prevP = &(seginfo->fix_root); - for (fixp = seginfo->fix_root; fixp; fixp = next) - { - next = fixp->fx_next; - fixp->fx_next = (fixS *)0; -#ifdef DEBUG2_ALPHA - n++; -#endif - - switch (fixp->fx_r_type) - { - default: - *prevP = fixp; - prevP = &(fixp->fx_next); -#ifdef DEBUG2_ALPHA - fprintf (stderr, - "alpha_adjust_symtab_relocs: 0x%lx, other relocation %s\n", - (long)fixp, - bfd_get_reloc_code_name (fixp->fx_r_type)); -#endif - break; - - case BFD_RELOC_ALPHA_USER_LITERAL: - *prevP = fixp; - prevP = &(fixp->fx_next); - /* prevent assembler from trying to adjust the offset */ -#ifdef DEBUG2_ALPHA - n_literals++; - if (fixp->tc_fix_data.info->n_literals != 1) - n_dup_literals++; - fprintf (stderr, - "alpha_adjust_symtab_relocs: 0x%lx, !literal!%.6d, # literals = %2d\n", - (long)fixp, - fixp->tc_fix_data.info->sequence, - fixp->tc_fix_data.info->n_literals); -#endif - break; - - /* do not link in lituse's */ - case BFD_RELOC_ALPHA_USER_LITUSE_BASE: - case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF: - case BFD_RELOC_ALPHA_USER_LITUSE_JSR: - n_lituses++; - if (fixp->tc_fix_data.info->n_literals == 0) - as_bad_where (fixp->fx_file, fixp->fx_line, - _("No !literal!%d was found"), - fixp->tc_fix_data.info->sequence); -#ifdef DEBUG2_ALPHA - fprintf (stderr, - "alpha_adjust_symtab_relocs: 0x%lx, !lituse !%.6d, # lituses = %2d, next_lituse = 0x%lx\n", - (long)fixp, - fixp->tc_fix_data.info->sequence, - fixp->tc_fix_data.info->n_lituses, - (long)fixp->tc_fix_data.next_lituse); -#endif - break; - } - } - - /* If there were any lituses, go and add them to the chain, unless there is - more than one !literal for a given sequence number. They are linked - through the next_lituse field in reverse order, so as we go through the - next_lituse chain, we effectively reverse the chain once again. If there - was more than one !literal, we fall back to loading up the address w/o - optimization. Also, if the !literals/!lituses are spread in different - segments (happens in the Linux kernel semaphores), suppress the - optimization. */ - if (n_lituses) - { - for (fixp = seginfo->fix_root; fixp; fixp = fixp->fx_next) - { - switch (fixp->fx_r_type) - { - default: - break; - - case BFD_RELOC_ALPHA_USER_LITERAL: -#ifdef OBJ_ELF - fixp->fx_r_type = BFD_RELOC_ALPHA_ELF_LITERAL; -#else - fixp->fx_r_type = BFD_RELOC_ALPHA_LITERAL; /* XXX check this */ -#endif - if (fixp->tc_fix_data.info->n_literals == 1 - && ! fixp->tc_fix_data.info->multi_section_p) - { - for (lituse = fixp->tc_fix_data.info->lituse; - lituse != (fixS *)0; - lituse = lituse->tc_fix_data.next_lituse) - { - lituse->fx_next = fixp->fx_next; - fixp->fx_next = lituse; - } - } - break; - - case BFD_RELOC_ALPHA_USER_LITUSE_BASE: - case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF: - case BFD_RELOC_ALPHA_USER_LITUSE_JSR: - fixp->fx_r_type = BFD_RELOC_ALPHA_LITUSE; - break; - } - } - } - -#ifdef DEBUG2_ALPHA - fprintf (stderr, "alpha_adjust_symtab_relocs: %s, %d literal%s, %d duplicate literal%s, %d lituse%s\n\n", - sec->name, - n_literals, (n_literals == 1) ? "" : "s", - n_dup_literals, (n_dup_literals == 1) ? "" : "s", - n_lituses, (n_lituses == 1) ? "" : "s"); -#endif -} - -#endif /* RELOC_OP_P */ - - -#ifdef DEBUG_ALPHA -static void -debug_exp (tok, ntok) - expressionS tok[]; - int ntok; -{ - int i; - - fprintf (stderr, "debug_exp: %d tokens", ntok); - for (i = 0; i < ntok; i++) - { - expressionS *t = &tok[i]; - const char *name; - switch (t->X_op) - { - default: name = "unknown"; break; - case O_illegal: name = "O_illegal"; break; - case O_absent: name = "O_absent"; break; - case O_constant: name = "O_constant"; break; - case O_symbol: name = "O_symbol"; break; - case O_symbol_rva: name = "O_symbol_rva"; break; - case O_register: name = "O_register"; break; - case O_big: name = "O_big"; break; - case O_uminus: name = "O_uminus"; break; - case O_bit_not: name = "O_bit_not"; break; - case O_logical_not: name = "O_logical_not"; break; - case O_multiply: name = "O_multiply"; break; - case O_divide: name = "O_divide"; break; - case O_modulus: name = "O_modulus"; break; - case O_left_shift: name = "O_left_shift"; break; - case O_right_shift: name = "O_right_shift"; break; - case O_bit_inclusive_or: name = "O_bit_inclusive_or"; break; - case O_bit_or_not: name = "O_bit_or_not"; break; - case O_bit_exclusive_or: name = "O_bit_exclusive_or"; break; - case O_bit_and: name = "O_bit_and"; break; - case O_add: name = "O_add"; break; - case O_subtract: name = "O_subtract"; break; - case O_eq: name = "O_eq"; break; - case O_ne: name = "O_ne"; break; - case O_lt: name = "O_lt"; break; - case O_le: name = "O_le"; break; - case O_ge: name = "O_ge"; break; - case O_gt: name = "O_gt"; break; - case O_logical_and: name = "O_logical_and"; break; - case O_logical_or: name = "O_logical_or"; break; - case O_index: name = "O_index"; break; - case O_pregister: name = "O_pregister"; break; - case O_cpregister: name = "O_cpregister"; break; - case O_literal: name = "O_literal"; break; - case O_lituse_base: name = "O_lituse_base"; break; - case O_lituse_bytoff: name = "O_lituse_bytoff"; break; - case O_lituse_jsr: name = "O_lituse_jsr"; break; - case O_gpdisp: name = "O_gpdisp"; break; - case O_gprelhigh: name = "O_gprelhigh"; break; - case O_gprellow: name = "O_gprellow"; break; - case O_md10: name = "O_md10"; break; - case O_md11: name = "O_md11"; break; - case O_md12: name = "O_md12"; break; - case O_md13: name = "O_md13"; break; - case O_md14: name = "O_md14"; break; - case O_md15: name = "O_md15"; break; - case O_md16: name = "O_md16"; break; - } - - fprintf (stderr, ", %s(%s, %s, %d)", name, - (t->X_add_symbol) ? S_GET_NAME (t->X_add_symbol) : "--", - (t->X_op_symbol) ? S_GET_NAME (t->X_op_symbol) : "--", - (int)t->X_add_number); - } - fprintf (stderr, "\n"); - fflush (stderr); -} -#endif - -/* Parse the arguments to an opcode. */ - -static int -tokenize_arguments (str, tok, ntok) - char *str; - expressionS tok[]; - int ntok; -{ - expressionS *end_tok = tok + ntok; - char *old_input_line_pointer; - int saw_comma = 0, saw_arg = 0; -#ifdef DEBUG_ALPHA - expressionS *orig_tok = tok; -#endif -#ifdef RELOC_OP_P - char *p; - const struct alpha_reloc_op_tag *r; - int c, i; - size_t len; - int reloc_found_p = 0; -#endif - - memset (tok, 0, sizeof (*tok) * ntok); - - /* Save and restore input_line_pointer around this function */ - old_input_line_pointer = input_line_pointer; - input_line_pointer = str; - - while (tok < end_tok && *input_line_pointer) - { - SKIP_WHITESPACE (); - switch (*input_line_pointer) - { - case '\0': - goto fini; - -#ifdef RELOC_OP_P - case '!': - /* A relocation operand can be placed after the normal operand on an - assembly language statement, and has the following form: - !relocation_type!sequence_number. */ - if (reloc_found_p) - { /* only support one relocation op per insn */ - as_bad (_("More than one relocation op per insn")); - goto err_report; - } - - if (!saw_arg) - goto err; - - for (p = ++input_line_pointer; - ((c = *p) != '!' && c != ';' && c != '#' && c != ',' - && !is_end_of_line[c]); - p++) - ; - - /* Parse !relocation_type */ - len = p - input_line_pointer; - if (len == 0) - { - as_bad (_("No relocation operand")); - goto err_report; - } - - if (c != '!') - { - as_bad (_("No !sequence-number after !%s"), input_line_pointer); - goto err_report; - } - - r = &alpha_reloc_op[0]; - for (i = alpha_num_reloc_op-1; i >= 0; i--, r++) - { - if (len == r->length - && memcmp (input_line_pointer, r->name, len) == 0) - break; - } - if (i < 0) - { - as_bad (_("Unknown relocation operand: !%s"), input_line_pointer); - goto err_report; - } - - input_line_pointer = ++p; - - /* Parse !sequence_number */ - memset (tok, '\0', sizeof (expressionS)); - expression (tok); - - if (tok->X_op != O_constant - || ! ALPHA_RELOC_SEQUENCE_OK (tok->X_add_number)) - { - as_bad (_("Bad sequence number: !%s!%s"), r->name, input_line_pointer); - goto err_report; - } - - tok->X_op = r->op; - reloc_found_p = 1; - ++tok; - break; -#endif - - case ',': - ++input_line_pointer; - if (saw_comma || !saw_arg) - goto err; - saw_comma = 1; - break; - - case '(': - { - char *hold = input_line_pointer++; - - /* First try for parenthesized register ... */ - expression (tok); - if (*input_line_pointer == ')' && tok->X_op == O_register) - { - tok->X_op = (saw_comma ? O_cpregister : O_pregister); - saw_comma = 0; - saw_arg = 1; - ++input_line_pointer; - ++tok; - break; - } - - /* ... then fall through to plain expression */ - input_line_pointer = hold; - } - - default: - if (saw_arg && !saw_comma) - goto err; - - expression (tok); - if (tok->X_op == O_illegal || tok->X_op == O_absent) - goto err; - - saw_comma = 0; - saw_arg = 1; - ++tok; - break; - } - } - -fini: - if (saw_comma) - goto err; - input_line_pointer = old_input_line_pointer; - -#ifdef DEBUG_ALPHA - debug_exp (orig_tok, ntok - (end_tok - tok)); -#endif - - return ntok - (end_tok - tok); - -err: - input_line_pointer = old_input_line_pointer; - return TOKENIZE_ERROR; - -#ifdef RELOC_OP_P -err_report: - input_line_pointer = old_input_line_pointer; - return TOKENIZE_ERROR_REPORT; -#endif -} - -/* Search forward through all variants of an opcode looking for a - syntax match. */ - -static const struct alpha_opcode * -find_opcode_match(first_opcode, tok, pntok, pcpumatch) - const struct alpha_opcode *first_opcode; - const expressionS *tok; - int *pntok; - int *pcpumatch; -{ - const struct alpha_opcode *opcode = first_opcode; - int ntok = *pntok; - int got_cpu_match = 0; - - do - { - const unsigned char *opidx; - int tokidx = 0; - - /* Don't match opcodes that don't exist on this architecture */ - if (!(opcode->flags & alpha_target)) - goto match_failed; - - got_cpu_match = 1; - - for (opidx = opcode->operands; *opidx; ++opidx) - { - const struct alpha_operand *operand = &alpha_operands[*opidx]; - - /* only take input from real operands */ - if (operand->flags & AXP_OPERAND_FAKE) - continue; - - /* when we expect input, make sure we have it */ - if (tokidx >= ntok) - { - if ((operand->flags & AXP_OPERAND_OPTIONAL_MASK) == 0) - goto match_failed; - continue; - } - - /* match operand type with expression type */ - switch (operand->flags & AXP_OPERAND_TYPECHECK_MASK) - { - case AXP_OPERAND_IR: - if (tok[tokidx].X_op != O_register - || !is_ir_num(tok[tokidx].X_add_number)) - goto match_failed; - break; - case AXP_OPERAND_FPR: - if (tok[tokidx].X_op != O_register - || !is_fpr_num(tok[tokidx].X_add_number)) - goto match_failed; - break; - case AXP_OPERAND_IR|AXP_OPERAND_PARENS: - if (tok[tokidx].X_op != O_pregister - || !is_ir_num(tok[tokidx].X_add_number)) - goto match_failed; - break; - case AXP_OPERAND_IR|AXP_OPERAND_PARENS|AXP_OPERAND_COMMA: - if (tok[tokidx].X_op != O_cpregister - || !is_ir_num(tok[tokidx].X_add_number)) - goto match_failed; - break; - - case AXP_OPERAND_RELATIVE: - case AXP_OPERAND_SIGNED: - case AXP_OPERAND_UNSIGNED: - switch (tok[tokidx].X_op) - { - case O_illegal: - case O_absent: - case O_register: - case O_pregister: - case O_cpregister: - goto match_failed; - - default: - break; - } - break; - - default: - /* everything else should have been fake */ - abort(); - } - ++tokidx; - } - - /* possible match -- did we use all of our input? */ - if (tokidx == ntok) - { - *pntok = ntok; - return opcode; - } - - match_failed:; - } - while (++opcode-alpha_opcodes < alpha_num_opcodes - && !strcmp(opcode->name, first_opcode->name)); - - if (*pcpumatch) - *pcpumatch = got_cpu_match; - - return NULL; -} - -/* Search forward through all variants of a macro looking for a syntax - match. */ - -static const struct alpha_macro * -find_macro_match(first_macro, tok, pntok) - const struct alpha_macro *first_macro; - const expressionS *tok; - int *pntok; -{ - const struct alpha_macro *macro = first_macro; - int ntok = *pntok; - - do - { - const enum alpha_macro_arg *arg = macro->argsets; - int tokidx = 0; - - while (*arg) - { - switch (*arg) - { - case MACRO_EOA: - if (tokidx == ntok) - return macro; - else - tokidx = 0; - break; - - /* index register */ - case MACRO_IR: - if (tokidx >= ntok || tok[tokidx].X_op != O_register - || !is_ir_num(tok[tokidx].X_add_number)) - goto match_failed; - ++tokidx; - break; - - /* parenthesized index register */ - case MACRO_PIR: - if (tokidx >= ntok || tok[tokidx].X_op != O_pregister - || !is_ir_num(tok[tokidx].X_add_number)) - goto match_failed; - ++tokidx; - break; - - /* optional parenthesized index register */ - case MACRO_OPIR: - if (tokidx < ntok && tok[tokidx].X_op == O_pregister - && is_ir_num(tok[tokidx].X_add_number)) - ++tokidx; - break; - - /* leading comma with a parenthesized index register */ - case MACRO_CPIR: - if (tokidx >= ntok || tok[tokidx].X_op != O_cpregister - || !is_ir_num(tok[tokidx].X_add_number)) - goto match_failed; - ++tokidx; - break; - - /* floating point register */ - case MACRO_FPR: - if (tokidx >= ntok || tok[tokidx].X_op != O_register - || !is_fpr_num(tok[tokidx].X_add_number)) - goto match_failed; - ++tokidx; - break; - - /* normal expression */ - case MACRO_EXP: - if (tokidx >= ntok) - goto match_failed; - switch (tok[tokidx].X_op) - { - case O_illegal: - case O_absent: - case O_register: - case O_pregister: - case O_cpregister: -#ifdef RELOC_OP_P - case O_literal: - case O_lituse_base: - case O_lituse_bytoff: - case O_lituse_jsr: - case O_gpdisp: - case O_gprelhigh: - case O_gprellow: -#endif - goto match_failed; - - default: - break; - } - ++tokidx; - break; - - /* optional !literal! */ - case MACRO_LITERAL: -#ifdef RELOC_OP_P - if (tokidx < ntok && tok[tokidx].X_op == O_literal) - tokidx++; -#endif - break; - - /* optional !lituse_base! */ - case MACRO_BASE: -#ifdef RELOC_OP_P - if (tokidx < ntok && tok[tokidx].X_op == O_lituse_base) - tokidx++; -#endif - break; - - /* optional !lituse_bytoff! */ - case MACRO_BYTOFF: -#ifdef RELOC_OP_P - if (tokidx < ntok && tok[tokidx].X_op == O_lituse_bytoff) - tokidx++; -#endif - break; - - /* optional !lituse_jsr! */ - case MACRO_JSR: -#ifdef RELOC_OP_P - if (tokidx < ntok && tok[tokidx].X_op == O_lituse_jsr) - tokidx++; -#endif - break; - - match_failed: - while (*arg != MACRO_EOA) - ++arg; - tokidx = 0; - break; - } - ++arg; - } - } - while (++macro-alpha_macros < alpha_num_macros - && !strcmp(macro->name, first_macro->name)); - - return NULL; -} - -/* Insert an operand value into an instruction. */ - -static unsigned -insert_operand(insn, operand, val, file, line) - unsigned insn; - const struct alpha_operand *operand; - offsetT val; - char *file; - unsigned line; -{ - if (operand->bits != 32 && !(operand->flags & AXP_OPERAND_NOOVERFLOW)) - { - offsetT min, max; - - if (operand->flags & AXP_OPERAND_SIGNED) - { - max = (1 << (operand->bits - 1)) - 1; - min = -(1 << (operand->bits - 1)); - } - else - { - max = (1 << operand->bits) - 1; - min = 0; - } - - if (val < min || val > max) - { - const char *err = - _("operand out of range (%s not between %d and %d)"); - char buf[sizeof (val) * 3 + 2]; - - sprint_value(buf, val); - if (file) - as_warn_where(file, line, err, buf, min, max); - else - as_warn(err, buf, min, max); - } - } - - if (operand->insert) - { - const char *errmsg = NULL; - - insn = (*operand->insert) (insn, val, &errmsg); - if (errmsg) - as_warn (errmsg); - } - else - insn |= ((val & ((1 << operand->bits) - 1)) << operand->shift); - - return insn; -} - -/* - * Turn an opcode description and a set of arguments into - * an instruction and a fixup. - */ - -static void -assemble_insn(opcode, tok, ntok, insn) - const struct alpha_opcode *opcode; - const expressionS *tok; - int ntok; - struct alpha_insn *insn; -{ - const unsigned char *argidx; - unsigned image; - int tokidx = 0; - - memset (insn, 0, sizeof (*insn)); - image = opcode->opcode; - - for (argidx = opcode->operands; *argidx; ++argidx) - { - const struct alpha_operand *operand = &alpha_operands[*argidx]; - const expressionS *t = (const expressionS *)0; - - if (operand->flags & AXP_OPERAND_FAKE) - { - /* fake operands take no value and generate no fixup */ - image = insert_operand(image, operand, 0, NULL, 0); - continue; - } - - if (tokidx >= ntok) - { - switch (operand->flags & AXP_OPERAND_OPTIONAL_MASK) - { - case AXP_OPERAND_DEFAULT_FIRST: - t = &tok[0]; - break; - case AXP_OPERAND_DEFAULT_SECOND: - t = &tok[1]; - break; - case AXP_OPERAND_DEFAULT_ZERO: - { - static expressionS zero_exp; - t = &zero_exp; - zero_exp.X_op = O_constant; - zero_exp.X_unsigned = 1; - } - break; - default: - abort(); - } - } - else - t = &tok[tokidx++]; - - switch (t->X_op) - { - case O_register: - case O_pregister: - case O_cpregister: - image = insert_operand(image, operand, regno(t->X_add_number), - NULL, 0); - break; - - case O_constant: - image = insert_operand(image, operand, t->X_add_number, NULL, 0); - break; - - default: - { - struct alpha_fixup *fixup; - - if (insn->nfixups >= MAX_INSN_FIXUPS) - as_fatal(_("too many fixups")); - - fixup = &insn->fixups[insn->nfixups++]; - - fixup->exp = *t; - fixup->reloc = operand->default_reloc; - } - break; - } - } - - insn->insn = image; -} - -/* - * Actually output an instruction with its fixup. - */ - -static void -emit_insn (insn) - struct alpha_insn *insn; -{ - char *f; - int i; - - /* Take care of alignment duties */ - if (alpha_auto_align_on && alpha_current_align < 2) - alpha_align (2, (char *) NULL, alpha_insn_label, 0); - if (alpha_current_align > 2) - alpha_current_align = 2; - alpha_insn_label = NULL; - - /* Write out the instruction. */ - f = frag_more (4); - md_number_to_chars (f, insn->insn, 4); - - /* Apply the fixups in order */ - for (i = 0; i < insn->nfixups; ++i) - { - const struct alpha_operand *operand = (const struct alpha_operand *)0; - struct alpha_fixup *fixup = &insn->fixups[i]; - int size, pcrel; - fixS *fixP; -#ifdef RELOC_OP_P - char buffer[ALPHA_RELOC_DIGITS]; - struct alpha_literal_tag *info; -#endif - - /* Some fixups are only used internally and so have no howto */ - if ((int)fixup->reloc < 0) - { - operand = &alpha_operands[-(int)fixup->reloc]; - size = 4; - pcrel = ((operand->flags & AXP_OPERAND_RELATIVE) != 0); - } - else switch (fixup->reloc) - { -#ifdef OBJ_ELF - /* These relocation types are only used internally. */ - case BFD_RELOC_ALPHA_GPDISP_HI16: - case BFD_RELOC_ALPHA_GPDISP_LO16: - size = 2; - pcrel = 0; - break; -#endif -#ifdef RELOC_OP_P - /* and these also are internal only relocations */ - case BFD_RELOC_ALPHA_USER_LITERAL: - case BFD_RELOC_ALPHA_USER_LITUSE_BASE: - case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF: - case BFD_RELOC_ALPHA_USER_LITUSE_JSR: - case BFD_RELOC_ALPHA_USER_GPDISP: - case BFD_RELOC_ALPHA_USER_GPRELHIGH: - case BFD_RELOC_ALPHA_USER_GPRELLOW: - size = 2; - pcrel = 0; - break; -#endif - - default: - { - reloc_howto_type *reloc_howto - = bfd_reloc_type_lookup (stdoutput, fixup->reloc); - assert (reloc_howto); - - size = bfd_get_reloc_size (reloc_howto); - pcrel = reloc_howto->pc_relative; - } - assert (size >= 1 && size <= 4); - break; - } - - fixP = fix_new_exp (frag_now, f - frag_now->fr_literal, size, - &fixup->exp, pcrel, fixup->reloc); - - /* Turn off complaints that the addend is too large for some fixups, - and copy in the sequence number for the explicit relocations. */ - switch (fixup->reloc) - { - case BFD_RELOC_ALPHA_GPDISP_LO16: -#ifdef OBJ_ECOFF - case BFD_RELOC_ALPHA_LITERAL: -#endif -#ifdef OBJ_ELF - case BFD_RELOC_ALPHA_ELF_LITERAL: -#endif - case BFD_RELOC_GPREL32: - fixP->fx_no_overflow = 1; - break; - -#ifdef RELOC_OP_P - case BFD_RELOC_ALPHA_USER_LITERAL: - fixP->fx_no_overflow = 1; - sprintf (buffer, "!%u", insn->sequence[i]); - info = ((struct alpha_literal_tag *) - hash_find (alpha_literal_hash, buffer)); - - if (! info) - { - size_t len = strlen (buffer); - const char *errmsg; - - info = ((struct alpha_literal_tag *) - xcalloc (sizeof (struct alpha_literal_tag) + len, 1)); - - info->segment = now_seg; - info->sequence = insn->sequence[i]; - strcpy (info->string, buffer); - errmsg = hash_insert (alpha_literal_hash, info->string, (PTR)info); - if (errmsg) - as_bad (errmsg); - } - - ++info->n_literals; - - if (info->segment != now_seg) - info->multi_section_p = 1; - - fixP->tc_fix_data.info = info; - break; - - case BFD_RELOC_ALPHA_USER_LITUSE_BASE: - case BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF: - case BFD_RELOC_ALPHA_USER_LITUSE_JSR: - sprintf (buffer, "!%u", insn->sequence[i]); - info = ((struct alpha_literal_tag *) - hash_find (alpha_literal_hash, buffer)); - - if (! info) - { - size_t len = strlen (buffer); - const char *errmsg; - - info = ((struct alpha_literal_tag *) - xcalloc (sizeof (struct alpha_literal_tag) + len, 1)); - - info->segment = now_seg; - info->sequence = insn->sequence[i]; - strcpy (info->string, buffer); - errmsg = hash_insert (alpha_literal_hash, info->string, (PTR)info); - if (errmsg) - as_bad (errmsg); - } - info->n_lituses++; - fixP->tc_fix_data.info = info; - fixP->tc_fix_data.next_lituse = info->lituse; - info->lituse = fixP; - if (info->segment != now_seg) - info->multi_section_p = 1; - - break; -#endif - - default: - if ((int)fixup->reloc < 0) - { - if (operand->flags & AXP_OPERAND_NOOVERFLOW) - fixP->fx_no_overflow = 1; - } - break; - } - } -} - -/* Given an opcode name and a pre-tokenized set of arguments, assemble - the insn, but do not emit it. - - Note that this implies no macros allowed, since we can't store more - than one insn in an insn structure. */ - -static void -assemble_tokens_to_insn(opname, tok, ntok, insn) - const char *opname; - const expressionS *tok; - int ntok; - struct alpha_insn *insn; -{ - const struct alpha_opcode *opcode; - - /* search opcodes */ - opcode = (const struct alpha_opcode *) hash_find (alpha_opcode_hash, opname); - if (opcode) - { - int cpumatch; - opcode = find_opcode_match (opcode, tok, &ntok, &cpumatch); - if (opcode) - { - assemble_insn (opcode, tok, ntok, insn); - return; - } - else if (cpumatch) - as_bad (_("inappropriate arguments for opcode `%s'"), opname); - else - as_bad (_("opcode `%s' not supported for target %s"), opname, - alpha_target_name); - } - else - as_bad (_("unknown opcode `%s'"), opname); -} - -/* Given an opcode name and a pre-tokenized set of arguments, take the - opcode all the way through emission. */ - -static void -assemble_tokens (opname, tok, ntok, local_macros_on) - const char *opname; - const expressionS *tok; - int ntok; - int local_macros_on; -{ - int found_something = 0; - const struct alpha_opcode *opcode; - const struct alpha_macro *macro; - int cpumatch = 1; - - /* search macros */ - if (local_macros_on) - { - macro = ((const struct alpha_macro *) - hash_find (alpha_macro_hash, opname)); - if (macro) - { - found_something = 1; - macro = find_macro_match (macro, tok, &ntok); - if (macro) - { - (*macro->emit) (tok, ntok, macro->arg); - return; - } - } - } - -#ifdef RELOC_OP_P - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const expressionS *reloc_exp = &tok[ntok-1]; - const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op); - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc_exp->X_add_number, opname); - ntok--; - } -#endif - - /* search opcodes */ - opcode = (const struct alpha_opcode *) hash_find (alpha_opcode_hash, opname); - if (opcode) - { - found_something = 1; - opcode = find_opcode_match (opcode, tok, &ntok, &cpumatch); - if (opcode) - { - struct alpha_insn insn; - assemble_insn (opcode, tok, ntok, &insn); - emit_insn (&insn); - return; - } - } - - if (found_something) - if (cpumatch) - as_bad (_("inappropriate arguments for opcode `%s'"), opname); - else - as_bad (_("opcode `%s' not supported for target %s"), opname, - alpha_target_name); - else - as_bad (_("unknown opcode `%s'"), opname); -} - - -/* Some instruction sets indexed by lg(size) */ -static const char * const sextX_op[] = { "sextb", "sextw", "sextl", NULL }; -static const char * const insXl_op[] = { "insbl", "inswl", "insll", "insql" }; -static const char * const insXh_op[] = { NULL, "inswh", "inslh", "insqh" }; -static const char * const extXl_op[] = { "extbl", "extwl", "extll", "extql" }; -static const char * const extXh_op[] = { NULL, "extwh", "extlh", "extqh" }; -static const char * const mskXl_op[] = { "mskbl", "mskwl", "mskll", "mskql" }; -static const char * const mskXh_op[] = { NULL, "mskwh", "msklh", "mskqh" }; -static const char * const stX_op[] = { "stb", "stw", "stl", "stq" }; -static const char * const ldX_op[] = { "ldb", "ldw", "ldll", "ldq" }; -static const char * const ldXu_op[] = { "ldbu", "ldwu", NULL, NULL }; - -/* Implement the ldgp macro. */ - -static void -emit_ldgp (tok, ntok, unused) - const expressionS *tok; - int ntok ATTRIBUTE_UNUSED; - const PTR unused ATTRIBUTE_UNUSED; -{ -#ifdef OBJ_AOUT -FIXME -#endif -#if defined(OBJ_ECOFF) || defined(OBJ_ELF) - /* from "ldgp r1,n(r2)", generate "ldah r1,X(R2); lda r1,Y(r1)" - with appropriate constants and relocations. */ - struct alpha_insn insn; - expressionS newtok[3]; - expressionS addend; - -#ifdef RELOC_OP_P - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const expressionS *reloc_exp = &tok[ntok-1]; - const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op); - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc_exp->X_add_number, "ldgp"); - ntok--; - } -#endif - -#ifdef OBJ_ECOFF - if (regno (tok[2].X_add_number) == AXP_REG_PV) - ecoff_set_gp_prolog_size (0); -#endif - - newtok[0] = tok[0]; - set_tok_const (newtok[1], 0); - newtok[2] = tok[2]; - - assemble_tokens_to_insn ("ldah", newtok, 3, &insn); - - addend = tok[1]; - -#ifdef OBJ_ECOFF - if (addend.X_op != O_constant) - as_bad (_("can not resolve expression")); - addend.X_op = O_symbol; - addend.X_add_symbol = alpha_gp_symbol; -#endif - - insn.nfixups = 1; - insn.fixups[0].exp = addend; - insn.fixups[0].reloc = BFD_RELOC_ALPHA_GPDISP_HI16; - - emit_insn (&insn); - - set_tok_preg (newtok[2], tok[0].X_add_number); - - assemble_tokens_to_insn ("lda", newtok, 3, &insn); - -#ifdef OBJ_ECOFF - addend.X_add_number += 4; -#endif - - insn.nfixups = 1; - insn.fixups[0].exp = addend; - insn.fixups[0].reloc = BFD_RELOC_ALPHA_GPDISP_LO16; - - emit_insn (&insn); -#endif /* OBJ_ECOFF || OBJ_ELF */ -} - -#ifdef OBJ_EVAX - -/* Add symbol+addend to link pool. - Return offset from basesym to entry in link pool. - - Add new fixup only if offset isn't 16bit. */ - -valueT -add_to_link_pool (basesym, sym, addend) - symbolS *basesym; - symbolS *sym; - offsetT addend; -{ - segT current_section = now_seg; - int current_subsec = now_subseg; - valueT offset; - bfd_reloc_code_real_type reloc_type; - char *p; - segment_info_type *seginfo = seg_info (alpha_link_section); - fixS *fixp; - - offset = - *symbol_get_obj (basesym); - - /* @@ This assumes all entries in a given section will be of the same - size... Probably correct, but unwise to rely on. */ - /* This must always be called with the same subsegment. */ - - if (seginfo->frchainP) - for (fixp = seginfo->frchainP->fix_root; - fixp != (fixS *) NULL; - fixp = fixp->fx_next, offset += 8) - { - if (fixp->fx_addsy == sym && fixp->fx_offset == addend) - { - if (range_signed_16 (offset)) - { - return offset; - } - } - } - - /* Not found in 16bit signed range. */ - - subseg_set (alpha_link_section, 0); - p = frag_more (8); - memset (p, 0, 8); - - fix_new (frag_now, p - frag_now->fr_literal, 8, sym, addend, 0, - BFD_RELOC_64); - - subseg_set (current_section, current_subsec); - seginfo->literal_pool_size += 8; - return offset; -} - -#endif /* OBJ_EVAX */ - -/* Load a (partial) expression into a target register. - - If poffset is not null, after the call it will either contain - O_constant 0, or a 16-bit offset appropriate for any MEM format - instruction. In addition, pbasereg will be modified to point to - the base register to use in that MEM format instruction. - - In any case, *pbasereg should contain a base register to add to the - expression. This will normally be either AXP_REG_ZERO or - alpha_gp_register. Symbol addresses will always be loaded via $gp, - so "foo($0)" is interpreted as adding the address of foo to $0; - i.e. "ldq $targ, LIT($gp); addq $targ, $0, $targ". Odd, perhaps, - but this is what OSF/1 does. - - If explicit relocations of the form !literal! are allowed, - and used, then explict_reloc with be an expression pointer. - - Finally, the return value is true if the calling macro may emit a - LITUSE reloc if otherwise appropriate. */ - -static int -load_expression (targreg, exp, pbasereg, poffset, explicit_reloc) - int targreg; - const expressionS *exp; - int *pbasereg; - expressionS *poffset; - const expressionS *explicit_reloc; -{ - int emit_lituse = 0; - offsetT addend = exp->X_add_number; - int basereg = *pbasereg; - struct alpha_insn insn; - expressionS newtok[3]; - - switch (exp->X_op) - { - case O_symbol: - { -#ifdef OBJ_ECOFF - offsetT lit; - - /* attempt to reduce .lit load by splitting the offset from - its symbol when possible, but don't create a situation in - which we'd fail. */ - if (!range_signed_32 (addend) && - (alpha_noat_on || targreg == AXP_REG_AT)) - { - lit = add_to_literal_pool (exp->X_add_symbol, addend, - alpha_lita_section, 8); - addend = 0; - } - else - { - lit = add_to_literal_pool (exp->X_add_symbol, 0, - alpha_lita_section, 8); - } - - if (lit >= 0x8000) - as_fatal (_("overflow in literal (.lita) table")); - - /* emit "ldq r, lit(gp)" */ - - if (basereg != alpha_gp_register && targreg == basereg) - { - if (alpha_noat_on) - as_bad (_("macro requires $at register while noat in effect")); - if (targreg == AXP_REG_AT) - as_bad (_("macro requires $at while $at in use")); - - set_tok_reg (newtok[0], AXP_REG_AT); - } - else - set_tok_reg (newtok[0], targreg); - set_tok_sym (newtok[1], alpha_lita_symbol, lit); - set_tok_preg (newtok[2], alpha_gp_register); - - assemble_tokens_to_insn ("ldq", newtok, 3, &insn); - - assert (explicit_reloc == (const expressionS *)0); - assert (insn.nfixups == 1); - insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITERAL; -#endif /* OBJ_ECOFF */ -#ifdef OBJ_ELF - /* emit "ldq r, gotoff(gp)" */ - - if (basereg != alpha_gp_register && targreg == basereg) - { - if (alpha_noat_on) - as_bad (_("macro requires $at register while noat in effect")); - if (targreg == AXP_REG_AT) - as_bad (_("macro requires $at while $at in use")); - - set_tok_reg (newtok[0], AXP_REG_AT); - } - else - set_tok_reg (newtok[0], targreg); - - /* XXX: Disable this .got minimizing optimization so that we can get - better instruction offset knowledge in the compiler. This happens - very infrequently anyway. */ - if (1 || (!range_signed_32 (addend) - && (alpha_noat_on || targreg == AXP_REG_AT))) - { - newtok[1] = *exp; - addend = 0; - } - else - { - set_tok_sym (newtok[1], exp->X_add_symbol, 0); - } - - set_tok_preg (newtok[2], alpha_gp_register); - - assemble_tokens_to_insn ("ldq", newtok, 3, &insn); - - assert (insn.nfixups == 1); - if (!explicit_reloc) - insn.fixups[0].reloc = BFD_RELOC_ALPHA_ELF_LITERAL; - else - { -#ifdef RELOC_OP_P - insn.fixups[0].reloc - = (ALPHA_RELOC_TABLE (explicit_reloc->X_op))->reloc; - insn.sequence[0] = explicit_reloc->X_add_number; -#else - abort (); -#endif - } -#endif /* OBJ_ELF */ -#ifdef OBJ_EVAX - offsetT link; - - /* Find symbol or symbol pointer in link section. */ - - assert (explicit_reloc == (const expressionS *)0); - if (exp->X_add_symbol == alpha_evax_proc.symbol) - { - if (range_signed_16 (addend)) - { - set_tok_reg (newtok[0], targreg); - set_tok_const (newtok[1], addend); - set_tok_preg (newtok[2], basereg); - assemble_tokens_to_insn ("lda", newtok, 3, &insn); - addend = 0; - } - else - { - set_tok_reg (newtok[0], targreg); - set_tok_const (newtok[1], 0); - set_tok_preg (newtok[2], basereg); - assemble_tokens_to_insn ("lda", newtok, 3, &insn); - } - } - else - { - if (!range_signed_32 (addend)) - { - link = add_to_link_pool (alpha_evax_proc.symbol, - exp->X_add_symbol, addend); - addend = 0; - } - else - { - link = add_to_link_pool (alpha_evax_proc.symbol, - exp->X_add_symbol, 0); - } - set_tok_reg (newtok[0], targreg); - set_tok_const (newtok[1], link); - set_tok_preg (newtok[2], basereg); - assemble_tokens_to_insn ("ldq", newtok, 3, &insn); - } -#endif /* OBJ_EVAX */ - - emit_insn(&insn); - -#ifndef OBJ_EVAX - emit_lituse = 1; - - if (basereg != alpha_gp_register && basereg != AXP_REG_ZERO) - { - /* emit "addq r, base, r" */ - - set_tok_reg (newtok[1], basereg); - set_tok_reg (newtok[2], targreg); - assemble_tokens ("addq", newtok, 3, 0); - } -#endif - - basereg = targreg; - } - break; - - case O_constant: - assert (explicit_reloc == (const expressionS *)0); - break; - - case O_subtract: - /* Assume that this difference expression will be resolved to an - absolute value and that that value will fit in 16 bits. */ - - assert (explicit_reloc == (const expressionS *)0); - set_tok_reg (newtok[0], targreg); - newtok[1] = *exp; - set_tok_preg (newtok[2], basereg); - assemble_tokens ("lda", newtok, 3, 0); - - if (poffset) - set_tok_const (*poffset, 0); - return 0; - - case O_big: - if (exp->X_add_number > 0) - as_bad (_("bignum invalid; zero assumed")); - else - as_bad (_("floating point number invalid; zero assumed")); - addend = 0; - break; - - default: - as_bad (_("can't handle expression")); - addend = 0; - break; - } - - if (!range_signed_32 (addend)) - { - offsetT lit; - - /* for 64-bit addends, just put it in the literal pool */ - -#ifdef OBJ_EVAX - /* emit "ldq targreg, lit(basereg)" */ - lit = add_to_link_pool (alpha_evax_proc.symbol, - section_symbol (absolute_section), addend); - set_tok_reg (newtok[0], targreg); - set_tok_const (newtok[1], lit); - set_tok_preg (newtok[2], alpha_gp_register); - assemble_tokens ("ldq", newtok, 3, 0); -#else - - if (alpha_lit8_section == NULL) - { - create_literal_section (".lit8", - &alpha_lit8_section, - &alpha_lit8_symbol); - -#ifdef OBJ_ECOFF - alpha_lit8_literal = add_to_literal_pool (alpha_lit8_symbol, 0x8000, - alpha_lita_section, 8); - if (alpha_lit8_literal >= 0x8000) - as_fatal (_("overflow in literal (.lita) table")); -#endif - } - - lit = add_to_literal_pool (NULL, addend, alpha_lit8_section, 8) - 0x8000; - if (lit >= 0x8000) - as_fatal (_("overflow in literal (.lit8) table")); - - /* emit "lda litreg, .lit8+0x8000" */ - - if (targreg == basereg) - { - if (alpha_noat_on) - as_bad (_("macro requires $at register while noat in effect")); - if (targreg == AXP_REG_AT) - as_bad (_("macro requires $at while $at in use")); - - set_tok_reg (newtok[0], AXP_REG_AT); - } - else - set_tok_reg (newtok[0], targreg); -#ifdef OBJ_ECOFF - set_tok_sym (newtok[1], alpha_lita_symbol, alpha_lit8_literal); -#endif -#ifdef OBJ_ELF - set_tok_sym (newtok[1], alpha_lit8_symbol, 0x8000); -#endif - set_tok_preg (newtok[2], alpha_gp_register); - - assemble_tokens_to_insn ("ldq", newtok, 3, &insn); - - assert (insn.nfixups == 1); -#ifdef OBJ_ECOFF - insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITERAL; -#endif -#ifdef OBJ_ELF - insn.fixups[0].reloc = BFD_RELOC_ALPHA_ELF_LITERAL; -#endif - - emit_insn (&insn); - - /* emit "ldq litreg, lit(litreg)" */ - - set_tok_const (newtok[1], lit); - set_tok_preg (newtok[2], newtok[0].X_add_number); - - assemble_tokens_to_insn ("ldq", newtok, 3, &insn); - - assert (insn.nfixups < MAX_INSN_FIXUPS); - if (insn.nfixups > 0) - { - memmove (&insn.fixups[1], &insn.fixups[0], - sizeof(struct alpha_fixup) * insn.nfixups); - } - insn.nfixups++; - insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE; - insn.fixups[0].exp.X_op = O_symbol; - insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg); - insn.fixups[0].exp.X_add_number = LITUSE_BASE; - emit_lituse = 0; - - emit_insn (&insn); - - /* emit "addq litreg, base, target" */ - - if (basereg != AXP_REG_ZERO) - { - set_tok_reg (newtok[1], basereg); - set_tok_reg (newtok[2], targreg); - assemble_tokens ("addq", newtok, 3, 0); - } -#endif /* !OBJ_EVAX */ - - if (poffset) - set_tok_const (*poffset, 0); - *pbasereg = targreg; - } - else - { - offsetT low, high, extra, tmp; - - /* for 32-bit operands, break up the addend */ - - low = sign_extend_16 (addend); - tmp = addend - low; - high = sign_extend_16 (tmp >> 16); - - if (tmp - (high << 16)) - { - extra = 0x4000; - tmp -= 0x40000000; - high = sign_extend_16 (tmp >> 16); - } - else - extra = 0; - - set_tok_reg (newtok[0], targreg); - set_tok_preg (newtok[2], basereg); - - if (extra) - { - /* emit "ldah r, extra(r) */ - set_tok_const (newtok[1], extra); - assemble_tokens ("ldah", newtok, 3, 0); - set_tok_preg (newtok[2], basereg = targreg); - } - - if (high) - { - /* emit "ldah r, high(r) */ - set_tok_const (newtok[1], high); - assemble_tokens ("ldah", newtok, 3, 0); - basereg = targreg; - set_tok_preg (newtok[2], basereg); - } - - if ((low && !poffset) || (!poffset && basereg != targreg)) - { - /* emit "lda r, low(base)" */ - set_tok_const (newtok[1], low); - assemble_tokens ("lda", newtok, 3, 0); - basereg = targreg; - low = 0; - } - - if (poffset) - set_tok_const (*poffset, low); - *pbasereg = basereg; - } - - return emit_lituse; -} - -/* The lda macro differs from the lda instruction in that it handles - most simple expressions, particualrly symbol address loads and - large constants. */ - -static void -emit_lda (tok, ntok, opname) - const expressionS *tok; - int ntok; - const PTR opname; -{ - int basereg; - const expressionS *reloc = (const expressionS *)0; - -#ifdef RELOC_OP_P - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const struct alpha_reloc_op_tag *r; - - reloc = &tok[ntok-1]; - r = ALPHA_RELOC_TABLE (reloc->X_op); - switch (reloc->X_op) - { - default: - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc->X_add_number, (const char *)opname); - - reloc = (const expressionS *)0; - ntok--; - break; - - case O_literal: - ntok--; - break; - - /* For lda $x,0($x)!lituse_base!y, don't use load_expression, since - it is really too general for our needs. Instead just generate the - lda directly. */ - case O_lituse_base: - if (ntok != 4 - || tok[0].X_op != O_register - || !is_ir_num(tok[0].X_add_number) - || tok[1].X_op != O_constant - || tok[2].X_op != O_pregister - || !is_ir_num(tok[2].X_add_number)) - { - as_bad (_("bad instruction format for lda !%s!%d"), r->name, - reloc->X_add_number); - - reloc = (const expressionS *)0; - ntok--; - break; - } - - emit_loadstore (tok, ntok, "lda"); - return; - } - } -#endif - - if (ntok == 2) - basereg = (tok[1].X_op == O_constant ? AXP_REG_ZERO : alpha_gp_register); - else - basereg = tok[2].X_add_number; - - (void) load_expression (tok[0].X_add_number, &tok[1], &basereg, NULL, reloc); -} - -/* The ldah macro differs from the ldah instruction in that it has $31 - as an implied base register. */ - -static void -emit_ldah (tok, ntok, unused) - const expressionS *tok; - int ntok ATTRIBUTE_UNUSED; - const PTR unused ATTRIBUTE_UNUSED; -{ - expressionS newtok[3]; - -#ifdef RELOC_OP_P - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const expressionS *reloc_exp = &tok[ntok-1]; - const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op); - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc_exp->X_add_number, "ldah"); - ntok--; - } -#endif - - newtok[0] = tok[0]; - newtok[1] = tok[1]; - set_tok_preg (newtok[2], AXP_REG_ZERO); - - assemble_tokens ("ldah", newtok, 3, 0); -} - -/* Handle all "simple" integer register loads -- ldq, ldq_l, ldq_u, - etc. They differ from the real instructions in that they do simple - expressions like the lda macro. */ - -static void -emit_ir_load (tok, ntok, opname) - const expressionS *tok; - int ntok; - const PTR opname; -{ - int basereg, lituse; - expressionS newtok[3]; - struct alpha_insn insn; - -#ifdef RELOC_OP_P - const expressionS *reloc = (const expressionS *)0; - - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const struct alpha_reloc_op_tag *r; - - reloc = &tok[ntok-1]; - switch (reloc->X_op) - { - case O_lituse_base: - ntok--; - break; - - case O_literal: - if (strcmp ((const char *)opname, "ldq") == 0) - { - emit_lda (tok, ntok, opname); - return; - } - - /* fall through */ - default: - ntok--; - r = ALPHA_RELOC_TABLE (reloc->X_op); - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc->X_add_number, (const char *)opname); - } - } -#endif - - if (ntok == 2) - basereg = (tok[1].X_op == O_constant ? AXP_REG_ZERO : alpha_gp_register); - else - basereg = tok[2].X_add_number; - - lituse = load_expression (tok[0].X_add_number, &tok[1], &basereg, - &newtok[1], (const expressionS *)0); - - newtok[0] = tok[0]; - set_tok_preg (newtok[2], basereg); - - assemble_tokens_to_insn ((const char *)opname, newtok, 3, &insn); - -#ifdef RELOC_OP_P - if (reloc) - { - int nfixups = insn.nfixups; - const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc->X_op); - - assert (nfixups < MAX_INSN_FIXUPS); - insn.fixups[nfixups].reloc = r->reloc; - insn.fixups[nfixups].exp.X_op = O_symbol; - insn.fixups[nfixups].exp.X_add_symbol = section_symbol (now_seg); - insn.fixups[nfixups].exp.X_add_number = r->lituse; - insn.sequence[nfixups] = reloc->X_add_number; - insn.nfixups++; - } -#endif - - if (lituse) - { - assert (insn.nfixups < MAX_INSN_FIXUPS); - if (insn.nfixups > 0) - { - memmove (&insn.fixups[1], &insn.fixups[0], - sizeof(struct alpha_fixup) * insn.nfixups); - } - insn.nfixups++; - insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE; - insn.fixups[0].exp.X_op = O_symbol; - insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg); - insn.fixups[0].exp.X_add_number = LITUSE_BASE; - } - - emit_insn (&insn); -} - -/* Handle fp register loads, and both integer and fp register stores. - Again, we handle simple expressions. */ - -static void -emit_loadstore (tok, ntok, opname) - const expressionS *tok; - int ntok; - const PTR opname; -{ - int basereg, lituse; - expressionS newtok[3]; - struct alpha_insn insn; - -#ifdef RELOC_OP_P - const expressionS *reloc = (const expressionS *)0; - - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - reloc = &tok[--ntok]; - if (reloc->X_op != O_lituse_base) - { - const struct alpha_reloc_op_tag *r = &alpha_reloc_op[ reloc->X_md ]; - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc->X_add_number, (const char *)opname); - } - } -#endif - - if (ntok == 2) - basereg = (tok[1].X_op == O_constant ? AXP_REG_ZERO : alpha_gp_register); - else - basereg = tok[2].X_add_number; - - if (tok[1].X_op != O_constant || !range_signed_16(tok[1].X_add_number)) - { - if (alpha_noat_on) - as_bad (_("macro requires $at register while noat in effect")); - - lituse = load_expression (AXP_REG_AT, &tok[1], &basereg, &newtok[1], - (const expressionS *)0); - } - else - { - newtok[1] = tok[1]; - lituse = 0; - } - - newtok[0] = tok[0]; - set_tok_preg (newtok[2], basereg); - - assemble_tokens_to_insn ((const char *)opname, newtok, 3, &insn); - -#ifdef RELOC_OP_P - if (reloc) - { - int nfixups = insn.nfixups; - const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc->X_op); - - assert (nfixups < MAX_INSN_FIXUPS); - insn.fixups[nfixups].reloc = r->reloc; - insn.fixups[nfixups].exp.X_op = O_symbol; - insn.fixups[nfixups].exp.X_add_symbol = section_symbol (now_seg); - insn.fixups[nfixups].exp.X_add_number = r->lituse; - insn.sequence[nfixups] = reloc->X_add_number; - insn.nfixups++; - } -#endif - - if (lituse) - { - assert (insn.nfixups < MAX_INSN_FIXUPS); - if (insn.nfixups > 0) - { - memmove (&insn.fixups[1], &insn.fixups[0], - sizeof(struct alpha_fixup) * insn.nfixups); - } - insn.nfixups++; - insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE; - insn.fixups[0].exp.X_op = O_symbol; - insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg); - insn.fixups[0].exp.X_add_number = LITUSE_BASE; - } - - emit_insn (&insn); -} - -/* Load a half-word or byte as an unsigned value. */ - -static void -emit_ldXu (tok, ntok, vlgsize) - const expressionS *tok; - int ntok; - const PTR vlgsize; -{ - if (alpha_target & AXP_OPCODE_BWX) - emit_ir_load (tok, ntok, ldXu_op[(long)vlgsize]); - else - { - expressionS newtok[3]; - -#ifdef RELOC_OP_P - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const expressionS *reloc_exp = &tok[ntok-1]; - const struct alpha_reloc_op_tag *r - = ALPHA_RELOC_TABLE (reloc_exp->X_op); - - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc_exp->X_add_number, "ldbu/ldwu"); - ntok--; - } -#endif - - if (alpha_noat_on) - as_bad (_("macro requires $at register while noat in effect")); - - /* emit "lda $at, exp" */ - - memcpy (newtok, tok, sizeof (expressionS) * ntok); - newtok[0].X_add_number = AXP_REG_AT; - assemble_tokens ("lda", newtok, ntok, 1); - - /* emit "ldq_u targ, 0($at)" */ - - newtok[0] = tok[0]; - set_tok_const (newtok[1], 0); - set_tok_preg (newtok[2], AXP_REG_AT); - assemble_tokens ("ldq_u", newtok, 3, 1); - - /* emit "extXl targ, $at, targ" */ - - set_tok_reg (newtok[1], AXP_REG_AT); - newtok[2] = newtok[0]; - assemble_tokens (extXl_op[(long)vlgsize], newtok, 3, 1); - } -} - -/* Load a half-word or byte as a signed value. */ - -static void -emit_ldX (tok, ntok, vlgsize) - const expressionS *tok; - int ntok; - const PTR vlgsize; -{ - emit_ldXu (tok, ntok, vlgsize); - assemble_tokens (sextX_op[(long)vlgsize], tok, 1, 1); -} - -/* Load an integral value from an unaligned address as an unsigned - value. */ - -static void -emit_uldXu (tok, ntok, vlgsize) - const expressionS *tok; - int ntok; - const PTR vlgsize; -{ - long lgsize = (long)vlgsize; - expressionS newtok[3]; - - if (alpha_noat_on) - as_bad (_("macro requires $at register while noat in effect")); - - /* emit "lda $at, exp" */ - - memcpy (newtok, tok, sizeof (expressionS) * ntok); - newtok[0].X_add_number = AXP_REG_AT; - assemble_tokens ("lda", newtok, ntok, 1); - - /* emit "ldq_u $t9, 0($at)" */ - - set_tok_reg (newtok[0], AXP_REG_T9); - set_tok_const (newtok[1], 0); - set_tok_preg (newtok[2], AXP_REG_AT); - assemble_tokens ("ldq_u", newtok, 3, 1); - - /* emit "ldq_u $t10, size-1($at)" */ - - set_tok_reg (newtok[0], AXP_REG_T10); - set_tok_const (newtok[1], (1<X_op); - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc_exp->X_add_number, "ldil"); - ntok--; - } -#endif - - memcpy (newtok, tok, sizeof(newtok)); - newtok[1].X_add_number = sign_extend_32 (tok[1].X_add_number); - - assemble_tokens ("lda", newtok, ntok, 1); -} - -/* Store a half-word or byte. */ - -static void -emit_stX (tok, ntok, vlgsize) - const expressionS *tok; - int ntok; - const PTR vlgsize; -{ - int lgsize = (int)(long)vlgsize; - - if (alpha_target & AXP_OPCODE_BWX) - emit_loadstore (tok, ntok, stX_op[lgsize]); - else - { - expressionS newtok[3]; - - if (alpha_noat_on) - as_bad(_("macro requires $at register while noat in effect")); - - /* emit "lda $at, exp" */ - - memcpy (newtok, tok, sizeof (expressionS) * ntok); - newtok[0].X_add_number = AXP_REG_AT; - assemble_tokens ("lda", newtok, ntok, 1); - - /* emit "ldq_u $t9, 0($at)" */ - - set_tok_reg (newtok[0], AXP_REG_T9); - set_tok_const (newtok[1], 0); - set_tok_preg (newtok[2], AXP_REG_AT); - assemble_tokens ("ldq_u", newtok, 3, 1); - - /* emit "insXl src, $at, $t10" */ - - newtok[0] = tok[0]; - set_tok_reg (newtok[1], AXP_REG_AT); - set_tok_reg (newtok[2], AXP_REG_T10); - assemble_tokens (insXl_op[lgsize], newtok, 3, 1); - - /* emit "mskXl $t9, $at, $t9" */ - - set_tok_reg (newtok[0], AXP_REG_T9); - newtok[2] = newtok[0]; - assemble_tokens (mskXl_op[lgsize], newtok, 3, 1); - - /* emit "or $t9, $t10, $t9" */ - - set_tok_reg (newtok[1], AXP_REG_T10); - assemble_tokens ("or", newtok, 3, 1); - - /* emit "stq_u $t9, 0($at) */ - - set_tok_const (newtok[1], 0); - set_tok_preg (newtok[2], AXP_REG_AT); - assemble_tokens ("stq_u", newtok, 3, 1); - } -} - -/* Store an integer to an unaligned address. */ - -static void -emit_ustX (tok, ntok, vlgsize) - const expressionS *tok; - int ntok; - const PTR vlgsize; -{ - int lgsize = (int)(long)vlgsize; - expressionS newtok[3]; - - /* emit "lda $at, exp" */ - - memcpy (newtok, tok, sizeof (expressionS) * ntok); - newtok[0].X_add_number = AXP_REG_AT; - assemble_tokens ("lda", newtok, ntok, 1); - - /* emit "ldq_u $9, 0($at)" */ - - set_tok_reg (newtok[0], AXP_REG_T9); - set_tok_const (newtok[1], 0); - set_tok_preg (newtok[2], AXP_REG_AT); - assemble_tokens ("ldq_u", newtok, 3, 1); - - /* emit "ldq_u $10, size-1($at)" */ - - set_tok_reg (newtok[0], AXP_REG_T10); - set_tok_const (newtok[1], (1 << lgsize)-1); - assemble_tokens ("ldq_u", newtok, 3, 1); - - /* emit "insXl src, $at, $t11" */ - - newtok[0] = tok[0]; - set_tok_reg (newtok[1], AXP_REG_AT); - set_tok_reg (newtok[2], AXP_REG_T11); - assemble_tokens (insXl_op[lgsize], newtok, 3, 1); - - /* emit "insXh src, $at, $t12" */ - - set_tok_reg (newtok[2], AXP_REG_T12); - assemble_tokens (insXh_op[lgsize], newtok, 3, 1); - - /* emit "mskXl $t9, $at, $t9" */ - - set_tok_reg (newtok[0], AXP_REG_T9); - newtok[2] = newtok[0]; - assemble_tokens (mskXl_op[lgsize], newtok, 3, 1); - - /* emit "mskXh $t10, $at, $t10" */ - - set_tok_reg (newtok[0], AXP_REG_T10); - newtok[2] = newtok[0]; - assemble_tokens (mskXh_op[lgsize], newtok, 3, 1); - - /* emit "or $t9, $t11, $t9" */ - - set_tok_reg (newtok[0], AXP_REG_T9); - set_tok_reg (newtok[1], AXP_REG_T11); - newtok[2] = newtok[0]; - assemble_tokens ("or", newtok, 3, 1); - - /* emit "or $t10, $t12, $t10" */ - - set_tok_reg (newtok[0], AXP_REG_T10); - set_tok_reg (newtok[1], AXP_REG_T12); - newtok[2] = newtok[0]; - assemble_tokens ("or", newtok, 3, 1); - - /* emit "stq_u $t9, 0($at)" */ - - set_tok_reg (newtok[0], AXP_REG_T9); - set_tok_const (newtok[1], 0); - set_tok_preg (newtok[2], AXP_REG_AT); - assemble_tokens ("stq_u", newtok, 3, 1); - - /* emit "stq_u $t10, size-1($at)" */ - - set_tok_reg (newtok[0], AXP_REG_T10); - set_tok_const (newtok[1], (1 << lgsize)-1); - assemble_tokens ("stq_u", newtok, 3, 1); -} - -/* Sign extend a half-word or byte. The 32-bit sign extend is - implemented as "addl $31, $r, $t" in the opcode table. */ - -static void -emit_sextX (tok, ntok, vlgsize) - const expressionS *tok; - int ntok; - const PTR vlgsize; -{ - long lgsize = (long)vlgsize; - - if (alpha_target & AXP_OPCODE_BWX) - assemble_tokens (sextX_op[lgsize], tok, ntok, 0); - else - { - int bitshift = 64 - 8 * (1 << lgsize); - expressionS newtok[3]; - -#ifdef RELOC_OP_P - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const expressionS *reloc_exp = &tok[ntok-1]; - const struct alpha_reloc_op_tag *r - = ALPHA_RELOC_TABLE (reloc_exp->X_op); - - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc_exp->X_add_number, "setxt"); - ntok--; - } -#endif - - /* emit "sll src,bits,dst" */ - - newtok[0] = tok[0]; - set_tok_const (newtok[1], bitshift); - newtok[2] = tok[ntok - 1]; - assemble_tokens ("sll", newtok, 3, 1); - - /* emit "sra dst,bits,dst" */ - - newtok[0] = newtok[2]; - assemble_tokens ("sra", newtok, 3, 1); - } -} - -/* Implement the division and modulus macros. */ - -#ifdef OBJ_EVAX - -/* Make register usage like in normal procedure call. - Don't clobber PV and RA. */ - -static void -emit_division (tok, ntok, symname) - const expressionS *tok; - int ntok; - const PTR symname; -{ - /* DIVISION and MODULUS. Yech. - * - * Convert - * OP x,y,result - * to - * mov x,R16 # if x != R16 - * mov y,R17 # if y != R17 - * lda AT,__OP - * jsr AT,(AT),0 - * mov R0,result - * - * with appropriate optimizations if R0,R16,R17 are the registers - * specified by the compiler. - */ - - int xr, yr, rr; - symbolS *sym; - expressionS newtok[3]; - -#ifdef RELOC_OP_P - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const expressionS *reloc_exp = &tok[ntok-1]; - const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op); - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc_exp->X_add_number, (char char *)symname); - ntok--; - } -#endif - - xr = regno (tok[0].X_add_number); - yr = regno (tok[1].X_add_number); - - if (ntok < 3) - rr = xr; - else - rr = regno (tok[2].X_add_number); - - /* Move the operands into the right place */ - if (yr == AXP_REG_R16 && xr == AXP_REG_R17) - { - /* They are in exactly the wrong order -- swap through AT */ - - if (alpha_noat_on) - as_bad (_("macro requires $at register while noat in effect")); - - set_tok_reg (newtok[0], AXP_REG_R16); - set_tok_reg (newtok[1], AXP_REG_AT); - assemble_tokens ("mov", newtok, 2, 1); - - set_tok_reg (newtok[0], AXP_REG_R17); - set_tok_reg (newtok[1], AXP_REG_R16); - assemble_tokens ("mov", newtok, 2, 1); - - set_tok_reg (newtok[0], AXP_REG_AT); - set_tok_reg (newtok[1], AXP_REG_R17); - assemble_tokens ("mov", newtok, 2, 1); - } - else - { - if (yr == AXP_REG_R16) - { - set_tok_reg (newtok[0], AXP_REG_R16); - set_tok_reg (newtok[1], AXP_REG_R17); - assemble_tokens ("mov", newtok, 2, 1); - } - - if (xr != AXP_REG_R16) - { - set_tok_reg (newtok[0], xr); - set_tok_reg (newtok[1], AXP_REG_R16); - assemble_tokens ("mov", newtok, 2, 1); - } - - if (yr != AXP_REG_R16 && yr != AXP_REG_R17) - { - set_tok_reg (newtok[0], yr); - set_tok_reg (newtok[1], AXP_REG_R17); - assemble_tokens ("mov", newtok, 2, 1); - } - } - - sym = symbol_find_or_make ((const char *)symname); - - set_tok_reg (newtok[0], AXP_REG_AT); - set_tok_sym (newtok[1], sym, 0); - assemble_tokens ("lda", newtok, 2, 1); - - /* Call the division routine */ - set_tok_reg (newtok[0], AXP_REG_AT); - set_tok_cpreg (newtok[1], AXP_REG_AT); - set_tok_const (newtok[2], 0); - assemble_tokens ("jsr", newtok, 3, 1); - - /* Move the result to the right place */ - if (rr != AXP_REG_R0) - { - set_tok_reg (newtok[0], AXP_REG_R0); - set_tok_reg (newtok[1], rr); - assemble_tokens ("mov", newtok, 2, 1); - } -} - -#else /* !OBJ_EVAX */ - -static void -emit_division (tok, ntok, symname) - const expressionS *tok; - int ntok; - const PTR symname; -{ - /* DIVISION and MODULUS. Yech. - * Convert - * OP x,y,result - * to - * lda pv,__OP - * mov x,t10 - * mov y,t11 - * jsr t9,(pv),__OP - * mov t12,result - * - * with appropriate optimizations if t10,t11,t12 are the registers - * specified by the compiler. - */ - - int xr, yr, rr; - symbolS *sym; - expressionS newtok[3]; - -#ifdef RELOC_OP_P - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const expressionS *reloc_exp = &tok[ntok-1]; - const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op); - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc_exp->X_add_number, (const char *)symname); - ntok--; - } -#endif - - xr = regno (tok[0].X_add_number); - yr = regno (tok[1].X_add_number); - - if (ntok < 3) - rr = xr; - else - rr = regno (tok[2].X_add_number); - - sym = symbol_find_or_make ((const char *)symname); - - /* Move the operands into the right place */ - if (yr == AXP_REG_T10 && xr == AXP_REG_T11) - { - /* They are in exactly the wrong order -- swap through AT */ - - if (alpha_noat_on) - as_bad (_("macro requires $at register while noat in effect")); - - set_tok_reg (newtok[0], AXP_REG_T10); - set_tok_reg (newtok[1], AXP_REG_AT); - assemble_tokens ("mov", newtok, 2, 1); - - set_tok_reg (newtok[0], AXP_REG_T11); - set_tok_reg (newtok[1], AXP_REG_T10); - assemble_tokens ("mov", newtok, 2, 1); - - set_tok_reg (newtok[0], AXP_REG_AT); - set_tok_reg (newtok[1], AXP_REG_T11); - assemble_tokens ("mov", newtok, 2, 1); - } - else - { - if (yr == AXP_REG_T10) - { - set_tok_reg (newtok[0], AXP_REG_T10); - set_tok_reg (newtok[1], AXP_REG_T11); - assemble_tokens ("mov", newtok, 2, 1); - } - - if (xr != AXP_REG_T10) - { - set_tok_reg (newtok[0], xr); - set_tok_reg (newtok[1], AXP_REG_T10); - assemble_tokens ("mov", newtok, 2, 1); - } - - if (yr != AXP_REG_T10 && yr != AXP_REG_T11) - { - set_tok_reg (newtok[0], yr); - set_tok_reg (newtok[1], AXP_REG_T11); - assemble_tokens ("mov", newtok, 2, 1); - } - } - - /* Call the division routine */ - set_tok_reg (newtok[0], AXP_REG_T9); - set_tok_sym (newtok[1], sym, 0); - assemble_tokens ("jsr", newtok, 2, 1); - - /* Reload the GP register */ -#ifdef OBJ_AOUT -FIXME -#endif -#if defined(OBJ_ECOFF) || defined(OBJ_ELF) - set_tok_reg (newtok[0], alpha_gp_register); - set_tok_const (newtok[1], 0); - set_tok_preg (newtok[2], AXP_REG_T9); - assemble_tokens ("ldgp", newtok, 3, 1); -#endif - - /* Move the result to the right place */ - if (rr != AXP_REG_T12) - { - set_tok_reg (newtok[0], AXP_REG_T12); - set_tok_reg (newtok[1], rr); - assemble_tokens ("mov", newtok, 2, 1); - } -} - -#endif /* !OBJ_EVAX */ - -/* The jsr and jmp macros differ from their instruction counterparts - in that they can load the target address and default most - everything. */ - -static void -emit_jsrjmp (tok, ntok, vopname) - const expressionS *tok; - int ntok; - const PTR vopname; -{ - const char *opname = (const char *) vopname; - struct alpha_insn insn; - expressionS newtok[3]; - int r, tokidx = 0, lituse = 0; - -#ifdef RELOC_OP_P - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const expressionS *reloc_exp = &tok[ntok-1]; - const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op); - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc_exp->X_add_number, opname); - ntok--; - } -#endif - - if (tokidx < ntok && tok[tokidx].X_op == O_register) - r = regno (tok[tokidx++].X_add_number); - else - r = strcmp (opname, "jmp") == 0 ? AXP_REG_ZERO : AXP_REG_RA; - - set_tok_reg (newtok[0], r); - - if (tokidx < ntok && - (tok[tokidx].X_op == O_pregister || tok[tokidx].X_op == O_cpregister)) - r = regno (tok[tokidx++].X_add_number); -#ifdef OBJ_EVAX - /* keep register if jsr $n. */ -#else - else - { - int basereg = alpha_gp_register; - lituse = load_expression (r = AXP_REG_PV, &tok[tokidx], &basereg, NULL, - (const expressionS *)0); - } -#endif - - set_tok_cpreg (newtok[1], r); - -#ifdef OBJ_EVAX - /* FIXME: Add hint relocs to BFD for evax. */ -#else - if (tokidx < ntok) - newtok[2] = tok[tokidx]; - else -#endif - set_tok_const (newtok[2], 0); - - assemble_tokens_to_insn (opname, newtok, 3, &insn); - - /* add the LITUSE fixup */ - if (lituse) - { - assert (insn.nfixups < MAX_INSN_FIXUPS); - if (insn.nfixups > 0) - { - memmove (&insn.fixups[1], &insn.fixups[0], - sizeof(struct alpha_fixup) * insn.nfixups); - } - insn.nfixups++; - insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE; - insn.fixups[0].exp.X_op = O_symbol; - insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg); - insn.fixups[0].exp.X_add_number = LITUSE_JSR; - } - - emit_insn (&insn); -} - -/* The ret and jcr instructions differ from their instruction - counterparts in that everything can be defaulted. */ - -static void -emit_retjcr (tok, ntok, vopname) - const expressionS *tok; - int ntok; - const PTR vopname; -{ - const char *opname = (const char *)vopname; - expressionS newtok[3]; - int r, tokidx = 0; - -#ifdef RELOC_OP_P - if (ntok && USER_RELOC_P (tok[ntok-1].X_op)) - { - const expressionS *reloc_exp = &tok[ntok-1]; - const struct alpha_reloc_op_tag *r = ALPHA_RELOC_TABLE (reloc_exp->X_op); - as_bad (_("Cannot use !%s!%d with %s"), r->name, - (int)reloc_exp->X_add_number, opname); - ntok--; - } -#endif - - if (tokidx < ntok && tok[tokidx].X_op == O_register) - r = regno (tok[tokidx++].X_add_number); - else - r = AXP_REG_ZERO; - - set_tok_reg (newtok[0], r); - - if (tokidx < ntok && - (tok[tokidx].X_op == O_pregister || tok[tokidx].X_op == O_cpregister)) - r = regno (tok[tokidx++].X_add_number); - else - r = AXP_REG_RA; - - set_tok_cpreg (newtok[1], r); - - if (tokidx < ntok) - newtok[2] = tok[tokidx]; - else - set_tok_const (newtok[2], strcmp(opname, "ret") == 0); - - assemble_tokens (opname, newtok, 3, 0); -} - -/* Assembler directives */ - -/* Handle the .text pseudo-op. This is like the usual one, but it - clears alpha_insn_label and restores auto alignment. */ - -static void -s_alpha_text (i) - int i; - -{ - s_text (i); - alpha_insn_label = NULL; - alpha_auto_align_on = 1; - alpha_current_align = 0; -} - -/* Handle the .data pseudo-op. This is like the usual one, but it - clears alpha_insn_label and restores auto alignment. */ - -static void -s_alpha_data (i) - int i; -{ - s_data (i); - alpha_insn_label = NULL; - alpha_auto_align_on = 1; - alpha_current_align = 0; -} - -#if defined (OBJ_ECOFF) || defined (OBJ_EVAX) - -/* Handle the OSF/1 and openVMS .comm pseudo quirks. - openVMS constructs a section for every common symbol. */ - -static void -s_alpha_comm (ignore) - int ignore; -{ - register char *name; - register char c; - register char *p; - offsetT temp; - register symbolS *symbolP; - -#ifdef OBJ_EVAX - segT current_section = now_seg; - int current_subsec = now_subseg; - segT new_seg; -#endif - - name = input_line_pointer; - c = get_symbol_end (); - - /* just after name is now '\0' */ - p = input_line_pointer; - *p = c; - - SKIP_WHITESPACE (); - - /* Alpha OSF/1 compiler doesn't provide the comma, gcc does. */ - if (*input_line_pointer == ',') - { - input_line_pointer++; - SKIP_WHITESPACE (); - } - if ((temp = get_absolute_expression ()) < 0) - { - as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp); - ignore_rest_of_line (); - return; - } - - *p = 0; - symbolP = symbol_find_or_make (name); - -#ifdef OBJ_EVAX - /* Make a section for the common symbol. */ - new_seg = subseg_new (xstrdup (name), 0); -#endif - - *p = c; - -#ifdef OBJ_EVAX - /* alignment might follow */ - if (*input_line_pointer == ',') - { - offsetT align; - - input_line_pointer++; - align = get_absolute_expression (); - bfd_set_section_alignment (stdoutput, new_seg, align); - } -#endif - - if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP)) - { - as_bad (_("Ignoring attempt to re-define symbol")); - ignore_rest_of_line (); - return; - } - -#ifdef OBJ_EVAX - if (bfd_section_size (stdoutput, new_seg) > 0) - { - if (bfd_section_size (stdoutput, new_seg) != temp) - as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."), - S_GET_NAME (symbolP), - (long) bfd_section_size (stdoutput, new_seg), - (long) temp); - } -#else - if (S_GET_VALUE (symbolP)) - { - if (S_GET_VALUE (symbolP) != (valueT) temp) - as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."), - S_GET_NAME (symbolP), - (long) S_GET_VALUE (symbolP), - (long) temp); - } -#endif - else - { -#ifdef OBJ_EVAX - subseg_set (new_seg, 0); - p = frag_more (temp); - new_seg->flags |= SEC_IS_COMMON; - if (! S_IS_DEFINED (symbolP)) - S_SET_SEGMENT (symbolP, new_seg); -#else - S_SET_VALUE (symbolP, (valueT) temp); -#endif - S_SET_EXTERNAL (symbolP); - } - -#ifdef OBJ_EVAX - subseg_set (current_section, current_subsec); -#endif - - know (symbol_get_frag (symbolP) == &zero_address_frag); - - demand_empty_rest_of_line (); -} - -#endif /* ! OBJ_ELF */ - -#ifdef OBJ_ECOFF - -/* Handle the .rdata pseudo-op. This is like the usual one, but it - clears alpha_insn_label and restores auto alignment. */ - -static void -s_alpha_rdata (ignore) - int ignore; -{ - int temp; - - temp = get_absolute_expression (); - subseg_new (".rdata", 0); - demand_empty_rest_of_line (); - alpha_insn_label = NULL; - alpha_auto_align_on = 1; - alpha_current_align = 0; -} - -#endif - -#ifdef OBJ_ECOFF - -/* Handle the .sdata pseudo-op. This is like the usual one, but it - clears alpha_insn_label and restores auto alignment. */ - -static void -s_alpha_sdata (ignore) - int ignore; -{ - int temp; - - temp = get_absolute_expression (); - subseg_new (".sdata", 0); - demand_empty_rest_of_line (); - alpha_insn_label = NULL; - alpha_auto_align_on = 1; - alpha_current_align = 0; -} -#endif - -#ifdef OBJ_ELF - -/* Handle the .section pseudo-op. This is like the usual one, but it - clears alpha_insn_label and restores auto alignment. */ - -static void -s_alpha_section (ignore) - int ignore; -{ - obj_elf_section (ignore); - - alpha_insn_label = NULL; - alpha_auto_align_on = 1; - alpha_current_align = 0; -} - -static void -s_alpha_ent (dummy) - int dummy ATTRIBUTE_UNUSED; -{ - if (ECOFF_DEBUGGING) - ecoff_directive_ent (0); - else - { - char *name, name_end; - name = input_line_pointer; - name_end = get_symbol_end (); - - if (! is_name_beginner (*name)) - { - as_warn (_(".ent directive has no name")); - *input_line_pointer = name_end; - } - else - { - symbolS *sym; - - if (alpha_cur_ent_sym) - as_warn (_("nested .ent directives")); - - sym = symbol_find_or_make (name); - symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION; - alpha_cur_ent_sym = sym; - - /* The .ent directive is sometimes followed by a number. Not sure - what it really means, but ignore it. */ - *input_line_pointer = name_end; - SKIP_WHITESPACE (); - if (*input_line_pointer == ',') - { - input_line_pointer++; - SKIP_WHITESPACE (); - } - if (isdigit (*input_line_pointer) || *input_line_pointer == '-') - (void) get_absolute_expression (); - } - demand_empty_rest_of_line (); - } -} - -static void -s_alpha_end (dummy) - int dummy ATTRIBUTE_UNUSED; -{ - if (ECOFF_DEBUGGING) - ecoff_directive_end (0); - else - { - char *name, name_end; - name = input_line_pointer; - name_end = get_symbol_end (); - - if (! is_name_beginner (*name)) - { - as_warn (_(".end directive has no name")); - *input_line_pointer = name_end; - } - else - { - symbolS *sym; - - sym = symbol_find (name); - if (sym != alpha_cur_ent_sym) - as_warn (_(".end directive names different symbol than .ent")); - - /* Create an expression to calculate the size of the function. */ - if (sym) - { - symbol_get_obj (sym)->size = - (expressionS *) xmalloc (sizeof (expressionS)); - symbol_get_obj (sym)->size->X_op = O_subtract; - symbol_get_obj (sym)->size->X_add_symbol - = symbol_new ("L0\001", now_seg, frag_now_fix (), frag_now); - symbol_get_obj (sym)->size->X_op_symbol = sym; - symbol_get_obj (sym)->size->X_add_number = 0; - } - - alpha_cur_ent_sym = NULL; - - *input_line_pointer = name_end; - } - demand_empty_rest_of_line (); - } -} - -static void -s_alpha_mask (fp) - int fp; -{ - if (ECOFF_DEBUGGING) - { - if (fp) - ecoff_directive_fmask (0); - else - ecoff_directive_mask (0); - } - else - discard_rest_of_line (); -} - -static void -s_alpha_frame (dummy) - int dummy ATTRIBUTE_UNUSED; -{ - if (ECOFF_DEBUGGING) - ecoff_directive_frame (0); - else - discard_rest_of_line (); -} - -static void -s_alpha_prologue (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - symbolS *sym; - int arg; - - arg = get_absolute_expression (); - demand_empty_rest_of_line (); - - if (ECOFF_DEBUGGING) - sym = ecoff_get_cur_proc_sym (); - else - sym = alpha_cur_ent_sym; - know (sym != NULL); - - switch (arg) - { - case 0: /* No PV required. */ - S_SET_OTHER (sym, STO_ALPHA_NOPV); - break; - case 1: /* Std GP load. */ - S_SET_OTHER (sym, STO_ALPHA_STD_GPLOAD); - break; - case 2: /* Non-std use of PV. */ - break; - - default: - as_bad (_("Invalid argument %d to .prologue."), arg); - break; - } -} - -static void -s_alpha_coff_wrapper (which) - int which; -{ - static void (* const fns[]) PARAMS ((int)) = { - ecoff_directive_begin, - ecoff_directive_bend, - ecoff_directive_def, - ecoff_directive_dim, - ecoff_directive_endef, - ecoff_directive_file, - ecoff_directive_scl, - ecoff_directive_tag, - ecoff_directive_val, - ecoff_directive_loc, - }; - - assert (which >= 0 && which < (int)(sizeof(fns)/sizeof(*fns))); - - if (ECOFF_DEBUGGING) - (*fns[which])(0); - else - { - as_bad (_("ECOFF debugging is disabled.")); - ignore_rest_of_line (); - } -} -#endif /* OBJ_ELF */ - -#ifdef OBJ_EVAX - -/* Handle the section specific pseudo-op. */ - -static void -s_alpha_section (secid) - int secid; -{ - int temp; -#define EVAX_SECTION_COUNT 5 - static char *section_name[EVAX_SECTION_COUNT+1] = - { "NULL", ".rdata", ".comm", ".link", ".ctors", ".dtors" }; - - if ((secid <= 0) || (secid > EVAX_SECTION_COUNT)) - { - as_fatal (_("Unknown section directive")); - demand_empty_rest_of_line (); - return; - } - temp = get_absolute_expression (); - subseg_new (section_name[secid], 0); - demand_empty_rest_of_line (); - alpha_insn_label = NULL; - alpha_auto_align_on = 1; - alpha_current_align = 0; -} - - -/* Parse .ent directives. */ - -static void -s_alpha_ent (ignore) - int ignore; -{ - symbolS *symbol; - expressionS symexpr; - - alpha_evax_proc.pdsckind = 0; - alpha_evax_proc.framereg = -1; - alpha_evax_proc.framesize = 0; - alpha_evax_proc.rsa_offset = 0; - alpha_evax_proc.ra_save = AXP_REG_RA; - alpha_evax_proc.fp_save = -1; - alpha_evax_proc.imask = 0; - alpha_evax_proc.fmask = 0; - alpha_evax_proc.prologue = 0; - alpha_evax_proc.type = 0; - - expression (&symexpr); - - if (symexpr.X_op != O_symbol) - { - as_fatal (_(".ent directive has no symbol")); - demand_empty_rest_of_line (); - return; - } - - symbol = make_expr_symbol (&symexpr); - symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION; - alpha_evax_proc.symbol = symbol; - - demand_empty_rest_of_line (); - return; -} - - -/* Parse .frame ,,RA, directives. */ - -static void -s_alpha_frame (ignore) - int ignore; -{ - long val; - - alpha_evax_proc.framereg = tc_get_register (1); - - SKIP_WHITESPACE (); - if (*input_line_pointer++ != ',' - || get_absolute_expression_and_terminator (&val) != ',') - { - as_warn (_("Bad .frame directive 1./2. param")); - --input_line_pointer; - demand_empty_rest_of_line (); - return; - } - - alpha_evax_proc.framesize = val; - - (void) tc_get_register (1); - SKIP_WHITESPACE (); - if (*input_line_pointer++ != ',') - { - as_warn (_("Bad .frame directive 3./4. param")); - --input_line_pointer; - demand_empty_rest_of_line (); - return; - } - alpha_evax_proc.rsa_offset = get_absolute_expression (); - - return; -} - -static void -s_alpha_pdesc (ignore) - int ignore; -{ - char *name; - char name_end; - long val; - register char *p; - expressionS exp; - symbolS *entry_sym; - fixS *fixp; - segment_info_type *seginfo = seg_info (alpha_link_section); - - if (now_seg != alpha_link_section) - { - as_bad (_(".pdesc directive not in link (.link) section")); - demand_empty_rest_of_line (); - return; - } - - if ((alpha_evax_proc.symbol == 0) - || (!S_IS_DEFINED (alpha_evax_proc.symbol))) - { - as_fatal (_(".pdesc has no matching .ent")); - demand_empty_rest_of_line (); - return; - } - - *symbol_get_obj (alpha_evax_proc.symbol) = - (valueT) seginfo->literal_pool_size; - - expression (&exp); - if (exp.X_op != O_symbol) - { - as_warn (_(".pdesc directive has no entry symbol")); - demand_empty_rest_of_line (); - return; - } - - entry_sym = make_expr_symbol (&exp); - /* Save bfd symbol of proc desc in function symbol. */ - symbol_get_bfdsym (alpha_evax_proc.symbol)->udata.p - = symbol_get_bfdsym (entry_sym); - - SKIP_WHITESPACE (); - if (*input_line_pointer++ != ',') - { - as_warn (_("No comma after .pdesc ")); - demand_empty_rest_of_line (); - return; - } - - SKIP_WHITESPACE (); - name = input_line_pointer; - name_end = get_symbol_end (); - - if (strncmp(name, "stack", 5) == 0) - { - alpha_evax_proc.pdsckind = PDSC_S_K_KIND_FP_STACK; - } - else if (strncmp(name, "reg", 3) == 0) - { - alpha_evax_proc.pdsckind = PDSC_S_K_KIND_FP_REGISTER; - } - else if (strncmp(name, "null", 4) == 0) - { - alpha_evax_proc.pdsckind = PDSC_S_K_KIND_NULL; - } - else - { - as_fatal (_("unknown procedure kind")); - demand_empty_rest_of_line (); - return; - } - - *input_line_pointer = name_end; - demand_empty_rest_of_line (); - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - frag_align (3, 0, 0); - p = frag_more (16); - fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0); - fixp->fx_done = 1; - seginfo->literal_pool_size += 16; - - *p = alpha_evax_proc.pdsckind - | ((alpha_evax_proc.framereg == 29) ? PDSC_S_M_BASE_REG_IS_FP : 0); - *(p+1) = PDSC_S_M_NATIVE - | PDSC_S_M_NO_JACKET; - - switch (alpha_evax_proc.pdsckind) - { - case PDSC_S_K_KIND_NULL: - *(p+2) = 0; - *(p+3) = 0; - break; - case PDSC_S_K_KIND_FP_REGISTER: - *(p+2) = alpha_evax_proc.fp_save; - *(p+3) = alpha_evax_proc.ra_save; - break; - case PDSC_S_K_KIND_FP_STACK: - md_number_to_chars (p+2, (valueT)alpha_evax_proc.rsa_offset, 2); - break; - default: /* impossible */ - break; - } - - *(p+4) = 0; - *(p+5) = alpha_evax_proc.type & 0x0f; - - /* Signature offset. */ - md_number_to_chars (p+6, (valueT)0, 2); - - fix_new_exp (frag_now, p-frag_now->fr_literal+8, 8, &exp, 0, BFD_RELOC_64); - - if (alpha_evax_proc.pdsckind == PDSC_S_K_KIND_NULL) - return; - - /* Add dummy fix to make add_to_link_pool work. */ - p = frag_more (8); - fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0); - fixp->fx_done = 1; - seginfo->literal_pool_size += 8; - - /* pdesc+16: Size. */ - md_number_to_chars (p, (valueT)alpha_evax_proc.framesize, 4); - - md_number_to_chars (p+4, (valueT)0, 2); - - /* Entry length. */ - md_number_to_chars (p+6, alpha_evax_proc.prologue, 2); - - if (alpha_evax_proc.pdsckind == PDSC_S_K_KIND_FP_REGISTER) - return; - - /* Add dummy fix to make add_to_link_pool work. */ - p = frag_more (8); - fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0); - fixp->fx_done = 1; - seginfo->literal_pool_size += 8; - - /* pdesc+24: register masks. */ - - md_number_to_chars (p, alpha_evax_proc.imask, 4); - md_number_to_chars (p+4, alpha_evax_proc.fmask, 4); - - return; -} - - -/* Support for crash debug on vms. */ - -static void -s_alpha_name (ignore) - int ignore; -{ - register char *p; - expressionS exp; - segment_info_type *seginfo = seg_info (alpha_link_section); - - if (now_seg != alpha_link_section) - { - as_bad (_(".name directive not in link (.link) section")); - demand_empty_rest_of_line (); - return; - } - - expression (&exp); - if (exp.X_op != O_symbol) - { - as_warn (_(".name directive has no symbol")); - demand_empty_rest_of_line (); - return; - } - - demand_empty_rest_of_line (); - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - frag_align (3, 0, 0); - p = frag_more (8); - seginfo->literal_pool_size += 8; - - fix_new_exp (frag_now, p-frag_now->fr_literal, 8, &exp, 0, BFD_RELOC_64); - - return; -} - - -static void -s_alpha_linkage (ignore) - int ignore; -{ - expressionS exp; - char *p; - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - expression (&exp); - if (exp.X_op != O_symbol) - { - as_fatal (_("No symbol after .linkage")); - } - else - { - p = frag_more (LKP_S_K_SIZE); - memset (p, 0, LKP_S_K_SIZE); - fix_new_exp (frag_now, p - frag_now->fr_literal, LKP_S_K_SIZE, &exp, 0,\ - BFD_RELOC_ALPHA_LINKAGE); - } - demand_empty_rest_of_line (); - - return; -} - - -static void -s_alpha_code_address (ignore) - int ignore; -{ - expressionS exp; - char *p; - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - expression (&exp); - if (exp.X_op != O_symbol) - { - as_fatal (_("No symbol after .code_address")); - } - else - { - p = frag_more (8); - memset (p, 0, 8); - fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &exp, 0,\ - BFD_RELOC_ALPHA_CODEADDR); - } - demand_empty_rest_of_line (); - - return; -} - - -static void -s_alpha_fp_save (ignore) - int ignore; -{ - - alpha_evax_proc.fp_save = tc_get_register (1); - - demand_empty_rest_of_line (); - return; -} - - -static void -s_alpha_mask (ignore) - int ignore; -{ - long val; - - if (get_absolute_expression_and_terminator (&val) != ',') - { - as_warn (_("Bad .mask directive")); - --input_line_pointer; - } - else - { - alpha_evax_proc.imask = val; - (void)get_absolute_expression (); - } - demand_empty_rest_of_line (); - - return; -} - - -static void -s_alpha_fmask (ignore) - int ignore; -{ - long val; - - if (get_absolute_expression_and_terminator (&val) != ',') - { - as_warn (_("Bad .fmask directive")); - --input_line_pointer; - } - else - { - alpha_evax_proc.fmask = val; - (void) get_absolute_expression (); - } - demand_empty_rest_of_line (); - - return; -} - -static void -s_alpha_end (ignore) - int ignore; -{ - char c; - - c = get_symbol_end (); - *input_line_pointer = c; - demand_empty_rest_of_line (); - alpha_evax_proc.symbol = 0; - - return; -} - - -static void -s_alpha_file (ignore) - int ignore; -{ - symbolS *s; - int length; - static char case_hack[32]; - - extern char *demand_copy_string PARAMS ((int *lenP)); - - sprintf (case_hack, "", - alpha_flag_hash_long_names, alpha_flag_show_after_trunc); - - s = symbol_find_or_make (case_hack); - symbol_get_bfdsym (s)->flags |= BSF_FILE; - - get_absolute_expression (); - s = symbol_find_or_make (demand_copy_string (&length)); - symbol_get_bfdsym (s)->flags |= BSF_FILE; - demand_empty_rest_of_line (); - - return; -} -#endif /* OBJ_EVAX */ - -/* Handle the .gprel32 pseudo op. */ - -static void -s_alpha_gprel32 (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - expressionS e; - char *p; - - SKIP_WHITESPACE (); - expression (&e); - -#ifdef OBJ_ELF - switch (e.X_op) - { - case O_constant: - e.X_add_symbol = section_symbol(absolute_section); - e.X_op = O_symbol; - /* FALLTHRU */ - case O_symbol: - break; - default: - abort(); - } -#else -#ifdef OBJ_ECOFF - switch (e.X_op) - { - case O_constant: - e.X_add_symbol = section_symbol (absolute_section); - /* fall through */ - case O_symbol: - e.X_op = O_subtract; - e.X_op_symbol = alpha_gp_symbol; - break; - default: - abort (); - } -#endif -#endif - - if (alpha_auto_align_on && alpha_current_align < 2) - alpha_align (2, (char *) NULL, alpha_insn_label, 0); - if (alpha_current_align > 2) - alpha_current_align = 2; - alpha_insn_label = NULL; - - p = frag_more (4); - memset (p, 0, 4); - fix_new_exp (frag_now, p-frag_now->fr_literal, 4, - &e, 0, BFD_RELOC_GPREL32); -} - -/* Handle floating point allocation pseudo-ops. This is like the - generic vresion, but it makes sure the current label, if any, is - correctly aligned. */ - -static void -s_alpha_float_cons (type) - int type; -{ - int log_size; - - switch (type) - { - default: - case 'f': - case 'F': - log_size = 2; - break; - - case 'd': - case 'D': - case 'G': - log_size = 3; - break; - - case 'x': - case 'X': - case 'p': - case 'P': - log_size = 4; - break; - } - - if (alpha_auto_align_on && alpha_current_align < log_size) - alpha_align (log_size, (char *) NULL, alpha_insn_label, 0); - if (alpha_current_align > log_size) - alpha_current_align = log_size; - alpha_insn_label = NULL; - - float_cons (type); -} - -/* Handle the .proc pseudo op. We don't really do much with it except - parse it. */ - -static void -s_alpha_proc (is_static) - int is_static ATTRIBUTE_UNUSED; -{ - char *name; - char c; - char *p; - symbolS *symbolP; - int temp; - - /* Takes ".proc name,nargs" */ - SKIP_WHITESPACE (); - name = input_line_pointer; - c = get_symbol_end (); - p = input_line_pointer; - symbolP = symbol_find_or_make (name); - *p = c; - SKIP_WHITESPACE (); - if (*input_line_pointer != ',') - { - *p = 0; - as_warn (_("Expected comma after name \"%s\""), name); - *p = c; - temp = 0; - ignore_rest_of_line (); - } - else - { - input_line_pointer++; - temp = get_absolute_expression (); - } - /* *symbol_get_obj (symbolP) = (signed char) temp; */ - as_warn (_("unhandled: .proc %s,%d"), name, temp); - demand_empty_rest_of_line (); -} - -/* Handle the .set pseudo op. This is used to turn on and off most of - the assembler features. */ - -static void -s_alpha_set (x) - int x ATTRIBUTE_UNUSED; -{ - char *name, ch, *s; - int yesno = 1; - - SKIP_WHITESPACE (); - name = input_line_pointer; - ch = get_symbol_end (); - - s = name; - if (s[0] == 'n' && s[1] == 'o') - { - yesno = 0; - s += 2; - } - if (!strcmp ("reorder", s)) - /* ignore */ ; - else if (!strcmp ("at", s)) - alpha_noat_on = !yesno; - else if (!strcmp ("macro", s)) - alpha_macros_on = yesno; - else if (!strcmp ("move", s)) - /* ignore */ ; - else if (!strcmp ("volatile", s)) - /* ignore */ ; - else - as_warn (_("Tried to .set unrecognized mode `%s'"), name); - - *input_line_pointer = ch; - demand_empty_rest_of_line (); -} - -/* Handle the .base pseudo op. This changes the assembler's notion of - the $gp register. */ - -static void -s_alpha_base (ignore) - int ignore ATTRIBUTE_UNUSED; -{ -#if 0 - if (first_32bit_quadrant) - { - /* not fatal, but it might not work in the end */ - as_warn (_("File overrides no-base-register option.")); - first_32bit_quadrant = 0; - } -#endif - - SKIP_WHITESPACE (); - if (*input_line_pointer == '$') - { /* $rNN form */ - input_line_pointer++; - if (*input_line_pointer == 'r') - input_line_pointer++; - } - - alpha_gp_register = get_absolute_expression (); - if (alpha_gp_register < 0 || alpha_gp_register > 31) - { - alpha_gp_register = AXP_REG_GP; - as_warn (_("Bad base register, using $%d."), alpha_gp_register); - } - - demand_empty_rest_of_line (); -} - -/* Handle the .align pseudo-op. This aligns to a power of two. It - also adjusts any current instruction label. We treat this the same - way the MIPS port does: .align 0 turns off auto alignment. */ - -static void -s_alpha_align (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - int align; - char fill, *pfill; - long max_alignment = 15; - - align = get_absolute_expression (); - if (align > max_alignment) - { - align = max_alignment; - as_bad (_("Alignment too large: %d. assumed"), align); - } - else if (align < 0) - { - as_warn (_("Alignment negative: 0 assumed")); - align = 0; - } - - if (*input_line_pointer == ',') - { - input_line_pointer++; - fill = get_absolute_expression (); - pfill = &fill; - } - else - pfill = NULL; - - if (align != 0) - { - alpha_auto_align_on = 1; - alpha_align (align, pfill, alpha_insn_label, 1); - } - else - { - alpha_auto_align_on = 0; - } - - demand_empty_rest_of_line (); -} - -/* Hook the normal string processor to reset known alignment. */ - -static void -s_alpha_stringer (terminate) - int terminate; -{ - alpha_current_align = 0; - alpha_insn_label = NULL; - stringer (terminate); -} - -/* Hook the normal space processing to reset known alignment. */ - -static void -s_alpha_space (ignore) - int ignore; -{ - alpha_current_align = 0; - alpha_insn_label = NULL; - s_space (ignore); -} - -/* Hook into cons for auto-alignment. */ - -void -alpha_cons_align (size) - int size; -{ - int log_size; - - log_size = 0; - while ((size >>= 1) != 0) - ++log_size; - - if (alpha_auto_align_on && alpha_current_align < log_size) - alpha_align (log_size, (char *) NULL, alpha_insn_label, 0); - if (alpha_current_align > log_size) - alpha_current_align = log_size; - alpha_insn_label = NULL; -} - -/* Here come the .uword, .ulong, and .uquad explicitly unaligned - pseudos. We just turn off auto-alignment and call down to cons. */ - -static void -s_alpha_ucons (bytes) - int bytes; -{ - int hold = alpha_auto_align_on; - alpha_auto_align_on = 0; - cons (bytes); - alpha_auto_align_on = hold; -} - -/* Switch the working cpu type. */ - -static void -s_alpha_arch (ignored) - int ignored ATTRIBUTE_UNUSED; -{ - char *name, ch; - const struct cpu_type *p; - - SKIP_WHITESPACE (); - name = input_line_pointer; - ch = get_symbol_end (); - - for (p = cpu_types; p->name; ++p) - if (strcmp(name, p->name) == 0) - { - alpha_target_name = p->name, alpha_target = p->flags; - goto found; - } - as_warn("Unknown CPU identifier `%s'", name); - -found: - *input_line_pointer = ch; - demand_empty_rest_of_line (); -} - - - -#ifdef DEBUG1 -/* print token expression with alpha specific extension. */ - -static void -alpha_print_token(f, exp) - FILE *f; - const expressionS *exp; -{ - switch (exp->X_op) - { - case O_cpregister: - putc (',', f); - /* FALLTHRU */ - case O_pregister: - putc ('(', f); - { - expressionS nexp = *exp; - nexp.X_op = O_register; - print_expr (f, &nexp); - } - putc (')', f); - break; - default: - print_expr (f, exp); - break; - } - return; -} -#endif - -/* The target specific pseudo-ops which we support. */ - -const pseudo_typeS md_pseudo_table[] = -{ -#ifdef OBJ_ECOFF - {"comm", s_alpha_comm, 0}, /* osf1 compiler does this */ - {"rdata", s_alpha_rdata, 0}, -#endif - {"text", s_alpha_text, 0}, - {"data", s_alpha_data, 0}, -#ifdef OBJ_ECOFF - {"sdata", s_alpha_sdata, 0}, -#endif -#ifdef OBJ_ELF - {"section", s_alpha_section, 0}, - {"section.s", s_alpha_section, 0}, - {"sect", s_alpha_section, 0}, - {"sect.s", s_alpha_section, 0}, -#endif -#ifdef OBJ_EVAX - { "pdesc", s_alpha_pdesc, 0}, - { "name", s_alpha_name, 0}, - { "linkage", s_alpha_linkage, 0}, - { "code_address", s_alpha_code_address, 0}, - { "ent", s_alpha_ent, 0}, - { "frame", s_alpha_frame, 0}, - { "fp_save", s_alpha_fp_save, 0}, - { "mask", s_alpha_mask, 0}, - { "fmask", s_alpha_fmask, 0}, - { "end", s_alpha_end, 0}, - { "file", s_alpha_file, 0}, - { "rdata", s_alpha_section, 1}, - { "comm", s_alpha_comm, 0}, - { "link", s_alpha_section, 3}, - { "ctors", s_alpha_section, 4}, - { "dtors", s_alpha_section, 5}, -#endif -#ifdef OBJ_ELF - /* Frame related pseudos. */ - {"ent", s_alpha_ent, 0}, - {"end", s_alpha_end, 0}, - {"mask", s_alpha_mask, 0}, - {"fmask", s_alpha_mask, 1}, - {"frame", s_alpha_frame, 0}, - {"prologue", s_alpha_prologue, 0}, - /* COFF debugging related pseudos. */ - {"begin", s_alpha_coff_wrapper, 0}, - {"bend", s_alpha_coff_wrapper, 1}, - {"def", s_alpha_coff_wrapper, 2}, - {"dim", s_alpha_coff_wrapper, 3}, - {"endef", s_alpha_coff_wrapper, 4}, - {"file", s_alpha_coff_wrapper, 5}, - {"scl", s_alpha_coff_wrapper, 6}, - {"tag", s_alpha_coff_wrapper, 7}, - {"val", s_alpha_coff_wrapper, 8}, - {"loc", s_alpha_coff_wrapper, 9}, -#else - {"prologue", s_ignore, 0}, -#endif - {"gprel32", s_alpha_gprel32, 0}, - {"t_floating", s_alpha_float_cons, 'd'}, - {"s_floating", s_alpha_float_cons, 'f'}, - {"f_floating", s_alpha_float_cons, 'F'}, - {"g_floating", s_alpha_float_cons, 'G'}, - {"d_floating", s_alpha_float_cons, 'D'}, - - {"proc", s_alpha_proc, 0}, - {"aproc", s_alpha_proc, 1}, - {"set", s_alpha_set, 0}, - {"reguse", s_ignore, 0}, - {"livereg", s_ignore, 0}, - {"base", s_alpha_base, 0}, /*??*/ - {"option", s_ignore, 0}, - {"aent", s_ignore, 0}, - {"ugen", s_ignore, 0}, - {"eflag", s_ignore, 0}, - - {"align", s_alpha_align, 0}, - {"double", s_alpha_float_cons, 'd'}, - {"float", s_alpha_float_cons, 'f'}, - {"single", s_alpha_float_cons, 'f'}, - {"ascii", s_alpha_stringer, 0}, - {"asciz", s_alpha_stringer, 1}, - {"string", s_alpha_stringer, 1}, - {"space", s_alpha_space, 0}, - {"skip", s_alpha_space, 0}, - {"zero", s_alpha_space, 0}, - -/* Unaligned data pseudos. */ - {"uword", s_alpha_ucons, 2}, - {"ulong", s_alpha_ucons, 4}, - {"uquad", s_alpha_ucons, 8}, - -#ifdef OBJ_ELF -/* Dwarf wants these versions of unaligned. */ - {"2byte", s_alpha_ucons, 2}, - {"4byte", s_alpha_ucons, 4}, - {"8byte", s_alpha_ucons, 8}, -#endif - -/* We don't do any optimizing, so we can safely ignore these. */ - {"noalias", s_ignore, 0}, - {"alias", s_ignore, 0}, - - {"arch", s_alpha_arch, 0}, - - {NULL, 0, 0}, -}; - - -/* Build a BFD section with its flags set appropriately for the .lita, - .lit8, or .lit4 sections. */ - -static void -create_literal_section (name, secp, symp) - const char *name; - segT *secp; - symbolS **symp; -{ - segT current_section = now_seg; - int current_subsec = now_subseg; - segT new_sec; - - *secp = new_sec = subseg_new (name, 0); - subseg_set (current_section, current_subsec); - bfd_set_section_alignment (stdoutput, new_sec, 4); - bfd_set_section_flags (stdoutput, new_sec, - SEC_RELOC | SEC_ALLOC | SEC_LOAD | SEC_READONLY - | SEC_DATA); - - S_CLEAR_EXTERNAL (*symp = section_symbol (new_sec)); -} - -#ifdef OBJ_ECOFF - -/* @@@ GP selection voodoo. All of this seems overly complicated and - unnecessary; which is the primary reason it's for ECOFF only. */ - -static inline void -maybe_set_gp (sec) - asection *sec; -{ - bfd_vma vma; - if (!sec) - return; - vma = bfd_get_section_vma (foo, sec); - if (vma && vma < alpha_gp_value) - alpha_gp_value = vma; -} - -static void -select_gp_value () -{ - assert (alpha_gp_value == 0); - - /* Get minus-one in whatever width... */ - alpha_gp_value = 0; alpha_gp_value--; - - /* Select the smallest VMA of these existing sections. */ - maybe_set_gp (alpha_lita_section); -#if 0 - /* These were disabled before -- should we use them? */ - maybe_set_gp (sdata); - maybe_set_gp (lit8_sec); - maybe_set_gp (lit4_sec); -#endif - -/* @@ Will a simple 0x8000 work here? If not, why not? */ -#define GP_ADJUSTMENT (0x8000 - 0x10) - - alpha_gp_value += GP_ADJUSTMENT; - - S_SET_VALUE (alpha_gp_symbol, alpha_gp_value); - -#ifdef DEBUG1 - printf (_("Chose GP value of %lx\n"), alpha_gp_value); -#endif -} -#endif /* OBJ_ECOFF */ - -/* Called internally to handle all alignment needs. This takes care - of eliding calls to frag_align if'n the cached current alignment - says we've already got it, as well as taking care of the auto-align - feature wrt labels. */ - -static void -alpha_align (n, pfill, label, force) - int n; - char *pfill; - symbolS *label; - int force ATTRIBUTE_UNUSED; -{ - if (alpha_current_align >= n) - return; - - if (pfill == NULL) - { - if (n > 2 - && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0) - { - static char const unop[4] = { 0x00, 0x00, 0xe0, 0x2f }; - static char const nopunop[8] = { - 0x1f, 0x04, 0xff, 0x47, - 0x00, 0x00, 0xe0, 0x2f - }; - - /* First, make sure we're on a four-byte boundary, in case - someone has been putting .byte values into the text - section. The DEC assembler silently fills with unaligned - no-op instructions. This will zero-fill, then nop-fill - with proper alignment. */ - if (alpha_current_align < 2) - frag_align (2, 0, 0); - if (alpha_current_align < 3) - frag_align_pattern (3, unop, sizeof unop, 0); - if (n > 3) - frag_align_pattern (n, nopunop, sizeof nopunop, 0); - } - else - frag_align (n, 0, 0); - } - else - frag_align (n, *pfill, 0); - - alpha_current_align = n; - - if (label != NULL && S_GET_SEGMENT (label) == now_seg) - { - symbol_set_frag (label, frag_now); - S_SET_VALUE (label, (valueT) frag_now_fix ()); - } - - record_alignment (now_seg, n); - - /* ??? if alpha_flag_relax && force && elf, record the requested alignment - in a reloc for the linker to see. */ -} - -/* The Alpha has support for some VAX floating point types, as well as for - IEEE floating point. We consider IEEE to be the primary floating point - format, and sneak in the VAX floating point support here. */ -#define md_atof vax_md_atof -#include "config/atof-vax.c" diff --git a/gas/config/tc-alpha.h b/gas/config/tc-alpha.h deleted file mode 100644 index 632b04ebc3c..00000000000 --- a/gas/config/tc-alpha.h +++ /dev/null @@ -1,148 +0,0 @@ -/* This file is tc-alpha.h - Copyright (C) 1994, 95, 96, 97, 98, 1999 Free Software Foundation, Inc. - Written by Ken Raeburn . - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#define TC_ALPHA - -#define TARGET_BYTES_BIG_ENDIAN 0 - -#define WORKING_DOT_WORD - -#define TARGET_ARCH bfd_arch_alpha - -#define TARGET_FORMAT (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \ - ? "ecoff-littlealpha" \ - : OUTPUT_FLAVOR == bfd_target_elf_flavour \ - ? "elf64-alpha" \ - : OUTPUT_FLAVOR == bfd_target_evax_flavour \ - ? "vms-alpha" \ - : "unknown-format") - -#define NEED_LITERAL_POOL -#define TC_HANDLES_FX_DONE -#define REPEAT_CONS_EXPRESSIONS - -extern int alpha_force_relocation PARAMS ((struct fix *)); -extern int alpha_fix_adjustable PARAMS ((struct fix *)); - -extern unsigned long alpha_gprmask, alpha_fprmask; -extern valueT alpha_gp_value; - -#define TC_FORCE_RELOCATION(FIXP) alpha_force_relocation (FIXP) -#define tc_fix_adjustable(FIXP) alpha_fix_adjustable (FIXP) -#define RELOC_REQUIRES_SYMBOL - -/* This expression evaluates to false if the relocation is for a local - object for which we still want to do the relocation at runtime. - True if we are willing to perform this relocation while building - the .o file. This is only used for pcrel relocations. */ - -#define TC_RELOC_RTSYM_LOC_FIXUP(FIX) \ - ((FIX)->fx_addsy == NULL \ - || (! S_IS_EXTERNAL ((FIX)->fx_addsy) \ - && ! S_IS_WEAK ((FIX)->fx_addsy) \ - && S_IS_DEFINED ((FIX)->fx_addsy) \ - && ! S_IS_COMMON ((FIX)->fx_addsy))) - -#define md_convert_frag(b,s,f) as_fatal ("alpha convert_frag\n") -#define md_estimate_size_before_relax(f,s) \ - (as_fatal("estimate_size_before_relax called"),1) -#define md_operand(x) - -#ifdef OBJ_EVAX - -/* This field keeps the symbols position in the link section. */ -#define OBJ_SYMFIELD_TYPE valueT - -#define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP) \ - fix_new_exp (FRAG, OFF, (int)LEN, EXP, 0, \ - LEN == 2 ? BFD_RELOC_16 \ - : LEN == 4 ? BFD_RELOC_32 \ - : LEN == 8 ? BFD_RELOC_64 \ - : BFD_RELOC_ALPHA_LINKAGE); -#endif - -#define md_number_to_chars number_to_chars_littleendian - -extern int tc_get_register PARAMS ((int frame)); -extern void alpha_frob_ecoff_data PARAMS ((void)); - -#define tc_frob_label(sym) alpha_define_label (sym) -extern void alpha_define_label PARAMS ((symbolS *)); - -#define md_cons_align(nbytes) alpha_cons_align (nbytes) -extern void alpha_cons_align PARAMS ((int)); - -#ifdef OBJ_ECOFF -#define tc_frob_file_before_adjust() alpha_frob_file_before_adjust () -extern void alpha_frob_file_before_adjust PARAMS ((void)); -#endif - -#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */ - -#ifdef OBJ_ELF -#define ELF_TC_SPECIAL_SECTIONS \ - { ".sdata", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL }, \ - { ".sbss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL }, -#endif - -/* Whether to add support for explict !relocation_op!sequence_number. At the - moment, only do this for ELF, though ECOFF could use it as well. */ - -#ifdef OBJ_ELF -#define RELOC_OP_P -#endif - -#ifdef RELOC_OP_P -/* Before the relocations are written, reorder them, so that user supplied - !lituse relocations follow the appropriate !literal relocations. Also - convert the gas-internal relocations to the appropriate linker relocations. - */ -#define tc_adjust_symtab() alpha_adjust_symtab () -extern void alpha_adjust_symtab PARAMS ((void)); - -/* New fields for supporting explicit relocations (such as !literal to mark - where a pointer is loaded from the global table, and !lituse_base to track - all of the normal uses of that pointer). */ - -#define TC_FIX_TYPE struct alpha_fix_tag - -struct alpha_fix_tag -{ - struct fix *next_lituse; /* next !lituse */ - struct alpha_literal_tag *info; /* other members with same sequence */ -}; - -/* Initialize the TC_FIX_TYPE field. */ -#define TC_INIT_FIX_DATA(fixP) \ -do { \ - fixP->tc_fix_data.next_lituse = (struct fix *)0; \ - fixP->tc_fix_data.info = (struct alpha_literal_tag *)0; \ -} while (0) - -/* Work with DEBUG5 to print fields in tc_fix_type. */ -#define TC_FIX_DATA_PRINT(stream,fixP) \ -do { \ - if (fixP->tc_fix_data.info) \ - fprintf (stderr, "\tinfo = 0x%lx, next_lituse = 0x%lx\n", \ - (long)fixP->tc_fix_data.info, \ - (long)fixP->tc_fix_data.next_lituse); \ -} while (0) -#endif diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c deleted file mode 100644 index 3aafea36481..00000000000 --- a/gas/config/tc-arc.c +++ /dev/null @@ -1,1484 +0,0 @@ -/* tc-arc.c -- Assembler for the ARC - Copyright (C) 1994, 1995, 1997, 1998, 1999 Free Software Foundation, Inc. - Contributed by Doug Evans (dje@cygnus.com). - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include -#include -#include "as.h" -#include "subsegs.h" -#include "opcode/arc.h" -#include "elf/arc.h" - -extern int arc_get_mach PARAMS ((char *)); - -static arc_insn arc_insert_operand PARAMS ((arc_insn, - const struct arc_operand *, int, - const struct arc_operand_value *, - offsetT, char *, unsigned int)); -static void arc_common PARAMS ((int)); -static void arc_cpu PARAMS ((int)); -/*static void arc_rename PARAMS ((int));*/ -static int get_arc_exp_reloc_type PARAMS ((int, int, expressionS *, - expressionS *)); - -const pseudo_typeS md_pseudo_table[] = -{ - { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0) */ - { "common", arc_common, 0 }, -/*{ "hword", cons, 2 }, - already exists */ - { "word", cons, 4 }, -/*{ "xword", cons, 8 },*/ - { "cpu", arc_cpu, 0 }, -/*{ "rename", arc_rename, 0 },*/ - { NULL, 0, 0 }, -}; - -/* This array holds the chars that always start a comment. If the - pre-processor is disabled, these aren't very useful */ -const char comment_chars[] = "#;"; - -/* This array holds the chars that only start a comment at the beginning of - a line. If the line seems to have the form '# 123 filename' - .line and .file directives will appear in the pre-processed output */ -/* Note that input_file.c hand checks for '#' at the beginning of the - first line of the input file. This is because the compiler outputs - #NO_APP at the beginning of its output. */ -/* Also note that comments started like this one will always - work if '/' isn't otherwise defined. */ -const char line_comment_chars[] = "#"; - -const char line_separator_chars[] = ""; - -/* Chars that can be used to separate mant from exp in floating point nums */ -const char EXP_CHARS[] = "eE"; - -/* Chars that mean this number is a floating point constant */ -/* As in 0f12.456 */ -/* or 0d1.2345e12 */ -const char FLT_CHARS[] = "rRsSfFdD"; - -/* Byte order. */ -extern int target_big_endian; -const char *arc_target_format = DEFAULT_TARGET_FORMAT; -static int byte_order = DEFAULT_BYTE_ORDER; - -/* One of bfd_mach_arc_xxx. */ -static int arc_mach_type = bfd_mach_arc_base; - -/* Non-zero if the cpu type has been explicitly specified. */ -static int mach_type_specified_p = 0; - -/* Non-zero if opcode tables have been initialized. - A .cpu command must appear before any instructions. */ -static int cpu_tables_init_p = 0; - -static struct hash_control *arc_suffix_hash = NULL; - -const char *md_shortopts = ""; -struct option md_longopts[] = -{ -#define OPTION_EB (OPTION_MD_BASE + 0) - {"EB", no_argument, NULL, OPTION_EB}, -#define OPTION_EL (OPTION_MD_BASE + 1) - {"EL", no_argument, NULL, OPTION_EL}, - { NULL, no_argument, NULL, 0 } -}; -size_t md_longopts_size = sizeof (md_longopts); - -/* - * md_parse_option - * - * Invocation line includes a switch not recognized by the base assembler. - * See if it's a processor-specific option. - */ - -int -md_parse_option (c, arg) - int c; - char *arg; -{ - switch (c) - { - case OPTION_EB: - byte_order = BIG_ENDIAN; - arc_target_format = "elf32-bigarc"; - break; - case OPTION_EL: - byte_order = LITTLE_ENDIAN; - arc_target_format = "elf32-littlearc"; - break; - default: - return 0; - } - return 1; -} - -void -md_show_usage (stream) - FILE *stream; -{ - fprintf (stream, _("\ -ARC options:\n\ --EB generate big endian output\n\ --EL generate little endian output\n")); -} - -/* This function is called once, at assembler startup time. It should - set up all the tables, etc. that the MD part of the assembler will need. - Opcode selection is defered until later because we might see a .cpu - command. */ - -void -md_begin () -{ - /* The endianness can be chosen "at the factory". */ - target_big_endian = byte_order == BIG_ENDIAN; - - if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, arc_mach_type)) - as_warn (_("could not set architecture and machine")); - - /* Assume the base cpu. This call is necessary because we need to - initialize `arc_operand_map' which may be needed before we see the - first insn. */ - arc_opcode_init_tables (arc_get_opcode_mach (bfd_mach_arc_base, - target_big_endian)); -} - -/* Initialize the various opcode and operand tables. - MACH is one of bfd_mach_arc_xxx. */ - -static void -init_opcode_tables (mach) - int mach; -{ - register unsigned int i; - char *last; - - if ((arc_suffix_hash = hash_new ()) == NULL) - as_fatal (_("virtual memory exhausted")); - - if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach)) - as_warn (_("could not set architecture and machine")); - - /* This initializes a few things in arc-opc.c that we need. - This must be called before the various arc_xxx_supported fns. */ - arc_opcode_init_tables (arc_get_opcode_mach (mach, target_big_endian)); - - /* Only put the first entry of each equivalently named suffix in the - table. */ - last = ""; - for (i = 0; i < arc_suffixes_count; i++) - { - if (! arc_opval_supported (&arc_suffixes[i])) - continue; - if (strcmp (arc_suffixes[i].name, last) != 0) - hash_insert (arc_suffix_hash, arc_suffixes[i].name, (PTR) (arc_suffixes + i)); - last = arc_suffixes[i].name; - } - - /* Since registers don't have a prefix, we put them in the symbol table so - they can't be used as symbols. This also simplifies argument parsing as - we can let gas parse registers for us. The recorded register number is - the index in `arc_reg_names'. */ - for (i = 0; i < arc_reg_names_count; i++) - { - if (! arc_opval_supported (&arc_reg_names[i])) - continue; - /* Use symbol_create here instead of symbol_new so we don't try to - output registers into the object file's symbol table. */ - symbol_table_insert (symbol_create (arc_reg_names[i].name, reg_section, - i, &zero_address_frag)); - } - - /* Tell `s_cpu' it's too late. */ - cpu_tables_init_p = 1; -} - -/* Insert an operand value into an instruction. - If REG is non-NULL, it is a register number and ignore VAL. */ - -static arc_insn -arc_insert_operand (insn, operand, mods, reg, val, file, line) - arc_insn insn; - const struct arc_operand *operand; - int mods; - const struct arc_operand_value *reg; - offsetT val; - char *file; - unsigned int line; -{ - if (operand->bits != 32) - { - long min, max; - offsetT test; - - if ((operand->flags & ARC_OPERAND_SIGNED) != 0) - { - if ((operand->flags & ARC_OPERAND_SIGNOPT) != 0) - max = (1 << operand->bits) - 1; - else - max = (1 << (operand->bits - 1)) - 1; - min = - (1 << (operand->bits - 1)); - } - else - { - max = (1 << operand->bits) - 1; - min = 0; - } - - if ((operand->flags & ARC_OPERAND_NEGATIVE) != 0) - test = - val; - else - test = val; - - if (test < (offsetT) min || test > (offsetT) max) - { - const char *err = - _("operand out of range (%s not between %ld and %ld)"); - char buf[100]; - - sprint_value (buf, test); - if (file == (char *) NULL) - as_warn (err, buf, min, max); - else - as_warn_where (file, line, err, buf, min, max); - } - } - - if (operand->insert) - { - const char *errmsg; - - errmsg = NULL; - insn = (*operand->insert) (insn, operand, mods, reg, (long) val, &errmsg); - if (errmsg != (const char *) NULL) - as_warn (errmsg); - } - else - insn |= (((long) val & ((1 << operand->bits) - 1)) - << operand->shift); - - return insn; -} - -/* We need to keep a list of fixups. We can't simply generate them as - we go, because that would require us to first create the frag, and - that would screw up references to ``.''. */ - -struct arc_fixup -{ - /* index into `arc_operands' */ - int opindex; - expressionS exp; -}; - -#define MAX_FIXUPS 5 - -#define MAX_SUFFIXES 5 - -/* This routine is called for each instruction to be assembled. */ - -void -md_assemble (str) - char *str; -{ - const struct arc_opcode *opcode; - char *start; - arc_insn insn; - static int init_tables_p = 0; - - /* Opcode table initialization is deferred until here because we have to - wait for a possible .cpu command. */ - if (!init_tables_p) - { - init_opcode_tables (arc_mach_type); - init_tables_p = 1; - } - - /* Skip leading white space. */ - while (isspace (*str)) - str++; - - /* The instructions are stored in lists hashed by the first letter (though - we needn't care how they're hashed). Get the first in the list. */ - - opcode = arc_opcode_lookup_asm (str); - - /* Keep looking until we find a match. */ - - start = str; - for ( ; opcode != NULL; opcode = ARC_OPCODE_NEXT_ASM (opcode)) - { - int past_opcode_p, fc, num_suffixes; - char *syn; - struct arc_fixup fixups[MAX_FIXUPS]; - /* Used as a sanity check. If we need a limm reloc, make sure we ask - for an extra 4 bytes from frag_more. */ - int limm_reloc_p; - const struct arc_operand_value *insn_suffixes[MAX_SUFFIXES]; - - /* Is this opcode supported by the selected cpu? */ - if (! arc_opcode_supported (opcode)) - continue; - - /* Scan the syntax string. If it doesn't match, try the next one. */ - - arc_opcode_init_insert (); - insn = opcode->value; - fc = 0; - past_opcode_p = 0; - num_suffixes = 0; - limm_reloc_p = 0; - - /* We don't check for (*str != '\0') here because we want to parse - any trailing fake arguments in the syntax string. */ - for (str = start, syn = opcode->syntax; *syn != '\0'; ) - { - int mods; - const struct arc_operand *operand; - - /* Non operand chars must match exactly. */ - if (*syn != '%' || *++syn == '%') - { - /* Handle '+' specially as we want to allow "ld r0,[sp-4]". */ - /* ??? The syntax has changed to [sp,-4]. */ - if (0 && *syn == '+' && *str == '-') - { - /* Skip over syn's +, but leave str's - alone. - That makes the case identical to "ld r0,[sp+-4]". */ - ++syn; - } - else if (*str == *syn) - { - if (*syn == ' ') - past_opcode_p = 1; - ++syn; - ++str; - } - else - break; - continue; - } - - /* We have an operand. Pick out any modifiers. */ - mods = 0; - while (ARC_MOD_P (arc_operands[arc_operand_map[*syn]].flags)) - { - mods |= arc_operands[arc_operand_map[*syn]].flags & ARC_MOD_BITS; - ++syn; - } - operand = arc_operands + arc_operand_map[*syn]; - if (operand->fmt == 0) - as_fatal (_("unknown syntax format character `%c'"), *syn); - - if (operand->flags & ARC_OPERAND_FAKE) - { - const char *errmsg = NULL; - if (operand->insert) - { - insn = (*operand->insert) (insn, operand, mods, NULL, 0, &errmsg); - /* If we get an error, go on to try the next insn. */ - if (errmsg) - break; - } - ++syn; - } - /* Are we finished with suffixes? */ - else if (!past_opcode_p) - { - int found; - char c; - char *s,*t; - const struct arc_operand_value *suf,*suffix,*suffix_end; - - if (!(operand->flags & ARC_OPERAND_SUFFIX)) - abort (); - - /* If we're at a space in the input string, we want to skip the - remaining suffixes. There may be some fake ones though, so - just go on to try the next one. */ - if (*str == ' ') - { - ++syn; - continue; - } - - s = str; - if (mods & ARC_MOD_DOT) - { - if (*s != '.') - break; - ++s; - } - else - { - /* This can happen in "b.nd foo" and we're currently looking - for "%q" (ie: a condition code suffix). */ - if (*s == '.') - { - ++syn; - continue; - } - } - - /* Pick the suffix out and look it up via the hash table. */ - for (t = s; *t && isalpha (*t); ++t) - continue; - c = *t; - *t = '\0'; - suf = hash_find (arc_suffix_hash, s); - *t = c; - if (!suf) - { - /* This can happen in "blle foo" and we're currently using - the template "b%q%.n %j". The "bl" insn occurs later in - the table so "lle" isn't an illegal suffix. */ - break; - } - - /* Is it the right type? Note that the same character is used - several times, so we have to examine all of them. This is - relatively efficient as equivalent entries are kept - together. If it's not the right type, don't increment `str' - so we try the next one in the series. */ - found = 0; - suffix_end = arc_suffixes + arc_suffixes_count; - for (suffix = suf; - suffix < suffix_end && strcmp (suffix->name, suf->name) == 0; - ++suffix) - { - if (arc_operands[suffix->type].fmt == *syn) - { - /* Insert the suffix's value into the insn. */ - if (operand->insert) - insn = (*operand->insert) (insn, operand, - mods, NULL, suffix->value, - NULL); - else - insn |= suffix->value << operand->shift; - - str = t; - found = 1; - break; - } - } - ++syn; - if (!found) - ; /* Wrong type. Just go on to try next insn entry. */ - else - { - if (num_suffixes == MAX_SUFFIXES) - as_bad (_("too many suffixes")); - else - insn_suffixes[num_suffixes++] = suffix; - } - } - else - /* This is either a register or an expression of some kind. */ - { - char c; - char *hold; - const struct arc_operand_value *reg = NULL; - long value = 0; - expressionS exp; - - if (operand->flags & ARC_OPERAND_SUFFIX) - abort (); - - /* Is there anything left to parse? - We don't check for this at the top because we want to parse - any trailing fake arguments in the syntax string. */ - if (*str == '\0') - break; -#if 0 - /* Is this a syntax character? Eg: is there a '[' present when - there shouldn't be? */ - if (!isalnum (*str) - /* '.' as in ".LLC0" */ - && *str != '.' - /* '_' as in "_print" */ - && *str != '_' - /* '-' as in "[fp,-4]" */ - && *str != '-' - /* '%' as in "%ia(_func)" */ - && *str != '%') - break; -#endif - - /* Parse the operand. */ - hold = input_line_pointer; - input_line_pointer = str; - expression (&exp); - str = input_line_pointer; - input_line_pointer = hold; - - if (exp.X_op == O_illegal) - as_bad (_("illegal operand")); - else if (exp.X_op == O_absent) - as_bad (_("missing operand")); - else if (exp.X_op == O_constant) - { - value = exp.X_add_number; - } - else if (exp.X_op == O_register) - { - reg = arc_reg_names + exp.X_add_number; - } - else - { - /* We need to generate a fixup for this expression. */ - if (fc >= MAX_FIXUPS) - as_fatal (_("too many fixups")); - fixups[fc].exp = exp; - - /* If this is a register constant (IE: one whose - register value gets stored as 61-63) then this - must be a limm. We don't support shimm relocs. */ - /* ??? This bit could use some cleaning up. - Referencing the format chars like this goes - against style. */ -#define IS_REG_OPERAND(o) ((o) == 'a' || (o) == 'b' || (o) == 'c') - if (IS_REG_OPERAND (*syn)) - { - const char *junk; - - fixups[fc].opindex = arc_operand_map['L']; - limm_reloc_p = 1; - /* Tell insert_reg we need a limm. This is - needed because the value at this point is - zero, a shimm. */ - /* ??? We need a cleaner interface than this. */ - (*arc_operands[arc_operand_map['Q']].insert) - (insn, operand, mods, reg, 0L, &junk); - } - else - fixups[fc].opindex = arc_operand_map[*syn]; - ++fc; - value = 0; - } - - /* Insert the register or expression into the instruction. */ - if (operand->insert) - { - const char *errmsg = NULL; - insn = (*operand->insert) (insn, operand, mods, - reg, (long) value, &errmsg); -#if 0 - if (errmsg != (const char *) NULL) - as_warn (errmsg); -#endif - /* FIXME: We want to try shimm insns for limm ones. But if - the constant won't fit, we must go on to try the next - possibility. Where do we issue warnings for constants - that are too big then? At present, we'll flag the insn - as unrecognizable! Maybe have the "bad instruction" - error message include our `errmsg'? */ - if (errmsg != (const char *) NULL) - break; - } - else - insn |= (value & ((1 << operand->bits) - 1)) << operand->shift; - - ++syn; - } - } - - /* If we're at the end of the syntax string, we're done. */ - /* FIXME: try to move this to a separate function. */ - if (*syn == '\0') - { - int i; - char *f; - long limm, limm_p; - - /* For the moment we assume a valid `str' can only contain blanks - now. IE: We needn't try again with a longer version of the - insn and it is assumed that longer versions of insns appear - before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3). */ - - while (isspace (*str)) - ++str; - - if (*str != '\0') - as_bad (_("junk at end of line: `%s'"), str); - - /* Is there a limm value? */ - limm_p = arc_opcode_limm_p (&limm); - - /* Perform various error and warning tests. */ - - { - static int in_delay_slot_p = 0; - static int prev_insn_needs_cc_nop_p = 0; - /* delay slot type seen */ - int delay_slot_type = ARC_DELAY_NONE; - /* conditional execution flag seen */ - int conditional = 0; - /* 1 if condition codes are being set */ - int cc_set_p = 0; - /* 1 if conditional branch, including `b' "branch always" */ - int cond_branch_p = opcode->flags & ARC_OPCODE_COND_BRANCH; - int need_cc_nop_p = 0; - - for (i = 0; i < num_suffixes; ++i) - { - switch (arc_operands[insn_suffixes[i]->type].fmt) - { - case 'n' : - delay_slot_type = insn_suffixes[i]->value; - break; - case 'q' : - conditional = insn_suffixes[i]->value; - break; - case 'f' : - cc_set_p = 1; - break; - } - } - - /* Putting an insn with a limm value in a delay slot is supposed to - be legal, but let's warn the user anyway. Ditto for 8 byte - jumps with delay slots. */ - if (in_delay_slot_p && limm_p) - as_warn (_("8 byte instruction in delay slot")); - if (delay_slot_type != ARC_DELAY_NONE && limm_p) - as_warn (_("8 byte jump instruction with delay slot")); - in_delay_slot_p = (delay_slot_type != ARC_DELAY_NONE) && !limm_p; - - /* Warn when a conditional branch immediately follows a set of - the condition codes. Note that this needn't be done if the - insn that sets the condition codes uses a limm. */ - if (cond_branch_p && conditional != 0 /* 0 = "always" */ - && prev_insn_needs_cc_nop_p) - as_warn (_("conditional branch follows set of flags")); - prev_insn_needs_cc_nop_p = cc_set_p && !limm_p; - } - - /* Write out the instruction. - It is important to fetch enough space in one call to `frag_more'. - We use (f - frag_now->fr_literal) to compute where we are and we - don't want frag_now to change between calls. */ - if (limm_p) - { - f = frag_more (8); - md_number_to_chars (f, insn, 4); - md_number_to_chars (f + 4, limm, 4); - } - else if (limm_reloc_p) - { - /* We need a limm reloc, but the tables think we don't. */ - abort (); - } - else - { - f = frag_more (4); - md_number_to_chars (f, insn, 4); - } - - /* Create any fixups. */ - for (i = 0; i < fc; ++i) - { - int op_type, reloc_type; - expressionS exptmp; - const struct arc_operand *operand; - - /* Create a fixup for this operand. - At this point we do not use a bfd_reloc_code_real_type for - operands residing in the insn, but instead just use the - operand index. This lets us easily handle fixups for any - operand type, although that is admittedly not a very exciting - feature. We pick a BFD reloc type in md_apply_fix. - - Limm values (4 byte immediate "constants") must be treated - normally because they're not part of the actual insn word - and thus the insertion routines don't handle them. */ - - if (arc_operands[fixups[i].opindex].flags & ARC_OPERAND_LIMM) - { - op_type = fixups[i].opindex; - /* FIXME: can we add this data to the operand table? */ - if (op_type == arc_operand_map['L']) - reloc_type = BFD_RELOC_32; - else if (op_type == arc_operand_map['J']) - reloc_type = BFD_RELOC_ARC_B26; - else - abort (); - reloc_type = get_arc_exp_reloc_type (1, reloc_type, - &fixups[i].exp, - &exptmp); - } - else - { - op_type = get_arc_exp_reloc_type (0, fixups[i].opindex, - &fixups[i].exp, &exptmp); - reloc_type = op_type + (int) BFD_RELOC_UNUSED; - } - operand = &arc_operands[op_type]; - fix_new_exp (frag_now, - ((f - frag_now->fr_literal) - + (operand->flags & ARC_OPERAND_LIMM ? 4 : 0)), 4, - &exptmp, - (operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0, - (bfd_reloc_code_real_type) reloc_type); - } - - /* All done. */ - return; - } - - /* Try the next entry. */ - } - - as_bad (_("bad instruction `%s'"), start); -} - -/* ??? This was copied from tc-sparc.c, I think. Is it necessary? */ - -static void -arc_common (ignore) - int ignore; -{ - char *name; - char c; - char *p; - int temp, size; - symbolS *symbolP; - - name = input_line_pointer; - c = get_symbol_end (); - /* just after name is now '\0' */ - p = input_line_pointer; - *p = c; - SKIP_WHITESPACE (); - if (*input_line_pointer != ',') - { - as_bad (_("expected comma after symbol-name")); - ignore_rest_of_line (); - return; - } - input_line_pointer++; /* skip ',' */ - if ((temp = get_absolute_expression ()) < 0) - { - as_bad (_(".COMMon length (%d.) <0! Ignored."), temp); - ignore_rest_of_line (); - return; - } - size = temp; - *p = 0; - symbolP = symbol_find_or_make (name); - *p = c; - if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP)) - { - as_bad (_("ignoring attempt to re-define symbol")); - ignore_rest_of_line (); - return; - } - if (S_GET_VALUE (symbolP) != 0) - { - if (S_GET_VALUE (symbolP) != size) - { - as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %d."), - S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size); - } - } - assert (symbol_get_frag (symbolP) == &zero_address_frag); - if (*input_line_pointer != ',') - { - as_bad (_("expected comma after common length")); - ignore_rest_of_line (); - return; - } - input_line_pointer++; - SKIP_WHITESPACE (); - if (*input_line_pointer != '"') - { - temp = get_absolute_expression (); - if (temp < 0) - { - temp = 0; - as_warn (_("Common alignment negative; 0 assumed")); - } - if (symbolP->local) - { - segT old_sec; - int old_subsec; - char *p; - int align; - - allocate_bss: - old_sec = now_seg; - old_subsec = now_subseg; - align = temp; - record_alignment (bss_section, align); - subseg_set (bss_section, 0); - if (align) - frag_align (align, 0, 0); - if (S_GET_SEGMENT (symbolP) == bss_section) - symbol_get_frag (symbolP)->fr_symbol = 0; - symbol_set_frag (symbolP, frag_now); - p = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, - (offsetT) size, (char *) 0); - *p = 0; - S_SET_SEGMENT (symbolP, bss_section); - S_CLEAR_EXTERNAL (symbolP); - subseg_set (old_sec, old_subsec); - } - else - { - allocate_common: - S_SET_VALUE (symbolP, (valueT) size); - S_SET_ALIGN (symbolP, temp); - S_SET_EXTERNAL (symbolP); - S_SET_SEGMENT (symbolP, bfd_com_section_ptr); - } - } - else - { - input_line_pointer++; - /* ??? Some say data, some say bss. */ - if (strncmp (input_line_pointer, ".bss\"", 5) - && strncmp (input_line_pointer, ".data\"", 6)) - { - input_line_pointer--; - goto bad_common_segment; - } - while (*input_line_pointer++ != '"') - ; - goto allocate_common; - } - demand_empty_rest_of_line (); - return; - - { - bad_common_segment: - p = input_line_pointer; - while (*p && *p != '\n') - p++; - c = *p; - *p = '\0'; - as_bad (_("bad .common segment %s"), input_line_pointer + 1); - *p = c; - input_line_pointer = p; - ignore_rest_of_line (); - return; - } -} - -/* Select the cpu we're assembling for. */ - -static void -arc_cpu (ignore) - int ignore; -{ - int mach; - char c; - char *cpu; - - /* If an instruction has already been seen, it's too late. */ - if (cpu_tables_init_p) - { - as_bad (_(".cpu command must appear before any instructions")); - ignore_rest_of_line (); - return; - } - - cpu = input_line_pointer; - c = get_symbol_end (); - mach = arc_get_mach (cpu); - *input_line_pointer = c; - if (mach == -1) - goto bad_cpu; - - demand_empty_rest_of_line (); - - /* The cpu may have been selected on the command line. - The choices must match. */ - /* ??? This was a command line option early on. It's gone now, but - leave this in. */ - if (mach_type_specified_p && mach != arc_mach_type) - as_bad (_(".cpu conflicts with previous value")); - else - { - arc_mach_type = mach; - mach_type_specified_p = 1; - if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach)) - as_warn (_("could not set architecture and machine")); - } - return; - - bad_cpu: - as_bad (_("bad .cpu op")); - ignore_rest_of_line (); -} - -#if 0 -/* The .rename pseudo-op. This is used by gcc to implement - -mmangle-cpu-libgcc. */ - -static void -arc_rename (ignore) - int ignore; -{ - char *name,*new; - char c; - symbolS *sym; - int len; - - name = input_line_pointer; - c = get_symbol_end (); - sym = symbol_find_or_make (name); - *input_line_pointer = c; - - if (*input_line_pointer != ',') - { - as_bad (_("missing rename string")); - ignore_rest_of_line (); - return; - } - ++input_line_pointer; - SKIP_WHITESPACE (); - - name = input_line_pointer; - c = get_symbol_end (); - if (*name == '\0') - { - *input_line_pointer = c; - as_bad (_("invalid symbol to rename to")); - ignore_rest_of_line (); - return; - } - new = (char *) xmalloc (strlen (name) + 1); - strcpy (new, name); - *input_line_pointer = c; - symbol_get_tc (sym)->real_name = new; - - demand_empty_rest_of_line (); -} -#endif - -/* Turn a string in input_line_pointer into a floating point constant of type - type, and store the appropriate bytes in *litP. The number of LITTLENUMS - emitted is stored in *sizeP. - An error message is returned, or NULL on OK. */ - -/* Equal to MAX_PRECISION in atof-ieee.c */ -#define MAX_LITTLENUMS 6 - -char * -md_atof (type, litP, sizeP) - char type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - LITTLENUM_TYPE *wordP; - char *t; - char *atof_ieee (); - - switch (type) - { - case 'f': - case 'F': - prec = 2; - break; - - case 'd': - case 'D': - prec = 4; - break; - - default: - *sizeP = 0; - return _("bad call to md_atof"); - } - - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - *sizeP = prec * sizeof (LITTLENUM_TYPE); - for (wordP = words; prec--;) - { - md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - - return NULL; -} - -/* Write a value out to the object file, using the appropriate - endianness. */ - -void -md_number_to_chars (buf, val, n) - char *buf; - valueT val; - int n; -{ - if (target_big_endian) - number_to_chars_bigendian (buf, val, n); - else - number_to_chars_littleendian (buf, val, n); -} - -/* Round up a section size to the appropriate boundary. */ - -valueT -md_section_align (segment, size) - segT segment; - valueT size; -{ - int align = bfd_get_section_alignment (stdoutput, segment); - - return ((size + (1 << align) - 1) & (-1 << align)); -} - -/* We don't have any form of relaxing. */ - -int -md_estimate_size_before_relax (fragp, seg) - fragS *fragp; - asection *seg; -{ - abort (); -} - -/* Convert a machine dependent frag. We never generate these. */ - -void -md_convert_frag (abfd, sec, fragp) - bfd *abfd; - asection *sec; - fragS *fragp; -{ - abort (); -} - -/* Parse an operand that is machine-specific. - - The ARC has a special %-op to adjust addresses so they're usable in - branches. The "st" is short for the STatus register. - ??? Later expand this to take a flags value too. - - ??? We can't create new expression types so we map the %-op's onto the - existing syntax. This means that the user could use the chosen syntax - to achieve the same effect. Perhaps put a special cookie in X_add_number - to mark the expression as special. */ - -void -md_operand (expressionP) - expressionS *expressionP; -{ - char *p = input_line_pointer; - - if (*p == '%' && strncmp (p, "%st(", 4) == 0) - { - input_line_pointer += 4; - expression (expressionP); - if (*input_line_pointer != ')') - { - as_bad (_("missing ')' in %-op")); - return; - } - ++input_line_pointer; - if (expressionP->X_op == O_symbol - && expressionP->X_add_number == 0 - /* I think this test is unnecessary but just as a sanity check... */ - && expressionP->X_op_symbol == NULL) - { - expressionS two; - - expressionP->X_op = O_right_shift; - two.X_op = O_constant; - two.X_add_symbol = two.X_op_symbol = NULL; - two.X_add_number = 2; - expressionP->X_op_symbol = make_expr_symbol (&two); - } - /* allow %st(sym1-sym2) */ - else if (expressionP->X_op == O_subtract - && expressionP->X_add_symbol != NULL - && expressionP->X_op_symbol != NULL - && expressionP->X_add_number == 0) - { - expressionS two; - - expressionP->X_add_symbol = make_expr_symbol (expressionP); - expressionP->X_op = O_right_shift; - two.X_op = O_constant; - two.X_add_symbol = two.X_op_symbol = NULL; - two.X_add_number = 2; - expressionP->X_op_symbol = make_expr_symbol (&two); - } - else - { - as_bad (_("expression too complex for %%st")); - return; - } - } -} - -/* We have no need to default values of symbols. - We could catch register names here, but that is handled by inserting - them all in the symbol table to begin with. */ - -symbolS * -md_undefined_symbol (name) - char *name; -{ - return 0; -} - -/* Functions concerning expressions. */ - -/* Parse a .byte, .word, etc. expression. - - Values for the status register are specified with %st(label). - `label' will be right shifted by 2. */ - -void -arc_parse_cons_expression (exp, nbytes) - expressionS *exp; - int nbytes; -{ - expr (0, exp); -} - -/* Record a fixup for a cons expression. */ - -void -arc_cons_fix_new (frag, where, nbytes, exp) - fragS *frag; - int where; - int nbytes; - expressionS *exp; -{ - if (nbytes == 4) - { - int reloc_type; - expressionS exptmp; - - /* This may be a special ARC reloc (eg: %st()). */ - reloc_type = get_arc_exp_reloc_type (1, BFD_RELOC_32, exp, &exptmp); - fix_new_exp (frag, where, nbytes, &exptmp, 0, reloc_type); - } - else - { - fix_new_exp (frag, where, nbytes, exp, 0, - nbytes == 2 ? BFD_RELOC_16 - : nbytes == 8 ? BFD_RELOC_64 - : BFD_RELOC_32); - } -} - -/* Functions concerning relocs. */ - -/* The location from which a PC relative jump should be calculated, - given a PC relative reloc. */ - -long -md_pcrel_from (fixP) - fixS *fixP; -{ - if (fixP->fx_addsy != (symbolS *) NULL - && ! S_IS_DEFINED (fixP->fx_addsy)) - { - /* The symbol is undefined. Let the linker figure it out. */ - return 0; - } - - /* Return the address of the delay slot. */ - return fixP->fx_frag->fr_address + fixP->fx_where + fixP->fx_size; -} - -/* Compute the reloc type of an expression. - The possibly modified expression is stored in EXPNEW. - - This is used to convert the expressions generated by the %-op's into - the appropriate operand type. It is called for both data in instructions - (operands) and data outside instructions (variables, debugging info, etc.). - - Currently supported %-ops: - - %st(symbol): represented as "symbol >> 2" - "st" is short for STatus as in the status register (pc) - - DEFAULT_TYPE is the type to use if no special processing is required. - - DATA_P is non-zero for data or limm values, zero for insn operands. - Remember that the opcode "insertion fns" cannot be used on data, they're - only for inserting operands into insns. They also can't be used for limm - values as the insertion routines don't handle limm values. When called for - insns we return fudged reloc types (real_value - BFD_RELOC_UNUSED). When - called for data or limm values we use real reloc types. */ - -static int -get_arc_exp_reloc_type (data_p, default_type, exp, expnew) - int data_p; - int default_type; - expressionS *exp; - expressionS *expnew; -{ - /* If the expression is "symbol >> 2" we must change it to just "symbol", - as fix_new_exp can't handle it. Similarily for (symbol - symbol) >> 2. - That's ok though. What's really going on here is that we're using - ">> 2" as a special syntax for specifying BFD_RELOC_ARC_B26. */ - - if (exp->X_op == O_right_shift - && exp->X_op_symbol != NULL - && symbol_constant_p (exp->X_op_symbol) - && S_GET_VALUE (exp->X_op_symbol) == 2 - && exp->X_add_number == 0) - { - if (exp->X_add_symbol != NULL - && (symbol_constant_p (exp->X_add_symbol) - || symbol_equated_p (exp->X_add_symbol))) - { - *expnew = *exp; - expnew->X_op = O_symbol; - expnew->X_op_symbol = NULL; - return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J']; - } - else if (exp->X_add_symbol != NULL - && (symbol_get_value_expression (exp->X_add_symbol)->X_op - == O_subtract)) - { - *expnew = *symbol_get_value_expression (exp->X_add_symbol); - return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J']; - } - } - - *expnew = *exp; - return default_type; -} - -/* Apply a fixup to the object code. This is called for all the - fixups we generated by the call to fix_new_exp, above. In the call - above we used a reloc code which was the largest legal reloc code - plus the operand index. Here we undo that to recover the operand - index. At this point all symbol values should be fully resolved, - and we attempt to completely resolve the reloc. If we can not do - that, we determine the correct reloc code and put it back in the fixup. */ - -int -md_apply_fix3 (fixP, valueP, seg) - fixS *fixP; - valueT *valueP; - segT seg; -{ - /*char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;*/ - valueT value; - - /* FIXME FIXME FIXME: The value we are passed in *valueP includes - the symbol values. Since we are using BFD_ASSEMBLER, if we are - doing this relocation the code in write.c is going to call - bfd_perform_relocation, which is also going to use the symbol - value. That means that if the reloc is fully resolved we want to - use *valueP since bfd_perform_relocation is not being used. - However, if the reloc is not fully resolved we do not want to use - *valueP, and must use fx_offset instead. However, if the reloc - is PC relative, we do want to use *valueP since it includes the - result of md_pcrel_from. This is confusing. */ - - if (fixP->fx_addsy == (symbolS *) NULL) - { - value = *valueP; - fixP->fx_done = 1; - } - else if (fixP->fx_pcrel) - { - value = *valueP; - /* ELF relocations are against symbols. - If this symbol is in a different section then we need to leave it for - the linker to deal with. Unfortunately, md_pcrel_from can't tell, - so we have to undo it's effects here. */ - if (S_IS_DEFINED (fixP->fx_addsy) - && S_GET_SEGMENT (fixP->fx_addsy) != seg) - value += md_pcrel_from (fixP); - } - else - { - value = fixP->fx_offset; - if (fixP->fx_subsy != (symbolS *) NULL) - { - if (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section) - value -= S_GET_VALUE (fixP->fx_subsy); - else - { - /* We can't actually support subtracting a symbol. */ - as_bad_where (fixP->fx_file, fixP->fx_line, - _("expression too complex")); - } - } - } - - if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED) - { - int opindex; - const struct arc_operand *operand; - char *where; - arc_insn insn; - - opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED; - - operand = &arc_operands[opindex]; - - /* Fetch the instruction, insert the fully resolved operand - value, and stuff the instruction back again. */ - where = fixP->fx_frag->fr_literal + fixP->fx_where; - if (target_big_endian) - insn = bfd_getb32 ((unsigned char *) where); - else - insn = bfd_getl32 ((unsigned char *) where); - insn = arc_insert_operand (insn, operand, -1, NULL, (offsetT) value, - fixP->fx_file, fixP->fx_line); - if (target_big_endian) - bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); - else - bfd_putl32 ((bfd_vma) insn, (unsigned char *) where); - - if (fixP->fx_done) - { - /* Nothing else to do here. */ - return 1; - } - - /* Determine a BFD reloc value based on the operand information. - We are only prepared to turn a few of the operands into relocs. - !!! Note that we can't handle limm values here. Since we're using - implicit addends the addend must be inserted into the instruction, - however, the opcode insertion routines currently do nothing with - limm values. */ - if (operand->fmt == 'B') - { - assert ((operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0 - && operand->bits == 20 - && operand->shift == 7); - fixP->fx_r_type = BFD_RELOC_ARC_B22_PCREL; - } - else if (0 && operand->fmt == 'J') - { - assert ((operand->flags & ARC_OPERAND_ABSOLUTE_BRANCH) != 0 - && operand->bits == 24 - && operand->shift == 32); - fixP->fx_r_type = BFD_RELOC_ARC_B26; - } - else if (0 && operand->fmt == 'L') - { - assert ((operand->flags & ARC_OPERAND_LIMM) != 0 - && operand->bits == 32 - && operand->shift == 32); - fixP->fx_r_type = BFD_RELOC_32; - } - else - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("unresolved expression that must be resolved")); - fixP->fx_done = 1; - return 1; - } - } - else - { - switch (fixP->fx_r_type) - { - case BFD_RELOC_8: - md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, - value, 1); - break; - case BFD_RELOC_16: - md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, - value, 2); - break; - case BFD_RELOC_32: - md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, - value, 4); - break; -#if 0 - case BFD_RELOC_64: - md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, - value, 8); - break; -#endif - case BFD_RELOC_ARC_B26: - /* If !fixP->fx_done then `value' is an implicit addend. - We must shift it right by 2 in this case as well because the - linker performs the relocation and then adds this in (as opposed - to adding this in and then shifting right by 2). */ - value >>= 2; - md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where, - value, 4); - break; - default: - abort (); - } - } - - fixP->fx_addnumber = value; - - return 1; -} - -/* Translate internal representation of relocation info to BFD target - format. */ - -arelent * -tc_gen_reloc (section, fixP) - asection *section; - fixS *fixP; -{ - arelent *reloc; - - reloc = (arelent *) xmalloc (sizeof (arelent)); - - reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy); - reloc->address = fixP->fx_frag->fr_address + fixP->fx_where; - reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type); - if (reloc->howto == (reloc_howto_type *) NULL) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("internal error: can't export reloc type %d (`%s')"), - fixP->fx_r_type, bfd_get_reloc_code_name (fixP->fx_r_type)); - return NULL; - } - - assert (!fixP->fx_pcrel == !reloc->howto->pc_relative); - - reloc->addend = fixP->fx_addnumber; - - return reloc; -} - -/* Frobbers. */ - -#if 0 -/* Set the real name if the .rename pseudo-op was used. - Return 1 if the symbol should not be included in the symbol table. */ - -int -arc_frob_symbol (sym) - symbolS *sym; -{ - if (symbol_get_tc (sym)->real_name != (char *) NULL) - S_SET_NAME (sym, symbol_get_tc (sym)->real_name); - - return 0; -} -#endif diff --git a/gas/config/tc-arc.h b/gas/config/tc-arc.h deleted file mode 100644 index 5066201e73b..00000000000 --- a/gas/config/tc-arc.h +++ /dev/null @@ -1,71 +0,0 @@ -/* tc-arc.h - Macros and type defines for the ARC. - Copyright (C) 1994, 1995, 1997, 1999 Free Software Foundation, Inc. - Contributed by Doug Evans (dje@cygnus.com). - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2, - or (at your option) any later version. - - GAS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#define TC_ARC 1 - -#define TARGET_BYTES_BIG_ENDIAN 0 - -#define LOCAL_LABELS_FB 1 - -#define TARGET_ARCH bfd_arch_arc - -#define LITTLE_ENDIAN 1234 -#define BIG_ENDIAN 4321 - -/* The endianness of the target format may change based on command - line arguments. */ -extern const char *arc_target_format; -#define DEFAULT_TARGET_FORMAT "elf32-littlearc" -#define TARGET_FORMAT arc_target_format -#define DEFAULT_BYTE_ORDER LITTLE_ENDIAN - -#define WORKING_DOT_WORD - -#define LISTING_HEADER "ARC GAS " - -#define TC_HANDLES_FX_DONE - -#define MD_APPLY_FIX3 - -/* The ARC needs to parse reloc specifiers in .word. */ - -extern void arc_parse_cons_expression (); -#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \ -arc_parse_cons_expression (EXP, NBYTES) - -extern void arc_cons_fix_new (); -#define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP) \ -arc_cons_fix_new (FRAG, WHERE, NBYTES, EXP) - -#if 0 -/* Extra stuff that we need to keep track of for each symbol. */ -struct arc_tc_sy -{ - /* The real name, if the symbol was renamed. */ - char *real_name; -}; - -#define TC_SYMFIELD_TYPE struct arc_tc_sy - -/* Finish up the symbol. */ -extern int arc_frob_symbol PARAMS ((symbolS *)); -#define tc_frob_symbol(sym, punt) punt = arc_frob_symbol (sym) -#endif diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c deleted file mode 100644 index 53c6b2fd201..00000000000 --- a/gas/config/tc-arm.c +++ /dev/null @@ -1,7228 +0,0 @@ -/* tc-arm.c -- Assemble for the ARM - Copyright (C) 1994, 95, 96, 97, 98, 1999, 2000 Free Software Foundation, Inc. - Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) - Modified by David Taylor (dtaylor@armltd.co.uk) - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#include -#include -#define NO_RELOC 0 -#include "as.h" - -/* need TARGET_CPU */ -#include "config.h" -#include "subsegs.h" -#include "obstack.h" -#include "symbols.h" -#include "listing.h" - -#ifdef OBJ_ELF -#include "elf/arm.h" -#endif - -/* Types of processor to assemble for. */ -#define ARM_1 0x00000001 -#define ARM_2 0x00000002 -#define ARM_3 0x00000004 -#define ARM_250 ARM_3 -#define ARM_6 0x00000008 -#define ARM_7 ARM_6 /* same core instruction set */ -#define ARM_8 ARM_6 /* same core instruction set */ -#define ARM_9 ARM_6 /* same core instruction set */ -#define ARM_CPU_MASK 0x0000000f - -/* The following bitmasks control CPU extensions (ARM7 onwards): */ -#define ARM_LONGMUL 0x00000010 /* allow long multiplies */ -#define ARM_HALFWORD 0x00000020 /* allow half word loads */ -#define ARM_THUMB 0x00000040 /* allow BX instruction */ -#define ARM_EXT_V5 0x00000080 /* allow CLZ etc */ -#define ARM_EXT_V5E 0x00000200 /* "El Segundo" */ - -/* Architectures are the sum of the base and extensions. */ -#define ARM_ARCH_V4 (ARM_7 | ARM_LONGMUL | ARM_HALFWORD) -#define ARM_ARCH_V4T (ARM_ARCH_V4 | ARM_THUMB) -#define ARM_ARCH_V5 (ARM_ARCH_V4 | ARM_EXT_V5) -#define ARM_ARCH_V5T (ARM_ARCH_V5 | ARM_THUMB) - -/* Some useful combinations: */ -#define ARM_ANY 0x00ffffff -#define ARM_2UP (ARM_ANY - ARM_1) -#define ARM_ALL ARM_2UP /* Not arm1 only */ -#define ARM_3UP 0x00fffffc -#define ARM_6UP 0x00fffff8 /* Includes ARM7 */ - -#define FPU_CORE 0x80000000 -#define FPU_FPA10 0x40000000 -#define FPU_FPA11 0x40000000 -#define FPU_NONE 0 - -/* Some useful combinations */ -#define FPU_ALL 0xff000000 /* Note this is ~ARM_ANY */ -#define FPU_MEMMULTI 0x7f000000 /* Not fpu_core */ - - -#ifndef CPU_DEFAULT -#if defined __thumb__ -#define CPU_DEFAULT (ARM_ARCH_V4 | ARM_THUMB) -#else -#define CPU_DEFAULT ARM_ALL -#endif -#endif - -#ifndef FPU_DEFAULT -#define FPU_DEFAULT FPU_ALL -#endif - -#define streq(a, b) (strcmp (a, b) == 0) -#define skip_whitespace(str) while (* (str) == ' ') ++ (str) - -static unsigned long cpu_variant = CPU_DEFAULT | FPU_DEFAULT; -static int target_oabi = 0; - -#if defined OBJ_COFF || defined OBJ_ELF -/* Flags stored in private area of BFD structure */ -static boolean uses_apcs_26 = false; -static boolean support_interwork = false; -static boolean uses_apcs_float = false; -static boolean pic_code = false; -#endif - -/* This array holds the chars that always start a comment. If the - pre-processor is disabled, these aren't very useful. */ -CONST char comment_chars[] = "@"; - -/* This array holds the chars that only start a comment at the beginning of - a line. If the line seems to have the form '# 123 filename' - .line and .file directives will appear in the pre-processed output. */ -/* Note that input_file.c hand checks for '#' at the beginning of the - first line of the input file. This is because the compiler outputs - #NO_APP at the beginning of its output. */ -/* Also note that comments like this one will always work. */ -CONST char line_comment_chars[] = "#"; - -#ifdef TE_LINUX -CONST char line_separator_chars[] = ";"; -#else -CONST char line_separator_chars[] = ""; -#endif - -/* Chars that can be used to separate mant - from exp in floating point numbers. */ -CONST char EXP_CHARS[] = "eE"; - -/* Chars that mean this number is a floating point constant */ -/* As in 0f12.456 */ -/* or 0d1.2345e12 */ - -CONST char FLT_CHARS[] = "rRsSfFdDxXeEpP"; - -/* Prefix characters that indicate the start of an immediate - value. */ -#define is_immediate_prefix(C) ((C) == '#' || (C) == '$') - -#ifdef OBJ_ELF -symbolS * GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */ -#endif - -CONST int md_reloc_size = 8; /* Size of relocation record */ - -static int thumb_mode = 0; /* 0: assemble for ARM, 1: assemble for Thumb, - 2: assemble for Thumb even though target cpu - does not support thumb instructions. */ -typedef struct arm_fix -{ - int thumb_mode; -} arm_fix_data; - -struct arm_it -{ - CONST char * error; - unsigned long instruction; - int suffix; - int size; - struct - { - bfd_reloc_code_real_type type; - expressionS exp; - int pc_rel; - } reloc; -}; - -struct arm_it inst; - -struct asm_shift -{ - CONST char * template; - unsigned long value; -}; - -static CONST struct asm_shift shift[] = -{ - {"asl", 0}, - {"lsl", 0}, - {"lsr", 0x00000020}, - {"asr", 0x00000040}, - {"ror", 0x00000060}, - {"rrx", 0x00000060}, - {"ASL", 0}, - {"LSL", 0}, - {"LSR", 0x00000020}, - {"ASR", 0x00000040}, - {"ROR", 0x00000060}, - {"RRX", 0x00000060} -}; - -#define NO_SHIFT_RESTRICT 1 -#define SHIFT_RESTRICT 0 - -#define NUM_FLOAT_VALS 8 - -CONST char * fp_const[] = -{ - "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0 -}; - -/* Number of littlenums required to hold an extended precision number. */ -#define MAX_LITTLENUMS 6 - -LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS]; - -#define FAIL (-1) -#define SUCCESS (0) - -#define SUFF_S 1 -#define SUFF_D 2 -#define SUFF_E 3 -#define SUFF_P 4 - -#define CP_T_X 0x00008000 -#define CP_T_Y 0x00400000 -#define CP_T_Pre 0x01000000 -#define CP_T_UD 0x00800000 -#define CP_T_WB 0x00200000 - -#define CONDS_BIT (0x00100000) -#define LOAD_BIT (0x00100000) -#define TRANS_BIT (0x00200000) - -struct asm_cond -{ - CONST char * template; - unsigned long value; -}; - -/* This is to save a hash look-up in the common case. */ -#define COND_ALWAYS 0xe0000000 - -static CONST struct asm_cond conds[] = -{ - {"eq", 0x00000000}, - {"ne", 0x10000000}, - {"cs", 0x20000000}, {"hs", 0x20000000}, - {"cc", 0x30000000}, {"ul", 0x30000000}, {"lo", 0x30000000}, - {"mi", 0x40000000}, - {"pl", 0x50000000}, - {"vs", 0x60000000}, - {"vc", 0x70000000}, - {"hi", 0x80000000}, - {"ls", 0x90000000}, - {"ge", 0xa0000000}, - {"lt", 0xb0000000}, - {"gt", 0xc0000000}, - {"le", 0xd0000000}, - {"al", 0xe0000000}, - {"nv", 0xf0000000} -}; - -/* Warning: If the top bit of the set_bits is set, then the standard - instruction bitmask is ignored, and the new bitmask is taken from - the set_bits: */ -struct asm_flg -{ - CONST char * template; /* Basic flag string */ - unsigned long set_bits; /* Bits to set */ -}; - -static CONST struct asm_flg s_flag[] = -{ - {"s", CONDS_BIT}, - {NULL, 0} -}; - -static CONST struct asm_flg ldr_flags[] = -{ - {"b", 0x00400000}, - {"t", TRANS_BIT}, - {"bt", 0x00400000 | TRANS_BIT}, - {"h", 0x801000b0}, - {"sh", 0x801000f0}, - {"sb", 0x801000d0}, - {NULL, 0} -}; - -static CONST struct asm_flg str_flags[] = -{ - {"b", 0x00400000}, - {"t", TRANS_BIT}, - {"bt", 0x00400000 | TRANS_BIT}, - {"h", 0x800000b0}, - {NULL, 0} -}; - -static CONST struct asm_flg byte_flag[] = -{ - {"b", 0x00400000}, - {NULL, 0} -}; - -static CONST struct asm_flg cmp_flags[] = -{ - {"s", CONDS_BIT}, - {"p", 0x0010f000}, - {NULL, 0} -}; - -static CONST struct asm_flg ldm_flags[] = -{ - {"ed", 0x01800000}, - {"fd", 0x00800000}, - {"ea", 0x01000000}, - {"fa", 0x08000000}, - {"ib", 0x01800000}, - {"ia", 0x00800000}, - {"db", 0x01000000}, - {"da", 0x08000000}, - {NULL, 0} -}; - -static CONST struct asm_flg stm_flags[] = -{ - {"ed", 0x08000000}, - {"fd", 0x01000000}, - {"ea", 0x00800000}, - {"fa", 0x01800000}, - {"ib", 0x01800000}, - {"ia", 0x00800000}, - {"db", 0x01000000}, - {"da", 0x08000000}, - {NULL, 0} -}; - -static CONST struct asm_flg lfm_flags[] = -{ - {"fd", 0x00800000}, - {"ea", 0x01000000}, - {NULL, 0} -}; - -static CONST struct asm_flg sfm_flags[] = -{ - {"fd", 0x01000000}, - {"ea", 0x00800000}, - {NULL, 0} -}; - -static CONST struct asm_flg round_flags[] = -{ - {"p", 0x00000020}, - {"m", 0x00000040}, - {"z", 0x00000060}, - {NULL, 0} -}; - -/* The implementation of the FIX instruction is broken on some assemblers, - in that it accepts a precision specifier as well as a rounding specifier, - despite the fact that this is meaningless. To be more compatible, we - accept it as well, though of course it does not set any bits. */ -static CONST struct asm_flg fix_flags[] = -{ - {"p", 0x00000020}, - {"m", 0x00000040}, - {"z", 0x00000060}, - {"sp", 0x00000020}, - {"sm", 0x00000040}, - {"sz", 0x00000060}, - {"dp", 0x00000020}, - {"dm", 0x00000040}, - {"dz", 0x00000060}, - {"ep", 0x00000020}, - {"em", 0x00000040}, - {"ez", 0x00000060}, - {NULL, 0} -}; - -static CONST struct asm_flg except_flag[] = -{ - {"e", 0x00400000}, - {NULL, 0} -}; - -static CONST struct asm_flg cplong_flag[] = -{ - {"l", 0x00400000}, - {NULL, 0} -}; - -struct asm_psr -{ - CONST char * template; - unsigned long number; -}; - -#define PSR_FIELD_MASK 0x000f0000 - -#define PSR_FLAGS 0x00080000 -#define PSR_CONTROL 0x00010000 /* Undocumented instruction, its use is discouraged by ARM */ -#define PSR_ALL 0x00090000 - -#define CPSR_ALL 0 -#define SPSR_ALL 1 -#define CPSR_FLG 2 -#define SPSR_FLG 3 -#define CPSR_CTL 4 -#define SPSR_CTL 5 - -static CONST struct asm_psr psrs[] = -{ - /* Valid 's */ - {"cpsr", CPSR_ALL}, - {"cpsr_all", CPSR_ALL}, - {"spsr", SPSR_ALL}, - {"spsr_all", SPSR_ALL}, - - /* Valid 's */ - {"cpsr_flg", CPSR_FLG}, - {"spsr_flg", SPSR_FLG}, - - /* Valid 's */ - {"cpsr_c", CPSR_CTL}, - {"cpsr_ctl", CPSR_CTL}, - {"spsr_c", SPSR_CTL}, - {"spsr_ctl", SPSR_CTL} -}; - -/* Functions called by parser. */ -/* ARM instructions */ -static void do_arit PARAMS ((char *, unsigned long)); -static void do_cmp PARAMS ((char *, unsigned long)); -static void do_mov PARAMS ((char *, unsigned long)); -static void do_ldst PARAMS ((char *, unsigned long)); -static void do_ldmstm PARAMS ((char *, unsigned long)); -static void do_branch PARAMS ((char *, unsigned long)); -static void do_swi PARAMS ((char *, unsigned long)); -/* Pseudo Op codes */ -static void do_adr PARAMS ((char *, unsigned long)); -static void do_adrl PARAMS ((char *, unsigned long)); -static void do_nop PARAMS ((char *, unsigned long)); -/* ARM 2 */ -static void do_mul PARAMS ((char *, unsigned long)); -static void do_mla PARAMS ((char *, unsigned long)); -/* ARM 3 */ -static void do_swap PARAMS ((char *, unsigned long)); -/* ARM 6 */ -static void do_msr PARAMS ((char *, unsigned long)); -static void do_mrs PARAMS ((char *, unsigned long)); -/* ARM 7M */ -static void do_mull PARAMS ((char *, unsigned long)); -/* ARM THUMB */ -static void do_bx PARAMS ((char *, unsigned long)); - - -/* Coprocessor Instructions */ -static void do_cdp PARAMS ((char *, unsigned long)); -static void do_lstc PARAMS ((char *, unsigned long)); -static void do_co_reg PARAMS ((char *, unsigned long)); -static void do_fp_ctrl PARAMS ((char *, unsigned long)); -static void do_fp_ldst PARAMS ((char *, unsigned long)); -static void do_fp_ldmstm PARAMS ((char *, unsigned long)); -static void do_fp_dyadic PARAMS ((char *, unsigned long)); -static void do_fp_monadic PARAMS ((char *, unsigned long)); -static void do_fp_cmp PARAMS ((char *, unsigned long)); -static void do_fp_from_reg PARAMS ((char *, unsigned long)); -static void do_fp_to_reg PARAMS ((char *, unsigned long)); - -static void fix_new_arm PARAMS ((fragS *, int, short, expressionS *, int, int)); -static int arm_reg_parse PARAMS ((char **)); -static int arm_psr_parse PARAMS ((char **)); -static void symbol_locate PARAMS ((symbolS *, CONST char *, segT, valueT, fragS *)); -static int add_to_lit_pool PARAMS ((void)); -static unsigned validate_immediate PARAMS ((unsigned)); -static unsigned validate_immediate_twopart PARAMS ((unsigned int, unsigned int *)); -static int validate_offset_imm PARAMS ((unsigned int, int)); -static void opcode_select PARAMS ((int)); -static void end_of_line PARAMS ((char *)); -static int reg_required_here PARAMS ((char **, int)); -static int psr_required_here PARAMS ((char **, int, int)); -static int co_proc_number PARAMS ((char **)); -static int cp_opc_expr PARAMS ((char **, int, int)); -static int cp_reg_required_here PARAMS ((char **, int)); -static int fp_reg_required_here PARAMS ((char **, int)); -static int cp_address_offset PARAMS ((char **)); -static int cp_address_required_here PARAMS ((char **)); -static int my_get_float_expression PARAMS ((char **)); -static int skip_past_comma PARAMS ((char **)); -static int walk_no_bignums PARAMS ((symbolS *)); -static int negate_data_op PARAMS ((unsigned long *, unsigned long)); -static int data_op2 PARAMS ((char **)); -static int fp_op2 PARAMS ((char **)); -static long reg_list PARAMS ((char **)); -static void thumb_load_store PARAMS ((char *, int, int)); -static int decode_shift PARAMS ((char **, int)); -static int ldst_extend PARAMS ((char **, int)); -static void thumb_add_sub PARAMS ((char *, int)); -static void insert_reg PARAMS ((int)); -static void thumb_shift PARAMS ((char *, int)); -static void thumb_mov_compare PARAMS ((char *, int)); -static void set_constant_flonums PARAMS ((void)); -static valueT md_chars_to_number PARAMS ((char *, int)); -static void insert_reg_alias PARAMS ((char *, int)); -static void output_inst PARAMS ((void)); -#ifdef OBJ_ELF -static bfd_reloc_code_real_type arm_parse_reloc PARAMS ((void)); -#endif - -/* ARM instructions take 4bytes in the object file, Thumb instructions - take 2: */ -#define INSN_SIZE 4 - -/* LONGEST_INST is the longest basic instruction name without conditions or - flags. ARM7M has 4 of length 5. */ - -#define LONGEST_INST 5 - - -struct asm_opcode -{ - CONST char * template; /* Basic string to match */ - unsigned long value; /* Basic instruction code */ - - /* Compulsory suffix that must follow conds. If "", then the - instruction is not conditional and must have no suffix. */ - CONST char * comp_suffix; - - CONST struct asm_flg * flags; /* Bits to toggle if flag 'n' set */ - unsigned long variants; /* Which CPU variants this exists for */ - /* Function to call to parse args */ - void (* parms) PARAMS ((char *, unsigned long)); -}; - -static CONST struct asm_opcode insns[] = -{ -/* ARM Instructions */ - {"and", 0x00000000, NULL, s_flag, ARM_ANY, do_arit}, - {"eor", 0x00200000, NULL, s_flag, ARM_ANY, do_arit}, - {"sub", 0x00400000, NULL, s_flag, ARM_ANY, do_arit}, - {"rsb", 0x00600000, NULL, s_flag, ARM_ANY, do_arit}, - {"add", 0x00800000, NULL, s_flag, ARM_ANY, do_arit}, - {"adc", 0x00a00000, NULL, s_flag, ARM_ANY, do_arit}, - {"sbc", 0x00c00000, NULL, s_flag, ARM_ANY, do_arit}, - {"rsc", 0x00e00000, NULL, s_flag, ARM_ANY, do_arit}, - {"orr", 0x01800000, NULL, s_flag, ARM_ANY, do_arit}, - {"bic", 0x01c00000, NULL, s_flag, ARM_ANY, do_arit}, - {"tst", 0x01000000, NULL, cmp_flags, ARM_ANY, do_cmp}, - {"teq", 0x01200000, NULL, cmp_flags, ARM_ANY, do_cmp}, - {"cmp", 0x01400000, NULL, cmp_flags, ARM_ANY, do_cmp}, - {"cmn", 0x01600000, NULL, cmp_flags, ARM_ANY, do_cmp}, - {"mov", 0x01a00000, NULL, s_flag, ARM_ANY, do_mov}, - {"mvn", 0x01e00000, NULL, s_flag, ARM_ANY, do_mov}, - {"str", 0x04000000, NULL, str_flags, ARM_ANY, do_ldst}, - {"ldr", 0x04100000, NULL, ldr_flags, ARM_ANY, do_ldst}, - {"stm", 0x08000000, NULL, stm_flags, ARM_ANY, do_ldmstm}, - {"ldm", 0x08100000, NULL, ldm_flags, ARM_ANY, do_ldmstm}, - {"swi", 0x0f000000, NULL, NULL, ARM_ANY, do_swi}, -#ifdef TE_WINCE - {"bl", 0x0b000000, NULL, NULL, ARM_ANY, do_branch}, - {"b", 0x0a000000, NULL, NULL, ARM_ANY, do_branch}, -#else - {"bl", 0x0bfffffe, NULL, NULL, ARM_ANY, do_branch}, - {"b", 0x0afffffe, NULL, NULL, ARM_ANY, do_branch}, -#endif - -/* Pseudo ops */ - {"adr", 0x028f0000, NULL, NULL, ARM_ANY, do_adr}, - {"adrl", 0x028f0000, NULL, NULL, ARM_ANY, do_adrl}, - {"nop", 0x01a00000, NULL, NULL, ARM_ANY, do_nop}, - -/* ARM 2 multiplies */ - {"mul", 0x00000090, NULL, s_flag, ARM_2UP, do_mul}, - {"mla", 0x00200090, NULL, s_flag, ARM_2UP, do_mla}, - -/* ARM 3 - swp instructions */ - {"swp", 0x01000090, NULL, byte_flag, ARM_3UP, do_swap}, - -/* ARM 6 Coprocessor instructions */ - {"mrs", 0x010f0000, NULL, NULL, ARM_6UP, do_mrs}, - {"msr", 0x0120f000, NULL, NULL, ARM_6UP, do_msr}, -/* ScottB: our code uses 0x0128f000 for msr. - NickC: but this is wrong because the bits 16 and 19 are handled - by the PSR_xxx defines above. */ - -/* ARM 7M long multiplies - need signed/unsigned flags! */ - {"smull", 0x00c00090, NULL, s_flag, ARM_LONGMUL, do_mull}, - {"umull", 0x00800090, NULL, s_flag, ARM_LONGMUL, do_mull}, - {"smlal", 0x00e00090, NULL, s_flag, ARM_LONGMUL, do_mull}, - {"umlal", 0x00a00090, NULL, s_flag, ARM_LONGMUL, do_mull}, - -/* ARM THUMB interworking */ - {"bx", 0x012fff10, NULL, NULL, ARM_THUMB, do_bx}, - -/* Floating point instructions */ - {"wfs", 0x0e200110, NULL, NULL, FPU_ALL, do_fp_ctrl}, - {"rfs", 0x0e300110, NULL, NULL, FPU_ALL, do_fp_ctrl}, - {"wfc", 0x0e400110, NULL, NULL, FPU_ALL, do_fp_ctrl}, - {"rfc", 0x0e500110, NULL, NULL, FPU_ALL, do_fp_ctrl}, - {"ldf", 0x0c100100, "sdep", NULL, FPU_ALL, do_fp_ldst}, - {"stf", 0x0c000100, "sdep", NULL, FPU_ALL, do_fp_ldst}, - {"lfm", 0x0c100200, NULL, lfm_flags, FPU_MEMMULTI, do_fp_ldmstm}, - {"sfm", 0x0c000200, NULL, sfm_flags, FPU_MEMMULTI, do_fp_ldmstm}, - {"mvf", 0x0e008100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"mnf", 0x0e108100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"abs", 0x0e208100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"rnd", 0x0e308100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"sqt", 0x0e408100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"log", 0x0e508100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"lgn", 0x0e608100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"exp", 0x0e708100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"sin", 0x0e808100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"cos", 0x0e908100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"tan", 0x0ea08100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"asn", 0x0eb08100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"acs", 0x0ec08100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"atn", 0x0ed08100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"urd", 0x0ee08100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"nrm", 0x0ef08100, "sde", round_flags, FPU_ALL, do_fp_monadic}, - {"adf", 0x0e000100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"suf", 0x0e200100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"rsf", 0x0e300100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"muf", 0x0e100100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"dvf", 0x0e400100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"rdf", 0x0e500100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"pow", 0x0e600100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"rpw", 0x0e700100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"rmf", 0x0e800100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"fml", 0x0e900100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"fdv", 0x0ea00100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"frd", 0x0eb00100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"pol", 0x0ec00100, "sde", round_flags, FPU_ALL, do_fp_dyadic}, - {"cmf", 0x0e90f110, NULL, except_flag, FPU_ALL, do_fp_cmp}, - {"cnf", 0x0eb0f110, NULL, except_flag, FPU_ALL, do_fp_cmp}, -/* The FPA10 data sheet suggests that the 'E' of cmfe/cnfe should not - be an optional suffix, but part of the instruction. To be compatible, - we accept either. */ - {"cmfe", 0x0ed0f110, NULL, NULL, FPU_ALL, do_fp_cmp}, - {"cnfe", 0x0ef0f110, NULL, NULL, FPU_ALL, do_fp_cmp}, - {"flt", 0x0e000110, "sde", round_flags, FPU_ALL, do_fp_from_reg}, - {"fix", 0x0e100110, NULL, fix_flags, FPU_ALL, do_fp_to_reg}, - -/* Generic copressor instructions. */ - {"cdp", 0x0e000000, NULL, NULL, ARM_2UP, do_cdp}, - {"ldc", 0x0c100000, NULL, cplong_flag, ARM_2UP, do_lstc}, - {"stc", 0x0c000000, NULL, cplong_flag, ARM_2UP, do_lstc}, - {"mcr", 0x0e000010, NULL, NULL, ARM_2UP, do_co_reg}, - {"mrc", 0x0e100010, NULL, NULL, ARM_2UP, do_co_reg}, -}; - -/* Defines for various bits that we will want to toggle. */ -#define INST_IMMEDIATE 0x02000000 -#define OFFSET_REG 0x02000000 -#define HWOFFSET_IMM 0x00400000 -#define SHIFT_BY_REG 0x00000010 -#define PRE_INDEX 0x01000000 -#define INDEX_UP 0x00800000 -#define WRITE_BACK 0x00200000 -#define LDM_TYPE_2_OR_3 0x00400000 - -#define LITERAL_MASK 0xf000f000 -#define COND_MASK 0xf0000000 -#define OPCODE_MASK 0xfe1fffff -#define DATA_OP_SHIFT 21 - -/* Codes to distinguish the arithmetic instructions. */ -#define OPCODE_AND 0 -#define OPCODE_EOR 1 -#define OPCODE_SUB 2 -#define OPCODE_RSB 3 -#define OPCODE_ADD 4 -#define OPCODE_ADC 5 -#define OPCODE_SBC 6 -#define OPCODE_RSC 7 -#define OPCODE_TST 8 -#define OPCODE_TEQ 9 -#define OPCODE_CMP 10 -#define OPCODE_CMN 11 -#define OPCODE_ORR 12 -#define OPCODE_MOV 13 -#define OPCODE_BIC 14 -#define OPCODE_MVN 15 - -static void do_t_nop PARAMS ((char *)); -static void do_t_arit PARAMS ((char *)); -static void do_t_add PARAMS ((char *)); -static void do_t_asr PARAMS ((char *)); -static void do_t_branch9 PARAMS ((char *)); -static void do_t_branch12 PARAMS ((char *)); -static void do_t_branch23 PARAMS ((char *)); -static void do_t_bx PARAMS ((char *)); -static void do_t_compare PARAMS ((char *)); -static void do_t_ldmstm PARAMS ((char *)); -static void do_t_ldr PARAMS ((char *)); -static void do_t_ldrb PARAMS ((char *)); -static void do_t_ldrh PARAMS ((char *)); -static void do_t_lds PARAMS ((char *)); -static void do_t_lsl PARAMS ((char *)); -static void do_t_lsr PARAMS ((char *)); -static void do_t_mov PARAMS ((char *)); -static void do_t_push_pop PARAMS ((char *)); -static void do_t_str PARAMS ((char *)); -static void do_t_strb PARAMS ((char *)); -static void do_t_strh PARAMS ((char *)); -static void do_t_sub PARAMS ((char *)); -static void do_t_swi PARAMS ((char *)); -static void do_t_adr PARAMS ((char *)); - -#define T_OPCODE_MUL 0x4340 -#define T_OPCODE_TST 0x4200 -#define T_OPCODE_CMN 0x42c0 -#define T_OPCODE_NEG 0x4240 -#define T_OPCODE_MVN 0x43c0 - -#define T_OPCODE_ADD_R3 0x1800 -#define T_OPCODE_SUB_R3 0x1a00 -#define T_OPCODE_ADD_HI 0x4400 -#define T_OPCODE_ADD_ST 0xb000 -#define T_OPCODE_SUB_ST 0xb080 -#define T_OPCODE_ADD_SP 0xa800 -#define T_OPCODE_ADD_PC 0xa000 -#define T_OPCODE_ADD_I8 0x3000 -#define T_OPCODE_SUB_I8 0x3800 -#define T_OPCODE_ADD_I3 0x1c00 -#define T_OPCODE_SUB_I3 0x1e00 - -#define T_OPCODE_ASR_R 0x4100 -#define T_OPCODE_LSL_R 0x4080 -#define T_OPCODE_LSR_R 0x40c0 -#define T_OPCODE_ASR_I 0x1000 -#define T_OPCODE_LSL_I 0x0000 -#define T_OPCODE_LSR_I 0x0800 - -#define T_OPCODE_MOV_I8 0x2000 -#define T_OPCODE_CMP_I8 0x2800 -#define T_OPCODE_CMP_LR 0x4280 -#define T_OPCODE_MOV_HR 0x4600 -#define T_OPCODE_CMP_HR 0x4500 - -#define T_OPCODE_LDR_PC 0x4800 -#define T_OPCODE_LDR_SP 0x9800 -#define T_OPCODE_STR_SP 0x9000 -#define T_OPCODE_LDR_IW 0x6800 -#define T_OPCODE_STR_IW 0x6000 -#define T_OPCODE_LDR_IH 0x8800 -#define T_OPCODE_STR_IH 0x8000 -#define T_OPCODE_LDR_IB 0x7800 -#define T_OPCODE_STR_IB 0x7000 -#define T_OPCODE_LDR_RW 0x5800 -#define T_OPCODE_STR_RW 0x5000 -#define T_OPCODE_LDR_RH 0x5a00 -#define T_OPCODE_STR_RH 0x5200 -#define T_OPCODE_LDR_RB 0x5c00 -#define T_OPCODE_STR_RB 0x5400 - -#define T_OPCODE_PUSH 0xb400 -#define T_OPCODE_POP 0xbc00 - -#define T_OPCODE_BRANCH 0xe7fe - -static int thumb_reg PARAMS ((char ** str, int hi_lo)); - -#define THUMB_SIZE 2 /* Size of thumb instruction. */ -#define THUMB_REG_LO 0x1 -#define THUMB_REG_HI 0x2 -#define THUMB_REG_ANY 0x3 - -#define THUMB_H1 0x0080 -#define THUMB_H2 0x0040 - -#define THUMB_ASR 0 -#define THUMB_LSL 1 -#define THUMB_LSR 2 - -#define THUMB_MOVE 0 -#define THUMB_COMPARE 1 - -#define THUMB_LOAD 0 -#define THUMB_STORE 1 - -#define THUMB_PP_PC_LR 0x0100 - -/* These three are used for immediate shifts, do not alter. */ -#define THUMB_WORD 2 -#define THUMB_HALFWORD 1 -#define THUMB_BYTE 0 - -struct thumb_opcode -{ - CONST char * template; /* Basic string to match */ - unsigned long value; /* Basic instruction code */ - int size; - unsigned long variants; /* Which CPU variants this exists for */ - void (* parms) PARAMS ((char *)); /* Function to call to parse args */ -}; - -static CONST struct thumb_opcode tinsns[] = -{ - {"adc", 0x4140, 2, ARM_THUMB, do_t_arit}, - {"add", 0x0000, 2, ARM_THUMB, do_t_add}, - {"and", 0x4000, 2, ARM_THUMB, do_t_arit}, - {"asr", 0x0000, 2, ARM_THUMB, do_t_asr}, - {"b", T_OPCODE_BRANCH, 2, ARM_THUMB, do_t_branch12}, - {"beq", 0xd0fe, 2, ARM_THUMB, do_t_branch9}, - {"bne", 0xd1fe, 2, ARM_THUMB, do_t_branch9}, - {"bcs", 0xd2fe, 2, ARM_THUMB, do_t_branch9}, - {"bhs", 0xd2fe, 2, ARM_THUMB, do_t_branch9}, - {"bcc", 0xd3fe, 2, ARM_THUMB, do_t_branch9}, - {"bul", 0xd3fe, 2, ARM_THUMB, do_t_branch9}, - {"blo", 0xd3fe, 2, ARM_THUMB, do_t_branch9}, - {"bmi", 0xd4fe, 2, ARM_THUMB, do_t_branch9}, - {"bpl", 0xd5fe, 2, ARM_THUMB, do_t_branch9}, - {"bvs", 0xd6fe, 2, ARM_THUMB, do_t_branch9}, - {"bvc", 0xd7fe, 2, ARM_THUMB, do_t_branch9}, - {"bhi", 0xd8fe, 2, ARM_THUMB, do_t_branch9}, - {"bls", 0xd9fe, 2, ARM_THUMB, do_t_branch9}, - {"bge", 0xdafe, 2, ARM_THUMB, do_t_branch9}, - {"blt", 0xdbfe, 2, ARM_THUMB, do_t_branch9}, - {"bgt", 0xdcfe, 2, ARM_THUMB, do_t_branch9}, - {"ble", 0xddfe, 2, ARM_THUMB, do_t_branch9}, - {"bal", 0xdefe, 2, ARM_THUMB, do_t_branch9}, - {"bic", 0x4380, 2, ARM_THUMB, do_t_arit}, - {"bl", 0xf7fffffe, 4, ARM_THUMB, do_t_branch23}, - {"bx", 0x4700, 2, ARM_THUMB, do_t_bx}, - {"cmn", T_OPCODE_CMN, 2, ARM_THUMB, do_t_arit}, - {"cmp", 0x0000, 2, ARM_THUMB, do_t_compare}, - {"eor", 0x4040, 2, ARM_THUMB, do_t_arit}, - {"ldmia", 0xc800, 2, ARM_THUMB, do_t_ldmstm}, - {"ldr", 0x0000, 2, ARM_THUMB, do_t_ldr}, - {"ldrb", 0x0000, 2, ARM_THUMB, do_t_ldrb}, - {"ldrh", 0x0000, 2, ARM_THUMB, do_t_ldrh}, - {"ldrsb", 0x5600, 2, ARM_THUMB, do_t_lds}, - {"ldrsh", 0x5e00, 2, ARM_THUMB, do_t_lds}, - {"ldsb", 0x5600, 2, ARM_THUMB, do_t_lds}, - {"ldsh", 0x5e00, 2, ARM_THUMB, do_t_lds}, - {"lsl", 0x0000, 2, ARM_THUMB, do_t_lsl}, - {"lsr", 0x0000, 2, ARM_THUMB, do_t_lsr}, - {"mov", 0x0000, 2, ARM_THUMB, do_t_mov}, - {"mul", T_OPCODE_MUL, 2, ARM_THUMB, do_t_arit}, - {"mvn", T_OPCODE_MVN, 2, ARM_THUMB, do_t_arit}, - {"neg", T_OPCODE_NEG, 2, ARM_THUMB, do_t_arit}, - {"orr", 0x4300, 2, ARM_THUMB, do_t_arit}, - {"pop", 0xbc00, 2, ARM_THUMB, do_t_push_pop}, - {"push", 0xb400, 2, ARM_THUMB, do_t_push_pop}, - {"ror", 0x41c0, 2, ARM_THUMB, do_t_arit}, - {"sbc", 0x4180, 2, ARM_THUMB, do_t_arit}, - {"stmia", 0xc000, 2, ARM_THUMB, do_t_ldmstm}, - {"str", 0x0000, 2, ARM_THUMB, do_t_str}, - {"strb", 0x0000, 2, ARM_THUMB, do_t_strb}, - {"strh", 0x0000, 2, ARM_THUMB, do_t_strh}, - {"swi", 0xdf00, 2, ARM_THUMB, do_t_swi}, - {"sub", 0x0000, 2, ARM_THUMB, do_t_sub}, - {"tst", T_OPCODE_TST, 2, ARM_THUMB, do_t_arit}, - /* Pseudo ops: */ - {"adr", 0x0000, 2, ARM_THUMB, do_t_adr}, - {"nop", 0x46C0, 2, ARM_THUMB, do_t_nop}, /* mov r8,r8 */ -}; - -struct reg_entry -{ - CONST char * name; - int number; -}; - -#define int_register(reg) ((reg) >= 0 && (reg) <= 15) -#define cp_register(reg) ((reg) >= 32 && (reg) <= 47) -#define fp_register(reg) ((reg) >= 16 && (reg) <= 23) - -#define REG_PC 15 -#define REG_LR 14 -#define REG_SP 13 - -/* These are the standard names. Users can add aliases with .req */ -static CONST struct reg_entry reg_table[] = -{ - /* Processor Register Numbers. */ - {"r0", 0}, {"r1", 1}, {"r2", 2}, {"r3", 3}, - {"r4", 4}, {"r5", 5}, {"r6", 6}, {"r7", 7}, - {"r8", 8}, {"r9", 9}, {"r10", 10}, {"r11", 11}, - {"r12", 12}, {"r13", REG_SP},{"r14", REG_LR},{"r15", REG_PC}, - /* APCS conventions. */ - {"a1", 0}, {"a2", 1}, {"a3", 2}, {"a4", 3}, - {"v1", 4}, {"v2", 5}, {"v3", 6}, {"v4", 7}, {"v5", 8}, - {"v6", 9}, {"sb", 9}, {"v7", 10}, {"sl", 10}, - {"fp", 11}, {"ip", 12}, {"sp", REG_SP},{"lr", REG_LR},{"pc", REG_PC}, - /* ATPCS additions to APCS conventions. */ - {"wr", 7}, {"v8", 11}, - /* FP Registers. */ - {"f0", 16}, {"f1", 17}, {"f2", 18}, {"f3", 19}, - {"f4", 20}, {"f5", 21}, {"f6", 22}, {"f7", 23}, - {"c0", 32}, {"c1", 33}, {"c2", 34}, {"c3", 35}, - {"c4", 36}, {"c5", 37}, {"c6", 38}, {"c7", 39}, - {"c8", 40}, {"c9", 41}, {"c10", 42}, {"c11", 43}, - {"c12", 44}, {"c13", 45}, {"c14", 46}, {"c15", 47}, - {"cr0", 32}, {"cr1", 33}, {"cr2", 34}, {"cr3", 35}, - {"cr4", 36}, {"cr5", 37}, {"cr6", 38}, {"cr7", 39}, - {"cr8", 40}, {"cr9", 41}, {"cr10", 42}, {"cr11", 43}, - {"cr12", 44}, {"cr13", 45}, {"cr14", 46}, {"cr15", 47}, - /* ATPCS additions to float register names. */ - {"s0",16}, {"s1",17}, {"s2",18}, {"s3",19}, - {"s4",20}, {"s5",21}, {"s6",22}, {"s7",23}, - {"d0",16}, {"d1",17}, {"d2",18}, {"d3",19}, - {"d4",20}, {"d5",21}, {"d6",22}, {"d7",23}, - /* FIXME: At some point we need to add VFP register names. */ - /* Array terminator. */ - {NULL, 0} -}; - -#define BAD_ARGS _("Bad arguments to instruction") -#define BAD_PC _("r15 not allowed here") -#define BAD_FLAGS _("Instruction should not have flags") -#define BAD_COND _("Instruction is not conditional") - -static struct hash_control * arm_ops_hsh = NULL; -static struct hash_control * arm_tops_hsh = NULL; -static struct hash_control * arm_cond_hsh = NULL; -static struct hash_control * arm_shift_hsh = NULL; -static struct hash_control * arm_reg_hsh = NULL; -static struct hash_control * arm_psr_hsh = NULL; - -/* This table describes all the machine specific pseudo-ops the assembler - has to support. The fields are: - pseudo-op name without dot - function to call to execute this pseudo-op - Integer arg to pass to the function. */ - -static void s_req PARAMS ((int)); -static void s_align PARAMS ((int)); -static void s_bss PARAMS ((int)); -static void s_even PARAMS ((int)); -static void s_ltorg PARAMS ((int)); -static void s_arm PARAMS ((int)); -static void s_thumb PARAMS ((int)); -static void s_code PARAMS ((int)); -static void s_force_thumb PARAMS ((int)); -static void s_thumb_func PARAMS ((int)); -static void s_thumb_set PARAMS ((int)); -static void arm_s_text PARAMS ((int)); -static void arm_s_data PARAMS ((int)); -#ifdef OBJ_ELF -static void arm_s_section PARAMS ((int)); -static void s_arm_elf_cons PARAMS ((int)); -#endif - -static int my_get_expression PARAMS ((expressionS *, char **)); - -CONST pseudo_typeS md_pseudo_table[] = -{ - { "req", s_req, 0 }, /* Never called becasue '.req' does not start line */ - { "bss", s_bss, 0 }, - { "align", s_align, 0 }, - { "arm", s_arm, 0 }, - { "thumb", s_thumb, 0 }, - { "code", s_code, 0 }, - { "force_thumb", s_force_thumb, 0 }, - { "thumb_func", s_thumb_func, 0 }, - { "thumb_set", s_thumb_set, 0 }, - { "even", s_even, 0 }, - { "ltorg", s_ltorg, 0 }, - { "pool", s_ltorg, 0 }, - /* Allow for the effect of section changes. */ - { "text", arm_s_text, 0 }, - { "data", arm_s_data, 0 }, -#ifdef OBJ_ELF - { "section", arm_s_section, 0 }, - { "section.s", arm_s_section, 0 }, - { "sect", arm_s_section, 0 }, - { "sect.s", arm_s_section, 0 }, - { "word", s_arm_elf_cons, 4 }, - { "long", s_arm_elf_cons, 4 }, -#else - { "word", cons, 4}, -#endif - { "extend", float_cons, 'x' }, - { "ldouble", float_cons, 'x' }, - { "packed", float_cons, 'p' }, - { 0, 0, 0 } -}; - -/* Stuff needed to resolve the label ambiguity - As: - ... - label: - may differ from: - ... - label: - -*/ - -symbolS * last_label_seen; -static int label_is_thumb_function_name = false; - -/* Literal stuff */ - -#define MAX_LITERAL_POOL_SIZE 1024 - -typedef struct literalS -{ - struct expressionS exp; - struct arm_it * inst; -} literalT; - -literalT literals[MAX_LITERAL_POOL_SIZE]; -int next_literal_pool_place = 0; /* Next free entry in the pool */ -int lit_pool_num = 1; /* Next literal pool number */ -symbolS * current_poolP = NULL; - -static int -add_to_lit_pool () -{ - int lit_count = 0; - - if (current_poolP == NULL) - current_poolP = symbol_create (FAKE_LABEL_NAME, undefined_section, - (valueT) 0, &zero_address_frag); - - /* Check if this literal value is already in the pool: */ - while (lit_count < next_literal_pool_place) - { - if (literals[lit_count].exp.X_op == inst.reloc.exp.X_op - && inst.reloc.exp.X_op == O_constant - && literals[lit_count].exp.X_add_number - == inst.reloc.exp.X_add_number - && literals[lit_count].exp.X_unsigned == inst.reloc.exp.X_unsigned) - break; - lit_count++; - } - - if (lit_count == next_literal_pool_place) /* new entry */ - { - if (next_literal_pool_place > MAX_LITERAL_POOL_SIZE) - { - inst.error = _("Literal Pool Overflow"); - return FAIL; - } - - literals[next_literal_pool_place].exp = inst.reloc.exp; - lit_count = next_literal_pool_place++; - } - - inst.reloc.exp.X_op = O_symbol; - inst.reloc.exp.X_add_number = (lit_count) * 4 - 8; - inst.reloc.exp.X_add_symbol = current_poolP; - - return SUCCESS; -} - -/* Can't use symbol_new here, so have to create a symbol and then at - a later date assign it a value. Thats what these functions do. */ -static void -symbol_locate (symbolP, name, segment, valu, frag) - symbolS * symbolP; - CONST char * name; /* It is copied, the caller can modify */ - segT segment; /* Segment identifier (SEG_) */ - valueT valu; /* Symbol value */ - fragS * frag; /* Associated fragment */ -{ - unsigned int name_length; - char * preserved_copy_of_name; - - name_length = strlen (name) + 1; /* +1 for \0 */ - obstack_grow (¬es, name, name_length); - preserved_copy_of_name = obstack_finish (¬es); -#ifdef STRIP_UNDERSCORE - if (preserved_copy_of_name[0] == '_') - preserved_copy_of_name++; -#endif - -#ifdef tc_canonicalize_symbol_name - preserved_copy_of_name = - tc_canonicalize_symbol_name (preserved_copy_of_name); -#endif - - S_SET_NAME (symbolP, preserved_copy_of_name); - - S_SET_SEGMENT (symbolP, segment); - S_SET_VALUE (symbolP, valu); - symbol_clear_list_pointers(symbolP); - - symbol_set_frag (symbolP, frag); - - /* Link to end of symbol chain. */ - { - extern int symbol_table_frozen; - if (symbol_table_frozen) - abort (); - } - - symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP); - - obj_symbol_new_hook (symbolP); - -#ifdef tc_symbol_new_hook - tc_symbol_new_hook (symbolP); -#endif - -#ifdef DEBUG_SYMS - verify_symbol_chain (symbol_rootP, symbol_lastP); -#endif /* DEBUG_SYMS */ -} - -/* Check that an immediate is valid, and if so, - convert it to the right format. */ -static unsigned int -validate_immediate (val) - unsigned int val; -{ - unsigned int a; - unsigned int i; - -#define rotate_left(v, n) (v << n | v >> (32 - n)) - - for (i = 0; i < 32; i += 2) - if ((a = rotate_left (val, i)) <= 0xff) - return a | (i << 7); /* 12-bit pack: [shift-cnt,const] */ - - return FAIL; -} - -/* Check to see if an immediate can be computed as two seperate immediate - values, added together. We already know that this value cannot be - computed by just one ARM instruction. */ -static unsigned int -validate_immediate_twopart (val, highpart) - unsigned int val; - unsigned int * highpart; -{ - unsigned int a; - unsigned int i; - - for (i = 0; i < 32; i += 2) - if (((a = rotate_left (val, i)) & 0xff) != 0) - { - if (a & 0xff00) - { - if (a & ~ 0xffff) - continue; - * highpart = (a >> 8) | ((i + 24) << 7); - } - else if (a & 0xff0000) - { - if (a & 0xff000000) - continue; - - * highpart = (a >> 16) | ((i + 16) << 7); - } - else - { - assert (a & 0xff000000); - - * highpart = (a >> 24) | ((i + 8) << 7); - } - - return (a & 0xff) | (i << 7); - } - - return FAIL; -} - -static int -validate_offset_imm (val, hwse) - unsigned int val; - int hwse; -{ - if ((hwse && val > 255) || val > 4095) - return FAIL; - return val; -} - - -static void -s_req (a) - int a ATTRIBUTE_UNUSED; -{ - as_bad (_("Invalid syntax for .req directive.")); -} - -static void -s_bss (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - /* We don't support putting frags in the BSS segment, we fake it by - marking in_bss, then looking at s_skip for clues?.. */ - subseg_set (bss_section, 0); - demand_empty_rest_of_line (); -} - -static void -s_even (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - if (!need_pass_2) /* Never make frag if expect extra pass. */ - frag_align (1, 0, 0); - - record_alignment (now_seg, 1); - - demand_empty_rest_of_line (); -} - -static void -s_ltorg (ignored) - int ignored ATTRIBUTE_UNUSED; -{ - int lit_count = 0; - char sym_name[20]; - - if (current_poolP == NULL) - return; - - /* Align pool as you have word accesses */ - /* Only make a frag if we have to ... */ - if (!need_pass_2) - frag_align (2, 0, 0); - - record_alignment (now_seg, 2); - - sprintf (sym_name, "$$lit_\002%x", lit_pool_num++); - - symbol_locate (current_poolP, sym_name, now_seg, - (valueT) frag_now_fix (), frag_now); - symbol_table_insert (current_poolP); - - ARM_SET_THUMB (current_poolP, thumb_mode); - -#if defined OBJ_COFF || defined OBJ_ELF - ARM_SET_INTERWORK (current_poolP, support_interwork); -#endif - - while (lit_count < next_literal_pool_place) - /* First output the expression in the instruction to the pool. */ - emit_expr (&(literals[lit_count++].exp), 4); /* .word */ - - next_literal_pool_place = 0; - current_poolP = NULL; -} - -static void -s_align (unused) /* Same as s_align_ptwo but align 0 => align 2 */ - int unused ATTRIBUTE_UNUSED; -{ - register int temp; - register long temp_fill; - long max_alignment = 15; - - temp = get_absolute_expression (); - if (temp > max_alignment) - as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment); - else if (temp < 0) - { - as_bad (_("Alignment negative. 0 assumed.")); - temp = 0; - } - - if (*input_line_pointer == ',') - { - input_line_pointer++; - temp_fill = get_absolute_expression (); - } - else - temp_fill = 0; - - if (!temp) - temp = 2; - - /* Only make a frag if we HAVE to. . . */ - if (temp && !need_pass_2) - frag_align (temp, (int) temp_fill, 0); - demand_empty_rest_of_line (); - - record_alignment (now_seg, temp); -} - -static void -s_force_thumb (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - /* If we are not already in thumb mode go into it, EVEN if - the target processor does not support thumb instructions. - This is used by gcc/config/arm/lib1funcs.asm for example - to compile interworking support functions even if the - target processor should not support interworking. */ - - if (! thumb_mode) - { - thumb_mode = 2; - - record_alignment (now_seg, 1); - } - - demand_empty_rest_of_line (); -} - -static void -s_thumb_func (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - /* The following label is the name/address of the start of a Thumb function. - We need to know this for the interworking support. */ - - label_is_thumb_function_name = true; - - demand_empty_rest_of_line (); -} - -/* Perform a .set directive, but also mark the alias as - being a thumb function. */ - -static void -s_thumb_set (equiv) - int equiv; -{ - /* XXX the following is a duplicate of the code for s_set() in read.c - We cannot just call that code as we need to get at the symbol that - is created. */ - register char * name; - register char delim; - register char * end_name; - register symbolS * symbolP; - - /* - * Especial apologies for the random logic: - * this just grew, and could be parsed much more simply! - * Dean in haste. - */ - name = input_line_pointer; - delim = get_symbol_end (); - end_name = input_line_pointer; - *end_name = delim; - - SKIP_WHITESPACE (); - - if (*input_line_pointer != ',') - { - *end_name = 0; - as_bad (_("Expected comma after name \"%s\""), name); - *end_name = delim; - ignore_rest_of_line (); - return; - } - - input_line_pointer++; - *end_name = 0; - - if (name[0] == '.' && name[1] == '\0') - { - /* XXX - this should not happen to .thumb_set */ - abort (); - } - - if ((symbolP = symbol_find (name)) == NULL - && (symbolP = md_undefined_symbol (name)) == NULL) - { -#ifndef NO_LISTING - /* When doing symbol listings, play games with dummy fragments living - outside the normal fragment chain to record the file and line info - for this symbol. */ - if (listing & LISTING_SYMBOLS) - { - extern struct list_info_struct * listing_tail; - fragS * dummy_frag = (fragS *) xmalloc (sizeof(fragS)); - memset (dummy_frag, 0, sizeof(fragS)); - dummy_frag->fr_type = rs_fill; - dummy_frag->line = listing_tail; - symbolP = symbol_new (name, undefined_section, 0, dummy_frag); - dummy_frag->fr_symbol = symbolP; - } - else -#endif - symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag); - -#ifdef OBJ_COFF - /* "set" symbols are local unless otherwise specified. */ - SF_SET_LOCAL (symbolP); -#endif /* OBJ_COFF */ - } /* make a new symbol */ - - symbol_table_insert (symbolP); - - * end_name = delim; - - if (equiv - && S_IS_DEFINED (symbolP) - && S_GET_SEGMENT (symbolP) != reg_section) - as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP)); - - pseudo_set (symbolP); - - demand_empty_rest_of_line (); - - /* XXX Now we come to the Thumb specific bit of code. */ - - THUMB_SET_FUNC (symbolP, 1); - ARM_SET_THUMB (symbolP, 1); -#if defined OBJ_ELF || defined OBJ_COFF - ARM_SET_INTERWORK (symbolP, support_interwork); -#endif -} - -/* If we change section we must dump the literal pool first. */ -static void -arm_s_text (ignore) - int ignore; -{ - if (now_seg != text_section) - s_ltorg (0); - -#ifdef OBJ_ELF - obj_elf_text (ignore); -#else - s_text (ignore); -#endif -} - -static void -arm_s_data (ignore) - int ignore; -{ - if (flag_readonly_data_in_text) - { - if (now_seg != text_section) - s_ltorg (0); - } - else if (now_seg != data_section) - s_ltorg (0); - -#ifdef OBJ_ELF - obj_elf_data (ignore); -#else - s_data (ignore); -#endif -} - -#ifdef OBJ_ELF -static void -arm_s_section (ignore) - int ignore; -{ - s_ltorg (0); - - obj_elf_section (ignore); -} -#endif - -static void -opcode_select (width) - int width; -{ - switch (width) - { - case 16: - if (! thumb_mode) - { - if (! (cpu_variant & ARM_THUMB)) - as_bad (_("selected processor does not support THUMB opcodes")); - thumb_mode = 1; - /* No need to force the alignment, since we will have been - coming from ARM mode, which is word-aligned. */ - record_alignment (now_seg, 1); - } - break; - - case 32: - if (thumb_mode) - { - if ((cpu_variant & ARM_ANY) == ARM_THUMB) - as_bad (_("selected processor does not support ARM opcodes")); - thumb_mode = 0; - if (!need_pass_2) - frag_align (2, 0, 0); - record_alignment (now_seg, 1); - } - break; - - default: - as_bad (_("invalid instruction size selected (%d)"), width); - } -} - -static void -s_arm (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - opcode_select (32); - demand_empty_rest_of_line (); -} - -static void -s_thumb (ignore) - int ignore ATTRIBUTE_UNUSED; -{ - opcode_select (16); - demand_empty_rest_of_line (); -} - -static void -s_code (unused) - int unused ATTRIBUTE_UNUSED; -{ - register int temp; - - temp = get_absolute_expression (); - switch (temp) - { - case 16: - case 32: - opcode_select (temp); - break; - - default: - as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp); - } -} - -static void -end_of_line (str) - char * str; -{ - skip_whitespace (str); - - if (* str != '\0') - inst.error = _("Garbage following instruction"); -} - -static int -skip_past_comma (str) - char ** str; -{ - char *p = *str, c; - int comma = 0; - - while ((c = *p) == ' ' || c == ',') - { - p++; - if (c == ',' && comma++) - return FAIL; - } - - if (c == '\0') - return FAIL; - - *str = p; - return comma ? SUCCESS : FAIL; -} - -/* A standard register must be given at this point. - Shift is the place to put it in inst.instruction. - Restores input start point on err. - Returns the reg#, or FAIL. */ -static int -reg_required_here (str, shift) - char ** str; - int shift; -{ - static char buff [128]; /* XXX */ - int reg; - char * start = *str; - - if ((reg = arm_reg_parse (str)) != FAIL && int_register (reg)) - { - if (shift >= 0) - inst.instruction |= reg << shift; - return reg; - } - - /* Restore the start point, we may have got a reg of the wrong class. */ - *str = start; - - /* In the few cases where we might be able to accept something else - this error can be overridden. */ - sprintf (buff, _("Register expected, not '%.100s'"), start); - inst.error = buff; - - return FAIL; -} - -static int -psr_required_here (str, cpsr, spsr) - char ** str; - int cpsr; - int spsr; -{ - int psr; - char * start = *str; - psr = arm_psr_parse (str); - - if (psr == cpsr || psr == spsr) - { - if (psr == spsr) - inst.instruction |= 1 << 22; - - return SUCCESS; - } - - /* In the few cases where we might be able to accept something else - this error can be overridden. */ - inst.error = _(" expected"); - - /* Restore the start point. */ - *str = start; - return FAIL; -} - -static int -co_proc_number (str) - char ** str; -{ - int processor, pchar; - - skip_whitespace (* str); - - /* The data sheet seems to imply that just a number on its own is valid - here, but the RISC iX assembler seems to accept a prefix 'p'. We will - accept either. */ - if (**str == 'p' || **str == 'P') - (*str)++; - - pchar = *(*str)++; - if (pchar >= '0' && pchar <= '9') - { - processor = pchar - '0'; - if (**str >= '0' && **str <= '9') - { - processor = processor * 10 + *(*str)++ - '0'; - if (processor > 15) - { - inst.error = _("Illegal co-processor number"); - return FAIL; - } - } - } - else - { - inst.error = _("Bad or missing co-processor number"); - return FAIL; - } - - inst.instruction |= processor << 8; - return SUCCESS; -} - -static int -cp_opc_expr (str, where, length) - char ** str; - int where; - int length; -{ - expressionS expr; - - skip_whitespace (* str); - - memset (&expr, '\0', sizeof (expr)); - - if (my_get_expression (&expr, str)) - return FAIL; - if (expr.X_op != O_constant) - { - inst.error = _("bad or missing expression"); - return FAIL; - } - - if ((expr.X_add_number & ((1 << length) - 1)) != expr.X_add_number) - { - inst.error = _("immediate co-processor expression too large"); - return FAIL; - } - - inst.instruction |= expr.X_add_number << where; - return SUCCESS; -} - -static int -cp_reg_required_here (str, where) - char ** str; - int where; -{ - int reg; - char * start = *str; - - if ((reg = arm_reg_parse (str)) != FAIL && cp_register (reg)) - { - reg &= 15; - inst.instruction |= reg << where; - return reg; - } - - /* In the few cases where we might be able to accept something else - this error can be overridden. */ - inst.error = _("Co-processor register expected"); - - /* Restore the start point. */ - *str = start; - return FAIL; -} - -static int -fp_reg_required_here (str, where) - char ** str; - int where; -{ - int reg; - char * start = *str; - - if ((reg = arm_reg_parse (str)) != FAIL && fp_register (reg)) - { - reg &= 7; - inst.instruction |= reg << where; - return reg; - } - - /* In the few cases where we might be able to accept something else - this error can be overridden. */ - inst.error = _("Floating point register expected"); - - /* Restore the start point. */ - *str = start; - return FAIL; -} - -static int -cp_address_offset (str) - char ** str; -{ - int offset; - - skip_whitespace (* str); - - if (! is_immediate_prefix (**str)) - { - inst.error = _("immediate expression expected"); - return FAIL; - } - - (*str)++; - - if (my_get_expression (& inst.reloc.exp, str)) - return FAIL; - - if (inst.reloc.exp.X_op == O_constant) - { - offset = inst.reloc.exp.X_add_number; - - if (offset & 3) - { - inst.error = _("co-processor address must be word aligned"); - return FAIL; - } - - if (offset > 1023 || offset < -1023) - { - inst.error = _("offset too large"); - return FAIL; - } - - if (offset >= 0) - inst.instruction |= INDEX_UP; - else - offset = -offset; - - inst.instruction |= offset >> 2; - } - else - inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM; - - return SUCCESS; -} - -static int -cp_address_required_here (str) - char ** str; -{ - char * p = * str; - int pre_inc = 0; - int write_back = 0; - - if (*p == '[') - { - int reg; - - p++; - skip_whitespace (p); - - if ((reg = reg_required_here (& p, 16)) == FAIL) - return FAIL; - - skip_whitespace (p); - - if (*p == ']') - { - p++; - - if (skip_past_comma (& p) == SUCCESS) - { - /* [Rn], #expr */ - write_back = WRITE_BACK; - - if (reg == REG_PC) - { - inst.error = _("pc may not be used in post-increment"); - return FAIL; - } - - if (cp_address_offset (& p) == FAIL) - return FAIL; - } - else - pre_inc = PRE_INDEX | INDEX_UP; - } - else - { - /* '['Rn, #expr']'[!] */ - - if (skip_past_comma (& p) == FAIL) - { - inst.error = _("pre-indexed expression expected"); - return FAIL; - } - - pre_inc = PRE_INDEX; - - if (cp_address_offset (& p) == FAIL) - return FAIL; - - skip_whitespace (p); - - if (*p++ != ']') - { - inst.error = _("missing ]"); - return FAIL; - } - - skip_whitespace (p); - - if (*p == '!') - { - if (reg == REG_PC) - { - inst.error = _("pc may not be used with write-back"); - return FAIL; - } - - p++; - write_back = WRITE_BACK; - } - } - } - else - { - if (my_get_expression (&inst.reloc.exp, &p)) - return FAIL; - - inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM; - inst.reloc.exp.X_add_number -= 8; /* PC rel adjust */ - inst.reloc.pc_rel = 1; - inst.instruction |= (REG_PC << 16); - pre_inc = PRE_INDEX; - } - - inst.instruction |= write_back | pre_inc; - *str = p; - return SUCCESS; -} - -static void -do_nop (str, flags) - char * str; - unsigned long flags; -{ - /* Do nothing really. */ - inst.instruction |= flags; /* This is pointless. */ - end_of_line (str); - return; -} - -static void -do_mrs (str, flags) - char *str; - unsigned long flags; -{ - /* Only one syntax. */ - skip_whitespace (str); - - if (reg_required_here (&str, 12) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || psr_required_here (& str, CPSR_ALL, SPSR_ALL) == FAIL) - { - inst.error = _(" expected"); - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -/* Three possible forms: ", Rm", ", Rm", ", #expression". */ -static void -do_msr (str, flags) - char * str; - unsigned long flags; -{ - int reg; - - skip_whitespace (str); - - if (psr_required_here (&str, CPSR_ALL, SPSR_ALL) == SUCCESS) - { - inst.instruction |= PSR_ALL; - - /* Sytax should be ", Rm" */ - if (skip_past_comma (&str) == FAIL - || (reg = reg_required_here (&str, 0)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - } - else - { - if (psr_required_here (& str, CPSR_FLG, SPSR_FLG) == SUCCESS) - inst.instruction |= PSR_FLAGS; - else if (psr_required_here (& str, CPSR_CTL, SPSR_CTL) == SUCCESS) - inst.instruction |= PSR_CONTROL; - else - { - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - /* Syntax could be ", rm", ", #expression" */ - - if ((reg = reg_required_here (& str, 0)) != FAIL) - ; - /* Immediate expression. */ - else if (is_immediate_prefix (* str)) - { - str ++; - inst.error = NULL; - - if (my_get_expression (& inst.reloc.exp, & str)) - { - inst.error = _("Register or shift expression expected"); - return; - } - - if (inst.reloc.exp.X_add_symbol) - { - inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE; - inst.reloc.pc_rel = 0; - } - else - { - unsigned value = validate_immediate (inst.reloc.exp.X_add_number); - if (value == (unsigned) FAIL) - { - inst.error = _("Invalid constant"); - return; - } - - inst.instruction |= value; - } - - flags |= INST_IMMEDIATE; - } - else - { - inst.error = _("Error: unrecognised syntax for second argument to msr instruction"); - return; - } - } - - inst.error = NULL; - inst.instruction |= flags; - end_of_line (str); - return; -} - -/* Long Multiply Parser - UMULL RdLo, RdHi, Rm, Rs - SMULL RdLo, RdHi, Rm, Rs - UMLAL RdLo, RdHi, Rm, Rs - SMLAL RdLo, RdHi, Rm, Rs -*/ -static void -do_mull (str, flags) - char * str; - unsigned long flags; -{ - int rdlo, rdhi, rm, rs; - - /* Only one format "rdlo, rdhi, rm, rs" */ - skip_whitespace (str); - - if ((rdlo = reg_required_here (&str, 12)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || (rdhi = reg_required_here (&str, 16)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || (rm = reg_required_here (&str, 0)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - /* rdhi, rdlo and rm must all be different */ - if (rdlo == rdhi || rdlo == rm || rdhi == rm) - as_tsktsk (_("rdhi, rdlo and rm must all be different")); - - if (skip_past_comma (&str) == FAIL - || (rs = reg_required_here (&str, 8)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (rdhi == REG_PC || rdhi == REG_PC || rdhi == REG_PC || rdhi == REG_PC) - { - inst.error = BAD_PC; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -static void -do_mul (str, flags) - char * str; - unsigned long flags; -{ - int rd, rm; - - /* Only one format "rd, rm, rs" */ - skip_whitespace (str); - - if ((rd = reg_required_here (&str, 16)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (rd == REG_PC) - { - inst.error = BAD_PC; - return; - } - - if (skip_past_comma (&str) == FAIL - || (rm = reg_required_here (&str, 0)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (rm == REG_PC) - { - inst.error = BAD_PC; - return; - } - - if (rm == rd) - as_tsktsk (_("rd and rm should be different in mul")); - - if (skip_past_comma (&str) == FAIL - || (rm = reg_required_here (&str, 8)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (rm == REG_PC) - { - inst.error = BAD_PC; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -static void -do_mla (str, flags) - char * str; - unsigned long flags; -{ - int rd, rm; - - /* Only one format "rd, rm, rs, rn" */ - skip_whitespace (str); - - if ((rd = reg_required_here (&str, 16)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (rd == REG_PC) - { - inst.error = BAD_PC; - return; - } - - if (skip_past_comma (&str) == FAIL - || (rm = reg_required_here (&str, 0)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (rm == REG_PC) - { - inst.error = BAD_PC; - return; - } - - if (rm == rd) - as_tsktsk (_("rd and rm should be different in mla")); - - if (skip_past_comma (&str) == FAIL - || (rd = reg_required_here (&str, 8)) == FAIL - || skip_past_comma (&str) == FAIL - || (rm = reg_required_here (&str, 12)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (rd == REG_PC || rm == REG_PC) - { - inst.error = BAD_PC; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -/* Returns the index into fp_values of a floating point number, or -1 if - not in the table. */ -static int -my_get_float_expression (str) - char ** str; -{ - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - char * save_in; - expressionS exp; - int i; - int j; - - memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE)); - /* Look for a raw floating point number */ - if ((save_in = atof_ieee (*str, 'x', words)) != NULL - && (is_end_of_line [(int)(*save_in)] || *save_in == '\0')) - { - for (i = 0; i < NUM_FLOAT_VALS; i++) - { - for (j = 0; j < MAX_LITTLENUMS; j++) - { - if (words[j] != fp_values[i][j]) - break; - } - - if (j == MAX_LITTLENUMS) - { - *str = save_in; - return i; - } - } - } - - /* Try and parse a more complex expression, this will probably fail - unless the code uses a floating point prefix (eg "0f") */ - save_in = input_line_pointer; - input_line_pointer = *str; - if (expression (&exp) == absolute_section - && exp.X_op == O_big - && exp.X_add_number < 0) - { - /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it. - Ditto for 15. */ - if (gen_to_words (words, 5, (long)15) == 0) - { - for (i = 0; i < NUM_FLOAT_VALS; i++) - { - for (j = 0; j < MAX_LITTLENUMS; j++) - { - if (words[j] != fp_values[i][j]) - break; - } - - if (j == MAX_LITTLENUMS) - { - *str = input_line_pointer; - input_line_pointer = save_in; - return i; - } - } - } - } - - *str = input_line_pointer; - input_line_pointer = save_in; - return -1; -} - -/* Return true if anything in the expression is a bignum */ -static int -walk_no_bignums (sp) - symbolS * sp; -{ - if (symbol_get_value_expression (sp)->X_op == O_big) - return 1; - - if (symbol_get_value_expression (sp)->X_add_symbol) - { - return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol) - || (symbol_get_value_expression (sp)->X_op_symbol - && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol))); - } - - return 0; -} - -static int -my_get_expression (ep, str) - expressionS * ep; - char ** str; -{ - char * save_in; - segT seg; - - save_in = input_line_pointer; - input_line_pointer = *str; - seg = expression (ep); - -#ifdef OBJ_AOUT - if (seg != absolute_section - && seg != text_section - && seg != data_section - && seg != bss_section - && seg != undefined_section) - { - inst.error = _("bad_segment"); - *str = input_line_pointer; - input_line_pointer = save_in; - return 1; - } -#endif - - /* Get rid of any bignums now, so that we don't generate an error for which - we can't establish a line number later on. Big numbers are never valid - in instructions, which is where this routine is always called. */ - if (ep->X_op == O_big - || (ep->X_add_symbol - && (walk_no_bignums (ep->X_add_symbol) - || (ep->X_op_symbol - && walk_no_bignums (ep->X_op_symbol))))) - { - inst.error = _("Invalid constant"); - *str = input_line_pointer; - input_line_pointer = save_in; - return 1; - } - - *str = input_line_pointer; - input_line_pointer = save_in; - return 0; -} - -/* unrestrict should be one if is permitted for this - instruction */ - -static int -decode_shift (str, unrestrict) - char ** str; - int unrestrict; -{ - struct asm_shift * shft; - char * p; - char c; - - skip_whitespace (* str); - - for (p = *str; isalpha (*p); p++) - ; - - if (p == *str) - { - inst.error = _("Shift expression expected"); - return FAIL; - } - - c = *p; - *p = '\0'; - shft = (struct asm_shift *) hash_find (arm_shift_hsh, *str); - *p = c; - if (shft) - { - if (!strncmp (*str, "rrx", 3) - || !strncmp (*str, "RRX", 3)) - { - *str = p; - inst.instruction |= shft->value; - return SUCCESS; - } - - skip_whitespace (p); - - if (unrestrict && reg_required_here (&p, 8) != FAIL) - { - inst.instruction |= shft->value | SHIFT_BY_REG; - *str = p; - return SUCCESS; - } - else if (is_immediate_prefix (* p)) - { - inst.error = NULL; - p++; - if (my_get_expression (&inst.reloc.exp, &p)) - return FAIL; - - /* Validate some simple #expressions */ - if (inst.reloc.exp.X_op == O_constant) - { - unsigned num = inst.reloc.exp.X_add_number; - - /* Reject operations greater than 32, or lsl #32 */ - if (num > 32 || (num == 32 && shft->value == 0)) - { - inst.error = _("Invalid immediate shift"); - return FAIL; - } - - /* Shifts of zero should be converted to lsl (which is zero)*/ - if (num == 0) - { - *str = p; - return SUCCESS; - } - - /* Shifts of 32 are encoded as 0, for those shifts that - support it. */ - if (num == 32) - num = 0; - - inst.instruction |= (num << 7) | shft->value; - *str = p; - return SUCCESS; - } - - inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM; - inst.reloc.pc_rel = 0; - inst.instruction |= shft->value; - *str = p; - return SUCCESS; - } - else - { - inst.error = unrestrict ? _("shift requires register or #expression") - : _("shift requires #expression"); - *str = p; - return FAIL; - } - } - - inst.error = _("Shift expression expected"); - return FAIL; -} - -/* Do those data_ops which can take a negative immediate constant */ -/* by altering the instuction. A bit of a hack really */ -/* MOV <-> MVN - AND <-> BIC - ADC <-> SBC - by inverting the second operand, and - ADD <-> SUB - CMP <-> CMN - by negating the second operand. -*/ -static int -negate_data_op (instruction, value) - unsigned long * instruction; - unsigned long value; -{ - int op, new_inst; - unsigned long negated, inverted; - - negated = validate_immediate (-value); - inverted = validate_immediate (~value); - - op = (*instruction >> DATA_OP_SHIFT) & 0xf; - switch (op) - { - /* First negates */ - case OPCODE_SUB: /* ADD <-> SUB */ - new_inst = OPCODE_ADD; - value = negated; - break; - - case OPCODE_ADD: - new_inst = OPCODE_SUB; - value = negated; - break; - - case OPCODE_CMP: /* CMP <-> CMN */ - new_inst = OPCODE_CMN; - value = negated; - break; - - case OPCODE_CMN: - new_inst = OPCODE_CMP; - value = negated; - break; - - /* Now Inverted ops */ - case OPCODE_MOV: /* MOV <-> MVN */ - new_inst = OPCODE_MVN; - value = inverted; - break; - - case OPCODE_MVN: - new_inst = OPCODE_MOV; - value = inverted; - break; - - case OPCODE_AND: /* AND <-> BIC */ - new_inst = OPCODE_BIC; - value = inverted; - break; - - case OPCODE_BIC: - new_inst = OPCODE_AND; - value = inverted; - break; - - case OPCODE_ADC: /* ADC <-> SBC */ - new_inst = OPCODE_SBC; - value = inverted; - break; - - case OPCODE_SBC: - new_inst = OPCODE_ADC; - value = inverted; - break; - - /* We cannot do anything */ - default: - return FAIL; - } - - if (value == (unsigned) FAIL) - return FAIL; - - *instruction &= OPCODE_MASK; - *instruction |= new_inst << DATA_OP_SHIFT; - return value; -} - -static int -data_op2 (str) - char ** str; -{ - int value; - expressionS expr; - - skip_whitespace (* str); - - if (reg_required_here (str, 0) != FAIL) - { - if (skip_past_comma (str) == SUCCESS) - /* Shift operation on register. */ - return decode_shift (str, NO_SHIFT_RESTRICT); - - return SUCCESS; - } - else - { - /* Immediate expression */ - if (is_immediate_prefix (**str)) - { - (*str)++; - inst.error = NULL; - - if (my_get_expression (&inst.reloc.exp, str)) - return FAIL; - - if (inst.reloc.exp.X_add_symbol) - { - inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE; - inst.reloc.pc_rel = 0; - } - else - { - if (skip_past_comma (str) == SUCCESS) - { - /* #x, y -- ie explicit rotation by Y */ - if (my_get_expression (&expr, str)) - return FAIL; - - if (expr.X_op != O_constant) - { - inst.error = _("Constant expression expected"); - return FAIL; - } - - /* Rotate must be a multiple of 2 */ - if (((unsigned) expr.X_add_number) > 30 - || (expr.X_add_number & 1) != 0 - || ((unsigned) inst.reloc.exp.X_add_number) > 255) - { - inst.error = _("Invalid constant"); - return FAIL; - } - inst.instruction |= INST_IMMEDIATE; - inst.instruction |= inst.reloc.exp.X_add_number; - inst.instruction |= expr.X_add_number << 7; - return SUCCESS; - } - - /* Implicit rotation, select a suitable one */ - value = validate_immediate (inst.reloc.exp.X_add_number); - - if (value == FAIL) - { - /* Can't be done, perhaps the code reads something like - "add Rd, Rn, #-n", where "sub Rd, Rn, #n" would be ok */ - if ((value = negate_data_op (&inst.instruction, - inst.reloc.exp.X_add_number)) - == FAIL) - { - inst.error = _("Invalid constant"); - return FAIL; - } - } - - inst.instruction |= value; - } - - inst.instruction |= INST_IMMEDIATE; - return SUCCESS; - } - - (*str)++; - inst.error = _("Register or shift expression expected"); - return FAIL; - } -} - -static int -fp_op2 (str) - char ** str; -{ - skip_whitespace (* str); - - if (fp_reg_required_here (str, 0) != FAIL) - return SUCCESS; - else - { - /* Immediate expression */ - if (*((*str)++) == '#') - { - int i; - - inst.error = NULL; - - skip_whitespace (* str); - - /* First try and match exact strings, this is to guarantee that - some formats will work even for cross assembly */ - - for (i = 0; fp_const[i]; i++) - { - if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0) - { - char *start = *str; - - *str += strlen (fp_const[i]); - if (is_end_of_line[(int)**str] || **str == '\0') - { - inst.instruction |= i + 8; - return SUCCESS; - } - *str = start; - } - } - - /* Just because we didn't get a match doesn't mean that the - constant isn't valid, just that it is in a format that we - don't automatically recognize. Try parsing it with - the standard expression routines. */ - if ((i = my_get_float_expression (str)) >= 0) - { - inst.instruction |= i + 8; - return SUCCESS; - } - - inst.error = _("Invalid floating point immediate expression"); - return FAIL; - } - inst.error = _("Floating point register or immediate expression expected"); - return FAIL; - } -} - -static void -do_arit (str, flags) - char * str; - unsigned long flags; -{ - skip_whitespace (str); - - if (reg_required_here (&str, 12) == FAIL - || skip_past_comma (&str) == FAIL - || reg_required_here (&str, 16) == FAIL - || skip_past_comma (&str) == FAIL - || data_op2 (&str) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -static void -do_adr (str, flags) - char * str; - unsigned long flags; -{ - /* This is a pseudo-op of the form "adr rd, label" to be converted - into a relative address of the form "add rd, pc, #label-.-8". */ - skip_whitespace (str); - - if (reg_required_here (&str, 12) == FAIL - || skip_past_comma (&str) == FAIL - || my_get_expression (&inst.reloc.exp, &str)) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - /* Frag hacking will turn this into a sub instruction if the offset turns - out to be negative. */ - inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE; - inst.reloc.exp.X_add_number -= 8; /* PC relative adjust. */ - inst.reloc.pc_rel = 1; - inst.instruction |= flags; - - end_of_line (str); -} - -static void -do_adrl (str, flags) - char * str; - unsigned long flags; -{ - /* This is a pseudo-op of the form "adrl rd, label" to be converted - into a relative address of the form: - add rd, pc, #low(label-.-8)" - add rd, rd, #high(label-.-8)" */ - - skip_whitespace (str); - - if (reg_required_here (& str, 12) == FAIL - || skip_past_comma (& str) == FAIL - || my_get_expression (& inst.reloc.exp, & str)) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - end_of_line (str); - - /* Frag hacking will turn this into a sub instruction if the offset turns - out to be negative. */ - inst.reloc.type = BFD_RELOC_ARM_ADRL_IMMEDIATE; - inst.reloc.exp.X_add_number -= 8; /* PC relative adjust */ - inst.reloc.pc_rel = 1; - inst.instruction |= flags; - inst.size = INSN_SIZE * 2; - - return; -} - -static void -do_cmp (str, flags) - char * str; - unsigned long flags; -{ - skip_whitespace (str); - - if (reg_required_here (&str, 16) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || data_op2 (&str) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - inst.instruction |= flags; - if ((flags & 0x0000f000) == 0) - inst.instruction |= CONDS_BIT; - - end_of_line (str); - return; -} - -static void -do_mov (str, flags) - char * str; - unsigned long flags; -{ - skip_whitespace (str); - - if (reg_required_here (&str, 12) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || data_op2 (&str) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -static int -ldst_extend (str, hwse) - char ** str; - int hwse; -{ - int add = INDEX_UP; - - switch (**str) - { - case '#': - case '$': - (*str)++; - if (my_get_expression (& inst.reloc.exp, str)) - return FAIL; - - if (inst.reloc.exp.X_op == O_constant) - { - int value = inst.reloc.exp.X_add_number; - - if ((hwse && (value < -255 || value > 255)) - || (value < -4095 || value > 4095)) - { - inst.error = _("address offset too large"); - return FAIL; - } - - if (value < 0) - { - value = -value; - add = 0; - } - - /* Halfword and signextension instructions have the - immediate value split across bits 11..8 and bits 3..0 */ - if (hwse) - inst.instruction |= add | HWOFFSET_IMM | ((value >> 4) << 8) | (value & 0xF); - else - inst.instruction |= add | value; - } - else - { - if (hwse) - { - inst.instruction |= HWOFFSET_IMM; - inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8; - } - else - inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM; - inst.reloc.pc_rel = 0; - } - return SUCCESS; - - case '-': - add = 0; /* and fall through */ - case '+': - (*str)++; /* and fall through */ - default: - if (reg_required_here (str, 0) == FAIL) - return FAIL; - - if (hwse) - inst.instruction |= add; - else - { - inst.instruction |= add | OFFSET_REG; - if (skip_past_comma (str) == SUCCESS) - return decode_shift (str, SHIFT_RESTRICT); - } - - return SUCCESS; - } -} - -static void -do_ldst (str, flags) - char * str; - unsigned long flags; -{ - int halfword = 0; - int pre_inc = 0; - int conflict_reg; - int value; - - /* This is not ideal, but it is the simplest way of dealing with the - ARM7T halfword instructions (since they use a different - encoding, but the same mnemonic): */ - halfword = (flags & 0x80000000) != 0; - if (halfword) - { - /* This is actually a load/store of a halfword, or a - signed-extension load */ - if ((cpu_variant & ARM_HALFWORD) == 0) - { - inst.error - = _("Processor does not support halfwords or signed bytes"); - return; - } - - inst.instruction = (inst.instruction & COND_MASK) - | (flags & ~COND_MASK); - - flags = 0; - } - - skip_whitespace (str); - - if ((conflict_reg = reg_required_here (& str, 12)) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (& str) == FAIL) - { - inst.error = _("Address expected"); - return; - } - - if (*str == '[') - { - int reg; - - str++; - - skip_whitespace (str); - - if ((reg = reg_required_here (&str, 16)) == FAIL) - return; - - /* Conflicts can occur on stores as well as loads. */ - conflict_reg = (conflict_reg == reg); - - skip_whitespace (str); - - if (*str == ']') - { - str ++; - - if (skip_past_comma (&str) == SUCCESS) - { - /* [Rn],... (post inc) */ - if (ldst_extend (&str, halfword) == FAIL) - return; - if (conflict_reg) - as_warn (_("%s register same as write-back base"), - (inst.instruction & LOAD_BIT) ? _("destination") : _("source") ); - } - else - { - /* [Rn] */ - if (halfword) - inst.instruction |= HWOFFSET_IMM; - - skip_whitespace (str); - - if (*str == '!') - { - if (conflict_reg) - as_warn (_("%s register same as write-back base"), - (inst.instruction & LOAD_BIT) ? _("destination") : _("source") ); - str++; - inst.instruction |= WRITE_BACK; - } - - flags |= INDEX_UP; - if (! (flags & TRANS_BIT)) - pre_inc = 1; - } - } - else - { - /* [Rn,...] */ - if (skip_past_comma (&str) == FAIL) - { - inst.error = _("pre-indexed expression expected"); - return; - } - - pre_inc = 1; - if (ldst_extend (&str, halfword) == FAIL) - return; - - skip_whitespace (str); - - if (*str++ != ']') - { - inst.error = _("missing ]"); - return; - } - - skip_whitespace (str); - - if (*str == '!') - { - if (conflict_reg) - as_warn (_("%s register same as write-back base"), - (inst.instruction & LOAD_BIT) ? _("destination") : _("source") ); - str++; - inst.instruction |= WRITE_BACK; - } - } - } - else if (*str == '=') - { - /* Parse an "ldr Rd, =expr" instruction; this is another pseudo op */ - str++; - - skip_whitespace (str); - - if (my_get_expression (&inst.reloc.exp, &str)) - return; - - if (inst.reloc.exp.X_op != O_constant - && inst.reloc.exp.X_op != O_symbol) - { - inst.error = _("Constant expression expected"); - return; - } - - if (inst.reloc.exp.X_op == O_constant - && (value = validate_immediate(inst.reloc.exp.X_add_number)) != FAIL) - { - /* This can be done with a mov instruction */ - inst.instruction &= LITERAL_MASK; - inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT); - inst.instruction |= (flags & COND_MASK) | (value & 0xfff); - end_of_line(str); - return; - } - else - { - /* Insert into literal pool */ - if (add_to_lit_pool () == FAIL) - { - if (!inst.error) - inst.error = _("literal pool insertion failed"); - return; - } - - /* Change the instruction exp to point to the pool */ - if (halfword) - { - inst.instruction |= HWOFFSET_IMM; - inst.reloc.type = BFD_RELOC_ARM_HWLITERAL; - } - else - inst.reloc.type = BFD_RELOC_ARM_LITERAL; - inst.reloc.pc_rel = 1; - inst.instruction |= (REG_PC << 16); - pre_inc = 1; - } - } - else - { - if (my_get_expression (&inst.reloc.exp, &str)) - return; - - if (halfword) - { - inst.instruction |= HWOFFSET_IMM; - inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8; - } - else - inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM; -#ifndef TE_WINCE - inst.reloc.exp.X_add_number -= 8; /* PC rel adjust */ -#endif - inst.reloc.pc_rel = 1; - inst.instruction |= (REG_PC << 16); - pre_inc = 1; - } - - if (pre_inc && (flags & TRANS_BIT)) - inst.error = _("Pre-increment instruction with translate"); - - inst.instruction |= flags | (pre_inc ? PRE_INDEX : 0); - end_of_line (str); - return; -} - -static long -reg_list (strp) - char ** strp; -{ - char * str = *strp; - long range = 0; - int another_range; - - /* We come back here if we get ranges concatenated by '+' or '|' */ - do - { - another_range = 0; - - if (*str == '{') - { - int in_range = 0; - int cur_reg = -1; - - str++; - do - { - int reg; - - skip_whitespace (str); - - if ((reg = reg_required_here (& str, -1)) == FAIL) - return FAIL; - - if (in_range) - { - int i; - - if (reg <= cur_reg) - { - inst.error = _("Bad range in register list"); - return FAIL; - } - - for (i = cur_reg + 1; i < reg; i++) - { - if (range & (1 << i)) - as_tsktsk - (_("Warning: Duplicated register (r%d) in register list"), - i); - else - range |= 1 << i; - } - in_range = 0; - } - - if (range & (1 << reg)) - as_tsktsk (_("Warning: Duplicated register (r%d) in register list"), - reg); - else if (reg <= cur_reg) - as_tsktsk (_("Warning: Register range not in ascending order")); - - range |= 1 << reg; - cur_reg = reg; - } while (skip_past_comma (&str) != FAIL - || (in_range = 1, *str++ == '-')); - str--; - skip_whitespace (str); - - if (*str++ != '}') - { - inst.error = _("Missing `}'"); - return FAIL; - } - } - else - { - expressionS expr; - - if (my_get_expression (&expr, &str)) - return FAIL; - - if (expr.X_op == O_constant) - { - if (expr.X_add_number - != (expr.X_add_number & 0x0000ffff)) - { - inst.error = _("invalid register mask"); - return FAIL; - } - - if ((range & expr.X_add_number) != 0) - { - int regno = range & expr.X_add_number; - - regno &= -regno; - regno = (1 << regno) - 1; - as_tsktsk - (_("Warning: Duplicated register (r%d) in register list"), - regno); - } - - range |= expr.X_add_number; - } - else - { - if (inst.reloc.type != 0) - { - inst.error = _("expression too complex"); - return FAIL; - } - - memcpy (&inst.reloc.exp, &expr, sizeof (expressionS)); - inst.reloc.type = BFD_RELOC_ARM_MULTI; - inst.reloc.pc_rel = 0; - } - } - - skip_whitespace (str); - - if (*str == '|' || *str == '+') - { - str++; - another_range = 1; - } - } while (another_range); - - *strp = str; - return range; -} - -static void -do_ldmstm (str, flags) - char * str; - unsigned long flags; -{ - int base_reg; - long range; - - skip_whitespace (str); - - if ((base_reg = reg_required_here (&str, 16)) == FAIL) - return; - - if (base_reg == REG_PC) - { - inst.error = _("r15 not allowed as base register"); - return; - } - - skip_whitespace (str); - - if (*str == '!') - { - flags |= WRITE_BACK; - str++; - } - - if (skip_past_comma (&str) == FAIL - || (range = reg_list (&str)) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (*str == '^') - { - str++; - flags |= LDM_TYPE_2_OR_3; - } - - inst.instruction |= flags | range; - end_of_line (str); - return; -} - -static void -do_swi (str, flags) - char * str; - unsigned long flags; -{ - skip_whitespace (str); - - /* Allow optional leading '#'. */ - if (is_immediate_prefix (*str)) - str++; - - if (my_get_expression (& inst.reloc.exp, & str)) - return; - - inst.reloc.type = BFD_RELOC_ARM_SWI; - inst.reloc.pc_rel = 0; - inst.instruction |= flags; - - end_of_line (str); - - return; -} - -static void -do_swap (str, flags) - char * str; - unsigned long flags; -{ - int reg; - - skip_whitespace (str); - - if ((reg = reg_required_here (&str, 12)) == FAIL) - return; - - if (reg == REG_PC) - { - inst.error = _("r15 not allowed in swap"); - return; - } - - if (skip_past_comma (&str) == FAIL - || (reg = reg_required_here (&str, 0)) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (reg == REG_PC) - { - inst.error = _("r15 not allowed in swap"); - return; - } - - if (skip_past_comma (&str) == FAIL - || *str++ != '[') - { - inst.error = BAD_ARGS; - return; - } - - skip_whitespace (str); - - if ((reg = reg_required_here (&str, 16)) == FAIL) - return; - - if (reg == REG_PC) - { - inst.error = BAD_PC; - return; - } - - skip_whitespace (str); - - if (*str++ != ']') - { - inst.error = _("missing ]"); - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -static void -do_branch (str, flags) - char * str; - unsigned long flags ATTRIBUTE_UNUSED; -{ - if (my_get_expression (&inst.reloc.exp, &str)) - return; - -#ifdef OBJ_ELF - { - char * save_in; - - /* ScottB: February 5, 1998 */ - /* Check to see of PLT32 reloc required for the instruction. */ - - /* arm_parse_reloc() works on input_line_pointer. - We actually want to parse the operands to the branch instruction - passed in 'str'. Save the input pointer and restore it later. */ - save_in = input_line_pointer; - input_line_pointer = str; - if (inst.reloc.exp.X_op == O_symbol - && *str == '(' - && arm_parse_reloc () == BFD_RELOC_ARM_PLT32) - { - inst.reloc.type = BFD_RELOC_ARM_PLT32; - inst.reloc.pc_rel = 0; - /* Modify str to point to after parsed operands, otherwise - end_of_line() will complain about the (PLT) left in str. */ - str = input_line_pointer; - } - else - { - inst.reloc.type = BFD_RELOC_ARM_PCREL_BRANCH; - inst.reloc.pc_rel = 1; - } - input_line_pointer = save_in; - } -#else - inst.reloc.type = BFD_RELOC_ARM_PCREL_BRANCH; - inst.reloc.pc_rel = 1; -#endif /* OBJ_ELF */ - - end_of_line (str); - return; -} - -static void -do_bx (str, flags) - char * str; - unsigned long flags ATTRIBUTE_UNUSED; -{ - int reg; - - skip_whitespace (str); - - if ((reg = reg_required_here (&str, 0)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (reg == REG_PC) - inst.error = BAD_PC; - - end_of_line (str); -} - -static void -do_cdp (str, flags) - char * str; - unsigned long flags ATTRIBUTE_UNUSED; -{ - /* Co-processor data operation. - Format: CDP{cond} CP#,,CRd,CRn,CRm{,} */ - skip_whitespace (str); - - if (co_proc_number (&str) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || cp_opc_expr (&str, 20,4) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || cp_reg_required_here (&str, 12) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || cp_reg_required_here (&str, 16) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || cp_reg_required_here (&str, 0) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == SUCCESS) - { - if (cp_opc_expr (&str, 5, 3) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - } - - end_of_line (str); - return; -} - -static void -do_lstc (str, flags) - char * str; - unsigned long flags; -{ - /* Co-processor register load/store. - Format: */ - - skip_whitespace (str); - - if (co_proc_number (&str) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || cp_reg_required_here (&str, 12) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || cp_address_required_here (&str) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -static void -do_co_reg (str, flags) - char * str; - unsigned long flags; -{ - /* Co-processor register transfer. - Format: {cond} CP#,,Rd,CRn,CRm{,} */ - - skip_whitespace (str); - - if (co_proc_number (&str) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || cp_opc_expr (&str, 21, 3) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || reg_required_here (&str, 12) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || cp_reg_required_here (&str, 16) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || cp_reg_required_here (&str, 0) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == SUCCESS) - { - if (cp_opc_expr (&str, 5, 3) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - } - if (flags) - { - inst.error = BAD_COND; - } - - end_of_line (str); - return; -} - -static void -do_fp_ctrl (str, flags) - char * str; - unsigned long flags ATTRIBUTE_UNUSED; -{ - /* FP control registers. - Format: {cond} Rn */ - - skip_whitespace (str); - - if (reg_required_here (&str, 12) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - end_of_line (str); - return; -} - -static void -do_fp_ldst (str, flags) - char * str; - unsigned long flags ATTRIBUTE_UNUSED; -{ - skip_whitespace (str); - - switch (inst.suffix) - { - case SUFF_S: - break; - case SUFF_D: - inst.instruction |= CP_T_X; - break; - case SUFF_E: - inst.instruction |= CP_T_Y; - break; - case SUFF_P: - inst.instruction |= CP_T_X | CP_T_Y; - break; - default: - abort (); - } - - if (fp_reg_required_here (&str, 12) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || cp_address_required_here (&str) == FAIL) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - end_of_line (str); -} - -static void -do_fp_ldmstm (str, flags) - char * str; - unsigned long flags; -{ - int num_regs; - - skip_whitespace (str); - - if (fp_reg_required_here (&str, 12) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - /* Get Number of registers to transfer */ - if (skip_past_comma (&str) == FAIL - || my_get_expression (&inst.reloc.exp, &str)) - { - if (! inst.error) - inst.error = _("constant expression expected"); - return; - } - - if (inst.reloc.exp.X_op != O_constant) - { - inst.error = _("Constant value required for number of registers"); - return; - } - - num_regs = inst.reloc.exp.X_add_number; - - if (num_regs < 1 || num_regs > 4) - { - inst.error = _("number of registers must be in the range [1:4]"); - return; - } - - switch (num_regs) - { - case 1: - inst.instruction |= CP_T_X; - break; - case 2: - inst.instruction |= CP_T_Y; - break; - case 3: - inst.instruction |= CP_T_Y | CP_T_X; - break; - case 4: - break; - default: - abort (); - } - - if (flags) - { - int reg; - int write_back; - int offset; - - /* The instruction specified "ea" or "fd", so we can only accept - [Rn]{!}. The instruction does not really support stacking or - unstacking, so we have to emulate these by setting appropriate - bits and offsets. */ - if (skip_past_comma (&str) == FAIL - || *str != '[') - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - str++; - skip_whitespace (str); - - if ((reg = reg_required_here (&str, 16)) == FAIL) - return; - - skip_whitespace (str); - - if (*str != ']') - { - inst.error = BAD_ARGS; - return; - } - - str++; - if (*str == '!') - { - write_back = 1; - str++; - if (reg == REG_PC) - { - inst.error = _("R15 not allowed as base register with write-back"); - return; - } - } - else - write_back = 0; - - if (flags & CP_T_Pre) - { - /* Pre-decrement */ - offset = 3 * num_regs; - if (write_back) - flags |= CP_T_WB; - } - else - { - /* Post-increment */ - if (write_back) - { - flags |= CP_T_WB; - offset = 3 * num_regs; - } - else - { - /* No write-back, so convert this into a standard pre-increment - instruction -- aesthetically more pleasing. */ - flags = CP_T_Pre | CP_T_UD; - offset = 0; - } - } - - inst.instruction |= flags | offset; - } - else if (skip_past_comma (&str) == FAIL - || cp_address_required_here (&str) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - end_of_line (str); -} - -static void -do_fp_dyadic (str, flags) - char * str; - unsigned long flags; -{ - skip_whitespace (str); - - switch (inst.suffix) - { - case SUFF_S: - break; - case SUFF_D: - inst.instruction |= 0x00000080; - break; - case SUFF_E: - inst.instruction |= 0x00080000; - break; - default: - abort (); - } - - if (fp_reg_required_here (&str, 12) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || fp_reg_required_here (&str, 16) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || fp_op2 (&str) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -static void -do_fp_monadic (str, flags) - char * str; - unsigned long flags; -{ - skip_whitespace (str); - - switch (inst.suffix) - { - case SUFF_S: - break; - case SUFF_D: - inst.instruction |= 0x00000080; - break; - case SUFF_E: - inst.instruction |= 0x00080000; - break; - default: - abort (); - } - - if (fp_reg_required_here (&str, 12) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || fp_op2 (&str) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -static void -do_fp_cmp (str, flags) - char * str; - unsigned long flags; -{ - skip_whitespace (str); - - if (fp_reg_required_here (&str, 16) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || fp_op2 (&str) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -static void -do_fp_from_reg (str, flags) - char * str; - unsigned long flags; -{ - skip_whitespace (str); - - switch (inst.suffix) - { - case SUFF_S: - break; - case SUFF_D: - inst.instruction |= 0x00000080; - break; - case SUFF_E: - inst.instruction |= 0x00080000; - break; - default: - abort (); - } - - if (fp_reg_required_here (&str, 16) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) == FAIL - || reg_required_here (&str, 12) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -static void -do_fp_to_reg (str, flags) - char * str; - unsigned long flags; -{ - skip_whitespace (str); - - if (reg_required_here (&str, 12) == FAIL) - return; - - if (skip_past_comma (&str) == FAIL - || fp_reg_required_here (&str, 0) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - inst.instruction |= flags; - end_of_line (str); - return; -} - -/* Thumb specific routines */ - -/* Parse and validate that a register is of the right form, this saves - repeated checking of this information in many similar cases. - Unlike the 32-bit case we do not insert the register into the opcode - here, since the position is often unknown until the full instruction - has been parsed. */ -static int -thumb_reg (strp, hi_lo) - char ** strp; - int hi_lo; -{ - int reg; - - if ((reg = reg_required_here (strp, -1)) == FAIL) - return FAIL; - - switch (hi_lo) - { - case THUMB_REG_LO: - if (reg > 7) - { - inst.error = _("lo register required"); - return FAIL; - } - break; - - case THUMB_REG_HI: - if (reg < 8) - { - inst.error = _("hi register required"); - return FAIL; - } - break; - - default: - break; - } - - return reg; -} - -/* Parse an add or subtract instruction, SUBTRACT is non-zero if the opcode - was SUB. */ -static void -thumb_add_sub (str, subtract) - char * str; - int subtract; -{ - int Rd, Rs, Rn = FAIL; - - skip_whitespace (str); - - if ((Rd = thumb_reg (&str, THUMB_REG_ANY)) == FAIL - || skip_past_comma (&str) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (is_immediate_prefix (*str)) - { - Rs = Rd; - str++; - if (my_get_expression (&inst.reloc.exp, &str)) - return; - } - else - { - if ((Rs = thumb_reg (&str, THUMB_REG_ANY)) == FAIL) - return; - - if (skip_past_comma (&str) == FAIL) - { - /* Two operand format, shuffle the registers and pretend there - are 3 */ - Rn = Rs; - Rs = Rd; - } - else if (is_immediate_prefix (*str)) - { - str++; - if (my_get_expression (&inst.reloc.exp, &str)) - return; - } - else if ((Rn = thumb_reg (&str, THUMB_REG_ANY)) == FAIL) - return; - } - - /* We now have Rd and Rs set to registers, and Rn set to a register or FAIL; - for the latter case, EXPR contains the immediate that was found. */ - if (Rn != FAIL) - { - /* All register format. */ - if (Rd > 7 || Rs > 7 || Rn > 7) - { - if (Rs != Rd) - { - inst.error = _("dest and source1 must be the same register"); - return; - } - - /* Can't do this for SUB */ - if (subtract) - { - inst.error = _("subtract valid only on lo regs"); - return; - } - - inst.instruction = (T_OPCODE_ADD_HI - | (Rd > 7 ? THUMB_H1 : 0) - | (Rn > 7 ? THUMB_H2 : 0)); - inst.instruction |= (Rd & 7) | ((Rn & 7) << 3); - } - else - { - inst.instruction = subtract ? T_OPCODE_SUB_R3 : T_OPCODE_ADD_R3; - inst.instruction |= Rd | (Rs << 3) | (Rn << 6); - } - } - else - { - /* Immediate expression, now things start to get nasty. */ - - /* First deal with HI regs, only very restricted cases allowed: - Adjusting SP, and using PC or SP to get an address. */ - if ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP)) - || (Rs > 7 && Rs != REG_SP && Rs != REG_PC)) - { - inst.error = _("invalid Hi register with immediate"); - return; - } - - if (inst.reloc.exp.X_op != O_constant) - { - /* Value isn't known yet, all we can do is store all the fragments - we know about in the instruction and let the reloc hacking - work it all out. */ - inst.instruction = (subtract ? 0x8000 : 0) | (Rd << 4) | Rs; - inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD; - } - else - { - int offset = inst.reloc.exp.X_add_number; - - if (subtract) - offset = -offset; - - if (offset < 0) - { - offset = -offset; - subtract = 1; - - /* Quick check, in case offset is MIN_INT */ - if (offset < 0) - { - inst.error = _("immediate value out of range"); - return; - } - } - else - subtract = 0; - - if (Rd == REG_SP) - { - if (offset & ~0x1fc) - { - inst.error = _("invalid immediate value for stack adjust"); - return; - } - inst.instruction = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST; - inst.instruction |= offset >> 2; - } - else if (Rs == REG_PC || Rs == REG_SP) - { - if (subtract - || (offset & ~0x3fc)) - { - inst.error = _("invalid immediate for address calculation"); - return; - } - inst.instruction = (Rs == REG_PC ? T_OPCODE_ADD_PC - : T_OPCODE_ADD_SP); - inst.instruction |= (Rd << 8) | (offset >> 2); - } - else if (Rs == Rd) - { - if (offset & ~0xff) - { - inst.error = _("immediate value out of range"); - return; - } - inst.instruction = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8; - inst.instruction |= (Rd << 8) | offset; - } - else - { - if (offset & ~0x7) - { - inst.error = _("immediate value out of range"); - return; - } - inst.instruction = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3; - inst.instruction |= Rd | (Rs << 3) | (offset << 6); - } - } - } - - end_of_line (str); -} - -static void -thumb_shift (str, shift) - char * str; - int shift; -{ - int Rd, Rs, Rn = FAIL; - - skip_whitespace (str); - - if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL - || skip_past_comma (&str) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (is_immediate_prefix (*str)) - { - /* Two operand immediate format, set Rs to Rd. */ - Rs = Rd; - str ++; - if (my_get_expression (&inst.reloc.exp, &str)) - return; - } - else - { - if ((Rs = thumb_reg (&str, THUMB_REG_LO)) == FAIL) - return; - - if (skip_past_comma (&str) == FAIL) - { - /* Two operand format, shuffle the registers and pretend there - are 3 */ - Rn = Rs; - Rs = Rd; - } - else if (is_immediate_prefix (*str)) - { - str++; - if (my_get_expression (&inst.reloc.exp, &str)) - return; - } - else if ((Rn = thumb_reg (&str, THUMB_REG_LO)) == FAIL) - return; - } - - /* We now have Rd and Rs set to registers, and Rn set to a register or FAIL; - for the latter case, EXPR contains the immediate that was found. */ - - if (Rn != FAIL) - { - if (Rs != Rd) - { - inst.error = _("source1 and dest must be same register"); - return; - } - - switch (shift) - { - case THUMB_ASR: inst.instruction = T_OPCODE_ASR_R; break; - case THUMB_LSL: inst.instruction = T_OPCODE_LSL_R; break; - case THUMB_LSR: inst.instruction = T_OPCODE_LSR_R; break; - } - - inst.instruction |= Rd | (Rn << 3); - } - else - { - switch (shift) - { - case THUMB_ASR: inst.instruction = T_OPCODE_ASR_I; break; - case THUMB_LSL: inst.instruction = T_OPCODE_LSL_I; break; - case THUMB_LSR: inst.instruction = T_OPCODE_LSR_I; break; - } - - if (inst.reloc.exp.X_op != O_constant) - { - /* Value isn't known yet, create a dummy reloc and let reloc - hacking fix it up */ - - inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT; - } - else - { - unsigned shift_value = inst.reloc.exp.X_add_number; - - if (shift_value > 32 || (shift_value == 32 && shift == THUMB_LSL)) - { - inst.error = _("Invalid immediate for shift"); - return; - } - - /* Shifts of zero are handled by converting to LSL */ - if (shift_value == 0) - inst.instruction = T_OPCODE_LSL_I; - - /* Shifts of 32 are encoded as a shift of zero */ - if (shift_value == 32) - shift_value = 0; - - inst.instruction |= shift_value << 6; - } - - inst.instruction |= Rd | (Rs << 3); - } - - end_of_line (str); -} - -static void -thumb_mov_compare (str, move) - char * str; - int move; -{ - int Rd, Rs = FAIL; - - skip_whitespace (str); - - if ((Rd = thumb_reg (&str, THUMB_REG_ANY)) == FAIL - || skip_past_comma (&str) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (is_immediate_prefix (*str)) - { - str++; - if (my_get_expression (&inst.reloc.exp, &str)) - return; - } - else if ((Rs = thumb_reg (&str, THUMB_REG_ANY)) == FAIL) - return; - - if (Rs != FAIL) - { - if (Rs < 8 && Rd < 8) - { - if (move == THUMB_MOVE) - /* A move of two lowregs is encoded as ADD Rd, Rs, #0 - since a MOV instruction produces unpredictable results */ - inst.instruction = T_OPCODE_ADD_I3; - else - inst.instruction = T_OPCODE_CMP_LR; - inst.instruction |= Rd | (Rs << 3); - } - else - { - if (move == THUMB_MOVE) - inst.instruction = T_OPCODE_MOV_HR; - else - inst.instruction = T_OPCODE_CMP_HR; - - if (Rd > 7) - inst.instruction |= THUMB_H1; - - if (Rs > 7) - inst.instruction |= THUMB_H2; - - inst.instruction |= (Rd & 7) | ((Rs & 7) << 3); - } - } - else - { - if (Rd > 7) - { - inst.error = _("only lo regs allowed with immediate"); - return; - } - - if (move == THUMB_MOVE) - inst.instruction = T_OPCODE_MOV_I8; - else - inst.instruction = T_OPCODE_CMP_I8; - - inst.instruction |= Rd << 8; - - if (inst.reloc.exp.X_op != O_constant) - inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM; - else - { - unsigned value = inst.reloc.exp.X_add_number; - - if (value > 255) - { - inst.error = _("invalid immediate"); - return; - } - - inst.instruction |= value; - } - } - - end_of_line (str); -} - -static void -thumb_load_store (str, load_store, size) - char * str; - int load_store; - int size; -{ - int Rd, Rb, Ro = FAIL; - - skip_whitespace (str); - - if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL - || skip_past_comma (&str) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (*str == '[') - { - str++; - if ((Rb = thumb_reg (&str, THUMB_REG_ANY)) == FAIL) - return; - - if (skip_past_comma (&str) != FAIL) - { - if (is_immediate_prefix (*str)) - { - str++; - if (my_get_expression (&inst.reloc.exp, &str)) - return; - } - else if ((Ro = thumb_reg (&str, THUMB_REG_LO)) == FAIL) - return; - } - else - { - inst.reloc.exp.X_op = O_constant; - inst.reloc.exp.X_add_number = 0; - } - - if (*str != ']') - { - inst.error = _("expected ']'"); - return; - } - str++; - } - else if (*str == '=') - { - /* Parse an "ldr Rd, =expr" instruction; this is another pseudo op */ - str++; - - skip_whitespace (str); - - if (my_get_expression (& inst.reloc.exp, & str)) - return; - - end_of_line (str); - - if ( inst.reloc.exp.X_op != O_constant - && inst.reloc.exp.X_op != O_symbol) - { - inst.error = "Constant expression expected"; - return; - } - - if (inst.reloc.exp.X_op == O_constant - && ((inst.reloc.exp.X_add_number & ~0xFF) == 0)) - { - /* This can be done with a mov instruction */ - - inst.instruction = T_OPCODE_MOV_I8 | (Rd << 8); - inst.instruction |= inst.reloc.exp.X_add_number; - return; - } - - /* Insert into literal pool */ - if (add_to_lit_pool () == FAIL) - { - if (!inst.error) - inst.error = "literal pool insertion failed"; - return; - } - - inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET; - inst.reloc.pc_rel = 1; - inst.instruction = T_OPCODE_LDR_PC | (Rd << 8); - inst.reloc.exp.X_add_number += 4; /* Adjust ARM pipeline offset to Thumb */ - - return; - } - else - { - if (my_get_expression (&inst.reloc.exp, &str)) - return; - - inst.instruction = T_OPCODE_LDR_PC | (Rd << 8); - inst.reloc.pc_rel = 1; - inst.reloc.exp.X_add_number -= 4; /* Pipeline offset */ - inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET; - end_of_line (str); - return; - } - - if (Rb == REG_PC || Rb == REG_SP) - { - if (size != THUMB_WORD) - { - inst.error = _("byte or halfword not valid for base register"); - return; - } - else if (Rb == REG_PC && load_store != THUMB_LOAD) - { - inst.error = _("R15 based store not allowed"); - return; - } - else if (Ro != FAIL) - { - inst.error = _("Invalid base register for register offset"); - return; - } - - if (Rb == REG_PC) - inst.instruction = T_OPCODE_LDR_PC; - else if (load_store == THUMB_LOAD) - inst.instruction = T_OPCODE_LDR_SP; - else - inst.instruction = T_OPCODE_STR_SP; - - inst.instruction |= Rd << 8; - if (inst.reloc.exp.X_op == O_constant) - { - unsigned offset = inst.reloc.exp.X_add_number; - - if (offset & ~0x3fc) - { - inst.error = _("invalid offset"); - return; - } - - inst.instruction |= offset >> 2; - } - else - inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET; - } - else if (Rb > 7) - { - inst.error = _("invalid base register in load/store"); - return; - } - else if (Ro == FAIL) - { - /* Immediate offset */ - if (size == THUMB_WORD) - inst.instruction = (load_store == THUMB_LOAD - ? T_OPCODE_LDR_IW : T_OPCODE_STR_IW); - else if (size == THUMB_HALFWORD) - inst.instruction = (load_store == THUMB_LOAD - ? T_OPCODE_LDR_IH : T_OPCODE_STR_IH); - else - inst.instruction = (load_store == THUMB_LOAD - ? T_OPCODE_LDR_IB : T_OPCODE_STR_IB); - - inst.instruction |= Rd | (Rb << 3); - - if (inst.reloc.exp.X_op == O_constant) - { - unsigned offset = inst.reloc.exp.X_add_number; - - if (offset & ~(0x1f << size)) - { - inst.error = _("Invalid offset"); - return; - } - inst.instruction |= (offset >> size) << 6; - } - else - inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET; - } - else - { - /* Register offset */ - if (size == THUMB_WORD) - inst.instruction = (load_store == THUMB_LOAD - ? T_OPCODE_LDR_RW : T_OPCODE_STR_RW); - else if (size == THUMB_HALFWORD) - inst.instruction = (load_store == THUMB_LOAD - ? T_OPCODE_LDR_RH : T_OPCODE_STR_RH); - else - inst.instruction = (load_store == THUMB_LOAD - ? T_OPCODE_LDR_RB : T_OPCODE_STR_RB); - - inst.instruction |= Rd | (Rb << 3) | (Ro << 6); - } - - end_of_line (str); -} - -static void -do_t_nop (str) - char * str; -{ - /* Do nothing */ - end_of_line (str); - return; -} - -/* Handle the Format 4 instructions that do not have equivalents in other - formats. That is, ADC, AND, EOR, SBC, ROR, TST, NEG, CMN, ORR, MUL, - BIC and MVN. */ -static void -do_t_arit (str) - char * str; -{ - int Rd, Rs, Rn; - - skip_whitespace (str); - - if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL - || skip_past_comma (&str) == FAIL - || (Rs = thumb_reg (&str, THUMB_REG_LO)) == FAIL) - { - inst.error = BAD_ARGS; - return; - } - - if (skip_past_comma (&str) != FAIL) - { - /* Three operand format not allowed for TST, CMN, NEG and MVN. - (It isn't allowed for CMP either, but that isn't handled by this - function.) */ - if (inst.instruction == T_OPCODE_TST - || inst.instruction == T_OPCODE_CMN - || inst.instruction == T_OPCODE_NEG - || inst.instruction == T_OPCODE_MVN) - { - inst.error = BAD_ARGS; - return; - } - - if ((Rn = thumb_reg (&str, THUMB_REG_LO)) == FAIL) - return; - - if (Rs != Rd) - { - inst.error = _("dest and source1 one must be the same register"); - return; - } - Rs = Rn; - } - - if (inst.instruction == T_OPCODE_MUL - && Rs == Rd) - as_tsktsk (_("Rs and Rd must be different in MUL")); - - inst.instruction |= Rd | (Rs << 3); - end_of_line (str); -} - -static void -do_t_add (str) - char * str; -{ - thumb_add_sub (str, 0); -} - -static void -do_t_asr (str) - char * str; -{ - thumb_shift (str, THUMB_ASR); -} - -static void -do_t_branch9 (str) - char * str; -{ - if (my_get_expression (&inst.reloc.exp, &str)) - return; - inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH9; - inst.reloc.pc_rel = 1; - end_of_line (str); -} - -static void -do_t_branch12 (str) - char * str; -{ - if (my_get_expression (&inst.reloc.exp, &str)) - return; - inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH12; - inst.reloc.pc_rel = 1; - end_of_line (str); -} - -/* Find the real, Thumb encoded start of a Thumb function. */ - -static symbolS * -find_real_start (symbolP) - symbolS * symbolP; -{ - char * real_start; - const char * name = S_GET_NAME (symbolP); - symbolS * new_target; - - /* This definiton must agree with the one in gcc/config/arm/thumb.c */ -#define STUB_NAME ".real_start_of" - - if (name == NULL) - abort(); - - /* Names that start with '.' are local labels, not function entry points. - The compiler may generate BL instructions to these labels because it - needs to perform a branch to a far away location. */ - if (name[0] == '.') - return symbolP; - - real_start = malloc (strlen (name) + strlen (STUB_NAME) + 1); - sprintf (real_start, "%s%s", STUB_NAME, name); - - new_target = symbol_find (real_start); - - if (new_target == NULL) - { - as_warn ("Failed to find real start of function: %s\n", name); - new_target = symbolP; - } - - free (real_start); - - return new_target; -} - - -static void -do_t_branch23 (str) - char * str; -{ - if (my_get_expression (& inst.reloc.exp, & str)) - return; - - inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23; - inst.reloc.pc_rel = 1; - end_of_line (str); - - /* If the destination of the branch is a defined symbol which does not have - the THUMB_FUNC attribute, then we must be calling a function which has - the (interfacearm) attribute. We look for the Thumb entry point to that - function and change the branch to refer to that function instead. */ - if ( inst.reloc.exp.X_op == O_symbol - && inst.reloc.exp.X_add_symbol != NULL - && S_IS_DEFINED (inst.reloc.exp.X_add_symbol) - && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol)) - inst.reloc.exp.X_add_symbol = find_real_start (inst.reloc.exp.X_add_symbol); -} - -static void -do_t_bx (str) - char * str; -{ - int reg; - - skip_whitespace (str); - - if ((reg = thumb_reg (&str, THUMB_REG_ANY)) == FAIL) - return; - - /* This sets THUMB_H2 from the top bit of reg. */ - inst.instruction |= reg << 3; - - /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC. The reloc - should cause the alignment to be checked once it is known. This is - because BX PC only works if the instruction is word aligned. */ - - end_of_line (str); -} - -static void -do_t_compare (str) - char * str; -{ - thumb_mov_compare (str, THUMB_COMPARE); -} - -static void -do_t_ldmstm (str) - char * str; -{ - int Rb; - long range; - - skip_whitespace (str); - - if ((Rb = thumb_reg (&str, THUMB_REG_LO)) == FAIL) - return; - - if (*str != '!') - as_warn (_("Inserted missing '!': load/store multiple always writes back base register")); - else - str++; - - if (skip_past_comma (&str) == FAIL - || (range = reg_list (&str)) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (inst.reloc.type != BFD_RELOC_NONE) - { - /* This really doesn't seem worth it. */ - inst.reloc.type = BFD_RELOC_NONE; - inst.error = _("Expression too complex"); - return; - } - - if (range & ~0xff) - { - inst.error = _("only lo-regs valid in load/store multiple"); - return; - } - - inst.instruction |= (Rb << 8) | range; - end_of_line (str); -} - -static void -do_t_ldr (str) - char * str; -{ - thumb_load_store (str, THUMB_LOAD, THUMB_WORD); -} - -static void -do_t_ldrb (str) - char * str; -{ - thumb_load_store (str, THUMB_LOAD, THUMB_BYTE); -} - -static void -do_t_ldrh (str) - char * str; -{ - thumb_load_store (str, THUMB_LOAD, THUMB_HALFWORD); -} - -static void -do_t_lds (str) - char * str; -{ - int Rd, Rb, Ro; - - skip_whitespace (str); - - if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL - || skip_past_comma (&str) == FAIL - || *str++ != '[' - || (Rb = thumb_reg (&str, THUMB_REG_LO)) == FAIL - || skip_past_comma (&str) == FAIL - || (Ro = thumb_reg (&str, THUMB_REG_LO)) == FAIL - || *str++ != ']') - { - if (! inst.error) - inst.error = _("Syntax: ldrs[b] Rd, [Rb, Ro]"); - return; - } - - inst.instruction |= Rd | (Rb << 3) | (Ro << 6); - end_of_line (str); -} - -static void -do_t_lsl (str) - char * str; -{ - thumb_shift (str, THUMB_LSL); -} - -static void -do_t_lsr (str) - char * str; -{ - thumb_shift (str, THUMB_LSR); -} - -static void -do_t_mov (str) - char * str; -{ - thumb_mov_compare (str, THUMB_MOVE); -} - -static void -do_t_push_pop (str) - char * str; -{ - long range; - - skip_whitespace (str); - - if ((range = reg_list (&str)) == FAIL) - { - if (! inst.error) - inst.error = BAD_ARGS; - return; - } - - if (inst.reloc.type != BFD_RELOC_NONE) - { - /* This really doesn't seem worth it. */ - inst.reloc.type = BFD_RELOC_NONE; - inst.error = _("Expression too complex"); - return; - } - - if (range & ~0xff) - { - if ((inst.instruction == T_OPCODE_PUSH - && (range & ~0xff) == 1 << REG_LR) - || (inst.instruction == T_OPCODE_POP - && (range & ~0xff) == 1 << REG_PC)) - { - inst.instruction |= THUMB_PP_PC_LR; - range &= 0xff; - } - else - { - inst.error = _("invalid register list to push/pop instruction"); - return; - } - } - - inst.instruction |= range; - end_of_line (str); -} - -static void -do_t_str (str) - char * str; -{ - thumb_load_store (str, THUMB_STORE, THUMB_WORD); -} - -static void -do_t_strb (str) - char * str; -{ - thumb_load_store (str, THUMB_STORE, THUMB_BYTE); -} - -static void -do_t_strh (str) - char * str; -{ - thumb_load_store (str, THUMB_STORE, THUMB_HALFWORD); -} - -static void -do_t_sub (str) - char * str; -{ - thumb_add_sub (str, 1); -} - -static void -do_t_swi (str) - char * str; -{ - skip_whitespace (str); - - if (my_get_expression (&inst.reloc.exp, &str)) - return; - - inst.reloc.type = BFD_RELOC_ARM_SWI; - end_of_line (str); - return; -} - -static void -do_t_adr (str) - char * str; -{ - int reg; - - /* This is a pseudo-op of the form "adr rd, label" to be converted - into a relative address of the form "add rd, pc, #label-.-4". */ - skip_whitespace (str); - - /* Store Rd in temporary location inside instruction. */ - if ((reg = reg_required_here (&str, 4)) == FAIL - || (reg > 7) /* For Thumb reg must be r0..r7. */ - || skip_past_comma (&str) == FAIL - || my_get_expression (&inst.reloc.exp, &str)) - { - if (!inst.error) - inst.error = BAD_ARGS; - return; - } - - inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD; - inst.reloc.exp.X_add_number -= 4; /* PC relative adjust. */ - inst.reloc.pc_rel = 1; - inst.instruction |= REG_PC; /* Rd is already placed into the instruction. */ - - end_of_line (str); -} - -static void -insert_reg (entry) - int entry; -{ - int len = strlen (reg_table[entry].name) + 2; - char * buf = (char *) xmalloc (len); - char * buf2 = (char *) xmalloc (len); - int i = 0; - -#ifdef REGISTER_PREFIX - buf[i++] = REGISTER_PREFIX; -#endif - - strcpy (buf + i, reg_table[entry].name); - - for (i = 0; buf[i]; i++) - buf2[i] = islower (buf[i]) ? toupper (buf[i]) : buf[i]; - - buf2[i] = '\0'; - - hash_insert (arm_reg_hsh, buf, (PTR) ®_table[entry]); - hash_insert (arm_reg_hsh, buf2, (PTR) ®_table[entry]); -} - -static void -insert_reg_alias (str, regnum) - char *str; - int regnum; -{ - struct reg_entry *new = - (struct reg_entry *)xmalloc (sizeof (struct reg_entry)); - char *name = xmalloc (strlen (str) + 1); - strcpy (name, str); - - new->name = name; - new->number = regnum; - - hash_insert (arm_reg_hsh, name, (PTR) new); -} - -static void -set_constant_flonums () -{ - int i; - - for (i = 0; i < NUM_FLOAT_VALS; i++) - if (atof_ieee ((char *)fp_const[i], 'x', fp_values[i]) == NULL) - abort (); -} - -void -md_begin () -{ - unsigned mach; - unsigned int i; - - if ( (arm_ops_hsh = hash_new ()) == NULL - || (arm_tops_hsh = hash_new ()) == NULL - || (arm_cond_hsh = hash_new ()) == NULL - || (arm_shift_hsh = hash_new ()) == NULL - || (arm_reg_hsh = hash_new ()) == NULL - || (arm_psr_hsh = hash_new ()) == NULL) - as_fatal (_("Virtual memory exhausted")); - - for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++) - hash_insert (arm_ops_hsh, insns[i].template, (PTR) (insns + i)); - for (i = 0; i < sizeof (tinsns) / sizeof (struct thumb_opcode); i++) - hash_insert (arm_tops_hsh, tinsns[i].template, (PTR) (tinsns + i)); - for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++) - hash_insert (arm_cond_hsh, conds[i].template, (PTR) (conds + i)); - for (i = 0; i < sizeof (shift) / sizeof (struct asm_shift); i++) - hash_insert (arm_shift_hsh, shift[i].template, (PTR) (shift + i)); - for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++) - hash_insert (arm_psr_hsh, psrs[i].template, (PTR) (psrs + i)); - - for (i = 0; reg_table[i].name; i++) - insert_reg (i); - - set_constant_flonums (); - -#if defined OBJ_COFF || defined OBJ_ELF - { - unsigned int flags = 0; - - /* Set the flags in the private structure. */ - if (uses_apcs_26) flags |= F_APCS26; - if (support_interwork) flags |= F_INTERWORK; - if (uses_apcs_float) flags |= F_APCS_FLOAT; - if (pic_code) flags |= F_PIC; - if ((cpu_variant & FPU_ALL) == FPU_NONE) flags |= F_SOFT_FLOAT; - - bfd_set_private_flags (stdoutput, flags); - } -#endif - - /* Record the CPU type as well. */ - switch (cpu_variant & ARM_CPU_MASK) - { - case ARM_2: - mach = bfd_mach_arm_2; - break; - - case ARM_3: /* Also ARM_250. */ - mach = bfd_mach_arm_2a; - break; - - default: - case ARM_6 | ARM_3 | ARM_2: /* Actually no CPU type defined. */ - mach = bfd_mach_arm_4; - break; - - case ARM_7: /* Also ARM_6. */ - mach = bfd_mach_arm_3; - break; - } - - /* Catch special cases. */ - if (cpu_variant != (FPU_DEFAULT | CPU_DEFAULT)) - { - if (cpu_variant & (ARM_EXT_V5 & ARM_THUMB)) - mach = bfd_mach_arm_5T; - else if (cpu_variant & ARM_EXT_V5) - mach = bfd_mach_arm_5; - else if (cpu_variant & ARM_THUMB) - mach = bfd_mach_arm_4T; - else if ((cpu_variant & ARM_ARCH_V4) == ARM_ARCH_V4) - mach = bfd_mach_arm_4; - else if (cpu_variant & ARM_LONGMUL) - mach = bfd_mach_arm_3M; - } - - bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach); -} - -/* Turn an integer of n bytes (in val) into a stream of bytes appropriate - for use in the a.out file, and stores them in the array pointed to by buf. - This knows about the endian-ness of the target machine and does - THE RIGHT THING, whatever it is. Possible values for n are 1 (byte) - 2 (short) and 4 (long) Floating numbers are put out as a series of - LITTLENUMS (shorts, here at least). */ -void -md_number_to_chars (buf, val, n) - char * buf; - valueT val; - int n; -{ - if (target_big_endian) - number_to_chars_bigendian (buf, val, n); - else - number_to_chars_littleendian (buf, val, n); -} - -static valueT -md_chars_to_number (buf, n) - char * buf; - int n; -{ - valueT result = 0; - unsigned char * where = (unsigned char *) buf; - - if (target_big_endian) - { - while (n--) - { - result <<= 8; - result |= (*where++ & 255); - } - } - else - { - while (n--) - { - result <<= 8; - result |= (where[n] & 255); - } - } - - return result; -} - -/* Turn a string in input_line_pointer into a floating point constant - of type TYPE, and store the appropriate bytes in *litP. The number - of LITTLENUMS emitted is stored in *sizeP . An error message is - returned, or NULL on OK. - - Note that fp constants aren't represent in the normal way on the ARM. - In big endian mode, things are as expected. However, in little endian - mode fp constants are big-endian word-wise, and little-endian byte-wise - within the words. For example, (double) 1.1 in big endian mode is - the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is - the byte sequence 99 99 f1 3f 9a 99 99 99. - - ??? The format of 12 byte floats is uncertain according to gcc's arm.h. */ - -char * -md_atof (type, litP, sizeP) - char type; - char * litP; - int * sizeP; -{ - int prec; - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - char *t; - int i; - - switch (type) - { - case 'f': - case 'F': - case 's': - case 'S': - prec = 2; - break; - - case 'd': - case 'D': - case 'r': - case 'R': - prec = 4; - break; - - case 'x': - case 'X': - prec = 6; - break; - - case 'p': - case 'P': - prec = 6; - break; - - default: - *sizeP = 0; - return _("Bad call to MD_ATOF()"); - } - - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - *sizeP = prec * 2; - - if (target_big_endian) - { - for (i = 0; i < prec; i++) - { - md_number_to_chars (litP, (valueT) words[i], 2); - litP += 2; - } - } - else - { - /* For a 4 byte float the order of elements in `words' is 1 0. For an - 8 byte float the order is 1 0 3 2. */ - for (i = 0; i < prec; i += 2) - { - md_number_to_chars (litP, (valueT) words[i + 1], 2); - md_number_to_chars (litP + 2, (valueT) words[i], 2); - litP += 4; - } - } - - return 0; -} - -/* The knowledge of the PC's pipeline offset is built into the insns themselves. */ -long -md_pcrel_from (fixP) - fixS * fixP; -{ - if ( fixP->fx_addsy - && S_GET_SEGMENT (fixP->fx_addsy) == undefined_section - && fixP->fx_subsy == NULL) - return 0; - - if (fixP->fx_pcrel && (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_ADD)) - { - /* PC relative addressing on the Thumb is slightly odd - as the bottom two bits of the PC are forced to zero - for the calculation. */ - return (fixP->fx_where + fixP->fx_frag->fr_address) & ~3; - } - -#ifdef TE_WINCE - /* The pattern was adjusted to accomodate CE's off-by-one fixups, - so we un-adjust here to compensate for the accomodation. */ - return fixP->fx_where + fixP->fx_frag->fr_address + 8; -#else - return fixP->fx_where + fixP->fx_frag->fr_address; -#endif -} - -/* Round up a section size to the appropriate boundary. */ -valueT -md_section_align (segment, size) - segT segment ATTRIBUTE_UNUSED; - valueT size; -{ -#ifdef OBJ_ELF - return size; -#else - /* Round all sects to multiple of 4 */ - return (size + 3) & ~3; -#endif -} - -/* Under ELF we need to default _GLOBAL_OFFSET_TABLE. Otherwise - we have no need to default values of symbols. */ - -/* ARGSUSED */ -symbolS * -md_undefined_symbol (name) - char * name; -{ -#ifdef OBJ_ELF - if (name[0] == '_' && name[1] == 'G' - && streq (name, GLOBAL_OFFSET_TABLE_NAME)) - { - if (!GOT_symbol) - { - if (symbol_find (name)) - as_bad ("GOT already in the symbol table"); - - GOT_symbol = symbol_new (name, undefined_section, - (valueT)0, & zero_address_frag); - } - - return GOT_symbol; - } -#endif - - return 0; -} - -/* arm_reg_parse () := if it looks like a register, return its token and - advance the pointer. */ - -static int -arm_reg_parse (ccp) - register char ** ccp; -{ - char * start = * ccp; - char c; - char * p; - struct reg_entry * reg; - -#ifdef REGISTER_PREFIX - if (*start != REGISTER_PREFIX) - return FAIL; - p = start + 1; -#else - p = start; -#ifdef OPTIONAL_REGISTER_PREFIX - if (*p == OPTIONAL_REGISTER_PREFIX) - p++, start++; -#endif -#endif - if (!isalpha (*p) || !is_name_beginner (*p)) - return FAIL; - - c = *p++; - while (isalpha (c) || isdigit (c) || c == '_') - c = *p++; - - *--p = 0; - reg = (struct reg_entry *) hash_find (arm_reg_hsh, start); - *p = c; - - if (reg) - { - *ccp = p; - return reg->number; - } - - return FAIL; -} - -static int -arm_psr_parse (ccp) - register char ** ccp; -{ - char * start = * ccp; - char c; - char * p; - CONST struct asm_psr * psr; - - p = start; - c = *p++; - while (isalpha (c) || c == '_') - c = *p++; - - *--p = 0; - psr = (CONST struct asm_psr *) hash_find (arm_psr_hsh, start); - *p = c; - - if (psr) - { - *ccp = p; - return psr->number; - } - - return FAIL; -} - -int -md_apply_fix3 (fixP, val, seg) - fixS * fixP; - valueT * val; - segT seg; -{ - offsetT value = * val; - offsetT newval; - unsigned int newimm; - unsigned long temp; - int sign; - char * buf = fixP->fx_where + fixP->fx_frag->fr_literal; - arm_fix_data * arm_data = (arm_fix_data *) fixP->tc_fix_data; - - assert (fixP->fx_r_type < BFD_RELOC_UNUSED); - - /* Note whether this will delete the relocation. */ -#if 0 /* patch from REarnshaw to JDavis (disabled for the moment, since it doesn't work fully) */ - if ((fixP->fx_addsy == 0 || symbol_constant_p (fixP->fx_addsy)) - && !fixP->fx_pcrel) -#else - if (fixP->fx_addsy == 0 && !fixP->fx_pcrel) -#endif - fixP->fx_done = 1; - - /* If this symbol is in a different section then we need to leave it for - the linker to deal with. Unfortunately, md_pcrel_from can't tell, - so we have to undo it's effects here. */ - if (fixP->fx_pcrel) - { - if (fixP->fx_addsy != NULL - && S_IS_DEFINED (fixP->fx_addsy) - && S_GET_SEGMENT (fixP->fx_addsy) != seg) - { - if (target_oabi - && (fixP->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH - || fixP->fx_r_type == BFD_RELOC_ARM_PCREL_BLX - )) - value = 0; - else - value += md_pcrel_from (fixP); - } - } - - fixP->fx_addnumber = value; /* Remember value for emit_reloc. */ - - switch (fixP->fx_r_type) - { - case BFD_RELOC_ARM_IMMEDIATE: - newimm = validate_immediate (value); - temp = md_chars_to_number (buf, INSN_SIZE); - - /* If the instruction will fail, see if we can fix things up by - changing the opcode. */ - if (newimm == (unsigned int) FAIL - && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("invalid constant (%lx) after fixup"), - (unsigned long) value); - break; - } - - newimm |= (temp & 0xfffff000); - md_number_to_chars (buf, (valueT) newimm, INSN_SIZE); - break; - - case BFD_RELOC_ARM_ADRL_IMMEDIATE: - { - unsigned int highpart = 0; - unsigned int newinsn = 0xe1a00000; /* nop */ - newimm = validate_immediate (value); - temp = md_chars_to_number (buf, INSN_SIZE); - - /* If the instruction will fail, see if we can fix things up by - changing the opcode. */ - if (newimm == (unsigned int) FAIL - && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL) - { - /* No ? OK - try using two ADD instructions to generate the value. */ - newimm = validate_immediate_twopart (value, & highpart); - - /* Yes - then make sure that the second instruction is also an add. */ - if (newimm != (unsigned int) FAIL) - newinsn = temp; - /* Still No ? Try using a negated value. */ - else if (validate_immediate_twopart (- value, & highpart) != (unsigned int) FAIL) - temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT; - /* Otherwise - give up. */ - else - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Unable to compute ADRL instructions for PC offset of 0x%x"), value); - break; - } - - /* Replace the first operand in the 2nd instruction (which is the PC) - with the destination register. We have already added in the PC in the - first instruction and we do not want to do it again. */ - newinsn &= ~ 0xf0000; - newinsn |= ((newinsn & 0x0f000) << 4); - } - - newimm |= (temp & 0xfffff000); - md_number_to_chars (buf, (valueT) newimm, INSN_SIZE); - - highpart |= (newinsn & 0xfffff000); - md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE); - } - break; - - case BFD_RELOC_ARM_OFFSET_IMM: - sign = value >= 0; - - if (value < 0) - value = - value; - - if (validate_offset_imm (value, 0) == FAIL) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("bad immediate value for offset (%ld)"), (long) value); - break; - } - - newval = md_chars_to_number (buf, INSN_SIZE); - newval &= 0xff7ff000; - newval |= value | (sign ? INDEX_UP : 0); - md_number_to_chars (buf, newval, INSN_SIZE); - break; - - case BFD_RELOC_ARM_OFFSET_IMM8: - case BFD_RELOC_ARM_HWLITERAL: - sign = value >= 0; - - if (value < 0) - value = - value; - - if (validate_offset_imm (value, 1) == FAIL) - { - if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("invalid literal constant: pool needs to be closer")); - else - as_bad (_("bad immediate value for half-word offset (%ld)"), - (long) value); - break; - } - - newval = md_chars_to_number (buf, INSN_SIZE); - newval &= 0xff7ff0f0; - newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0); - md_number_to_chars (buf, newval, INSN_SIZE); - break; - - case BFD_RELOC_ARM_LITERAL: - sign = value >= 0; - - if (value < 0) - value = - value; - - if (validate_offset_imm (value, 0) == FAIL) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("invalid literal constant: pool needs to be closer")); - break; - } - - newval = md_chars_to_number (buf, INSN_SIZE); - newval &= 0xff7ff000; - newval |= value | (sign ? INDEX_UP : 0); - md_number_to_chars (buf, newval, INSN_SIZE); - break; - - case BFD_RELOC_ARM_SHIFT_IMM: - newval = md_chars_to_number (buf, INSN_SIZE); - if (((unsigned long) value) > 32 - || (value == 32 - && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60))) - { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("shift expression is too large")); - break; - } - - if (value == 0) - newval &= ~0x60; /* Shifts of zero must be done as lsl */ - else if (value == 32) - value = 0; - newval &= 0xfffff07f; - newval |= (value & 0x1f) << 7; - md_number_to_chars (buf, newval , INSN_SIZE); - break; - - case BFD_RELOC_ARM_SWI: - if (arm_data->thumb_mode) - { - if (((unsigned long) value) > 0xff) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid swi expression")); - newval = md_chars_to_number (buf, THUMB_SIZE) & 0xff00; - newval |= value; - md_number_to_chars (buf, newval, THUMB_SIZE); - } - else - { - if (((unsigned long) value) > 0x00ffffff) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid swi expression")); - newval = md_chars_to_number (buf, INSN_SIZE) & 0xff000000; - newval |= value; - md_number_to_chars (buf, newval , INSN_SIZE); - } - break; - - case BFD_RELOC_ARM_MULTI: - if (((unsigned long) value) > 0xffff) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid expression in load/store multiple")); - newval = value | md_chars_to_number (buf, INSN_SIZE); - md_number_to_chars (buf, newval, INSN_SIZE); - break; - - case BFD_RELOC_ARM_PCREL_BRANCH: - newval = md_chars_to_number (buf, INSN_SIZE); - - /* Sign-extend a 24-bit number. */ -#define SEXT24(x) ((((x) & 0xffffff) ^ (~ 0x7fffff)) + 0x800000) - -#ifdef OBJ_ELF - if (! target_oabi) - value = fixP->fx_offset; -#endif - - /* We are going to store value (shifted right by two) in the - instruction, in a 24 bit, signed field. Thus we need to check - that none of the top 8 bits of the shifted value (top 7 bits of - the unshifted, unsigned value) are set, or that they are all set. */ - if ((value & 0xfe000000UL) != 0 - && ((value & 0xfe000000UL) != 0xfe000000UL)) - { -#ifdef OBJ_ELF - /* Normally we would be stuck at this point, since we cannot store - the absolute address that is the destination of the branch in the - 24 bits of the branch instruction. If however, we happen to know - that the destination of the branch is in the same section as the - branch instruciton itself, then we can compute the relocation for - ourselves and not have to bother the linker with it. - - FIXME: The tests for OBJ_ELF and ! target_oabi are only here - because I have not worked out how to do this for OBJ_COFF or - target_oabi. */ - if (! target_oabi - && fixP->fx_addsy != NULL - && S_IS_DEFINED (fixP->fx_addsy) - && S_GET_SEGMENT (fixP->fx_addsy) == seg) - { - /* Get pc relative value to go into the branch. */ - value = * val; - - /* Permit a backward branch provided that enough bits are set. - Allow a forwards branch, provided that enough bits are clear. */ - if ((value & 0xfe000000UL) == 0xfe000000UL - || (value & 0xfe000000UL) == 0) - fixP->fx_done = 1; - } - - if (! fixP->fx_done) -#endif - as_bad_where (fixP->fx_file, fixP->fx_line, - _("gas can't handle same-section branch dest >= 0x04000000")); - } - - value >>= 2; - value += SEXT24 (newval); - - if ((value & 0xff000000UL) != 0 - && ((value & 0xff000000UL) != 0xff000000UL)) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("out of range branch")); - - newval = (value & 0x00ffffff) | (newval & 0xff000000); - md_number_to_chars (buf, newval, INSN_SIZE); - break; - - case BFD_RELOC_ARM_PCREL_BLX: - { - offsetT hbit; - newval = md_chars_to_number (buf, INSN_SIZE); - -#ifdef OBJ_ELF - if (! target_oabi) - value = fixP->fx_offset; -#endif - hbit = (value >> 1) & 1; - value = (value >> 2) & 0x00ffffff; - value = (value + (newval & 0x00ffffff)) & 0x00ffffff; - newval = value | (newval & 0xfe000000) | (hbit << 24); - md_number_to_chars (buf, newval, INSN_SIZE); - } - break; - - case BFD_RELOC_THUMB_PCREL_BRANCH9: /* conditional branch */ - newval = md_chars_to_number (buf, THUMB_SIZE); - { - addressT diff = (newval & 0xff) << 1; - if (diff & 0x100) - diff |= ~0xff; - - value += diff; - if ((value & ~0xff) && ((value & ~0xff) != ~0xff)) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Branch out of range")); - newval = (newval & 0xff00) | ((value & 0x1ff) >> 1); - } - md_number_to_chars (buf, newval, THUMB_SIZE); - break; - - case BFD_RELOC_THUMB_PCREL_BRANCH12: /* unconditional branch */ - newval = md_chars_to_number (buf, THUMB_SIZE); - { - addressT diff = (newval & 0x7ff) << 1; - if (diff & 0x800) - diff |= ~0x7ff; - - value += diff; - if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff)) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Branch out of range")); - newval = (newval & 0xf800) | ((value & 0xfff) >> 1); - } - md_number_to_chars (buf, newval, THUMB_SIZE); - break; - - case BFD_RELOC_THUMB_PCREL_BLX: - case BFD_RELOC_THUMB_PCREL_BRANCH23: - { - offsetT newval2; - addressT diff; - - newval = md_chars_to_number (buf, THUMB_SIZE); - newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE); - diff = ((newval & 0x7ff) << 12) | ((newval2 & 0x7ff) << 1); - if (diff & 0x400000) - diff |= ~0x3fffff; -#ifdef OBJ_ELF - value = fixP->fx_offset; -#endif - value += diff; - if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff)) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Branch with link out of range")); - - newval = (newval & 0xf800) | ((value & 0x7fffff) >> 12); - newval2 = (newval2 & 0xf800) | ((value & 0xfff) >> 1); - md_number_to_chars (buf, newval, THUMB_SIZE); - md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE); - } - break; - - case BFD_RELOC_8: - if (fixP->fx_done || fixP->fx_pcrel) - md_number_to_chars (buf, value, 1); -#ifdef OBJ_ELF - else if (!target_oabi) - { - value = fixP->fx_offset; - md_number_to_chars (buf, value, 1); - } -#endif - break; - - case BFD_RELOC_16: - if (fixP->fx_done || fixP->fx_pcrel) - md_number_to_chars (buf, value, 2); -#ifdef OBJ_ELF - else if (!target_oabi) - { - value = fixP->fx_offset; - md_number_to_chars (buf, value, 2); - } -#endif - break; - -#ifdef OBJ_ELF - case BFD_RELOC_ARM_GOT32: - case BFD_RELOC_ARM_GOTOFF: - md_number_to_chars (buf, 0, 4); - break; -#endif - - case BFD_RELOC_RVA: - case BFD_RELOC_32: - if (fixP->fx_done || fixP->fx_pcrel) - md_number_to_chars (buf, value, 4); -#ifdef OBJ_ELF - else if (!target_oabi) - { - value = fixP->fx_offset; - md_number_to_chars (buf, value, 4); - } -#endif - break; - -#ifdef OBJ_ELF - case BFD_RELOC_ARM_PLT32: - /* It appears the instruction is fully prepared at this point. */ - break; -#endif - - case BFD_RELOC_ARM_GOTPC: - md_number_to_chars (buf, value, 4); - break; - - case BFD_RELOC_ARM_CP_OFF_IMM: - sign = value >= 0; - if (value < -1023 || value > 1023 || (value & 3)) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Illegal value for co-processor offset")); - if (value < 0) - value = -value; - newval = md_chars_to_number (buf, INSN_SIZE) & 0xff7fff00; - newval |= (value >> 2) | (sign ? INDEX_UP : 0); - md_number_to_chars (buf, newval , INSN_SIZE); - break; - - case BFD_RELOC_ARM_THUMB_OFFSET: - newval = md_chars_to_number (buf, THUMB_SIZE); - /* Exactly what ranges, and where the offset is inserted depends on - the type of instruction, we can establish this from the top 4 bits */ - switch (newval >> 12) - { - case 4: /* PC load */ - /* Thumb PC loads are somewhat odd, bit 1 of the PC is - forced to zero for these loads, so we will need to round - up the offset if the instruction address is not word - aligned (since the final address produced must be, and - we can only describe word-aligned immediate offsets). */ - - if ((fixP->fx_frag->fr_address + fixP->fx_where + value) & 3) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid offset, target not word aligned (0x%08X)"), - (unsigned int)(fixP->fx_frag->fr_address + fixP->fx_where + value)); - - if ((value + 2) & ~0x3fe) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid offset, value too big (0x%08X)"), value); - - /* Round up, since pc will be rounded down. */ - newval |= (value + 2) >> 2; - break; - - case 9: /* SP load/store */ - if (value & ~0x3fc) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid offset, value too big (0x%08X)"), value); - newval |= value >> 2; - break; - - case 6: /* Word load/store */ - if (value & ~0x7c) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid offset, value too big (0x%08X)"), value); - newval |= value << 4; /* 6 - 2 */ - break; - - case 7: /* Byte load/store */ - if (value & ~0x1f) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid offset, value too big (0x%08X)"), value); - newval |= value << 6; - break; - - case 8: /* Halfword load/store */ - if (value & ~0x3e) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid offset, value too big (0x%08X)"), value); - newval |= value << 5; /* 6 - 1 */ - break; - - default: - as_bad_where (fixP->fx_file, fixP->fx_line, - "Unable to process relocation for thumb opcode: %lx", - (unsigned long) newval); - break; - } - md_number_to_chars (buf, newval, THUMB_SIZE); - break; - - case BFD_RELOC_ARM_THUMB_ADD: - /* This is a complicated relocation, since we use it for all of - the following immediate relocations: - 3bit ADD/SUB - 8bit ADD/SUB - 9bit ADD/SUB SP word-aligned - 10bit ADD PC/SP word-aligned - - The type of instruction being processed is encoded in the - instruction field: - 0x8000 SUB - 0x00F0 Rd - 0x000F Rs - */ - newval = md_chars_to_number (buf, THUMB_SIZE); - { - int rd = (newval >> 4) & 0xf; - int rs = newval & 0xf; - int subtract = newval & 0x8000; - - if (rd == REG_SP) - { - if (value & ~0x1fc) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid immediate for stack address calculation")); - newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST; - newval |= value >> 2; - } - else if (rs == REG_PC || rs == REG_SP) - { - if (subtract || - value & ~0x3fc) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid immediate for address calculation (value = 0x%08lX)"), - (unsigned long) value); - newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP); - newval |= rd << 8; - newval |= value >> 2; - } - else if (rs == rd) - { - if (value & ~0xff) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid 8bit immediate")); - newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8; - newval |= (rd << 8) | value; - } - else - { - if (value & ~0x7) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid 3bit immediate")); - newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3; - newval |= rd | (rs << 3) | (value << 6); - } - } - md_number_to_chars (buf, newval , THUMB_SIZE); - break; - - case BFD_RELOC_ARM_THUMB_IMM: - newval = md_chars_to_number (buf, THUMB_SIZE); - switch (newval >> 11) - { - case 0x04: /* 8bit immediate MOV */ - case 0x05: /* 8bit immediate CMP */ - if (value < 0 || value > 255) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Invalid immediate: %ld is too large"), - (long) value); - newval |= value; - break; - - default: - abort (); - } - md_number_to_chars (buf, newval , THUMB_SIZE); - break; - - case BFD_RELOC_ARM_THUMB_SHIFT: - /* 5bit shift value (0..31) */ - if (value < 0 || value > 31) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Illegal Thumb shift value: %ld"), (long) value); - newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf03f; - newval |= value << 6; - md_number_to_chars (buf, newval , THUMB_SIZE); - break; - - case BFD_RELOC_VTABLE_INHERIT: - case BFD_RELOC_VTABLE_ENTRY: - fixP->fx_done = 0; - return 1; - - case BFD_RELOC_NONE: - default: - as_bad_where (fixP->fx_file, fixP->fx_line, - _("Bad relocation fixup type (%d)"), fixP->fx_r_type); - } - - return 1; -} - -/* Translate internal representation of relocation info to BFD target - format. */ -arelent * -tc_gen_reloc (section, fixp) - asection * section ATTRIBUTE_UNUSED; - fixS * fixp; -{ - arelent * reloc; - bfd_reloc_code_real_type code; - - reloc = (arelent *) xmalloc (sizeof (arelent)); - - reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); - reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; - - /* @@ Why fx_addnumber sometimes and fx_offset other times? */ -#ifndef OBJ_ELF - if (fixp->fx_pcrel == 0) - reloc->addend = fixp->fx_offset; - else - reloc->addend = fixp->fx_offset = reloc->address; -#else /* OBJ_ELF */ - reloc->addend = fixp->fx_offset; -#endif - - switch (fixp->fx_r_type) - { - case BFD_RELOC_8: - if (fixp->fx_pcrel) - { - code = BFD_RELOC_8_PCREL; - break; - } - - case BFD_RELOC_16: - if (fixp->fx_pcrel) - { - code = BFD_RELOC_16_PCREL; - break; - } - - case BFD_RELOC_32: - if (fixp->fx_pcrel) - { - code = BFD_RELOC_32_PCREL; - break; - } - - case BFD_RELOC_ARM_PCREL_BRANCH: - case BFD_RELOC_ARM_PCREL_BLX: - case BFD_RELOC_RVA: - case BFD_RELOC_THUMB_PCREL_BRANCH9: - case BFD_RELOC_THUMB_PCREL_BRANCH12: - case BFD_RELOC_THUMB_PCREL_BRANCH23: - case BFD_RELOC_THUMB_PCREL_BLX: - case BFD_RELOC_VTABLE_ENTRY: - case BFD_RELOC_VTABLE_INHERIT: - code = fixp->fx_r_type; - break; - - case BFD_RELOC_ARM_LITERAL: - case BFD_RELOC_ARM_HWLITERAL: - /* If this is called then the a literal has been referenced across - a section boundary - possibly due to an implicit dump */ - as_bad_where (fixp->fx_file, fixp->fx_line, - _("Literal referenced across section boundary (Implicit dump?)")); - return NULL; - -#ifdef OBJ_ELF - case BFD_RELOC_ARM_GOT32: - case BFD_RELOC_ARM_GOTOFF: - case BFD_RELOC_ARM_PLT32: - code = fixp->fx_r_type; - break; -#endif - - case BFD_RELOC_ARM_IMMEDIATE: - as_bad_where (fixp->fx_file, fixp->fx_line, - _("Internal_relocation (type %d) not fixed up (IMMEDIATE)"), - fixp->fx_r_type); - return NULL; - - case BFD_RELOC_ARM_ADRL_IMMEDIATE: - as_bad_where (fixp->fx_file, fixp->fx_line, - _("ADRL used for a symbol not defined in the same file"), - fixp->fx_r_type); - return NULL; - - case BFD_RELOC_ARM_OFFSET_IMM: - as_bad_where (fixp->fx_file, fixp->fx_line, - _("Internal_relocation (type %d) not fixed up (OFFSET_IMM)"), - fixp->fx_r_type); - return NULL; - - default: - { - char * type; - switch (fixp->fx_r_type) - { - case BFD_RELOC_ARM_IMMEDIATE: type = "IMMEDIATE"; break; - case BFD_RELOC_ARM_OFFSET_IMM: type = "OFFSET_IMM"; break; - case BFD_RELOC_ARM_OFFSET_IMM8: type = "OFFSET_IMM8"; break; - case BFD_RELOC_ARM_SHIFT_IMM: type = "SHIFT_IMM"; break; - case BFD_RELOC_ARM_SWI: type = "SWI"; break; - case BFD_RELOC_ARM_MULTI: type = "MULTI"; break; - case BFD_RELOC_ARM_CP_OFF_IMM: type = "CP_OFF_IMM"; break; - case BFD_RELOC_ARM_THUMB_ADD: type = "THUMB_ADD"; break; - case BFD_RELOC_ARM_THUMB_SHIFT: type = "THUMB_SHIFT"; break; - case BFD_RELOC_ARM_THUMB_IMM: type = "THUMB_IMM"; break; - case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break; - default: type = _(""); break; - } - as_bad_where (fixp->fx_file, fixp->fx_line, - _("Can not represent %s relocation in this object file format (%d)"), - type, fixp->fx_pcrel); - return NULL; - } - } - -#ifdef OBJ_ELF - if (code == BFD_RELOC_32_PCREL - && GOT_symbol - && fixp->fx_addsy == GOT_symbol) - { - code = BFD_RELOC_ARM_GOTPC; - reloc->addend = fixp->fx_offset = reloc->address; - } -#endif - - reloc->howto = bfd_reloc_type_lookup (stdoutput, code); - - if (reloc->howto == NULL) - { - as_bad_where (fixp->fx_file, fixp->fx_line, - _("Can not represent %s relocation in this object file format"), - bfd_get_reloc_code_name (code)); - return NULL; - } - - /* HACK: Since arm ELF uses Rel instead of Rela, encode the - vtable entry to be used in the relocation's section offset. */ - if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) - reloc->address = fixp->fx_offset; - - return reloc; -} - -int -md_estimate_size_before_relax (fragP, segtype) - fragS * fragP ATTRIBUTE_UNUSED; - segT segtype ATTRIBUTE_UNUSED; -{ - as_fatal (_("md_estimate_size_before_relax\n")); - return 1; -} - -static void -output_inst PARAMS ((void)) -{ - char * to = NULL; - - if (inst.error) - { - as_bad (inst.error); - return; - } - - to = frag_more (inst.size); - - if (thumb_mode && (inst.size > THUMB_SIZE)) - { - assert (inst.size == (2 * THUMB_SIZE)); - md_number_to_chars (to, inst.instruction >> 16, THUMB_SIZE); - md_number_to_chars (to + THUMB_SIZE, inst.instruction, THUMB_SIZE); - } - else if (inst.size > INSN_SIZE) - { - assert (inst.size == (2 * INSN_SIZE)); - md_number_to_chars (to, inst.instruction, INSN_SIZE); - md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE); - } - else - md_number_to_chars (to, inst.instruction, inst.size); - - if (inst.reloc.type != BFD_RELOC_NONE) - fix_new_arm (frag_now, to - frag_now->fr_literal, - inst.size, & inst.reloc.exp, inst.reloc.pc_rel, - inst.reloc.type); - - return; -} - -void -md_assemble (str) - char * str; -{ - char c; - char * p; - char * q; - char * start; - - /* Align the instruction. - This may not be the right thing to do but ... */ - /* arm_align (2, 0); */ - listing_prev_line (); /* Defined in listing.h */ - - /* Align the previous label if needed. */ - if (last_label_seen != NULL) - { - symbol_set_frag (last_label_seen, frag_now); - S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ()); - S_SET_SEGMENT (last_label_seen, now_seg); - } - - memset (&inst, '\0', sizeof (inst)); - inst.reloc.type = BFD_RELOC_NONE; - - skip_whitespace (str); - - /* Scan up to the end of the op-code, which must end in white space or - end of string. */ - for (start = p = str; *p != '\0'; p++) - if (*p == ' ') - break; - - if (p == str) - { - as_bad (_("No operator -- statement `%s'\n"), str); - return; - } - - if (thumb_mode) - { - CONST struct thumb_opcode * opcode; - - c = *p; - *p = '\0'; - opcode = (CONST struct thumb_opcode *) hash_find (arm_tops_hsh, str); - *p = c; - - if (opcode) - { - /* Check that this instruction is supported for this CPU. */ - if (thumb_mode == 1 && (opcode->variants & cpu_variant) == 0) - { - as_bad (_("selected processor does not support this opcode")); - return; - } - - inst.instruction = opcode->value; - inst.size = opcode->size; - (*opcode->parms)(p); - output_inst (); - return; - } - } - else - { - CONST struct asm_opcode * opcode; - unsigned long cond_code; - - inst.size = INSN_SIZE; - /* p now points to the end of the opcode, probably white space, but we - have to break the opcode up in case it contains condionals and flags; - keep trying with progressively smaller basic instructions until one - matches, or we run out of opcode. */ - q = (p - str > LONGEST_INST) ? str + LONGEST_INST : p; - - for (; q != str; q--) - { - c = *q; - *q = '\0'; - - opcode = (CONST struct asm_opcode *) hash_find (arm_ops_hsh, str); - *q = c; - - if (opcode && opcode->template) - { - unsigned long flag_bits = 0; - char * r; - - /* Check that this instruction is supported for this CPU. */ - if ((opcode->variants & cpu_variant) == 0) - goto try_shorter; - - inst.instruction = opcode->value; - if (q == p) /* Just a simple opcode. */ - { - if (opcode->comp_suffix) - { - if (*opcode->comp_suffix != '\0') - as_bad (_("Opcode `%s' must have suffix from list: <%s>"), - str, opcode->comp_suffix); - else - /* Not a conditional instruction. */ - (*opcode->parms)(q, 0); - } - else - { - /* A conditional instruction with default condition. */ - inst.instruction |= COND_ALWAYS; - (*opcode->parms)(q, 0); - } - output_inst (); - return; - } - - /* Not just a simple opcode. Check if extra is a conditional. */ - r = q; - if (p - r >= 2) - { - CONST struct asm_cond *cond; - char d = *(r + 2); - - *(r + 2) = '\0'; - cond = (CONST struct asm_cond *) hash_find (arm_cond_hsh, r); - *(r + 2) = d; - if (cond) - { - if (cond->value == 0xf0000000) - as_tsktsk ( -_("Warning: Use of the 'nv' conditional is deprecated\n")); - - cond_code = cond->value; - r += 2; - } - else - cond_code = COND_ALWAYS; - } - else - cond_code = COND_ALWAYS; - - /* Apply the conditional, or complain it's not allowed. */ - if (opcode->comp_suffix && *opcode->comp_suffix == '\0') - { - /* Instruction isn't conditional */ - if (cond_code != COND_ALWAYS) - { - as_bad (_("Opcode `%s' is unconditional\n"), str); - return; - } - } - else - /* Instruction is conditional: set the condition into it. */ - inst.instruction |= cond_code; - - - /* If there is a compulsory suffix, it should come here, before - any optional flags. */ - if (opcode->comp_suffix && *opcode->comp_suffix != '\0') - { - CONST char *s = opcode->comp_suffix; - - while (*s) - { - inst.suffix++; - if (*r == *s) - break; - s++; - } - - if (*s == '\0') - { - as_bad (_("Opcode `%s' must have suffix from <%s>\n"), str, - opcode->comp_suffix); - return; - } - - r++; - } - - /* The remainder, if any should now be flags for the instruction; - Scan these checking each one found with the opcode. */ - if (r != p) - { - char d; - CONST struct asm_flg *flag = opcode->flags; - - if (flag) - { - int flagno; - - d = *p; - *p = '\0'; - - for (flagno = 0; flag[flagno].template; flagno++) - { - if (streq (r, flag[flagno].template)) - { - flag_bits |= flag[flagno].set_bits; - break; - } - } - - *p = d; - if (! flag[flagno].template) - goto try_shorter; - } - else - goto try_shorter; - } - - (*opcode->parms) (p, flag_bits); - output_inst (); - return; - } - - try_shorter: - ; - } - } - - /* It wasn't an instruction, but it might be a register alias of the form - alias .req reg */ - q = p; - skip_whitespace (q); - - c = *p; - *p = '\0'; - - if (*q && !strncmp (q, ".req ", 4)) - { - int reg; - char * copy_of_str = str; - char * r; - - q += 4; - skip_whitespace (q); - - for (r = q; *r != '\0'; r++) - if (*r == ' ') - break; - - if (r != q) - { - int regnum; - char d = *r; - - *r = '\0'; - regnum = arm_reg_parse (& q); - *r = d; - - reg = arm_reg_parse (& str); - - if (reg == FAIL) - { - if (regnum != FAIL) - insert_reg_alias (str, regnum); - else - as_warn (_("register '%s' does not exist\n"), q); - } - else if (regnum != FAIL) - { - if (reg != regnum) - as_warn (_("ignoring redefinition of register alias '%s'"), - copy_of_str ); - - /* Do not warn about redefinitions to the same alias. */ - } - else - as_warn (_("ignoring redefinition of register alias '%s' to non-existant register '%s'"), - copy_of_str, q); - } - else - as_warn (_("ignoring incomplete .req pseuso op")); - - *p = c; - return; - } - - *p = c; - as_bad (_("bad instruction `%s'"), start); -} - -/* - * md_parse_option - * Invocation line includes a switch not recognized by the base assembler. - * See if it's a processor-specific option. These are: - * Cpu variants, the arm part is optional: - * -m[arm]1 Currently not supported. - * -m[arm]2, -m[arm]250 Arm 2 and Arm 250 processor - * -m[arm]3 Arm 3 processor - * -m[arm]6[xx], Arm 6 processors - * -m[arm]7[xx][t][[d]m] Arm 7 processors - * -m[arm]8[10] Arm 8 processors - * -m[arm]9[20][tdmi] Arm 9 processors - * -mstrongarm[110[0]] StrongARM processors - * -m[arm]v[2345] Arm architectures - * -mall All (except the ARM1) - * FP variants: - * -mfpa10, -mfpa11 FPA10 and 11 co-processor instructions - * -mfpe-old (No float load/store multiples) - * -mno-fpu Disable all floating point instructions - * Run-time endian selection: - * -EB big endian cpu - * -EL little endian cpu - * ARM Procedure Calling Standard: - * -mapcs-32 32 bit APCS - * -mapcs-26 26 bit APCS - * -mapcs-float Pass floats in float regs - * -mapcs-reentrant Position independent code - * -mthumb-interwork Code supports Arm/Thumb interworking - * -moabi Old ELF ABI - */ - -CONST char * md_shortopts = "m:k"; -struct option md_longopts[] = -{ -#ifdef ARM_BI_ENDIAN -#define OPTION_EB (OPTION_MD_BASE + 0) - {"EB", no_argument, NULL, OPTION_EB}, -#define OPTION_EL (OPTION_MD_BASE + 1) - {"EL", no_argument, NULL, OPTION_EL}, -#ifdef OBJ_ELF -#define OPTION_OABI (OPTION_MD_BASE +2) - {"oabi", no_argument, NULL, OPTION_OABI}, -#endif -#endif - {NULL, no_argument, NULL, 0} -}; -size_t md_longopts_size = sizeof (md_longopts); - -int -md_parse_option (c, arg) - int c; - char * arg; -{ - char * str = arg; - - switch (c) - { -#ifdef ARM_BI_ENDIAN - case OPTION_EB: - target_big_endian = 1; - break; - case OPTION_EL: - target_big_endian = 0; - break; -#endif - - case 'm': - switch (*str) - { - case 'f': - if (streq (str, "fpa10")) - cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_FPA10; - else if (streq (str, "fpa11")) - cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_FPA11; - else if (streq (str, "fpe-old")) - cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_CORE; - else - goto bad; - break; - - case 'n': - if (streq (str, "no-fpu")) - cpu_variant &= ~FPU_ALL; - break; - -#ifdef OBJ_ELF - case 'o': - if (streq (str, "oabi")) - target_oabi = true; - break; -#endif - - case 't': - /* Limit assembler to generating only Thumb instructions: */ - if (streq (str, "thumb")) - { - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_THUMB; - cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_NONE; - thumb_mode = 1; - } - else if (streq (str, "thumb-interwork")) - { - if ((cpu_variant & ARM_THUMB) == 0) - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V4T; -#if defined OBJ_COFF || defined OBJ_ELF - support_interwork = true; -#endif - } - else - goto bad; - break; - - default: - if (streq (str, "all")) - { - cpu_variant = ARM_ALL | FPU_ALL; - return 1; - } -#if defined OBJ_COFF || defined OBJ_ELF - if (! strncmp (str, "apcs-", 5)) - { - /* GCC passes on all command line options starting "-mapcs-..." - to us, so we must parse them here. */ - - str += 5; - - if (streq (str, "32")) - { - uses_apcs_26 = false; - return 1; - } - else if (streq (str, "26")) - { - uses_apcs_26 = true; - return 1; - } - else if (streq (str, "frame")) - { - /* Stack frames are being generated - does not affect - linkage of code. */ - return 1; - } - else if (streq (str, "stack-check")) - { - /* Stack checking is being performed - does not affect - linkage, but does require that the functions - __rt_stkovf_split_small and __rt_stkovf_split_big be - present in the final link. */ - - return 1; - } - else if (streq (str, "float")) - { - /* Floating point arguments are being passed in the floating - point registers. This does affect linking, since this - version of the APCS is incompatible with the version that - passes floating points in the integer registers. */ - - uses_apcs_float = true; - return 1; - } - else if (streq (str, "reentrant")) - { - /* Reentrant code has been generated. This does affect - linking, since there is no point in linking reentrant/ - position independent code with absolute position code. */ - pic_code = true; - return 1; - } - - as_bad (_("Unrecognised APCS switch -m%s"), arg); - return 0; - } -#endif - /* Strip off optional "arm" */ - if (! strncmp (str, "arm", 3)) - str += 3; - - switch (*str) - { - case '1': - if (streq (str, "1")) - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_1; - else - goto bad; - break; - - case '2': - if (streq (str, "2")) - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_2; - else if (streq (str, "250")) - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_250; - else - goto bad; - break; - - case '3': - if (streq (str, "3")) - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_3; - else - goto bad; - break; - - case '6': - switch (strtol (str, NULL, 10)) - { - case 6: - case 60: - case 600: - case 610: - case 620: - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_6; - break; - default: - goto bad; - } - break; - - case '7': - switch (strtol (str, & str, 10)) /* Eat the processor name */ - { - case 7: - case 70: - case 700: - case 710: - case 720: - case 7100: - case 7500: - break; - default: - goto bad; - } - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_7; - for (; *str; str++) - { - switch (* str) - { - case 't': - cpu_variant |= (ARM_THUMB | ARM_ARCH_V4); - break; - - case 'm': - cpu_variant |= ARM_LONGMUL; - break; - - case 'f': /* fe => fp enabled cpu. */ - if (str[1] == 'e') - ++ str; - else - goto bad; - - case 'c': /* Left over from 710c processor name. */ - case 'd': /* Debug */ - case 'i': /* Embedded ICE */ - /* Included for completeness in ARM processor naming. */ - break; - - default: - goto bad; - } - } - break; - - case '8': - if (streq (str, "8") || streq (str, "810")) - cpu_variant = (cpu_variant & ~ARM_ANY) - | ARM_8 | ARM_ARCH_V4 | ARM_LONGMUL; - else - goto bad; - break; - - case '9': - if (streq (str, "9")) - cpu_variant = (cpu_variant & ~ARM_ANY) - | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB; - else if (streq (str, "920")) - cpu_variant = (cpu_variant & ~ARM_ANY) - | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL; - else if (streq (str, "920t")) - cpu_variant = (cpu_variant & ~ARM_ANY) - | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB; - else if (streq (str, "9tdmi")) - cpu_variant = (cpu_variant & ~ARM_ANY) - | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB; - else - goto bad; - break; - - - case 's': - if (streq (str, "strongarm") - || streq (str, "strongarm110") - || streq (str, "strongarm1100")) - cpu_variant = (cpu_variant & ~ARM_ANY) - | ARM_8 | ARM_ARCH_V4 | ARM_LONGMUL; - else - goto bad; - break; - - case 'v': - /* Select variant based on architecture rather than processor. */ - switch (*++str) - { - case '2': - switch (*++str) - { - case 'a': - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_3; - break; - case 0: - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_2; - break; - default: - as_bad (_("Invalid architecture variant -m%s"), arg); - break; - } - break; - - case '3': - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_7; - - switch (*++str) - { - case 'm': cpu_variant |= ARM_LONGMUL; break; - case 0: break; - default: - as_bad (_("Invalid architecture variant -m%s"), arg); - break; - } - break; - - case '4': - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V4; - - switch (*++str) - { - case 't': cpu_variant |= ARM_THUMB; break; - case 0: break; - default: - as_bad (_("Invalid architecture variant -m%s"), arg); - break; - } - break; - - case '5': - cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V5; - switch (*++str) - { - case 't': cpu_variant |= ARM_THUMB; break; - case 'e': cpu_variant |= ARM_EXT_V5E; break; - case 0: break; - default: - as_bad (_("Invalid architecture variant -m%s"), arg); - break; - } - break; - - default: - as_bad (_("Invalid architecture variant -m%s"), arg); - break; - } - break; - - default: - bad: - as_bad (_("Invalid processor variant -m%s"), arg); - return 0; - } - } - break; - -#if defined OBJ_ELF || defined OBJ_COFF - case 'k': - pic_code = 1; - break; -#endif - - default: - return 0; - } - - return 1; -} - -void -md_show_usage (fp) - FILE * fp; -{ - fprintf (fp, _("\ - ARM Specific Assembler Options:\n\ - -m[arm][] select processor variant\n\ - -m[arm]v[2|2a|3|3m|4|4t|5[t][e]] select architecture variant\n\ - -mthumb only allow Thumb instructions\n\ - -mthumb-interwork mark the assembled code as supporting interworking\n\ - -mall allow any instruction\n\ - -mfpa10, -mfpa11 select floating point architecture\n\ - -mfpe-old don't allow floating-point multiple instructions\n\ - -mno-fpu don't allow any floating-point instructions.\n\ - -k generate PIC code.\n")); -#if defined OBJ_COFF || defined OBJ_ELF - fprintf (fp, _("\ - -mapcs-32, -mapcs-26 specify which ARM Procedure Calling Standard to use\n\ - -mapcs-float floating point args are passed in FP regs\n\ - -mapcs-reentrant the code is position independent/reentrant\n")); - #endif -#ifdef OBJ_ELF - fprintf (fp, _("\ - -moabi support the old ELF ABI\n")); -#endif -#ifdef ARM_BI_ENDIAN - fprintf (fp, _("\ - -EB assemble code for a big endian cpu\n\ - -EL assemble code for a little endian cpu\n")); -#endif -} - -/* We need to be able to fix up arbitrary expressions in some statements. - This is so that we can handle symbols that are an arbitrary distance from - the pc. The most common cases are of the form ((+/-sym -/+ . - 8) & mask), - which returns part of an address in a form which will be valid for - a data instruction. We do this by pushing the expression into a symbol - in the expr_section, and creating a fix for that. */ - -static void -fix_new_arm (frag, where, size, exp, pc_rel, reloc) - fragS * frag; - int where; - short int size; - expressionS * exp; - int pc_rel; - int reloc; -{ - fixS * new_fix; - arm_fix_data * arm_data; - - switch (exp->X_op) - { - case O_constant: - case O_symbol: - case O_add: - case O_subtract: - new_fix = fix_new_exp (frag, where, size, exp, pc_rel, reloc); - break; - - default: - new_fix = fix_new (frag, where, size, make_expr_symbol (exp), 0, - pc_rel, reloc); - break; - } - - /* Mark whether the fix is to a THUMB instruction, or an ARM instruction */ - arm_data = (arm_fix_data *) obstack_alloc (& notes, sizeof (arm_fix_data)); - new_fix->tc_fix_data = (PTR) arm_data; - arm_data->thumb_mode = thumb_mode; - - return; -} - - -/* This fix_new is called by cons via TC_CONS_FIX_NEW. */ -void -cons_fix_new_arm (frag, where, size, exp) - fragS * frag; - int where; - int size; - expressionS * exp; -{ - bfd_reloc_code_real_type type; - int pcrel = 0; - - /* Pick a reloc ... - * - * @@ Should look at CPU word size. - */ - switch (size) - { - case 2: - type = BFD_RELOC_16; - break; - case 4: - default: - type = BFD_RELOC_32; - break; - case 8: - type = BFD_RELOC_64; - break; - } - - fix_new_exp (frag, where, (int) size, exp, pcrel, type); -} - -/* A good place to do this, although this was probably not intended - for this kind of use. We need to dump the literal pool before - references are made to a null symbol pointer. */ -void -arm_cleanup () -{ - if (current_poolP == NULL) - return; - - subseg_set (text_section, 0); /* Put it at the end of text section. */ - s_ltorg (0); - listing_prev_line (); -} - -void -arm_start_line_hook () -{ - last_label_seen = NULL; -} - -void -arm_frob_label (sym) - symbolS * sym; -{ - last_label_seen = sym; - - ARM_SET_THUMB (sym, thumb_mode); - -#if defined OBJ_COFF || defined OBJ_ELF - ARM_SET_INTERWORK (sym, support_interwork); -#endif - - if (label_is_thumb_function_name) - { - /* When the address of a Thumb function is taken the bottom - bit of that address should be set. This will allow - interworking between Arm and Thumb functions to work - correctly. */ - - THUMB_SET_FUNC (sym, 1); - - label_is_thumb_function_name = false; - } -} - -/* Adjust the symbol table. This marks Thumb symbols as distinct from - ARM ones. */ - -void -arm_adjust_symtab () -{ -#ifdef OBJ_COFF - symbolS * sym; - - for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym)) - { - if (ARM_IS_THUMB (sym)) - { - if (THUMB_IS_FUNC (sym)) - { - /* Mark the symbol as a Thumb function. */ - if ( S_GET_STORAGE_CLASS (sym) == C_STAT - || S_GET_STORAGE_CLASS (sym) == C_LABEL) /* This can happen! */ - S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC); - - else if (S_GET_STORAGE_CLASS (sym) == C_EXT) - S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC); - else - as_bad (_("%s: unexpected function type: %d"), - S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym)); - } - else switch (S_GET_STORAGE_CLASS (sym)) - { - case C_EXT: - S_SET_STORAGE_CLASS (sym, C_THUMBEXT); - break; - case C_STAT: - S_SET_STORAGE_CLASS (sym, C_THUMBSTAT); - break; - case C_LABEL: - S_SET_STORAGE_CLASS (sym, C_THUMBLABEL); - break; - default: /* do nothing */ - break; - } - } - - if (ARM_IS_INTERWORK (sym)) - coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF; - } -#endif -#ifdef OBJ_ELF - symbolS * sym; - char bind; - - for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym)) - { - if (ARM_IS_THUMB (sym)) - { - elf_symbol_type * elf_sym; - - elf_sym = elf_symbol (symbol_get_bfdsym (sym)); - bind = ELF_ST_BIND (elf_sym); - - /* If it's a .thumb_func, declare it as so, - otherwise tag label as .code 16. */ - if (THUMB_IS_FUNC (sym)) - elf_sym->internal_elf_sym.st_info = - ELF_ST_INFO (bind, STT_ARM_TFUNC); - else - elf_sym->internal_elf_sym.st_info = - ELF_ST_INFO (bind, STT_ARM_16BIT); - } - } -#endif -} - -int -arm_data_in_code () -{ - if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5)) - { - *input_line_pointer = '/'; - input_line_pointer += 5; - *input_line_pointer = 0; - return 1; - } - - return 0; -} - -char * -arm_canonicalize_symbol_name (name) - char * name; -{ - int len; - - if (thumb_mode && (len = strlen (name)) > 5 - && streq (name + len - 5, "/data")) - *(name + len - 5) = 0; - - return name; -} - -boolean -arm_validate_fix (fixP) - fixS * fixP; -{ - /* If the destination of the branch is a defined symbol which does not have - the THUMB_FUNC attribute, then we must be calling a function which has - the (interfacearm) attribute. We look for the Thumb entry point to that - function and change the branch to refer to that function instead. */ - if ( fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23 - && fixP->fx_addsy != NULL - && S_IS_DEFINED (fixP->fx_addsy) - && ! THUMB_IS_FUNC (fixP->fx_addsy)) - { - fixP->fx_addsy = find_real_start (fixP->fx_addsy); - return true; - } - - return false; -} - -#ifdef OBJ_ELF -/* Relocations against Thumb function names must be left unadjusted, - so that the linker can use this information to correctly set the - bottom bit of their addresses. The MIPS version of this function - also prevents relocations that are mips-16 specific, but I do not - know why it does this. - - FIXME: - There is one other problem that ought to be addressed here, but - which currently is not: Taking the address of a label (rather - than a function) and then later jumping to that address. Such - addresses also ought to have their bottom bit set (assuming that - they reside in Thumb code), but at the moment they will not. */ - -boolean -arm_fix_adjustable (fixP) - fixS * fixP; -{ - if (fixP->fx_addsy == NULL) - return 1; - - /* Prevent all adjustments to global symbols. */ - if (S_IS_EXTERN (fixP->fx_addsy)) - return 0; - - if (S_IS_WEAK (fixP->fx_addsy)) - return 0; - - if (THUMB_IS_FUNC (fixP->fx_addsy) - && fixP->fx_subsy == NULL) - return 0; - - /* We need the symbol name for the VTABLE entries */ - if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT - || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) - return 0; - - return 1; -} - -const char * -elf32_arm_target_format () -{ - if (target_big_endian) - if (target_oabi) - return "elf32-bigarm-oabi"; - else - return "elf32-bigarm"; - else - if (target_oabi) - return "elf32-littlearm-oabi"; - else - return "elf32-littlearm"; -} - -void -armelf_frob_symbol (symp, puntp) - symbolS * symp; - int * puntp; -{ - elf_frob_symbol (symp, puntp); -} - -int -arm_force_relocation (fixp) - struct fix * fixp; -{ - if ( fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT - || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY - || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH - || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BLX - || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX - || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23) - return 1; - - return 0; -} - -static bfd_reloc_code_real_type -arm_parse_reloc () -{ - char id[16]; - char * ip; - unsigned int i; - static struct - { - char * str; - int len; - bfd_reloc_code_real_type reloc; - } - reloc_map[] = - { -#define MAP(str,reloc) { str, sizeof (str)-1, reloc } - MAP ("(got)", BFD_RELOC_ARM_GOT32), - MAP ("(gotoff)", BFD_RELOC_ARM_GOTOFF), - /* ScottB: Jan 30, 1998 */ - /* Added support for parsing "var(PLT)" branch instructions */ - /* generated by GCC for PLT relocs */ - MAP ("(plt)", BFD_RELOC_ARM_PLT32), - { NULL, 0, BFD_RELOC_UNUSED } -#undef MAP - }; - - for (i = 0, ip = input_line_pointer; - i < sizeof (id) && (isalnum (*ip) || ispunct (*ip)); - i++, ip++) - id[i] = tolower (*ip); - - for (i = 0; reloc_map[i].str; i++) - if (strncmp (id, reloc_map[i].str, reloc_map[i].len) == 0) - break; - - input_line_pointer += reloc_map[i].len; - - return reloc_map[i].reloc; -} - -static void -s_arm_elf_cons (nbytes) - int nbytes; -{ - expressionS exp; - -#ifdef md_flush_pending_output - md_flush_pending_output (); -#endif - - if (is_it_end_of_statement ()) - { - demand_empty_rest_of_line (); - return; - } - -#ifdef md_cons_align - md_cons_align (nbytes); -#endif - - do - { - bfd_reloc_code_real_type reloc; - - expression (& exp); - - if (exp.X_op == O_symbol - && * input_line_pointer == '(' - && (reloc = arm_parse_reloc()) != BFD_RELOC_UNUSED) - { - reloc_howto_type * howto = bfd_reloc_type_lookup (stdoutput, reloc); - int size = bfd_get_reloc_size (howto); - - if (size > nbytes) - as_bad ("%s relocations do not fit in %d bytes", - howto->name, nbytes); - else - { - register char * p = frag_more ((int) nbytes); - int offset = nbytes - size; - - fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size, - & exp, 0, reloc); - } - } - else - emit_expr (& exp, (unsigned int) nbytes); - } - while (*input_line_pointer++ == ','); - - input_line_pointer--; /* Put terminator back into stream. */ - demand_empty_rest_of_line (); -} - -#endif /* OBJ_ELF */ diff --git a/gas/config/tc-arm.h b/gas/config/tc-arm.h deleted file mode 100644 index c5ab8870512..00000000000 --- a/gas/config/tc-arm.h +++ /dev/null @@ -1,211 +0,0 @@ -/* This file is tc-arm.h - Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999 - Free Software Foundation, Inc. - Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) - Modified by David Taylor (dtaylor@armltd.co.uk) - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#define TC_ARM 1 - -#ifndef TARGET_BYTES_BIG_ENDIAN -#define TARGET_BYTES_BIG_ENDIAN 0 -#endif - -#define WORKING_DOT_WORD - -#define COFF_MAGIC ARMMAGIC -#define TARGET_ARCH bfd_arch_arm - -#define AOUT_MACHTYPE 0 - -#define DIFF_EXPR_OK - -#ifdef LITTLE_ENDIAN -#undef LITTLE_ENDIAN -#endif - -#ifdef BIG_ENDIAN -#undef BIG_ENDIAN -#endif - -#define LITTLE_ENDIAN 1234 -#define BIG_ENDIAN 4321 - -#if defined OBJ_AOUT -#if defined TE_RISCIX -# define TARGET_FORMAT "a.out-riscix" -#elif defined TE_LINUX -# define ARM_BI_ENDIAN -# define TARGET_FORMAT "a.out-arm-linux" -#elif defined TE_NetBSD -# define TARGET_FORMAT "a.out-arm-netbsd" -#else -# define ARM_BI_ENDIAN -# define TARGET_FORMAT \ - (target_big_endian ? "a.out-arm-big" : "a.out-arm-little") -#endif -#endif /* OBJ_AOUT */ - -#ifdef OBJ_AIF -#define TARGET_FORMAT "aif" -#endif - -#if defined OBJ_COFF || defined OBJ_ELF -# define ARM_BI_ENDIAN - -# define TC_VALIDATE_FIX(fixP, segType, Label) \ - if (arm_validate_fix (fixP)) add_symbolP = fixP->fx_addsy - extern boolean arm_validate_fix PARAMS ((struct fix *)); -#endif - -#ifdef OBJ_COFF -# if defined TE_PE -# define TC_FORCE_RELOCATION(x) ((x)->fx_r_type == BFD_RELOC_RVA) -# ifdef TE_EPOC -# define TARGET_FORMAT (target_big_endian ? "epoc-pe-arm-big" : "epoc-pe-arm-little") -# else -# define TARGET_FORMAT (target_big_endian ? "pe-arm-big" : "pe-arm-little") -# endif -# else -# define TARGET_FORMAT (target_big_endian ? "coff-arm-big" : "coff-arm-little") -# endif -#endif - -#ifdef OBJ_ELF -# define TARGET_FORMAT elf32_arm_target_format() - extern const char * elf32_arm_target_format PARAMS ((void)); - -# define TC_FORCE_RELOCATION(fixp) arm_force_relocation (fixp) - extern int arm_force_relocation PARAMS ((struct fix *)); -#endif - -#define md_convert_frag(b, s, f) {as_fatal (_("arm convert_frag\n"));} - -#define md_cleanup() arm_cleanup () - extern void arm_cleanup PARAMS ((void)); - -#define md_start_line_hook() arm_start_line_hook () - extern void arm_start_line_hook PARAMS ((void)); - -#define tc_frob_label(S) arm_frob_label (S) - extern void arm_frob_label PARAMS ((symbolS *)); - -/* We also need to mark assembler created symbols: */ -#define tc_frob_fake_label(S) arm_frob_label (S) - -/* NOTE: The fake label creation in stabs.c:s_stab_generic() has - deliberately not been updated to mark assembler created stabs - symbols as Thumb. */ - -#define TC_FIX_TYPE PTR -#define TC_INIT_FIX_DATA(FIXP) ((FIXP)->tc_fix_data = NULL) - -#ifdef OBJ_ELF -#include "write.h" /* For definition of fixS */ -#define obj_fix_adjustable(fixP) arm_fix_adjustable (fixP) -boolean arm_fix_adjustable PARAMS ((fixS *)); -#else -#define obj_fix_adjustable(fixP) 0 -#endif - -/* We need to keep some local information on symbols. */ - -#define TC_SYMFIELD_TYPE unsigned int -#define ARM_GET_FLAG(s) (*symbol_get_tc (s)) -#define ARM_SET_FLAG(s,v) (*symbol_get_tc (s) |= (v)) -#define ARM_RESET_FLAG(s,v) (*symbol_get_tc (s) &= ~(v)) - -#define ARM_FLAG_THUMB (1 << 0) /* The symbol is a Thumb symbol rather than an Arm symbol. */ -#define ARM_FLAG_INTERWORK (1 << 1) /* The symbol is attached to code that suppports interworking. */ -#define THUMB_FLAG_FUNC (1 << 2) /* The symbol is attached to the start of a Thumb function. */ - -#define ARM_IS_THUMB(s) (ARM_GET_FLAG (s) & ARM_FLAG_THUMB) -#define ARM_IS_INTERWORK(s) (ARM_GET_FLAG (s) & ARM_FLAG_INTERWORK) -#define THUMB_IS_FUNC(s) (ARM_GET_FLAG (s) & THUMB_FLAG_FUNC) - -#define ARM_SET_THUMB(s,t) ((t) ? ARM_SET_FLAG (s, ARM_FLAG_THUMB) : ARM_RESET_FLAG (s, ARM_FLAG_THUMB)) -#define ARM_SET_INTERWORK(s,t) ((t) ? ARM_SET_FLAG (s, ARM_FLAG_INTERWORK) : ARM_RESET_FLAG (s, ARM_FLAG_INTERWORK)) -#define THUMB_SET_FUNC(s,t) ((t) ? ARM_SET_FLAG (s, THUMB_FLAG_FUNC) : ARM_RESET_FLAG (s, THUMB_FLAG_FUNC)) - - -#define TC_START_LABEL(C,STR) \ - (c == ':' || (c == '/' && arm_data_in_code ())) -int arm_data_in_code PARAMS ((void)); - -#define tc_canonicalize_symbol_name(str) \ - arm_canonicalize_symbol_name (str); -char * arm_canonicalize_symbol_name PARAMS ((char *)); - -#define obj_adjust_symtab() arm_adjust_symtab () - extern void arm_adjust_symtab PARAMS ((void)); - -#ifdef OBJ_ELF -#define obj_frob_symbol(sym, punt) armelf_frob_symbol ((sym), & (punt)) -void armelf_frob_symbol PARAMS ((symbolS *, int *)); -#endif - -#define tc_aout_pre_write_hook(x) {;} /* not used */ - -#define LISTING_HEADER "ARM GAS " - -#define OPTIONAL_REGISTER_PREFIX '%' - -#define md_operand(x) - -#define TC_HANDLES_FX_DONE - -#define MD_APPLY_FIX3 - -#define LOCAL_LABEL(name) (name[0] == '.' && (name[1] == 'L')) -#define LOCAL_LABELS_FB 1 -#ifdef OBJ_ELF -#define LOCAL_LABEL_PREFIX '.' -#endif - -/* This expression evaluates to false if the relocation is for a local object - for which we still want to do the relocation at runtime. True if we - are willing to perform this relocation while building the .o file. - This is only used for pcrel relocations, so GOTOFF does not need to be - checked here. I am not sure if some of the others are ever used with - pcrel, but it is easier to be safe than sorry. */ - -#define TC_RELOC_RTSYM_LOC_FIXUP(FIX) \ - ( (FIX)->fx_r_type != BFD_RELOC_ARM_GOT12 \ - && (FIX)->fx_r_type != BFD_RELOC_ARM_GOT32 \ - && (FIX)->fx_r_type != BFD_RELOC_32) - -#define TC_CONS_FIX_NEW cons_fix_new_arm - extern void cons_fix_new_arm PARAMS ((fragS *, int, int, expressionS *)); - -/* Don't allow symbols to be discarded on GOT related relocs, - nor on globals. */ -#define tc_fix_adjustable(x) (\ - ((x)->fx_r_type == BFD_RELOC_ARM_PLT32 \ - || (x)->fx_r_type == BFD_RELOC_ARM_GOT32 \ - || (x)->fx_r_type == BFD_RELOC_ARM_GOTOFF \ - || S_IS_EXTERN ((x)->fx_addsy) \ - || S_IS_WEAK ((x)->fx_addsy)) ? 0 : 1) - -#ifdef OBJ_ELF -#define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_" -#else -#define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_" -#endif - -/* end of tc-arm.h */ diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c deleted file mode 100644 index ea8008c2a42..00000000000 --- a/gas/config/tc-avr.c +++ /dev/null @@ -1,1252 +0,0 @@ -/* tc-avr.c -- Assembler code for the ATMEL AVR - - Copyright (C) 1999, 2000 Free Software Foundation, Inc. - Contributed by Denis Chertykov - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include -#include "as.h" -#include "subsegs.h" - -const char comment_chars[] = ";"; -const char line_comment_chars[] = "#"; -const char line_separator_chars[] = "$"; - -#define AVR_ISA_1200 1 -#define AVR_ISA_2xxx 3 -#define AVR_ISA_MEGA_x03 0x17 -#define AVR_ISA_MEGA 0x10 -#define AVR_ISA_MEGA_161 0x1b - -const char *md_shortopts = "m:"; -struct mcu_type_s -{ - char *name; - int isa; - int mach; -}; - -static struct mcu_type_s mcu_types[] = -{ - {"avr1", AVR_ISA_1200, bfd_mach_avr1}, - {"avr2", AVR_ISA_2xxx, bfd_mach_avr2}, - {"avr3", AVR_ISA_MEGA_x03, bfd_mach_avr3}, - {"avr4", AVR_ISA_MEGA_161, bfd_mach_avr4}, - {"at90s1200", AVR_ISA_1200, bfd_mach_avr1}, - {"at90s2313", AVR_ISA_2xxx, bfd_mach_avr2}, - {"at90s2323", AVR_ISA_2xxx, bfd_mach_avr2}, - {"at90s2333", AVR_ISA_2xxx, bfd_mach_avr2}, - {"attiny22" , AVR_ISA_2xxx, bfd_mach_avr2}, - {"at90s2343", AVR_ISA_2xxx, bfd_mach_avr2}, - {"at90s4433", AVR_ISA_2xxx, bfd_mach_avr2}, - {"at90s4414", AVR_ISA_2xxx, bfd_mach_avr2}, - {"at90s4434", AVR_ISA_2xxx, bfd_mach_avr2}, - {"at90s8515", AVR_ISA_2xxx, bfd_mach_avr2}, - {"at90s8535", AVR_ISA_2xxx, bfd_mach_avr2}, - {"atmega603", AVR_ISA_MEGA_x03, bfd_mach_avr3}, - {"atmega103", AVR_ISA_MEGA_x03, bfd_mach_avr3}, - {"atmega161", AVR_ISA_MEGA_161, bfd_mach_avr4}, - {NULL, 0, 0} -}; - - -/* Current MCU type. */ -static struct mcu_type_s default_mcu = {"avr2", AVR_ISA_2xxx,bfd_mach_avr2}; -static struct mcu_type_s *avr_mcu = &default_mcu; - -const char EXP_CHARS[] = "eE"; -const char FLT_CHARS[] = "dD"; -static void avr_set_arch (int dummy); - -/* The target specific pseudo-ops which we support. */ -const pseudo_typeS md_pseudo_table[] = -{ - {"arch", avr_set_arch, 0}, - { NULL, NULL, 0} -}; - -#define LDI_IMMEDIATE(x) (((x) & 0xf) | (((x) << 4) & 0xf00)) -#define REGISTER_P(x) ((x) == 'r' || (x) == 'd' || (x) == 'w') - -struct avr_opcodes_s -{ - char *name; - char *constraints; - char *opcode; - int insn_size; /* in words */ - int isa; - unsigned int bin_opcode; -}; - -static char * skip_space (char * s); -static char * extract_word (char *from, char *to, int limit); -static unsigned int avr_operand (struct avr_opcodes_s *opcode, - int where, char *op, char **line); -static unsigned int avr_operands (struct avr_opcodes_s *opcode, char **line); -static unsigned int avr_get_constant (char * str, unsigned int max); -static char *parse_exp (char *s, expressionS * op); -static bfd_reloc_code_real_type avr_ldi_expression (expressionS *exp); -long md_pcrel_from_section PARAMS ((fixS *, segT)); - -/* constraint letters - r - any register - d - `ldi' register (r16-r31) - M - immediate value from 0 to 255 - n - immediate value from 0 to 255 ( n = ~M ). Relocation impossible - w - `adiw' register (r24,r26,r28,r30) - s - immediate value from 0 to 7 - P - Port address value from 0 to 64. (in, out) - p - Port address value from 0 to 32. (cbi, sbi, sbic, sbis) - K - immediate value from 0 to 64 (used in `adiw', `sbiw') - e - pointer regegisters (X,Y,Z) - b - base pointer register and displacement ([YZ]+disp) - i - immediate value - l - signed pc relative offset from -64 to 63 - L - signed pc relative offset from -2048 to 2047 - h - absolut code address (call, jmp) - S - immediate value from 0 to 7 (S = s << 4) -*/ -struct avr_opcodes_s avr_opcodes[] = -{ - {"adc", "r,r", "000111rdddddrrrr", 1, AVR_ISA_1200, 0x1c00}, - {"add", "r,r", "000011rdddddrrrr", 1, AVR_ISA_1200, 0x0c00}, - {"and", "r,r", "001000rdddddrrrr", 1, AVR_ISA_1200, 0x2000}, - {"cp", "r,r", "000101rdddddrrrr", 1, AVR_ISA_1200, 0x1400}, - {"cpc", "r,r", "000001rdddddrrrr", 1, AVR_ISA_1200, 0x0400}, - {"cpse", "r,r", "000100rdddddrrrr", 1, AVR_ISA_1200, 0x1000}, - {"eor", "r,r", "001001rdddddrrrr", 1, AVR_ISA_1200, 0x2400}, - {"mov", "r,r", "001011rdddddrrrr", 1, AVR_ISA_1200, 0x2c00}, - {"mul", "r,r", "100111rdddddrrrr", 1, AVR_ISA_MEGA_161, 0x9c00}, - {"or", "r,r", "001010rdddddrrrr", 1, AVR_ISA_1200, 0x2800}, - {"sbc", "r,r", "000010rdddddrrrr", 1, AVR_ISA_1200, 0x0800}, - {"sub", "r,r", "000110rdddddrrrr", 1, AVR_ISA_1200, 0x1800}, - - {"clr", "r=r", "001001rdddddrrrr", 1, AVR_ISA_1200, 0x2400}, - {"lsl", "r=r", "000011rdddddrrrr", 1, AVR_ISA_1200, 0x0c00}, - {"rol", "r=r", "000111rdddddrrrr", 1, AVR_ISA_1200, 0x1c00}, - {"tst", "r=r", "001000rdddddrrrr", 1, AVR_ISA_1200, 0x2000}, - - {"andi", "d,M", "0111KKKKddddKKKK", 1, AVR_ISA_1200, 0x7000}, - /*XXX special case*/ - {"cbr", "d,n", "0111KKKKddddKKKK", 1, AVR_ISA_1200, 0x7000}, - {"cpi", "d,M", "0011KKKKddddKKKK", 1, AVR_ISA_1200, 0x3000}, - {"ldi", "d,M", "1110KKKKddddKKKK", 1, AVR_ISA_1200, 0xe000}, - {"ori", "d,M", "0110KKKKddddKKKK", 1, AVR_ISA_1200, 0x6000}, - {"sbci", "d,M", "0100KKKKddddKKKK", 1, AVR_ISA_1200, 0x4000}, - {"sbr", "d,M", "0110KKKKddddKKKK", 1, AVR_ISA_1200, 0x6000}, - {"subi", "d,M", "0101KKKKddddKKKK", 1, AVR_ISA_1200, 0x5000}, - - {"sbrc", "r,s", "1111110rrrrr0sss", 1, AVR_ISA_1200, 0xfc00}, - {"sbrs", "r,s", "1111111rrrrr0sss", 1, AVR_ISA_1200, 0xfe00}, - {"bld", "r,s", "1111100ddddd0sss", 1, AVR_ISA_1200, 0xf800}, - {"bst", "r,s", "1111101ddddd0sss", 1, AVR_ISA_1200, 0xfa00}, - - {"in", "r,P", "10110PPdddddPPPP", 1, AVR_ISA_1200, 0xb000}, - {"out", "P,r", "10111PPrrrrrPPPP", 1, AVR_ISA_1200, 0xb800}, - - {"adiw", "w,K", "10010110KKddKKKK", 1, AVR_ISA_2xxx, 0x9600}, - {"sbiw", "w,K", "10010111KKddKKKK", 1, AVR_ISA_2xxx, 0x9700}, - - {"cbi", "p,s", "10011000pppppsss", 1, AVR_ISA_1200, 0x9800}, - {"sbi", "p,s", "10011010pppppsss", 1, AVR_ISA_1200, 0x9a00}, - {"sbic", "p,s", "10011001pppppsss", 1, AVR_ISA_1200, 0x9900}, - {"sbis", "p,s", "10011011pppppsss", 1, AVR_ISA_1200, 0x9b00}, - - /* ee = {X=11,Y=10,Z=00, 0} */ - {"ld", "r,e", "100!000dddddee-+", 1, AVR_ISA_2xxx, 0x8000}, - {"st", "e,r", "100!001rrrrree-+", 1, AVR_ISA_2xxx, 0x8200}, - {"ldd", "r,b", "10o0oo0dddddbooo", 1, AVR_ISA_2xxx, 0x8000}, - {"std", "b,r", "10o0oo1rrrrrbooo", 1, AVR_ISA_2xxx, 0x8200}, - {"sts", "i,r", "1001001ddddd0000", 2, AVR_ISA_2xxx, 0x9200}, - {"lds", "r,i", "1001000ddddd0000", 2, AVR_ISA_2xxx, 0x9000}, - - {"brbc", "s,l", "111101lllllllsss", 1, AVR_ISA_1200, 0xf400}, - {"brbs", "s,l", "111100lllllllsss", 1, AVR_ISA_1200, 0xf000}, - - {"brcc", "l", "111101lllllll000", 1, AVR_ISA_1200, 0xf400}, - {"brcs", "l", "111100lllllll000", 1, AVR_ISA_1200, 0xf000}, - {"breq", "l", "111100lllllll001", 1, AVR_ISA_1200, 0xf001}, - {"brge", "l", "111101lllllll100", 1, AVR_ISA_1200, 0xf404}, - {"brhc", "l", "111101lllllll101", 1, AVR_ISA_1200, 0xf405}, - {"brhs", "l", "111100lllllll101", 1, AVR_ISA_1200, 0xf005}, - {"brid", "l", "111101lllllll111", 1, AVR_ISA_1200, 0xf407}, - {"brie", "l", "111100lllllll111", 1, AVR_ISA_1200, 0xf007}, - {"brlo", "l", "111100lllllll000", 1, AVR_ISA_1200, 0xf000}, - {"brlt", "l", "111100lllllll100", 1, AVR_ISA_1200, 0xf004}, - {"brmi", "l", "111100lllllll010", 1, AVR_ISA_1200, 0xf002}, - {"brne", "l", "111101lllllll001", 1, AVR_ISA_1200, 0xf401}, - {"brpl", "l", "111101lllllll010", 1, AVR_ISA_1200, 0xf402}, - {"brsh", "l", "111101lllllll000", 1, AVR_ISA_1200, 0xf400}, - {"brtc", "l", "111101lllllll110", 1, AVR_ISA_1200, 0xf406}, - {"brts", "l", "111100lllllll110", 1, AVR_ISA_1200, 0xf006}, - {"brvc", "l", "111101lllllll011", 1, AVR_ISA_1200, 0xf403}, - {"brvs", "l", "111100lllllll011", 1, AVR_ISA_1200, 0xf003}, - - {"rcall", "L", "1101LLLLLLLLLLLL", 1, AVR_ISA_1200, 0xd000}, - {"rjmp", "L", "1100LLLLLLLLLLLL", 1, AVR_ISA_1200, 0xc000}, - - {"call", "h", "1001010hhhhh111h", 2, AVR_ISA_MEGA, 0x940e}, - {"jmp", "h", "1001010hhhhh110h", 2, AVR_ISA_MEGA, 0x940c}, - - {"asr", "r", "1001010rrrrr0101", 1, AVR_ISA_1200, 0x9405}, - {"com", "r", "1001010rrrrr0000", 1, AVR_ISA_1200, 0x9400}, - {"dec", "r", "1001010rrrrr1010", 1, AVR_ISA_1200, 0x940a}, - {"inc", "r", "1001010rrrrr0011", 1, AVR_ISA_1200, 0x9403}, - {"lsr", "r", "1001010rrrrr0110", 1, AVR_ISA_1200, 0x9406}, - {"neg", "r", "1001010rrrrr0001", 1, AVR_ISA_1200, 0x9401}, - {"pop", "r", "1001000rrrrr1111", 1, AVR_ISA_2xxx, 0x900f}, - {"push", "r", "1001001rrrrr1111", 1, AVR_ISA_2xxx, 0x920f}, - {"ror", "r", "1001010rrrrr0111", 1, AVR_ISA_1200, 0x9407}, - {"ser", "d", "11101111dddd1111", 1, AVR_ISA_1200, 0xef0f}, - {"swap", "r", "1001010rrrrr0010", 1, AVR_ISA_1200, 0x9402}, - - {"bclr", "S", "100101001SSS1000", 1, AVR_ISA_1200, 0x9488}, - {"bset", "S", "100101000SSS1000", 1, AVR_ISA_1200, 0x9408}, - - {"clc", "", "1001010010001000", 1, AVR_ISA_1200, 0x9488}, - {"clh", "", "1001010011011000", 1, AVR_ISA_1200, 0x94d8}, - {"cli", "", "1001010011111000", 1, AVR_ISA_1200, 0x94f8}, - {"cln", "", "1001010010101000", 1, AVR_ISA_1200, 0x94a8}, - {"cls", "", "1001010011001000", 1, AVR_ISA_1200, 0x94c8}, - {"clt", "", "1001010011101000", 1, AVR_ISA_1200, 0x94e8}, - {"clv", "", "1001010010111000", 1, AVR_ISA_1200, 0x94b8}, - {"clz", "", "1001010010011000", 1, AVR_ISA_1200, 0x9498}, - {"icall","", "1001010100001001", 1, AVR_ISA_2xxx, 0x9509}, - {"ijmp", "", "1001010000001001", 1, AVR_ISA_2xxx, 0x9409}, - {"lpm", "", "1001010111001000", 1, AVR_ISA_2xxx, 0x95c8}, - {"nop", "", "0000000000000000", 1, AVR_ISA_1200, 0x0000}, - {"ret", "", "1001010100001000", 1, AVR_ISA_1200, 0x9508}, - {"reti", "", "1001010100011000", 1, AVR_ISA_1200, 0x9518}, - {"sec", "", "1001010000001000", 1, AVR_ISA_1200, 0x9408}, - {"seh", "", "1001010001011000", 1, AVR_ISA_1200, 0x9458}, - {"sei", "", "1001010001111000", 1, AVR_ISA_1200, 0x9478}, - {"sen", "", "1001010000101000", 1, AVR_ISA_1200, 0x9428}, - {"ses", "", "1001010001001000", 1, AVR_ISA_1200, 0x9448}, - {"set", "", "1001010001101000", 1, AVR_ISA_1200, 0x9468}, - {"sev", "", "1001010000111000", 1, AVR_ISA_1200, 0x9438}, - {"sez", "", "1001010000011000", 1, AVR_ISA_1200, 0x9418}, - {"sleep","", "1001010110001000", 1, AVR_ISA_1200, 0x9588}, - {"wdr", "", "1001010110101000", 1, AVR_ISA_1200, 0x95a8}, - {"elpm", "", "1001010111011000", 1, AVR_ISA_MEGA_x03, 0x95d8}, - {NULL, NULL, NULL, 0, 0, 0} -}; - - - -#define EXP_MOD_NAME(i) exp_mod[i].name -#define EXP_MOD_RELOC(i) exp_mod[i].reloc -#define EXP_MOD_NEG_RELOC(i) exp_mod[i].neg_reloc -#define HAVE_PM_P(i) exp_mod[i].have_pm - -struct exp_mod_s -{ - char * name; - bfd_reloc_code_real_type reloc; - bfd_reloc_code_real_type neg_reloc; - int have_pm; -}; - -static struct exp_mod_s exp_mod[] = { - {"hh8", BFD_RELOC_AVR_HH8_LDI, BFD_RELOC_AVR_HH8_LDI_NEG, 1}, - {"pm_hh8", BFD_RELOC_AVR_HH8_LDI_PM, BFD_RELOC_AVR_HH8_LDI_PM_NEG, 0}, - {"hi8", BFD_RELOC_AVR_HI8_LDI, BFD_RELOC_AVR_HI8_LDI_NEG, 1}, - {"pm_hi8", BFD_RELOC_AVR_HI8_LDI_PM, BFD_RELOC_AVR_HI8_LDI_PM_NEG, 0}, - {"lo8", BFD_RELOC_AVR_LO8_LDI, BFD_RELOC_AVR_LO8_LDI_NEG, 1}, - {"pm_lo8", BFD_RELOC_AVR_LO8_LDI_PM, BFD_RELOC_AVR_LO8_LDI_PM_NEG, 0}, - {"hlo8", -BFD_RELOC_AVR_LO8_LDI, -BFD_RELOC_AVR_LO8_LDI_NEG, 0}, - {"hhi8", -BFD_RELOC_AVR_HI8_LDI, -BFD_RELOC_AVR_HI8_LDI_NEG, 0}, -}; - -/* Opcode hash table. */ -static struct hash_control *avr_hash; - -/* Reloc modifiers hash control (hh8,hi8,lo8,pm_xx). */ -static struct hash_control *avr_mod_hash; - -#define OPTION_MMCU (OPTION_MD_BASE + 1) - -struct option md_longopts[] = { - {"mmcu", required_argument, NULL, 'm'}, - {NULL, no_argument, NULL, 0} -}; -size_t md_longopts_size = sizeof(md_longopts); - -static inline char * -skip_space (s) - char * s; -{ - while (*s == ' ' || *s == '\t') - ++s; - return s; -} - -/* Extract one word from FROM and copy it to TO. */ -static char * -extract_word (char *from, char *to, int limit) -{ - char *op_start; - char *op_end; - int size = 0; - - /* Drop leading whitespace. */ - from = skip_space (from); - *to = 0; - /* Find the op code end. */ - for (op_start = op_end = from; *op_end != 0 && is_part_of_name(*op_end); ) - { - to[size++] = *op_end++; - if (size + 1 >= limit) - break; - } - to[size] = 0; - return op_end; -} - -int -md_estimate_size_before_relax (fragp, seg) - fragS *fragp; - asection *seg; -{ - abort (); - return 0; -} - -void -md_show_usage (stream) - FILE *stream; -{ - fprintf - (stream, - _ ("AVR options:\n" - " -mmcu=[avr-name] select microcontroller variant\n" - " [avr-name] can be:\n" - " avr1 - AT90S1200\n" - " avr2 - AT90S2xxx, AT90S4xxx, AT90S85xx, ATtiny22\n" - " avr3 - ATmega103 or ATmega603\n" - " avr4 - ATmega161\n" - " or immediate microcontroller name.\n")); -} - -static void -avr_set_arch (dummy) - int dummy; -{ - char * str; - str = (char *)alloca (20); - input_line_pointer = extract_word (input_line_pointer, str, 20); - md_parse_option ('m', str); - bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach); -} - -int -md_parse_option (c, arg) - int c; - char *arg; -{ - char *t = alloca (strlen (arg) + 1); - char *s = t; - char *arg1 = arg; - do - *t = tolower (*arg1++); - while (*t++); - - if (c == 'm') - { - int i; - - for (i = 0; mcu_types[i].name; ++i) - if (strcmp (mcu_types[i].name, s) == 0) - break; - - if (!mcu_types[i].name) - as_fatal (_ ("unknown MCU: %s\n"), arg); - if (avr_mcu == &default_mcu) - avr_mcu = &mcu_types[i]; - else - as_fatal (_ ("redefinition of mcu type `%s'"), mcu_types[i].name); - return 1; - } - return 0; -} - -symbolS * -md_undefined_symbol (name) - char *name; -{ - return 0; -} - -/* Convert a string pointed to by input_line_pointer into a floating point - constant of type `type', and store the appropriate bytes to `*litP'. - The number of LITTLENUMS emitted is stored in `*sizeP'. Returns NULL if - OK, or an error message otherwise. */ -char * -md_atof (type, litP, sizeP) - int type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[4]; - LITTLENUM_TYPE *wordP; - char *t; - - switch (type) - { - case 'f': - prec = 2; - break; - case 'd': - prec = 4; - break; - default: - *sizeP = 0; - return _("bad call to md_atof"); - } - - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - - *sizeP = prec * sizeof (LITTLENUM_TYPE); - /* This loop outputs the LITTLENUMs in REVERSE order. */ - for (wordP = words + prec - 1; prec--;) - { - md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - return NULL; -} - -void -md_convert_frag (abfd, sec, fragP) - bfd *abfd; - asection *sec; - fragS *fragP; -{ - abort (); -} - - -void -md_begin () -{ - int i; - struct avr_opcodes_s *opcode; - avr_hash = hash_new(); - - /* Insert unique names into hash table. This hash table then provides a - quick index to the first opcode with a particular name in the opcode - table. */ - - for (opcode = avr_opcodes; opcode->name; opcode++) - hash_insert (avr_hash, opcode->name, (char *) opcode); - - avr_mod_hash = hash_new (); - - for (i = 0; i < sizeof (exp_mod) / sizeof (exp_mod[0]); ++i) - hash_insert (avr_mod_hash, EXP_MOD_NAME(i), (void*)(i+10)); - - for (i = 0; i < 32; i++) - { - char buf[5]; - - sprintf (buf, "r%d", i); - symbol_table_insert (symbol_new (buf, reg_section, i, - &zero_address_frag)); - sprintf (buf, "R%d", i); - symbol_table_insert (symbol_new (buf, reg_section, i, - &zero_address_frag)); - } - - bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach); -} - - -static unsigned int -avr_operands (opcode, line) - struct avr_opcodes_s *opcode; - char **line; -{ - char *op = opcode->constraints; - unsigned int bin = opcode->bin_opcode; - char *frag = frag_more (opcode->insn_size * 2); - char *str = *line; - int where = frag - frag_now->fr_literal; - - /* Opcode have operands. */ - if (*op) - { - unsigned int reg1 = 0; - unsigned int reg2 = 0; - int reg1_present = 0; - int reg2_present = 0; - - /* Parse first operand. */ - if (REGISTER_P (*op)) - reg1_present = 1; - reg1 = avr_operand (opcode, where, op, &str); - ++op; - - /* Parse second operand. */ - if (*op) - { - if (*op == ',') - ++op; - if (*op == '=') - { - reg2 = reg1; - reg2_present = 1; - } - else - { - if (REGISTER_P (*op)) - reg2_present = 1; - - str = skip_space (str); - if (*str++ != ',') - as_bad (_ ("`,' required")); - str = skip_space (str); - - reg2 = avr_operand (opcode, where, op, &str); - - } - if (reg1_present && reg2_present) - reg2 = (reg2 & 0xf) | ((reg2 << 5) & 0x200); - else if (reg2_present) - reg2 <<= 4; - } - if (reg1_present) - reg1 <<= 4; - bin |= reg1 | reg2; - } - if (opcode->insn_size == 2) - { - bfd_putl32 ((bfd_vma)bin, frag); - } - else - { - bfd_putl16 ((bfd_vma)bin, frag); - } - *line = str; - return bin; -} - -static unsigned int -avr_get_constant (str, max) - char * str; - unsigned int max; -{ - expressionS ex; - str = skip_space (str); - input_line_pointer = str; - expression (&ex); - - if (ex.X_op != O_constant) - as_bad (_("constant value required")); - - if (ex.X_add_number > max) - as_bad (_("number must be less than %d"), max+1); - return ex.X_add_number; -} - -static unsigned int -avr_operand (opcode, where, op, line) - struct avr_opcodes_s *opcode; - int where; - char *op; - char **line; -{ - unsigned int op_mask = 0; - char *str = *line; - expressionS op_expr; - - str = skip_space (str); - switch (*op) - { - /* Any register operand. */ - case 'w': - case 'd': - case 'r': - { - char r_name[256]; - str = extract_word (str, r_name, sizeof (r_name)); - parse_exp (r_name, &op_expr); - if (op_expr.X_op == O_register) - { - op_mask = op_expr.X_add_number; - if (op_mask <= 31) - { - if (*op == 'd') - { - if (op_mask < 16) - as_bad (_ ("register number above 15 required")); - op_mask -= 16; - } - if (*op == 'w') - { - op_mask -= 24; - if (op_mask & 1 || op_mask > 6) - as_bad (_ ("register r24,r26,r28 or r30 required")); - op_mask >>= 1; - } - break; - } - } - as_bad (_ ("register required")); - } - break; - - case 'e': - { - char c; - if (*str == '-') - { - str = skip_space (str+1); - op_mask = 0x1002; - } - c = tolower (*str); - if (c == 'x') - op_mask |= 0x100c; - else if (c == 'y') - op_mask |= 0x8; - else if (c != 'z') - as_bad (_ ("pointer register (X,Y or Z) required")); - - str = skip_space (str+1); - if (*str == '+') - { - ++str; - if (op_mask & 2) - as_bad (_ ("cannot both predecrement and postincrement")); - op_mask |= 0x1001; - } - } - break; - - case 'b': - { - char c = tolower (*str++); - if (c == 'y') - op_mask |= 0x8; - else if (c != 'z') - as_bad (_ ("pointer register (Y or Z) required")); - str = skip_space (str); - if (*str++ == '+') - { - unsigned int x; - x = avr_get_constant (str, 63); - str = input_line_pointer; - op_mask |= (x & 7) | ((x & (3 << 3)) << 7) | ((x & (1 << 5)) << 8); - } - } - break; - - case 'h': - { - str = parse_exp (str, &op_expr); - fix_new_exp (frag_now, where, opcode->insn_size * 2, - &op_expr, false, BFD_RELOC_AVR_CALL); - - } - break; - - case 'L': - { - str = parse_exp (str, &op_expr); - fix_new_exp (frag_now, where, opcode->insn_size * 2, - &op_expr, true, BFD_RELOC_AVR_13_PCREL); - - } - break; - - case 'l': - { - str = parse_exp (str, &op_expr); - fix_new_exp (frag_now, where, opcode->insn_size * 2, - &op_expr, true, BFD_RELOC_AVR_7_PCREL); - - } - break; - - case 'i': - { - str = parse_exp (str, &op_expr); - fix_new_exp (frag_now, where+2, opcode->insn_size * 2, - &op_expr, false, BFD_RELOC_16); - - } - break; - - case 'M': - { - bfd_reloc_code_real_type r_type; - input_line_pointer = str; - r_type = avr_ldi_expression (&op_expr); - str = input_line_pointer; - fix_new_exp (frag_now, where, 3, - &op_expr, false, r_type); - } - break; - - case 'n': - { - unsigned int x; - x = ~avr_get_constant (str, 255); - str = input_line_pointer; - op_mask |= (x & 0xf) | ((x << 4) & 0xf00); - } - break; - - case 'K': - { - unsigned int x; - x = avr_get_constant (str, 63); - str = input_line_pointer; - op_mask |= (x & 0xf) | ((x & 0x30) << 2); - } - break; - - case 'S': - case 's': - { - unsigned int x; - x = avr_get_constant (str, 7); - str = input_line_pointer; - if (*op == 'S') - x <<= 4; - op_mask |= x; - } - break; - - case 'P': - { - unsigned int x; - x = avr_get_constant (str, 63); - str = input_line_pointer; - op_mask |= (x & 0xf) | ((x & 0x30) << 5); - } - break; - - case 'p': - { - unsigned int x; - x = avr_get_constant (str, 31); - str = input_line_pointer; - op_mask |= x << 3; - } - break; - default: - as_bad (_ ("unknown constraint `%c'"), *op); - } - *line = str; - return op_mask; -} - -/* GAS will call this function for each section at the end of the assembly, - to permit the CPU backend to adjust the alignment of a section. */ -valueT -md_section_align (seg, addr) - asection *seg; - valueT addr; -{ - int align = bfd_get_section_alignment (stdoutput, seg); - return ((addr + (1 << align) - 1) & (-1 << align)); -} - -/* If you define this macro, it should return the offset between the - address of a PC relative fixup and the position from which the PC - relative adjustment should be made. On many processors, the base - of a PC relative instruction is the next instruction, so this - macro would return the length of an instruction. */ -long -md_pcrel_from_section (fixp, sec) - fixS *fixp; - segT sec; -{ - if (fixp->fx_addsy != (symbolS *)NULL - && (!S_IS_DEFINED (fixp->fx_addsy) - || (S_GET_SEGMENT (fixp->fx_addsy) != sec))) - return 0; - return fixp->fx_frag->fr_address + fixp->fx_where; -} - -/* GAS will call this for each fixup. It should store the correct - value in the object file. */ -int -md_apply_fix3 (fixp, valuep, seg) - fixS *fixp; - valueT *valuep; - segT seg; -{ - unsigned char *where; - unsigned long insn; - long value; - - if (fixp->fx_addsy == (symbolS *) NULL) - { - value = *valuep; - fixp->fx_done = 1; - } - else if (fixp->fx_pcrel) - { - segT s = S_GET_SEGMENT (fixp->fx_addsy); - if (fixp->fx_addsy && (s == seg || s == absolute_section)) - { - value = S_GET_VALUE (fixp->fx_addsy) + *valuep; - fixp->fx_done = 1; - } - else - value = *valuep; - } - else - { - value = fixp->fx_offset; - if (fixp->fx_subsy != (symbolS *) NULL) - { - if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section) - { - value -= S_GET_VALUE (fixp->fx_subsy); - fixp->fx_done = 1; - } - else - { - /* We don't actually support subtracting a symbol. */ - as_bad_where (fixp->fx_file, fixp->fx_line, - _ ("expression too complex")); - } - } - } - switch (fixp->fx_r_type) - { - default: - fixp->fx_no_overflow = 1; - break; - case BFD_RELOC_AVR_7_PCREL: - case BFD_RELOC_AVR_13_PCREL: - case BFD_RELOC_32: - case BFD_RELOC_16: - case BFD_RELOC_AVR_CALL: - break; - } - - if (fixp->fx_done) - { - /* Fetch the instruction, insert the fully resolved operand - value, and stuff the instruction back again. */ - where = fixp->fx_frag->fr_literal + fixp->fx_where; - insn = bfd_getl16 (where); - - switch (fixp->fx_r_type) - { - case BFD_RELOC_AVR_7_PCREL: - if (value & 1) - as_bad_where (fixp->fx_file, fixp->fx_line, - _("odd address operand: %ld"), value); - /* Instruction addresses are always right-shifted by 1. */ - value >>= 1; - --value; /* Correct PC. */ - if (value < -64 || value > 63) - as_bad_where (fixp->fx_file, fixp->fx_line, - _("operand out of range: %ld"), value); - value = (value << 3) & 0x3f8; - bfd_putl16 ((bfd_vma) (value | insn), where); - break; - - case BFD_RELOC_AVR_13_PCREL: - if (value & 1) - as_bad_where (fixp->fx_file, fixp->fx_line, - _("odd address operand: %ld"), value); - /* Instruction addresses are always right-shifted by 1. */ - value >>= 1; - --value; /* Correct PC. */ - /* XXX AT90S8515 must have WRAP here. */ - - if (value < -2048 || value > 2047) - { - if (avr_mcu->mach == bfd_mach_avr2) - { - if (value > 2047) - value -= 4096; - else - value += 4096; - } - else - as_bad_where (fixp->fx_file, fixp->fx_line, - _("operand out of range: %ld"), value); - } - - value &= 0xfff; - bfd_putl16 ((bfd_vma) (value | insn), where); - break; - - case BFD_RELOC_32: - bfd_putl16 ((bfd_vma) value, where); - break; - - case BFD_RELOC_16: - bfd_putl16 ((bfd_vma) value, where); - break; - - case BFD_RELOC_AVR_16_PM: - bfd_putl16 ((bfd_vma) (value>>1), where); - break; - - case BFD_RELOC_AVR_LO8_LDI: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where); - break; - - case -BFD_RELOC_AVR_LO8_LDI: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 16), where); - break; - - case BFD_RELOC_AVR_HI8_LDI: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 8), where); - break; - - case -BFD_RELOC_AVR_HI8_LDI: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 24), where); - break; - - case BFD_RELOC_AVR_HH8_LDI: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 16), where); - break; - - case BFD_RELOC_AVR_LO8_LDI_NEG: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value), where); - break; - - case -BFD_RELOC_AVR_LO8_LDI_NEG: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 16), where); - break; - - case BFD_RELOC_AVR_HI8_LDI_NEG: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 8), where); - break; - - case -BFD_RELOC_AVR_HI8_LDI_NEG: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 24), where); - break; - - case BFD_RELOC_AVR_HH8_LDI_NEG: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 16), where); - break; - - case BFD_RELOC_AVR_LO8_LDI_PM: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 1), where); - break; - - case BFD_RELOC_AVR_HI8_LDI_PM: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 9), where); - break; - - case BFD_RELOC_AVR_HH8_LDI_PM: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 17), where); - break; - - case BFD_RELOC_AVR_LO8_LDI_PM_NEG: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 1), where); - break; - - case BFD_RELOC_AVR_HI8_LDI_PM_NEG: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 9), where); - break; - - case BFD_RELOC_AVR_HH8_LDI_PM_NEG: - bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 17), where); - break; - - case BFD_RELOC_AVR_CALL: - { - unsigned long x; - x = bfd_getl16 (where); - if (value & 1) - as_bad_where (fixp->fx_file, fixp->fx_line, - _("odd address operand: %ld"), value); - value >>= 1; - x |= ((value & 0x10000) | ((value << 3) & 0x1f00000)) >> 16; - bfd_putl16 ((bfd_vma) x, where); - bfd_putl16 ((bfd_vma) (value & 0xffff), where+2); - } - break; - - default: - as_fatal ( _("line %d: unknown relocation type: 0x%x"), - fixp->fx_line, fixp->fx_r_type); - break; - } - } - else - { - switch (fixp->fx_r_type) - { - case -BFD_RELOC_AVR_HI8_LDI_NEG: - case -BFD_RELOC_AVR_HI8_LDI: - case -BFD_RELOC_AVR_LO8_LDI_NEG: - case -BFD_RELOC_AVR_LO8_LDI: - as_bad_where (fixp->fx_file, fixp->fx_line, - _("only constant expression allowed")); - fixp->fx_done = 1; - break; - default: - break; - } - fixp->fx_addnumber = value; - } - return 0; -} - - -/* A `BFD_ASSEMBLER' GAS will call this to generate a reloc. GAS - will pass the resulting reloc to `bfd_install_relocation'. This - currently works poorly, as `bfd_install_relocation' often does the - wrong thing, and instances of `tc_gen_reloc' have been written to - work around the problems, which in turns makes it difficult to fix - `bfd_install_relocation'. */ - -/* If while processing a fixup, a reloc really needs to be created - then it is done here. */ - -arelent * -tc_gen_reloc (seg, fixp) - asection *seg; - fixS *fixp; -{ - arelent *reloc; - - reloc = (arelent *) xmalloc (sizeof (arelent)); - - reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); - - reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); - if (reloc->howto == (reloc_howto_type *) NULL) - { - as_bad_where (fixp->fx_file, fixp->fx_line, - _("reloc %d not supported by object file format"), - (int)fixp->fx_r_type); - return NULL; - } - - if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT - || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) - reloc->address = fixp->fx_offset; - - reloc->addend = fixp->fx_offset; - - return reloc; -} - - -void -md_assemble (str) - char *str; -{ - struct avr_opcodes_s * opcode; - char op[11]; - - str = extract_word (str, op, sizeof(op)); - - if (!op[0]) - as_bad (_ ("can't find opcode ")); - - opcode = (struct avr_opcodes_s *) hash_find (avr_hash, op); - - if (opcode == NULL) - { - as_bad (_ ("unknown opcode `%s'"), op); - return; - } - - if ((opcode->isa & avr_mcu->isa) != opcode->isa) - as_bad (_ ("illegal opcode %s for mcu %s"), opcode->name, avr_mcu->name); - - /* We used to set input_line_pointer to the result of get_operands, - but that is wrong. Our caller assumes we don't change it. */ - { - char *t = input_line_pointer; - avr_operands (opcode, &str); - if (*str) - as_bad (_ ("garbage at end of line")); - input_line_pointer = t; - } -} - -/* Parse ordinary expression. */ -static char * -parse_exp (s, op) - char *s; - expressionS * op; -{ - input_line_pointer = s; - expression (op); - if (op->X_op == O_absent) - as_bad (_("missing operand")); - return input_line_pointer; -} - - -/* Parse special expressions (needed for LDI command): - xx8 (address) - xx8 (-address) - pm_xx8 (address) - pm_xx8 (-address) - where xx is: hh, hi, lo -*/ -static bfd_reloc_code_real_type -avr_ldi_expression (exp) - expressionS *exp; -{ - char *str = input_line_pointer; - char *tmp; - char op[8]; - int mod; - tmp = str; - - str = extract_word (str, op, sizeof (op)); - if (op[0]) - { - mod = (int) hash_find (avr_mod_hash, op); - if (mod) - { - int closes = 0; - mod -= 10; - str = skip_space (str); - if (*str == '(') - { - int neg_p = 0; - ++str; - if (strncmp ("pm(", str, 3) == 0 - || strncmp ("-(pm(", str, 5) == 0) - { - if (HAVE_PM_P(mod)) - { - ++mod; - ++closes; - } - else - as_bad (_ ("illegal expression")); - if (*str == '-') - { - neg_p = 1; - ++closes; - str += 5; - } - else - str += 3; - } - if (*str == '-' && *(str + 1) == '(') - { - neg_p ^= 1; - ++closes; - str += 2; - } - input_line_pointer = str; - expression (exp); - do - { - if (*input_line_pointer != ')') - { - as_bad (_ ("`)' required")); - break; - } - input_line_pointer++; - } - while (closes--); - return neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod); - } - } - } - input_line_pointer = tmp; - expression (exp); - return BFD_RELOC_AVR_LO8_LDI; -} - -/* Flag to pass `pm' mode between `avr_parse_cons_expression' and - `avr_cons_fix_new' */ -static int exp_mod_pm = 0; - -/* Parse special CONS expression: pm (expression) - which is used for addressing to a program memory. - Relocation: BFD_RELOC_AVR_16_PM */ -void -avr_parse_cons_expression (exp, nbytes) - expressionS *exp; - int nbytes; -{ - char * tmp; - - exp_mod_pm = 0; - - tmp = input_line_pointer = skip_space (input_line_pointer); - - if (nbytes == 2) - { - char * pm_name = "pm"; - int len = strlen (pm_name); - if (strncasecmp (input_line_pointer, pm_name, len) == 0) - { - input_line_pointer = skip_space (input_line_pointer + len); - if (*input_line_pointer == '(') - { - input_line_pointer = skip_space (input_line_pointer + 1); - exp_mod_pm = 1; - expression (exp); - if (*input_line_pointer == ')') - ++input_line_pointer; - else - { - as_bad (_ ("`)' required")); - exp_mod_pm = 0; - } - return; - } - input_line_pointer = tmp; - } - } - expression (exp); -} - -void -avr_cons_fix_new(frag, where, nbytes, exp) - fragS *frag; - int where; - int nbytes; - expressionS *exp; -{ - if (exp_mod_pm == 0) - { - if (nbytes == 2) - fix_new_exp (frag, where, nbytes, exp, false, BFD_RELOC_16); - else if (nbytes == 4) - fix_new_exp (frag, where, nbytes, exp, false, BFD_RELOC_32); - else - as_bad (_ ("illegal %srelocation size: %d"), "", nbytes); - } - else - { - if (nbytes == 2) - fix_new_exp (frag, where, nbytes, exp, false, BFD_RELOC_AVR_16_PM); - else - as_bad (_ ("illegal %srelocation size: %d"), "`pm' ", nbytes); - exp_mod_pm = 0; - } -} diff --git a/gas/config/tc-avr.h b/gas/config/tc-avr.h deleted file mode 100644 index 2a8d3eea828..00000000000 --- a/gas/config/tc-avr.h +++ /dev/null @@ -1,118 +0,0 @@ -/* This file is tc-avr.h - Copyright (C) 1999, 2000 Free Software Foundation, Inc. - - Contributed by Denis Chertykov - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef BFD_ASSEMBLER - #error AVR support requires BFD_ASSEMBLER -#endif - - -#define TC_AVR -/* By convention, you should define this macro in the `.h' file. For - example, `tc-m68k.h' defines `TC_M68K'. You might have to use this - if it is necessary to add CPU specific code to the object format - file. */ - -#define TARGET_FORMAT "elf32-avr" -/* This macro is the BFD target name to use when creating the output - file. This will normally depend upon the `OBJ_FMT' macro. */ - -#define TARGET_ARCH bfd_arch_avr -/* This macro is the BFD architecture to pass to `bfd_set_arch_mach'. */ - -#define TARGET_MACH 0 -/* This macro is the BFD machine number to pass to - `bfd_set_arch_mach'. If it is not defined, GAS will use 0. */ - -#define TARGET_BYTES_BIG_ENDIAN 0 -/* You should define this macro to be non-zero if the target is big - endian, and zero if the target is little endian. */ - -#define ONLY_STANDARD_ESCAPES -/* If you define this macro, GAS will warn about the use of - nonstandard escape sequences in a string. */ - -#define md_operand(x) -/* GAS will call this function for any expression that can not be - recognized. When the function is called, `input_line_pointer' - will point to the start of the expression. */ - -void avr_parse_cons_expression (expressionS *exp, int nbytes); - -#define TC_PARSE_CONS_EXPRESSION(EXPR,N) avr_parse_cons_expression (EXPR,N) -/* - You may define this macro to parse an expression used in a data - allocation pseudo-op such as `.word'. You can use this to - recognize relocation directives that may appear in such directives.*/ - -void avr_cons_fix_new(fragS *frag,int where, int nbytes, expressionS *exp); - -#define TC_CONS_FIX_NEW(FRAG,WHERE,N,EXP) avr_cons_fix_new(FRAG,WHERE,N,EXP) -/* You may define this macro to generate a fixup for a data - allocation pseudo-op. */ - -#define md_number_to_chars number_to_chars_littleendian -/* This should just call either `number_to_chars_bigendian' or - `number_to_chars_littleendian', whichever is appropriate. On - targets like the MIPS which support options to change the - endianness, which function to call is a runtime decision. On - other targets, `md_number_to_chars' can be a simple macro. */ - -#define WORKING_DOT_WORD -/* -`md_short_jump_size' -`md_long_jump_size' -`md_create_short_jump' -`md_create_long_jump' - If `WORKING_DOT_WORD' is defined, GAS will not do broken word - processing (*note Broken words::.). Otherwise, you should set - `md_short_jump_size' to the size of a short jump (a jump that is - just long enough to jump around a long jmp) and - `md_long_jump_size' to the size of a long jump (a jump that can go - anywhere in the function), You should define - `md_create_short_jump' to create a short jump around a long jump, - and define `md_create_long_jump' to create a long jump. */ - -#define MD_APPLY_FIX3 - -#define TC_HANDLES_FX_DONE - -#undef RELOC_EXPANSION_POSSIBLE -/* If you define this macro, it means that `tc_gen_reloc' may return - multiple relocation entries for a single fixup. In this case, the - return value of `tc_gen_reloc' is a pointer to a null terminated - array. */ - -#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section(FIXP, SEC) -/* If you define this macro, it should return the offset between the - address of a PC relative fixup and the position from which the PC - relative adjustment should be made. On many processors, the base - of a PC relative instruction is the next instruction, so this - macro would return the length of an instruction. */ - -#define LISTING_WORD_SIZE 2 -/* The number of bytes to put into a word in a listing. This affects - the way the bytes are clumped together in the listing. For - example, a value of 2 might print `1234 5678' where a value of 1 - would print `12 34 56 78'. The default value is 4. */ - -#define LEX_DOLLAR 0 -/* AVR port uses `$' as a logical line separator */ diff --git a/gas/config/tc-d10v.c b/gas/config/tc-d10v.c deleted file mode 100644 index d20ae10475f..00000000000 --- a/gas/config/tc-d10v.c +++ /dev/null @@ -1,1663 +0,0 @@ -/* tc-d10v.c -- Assembler code for the Mitsubishi D10V - Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include -#include "as.h" -#include "subsegs.h" -#include "opcode/d10v.h" -#include "elf/ppc.h" - -const char comment_chars[] = ";"; -const char line_comment_chars[] = "#"; -const char line_separator_chars[] = ""; -const char *md_shortopts = "O"; -const char EXP_CHARS[] = "eE"; -const char FLT_CHARS[] = "dD"; - -int Optimizing = 0; - -#define AT_WORD_P(X) ((X)->X_op == O_right_shift \ - && (X)->X_op_symbol != NULL \ - && symbol_constant_p ((X)->X_op_symbol) \ - && S_GET_VALUE ((X)->X_op_symbol) == AT_WORD_RIGHT_SHIFT) -#define AT_WORD_RIGHT_SHIFT 2 - - -/* fixups */ -#define MAX_INSN_FIXUPS (5) -struct d10v_fixup -{ - expressionS exp; - int operand; - int pcrel; - int size; - bfd_reloc_code_real_type reloc; -}; - -typedef struct _fixups -{ - int fc; - struct d10v_fixup fix[MAX_INSN_FIXUPS]; - struct _fixups *next; -} Fixups; - -static Fixups FixUps[2]; -static Fixups *fixups; - -static int do_not_ignore_hash = 0; - -/* True if instruction swapping warnings should be inhibited. */ -static unsigned char flag_warn_suppress_instructionswap; /* --nowarnswap */ - -/* local functions */ -static int reg_name_search PARAMS ((char *name)); -static int register_name PARAMS ((expressionS *expressionP)); -static int check_range PARAMS ((unsigned long num, int bits, int flags)); -static int postfix PARAMS ((char *p)); -static bfd_reloc_code_real_type get_reloc PARAMS ((struct d10v_operand *op)); -static int get_operands PARAMS ((expressionS exp[])); -static struct d10v_opcode *find_opcode PARAMS ((struct d10v_opcode *opcode, expressionS ops[])); -static unsigned long build_insn PARAMS ((struct d10v_opcode *opcode, expressionS *opers, unsigned long insn)); -static void write_long PARAMS ((struct d10v_opcode *opcode, unsigned long insn, Fixups *fx)); -static void write_1_short PARAMS ((struct d10v_opcode *opcode, unsigned long insn, Fixups *fx)); -static int write_2_short PARAMS ((struct d10v_opcode *opcode1, unsigned long insn1, - struct d10v_opcode *opcode2, unsigned long insn2, int exec_type, Fixups *fx)); -static unsigned long do_assemble PARAMS ((char *str, struct d10v_opcode **opcode)); -static unsigned long d10v_insert_operand PARAMS (( unsigned long insn, int op_type, - offsetT value, int left, fixS *fix)); -static int parallel_ok PARAMS ((struct d10v_opcode *opcode1, unsigned long insn1, - struct d10v_opcode *opcode2, unsigned long insn2, - int exec_type)); -static symbolS * find_symbol_matching_register PARAMS ((expressionS *)); - -struct option md_longopts[] = -{ -#define OPTION_NOWARNSWAP (OPTION_MD_BASE) - {"nowarnswap", no_argument, NULL, OPTION_NOWARNSWAP}, - {NULL, no_argument, NULL, 0} -}; -size_t md_longopts_size = sizeof(md_longopts); - -static void d10v_dot_word PARAMS ((int)); - -/* The target specific pseudo-ops which we support. */ -const pseudo_typeS md_pseudo_table[] = -{ - { "word", d10v_dot_word, 2 }, - { NULL, NULL, 0 } -}; - -/* Opcode hash table. */ -static struct hash_control *d10v_hash; - -/* reg_name_search does a binary search of the d10v_predefined_registers - array to see if "name" is a valid regiter name. Returns the register - number from the array on success, or -1 on failure. */ - -static int -reg_name_search (name) - char *name; -{ - int middle, low, high; - int cmp; - - low = 0; - high = d10v_reg_name_cnt() - 1; - - do - { - middle = (low + high) / 2; - cmp = strcasecmp (name, d10v_predefined_registers[middle].name); - if (cmp < 0) - high = middle - 1; - else if (cmp > 0) - low = middle + 1; - else - return d10v_predefined_registers[middle].value; - } - while (low <= high); - return -1; -} - -/* register_name() checks the string at input_line_pointer - to see if it is a valid register name */ - -static int -register_name (expressionP) - expressionS *expressionP; -{ - int reg_number; - char c, *p = input_line_pointer; - - while (*p && *p!='\n' && *p!='\r' && *p !=',' && *p!=' ' && *p!=')') - p++; - - c = *p; - if (c) - *p++ = 0; - - /* look to see if it's in the register table */ - reg_number = reg_name_search (input_line_pointer); - if (reg_number >= 0) - { - expressionP->X_op = O_register; - /* temporarily store a pointer to the string here */ - expressionP->X_op_symbol = (symbolS *)input_line_pointer; - expressionP->X_add_number = reg_number; - input_line_pointer = p; - return 1; - } - if (c) - *(p-1) = c; - return 0; -} - - -static int -check_range (num, bits, flags) - unsigned long num; - int bits; - int flags; -{ - long min, max, bit1; - int retval=0; - - /* don't bother checking 16-bit values */ - if (bits == 16) - return 0; - - if (flags & OPERAND_SHIFT) - { - /* all special shift operands are unsigned */ - /* and <= 16. We allow 0 for now. */ - if (num>16) - return 1; - else - return 0; - } - - if (flags & OPERAND_SIGNED) - { - /* Signed 3-bit integers are restricted to the (-2, 3) range */ - if (flags & RESTRICTED_NUM3) - { - if ((long) num < -2 || (long) num > 3) - retval = 1; - } - else - { - max = (1 << (bits - 1)) - 1; - min = - (1 << (bits - 1)); - if (((long) num > max) || ((long) num < min)) - retval = 1; - } - } - else - { - max = (1 << bits) - 1; - min = 0; - if ((num > max) || (num < min)) - retval = 1; - } - return retval; -} - - -void -md_show_usage (stream) - FILE *stream; -{ - fprintf(stream, _("D10V options:\n\ --O optimize. Will do some operations in parallel.\n")); -} - -int -md_parse_option (c, arg) - int c; - char *arg; -{ - switch (c) - { - case 'O': - /* Optimize. Will attempt to parallelize operations */ - Optimizing = 1; - break; - case OPTION_NOWARNSWAP: - flag_warn_suppress_instructionswap = 1; - break; - default: - return 0; - } - return 1; -} - -symbolS * -md_undefined_symbol (name) - char *name; -{ - return 0; -} - -/* Turn a string in input_line_pointer into a floating point constant of type - type, and store the appropriate bytes in *litP. The number of LITTLENUMS - emitted is stored in *sizeP . An error message is returned, or NULL on OK. - */ -char * -md_atof (type, litP, sizeP) - int type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[4]; - char *t; - int i; - - switch (type) - { - case 'f': - prec = 2; - break; - case 'd': - prec = 4; - break; - default: - *sizeP = 0; - return _("bad call to md_atof"); - } - - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - - *sizeP = prec * 2; - - for (i = 0; i < prec; i++) - { - md_number_to_chars (litP, (valueT) words[i], 2); - litP += 2; - } - return NULL; -} - -void -md_convert_frag (abfd, sec, fragP) - bfd *abfd; - asection *sec; - fragS *fragP; -{ - abort (); -} - -valueT -md_section_align (seg, addr) - asection *seg; - valueT addr; -{ - int align = bfd_get_section_alignment (stdoutput, seg); - return ((addr + (1 << align) - 1) & (-1 << align)); -} - - -void -md_begin () -{ - char *prev_name = ""; - struct d10v_opcode *opcode; - d10v_hash = hash_new(); - - /* Insert unique names into hash table. The D10v instruction set - has many identical opcode names that have different opcodes based - on the operands. This hash table then provides a quick index to - the first opcode with a particular name in the opcode table. */ - - for (opcode = (struct d10v_opcode *)d10v_opcodes; opcode->name; opcode++) - { - if (strcmp (prev_name, opcode->name)) - { - prev_name = (char *)opcode->name; - hash_insert (d10v_hash, opcode->name, (char *) opcode); - } - } - - fixups = &FixUps[0]; - FixUps[0].next = &FixUps[1]; - FixUps[1].next = &FixUps[0]; -} - - -/* this function removes the postincrement or postdecrement - operator ( '+' or '-' ) from an expression */ - -static int postfix (p) - char *p; -{ - while (*p != '-' && *p != '+') - { - if (*p==0 || *p=='\n' || *p=='\r') - break; - p++; - } - - if (*p == '-') - { - *p = ' '; - return (-1); - } - if (*p == '+') - { - *p = ' '; - return (1); - } - - return (0); -} - - -static bfd_reloc_code_real_type -get_reloc (op) - struct d10v_operand *op; -{ - int bits = op->bits; - - if (bits <= 4) - return (0); - - if (op->flags & OPERAND_ADDR) - { - if (bits == 8) - return (BFD_RELOC_D10V_10_PCREL_R); - else - return (BFD_RELOC_D10V_18_PCREL); - } - - return (BFD_RELOC_16); -} - - -/* get_operands parses a string of operands and returns - an array of expressions */ - -static int -get_operands (exp) - expressionS exp[]; -{ - char *p = input_line_pointer; - int numops = 0; - int post = 0; - int uses_at = 0; - - while (*p) - { - while (*p == ' ' || *p == '\t' || *p == ',') - p++; - if (*p==0 || *p=='\n' || *p=='\r') - break; - - if (*p == '@') - { - uses_at = 1; - - p++; - exp[numops].X_op = O_absent; - if (*p == '(') - { - p++; - exp[numops].X_add_number = OPERAND_ATPAR; - } - else if (*p == '-') - { - p++; - exp[numops].X_add_number = OPERAND_ATMINUS; - } - else - { - exp[numops].X_add_number = OPERAND_ATSIGN; - post = postfix (p); - } - numops++; - continue; - } - - if (*p == ')') - { - /* just skip the trailing paren */ - p++; - continue; - } - - input_line_pointer = p; - - /* check to see if it might be a register name */ - if (!register_name (&exp[numops])) - { - /* parse as an expression */ - if (uses_at) - { - /* Any expression that involves the indirect addressing - cannot also involve immediate addressing. Therefore - the use of the hash character is illegal. */ - int save = do_not_ignore_hash; - do_not_ignore_hash = 1; - - expression (&exp[numops]); - - do_not_ignore_hash = save; - } - else - expression (&exp[numops]); - } - - if (strncasecmp (input_line_pointer, "@word", 5) == 0) - { - input_line_pointer += 5; - if (exp[numops].X_op == O_register) - { - /* if it looked like a register name but was followed by - "@word" then it was really a symbol, so change it to - one */ - exp[numops].X_op = O_symbol; - exp[numops].X_add_symbol = symbol_find_or_make ((char *)exp[numops].X_op_symbol); - } - - /* check for identifier@word+constant */ - if (*input_line_pointer == '-' || *input_line_pointer == '+') - { - char *orig_line = input_line_pointer; - expressionS new_exp; - expression (&new_exp); - exp[numops].X_add_number = new_exp.X_add_number; - } - - /* convert expr into a right shift by AT_WORD_RIGHT_SHIFT */ - { - expressionS new_exp; - memset (&new_exp, 0, sizeof new_exp); - new_exp.X_add_number = AT_WORD_RIGHT_SHIFT; - new_exp.X_op = O_constant; - new_exp.X_unsigned = 1; - exp[numops].X_op_symbol = make_expr_symbol (&new_exp); - exp[numops].X_op = O_right_shift; - } - - know (AT_WORD_P (&exp[numops])); - } - - if (exp[numops].X_op == O_illegal) - as_bad (_("illegal operand")); - else if (exp[numops].X_op == O_absent) - as_bad (_("missing operand")); - - numops++; - p = input_line_pointer; - } - - switch (post) - { - case -1: /* postdecrement mode */ - exp[numops].X_op = O_absent; - exp[numops++].X_add_number = OPERAND_MINUS; - break; - case 1: /* postincrement mode */ - exp[numops].X_op = O_absent; - exp[numops++].X_add_number = OPERAND_PLUS; - break; - } - - exp[numops].X_op = 0; - return (numops); -} - -static unsigned long -d10v_insert_operand (insn, op_type, value, left, fix) - unsigned long insn; - int op_type; - offsetT value; - int left; - fixS *fix; -{ - int shift, bits; - - shift = d10v_operands[op_type].shift; - if (left) - shift += 15; - - bits = d10v_operands[op_type].bits; - - /* truncate to the proper number of bits */ - if (check_range (value, bits, d10v_operands[op_type].flags)) - as_bad_where (fix->fx_file, fix->fx_line, _("operand out of range: %d"), value); - - value &= 0x7FFFFFFF >> (31 - bits); - insn |= (value << shift); - - return insn; -} - - -/* build_insn takes a pointer to the opcode entry in the opcode table - and the array of operand expressions and returns the instruction */ - -static unsigned long -build_insn (opcode, opers, insn) - struct d10v_opcode *opcode; - expressionS *opers; - unsigned long insn; -{ - int i, bits, shift, flags, format; - unsigned long number; - - /* the insn argument is only used for the DIVS kludge */ - if (insn) - format = LONG_R; - else - { - insn = opcode->opcode; - format = opcode->format; - } - - for (i=0;opcode->operands[i];i++) - { - flags = d10v_operands[opcode->operands[i]].flags; - bits = d10v_operands[opcode->operands[i]].bits; - shift = d10v_operands[opcode->operands[i]].shift; - number = opers[i].X_add_number; - - if (flags & OPERAND_REG) - { - number &= REGISTER_MASK; - if (format == LONG_L) - shift += 15; - } - - if (opers[i].X_op != O_register && opers[i].X_op != O_constant) - { - /* now create a fixup */ - - if (fixups->fc >= MAX_INSN_FIXUPS) - as_fatal (_("too many fixups")); - - if (AT_WORD_P (&opers[i])) - { - /* Reconize XXX>>1+N aka XXX@word+N as special (AT_WORD) */ - fixups->fix[fixups->fc].reloc = BFD_RELOC_D10V_18; - opers[i].X_op = O_symbol; - opers[i].X_op_symbol = NULL; /* Should free it */ - /* number is left shifted by AT_WORD_RIGHT_SHIFT so - that, it is aligned with the symbol's value. Later, - BFD_RELOC_D10V_18 will right shift (symbol_value + - X_add_number). */ - number <<= AT_WORD_RIGHT_SHIFT; - opers[i].X_add_number = number; - } - else - fixups->fix[fixups->fc].reloc = - get_reloc((struct d10v_operand *)&d10v_operands[opcode->operands[i]]); - - if (fixups->fix[fixups->fc].reloc == BFD_RELOC_16 || - fixups->fix[fixups->fc].reloc == BFD_RELOC_D10V_18) - fixups->fix[fixups->fc].size = 2; - else - fixups->fix[fixups->fc].size = 4; - - fixups->fix[fixups->fc].exp = opers[i]; - fixups->fix[fixups->fc].operand = opcode->operands[i]; - fixups->fix[fixups->fc].pcrel = (flags & OPERAND_ADDR) ? true : false; - (fixups->fc)++; - } - - /* truncate to the proper number of bits */ - if ((opers[i].X_op == O_constant) && check_range (number, bits, flags)) - as_bad (_("operand out of range: %d"),number); - number &= 0x7FFFFFFF >> (31 - bits); - insn = insn | (number << shift); - } - - /* kludge: for DIVS, we need to put the operands in twice */ - /* on the second pass, format is changed to LONG_R to force */ - /* the second set of operands to not be shifted over 15 */ - if ((opcode->opcode == OPCODE_DIVS) && (format==LONG_L)) - insn = build_insn (opcode, opers, insn); - - return insn; -} - -/* write out a long form instruction */ -static void -write_long (opcode, insn, fx) - struct d10v_opcode *opcode; - unsigned long insn; - Fixups *fx; -{ - int i, where; - char *f = frag_more(4); - - insn |= FM11; - number_to_chars_bigendian (f, insn, 4); - - for (i=0; i < fx->fc; i++) - { - if (fx->fix[i].reloc) - { - where = f - frag_now->fr_literal; - if (fx->fix[i].size == 2) - where += 2; - - if (fx->fix[i].reloc == BFD_RELOC_D10V_18) - fx->fix[i].operand |= 4096; - - fix_new_exp (frag_now, - where, - fx->fix[i].size, - &(fx->fix[i].exp), - fx->fix[i].pcrel, - fx->fix[i].operand|2048); - } - } - fx->fc = 0; -} - - -/* write out a short form instruction by itself */ -static void -write_1_short (opcode, insn, fx) - struct d10v_opcode *opcode; - unsigned long insn; - Fixups *fx; -{ - char *f = frag_more(4); - int i, where; - - if (opcode->exec_type & PARONLY) - as_fatal (_("Instruction must be executed in parallel with another instruction.")); - - /* the other container needs to be NOP */ - /* according to 4.3.1: for FM=00, sub-instructions performed only - by IU cannot be encoded in L-container. */ - if (opcode->unit == IU) - insn |= FM00 | (NOP << 15); /* right container */ - else - insn = FM00 | (insn << 15) | NOP; /* left container */ - - number_to_chars_bigendian (f, insn, 4); - for (i=0; i < fx->fc; i++) - { - if (fx->fix[i].reloc) - { - where = f - frag_now->fr_literal; - if (fx->fix[i].size == 2) - where += 2; - - if (fx->fix[i].reloc == BFD_RELOC_D10V_18) - fx->fix[i].operand |= 4096; - - /* if it's an R reloc, we may have to switch it to L */ - if ( (fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R) && (opcode->unit != IU) ) - fx->fix[i].operand |= 1024; - - fix_new_exp (frag_now, - where, - fx->fix[i].size, - &(fx->fix[i].exp), - fx->fix[i].pcrel, - fx->fix[i].operand|2048); - } - } - fx->fc = 0; -} - -/* write out a short form instruction if possible */ -/* return number of instructions not written out */ -static int -write_2_short (opcode1, insn1, opcode2, insn2, exec_type, fx) - struct d10v_opcode *opcode1, *opcode2; - unsigned long insn1, insn2; - int exec_type; - Fixups *fx; -{ - unsigned long insn; - char *f; - int i,j, where; - - if ( (exec_type != 1) && ((opcode1->exec_type & PARONLY) - || (opcode2->exec_type & PARONLY))) - as_fatal (_("Instruction must be executed in parallel")); - - if ( (opcode1->format & LONG_OPCODE) || (opcode2->format & LONG_OPCODE)) - as_fatal (_("Long instructions may not be combined.")); - - if(opcode1->exec_type & BRANCH_LINK && exec_type == 0) - { - /* Instructions paired with a subroutine call are executed before the - subroutine, so don't do these pairings unless explicitly requested. */ - write_1_short (opcode1, insn1, fx->next); - return (1); - } - - switch (exec_type) - { - case 0: /* order not specified */ - if ( Optimizing && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type)) - { - /* parallel */ - if (opcode1->unit == IU) - insn = FM00 | (insn2 << 15) | insn1; - else if (opcode2->unit == MU) - insn = FM00 | (insn2 << 15) | insn1; - else - { - insn = FM00 | (insn1 << 15) | insn2; - fx = fx->next; - } - } - else if (opcode1->unit == IU) - { - /* reverse sequential */ - insn = FM10 | (insn2 << 15) | insn1; - } - else - { - /* sequential */ - insn = FM01 | (insn1 << 15) | insn2; - fx = fx->next; - } - break; - case 1: /* parallel */ - if (opcode1->exec_type & SEQ || opcode2->exec_type & SEQ) - as_fatal (_("One of these instructions may not be executed in parallel.")); - - if (opcode1->unit == IU) - { - if (opcode2->unit == IU) - as_fatal (_("Two IU instructions may not be executed in parallel")); - if (!flag_warn_suppress_instructionswap) - as_warn (_("Swapping instruction order")); - insn = FM00 | (insn2 << 15) | insn1; - } - else if (opcode2->unit == MU) - { - if (opcode1->unit == MU) - as_fatal (_("Two MU instructions may not be executed in parallel")); - if (!flag_warn_suppress_instructionswap) - as_warn (_("Swapping instruction order")); - insn = FM00 | (insn2 << 15) | insn1; - } - else - { - insn = FM00 | (insn1 << 15) | insn2; - fx = fx->next; - } - break; - case 2: /* sequential */ - if (opcode1->unit != IU) - insn = FM01 | (insn1 << 15) | insn2; - else if (opcode2->unit == MU || opcode2->unit == EITHER) - { - if (!flag_warn_suppress_instructionswap) - as_warn (_("Swapping instruction order")); - insn = FM10 | (insn2 << 15) | insn1; - } - else - as_fatal (_("IU instruction may not be in the left container")); - fx = fx->next; - break; - case 3: /* reverse sequential */ - if (opcode2->unit != MU) - insn = FM10 | (insn1 << 15) | insn2; - else if (opcode1->unit == IU || opcode1->unit == EITHER) - { - if (!flag_warn_suppress_instructionswap) - as_warn (_("Swapping instruction order")); - insn = FM01 | (insn2 << 15) | insn1; - } - else - as_fatal (_("MU instruction may not be in the right container")); - fx = fx->next; - break; - default: - as_fatal (_("unknown execution type passed to write_2_short()")); - } - - f = frag_more(4); - number_to_chars_bigendian (f, insn, 4); - - for (j=0; j<2; j++) - { - for (i=0; i < fx->fc; i++) - { - if (fx->fix[i].reloc) - { - where = f - frag_now->fr_literal; - if (fx->fix[i].size == 2) - where += 2; - - if ( (fx->fix[i].reloc == BFD_RELOC_D10V_10_PCREL_R) && (j == 0) ) - fx->fix[i].operand |= 1024; - - if (fx->fix[i].reloc == BFD_RELOC_D10V_18) - fx->fix[i].operand |= 4096; - - fix_new_exp (frag_now, - where, - fx->fix[i].size, - &(fx->fix[i].exp), - fx->fix[i].pcrel, - fx->fix[i].operand|2048); - } - } - fx->fc = 0; - fx = fx->next; - } - return (0); -} - - -/* Check 2 instructions and determine if they can be safely */ -/* executed in parallel. Returns 1 if they can be. */ -static int -parallel_ok (op1, insn1, op2, insn2, exec_type) - struct d10v_opcode *op1, *op2; - unsigned long insn1, insn2; - int exec_type; -{ - int i, j, flags, mask, shift, regno; - unsigned long ins, mod[2], used[2]; - struct d10v_opcode *op; - - if ((op1->exec_type & SEQ) != 0 || (op2->exec_type & SEQ) != 0 - || (op1->exec_type & PAR) == 0 || (op2->exec_type & PAR) == 0 - || (op1->unit == BOTH) || (op2->unit == BOTH) - || (op1->unit == IU && op2->unit == IU) - || (op1->unit == MU && op2->unit == MU)) - return 0; - - /* If the first instruction is a branch and this is auto parallazation, - don't combine with any second instruction. */ - if (exec_type == 0 && (op1->exec_type & BRANCH) != 0) - return 0; - - /* The idea here is to create two sets of bitmasks (mod and used) - which indicate which registers are modified or used by each - instruction. The operation can only be done in parallel if - instruction 1 and instruction 2 modify different registers, and - the first instruction does not modify registers that the second - is using (The second instruction can modify registers that the - first is using as they are only written back after the first - instruction has completed). Accesses to control registers, PSW, - and memory are treated as accesses to a single register. So if - both instructions write memory or if the first instruction writes - memory and the second reads, then they cannot be done in - parallel. Likewise, if the first instruction mucks with the psw - and the second reads the PSW (which includes C, F0, and F1), then - they cannot operate safely in parallel. */ - - /* the bitmasks (mod and used) look like this (bit 31 = MSB) */ - /* r0-r15 0-15 */ - /* a0-a1 16-17 */ - /* cr (not psw) 18 */ - /* psw 19 */ - /* mem 20 */ - - for (j=0;j<2;j++) - { - if (j == 0) - { - op = op1; - ins = insn1; - } - else - { - op = op2; - ins = insn2; - } - mod[j] = used[j] = 0; - if (op->exec_type & BRANCH_LINK) - mod[j] |= 1 << 13; - - for (i = 0; op->operands[i]; i++) - { - flags = d10v_operands[op->operands[i]].flags; - shift = d10v_operands[op->operands[i]].shift; - mask = 0x7FFFFFFF >> (31 - d10v_operands[op->operands[i]].bits); - if (flags & OPERAND_REG) - { - regno = (ins >> shift) & mask; - if (flags & (OPERAND_ACC0|OPERAND_ACC1)) - regno += 16; - else if (flags & OPERAND_CONTROL) /* mvtc or mvfc */ - { - if (regno == 0) - regno = 19; - else - regno = 18; - } - else if (flags & (OPERAND_FFLAG|OPERAND_CFLAG)) - regno = 19; - - if ( flags & OPERAND_DEST ) - { - mod[j] |= 1 << regno; - if (flags & OPERAND_EVEN) - mod[j] |= 1 << (regno + 1); - } - else - { - used[j] |= 1 << regno ; - if (flags & OPERAND_EVEN) - used[j] |= 1 << (regno + 1); - - /* Auto inc/dec also modifies the register. */ - if (op->operands[i+1] != 0 - && (d10v_operands[op->operands[i+1]].flags - & (OPERAND_PLUS | OPERAND_MINUS)) != 0) - mod[j] |= 1 << regno; - } - } - else if (flags & OPERAND_ATMINUS) - { - /* SP implicitly used/modified */ - mod[j] |= 1 << 15; - used[j] |= 1 << 15; - } - } - if (op->exec_type & RMEM) - used[j] |= 1 << 20; - else if (op->exec_type & WMEM) - mod[j] |= 1 << 20; - else if (op->exec_type & RF0) - used[j] |= 1 << 19; - else if (op->exec_type & WF0) - mod[j] |= 1 << 19; - else if (op->exec_type & WCAR) - mod[j] |= 1 << 19; - } - if ((mod[0] & mod[1]) == 0 && (mod[0] & used[1]) == 0) - return 1; - return 0; -} - - -/* This is the main entry point for the machine-dependent assembler. str points to a - machine-dependent instruction. This function is supposed to emit the frags/bytes - it assembles to. For the D10V, it mostly handles the special VLIW parsing and packing - and leaves the difficult stuff to do_assemble(). - */ - -static unsigned long prev_insn; -static struct d10v_opcode *prev_opcode = 0; -static subsegT prev_subseg; -static segT prev_seg = 0;; -static int etype = 0; /* saved extype. used for multiline instructions */ - -void -md_assemble (str) - char *str; -{ - struct d10v_opcode * opcode; - unsigned long insn; - int extype = 0; /* execution type; parallel, etc */ - char * str2; - - if (etype == 0) - { - /* look for the special multiple instruction separators */ - str2 = strstr (str, "||"); - if (str2) - extype = 1; - else - { - str2 = strstr (str, "->"); - if (str2) - extype = 2; - else - { - str2 = strstr (str, "<-"); - if (str2) - extype = 3; - } - } - /* str2 points to the separator, if one */ - if (str2) - { - *str2 = 0; - - /* if two instructions are present and we already have one saved - then first write it out */ - d10v_cleanup (); - - /* assemble first instruction and save it */ - prev_insn = do_assemble (str, &prev_opcode); - if (prev_insn == -1) - as_fatal (_("can't find opcode ")); - fixups = fixups->next; - str = str2 + 2; - } - } - - insn = do_assemble (str, &opcode); - if (insn == -1) - { - if (extype) - { - etype = extype; - return; - } - as_fatal (_("can't find opcode ")); - } - - if (etype) - { - extype = etype; - etype = 0; - } - - /* if this is a long instruction, write it and any previous short instruction */ - if (opcode->format & LONG_OPCODE) - { - if (extype) - as_fatal (_("Unable to mix instructions as specified")); - d10v_cleanup (); - write_long (opcode, insn, fixups); - prev_opcode = NULL; - return; - } - - if (prev_opcode && prev_seg && ((prev_seg != now_seg) || (prev_subseg != now_subseg))) - d10v_cleanup(); - - if (prev_opcode && (write_2_short (prev_opcode, prev_insn, opcode, insn, extype, fixups) == 0)) - { - /* no instructions saved */ - prev_opcode = NULL; - } - else - { - if (extype) - as_fatal (_("Unable to mix instructions as specified")); - /* save off last instruction so it may be packed on next pass */ - prev_opcode = opcode; - prev_insn = insn; - prev_seg = now_seg; - prev_subseg = now_subseg; - fixups = fixups->next; - } -} - - -/* do_assemble assembles a single instruction and returns an opcode */ -/* it returns -1 (an invalid opcode) on error */ - -static unsigned long -do_assemble (str, opcode) - char *str; - struct d10v_opcode **opcode; -{ - unsigned char *op_start, *save; - unsigned char *op_end; - char name[20]; - int nlen = 0; - expressionS myops[6]; - unsigned long insn; - - /* Drop leading whitespace. */ - while (*str == ' ') - str++; - - /* Find the opcode end. */ - for (op_start = op_end = (unsigned char *) (str); - *op_end - && nlen < 20 - && !is_end_of_line[*op_end] && *op_end != ' '; - op_end++) - { - name[nlen] = tolower (op_start[nlen]); - nlen++; - } - name[nlen] = 0; - - if (nlen == 0) - return -1; - - /* Find the first opcode with the proper name. */ - *opcode = (struct d10v_opcode *)hash_find (d10v_hash, name); - if (*opcode == NULL) - as_fatal (_("unknown opcode: %s"),name); - - save = input_line_pointer; - input_line_pointer = op_end; - *opcode = find_opcode (*opcode, myops); - if (*opcode == 0) - return -1; - input_line_pointer = save; - - insn = build_insn ((*opcode), myops, 0); - return (insn); -} - -/* Find the symbol which has the same name as the register in the given expression. */ -static symbolS * -find_symbol_matching_register (exp) - expressionS * exp; -{ - int i; - - if (exp->X_op != O_register) - return NULL; - - /* Find the name of the register. */ - for (i = d10v_reg_name_cnt (); i--;) - if (d10v_predefined_registers [i].value == exp->X_add_number) - break; - - if (i < 0) - abort (); - - /* Now see if a symbol has been defined with the same name. */ - return symbol_find (d10v_predefined_registers [i].name); -} - - -/* find_opcode() gets a pointer to an entry in the opcode table. */ -/* It must look at all opcodes with the same name and use the operands */ -/* to choose the correct opcode. */ - -static struct d10v_opcode * -find_opcode (opcode, myops) - struct d10v_opcode *opcode; - expressionS myops[]; -{ - int i, match, done; - struct d10v_opcode *next_opcode; - - /* get all the operands and save them as expressions */ - get_operands (myops); - - /* now see if the operand is a fake. If so, find the correct size */ - /* instruction, if possible */ - if (opcode->format == OPCODE_FAKE) - { - int opnum = opcode->operands[0]; - int flags; - - if (myops[opnum].X_op == O_register) - { - myops[opnum].X_op = O_symbol; - myops[opnum].X_add_symbol = symbol_find_or_make ((char *)myops[opnum].X_op_symbol); - myops[opnum].X_add_number = 0; - myops[opnum].X_op_symbol = NULL; - } - - next_opcode=opcode+1; - - /* If the first operand is supposed to be a register, make sure - we got a valid one. */ - flags = d10v_operands[next_opcode->operands[0]].flags; - if (flags & OPERAND_REG) - { - int X_op = myops[0].X_op; - int num = myops[0].X_add_number; - - if (X_op != O_register - || (num & ~flags - & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1 - | OPERAND_FFLAG | OPERAND_CFLAG | OPERAND_CONTROL))) - { - as_bad (_("bad opcode or operands")); - return 0; - } - } - - if (myops[opnum].X_op == O_constant || (myops[opnum].X_op == O_symbol && - S_IS_DEFINED(myops[opnum].X_add_symbol) && - (S_GET_SEGMENT(myops[opnum].X_add_symbol) == now_seg))) - { - for (i=0; opcode->operands[i+1]; i++) - { - int bits = d10v_operands[next_opcode->operands[opnum]].bits; - int flags = d10v_operands[next_opcode->operands[opnum]].flags; - if (flags & OPERAND_ADDR) - bits += 2; - if (myops[opnum].X_op == O_constant) - { - if (!check_range (myops[opnum].X_add_number, bits, flags)) - return next_opcode; - } - else - { - fragS *f; - long value; - /* calculate the current address by running through the previous frags */ - /* and adding our current offset */ - for (value = 0, f = frchain_now->frch_root; f; f = f->fr_next) - value += f->fr_fix + f->fr_offset; - - if (flags & OPERAND_ADDR) - value = S_GET_VALUE(myops[opnum].X_add_symbol) - value - - (obstack_next_free(&frchain_now->frch_obstack) - frag_now->fr_literal); - else - value += S_GET_VALUE(myops[opnum].X_add_symbol); - - if (AT_WORD_P (&myops[opnum])) - { - if (bits > 4) - { - bits += 2; - if (!check_range (value, bits, flags)) - return next_opcode; - } - } - else if (!check_range (value, bits, flags)) - return next_opcode; - } - next_opcode++; - } - as_fatal (_("value out of range")); - } - else - { - /* not a constant, so use a long instruction */ - return opcode+2; - } - } - else - { - match = 0; - /* now search the opcode table table for one with operands */ - /* that matches what we've got */ - while (!match) - { - match = 1; - for (i = 0; opcode->operands[i]; i++) - { - int flags = d10v_operands[opcode->operands[i]].flags; - int X_op = myops[i].X_op; - int num = myops[i].X_add_number; - - if (X_op == 0) - { - match = 0; - break; - } - - if (flags & OPERAND_REG) - { - if ((X_op != O_register) - || (num & ~flags - & (OPERAND_GPR | OPERAND_ACC0 | OPERAND_ACC1 - | OPERAND_FFLAG | OPERAND_CFLAG - | OPERAND_CONTROL))) - { - match = 0; - break; - } - } - - if (((flags & OPERAND_MINUS) && ((X_op != O_absent) || (num != OPERAND_MINUS))) || - ((flags & OPERAND_PLUS) && ((X_op != O_absent) || (num != OPERAND_PLUS))) || - ((flags & OPERAND_ATMINUS) && ((X_op != O_absent) || (num != OPERAND_ATMINUS))) || - ((flags & OPERAND_ATPAR) && ((X_op != O_absent) || (num != OPERAND_ATPAR))) || - ((flags & OPERAND_ATSIGN) && ((X_op != O_absent) || ((num != OPERAND_ATSIGN) && (num != OPERAND_ATPAR))))) - { - match = 0; - break; - } - - /* Unfortunatly, for the indirect operand in instructions such as - ``ldb r1, @(c,r14)'' this function can be passed X_op == O_register - (because 'c' is a valid register name). However we cannot just - ignore the case when X_op == O_register but flags & OPERAND_REG is - null, so we check to see if a symbol of the same name as the register - exists. If the symbol does exist, then the parser was unable to - distinguish the two cases and we fix things here. (Ref: PR14826) */ - - if (!(flags & OPERAND_REG) && (X_op == O_register)) - { - symbolS * sym; - - sym = find_symbol_matching_register (& myops[i]); - - if (sym != NULL) - { - myops [i].X_op == X_op == O_symbol; - myops [i].X_add_symbol = sym; - } - else - as_bad - (_("illegal operand - register name found where none expected")); - } - } - - /* We're only done if the operands matched so far AND there - are no more to check. */ - if (match && myops[i].X_op == 0) - break; - else - match = 0; - - next_opcode = opcode + 1; - - if (next_opcode->opcode == 0) - break; - - if (strcmp (next_opcode->name, opcode->name)) - break; - - opcode = next_opcode; - } - } - - if (!match) - { - as_bad (_("bad opcode or operands")); - return (0); - } - - /* Check that all registers that are required to be even are. */ - /* Also, if any operands were marked as registers, but were really symbols */ - /* fix that here. */ - for (i=0; opcode->operands[i]; i++) - { - if ((d10v_operands[opcode->operands[i]].flags & OPERAND_EVEN) && - (myops[i].X_add_number & 1)) - as_fatal (_("Register number must be EVEN")); - if (myops[i].X_op == O_register) - { - if (!(d10v_operands[opcode->operands[i]].flags & OPERAND_REG)) - { - myops[i].X_op = O_symbol; - myops[i].X_add_symbol = symbol_find_or_make ((char *)myops[i].X_op_symbol); - myops[i].X_add_number = 0; - myops[i].X_op_symbol = NULL; - } - } - } - return opcode; -} - -/* if while processing a fixup, a reloc really needs to be created */ -/* then it is done here */ - -arelent * -tc_gen_reloc (seg, fixp) - asection *seg; - fixS *fixp; -{ - arelent *reloc; - reloc = (arelent *) xmalloc (sizeof (arelent)); - reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); - reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); - if (reloc->howto == (reloc_howto_type *) NULL) - { - as_bad_where (fixp->fx_file, fixp->fx_line, - _("reloc %d not supported by object file format"), (int)fixp->fx_r_type); - return NULL; - } - - if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT - || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) - reloc->address = fixp->fx_offset; - - reloc->addend = fixp->fx_addnumber; - - return reloc; -} - -int -md_estimate_size_before_relax (fragp, seg) - fragS *fragp; - asection *seg; -{ - abort (); - return 0; -} - -long -md_pcrel_from_section (fixp, sec) - fixS *fixp; - segT sec; -{ - if (fixp->fx_addsy != (symbolS *)NULL && (!S_IS_DEFINED (fixp->fx_addsy) || - (S_GET_SEGMENT (fixp->fx_addsy) != sec))) - return 0; - return fixp->fx_frag->fr_address + fixp->fx_where; -} - -int -md_apply_fix3 (fixp, valuep, seg) - fixS *fixp; - valueT *valuep; - segT seg; -{ - char *where; - unsigned long insn; - long value; - int op_type; - int left=0; - - if (fixp->fx_addsy == (symbolS *) NULL) - { - value = *valuep; - fixp->fx_done = 1; - } - else if (fixp->fx_pcrel) - value = *valuep; - else - { - value = fixp->fx_offset; - if (fixp->fx_subsy != (symbolS *) NULL) - { - if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section) - value -= S_GET_VALUE (fixp->fx_subsy); - else - { - /* We don't actually support subtracting a symbol. */ - as_bad_where (fixp->fx_file, fixp->fx_line, - _("expression too complex")); - } - } - } - - op_type = fixp->fx_r_type; - if (op_type & 2048) - { - op_type -= 2048; - if (op_type & 1024) - { - op_type -= 1024; - fixp->fx_r_type = BFD_RELOC_D10V_10_PCREL_L; - left = 1; - } - else if (op_type & 4096) - { - op_type -= 4096; - fixp->fx_r_type = BFD_RELOC_D10V_18; - } - else - fixp->fx_r_type = get_reloc((struct d10v_operand *)&d10v_operands[op_type]); - } - - /* Fetch the instruction, insert the fully resolved operand - value, and stuff the instruction back again. */ - where = fixp->fx_frag->fr_literal + fixp->fx_where; - insn = bfd_getb32 ((unsigned char *) where); - - switch (fixp->fx_r_type) - { - case BFD_RELOC_D10V_10_PCREL_L: - case BFD_RELOC_D10V_10_PCREL_R: - case BFD_RELOC_D10V_18_PCREL: - case BFD_RELOC_D10V_18: - /* instruction addresses are always right-shifted by 2 */ - value >>= AT_WORD_RIGHT_SHIFT; - if (fixp->fx_size == 2) - bfd_putb16 ((bfd_vma) value, (unsigned char *) where); - else - { - struct d10v_opcode *rep, *repi; - - rep = (struct d10v_opcode *) hash_find (d10v_hash, "rep"); - repi = (struct d10v_opcode *) hash_find (d10v_hash, "repi"); - if ((insn & FM11) == FM11 - && (repi != NULL && (insn & repi->mask) == repi->opcode - || rep != NULL && (insn & rep->mask) == rep->opcode) - && value < 4) - as_fatal - (_("line %d: rep or repi must include at least 4 instructions"), - fixp->fx_line); - insn = d10v_insert_operand (insn, op_type, (offsetT)value, left, fixp); - bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); - } - break; - case BFD_RELOC_32: - bfd_putb32 ((bfd_vma) value, (unsigned char *) where); - break; - case BFD_RELOC_16: - bfd_putb16 ((bfd_vma) value, (unsigned char *) where); - break; - - case BFD_RELOC_VTABLE_INHERIT: - case BFD_RELOC_VTABLE_ENTRY: - fixp->fx_done = 0; - return 1; - - default: - as_fatal (_("line %d: unknown relocation type: 0x%x"),fixp->fx_line,fixp->fx_r_type); - } - return 0; -} - -/* d10v_cleanup() is called after the assembler has finished parsing the input - file or after a label is defined. Because the D10V assembler sometimes saves short - instructions to see if it can package them with the next instruction, there may - be a short instruction that still needs written. */ -int -d10v_cleanup () -{ - segT seg; - subsegT subseg; - - if (prev_opcode && etype == 0) - { - seg = now_seg; - subseg = now_subseg; - if (prev_seg) - subseg_set (prev_seg, prev_subseg); - write_1_short (prev_opcode, prev_insn, fixups->next); - subseg_set (seg, subseg); - prev_opcode = NULL; - } - return 1; -} - -/* Like normal .word, except support @word */ -/* clobbers input_line_pointer, checks end-of-line. */ -static void -d10v_dot_word (nbytes) - register int nbytes; /* 1=.byte, 2=.word, 4=.long */ -{ - expressionS exp; - bfd_reloc_code_real_type reloc; - char *p; - int offset; - - if (is_it_end_of_statement ()) - { - demand_empty_rest_of_line (); - return; - } - - do - { - expression (&exp); - if (!strncasecmp (input_line_pointer, "@word", 5)) - { - exp.X_add_number = 0; - input_line_pointer += 5; - - p = frag_more (2); - fix_new_exp (frag_now, p - frag_now->fr_literal, 2, - &exp, 0, BFD_RELOC_D10V_18); - } - else - emit_expr (&exp, 2); - } - while (*input_line_pointer++ == ','); - - input_line_pointer--; /* Put terminator back into stream. */ - demand_empty_rest_of_line (); -} - - -/* Mitsubishi asked that we support some old syntax that apparently */ -/* had immediate operands starting with '#'. This is in some of their */ -/* sample code but is not documented (although it appears in some */ -/* examples in their assembler manual). For now, we'll solve this */ -/* compatibility problem by simply ignoring any '#' at the beginning */ -/* of an operand. */ - -/* operands that begin with '#' should fall through to here */ -/* from expr.c */ - -void -md_operand (expressionP) - expressionS *expressionP; -{ - if (*input_line_pointer == '#' && ! do_not_ignore_hash) - { - input_line_pointer++; - expression (expressionP); - } -} - -boolean -d10v_fix_adjustable (fixP) - fixS *fixP; -{ - - if (fixP->fx_addsy == NULL) - return 1; - - /* Prevent all adjustments to global symbols. */ - if (S_IS_EXTERN (fixP->fx_addsy)) - return 0; - if (S_IS_WEAK (fixP->fx_addsy)) - return 0; - - /* We need the symbol name for the VTABLE entries */ - if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT - || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) - return 0; - - return 1; -} - -int -d10v_force_relocation (fixp) - struct fix *fixp; -{ - if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT - || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) - return 1; - - return 0; -} diff --git a/gas/config/tc-d10v.h b/gas/config/tc-d10v.h deleted file mode 100644 index 18e6e30b711..00000000000 --- a/gas/config/tc-d10v.h +++ /dev/null @@ -1,63 +0,0 @@ -/* tc-d10v.h -- Header file for tc-d10v.c. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. - Written by Martin Hunt, Cygnus Support. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#define TC_D10V - -#define TARGET_BYTES_BIG_ENDIAN 0 - -#ifndef BFD_ASSEMBLER - #error D10V support requires BFD_ASSEMBLER -#endif - -/* The target BFD architecture. */ -#define TARGET_ARCH bfd_arch_d10v - -#define TARGET_FORMAT "elf32-d10v" - -#define MD_APPLY_FIX3 - -/* call md_pcrel_from_section, not md_pcrel_from */ -#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section(FIXP, SEC) - -/* Permit temporary numeric labels. */ -#define LOCAL_LABELS_FB 1 - -#define DIFF_EXPR_OK /* .-foo gets turned into PC relative relocs */ - -/* We don't need to handle .word strangely. */ -#define WORKING_DOT_WORD - -#define md_number_to_chars number_to_chars_bigendian - -int d10v_cleanup PARAMS ((void)); -#define md_after_pass_hook() d10v_cleanup() -#define md_cleanup() d10v_cleanup() -#define md_do_align(a,b,c,d,e) d10v_cleanup() -#define tc_frob_label(sym) do {\ - d10v_cleanup(); \ - S_SET_VALUE (sym, (valueT) frag_now_fix ()); \ -} while (0) - -#define obj_fix_adjustable(fixP) d10v_fix_adjustable(fixP) -#define TC_FORCE_RELOCATION(fixp) d10v_force_relocation(fixp) -extern int d10v_force_relocation PARAMS ((struct fix *)); - -#define md_flush_pending_output d10v_cleanup diff --git a/gas/config/tc-d30v.c b/gas/config/tc-d30v.c deleted file mode 100644 index f1dc0ea72e2..00000000000 --- a/gas/config/tc-d30v.c +++ /dev/null @@ -1,2237 +0,0 @@ -/* tc-d30v.c -- Assembler code for the Mitsubishi D30V - Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include -#include "as.h" -#include "subsegs.h" -#include "opcode/d30v.h" - -const char comment_chars[] = ";"; -const char line_comment_chars[] = "#"; -const char line_separator_chars[] = ""; -const char *md_shortopts = "OnNcC"; -const char EXP_CHARS[] = "eE"; -const char FLT_CHARS[] = "dD"; - -#if HAVE_LIMITS_H -#include -#endif - -#ifndef CHAR_BIT -#define CHAR_BIT 8 -#endif - -#define NOP_MULTIPLY 1 -#define NOP_ALL 2 -static int warn_nops = 0; -static int Optimizing = 0; -static int warn_register_name_conflicts = 1; - -#define FORCE_SHORT 1 -#define FORCE_LONG 2 - -/* EXEC types. */ -typedef enum _exec_type -{ - EXEC_UNKNOWN, /* no order specified */ - EXEC_PARALLEL, /* done in parallel (FM=00) */ - EXEC_SEQ, /* sequential (FM=01) */ - EXEC_REVSEQ /* reverse sequential (FM=10) */ -} exec_type_enum; - -/* fixups */ -#define MAX_INSN_FIXUPS (5) -struct d30v_fixup -{ - expressionS exp; - int operand; - int pcrel; - int size; - bfd_reloc_code_real_type reloc; -}; - -typedef struct _fixups -{ - int fc; - struct d30v_fixup fix[MAX_INSN_FIXUPS]; - struct _fixups *next; -} Fixups; - -static Fixups FixUps[2]; -static Fixups *fixups; - -/* Whether current and previous instruction are word multiply insns. */ -static int cur_mul32_p = 0; -static int prev_mul32_p = 0; - -/* The flag_explicitly_parallel is true iff the instruction being assembled - has been explicitly written as a parallel short-instruction pair by the - human programmer. It is used in parallel_ok() to distinguish between - those dangerous parallelizations attempted by the human, which are to be - allowed, and those attempted by the assembler, which are not. It is set - from md_assemble(). */ -static int flag_explicitly_parallel = 0; -static int flag_xp_state = 0; - -/* Whether current and previous left sub-instruction disables - execution of right sub-instruction. */ -static int cur_left_kills_right_p = 0; -static int prev_left_kills_right_p = 0; - -/* The known current alignment of the current section. */ -static int d30v_current_align; -static segT d30v_current_align_seg; - -/* The last seen label in the current section. This is used to auto-align - labels preceeding instructions. */ -static symbolS *d30v_last_label; - -/* Two nops */ -#define NOP_LEFT ((long long) NOP << 32) -#define NOP_RIGHT ((long long) NOP) -#define NOP2 (FM00 | NOP_LEFT | NOP_RIGHT) - -/* local functions */ -static int reg_name_search PARAMS ((char *name)); -static int register_name PARAMS ((expressionS *expressionP)); -static int check_range PARAMS ((unsigned long num, int bits, int flags)); -static int postfix PARAMS ((char *p)); -static bfd_reloc_code_real_type get_reloc PARAMS ((struct d30v_operand *op, int rel_flag)); -static int get_operands PARAMS ((expressionS exp[], int cmp_hack)); -static struct d30v_format *find_format PARAMS ((struct d30v_opcode *opcode, - expressionS ops[],int fsize, int cmp_hack)); -static long long build_insn PARAMS ((struct d30v_insn *opcode, expressionS *opers)); -static void write_long PARAMS ((struct d30v_insn *opcode, long long insn, Fixups *fx)); -static void write_1_short PARAMS ((struct d30v_insn *opcode, long long insn, - Fixups *fx, int use_sequential)); -static int write_2_short PARAMS ((struct d30v_insn *opcode1, long long insn1, - struct d30v_insn *opcode2, long long insn2, exec_type_enum exec_type, Fixups *fx)); -static long long do_assemble PARAMS ((char *str, struct d30v_insn *opcode, - int shortp, int is_parallel)); -static int parallel_ok PARAMS ((struct d30v_insn *opcode1, unsigned long insn1, - struct d30v_insn *opcode2, unsigned long insn2, - exec_type_enum exec_type)); -static void d30v_number_to_chars PARAMS ((char *buf, long long value, int nbytes)); -static void check_size PARAMS ((long value, int bits, char *file, int line)); -static void d30v_align PARAMS ((int, char *, symbolS *)); -static void s_d30v_align PARAMS ((int)); -static void s_d30v_text PARAMS ((int)); -static void s_d30v_data PARAMS ((int)); -static void s_d30v_section PARAMS ((int)); - -struct option md_longopts[] = { - {NULL, no_argument, NULL, 0} -}; -size_t md_longopts_size = sizeof(md_longopts); - - -/* The target specific pseudo-ops which we support. */ -const pseudo_typeS md_pseudo_table[] = -{ - { "word", cons, 4 }, - { "hword", cons, 2 }, - { "align", s_d30v_align, 0 }, - { "text", s_d30v_text, 0 }, - { "data", s_d30v_data, 0 }, - { "section", s_d30v_section, 0 }, - { "section.s", s_d30v_section, 0 }, - { "sect", s_d30v_section, 0 }, - { "sect.s", s_d30v_section, 0 }, - { NULL, NULL, 0 } -}; - -/* Opcode hash table. */ -static struct hash_control *d30v_hash; - -/* reg_name_search does a binary search of the pre_defined_registers - array to see if "name" is a valid regiter name. Returns the register - number from the array on success, or -1 on failure. */ - -static int -reg_name_search (name) - char *name; -{ - int middle, low, high; - int cmp; - - low = 0; - high = reg_name_cnt () - 1; - - do - { - middle = (low + high) / 2; - cmp = strcasecmp (name, pre_defined_registers[middle].name); - if (cmp < 0) - high = middle - 1; - else if (cmp > 0) - low = middle + 1; - else - { - if (symbol_find (name) != NULL) - { - if (warn_register_name_conflicts) - as_warn (_("Register name %s conflicts with symbol of the same name"), - name); - } - - return pre_defined_registers[middle].value; - } - } - while (low <= high); - - return -1; -} - -/* register_name() checks the string at input_line_pointer - to see if it is a valid register name. */ - -static int -register_name (expressionP) - expressionS *expressionP; -{ - int reg_number; - char c, *p = input_line_pointer; - - while (*p && *p!='\n' && *p!='\r' && *p !=',' && *p!=' ' && *p!=')') - p++; - - c = *p; - if (c) - *p++ = 0; - - /* look to see if it's in the register table */ - reg_number = reg_name_search (input_line_pointer); - if (reg_number >= 0) - { - expressionP->X_op = O_register; - /* temporarily store a pointer to the string here */ - expressionP->X_op_symbol = (symbolS *)input_line_pointer; - expressionP->X_add_number = reg_number; - input_line_pointer = p; - return 1; - } - if (c) - *(p-1) = c; - return 0; -} - - -static int -check_range (num, bits, flags) - unsigned long num; - int bits; - int flags; -{ - long min, max; - - /* Don't bother checking 32-bit values. */ - if (bits == 32) - { - if (sizeof(unsigned long) * CHAR_BIT == 32) - return 0; - - /* We don't record signed or unsigned for 32-bit quantities. - Allow either. */ - min = -((unsigned long)1 << (bits - 1)); - max = ((unsigned long)1 << bits) - 1; - return (long)num < min || (long)num > max; - } - - if (flags & OPERAND_SHIFT) - { - /* We know that all shifts are right by three bits.... */ - - if (flags & OPERAND_SIGNED) - num = (unsigned long) ( (long) num >= 0) - ? ( ((long) num) >> 3 ) - : ( (num >> 3) | ~(~(unsigned long)0 >> 3) ); - else - num >>= 3; - } - - if (flags & OPERAND_SIGNED) - { - max = ((unsigned long)1 << (bits - 1)) - 1; - min = - ((unsigned long)1 << (bits - 1)); - return (long)num > max || (long)num < min; - } - else - { - max = ((unsigned long)1 << bits) - 1; - min = 0; - return num > max || num < min; - } -} - - -void -md_show_usage (stream) - FILE *stream; -{ - fprintf (stream, _("\nD30V options:\n\ --O Make adjacent short instructions parallel if possible.\n\ --n Warn about all NOPs inserted by the assembler.\n\ --N Warn about NOPs inserted after word multiplies.\n\ --c Warn about symbols whoes names match register names.\n\ --C Opposite of -C. -c is the default.\n")); -} - -int -md_parse_option (c, arg) - int c; - char *arg; -{ - switch (c) - { - /* Optimize. Will attempt to parallelize operations */ - case 'O': - Optimizing = 1; - break; - - /* Warn about all NOPS that the assembler inserts. */ - case 'n': - warn_nops = NOP_ALL; - break; - - /* Warn about the NOPS that the assembler inserts because of the - multiply hazard. */ - case 'N': - warn_nops = NOP_MULTIPLY; - break; - - case 'c': - warn_register_name_conflicts = 1; - break; - - case 'C': - warn_register_name_conflicts = 0; - break; - - default: - return 0; - } - return 1; -} - -symbolS * -md_undefined_symbol (name) - char *name; -{ - return 0; -} - -/* Turn a string in input_line_pointer into a floating point constant of type - type, and store the appropriate bytes in *litP. The number of LITTLENUMS - emitted is stored in *sizeP . An error message is returned, or NULL on OK. - */ -char * -md_atof (type, litP, sizeP) - int type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[4]; - char *t; - int i; - - switch (type) - { - case 'f': - prec = 2; - break; - case 'd': - prec = 4; - break; - default: - *sizeP = 0; - return _("bad call to md_atof"); - } - - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - - *sizeP = prec * 2; - - for (i = 0; i < prec; i++) - { - md_number_to_chars (litP, (valueT) words[i], 2); - litP += 2; - } - return NULL; -} - -void -md_convert_frag (abfd, sec, fragP) - bfd *abfd; - asection *sec; - fragS *fragP; -{ - abort (); -} - -valueT -md_section_align (seg, addr) - asection *seg; - valueT addr; -{ - int align = bfd_get_section_alignment (stdoutput, seg); - return ((addr + (1 << align) - 1) & (-1 << align)); -} - - -void -md_begin () -{ - struct d30v_opcode * opcode; - d30v_hash = hash_new (); - - /* Insert opcode names into a hash table. */ - for (opcode = (struct d30v_opcode *)d30v_opcode_table; opcode->name; opcode++) - hash_insert (d30v_hash, opcode->name, (char *) opcode); - - fixups = &FixUps[0]; - FixUps[0].next = &FixUps[1]; - FixUps[1].next = &FixUps[0]; - - d30v_current_align_seg = now_seg; -} - - -/* this function removes the postincrement or postdecrement - operator ( '+' or '-' ) from an expression */ - -static int postfix (p) - char *p; -{ - while (*p != '-' && *p != '+') - { - if (*p==0 || *p=='\n' || *p=='\r' || *p==' ' || *p==',') - break; - p++; - } - - if (*p == '-') - { - *p = ' '; - return (-1); - } - if (*p == '+') - { - *p = ' '; - return (1); - } - - return (0); -} - - -static bfd_reloc_code_real_type -get_reloc (op, rel_flag) - struct d30v_operand *op; - int rel_flag; -{ - switch (op->bits) - { - case 6: - if (op->flags & OPERAND_SHIFT) - return BFD_RELOC_D30V_9_PCREL; - else - return BFD_RELOC_D30V_6; - break; - case 12: - if (!(op->flags & OPERAND_SHIFT)) - as_warn (_("unexpected 12-bit reloc type")); - if (rel_flag == RELOC_PCREL) - return BFD_RELOC_D30V_15_PCREL; - else - return BFD_RELOC_D30V_15; - case 18: - if (!(op->flags & OPERAND_SHIFT)) - as_warn (_("unexpected 18-bit reloc type")); - if (rel_flag == RELOC_PCREL) - return BFD_RELOC_D30V_21_PCREL; - else - return BFD_RELOC_D30V_21; - case 32: - if (rel_flag == RELOC_PCREL) - return BFD_RELOC_D30V_32_PCREL; - else - return BFD_RELOC_D30V_32; - default: - return 0; - } -} - -/* get_operands parses a string of operands and returns - an array of expressions */ - -static int -get_operands (exp, cmp_hack) - expressionS exp[]; - int cmp_hack; -{ - char *p = input_line_pointer; - int numops = 0; - int post = 0; - - if (cmp_hack) - { - exp[numops].X_op = O_absent; - exp[numops++].X_add_number = cmp_hack - 1; - } - - while (*p) - { - while (*p == ' ' || *p == '\t' || *p == ',') - p++; - if (*p==0 || *p=='\n' || *p=='\r') - break; - - if (*p == '@') - { - p++; - exp[numops].X_op = O_absent; - if (*p == '(') - { - p++; - exp[numops].X_add_number = OPERAND_ATPAR; - post = postfix (p); - } - else if (*p == '-') - { - p++; - exp[numops].X_add_number = OPERAND_ATMINUS; - } - else - { - exp[numops].X_add_number = OPERAND_ATSIGN; - post = postfix (p); - } - numops++; - continue; - } - - if (*p == ')') - { - /* just skip the trailing paren */ - p++; - continue; - } - - input_line_pointer = p; - - /* check to see if it might be a register name */ - if (!register_name (&exp[numops])) - { - /* parse as an expression */ - expression (&exp[numops]); - } - - if (exp[numops].X_op == O_illegal) - as_bad (_("illegal operand")); - else if (exp[numops].X_op == O_absent) - as_bad (_("missing operand")); - - numops++; - p = input_line_pointer; - - switch (post) - { - case -1: /* postdecrement mode */ - exp[numops].X_op = O_absent; - exp[numops++].X_add_number = OPERAND_MINUS; - break; - case 1: /* postincrement mode */ - exp[numops].X_op = O_absent; - exp[numops++].X_add_number = OPERAND_PLUS; - break; - } - post = 0; - } - - exp[numops].X_op = 0; - return (numops); -} - -/* build_insn generates the instruction. It does everything */ -/* but write the FM bits. */ - -static long long -build_insn (opcode, opers) - struct d30v_insn *opcode; - expressionS *opers; -{ - int i, length, bits, shift, flags; - unsigned long number, id=0; - long long insn; - struct d30v_opcode *op = opcode->op; - struct d30v_format *form = opcode->form; - - insn = opcode->ecc << 28 | op->op1 << 25 | op->op2 << 20 | form->modifier << 18; - - for (i=0; form->operands[i]; i++) - { - flags = d30v_operand_table[form->operands[i]].flags; - - /* must be a register or number */ - if (!(flags & OPERAND_REG) && !(flags & OPERAND_NUM) && - !(flags & OPERAND_NAME) && !(flags & OPERAND_SPECIAL)) - continue; - - bits = d30v_operand_table[form->operands[i]].bits; - if (flags & OPERAND_SHIFT) - bits += 3; - - length = d30v_operand_table[form->operands[i]].length; - shift = 12 - d30v_operand_table[form->operands[i]].position; - if (opers[i].X_op != O_symbol) - number = opers[i].X_add_number; - else - number = 0; - if (flags & OPERAND_REG) - { - /* check for mvfsys or mvtsys control registers */ - if (flags & OPERAND_CONTROL && (number & 0x7f) > MAX_CONTROL_REG) - { - /* PSWL or PSWH */ - id = (number & 0x7f) - MAX_CONTROL_REG; - number = 0; - } - else if (number & OPERAND_FLAG) - { - id = 3; /* number is a flag register */ - } - number &= 0x7F; - } - else if (flags & OPERAND_SPECIAL) - { - number = id; - } - - if (opers[i].X_op != O_register && opers[i].X_op != O_constant && !(flags & OPERAND_NAME)) - { - /* now create a fixup */ - - if (fixups->fc >= MAX_INSN_FIXUPS) - as_fatal (_("too many fixups")); - - fixups->fix[fixups->fc].reloc = - get_reloc ((struct d30v_operand *)&d30v_operand_table[form->operands[i]], op->reloc_flag); - fixups->fix[fixups->fc].size = 4; - fixups->fix[fixups->fc].exp = opers[i]; - fixups->fix[fixups->fc].operand = form->operands[i]; - if (fixups->fix[fixups->fc].reloc == BFD_RELOC_D30V_9_PCREL) - fixups->fix[fixups->fc].pcrel = RELOC_PCREL; - else - fixups->fix[fixups->fc].pcrel = op->reloc_flag; - (fixups->fc)++; - } - - /* truncate to the proper number of bits */ - if ((opers[i].X_op == O_constant) && check_range (number, bits, flags)) - as_bad (_("operand out of range: %d"),number); - if (bits < 31) - number &= 0x7FFFFFFF >> (31 - bits); - if (flags & OPERAND_SHIFT) - number >>= 3; - if (bits == 32) - { - /* it's a LONG instruction */ - insn |= ((number & 0xffffffff) >> 26); /* top 6 bits */ - insn <<= 32; /* shift the first word over */ - insn |= ((number & 0x03FC0000) << 2); /* next 8 bits */ - insn |= number & 0x0003FFFF; /* bottom 18 bits */ - } - else - insn |= number << shift; - } - return insn; -} - - -/* write out a long form instruction */ -static void -write_long (opcode, insn, fx) - struct d30v_insn *opcode; - long long insn; - Fixups *fx; -{ - int i, where; - char *f = frag_more (8); - - insn |= FM11; - d30v_number_to_chars (f, insn, 8); - - for (i=0; i < fx->fc; i++) - { - if (fx->fix[i].reloc) - { - where = f - frag_now->fr_literal; - fix_new_exp (frag_now, - where, - fx->fix[i].size, - &(fx->fix[i].exp), - fx->fix[i].pcrel, - fx->fix[i].reloc); - } - } - fx->fc = 0; -} - - -/* Write out a short form instruction by itself. */ -static void -write_1_short (opcode, insn, fx, use_sequential) - struct d30v_insn *opcode; - long long insn; - Fixups *fx; - int use_sequential; -{ - char *f = frag_more (8); - int i, where; - - if (warn_nops == NOP_ALL) - as_warn (_("%s NOP inserted"), use_sequential ? - _("sequential") : _("parallel")); - - /* The other container needs to be NOP. */ - if (use_sequential) - { - /* Use a sequential NOP rather than a parallel one, - as the current instruction is a FLAG_MUL32 type one - and the next instruction is a load. */ - - /* According to 4.3.1: for FM=01, sub-instructions performed - only by IU cannot be encoded in L-container. */ - - if (opcode->op->unit == IU) - insn |= FM10 | NOP_LEFT; /* right then left */ - else - insn = FM01 | (insn << 32) | NOP_RIGHT; /* left then right */ - } - else - { - /* According to 4.3.1: for FM=00, sub-instructions performed - only by IU cannot be encoded in L-container. */ - - if (opcode->op->unit == IU) - insn |= FM00 | NOP_LEFT; /* right container */ - else - insn = FM00 | (insn << 32) | NOP_RIGHT; /* left container */ - } - - d30v_number_to_chars (f, insn, 8); - - for (i=0; i < fx->fc; i++) - { - if (fx->fix[i].reloc) - { - where = f - frag_now->fr_literal; - fix_new_exp (frag_now, - where, - fx->fix[i].size, - &(fx->fix[i].exp), - fx->fix[i].pcrel, - fx->fix[i].reloc); - } - } - fx->fc = 0; -} - -/* Write out a short form instruction if possible. - Return number of instructions not written out. */ -static int -write_2_short (opcode1, insn1, opcode2, insn2, exec_type, fx) - struct d30v_insn *opcode1, *opcode2; - long long insn1, insn2; - exec_type_enum exec_type; - Fixups *fx; -{ - long long insn = NOP2; - char *f; - int i,j, where; - - if (exec_type == EXEC_SEQ - && (opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR)) - && ((opcode1->op->flags_used & FLAG_DELAY) == 0) - && ((opcode1->ecc == ECC_AL) || ! Optimizing)) - { - /* Unconditional, non-delayed branches kill instructions in - the right bin. Conditional branches don't always but if - we are not optimizing, then we have been asked to produce - an error about such constructs. For the purposes of this - test, subroutine calls are considered to be branches. */ - write_1_short (opcode1, insn1, fx->next, false); - return 1; - } - - /* Note: we do not have to worry about subroutine calls occuring - in the right hand container. The return address is always - aligned to the next 64 bit boundary, be that 64 or 32 bit away. */ - - switch (exec_type) - { - case EXEC_UNKNOWN: /* Order not specified. */ - if (Optimizing - && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type) - && ! ( (opcode1->op->unit == EITHER_BUT_PREFER_MU - || opcode1->op->unit == MU) - && - ( opcode2->op->unit == EITHER_BUT_PREFER_MU - || opcode2->op->unit == MU))) - { - /* parallel */ - exec_type = EXEC_PARALLEL; - - if (opcode1->op->unit == IU - || opcode2->op->unit == MU - || opcode2->op->unit == EITHER_BUT_PREFER_MU) - insn = FM00 | (insn2 << 32) | insn1; - else - { - insn = FM00 | (insn1 << 32) | insn2; - fx = fx->next; - } - } - else if ((opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR) - && ((opcode1->op->flags_used & FLAG_DELAY) == 0) - && ((opcode1->ecc == ECC_AL) || ! Optimizing)) - || opcode1->op->flags_used & FLAG_RP) - { - /* We must emit (non-delayed) branch type instructions - on their own with nothing in the right container. */ - /* We must treat repeat instructions likewise, since the - following instruction has to be separate from the repeat - in order to be repeated. */ - write_1_short (opcode1, insn1, fx->next, false); - return 1; - } - else if (prev_left_kills_right_p) - { - /* The left instruction kils the right slot, so we - must leave it empty. */ - write_1_short (opcode1, insn1, fx->next, false); - return 1; - } - else if (opcode1->op->unit == IU - || (opcode1->op->unit == EITHER - && opcode2->op->unit == EITHER_BUT_PREFER_MU)) - { - /* reverse sequential */ - insn = FM10 | (insn2 << 32) | insn1; - exec_type = EXEC_REVSEQ; - } - else - { - /* sequential */ - insn = FM01 | (insn1 << 32) | insn2; - fx = fx->next; - exec_type = EXEC_SEQ; - } - break; - - case EXEC_PARALLEL: /* parallel */ - flag_explicitly_parallel = flag_xp_state; - if (! parallel_ok (opcode1, insn1, opcode2, insn2, exec_type)) - as_bad (_("Instructions may not be executed in parallel")); - else if (opcode1->op->unit == IU) - { - if (opcode2->op->unit == IU) - as_bad (_("Two IU instructions may not be executed in parallel")); - as_warn (_("Swapping instruction order")); - insn = FM00 | (insn2 << 32) | insn1; - } - else if (opcode2->op->unit == MU) - { - if (opcode1->op->unit == MU) - as_bad (_("Two MU instructions may not be executed in parallel")); - else if (opcode1->op->unit == EITHER_BUT_PREFER_MU) - as_warn (_("Executing %s in IU may not work"), opcode1->op->name); - as_warn (_("Swapping instruction order")); - insn = FM00 | (insn2 << 32) | insn1; - } - else - { - if (opcode2->op->unit == EITHER_BUT_PREFER_MU) - as_warn (_("Executing %s in IU may not work"), opcode2->op->name); - - insn = FM00 | (insn1 << 32) | insn2; - fx = fx->next; - } - flag_explicitly_parallel = 0; - break; - - case EXEC_SEQ: /* sequential */ - if (opcode1->op->unit == IU) - as_bad (_("IU instruction may not be in the left container")); - if (prev_left_kills_right_p) - as_bad (_("special left instruction `%s' kills instruction " - "`%s' in right container"), - opcode1->op->name, opcode2->op->name); - if (opcode2->op->unit == EITHER_BUT_PREFER_MU) - as_warn (_("Executing %s in IU may not work"), opcode2->op->name); - insn = FM01 | (insn1 << 32) | insn2; - fx = fx->next; - break; - - case EXEC_REVSEQ: /* reverse sequential */ - if (opcode2->op->unit == MU) - as_bad (_("MU instruction may not be in the right container")); - if (opcode2->op->unit == EITHER_BUT_PREFER_MU) - as_warn (_("Executing %s in IU may not work"), opcode2->op->name); - insn = FM10 | (insn1 << 32) | insn2; - fx = fx->next; - break; - - default: - as_fatal (_("unknown execution type passed to write_2_short()")); - } - - /* printf ("writing out %llx\n",insn); */ - f = frag_more (8); - d30v_number_to_chars (f, insn, 8); - - /* If the previous instruction was a 32-bit multiply but it is put into a - parallel container, mark the current instruction as being a 32-bit - multiply. */ - if (prev_mul32_p && exec_type == EXEC_PARALLEL) - cur_mul32_p = 1; - - for (j=0; j<2; j++) - { - for (i=0; i < fx->fc; i++) - { - if (fx->fix[i].reloc) - { - where = (f - frag_now->fr_literal) + 4*j; - - fix_new_exp (frag_now, - where, - fx->fix[i].size, - &(fx->fix[i].exp), - fx->fix[i].pcrel, - fx->fix[i].reloc); - } - } - - fx->fc = 0; - fx = fx->next; - } - - return 0; -} - - -/* Check 2 instructions and determine if they can be safely */ -/* executed in parallel. Returns 1 if they can be. */ -static int -parallel_ok (op1, insn1, op2, insn2, exec_type) - struct d30v_insn *op1, *op2; - unsigned long insn1, insn2; - exec_type_enum exec_type; -{ - int i, j, shift, regno, bits, ecc; - unsigned long flags, mask, flags_set1, flags_set2, flags_used1, flags_used2; - unsigned long ins, mod_reg[2][3], used_reg[2][3], flag_reg[2]; - struct d30v_format *f; - struct d30v_opcode *op; - - /* section 4.3: both instructions must not be IU or MU only */ - if ((op1->op->unit == IU && op2->op->unit == IU) - || (op1->op->unit == MU && op2->op->unit == MU)) - return 0; - - /* first instruction must not be a jump to safely optimize, unless this - is an explicit parallel operation. */ - if (exec_type != EXEC_PARALLEL - && (op1->op->flags_used & (FLAG_JMP | FLAG_JSR))) - return 0; - - /* If one instruction is /TX or /XT and the other is /FX or /XF respectively, - then it is safe to allow the two to be done as parallel ops, since only - one will ever be executed at a time. */ - if ((op1->ecc == ECC_TX && op2->ecc == ECC_FX) - || (op1->ecc == ECC_FX && op2->ecc == ECC_TX) - || (op1->ecc == ECC_XT && op2->ecc == ECC_XF) - || (op1->ecc == ECC_XF && op2->ecc == ECC_XT)) - return 1; - - /* [0] r0-r31 - [1] r32-r63 - [2] a0, a1, flag registers */ - - for (j = 0; j < 2; j++) - { - if (j == 0) - { - f = op1->form; - op = op1->op; - ecc = op1->ecc; - ins = insn1; - } - else - { - f = op2->form; - op = op2->op; - ecc = op2->ecc; - ins = insn2; - } - flag_reg[j] = 0; - mod_reg[j][0] = mod_reg[j][1] = 0; - used_reg[j][0] = used_reg[j][1] = 0; - - if (flag_explicitly_parallel) - { - /* For human specified parallel instructions we have been asked - to ignore the possibility that both instructions could modify - bits in the PSW, so we initialise the mod & used arrays to 0. - We have been asked, however, to refuse to allow parallel - instructions which explicitly set the same flag register, - eg "cmpne f0,r1,0x10 || cmpeq f0, r5, 0x2", so further on we test - for the use of a flag register and set a bit in the mod or used - array appropriately. */ - - mod_reg[j][2] = 0; - used_reg[j][2] = 0; - } - else - { - mod_reg[j][2] = (op->flags_set & FLAG_ALL); - used_reg[j][2] = (op->flags_used & FLAG_ALL); - } - - /* BSR/JSR always sets R62 */ - if (op->flags_used & FLAG_JSR) - mod_reg[j][1] = (1L << (62-32)); - - /* conditional execution affects the flags_used */ - switch (ecc) - { - case ECC_TX: - case ECC_FX: - used_reg[j][2] |= flag_reg[j] = FLAG_0; - break; - - case ECC_XT: - case ECC_XF: - used_reg[j][2] |= flag_reg[j] = FLAG_1; - break; - - case ECC_TT: - case ECC_TF: - used_reg[j][2] |= flag_reg[j] = (FLAG_0 | FLAG_1); - break; - } - - for (i = 0; f->operands[i]; i++) - { - flags = d30v_operand_table[f->operands[i]].flags; - shift = 12 - d30v_operand_table[f->operands[i]].position; - bits = d30v_operand_table[f->operands[i]].bits; - if (bits == 32) - mask = 0xffffffff; - else - mask = 0x7FFFFFFF >> (31 - bits); - - if ((flags & OPERAND_PLUS) || (flags & OPERAND_MINUS)) - { - /* this is a post-increment or post-decrement */ - /* the previous register needs to be marked as modified */ - - shift = 12 - d30v_operand_table[f->operands[i-1]].position; - regno = (ins >> shift) & 0x3f; - if (regno >= 32) - mod_reg[j][1] |= 1L << (regno - 32); - else - mod_reg[j][0] |= 1L << regno; - } - else if (flags & OPERAND_REG) - { - regno = (ins >> shift) & mask; - /* the memory write functions don't have a destination register */ - if ((flags & OPERAND_DEST) && !(op->flags_set & FLAG_MEM)) - { - /* MODIFIED registers and flags */ - if (flags & OPERAND_ACC) - { - if (regno == 0) - mod_reg[j][2] |= FLAG_A0; - else if (regno == 1) - mod_reg[j][2] |= FLAG_A1; - else - abort (); - } - else if (flags & OPERAND_FLAG) - mod_reg[j][2] |= 1L << regno; - else if (!(flags & OPERAND_CONTROL)) - { - int r, z; - - /* need to check if there are two destination */ - /* registers, for example ld2w */ - if (flags & OPERAND_2REG) - z = 1; - else - z = 0; - - for (r = regno; r <= regno + z; r++) - { - if (r >= 32) - mod_reg[j][1] |= 1L << (r - 32); - else - mod_reg[j][0] |= 1L << r; - } - } - } - else - { - /* USED, but not modified registers and flags */ - if (flags & OPERAND_ACC) - { - if (regno == 0) - used_reg[j][2] |= FLAG_A0; - else if (regno == 1) - used_reg[j][2] |= FLAG_A1; - else - abort (); - } - else if (flags & OPERAND_FLAG) - used_reg[j][2] |= 1L << regno; - else if (!(flags & OPERAND_CONTROL)) - { - int r, z; - - /* need to check if there are two source */ - /* registers, for example st2w */ - if (flags & OPERAND_2REG) - z = 1; - else - z = 0; - - for (r = regno; r <= regno + z; r++) - { - if (r >= 32) - used_reg[j][1] |= 1L << (r - 32); - else - used_reg[j][0] |= 1L << r; - } - } - } - } - } - } - - flags_set1 = op1->op->flags_set; - flags_set2 = op2->op->flags_set; - flags_used1 = op1->op->flags_used; - flags_used2 = op2->op->flags_used; - - /* Check for illegal combinations with ADDppp/SUBppp. */ - if (((flags_set1 & FLAG_NOT_WITH_ADDSUBppp) != 0 - && (flags_used2 & FLAG_ADDSUBppp) != 0) - || ((flags_set2 & FLAG_NOT_WITH_ADDSUBppp) != 0 - && (flags_used1 & FLAG_ADDSUBppp) != 0)) - return 0; - - /* Load instruction combined with half-word multiply is illegal. */ - if (((flags_used1 & FLAG_MEM) != 0 && (flags_used2 & FLAG_MUL16)) - || ((flags_used2 & FLAG_MEM) != 0 && (flags_used1 & FLAG_MUL16))) - return 0; - - /* Specifically allow add || add by removing carry, overflow bits dependency. - This is safe, even if an addc follows since the IU takes the argument in - the right container, and it writes its results last. - However, don't paralellize add followed by addc or sub followed by - subb. */ - - if (mod_reg[0][2] == FLAG_CVVA && mod_reg[1][2] == FLAG_CVVA - && (used_reg[0][2] & ~flag_reg[0]) == 0 - && (used_reg[1][2] & ~flag_reg[1]) == 0 - && op1->op->unit == EITHER && op2->op->unit == EITHER) - { - mod_reg[0][2] = mod_reg[1][2] = 0; - } - - for (j = 0; j < 3; j++) - { - /* If the second instruction depends on the first, we obviously - cannot parallelize. Note, the mod flag implies use, so - check that as well. */ - /* If flag_explicitly_parallel is set, then the case of the - second instruction using a register the first instruction - modifies is assumed to be okay; we trust the human. We - don't trust the human if both instructions modify the same - register but we do trust the human if they modify the same - flags. */ - /* We have now been requested not to trust the human if the - instructions modify the same flag registers either. */ - if (flag_explicitly_parallel) - { - if ((mod_reg[0][j] & mod_reg[1][j]) != 0) - return 0; - } - else - if ((mod_reg[0][j] & (mod_reg[1][j] | used_reg[1][j])) != 0) - return 0; - } - - return 1; -} - - -/* This is the main entry point for the machine-dependent assembler. str points to a - machine-dependent instruction. This function is supposed to emit the frags/bytes - it assembles to. For the D30V, it mostly handles the special VLIW parsing and packing - and leaves the difficult stuff to do_assemble(). */ - -static long long prev_insn = -1; -static struct d30v_insn prev_opcode; -static subsegT prev_subseg; -static segT prev_seg = 0; - -void -md_assemble (str) - char *str; -{ - struct d30v_insn opcode; - long long insn; - exec_type_enum extype = EXEC_UNKNOWN; /* execution type; parallel, etc */ - static exec_type_enum etype = EXEC_UNKNOWN; /* saved extype. used for multiline instructions */ - char *str2; - - if ((prev_insn != -1) && prev_seg - && ((prev_seg != now_seg) || (prev_subseg != now_subseg))) - d30v_cleanup (false); - - if (d30v_current_align < 3) - d30v_align (3, NULL, d30v_last_label); - else if (d30v_current_align > 3) - d30v_current_align = 3; - d30v_last_label = NULL; - - flag_explicitly_parallel = 0; - flag_xp_state = 0; - if (etype == EXEC_UNKNOWN) - { - /* look for the special multiple instruction separators */ - str2 = strstr (str, "||"); - if (str2) - { - extype = EXEC_PARALLEL; - flag_xp_state = 1; - } - else - { - str2 = strstr (str, "->"); - if (str2) - extype = EXEC_SEQ; - else - { - str2 = strstr (str, "<-"); - if (str2) - extype = EXEC_REVSEQ; - } - } - /* str2 points to the separator, if one */ - if (str2) - { - *str2 = 0; - - /* if two instructions are present and we already have one saved - then first write it out */ - d30v_cleanup (false); - - /* Assemble first instruction and save it. */ - prev_insn = do_assemble (str, &prev_opcode, 1, 0); - if (prev_insn == -1) - as_bad (_("Cannot assemble instruction")); - if (prev_opcode.form != NULL && prev_opcode.form->form >= LONG) - as_bad (_("First opcode is long. Unable to mix instructions as specified.")); - fixups = fixups->next; - str = str2 + 2; - prev_seg = now_seg; - prev_subseg = now_subseg; - } - } - - insn = do_assemble (str, &opcode, - (extype != EXEC_UNKNOWN || etype != EXEC_UNKNOWN), - extype == EXEC_PARALLEL); - if (insn == -1) - { - if (extype != EXEC_UNKNOWN) - etype = extype; - as_bad (_("Cannot assemble instruction")); - return; - } - - if (etype != EXEC_UNKNOWN) - { - extype = etype; - etype = EXEC_UNKNOWN; - } - - /* Word multiply instructions must not be followed by either a load or a - 16-bit multiply instruction in the next cycle. */ - if ( (extype != EXEC_REVSEQ) - && prev_mul32_p - && (opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16))) - { - /* However, load and multiply should able to be combined in a parallel - operation, so check for that first. */ - if (prev_insn != -1 - && (opcode.op->flags_used & FLAG_MEM) - && opcode.form->form < LONG - && (extype == EXEC_PARALLEL || (Optimizing && extype == EXEC_UNKNOWN)) - && parallel_ok (&prev_opcode, (long)prev_insn, - &opcode, (long)insn, extype) - && write_2_short (&prev_opcode, (long)prev_insn, - &opcode, (long)insn, extype, fixups) == 0) - { - /* no instructions saved */ - prev_insn = -1; - return; - } - else - { - /* Can't parallelize, flush previous instruction and emit a word of NOPS, - unless the previous instruction is a NOP, in which case just flush it, - as this will generate a word of NOPs for us. */ - - if (prev_insn != -1 && (strcmp (prev_opcode.op->name, "nop") == 0)) - d30v_cleanup (false); - else - { - char * f; - - if (prev_insn != -1) - d30v_cleanup (true); - else - { - f = frag_more (8); - d30v_number_to_chars (f, NOP2, 8); - - if (warn_nops == NOP_ALL || warn_nops == NOP_MULTIPLY) - { - if (opcode.op->flags_used & FLAG_MEM) - as_warn (_("word of NOPs added between word multiply and load")); - else - as_warn (_("word of NOPs added between word multiply and 16-bit multiply")); - } - } - } - - extype = EXEC_UNKNOWN; - } - } - else if ( (extype == EXEC_REVSEQ) - && cur_mul32_p - && (prev_opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16))) - { - /* Can't parallelize, flush current instruction and add a sequential NOP. */ - write_1_short (& opcode, (long) insn, fixups->next->next, true); - - /* Make the previous instruction the current one. */ - extype = EXEC_UNKNOWN; - insn = prev_insn; - now_seg = prev_seg; - now_subseg = prev_subseg; - prev_insn = -1; - cur_mul32_p = prev_mul32_p; - prev_mul32_p = 0; - memcpy (&opcode, &prev_opcode, sizeof (prev_opcode)); - } - - /* If this is a long instruction, write it and any previous short instruction. */ - if (opcode.form->form >= LONG) - { - if (extype != EXEC_UNKNOWN) - as_bad (_("Instruction uses long version, so it cannot be mixed as specified")); - d30v_cleanup (false); - write_long (& opcode, insn, fixups); - prev_insn = -1; - } - else if ((prev_insn != -1) - && (write_2_short - (& prev_opcode, (long) prev_insn, & opcode, - (long) insn, extype, fixups) == 0)) - { - /* No instructions saved. */ - prev_insn = -1; - } - else - { - if (extype != EXEC_UNKNOWN) - as_bad (_("Unable to mix instructions as specified")); - - /* Save off last instruction so it may be packed on next pass. */ - memcpy (&prev_opcode, &opcode, sizeof (prev_opcode)); - prev_insn = insn; - prev_seg = now_seg; - prev_subseg = now_subseg; - fixups = fixups->next; - prev_mul32_p = cur_mul32_p; - } -} - - -/* do_assemble assembles a single instruction and returns an opcode */ -/* it returns -1 (an invalid opcode) on error */ - -#define NAME_BUF_LEN 20 - -static long long -do_assemble (str, opcode, shortp, is_parallel) - char *str; - struct d30v_insn *opcode; - int shortp; - int is_parallel; -{ - unsigned char * op_start; - unsigned char * save; - unsigned char * op_end; - char name [NAME_BUF_LEN]; - int cmp_hack; - int nlen = 0; - int fsize = (shortp ? FORCE_SHORT : 0); - expressionS myops [6]; - long long insn; - - /* Drop leading whitespace */ - while (* str == ' ') - str ++; - - /* find the opcode end */ - for (op_start = op_end = (unsigned char *) (str); - * op_end - && nlen < (NAME_BUF_LEN - 1) - && * op_end != '/' - && !is_end_of_line[*op_end] && *op_end != ' '; - op_end++) - { - name[nlen] = tolower (op_start[nlen]); - nlen++; - } - - if (nlen == 0) - return -1; - - name[nlen] = 0; - - /* if there is an execution condition code, handle it */ - if (*op_end == '/') - { - int i = 0; - while ( (i < ECC_MAX) && strncasecmp (d30v_ecc_names[i], op_end + 1, 2)) - i++; - - if (i == ECC_MAX) - { - char tmp[4]; - strncpy (tmp, op_end + 1, 2); - tmp[2] = 0; - as_bad (_("unknown condition code: %s"),tmp); - return -1; - } - /* printf ("condition code=%d\n",i); */ - opcode->ecc = i; - op_end += 3; - } - else - opcode->ecc = ECC_AL; - - - /* CMP and CMPU change their name based on condition codes */ - if (!strncmp (name, "cmp", 3)) - { - int p,i; - char **str = (char **)d30v_cc_names; - if (name[3] == 'u') - p = 4; - else - p = 3; - - for (i=1; *str && strncmp (*str, & name[p], 2); i++, str++) - ; - - /* cmpu only supports some condition codes */ - if (p == 4) - { - if (i < 3 || i > 6) - { - name[p+2]=0; - as_bad (_("cmpu doesn't support condition code %s"),&name[p]); - } - } - - if (!*str) - { - name[p+2]=0; - as_bad (_("unknown condition code: %s"),&name[p]); - } - - cmp_hack = i; - name[p] = 0; - } - else - cmp_hack = 0; - - /* printf("cmp_hack=%d\n",cmp_hack); */ - - /* need to look for .s or .l */ - if (name[nlen-2] == '.') - { - switch (name[nlen-1]) - { - case 's': - fsize = FORCE_SHORT; - break; - case 'l': - fsize = FORCE_LONG; - break; - } - name[nlen-2] = 0; - } - - /* find the first opcode with the proper name */ - opcode->op = (struct d30v_opcode *)hash_find (d30v_hash, name); - if (opcode->op == NULL) - { - as_bad (_("unknown opcode: %s"),name); - return -1; - } - - save = input_line_pointer; - input_line_pointer = op_end; - while (!(opcode->form = find_format (opcode->op, myops, fsize, cmp_hack))) - { - opcode->op++; - if (opcode->op->name == NULL || strcmp (opcode->op->name, name)) - { - as_bad (_("operands for opcode `%s' do not match any valid format"), name); - return -1; - } - } - input_line_pointer = save; - - insn = build_insn (opcode, myops); - - /* Propigate multiply status */ - if (insn != -1) - { - if (is_parallel && prev_mul32_p) - cur_mul32_p = 1; - else - { - prev_mul32_p = cur_mul32_p; - cur_mul32_p = (opcode->op->flags_used & FLAG_MUL32) != 0; - } - } - - /* Propagate left_kills_right status */ - if (insn != -1) - { - prev_left_kills_right_p = cur_left_kills_right_p; - - if (opcode->op->flags_set & FLAG_LKR) - { - cur_left_kills_right_p = 1; - - if (strcmp (opcode->op->name, "mvtsys") == 0) - { - /* Left kills right for only mvtsys only for PSW/PSWH/PSWL/flags target. */ - if ((myops[0].X_op == O_register) && - ((myops[0].X_add_number == OPERAND_CONTROL) || /* psw */ - (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+2) || /* pswh */ - (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+1) || /* pswl */ - (myops[0].X_add_number == OPERAND_FLAG+0) || /* f0 */ - (myops[0].X_add_number == OPERAND_FLAG+1) || /* f1 */ - (myops[0].X_add_number == OPERAND_FLAG+2) || /* f2 */ - (myops[0].X_add_number == OPERAND_FLAG+3) || /* f3 */ - (myops[0].X_add_number == OPERAND_FLAG+4) || /* f4 */ - (myops[0].X_add_number == OPERAND_FLAG+5) || /* f5 */ - (myops[0].X_add_number == OPERAND_FLAG+6) || /* f6 */ - (myops[0].X_add_number == OPERAND_FLAG+7))) /* f7 */ - { - cur_left_kills_right_p = 1; - } - else - { - /* Other mvtsys target registers don't kill right instruction. */ - cur_left_kills_right_p = 0; - } - } /* mvtsys */ - } - else - cur_left_kills_right_p = 0; - } - - return insn; -} - - -/* find_format() gets a pointer to an entry in the format table. - It must look at all formats for an opcode and use the operands - to choose the correct one. Returns NULL on error. */ - -static struct d30v_format * -find_format (opcode, myops, fsize, cmp_hack) - struct d30v_opcode *opcode; - expressionS myops[]; - int fsize; - int cmp_hack; -{ - int numops, match, index, i=0, j, k; - struct d30v_format *fm; - - if (opcode == NULL) - return NULL; - - /* Get all the operands and save them as expressions. */ - numops = get_operands (myops, cmp_hack); - - while ((index = opcode->format[i++]) != 0) - { - if (fsize == FORCE_SHORT && index >= LONG) - continue; - - if (fsize == FORCE_LONG && index < LONG) - continue; - - fm = (struct d30v_format *)&d30v_format_table[index]; - k = index; - while (fm->form == index) - { - match = 1; - /* Now check the operands for compatibility. */ - for (j = 0; match && fm->operands[j]; j++) - { - int flags = d30v_operand_table[fm->operands[j]].flags; - int bits = d30v_operand_table[fm->operands[j]].bits; - int X_op = myops[j].X_op; - int num = myops[j].X_add_number; - - if (flags & OPERAND_SPECIAL) - break; - else if (X_op == O_illegal) - match = 0; - else if (flags & OPERAND_REG) - { - if (X_op != O_register - || ((flags & OPERAND_ACC) && !(num & OPERAND_ACC)) - || (!(flags & OPERAND_ACC) && (num & OPERAND_ACC)) - || ((flags & OPERAND_FLAG) && !(num & OPERAND_FLAG)) - || (!(flags & (OPERAND_FLAG | OPERAND_CONTROL)) && (num & OPERAND_FLAG)) - || ((flags & OPERAND_CONTROL) - && !(num & (OPERAND_CONTROL | OPERAND_FLAG)))) - { - match = 0; - } - } - else if (((flags & OPERAND_MINUS) - && (X_op != O_absent || num != OPERAND_MINUS)) - || ((flags & OPERAND_PLUS) - && (X_op != O_absent || num != OPERAND_PLUS)) - || ((flags & OPERAND_ATMINUS) - && (X_op != O_absent || num != OPERAND_ATMINUS)) - || ((flags & OPERAND_ATPAR) - && (X_op != O_absent || num != OPERAND_ATPAR)) - || ((flags & OPERAND_ATSIGN) - && (X_op != O_absent || num != OPERAND_ATSIGN))) - { - match=0; - } - else if (flags & OPERAND_NUM) - { - /* A number can be a constant or symbol expression. */ - - /* If we have found a register name, but that name also - matches a symbol, then re-parse the name as an expression. */ - if (X_op == O_register - && symbol_find ((char *) myops[j].X_op_symbol)) - { - input_line_pointer = (char *) myops[j].X_op_symbol; - expression (& myops[j]); - } - - /* Turn an expression into a symbol for later resolution. */ - if (X_op != O_absent && X_op != O_constant - && X_op != O_symbol && X_op != O_register - && X_op != O_big) - { - symbolS *sym = make_expr_symbol (&myops[j]); - myops[j].X_op = X_op = O_symbol; - myops[j].X_add_symbol = sym; - myops[j].X_add_number = num = 0; - } - - if (fm->form >= LONG) - { - /* If we're testing for a LONG format, either fits. */ - if (X_op != O_constant && X_op != O_symbol) - match = 0; - } - else if (fm->form < LONG - && ((fsize == FORCE_SHORT && X_op == O_symbol) - || (fm->form == SHORT_D2 && j == 0))) - match = 1; - /* This is the tricky part. Will the constant or symbol - fit into the space in the current format? */ - else if (X_op == O_constant) - { - if (check_range (num, bits, flags)) - match = 0; - } - else if (X_op == O_symbol - && S_IS_DEFINED (myops[j].X_add_symbol) - && S_GET_SEGMENT (myops[j].X_add_symbol) == now_seg - && opcode->reloc_flag == RELOC_PCREL) - { - /* If the symbol is defined, see if the value will fit - into the form we're considering. */ - fragS *f; - long value; - - /* Calculate the current address by running through the - previous frags and adding our current offset. */ - value = 0; - for (f = frchain_now->frch_root; f; f = f->fr_next) - value += f->fr_fix + f->fr_offset; - value = (S_GET_VALUE (myops[j].X_add_symbol) - value - - (obstack_next_free (&frchain_now->frch_obstack) - - frag_now->fr_literal)); - if (check_range (value, bits, flags)) - match = 0; - } - else - match = 0; - } - } - /* printf("through the loop: match=%d\n",match); */ - /* We're only done if the operands matched so far AND there - are no more to check. */ - if (match && myops[j].X_op == 0) - { - /* Final check - issue a warning if an odd numbered register - is used as the first register in an instruction that reads - or writes 2 registers. */ - - for (j = 0; fm->operands[j]; j++) - if (myops[j].X_op == O_register - && (myops[j].X_add_number & 1) - && (d30v_operand_table[fm->operands[j]].flags & OPERAND_2REG)) - as_warn (\ -_("Odd numbered register used as target of multi-register instruction")); - - return fm; - } - fm = (struct d30v_format *)&d30v_format_table[++k]; - } - /* printf("trying another format: i=%d\n",i); */ - } - return NULL; -} - -/* if while processing a fixup, a reloc really needs to be created */ -/* then it is done here */ - -arelent * -tc_gen_reloc (seg, fixp) - asection *seg; - fixS *fixp; -{ - arelent *reloc; - reloc = (arelent *) xmalloc (sizeof (arelent)); - reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); - reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); - if (reloc->howto == (reloc_howto_type *) NULL) - { - as_bad_where (fixp->fx_file, fixp->fx_line, - _("reloc %d not supported by object file format"), (int)fixp->fx_r_type); - return NULL; - } - reloc->addend = fixp->fx_addnumber; - return reloc; -} - -int -md_estimate_size_before_relax (fragp, seg) - fragS *fragp; - asection *seg; -{ - abort (); - return 0; -} - -long -md_pcrel_from_section (fixp, sec) - fixS *fixp; - segT sec; -{ - if (fixp->fx_addsy != (symbolS *)NULL && (!S_IS_DEFINED (fixp->fx_addsy) || - (S_GET_SEGMENT (fixp->fx_addsy) != sec))) - return 0; - return fixp->fx_frag->fr_address + fixp->fx_where; -} - -int -md_apply_fix3 (fixp, valuep, seg) - fixS * fixp; - valueT * valuep; - segT seg; -{ - char * where; - unsigned long insn, insn2; - long value; - - if (fixp->fx_addsy == (symbolS *) NULL) - { - value = * valuep; - fixp->fx_done = 1; - } - else if (fixp->fx_pcrel) - value = * valuep; - else - { - value = fixp->fx_offset; - - if (fixp->fx_subsy != (symbolS *) NULL) - { - if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section) - value -= S_GET_VALUE (fixp->fx_subsy); - else - { - /* We don't actually support subtracting a symbol. */ - as_bad_where (fixp->fx_file, fixp->fx_line, - _("expression too complex")); - } - } - } - - /* Fetch the instruction, insert the fully resolved operand - value, and stuff the instruction back again. */ - where = fixp->fx_frag->fr_literal + fixp->fx_where; - insn = bfd_getb32 ((unsigned char *) where); - - switch (fixp->fx_r_type) - { - case BFD_RELOC_8: /* Check for a bad .byte directive. */ - if (fixp->fx_addsy != NULL) - as_bad (_("line %d: unable to place address of symbol '%s' into a byte"), - fixp->fx_line, S_GET_NAME (fixp->fx_addsy)); - else if (((unsigned)value) > 0xff) - as_bad (_("line %d: unable to place value %x into a byte"), - fixp->fx_line, value); - else - * (unsigned char *) where = value; - break; - - case BFD_RELOC_16: /* Check for a bad .short directive. */ - if (fixp->fx_addsy != NULL) - as_bad (_("line %d: unable to place address of symbol '%s' into a short"), - fixp->fx_line, S_GET_NAME (fixp->fx_addsy)); - else if (((unsigned)value) > 0xffff) - as_bad (_("line %d: unable to place value %x into a short"), - fixp->fx_line, value); - else - bfd_putb16 ((bfd_vma) value, (unsigned char *) where); - break; - - case BFD_RELOC_64: /* Check for a bad .quad directive. */ - if (fixp->fx_addsy != NULL) - as_bad (_("line %d: unable to place address of symbol '%s' into a quad"), - fixp->fx_line, S_GET_NAME (fixp->fx_addsy)); - else - { - bfd_putb32 ((bfd_vma) value, (unsigned char *) where); - bfd_putb32 (0, ((unsigned char *) where) + 4); - } - break; - - case BFD_RELOC_D30V_6: - check_size (value, 6, fixp->fx_file, fixp->fx_line); - insn |= value & 0x3F; - bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); - break; - - case BFD_RELOC_D30V_9_PCREL: - if (fixp->fx_where & 0x7) - { - if (fixp->fx_done) - value += 4; - else - fixp->fx_r_type = BFD_RELOC_D30V_9_PCREL_R; - } - check_size (value, 9, fixp->fx_file, fixp->fx_line); - insn |= ((value >> 3) & 0x3F) << 12; - bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); - break; - - case BFD_RELOC_D30V_15: - check_size (value, 15, fixp->fx_file, fixp->fx_line); - insn |= (value >> 3) & 0xFFF; - bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); - break; - - case BFD_RELOC_D30V_15_PCREL: - if (fixp->fx_where & 0x7) - { - if (fixp->fx_done) - value += 4; - else - fixp->fx_r_type = BFD_RELOC_D30V_15_PCREL_R; - } - check_size (value, 15, fixp->fx_file, fixp->fx_line); - insn |= (value >> 3) & 0xFFF; - bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); - break; - - case BFD_RELOC_D30V_21: - check_size (value, 21, fixp->fx_file, fixp->fx_line); - insn |= (value >> 3) & 0x3FFFF; - bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); - break; - - case BFD_RELOC_D30V_21_PCREL: - if (fixp->fx_where & 0x7) - { - if (fixp->fx_done) - value += 4; - else - fixp->fx_r_type = BFD_RELOC_D30V_21_PCREL_R; - } - check_size (value, 21, fixp->fx_file, fixp->fx_line); - insn |= (value >> 3) & 0x3FFFF; - bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); - break; - - case BFD_RELOC_D30V_32: - insn2 = bfd_getb32 ((unsigned char *) where + 4); - insn |= (value >> 26) & 0x3F; /* top 6 bits */ - insn2 |= ((value & 0x03FC0000) << 2); /* next 8 bits */ - insn2 |= value & 0x0003FFFF; /* bottom 18 bits */ - bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); - bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4); - break; - - case BFD_RELOC_D30V_32_PCREL: - insn2 = bfd_getb32 ((unsigned char *) where + 4); - insn |= (value >> 26) & 0x3F; /* top 6 bits */ - insn2 |= ((value & 0x03FC0000) << 2); /* next 8 bits */ - insn2 |= value & 0x0003FFFF; /* bottom 18 bits */ - bfd_putb32 ((bfd_vma) insn, (unsigned char *) where); - bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4); - break; - - case BFD_RELOC_32: - bfd_putb32 ((bfd_vma) value, (unsigned char *) where); - break; - - default: - as_bad (_("line %d: unknown relocation type: 0x%x"), - fixp->fx_line,fixp->fx_r_type); - } - - return 0; -} - - -/* d30v_cleanup() is called after the assembler has finished parsing the input - file or after a label is defined. Because the D30V assembler sometimes saves short - instructions to see if it can package them with the next instruction, there may - be a short instruction that still needs written. */ -int -d30v_cleanup (use_sequential) - int use_sequential; -{ - segT seg; - subsegT subseg; - - if (prev_insn != -1) - { - seg = now_seg; - subseg = now_subseg; - subseg_set (prev_seg, prev_subseg); - write_1_short (&prev_opcode, (long)prev_insn, fixups->next, use_sequential); - subseg_set (seg, subseg); - prev_insn = -1; - if (use_sequential) - prev_mul32_p = false; - } - return 1; -} - -static void -d30v_number_to_chars (buf, value, n) - char *buf; /* Return 'nbytes' of chars here. */ - long long value; /* The value of the bits. */ - int n; /* Number of bytes in the output. */ -{ - while (n--) - { - buf[n] = value & 0xff; - value >>= 8; - } -} - - -/* This function is called at the start of every line. */ -/* it checks to see if the first character is a '.' */ -/* which indicates the start of a pseudo-op. If it is, */ -/* then write out any unwritten instructions */ - -void -d30v_start_line () -{ - char *c = input_line_pointer; - - while (isspace (*c)) - c++; - - if (*c == '.') - d30v_cleanup (false); -} - -static void -check_size (value, bits, file, line) - long value; - int bits; - char *file; - int line; -{ - int tmp, max; - - if (value < 0) - tmp = ~value; - else - tmp = value; - - max = (1 << (bits - 1)) - 1; - - if (tmp > max) - as_bad_where (file, line, _("value too large to fit in %d bits"), bits); - - return; -} - -/* d30v_frob_label() is called when after a label is recognized. */ - -void -d30v_frob_label (lab) - symbolS *lab; -{ - /* Emit any pending instructions. */ - d30v_cleanup (false); - - /* Update the label's address with the current output pointer. */ - symbol_set_frag (lab, frag_now); - S_SET_VALUE (lab, (valueT) frag_now_fix ()); - - /* Record this label for future adjustment after we find out what - kind of data it references, and the required alignment therewith. */ - d30v_last_label = lab; -} - -/* Hook into cons for capturing alignment changes. */ - -void -d30v_cons_align (size) - int size; -{ - int log_size; - - log_size = 0; - while ((size >>= 1) != 0) - ++log_size; - - if (d30v_current_align < log_size) - d30v_align (log_size, (char *) NULL, NULL); - else if (d30v_current_align > log_size) - d30v_current_align = log_size; - d30v_last_label = NULL; -} - -/* Called internally to handle all alignment needs. This takes care - of eliding calls to frag_align if'n the cached current alignment - says we've already got it, as well as taking care of the auto-aligning - labels wrt code. */ - -static void -d30v_align (n, pfill, label) - int n; - char *pfill; - symbolS *label; -{ - /* The front end is prone to changing segments out from under us - temporarily when -g is in effect. */ - int switched_seg_p = (d30v_current_align_seg != now_seg); - - /* Do not assume that if 'd30v_current_align >= n' and - '! switched_seg_p' that it is safe to avoid performing - this alignement request. The alignment of the current frag - can be changed under our feet, for example by a .ascii - directive in the source code. cf testsuite/gas/d30v/reloc.s */ - - d30v_cleanup (false); - - if (pfill == NULL) - { - if (n > 2 - && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0) - { - static char const nop[4] = { 0x00, 0xf0, 0x00, 0x00 }; - - /* First, make sure we're on a four-byte boundary, in case - someone has been putting .byte values the text section. */ - if (d30v_current_align < 2 || switched_seg_p) - frag_align (2, 0, 0); - frag_align_pattern (n, nop, sizeof nop, 0); - } - else - frag_align (n, 0, 0); - } - else - frag_align (n, *pfill, 0); - - if (!switched_seg_p) - d30v_current_align = n; - - if (label != NULL) - { - symbolS * sym; - int label_seen = false; - struct frag * old_frag; - valueT old_value; - valueT new_value; - - assert (S_GET_SEGMENT (label) == now_seg); - - old_frag = symbol_get_frag (label); - old_value = S_GET_VALUE (label); - new_value = (valueT) frag_now_fix (); - - /* It is possible to have more than one label at a particular - address, especially if debugging is enabled, so we must - take care to adjust all the labels at this address in this - fragment. To save time we search from the end of the symbol - list, backwards, since the symbols we are interested in are - almost certainly the ones that were most recently added. - Also to save time we stop searching once we have seen at least - one matching label, and we encounter a label that is no longer - in the target fragment. Note, this search is guaranteed to - find at least one match when sym == label, so no special case - code is necessary. */ - for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym)) - { - if (symbol_get_frag (sym) == old_frag - && S_GET_VALUE (sym) == old_value) - { - label_seen = true; - symbol_set_frag (sym, frag_now); - S_SET_VALUE (sym, new_value); - } - else if (label_seen && symbol_get_frag (sym) != old_frag) - break; - } - } - - record_alignment (now_seg, n); -} - -/* Handle the .align pseudo-op. This aligns to a power of two. We - hook here to latch the current alignment. */ - -static void -s_d30v_align (ignore) - int ignore; -{ - int align; - char fill, *pfill = NULL; - long max_alignment = 15; - - align = get_absolute_expression (); - if (align > max_alignment) - { - align = max_alignment; - as_warn (_("Alignment too large: %d assumed"), align); - } - else if (align < 0) - { - as_warn (_("Alignment negative: 0 assumed")); - align = 0; - } - - if (*input_line_pointer == ',') - { - input_line_pointer++; - fill = get_absolute_expression (); - pfill = &fill; - } - - d30v_last_label = NULL; - d30v_align (align, pfill, NULL); - - demand_empty_rest_of_line (); -} - -/* Handle the .text pseudo-op. This is like the usual one, but it - clears the saved last label and resets known alignment. */ - -static void -s_d30v_text (i) - int i; - -{ - s_text (i); - d30v_last_label = NULL; - d30v_current_align = 0; - d30v_current_align_seg = now_seg; -} - -/* Handle the .data pseudo-op. This is like the usual one, but it - clears the saved last label and resets known alignment. */ - -static void -s_d30v_data (i) - int i; -{ - s_data (i); - d30v_last_label = NULL; - d30v_current_align = 0; - d30v_current_align_seg = now_seg; -} - -/* Handle the .section pseudo-op. This is like the usual one, but it - clears the saved last label and resets known alignment. */ - -static void -s_d30v_section (ignore) - int ignore; -{ - obj_elf_section (ignore); - d30v_last_label = NULL; - d30v_current_align = 0; - d30v_current_align_seg = now_seg; -} diff --git a/gas/config/tc-d30v.h b/gas/config/tc-d30v.h deleted file mode 100644 index dfebbb926e1..00000000000 --- a/gas/config/tc-d30v.h +++ /dev/null @@ -1,60 +0,0 @@ -/* tc-310v.h -- Header file for tc-d30v.c. - Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. - Written by Martin Hunt, Cygnus Support. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -#define TC_D30V - -#ifndef BFD_ASSEMBLER - #error D30V support requires BFD_ASSEMBLER -#endif - -/* The target BFD architecture. */ -#define TARGET_ARCH bfd_arch_d30v -#define TARGET_FORMAT "elf32-d30v" -#define TARGET_BYTES_BIG_ENDIAN 1 - -#define md_operand(x) - -#define MD_APPLY_FIX3 - -/* call md_pcrel_from_section, not md_pcrel_from */ -#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section(FIXP, SEC) - -/* Permit temporary numeric labels. */ -#define LOCAL_LABELS_FB 1 - -#define DIFF_EXPR_OK /* .-foo gets turned into PC relative relocs */ - -/* We don't need to handle .word strangely. */ -#define WORKING_DOT_WORD - -#define md_number_to_chars number_to_chars_bigendian - -int d30v_cleanup PARAMS ((int)); -#define md_after_pass_hook() d30v_cleanup (false) -#define md_cleanup() d30v_cleanup (false) -#define TC_START_LABEL(ch, ptr) (ch == ':' && d30v_cleanup (false)) -#define md_start_line_hook() d30v_start_line (false) - -void d30v_frob_label PARAMS ((symbolS *)); -#define tc_frob_label(sym) d30v_frob_label(sym) - -void d30v_cons_align PARAMS ((int)); -#define md_cons_align(nbytes) d30v_cons_align(nbytes) diff --git a/gas/config/tc-fr30.c b/gas/config/tc-fr30.c deleted file mode 100644 index aca5880bb7d..00000000000 --- a/gas/config/tc-fr30.c +++ /dev/null @@ -1,664 +0,0 @@ -/* tc-fr30.c -- Assembler for the Fujitsu FR30. - Copyright (C) 1998, 1999 Free Software Foundation. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include -#include "as.h" -#include "subsegs.h" -#include "symcat.h" -#include "opcodes/fr30-desc.h" -#include "opcodes/fr30-opc.h" -#include "cgen.h" - -/* Structure to hold all of the different components describing - an individual instruction. */ -typedef struct -{ - const CGEN_INSN * insn; - const CGEN_INSN * orig_insn; - CGEN_FIELDS fields; -#if CGEN_INT_INSN_P - CGEN_INSN_INT buffer [1]; -#define INSN_VALUE(buf) (*(buf)) -#else - unsigned char buffer [CGEN_MAX_INSN_SIZE]; -#define INSN_VALUE(buf) (buf) -#endif - char * addr; - fragS * frag; - int num_fixups; - fixS * fixups [GAS_CGEN_MAX_FIXUPS]; - int indices [MAX_OPERAND_INSTANCES]; -} -fr30_insn; - -const char comment_chars[] = ";"; -const char line_comment_chars[] = "#"; -const char line_separator_chars[] = "|"; -const char EXP_CHARS[] = "eE"; -const char FLT_CHARS[] = "dD"; - -#define FR30_SHORTOPTS "" -const char * md_shortopts = FR30_SHORTOPTS; - -struct option md_longopts[] = -{ - {NULL, no_argument, NULL, 0} -}; -size_t md_longopts_size = sizeof (md_longopts); - -int -md_parse_option (c, arg) - int c; - char * arg; -{ - switch (c) - { - default: - return 0; - } - return 1; -} - -void -md_show_usage (stream) - FILE * stream; -{ - fprintf (stream, _(" FR30 specific command line options:\n")); -} - -/* The target specific pseudo-ops which we support. */ -const pseudo_typeS md_pseudo_table[] = -{ - { "word", cons, 4 }, - { NULL, NULL, 0 } -}; - - -void -md_begin () -{ - flagword applicable; - segT seg; - subsegT subseg; - - /* Initialize the `cgen' interface. */ - - /* Set the machine number and endian. */ - gas_cgen_cpu_desc = fr30_cgen_cpu_open (CGEN_CPU_OPEN_MACHS, 0, - CGEN_CPU_OPEN_ENDIAN, - CGEN_ENDIAN_BIG, - CGEN_CPU_OPEN_END); - fr30_cgen_init_asm (gas_cgen_cpu_desc); - - /* This is a callback from cgen to gas to parse operands. */ - cgen_set_parse_operand_fn (gas_cgen_cpu_desc, gas_cgen_parse_operand); -} - -void -md_assemble (str) - char * str; -{ - static int last_insn_had_delay_slot = 0; - fr30_insn insn; - char * errmsg; - char * str2 = NULL; - - /* Initialize GAS's cgen interface for a new instruction. */ - gas_cgen_init_parse (); - - insn.insn = fr30_cgen_assemble_insn - (gas_cgen_cpu_desc, str, & insn.fields, insn.buffer, & errmsg); - - if (!insn.insn) - { - as_bad (errmsg); - return; - } - - /* Doesn't really matter what we pass for RELAX_P here. */ - gas_cgen_finish_insn (insn.insn, insn.buffer, - CGEN_FIELDS_BITSIZE (& insn.fields), 1, NULL); - - /* Warn about invalid insns in delay slots. */ - if (last_insn_had_delay_slot - && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_NOT_IN_DELAY_SLOT)) - as_warn (_("Instruction %s not allowed in a delay slot."), - CGEN_INSN_NAME (insn.insn)); - - last_insn_had_delay_slot - = CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_DELAY_SLOT); -} - -/* The syntax in the manual says constants begin with '#'. - We just ignore it. */ - -void -md_operand (expressionP) - expressionS * expressionP; -{ - if (* input_line_pointer == '#') - { - input_line_pointer ++; - expression (expressionP); - } -} - -valueT -md_section_align (segment, size) - segT segment; - valueT size; -{ - int align = bfd_get_section_alignment (stdoutput, segment); - return ((size + (1 << align) - 1) & (-1 << align)); -} - -symbolS * -md_undefined_symbol (name) - char * name; -{ - return 0; -} - -/* Interface to relax_segment. */ - -/* FIXME: Build table by hand, get it working, then machine generate. */ - -const relax_typeS md_relax_table[] = -{ -/* The fields are: - 1) most positive reach of this state, - 2) most negative reach of this state, - 3) how many bytes this mode will add to the size of the current frag - 4) which index into the table to try if we can't fit into this one. */ - - /* The first entry must be unused because an `rlx_more' value of zero ends - each list. */ - {1, 1, 0, 0}, - - /* The displacement used by GAS is from the end of the 2 byte insn, - so we subtract 2 from the following. */ - /* 16 bit insn, 8 bit disp -> 10 bit range. - This doesn't handle a branch in the right slot at the border: - the "& -4" isn't taken into account. It's not important enough to - complicate things over it, so we subtract an extra 2 (or + 2 in -ve - case). */ - {511 - 2 - 2, -512 - 2 + 2, 0, 2 }, - /* 32 bit insn, 24 bit disp -> 26 bit range. */ - {0x2000000 - 1 - 2, -0x2000000 - 2, 2, 0 }, - /* Same thing, but with leading nop for alignment. */ - {0x2000000 - 1 - 2, -0x2000000 - 2, 4, 0 } -}; - -long -fr30_relax_frag (fragP, stretch) - fragS * fragP; - long stretch; -{ - /* Address of branch insn. */ - long address = fragP->fr_address + fragP->fr_fix - 2; - long growth = 0; - - /* Keep 32 bit insns aligned on 32 bit boundaries. */ - if (fragP->fr_subtype == 2) - { - if ((address & 3) != 0) - { - fragP->fr_subtype = 3; - growth = 2; - } - } - else if (fragP->fr_subtype == 3) - { - if ((address & 3) == 0) - { - fragP->fr_subtype = 2; - growth = -2; - } - } - else - { - growth = relax_frag (fragP, stretch); - - /* Long jump on odd halfword boundary? */ - if (fragP->fr_subtype == 2 && (address & 3) != 0) - { - fragP->fr_subtype = 3; - growth += 2; - } - } - - return growth; -} - -/* Return an initial guess of the length by which a fragment must grow to - hold a branch to reach its destination. - Also updates fr_type/fr_subtype as necessary. - - Called just before doing relaxation. - Any symbol that is now undefined will not become defined. - The guess for fr_var is ACTUALLY the growth beyond fr_fix. - Whatever we do to grow fr_fix or fr_var contributes to our returned value. - Although it may not be explicit in the frag, pretend fr_var starts with a - 0 value. */ - -int -md_estimate_size_before_relax (fragP, segment) - fragS * fragP; - segT segment; -{ - int old_fr_fix = fragP->fr_fix; - - /* The only thing we have to handle here are symbols outside of the - current segment. They may be undefined or in a different segment in - which case linker scripts may place them anywhere. - However, we can't finish the fragment here and emit the reloc as insn - alignment requirements may move the insn about. */ - - if (S_GET_SEGMENT (fragP->fr_symbol) != segment) - { - /* The symbol is undefined in this segment. - Change the relaxation subtype to the max allowable and leave - all further handling to md_convert_frag. */ - fragP->fr_subtype = 2; - -#if 0 /* Can't use this, but leave in for illustration. */ - /* Change 16 bit insn to 32 bit insn. */ - fragP->fr_opcode[0] |= 0x80; - - /* Increase known (fixed) size of fragment. */ - fragP->fr_fix += 2; - - /* Create a relocation for it. */ - fix_new (fragP, old_fr_fix, 4, - fragP->fr_symbol, - fragP->fr_offset, 1 /* pcrel */, - /* FIXME: Can't use a real BFD reloc here. - gas_cgen_md_apply_fix3 can't handle it. */ - BFD_RELOC_FR30_26_PCREL); - - /* Mark this fragment as finished. */ - frag_wane (fragP); -#else - { - const CGEN_INSN * insn; - int i; - - /* Update the recorded insn. - Fortunately we don't have to look very far. - FIXME: Change this to record in the instruction the next higher - relaxable insn to use. */ - for (i = 0, insn = fragP->fr_cgen.insn; i < 4; i++, insn++) - { - if ((strcmp (CGEN_INSN_MNEMONIC (insn), - CGEN_INSN_MNEMONIC (fragP->fr_cgen.insn)) - == 0) - && CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAX)) - break; - } - if (i == 4) - abort (); - - fragP->fr_cgen.insn = insn; - return 2; - } -#endif - } - - return (fragP->fr_var + fragP->fr_fix - old_fr_fix); -} - -/* *fragP has been relaxed to its final size, and now needs to have - the bytes inside it modified to conform to the new size. - - Called after relaxation is finished. - fragP->fr_type == rs_machine_dependent. - fragP->fr_subtype is the subtype of what the address relaxed to. */ - -void -md_convert_frag (abfd, sec, fragP) - bfd * abfd; - segT sec; - fragS * fragP; -{ -#if 0 - char * opcode; - char * displacement; - int target_address; - int opcode_address; - int extension; - int addend; - - opcode = fragP->fr_opcode; - - /* Address opcode resides at in file space. */ - opcode_address = fragP->fr_address + fragP->fr_fix - 2; - - switch (fragP->fr_subtype) - { - case 1 : - extension = 0; - displacement = & opcode[1]; - break; - case 2 : - opcode[0] |= 0x80; - extension = 2; - displacement = & opcode[1]; - break; - case 3 : - opcode[2] = opcode[0] | 0x80; - md_number_to_chars (opcode, PAR_NOP_INSN, 2); - opcode_address += 2; - extension = 4; - displacement = & opcode[3]; - break; - default : - abort (); - } - - if (S_GET_SEGMENT (fragP->fr_symbol) != sec) - { - /* symbol must be resolved by linker */ - if (fragP->fr_offset & 3) - as_warn (_("Addend to unresolved symbol not on word boundary.")); - addend = fragP->fr_offset >> 2; - } - else - { - /* Address we want to reach in file space. */ - target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset; - target_address += symbol_get_frag (fragP->fr_symbol)->fr_address; - addend = (target_address - (opcode_address & -4)) >> 2; - } - - /* Create a relocation for symbols that must be resolved by the linker. - Otherwise output the completed insn. */ - - if (S_GET_SEGMENT (fragP->fr_symbol) != sec) - { - assert (fragP->fr_subtype != 1); - assert (fragP->fr_cgen.insn != 0); - gas_cgen_record_fixup (fragP, - /* Offset of branch insn in frag. */ - fragP->fr_fix + extension - 4, - fragP->fr_cgen.insn, - 4 /*length*/, - /* FIXME: quick hack */ -#if 0 - CGEN_OPERAND_ENTRY (fragP->fr_cgen.opindex), -#else - CGEN_OPERAND_ENTRY (FR30_OPERAND_DISP24), -#endif - fragP->fr_cgen.opinfo, - fragP->fr_symbol, fragP->fr_offset); - } - -#define SIZE_FROM_RELAX_STATE(n) ((n) == 1 ? 1 : 3) - - md_number_to_chars (displacement, (valueT) addend, - SIZE_FROM_RELAX_STATE (fragP->fr_subtype)); - - fragP->fr_fix += extension; -#endif -} - -/* Functions concerning relocs. */ - -/* The location from which a PC relative jump should be calculated, - given a PC relative reloc. */ - -long -md_pcrel_from_section (fixP, sec) - fixS * fixP; - segT sec; -{ - if (fixP->fx_addsy != (symbolS *) NULL - && (! S_IS_DEFINED (fixP->fx_addsy) - || S_GET_SEGMENT (fixP->fx_addsy) != sec)) - { - /* The symbol is undefined (or is defined but not in this section). - Let the linker figure it out. */ - return 0; - } - - return (fixP->fx_frag->fr_address + fixP->fx_where) & ~1; -} - -/* Return the bfd reloc type for OPERAND of INSN at fixup FIXP. - Returns BFD_RELOC_NONE if no reloc type can be found. - *FIXP may be modified if desired. */ - -bfd_reloc_code_real_type -md_cgen_lookup_reloc (insn, operand, fixP) - const CGEN_INSN * insn; - const CGEN_OPERAND * operand; - fixS * fixP; -{ - switch (operand->type) - { - case FR30_OPERAND_LABEL9: fixP->fx_pcrel = 1; return BFD_RELOC_FR30_9_PCREL; - case FR30_OPERAND_LABEL12: fixP->fx_pcrel = 1; return BFD_RELOC_FR30_12_PCREL; - case FR30_OPERAND_DISP10: return BFD_RELOC_FR30_10_IN_8; - case FR30_OPERAND_DISP9: return BFD_RELOC_FR30_9_IN_8; - case FR30_OPERAND_DISP8: return BFD_RELOC_FR30_8_IN_8; - case FR30_OPERAND_UDISP6: return BFD_RELOC_FR30_6_IN_4; - case FR30_OPERAND_I8: return BFD_RELOC_8; - case FR30_OPERAND_I32: return BFD_RELOC_FR30_48; - case FR30_OPERAND_I20: return BFD_RELOC_FR30_20; - default : /* avoid -Wall warning */ - break; - } - - return BFD_RELOC_NONE; -} - -/* See whether we need to force a relocation into the output file. - This is used to force out switch and PC relative relocations when - relaxing. */ - -int -fr30_force_relocation (fix) - fixS * fix; -{ - if ( fix->fx_r_type == BFD_RELOC_VTABLE_INHERIT - || fix->fx_r_type == BFD_RELOC_VTABLE_ENTRY) - return 1; - - return 0; -} - -/* Write a value out to the object file, using the appropriate endianness. */ - -void -md_number_to_chars (buf, val, n) - char * buf; - valueT val; - int n; -{ - number_to_chars_bigendian (buf, val, n); -} - -/* Turn a string in input_line_pointer into a floating point constant of type - type, and store the appropriate bytes in *litP. The number of LITTLENUMS - emitted is stored in *sizeP . An error message is returned, or NULL on OK. -*/ - -/* Equal to MAX_PRECISION in atof-ieee.c */ -#define MAX_LITTLENUMS 6 - -char * -md_atof (type, litP, sizeP) - char type; - char * litP; - int * sizeP; -{ - int i; - int prec; - LITTLENUM_TYPE words [MAX_LITTLENUMS]; - char * t; - char * atof_ieee (); - - switch (type) - { - case 'f': - case 'F': - case 's': - case 'S': - prec = 2; - break; - - case 'd': - case 'D': - case 'r': - case 'R': - prec = 4; - break; - - /* FIXME: Some targets allow other format chars for bigger sizes here. */ - - default: - * sizeP = 0; - return _("Bad call to md_atof()"); - } - - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - * sizeP = prec * sizeof (LITTLENUM_TYPE); - - for (i = 0; i < prec; i++) - { - md_number_to_chars (litP, (valueT) words[i], - sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - - return 0; -} - -/* Worker function for fr30_is_colon_insn(). */ -static char -restore_colon (advance_i_l_p_by) - int advance_i_l_p_by; -{ - char c; - - /* Restore the colon, and advance input_line_pointer to - the end of the new symbol. */ - * input_line_pointer = ':'; - input_line_pointer += advance_i_l_p_by; - c = * input_line_pointer; - * input_line_pointer = 0; - - return c; -} - -/* Determines if the symbol starting at START and ending in - a colon that was at the location pointed to by INPUT_LINE_POINTER - (but which has now been replaced bu a NUL) is in fact an - LDI:8, LDI:20, LDI:32, CALL:D. JMP:D, RET:D or Bcc:D instruction. - If it is, then it restores the colon, advances INPUT_LINE_POINTER - to the real end of the instruction/symbol, and returns the character - that really terminated the symbol. Otherwise it returns 0. */ -char -fr30_is_colon_insn (start) - char * start; -{ - char * i_l_p = input_line_pointer; - - /* Check to see if the symbol parsed so far is 'ldi' */ - if ( (start[0] != 'l' && start[0] != 'L') - || (start[1] != 'd' && start[1] != 'D') - || (start[2] != 'i' && start[2] != 'I') - || start[3] != 0) - { - /* Nope - check to see a 'd' follows the colon. */ - if ( (i_l_p[1] == 'd' || i_l_p[1] == 'D') - && (i_l_p[2] == ' ' || i_l_p[2] == '\t' || i_l_p[2] == '\n')) - { - /* Yup - it might be delay slot instruction. */ - int i; - static char * delay_insns [] = - { - "call", "jmp", "ret", "bra", "bno", - "beq", "bne", "bc", "bnc", "bn", - "bp", "bv", "bnv", "blt", "bge", - "ble", "bgt", "bls", "bhi" - }; - - for (i = sizeof (delay_insns) / sizeof (delay_insns[0]); i--;) - { - char * insn = delay_insns[i]; - int len = strlen (insn); - - if (start [len] != 0) - continue; - - while (len --) - if (tolower (start [len]) != insn [len]) - break; - - if (len == -1) - return restore_colon (1); - } - } - - /* Nope - it is a normal label. */ - return 0; - } - - /* Check to see if the text following the colon is '8' */ - if (i_l_p[1] == '8' && (i_l_p[2] == ' ' || i_l_p[2] == '\t')) - return restore_colon (2); - - /* Check to see if the text following the colon is '20' */ - else if (i_l_p[1] == '2' && i_l_p[2] =='0' && (i_l_p[3] == ' ' || i_l_p[3] == '\t')) - return restore_colon (3); - - /* Check to see if the text following the colon is '32' */ - else if (i_l_p[1] == '3' && i_l_p[2] =='2' && (i_l_p[3] == ' ' || i_l_p[3] == '\t')) - return restore_colon (3); - - return 0; -} - -boolean -fr30_fix_adjustable (fixP) - fixS * fixP; -{ - if (fixP->fx_addsy == NULL) - return 1; - -#if 0 - /* Prevent all adjustments to global symbols. */ - if (S_IS_EXTERN (fixP->fx_addsy)) - return 0; - - if (S_IS_WEAK (fixP->fx_addsy)) - return 0; -#endif - - /* We need the symbol name for the VTABLE entries */ - if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT - || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) - return 0; - - return 1; -} diff --git a/gas/config/tc-fr30.h b/gas/config/tc-fr30.h deleted file mode 100644 index a672d8bab11..00000000000 --- a/gas/config/tc-fr30.h +++ /dev/null @@ -1,81 +0,0 @@ -/* tc-fr30.h -- Header file for tc-fr30.c. - Copyright (C) 1998 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#define TC_FR30 - -#ifndef BFD_ASSEMBLER -/* leading space so will compile with cc */ - #error FR30 support requires BFD_ASSEMBLER -#endif - -#define LISTING_HEADER "FR30 GAS " - -/* The target BFD architecture. */ -#define TARGET_ARCH bfd_arch_fr30 - -#define TARGET_FORMAT "elf32-fr30" - -#define TARGET_BYTES_BIG_ENDIAN 1 - -/* call md_pcrel_from_section, not md_pcrel_from */ -long md_pcrel_from_section PARAMS ((struct fix *, segT)); -#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section (FIXP, SEC) - -/* Permit temporary numeric labels. */ -#define LOCAL_LABELS_FB 1 - -#define DIFF_EXPR_OK /* .-foo gets turned into PC relative relocs */ - -/* We don't need to handle .word strangely. */ -#define WORKING_DOT_WORD - -#define MD_APPLY_FIX3 -#define md_apply_fix3 gas_cgen_md_apply_fix3 - -#define obj_fix_adjustable(fixP) fr30_fix_adjustable (fixP) -extern boolean fr30_fix_adjustable PARAMS ((struct fix *)); - -/* When relaxing, we need to emit various relocs we otherwise wouldn't. */ -#define TC_FORCE_RELOCATION(fix) fr30_force_relocation (fix) -extern int fr30_force_relocation PARAMS ((struct fix *)); - -#define TC_HANDLES_FX_DONE - -#define tc_gen_reloc gas_cgen_tc_gen_reloc - -/* Call md_pcrel_from_section(), not md_pcrel_from(). */ -#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section (FIXP, SEC) -extern long md_pcrel_from_section PARAMS ((struct fix *, segT)); - -/* For 8 vs 16 vs 32 bit branch selection. */ -#define TC_GENERIC_RELAX_TABLE md_relax_table -extern const struct relax_type md_relax_table[]; - -/* We need a special version of the TC_START_LABEL macro so that we - allow the LDI:8, LDI:20, LDI:32 and delay slot instructions to be - parsed as such. Note - in a HORRIBLE HACK, we make use of the - knowledge that this marco is only ever evaluated in one place - (read_a_source_file in read.c) where we can access the local - variable 's' - the start of the symbol that was terminated by - 'character'. Also we need to be able to change the contents of - the local variable 'c' which is passed to this macro as 'character'. */ -#define TC_START_LABEL(character, i_l_p) \ - ((character) != ':' ? 0 : (character = fr30_is_colon_insn (s)) ? 0 : ((character = ':'), 1)) -extern char fr30_is_colon_insn PARAMS ((char *)); diff --git a/gas/config/tc-generic.c b/gas/config/tc-generic.c deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/gas/config/tc-generic.h b/gas/config/tc-generic.h deleted file mode 100644 index 72df0203165..00000000000 --- a/gas/config/tc-generic.h +++ /dev/null @@ -1,39 +0,0 @@ -/* This file is tc-generic.h - - Copyright (C) 1987, 91, 92, 95, 1997 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with GAS; see the file COPYING. If not, write to the Free Software - Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* - * This file is tc-generic.h and is intended to be a template for target cpu - * specific header files. It is my intent that this file compile. It is also - * my intent that this file grow into something that can be used as both a - * template for porting, and a stub for testing. xoxorich. - */ - -#define TC_GENERIC 1 - -#define TARGET_BYTES_BIG_ENDIAN 0 - -/* - * Local Variables: - * comment-column: 0 - * fill-column: 131 - * End: - */ - -/* end of tc-generic.h */ diff --git a/gas/config/tc-h8300.c b/gas/config/tc-h8300.c deleted file mode 100644 index 736d6b91294..00000000000 --- a/gas/config/tc-h8300.c +++ /dev/null @@ -1,1595 +0,0 @@ -/* tc-h8300.c -- Assemble code for the Hitachi H8/300 - Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - - -/* - Written By Steve Chamberlain - sac@cygnus.com - */ - -#include -#include "as.h" -#include "subsegs.h" -#include "bfd.h" -#define DEFINE_TABLE -#define h8_opcodes ops -#include "opcode/h8300.h" -#include - -const char comment_chars[] = -{';', 0}; -const char line_separator_chars[] = -{0}; -const char line_comment_chars[] = "#"; - -/* This table describes all the machine specific pseudo-ops the assembler - has to support. The fields are: - pseudo-op name without dot - function to call to execute this pseudo-op - Integer arg to pass to the function - */ - -void cons (); - -int Hmode; -int Smode; -#define PSIZE (Hmode ? L_32 : L_16) -#define DMODE (L_16) -#define DSYMMODE (Hmode ? L_24 : L_16) -int bsize = L_8; /* default branch displacement */ - - -void -h8300hmode () -{ - Hmode = 1; - Smode = 0; -} - -void -h8300smode () -{ - Smode = 1; - Hmode = 1; -} -void -sbranch (size) - int size; -{ - bsize = size; -} - -static void pint () -{ - cons (Hmode ? 4 : 2); -} - -const pseudo_typeS md_pseudo_table[] = -{ - - {"h8300h", h8300hmode, 0}, - {"h8300s", h8300smode, 0}, - {"sbranch", sbranch, L_8}, - {"lbranch", sbranch, L_16}, - - {"int", pint, 0}, - {"data.b", cons, 1}, - {"data.w", cons, 2}, - {"data.l", cons, 4}, - {"form", listing_psize, 0}, - {"heading", listing_title, 0}, - {"import", s_ignore, 0}, - {"page", listing_eject, 0}, - {"program", s_ignore, 0}, - {0, 0, 0} -}; - -const int md_reloc_size; - -const char EXP_CHARS[] = "eE"; - -/* Chars that mean this number is a floating point constant */ -/* As in 0f12.456 */ -/* or 0d1.2345e12 */ -const char FLT_CHARS[] = "rRsSfFdDxXpP"; - -static struct hash_control *opcode_hash_control; /* Opcode mnemonics */ - -/* - This function is called once, at assembler startup time. This should - set up all the tables, etc that the MD part of the assembler needs - */ - - -void -md_begin () -{ - struct h8_opcode *opcode; - char prev_buffer[100]; - int idx = 0; - - opcode_hash_control = hash_new (); - prev_buffer[0] = 0; - - for (opcode = h8_opcodes; opcode->name; opcode++) - { - /* Strip off any . part when inserting the opcode and only enter - unique codes into the hash table - */ - char *src = opcode->name; - unsigned int len = strlen (src); - char *dst = malloc (len + 1); - char *buffer = dst; - - opcode->size = 0; - while (*src) - { - if (*src == '.') - { - src++; - opcode->size = *src; - break; - } - *dst++ = *src++; - } - *dst++ = 0; - if (strcmp (buffer, prev_buffer)) - { - hash_insert (opcode_hash_control, buffer, (char *) opcode); - strcpy (prev_buffer, buffer); - idx++; - } - opcode->idx = idx; - - - /* Find the number of operands */ - opcode->noperands = 0; - while (opcode->args.nib[opcode->noperands] != E) - opcode->noperands++; - /* Find the length of the opcode in bytes */ - opcode->length = 0; - while (opcode->data.nib[opcode->length * 2] != E) - opcode->length++; - } - - linkrelax = 1; -} - - -struct h8_exp -{ - char *e_beg; - char *e_end; - expressionS e_exp; -}; -int dispreg; -int opsize; /* Set when a register size is seen */ - - -struct h8_op -{ - op_type mode; - unsigned reg; - expressionS exp; -}; - -/* - parse operands - WREG r0,r1,r2,r3,r4,r5,r6,r7,fp,sp - r0l,r0h,..r7l,r7h - @WREG - @WREG+ - @-WREG - #const - ccr -*/ - -/* try and parse a reg name, returns number of chars consumed */ -int -parse_reg (src, mode, reg, direction) - char *src; - op_type *mode; - unsigned int *reg; - int direction; - -{ - char *end; - int len; - - /* Cribbed from get_symbol_end(). */ - if (!is_name_beginner (*src) || *src == '\001') - return 0; - end = src+1; - while (is_part_of_name (*end) || *end == '\001') - end++; - len = end - src; - - if (len == 2 && src[0] == 's' && src[1] == 'p') - { - *mode = PSIZE | REG | direction; - *reg = 7; - return len; - } - if (len == 3 && src[0] == 'c' && src[1] == 'c' && src[2] == 'r') - { - *mode = CCR; - *reg = 0; - return len; - } - if (len == 3 && src[0] == 'e' && src[1] == 'x' && src[2] == 'r') - { - *mode = EXR; - *reg = 0; - return len; - } - if (len == 2 && src[0] == 'f' && src[1] == 'p') - { - *mode = PSIZE | REG | direction; - *reg = 6; - return len; - } - if (len == 3 && src[0] == 'e' && src[1] == 'r' - && src[2] >= '0' && src[2] <= '7') - { - *mode = L_32 | REG | direction; - *reg = src[2] - '0'; - if (!Hmode) - as_warn (_("Reg not valid for H8/300")); - return len; - } - if (len == 2 && src[0] == 'e' && src[1] >= '0' && src[1] <= '7') - { - *mode = L_16 | REG | direction; - *reg = src[1] - '0' + 8; - if (!Hmode) - as_warn (_("Reg not valid for H8/300")); - return len; - } - - if (src[0] == 'r') - { - if (src[1] >= '0' && src[1] <= '7') - { - if (len == 3 && src[2] == 'l') - { - *mode = L_8 | REG | direction; - *reg = (src[1] - '0') + 8; - return len; - } - if (len == 3 && src[2] == 'h') - { - *mode = L_8 | REG | direction; - *reg = (src[1] - '0'); - return len; - } - if (len == 2) - { - *mode = L_16 | REG | direction; - *reg = (src[1] - '0'); - return len; - } - } - } - - return 0; -} - -char * -parse_exp (s, op) - char *s; - expressionS * op; -{ - char *save = input_line_pointer; - char *new; - - input_line_pointer = s; - expression (op); - if (op->X_op == O_absent) - as_bad (_("missing operand")); - new = input_line_pointer; - input_line_pointer = save; - return new; -} - -static char * -skip_colonthing (ptr, exp, mode) - char *ptr; - expressionS *exp ATTRIBUTE_UNUSED; - int *mode; -{ - if (*ptr == ':') - { - ptr++; - *mode &= ~SIZE; - if (*ptr == '8') - { - ptr++; - /* ff fill any 8 bit quantity */ - /* exp->X_add_number -= 0x100;*/ - *mode |= L_8; - } - else - { - if (*ptr == '2') - { - *mode |= L_24; - } - else if (*ptr == '3') - { - *mode |= L_32; - } - else if (*ptr == '1') - { - *mode |= L_16; - } - while (isdigit (*ptr)) - ptr++; - } - } - return ptr; -} - -/* The many forms of operand: - - Rn Register direct - @Rn Register indirect - @(exp[:16], Rn) Register indirect with displacement - @Rn+ - @-Rn - @aa:8 absolute 8 bit - @aa:16 absolute 16 bit - @aa absolute 16 bit - - #xx[:size] immediate data - @(exp:[8], pc) pc rel - @@aa[:8] memory indirect - - */ - -char * -colonmod24 (op, src) - struct h8_op *op; - char *src; - -{ - int mode = 0; - src = skip_colonthing (src, &op->exp, &mode); - - if (!mode) - { - /* Choose a default mode */ - if (op->exp.X_add_number < -32768 - || op->exp.X_add_number > 32767) - { - if (Hmode) - mode = L_24; - else - mode = L_16; - } - else if (op->exp.X_add_symbol - || op->exp.X_op_symbol) - mode = DSYMMODE; - else - mode = DMODE; - } - op->mode |= mode; - return src; - -} - - -static void -get_operand (ptr, op, dst, direction) - char **ptr; - struct h8_op *op; - unsigned int dst ATTRIBUTE_UNUSED; - int direction; -{ - char *src = *ptr; - op_type mode; - unsigned int num; - unsigned int len; - - op->mode = E; - - /* Gross. Gross. ldm and stm have a format not easily handled - by get_operand. We deal with it explicitly here. */ - if (src[0] == 'e' && src[1] == 'r' && isdigit(src[2]) - && src[3] == '-' && src[4] == 'e' && src[5] == 'r' && isdigit(src[6])) - { - int low, high; - - low = src[2] - '0'; - high = src[6] - '0'; - - if (high < low) - as_bad (_("Invalid register list for ldm/stm\n")); - - if (low % 2) - as_bad (_("Invalid register list for ldm/stm\n")); - - if (high - low > 3) - as_bad (_("Invalid register list for ldm/stm\n")); - - if (high - low != 1 - && low % 4) - as_bad (_("Invalid register list for ldm/stm\n")); - - /* Even sicker. We encode two registers into op->reg. One - for the low register to save, the other for the high - register to save; we also set the high bit in op->reg - so we know this is "very special". */ - op->reg = 0x80000000 | (high << 8) | low; - op->mode = REG; - *ptr = src + 7; - return; - } - - len = parse_reg (src, &op->mode, &op->reg, direction); - if (len) - { - *ptr = src + len; - return; - } - - if (*src == '@') - { - src++; - if (*src == '@') - { - src++; - src = parse_exp (src, &op->exp); - - src = skip_colonthing (src, &op->exp, &op->mode); - - *ptr = src; - - op->mode = MEMIND; - return; - - } - - - if (*src == '-') - { - src++; - len = parse_reg (src, &mode, &num, direction); - if (len == 0) - { - /* Oops, not a reg after all, must be ordinary exp */ - src--; - /* must be a symbol */ - op->mode = ABS | PSIZE | direction; - *ptr = skip_colonthing (parse_exp (src, &op->exp), - &op->exp, &op->mode); - - return; - - - } - - - if ((mode & SIZE) != PSIZE) - as_bad (_("Wrong size pointer register for architecture.")); - op->mode = RDDEC; - op->reg = num; - *ptr = src + len; - return; - } - if (*src == '(') - { - /* Disp */ - src++; - - /* Start off assuming a 16 bit offset */ - - - src = parse_exp (src, &op->exp); - - src = colonmod24 (op, src); - - if (*src == ')') - { - src++; - op->mode |= ABS | direction; - *ptr = src; - return; - } - - if (*src != ',') - { - as_bad (_("expected @(exp, reg16)")); - return; - - } - src++; - - len = parse_reg (src, &mode, &op->reg, direction); - if (len == 0 || !(mode & REG)) - { - as_bad (_("expected @(exp, reg16)")); - return; - } - op->mode |= DISP | direction; - dispreg = op->reg; - src += len; - src = skip_colonthing (src, &op->exp, &op->mode); - - if (*src != ')' && '(') - { - as_bad (_("expected @(exp, reg16)")); - return; - } - *ptr = src + 1; - - return; - } - len = parse_reg (src, &mode, &num, direction); - - if (len) - { - src += len; - if (*src == '+') - { - src++; - if ((mode & SIZE) != PSIZE) - as_bad (_("Wrong size pointer register for architecture.")); - op->mode = RSINC; - op->reg = num; - *ptr = src; - return; - } - if ((mode & SIZE) != PSIZE) - as_bad (_("Wrong size pointer register for architecture.")); - - op->mode = direction | IND | PSIZE; - op->reg = num; - *ptr = src; - - return; - } - else - { - /* must be a symbol */ - - op->mode = ABS | direction; - src = parse_exp (src, &op->exp); - - *ptr = colonmod24 (op, src); - - return; - } - } - - - if (*src == '#') - { - src++; - op->mode = IMM; - src = parse_exp (src, &op->exp); - *ptr = skip_colonthing (src, &op->exp, &op->mode); - - return; - } - else if (strncmp (src, "mach", 4) == 0 - || strncmp (src, "macl", 4) == 0) - { - op->reg = src[3] == 'l'; - op->mode = MACREG; - *ptr = src + 4; - return; - } - else - { - src = parse_exp (src, &op->exp); - /* Trailing ':' size ? */ - if (*src == ':') - { - if (src[1] == '1' && src[2] == '6') - { - op->mode = PCREL | L_16; - src += 3; - } - else if (src[1] == '8') - { - op->mode = PCREL | L_8; - src += 2; - } - else - { - as_bad (_("expect :8 or :16 here")); - } - } - else - { - op->mode = PCREL | bsize; - } - *ptr = src; - } -} - - -static -char * -get_operands (noperands, op_end, operand) - unsigned int noperands; - char *op_end; - struct h8_op *operand; -{ - char *ptr = op_end; - - switch (noperands) - { - case 0: - operand[0].mode = 0; - operand[1].mode = 0; - break; - - case 1: - ptr++; - get_operand (&ptr, operand + 0, 0, SRC); - if (*ptr == ',') - { - ptr++; - get_operand (&ptr, operand + 1, 1, DST); - } - else - { - operand[1].mode = 0; - } - - break; - case 2: - ptr++; - get_operand (&ptr, operand + 0, 0, SRC); - if (*ptr == ',') - ptr++; - get_operand (&ptr, operand + 1, 1, DST); - break; - - default: - abort (); - } - - - return ptr; -} - -/* Passed a pointer to a list of opcodes which use different - addressing modes, return the opcode which matches the opcodes - provided - */ -static -struct h8_opcode * -get_specific (opcode, operands, size) - struct h8_opcode *opcode; - struct h8_op *operands; - int size; -{ - struct h8_opcode *this_try = opcode; - int found = 0; - - unsigned int this_index = opcode->idx; - - /* There's only one ldm/stm and it's easier to just - get out quick for them. */ - if (strcmp (opcode->name, "stm.l") == 0 - || strcmp (opcode->name, "ldm.l") == 0) - return this_try; - - while (this_index == opcode->idx && !found) - { - found = 1; - - this_try = opcode++; - if (this_try->noperands == 0) - { - int this_size; - - this_size = this_try->how & SN; - if (this_size != size && (this_size != SB || size != SN)) - found = 0; - } - else - { - unsigned int i; - - for (i = 0; i < this_try->noperands && found; i++) - { - op_type op = this_try->args.nib[i]; - int x = operands[i].mode; - - if ((op & (DISP | REG)) == (DISP | REG) - && ((x & (DISP | REG)) == (DISP | REG))) - { - dispreg = operands[i].reg; - } - else if (op & REG) - { - if (!(x & REG)) - found = 0; - - if (x & L_P) - x = (x & ~L_P) | (Hmode ? L_32 : L_16); - if (op & L_P) - op = (op & ~L_P) | (Hmode ? L_32 : L_16); - - opsize = op & SIZE; - - /* The size of the reg is v important */ - if ((op & SIZE) != (x & SIZE)) - found = 0; - } - else if ((op & ABSJMP) && (x & ABS)) - { - operands[i].mode &= ~ABS; - operands[i].mode |= ABSJMP; - /* But it may not be 24 bits long */ - if (!Hmode) - { - operands[i].mode &= ~SIZE; - operands[i].mode |= L_16; - } - } - else if ((op & (KBIT | DBIT)) && (x & IMM)) - { - /* This is ok if the immediate value is sensible */ - } - else if (op & PCREL) - { - /* The size of the displacement is important */ - if ((op & SIZE) != (x & SIZE)) - found = 0; - } - else if ((op & (DISP | IMM | ABS)) - && (op & (DISP | IMM | ABS)) == (x & (DISP | IMM | ABS))) - { - /* Promote a L_24 to L_32 if it makes us match. */ - if ((x & L_24) && (op & L_32)) - { - x &= ~L_24; - x |= L_32; - } - /* Promote an L8 to L_16 if it makes us match. */ - if (op & ABS && op & L_8 && op & DISP) - { - if (x & L_16) - found= 1; - } - else if ((x & SIZE) != 0 - && ((op & SIZE) != (x & SIZE))) - found = 0; - } - else if ((op & MACREG) != (x & MACREG)) - { - found = 0; - } - else if ((op & MODE) != (x & MODE)) - { - found = 0; - } - } - } - } - if (found) - return this_try; - else - return 0; -} - -static void -check_operand (operand, width, string) - struct h8_op *operand; - unsigned int width; - char *string; -{ - if (operand->exp.X_add_symbol == 0 - && operand->exp.X_op_symbol == 0) - { - - /* No symbol involved, let's look at offset, it's dangerous if any of - the high bits are not 0 or ff's, find out by oring or anding with - the width and seeing if the answer is 0 or all fs*/ - - if ((operand->exp.X_add_number & ~width) != 0 && - (operand->exp.X_add_number | width) != (~0)) - { - if (width == 255 - && (operand->exp.X_add_number & 0xff00) == 0xff00) - { - /* Just ignore this one - which happens when trying to - fit a 16 bit address truncated into an 8 bit address - of something like bset. */ - } - else - { - as_warn (_("operand %s0x%lx out of range."), string, - (unsigned long) operand->exp.X_add_number); - } - } - } - -} - -/* RELAXMODE has one of 3 values: - - 0 Output a "normal" reloc, no relaxing possible for this insn/reloc - - 1 Output a relaxable 24bit absolute mov.w address relocation - (may relax into a 16bit absolute address). - - 2 Output a relaxable 16/24 absolute mov.b address relocation - (may relax into an 8bit absolute address). */ - -static void -do_a_fix_imm (offset, operand, relaxmode) - int offset; - struct h8_op *operand; - int relaxmode; -{ - int idx; - int size; - int where; - - - char *t = operand->mode & IMM ? "#" : "@"; - - if (operand->exp.X_add_symbol == 0) - { - char *bytes = frag_now->fr_literal + offset; - switch (operand->mode & SIZE) - { - case L_2: - check_operand (operand, 0x3, t); - bytes[0] |= (operand->exp.X_add_number) << 4; - break; - case L_3: - check_operand (operand, 0x7, t); - bytes[0] |= (operand->exp.X_add_number) << 4; - break; - case L_8: - check_operand (operand, 0xff, t); - bytes[0] = operand->exp.X_add_number; - break; - case L_16: - check_operand (operand, 0xffff, t); - bytes[0] = operand->exp.X_add_number >> 8; - bytes[1] = operand->exp.X_add_number >> 0; - break; - case L_24: - check_operand (operand, 0xffffff, t); - bytes[0] = operand->exp.X_add_number >> 16; - bytes[1] = operand->exp.X_add_number >> 8; - bytes[2] = operand->exp.X_add_number >> 0; - break; - - case L_32: - /* This should be done with bfd */ - bytes[0] = operand->exp.X_add_number >> 24; - bytes[1] = operand->exp.X_add_number >> 16; - bytes[2] = operand->exp.X_add_number >> 8; - bytes[3] = operand->exp.X_add_number >> 0; - break; - } - - } - else - { - switch (operand->mode & SIZE) - { - - case L_24: - case L_32: - size = 4; - where = (operand->mode & SIZE) == L_24 ? -1 : 0; - if (relaxmode == 2) - idx = R_MOV24B1; - else if (relaxmode == 1) - idx = R_MOVL1; - else - idx = R_RELLONG; - break; - default: - as_bad(_("Can't work out size of operand.\n")); - case L_16: - size = 2; - where = 0; - if (relaxmode == 2) - idx = R_MOV16B1; - else - idx = R_RELWORD; - operand->exp.X_add_number = (short)operand->exp.X_add_number; - break; - case L_8: - size = 1; - where = 0; - idx = R_RELBYTE; - /* This used to use a cast to char, but that fails if char is an - unsigned type. We can't use `signed char', as that isn't valid - K&R C. */ - if (operand->exp.X_add_number & 0x80) - operand->exp.X_add_number |= ((offsetT) -1 << 8); - else - operand->exp.X_add_number &= 0xff; - } - - fix_new_exp (frag_now, - offset + where, - size, - &operand->exp, - 0, - idx); - } - -} - -/* Now we know what sort of opcodes it is, lets build the bytes - - */ -static void -build_bytes (this_try, operand) - struct h8_opcode *this_try; - struct h8_op *operand; -{ - unsigned int i; - - char *output = frag_more (this_try->length); - op_type *nibble_ptr = this_try->data.nib; - op_type c; - unsigned int nibble_count = 0; - int absat; - int immat; - int nib; - int movb = 0; - char asnibbles[30]; - char *p = asnibbles; - - if (!(this_try->inbase || Hmode)) - as_warn (_("Opcode `%s' with these operand types not available in H8/300 mode"), - this_try->name); - - while (*nibble_ptr != E) - { - int d; - c = *nibble_ptr++; - - d = (c & (DST | SRC_IN_DST)) != 0; - - if (c < 16) - { - nib = c; - } - else - { - - if (c & (REG | IND | INC | DEC)) - { - nib = operand[d].reg; - } - else if ((c & DISPREG) == (DISPREG)) - { - nib = dispreg; - } - else if (c & ABS ) - { - operand[d].mode = c; - absat = nibble_count / 2; - nib = 0; - } - else if (c & (IMM | PCREL | ABS | ABSJMP | DISP)) - { - operand[d].mode = c; - immat = nibble_count / 2; - nib = 0; - } - else if (c & IGNORE) - { - nib = 0; - } - else if (c & DBIT) - { - switch (operand[0].exp.X_add_number) - { - case 1: - nib = c; - break; - case 2: - nib = 0x8 | c; - break; - default: - as_bad (_("Need #1 or #2 here")); - } - } - else if (c & KBIT) - { - switch (operand[0].exp.X_add_number) - { - case 1: - nib = 0; - break; - case 2: - nib = 8; - break; - case 4: - if (!Hmode) - as_warn (_("#4 not valid on H8/300.")); - nib = 9; - break; - - default: - as_bad (_("Need #1 or #2 here")); - break; - } - /* stop it making a fix */ - operand[0].mode = 0; - } - - if (c & MEMRELAX) - { - operand[d].mode |= MEMRELAX; - } - - if (c & B31) - { - nib |= 0x8; - } - - if (c & MACREG) - { - nib = 2 + operand[d].reg; - } - } - nibble_count++; - - *p++ = nib; - } - - /* Disgusting. Why, oh why didn't someone ask us for advice - on the assembler format. */ - if (strcmp (this_try->name, "stm.l") == 0 - || strcmp (this_try->name, "ldm.l") == 0) - { - int high, low; - high = (operand[this_try->name[0] == 'l' ? 1 : 0].reg >> 8) & 0xf; - low = operand[this_try->name[0] == 'l' ? 1 : 0].reg & 0xf; - - asnibbles[2] = high - low; - asnibbles[7] = (this_try->name[0] == 'l') ? high : low; - } - - for (i = 0; i < this_try->length; i++) - { - output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1]; - } - - /* Note if this is a movb instruction -- there's a special relaxation - which only applies to them. */ - if (strcmp (this_try->name, "mov.b") == 0) - movb = 1; - - /* output any fixes */ - for (i = 0; i < 2; i++) - { - int x = operand[i].mode; - - if (x & (IMM | DISP)) - { - do_a_fix_imm (output - frag_now->fr_literal + immat, - operand + i, x & MEMRELAX != 0); - } - else if (x & ABS) - { - do_a_fix_imm (output - frag_now->fr_literal + absat, - operand + i, x & MEMRELAX ? movb + 1 : 0); - } - else if (x & PCREL) - { - int size16 = x & L_16; - int where = size16 ? 2 : 1; - int size = size16 ? 2 : 1; - int type = size16 ? R_PCRWORD : R_PCRBYTE; - - check_operand (operand + i, size16 ? 0x7fff : 0x7f, "@"); - - if (operand[i].exp.X_add_number & 1) - { - as_warn (_("branch operand has odd offset (%lx)\n"), - (unsigned long) operand->exp.X_add_number); - } - - operand[i].exp.X_add_number -= 1; - /* This used to use a cast to char, but that fails if char is an - unsigned type. We can't use `signed char', as that isn't valid - K&R C. */ - if (operand[i].exp.X_add_number & 0x80) - operand[i].exp.X_add_number |= ((offsetT) -1 << 8); - else - operand[i].exp.X_add_number &= 0xff; - - fix_new_exp (frag_now, - output - frag_now->fr_literal + where, - size, - &operand[i].exp, - 1, - type); - } - else if (x & MEMIND) - { - - check_operand (operand + i, 0xff, "@@"); - fix_new_exp (frag_now, - output - frag_now->fr_literal + 1, - 1, - &operand[i].exp, - 0, - R_MEM_INDIRECT); - } - else if (x & ABSJMP) - { - /* This jmp may be a jump or a branch */ - - check_operand (operand + i, Hmode ? 0xffffff : 0xffff, "@"); - if (operand[i].exp.X_add_number & 1) - { - as_warn (_("branch operand has odd offset (%lx)\n"), - (unsigned long) operand->exp.X_add_number); - } - if (!Hmode) - operand[i].exp.X_add_number = (short) operand[i].exp.X_add_number; - fix_new_exp (frag_now, - output - frag_now->fr_literal, - 4, - &operand[i].exp, - 0, - R_JMPL1); - } - } - -} - -/* - try and give an intelligent error message for common and simple to - detect errors - */ - -static void -clever_message (opcode, operand) - struct h8_opcode *opcode; - struct h8_op *operand; -{ - /* Find out if there was more than one possible opccode */ - - if ((opcode + 1)->idx != opcode->idx) - { - unsigned int argn; - - /* Only one opcode of this flavour, try and guess which operand - didn't match */ - for (argn = 0; argn < opcode->noperands; argn++) - { - switch (opcode->args.nib[argn]) - { - case RD16: - if (operand[argn].mode != RD16) - { - as_bad (_("destination operand must be 16 bit register")); - return; - - } - break; - - case RS8: - - if (operand[argn].mode != RS8) - { - as_bad (_("source operand must be 8 bit register")); - return; - } - break; - - case ABS16DST: - if (operand[argn].mode != ABS16DST) - { - as_bad (_("destination operand must be 16bit absolute address")); - return; - } - break; - case RD8: - if (operand[argn].mode != RD8) - { - as_bad (_("destination operand must be 8 bit register")); - return; - } - break; - - - case ABS16SRC: - if (operand[argn].mode != ABS16SRC) - { - as_bad (_("source operand must be 16bit absolute address")); - return; - } - break; - - } - } - } - as_bad (_("invalid operands")); -} - -/* This is the guts of the machine-dependent assembler. STR points to a - machine dependent instruction. This funciton is supposed to emit - the frags/bytes it assembles to. - */ - - - -void -md_assemble (str) - char *str; -{ - char *op_start; - char *op_end; - struct h8_op operand[2]; - struct h8_opcode *opcode; - struct h8_opcode *prev_opcode; - - char *dot = 0; - char c; - int size; - - /* Drop leading whitespace */ - while (*str == ' ') - str++; - - /* find the op code end */ - for (op_start = op_end = str; - *op_end != 0 && *op_end != ' '; - op_end++) - { - if (*op_end == '.') - { - dot = op_end + 1; - *op_end = 0; - op_end += 2; - break; - } - } - - ; - - if (op_end == op_start) - { - as_bad (_("can't find opcode ")); - } - c = *op_end; - - *op_end = 0; - - opcode = (struct h8_opcode *) hash_find (opcode_hash_control, - op_start); - - if (opcode == NULL) - { - as_bad (_("unknown opcode")); - return; - } - - /* We use to set input_line_pointer to the result of get_operands, - but that is wrong. Our caller assumes we don't change it. */ - - (void) get_operands (opcode->noperands, op_end, operand); - *op_end = c; - prev_opcode = opcode; - - size = SN; - if (dot) - { - switch (*dot) - { - case 'b': - size = SB; - break; - - case 'w': - size = SW; - break; - - case 'l': - size = SL; - break; - } - } - opcode = get_specific (opcode, operand, size); - - if (opcode == 0) - { - /* Couldn't find an opcode which matched the operands */ - char *where = frag_more (2); - - where[0] = 0x0; - where[1] = 0x0; - clever_message (prev_opcode, operand); - - return; - } - if (opcode->size && dot) - { - if (opcode->size != *dot) - { - as_warn (_("mismatch between opcode size and operand size")); - } - } - - build_bytes (opcode, operand); - -} - -void -tc_crawl_symbol_chain (headers) - object_headers * headers ATTRIBUTE_UNUSED; -{ - printf (_("call to tc_crawl_symbol_chain \n")); -} - -symbolS * -md_undefined_symbol (name) - char *name ATTRIBUTE_UNUSED; -{ - return 0; -} - -void -tc_headers_hook (headers) - object_headers * headers ATTRIBUTE_UNUSED; -{ - printf (_("call to tc_headers_hook \n")); -} - -/* Various routines to kill one day */ -/* Equal to MAX_PRECISION in atof-ieee.c */ -#define MAX_LITTLENUMS 6 - -/* Turn a string in input_line_pointer into a floating point constant of type - type, and store the appropriate bytes in *litP. The number of LITTLENUMS - emitted is stored in *sizeP . An error message is returned, or NULL on OK. - */ -char * -md_atof (type, litP, sizeP) - char type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - LITTLENUM_TYPE *wordP; - char *t; - char *atof_ieee (); - - switch (type) - { - case 'f': - case 'F': - case 's': - case 'S': - prec = 2; - break; - - case 'd': - case 'D': - case 'r': - case 'R': - prec = 4; - break; - - case 'x': - case 'X': - prec = 6; - break; - - case 'p': - case 'P': - prec = 6; - break; - - default: - *sizeP = 0; - return _("Bad call to MD_ATOF()"); - } - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - - *sizeP = prec * sizeof (LITTLENUM_TYPE); - for (wordP = words; prec--;) - { - md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - return 0; -} - -CONST char *md_shortopts = ""; -struct option md_longopts[] = { - {NULL, no_argument, NULL, 0} -}; -size_t md_longopts_size = sizeof(md_longopts); - -int -md_parse_option (c, arg) - int c ATTRIBUTE_UNUSED; - char *arg ATTRIBUTE_UNUSED; -{ - return 0; -} - -void -md_show_usage (stream) - FILE *stream ATTRIBUTE_UNUSED; -{ -} - -void -tc_aout_fix_to_chars () -{ - printf (_("call to tc_aout_fix_to_chars \n")); - abort (); -} - -void -md_convert_frag (headers, seg, fragP) - object_headers *headers ATTRIBUTE_UNUSED; - segT seg ATTRIBUTE_UNUSED; - fragS *fragP ATTRIBUTE_UNUSED; -{ - printf (_("call to md_convert_frag \n")); - abort (); -} - -valueT -md_section_align (seg, size) - segT seg; - valueT size; -{ - return ((size + (1 << section_alignment[(int) seg]) - 1) & (-1 << section_alignment[(int) seg])); - -} - -void -md_apply_fix (fixP, val) - fixS *fixP; - long val; -{ - char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; - - switch (fixP->fx_size) - { - case 1: - *buf++ = val; - break; - case 2: - *buf++ = (val >> 8); - *buf++ = val; - break; - case 4: - *buf++ = (val >> 24); - *buf++ = (val >> 16); - *buf++ = (val >> 8); - *buf++ = val; - break; - default: - abort (); - } -} - -int -md_estimate_size_before_relax (fragP, segment_type) - register fragS *fragP ATTRIBUTE_UNUSED; - register segT segment_type ATTRIBUTE_UNUSED; -{ - printf (_("call tomd_estimate_size_before_relax \n")); - abort (); -} - -/* Put number into target byte order */ - -void -md_number_to_chars (ptr, use, nbytes) - char *ptr; - valueT use; - int nbytes; -{ - number_to_chars_bigendian (ptr, use, nbytes); -} -long -md_pcrel_from (fixP) - fixS *fixP ATTRIBUTE_UNUSED; -{ - abort (); -} - - -void -tc_reloc_mangle (fix_ptr, intr, base) - fixS *fix_ptr; - struct internal_reloc *intr; - bfd_vma base; - -{ - symbolS *symbol_ptr; - - symbol_ptr = fix_ptr->fx_addsy; - - /* If this relocation is attached to a symbol then it's ok - to output it */ - if (fix_ptr->fx_r_type == TC_CONS_RELOC) - { - /* cons likes to create reloc32's whatever the size of the reloc.. - */ - switch (fix_ptr->fx_size) - { - case 4: - intr->r_type = R_RELLONG; - break; - case 2: - intr->r_type = R_RELWORD; - break; - case 1: - intr->r_type = R_RELBYTE; - break; - default: - abort (); - - } - - } - else - { - intr->r_type = fix_ptr->fx_r_type; - } - - intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base; - intr->r_offset = fix_ptr->fx_offset; - - if (symbol_ptr) - { - if (symbol_ptr->sy_number != -1) - intr->r_symndx = symbol_ptr->sy_number; - else - { - symbolS *segsym; - - /* This case arises when a reference is made to `.'. */ - segsym = seg_info (S_GET_SEGMENT (symbol_ptr))->dot; - if (segsym == NULL) - intr->r_symndx = -1; - else - { - intr->r_symndx = segsym->sy_number; - intr->r_offset += S_GET_VALUE (symbol_ptr); - } - } - } - else - intr->r_symndx = -1; - - -} - -/* end of tc-h8300.c */ diff --git a/gas/config/tc-h8300.h b/gas/config/tc-h8300.h deleted file mode 100644 index 2a2a7040f3c..00000000000 --- a/gas/config/tc-h8300.h +++ /dev/null @@ -1,58 +0,0 @@ -/* This file is tc-h8300.h - Copyright (C) 1987-1992, 93, 94, 95, 96, 97, 1998 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - - -#define TC_H8300 - -#define TARGET_BYTES_BIG_ENDIAN 1 - -#if ANSI_PROTOTYPES -struct internal_reloc; -#endif - -#define WORKING_DOT_WORD - -/* This macro translates between an internal fix and an coff reloc type */ -#define TC_COFF_FIX2RTYPE(fixP) abort(); - -#define BFD_ARCH bfd_arch_h8300 -#define COFF_MAGIC ( Smode ? 0x8302 : Hmode ? 0x8301 : 0x8300) -#define TC_COUNT_RELOC(x) (1) -#define IGNORE_NONSTANDARD_ESCAPES - -#define tc_coff_symbol_emit_hook(a) ; /* not used */ -#define TC_RELOC_MANGLE(s,a,b,c) tc_reloc_mangle(a,b,c) -extern void tc_reloc_mangle - PARAMS ((struct fix *, struct internal_reloc *, bfd_vma)); - -#define TC_CONS_RELOC (Hmode ? R_RELLONG: R_RELWORD) - -#define DO_NOT_STRIP 0 -#define LISTING_HEADER "Hitachi H8/300 GAS " -#define NEED_FX_R_TYPE 1 -#define RELOC_32 1234 - -extern int Hmode; -extern int Smode; - -#define md_operand(x) - -/* end of tc-h8300.h */ diff --git a/gas/config/tc-h8500.c b/gas/config/tc-h8500.c deleted file mode 100644 index 9dec3e2e6a2..00000000000 --- a/gas/config/tc-h8500.c +++ /dev/null @@ -1,1633 +0,0 @@ -/* tc-h8500.c -- Assemble code for the Hitachi H8/500 - Copyright (C) 1993, 94, 95, 1998 Free Software Foundation. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - -/* - Written By Steve Chamberlain - sac@cygnus.com - */ - -#include -#include "as.h" -#include "bfd.h" -#include "subsegs.h" -#define DEFINE_TABLE -#define ASSEMBLER_TABLE -#include "opcodes/h8500-opc.h" -#include - -const char comment_chars[] = "!"; -const char line_separator_chars[] = ";"; -const char line_comment_chars[] = "!#"; - -/* This table describes all the machine specific pseudo-ops the assembler - has to support. The fields are: - pseudo-op name without dot - function to call to execute this pseudo-op - Integer arg to pass to the function - */ - -void cons (); - -const pseudo_typeS md_pseudo_table[] = -{ - {"int", cons, 2}, - {"data.b", cons, 1}, - {"data.w", cons, 2}, - {"data.l", cons, 4}, - {"form", listing_psize, 0}, - {"heading", listing_title, 0}, - {"import", s_ignore, 0}, - {"page", listing_eject, 0}, - {"program", s_ignore, 0}, - {0, 0, 0} -}; - -const int md_reloc_size; - -const char EXP_CHARS[] = "eE"; - -/* Chars that mean this number is a floating point constant */ -/* As in 0f12.456 */ -/* or 0d1.2345e12 */ -const char FLT_CHARS[] = "rRsSfFdDxXpP"; - -#define C(a,b) ENCODE_RELAX(a,b) -#define ENCODE_RELAX(what,length) (((what) << 2) + (length)) - -#define GET_WHAT(x) ((x>>2)) - -#define BYTE_DISP 1 -#define WORD_DISP 2 -#define UNDEF_BYTE_DISP 0 -#define UNDEF_WORD_DISP 3 - -#define BRANCH 1 -#define SCB_F 2 -#define SCB_TST 3 -#define END 4 - -#define BYTE_F 127 -#define BYTE_B -126 -#define WORD_F 32767 -#define WORD_B 32768 - -relax_typeS md_relax_table[C (END, 0)]; - -static struct hash_control *opcode_hash_control; /* Opcode mnemonics */ - -/* - This function is called once, at assembler startup time. This should - set up all the tables, etc that the MD part of the assembler needs - */ - -void -md_begin () -{ - h8500_opcode_info *opcode; - char prev_buffer[100]; - int idx = 0; - register relax_typeS *table; - - opcode_hash_control = hash_new (); - prev_buffer[0] = 0; - - /* Insert unique names into hash table */ - for (opcode = h8500_table; opcode->name; opcode++) - { - if (idx != opcode->idx) - { - hash_insert (opcode_hash_control, opcode->name, (char *) opcode); - idx++; - } - } - - /* Initialize the relax table. We use a local variable to avoid - warnings about modifying a supposedly const data structure. */ - table = (relax_typeS *) md_relax_table; - table[C (BRANCH, BYTE_DISP)].rlx_forward = BYTE_F; - table[C (BRANCH, BYTE_DISP)].rlx_backward = BYTE_B; - table[C (BRANCH, BYTE_DISP)].rlx_length = 2; - table[C (BRANCH, BYTE_DISP)].rlx_more = C (BRANCH, WORD_DISP); - - table[C (BRANCH, WORD_DISP)].rlx_forward = WORD_F; - table[C (BRANCH, WORD_DISP)].rlx_backward = WORD_B; - table[C (BRANCH, WORD_DISP)].rlx_length = 3; - table[C (BRANCH, WORD_DISP)].rlx_more = 0; - - table[C (SCB_F, BYTE_DISP)].rlx_forward = BYTE_F; - table[C (SCB_F, BYTE_DISP)].rlx_backward = BYTE_B; - table[C (SCB_F, BYTE_DISP)].rlx_length = 3; - table[C (SCB_F, BYTE_DISP)].rlx_more = C (SCB_F, WORD_DISP); - - table[C (SCB_F, WORD_DISP)].rlx_forward = WORD_F; - table[C (SCB_F, WORD_DISP)].rlx_backward = WORD_B; - table[C (SCB_F, WORD_DISP)].rlx_length = 8; - table[C (SCB_F, WORD_DISP)].rlx_more = 0; - - table[C (SCB_TST, BYTE_DISP)].rlx_forward = BYTE_F; - table[C (SCB_TST, BYTE_DISP)].rlx_backward = BYTE_B; - table[C (SCB_TST, BYTE_DISP)].rlx_length = 3; - table[C (SCB_TST, BYTE_DISP)].rlx_more = C (SCB_TST, WORD_DISP); - - table[C (SCB_TST, WORD_DISP)].rlx_forward = WORD_F; - table[C (SCB_TST, WORD_DISP)].rlx_backward = WORD_B; - table[C (SCB_TST, WORD_DISP)].rlx_length = 10; - table[C (SCB_TST, WORD_DISP)].rlx_more = 0; - -} - -static int rn; /* register number used by RN */ -static int rs; /* register number used by RS */ -static int rd; /* register number used by RD */ -static int crb; /* byte size cr */ -static int crw; /* word sized cr */ -static int cr; /* unknown size cr */ - -static expressionS displacement;/* displacement expression */ -static int displacement_size; /* and size if given */ - -static int immediate_inpage; -static expressionS immediate; /* immediate expression */ -static int immediate_size; /* and size if given */ - -static expressionS absolute; /* absolute expression */ -static int absolute_size; /* and size if given */ - -typedef struct -{ - int type; - int reg; - expressionS exp; - int page; -} - -h8500_operand_info; - -/* try and parse a reg name, returns number of chars consumed */ -static int -parse_reg (src, mode, reg) - char *src; - int *mode; - int *reg; -{ - char *end; - int len; - - /* Cribbed from get_symbol_end(). */ - if (!is_name_beginner (*src) || *src == '\001') - return 0; - end = src+1; - while (is_part_of_name (*end) || *end == '\001') - end++; - len = end - src; - - if (len == 2 && src[0] == 'r') - { - if (src[1] >= '0' && src[1] <= '7') - { - *mode = RN; - *reg = (src[1] - '0'); - return len; - } - } - if (len == 2 && src[0] == 's' && src[1] == 'p') - { - *mode = RN; - *reg = 7; - return len; - } - if (len == 3 && src[0] == 'c' && src[1] == 'c' && src[2] == 'r') - { - *mode = CRB; - *reg = 1; - return len; - } - if (len == 2 && src[0] == 's' && src[1] == 'r') - { - *mode = CRW; - *reg = 0; - return len; - } - if (len == 2 && src[0] == 'b' && src[1] == 'r') - { - *mode = CRB; - *reg = 3; - return len; - } - if (len == 2 && src[0] == 'e' && src[1] == 'p') - { - *mode = CRB; - *reg = 4; - return len; - } - if (len == 2 && src[0] == 'd' && src[1] == 'p') - { - *mode = CRB; - *reg = 5; - return len; - } - if (len == 2 && src[0] == 't' && src[1] == 'p') - { - *mode = CRB; - *reg = 7; - return len; - } - if (len == 2 && src[0] == 'f' && src[1] == 'p') - { - *mode = RN; - *reg = 6; - return len; - } - return 0; -} - -static -char * -parse_exp (s, op, page) - char *s; - expressionS *op; - int *page; -{ - char *save; - char *new; - - save = input_line_pointer; - - *page = 0; - if (s[0] == '%') - { - if (s[1] == 'p' && s[2] == 'a' && s[3] == 'g' && s[4] == 'e') - { - s += 5; - *page = 'p'; - } - if (s[1] == 'h' && s[2] == 'i' && s[3] == '1' && s[4] == '6') - { - s += 5; - *page = 'h'; - } - else if (s[1] == 'o' && s[2] == 'f' && s[3] == 'f') - { - s += 4; - *page = 'o'; - } - } - - input_line_pointer = s; - - expression (op); - if (op->X_op == O_absent) - as_bad (_("missing operand")); - new = input_line_pointer; - input_line_pointer = save; - return new; -} - -typedef enum - { - exp_signed, exp_unsigned, exp_sandu - } sign_type; - - -static char * -skip_colonthing (sign, ptr, exp, def, size8, size16, size24) - sign_type sign; - char *ptr; - h8500_operand_info *exp; - int def; - int size8; - int size16; - int size24; -{ - ptr = parse_exp (ptr, &exp->exp, &exp->page); - if (*ptr == ':') - { - ptr++; - if (*ptr == '8') - { - ptr++; - exp->type = size8; - } - else if (ptr[0] == '1' & ptr[1] == '6') - { - ptr += 2; - exp->type = size16; - } - else if (ptr[0] == '2' & ptr[1] == '4') - { - if (!size24) - { - as_bad (_(":24 not valid for this opcode")); - } - ptr += 2; - exp->type = size24; - } - else - { - as_bad (_("expect :8,:16 or :24")); - exp->type = size16; - } - } - else - { - if (exp->page == 'p') - { - exp->type = IMM8; - } - else if (exp->page == 'h') - { - exp->type = IMM16; - } - else - { - /* Let's work out the size from the context */ - int n = exp->exp.X_add_number; - if (size8 - && exp->exp.X_op == O_constant - && ((sign == exp_signed && (n >= -128 && n <= 127)) - || (sign == exp_unsigned && (n >= 0 && (n <= 255))) - || (sign == exp_sandu && (n >= -128 && (n <= 255))))) - { - exp->type = size8; - } - else - { - exp->type = def; - } - } - } - return ptr; -} - -static int -parse_reglist (src, op) - char *src; - h8500_operand_info *op; -{ - int mode; - int rn; - int mask = 0; - int rm; - int idx = 1; /* skip ( */ - - while (src[idx] && src[idx] != ')') - { - int done = parse_reg (src + idx, &mode, &rn); - - if (done) - { - idx += done; - mask |= 1 << rn; - } - else - { - as_bad (_("syntax error in reg list")); - return 0; - } - if (src[idx] == '-') - { - idx++; - done = parse_reg (src + idx, &mode, &rm); - if (done) - { - idx += done; - while (rn <= rm) - { - mask |= 1 << rn; - rn++; - } - } - else - { - as_bad (_("missing final register in range")); - } - } - if (src[idx] == ',') - idx++; - } - idx++; - op->exp.X_add_symbol = 0; - op->exp.X_op_symbol = 0; - op->exp.X_add_number = mask; - op->exp.X_op = O_constant; - op->exp.X_unsigned = 1; - op->type = IMM8; - return idx; - -} - -/* The many forms of operand: - - Rn Register direct - @Rn Register indirect - @(disp[:size], Rn) Register indirect with displacement - @Rn+ - @-Rn - @aa[:size] absolute - #xx[:size] immediate data - - */ - -static void -get_operand (ptr, op, ispage) - char **ptr; - h8500_operand_info *op; - char ispage; -{ - char *src = *ptr; - int mode; - unsigned int num; - unsigned int len; - op->page = 0; - if (src[0] == '(' && src[1] == 'r') - { - /* This is a register list */ - *ptr = src + parse_reglist (src, op); - return; - } - - len = parse_reg (src, &op->type, &op->reg); - - if (len) - { - *ptr = src + len; - return; - } - - if (*src == '@') - { - src++; - if (*src == '-') - { - src++; - len = parse_reg (src, &mode, &num); - if (len == 0) - { - /* Oops, not a reg after all, must be ordinary exp */ - src--; - /* must be a symbol */ - *ptr = skip_colonthing (exp_unsigned, src, - op, ABS16, ABS8, ABS16, ABS24); - return; - } - - op->type = RNDEC; - op->reg = num; - *ptr = src + len; - return; - } - if (*src == '(') - { - /* Disp */ - src++; - - src = skip_colonthing (exp_signed, src, - op, RNIND_D16, RNIND_D8, RNIND_D16, 0); - - if (*src != ',') - { - as_bad (_("expected @(exp, Rn)")); - return; - } - src++; - len = parse_reg (src, &mode, &op->reg); - if (len == 0 || mode != RN) - { - as_bad (_("expected @(exp, Rn)")); - return; - } - src += len; - if (*src != ')') - { - as_bad (_("expected @(exp, Rn)")); - return; - } - *ptr = src + 1; - return; - } - len = parse_reg (src, &mode, &num); - - if (len) - { - src += len; - if (*src == '+') - { - src++; - if (mode != RN) - { - as_bad (_("@Rn+ needs word register")); - return; - } - op->type = RNINC; - op->reg = num; - *ptr = src; - return; - } - if (mode != RN) - { - as_bad (_("@Rn needs word register")); - return; - } - op->type = RNIND; - op->reg = num; - *ptr = src; - return; - } - else - { - /* must be a symbol */ - *ptr = - skip_colonthing (exp_unsigned, src, op, - ispage ? ABS24 : ABS16, ABS8, ABS16, ABS24); - return; - } - } - - if (*src == '#') - { - src++; - *ptr = skip_colonthing (exp_sandu, src, op, IMM16, IMM8, IMM16, ABS24); - return; - } - else - { - *ptr = skip_colonthing (exp_signed, src, op, - ispage ? ABS24 : PCREL8, PCREL8, PCREL16, ABS24); - } -} - -static -char * -get_operands (info, args, operand) - h8500_opcode_info *info; - char *args; - h8500_operand_info *operand; - -{ - char *ptr = args; - - switch (info->nargs) - { - case 0: - operand[0].type = 0; - operand[1].type = 0; - break; - - case 1: - ptr++; - get_operand (&ptr, operand + 0, info->name[0] == 'p'); - operand[1].type = 0; - break; - - case 2: - ptr++; - get_operand (&ptr, operand + 0, 0); - if (*ptr == ',') - ptr++; - get_operand (&ptr, operand + 1, 0); - break; - - default: - abort (); - } - - return ptr; -} - -/* Passed a pointer to a list of opcodes which use different - addressing modes, return the opcode which matches the opcodes - provided - */ - -int pcrel8; /* Set when we've seen a pcrel operand */ - -static -h8500_opcode_info * -get_specific (opcode, operands) - h8500_opcode_info *opcode; - h8500_operand_info *operands; -{ - h8500_opcode_info *this_try = opcode; - int found = 0; - unsigned int noperands = opcode->nargs; - - unsigned int this_index = opcode->idx; - - while (this_index == opcode->idx && !found) - { - unsigned int i; - - this_try = opcode++; - - /* look at both operands needed by the opcodes and provided by - the user*/ - for (i = 0; i < noperands; i++) - { - h8500_operand_info *user = operands + i; - - switch (this_try->arg_type[i]) - { - case FPIND_D8: - /* Opcode needs (disp:8,fp) */ - if (user->type == RNIND_D8 && user->reg == 6) - { - displacement = user->exp; - continue; - } - break; - case RDIND_D16: - if (user->type == RNIND_D16) - { - displacement = user->exp; - rd = user->reg; - continue; - } - break; - case RDIND_D8: - if (user->type == RNIND_D8) - { - displacement = user->exp; - rd = user->reg; - continue; - } - break; - case RNIND_D16: - case RNIND_D8: - if (user->type == this_try->arg_type[i]) - { - displacement = user->exp; - rn = user->reg; - continue; - } - break; - - case SPDEC: - if (user->type == RNDEC && user->reg == 7) - { - continue; - } - break; - case SPINC: - if (user->type == RNINC && user->reg == 7) - { - continue; - } - break; - case ABS16: - if (user->type == ABS16) - { - absolute = user->exp; - continue; - } - break; - case ABS8: - if (user->type == ABS8) - { - absolute = user->exp; - continue; - } - break; - case ABS24: - if (user->type == ABS24) - { - absolute = user->exp; - continue; - } - break; - - case CRB: - if ((user->type == CRB || user->type == CR) && user->reg != 0) - { - crb = user->reg; - continue; - } - break; - case CRW: - if ((user->type == CRW || user->type == CR) && user->reg == 0) - { - crw = user->reg; - continue; - } - break; - case DISP16: - if (user->type == DISP16) - { - displacement = user->exp; - continue; - } - break; - case DISP8: - if (user->type == DISP8) - { - displacement = user->exp; - continue; - } - break; - case FP: - if (user->type == RN && user->reg == 6) - { - continue; - } - break; - case PCREL16: - if (user->type == PCREL16) - { - displacement = user->exp; - continue; - } - break; - case PCREL8: - if (user->type == PCREL8) - { - displacement = user->exp; - pcrel8 = 1; - continue; - } - break; - - case IMM16: - if (user->type == IMM16 - || user->type == IMM8) - { - immediate_inpage = user->page; - immediate = user->exp; - continue; - } - break; - case RLIST: - case IMM8: - if (user->type == IMM8) - { - immediate_inpage = user->page; - immediate = user->exp; - continue; - } - break; - case IMM4: - if (user->type == IMM8) - { - immediate_inpage = user->page; - immediate = user->exp; - continue; - } - break; - case QIM: - if (user->type == IMM8 - && user->exp.X_op == O_constant - && - (user->exp.X_add_number == -2 - || user->exp.X_add_number == -1 - || user->exp.X_add_number == 1 - || user->exp.X_add_number == 2)) - { - immediate_inpage = user->page; - immediate = user->exp; - continue; - } - break; - case RD: - if (user->type == RN) - { - rd = user->reg; - continue; - } - break; - case RS: - if (user->type == RN) - { - rs = user->reg; - continue; - } - break; - case RDIND: - if (user->type == RNIND) - { - rd = user->reg; - continue; - - } - break; - case RNINC: - case RNIND: - case RNDEC: - case RN: - - if (user->type == this_try->arg_type[i]) - { - rn = user->reg; - continue; - } - break; - case SP: - if (user->type == RN && user->reg == 7) - { - continue; - } - break; - default: - printf (_("unhandled %d\n"), this_try->arg_type[i]); - break; - } - - /* If we get here this didn't work out */ - goto fail; - } - found = 1; - fail:; - - } - - if (found) - return this_try; - else - return 0; -} - -int -check (operand, low, high) - expressionS *operand; - int low; - int high; -{ - if (operand->X_op != O_constant - || operand->X_add_number < low - || operand->X_add_number > high) - { - as_bad (_("operand must be absolute in range %d..%d"), low, high); - } - return operand->X_add_number; -} - -static -void -insert (output, index, exp, reloc, pcrel) - char *output; - int index; - expressionS *exp; - int reloc; - int pcrel; -{ - fix_new_exp (frag_now, - output - frag_now->fr_literal + index, - 4, /* always say size is 4, but we know better */ - exp, - pcrel, - reloc); -} - -void -build_relaxable_instruction (opcode, operand) - h8500_opcode_info *opcode; - h8500_operand_info *operand; -{ - /* All relaxable instructions start life as two bytes but can become - three bytes long if a lonely branch and up to 9 bytes if long scb - */ - char *p; - int len; - int type; - - if (opcode->bytes[0].contents == 0x01) - { - type = SCB_F; - } - else if (opcode->bytes[0].contents == 0x06 - || opcode->bytes[0].contents == 0x07) - { - type = SCB_TST; - } - else - { - type = BRANCH; - } - - p = frag_var (rs_machine_dependent, - md_relax_table[C (type, WORD_DISP)].rlx_length, - len = md_relax_table[C (type, BYTE_DISP)].rlx_length, - C (type, UNDEF_BYTE_DISP), - displacement.X_add_symbol, - displacement.X_add_number, - 0); - - p[0] = opcode->bytes[0].contents; - if (type != BRANCH) - { - p[1] = opcode->bytes[1].contents | rs; - } -} - -/* Now we know what sort of opcodes it is, lets build the bytes - - */ -static void -build_bytes (opcode, operand) - h8500_opcode_info *opcode; - h8500_operand_info *operand; - -{ - int index; - - if (pcrel8) - { - pcrel8 = 0; - build_relaxable_instruction (opcode, operand); - } - else - { - char *output = frag_more (opcode->length); - - memset (output, 0, opcode->length); - for (index = 0; index < opcode->length; index++) - { - output[index] = opcode->bytes[index].contents; - - switch (opcode->bytes[index].insert) - { - default: - printf (_("failed for %d\n"), opcode->bytes[index].insert); - break; - case 0: - break; - case RN: - output[index] |= rn; - break; - case RD: - case RDIND: - - output[index] |= rd; - break; - case RS: - output[index] |= rs; - break; - case DISP16: - insert (output, index, &displacement, R_H8500_IMM16, 0); - index++; - break; - case DISP8: - case FPIND_D8: - insert (output, index, &displacement, R_H8500_IMM8, 0); - break; - - case IMM16: - { - int p; - switch (immediate_inpage) { - case 'p': - p = R_H8500_HIGH16; - break; - case 'h': - p = R_H8500_HIGH16; - break; - default: - p = R_H8500_IMM16; - break; - } - - insert (output, index, &immediate,p, 0); - } - - index++; - break; - case RLIST: - case IMM8: - if (immediate_inpage) - { - insert (output, index, &immediate, R_H8500_HIGH8, 0); - } - else - { - insert (output, index, &immediate, R_H8500_IMM8, 0); - } - break; - case PCREL16: - insert (output, index, &displacement, R_H8500_PCREL16, 1); - index++; - break; - case PCREL8: - insert (output, index, &displacement, R_H8500_PCREL8, 1); - break; - case IMM4: - output[index] |= check (&immediate, 0, 15); - break; - case CR: - - output[index] |= cr; - if (cr == 0) - { - output[0] |= 0x8; - } - else - { - output[0] &= ~0x8; - } - - break; - - case CRB: - output[index] |= crb; - output[0] &= ~0x8; - break; - case CRW: - output[index] |= crw; - output[0] |= 0x8; - break; - case ABS24: - insert (output, index, &absolute, R_H8500_IMM24, 0); - index += 2; - break; - case ABS16: - insert (output, index, &absolute, R_H8500_IMM16, 0); - index++; - break; - case ABS8: - insert (output, index, &absolute, R_H8500_IMM8, 0); - break; - case QIM: - switch (immediate.X_add_number) - { - case -2: - output[index] |= 0x5; - break; - case -1: - output[index] |= 0x4; - break; - case 1: - output[index] |= 0; - break; - case 2: - output[index] |= 1; - break; - } - break; - } - } - } -} - -/* This is the guts of the machine-dependent assembler. STR points to a - machine dependent instruction. This funciton is supposed to emit - the frags/bytes it assembles to. - */ - -void -DEFUN (md_assemble, (str), - char *str) -{ - char *op_start; - char *op_end; - h8500_operand_info operand[2]; - h8500_opcode_info *opcode; - h8500_opcode_info *prev_opcode; - char name[11]; - - int nlen = 0; - - /* Drop leading whitespace */ - while (*str == ' ') - str++; - - /* find the op code end */ - for (op_start = op_end = str; - *op_end && - !is_end_of_line[*op_end] && *op_end != ' '; - op_end++) - { - if ( /**op_end != '.' - && *op_end != ':' - && */ nlen < 10) - { - name[nlen++] = *op_end; - } - } - name[nlen] = 0; - - if (op_end == op_start) - { - as_bad (_("can't find opcode ")); - } - - opcode = (h8500_opcode_info *) hash_find (opcode_hash_control, name); - - if (opcode == NULL) - { - as_bad (_("unknown opcode")); - return; - } - - get_operands (opcode, op_end, operand); - prev_opcode = opcode; - - opcode = get_specific (opcode, operand); - - if (opcode == 0) - { - /* Couldn't find an opcode which matched the operands */ - char *where = frag_more (2); - - where[0] = 0x0; - where[1] = 0x0; - as_bad (_("invalid operands for opcode")); - return; - } - - build_bytes (opcode, operand); - -} - -void -DEFUN (tc_crawl_symbol_chain, (headers), - object_headers * headers) -{ - printf (_("call to tc_crawl_symbol_chain \n")); -} - -symbolS * -DEFUN (md_undefined_symbol, (name), - char *name) -{ - return 0; -} - -void -DEFUN (tc_headers_hook, (headers), - object_headers * headers) -{ - printf (_("call to tc_headers_hook \n")); -} - -/* Various routines to kill one day */ -/* Equal to MAX_PRECISION in atof-ieee.c */ -#define MAX_LITTLENUMS 6 - -/* Turn a string in input_line_pointer into a floating point constant of type - type, and store the appropriate bytes in *litP. The number of LITTLENUMS - emitted is stored in *sizeP . An error message is returned, or NULL on OK. - */ -char * -md_atof (type, litP, sizeP) - char type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - LITTLENUM_TYPE *wordP; - char *t; - char *atof_ieee (); - - switch (type) - { - case 'f': - case 'F': - case 's': - case 'S': - prec = 2; - break; - - case 'd': - case 'D': - case 'r': - case 'R': - prec = 4; - break; - - case 'x': - case 'X': - prec = 6; - break; - - case 'p': - case 'P': - prec = 6; - break; - - default: - *sizeP = 0; - return _("Bad call to MD_ATOF()"); - } - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - - *sizeP = prec * sizeof (LITTLENUM_TYPE); - for (wordP = words; prec--;) - { - md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - return 0; -} - -CONST char *md_shortopts = ""; -struct option md_longopts[] = { - {NULL, no_argument, NULL, 0} -}; -size_t md_longopts_size = sizeof(md_longopts); - -int -md_parse_option (c, arg) - int c; - char *arg; -{ - return 0; -} - -void -md_show_usage (stream) - FILE *stream; -{ -} - -void -tc_aout_fix_to_chars () -{ - printf (_("call to tc_aout_fix_to_chars \n")); - abort (); -} - -static -void -wordify_scb (buffer, disp_size, inst_size) - char *buffer; - int *disp_size; - int *inst_size; -{ - int rn = buffer[1] & 0x7; - - switch (buffer[0]) - { - case 0x0e: /* BSR */ - case 0x20: - case 0x21: - case 0x22: - case 0x23: - case 0x24: - case 0x25: - case 0x26: - case 0x27: - case 0x28: - case 0x29: - case 0x2a: - case 0x2b: - case 0x2c: - case 0x2d: - case 0x2e: - case 0x2f: - buffer[0] |= 0x10; - buffer[1] = 0; - buffer[2] = 0; - *disp_size = 2; - *inst_size = 1; - return; - default: - abort (); - - case 0x01: - *inst_size = 6; - *disp_size = 2; - break; - case 0x06: - *inst_size = 8; - *disp_size = 2; - - *buffer++ = 0x26; /* bne + 8 */ - *buffer++ = 0x08; - break; - case 0x07: - *inst_size = 8; - *disp_size = 2; - *buffer++ = 0x27; /* bne + 8 */ - *buffer++ = 0x08; - break; - - } - *buffer++ = 0xa8 | rn; /* addq -1,rn */ - *buffer++ = 0x0c; - *buffer++ = 0x04; /* cmp #0xff:8, rn */ - *buffer++ = 0xff; - *buffer++ = 0x70 | rn; - *buffer++ = 0x36; /* bne ... */ - *buffer++ = 0; - *buffer++ = 0; -} - -/* -called after relaxing, change the frags so they know how big they are -*/ -void -md_convert_frag (headers, seg, fragP) - object_headers *headers; - segT seg; - fragS *fragP; -{ - int disp_size = 0; - int inst_size = 0; - char *buffer = fragP->fr_fix + fragP->fr_literal; - - switch (fragP->fr_subtype) - { - case C (BRANCH, BYTE_DISP): - disp_size = 1; - inst_size = 1; - break; - - case C (SCB_F, BYTE_DISP): - case C (SCB_TST, BYTE_DISP): - disp_size = 1; - inst_size = 2; - break; - - /* Branches to a known 16 bit displacement */ - - /* Turn on the 16bit bit */ - case C (BRANCH, WORD_DISP): - case C (SCB_F, WORD_DISP): - case C (SCB_TST, WORD_DISP): - wordify_scb (buffer, &disp_size, &inst_size); - break; - - case C (BRANCH, UNDEF_WORD_DISP): - case C (SCB_F, UNDEF_WORD_DISP): - case C (SCB_TST, UNDEF_WORD_DISP): - /* This tried to be relaxed, but didn't manage it, it now needs a - fix */ - wordify_scb (buffer, &disp_size, &inst_size); - - /* Make a reloc */ - fix_new (fragP, - fragP->fr_fix + inst_size, - 4, - fragP->fr_symbol, - fragP->fr_offset, - 0, - R_H8500_PCREL16); - - fragP->fr_fix += disp_size + inst_size; - fragP->fr_var = 0; - return; - break; - default: - abort (); - } - if (inst_size) - { - /* Get the address of the end of the instruction */ - int next_inst = fragP->fr_fix + fragP->fr_address + disp_size + inst_size; - int targ_addr = (S_GET_VALUE (fragP->fr_symbol) + - fragP->fr_offset); - int disp = targ_addr - next_inst; - - md_number_to_chars (buffer + inst_size, disp, disp_size); - fragP->fr_fix += disp_size + inst_size; - fragP->fr_var = 0; - } -} - -valueT -md_section_align (seg, size) - segT seg ; - valueT size; -{ - return ((size + (1 << section_alignment[(int) seg]) - 1) - & (-1 << section_alignment[(int) seg])); - -} - -void -md_apply_fix (fixP, val) - fixS *fixP; - long val; -{ - char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; - - if (fixP->fx_r_type == 0) - { - fixP->fx_r_type = fixP->fx_size == 4 ? R_H8500_IMM32 : R_H8500_IMM16; - } - - switch (fixP->fx_r_type) - { - - case R_H8500_IMM8: - case R_H8500_PCREL8: - *buf++ = val; - break; - case R_H8500_IMM16: - case R_H8500_LOW16: - case R_H8500_PCREL16: - *buf++ = (val >> 8); - *buf++ = val; - break; - case R_H8500_HIGH8: - *buf++ = val >> 16; - break; - case R_H8500_HIGH16: - *buf++ = val >> 24; - *buf++ = val >> 16; - break; - case R_H8500_IMM24: - *buf++ = (val >> 16); - *buf++ = (val >> 8); - *buf++ = val; - break; - case R_H8500_IMM32: - *buf++ = (val >> 24); - *buf++ = (val >> 16); - *buf++ = (val >> 8); - *buf++ = val; - break; - default: - abort (); - - } -} - -/* -called just before address relaxation, return the length -by which a fragment must grow to reach it's destination -*/ -int -md_estimate_size_before_relax (fragP, segment_type) - register fragS *fragP; - register segT segment_type; -{ - int what = GET_WHAT (fragP->fr_subtype); - - switch (fragP->fr_subtype) - { - default: - abort (); - case C (BRANCH, UNDEF_BYTE_DISP): - case C (SCB_F, UNDEF_BYTE_DISP): - case C (SCB_TST, UNDEF_BYTE_DISP): - /* used to be a branch to somewhere which was unknown */ - if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type) - { - /* Got a symbol and it's defined in this segment, become byte - sized - maybe it will fix up */ - fragP->fr_subtype = C (what, BYTE_DISP); - fragP->fr_var = md_relax_table[C (what, BYTE_DISP)].rlx_length; - } - else - { - /* Its got a segment, but its not ours, so it will always be long */ - fragP->fr_subtype = C (what, UNDEF_WORD_DISP); - fragP->fr_var = md_relax_table[C (what, WORD_DISP)].rlx_length; - return md_relax_table[C (what, WORD_DISP)].rlx_length; - } - } - return fragP->fr_var; -} - -/* Put number into target byte order */ - -void -md_number_to_chars (ptr, use, nbytes) - char *ptr; - valueT use; - int nbytes; -{ - number_to_chars_bigendian (ptr, use, nbytes); -} - -long -md_pcrel_from (fixP) - fixS *fixP; -{ - return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address; -} - -/*ARGSUSED*/ -void -tc_coff_symbol_emit_hook (ignore) - symbolS *ignore; -{ -} - -short -tc_coff_fix2rtype (fix_ptr) - fixS *fix_ptr; -{ - if (fix_ptr->fx_r_type == RELOC_32) - { - /* cons likes to create reloc32's whatever the size of the reloc.. - */ - switch (fix_ptr->fx_size) - { - case 2: - return R_H8500_IMM16; - break; - case 1: - return R_H8500_IMM8; - break; - default: - abort (); - } - } - return fix_ptr->fx_r_type; -} - -void -tc_reloc_mangle (fix_ptr, intr, base) - fixS *fix_ptr; - struct internal_reloc *intr; - bfd_vma base; - -{ - symbolS *symbol_ptr; - - symbol_ptr = fix_ptr->fx_addsy; - - /* If this relocation is attached to a symbol then it's ok - to output it */ - if (fix_ptr->fx_r_type == RELOC_32) - { - /* cons likes to create reloc32's whatever the size of the reloc.. - */ - switch (fix_ptr->fx_size) - { - case 2: - intr->r_type = R_IMM16; - break; - case 1: - intr->r_type = R_IMM8; - break; - default: - abort (); - } - } - else - { - intr->r_type = fix_ptr->fx_r_type; - } - - intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base; - intr->r_offset = fix_ptr->fx_offset; - - /* Turn the segment of the symbol into an offset. */ - if (symbol_ptr) - { - symbolS *dot; - - dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot; - if (dot) - { - /* intr->r_offset -= - segment_info[S_GET_SEGMENT(symbol_ptr)].scnhdr.s_paddr;*/ - intr->r_offset += S_GET_VALUE (symbol_ptr); - intr->r_symndx = dot->sy_number; - } - else - { - intr->r_symndx = symbol_ptr->sy_number; - } - - } - else - { - intr->r_symndx = -1; - } - -} - - - -int -start_label (ptr) - char *ptr; -{ - /* Check for :s.w */ - if (isalpha (ptr[1]) && ptr[2] == '.') - return 0; - /* Check for :s */ - if (isalpha (ptr[1]) && !isalpha (ptr[2])) - return 0; - return 1; -} - - -int -tc_coff_sizemachdep (frag) - fragS *frag; -{ - return md_relax_table[frag->fr_subtype].rlx_length; -} - -/* end of tc-h8500.c */ - diff --git a/gas/config/tc-h8500.h b/gas/config/tc-h8500.h deleted file mode 100644 index 2a53ec35ce2..00000000000 --- a/gas/config/tc-h8500.h +++ /dev/null @@ -1,57 +0,0 @@ -/* This file is tc-h8500.h - Copyright (C) 1993, 95, 97, 1998 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - - -#define TC_H8500 - -#define TARGET_BYTES_BIG_ENDIAN 1 - -#if ANSI_PROTOTYPES -struct internal_reloc; -#endif - -#define WORKING_DOT_WORD - -/* This macro translates between an internal fix and an coff reloc type */ -#define TC_COFF_FIX2RTYPE(fixP) tc_coff_fix2rtype(fixP) - -#define BFD_ARCH bfd_arch_h8500 -#define COFF_MAGIC 0x8500 -#define TC_COUNT_RELOC(x) ((x)->fx_addsy||(x)->fx_subsy) -#define IGNORE_NONSTANDARD_ESCAPES - -#define TC_RELOC_MANGLE(s,a,b,c) tc_reloc_mangle(a,b,c) -extern void tc_reloc_mangle - PARAMS ((struct fix *, struct internal_reloc *, bfd_vma)); - -#define DO_NOT_STRIP 0 -#define LISTING_HEADER "Hitachi H8/500 GAS " -#define NEED_FX_R_TYPE 1 -#define RELOC_32 1234 - -#define TC_START_LABEL(ch, ptr) (ch == ':' && start_label(ptr)) -#define TC_COFF_SIZEMACHDEP(frag) tc_coff_sizemachdep(frag) - -#define md_operand(x) - -extern struct relax_type md_relax_table[]; -#define TC_GENERIC_RELAX_TABLE md_relax_table - -/* end of tc-h8500.h */ diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c deleted file mode 100644 index 7e95a4ad6d0..00000000000 --- a/gas/config/tc-hppa.c +++ /dev/null @@ -1,8421 +0,0 @@ -/* tc-hppa.c -- Assemble for the PA - Copyright (C) 1989, 93, 94, 95, 96, 97, 98, 1999 - Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler. - - GAS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ - - -/* HP PA-RISC support was contributed by the Center for Software Science - at the University of Utah. */ - -#include -#include - -#include "as.h" -#include "subsegs.h" - -#include "bfd/libhppa.h" -#include "bfd/libbfd.h" - -/* Be careful, this file includes data *declarations*. */ -#include "opcode/hppa.h" - -#if defined (OBJ_ELF) && defined (OBJ_SOM) -error only one of OBJ_ELF and OBJ_SOM can be defined -#endif - -/* If we are using ELF, then we probably can support dwarf2 debug - records. Furthermore, if we are supporting dwarf2 debug records, - then we want to use the assembler support for compact line numbers. */ -#ifdef OBJ_ELF -#include "dwarf2dbg.h" -struct dwarf2_line_info debug_line; -#endif - -/* A "convient" place to put object file dependencies which do - not need to be seen outside of tc-hppa.c. */ -#ifdef OBJ_ELF -/* Object file formats specify relocation types. */ -typedef elf_hppa_reloc_type reloc_type; - -/* Object file formats specify BFD symbol types. */ -typedef elf_symbol_type obj_symbol_type; - -#ifdef BFD64 -/* How to generate a relocation. */ -#define hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type -#else -#define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type -#endif - -/* ELF objects can have versions, but apparently do not have anywhere - to store a copyright string. */ -#define obj_version obj_elf_version -#define obj_copyright obj_elf_version - -#define UNWIND_SECTION_NAME ".PARISC.unwind" -#endif - -#ifdef OBJ_SOM -/* Names of various debugging spaces/subspaces. */ -#define GDB_DEBUG_SPACE_NAME "$GDB_DEBUG$" -#define GDB_STRINGS_SUBSPACE_NAME "$GDB_STRINGS$" -#define GDB_SYMBOLS_SUBSPACE_NAME "$GDB_SYMBOLS$" -#define UNWIND_SECTION_NAME "$UNWIND$" - -/* Object file formats specify relocation types. */ -typedef int reloc_type; - -/* SOM objects can have both a version string and a copyright string. */ -#define obj_version obj_som_version -#define obj_copyright obj_som_copyright - -/* How to generate a relocation. */ -#define hppa_gen_reloc_type hppa_som_gen_reloc_type - -/* Object file formats specify BFD symbol types. */ -typedef som_symbol_type obj_symbol_type; - -/* This apparently isn't in older versions of hpux reloc.h. */ -#ifndef R_DLT_REL -#define R_DLT_REL 0x78 -#endif -#endif - -#ifndef R_N0SEL -#define R_N0SEL 0xd8 -#endif - -#ifndef R_N1SEL -#define R_N1SEL 0xd9 -#endif - -/* Various structures and types used internally in tc-hppa.c. */ - -/* Unwind table and descriptor. FIXME: Sync this with GDB version. */ - -struct unwind_desc - { - unsigned int cannot_unwind:1; - unsigned int millicode:1; - unsigned int millicode_save_rest:1; - unsigned int region_desc:2; - unsigned int save_sr:2; - unsigned int entry_fr:4; - unsigned int entry_gr:5; - unsigned int args_stored:1; - unsigned int call_fr:5; - unsigned int call_gr:5; - unsigned int save_sp:1; - unsigned int save_rp:1; - unsigned int save_rp_in_frame:1; - unsigned int extn_ptr_defined:1; - unsigned int cleanup_defined:1; - - unsigned int hpe_interrupt_marker:1; - unsigned int hpux_interrupt_marker:1; - unsigned int reserved:3; - unsigned int frame_size:27; - }; - -struct unwind_table - { - /* Starting and ending offsets of the region described by - descriptor. */ - unsigned int start_offset; - unsigned int end_offset; - struct unwind_desc descriptor; - }; - -/* This structure is used by the .callinfo, .enter, .leave pseudo-ops to - control the entry and exit code they generate. It is also used in - creation of the correct stack unwind descriptors. - - NOTE: GAS does not support .enter and .leave for the generation of - prologues and epilogues. FIXME. - - The fields in structure roughly correspond to the arguments available on the - .callinfo pseudo-op. */ - -struct call_info - { - /* The unwind descriptor being built. */ - struct unwind_table ci_unwind; - - /* Name of this function. */ - symbolS *start_symbol; - - /* (temporary) symbol used to mark the end of this function. */ - symbolS *end_symbol; - - /* Next entry in the chain. */ - struct call_info *ci_next; - }; - -/* Operand formats for FP instructions. Note not all FP instructions - allow all four formats to be used (for example fmpysub only allows - SGL and DBL). */ -typedef enum - { - SGL, DBL, ILLEGAL_FMT, QUAD, W, UW, DW, UDW, QW, UQW - } -fp_operand_format; - -/* This fully describes the symbol types which may be attached to - an EXPORT or IMPORT directive. Only SOM uses this formation - (ELF has no need for it). */ -typedef enum - { - SYMBOL_TYPE_UNKNOWN, - SYMBOL_TYPE_ABSOLUTE, - SYMBOL_TYPE_CODE, - SYMBOL_TYPE_DATA, - SYMBOL_TYPE_ENTRY, - SYMBOL_TYPE_MILLICODE, - SYMBOL_TYPE_PLABEL, - SYMBOL_TYPE_PRI_PROG, - SYMBOL_TYPE_SEC_PROG, - } -pa_symbol_type; - -/* This structure contains information needed to assemble - individual instructions. */ -struct pa_it - { - /* Holds the opcode after parsing by pa_ip. */ - unsigned long opcode; - - /* Holds an expression associated with the current instruction. */ - expressionS exp; - - /* Does this instruction use PC-relative addressing. */ - int pcrel; - - /* Floating point formats for operand1 and operand2. */ - fp_operand_format fpof1; - fp_operand_format fpof2; - - /* Whether or not we saw a truncation request on an fcnv insn. */ - int trunc; - - /* Holds the field selector for this instruction - (for example L%, LR%, etc). */ - long field_selector; - - /* Holds any argument relocation bits associated with this - instruction. (instruction should be some sort of call). */ - long arg_reloc; - - /* The format specification for this instruction. */ - int format; - - /* The relocation (if any) associated with this instruction. */ - reloc_type reloc; - }; - -/* PA-89 floating point registers are arranged like this: - - - +--------------+--------------+ - | 0 or 16L | 16 or 16R | - +--------------+--------------+ - | 1 or 17L | 17 or 17R | - +--------------+--------------+ - | | | - - . . . - . . . - . . . - - | | | - +--------------+--------------+ - | 14 or 30L | 30 or 30R | - +--------------+--------------+ - | 15 or 31L | 31 or 31R | - +--------------+--------------+ - - - The following is a version of pa_parse_number that - handles the L/R notation and returns the correct - value to put into the instruction register field. - The correct value to put into the instruction is - encoded in the structure 'pa_11_fp_reg_struct'. */ - -struct pa_11_fp_reg_struct - { - /* The register number. */ - char number_part; - - /* L/R selector. */ - char l_r_select; - }; - -/* Additional information needed to build argument relocation stubs. */ -struct call_desc - { - /* The argument relocation specification. */ - unsigned int arg_reloc; - - /* Number of arguments. */ - unsigned int arg_count; - }; - -#ifdef OBJ_SOM -/* This structure defines an entry in the subspace dictionary - chain. */ - -struct subspace_dictionary_chain - { - /* Nonzero if this space has been defined by the user code. */ - unsigned int ssd_defined; - - /* Name of this subspace. */ - char *ssd_name; - - /* GAS segment and subsegment associated with this subspace. */ - asection *ssd_seg; - int ssd_subseg; - - /* Next space in the subspace dictionary chain. */ - struct subspace_dictionary_chain *ssd_next; - }; - -typedef struct subspace_dictionary_chain ssd_chain_struct; - -/* This structure defines an entry in the subspace dictionary - chain. */ - -struct space_dictionary_chain - { - /* Nonzero if this space has been defined by the user code or - as a default space. */ - unsigned int sd_defined; - - /* Nonzero if this spaces has been defined by the user code. */ - unsigned int sd_user_defined; - - /* The space number (or index). */ - unsigned int sd_spnum; - - /* The name of this subspace. */ - char *sd_name; - - /* GAS segment to which this subspace corresponds. */ - asection *sd_seg; - - /* Current subsegment number being used. */ - int sd_last_subseg; - - /* The chain of subspaces contained within this space. */ - ssd_chain_struct *sd_subspaces; - - /* The next entry in the space dictionary chain. */ - struct space_dictionary_chain *sd_next; - }; - -typedef struct space_dictionary_chain sd_chain_struct; - -/* This structure defines attributes of the default subspace - dictionary entries. */ - -struct default_subspace_dict - { - /* Name of the subspace. */ - char *name; - - /* FIXME. Is this still needed? */ - char defined; - - /* Nonzero if this subspace is loadable. */ - char loadable; - - /* Nonzero if this subspace contains only code. */ - char code_only; - - /* Nonzero if this is a common subspace. */ - char common; - - /* Nonzero if this is a common subspace which allows symbols - to be multiply defined. */ - char dup_common; - - /* Nonzero if this subspace should be zero filled. */ - char zero; - - /* Sort key for this subspace. */ - unsigned char sort; - - /* Access control bits for this subspace. Can represent RWX access - as well as privilege level changes for gateways. */ - int access; - - /* Index of containing space. */ - int space_index; - - /* Alignment (in bytes) of this subspace. */ - int alignment; - - /* Quadrant within space where this subspace should be loaded. */ - int quadrant; - - /* An index into the default spaces array. */ - int def_space_index; - - /* Subsegment associated with this subspace. */ - subsegT subsegment; - }; - -/* This structure defines attributes of the default space - dictionary entries. */ - -struct default_space_dict - { - /* Name of the space. */ - char *name; - - /* Space number. It is possible to identify spaces within - assembly code numerically! */ - int spnum; - - /* Nonzero if this space is loadable. */ - char loadable; - - /* Nonzero if this space is "defined". FIXME is still needed */ - char defined; - - /* Nonzero if this space can not be shared. */ - char private; - - /* Sort key for this space. */ - unsigned char sort; - - /* Segment associated with this space. */ - asection *segment; - }; -#endif - -/* Structure for previous label tracking. Needed so that alignments, - callinfo declarations, etc can be easily attached to a particular - label. */ -typedef struct label_symbol_struct - { - struct symbol *lss_label; -#ifdef OBJ_SOM - sd_chain_struct *lss_space; -#endif -#ifdef OBJ_ELF - segT lss_segment; -#endif - struct label_symbol_struct *lss_next; - } -label_symbol_struct; - -/* Extra information needed to perform fixups (relocations) on the PA. */ -struct hppa_fix_struct - { - /* The field selector. */ - enum hppa_reloc_field_selector_type_alt fx_r_field; - - /* Type of fixup. */ - int fx_r_type; - - /* Format of fixup. */ - int fx_r_format; - - /* Argument relocation bits. */ - long fx_arg_reloc; - - /* The segment this fixup appears in. */ - segT segment; - }; - -/* Structure to hold information about predefined registers. */ - -struct pd_reg - { - char *name; - int value; - }; - -/* This structure defines the mapping from a FP condition string - to a condition number which can be recorded in an instruction. */ -struct fp_cond_map - { - char *string; - int cond; - }; - -/* This structure defines a mapping from a field selector - string to a field selector type. */ -struct selector_entry - { - char *prefix; - int field_selector; - }; - -/* Prototypes for functions local to tc-hppa.c. */ - -#ifdef OBJ_SOM -static void pa_check_current_space_and_subspace PARAMS ((void)); -#endif - -static fp_operand_format pa_parse_fp_format PARAMS ((char **s)); -static void pa_cons PARAMS ((int)); -static void pa_data PARAMS ((int)); -static void pa_float_cons PARAMS ((int)); -static void pa_fill PARAMS ((int)); -static void pa_lcomm PARAMS ((int)); -static void pa_lsym PARAMS ((int)); -static void pa_stringer PARAMS ((int)); -static void pa_text PARAMS ((int)); -static void pa_version PARAMS ((int)); -static int pa_parse_fp_cmp_cond PARAMS ((char **)); -static int get_expression PARAMS ((char *)); -static int pa_get_absolute_expression PARAMS ((struct pa_it *, char **)); -static int evaluate_absolute PARAMS ((struct pa_it *)); -static unsigned int pa_build_arg_reloc PARAMS ((char *)); -static unsigned int pa_align_arg_reloc PARAMS ((unsigned int, unsigned int)); -static int pa_parse_nullif PARAMS ((char **)); -static int pa_parse_nonneg_cmpsub_cmpltr PARAMS ((char **, int)); -static int pa_parse_neg_cmpsub_cmpltr PARAMS ((char **, int)); -static int pa_parse_neg_add_cmpltr PARAMS ((char **, int)); -static int pa_parse_nonneg_add_cmpltr PARAMS ((char **, int)); -static int pa_parse_cmpb_64_cmpltr PARAMS ((char **)); -static int pa_parse_cmpib_64_cmpltr PARAMS ((char **)); -static int pa_parse_addb_64_cmpltr PARAMS ((char **)); -static void pa_block PARAMS ((int)); -static void pa_brtab PARAMS ((int)); -static void pa_try PARAMS ((int)); -static void pa_call PARAMS ((int)); -static void pa_call_args PARAMS ((struct call_desc *)); -static void pa_callinfo PARAMS ((int)); -static void pa_code PARAMS ((int)); -static void pa_comm PARAMS ((int)); -static void pa_copyright PARAMS ((int)); -static void pa_end PARAMS ((int)); -static void pa_enter PARAMS ((int)); -static void pa_entry PARAMS ((int)); -static void pa_equ PARAMS ((int)); -static void pa_exit PARAMS ((int)); -static void pa_export PARAMS ((int)); -static void pa_type_args PARAMS ((symbolS *, int)); -static void pa_import PARAMS ((int)); -static void pa_label PARAMS ((int)); -static void pa_leave PARAMS ((int)); -static void pa_level PARAMS ((int)); -static void pa_origin PARAMS ((int)); -static void pa_proc PARAMS ((int)); -static void pa_procend PARAMS ((int)); -static void pa_param PARAMS ((int)); -static void pa_undefine_label PARAMS ((void)); -static int need_pa11_opcode PARAMS ((struct pa_it *, - struct pa_11_fp_reg_struct *)); -static int pa_parse_number PARAMS ((char **, struct pa_11_fp_reg_struct *)); -static label_symbol_struct *pa_get_label PARAMS ((void)); -#ifdef OBJ_SOM -static void pa_compiler PARAMS ((int)); -static void pa_align PARAMS ((int)); -static void pa_space PARAMS ((int)); -static void pa_spnum PARAMS ((int)); -static void pa_subspace PARAMS ((int)); -static sd_chain_struct *create_new_space PARAMS ((char *, int, int, - int, int, int, - asection *, int)); -static ssd_chain_struct *create_new_subspace PARAMS ((sd_chain_struct *, - char *, int, int, - int, int, int, - int, int, int, int, - int, asection *)); -static ssd_chain_struct *update_subspace PARAMS ((sd_chain_struct *, - char *, int, int, int, - int, int, int, int, - int, int, int, - asection *)); -static sd_chain_struct *is_defined_space PARAMS ((char *)); -static ssd_chain_struct *is_defined_subspace PARAMS ((char *)); -static sd_chain_struct *pa_segment_to_space PARAMS ((asection *)); -static ssd_chain_struct *pa_subsegment_to_subspace PARAMS ((asection *, - subsegT)); -static sd_chain_struct *pa_find_space_by_number PARAMS ((int)); -static unsigned int pa_subspace_start PARAMS ((sd_chain_struct *, int)); -static sd_chain_struct *pa_parse_space_stmt PARAMS ((char *, int)); -static int pa_next_subseg PARAMS ((sd_chain_struct *)); -static void pa_spaces_begin PARAMS ((void)); -#endif -static void pa_ip PARAMS ((char *)); -static void fix_new_hppa PARAMS ((fragS *, int, int, symbolS *, - long, expressionS *, int, - bfd_reloc_code_real_type, - enum hppa_reloc_field_selector_type_alt, - int, long, int *)); -static int is_end_of_statement PARAMS ((void)); -static int reg_name_search PARAMS ((char *)); -static int pa_chk_field_selector PARAMS ((char **)); -static int is_same_frag PARAMS ((fragS *, fragS *)); -static void process_exit PARAMS ((void)); -static int log2 PARAMS ((int)); -static unsigned int pa_stringer_aux PARAMS ((char *)); -static fp_operand_format pa_parse_fp_cnv_format PARAMS ((char **s)); -static int pa_parse_ftest_gfx_completer PARAMS ((char **)); - -#ifdef OBJ_ELF -static void hppa_elf_mark_end_of_function PARAMS ((void)); -static void pa_build_unwind_subspace PARAMS ((struct call_info *)); -#endif - -/* File and gloally scoped variable declarations. */ - -#ifdef OBJ_SOM -/* Root and final entry in the space chain. */ -static sd_chain_struct *space_dict_root; -static sd_chain_struct *space_dict_last; - -/* The current space and subspace. */ -static sd_chain_struct *current_space; -static ssd_chain_struct *current_subspace; -#endif - -/* Root of the call_info chain. */ -static struct call_info *call_info_root; - -/* The last call_info (for functions) structure - seen so it can be associated with fixups and - function labels. */ -static struct call_info *last_call_info; - -/* The last call description (for actual calls). */ -static struct call_desc last_call_desc; - -/* handle of the OPCODE hash table */ -static struct hash_control *op_hash = NULL; - -/* This array holds the chars that always start a comment. If the - pre-processor is disabled, these aren't very useful. */ -const char comment_chars[] = ";"; - -/* Table of pseudo ops for the PA. FIXME -- how many of these - are now redundant with the overall GAS and the object file - dependent tables? */ -const pseudo_typeS md_pseudo_table[] = -{ - /* align pseudo-ops on the PA specify the actual alignment requested, - not the log2 of the requested alignment. */ -#ifdef OBJ_SOM - {"align", pa_align, 8}, -#endif -#ifdef OBJ_ELF - {"align", s_align_bytes, 8}, -#endif - {"begin_brtab", pa_brtab, 1}, - {"begin_try", pa_try, 1}, - {"block", pa_block, 1}, - {"blockz", pa_block, 0}, - {"byte", pa_cons, 1}, - {"call", pa_call, 0}, - {"callinfo", pa_callinfo, 0}, - {"code", pa_code, 0}, - {"comm", pa_comm, 0}, -#ifdef OBJ_SOM - {"compiler", pa_compiler, 0}, -#endif - {"copyright", pa_copyright, 0}, - {"data", pa_data, 0}, - {"double", pa_float_cons, 'd'}, - {"dword", pa_cons, 8}, - {"end", pa_end, 0}, - {"end_brtab", pa_brtab, 0}, - {"end_try", pa_try, 0}, - {"enter", pa_enter, 0}, - {"entry", pa_entry, 0}, - {"equ", pa_equ, 0}, - {"exit", pa_exit, 0}, - {"export", pa_export, 0}, -#ifdef OBJ_ELF - { "file", dwarf2_directive_file }, -#endif - {"fill", pa_fill, 0}, - {"float", pa_float_cons, 'f'}, - {"half", pa_cons, 2}, - {"import", pa_import, 0}, - {"int", pa_cons, 4}, - {"label", pa_label, 0}, - {"lcomm", pa_lcomm, 0}, - {"leave", pa_leave, 0}, - {"level", pa_level, 0}, -#ifdef OBJ_ELF - { "loc", dwarf2_directive_loc }, -#endif - {"long", pa_cons, 4}, - {"lsym", pa_lsym, 0}, -#ifdef OBJ_SOM - {"nsubspa", pa_subspace, 1}, -#endif - {"octa", pa_cons, 16}, - {"org", pa_origin, 0}, - {"origin", pa_origin, 0}, - {"param", pa_param, 0}, - {"proc", pa_proc, 0}, - {"procend", pa_procend, 0}, - {"quad", pa_cons, 8}, - {"reg", pa_equ, 1}, - {"short", pa_cons, 2}, - {"single", pa_float_cons, 'f'}, -#ifdef OBJ_SOM - {"space", pa_space, 0}, - {"spnum", pa_spnum, 0}, -#endif - {"string", pa_stringer, 0}, - {"stringz", pa_stringer, 1}, -#ifdef OBJ_SOM - {"subspa", pa_subspace, 0}, -#endif - {"text", pa_text, 0}, - {"version", pa_version, 0}, - {"word", pa_cons, 4}, - {NULL, 0, 0} -}; - -/* This array holds the chars that only start a comment at the beginning of - a line. If the line seems to have the form '# 123 filename' - .line and .file directives will appear in the pre-processed output. - - Note that input_file.c hand checks for '#' at the beginning of the - first line of the input file. This is because the compiler outputs - #NO_APP at the beginning of its output. - - Also note that C style comments will always work. */ -const char line_comment_chars[] = "#"; - -/* This array holds the characters which act as line separators. */ -const char line_separator_chars[] = "!"; - -/* Chars that can be used to separate mant from exp in floating point nums. */ -const char EXP_CHARS[] = "eE"; - -/* Chars that mean this number is a floating point constant. - As in 0f12.456 or 0d1.2345e12. - - Be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be - changed in read.c. Ideally it shouldn't hae to know abou it at - all, but nothing is ideal around here. */ -const char FLT_CHARS[] = "rRsSfFdDxXpP"; - -static struct pa_it the_insn; - -/* Points to the end of an expression just parsed by get_expressoin - and friends. FIXME. This shouldn't be handled with a file-global - variable. */ -static char *expr_end; - -/* Nonzero if a .callinfo appeared within the current procedure. */ -static int callinfo_found; - -/* Nonzero if the assembler is currently within a .entry/.exit pair. */ -static int within_entry_exit; - -/* Nonzero if the assembler is currently within a procedure definition. */ -static int within_procedure; - -/* Handle on strucutre which keep track of the last symbol - seen in each subspace. */ -static label_symbol_struct *label_symbols_rootp = NULL; - -/* Holds the last field selector. */ -static int hppa_field_selector; - -/* Nonzero when strict syntax checking is enabled. Zero otherwise. - - Each opcode in the table has a flag which indicates whether or not - strict syntax checking should be enabled for that instruction. */ -static int strict = 0; - -#ifdef OBJ_SOM -/* A dummy bfd symbol so that all relocations have symbols of some kind. */ -static symbolS *dummy_symbol; -#endif - -/* Nonzero if errors are to be printed. */ -static int print_errors = 1; - -/* List of registers that are pre-defined: - - Each general register has one predefined name of the form - %r which has the value . - - Space and control registers are handled in a similar manner, - but use %sr and %cr as their predefined names. - - Likewise for the floating point registers, but of the form - %fr. Floating point registers have additional predefined - names with 'L' and 'R' suffixes (e.g. %fr19L, %fr19R) which - again have the value . - - Many registers also have synonyms: - - %r26 - %r23 have %arg0 - %arg3 as synonyms - %r28 - %r29 have %ret0 - %ret1 as synonyms - %r30 has %sp as a synonym - %r27 has %dp as a synonym - %r2 has %rp as a synonym - - Almost every control register has a synonym; they are not listed - here for brevity. - - The table is sorted. Suitable for searching by a binary search. */ - -static const struct pd_reg pre_defined_registers[] = -{ - {"%arg0", 26}, - {"%arg1", 25}, - {"%arg2", 24}, - {"%arg3", 23}, - {"%cr0", 0}, - {"%cr10", 10}, - {"%cr11", 11}, - {"%cr12", 12}, - {"%cr13", 13}, - {"%cr14", 14}, - {"%cr15", 15}, - {"%cr16", 16}, - {"%cr17", 17}, - {"%cr18", 18}, - {"%cr19", 19}, - {"%cr20", 20}, - {"%cr21", 21}, - {"%cr22", 22}, - {"%cr23", 23}, - {"%cr24", 24}, - {"%cr25", 25}, - {"%cr26", 26}, - {"%cr27", 27}, - {"%cr28", 28}, - {"%cr29", 29}, - {"%cr30", 30}, - {"%cr31", 31}, - {"%cr8", 8}, - {"%cr9", 9}, - {"%dp", 27}, - {"%eiem", 15}, - {"%eirr", 23}, - {"%fr0", 0}, - {"%fr0l", 0}, - {"%fr0r", 0}, - {"%fr1", 1}, - {"%fr10", 10}, - {"%fr10l", 10}, - {"%fr10r", 10}, - {"%fr11", 11}, - {"%fr11l", 11}, - {"%fr11r", 11}, - {"%fr12", 12}, - {"%fr12l", 12}, - {"%fr12r", 12}, - {"%fr13", 13}, - {"%fr13l", 13}, - {"%fr13r", 13}, - {"%fr14", 14}, - {"%fr14l", 14}, - {"%fr14r", 14}, - {"%fr15", 15}, - {"%fr15l", 15}, - {"%fr15r", 15}, - {"%fr16", 16}, - {"%fr16l", 16}, - {"%fr16r", 16}, - {"%fr17", 17}, - {"%fr17l", 17}, - {"%fr17r", 17}, - {"%fr18", 18}, - {"%fr18l", 18}, - {"%fr18r", 18}, - {"%fr19", 19}, - {"%fr19l", 19}, - {"%fr19r", 19}, - {"%fr1l", 1}, - {"%fr1r", 1}, - {"%fr2", 2}, - {"%fr20", 20}, - {"%fr20l", 20}, - {"%fr20r", 20}, - {"%fr21", 21}, - {"%fr21l", 21}, - {"%fr21r", 21}, - {"%fr22", 22}, - {"%fr22l", 22}, - {"%fr22r", 22}, - {"%fr23", 23}, - {"%fr23l", 23}, - {"%fr23r", 23}, - {"%fr24", 24}, - {"%fr24l", 24}, - {"%fr24r", 24}, - {"%fr25", 25}, - {"%fr25l", 25}, - {"%fr25r", 25}, - {"%fr26", 26}, - {"%fr26l", 26}, - {"%fr26r", 26}, - {"%fr27", 27}, - {"%fr27l", 27}, - {"%fr27r", 27}, - {"%fr28", 28}, - {"%fr28l", 28}, - {"%fr28r", 28}, - {"%fr29", 29}, - {"%fr29l", 29}, - {"%fr29r", 29}, - {"%fr2l", 2}, - {"%fr2r", 2}, - {"%fr3", 3}, - {"%fr30", 30}, - {"%fr30l", 30}, - {"%fr30r", 30}, - {"%fr31", 31}, - {"%fr31l", 31}, - {"%fr31r", 31}, - {"%fr3l", 3}, - {"%fr3r", 3}, - {"%fr4", 4}, - {"%fr4l", 4}, - {"%fr4r", 4}, - {"%fr5", 5}, - {"%fr5l", 5}, - {"%fr5r", 5}, - {"%fr6", 6}, - {"%fr6l", 6}, - {"%fr6r", 6}, - {"%fr7", 7}, - {"%fr7l", 7}, - {"%fr7r", 7}, - {"%fr8", 8}, - {"%fr8l", 8}, - {"%fr8r", 8}, - {"%fr9", 9}, - {"%fr9l", 9}, - {"%fr9r", 9}, - {"%hta", 25}, - {"%iir", 19}, - {"%ior", 21}, - {"%ipsw", 22}, - {"%isr", 20}, - {"%itmr", 16}, - {"%iva", 14}, - {"%pcoq", 18}, - {"%pcsq", 17}, - {"%pidr1", 8}, - {"%pidr2", 9}, - {"%pidr3", 12}, - {"%pidr4", 13}, - {"%ppda", 24}, - {"%r0", 0}, - {"%r1", 1}, - {"%r10", 10}, - {"%r11", 11}, - {"%r12", 12}, - {"%r13", 13}, - {"%r14", 14}, - {"%r15", 15}, - {"%r16", 16}, - {"%r17", 17}, - {"%r18", 18}, - {"%r19", 19}, - {"%r2", 2}, - {"%r20", 20}, - {"%r21", 21}, - {"%r22", 22}, - {"%r23", 23}, - {"%r24", 24}, - {"%r25", 25}, - {"%r26", 26}, - {"%r27", 27}, - {"%r28", 28}, - {"%r29", 29}, - {"%r3", 3}, - {"%r30", 30}, - {"%r31", 31}, - {"%r4", 4}, - {"%r5", 5}, - {"%r6", 6}, - {"%r7", 7}, - {"%r8", 8}, - {"%r9", 9}, - {"%rctr", 0}, - {"%ret0", 28}, - {"%ret1", 29}, - {"%rp", 2}, - {"%sar", 11}, - {"%sp", 30}, - {"%sr0", 0}, - {"%sr1", 1}, - {"%sr2", 2}, - {"%sr3", 3}, - {"%sr4", 4}, - {"%sr5", 5}, - {"%sr6", 6}, - {"%sr7", 7}, - {"%tr0", 24}, - {"%tr1", 25}, - {"%tr2", 26}, - {"%tr3", 27}, - {"%tr4", 28}, - {"%tr5", 29}, - {"%tr6", 30}, - {"%tr7", 31} -}; - -/* This table is sorted by order of the length of the string. This is - so we check for <> before we check for <. If we had a <> and checked - for < first, we would get a false match. */ -static const struct fp_cond_map fp_cond_map[] = -{ - {"false?", 0}, - {"false", 1}, - {"true?", 30}, - {"true", 31}, - {"!<=>", 3}, - {"!?>=", 8}, - {"!?<=", 16}, - {"!<>", 7}, - {"!>=", 11}, - {"!?>", 12}, - {"?<=", 14}, - {"!<=", 19}, - {"!?<", 20}, - {"?>=", 22}, - {"!?=", 24}, - {"!=t", 27}, - {"<=>", 29}, - {"=t", 5}, - {"?=", 6}, - {"?<", 10}, - {"<=", 13}, - {"!>", 15}, - {"?>", 18}, - {">=", 21}, - {"!<", 23}, - {"<>", 25}, - {"!=", 26}, - {"!?", 28}, - {"?", 2}, - {"=", 4}, - {"<", 9}, - {">", 17} -}; - -static const struct selector_entry selector_table[] = -{ - {"f", e_fsel}, - {"l", e_lsel}, - {"ld", e_ldsel}, - {"lp", e_lpsel}, - {"lr", e_lrsel}, - {"ls", e_lssel}, - {"lt", e_ltsel}, - {"ltp", e_ltpsel}, - {"n", e_nsel}, - {"nl", e_nlsel}, - {"nlr", e_nlrsel}, - {"p", e_psel}, - {"r", e_rsel}, - {"rd", e_rdsel}, - {"rp", e_rpsel}, - {"rr", e_rrsel}, - {"rs", e_rssel}, - {"rt", e_rtsel}, - {"rtp", e_rtpsel}, - {"t", e_tsel}, -}; - -#ifdef OBJ_SOM -/* default space and subspace dictionaries */ - -#define GDB_SYMBOLS GDB_SYMBOLS_SUBSPACE_NAME -#define GDB_STRINGS GDB_STRINGS_SUBSPACE_NAME - -/* pre-defined subsegments (subspaces) for the HPPA. */ -#define SUBSEG_CODE 0 -#define SUBSEG_LIT 1 -#define SUBSEG_MILLI 2 -#define SUBSEG_DATA 0 -#define SUBSEG_BSS 2 -#define SUBSEG_UNWIND 3 -#define SUBSEG_GDB_STRINGS 0 -#define SUBSEG_GDB_SYMBOLS 1 - -static struct default_subspace_dict pa_def_subspaces[] = -{ - {"$CODE$", 1, 1, 1, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, SUBSEG_CODE}, - {"$DATA$", 1, 1, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, SUBSEG_DATA}, - {"$LIT$", 1, 1, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, SUBSEG_LIT}, - {"$MILLICODE$", 1, 1, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, SUBSEG_MILLI}, - {"$BSS$", 1, 1, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, SUBSEG_BSS}, - {NULL, 0, 1, 0, 0, 0, 0, 255, 0x1f, 0, 4, 0, 0, 0} -}; - -static struct default_space_dict pa_def_spaces[] = -{ - {"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL}, - {"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL}, - {NULL, 0, 0, 0, 0, 0, ASEC_NULL} -}; - -/* Misc local definitions used by the assembler. */ - -/* These macros are used to maintain spaces/subspaces. */ -#define SPACE_DEFINED(space_chain) (space_chain)->sd_defined -#define SPACE_USER_DEFINED(space_chain) (space_chain)->sd_user_defined -#define SPACE_SPNUM(space_chain) (space_chain)->sd_spnum -#define SPACE_NAME(space_chain) (space_chain)->sd_name - -#define SUBSPACE_DEFINED(ss_chain) (ss_chain)->ssd_defined -#define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_name -#endif - -/* Return nonzero if the string pointed to by S potentially represents - a right or left half of a FP register */ -#define IS_R_SELECT(S) (*(S) == 'R' || *(S) == 'r') -#define IS_L_SELECT(S) (*(S) == 'L' || *(S) == 'l') - -/* Insert FIELD into OPCODE starting at bit START. Continue pa_ip - main loop after insertion. */ - -#define INSERT_FIELD_AND_CONTINUE(OPCODE, FIELD, START) \ - { \ - ((OPCODE) |= (FIELD) << (START)); \ - continue; \ - } - -/* Simple range checking for FIELD againt HIGH and LOW bounds. - IGNORE is used to suppress the error message. */ - -#define CHECK_FIELD(FIELD, HIGH, LOW, IGNORE) \ - { \ - if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \ - { \ - if (! IGNORE) \ - as_bad (_("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \ - (int) (FIELD));\ - break; \ - } \ - } - -#define is_DP_relative(exp) \ - ((exp).X_op == O_subtract \ - && strcmp (S_GET_NAME ((exp).X_op_symbol), "$global$") == 0) - -#define is_PC_relative(exp) \ - ((exp).X_op == O_subtract \ - && strcmp (S_GET_NAME ((exp).X_op_symbol), "$PIC_pcrel$0") == 0) - -/* We need some complex handling for stabs (sym1 - sym2). Luckily, we'll - always be able to reduce the expression to a constant, so we don't - need real complex handling yet. */ -#define is_complex(exp) \ - ((exp).X_op != O_constant && (exp).X_op != O_symbol) - -/* Actual functions to implement the PA specific code for the assembler. */ - -/* Called before writing the object file. Make sure entry/exit and - proc/procend pairs match. */ - -void -pa_check_eof () -{ - if (within_entry_exit) - as_fatal (_("Missing .exit\n")); - - if (within_procedure) - as_fatal (_("Missing .procend\n")); -} - -/* Returns a pointer to the label_symbol_struct for the current space. - or NULL if no label_symbol_struct exists for the current space. */ - -static label_symbol_struct * -pa_get_label () -{ - label_symbol_struct *label_chain; - - for (label_chain = label_symbols_rootp; - label_chain; - label_chain = label_chain->lss_next) - { -#ifdef OBJ_SOM - if (current_space == label_chain->lss_space && label_chain->lss_label) - return label_chain; -#endif -#ifdef OBJ_ELF - if (now_seg == label_chain->lss_segment && label_chain->lss_label) - return label_chain; -#endif - } - - return NULL; -} - -/* Defines a label for the current space. If one is already defined, - this function will replace it with the new label. */ - -void -pa_define_label (symbol) - symbolS *symbol; -{ - label_symbol_struct *label_chain = pa_get_label (); - - if (label_chain) - label_chain->lss_label = symbol; - else - { - /* Create a new label entry and add it to the head of the chain. */ - label_chain - = (label_symbol_struct *) xmalloc (sizeof (label_symbol_struct)); - label_chain->lss_label = symbol; -#ifdef OBJ_SOM - label_chain->lss_space = current_space; -#endif -#ifdef OBJ_ELF - label_chain->lss_segment = now_seg; -#endif - label_chain->lss_next = NULL; - - if (label_symbols_rootp) - label_chain->lss_next = label_symbols_rootp; - - label_symbols_rootp = label_chain; - } -} - -/* Removes a label definition for the current space. - If there is no label_symbol_struct entry, then no action is taken. */ - -static void -pa_undefine_label () -{ - label_symbol_struct *label_chain; - label_symbol_struct *prev_label_chain = NULL; - - for (label_chain = label_symbols_rootp; - label_chain; - label_chain = label_chain->lss_next) - { - if (1 -#ifdef OBJ_SOM - && current_space == label_chain->lss_space && label_chain->lss_label -#endif -#ifdef OBJ_ELF - && now_seg == label_chain->lss_segment && label_chain->lss_label -#endif - ) - { - /* Remove the label from the chain and free its memory. */ - if (prev_label_chain) - prev_label_chain->lss_next = label_chain->lss_next; - else - label_symbols_rootp = label_chain->lss_next; - - free (label_chain); - break; - } - prev_label_chain = label_chain; - } -} - - -/* An HPPA-specific version of fix_new. This is required because the HPPA - code needs to keep track of some extra stuff. Each call to fix_new_hppa - results in the creation of an instance of an hppa_fix_struct. An - hppa_fix_struct stores the extra information along with a pointer to the - original fixS. This is attached to the original fixup via the - tc_fix_data field. */ - -static void -fix_new_hppa (frag, where, size, add_symbol, offset, exp, pcrel, - r_type, r_field, r_format, arg_reloc, unwind_bits) - fragS *frag; - int where; - int size; - symbolS *add_symbol; - long offset; - expressionS *exp; - int pcrel; - bfd_reloc_code_real_type r_type; - enum hppa_reloc_field_selector_type_alt r_field; - int r_format; - long arg_reloc; - int* unwind_bits; -{ - fixS *new_fix; - - struct hppa_fix_struct *hppa_fix = (struct hppa_fix_struct *) - obstack_alloc (¬es, sizeof (struct hppa_fix_struct)); - - if (exp != NULL) - new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type); - else - new_fix = fix_new (frag, where, size, add_symbol, offset, pcrel, r_type); - new_fix->tc_fix_data = (void *) hppa_fix; - hppa_fix->fx_r_type = r_type; - hppa_fix->fx_r_field = r_field; - hppa_fix->fx_r_format = r_format; - hppa_fix->fx_arg_reloc = arg_reloc; - hppa_fix->segment = now_seg; -#ifdef OBJ_SOM - if (r_type == R_ENTRY || r_type == R_EXIT) - new_fix->fx_offset = *unwind_bits; -#endif - - /* foo-$global$ is used to access non-automatic storage. $global$ - is really just a marker and has served its purpose, so eliminate - it now so as not to confuse write.c. */ - if (new_fix->fx_subsy - && !strcmp (S_GET_NAME (new_fix->fx_subsy), "$global$")) - new_fix->fx_subsy = NULL; -} - -/* Parse a .byte, .word, .long expression for the HPPA. Called by - cons via the TC_PARSE_CONS_EXPRESSION macro. */ - -void -parse_cons_expression_hppa (exp) - expressionS *exp; -{ - hppa_field_selector = pa_chk_field_selector (&input_line_pointer); - expression (exp); -} - -/* This fix_new is called by cons via TC_CONS_FIX_NEW. - hppa_field_selector is set by the parse_cons_expression_hppa. */ - -void -cons_fix_new_hppa (frag, where, size, exp) - fragS *frag; - int where; - int size; - expressionS *exp; -{ - unsigned int rel_type; - - /* Get a base relocation type. */ - if (is_DP_relative (*exp)) - rel_type = R_HPPA_GOTOFF; - else if (is_complex (*exp)) - rel_type = R_HPPA_COMPLEX; - else - rel_type = R_HPPA; - - if (hppa_field_selector != e_psel && hppa_field_selector != e_fsel) - as_warn (_("Invalid field selector. Assuming F%%.")); - - fix_new_hppa (frag, where, size, - (symbolS *) NULL, (offsetT) 0, exp, 0, rel_type, - hppa_field_selector, size * 8, 0, NULL); - - /* Reset field selector to its default state. */ - hppa_field_selector = 0; -} - -/* This function is called once, at assembler startup time. It should - set up all the tables, etc. that the MD part of the assembler will need. */ - -void -md_begin () -{ - const char *retval = NULL; - int lose = 0; - unsigned int i = 0; - - last_call_info = NULL; - call_info_root = NULL; - - /* Set the default machine type. */ - if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 10)) - as_warn (_("could not set architecture and machine")); - - /* Folding of text and data segments fails miserably on the PA. - Warn user and disable "-R" option. */ - if (flag_readonly_data_in_text) - { - as_warn (_("-R option not supported on this target.")); - flag_readonly_data_in_text = 0; - } - -#ifdef OBJ_SOM - pa_spaces_begin (); -#endif - - op_hash = hash_new (); - - while (i < NUMOPCODES) - { - const char *name = pa_opcodes[i].name; - retval = hash_insert (op_hash, name, (struct pa_opcode *) &pa_opcodes[i]); - if (retval != NULL && *retval != '\0') - { - as_fatal (_("Internal error: can't hash `%s': %s\n"), name, retval); - lose = 1; - } - do - { - if ((pa_opcodes[i].match & pa_opcodes[i].mask) - != pa_opcodes[i].match) - { - fprintf (stderr, _("internal error: losing opcode: `%s' \"%s\"\n"), - pa_opcodes[i].name, pa_opcodes[i].args); - lose = 1; - } - ++i; - } - while (i < NUMOPCODES && !strcmp (pa_opcodes[i].name, name)); - } - - if (lose) - as_fatal (_("Broken assembler. No assembly attempted.")); - -#ifdef OBJ_SOM - /* SOM will change text_section. To make sure we never put - anything into the old one switch to the new one now. */ - subseg_set (text_section, 0); -#endif - -#ifdef OBJ_SOM - dummy_symbol = symbol_find_or_make ("L$dummy"); - S_SET_SEGMENT (dummy_symbol, text_section); - /* Force the symbol to be converted to a real symbol. */ - (void) symbol_get_bfdsym (dummy_symbol); -#endif -} - -/* Assemble a single instruction storing it into a frag. */ -void -md_assemble (str) - char *str; -{ - char *to; - - /* The had better be something to assemble. */ - assert (str); - - /* If we are within a procedure definition, make sure we've - defined a label for the procedure; handle case where the - label was defined after the .PROC directive. - - Note there's not need to diddle with the segment or fragment - for the label symbol in this case. We have already switched - into the new $CODE$ subspace at this point. */ - if (within_procedure && last_call_info->start_symbol == NULL) - { - label_symbol_struct *label_symbol = pa_get_label (); - - if (label_symbol) - { - if (label_symbol->lss_label) - { - last_call_info->start_symbol = label_symbol->lss_label; - symbol_get_bfdsym (label_symbol->lss_label)->flags - |= BSF_FUNCTION; -#ifdef OBJ_SOM - /* Also handle allocation of a fixup to hold the unwind - information when the label appears after the proc/procend. */ - if (within_entry_exit) - { - char *where = frag_more (0); - - fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, - NULL, (offsetT) 0, NULL, - 0, R_HPPA_ENTRY, e_fsel, 0, 0, - (int *)&last_call_info->ci_unwind.descriptor); - } -#endif - } - else - as_bad (_("Missing function name for .PROC (corrupted label chain)")); - } - else - as_bad (_("Missing function name for .PROC")); - } - - /* Assemble the instruction. Results are saved into "the_insn". */ - pa_ip (str); - - /* Get somewhere to put the assembled instrution. */ - to = frag_more (4); - - /* Output the opcode. */ - md_number_to_chars (to, the_insn.opcode, 4); - - /* If necessary output more stuff. */ - if (the_insn.reloc != R_HPPA_NONE) - fix_new_hppa (frag_now, (to - frag_now->fr_literal), 4, NULL, - (offsetT) 0, &the_insn.exp, the_insn.pcrel, - the_insn.reloc, the_insn.field_selector, - the_insn.format, the_insn.arg_reloc, NULL); - -#ifdef OBJ_ELF - if (debug_type == DEBUG_DWARF2) - { - bfd_vma addr; - - /* First update the notion of the current source line. */ - dwarf2_where (&debug_line); - - /* We want the offset of the start of this instruction within the - the current frag. */ - addr = frag_now->fr_address + frag_now_fix () - 4; - - /* And record the information. */ - dwarf2_gen_line_info (addr, &debug_line); - } -#endif -} - -/* Do the real work for assembling a single instruction. Store results - into the global "the_insn" variable. */ - -static void -pa_ip (str) - char *str; -{ - char *error_message = ""; - char *s, c, *argstart, *name, *save_s; - const char *args; - int match = FALSE; - int comma = 0; - int cmpltr, nullif, flag, cond, num; - unsigned long opcode; - struct pa_opcode *insn; - -#ifdef OBJ_SOM - /* We must have a valid space and subspace. */ - pa_check_current_space_and_subspace (); -#endif - - /* Convert everything up to the first whitespace character into lower - case. */ - for (s = str; *s != ' ' && *s != '\t' && *s != '\n' && *s != '\0'; s++) - if (isupper (*s)) - *s = tolower (*s); - - /* Skip to something interesting. */ - for (s = str; isupper (*s) || islower (*s) || (*s >= '0' && *s <= '3'); ++s) - ; - - switch (*s) - { - - case '\0': - break; - - case ',': - comma = 1; - - /*FALLTHROUGH */ - - case ' ': - *s++ = '\0'; - break; - - default: - as_fatal (_("Unknown opcode: `%s'"), str); - } - - save_s = str; - - /* Look up the opcode in the has table. */ - if ((insn = (struct pa_opcode *) hash_find (op_hash, str)) == NULL) - { - as_bad ("Unknown opcode: `%s'", str); - return; - } - - if (comma) - { - *--s = ','; - } - - /* Mark the location where arguments for the instruction start, then - start processing them. */ - argstart = s; - for (;;) - { - /* Do some initialization. */ - opcode = insn->match; - strict = (insn->flags & FLAG_STRICT); - memset (&the_insn, 0, sizeof (the_insn)); - - the_insn.reloc = R_HPPA_NONE; - - /* If this instruction is specific to a particular architecture, - then set a new architecture. */ - /* But do not automatically promote to pa2.0. The automatic promotion - crud is for compatability with HP's old assemblers only. */ - if (insn->arch < 20 - && bfd_get_mach (stdoutput) < insn->arch) - { - if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, insn->arch)) - as_warn (_("could not update architecture and machine")); - } - else if (bfd_get_mach (stdoutput) < insn->arch) - { - match = FALSE; - goto failed; - } - - /* Build the opcode, checking as we go to make - sure that the operands match. */ - for (args = insn->args;; ++args) - { - /* Absorb white space in instruction. */ - while (*s == ' ' || *s == '\t') - s++; - - switch (*args) - { - - /* End of arguments. */ - case '\0': - if (*s == '\0') - match = TRUE; - break; - - case '+': - if (*s == '+') - { - ++s; - continue; - } - if (*s == '-') - continue; - break; - - /* These must match exactly. */ - case '(': - case ')': - case ',': - case ' ': - if (*s++ == *args) - continue; - break; - - /* Handle a 5 bit register or control register field at 10. */ - case 'b': - case '^': - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - num = pa_parse_number (&s, 0); - CHECK_FIELD (num, 31, 0, 0); - INSERT_FIELD_AND_CONTINUE (opcode, num, 21); - - /* Handle %sar or %cr11. No bits get set, we just verify that it - is there. */ - case '!': - /* Skip whitespace before register. */ - while (*s == ' ' || *s == '\t') - s = s + 1; - - if (!strncasecmp(s, "%sar", 4)) - { - s += 4; - continue; - } - else if (!strncasecmp(s, "%cr11", 5)) - { - s += 5; - continue; - } - break; - - /* Handle a 5 bit register field at 15. */ - case 'x': - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - num = pa_parse_number (&s, 0); - CHECK_FIELD (num, 31, 0, 0); - INSERT_FIELD_AND_CONTINUE (opcode, num, 16); - - /* Handle a 5 bit register field at 31. */ - case 't': - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - num = pa_parse_number (&s, 0); - CHECK_FIELD (num, 31, 0, 0); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - - /* Handle a 5 bit register field at 10 and 15. */ - case 'a': - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - num = pa_parse_number (&s, 0); - CHECK_FIELD (num, 31, 0, 0); - opcode |= num << 16; - INSERT_FIELD_AND_CONTINUE (opcode, num, 21); - - /* Handle a 5 bit field length at 31. */ - case 'T': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 32, 1, 0); - INSERT_FIELD_AND_CONTINUE (opcode, 32 - num, 0); - - /* Handle a 5 bit immediate at 15. */ - case '5': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - /* When in strict mode, we want to just reject this - match instead of giving an out of range error. */ - CHECK_FIELD (num, 15, -16, strict); - low_sign_unext (num, 5, &num); - INSERT_FIELD_AND_CONTINUE (opcode, num, 16); - - /* Handle a 5 bit immediate at 31. */ - case 'V': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - /* When in strict mode, we want to just reject this - match instead of giving an out of range error. */ - CHECK_FIELD (num, 15, -16, strict) - low_sign_unext (num, 5, &num); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - - /* Handle an unsigned 5 bit immediate at 31. */ - case 'r': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 31, 0, 0); - INSERT_FIELD_AND_CONTINUE (opcode, num, strict); - - /* Handle an unsigned 5 bit immediate at 15. */ - case 'R': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 31, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 16); - - /* Handle an unsigned 10 bit immediate at 15. */ - case 'U': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 1023, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 16); - - /* Handle a 2 bit space identifier at 17. */ - case 's': - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - num = pa_parse_number (&s, 0); - CHECK_FIELD (num, 3, 0, 1); - INSERT_FIELD_AND_CONTINUE (opcode, num, 14); - - /* Handle a 3 bit space identifier at 18. */ - case 'S': - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - num = pa_parse_number (&s, 0); - CHECK_FIELD (num, 7, 0, 1); - dis_assemble_3 (num, &num); - INSERT_FIELD_AND_CONTINUE (opcode, num, 13); - - /* Handle all completers. */ - case 'c': - switch (*++args) - { - - /* Handle a completer for an indexing load or store. */ - case 'x': - { - int uu = 0; - int m = 0; - int i = 0; - while (*s == ',' && i < 2) - { - s++; - if (strncasecmp (s, "sm", 2) == 0) - { - uu = 1; - m = 1; - s++; - i++; - } - else if (strncasecmp (s, "m", 1) == 0) - m = 1; - else if ((strncasecmp (s, "s ", 2) == 0) - || (strncasecmp (s, "s,", 2) == 0)) - uu = 1; - /* When in strict mode this is a match failure. */ - else if (strict) - { - s--; - break; - } - else - as_bad (_("Invalid Indexed Load Completer.")); - s++; - i++; - } - if (i > 2) - as_bad (_("Invalid Indexed Load Completer Syntax.")); - opcode |= m << 5; - INSERT_FIELD_AND_CONTINUE (opcode, uu, 13); - } - - /* Handle a short load/store completer. */ - case 'm': - case 'q': - case 'J': - case 'e': - { - int a = 0; - int m = 0; - if (*s == ',') - { - int found = 0; - s++; - if (strncasecmp (s, "ma", 2) == 0) - { - a = 0; - m = 1; - found = 1; - } - else if (strncasecmp (s, "mb", 2) == 0) - { - a = 1; - m = 1; - found = 1; - } - - /* When in strict mode, pass through for cache op. */ - if (!found && strict) - s--; - else - { - if (!found) - as_bad (_("Invalid Short Load/Store Completer.")); - s += 2; - } - } - /* If we did not get a ma/mb completer, then we do not - consider this a positive match for 'ce'. */ - else if (*args == 'e') - break; - - /* 'J', 'm' and 'q' are the same, except for where they - encode the before/after field. */ - if (*args == 'm') - { - opcode |= m << 5; - INSERT_FIELD_AND_CONTINUE (opcode, a, 13); - } - else if (*args == 'q') - { - opcode |= m << 3; - INSERT_FIELD_AND_CONTINUE (opcode, a, 2); - } - else if (*args == 'J') - { - /* M bit is explicit in the major opcode. */ - INSERT_FIELD_AND_CONTINUE (opcode, a, 2); - } - else if (*args == 'e') - { - /* Gross! Hide these values in the immediate field - of the instruction, then pull them out later. */ - opcode |= m << 8; - opcode |= a << 9; - continue; - } - } - - /* Handle a stbys completer. */ - case 's': - { - int a = 0; - int m = 0; - int i = 0; - while (*s == ',' && i < 2) - { - s++; - if (strncasecmp (s, "m", 1) == 0) - m = 1; - else if ((strncasecmp (s, "b ", 2) == 0) - || (strncasecmp (s, "b,", 2) == 0)) - a = 0; - else if (strncasecmp (s, "e", 1) == 0) - a = 1; - /* When in strict mode this is a match failure. */ - else if (strict) - { - s--; - break; - } - else - as_bad (_("Invalid Store Bytes Short Completer")); - s++; - i++; - } - if (i > 2) - as_bad (_("Invalid Store Bytes Short Completer")); - opcode |= m << 5; - INSERT_FIELD_AND_CONTINUE (opcode, a, 13); - } - - /* Handle load cache hint completer. */ - case 'c': - cmpltr = 0; - if (!strncmp(s, ",sl", 3)) - { - s += 3; - cmpltr = 2; - } - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10); - - /* Handle store cache hint completer. */ - case 'C': - cmpltr = 0; - if (!strncmp(s, ",sl", 3)) - { - s += 3; - cmpltr = 2; - } - else if (!strncmp(s, ",bc", 3)) - { - s += 3; - cmpltr = 1; - } - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10); - - /* Handle load and clear cache hint completer. */ - case 'd': - cmpltr = 0; - if (!strncmp(s, ",co", 3)) - { - s += 3; - cmpltr = 1; - } - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10); - - /* Handle load ordering completer. */ - case 'o': - if (strncmp(s, ",o", 2) != 0) - break; - s += 2; - continue; - - /* Handle a branch gate completer. */ - case 'g': - if (strncasecmp (s, ",gate", 5) != 0) - break; - s += 5; - continue; - - /* Handle a branch link and push completer. */ - case 'p': - if (strncasecmp (s, ",l,push", 7) != 0) - break; - s += 7; - continue; - - /* Handle a branch link completer. */ - case 'l': - if (strncasecmp (s, ",l", 2) != 0) - break; - s += 2; - continue; - - /* Handle a branch pop completer. */ - case 'P': - if (strncasecmp (s, ",pop", 4) != 0) - break; - s += 4; - continue; - - /* Handle a local processor completer. */ - case 'L': - if (strncasecmp (s, ",l", 2) != 0) - break; - s += 2; - continue; - - /* Handle a PROBE read/write completer. */ - case 'w': - flag = 0; - if (!strncasecmp (s, ",w", 2)) - { - flag = 1; - s += 2; - } - else if (!strncasecmp (s, ",r", 2)) - { - flag = 0; - s += 2; - } - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 6); - - /* Handle MFCTL wide completer. */ - case 'W': - if (strncasecmp (s, ",w", 2) != 0) - break; - s += 2; - continue; - - /* Handle an RFI restore completer. */ - case 'r': - flag = 0; - if (!strncasecmp (s, ",r", 2)) - { - flag = 5; - s += 2; - } - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 5); - - /* Handle a system control completer. */ - case 'Z': - if (*s == ',' && (*(s + 1) == 'm' || *(s + 1) == 'M')) - { - flag = 1; - s += 2; - } - else - flag = 0; - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 5); - - /* Handle intermediate/final completer for DCOR. */ - case 'i': - flag = 0; - if (!strncasecmp (s, ",i", 2)) - { - flag = 1; - s += 2; - } - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 6); - - /* Handle zero/sign extension completer. */ - case 'z': - flag = 1; - if (!strncasecmp (s, ",z", 2)) - { - flag = 0; - s += 2; - } - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 10); - - /* Handle add completer. */ - case 'a': - flag = 1; - if (!strncasecmp (s, ",l", 2)) - { - flag = 2; - s += 2; - } - else if (!strncasecmp (s, ",tsv", 4)) - { - flag = 3; - s += 4; - } - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 10); - - /* Handle 64 bit carry for ADD. */ - case 'Y': - flag = 0; - if (!strncasecmp (s, ",dc,tsv", 7) || - !strncasecmp (s, ",tsv,dc", 7)) - { - flag = 1; - s += 7; - } - else if (!strncasecmp (s, ",dc", 3)) - { - flag = 0; - s += 3; - } - else - break; - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); - - /* Handle 32 bit carry for ADD. */ - case 'y': - flag = 0; - if (!strncasecmp (s, ",c,tsv", 6) || - !strncasecmp (s, ",tsv,c", 6)) - { - flag = 1; - s += 6; - } - else if (!strncasecmp (s, ",c", 2)) - { - flag = 0; - s += 2; - } - else - break; - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); - - /* Handle trap on signed overflow. */ - case 'v': - flag = 0; - if (!strncasecmp (s, ",tsv", 4)) - { - flag = 1; - s += 4; - } - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); - - /* Handle trap on condition and overflow. */ - case 't': - flag = 0; - if (!strncasecmp (s, ",tc,tsv", 7) || - !strncasecmp (s, ",tsv,tc", 7)) - { - flag = 1; - s += 7; - } - else if (!strncasecmp (s, ",tc", 3)) - { - flag = 0; - s += 3; - } - else - break; - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); - - /* Handle 64 bit borrow for SUB. */ - case 'B': - flag = 0; - if (!strncasecmp (s, ",db,tsv", 7) || - !strncasecmp (s, ",tsv,db", 7)) - { - flag = 1; - s += 7; - } - else if (!strncasecmp (s, ",db", 3)) - { - flag = 0; - s += 3; - } - else - break; - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); - - /* Handle 32 bit borrow for SUB. */ - case 'b': - flag = 0; - if (!strncasecmp (s, ",b,tsv", 6) || - !strncasecmp (s, ",tsv,b", 6)) - { - flag = 1; - s += 6; - } - else if (!strncasecmp (s, ",b", 2)) - { - flag = 0; - s += 2; - } - else - break; - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); - - /* Handle trap condition completer for UADDCM. */ - case 'T': - flag = 0; - if (!strncasecmp (s, ",tc", 3)) - { - flag = 1; - s += 3; - } - - INSERT_FIELD_AND_CONTINUE (opcode, flag, 6); - - /* Handle signed/unsigned at 21. */ - case 'S': - { - int sign = 1; - if (strncasecmp (s, ",s", 2) == 0) - { - sign = 1; - s += 2; - } - else if (strncasecmp (s, ",u", 2) == 0) - { - sign = 0; - s += 2; - } - - INSERT_FIELD_AND_CONTINUE (opcode, sign, 10); - } - - /* Handle left/right combination at 17:18. */ - case 'h': - if (*s++ == ',') - { - int lr = 0; - if (*s == 'r') - lr = 2; - else if (*s == 'l') - lr = 0; - else - as_bad(_("Invalid left/right combination completer")); - - s++; - INSERT_FIELD_AND_CONTINUE (opcode, lr, 13); - } - else - as_bad(_("Invalid left/right combination completer")); - break; - - /* Handle saturation at 24:25. */ - case 'H': - { - int sat = 3; - if (strncasecmp (s, ",ss", 3) == 0) - { - sat = 1; - s += 3; - } - else if (strncasecmp (s, ",us", 3) == 0) - { - sat = 0; - s += 3; - } - - INSERT_FIELD_AND_CONTINUE (opcode, sat, 6); - } - - /* Handle permutation completer. */ - case '*': - if (*s++ == ',') - { - int permloc[4]; - int perm = 0; - int i = 0; - permloc[0] = 13; - permloc[1] = 10; - permloc[2] = 8; - permloc[3] = 6; - for (; i < 4; i++) - { - switch (*s++) - { - case '0': - perm = 0; - break; - case '1': - perm = 1; - break; - case '2': - perm = 2; - break; - case '3': - perm = 3; - break; - default: - as_bad(_("Invalid permutation completer")); - } - opcode |= perm << permloc[i]; - } - continue; - } - else - as_bad(_("Invalid permutation completer")); - break; - - default: - abort (); - } - break; - - /* Handle all conditions. */ - case '?': - { - args++; - switch (*args) - { - /* Handle FP compare conditions. */ - case 'f': - cond = pa_parse_fp_cmp_cond (&s); - INSERT_FIELD_AND_CONTINUE (opcode, cond, 0); - - /* Handle an add condition. */ - case 'A': - case 'a': - cmpltr = 0; - flag = 0; - if (*s == ',') - { - s++; - - /* 64 bit conditions. */ - if (*args == 'A') - { - if (*s == '*') - s++; - else - break; - } - else if (*s == '*') - break; - name = s; - - name = s; - while (*s != ',' && *s != ' ' && *s != '\t') - s += 1; - c = *s; - *s = 0x00; - if (strcmp (name, "=") == 0) - cmpltr = 1; - else if (strcmp (name, "<") == 0) - cmpltr = 2; - else if (strcmp (name, "<=") == 0) - cmpltr = 3; - else if (strcasecmp (name, "nuv") == 0) - cmpltr = 4; - else if (strcasecmp (name, "znv") == 0) - cmpltr = 5; - else if (strcasecmp (name, "sv") == 0) - cmpltr = 6; - else if (strcasecmp (name, "od") == 0) - cmpltr = 7; - else if (strcasecmp (name, "tr") == 0) - { - cmpltr = 0; - flag = 1; - } - else if (strcmp (name, "<>") == 0) - { - cmpltr = 1; - flag = 1; - } - else if (strcmp (name, ">=") == 0) - { - cmpltr = 2; - flag = 1; - } - else if (strcmp (name, ">") == 0) - { - cmpltr = 3; - flag = 1; - } - else if (strcasecmp (name, "uv") == 0) - { - cmpltr = 4; - flag = 1; - } - else if (strcasecmp (name, "vnz") == 0) - { - cmpltr = 5; - flag = 1; - } - else if (strcasecmp (name, "nsv") == 0) - { - cmpltr = 6; - flag = 1; - } - else if (strcasecmp (name, "ev") == 0) - { - cmpltr = 7; - flag = 1; - } - /* ",*" is a valid condition. */ - else if (*args == 'a') - as_bad (_("Invalid Add Condition: %s"), name); - *s = c; - } - opcode |= cmpltr << 13; - INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); - - /* Handle non-negated add and branch condition. */ - case 'd': - cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1); - if (cmpltr < 0) - { - as_bad (_("Invalid Add and Branch Condition: %c"), *s); - cmpltr = 0; - } - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); - - /* Handle 64 bit wide-mode add and branch condition. */ - case 'W': - cmpltr = pa_parse_addb_64_cmpltr (&s); - if (cmpltr < 0) - { - as_bad (_("Invalid Add and Branch Condition: %c"), *s); - cmpltr = 0; - } - else - { - /* Negated condition requires an opcode change. */ - opcode |= (cmpltr & 8) << 24; - } - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13); - - /* Handle a negated or non-negated add and branch - condition. */ - case '@': - save_s = s; - cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1); - if (cmpltr < 0) - { - s = save_s; - cmpltr = pa_parse_neg_add_cmpltr (&s, 1); - if (cmpltr < 0) - { - as_bad (_("Invalid Compare/Subtract Condition")); - cmpltr = 0; - } - else - { - /* Negated condition requires an opcode change. */ - opcode |= 1 << 27; - } - } - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); - - /* Handle branch on bit conditions. */ - case 'B': - case 'b': - cmpltr = 0; - if (*s == ',') - { - s++; - - if (*args == 'B') - { - if (*s == '*') - s++; - else - break; - } - else if (*s == '*') - break; - - if (strncmp (s, "<", 1) == 0) - { - cmpltr = 0; - s++; - } - else if (strncmp (s, ">=", 2) == 0) - { - cmpltr = 1; - s += 2; - } - else - as_bad (_("Invalid Bit Branch Condition: %c"), *s); - } - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15); - - /* Handle a compare/subtract condition. */ - case 'S': - case 's': - cmpltr = 0; - flag = 0; - if (*s == ',') - { - s++; - - /* 64 bit conditions. */ - if (*args == 'S') - { - if (*s == '*') - s++; - else - break; - } - else if (*s == '*') - break; - name = s; - - name = s; - while (*s != ',' && *s != ' ' && *s != '\t') - s += 1; - c = *s; - *s = 0x00; - if (strcmp (name, "=") == 0) - cmpltr = 1; - else if (strcmp (name, "<") == 0) - cmpltr = 2; - else if (strcmp (name, "<=") == 0) - cmpltr = 3; - else if (strcasecmp (name, "<<") == 0) - cmpltr = 4; - else if (strcasecmp (name, "<<=") == 0) - cmpltr = 5; - else if (strcasecmp (name, "sv") == 0) - cmpltr = 6; - else if (strcasecmp (name, "od") == 0) - cmpltr = 7; - else if (strcasecmp (name, "tr") == 0) - { - cmpltr = 0; - flag = 1; - } - else if (strcmp (name, "<>") == 0) - { - cmpltr = 1; - flag = 1; - } - else if (strcmp (name, ">=") == 0) - { - cmpltr = 2; - flag = 1; - } - else if (strcmp (name, ">") == 0) - { - cmpltr = 3; - flag = 1; - } - else if (strcasecmp (name, ">>=") == 0) - { - cmpltr = 4; - flag = 1; - } - else if (strcasecmp (name, ">>") == 0) - { - cmpltr = 5; - flag = 1; - } - else if (strcasecmp (name, "nsv") == 0) - { - cmpltr = 6; - flag = 1; - } - else if (strcasecmp (name, "ev") == 0) - { - cmpltr = 7; - flag = 1; - } - /* ",*" is a valid condition. */ - else if (*args != 'S') - as_bad (_("Invalid Compare/Subtract Condition: %s"), - name); - *s = c; - } - opcode |= cmpltr << 13; - INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); - - /* Handle a non-negated compare condition. */ - case 't': - cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s, 1); - if (cmpltr < 0) - { - as_bad (_("Invalid Compare/Subtract Condition: %c"), *s); - cmpltr = 0; - } - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); - - /* Handle a 32 bit compare and branch condition. */ - case 'n': - save_s = s; - cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s, 1); - if (cmpltr < 0) - { - s = save_s; - cmpltr = pa_parse_neg_cmpsub_cmpltr (&s, 1); - if (cmpltr < 0) - { - as_bad (_("Invalid Compare and Branch Condition.")); - cmpltr = 0; - } - else - { - /* Negated condition requires an opcode change. */ - opcode |= 1 << 27; - } - } - - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); - - /* Handle a 64 bit compare and branch condition. */ - case 'N': - cmpltr = pa_parse_cmpb_64_cmpltr (&s); - if (cmpltr >= 0) - { - /* Negated condition requires an opcode change. */ - opcode |= (cmpltr & 8) << 26; - } - else - /* Not a 64 bit cond. Give 32 bit a chance. */ - break; - - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13); - - /* Handle a 64 bit cmpib condition. */ - case 'Q': - cmpltr = pa_parse_cmpib_64_cmpltr (&s); - if (cmpltr < 0) - /* Not a 64 bit cond. Give 32 bit a chance. */ - break; - - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); - - /* Handle a logical instruction condition. */ - case 'L': - case 'l': - cmpltr = 0; - flag = 0; - if (*s == ',') - { - s++; - - /* 64 bit conditions. */ - if (*args == 'L') - { - if (*s == '*') - s++; - else - break; - } - else if (*s == '*') - break; - name = s; - - name = s; - while (*s != ',' && *s != ' ' && *s != '\t') - s += 1; - c = *s; - *s = 0x00; - - - if (strcmp (name, "=") == 0) - cmpltr = 1; - else if (strcmp (name, "<") == 0) - cmpltr = 2; - else if (strcmp (name, "<=") == 0) - cmpltr = 3; - else if (strcasecmp (name, "od") == 0) - cmpltr = 7; - else if (strcasecmp (name, "tr") == 0) - { - cmpltr = 0; - flag = 1; - } - else if (strcmp (name, "<>") == 0) - { - cmpltr = 1; - flag = 1; - } - else if (strcmp (name, ">=") == 0) - { - cmpltr = 2; - flag = 1; - } - else if (strcmp (name, ">") == 0) - { - cmpltr = 3; - flag = 1; - } - else if (strcasecmp (name, "ev") == 0) - { - cmpltr = 7; - flag = 1; - } - /* ",*" is a valid condition. */ - else if (*args != 'L') - as_bad (_("Invalid Logical Instruction Condition.")); - *s = c; - } - opcode |= cmpltr << 13; - INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); - - /* Handle a shift/extract/deposit condition. */ - case 'X': - case 'x': - case 'y': - cmpltr = 0; - if (*s == ',') - { - save_s = s++; - - /* 64 bit conditions. */ - if (*args == 'X') - { - if (*s == '*') - s++; - else - break; - } - else if (*s == '*') - break; - name = s; - - name = s; - while (*s != ',' && *s != ' ' && *s != '\t') - s += 1; - c = *s; - *s = 0x00; - if (strcmp (name, "=") == 0) - cmpltr = 1; - else if (strcmp (name, "<") == 0) - cmpltr = 2; - else if (strcasecmp (name, "od") == 0) - cmpltr = 3; - else if (strcasecmp (name, "tr") == 0) - cmpltr = 4; - else if (strcmp (name, "<>") == 0) - cmpltr = 5; - else if (strcmp (name, ">=") == 0) - cmpltr = 6; - else if (strcasecmp (name, "ev") == 0) - cmpltr = 7; - /* Handle movb,n. Put things back the way they were. - This includes moving s back to where it started. */ - else if (strcasecmp (name, "n") == 0 && *args == 'y') - { - *s = c; - s = save_s; - continue; - } - /* ",*" is a valid condition. */ - else if (*args != 'X') - as_bad (_("Invalid Shift/Extract/Deposit Condition.")); - *s = c; - } - INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); - - /* Handle a unit instruction condition. */ - case 'U': - case 'u': - cmpltr = 0; - flag = 0; - if (*s == ',') - { - s++; - - /* 64 bit conditions. */ - if (*args == 'U') - { - if (*s == '*') - s++; - else - break; - } - else if (*s == '*') - break; - - if (strncasecmp (s, "sbz", 3) == 0) - { - cmpltr = 2; - s += 3; - } - else if (strncasecmp (s, "shz", 3) == 0) - { - cmpltr = 3; - s += 3; - } - else if (strncasecmp (s, "sdc", 3) == 0) - { - cmpltr = 4; - s += 3; - } - else if (strncasecmp (s, "sbc", 3) == 0) - { - cmpltr = 6; - s += 3; - } - else if (strncasecmp (s, "shc", 3) == 0) - { - cmpltr = 7; - s += 3; - } - else if (strncasecmp (s, "tr", 2) == 0) - { - cmpltr = 0; - flag = 1; - s += 2; - } - else if (strncasecmp (s, "nbz", 3) == 0) - { - cmpltr = 2; - flag = 1; - s += 3; - } - else if (strncasecmp (s, "nhz", 3) == 0) - { - cmpltr = 3; - flag = 1; - s += 3; - } - else if (strncasecmp (s, "ndc", 3) == 0) - { - cmpltr = 4; - flag = 1; - s += 3; - } - else if (strncasecmp (s, "nbc", 3) == 0) - { - cmpltr = 6; - flag = 1; - s += 3; - } - else if (strncasecmp (s, "nhc", 3) == 0) - { - cmpltr = 7; - flag = 1; - s += 3; - } - else if (strncasecmp (s, "swz", 3) == 0) - { - cmpltr = 1; - flag = 0; - s += 3; - } - else if (strncasecmp (s, "swc", 3) == 0) - { - cmpltr = 5; - flag = 0; - s += 3; - } - else if (strncasecmp (s, "nwz", 3) == 0) - { - cmpltr = 1; - flag = 1; - s += 3; - } - else if (strncasecmp (s, "nwc", 3) == 0) - { - cmpltr = 5; - flag = 1; - s += 3; - } - /* ",*" is a valid condition. */ - else if (*args != 'U') - as_bad (_("Invalid Unit Instruction Condition.")); - } - opcode |= cmpltr << 13; - INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); - - default: - abort (); - } - break; - } - - /* Handle a nullification completer for branch instructions. */ - case 'n': - nullif = pa_parse_nullif (&s); - INSERT_FIELD_AND_CONTINUE (opcode, nullif, 1); - - /* Handle a nullification completer for copr and spop insns. */ - case 'N': - nullif = pa_parse_nullif (&s); - INSERT_FIELD_AND_CONTINUE (opcode, nullif, 5); - - /* Handle ,%r2 completer for new syntax branches. */ - case 'L': - if (*s == ',' && strncasecmp (s + 1, "%r2", 3) == 0) - s += 4; - else if (*s == ',' && strncasecmp (s + 1, "%rp", 3) == 0) - s += 4; - else - break; - continue; - - /* Handle 3 bit entry into the fp compare array. Valid values - are 0..6 inclusive. */ - case 'h': - get_expression (s); - s = expr_end; - if (the_insn.exp.X_op == O_constant) - { - num = evaluate_absolute (&the_insn); - CHECK_FIELD (num, 6, 0, 0); - num++; - INSERT_FIELD_AND_CONTINUE (opcode, num, 13); - } - else - break; - - /* Handle 3 bit entry into the fp compare array. Valid values - are 0..6 inclusive. */ - case 'm': - get_expression (s); - if (the_insn.exp.X_op == O_constant) - { - s = expr_end; - num = evaluate_absolute (&the_insn); - CHECK_FIELD (num, 6, 0, 0); - num = (num + 1) ^ 1; - INSERT_FIELD_AND_CONTINUE (opcode, num, 13); - } - else - break; - - /* Handle graphics test completers for ftest */ - case '=': - { - num = pa_parse_ftest_gfx_completer (&s); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - } - - /* Handle a 11 bit immediate at 31. */ - case 'i': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - if (the_insn.exp.X_op == O_constant) - { - num = evaluate_absolute (&the_insn); - CHECK_FIELD (num, 1023, -1024, 0); - low_sign_unext (num, 11, &num); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - } - else - { - if (is_DP_relative (the_insn.exp)) - the_insn.reloc = R_HPPA_GOTOFF; - else if (is_PC_relative (the_insn.exp)) - the_insn.reloc = R_HPPA_PCREL_CALL; - else - the_insn.reloc = R_HPPA; - the_insn.format = 11; - continue; - } - - /* Handle a 14 bit immediate at 31. */ - case 'J': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - if (the_insn.exp.X_op == O_constant) - { - int a, m; - - /* XXX the completer stored away tibits of information - for us to extract. We need a cleaner way to do this. - Now that we have lots of letters again, it would be - good to rethink this. */ - m = (opcode & (1 << 8)) != 0; - a = (opcode & (1 << 9)) != 0; - opcode &= ~ (3 << 8); - num = evaluate_absolute (&the_insn); - if ((a == 1 && num >= 0) || (a == 0 && num < 0)) - break; - CHECK_FIELD (num, 8191, -8192, 0); - low_sign_unext (num, 14, &num); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - } - else - { - break; - } - - /* Handle a 14 bit immediate at 31. */ - case 'K': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - if (the_insn.exp.X_op == O_constant) - { - int a, m; - - /* XXX the completer stored away tibits of information - for us to extract. We need a cleaner way to do this. - Now that we have lots of letters again, it would be - good to rethink this. */ - m = (opcode & (1 << 8)) != 0; - a = (opcode & (1 << 9)) != 0; - opcode &= ~ (3 << 8); - num = evaluate_absolute (&the_insn); - if ((a == 1 && num < 0) || (a == 0 && num > 0)) - break; - if (num % 4) - break; - CHECK_FIELD (num, 8191, -8192, 0); - if (num < 0) - opcode |= 1; - num &= 0x1fff; - num >>= 2; - INSERT_FIELD_AND_CONTINUE (opcode, num, 3); - } - else - { - break; - } - - /* Handle 14 bit immediated, shifted left three times. */ - case '#': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - if (the_insn.exp.X_op == O_constant) - { - num = evaluate_absolute (&the_insn); - if (num & 0x7) - break; - CHECK_FIELD (num, 8191, -8192, 0); - if (num < 0) - opcode |= 1; - num &= 0x1fff; - num >>= 3; - INSERT_FIELD_AND_CONTINUE (opcode, num, 4); - } - else - { - if (is_DP_relative (the_insn.exp)) - the_insn.reloc = R_HPPA_GOTOFF; - else if (is_PC_relative (the_insn.exp)) - the_insn.reloc = R_HPPA_PCREL_CALL; - else - the_insn.reloc = R_HPPA; - the_insn.format = 14; - continue; - } - break; - - /* Handle 14 bit immediate, shifted left twice. */ - case 'd': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - if (the_insn.exp.X_op == O_constant) - { - num = evaluate_absolute (&the_insn); - if (num & 0x3) - break; - CHECK_FIELD (num, 8191, -8192, 0); - if (num < 0) - opcode |= 1; - num &= 0x1fff; - num >>= 2; - INSERT_FIELD_AND_CONTINUE (opcode, num, 3); - } - else - { - if (is_DP_relative (the_insn.exp)) - the_insn.reloc = R_HPPA_GOTOFF; - else if (is_PC_relative (the_insn.exp)) - the_insn.reloc = R_HPPA_PCREL_CALL; - else - the_insn.reloc = R_HPPA; - the_insn.format = 14; - continue; - } - - /* Handle a 14 bit immediate at 31. */ - case 'j': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - if (the_insn.exp.X_op == O_constant) - { - num = evaluate_absolute (&the_insn); - CHECK_FIELD (num, 8191, -8192, 0); - low_sign_unext (num, 14, &num); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - } - else - { - if (is_DP_relative (the_insn.exp)) - the_insn.reloc = R_HPPA_GOTOFF; - else if (is_PC_relative (the_insn.exp)) - the_insn.reloc = R_HPPA_PCREL_CALL; - else - the_insn.reloc = R_HPPA; - the_insn.format = 14; - continue; - } - - /* Handle a 21 bit immediate at 31. */ - case 'k': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - if (the_insn.exp.X_op == O_constant) - { - num = evaluate_absolute (&the_insn); - CHECK_FIELD (num >> 11, 1048575, -1048576, 0); - dis_assemble_21 (num, &num); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - } - else - { - if (is_DP_relative (the_insn.exp)) - the_insn.reloc = R_HPPA_GOTOFF; - else if (is_PC_relative (the_insn.exp)) - the_insn.reloc = R_HPPA_PCREL_CALL; - else - the_insn.reloc = R_HPPA; - the_insn.format = 21; - continue; - } - - /* Handle a 12 bit branch displacement. */ - case 'w': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - the_insn.pcrel = 1; - if (!strcmp (S_GET_NAME (the_insn.exp.X_add_symbol), "L$0\001")) - { - unsigned int w1, w, result; - - num = evaluate_absolute (&the_insn); - if (num % 4) - { - as_bad (_("Branch to unaligned address")); - break; - } - CHECK_FIELD (num, 8199, -8184, 0); - sign_unext ((num - 8) >> 2, 12, &result); - dis_assemble_12 (result, &w1, &w); - INSERT_FIELD_AND_CONTINUE (opcode, ((w1 << 2) | w), 0); - } - else - { - the_insn.reloc = R_HPPA_PCREL_CALL; - the_insn.format = 12; - the_insn.arg_reloc = last_call_desc.arg_reloc; - memset (&last_call_desc, 0, sizeof (struct call_desc)); - s = expr_end; - continue; - } - - /* Handle a 17 bit branch displacement. */ - case 'W': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - the_insn.pcrel = 1; - if (!the_insn.exp.X_add_symbol - || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol), - "L$0\001")) - { - unsigned int w2, w1, w, result; - - num = evaluate_absolute (&the_insn); - if (num % 4) - { - as_bad (_("Branch to unaligned address")); - break; - } - CHECK_FIELD (num, 262143, -262144, 0); - - if (the_insn.exp.X_add_symbol) - num -= 8; - - sign_unext (num >> 2, 17, &result); - dis_assemble_17 (result, &w1, &w2, &w); - INSERT_FIELD_AND_CONTINUE (opcode, - ((w2 << 2) | (w1 << 16) | w), 0); - } - else - { - the_insn.reloc = R_HPPA_PCREL_CALL; - the_insn.format = 17; - the_insn.arg_reloc = last_call_desc.arg_reloc; - memset (&last_call_desc, 0, sizeof (struct call_desc)); - continue; - } - - /* Handle a 22 bit branch displacement. */ - case 'X': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - the_insn.pcrel = 1; - if (!the_insn.exp.X_add_symbol - || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol), - "L$0\001")) - { - unsigned int w3, w2, w1, w, result; - - num = evaluate_absolute (&the_insn); - if (num % 4) - { - as_bad (_("Branch to unaligned address")); - break; - } - CHECK_FIELD (num, 8388607, -8388608, 0); - - if (the_insn.exp.X_add_symbol) - num -= 8; - - sign_unext (num >> 2, 22, &result); - dis_assemble_22 (result, &w3, &w1, &w2, &w); - INSERT_FIELD_AND_CONTINUE (opcode, - ((w3 << 21) | (w2 << 2) - | (w1 << 16) | w), - 0); - } - else - { - the_insn.reloc = R_HPPA_PCREL_CALL; - the_insn.format = 22; - the_insn.arg_reloc = last_call_desc.arg_reloc; - memset (&last_call_desc, 0, sizeof (struct call_desc)); - continue; - } - - /* Handle an absolute 17 bit branch target. */ - case 'z': - the_insn.field_selector = pa_chk_field_selector (&s); - get_expression (s); - s = expr_end; - the_insn.pcrel = 0; - if (!the_insn.exp.X_add_symbol - || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol), - "L$0\001")) - { - unsigned int w2, w1, w, result; - - num = evaluate_absolute (&the_insn); - if (num % 4) - { - as_bad (_("Branch to unaligned address")); - break; - } - CHECK_FIELD (num, 262143, -262144, 0); - - if (the_insn.exp.X_add_symbol) - num -= 8; - - sign_unext (num >> 2, 17, &result); - dis_assemble_17 (result, &w1, &w2, &w); - INSERT_FIELD_AND_CONTINUE (opcode, - ((w2 << 2) | (w1 << 16) | w), 0); - } - else - { - the_insn.reloc = R_HPPA_ABS_CALL; - the_insn.format = 17; - the_insn.arg_reloc = last_call_desc.arg_reloc; - memset (&last_call_desc, 0, sizeof (struct call_desc)); - continue; - } - - /* Handle '%r1' implicit operand of addil instruction. */ - case 'Z': - if (*s == ',' && *(s + 1) == '%' && *(s + 3) == '1' - && (*(s + 2) == 'r' || *(s + 2) == 'R')) - { - s += 4; - continue; - } - else - break; - - /* Handle '%sr0,%r31' implicit operand of be,l instruction. */ - case 'Y': - if (strncasecmp (s, "%sr0,%r31", 9) != 0) - break; - s += 9; - continue; - - /* Handle immediate value of 0 for ordered load/store instructions. */ - case '@': - if (*s != '0') - break; - s++; - continue; - - /* Handle a 2 bit shift count at 25. */ - case '.': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 3, 1, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 6); - - /* Handle a 4 bit shift count at 25. */ - case '*': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 15, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 6); - - /* Handle a 5 bit shift count at 26. */ - case 'p': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 31, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, 31 - num, 5); - - /* Handle a 6 bit shift count at 20,22:26. */ - case '~': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 63, 0, strict); - num = 63 - num; - opcode |= (num & 0x20) << 6; - INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5); - - /* Handle a 6 bit field length at 23,27:31. */ - case '%': - flag = 0; - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 64, 1, strict); - num--; - opcode |= (num & 0x20) << 3; - num = 31 - (num & 0x1f); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - - /* Handle a 6 bit field length at 19,27:31. */ - case '|': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 64, 1, strict); - num--; - opcode |= (num & 0x20) << 7; - num = 31 - (num & 0x1f); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - - /* Handle a 5 bit bit position at 26. */ - case 'P': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 31, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 5); - - /* Handle a 6 bit bit position at 20,22:26. */ - case 'q': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 63, 0, strict); - opcode |= (num & 0x20) << 6; - INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5); - - /* Handle a 5 bit immediate at 10 with 'd' as the complement - of the high bit of the immediate. */ - case 'B': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 63, 0, strict); - if (num & 0x20) - ; - else - opcode |= (1 << 13); - INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 21); - - /* Handle a 5 bit immediate at 10. */ - case 'Q': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - if (the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 31, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 21); - - /* Handle a 9 bit immediate at 28. */ - case '$': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 511, 1, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 3); - - /* Handle a 13 bit immediate at 18. */ - case 'A': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 8191, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 13); - - /* Handle a 26 bit immediate at 31. */ - case 'D': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 671108864, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - - /* Handle a 3 bit SFU identifier at 25. */ - case 'v': - if (*s++ != ',') - as_bad (_("Invalid SFU identifier")); - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 7, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 6); - - /* Handle a 20 bit SOP field for spop0. */ - case 'O': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 1048575, 0, strict); - num = (num & 0x1f) | ((num & 0x000fffe0) << 6); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - - /* Handle a 15bit SOP field for spop1. */ - case 'o': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 32767, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 11); - - /* Handle a 10bit SOP field for spop3. */ - case '0': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 1023, 0, strict); - num = (num & 0x1f) | ((num & 0x000003e0) << 6); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - - /* Handle a 15 bit SOP field for spop2. */ - case '1': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 32767, 0, strict); - num = (num & 0x1f) | ((num & 0x00007fe0) << 6); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - - /* Handle a 3-bit co-processor ID field. */ - case 'u': - if (*s++ != ',') - as_bad (_("Invalid COPR identifier")); - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 7, 0, strict); - INSERT_FIELD_AND_CONTINUE (opcode, num, 6); - - /* Handle a 22bit SOP field for copr. */ - case '2': - num = pa_get_absolute_expression (&the_insn, &s); - if (strict && the_insn.exp.X_op != O_constant) - break; - s = expr_end; - CHECK_FIELD (num, 4194303, 0, strict); - num = (num & 0x1f) | ((num & 0x003fffe0) << 4); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - - /* Handle a source FP operand format completer. */ - case '{': - if (*s == ',' && *(s+1) == 't') - { - the_insn.trunc = 1; - s += 2; - } - else - the_insn.trunc = 0; - flag = pa_parse_fp_cnv_format (&s); - the_insn.fpof1 = flag; - if (flag == W || flag == UW) - flag = SGL; - if (flag == DW || flag == UDW) - flag = DBL; - if (flag == QW || flag == UQW) - flag = QUAD; - INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); - - /* Handle a destination FP operand format completer. */ - case '_': - /* pa_parse_format needs the ',' prefix. */ - s--; - flag = pa_parse_fp_cnv_format (&s); - the_insn.fpof2 = flag; - if (flag == W || flag == UW) - flag = SGL; - if (flag == DW || flag == UDW) - flag = DBL; - if (flag == QW || flag == UQW) - flag = QUAD; - opcode |= flag << 13; - if (the_insn.fpof1 == SGL - || the_insn.fpof1 == DBL - || the_insn.fpof1 == QUAD) - { - if (the_insn.fpof2 == SGL - || the_insn.fpof2 == DBL - || the_insn.fpof2 == QUAD) - flag = 0; - else if (the_insn.fpof2 == W - || the_insn.fpof2 == DW - || the_insn.fpof2 == QW) - flag = 2; - else if (the_insn.fpof2 == UW - || the_insn.fpof2 == UDW - || the_insn.fpof2 == UQW) - flag = 6; - else - abort (); - } - else if (the_insn.fpof1 == W - || the_insn.fpof1 == DW - || the_insn.fpof1 == QW) - { - if (the_insn.fpof2 == SGL - || the_insn.fpof2 == DBL - || the_insn.fpof2 == QUAD) - flag = 1; - else - abort (); - } - else if (the_insn.fpof1 == UW - || the_insn.fpof1 == UDW - || the_insn.fpof1 == UQW) - { - if (the_insn.fpof2 == SGL - || the_insn.fpof2 == DBL - || the_insn.fpof2 == QUAD) - flag = 5; - else - abort (); - } - flag |= the_insn.trunc; - INSERT_FIELD_AND_CONTINUE (opcode, flag, 15); - - /* Handle a source FP operand format completer. */ - case 'F': - flag = pa_parse_fp_format (&s); - the_insn.fpof1 = flag; - INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); - - /* Handle a destination FP operand format completer. */ - case 'G': - /* pa_parse_format needs the ',' prefix. */ - s--; - flag = pa_parse_fp_format (&s); - the_insn.fpof2 = flag; - INSERT_FIELD_AND_CONTINUE (opcode, flag, 13); - - /* Handle a source FP operand format completer at 20. */ - case 'I': - flag = pa_parse_fp_format (&s); - the_insn.fpof1 = flag; - INSERT_FIELD_AND_CONTINUE (opcode, flag, 11); - - /* Handle a floating point operand format at 26. - Only allows single and double precision. */ - case 'H': - flag = pa_parse_fp_format (&s); - switch (flag) - { - case SGL: - opcode |= 0x20; - case DBL: - the_insn.fpof1 = flag; - continue; - - case QUAD: - case ILLEGAL_FMT: - default: - as_bad (_("Invalid Floating Point Operand Format.")); - } - break; - - /* Handle all floating point registers. */ - case 'f': - switch (*++args) - { - /* Float target register. */ - case 't': - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - num = pa_parse_number (&s, 0); - CHECK_FIELD (num, 31, 0, 0); - INSERT_FIELD_AND_CONTINUE (opcode, num, 0); - - /* Float target register with L/R selection. */ - case 'T': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - opcode |= result.number_part; - - /* 0x30 opcodes are FP arithmetic operation opcodes - and need to be turned into 0x38 opcodes. This - is not necessary for loads/stores. */ - if (need_pa11_opcode (&the_insn, &result) - && ((opcode & 0xfc000000) == 0x30000000)) - opcode |= 1 << 27; - - INSERT_FIELD_AND_CONTINUE (opcode, result.l_r_select & 1, 6); - } - - /* Float operand 1. */ - case 'a': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - opcode |= result.number_part << 21; - if (need_pa11_opcode (&the_insn, &result)) - { - opcode |= (result.l_r_select & 1) << 7; - opcode |= 1 << 27; - } - continue; - } - - /* Float operand 1 with L/R selection. */ - case 'X': - case 'A': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - opcode |= result.number_part << 21; - opcode |= (result.l_r_select & 1) << 7; - continue; - } - - /* Float operand 2. */ - case 'b': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - opcode |= (result.number_part & 0x1f) << 16; - if (need_pa11_opcode (&the_insn, &result)) - { - opcode |= (result.l_r_select & 1) << 12; - opcode |= 1 << 27; - } - continue; - } - - /* Float operand 2 with L/R selection. */ - case 'B': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - opcode |= (result.number_part & 0x1f) << 16; - opcode |= (result.l_r_select & 1) << 12; - continue; - } - - /* Float operand 3 for fmpyfadd, fmpynfadd. */ - case 'C': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - opcode |= (result.number_part & 0x1c) << 11; - opcode |= (result.number_part & 0x3) << 9; - opcode |= (result.l_r_select & 1) << 8; - continue; - } - - /* Float mult operand 1 for fmpyadd, fmpysub */ - case 'i': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - if (the_insn.fpof1 == SGL) - { - if (result.number_part < 16) - { - as_bad (_("Invalid register for single precision fmpyadd or fmpysub")); - break; - } - - result.number_part &= 0xF; - result.number_part |= (result.l_r_select & 1) << 4; - } - INSERT_FIELD_AND_CONTINUE (opcode, result.number_part, 21); - } - - /* Float mult operand 2 for fmpyadd, fmpysub */ - case 'j': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - if (the_insn.fpof1 == SGL) - { - if (result.number_part < 16) - { - as_bad (_("Invalid register for single precision fmpyadd or fmpysub")); - break; - } - result.number_part &= 0xF; - result.number_part |= (result.l_r_select & 1) << 4; - } - INSERT_FIELD_AND_CONTINUE (opcode, result.number_part, 16); - } - - /* Float mult target for fmpyadd, fmpysub */ - case 'k': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - if (the_insn.fpof1 == SGL) - { - if (result.number_part < 16) - { - as_bad (_("Invalid register for single precision fmpyadd or fmpysub")); - break; - } - result.number_part &= 0xF; - result.number_part |= (result.l_r_select & 1) << 4; - } - INSERT_FIELD_AND_CONTINUE (opcode, result.number_part, 0); - } - - /* Float add operand 1 for fmpyadd, fmpysub */ - case 'l': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - if (the_insn.fpof1 == SGL) - { - if (result.number_part < 16) - { - as_bad (_("Invalid register for single precision fmpyadd or fmpysub")); - break; - } - result.number_part &= 0xF; - result.number_part |= (result.l_r_select & 1) << 4; - } - INSERT_FIELD_AND_CONTINUE (opcode, result.number_part, 6); - } - - /* Float add target for fmpyadd, fmpysub */ - case 'm': - { - struct pa_11_fp_reg_struct result; - - /* This should be more strict. Small steps. */ - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - if (the_insn.fpof1 == SGL) - { - if (result.number_part < 16) - { - as_bad (_("Invalid register for single precision fmpyadd or fmpysub")); - break; - } - result.number_part &= 0xF; - result.number_part |= (result.l_r_select & 1) << 4; - } - INSERT_FIELD_AND_CONTINUE (opcode, result.number_part, 11); - } - - /* Handle L/R register halves like 'x'. */ - case 'e': - { - struct pa_11_fp_reg_struct result; - - if (strict && *s != '%') - break; - pa_parse_number (&s, &result); - CHECK_FIELD (result.number_part, 31, 0, 0); - opcode |= (result.number_part & 0x1f) << 16; - if (need_pa11_opcode (&the_insn, &result)) - { - opcode |= (result.l_r_select & 1) << 1; - } - continue; - } - default: - abort (); - } - break; - - default: - abort (); - } - break; - } - - failed: - /* Check if the args matched. */ - if (match == FALSE) - { - if (&insn[1] - pa_opcodes < (int) NUMOPCODES - && !strcmp (insn->name, insn[1].name)) - { - ++insn; - s = argstart; - continue; - } - else - { - as_bad (_("Invalid operands %s"), error_message); - return; - } - } - break; - } - - the_insn.opcode = opcode; -} - -/* Turn a string in input_line_pointer into a floating point constant of type - type, and store the appropriate bytes in *litP. The number of LITTLENUMS - emitted is stored in *sizeP . An error message or NULL is returned. */ - -#define MAX_LITTLENUMS 6 - -char * -md_atof (type, litP, sizeP) - char type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - LITTLENUM_TYPE *wordP; - char *t; - - switch (type) - { - - case 'f': - case 'F': - case 's': - case 'S': - prec = 2; - break; - - case 'd': - case 'D': - case 'r': - case 'R': - prec = 4; - break; - - case 'x': - case 'X': - prec = 6; - break; - - case 'p': - case 'P': - prec = 6; - break; - - default: - *sizeP = 0; - return _("Bad call to MD_ATOF()"); - } - t = atof_ieee (input_line_pointer, type, words); - if (t) - input_line_pointer = t; - *sizeP = prec * sizeof (LITTLENUM_TYPE); - for (wordP = words; prec--;) - { - md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE)); - litP += sizeof (LITTLENUM_TYPE); - } - return NULL; -} - -/* Write out big-endian. */ - -void -md_number_to_chars (buf, val, n) - char *buf; - valueT val; - int n; -{ - number_to_chars_bigendian (buf, val, n); -} - -/* Translate internal representation of relocation info to BFD target - format. */ - -arelent ** -tc_gen_reloc (section, fixp) - asection *section; - fixS *fixp; -{ - arelent *reloc; - struct hppa_fix_struct *hppa_fixp; - bfd_reloc_code_real_type code; - static arelent *no_relocs = NULL; - arelent **relocs; - bfd_reloc_code_real_type **codes; - int n_relocs; - int i; - - hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data; - if (fixp->fx_addsy == 0) - return &no_relocs; - assert (hppa_fixp != 0); - assert (section != 0); - - reloc = (arelent *) xmalloc (sizeof (arelent)); - - reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); - codes = (bfd_reloc_code_real_type **) hppa_gen_reloc_type (stdoutput, - fixp->fx_r_type, - hppa_fixp->fx_r_format, - hppa_fixp->fx_r_field, - fixp->fx_subsy != NULL, - symbol_get_bfdsym (fixp->fx_addsy)); - - if (codes == NULL) - abort (); - - for (n_relocs = 0; codes[n_relocs]; n_relocs++) - ; - - relocs = (arelent **) xmalloc (sizeof (arelent *) * n_relocs + 1); - reloc = (arelent *) xmalloc (sizeof (arelent) * n_relocs); - for (i = 0; i < n_relocs; i++) - relocs[i] = &reloc[i]; - - relocs[n_relocs] = NULL; - -#ifdef OBJ_ELF - switch (fixp->fx_r_type) - { - default: - assert (n_relocs == 1); - - code = *codes[0]; - - reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); - reloc->howto = bfd_reloc_type_lookup (stdoutput, code); - reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc->addend = 0; /* default */ - - assert (reloc->howto && code == reloc->howto->type); - - /* Now, do any processing that is dependent on the relocation type. */ - switch (code) - { - case R_PARISC_DLTREL21L: - case R_PARISC_DLTREL14R: - case R_PARISC_DLTREL14F: - case R_PARISC_PLABEL32: - case R_PARISC_PLABEL21L: - case R_PARISC_PLABEL14R: - /* For plabel relocations, the addend of the - relocation should be either 0 (no static link) or 2 - (static link required). - - FIXME: We always assume no static link! - - We also slam a zero addend into the DLT relative relocs; - it doesn't make a lot of sense to use any addend since - it gets you a different (eg unknown) DLT entry. */ - reloc->addend = 0; - break; - - case R_PARISC_PCREL21L: - case R_PARISC_PCREL17R: - case R_PARISC_PCREL17F: - case R_PARISC_PCREL17C: - case R_PARISC_PCREL14R: - case R_PARISC_PCREL14F: - /* The constant is stored in the instruction. */ - reloc->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc, 0); - break; - default: - reloc->addend = fixp->fx_offset; - break; - } - break; - } -#else /* OBJ_SOM */ - - /* Walk over reach relocation returned by the BFD backend. */ - for (i = 0; i < n_relocs; i++) - { - code = *codes[i]; - - relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); - relocs[i]->howto = bfd_reloc_type_lookup (stdoutput, code); - relocs[i]->address = fixp->fx_frag->fr_address + fixp->fx_where; - - switch (code) - { - case R_COMP2: - /* The only time we ever use a R_COMP2 fixup is for the difference - of two symbols. With that in mind we fill in all four - relocs now and break out of the loop. */ - assert (i == 1); - relocs[0]->sym_ptr_ptr = (asymbol **) &(bfd_abs_symbol); - relocs[0]->howto = bfd_reloc_type_lookup (stdoutput, *codes[0]); - relocs[0]->address = fixp->fx_frag->fr_address + fixp->fx_where; - relocs[0]->addend = 0; - relocs[1]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *relocs[1]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); - relocs[1]->howto = bfd_reloc_type_lookup (stdoutput, *codes[1]); - relocs[1]->address = fixp->fx_frag->fr_address + fixp->fx_where; - relocs[1]->addend = 0; - relocs[2]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *relocs[2]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy); - relocs[2]->howto = bfd_reloc_type_lookup (stdoutput, *codes[2]); - relocs[2]->address = fixp->fx_frag->fr_address + fixp->fx_where; - relocs[2]->addend = 0; - relocs[3]->sym_ptr_ptr = (asymbol **) &(bfd_abs_symbol); - relocs[3]->howto = bfd_reloc_type_lookup (stdoutput, *codes[3]); - relocs[3]->address = fixp->fx_frag->fr_address + fixp->fx_where; - relocs[3]->addend = 0; - relocs[4]->sym_ptr_ptr = (asymbol **) &(bfd_abs_symbol); - relocs[4]->howto = bfd_reloc_type_lookup (stdoutput, *codes[4]); - relocs[4]->address = fixp->fx_frag->fr_address + fixp->fx_where; - relocs[4]->addend = 0; - goto done; - case R_PCREL_CALL: - case R_ABS_CALL: - relocs[i]->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc, 0); - break; - - case R_DLT_REL: - case R_DATA_PLABEL: - case R_CODE_PLABEL: - /* For plabel relocations, the addend of the - relocation should be either 0 (no static link) or 2 - (static link required). - - FIXME: We always assume no static link! - - We also slam a zero addend into the DLT relative relocs; - it doesn't make a lot of sense to use any addend since - it gets you a different (eg unknown) DLT entry. */ - relocs[i]->addend = 0; - break; - - case R_N_MODE: - case R_S_MODE: - case R_D_MODE: - case R_R_MODE: - case R_FSEL: - case R_LSEL: - case R_RSEL: - case R_BEGIN_BRTAB: - case R_END_BRTAB: - case R_BEGIN_TRY: - case R_N0SEL: - case R_N1SEL: - /* There is no symbol or addend associated with these fixups. */ - relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol); - relocs[i]->addend = 0; - break; - - case R_END_TRY: - case R_ENTRY: - case R_EXIT: - /* There is no symbol associated with these fixups. */ - relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); - *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol); - relocs[i]->addend = fixp->fx_offset; - break; - - default: - relocs[i]->addend = fixp->fx_offset; - } - } - - done: -#endif - - return relocs; -} - -/* Process any machine dependent frag types. */ - -void -md_convert_frag (abfd, sec, fragP) - register bfd *abfd; - register asection *sec; - register fragS *fragP; -{ - unsigned int address; - - if (fragP->fr_type == rs_machine_dependent) - { - switch ((int) fragP->fr_subtype) - { - case 0: - fragP->fr_type = rs_fill; - know (fragP->fr_var == 1); - know (fragP->fr_next); - address = fragP->fr_address + fragP->fr_fix; - if (address % fragP->fr_offset) - { - fragP->fr_offset = - fragP->fr_next->fr_address - - fragP->fr_address - - fragP->fr_fix; - } - else - fragP->fr_offset = 0; - break; - } - } -} - -/* Round up a section size to the appropriate boundary. */ - -valueT -md_section_align (segment, size) - asection *segment; - valueT size; -{ - int align = bfd_get_section_alignment (stdoutput, segment); - int align2 = (1 << align) - 1; - - return (size + align2) & ~align2; -} - -/* Return the approximate size of a frag before relaxation has occurred. */ -int -md_estimate_size_before_relax (fragP, segment) - register fragS *fragP; - asection *segment; -{ - int size; - - size = 0; - - while ((fragP->fr_fix + size) % fragP->fr_offset) - size++; - - return size; -} - -CONST char *md_shortopts = ""; -struct option md_longopts[] = { - {NULL, no_argument, NULL, 0} -}; -size_t md_longopts_size = sizeof(md_longopts); - -int -md_parse_option (c, arg) - int c; - char *arg; -{ - return 0; -} - -void -md_show_usage (stream) - FILE *stream; -{ -} - -/* We have no need to default values of symbols. */ - -symbolS * -md_undefined_symbol (name) - char *name; -{ - return 0; -} - -/* Apply a fixup to an instruction. */ - -int -md_apply_fix (fixP, valp) - fixS *fixP; - valueT *valp; -{ - char *buf = fixP->fx_where + fixP->fx_frag->fr_literal; - struct hppa_fix_struct *hppa_fixP; - long new_val, result = 0; - unsigned int w1, w2, w, resulti; - - hppa_fixP = (struct hppa_fix_struct *) fixP->tc_fix_data; - /* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can - never be "applied" (they are just markers). Likewise for - R_HPPA_BEGIN_BRTAB and R_HPPA_END_BRTAB. */ -#ifdef OBJ_SOM - if (fixP->fx_r_type == R_HPPA_ENTRY - || fixP->fx_r_type == R_HPPA_EXIT - || fixP->fx_r_type == R_HPPA_BEGIN_BRTAB - || fixP->fx_r_type == R_HPPA_END_BRTAB - || fixP->fx_r_type == R_HPPA_BEGIN_TRY) - return 1; - - /* Disgusting. We must set fx_offset ourselves -- R_HPPA_END_TRY - fixups are considered not adjustable, which in turn causes - adjust_reloc_syms to not set fx_offset. Ugh. */ - if (fixP->fx_r_type == R_HPPA_END_TRY) - { - fixP->fx_offset = *valp; - return 1; - } -#endif - - /* There should have been an HPPA specific fixup associated - with the GAS fixup. */ - if (hppa_fixP) - { - unsigned long buf_wd = bfd_get_32 (stdoutput, buf); - int fmt = bfd_hppa_insn2fmt (buf_wd); - - /* If there is a symbol associated with this fixup, then it's something - which will need a SOM relocation (except for some PC-relative relocs). - In such cases we should treat the "val" or "addend" as zero since it - will be added in as needed from fx_offset in tc_gen_reloc. */ - if ((fixP->fx_addsy != NULL - || fixP->fx_r_type == R_HPPA_NONE) -#ifdef OBJ_SOM - && fmt != 32 -#endif - ) - new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0); -#ifdef OBJ_SOM - /* These field selectors imply that we do not want an addend. */ - else if (hppa_fixP->fx_r_field == e_psel - || hppa_fixP->fx_r_field == e_rpsel - || hppa_fixP->fx_r_field == e_lpsel - || hppa_fixP->fx_r_field == e_tsel - || hppa_fixP->fx_r_field == e_rtsel - || hppa_fixP->fx_r_field == e_ltsel) - new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0); - /* This is truely disgusting. The machine independent code blindly - adds in the value of the symbol being relocated against. Damn! */ - else if (fmt == 32 - && fixP->fx_addsy != NULL - && S_GET_SEGMENT (fixP->fx_addsy) != bfd_com_section_ptr) - new_val = hppa_field_adjust (*valp - S_GET_VALUE (fixP->fx_addsy), - 0, hppa_fixP->fx_r_field); -#endif - else - new_val = hppa_field_adjust (*valp, 0, hppa_fixP->fx_r_field); - - /* Handle pc-relative exceptions from above. */ -#define arg_reloc_stub_needed(CALLER, CALLEE) \ - ((CALLEE) && (CALLER) && ((CALLEE) != (CALLER))) - if ((fmt == 12 || fmt == 17 || fmt == 22) - && fixP->fx_addsy - && fixP->fx_pcrel -#ifdef OBJ_SOM - && !arg_reloc_stub_needed ((long) ((obj_symbol_type *) - symbol_get_bfdsym (fixP->fx_addsy))->tc_data.ap.hppa_arg_reloc, - hppa_fixP->fx_arg_reloc) -#endif - && (((int)(*valp) > -262144 && (int)(*valp) < 262143) && fmt != 22) - && S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment - && !(fixP->fx_subsy - && S_GET_SEGMENT (fixP->fx_subsy) != hppa_fixP->segment)) - - new_val = hppa_field_adjust (*valp, 0, hppa_fixP->fx_r_field); -#undef arg_reloc_stub_needed - - switch (fmt) - { - /* Handle all opcodes with the 'j' operand type. */ - case 14: - CHECK_FIELD (new_val, 8191, -8192, 0); - - /* Mask off 14 bits to be changed. */ - bfd_put_32 (stdoutput, - bfd_get_32 (stdoutput, buf) & 0xffffc000, - buf); - low_sign_unext (new_val, 14, &resulti); - result = resulti; - break; - - /* Handle all opcodes with the 'k' operand type. */ - case 21: - CHECK_FIELD (new_val, 2097152, 0, 0); - - /* Mask off 21 bits to be changed. */ - bfd_put_32 (stdoutput, - bfd_get_32 (stdoutput, buf) & 0xffe00000, - buf); - dis_assemble_21 (new_val, &resulti); - result = resulti; - break; - - /* Handle all the opcodes with the 'i' operand type. */ - case 11: - CHECK_FIELD (new_val, 1023, -1023, 0); - - /* Mask off 11 bits to be changed. */ - bfd_put_32 (stdoutput, - bfd_get_32 (stdoutput, buf) & 0xffff800, - buf); - low_sign_unext (new_val, 11, &resulti); - result = resulti; - break; - - /* Handle all the opcodes with the 'w' operand type. */ - case 12: - CHECK_FIELD (new_val, 8199, -8184, 0); - - /* Mask off 11 bits to be changed. */ - sign_unext ((new_val - 8) >> 2, 12, &resulti); - bfd_put_32 (stdoutput, - bfd_get_32 (stdoutput, buf) & 0xffffe002, - buf); - - dis_assemble_12 (resulti, &w1, &w); - result = ((w1 << 2) | w); - break; - - /* Handle some of the opcodes with the 'W' operand type. */ - case 17: - { - int distance = *valp; - - CHECK_FIELD (new_val, 262143, -262144, 0); - - /* If this is an absolute branch (ie no link) with an out of - range target, then we want to complain. */ - if (fixP->fx_r_type == R_HPPA_PCREL_CALL - && (distance > 262143 || distance < -262144) - && (bfd_get_32 (stdoutput, buf) & 0xffe00000) == 0xe8000000) - CHECK_FIELD (distance, 262143, -262144, 0); - - /* Mask off 17 bits to be changed. */ - bfd_put_32 (stdoutput, - bfd_get_32 (stdoutput, buf) & 0xffe0e002, - buf); - sign_unext ((new_val - 8) >> 2, 17, &resulti); - dis_assemble_17 (resulti, &w1, &w2, &w); - result = ((w2 << 2) | (w1 << 16) | w); - break; - } - - case 22: - { - int distance = *valp, w3; - - CHECK_FIELD (new_val, 8388607, -8388608, 0); - - /* If this is an absolute branch (ie no link) with an out of - range target, then we want to complain. */ - if (fixP->fx_r_type == R_HPPA_PCREL_CALL - && (distance > 8388607 || distance < -8388608) - && (bfd_get_32 (stdoutput, buf) & 0xffe00000) == 0xe8000000) - CHECK_FIELD (distance, 8388607, -8388608, 0); - - /* Mask off 22 bits to be changed. */ - bfd_put_32 (stdoutput, - bfd_get_32 (stdoutput, buf) & 0xfc00e002, - buf); - sign_unext ((new_val - 8) >> 2, 22, &resulti); - dis_assemble_22 (resulti, &w3, &w1, &w2, &w); - result = ((w3 << 21) | (w2 << 2) | (w1 << 16) | w); - break; - } - - case 32: - result = 0; - bfd_put_32 (stdoutput, new_val, buf); - break; - - default: - as_bad (_("Unknown relocation encountered in md_apply_fix.")); - return 0; - } - - /* Insert the relocation. */ - bfd_put_32 (stdoutput, bfd_get_32 (stdoutput, buf) | result, buf); - return 1; - } - else - { - printf (_("no hppa_fixup entry for this fixup (fixP = 0x%x, type = 0x%x)\n"), - (unsigned int) fixP, fixP->fx_r_type); - return 0; - } -} - -/* Exactly what point is a PC-relative offset relative TO? - On the PA, they're relative to the address of the offset. */ - -long -md_pcrel_from (fixP) - fixS *fixP; -{ - return fixP->fx_where + fixP->fx_frag->fr_address; -} - -/* Return nonzero if the input line pointer is at the end of - a statement. */ - -static int -is_end_of_statement () -{ - return ((*input_line_pointer == '\n') - || (*input_line_pointer == ';') - || (*input_line_pointer == '!')); -} - -/* Read a number from S. The number might come in one of many forms, - the most common will be a hex or decimal constant, but it could be - a pre-defined register (Yuk!), or an absolute symbol. - - Return a number or -1 for failure. - - When parsing PA-89 FP register numbers RESULT will be - the address of a structure to return information about - L/R half of FP registers, store results there as appropriate. - - pa_parse_number can not handle negative constants and will fail - horribly if it is passed such a constant. */ - -static int -pa_parse_number (s, result) - char **s; - struct pa_11_fp_reg_struct *result; -{ - int num; - char *name; - char c; - symbolS *sym; - int status; - char *p = *s; - - /* Skip whitespace before the number. */ - while (*p == ' ' || *p == '\t') - p = p + 1; - - /* Store info in RESULT if requested by caller. */ - if (result) - { - result->number_part = -1; - result->l_r_select = -1; - } - num = -1; - - if (isdigit (*p)) - { - /* Looks like a number. */ - num = 0; - - if (*p == '0' && (*(p + 1) == 'x' || *(p + 1) == 'X')) - { - /* The number is specified in hex. */ - p += 2; - while (isdigit (*p) || ((*p >= 'a') && (*p <= 'f')) - || ((*p >= 'A') && (*p <= 'F'))) - { - if (isdigit (*p)) - num = num * 16 + *p - '0'; - else if (*p >= 'a' && *p <= 'f') - num = num * 16 + *p - 'a' + 10; - else - num = num * 16 + *p - 'A' + 10; - ++p; - } - } - else - { - /* The number is specified in decimal. */ - while (isdigit (*p)) - { - num = num * 10 + *p - '0'; - ++p; - } - } - - /* Store info in RESULT if requested by the caller. */ - if (result) - { - result->number_part = num; - - if (IS_R_SELECT (p)) - { - result->l_r_select = 1; - ++p; - } - else if (IS_L_SELECT (p)) - { - result->l_r_select = 0; - ++p; - } - else - result->l_r_select = 0; - } - } - else if (*p == '%') - { - /* The number might be a predefined register. */ - num = 0; - name = p; - p++; - c = *p; - /* Tege hack: Special case for general registers as the general - code makes a binary search with case translation, and is VERY - slow. */ - if (c == 'r') - { - p++; - if (*p == 'e' && *(p + 1) == 't' - && (*(p + 2) == '0' || *(p + 2) == '1')) - { - p += 2; - num = *p - '0' + 28; - p++; - } - else if (*p == 'p') - { - num = 2; - p++; - } - else if (!isdigit (*p)) - { - if (print_errors) - as_bad (_("Undefined register: '%s'."), name); - num = -1; - } - else - { - do - num = num * 10 + *p++ - '0'; - while (isdigit (*p)); - } - } - else - { - /* Do a normal register search. */ - while (is_part_of_name (c)) - { - p = p + 1; - c = *p; - } - *p = 0; - status = reg_name_search (name); - if (status >= 0) - num = status; - else - { - if (print_errors) - as_bad (_("Undefined register: '%s'."), name); - num = -1; - } - *p = c; - } - - /* Store info in RESULT if requested by caller. */ - if (result) - { - result->number_part = num; - if (IS_R_SELECT (p - 1)) - result->l_r_select = 1; - else if (IS_L_SELECT (p - 1)) - result->l_r_select = 0; - else - result->l_r_select = 0; - } - } - else - { - /* And finally, it could be a symbol in the absolute section which - is effectively a constant. */ - num = 0; - name = p; - c = *p; - while (is_part_of_name (c)) - { - p = p + 1; - c = *p; - } - *p = 0; - if ((sym = symbol_find (name)) != NULL) - { - if (S_GET_SEGMENT (sym) == &bfd_abs_section) - num = S_GET_VALUE (sym); - else - { - if (print_errors) - as_bad (_("Non-absolute symbol: '%s'."), name); - num = -1; - } - } - else - { - /* There is where we'd come for an undefined symbol - or for an empty string. For an empty string we - will return zero. That's a concession made for - compatability with the braindamaged HP assemblers. */ - if (*name == 0) - num = 0; - else - { - if (print_errors) - as_bad (_("Undefined absolute constant: '%s'."), name); - num = -1; - } - } - *p = c; - - /* Store info in RESULT if requested by caller. */ - if (result) - { - result->number_part = num; - if (IS_R_SELECT (p - 1)) - result->l_r_select = 1; - else if (IS_L_SELECT (p - 1)) - result->l_r_select = 0; - else - result->l_r_select = 0; - } - } - - *s = p; - return num; -} - -#define REG_NAME_CNT (sizeof(pre_defined_registers) / sizeof(struct pd_reg)) - -/* Given NAME, find the register number associated with that name, return - the integer value associated with the given name or -1 on failure. */ - -static int -reg_name_search (name) - char *name; -{ - int middle, low, high; - int cmp; - - low = 0; - high = REG_NAME_CNT - 1; - - do - { - middle = (low + high) / 2; - cmp = strcasecmp (name, pre_defined_registers[middle].name); - if (cmp < 0) - high = middle - 1; - else if (cmp > 0) - low = middle + 1; - else - return pre_defined_registers[middle].value; - } - while (low <= high); - - return -1; -} - - -/* Return nonzero if the given INSN and L/R information will require - a new PA-1.1 opcode. */ - -static int -need_pa11_opcode (insn, result) - struct pa_it *insn; - struct pa_11_fp_reg_struct *result; -{ - if (result->l_r_select == 1 && !(insn->fpof1 == DBL && insn->fpof2 == DBL)) - { - /* If this instruction is specific to a particular architecture, - then set a new architecture. */ - if (bfd_get_mach (stdoutput) < pa11) - { - if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, pa11)) - as_warn (_("could not update architecture and machine")); - } - return TRUE; - } - else - return FALSE; -} - -/* Parse a condition for a fcmp instruction. Return the numerical - code associated with the condition. */ - -static int -pa_parse_fp_cmp_cond (s) - char **s; -{ - int cond, i; - - cond = 0; - - for (i = 0; i < 32; i++) - { - if (strncasecmp (*s, fp_cond_map[i].string, - strlen (fp_cond_map[i].string)) == 0) - { - cond = fp_cond_map[i].cond; - *s += strlen (fp_cond_map[i].string); - /* If not a complete match, back up the input string and - report an error. */ - if (**s != ' ' && **s != '\t') - { - *s -= strlen (fp_cond_map[i].string); - break; - } - while (**s == ' ' || **s == '\t') - *s = *s + 1; - return cond; - } - } - - as_bad (_("Invalid FP Compare Condition: %s"), *s); - - /* Advance over the bogus completer. */ - while (**s != ',' && **s != ' ' && **s != '\t') - *s += 1; - - return 0; -} - -/* Parse a graphics test complete for ftest. */ - -static int -pa_parse_ftest_gfx_completer (s) - char **s; -{ - int value; - - value = 0; - if (strncasecmp (*s, "acc8", 4) == 0) - { - value = 5; - *s += 4; - } - else if (strncasecmp (*s, "acc6", 4) == 0) - { - value = 9; - *s += 4; - } - else if (strncasecmp (*s, "acc4", 4) == 0) - { - value = 13; - *s += 4; - } - else if (strncasecmp (*s, "acc2", 4) == 0) - { - value = 17; - *s += 4; - } - else if (strncasecmp (*s, "acc", 3) == 0) - { - value = 1; - *s += 3; - } - else if (strncasecmp (*s, "rej8", 4) == 0) - { - value = 6; - *s += 4; - } - else if (strncasecmp (*s, "rej", 3) == 0) - { - value = 2; - *s += 3; - } - else - { - value = 0; - as_bad (_("Invalid FTEST completer: %s"), *s); - } - - return value; -} - -/* Parse an FP operand format completer returning the completer - type. */ - -static fp_operand_format -pa_parse_fp_cnv_format (s) - char **s; -{ - int format; - - format = SGL; - if (**s == ',') - { - *s += 1; - if (strncasecmp (*s, "sgl", 3) == 0) - { - format = SGL; - *s += 4; - } - else if (strncasecmp (*s, "dbl", 3) == 0) - { - format = DBL; - *s += 4; - } - else if (strncasecmp (*s, "quad", 4) == 0) - { - format = QUAD; - *s += 5; - } - else if (strncasecmp (*s, "w", 1) == 0) - { - format = W; - *s += 2; - } - else if (strncasecmp (*s, "uw", 2) == 0) - { - format = UW; - *s += 3; - } - else if (strncasecmp (*s, "dw", 2) == 0) - { - format = DW; - *s += 3; - } - else if (strncasecmp (*s, "udw", 3) == 0) - { - format = UDW; - *s += 4; - } - else if (strncasecmp (*s, "qw", 2) == 0) - { - format = QW; - *s += 3; - } - else if (strncasecmp (*s, "uqw", 3) == 0) - { - format = UQW; - *s += 4; - } - else - { - format = ILLEGAL_FMT; - as_bad (_("Invalid FP Operand Format: %3s"), *s); - } - } - - return format; -} - -/* Parse an FP operand format completer returning the completer - type. */ - -static fp_operand_format -pa_parse_fp_format (s) - char **s; -{ - int format; - - format = SGL; - if (**s == ',') - { - *s += 1; - if (strncasecmp (*s, "sgl", 3) == 0) - { - format = SGL; - *s += 4; - } - else if (strncasecmp (*s, "dbl", 3) == 0) - { - format = DBL; - *s += 4; - } - else if (strncasecmp (*s, "quad", 4) == 0) - { - format = QUAD; - *s += 5; - } - else - { - format = ILLEGAL_FMT; - as_bad (_("Invalid FP Operand Format: %3s"), *s); - } - } - - return format; -} - -/* Convert from a selector string into a selector type. */ - -static int -pa_chk_field_selector (str) - char **str; -{ - int middle, low, high; - int cmp; - char name[4]; - - /* Read past any whitespace. */ - /* FIXME: should we read past newlines and formfeeds??? */ - while (**str == ' ' || **str == '\t' || **str == '\n' || **str == '\f') - *str = *str + 1; - - if ((*str)[1] == '\'' || (*str)[1] == '%') - name[0] = tolower ((*str)[0]), - name[1] = 0; - else if ((*str)[2] == '\'' || (*str)[2] == '%') - name[0] = tolower ((*str)[0]), - name[1] = tolower ((*str)[1]), - name[2] = 0; - else if ((*str)[3] == '\'' || (*str)[3] == '%') - name[0] = tolower ((*str)[0]), - name[1] = tolower ((*str)[1]), - name[2] = tolower ((*str)[2]), - name[3] = 0; - else - return e_fsel; - - low = 0; - high = sizeof (selector_table) / sizeof (struct selector_entry) - 1; - - do - { - middle = (low + high) / 2; - cmp = strcmp (name, selector_table[middle].prefix); - if (cmp < 0) - high = middle - 1; - else if (cmp > 0) - low = middle + 1; - else - { - *str += strlen (name) + 1; -#ifndef OBJ_SOM - if (selector_table[middle].field_selector == e_nsel) - return e_fsel; -#endif - return selector_table[middle].field_selector; - } - } - while (low <= high); - - return e_fsel; -} - -/* Mark (via expr_end) the end of an expression (I think). FIXME. */ - -static int -get_expression (str) - char *str; -{ - char *save_in; - asection *seg; - - save_in = input_line_pointer; - input_line_pointer = str; - seg = expression (&the_insn.exp); - if (!(seg == absolute_section - || seg == undefined_section - || SEG_NORMAL (seg))) - { - as_warn (_("Bad segment in expression.")); - expr_end = input_line_pointer; - input_line_pointer = save_in; - return 1; - } - expr_end = input_line_pointer; - input_line_pointer = save_in; - return 0; -} - -/* Mark (via expr_end) the end of an absolute expression. FIXME. */ -static int -pa_get_absolute_expression (insn, strp) - struct pa_it *insn; - char **strp; -{ - char *save_in; - - insn->field_selector = pa_chk_field_selector (strp); - save_in = input_line_pointer; - input_line_pointer = *strp; - expression (&insn->exp); - /* This is not perfect, but is a huge improvement over doing nothing. - - The PA assembly syntax is ambigious in a variety of ways. Consider - this string "4 %r5" Is that the number 4 followed by the register - r5, or is that 4 MOD 5? - - If we get a modulo expresion When looking for an absolute, we try - again cutting off the input string at the first whitespace character. */ - if (insn->exp.X_op == O_modulus) - { - char *s, c; - int retval; - - input_line_pointer = *strp; - s = *strp; - while (*s != ',' && *s != ' ' && *s != '\t') - s++; - - c = *s; - *s = 0; - - retval = pa_get_absolute_expression (insn, strp); - - input_line_pointer = save_in; - *s = c; - return evaluate_absolute (insn); - } - /* When in strict mode we have a non-match, fix up the pointers - and return to our caller. */ - if (insn->exp.X_op != O_constant && strict) - { - expr_end = input_line_pointer; - input_line_pointer = save_in; - return 0; - } - if (insn->exp.X_op != O_constant) - { - as_bad (_("Bad segment (should be absolute).")); - expr_end = input_line_pointer; - input_line_pointer = save_in; - return 0; - } - expr_end = input_line_pointer; - input_line_pointer = save_in; - return evaluate_absolute (insn); -} - -/* Evaluate an absolute expression EXP which may be modified by - the selector FIELD_SELECTOR. Return the value of the expression. */ -static int -evaluate_absolute (insn) - struct pa_it *insn; -{ - int value; - expressionS exp; - int field_selector = insn->field_selector; - - exp = insn->exp; - value = exp.X_add_number; - - switch (field_selector) - { - /* No change. */ - case e_fsel: - break; - - /* If bit 21 is on then add 0x800 and arithmetic shift right 11 bits. */ - case e_lssel: - if (value & 0x00000400) - value += 0x800; - value = (value & 0xfffff800) >> 11; - break; - - /* Sign extend from bit 21. */ - case e_rssel: - if (value & 0x00000400) - value |= 0xfffff800; - else - value &= 0x7ff; - break; - - /* Arithmetic shift right 11 bits. */ - case e_lsel: - value = (value & 0xfffff800) >> 11; - break; - - /* Set bits 0-20 to zero. */ - case e_rsel: - value = value & 0x7ff; - break; - - /* Add 0x800 and arithmetic shift right 11 bits. */ - case e_ldsel: - value += 0x800; - value = (value & 0xfffff800) >> 11; - break; - - /* Set bitgs 0-21 to one. */ - case e_rdsel: - value |= 0xfffff800; - break; - -#define RSEL_ROUND(c) (((c) + 0x1000) & ~0x1fff) - case e_rrsel: - value = (RSEL_ROUND (value) & 0x7ff) + (value - RSEL_ROUND (value)); - break; - - case e_lrsel: - value = (RSEL_ROUND (value) >> 11) & 0x1fffff; - break; -#undef RSEL_ROUND - - default: - BAD_CASE (field_selector); - break; - } - return value; -} - -/* Given an argument location specification return the associated - argument location number. */ - -static unsigned int -pa_build_arg_reloc (type_name) - char *type_name; -{ - - if (strncasecmp (type_name, "no", 2) == 0) - return 0; - if (strncasecmp (type_name, "gr", 2) == 0) - return 1; - else if (strncasecmp (type_name, "fr", 2) == 0) - return 2; - else if (strncasecmp (type_name, "fu", 2) == 0) - return 3; - else - as_bad (_("Invalid argument location: %s\n"), type_name); - - return 0; -} - -/* Encode and return an argument relocation specification for - the given register in the location specified by arg_reloc. */ - -static unsigned int -pa_align_arg_reloc (reg, arg_reloc) - unsigned int reg; - unsigned int arg_reloc; -{ - unsigned int new_reloc; - - new_reloc = arg_reloc; - switch (reg) - { - case 0: - new_reloc <<= 8; - break; - case 1: - new_reloc <<= 6; - break; - case 2: - new_reloc <<= 4; - break; - case 3: - new_reloc <<= 2; - break; - default: - as_bad (_("Invalid argument description: %d"), reg); - } - - return new_reloc; -} - -/* Parse a PA nullification completer (,n). Return nonzero if the - completer was found; return zero if no completer was found. */ - -static int -pa_parse_nullif (s) - char **s; -{ - int nullif; - - nullif = 0; - if (**s == ',') - { - *s = *s + 1; - if (strncasecmp (*s, "n", 1) == 0) - nullif = 1; - else - { - as_bad (_("Invalid Nullification: (%c)"), **s); - nullif = 0; - } - *s = *s + 1; - } - - return nullif; -} - -/* Parse a non-negated compare/subtract completer returning the - number (for encoding in instrutions) of the given completer. - - ISBRANCH specifies whether or not this is parsing a condition - completer for a branch (vs a nullification completer for a - computational instruction. */ - -static int -pa_parse_nonneg_cmpsub_cmpltr (s, isbranch) - char **s; - int isbranch; -{ - int cmpltr; - char *name = *s + 1; - char c; - char *save_s = *s; - int nullify = 0; - - cmpltr = 0; - if (**s == ',') - { - *s += 1; - while (**s != ',' && **s != ' ' && **s != '\t') - *s += 1; - c = **s; - **s = 0x00; - - - if (strcmp (name, "=") == 0) - { - cmpltr = 1; - } - else if (strcmp (name, "<") == 0) - { - cmpltr = 2; - } - else if (strcmp (name, "<=") == 0) - { - cmpltr = 3; - } - else if (strcmp (name, "<<") == 0) - { - cmpltr = 4; - } - else if (strcmp (name, "<<=") == 0) - { - cmpltr = 5; - } - else if (strcasecmp (name, "sv") == 0) - { - cmpltr = 6; - } - else if (strcasecmp (name, "od") == 0) - { - cmpltr = 7; - } - /* If we have something like addb,n then there is no condition - completer. */ - else if (strcasecmp (name, "n") == 0 && isbranch) - { - cmpltr = 0; - nullify = 1; - } - else - { - cmpltr = -1; - } - **s = c; - } - - /* Reset pointers if this was really a ,n for a branch instruction. */ - if (nullify) - *s = save_s; - - - return cmpltr; -} - -/* Parse a negated compare/subtract completer returning the - number (for encoding in instrutions) of the given completer. - - ISBRANCH specifies whether or not this is parsing a condition - completer for a branch (vs a nullification completer for a - computational instruction. */ - -static int -pa_parse_neg_cmpsub_cmpltr (s, isbranch) - char **s; - int isbranch; -{ - int cmpltr; - char *name = *s + 1; - char c; - char *save_s = *s; - int nullify = 0; - - cmpltr = 0; - if (**s == ',') - { - *s += 1; - while (**s != ',' && **s != ' ' && **s != '\t') - *s += 1; - c = **s; - **s = 0x00; - - - if (strcasecmp (name, "tr") == 0) - { - cmpltr = 0; - } - else if (strcmp (name, "<>") == 0) - { - cmpltr = 1; - } - else if (strcmp (name, ">=") == 0) - { - cmpltr = 2; - } - else if (strcmp (name, ">") == 0) - { - cmpltr = 3; - } - else if (strcmp (name, ">>=") == 0) - { - cmpltr = 4; - } - else if (strcmp (name, ">>") == 0) - { - cmpltr = 5; - } - else if (strcasecmp (name, "nsv") == 0) - { - cmpltr = 6; - } - else if (strcasecmp (name, "ev") == 0) - { - cmpltr = 7; - } - /* If we have something like addb,n then there is no condition - completer. */ - else if (strcasecmp (name, "n") == 0 && isbranch) - { - cmpltr = 0; - nullify = 1; - } - else - { - cmpltr = -1; - } - **s = c; - } - - /* Reset pointers if this was really a ,n for a branch instruction. */ - if (nullify) - *s = save_s; - - - return cmpltr; -} - - -/* Parse a 64 bit compare and branch completer returning the number (for - encoding in instrutions) of the given completer. - - Nonnegated comparisons are returned as 0-7, negated comparisons are - returned as 8-15. */ - -static int -pa_parse_cmpb_64_cmpltr (s) - char **s; -{ - int cmpltr; - char *name = *s + 1; - char c; - char *save_s = *s; - - cmpltr = -1; - if (**s == ',') - { - *s += 1; - while (**s != ',' && **s != ' ' && **s != '\t') - *s += 1; - c = **s; - **s = 0x00; - - if (strcmp (name, "*") == 0) - { - cmpltr = 0; - } - else if (strcmp (name, "*=") == 0) - { - cmpltr = 1; - } - else if (strcmp (name, "*<") == 0) - { - cmpltr = 2; - } - else if (strcmp (name, "*<=") == 0) - { - cmpltr = 3; - } - else if (strcmp (name, "*<<") == 0) - { - cmpltr = 4; - } - else if (strcmp (name, "*<<=") == 0) - { - cmpltr = 5; - } - else if (strcasecmp (name, "*sv") == 0) - { - cmpltr = 6; - } - else if (strcasecmp (name, "*od") == 0) - { - cmpltr = 7; - } - else if (strcasecmp (name, "*tr") == 0) - { - cmpltr = 8; - } - else if (strcmp (name, "*<>") == 0) - { - cmpltr = 9; - } - else if (strcmp (name, "*>=") == 0) - { - cmpltr = 10; - } - else if (strcmp (name, "*>") == 0) - { - cmpltr = 11; - } - else if (strcmp (name, "*>>=") == 0) - { - cmpltr = 12; - } - else if (strcmp (name, "*>>") == 0) - { - cmpltr = 13; - } - else if (strcasecmp (name, "*nsv") == 0) - { - cmpltr = 14; - } - else if (strcasecmp (name, "*ev") == 0) - { - cmpltr = 15; - } - else - { - cmpltr = -1; - } - **s = c; - } - - - return cmpltr; -} - -/* Parse a 64 bit compare immediate and branch completer returning the number - (for encoding in instrutions) of the given completer. */ - -static int -pa_parse_cmpib_64_cmpltr (s) - char **s; -{ - int cmpltr; - char *name = *s + 1; - char c; - char *save_s = *s; - - cmpltr = -1; - if (**s == ',') - { - *s += 1; - while (**s != ',' && **s != ' ' && **s != '\t') - *s += 1; - c = **s; - **s = 0x00; - - if (strcmp (name, "*<<") == 0) - { - cmpltr = 0; - } - else if (strcmp (name, "*=") == 0) - { - cmpltr = 1; - } - else if (strcmp (name, "*<") == 0) - { - cmpltr = 2; - } - else if (strcmp (name, "*<=") == 0) - { - cmpltr = 3; - } - else if (strcmp (name, "*>>=") == 0) - { - cmpltr = 4; - } - else if (strcmp (name, "*<>") == 0) - { - cmpltr = 5; - } - else if (strcasecmp (name, "*>=") == 0) - { - cmpltr = 6; - } - else if (strcasecmp (name, "*>") == 0) - { - cmpltr = 7; - } - else - { - cmpltr = -1; - } - **s = c; - } - - - return cmpltr; -} - -/* Parse a non-negated addition completer returning the number - (for encoding in instrutions) of the given completer. - - ISBRANCH specifies whether or not this is parsing a condition - completer for a branch (vs a nullification completer for a - computational instruction. */ - -static int -pa_parse_nonneg_add_cmpltr (s, isbranch) - char **s; - int isbranch; -{ - int cmpltr; - char *name = *s + 1; - char c; - char *save_s = *s; - - cmpltr = 0; - if (**s == ',') - { - *s += 1; - while (**s != ',' && **s != ' ' && **s != '\t') - *s += 1; - c = **s; - **s = 0x00; - if (strcmp (name, "=") == 0) - { - cmpltr = 1; - } - else if (strcmp (name, "<") == 0) - { - cmpltr = 2; - } - else if (strcmp (name, "<=") == 0) - { - cmpltr = 3; - } - else if (strcasecmp (name, "nuv") == 0) - { - cmpltr = 4; - } - else if (strcasecmp (name, "znv") == 0) - { - cmpltr = 5; - } - else if (strcasecmp (name, "sv") == 0) - { - cmpltr = 6; - } - else if (strcasecmp (name, "od") == 0) - { - cmpltr = 7; - } - /* If we have something like addb,n then there is no condition - completer. */ - else if (strcasecmp (name, "n") == 0 && isbranch) - { - cmpltr = 0; - } - else - { - cmpltr = -1; - } - **s = c; - } - - /* Reset pointers if this was really a ,n for a branch instruction. */ - if (cmpltr == 0 && *name == 'n' && isbranch) - *s = save_s; - - return cmpltr; -} - -/* Parse a negated addition completer returning the number - (for encoding in instrutions) of the given completer. - - ISBRANCH specifies whether or not this is parsing a condition - completer for a branch (vs a nullification completer for a - computational instruction). */ - -static int -pa_parse_neg_add_cmpltr (s, isbranch) - char **s; - int isbranch; -{ - int cmpltr; - char *name = *s + 1; - char c; - char *save_s = *s; - - cmpltr = 0; - if (**s == ',') - { - *s += 1; - while (**s != ',' && **s != ' ' && **s != '\t') - *s += 1; - c = **s; - **s = 0x00; - if (strcasecmp (name, "tr") == 0) - { - cmpltr = 0; - } - else if (strcmp (name, "<>") == 0) - { - cmpltr = 1; - } - else if (strcmp (name, ">=") == 0) - { - cmpltr = 2; - } - else if (strcmp (name, ">") == 0) - { - cmpltr = 3; - } - else if (strcasecmp (name, "uv") == 0) - { - cmpltr = 4; - } - else if (strcasecmp (name, "vnz") == 0) - { - cmpltr = 5; - } - else if (strcasecmp (name, "nsv") == 0) - { - cmpltr = 6; - } - else if (strcasecmp (name, "ev") == 0) - { - cmpltr = 7; - } - /* If we have something like addb,n then there is no condition - completer. */ - else if (strcasecmp (name, "n") == 0 && isbranch) - { - cmpltr = 0; - } - else - { - cmpltr = -1; - } - **s = c; - } - - /* Reset pointers if this was really a ,n for a branch instruction. */ - if (cmpltr == 0 && *name == 'n' && isbranch) - *s = save_s; - - return cmpltr; -} - -/* Parse a 64 bit wide mode add and branch completer returning the number (for - encoding in instrutions) of the given completer. */ - -static int -pa_parse_addb_64_cmpltr (s) - char **s; -{ - int cmpltr; - char *name = *s + 1; - char c; - char *save_s = *s; - int nullify = 0; - - cmpltr = 0; - if (**s == ',') - { - *s += 1; - while (**s != ',' && **s != ' ' && **s != '\t') - *s += 1; - c = **s; - **s = 0x00; - if (strcmp (name, "=") == 0) - { - cmpltr = 1; - } - else if (strcmp (name, "<") == 0) - { - cmpltr = 2; - } - else if (strcmp (name, "<=") == 0) - { - cmpltr = 3; - } - else if (strcasecmp (name, "nuv") == 0) - { - cmpltr = 4; - } - else if (strcasecmp (name, "*=") == 0) - { - cmpltr = 5; - } - else if (strcasecmp (name, "*<") == 0) - { - cmpltr = 6; - } - else if (strcasecmp (name, "*<=") == 0) - { - cmpltr = 7; - } - else if (strcmp (name, "tr") == 0) - { - cmpltr = 8; - } - else if (strcmp (name, "<>") == 0) - { - cmpltr = 9; - } - else if (strcmp (name, ">=") == 0) - { - cmpltr = 10; - } - else if (strcmp (name, ">") == 0) - { - cmpltr = 11; - } - else if (strcasecmp (name, "uv") == 0) - { - cmpltr = 12; - } - else if (strcasecmp (name, "*<>") == 0) - { - cmpltr = 13; - } - else if (strcasecmp (name, "*>=") == 0) - { - cmpltr = 14; - } - else if (strcasecmp (name, "*>") == 0) - { - cmpltr = 15; - } - /* If we have something like addb,n then there is no condition - completer. */ - else if (strcasecmp (name, "n") == 0) - { - cmpltr = 0; - nullify = 1; - } - else - { - cmpltr = -1; - } - **s = c; - } - - /* Reset pointers if this was really a ,n for a branch instruction. */ - if (nullify) - *s = save_s; - - return cmpltr; -} - -#ifdef OBJ_SOM -/* Handle an alignment directive. Special so that we can update the - alignment of the subspace if necessary. */ -static void -pa_align (bytes) -{ - /* We must have a valid space and subspace. */ - pa_check_current_space_and_subspace (); - - /* Let the generic gas code do most of the work. */ - s_align_bytes (bytes); - - /* If bytes is a power of 2, then update the current subspace's - alignment if necessary. */ - if (log2 (bytes) != -1) - record_alignment (current_subspace->ssd_seg, log2 (bytes)); -} -#endif - -/* Handle a .BLOCK type pseudo-op. */ - -static void -pa_block (z) - int z; -{ - char *p; - long int temp_fill; - unsigned int temp_size; - unsigned int i; - -#ifdef OBJ_SOM - /* We must have a valid space and subspace. */ - pa_check_current_space_and_subspace (); -#endif - - temp_size = get_absolute_expression (); - - /* Always fill with zeros, that's what the HP assembler does. */ - temp_fill = 0; - - p = frag_var (rs_fill, (int) temp_size, (int) temp_size, - (relax_substateT) 0, (symbolS *) 0, (offsetT) 1, NULL); - memset (p, 0, temp_size); - - /* Convert 2 bytes at a time. */ - - for (i = 0; i < temp_size; i += 2) - { - md_number_to_chars (p + i, - (valueT) temp_fill, - (int) ((temp_size - i) > 2 ? 2 : (temp_size - i))); - } - - pa_undefine_label (); - demand_empty_rest_of_line (); -} - -/* Handle a .begin_brtab and .end_brtab pseudo-op. */ - -static void -pa_brtab (begin) - int begin; -{ - -#ifdef OBJ_SOM - /* The BRTAB relocations are only availble in SOM (to denote - the beginning and end of branch tables). */ - char *where = frag_more (0); - - fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, - NULL, (offsetT) 0, NULL, - 0, begin ? R_HPPA_BEGIN_BRTAB : R_HPPA_END_BRTAB, - e_fsel, 0, 0, NULL); -#endif - - demand_empty_rest_of_line (); -} - -/* Handle a .begin_try and .end_try pseudo-op. */ - -static void -pa_try (begin) - int begin; -{ -#ifdef OBJ_SOM - expressionS exp; - char *where = frag_more (0); - - if (! begin) - expression (&exp); - - /* The TRY relocations are only availble in SOM (to denote - the beginning and end of exception handling regions). */ - - fix_new_hppa (frag_now, where - frag_now->fr_literal, 0, - NULL, (offsetT) 0, begin ? NULL : &exp, - 0, begin ? R_HPPA_BEGIN_TRY : R_HPPA_END_TRY, - e_fsel, 0, 0, NULL); -#endif - - demand_empty_rest_of_line (); -} - -/* Handle a .CALL pseudo-op. This involves storing away information - about where arguments are to be found so the linker can detect - (and correct) argument location mismatches between caller and callee. */ - -static void -pa_call (unused) - int unused; -{ -#ifdef OBJ_SOM - /* We must have a valid space and subspace. */ - pa_check_current_space_and_subspace (); -#endif - - pa_call_args (&last_call_desc); - demand_empty_rest_of_line (); -} - -/* Do the dirty work of building a call descriptor which describes - where the caller placed arguments to a function call. */ - -static void -pa_call_args (call_desc) - struct call_desc *call_desc; -{ - char *name, c, *p; - unsigned int temp, arg_reloc; - - while (!is_end_of_statement ()) - { - name = input_line_pointer; - c = get_symbol_end (); - /* Process a source argument. */ - if ((strncasecmp (name, "argw", 4) == 0)) - { - temp = atoi (name + 4); - p = input_line_pointer; - *p = c; - input_line_pointer++; - name = input_line_pointer; - c = get_symbol_end (); - arg_reloc = pa_build_arg_reloc (name); - call_desc->arg_reloc |= pa_align_arg_reloc (temp, arg_reloc); - } - /* Process a return value. */ - else if ((strncasecmp (name, "rtnval", 6) == 0)) - { - p = input_line_pointer; - *p = c; - input_line_pointer++; - name = input_line_pointer; - c = get_symbol_end (); - arg_reloc = pa_build_arg_reloc (name); - call_desc->arg_reloc |= (arg_reloc & 0x3); - } - else - { - as_bad (_("Invalid .CALL argument: %s"), name); - } - p = input_line_pointer; - *p = c; - if (!is_end_of_statement ()) - input_line_pointer++; - } -} - -/* Return TRUE if FRAG1 and FRAG2 are the same. */ - -static int -is_same_frag (frag1, frag2) - fragS *frag1; - fragS *frag2; -{ - - if (frag1 == NULL) - return (FALSE); - else if (frag2 == NULL) - return (FALSE); - else if (frag1 == frag2) - return (TRUE); - else if (frag2->fr_type == rs_fill && frag2->fr_fix == 0) - return (is_same_frag (frag1, frag2->fr_next)); - else - return (FALSE); -} - -#ifdef OBJ_ELF -/* Build an entry in the UNWIND subspace from the given function - attributes in CALL_INFO. This is not needed for SOM as using - R_ENTRY and R_EXIT relocations allow the linker to handle building - of the unwind spaces. */ - -static void -pa_build_unwind_subspace (call_info) - struct call_info *call_info; -{ - char *unwind; - asection *seg, *save_seg; - asymbol *sym; - subsegT subseg, save_subseg; - int i, reloc; - char c, *p; - - if (now_seg != text_section) - return; - - if (bfd_get_arch_info (stdoutput)->bits_per_address == 32) - reloc = R_PARISC_DIR32; - else - reloc = R_PARISC_SEGREL32; - - save_seg = now_seg; - save_subseg = now_subseg; - /* Get into the right seg/subseg. This may involve creating - the seg the first time through. Make sure to have the - old seg/subseg so that we can reset things when we are done. */ - seg = bfd_get_section_by_name (stdoutput, UNWIND_SECTION_NAME); - if (seg == ASEC_NULL) - { - seg = subseg_new (UNWIND_SECTION_NAME, 0); - bfd_set_section_flags (stdoutput, seg, - SEC_READONLY | SEC_HAS_CONTENTS - | SEC_LOAD | SEC_RELOC | SEC_ALLOC | SEC_DATA); - bfd_set_section_alignment (stdoutput, seg, 2); - } - - subseg_set (seg, 0); - - - /* Get some space to hold relocation information for the unwind - descriptor. */ - p = frag_more (4); - md_number_to_chars (p, 0, 4); - - /* Relocation info. for start offset of the function. */ - fix_new_hppa (frag_now, p - frag_now->fr_literal, 4, - call_info->start_symbol, (offsetT) 0, - (expressionS *) NULL, 0, reloc, - e_fsel, 32, 0, NULL); - - p = frag_more (4); - md_number_to_chars (p, 0, 4); - - /* Relocation info. for end offset of the function. - - Because we allow reductions of 32bit relocations for ELF, this will be - reduced to section_sym + offset which avoids putting the temporary - symbol into the symbol table. It (should) end up giving the same - value as call_info->start_symbol + function size once the linker is - finished with its work. */ - - fix_new_hppa (frag_now, p - frag_now->fr_literal, 4, - call_info->end_symbol, (offsetT) 0, - (expressionS *) NULL, 0, reloc, - e_fsel, 32, 0, NULL); - - /* Dump it. */ - unwind = (char *) &call_info->ci_unwind; - for (i = 8; i < sizeof (struct unwind_table); i++) - { - c = *(unwind + i); - { - FRAG_APPEND_1_CHAR (c); - } - } - - /* Return back to the original segment/subsegment. */ - subseg_set (save_seg, save_subseg); -} -#endif - -/* Process a .CALLINFO pseudo-op. This information is used later - to build unwind descriptors and maybe one day to support - .ENTER and .LEAVE. */ - -static void -pa_callinfo (unused) - int unused; -{ - char *name, c, *p; - int temp; - -#ifdef OBJ_SOM - /* We must have a valid space and subspace. */ - pa_check_current_space_and_subspace (); -#endif - - /* .CALLINFO must appear within a procedure definition. */ - if (!within_procedure) - as_bad (_(".callinfo is not within a procedure definition")); - - /* Mark the fact that we found the .CALLINFO for the - current procedure. */ - callinfo_found = TRUE; - - /* Iterate over the .CALLINFO arguments. */ - while (!is_end_of_statement ()) - { - name = input_line_pointer; - c = get_symbol_end (); - /* Frame size specification. */ - if ((strncasecmp (name, "frame", 5) == 0)) - { - p = input_line_pointer; - *p = c; - input_line_pointer++; - temp = get_absolute_expression (); - if ((temp & 0x3) != 0) - { - as_bad (_("FRAME parameter must be a multiple of 8: %d\n"), temp); - temp = 0; - } - - /* callinfo is in bytes and unwind_desc is in 8 byte units. */ - last_call_info->ci_unwind.descriptor.frame_size = temp / 8; - - } - /* Entry register (GR, GR and SR) specifications. */ - else if ((strncasecmp (name, "entry_gr", 8) == 0)) - { - p = input_line_pointer; - *p = c; - input_line_pointer++; - temp = get_absolute_expression (); - /* The HP assembler accepts 19 as the high bound for ENTRY_GR - even though %r19 is caller saved. I think this is a bug in - the HP assembler, and we are not going to emulate it. */ - if (temp < 3 || temp > 18) - as_bad (_("Value for ENTRY_GR must be in the range 3..18\n")); - last_call_info->ci_unwind.descriptor.entry_gr = temp - 2; - } - else if ((strncasecmp (name, "entry_fr", 8) == 0)) - { - p = input_line_pointer; - *p = c; - input_line_pointer++; - temp = get_absolute_expression (); - /* Similarly the HP assembler takes 31 as the high bound even - though %fr21 is the last callee saved floating point register. */ - if (temp < 12 || temp > 21) - as_bad (_("Value for ENTRY_FR must be in the range 12..21\n")); - last_call_info->ci_unwind.descriptor.entry_fr = temp - 11; - } - else if ((strncasecmp (name, "entry_sr", 8) == 0)) - { - p = input_line_pointer; - *p = c; - input_line_pointer++; - temp = get_absolute_expression (); - if (temp != 3) - as_bad (_("Value for ENTRY_SR must be 3\n")); - } - /* Note whether or not this function performs any calls. */ - else if ((strncasecmp (name, "calls", 5) == 0) || - (strncasecmp (name, "caller", 6) == 0)) - { - p = input_line_pointer; - *p = c; - } - else if ((strncasecmp (name, "no_calls", 8) == 0)) - { - p = input_line_pointer; - *p = c; - } - /* Should RP be saved into the stack. */ - else if ((strncasecmp (name, "save_rp", 7) == 0)) - { - p = input_line_pointer; - *p = c; - last_call_info->ci_unwind.descriptor.save_rp = 1; - } - /* Likewise for SP. */ - else if ((strncasecmp (name, "save_sp", 7) == 0)) - { - p = input_line_pointer; - *p = c; - last_call_info->ci_unwind.descriptor.save_sp = 1; - } - /* Is this an unwindable procedure. If so mark it so - in the unwind descriptor. */ - else if ((strncasecmp (name, "no_unwind", 9) == 0)) - { - p = input_line_pointer; - *p = c; - last_call_info->ci_unwind.descriptor.cannot_unwind = 1; - } - /* Is this an interrupt routine. If so mark it in the - unwind descriptor. */ - else if ((strncasecmp (name, "hpux_int", 7) == 0)) - { - p = input_line_pointer; - *p = c; - last_call_info->ci_unwind.descriptor.hpux_interrupt_marker = 1; - } - /* Is this a millicode routine. "millicode" isn't in my - assembler manual, but my copy is old. The HP assembler - accepts it, and there's a place in the unwind descriptor - to drop the information, so we'll accept it too. */ - else if ((strncasecmp (name, "millicode", 9) == 0)) - { - p = input_line_pointer; - *p = c; - last_call_info->ci_unwind.descriptor.millicode = 1; - } - else - { - as_bad (_("Invalid .CALLINFO argument: %s"), name); - *input_line_pointer = c; - } - if (!is_end_of_statement ()) - input_line_pointer++; - } - - demand_empty_rest_of_line (); -} - -/* Switch into the code subspace. */ - -static void -pa_code (unused) - int unused; -{ -#ifdef OBJ_SOM - current_space = is_defined_space ("$TEXT$"); - current_subspace - = pa_subsegment_to_subspace (current_space->sd_seg, 0); -#endif - s_text (0); - pa_undefine_label (); -} - -/* This is different than the standard GAS s_comm(). On HP9000/800 machines, - the .comm pseudo-op has the following symtax: - -