commit 6ad2fa368f630d8bc6b95f898f1afb1d9c8fe8a3 Author: TA Date: Thu Sep 19 18:59:13 2024 +0800 init: init nachos hw01, should pass jenkins os_group_20_hw job but fail on os_group_20_ta job diff --git a/code/README b/code/README new file mode 100644 index 0000000..cabd10b --- /dev/null +++ b/code/README @@ -0,0 +1,12 @@ +Building Instructions: + * got to the directory build., where is your working OS + * do a "make depend" to build depenencies (DO IT!) + * do a "make" to build NachOS + +Usage: +see "nachos -u" for all command line options + +Building and starting user-level programs in NachOS: + * use Mips cross-compiler to build and link coff-binaries + * use coff2noff to translate the binaries to the NachOS-format + * start binary with nachos -x \ No newline at end of file diff --git a/code/build.cygwin/Makefile b/code/build.cygwin/Makefile new file mode 100644 index 0000000..be6b97b --- /dev/null +++ b/code/build.cygwin/Makefile @@ -0,0 +1,367 @@ +# Copyright (c) 1992-1996 The Regents of the University of California. +# All rights reserved. See copyright.h for copyright notice and limitation +# of liability and disclaimer of warranty provisions. +# +# This is a GNU Makefile. It must be used with the GNU make program. +# At UW, the GNU make program is /software/gnu/bin/make. +# In many other places it is known as "gmake". +# You may wish to include /software/gnu/bin/ early in your command +# search path, so that you will be using GNU make when you type "make". +# +# About this Makefile: +# -------------------- +# +# This Makefile is used to build the Nachos system, which includes +# the MIPS machine simulation and a simple operating system. +# +# There is a separate Makefile, in the "test" directory, that is +# used to build the Nachos test programs (which run on the +# simulated machine). +# +# There are several "build" directories, one for each type +# of machine in the MFCF computing environment +# (build.solaris, build.sunos, and build.ultrix), as well +# as a build directory for Linux (build.linux) and a generic +# build directory (build.other) for those who wish to try +# building Nachos on other platforms. +# +# This Makefile appears to be located in all of the build directories. +# If you edit it in one directory, the copies in all of the other +# directories appear to change as well. This is the desired behaviour, +# since this file is machine independent. (The file actually lives +# in build.solaris, with symbolic links from the other build directories.) +# +# The platform-dependent parts of make's instructions are located +# in the file Makefile.dep. +# There is a different Makefile.dep in each build directory. +# +# If you are in the MFCF environment, you should not have to edit +# the Makefile.dep files by hand. Any changes to the make instructions +# can be made in this file (see the instructions below) - they will +# apply no matter where you build Nachos. +# If you are not in the MFCF environment, e.g., if you are trying +# to build Nachos on Linux at home, you will probably need +# to edit Makefile.dep (in the appropriate build directory) to +# customize the make procedure to your environment. +# +# How to build Nachos for the first time: +# --------------------------------------- +# +# (1) Make sure than you are in the build directory for the +# type of machine you are logged in to (the "host" machine): +# +# host type examples build directory +# ----------- ----------- ---------------- +# +# sparc/SunOS cayley,napier, build.sunos +# (SunOS 4.1.3) descartes +# +# sparc/Solaris picard.math, build.solaris +# (SunOS 5.x) hermite.math, +# markov.math, +# hypatia.math, +# hume.math +# +# mips/ULTRIX cantor.math build.ultrix +# (ULTRIX 4.2) noether.math +# +# If you are not sure what type of machine you are on, +# try the command "uname -a". +# +# (2) Type "make depend" +# - this computes file dependencies and records them +# at the end of the file Makefile.dep in +# your build directory. Have a look... +# +# (3) Type "make nachos" (or just "make"). +# - make echos the commands it is executing, so that +# you can observe its progress. When the +# build is finished, you should have an +# executable "nachos" in the build directory. +# +# (4) There is no 4th step. You are done. Try running "./nachos -u". +# +# +# How to Re-build Nachos after you have changed the code: +#-------------------------------------------------------- +# +# - The Nachos source code is located in the code subdirectories: +# threads, userprog, filesys, network, and lib. You may +# change the files in any of these directories, and you can +# add new files and/or remove files. The "machine" subdirectory +# contains the hardware simulation (which is also part of +# Nachos. You may look at it, but +# you may not change it, except as noted in machine/machine.h +# - When you want to re-make Nachos, always do it in the +# "build" directory that is appropriate for the machine +# type that you are running on. +# DO NOT TRY TO MAKE NACHOS IN THE SOURCE CODE DIRECTORIES. +# +# - IF all you have done is changed C++ code in existing files +# (since the last time you made Nachos in this build directory), +# THEN all you need to do to re-make Nachos is to type +# +# "make nachos" +# +# in the build directory. +# +# - IF you have done any of the following since the last build in +# this directory: +# added new .cc files or new .h files +# added or deleted #include's from existing files +# THEN +# you must do +# "make depend" +# followed by +# "make nachos" +# +# in the build directory. +# +# Note that is is always safe to do "make depend" followed by +# "make nachos", so if you are not sure what changes you have +# made, do "make depend". +# +# - IF you have added new files (.cc or .h) since the last build, +# you should edit this Makefile before running "make depend" +# and "make nachos". + +# For new .h files, simply update the appropriate "_H" list below. +# For example, if you create a file called +# "bigfile.h" in the filesys subdirectory, you should add +# "../filesys/bigfile.h" to FILESYS_H, which is defined below + +# For new .cc files, update the appropriate "_C" and "_O" lists. +# For example, if you create a file called "filetable.cc" in +# the directory "userprog", you should add +# "../userprog/filetable.cc" to USERPROG_C, +# and you should add "filetable.o" to USERPROG_O. +# Note that the entry in the "_C" list includes the subdirectory +# name, while the entry on the "_O" list does not. +# +# Some Important Notes: +# --------------------- +# +# * You can clean up all of the .o and other files left behind +# by make by typeing "make clean" in the build directory. +# * You can clean up .o and other files, as well as the nachos +# executable, DISK, core, SOCKET, and other files by typing +# make "distclean" +# +# These are good ways to save space, but the next build that +# you do after cleaning will take longer than usual, since +# much of the stuff you cleaned will need to be rebuilt. +# +# * When you build Nachos on an ULTRIX machine (in build.ultrix), +# you will get lots of warning messages like this: +# +# openfile.o: does not have gp tables for all it's sectons +# +# from the loader. Ignore them. Or better yet, figure out +# how to make them go away. +# +# The Most Important Note: +# ----------------------- +# +# * If "make" is behaving strangely and you cannot figure out +# why, you should REBUILD the program FROM SCRATCH. +# Yes, it is slow. +# But, there are lots of little things that can go wrong, especially +# with all of these different types of machines available. +# Rebuilding from scratch at least gives you a known starting +# place. To rebuild from scratch, go to the appropriate +# build directory and do: +# +# make distclean +# make depend +# make nachos +# +################################################################ +# READ THIS: CONFIGURING NACHOS +# +# Change DEFINES (below) to +# DEFINES = -DUSE_TLB -DFILESYS_STUB +# if you want the simulated machine to use its TLB +# +# If you want to use the real Nachos file system (based on +# the simulated disk), rather than the stub, remove +# the -DFILESYS_STUB from DEFINES. +# +# There is a a fix to the MIPS simulator to enable it to properly +# handle unaligned data access. This fix is enabled by the addition +# of "-DSIM_FIX" to the DEFINES. This should be enabled by default +# and eventually will not require the symbol definition +################################################################ +DEFINES = -DFILESYS_STUB -DRDATA -DSIM_FIX + + +##################################################################### +# +# You might want to play with the CFLAGS, but if you use -O it may +# break the thread system. You might want to use -fno-inline if +# you need to call some inline functions from the debugger. + +CFLAGS = -g -Wall -fwritable-strings $(INCPATH) $(DEFINES) $(HOSTCFLAGS) -DCHANGED +LDFLAGS = + +##################################################################### +CPP= cpp +CC = g++ +LD = g++ +AS = as +RM = rm + +INCPATH = -I../network -I../filesys -I../userprog -I../threads -I../machine -I../lib + +PROGRAM = nachos + +# +# Edit these lists as if you add files to the source directories. +# See the instructions at the top of the file for more information. +# + +LIB_H = ../lib/bitmap.h\ + ../lib/copyright.h\ + ../lib/debug.h\ + ../lib/hash.h\ + ../lib/libtest.h\ + ../lib/list.h\ + ../lib/sysdep.h\ + ../lib/utility.h + +LIB_C = ../lib/bitmap.cc\ + ../lib/debug.cc\ + ../lib/hash.cc\ + ../lib/libtest.cc\ + ../lib/list.cc\ + ../lib/sysdep.cc + +LIB_O = bitmap.o debug.o libtest.o sysdep.o + + +MACHINE_H = ../machine/callback.h\ + ../machine/interrupt.h\ + ../machine/stats.h\ + ../machine/timer.h\ + ../machine/console.h\ + ../machine/machine.h\ + ../machine/mipssim.h\ + ../machine/translate.h\ + ../machine/network.h\ + ../machine/disk.h + +MACHINE_C = ../machine/interrupt.cc\ + ../machine/stats.cc\ + ../machine/timer.cc\ + ../machine/console.cc\ + ../machine/machine.cc\ + ../machine/mipssim.cc\ + ../machine/translate.cc\ + ../machine/network.cc\ + ../machine/disk.cc + +MACHINE_O = interrupt.o stats.o timer.o console.o machine.o mipssim.o\ + translate.o network.o disk.o + +THREAD_H = ../threads/alarm.h\ + ../threads/kernel.h\ + ../threads/main.h\ + ../threads/scheduler.h\ + ../threads/switch.h\ + ../threads/synch.h\ + ../threads/synchlist.h\ + ../threads/thread.h + +THREAD_C = ../threads/alarm.cc\ + ../threads/kernel.cc\ + ../threads/main.cc\ + ../threads/scheduler.cc\ + ../threads/synch.cc\ + ../threads/synchlist.cc\ + ../threads/thread.cc + +THREAD_O = alarm.o kernel.o main.o scheduler.o synch.o thread.o + +USERPROG_H = ../userprog/addrspace.h\ + ../userprog/syscall.h\ + ../userprog/synchconsole.h\ + ../userprog/noff.h + +USERPROG_C = ../userprog/addrspace.cc\ + ../userprog/exception.cc\ + ../userprog/synchconsole.cc + +USERPROG_O = addrspace.o exception.o synchconsole.o + +FILESYS_H =../filesys/directory.h \ + ../filesys/filehdr.h\ + ../filesys/filesys.h \ + ../filesys/openfile.h\ + ../filesys/pbitmap.h\ + ../filesys/synchdisk.h + +FILESYS_C =../filesys/directory.cc\ + ../filesys/filehdr.cc\ + ../filesys/filesys.cc\ + ../filesys/pbitmap.cc\ + ../filesys/openfile.cc\ + ../filesys/synchdisk.cc\ + +FILESYS_O =directory.o filehdr.o filesys.o pbitmap.o openfile.o synchdisk.o + +NETWORK_H = ../network/post.h + +NETWORK_C = ../network/post.cc + +NETWORK_O = post.o + +################################################################## +# You probably don't want to change anything below this point in +# the file unless you are comfortable with GNU make and know what +# you are doing... +################################################################## + +THREAD_S = ../threads/switch.s + +HFILES = $(LIB_H) $(MACHINE_H) $(THREAD_H) $(USERPROG_H) $(FILESYS_H) $(NETWORK_H) +CFILES = $(LIB_C) $(MACHINE_C) $(THREAD_C) $(USERPROG_C) $(FILESYS_C) $(NETWORK_C) + +C_OFILES = $(LIB_O) $(MACHINE_O) $(THREAD_O) $(USERPROG_O) $(FILESYS_O) $(NETWORK_O) + +S_OFILES = switch.o +OFILES = $(C_OFILES) $(S_OFILES) + +$(PROGRAM): $(OFILES) + $(LD) $(OFILES) $(LDFLAGS) -o $(PROGRAM) + +$(C_OFILES): %.o: + $(CC) $(CFLAGS) -c $< + +switch.o: ../threads/switch.s + $(CPP) $(CPP_AS_FLAGS) -P $(INCPATH) $(HOSTCFLAGS) ../threads/switch.s > swtch.s + $(AS) -o switch.o swtch.s + +depend: $(CFILES) $(HFILES) + $(CC) $(INCPATH) $(DEFINES) $(HOSTCFLAGS) -DCHANGED -M $(CFILES) > makedep + @echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep + @echo '$$r makedep' >>eddep + @echo 'w' >>eddep + @echo 'q' >>eddep + ed - Makefile.dep < eddep + rm eddep makedep + @echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile.dep + @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile.dep + @echo '# see make depend above' >> Makefile.dep + +clean: + $(RM) -f $(OFILES) + $(RM) -f swtch.s + $(RM) -f *.s *.ii + +distclean: clean + $(RM) -f $(PROGRAM) + $(RM) -f $(PROGRAM).exe + $(RM) -f DISK_? + $(RM) -f core + $(RM) -f SOCKET_? + +include Makefile.dep diff --git a/code/build.cygwin/Makefile.dep b/code/build.cygwin/Makefile.dep new file mode 100644 index 0000000..c3f81d4 --- /dev/null +++ b/code/build.cygwin/Makefile.dep @@ -0,0 +1,544 @@ +################################################################## +# Machine Dependencies - this file is included automatically +# into the main Makefile +# +# This file contains definitions below for x86 running Linux +# It has *not* been tested! +################################################################## + +HOSTCFLAGS = -Dx86 -DLINUX -DCYGWIN + +#----------------------------------------------------------------- +# Do not put anything below this point - it will be destroyed by +# "make depend" +# +# DO NOT DELETE THIS LINE -- make depend uses it +# DEPENDENCIES MUST END AT END OF FILE +bitmap.o: ../lib/bitmap.cc ../lib/copyright.h ../lib/debug.h \ + ../lib/utility.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../lib/bitmap.h +debug.o: ../lib/debug.cc ../lib/copyright.h ../lib/utility.h \ + ../lib/debug.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h +hash.o: ../lib/hash.cc ../lib/copyright.h +libtest.o: ../lib/libtest.cc ../lib/copyright.h ../lib/libtest.h \ + ../lib/bitmap.h ../lib/utility.h ../lib/list.h ../lib/debug.h \ + ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../lib/list.cc ../lib/hash.h ../lib/hash.cc +list.o: ../lib/list.cc ../lib/copyright.h +sysdep.o: ../lib/sysdep.cc ../lib/copyright.h ../lib/debug.h \ + ../lib/utility.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h /usr/include/unistd.h /usr/include/sys/unistd.h \ + /usr/include/getopt.h /usr/include/sys/time.h \ + /usr/include/sys/select.h /usr/include/time.h \ + /usr/include/machine/time.h /usr/include/sys/file.h \ + /usr/include/fcntl.h /usr/include/sys/fcntl.h /usr/include/sys/stat.h \ + /usr/include/cygwin/stat.h /usr/include/sys/socket.h \ + /usr/include/features.h /usr/include/cygwin/socket.h \ + /usr/include/asm/socket.h /usr/include/cygwin/if.h \ + /usr/include/cygwin/sockios.h /usr/include/cygwin/uio.h \ + /usr/include/sys/un.h /usr/include/signal.h /usr/include/sys/signal.h +interrupt.o: ../machine/interrupt.cc ../lib/copyright.h \ + ../machine/interrupt.h ../lib/list.h ../lib/debug.h ../lib/utility.h \ + ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../lib/list.cc ../machine/callback.h \ + ../threads/main.h ../threads/kernel.h ../threads/thread.h \ + ../machine/machine.h ../machine/translate.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../filesys/openfile.h ../threads/scheduler.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h +stats.o: ../machine/stats.cc ../lib/copyright.h ../lib/debug.h \ + ../lib/utility.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../machine/stats.h +timer.o: ../machine/timer.cc ../lib/copyright.h ../machine/timer.h \ + ../lib/utility.h ../machine/callback.h ../threads/main.h \ + ../lib/debug.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/kernel.h ../threads/thread.h \ + ../machine/machine.h ../machine/translate.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../filesys/openfile.h ../threads/scheduler.h \ + ../lib/list.h ../lib/list.cc ../machine/interrupt.h \ + ../machine/stats.h ../threads/alarm.h +console.o: ../machine/console.cc ../lib/copyright.h \ + ../machine/console.h ../lib/utility.h ../machine/callback.h \ + ../threads/main.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/kernel.h ../threads/thread.h \ + ../machine/machine.h ../machine/translate.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../filesys/openfile.h ../threads/scheduler.h \ + ../lib/list.h ../lib/list.cc ../machine/interrupt.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h +machine.o: ../machine/machine.cc ../lib/copyright.h \ + ../machine/machine.h ../lib/utility.h ../machine/translate.h \ + ../threads/main.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/kernel.h ../threads/thread.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/callback.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h +mipssim.o: ../machine/mipssim.cc ../lib/copyright.h ../lib/debug.h \ + ../lib/utility.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../machine/machine.h ../machine/translate.h \ + ../machine/mipssim.h ../threads/main.h ../threads/kernel.h \ + ../threads/thread.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../threads/scheduler.h ../lib/list.h \ + ../lib/list.cc ../machine/interrupt.h ../machine/callback.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h +translate.o: ../machine/translate.cc ../lib/copyright.h \ + ../threads/main.h ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/kernel.h ../threads/thread.h \ + ../machine/machine.h ../machine/translate.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../filesys/openfile.h ../threads/scheduler.h \ + ../lib/list.h ../lib/list.cc ../machine/interrupt.h \ + ../machine/callback.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +network.o: ../machine/network.cc ../lib/copyright.h \ + ../machine/network.h ../lib/utility.h ../machine/callback.h \ + ../threads/main.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/kernel.h ../threads/thread.h \ + ../machine/machine.h ../machine/translate.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../filesys/openfile.h ../threads/scheduler.h \ + ../lib/list.h ../lib/list.cc ../machine/interrupt.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h +disk.o: ../machine/disk.cc ../lib/copyright.h ../machine/disk.h \ + ../lib/utility.h ../machine/callback.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/main.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +alarm.o: ../threads/alarm.cc ../lib/copyright.h ../threads/alarm.h \ + ../lib/utility.h ../machine/callback.h ../machine/timer.h \ + ../threads/main.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/kernel.h ../threads/thread.h \ + ../machine/machine.h ../machine/translate.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../filesys/openfile.h ../threads/scheduler.h \ + ../lib/list.h ../lib/list.cc ../machine/interrupt.h \ + ../machine/stats.h +kernel.o: ../threads/kernel.cc ../lib/copyright.h ../lib/debug.h \ + ../lib/utility.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/main.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/callback.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h ../threads/synch.h \ + ../threads/synchlist.h ../threads/synchlist.cc ../lib/libtest.h \ + ../userprog/synchconsole.h ../machine/console.h \ + ../filesys/synchdisk.h ../machine/disk.h ../network/post.h \ + ../machine/network.h +main.o: ../threads/main.cc ../lib/copyright.h ../threads/main.h \ + ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/kernel.h ../threads/thread.h \ + ../machine/machine.h ../machine/translate.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../filesys/openfile.h ../threads/scheduler.h \ + ../lib/list.h ../lib/list.cc ../machine/interrupt.h \ + ../machine/callback.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +scheduler.o: ../threads/scheduler.cc ../lib/copyright.h ../lib/debug.h \ + ../lib/utility.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/scheduler.h ../lib/list.h \ + ../lib/list.cc ../threads/thread.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../threads/main.h ../threads/kernel.h \ + ../machine/interrupt.h ../machine/callback.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h +synch.o: ../threads/synch.cc ../lib/copyright.h ../threads/synch.h \ + ../threads/thread.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../lib/list.h ../lib/debug.h ../lib/list.cc ../threads/main.h \ + ../threads/kernel.h ../threads/scheduler.h ../machine/interrupt.h \ + ../machine/callback.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +synchlist.o: ../threads/synchlist.cc ../lib/copyright.h \ + ../threads/synchlist.h ../lib/list.h ../lib/debug.h ../lib/utility.h \ + ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../lib/list.cc ../threads/synch.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/main.h ../threads/kernel.h ../threads/scheduler.h \ + ../machine/interrupt.h ../machine/callback.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h ../threads/synchlist.cc +thread.o: ../threads/thread.cc ../lib/copyright.h ../threads/thread.h \ + ../lib/utility.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/switch.h ../threads/synch.h ../lib/list.h ../lib/debug.h \ + ../lib/list.cc ../threads/main.h ../threads/kernel.h \ + ../threads/scheduler.h ../machine/interrupt.h ../machine/callback.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h +addrspace.o: ../userprog/addrspace.cc ../lib/copyright.h \ + ../threads/main.h ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/kernel.h ../threads/thread.h \ + ../machine/machine.h ../machine/translate.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../filesys/openfile.h ../threads/scheduler.h \ + ../lib/list.h ../lib/list.cc ../machine/interrupt.h \ + ../machine/callback.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h ../userprog/noff.h +exception.o: ../userprog/exception.cc ../lib/copyright.h \ + ../threads/main.h ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../threads/kernel.h ../threads/thread.h \ + ../machine/machine.h ../machine/translate.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../filesys/openfile.h ../threads/scheduler.h \ + ../lib/list.h ../lib/list.cc ../machine/interrupt.h \ + ../machine/callback.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h ../userprog/syscall.h ../userprog/errno.h \ + ../userprog/ksyscall.h +synchconsole.o: ../userprog/synchconsole.cc ../lib/copyright.h \ + ../userprog/synchconsole.h ../lib/utility.h ../machine/callback.h \ + ../machine/console.h ../threads/synch.h ../threads/thread.h \ + ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../lib/list.h ../lib/debug.h ../lib/list.cc ../threads/main.h \ + ../threads/kernel.h ../threads/scheduler.h ../machine/interrupt.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h +directory.o: ../filesys/directory.cc ../lib/copyright.h \ + ../lib/utility.h ../filesys/filehdr.h ../machine/disk.h \ + ../machine/callback.h ../filesys/pbitmap.h ../lib/bitmap.h \ + ../filesys/openfile.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../filesys/directory.h +filehdr.o: ../filesys/filehdr.cc ../lib/copyright.h \ + ../filesys/filehdr.h ../machine/disk.h ../lib/utility.h \ + ../machine/callback.h ../filesys/pbitmap.h ../lib/bitmap.h \ + ../filesys/openfile.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../lib/debug.h ../filesys/synchdisk.h \ + ../threads/synch.h ../threads/thread.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../lib/list.h ../lib/list.cc ../threads/main.h ../threads/kernel.h \ + ../threads/scheduler.h ../machine/interrupt.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h +filesys.o: ../filesys/filesys.cc +pbitmap.o: ../filesys/pbitmap.cc ../lib/copyright.h \ + ../filesys/pbitmap.h ../lib/bitmap.h ../lib/utility.h \ + ../filesys/openfile.h ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h +openfile.o: ../filesys/openfile.cc +synchdisk.o: ../filesys/synchdisk.cc ../lib/copyright.h \ + ../filesys/synchdisk.h ../machine/disk.h ../lib/utility.h \ + ../machine/callback.h ../threads/synch.h ../threads/thread.h \ + ../lib/sysdep.h /usr/include/g++-3/iostream.h \ + /usr/include/g++-3/streambuf.h /usr/include/g++-3/libio.h \ + /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../lib/list.h ../lib/debug.h ../lib/list.cc ../threads/main.h \ + ../threads/kernel.h ../threads/scheduler.h ../machine/interrupt.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h +post.o: ../network/post.cc ../lib/copyright.h ../network/post.h \ + ../lib/utility.h ../machine/callback.h ../machine/network.h \ + ../threads/synchlist.h ../lib/list.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ + /usr/include/g++-3/libio.h /usr/include/_G_config.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stddef.h \ + /usr/include/sys/cdefs.h /usr/include/stdlib.h /usr/include/_ansi.h \ + /usr/include/sys/config.h /usr/include/sys/reent.h \ + /usr/include/sys/_types.h /usr/include/machine/stdlib.h \ + /usr/include/alloca.h /usr/include/stdio.h \ + /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include/stdarg.h \ + /usr/include/sys/types.h /usr/include/machine/types.h \ + /usr/include/sys/features.h /usr/include/cygwin/types.h \ + /usr/include/sys/sysmacros.h /usr/include/sys/stdio.h \ + /usr/include/string.h ../lib/list.cc ../threads/synch.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/main.h ../threads/kernel.h ../threads/scheduler.h \ + ../machine/interrupt.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h ../threads/synchlist.cc +# DEPENDENCIES MUST END AT END OF FILE +# IF YOU PUT STUFF HERE IT WILL GO AWAY +# see make depend above diff --git a/code/build.linux/DISK_0 b/code/build.linux/DISK_0 new file mode 100644 index 0000000..e6ad155 Binary files /dev/null and b/code/build.linux/DISK_0 differ diff --git a/code/build.linux/Makefile b/code/build.linux/Makefile new file mode 100644 index 0000000..f17c497 --- /dev/null +++ b/code/build.linux/Makefile @@ -0,0 +1,372 @@ +# Copyright (c) 1992-1996 The Regents of the University of California. +# All rights reserved. See copyright.h for copyright notice and limitation +# of liability and disclaimer of warranty provisions. +# +# This is a GNU Makefile. It must be used with the GNU make program. +# At UW, the GNU make program is /software/gnu/bin/make. +# In many other places it is known as "gmake". +# You may wish to include /software/gnu/bin/ early in your command +# search path, so that you will be using GNU make when you type "make". +# +# About this Makefile: +# -------------------- +# +# This Makefile is used to build the Nachos system, which includes +# the MIPS machine simulation and a simple operating system. +# +# There is a separate Makefile, in the "test" directory, that is +# used to build the Nachos test programs (which run on the +# simulated machine). +# +# There are several "build" directories, one for each type +# of machine in the MFCF computing environment +# (build.solaris, build.sunos, and build.ultrix), as well +# as a build directory for Linux (build.linux) and a generic +# build directory (build.other) for those who wish to try +# building Nachos on other platforms. +# +# This Makefile appears to be located in all of the build directories. +# If you edit it in one directory, the copies in all of the other +# directories appear to change as well. This is the desired behaviour, +# since this file is machine independent. (The file actually lives +# in build.solaris, with symbolic links from the other build directories.) +# +# The platform-dependent parts of make's instructions are located +# in the file Makefile.dep. +# There is a different Makefile.dep in each build directory. +# +# If you are in the MFCF environment, you should not have to edit +# the Makefile.dep files by hand. Any changes to the make instructions +# can be made in this file (see the instructions below) - they will +# apply no matter where you build Nachos. +# If you are not in the MFCF environment, e.g., if you are trying +# to build Nachos on Linux at home, you will probably need +# to edit Makefile.dep (in the appropriate build directory) to +# customize the make procedure to your environment. +# +# How to build Nachos for the first time: +# --------------------------------------- +# +# (1) Make sure than you are in the build directory for the +# type of machine you are logged in to (the "host" machine): +# +# host type examples build directory +# ----------- ----------- ---------------- +# +# sparc/SunOS cayley,napier, build.sunos +# (SunOS 4.1.3) descartes +# +# sparc/Solaris picard.math, build.solaris +# (SunOS 5.x) hermite.math, +# markov.math, +# hypatia.math, +# hume.math +# +# mips/ULTRIX cantor.math build.ultrix +# (ULTRIX 4.2) noether.math +# +# If you are not sure what type of machine you are on, +# try the command "uname -a". +# +# (2) Type "make depend" +# - this computes file dependencies and records them +# at the end of the file Makefile.dep in +# your build directory. Have a look... +# +# (3) Type "make nachos" (or just "make"). +# - make echos the commands it is executing, so that +# you can observe its progress. When the +# build is finished, you should have an +# executable "nachos" in the build directory. +# +# (4) There is no 4th step. You are done. Try running "./nachos -u". +# +# +# How to Re-build Nachos after you have changed the code: +#-------------------------------------------------------- +# +# - The Nachos source code is located in the code subdirectories: +# threads, userprog, filesys, network, and lib. You may +# change the files in any of these directories, and you can +# add new files and/or remove files. The "machine" subdirectory +# contains the hardware simulation (which is also part of +# Nachos. You may look at it, but +# you may not change it, except as noted in machine/machine.h +# - When you want to re-make Nachos, always do it in the +# "build" directory that is appropriate for the machine +# type that you are running on. +# DO NOT TRY TO MAKE NACHOS IN THE SOURCE CODE DIRECTORIES. +# +# - IF all you have done is changed C++ code in existing files +# (since the last time you made Nachos in this build directory), +# THEN all you need to do to re-make Nachos is to type +# +# "make nachos" +# +# in the build directory. +# +# - IF you have done any of the following since the last build in +# this directory: +# added new .cc files or new .h files +# added or deleted #include's from existing files +# THEN +# you must do +# "make depend" +# followed by +# "make nachos" +# +# in the build directory. +# +# Note that is is always safe to do "make depend" followed by +# "make nachos", so if you are not sure what changes you have +# made, do "make depend". +# +# - IF you have added new files (.cc or .h) since the last build, +# you should edit this Makefile before running "make depend" +# and "make nachos". + +# For new .h files, simply update the appropriate "_H" list below. +# For example, if you create a file called +# "bigfile.h" in the filesys subdirectory, you should add +# "../filesys/bigfile.h" to FILESYS_H, which is defined below + +# For new .cc files, update the appropriate "_C" and "_O" lists. +# For example, if you create a file called "filetable.cc" in +# the directory "userprog", you should add +# "../userprog/filetable.cc" to USERPROG_C, +# and you should add "filetable.o" to USERPROG_O. +# Note that the entry in the "_C" list includes the subdirectory +# name, while the entry on the "_O" list does not. +# +# Some Important Notes: +# --------------------- +# +# * You can clean up all of the .o and other files left behind +# by make by typeing "make clean" in the build directory. +# * You can clean up .o and other files, as well as the nachos +# executable, DISK, core, SOCKET, and other files by typing +# make "distclean" +# +# These are good ways to save space, but the next build that +# you do after cleaning will take longer than usual, since +# much of the stuff you cleaned will need to be rebuilt. +# +# * When you build Nachos on an ULTRIX machine (in build.ultrix), +# you will get lots of warning messages like this: +# +# openfile.o: does not have gp tables for all it's sectons +# +# from the loader. Ignore them. Or better yet, figure out +# how to make them go away. +# +# The Most Important Note: +# ----------------------- +# +# * If "make" is behaving strangely and you cannot figure out +# why, you should REBUILD the program FROM SCRATCH. +# Yes, it is slow. +# But, there are lots of little things that can go wrong, especially +# with all of these different types of machines available. +# Rebuilding from scratch at least gives you a known starting +# place. To rebuild from scratch, go to the appropriate +# build directory and do: +# +# make distclean +# make depend +# make nachos +# +################################################################ +# READ THIS: CONFIGURING NACHOS +# +# Change DEFINES (below) to +# DEFINES = -DUSE_TLB -DFILESYS_STUB +# if you want the simulated machine to use its TLB +# +# If you want to use the real Nachos file system (based on +# the simulated disk), rather than the stub, remove +# the -DFILESYS_STUB from DEFINES. +# +# There is a a fix to the MIPS simulator to enable it to properly +# handle unaligned data access. This fix is enabled by the addition +# of "-DSIM_FIX" to the DEFINES. This should be enabled by default +# and eventually will not require the symbol definition +################################################################ +DEFINES = -DFILESYS_STUB -DRDATA -DSIM_FIX + + +##################################################################### +# +# You might want to play with the CFLAGS, but if you use -O it may +# break the thread system. You might want to use -fno-inline if +# you need to call some inline functions from the debugger. + +CFLAGS = -g -Wall $(INCPATH) $(DEFINES) $(HOSTCFLAGS) -DCHANGED -m32 +LDFLAGS = -m32 +CPP_AS_FLAGS= -m32 + +##################################################################### +CPP=/lib/cpp +CC = g++ -m32 -Wno-deprecated +LD = g++ -m32 -Wno-deprecated +AS = as --32 +RM = /bin/rm + +INCPATH = -I../network -I../filesys -I../userprog -I../threads -I../machine -I../lib -I- + +PROGRAM = nachos + +# +# Edit these lists as if you add files to the source directories. +# See the instructions at the top of the file for more information. +# + +LIB_H = ../lib/bitmap.h\ + ../lib/copyright.h\ + ../lib/debug.h\ + ../lib/hash.h\ + ../lib/libtest.h\ + ../lib/list.h\ + ../lib/sysdep.h\ + ../lib/utility.h + +LIB_C = ../lib/bitmap.cc\ + ../lib/debug.cc\ + ../lib/hash.cc\ + ../lib/libtest.cc\ + ../lib/list.cc\ + ../lib/sysdep.cc + +LIB_O = bitmap.o debug.o libtest.o sysdep.o + + +MACHINE_H = ../machine/callback.h\ + ../machine/interrupt.h\ + ../machine/stats.h\ + ../machine/timer.h\ + ../machine/console.h\ + ../machine/machine.h\ + ../machine/mipssim.h\ + ../machine/translate.h\ + ../machine/network.h\ + ../machine/disk.h + +MACHINE_C = ../machine/interrupt.cc\ + ../machine/stats.cc\ + ../machine/timer.cc\ + ../machine/console.cc\ + ../machine/machine.cc\ + ../machine/mipssim.cc\ + ../machine/translate.cc\ + ../machine/network.cc\ + ../machine/disk.cc + +MACHINE_O = interrupt.o stats.o timer.o console.o machine.o mipssim.o\ + translate.o network.o disk.o + +THREAD_H = ../threads/alarm.h\ + ../threads/kernel.h\ + ../threads/main.h\ + ../threads/scheduler.h\ + ../threads/switch.h\ + ../threads/synch.h\ + ../threads/synchlist.h\ + ../threads/thread.h + +THREAD_C = ../threads/alarm.cc\ + ../threads/kernel.cc\ + ../threads/main.cc\ + ../threads/scheduler.cc\ + ../threads/synch.cc\ + ../threads/synchlist.cc\ + ../threads/thread.cc + +THREAD_O = alarm.o kernel.o main.o scheduler.o synch.o thread.o + +USERPROG_H = ../userprog/addrspace.h\ + ../userprog/syscall.h\ + ../userprog/synchconsole.h\ + ../userprog/noff.h + +USERPROG_C = ../userprog/addrspace.cc\ + ../userprog/exception.cc\ + ../userprog/synchconsole.cc + +USERPROG_O = addrspace.o exception.o synchconsole.o + +FILESYS_H =../filesys/directory.h \ + ../filesys/filehdr.h\ + ../filesys/filesys.h \ + ../filesys/openfile.h\ + ../filesys/pbitmap.h\ + ../filesys/synchdisk.h + +FILESYS_C =../filesys/directory.cc\ + ../filesys/filehdr.cc\ + ../filesys/filesys.cc\ + ../filesys/pbitmap.cc\ + ../filesys/openfile.cc\ + ../filesys/synchdisk.cc\ + +FILESYS_O =directory.o filehdr.o filesys.o pbitmap.o openfile.o synchdisk.o + +NETWORK_H = ../network/post.h + +NETWORK_C = ../network/post.cc + +NETWORK_O = post.o + +################################################################## +# You probably don't want to change anything below this point in +# the file unless you are comfortable with GNU make and know what +# you are doing... +################################################################## + +THREAD_S = ../threads/switch.s + +HFILES = $(LIB_H) $(MACHINE_H) $(THREAD_H) $(USERPROG_H) $(FILESYS_H) $(NETWORK_H) +CFILES = $(LIB_C) $(MACHINE_C) $(THREAD_C) $(USERPROG_C) $(FILESYS_C) $(NETWORK_C) + +C_OFILES = $(LIB_O) $(MACHINE_O) $(THREAD_O) $(USERPROG_O) $(FILESYS_O) $(NETWORK_O) + +S_OFILES = switch.o +OFILES = $(C_OFILES) $(S_OFILES) + +$(PROGRAM): $(OFILES) + $(LD) $(OFILES) $(LDFLAGS) -o $(PROGRAM) + +$(C_OFILES): %.o: + $(CC) $(CFLAGS) -c $< + +switch.o: ../threads/switch.S + $(CC) $(CPP_AS_FLAGS) -P $(INCPATH) $(HOSTCFLAGS) -c ../threads/switch.S + +depend: $(CFILES) $(HFILES) + $(CC) $(INCPATH) $(DEFINES) $(HOSTCFLAGS) -DCHANGED -M $(CFILES) > makedep + @echo '/^# DO NOT DELETE THIS LINE/+1,$$d' >eddep + @echo '$$r makedep' >>eddep + @echo 'w' >>eddep + @echo 'q' >>eddep + ed - Makefile.dep < eddep + rm eddep makedep + @echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile.dep + @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile.dep + @echo '# see make depend above' >> Makefile.dep + +clean: + $(RM) -f $(OFILES) + +distclean: clean + $(RM) -f $(PROGRAM) + $(RM) -f DISK_? + $(RM) -f core + $(RM) -f SOCKET_? + @echo '/^# DO NOT DELETE THIS LINE/+1,$$d' >eddep + @echo 'w' >>eddep + @echo 'q' >>eddep + ed - Makefile.dep < eddep + rm eddep + @echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile.dep + @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile.dep + @echo '# see make depend above' >> Makefile.dep + +include Makefile.dep diff --git a/code/build.linux/Makefile.dep b/code/build.linux/Makefile.dep new file mode 100644 index 0000000..b75950d --- /dev/null +++ b/code/build.linux/Makefile.dep @@ -0,0 +1,3703 @@ +################################################################## +# Machine Dependencies - this file is included automatically +# into the main Makefile +# +# This file contains definitions below for x86 running Linux +# It has *not* been tested! +################################################################## + +HOSTCFLAGS = -Dx86 -DLINUX + +#----------------------------------------------------------------- +# Do not put anything below this point - it will be destroyed by +# "make depend" +# +# DO NOT DELETE THIS LINE -- make depend uses it +bitmap.o: ../lib/bitmap.cc /usr/include/stdc-predef.h ../lib/copyright.h \ + ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../lib/bitmap.h +debug.o: ../lib/debug.cc /usr/include/stdc-predef.h ../lib/copyright.h \ + ../lib/utility.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h +hash.o: ../lib/hash.cc /usr/include/stdc-predef.h ../lib/copyright.h +libtest.o: ../lib/libtest.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../lib/libtest.h ../lib/bitmap.h ../lib/utility.h \ + ../lib/list.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../lib/list.cc \ + ../lib/hash.h ../lib/hash.cc +list.o: ../lib/list.cc /usr/include/stdc-predef.h ../lib/copyright.h +sysdep.o: ../lib/sysdep.cc /usr/include/stdc-predef.h ../lib/copyright.h \ + ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h /usr/include/unistd.h \ + /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ + /usr/include/bits/confname.h /usr/include/bits/getopt_posix.h \ + /usr/include/bits/getopt_core.h /usr/include/bits/unistd_ext.h \ + /usr/include/linux/close_range.h /usr/include/sys/time.h \ + /usr/include/sys/file.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/bits/fcntl-linux.h /usr/include/bits/types/struct_iovec.h \ + /usr/include/linux/falloc.h /usr/include/bits/stat.h \ + /usr/include/bits/struct_stat.h /usr/include/sys/socket.h \ + /usr/include/bits/socket.h /usr/include/bits/socket_type.h \ + /usr/include/bits/sockaddr.h /usr/include/asm/socket.h \ + /usr/include/asm-generic/socket.h /usr/include/linux/posix_types.h \ + /usr/include/linux/stddef.h /usr/include/asm/posix_types.h \ + /usr/include/asm/posix_types_32.h /usr/include/asm-generic/posix_types.h \ + /usr/include/asm/bitsperlong.h /usr/include/asm-generic/bitsperlong.h \ + /usr/include/asm/sockios.h /usr/include/asm-generic/sockios.h \ + /usr/include/bits/types/struct_osockaddr.h /usr/include/sys/un.h \ + /usr/include/signal.h /usr/include/bits/signum-generic.h \ + /usr/include/bits/signum-arch.h /usr/include/bits/types/sig_atomic_t.h \ + /usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \ + /usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \ + /usr/include/bits/siginfo-consts-arch.h \ + /usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \ + /usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \ + /usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigstksz.h /usr/include/bits/ss_flags.h \ + /usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \ + /usr/include/bits/signal_ext.h +interrupt.o: ../machine/interrupt.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../machine/interrupt.h ../lib/list.h ../lib/debug.h \ + ../lib/utility.h ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../lib/list.cc \ + ../machine/callback.h ../threads/main.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +stats.o: ../machine/stats.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../machine/stats.h +timer.o: ../machine/timer.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../machine/timer.h ../lib/utility.h \ + ../machine/callback.h ../threads/main.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/stats.h ../threads/alarm.h +console.o: ../machine/console.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../machine/console.h ../lib/utility.h \ + ../machine/callback.h ../threads/main.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +machine.o: ../machine/machine.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../machine/machine.h ../lib/utility.h \ + ../machine/translate.h ../threads/main.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/kernel.h \ + ../threads/thread.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../threads/scheduler.h ../lib/list.h \ + ../lib/list.cc ../machine/interrupt.h ../machine/callback.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h +mipssim.o: ../machine/mipssim.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../machine/machine.h \ + ../machine/translate.h ../machine/mipssim.h ../threads/main.h \ + ../threads/kernel.h ../threads/thread.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../filesys/openfile.h ../threads/scheduler.h \ + ../lib/list.h ../lib/list.cc ../machine/interrupt.h \ + ../machine/callback.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +translate.o: ../machine/translate.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../threads/main.h ../lib/debug.h ../lib/utility.h \ + ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/callback.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h +network.o: ../machine/network.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../machine/network.h ../lib/utility.h \ + ../machine/callback.h ../threads/main.h ../lib/debug.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +disk.o: ../machine/disk.cc /usr/include/stdc-predef.h ../lib/copyright.h \ + ../machine/disk.h ../lib/utility.h ../machine/callback.h ../lib/debug.h \ + ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/main.h \ + ../threads/kernel.h ../threads/thread.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../threads/scheduler.h ../lib/list.h \ + ../lib/list.cc ../machine/interrupt.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h +alarm.o: ../threads/alarm.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../threads/alarm.h ../lib/utility.h \ + ../machine/callback.h ../machine/timer.h ../threads/main.h \ + ../lib/debug.h ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/stats.h +kernel.o: ../threads/kernel.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/main.h \ + ../threads/kernel.h ../threads/thread.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../threads/scheduler.h ../lib/list.h \ + ../lib/list.cc ../machine/interrupt.h ../machine/callback.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h \ + ../threads/synch.h ../threads/synchlist.h ../threads/synchlist.cc \ + ../lib/libtest.h ../filesys/synchdisk.h ../machine/disk.h \ + ../network/post.h ../machine/network.h ../userprog/synchconsole.h \ + ../machine/console.h +main.o: ../threads/main.cc /usr/include/stdc-predef.h ../lib/copyright.h \ + ../threads/main.h ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/callback.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h +scheduler.o: ../threads/scheduler.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../lib/debug.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/scheduler.h \ + ../lib/list.h ../lib/list.cc ../threads/thread.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../threads/main.h ../threads/kernel.h \ + ../machine/interrupt.h ../machine/callback.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h +synch.o: ../threads/synch.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../threads/synch.h ../threads/thread.h \ + ../lib/utility.h ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../lib/list.h ../lib/debug.h ../lib/list.cc \ + ../threads/main.h ../threads/kernel.h ../threads/scheduler.h \ + ../machine/interrupt.h ../machine/callback.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h +synchlist.o: ../threads/synchlist.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../threads/synchlist.h ../lib/list.h ../lib/debug.h \ + ../lib/utility.h ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../lib/list.cc \ + ../threads/synch.h ../threads/thread.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../threads/main.h ../threads/kernel.h \ + ../threads/scheduler.h ../machine/interrupt.h ../machine/callback.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h \ + ../threads/synchlist.cc +thread.o: ../threads/thread.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../threads/thread.h ../lib/utility.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../threads/switch.h ../threads/synch.h \ + ../lib/list.h ../lib/debug.h ../lib/list.cc ../threads/main.h \ + ../threads/kernel.h ../threads/scheduler.h ../machine/interrupt.h \ + ../machine/callback.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +addrspace.o: ../userprog/addrspace.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../threads/main.h ../lib/debug.h ../lib/utility.h \ + ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/callback.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h ../userprog/noff.h +exception.o: ../userprog/exception.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../threads/main.h ../lib/debug.h ../lib/utility.h \ + ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../threads/kernel.h \ + ../threads/thread.h ../machine/machine.h ../machine/translate.h \ + ../userprog/addrspace.h ../filesys/filesys.h ../filesys/openfile.h \ + ../threads/scheduler.h ../lib/list.h ../lib/list.cc \ + ../machine/interrupt.h ../machine/callback.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h ../userprog/syscall.h \ + ../userprog/errno.h ../userprog/ksyscall.h ../userprog/synchconsole.h \ + ../machine/console.h ../threads/synch.h +synchconsole.o: ../userprog/synchconsole.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../userprog/synchconsole.h ../lib/utility.h \ + ../machine/callback.h ../machine/console.h ../threads/synch.h \ + ../threads/thread.h ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../lib/list.h ../lib/debug.h ../lib/list.cc \ + ../threads/main.h ../threads/kernel.h ../threads/scheduler.h \ + ../machine/interrupt.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +directory.o: ../filesys/directory.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../lib/utility.h ../filesys/filehdr.h \ + ../machine/disk.h ../machine/callback.h ../filesys/pbitmap.h \ + ../lib/bitmap.h ../filesys/openfile.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../filesys/directory.h +filehdr.o: ../filesys/filehdr.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../filesys/filehdr.h ../machine/disk.h \ + ../lib/utility.h ../machine/callback.h ../filesys/pbitmap.h \ + ../lib/bitmap.h ../filesys/openfile.h ../lib/sysdep.h \ + /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../lib/debug.h \ + ../filesys/synchdisk.h ../threads/synch.h ../threads/thread.h \ + ../machine/machine.h ../machine/translate.h ../userprog/addrspace.h \ + ../filesys/filesys.h ../lib/list.h ../lib/list.cc ../threads/main.h \ + ../threads/kernel.h ../threads/scheduler.h ../machine/interrupt.h \ + ../machine/stats.h ../threads/alarm.h ../machine/timer.h +filesys.o: ../filesys/filesys.cc /usr/include/stdc-predef.h +pbitmap.o: ../filesys/pbitmap.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../filesys/pbitmap.h ../lib/bitmap.h ../lib/utility.h \ + ../filesys/openfile.h ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h +openfile.o: ../filesys/openfile.cc /usr/include/stdc-predef.h +synchdisk.o: ../filesys/synchdisk.cc /usr/include/stdc-predef.h \ + ../lib/copyright.h ../filesys/synchdisk.h ../machine/disk.h \ + ../lib/utility.h ../machine/callback.h ../threads/synch.h \ + ../threads/thread.h ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../lib/list.h ../lib/debug.h ../lib/list.cc \ + ../threads/main.h ../threads/kernel.h ../threads/scheduler.h \ + ../machine/interrupt.h ../machine/stats.h ../threads/alarm.h \ + ../machine/timer.h +post.o: ../network/post.cc /usr/include/stdc-predef.h ../lib/copyright.h \ + ../network/post.h ../lib/utility.h ../machine/callback.h \ + ../machine/network.h ../threads/synchlist.h ../lib/list.h ../lib/debug.h \ + ../lib/sysdep.h /usr/include/c++/11/iostream \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/os_defines.h \ + /usr/include/features.h /usr/include/features-time64.h \ + /usr/include/bits/wordsize.h /usr/include/bits/timesize.h \ + /usr/include/sys/cdefs.h /usr/include/bits/long-double.h \ + /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/cpu_defines.h \ + /usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \ + /usr/include/c++/11/ios /usr/include/c++/11/iosfwd \ + /usr/include/c++/11/bits/stringfwd.h \ + /usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \ + /usr/include/c++/11/cwchar /usr/include/wchar.h \ + /usr/include/bits/libc-header-start.h /usr/include/bits/floatn.h \ + /usr/include/bits/floatn-common.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h \ + /usr/include/bits/wchar.h /usr/include/bits/types/wint_t.h \ + /usr/include/bits/types/mbstate_t.h \ + /usr/include/bits/types/__mbstate_t.h /usr/include/bits/types/__FILE.h \ + /usr/include/bits/types/FILE.h /usr/include/bits/types/locale_t.h \ + /usr/include/bits/types/__locale_t.h /usr/include/c++/11/exception \ + /usr/include/c++/11/bits/exception.h \ + /usr/include/c++/11/bits/exception_ptr.h \ + /usr/include/c++/11/bits/exception_defines.h \ + /usr/include/c++/11/bits/cxxabi_init_exception.h \ + /usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \ + /usr/include/c++/11/new /usr/include/c++/11/bits/move.h \ + /usr/include/c++/11/type_traits \ + /usr/include/c++/11/bits/nested_exception.h \ + /usr/include/c++/11/bits/char_traits.h \ + /usr/include/c++/11/bits/stl_algobase.h \ + /usr/include/c++/11/bits/functexcept.h \ + /usr/include/c++/11/bits/cpp_type_traits.h \ + /usr/include/c++/11/ext/type_traits.h \ + /usr/include/c++/11/ext/numeric_traits.h \ + /usr/include/c++/11/bits/stl_pair.h \ + /usr/include/c++/11/bits/stl_iterator_base_types.h \ + /usr/include/c++/11/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/11/bits/concept_check.h \ + /usr/include/c++/11/debug/assertions.h \ + /usr/include/c++/11/bits/stl_iterator.h \ + /usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \ + /usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \ + /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/bits/time64.h /usr/include/bits/stdint-intn.h \ + /usr/include/bits/stdint-uintn.h /usr/include/c++/11/bits/localefwd.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++locale.h \ + /usr/include/c++/11/clocale /usr/include/locale.h \ + /usr/include/bits/locale.h /usr/include/c++/11/cctype \ + /usr/include/ctype.h /usr/include/bits/endian.h \ + /usr/include/bits/endianness.h /usr/include/c++/11/bits/ios_base.h \ + /usr/include/c++/11/ext/atomicity.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/gthr-default.h \ + /usr/include/pthread.h /usr/include/sched.h \ + /usr/include/bits/types/time_t.h \ + /usr/include/bits/types/struct_timespec.h /usr/include/bits/sched.h \ + /usr/include/bits/types/struct_sched_param.h /usr/include/bits/cpu-set.h \ + /usr/include/time.h /usr/include/bits/time.h /usr/include/bits/timex.h \ + /usr/include/bits/types/struct_timeval.h \ + /usr/include/bits/types/clock_t.h /usr/include/bits/types/struct_tm.h \ + /usr/include/bits/types/clockid_t.h /usr/include/bits/types/timer_t.h \ + /usr/include/bits/types/struct_itimerspec.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/thread-shared-types.h \ + /usr/include/bits/pthreadtypes-arch.h \ + /usr/include/bits/atomic_wide_counter.h /usr/include/bits/struct_mutex.h \ + /usr/include/bits/struct_rwlock.h /usr/include/bits/setjmp.h \ + /usr/include/bits/types/__sigset_t.h \ + /usr/include/bits/types/struct___jmp_buf_tag.h \ + /usr/include/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/atomic_word.h \ + /usr/include/sys/single_threaded.h \ + /usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \ + /usr/include/c++/11/bits/allocator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/c++allocator.h \ + /usr/include/c++/11/ext/new_allocator.h \ + /usr/include/c++/11/bits/ostream_insert.h \ + /usr/include/c++/11/bits/cxxabi_forced.h \ + /usr/include/c++/11/bits/stl_function.h \ + /usr/include/c++/11/backward/binders.h \ + /usr/include/c++/11/bits/range_access.h \ + /usr/include/c++/11/initializer_list \ + /usr/include/c++/11/bits/basic_string.h \ + /usr/include/c++/11/ext/alloc_traits.h \ + /usr/include/c++/11/bits/alloc_traits.h \ + /usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \ + /usr/include/c++/11/bits/functional_hash.h \ + /usr/include/c++/11/bits/string_view.tcc \ + /usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \ + /usr/include/stdlib.h /usr/include/bits/waitflags.h \ + /usr/include/bits/waitstatus.h /usr/include/sys/types.h \ + /usr/include/endian.h /usr/include/bits/byteswap.h \ + /usr/include/bits/uintn-identity.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/types/sigset_t.h \ + /usr/include/alloca.h /usr/include/bits/stdlib-float.h \ + /usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \ + /usr/include/stdio.h /usr/include/bits/types/__fpos_t.h \ + /usr/include/bits/types/__fpos64_t.h \ + /usr/include/bits/types/struct_FILE.h \ + /usr/include/bits/types/cookie_io_functions_t.h \ + /usr/include/bits/stdio_lim.h /usr/include/c++/11/cerrno \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \ + /usr/include/bits/types/error_t.h /usr/include/c++/11/bits/charconv.h \ + /usr/include/c++/11/bits/basic_string.tcc \ + /usr/include/c++/11/bits/locale_classes.tcc \ + /usr/include/c++/11/system_error \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/error_constants.h \ + /usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \ + /usr/include/c++/11/bits/streambuf.tcc \ + /usr/include/c++/11/bits/basic_ios.h \ + /usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \ + /usr/include/wctype.h /usr/include/bits/wctype-wchar.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_base.h \ + /usr/include/c++/11/bits/streambuf_iterator.h \ + /usr/include/x86_64-linux-gnu/c++/11/32/bits/ctype_inline.h \ + /usr/include/c++/11/bits/locale_facets.tcc \ + /usr/include/c++/11/bits/basic_ios.tcc \ + /usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \ + /usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/stdlib.h \ + /usr/include/string.h /usr/include/strings.h ../lib/list.cc \ + ../threads/synch.h ../threads/thread.h ../machine/machine.h \ + ../machine/translate.h ../userprog/addrspace.h ../filesys/filesys.h \ + ../filesys/openfile.h ../threads/main.h ../threads/kernel.h \ + ../threads/scheduler.h ../machine/interrupt.h ../machine/stats.h \ + ../threads/alarm.h ../machine/timer.h ../threads/synchlist.cc +# DEPENDENCIES MUST END AT END OF FILE +# IF YOU PUT STUFF HERE IT WILL GO AWAY +# see make depend above diff --git a/code/build.linux/addrspace.o b/code/build.linux/addrspace.o new file mode 100644 index 0000000..4c2c0ef Binary files /dev/null and b/code/build.linux/addrspace.o differ diff --git a/code/build.linux/alarm.o b/code/build.linux/alarm.o new file mode 100644 index 0000000..f6868cd Binary files /dev/null and b/code/build.linux/alarm.o differ diff --git a/code/build.linux/bitmap.o b/code/build.linux/bitmap.o new file mode 100644 index 0000000..7a7517f Binary files /dev/null and b/code/build.linux/bitmap.o differ diff --git a/code/build.linux/console.o b/code/build.linux/console.o new file mode 100644 index 0000000..4d2dda2 Binary files /dev/null and b/code/build.linux/console.o differ diff --git a/code/build.linux/debug.o b/code/build.linux/debug.o new file mode 100644 index 0000000..dfd31ee Binary files /dev/null and b/code/build.linux/debug.o differ diff --git a/code/build.linux/directory.o b/code/build.linux/directory.o new file mode 100644 index 0000000..5e04da4 Binary files /dev/null and b/code/build.linux/directory.o differ diff --git a/code/build.linux/disk.o b/code/build.linux/disk.o new file mode 100644 index 0000000..780b5a3 Binary files /dev/null and b/code/build.linux/disk.o differ diff --git a/code/build.linux/exception.o b/code/build.linux/exception.o new file mode 100644 index 0000000..57a3ccb Binary files /dev/null and b/code/build.linux/exception.o differ diff --git a/code/build.linux/filehdr.o b/code/build.linux/filehdr.o new file mode 100644 index 0000000..14d889d Binary files /dev/null and b/code/build.linux/filehdr.o differ diff --git a/code/build.linux/filesys.o b/code/build.linux/filesys.o new file mode 100644 index 0000000..a47e761 Binary files /dev/null and b/code/build.linux/filesys.o differ diff --git a/code/build.linux/interrupt.o b/code/build.linux/interrupt.o new file mode 100644 index 0000000..422c1d2 Binary files /dev/null and b/code/build.linux/interrupt.o differ diff --git a/code/build.linux/kernel.o b/code/build.linux/kernel.o new file mode 100644 index 0000000..6a48a1e Binary files /dev/null and b/code/build.linux/kernel.o differ diff --git a/code/build.linux/libtest.o b/code/build.linux/libtest.o new file mode 100644 index 0000000..7d7a361 Binary files /dev/null and b/code/build.linux/libtest.o differ diff --git a/code/build.linux/machine.o b/code/build.linux/machine.o new file mode 100644 index 0000000..de70630 Binary files /dev/null and b/code/build.linux/machine.o differ diff --git a/code/build.linux/main.o b/code/build.linux/main.o new file mode 100644 index 0000000..6156015 Binary files /dev/null and b/code/build.linux/main.o differ diff --git a/code/build.linux/mipssim.o b/code/build.linux/mipssim.o new file mode 100644 index 0000000..93befd2 Binary files /dev/null and b/code/build.linux/mipssim.o differ diff --git a/code/build.linux/nachos b/code/build.linux/nachos new file mode 100755 index 0000000..e60bbcc Binary files /dev/null and b/code/build.linux/nachos differ diff --git a/code/build.linux/network.o b/code/build.linux/network.o new file mode 100644 index 0000000..7c83846 Binary files /dev/null and b/code/build.linux/network.o differ diff --git a/code/build.linux/openfile.o b/code/build.linux/openfile.o new file mode 100644 index 0000000..6dae252 Binary files /dev/null and b/code/build.linux/openfile.o differ diff --git a/code/build.linux/pbitmap.o b/code/build.linux/pbitmap.o new file mode 100644 index 0000000..32a5331 Binary files /dev/null and b/code/build.linux/pbitmap.o differ diff --git a/code/build.linux/post.o b/code/build.linux/post.o new file mode 100644 index 0000000..2d54399 Binary files /dev/null and b/code/build.linux/post.o differ diff --git a/code/build.linux/scheduler.o b/code/build.linux/scheduler.o new file mode 100644 index 0000000..ccfd20c Binary files /dev/null and b/code/build.linux/scheduler.o differ diff --git a/code/build.linux/stats.o b/code/build.linux/stats.o new file mode 100644 index 0000000..fd0c04f Binary files /dev/null and b/code/build.linux/stats.o differ diff --git a/code/build.linux/switch.o b/code/build.linux/switch.o new file mode 100644 index 0000000..c29598a Binary files /dev/null and b/code/build.linux/switch.o differ diff --git a/code/build.linux/synch.o b/code/build.linux/synch.o new file mode 100644 index 0000000..276fa60 Binary files /dev/null and b/code/build.linux/synch.o differ diff --git a/code/build.linux/synchconsole.o b/code/build.linux/synchconsole.o new file mode 100644 index 0000000..b418d32 Binary files /dev/null and b/code/build.linux/synchconsole.o differ diff --git a/code/build.linux/synchdisk.o b/code/build.linux/synchdisk.o new file mode 100644 index 0000000..5cbf66e Binary files /dev/null and b/code/build.linux/synchdisk.o differ diff --git a/code/build.linux/sysdep.o b/code/build.linux/sysdep.o new file mode 100644 index 0000000..2063c8b Binary files /dev/null and b/code/build.linux/sysdep.o differ diff --git a/code/build.linux/thread.o b/code/build.linux/thread.o new file mode 100644 index 0000000..a815af2 Binary files /dev/null and b/code/build.linux/thread.o differ diff --git a/code/build.linux/timer.o b/code/build.linux/timer.o new file mode 100644 index 0000000..f8358e6 Binary files /dev/null and b/code/build.linux/timer.o differ diff --git a/code/build.linux/translate.o b/code/build.linux/translate.o new file mode 100644 index 0000000..32359c4 Binary files /dev/null and b/code/build.linux/translate.o differ diff --git a/code/build.macosx/Makefile b/code/build.macosx/Makefile new file mode 100644 index 0000000..c058fd7 --- /dev/null +++ b/code/build.macosx/Makefile @@ -0,0 +1,365 @@ +# Copyright (c) 1992-1996 The Regents of the University of California. +# All rights reserved. See copyright.h for copyright notice and limitation +# of liability and disclaimer of warranty provisions. +# +# This is a GNU Makefile. It must be used with the GNU make program. +# At UW, the GNU make program is /software/gnu/bin/make. +# In many other places it is known as "gmake". +# You may wish to include /software/gnu/bin/ early in your command +# search path, so that you will be using GNU make when you type "make". +# +# About this Makefile: +# -------------------- +# +# This Makefile is used to build the Nachos system, which includes +# the MIPS machine simulation and a simple operating system. +# +# There is a separate Makefile, in the "test" directory, that is +# used to build the Nachos test programs (which run on the +# simulated machine). +# +# There are several "build" directories, one for each type +# of machine in the MFCF computing environment +# (build.solaris, build.sunos, and build.ultrix), as well +# as a build directory for Linux (build.linux) and a generic +# build directory (build.other) for those who wish to try +# building Nachos on other platforms. +# +# This Makefile appears to be located in all of the build directories. +# If you edit it in one directory, the copies in all of the other +# directories appear to change as well. This is the desired behaviour, +# since this file is machine independent. (The file actually lives +# in build.solaris, with symbolic links from the other build directories.) +# +# The platform-dependent parts of make's instructions are located +# in the file Makefile.dep. +# There is a different Makefile.dep in each build directory. +# +# If you are in the MFCF environment, you should not have to edit +# the Makefile.dep files by hand. Any changes to the make instructions +# can be made in this file (see the instructions below) - they will +# apply no matter where you build Nachos. +# If you are not in the MFCF environment, e.g., if you are trying +# to build Nachos on Linux at home, you will probably need +# to edit Makefile.dep (in the appropriate build directory) to +# customize the make procedure to your environment. +# +# How to build Nachos for the first time: +# --------------------------------------- +# +# (1) Make sure than you are in the build directory for the +# type of machine you are logged in to (the "host" machine): +# +# host type examples build directory +# ----------- ----------- ---------------- +# +# sparc/SunOS cayley,napier, build.sunos +# (SunOS 4.1.3) descartes +# +# sparc/Solaris picard.math, build.solaris +# (SunOS 5.x) hermite.math, +# markov.math, +# hypatia.math, +# hume.math +# +# mips/ULTRIX cantor.math build.ultrix +# (ULTRIX 4.2) noether.math +# +# If you are not sure what type of machine you are on, +# try the command "uname -a". +# +# (2) Type "make depend" +# - this computes file dependencies and records them +# at the end of the file Makefile.dep in +# your build directory. Have a look... +# +# (3) Type "make nachos" (or just "make"). +# - make echos the commands it is executing, so that +# you can observe its progress. When the +# build is finished, you should have an +# executable "nachos" in the build directory. +# +# (4) There is no 4th step. You are done. Try running "./nachos -u". +# +# +# How to Re-build Nachos after you have changed the code: +#-------------------------------------------------------- +# +# - The Nachos source code is located in the code subdirectories: +# threads, userprog, filesys, network, and lib. You may +# change the files in any of these directories, and you can +# add new files and/or remove files. The "machine" subdirectory +# contains the hardware simulation (which is also part of +# Nachos. You may look at it, but +# you may not change it, except as noted in machine/machine.h +# - When you want to re-make Nachos, always do it in the +# "build" directory that is appropriate for the machine +# type that you are running on. +# DO NOT TRY TO MAKE NACHOS IN THE SOURCE CODE DIRECTORIES. +# +# - IF all you have done is changed C++ code in existing files +# (since the last time you made Nachos in this build directory), +# THEN all you need to do to re-make Nachos is to type +# +# "make nachos" +# +# in the build directory. +# +# - IF you have done any of the following since the last build in +# this directory: +# added new .cc files or new .h files +# added or deleted #include's from existing files +# THEN +# you must do +# "make depend" +# followed by +# "make nachos" +# +# in the build directory. +# +# Note that is is always safe to do "make depend" followed by +# "make nachos", so if you are not sure what changes you have +# made, do "make depend". +# +# - IF you have added new files (.cc or .h) since the last build, +# you should edit this Makefile before running "make depend" +# and "make nachos". + +# For new .h files, simply update the appropriate "_H" list below. +# For example, if you create a file called +# "bigfile.h" in the filesys subdirectory, you should add +# "../filesys/bigfile.h" to FILESYS_H, which is defined below + +# For new .cc files, update the appropriate "_C" and "_O" lists. +# For example, if you create a file called "filetable.cc" in +# the directory "userprog", you should add +# "../userprog/filetable.cc" to USERPROG_C, +# and you should add "filetable.o" to USERPROG_O. +# Note that the entry in the "_C" list includes the subdirectory +# name, while the entry on the "_O" list does not. +# +# Some Important Notes: +# --------------------- +# +# * You can clean up all of the .o and other files left behind +# by make by typeing "make clean" in the build directory. +# * You can clean up .o and other files, as well as the nachos +# executable, DISK, core, SOCKET, and other files by typing +# make "distclean" +# +# These are good ways to save space, but the next build that +# you do after cleaning will take longer than usual, since +# much of the stuff you cleaned will need to be rebuilt. +# +# * When you build Nachos on an ULTRIX machine (in build.ultrix), +# you will get lots of warning messages like this: +# +# openfile.o: does not have gp tables for all it's sectons +# +# from the loader. Ignore them. Or better yet, figure out +# how to make them go away. +# +# The Most Important Note: +# ----------------------- +# +# * If "make" is behaving strangely and you cannot figure out +# why, you should REBUILD the program FROM SCRATCH. +# Yes, it is slow. +# But, there are lots of little things that can go wrong, especially +# with all of these different types of machines available. +# Rebuilding from scratch at least gives you a known starting +# place. To rebuild from scratch, go to the appropriate +# build directory and do: +# +# make distclean +# make depend +# make nachos +# +################################################################ +# READ THIS: CONFIGURING NACHOS +# +# Change DEFINES (below) to +# DEFINES = -DUSE_TLB -DFILESYS_STUB +# if you want the simulated machine to use its TLB +# +# If you want to use the real Nachos file system (based on +# the simulated disk), rather than the stub, remove +# the -DFILESYS_STUB from DEFINES. +# +# There is a a fix to the MIPS simulator to enable it to properly +# handle unaligned data access. This fix is enabled by the addition +# of "-DSIM_FIX" to the DEFINES. This should be enabled by default +# and eventually will not require the symbol definition +################################################################ +DEFINES = -DFILESYS_STUB -DRDATA -DSIM_FIX + + +##################################################################### +# +# You might want to play with the CFLAGS, but if you use -O it may +# break the thread system. You might want to use -fno-inline if +# you need to call some inline functions from the debugger. + +CFLAGS = -g -Wall -fwritable-strings $(INCPATH) $(DEFINES) $(HOSTCFLAGS) -DCHANGED +LDFLAGS = + +##################################################################### +CPP=/lib/cpp +CC = g++ +LD = g++ +AS = as +RM = /bin/rm + +INCPATH = -I../network -I../filesys -I../userprog -I../threads -I../machine -I../lib + +PROGRAM = nachos + +# +# Edit these lists as if you add files to the source directories. +# See the instructions at the top of the file for more information. +# + +LIB_H = ../lib/bitmap.h\ + ../lib/copyright.h\ + ../lib/debug.h\ + ../lib/hash.h\ + ../lib/libtest.h\ + ../lib/list.h\ + ../lib/sysdep.h\ + ../lib/utility.h + +LIB_C = ../lib/bitmap.cc\ + ../lib/debug.cc\ + ../lib/hash.cc\ + ../lib/libtest.cc\ + ../lib/list.cc\ + ../lib/sysdep.cc + +LIB_O = bitmap.o debug.o libtest.o sysdep.o + + +MACHINE_H = ../machine/callback.h\ + ../machine/interrupt.h\ + ../machine/stats.h\ + ../machine/timer.h\ + ../machine/console.h\ + ../machine/machine.h\ + ../machine/mipssim.h\ + ../machine/translate.h\ + ../machine/network.h\ + ../machine/disk.h + +MACHINE_C = ../machine/interrupt.cc\ + ../machine/stats.cc\ + ../machine/timer.cc\ + ../machine/console.cc\ + ../machine/machine.cc\ + ../machine/mipssim.cc\ + ../machine/translate.cc\ + ../machine/network.cc\ + ../machine/disk.cc + +MACHINE_O = interrupt.o stats.o timer.o console.o machine.o mipssim.o\ + translate.o network.o disk.o + +THREAD_H = ../threads/alarm.h\ + ../threads/kernel.h\ + ../threads/main.h\ + ../threads/scheduler.h\ + ../threads/switch.h\ + ../threads/synch.h\ + ../threads/synchlist.h\ + ../threads/thread.h + +THREAD_C = ../threads/alarm.cc\ + ../threads/kernel.cc\ + ../threads/main.cc\ + ../threads/scheduler.cc\ + ../threads/synch.cc\ + ../threads/synchlist.cc\ + ../threads/thread.cc + +THREAD_O = alarm.o kernel.o main.o scheduler.o synch.o thread.o + +USERPROG_H = ../userprog/addrspace.h\ + ../userprog/syscall.h\ + ../userprog/synchconsole.h\ + ../userprog/noff.h + +USERPROG_C = ../userprog/addrspace.cc\ + ../userprog/exception.cc\ + ../userprog/synchconsole.cc + +USERPROG_O = addrspace.o exception.o synchconsole.o + +FILESYS_H =../filesys/directory.h \ + ../filesys/filehdr.h\ + ../filesys/filesys.h \ + ../filesys/openfile.h\ + ../filesys/pbitmap.h\ + ../filesys/synchdisk.h + +FILESYS_C =../filesys/directory.cc\ + ../filesys/filehdr.cc\ + ../filesys/filesys.cc\ + ../filesys/pbitmap.cc\ + ../filesys/openfile.cc\ + ../filesys/synchdisk.cc\ + +FILESYS_O =directory.o filehdr.o filesys.o pbitmap.o openfile.o synchdisk.o + +NETWORK_H = ../network/post.h + +NETWORK_C = ../network/post.cc + +NETWORK_O = post.o + +################################################################## +# You probably don't want to change anything below this point in +# the file unless you are comfortable with GNU make and know what +# you are doing... +################################################################## + +THREAD_S = ../threads/switch.s + +HFILES = $(LIB_H) $(MACHINE_H) $(THREAD_H) $(USERPROG_H) $(FILESYS_H) $(NETWORK_H) +CFILES = $(LIB_C) $(MACHINE_C) $(THREAD_C) $(USERPROG_C) $(FILESYS_C) $(NETWORK_C) + +C_OFILES = $(LIB_O) $(MACHINE_O) $(THREAD_O) $(USERPROG_O) $(FILESYS_O) $(NETWORK_O) + +S_OFILES = switch.o +OFILES = $(C_OFILES) $(S_OFILES) + +$(PROGRAM): $(OFILES) + $(LD) $(OFILES) $(LDFLAGS) -o $(PROGRAM) + +$(C_OFILES): %.o: + $(CC) $(CFLAGS) -c $< + +switch.o: ../threads/switch.s + $(CPP) $(CPP_AS_FLAGS) -P $(INCPATH) $(HOSTCFLAGS) ../threads/switch.s > swtch.s + $(AS) -o switch.o swtch.s + +depend: $(CFILES) $(HFILES) + $(CC) $(INCPATH) $(DEFINES) $(HOSTCFLAGS) -DCHANGED -M $(CFILES) > makedep + @echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep + @echo '$$r makedep' >>eddep + @echo 'w' >>eddep + @echo 'q' >>eddep + ed - Makefile.dep < eddep + rm eddep makedep + @echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile.dep + @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile.dep + @echo '# see make depend above' >> Makefile.dep + +clean: + $(RM) -f $(OFILES) + $(RM) -f swtch.s + +distclean: clean + $(RM) -f $(PROGRAM) + $(RM) -f DISK_? + $(RM) -f core + $(RM) -f SOCKET_? + +include Makefile.dep diff --git a/code/build.macosx/Makefile.dep b/code/build.macosx/Makefile.dep new file mode 100644 index 0000000..952a39f --- /dev/null +++ b/code/build.macosx/Makefile.dep @@ -0,0 +1,18 @@ +################################################################## +# Machine Dependencies - this file is included automatically +# into the main Makefile +# +################################################################## + +HOSTCFLAGS = -DHOST_IS_BIG_ENDIAN -DPowerPC -DBSD -DAIX -DApplePowerPC +CPP_AS_FLAGS = -D_ASM +CPP = cpp + +#----------------------------------------------------------------- +# Do not put anything below this point - it will be destroyed by +# "make depend" +# +# DO NOT DELETE THIS LINE -- make depend uses it +# DEPENDENCIES MUST END AT END OF FILE +# IF YOU PUT STUFF HERE IT WILL GO AWAY +# see make depend above diff --git a/code/filesys/directory.cc b/code/filesys/directory.cc new file mode 100644 index 0000000..5fcbf53 --- /dev/null +++ b/code/filesys/directory.cc @@ -0,0 +1,196 @@ +// directory.cc +// Routines to manage a directory of file names. +// +// The directory is a table of fixed length entries; each +// entry represents a single file, and contains the file name, +// and the location of the file header on disk. The fixed size +// of each directory entry means that we have the restriction +// of a fixed maximum size for file names. +// +// The constructor initializes an empty directory of a certain size; +// we use ReadFrom/WriteBack to fetch the contents of the directory +// from disk, and to write back any modifications back to disk. +// +// Also, this implementation has the restriction that the size +// of the directory cannot expand. In other words, once all the +// entries in the directory are used, no more files can be created. +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "utility.h" +#include "filehdr.h" +#include "directory.h" + +//---------------------------------------------------------------------- +// Directory::Directory +// Initialize a directory; initially, the directory is completely +// empty. If the disk is being formatted, an empty directory +// is all we need, but otherwise, we need to call FetchFrom in order +// to initialize it from disk. +// +// "size" is the number of entries in the directory +//---------------------------------------------------------------------- + +Directory::Directory(int size) +{ + table = new DirectoryEntry[size]; + tableSize = size; + for (int i = 0; i < tableSize; i++) + table[i].inUse = FALSE; +} + +//---------------------------------------------------------------------- +// Directory::~Directory +// De-allocate directory data structure. +//---------------------------------------------------------------------- + +Directory::~Directory() +{ + delete [] table; +} + +//---------------------------------------------------------------------- +// Directory::FetchFrom +// Read the contents of the directory from disk. +// +// "file" -- file containing the directory contents +//---------------------------------------------------------------------- + +void +Directory::FetchFrom(OpenFile *file) +{ + (void) file->ReadAt((char *)table, tableSize * sizeof(DirectoryEntry), 0); +} + +//---------------------------------------------------------------------- +// Directory::WriteBack +// Write any modifications to the directory back to disk +// +// "file" -- file to contain the new directory contents +//---------------------------------------------------------------------- + +void +Directory::WriteBack(OpenFile *file) +{ + (void) file->WriteAt((char *)table, tableSize * sizeof(DirectoryEntry), 0); +} + +//---------------------------------------------------------------------- +// Directory::FindIndex +// Look up file name in directory, and return its location in the table of +// directory entries. Return -1 if the name isn't in the directory. +// +// "name" -- the file name to look up +//---------------------------------------------------------------------- + +int +Directory::FindIndex(char *name) +{ + for (int i = 0; i < tableSize; i++) + if (table[i].inUse && !strncmp(table[i].name, name, FileNameMaxLen)) + return i; + return -1; // name not in directory +} + +//---------------------------------------------------------------------- +// Directory::Find +// Look up file name in directory, and return the disk sector number +// where the file's header is stored. Return -1 if the name isn't +// in the directory. +// +// "name" -- the file name to look up +//---------------------------------------------------------------------- + +int +Directory::Find(char *name) +{ + int i = FindIndex(name); + + if (i != -1) + return table[i].sector; + return -1; +} + +//---------------------------------------------------------------------- +// Directory::Add +// Add a file into the directory. Return TRUE if successful; +// return FALSE if the file name is already in the directory, or if +// the directory is completely full, and has no more space for +// additional file names. +// +// "name" -- the name of the file being added +// "newSector" -- the disk sector containing the added file's header +//---------------------------------------------------------------------- + +bool +Directory::Add(char *name, int newSector) +{ + if (FindIndex(name) != -1) + return FALSE; + + for (int i = 0; i < tableSize; i++) + if (!table[i].inUse) { + table[i].inUse = TRUE; + strncpy(table[i].name, name, FileNameMaxLen); + table[i].sector = newSector; + return TRUE; + } + return FALSE; // no space. Fix when we have extensible files. +} + +//---------------------------------------------------------------------- +// Directory::Remove +// Remove a file name from the directory. Return TRUE if successful; +// return FALSE if the file isn't in the directory. +// +// "name" -- the file name to be removed +//---------------------------------------------------------------------- + +bool +Directory::Remove(char *name) +{ + int i = FindIndex(name); + + if (i == -1) + return FALSE; // name not in directory + table[i].inUse = FALSE; + return TRUE; +} + +//---------------------------------------------------------------------- +// Directory::List +// List all the file names in the directory. +//---------------------------------------------------------------------- + +void +Directory::List() +{ + for (int i = 0; i < tableSize; i++) + if (table[i].inUse) + printf("%s\n", table[i].name); +} + +//---------------------------------------------------------------------- +// Directory::Print +// List all the file names in the directory, their FileHeader locations, +// and the contents of each file. For debugging. +//---------------------------------------------------------------------- + +void +Directory::Print() +{ + FileHeader *hdr = new FileHeader; + + printf("Directory contents:\n"); + for (int i = 0; i < tableSize; i++) + if (table[i].inUse) { + printf("Name: %s, Sector: %d\n", table[i].name, table[i].sector); + hdr->FetchFrom(table[i].sector); + hdr->Print(); + } + printf("\n"); + delete hdr; +} diff --git a/code/filesys/directory.h b/code/filesys/directory.h new file mode 100644 index 0000000..f2be7ae --- /dev/null +++ b/code/filesys/directory.h @@ -0,0 +1,83 @@ +// directory.h +// Data structures to manage a UNIX-like directory of file names. +// +// A directory is a table of pairs: , +// giving the name of each file in the directory, and +// where to find its file header (the data structure describing +// where to find the file's data blocks) on disk. +// +// We assume mutual exclusion is provided by the caller. +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" + +#ifndef DIRECTORY_H +#define DIRECTORY_H + +#include "openfile.h" + +#define FileNameMaxLen 9 // for simplicity, we assume + // file names are <= 9 characters long + +// The following class defines a "directory entry", representing a file +// in the directory. Each entry gives the name of the file, and where +// the file's header is to be found on disk. +// +// Internal data structures kept public so that Directory operations can +// access them directly. + +class DirectoryEntry { + public: + bool inUse; // Is this directory entry in use? + int sector; // Location on disk to find the + // FileHeader for this file + char name[FileNameMaxLen + 1]; // Text name for file, with +1 for + // the trailing '\0' +}; + +// The following class defines a UNIX-like "directory". Each entry in +// the directory describes a file, and where to find it on disk. +// +// The directory data structure can be stored in memory, or on disk. +// When it is on disk, it is stored as a regular Nachos file. +// +// The constructor initializes a directory structure in memory; the +// FetchFrom/WriteBack operations shuffle the directory information +// from/to disk. + +class Directory { + public: + Directory(int size); // Initialize an empty directory + // with space for "size" files + ~Directory(); // De-allocate the directory + + void FetchFrom(OpenFile *file); // Init directory contents from disk + void WriteBack(OpenFile *file); // Write modifications to + // directory contents back to disk + + int Find(char *name); // Find the sector number of the + // FileHeader for file: "name" + + bool Add(char *name, int newSector); // Add a file name into the directory + + bool Remove(char *name); // Remove a file from the directory + + void List(); // Print the names of all the files + // in the directory + void Print(); // Verbose print of the contents + // of the directory -- all the file + // names and their contents. + + private: + int tableSize; // Number of directory entries + DirectoryEntry *table; // Table of pairs: + // + + int FindIndex(char *name); // Find the index into the directory + // table corresponding to "name" +}; + +#endif // DIRECTORY_H diff --git a/code/filesys/filehdr.cc b/code/filesys/filehdr.cc new file mode 100644 index 0000000..4f1524e --- /dev/null +++ b/code/filesys/filehdr.cc @@ -0,0 +1,156 @@ +// filehdr.cc +// Routines for managing the disk file header (in UNIX, this +// would be called the i-node). +// +// The file header is used to locate where on disk the +// file's data is stored. We implement this as a fixed size +// table of pointers -- each entry in the table points to the +// disk sector containing that portion of the file data +// (in other words, there are no indirect or doubly indirect +// blocks). The table size is chosen so that the file header +// will be just big enough to fit in one disk sector, +// +// Unlike in a real system, we do not keep track of file permissions, +// ownership, last modification date, etc., in the file header. +// +// A file header can be initialized in two ways: +// for a new file, by modifying the in-memory data structure +// to point to the newly allocated data blocks +// for a file already on disk, by reading the file header from disk +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" + +#include "filehdr.h" +#include "debug.h" +#include "synchdisk.h" +#include "main.h" + +//---------------------------------------------------------------------- +// FileHeader::Allocate +// Initialize a fresh file header for a newly created file. +// Allocate data blocks for the file out of the map of free disk blocks. +// Return FALSE if there are not enough free blocks to accomodate +// the new file. +// +// "freeMap" is the bit map of free disk sectors +// "fileSize" is the bit map of free disk sectors +//---------------------------------------------------------------------- + +bool +FileHeader::Allocate(PersistentBitmap *freeMap, int fileSize) +{ + numBytes = fileSize; + numSectors = divRoundUp(fileSize, SectorSize); + if (freeMap->NumClear() < numSectors) + return FALSE; // not enough space + + for (int i = 0; i < numSectors; i++) { + dataSectors[i] = freeMap->FindAndSet(); + // since we checked that there was enough free space, + // we expect this to succeed + ASSERT(dataSectors[i] >= 0); + } + return TRUE; +} + +//---------------------------------------------------------------------- +// FileHeader::Deallocate +// De-allocate all the space allocated for data blocks for this file. +// +// "freeMap" is the bit map of free disk sectors +//---------------------------------------------------------------------- + +void +FileHeader::Deallocate(PersistentBitmap *freeMap) +{ + for (int i = 0; i < numSectors; i++) { + ASSERT(freeMap->Test((int) dataSectors[i])); // ought to be marked! + freeMap->Clear((int) dataSectors[i]); + } +} + +//---------------------------------------------------------------------- +// FileHeader::FetchFrom +// Fetch contents of file header from disk. +// +// "sector" is the disk sector containing the file header +//---------------------------------------------------------------------- + +void +FileHeader::FetchFrom(int sector) +{ + kernel->synchDisk->ReadSector(sector, (char *)this); +} + +//---------------------------------------------------------------------- +// FileHeader::WriteBack +// Write the modified contents of the file header back to disk. +// +// "sector" is the disk sector to contain the file header +//---------------------------------------------------------------------- + +void +FileHeader::WriteBack(int sector) +{ + kernel->synchDisk->WriteSector(sector, (char *)this); +} + +//---------------------------------------------------------------------- +// FileHeader::ByteToSector +// Return which disk sector is storing a particular byte within the file. +// This is essentially a translation from a virtual address (the +// offset in the file) to a physical address (the sector where the +// data at the offset is stored). +// +// "offset" is the location within the file of the byte in question +//---------------------------------------------------------------------- + +int +FileHeader::ByteToSector(int offset) +{ + return(dataSectors[offset / SectorSize]); +} + +//---------------------------------------------------------------------- +// FileHeader::FileLength +// Return the number of bytes in the file. +//---------------------------------------------------------------------- + +int +FileHeader::FileLength() +{ + return numBytes; +} + +//---------------------------------------------------------------------- +// FileHeader::Print +// Print the contents of the file header, and the contents of all +// the data blocks pointed to by the file header. +//---------------------------------------------------------------------- + +void +FileHeader::Print() +{ + int i, j, k; + char *data = new char[SectorSize]; + + printf("FileHeader contents. File size: %d. File blocks:\n", numBytes); + for (i = 0; i < numSectors; i++) + printf("%d ", dataSectors[i]); + printf("\nFile contents:\n"); + for (i = k = 0; i < numSectors; i++) { + kernel->synchDisk->ReadSector(dataSectors[i], data); + for (j = 0; (j < SectorSize) && (k < numBytes); j++, k++) { + if ('\040' <= data[j] && data[j] <= '\176') // isprint(data[j]) + printf("%c", data[j]); + else + printf("\\%x", (unsigned char)data[j]); + } + printf("\n"); + } + delete [] data; +} diff --git a/code/filesys/filehdr.h b/code/filesys/filehdr.h new file mode 100644 index 0000000..8d7e137 --- /dev/null +++ b/code/filesys/filehdr.h @@ -0,0 +1,66 @@ +// filehdr.h +// Data structures for managing a disk file header. +// +// A file header describes where on disk to find the data in a file, +// along with other information about the file (for instance, its +// length, owner, etc.) +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" + +#ifndef FILEHDR_H +#define FILEHDR_H + +#include "disk.h" +#include "pbitmap.h" + +#define NumDirect ((SectorSize - 2 * sizeof(int)) / sizeof(int)) +#define MaxFileSize (NumDirect * SectorSize) + +// The following class defines the Nachos "file header" (in UNIX terms, +// the "i-node"), describing where on disk to find all of the data in the file. +// The file header is organized as a simple table of pointers to +// data blocks. +// +// The file header data structure can be stored in memory or on disk. +// When it is on disk, it is stored in a single sector -- this means +// that we assume the size of this data structure to be the same +// as one disk sector. Without indirect addressing, this +// limits the maximum file length to just under 4K bytes. +// +// There is no constructor; rather the file header can be initialized +// by allocating blocks for the file (if it is a new file), or by +// reading it from disk. + +class FileHeader { + public: + bool Allocate(PersistentBitmap *bitMap, int fileSize);// Initialize a file header, + // including allocating space + // on disk for the file data + void Deallocate(PersistentBitmap *bitMap); // De-allocate this file's + // data blocks + + void FetchFrom(int sectorNumber); // Initialize file header from disk + void WriteBack(int sectorNumber); // Write modifications to file header + // back to disk + + int ByteToSector(int offset); // Convert a byte offset into the file + // to the disk sector containing + // the byte + + int FileLength(); // Return the length of the file + // in bytes + + void Print(); // Print the contents of the file. + + private: + int numBytes; // Number of bytes in the file + int numSectors; // Number of data sectors in the file + int dataSectors[NumDirect]; // Disk sector numbers for each data + // block in the file +}; + +#endif // FILEHDR_H diff --git a/code/filesys/filesys.cc b/code/filesys/filesys.cc new file mode 100644 index 0000000..c49469e --- /dev/null +++ b/code/filesys/filesys.cc @@ -0,0 +1,340 @@ +// filesys.cc +// Routines to manage the overall operation of the file system. +// Implements routines to map from textual file names to files. +// +// Each file in the file system has: +// A file header, stored in a sector on disk +// (the size of the file header data structure is arranged +// to be precisely the size of 1 disk sector) +// A number of data blocks +// An entry in the file system directory +// +// The file system consists of several data structures: +// A bitmap of free disk sectors (cf. bitmap.h) +// A directory of file names and file headers +// +// Both the bitmap and the directory are represented as normal +// files. Their file headers are located in specific sectors +// (sector 0 and sector 1), so that the file system can find them +// on bootup. +// +// The file system assumes that the bitmap and directory files are +// kept "open" continuously while Nachos is running. +// +// For those operations (such as Create, Remove) that modify the +// directory and/or bitmap, if the operation succeeds, the changes +// are written immediately back to disk (the two files are kept +// open during all this time). If the operation fails, and we have +// modified part of the directory and/or bitmap, we simply discard +// the changed version, without writing it back to disk. +// +// Our implementation at this point has the following restrictions: +// +// there is no synchronization for concurrent accesses +// files have a fixed size, set when the file is created +// files cannot be bigger than about 3KB in size +// there is no hierarchical directory structure, and only a limited +// number of files can be added to the system +// there is no attempt to make the system robust to failures +// (if Nachos exits in the middle of an operation that modifies +// the file system, it may corrupt the disk) +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. +#ifndef FILESYS_STUB + +#include "copyright.h" +#include "debug.h" +#include "disk.h" +#include "pbitmap.h" +#include "directory.h" +#include "filehdr.h" +#include "filesys.h" + +// Sectors containing the file headers for the bitmap of free sectors, +// and the directory of files. These file headers are placed in well-known +// sectors, so that they can be located on boot-up. +#define FreeMapSector 0 +#define DirectorySector 1 + +// Initial file sizes for the bitmap and directory; until the file system +// supports extensible files, the directory size sets the maximum number +// of files that can be loaded onto the disk. +#define FreeMapFileSize (NumSectors / BitsInByte) +#define NumDirEntries 10 +#define DirectoryFileSize (sizeof(DirectoryEntry) * NumDirEntries) + +//---------------------------------------------------------------------- +// FileSystem::FileSystem +// Initialize the file system. If format = TRUE, the disk has +// nothing on it, and we need to initialize the disk to contain +// an empty directory, and a bitmap of free sectors (with almost but +// not all of the sectors marked as free). +// +// If format = FALSE, we just have to open the files +// representing the bitmap and the directory. +// +// "format" -- should we initialize the disk? +//---------------------------------------------------------------------- + +FileSystem::FileSystem(bool format) +{ + DEBUG(dbgFile, "Initializing the file system."); + if (format) { + PersistentBitmap *freeMap = new PersistentBitmap(NumSectors); + Directory *directory = new Directory(NumDirEntries); + FileHeader *mapHdr = new FileHeader; + FileHeader *dirHdr = new FileHeader; + + DEBUG(dbgFile, "Formatting the file system."); + + // First, allocate space for FileHeaders for the directory and bitmap + // (make sure no one else grabs these!) + freeMap->Mark(FreeMapSector); + freeMap->Mark(DirectorySector); + + // Second, allocate space for the data blocks containing the contents + // of the directory and bitmap files. There better be enough space! + + ASSERT(mapHdr->Allocate(freeMap, FreeMapFileSize)); + ASSERT(dirHdr->Allocate(freeMap, DirectoryFileSize)); + + // Flush the bitmap and directory FileHeaders back to disk + // We need to do this before we can "Open" the file, since open + // reads the file header off of disk (and currently the disk has garbage + // on it!). + + DEBUG(dbgFile, "Writing headers back to disk."); + mapHdr->WriteBack(FreeMapSector); + dirHdr->WriteBack(DirectorySector); + + // OK to open the bitmap and directory files now + // The file system operations assume these two files are left open + // while Nachos is running. + + freeMapFile = new OpenFile(FreeMapSector); + directoryFile = new OpenFile(DirectorySector); + + // Once we have the files "open", we can write the initial version + // of each file back to disk. The directory at this point is completely + // empty; but the bitmap has been changed to reflect the fact that + // sectors on the disk have been allocated for the file headers and + // to hold the file data for the directory and bitmap. + + DEBUG(dbgFile, "Writing bitmap and directory back to disk."); + freeMap->WriteBack(freeMapFile); // flush changes to disk + directory->WriteBack(directoryFile); + + if (debug->IsEnabled('f')) { + freeMap->Print(); + directory->Print(); + } + delete freeMap; + delete directory; + delete mapHdr; + delete dirHdr; + } else { + // if we are not formatting the disk, just open the files representing + // the bitmap and directory; these are left open while Nachos is running + freeMapFile = new OpenFile(FreeMapSector); + directoryFile = new OpenFile(DirectorySector); + } +} + +//---------------------------------------------------------------------- +// FileSystem::Create +// Create a file in the Nachos file system (similar to UNIX create). +// Since we can't increase the size of files dynamically, we have +// to give Create the initial size of the file. +// +// The steps to create a file are: +// Make sure the file doesn't already exist +// Allocate a sector for the file header +// Allocate space on disk for the data blocks for the file +// Add the name to the directory +// Store the new file header on disk +// Flush the changes to the bitmap and the directory back to disk +// +// Return TRUE if everything goes ok, otherwise, return FALSE. +// +// Create fails if: +// file is already in directory +// no free space for file header +// no free entry for file in directory +// no free space for data blocks for the file +// +// Note that this implementation assumes there is no concurrent access +// to the file system! +// +// "name" -- name of file to be created +// "initialSize" -- size of file to be created +//---------------------------------------------------------------------- + +bool +FileSystem::Create(char *name, int initialSize) +{ + Directory *directory; + PersistentBitmap *freeMap; + FileHeader *hdr; + int sector; + bool success; + + DEBUG(dbgFile, "Creating file " << name << " size " << initialSize); + + directory = new Directory(NumDirEntries); + directory->FetchFrom(directoryFile); + + if (directory->Find(name) != -1) + success = FALSE; // file is already in directory + else { + freeMap = new PersistentBitmap(freeMapFile,NumSectors); + sector = freeMap->FindAndSet(); // find a sector to hold the file header + if (sector == -1) + success = FALSE; // no free block for file header + else if (!directory->Add(name, sector)) + success = FALSE; // no space in directory + else { + hdr = new FileHeader; + if (!hdr->Allocate(freeMap, initialSize)) + success = FALSE; // no space on disk for data + else { + success = TRUE; + // everthing worked, flush all changes back to disk + hdr->WriteBack(sector); + directory->WriteBack(directoryFile); + freeMap->WriteBack(freeMapFile); + } + delete hdr; + } + delete freeMap; + } + delete directory; + return success; +} + +//---------------------------------------------------------------------- +// FileSystem::Open +// Open a file for reading and writing. +// To open a file: +// Find the location of the file's header, using the directory +// Bring the header into memory +// +// "name" -- the text name of the file to be opened +//---------------------------------------------------------------------- + +OpenFile * +FileSystem::Open(char *name) +{ + Directory *directory = new Directory(NumDirEntries); + OpenFile *openFile = NULL; + int sector; + + DEBUG(dbgFile, "Opening file" << name); + directory->FetchFrom(directoryFile); + sector = directory->Find(name); + if (sector >= 0) + openFile = new OpenFile(sector); // name was found in directory + delete directory; + return openFile; // return NULL if not found +} + +//---------------------------------------------------------------------- +// FileSystem::Remove +// Delete a file from the file system. This requires: +// Remove it from the directory +// Delete the space for its header +// Delete the space for its data blocks +// Write changes to directory, bitmap back to disk +// +// Return TRUE if the file was deleted, FALSE if the file wasn't +// in the file system. +// +// "name" -- the text name of the file to be removed +//---------------------------------------------------------------------- + +bool +FileSystem::Remove(char *name) +{ + Directory *directory; + PersistentBitmap *freeMap; + FileHeader *fileHdr; + int sector; + + directory = new Directory(NumDirEntries); + directory->FetchFrom(directoryFile); + sector = directory->Find(name); + if (sector == -1) { + delete directory; + return FALSE; // file not found + } + fileHdr = new FileHeader; + fileHdr->FetchFrom(sector); + + freeMap = new PersistentBitmap(freeMapFile,NumSectors); + + fileHdr->Deallocate(freeMap); // remove data blocks + freeMap->Clear(sector); // remove header block + directory->Remove(name); + + freeMap->WriteBack(freeMapFile); // flush to disk + directory->WriteBack(directoryFile); // flush to disk + delete fileHdr; + delete directory; + delete freeMap; + return TRUE; +} + +//---------------------------------------------------------------------- +// FileSystem::List +// List all the files in the file system directory. +//---------------------------------------------------------------------- + +void +FileSystem::List() +{ + Directory *directory = new Directory(NumDirEntries); + + directory->FetchFrom(directoryFile); + directory->List(); + delete directory; +} + +//---------------------------------------------------------------------- +// FileSystem::Print +// Print everything about the file system: +// the contents of the bitmap +// the contents of the directory +// for each file in the directory, +// the contents of the file header +// the data in the file +//---------------------------------------------------------------------- + +void +FileSystem::Print() +{ + FileHeader *bitHdr = new FileHeader; + FileHeader *dirHdr = new FileHeader; + PersistentBitmap *freeMap = new PersistentBitmap(freeMapFile,NumSectors); + Directory *directory = new Directory(NumDirEntries); + + printf("Bit map file header:\n"); + bitHdr->FetchFrom(FreeMapSector); + bitHdr->Print(); + + printf("Directory file header:\n"); + dirHdr->FetchFrom(DirectorySector); + dirHdr->Print(); + + freeMap->Print(); + + directory->FetchFrom(directoryFile); + directory->Print(); + + delete bitHdr; + delete dirHdr; + delete freeMap; + delete directory; +} + +#endif // FILESYS_STUB diff --git a/code/filesys/filesys.h b/code/filesys/filesys.h new file mode 100644 index 0000000..743430c --- /dev/null +++ b/code/filesys/filesys.h @@ -0,0 +1,98 @@ +// filesys.h +// Data structures to represent the Nachos file system. +// +// A file system is a set of files stored on disk, organized +// into directories. Operations on the file system have to +// do with "naming" -- creating, opening, and deleting files, +// given a textual file name. Operations on an individual +// "open" file (read, write, close) are to be found in the OpenFile +// class (openfile.h). +// +// We define two separate implementations of the file system. +// The "STUB" version just re-defines the Nachos file system +// operations as operations on the native UNIX file system on the machine +// running the Nachos simulation. +// +// The other version is a "real" file system, built on top of +// a disk simulator. The disk is simulated using the native UNIX +// file system (in a file named "DISK"). +// +// In the "real" implementation, there are two key data structures used +// in the file system. There is a single "root" directory, listing +// all of the files in the file system; unlike UNIX, the baseline +// system does not provide a hierarchical directory structure. +// In addition, there is a bitmap for allocating +// disk sectors. Both the root directory and the bitmap are themselves +// stored as files in the Nachos file system -- this causes an interesting +// bootstrap problem when the simulated disk is initialized. +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef FS_H +#define FS_H + +#include "copyright.h" +#include "sysdep.h" +#include "openfile.h" + +#ifdef FILESYS_STUB // Temporarily implement file system calls as + // calls to UNIX, until the real file system + // implementation is available +class FileSystem { + public: + FileSystem() { for (int i = 0; i < 20; i++) fileDescriptorTable[i] = NULL; } + + bool Create(char *name) { + int fileDescriptor = OpenForWrite(name); + + if (fileDescriptor == -1) return FALSE; + Close(fileDescriptor); + return TRUE; + } + + OpenFile* Open(char *name) { + int fileDescriptor = OpenForReadWrite(name, FALSE); + + if (fileDescriptor == -1) return NULL; + return new OpenFile(fileDescriptor); + } + + bool Remove(char *name) { return Unlink(name) == 0; } + + OpenFile *fileDescriptorTable[20]; + +}; + +#else // FILESYS +class FileSystem { + public: + FileSystem(bool format); // Initialize the file system. + // Must be called *after* "synchDisk" + // has been initialized. + // If "format", there is nothing on + // the disk, so initialize the directory + // and the bitmap of free blocks. + + bool Create(char *name, int initialSize); + // Create a file (UNIX creat) + + OpenFile* Open(char *name); // Open a file (UNIX open) + + bool Remove(char *name); // Delete a file (UNIX unlink) + + void List(); // List all the files in the file system + + void Print(); // List all the files and their contents + + private: + OpenFile* freeMapFile; // Bit map of free disk blocks, + // represented as a file + OpenFile* directoryFile; // "Root" directory -- list of + // file names, represented as a file +}; + +#endif // FILESYS + +#endif // FS_H diff --git a/code/filesys/openfile.cc b/code/filesys/openfile.cc new file mode 100644 index 0000000..fc45b0d --- /dev/null +++ b/code/filesys/openfile.cc @@ -0,0 +1,196 @@ +// openfile.cc +// Routines to manage an open Nachos file. As in UNIX, a +// file must be open before we can read or write to it. +// Once we're all done, we can close it (in Nachos, by deleting +// the OpenFile data structure). +// +// Also as in UNIX, for convenience, we keep the file header in +// memory while the file is open. +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. +#ifndef FILESYS_STUB + +#include "copyright.h" +#include "main.h" +#include "filehdr.h" +#include "openfile.h" +#include "synchdisk.h" + +//---------------------------------------------------------------------- +// OpenFile::OpenFile +// Open a Nachos file for reading and writing. Bring the file header +// into memory while the file is open. +// +// "sector" -- the location on disk of the file header for this file +//---------------------------------------------------------------------- + +OpenFile::OpenFile(int sector) +{ + hdr = new FileHeader; + hdr->FetchFrom(sector); + seekPosition = 0; +} + +//---------------------------------------------------------------------- +// OpenFile::~OpenFile +// Close a Nachos file, de-allocating any in-memory data structures. +//---------------------------------------------------------------------- + +OpenFile::~OpenFile() +{ + delete hdr; +} + +//---------------------------------------------------------------------- +// OpenFile::Seek +// Change the current location within the open file -- the point at +// which the next Read or Write will start from. +// +// "position" -- the location within the file for the next Read/Write +//---------------------------------------------------------------------- + +void +OpenFile::Seek(int position) +{ + seekPosition = position; +} + +//---------------------------------------------------------------------- +// OpenFile::Read/Write +// Read/write a portion of a file, starting from seekPosition. +// Return the number of bytes actually written or read, and as a +// side effect, increment the current position within the file. +// +// Implemented using the more primitive ReadAt/WriteAt. +// +// "into" -- the buffer to contain the data to be read from disk +// "from" -- the buffer containing the data to be written to disk +// "numBytes" -- the number of bytes to transfer +//---------------------------------------------------------------------- + +int +OpenFile::Read(char *into, int numBytes) +{ + int result = ReadAt(into, numBytes, seekPosition); + seekPosition += result; + return result; +} + +int +OpenFile::Write(char *into, int numBytes) +{ + int result = WriteAt(into, numBytes, seekPosition); + seekPosition += result; + return result; +} + +//---------------------------------------------------------------------- +// OpenFile::ReadAt/WriteAt +// Read/write a portion of a file, starting at "position". +// Return the number of bytes actually written or read, but has +// no side effects (except that Write modifies the file, of course). +// +// There is no guarantee the request starts or ends on an even disk sector +// boundary; however the disk only knows how to read/write a whole disk +// sector at a time. Thus: +// +// For ReadAt: +// We read in all of the full or partial sectors that are part of the +// request, but we only copy the part we are interested in. +// For WriteAt: +// We must first read in any sectors that will be partially written, +// so that we don't overwrite the unmodified portion. We then copy +// in the data that will be modified, and write back all the full +// or partial sectors that are part of the request. +// +// "into" -- the buffer to contain the data to be read from disk +// "from" -- the buffer containing the data to be written to disk +// "numBytes" -- the number of bytes to transfer +// "position" -- the offset within the file of the first byte to be +// read/written +//---------------------------------------------------------------------- + +int +OpenFile::ReadAt(char *into, int numBytes, int position) +{ + int fileLength = hdr->FileLength(); + int i, firstSector, lastSector, numSectors; + char *buf; + + if ((numBytes <= 0) || (position >= fileLength)) + return 0; // check request + if ((position + numBytes) > fileLength) + numBytes = fileLength - position; + DEBUG(dbgFile, "Reading " << numBytes << " bytes at " << position << " from file of length " << fileLength); + + firstSector = divRoundDown(position, SectorSize); + lastSector = divRoundDown(position + numBytes - 1, SectorSize); + numSectors = 1 + lastSector - firstSector; + + // read in all the full and partial sectors that we need + buf = new char[numSectors * SectorSize]; + for (i = firstSector; i <= lastSector; i++) + kernel->synchDisk->ReadSector(hdr->ByteToSector(i * SectorSize), + &buf[(i - firstSector) * SectorSize]); + + // copy the part we want + bcopy(&buf[position - (firstSector * SectorSize)], into, numBytes); + delete [] buf; + return numBytes; +} + +int +OpenFile::WriteAt(char *from, int numBytes, int position) +{ + int fileLength = hdr->FileLength(); + int i, firstSector, lastSector, numSectors; + bool firstAligned, lastAligned; + char *buf; + + if ((numBytes <= 0) || (position >= fileLength)) + return 0; // check request + if ((position + numBytes) > fileLength) + numBytes = fileLength - position; + DEBUG(dbgFile, "Writing " << numBytes << " bytes at " << position << " from file of length " << fileLength); + + firstSector = divRoundDown(position, SectorSize); + lastSector = divRoundDown(position + numBytes - 1, SectorSize); + numSectors = 1 + lastSector - firstSector; + + buf = new char[numSectors * SectorSize]; + + firstAligned = (position == (firstSector * SectorSize)); + lastAligned = ((position + numBytes) == ((lastSector + 1) * SectorSize)); + +// read in first and last sector, if they are to be partially modified + if (!firstAligned) + ReadAt(buf, SectorSize, firstSector * SectorSize); + if (!lastAligned && ((firstSector != lastSector) || firstAligned)) + ReadAt(&buf[(lastSector - firstSector) * SectorSize], + SectorSize, lastSector * SectorSize); + +// copy in the bytes we want to change + bcopy(from, &buf[position - (firstSector * SectorSize)], numBytes); + +// write modified sectors back + for (i = firstSector; i <= lastSector; i++) + kernel->synchDisk->WriteSector(hdr->ByteToSector(i * SectorSize), + &buf[(i - firstSector) * SectorSize]); + delete [] buf; + return numBytes; +} + +//---------------------------------------------------------------------- +// OpenFile::Length +// Return the number of bytes in the file. +//---------------------------------------------------------------------- + +int +OpenFile::Length() +{ + return hdr->FileLength(); +} + +#endif //FILESYS_STUB diff --git a/code/filesys/openfile.h b/code/filesys/openfile.h new file mode 100644 index 0000000..2872476 --- /dev/null +++ b/code/filesys/openfile.h @@ -0,0 +1,97 @@ +// openfile.h +// Data structures for opening, closing, reading and writing to +// individual files. The operations supported are similar to +// the UNIX ones -- type 'man open' to the UNIX prompt. +// +// There are two implementations. One is a "STUB" that directly +// turns the file operations into the underlying UNIX operations. +// (cf. comment in filesys.h). +// +// The other is the "real" implementation, that turns these +// operations into read and write disk sector requests. +// In this baseline implementation of the file system, we don't +// worry about concurrent accesses to the file system +// by different threads. +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef OPENFILE_H +#define OPENFILE_H + +#include "copyright.h" +#include "utility.h" +#include "sysdep.h" + +#ifdef FILESYS_STUB // Temporarily implement calls to + // Nachos file system as calls to UNIX! + // See definitions listed under #else +class OpenFile { + public: + OpenFile(int f) { file = f; currentOffset = 0; } // open the file + ~OpenFile() { Close(file); } // close the file + + int ReadAt(char *into, int numBytes, int position) { + Lseek(file, position, 0); + return ReadPartial(file, into, numBytes); + } + int WriteAt(char *from, int numBytes, int position) { + Lseek(file, position, 0); + WriteFile(file, from, numBytes); + return numBytes; + } + int Read(char *into, int numBytes) { + int numRead = ReadAt(into, numBytes, currentOffset); + currentOffset += numRead; + return numRead; + } + int Write(char *from, int numBytes) { + int numWritten = WriteAt(from, numBytes, currentOffset); + currentOffset += numWritten; + return numWritten; + } + + int Length() { Lseek(file, 0, 2); return Tell(file); } + + private: + int file; + int currentOffset; +}; + +#else // FILESYS +class FileHeader; + +class OpenFile { + public: + OpenFile(int sector); // Open a file whose header is located + // at "sector" on the disk + ~OpenFile(); // Close the file + + void Seek(int position); // Set the position from which to + // start reading/writing -- UNIX lseek + + int Read(char *into, int numBytes); // Read/write bytes from the file, + // starting at the implicit position. + // Return the # actually read/written, + // and increment position in file. + int Write(char *from, int numBytes); + + int ReadAt(char *into, int numBytes, int position); + // Read/write bytes from the file, + // bypassing the implicit position. + int WriteAt(char *from, int numBytes, int position); + + int Length(); // Return the number of bytes in the + // file (this interface is simpler + // than the UNIX idiom -- lseek to + // end of file, tell, lseek back + + private: + FileHeader *hdr; // Header for this file + int seekPosition; // Current position within the file +}; + +#endif // FILESYS + +#endif // OPENFILE_H diff --git a/code/filesys/pbitmap.cc b/code/filesys/pbitmap.cc new file mode 100644 index 0000000..dadfbd2 --- /dev/null +++ b/code/filesys/pbitmap.cc @@ -0,0 +1,79 @@ +// pbitmap.c +// Routines to manage a persistent bitmap -- a bitmap that is +// stored on disk. +// +// Copyright (c) 1992,1993,1995 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "pbitmap.h" + +//---------------------------------------------------------------------- +// PersistentBitmap::PersistentBitmap(int) +// Initialize a bitmap with "numItems" bits, so that every bit is clear. +// it can be added somewhere on a list. +// +// "numItems" is the number of bits in the bitmap. +// +// This constructor does not initialize the bitmap from a disk file +//---------------------------------------------------------------------- + +PersistentBitmap::PersistentBitmap(int numItems):Bitmap(numItems) +{ +} + +//---------------------------------------------------------------------- +// PersistentBitmap::PersistentBitmap(OpenFile*,int) +// Initialize a persistent bitmap with "numItems" bits, +// so that every bit is clear. +// +// "numItems" is the number of bits in the bitmap. +// "file" refers to an open file containing the bitmap (written +// by a previous call to PersistentBitmap::WriteBack +// +// This constructor initializes the bitmap from a disk file +//---------------------------------------------------------------------- + +PersistentBitmap::PersistentBitmap(OpenFile *file, int numItems):Bitmap(numItems) +{ + // map has already been initialized by the BitMap constructor, + // but we will just overwrite that with the contents of the + // map found in the file + file->ReadAt((char *)map, numWords * sizeof(unsigned), 0); +} + +//---------------------------------------------------------------------- +// PersistentBitmap::~PersistentBitmap +// De-allocate a persistent bitmap. +//---------------------------------------------------------------------- + +PersistentBitmap::~PersistentBitmap() +{ +} + +//---------------------------------------------------------------------- +// PersistentBitmap::FetchFrom +// Initialize the contents of a persistent bitmap from a Nachos file. +// +// "file" is the place to read the bitmap from +//---------------------------------------------------------------------- + +void +PersistentBitmap::FetchFrom(OpenFile *file) +{ + file->ReadAt((char *)map, numWords * sizeof(unsigned), 0); +} + +//---------------------------------------------------------------------- +// PersistentBitmap::WriteBack +// Store the contents of a persistent bitmap to a Nachos file. +// +// "file" is the place to write the bitmap to +//---------------------------------------------------------------------- + +void +PersistentBitmap::WriteBack(OpenFile *file) +{ + file->WriteAt((char *)map, numWords * sizeof(unsigned), 0); +} diff --git a/code/filesys/pbitmap.h b/code/filesys/pbitmap.h new file mode 100644 index 0000000..96ed2ba --- /dev/null +++ b/code/filesys/pbitmap.h @@ -0,0 +1,35 @@ +// pbitmap.h +// Data structures defining a "persistent" bitmap -- a bitmap +// that can be stored and fetched off of disk +// +// A persistent bitmap can either be initialized from the disk +// when it is created, or it can be initialized later using +// the FetchFrom method +// +// Copyright (c) 1992,1993,1995 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef PBITMAP_H +#define PBITMAP_H + +#include "copyright.h" +#include "bitmap.h" +#include "openfile.h" + +// The following class defines a persistent bitmap. It inherits all +// the behavior of a bitmap (see bitmap.h), adding the ability to +// be read from and stored to the disk. + +class PersistentBitmap : public Bitmap { + public: + PersistentBitmap(OpenFile *file,int numItems); //initialize bitmap from disk + PersistentBitmap(int numItems); // or don't... + + ~PersistentBitmap(); // deallocate bitmap + + void FetchFrom(OpenFile *file); // read bitmap from the disk + void WriteBack(OpenFile *file); // write bitmap contents to disk +}; + +#endif // PBITMAP_H diff --git a/code/filesys/synchdisk.cc b/code/filesys/synchdisk.cc new file mode 100644 index 0000000..c0bf4b1 --- /dev/null +++ b/code/filesys/synchdisk.cc @@ -0,0 +1,94 @@ +// synchdisk.cc +// Routines to synchronously access the disk. The physical disk +// is an asynchronous device (disk requests return immediately, and +// an interrupt happens later on). This is a layer on top of +// the disk providing a synchronous interface (requests wait until +// the request completes). +// +// Use a semaphore to synchronize the interrupt handlers with the +// pending requests. And, because the physical disk can only +// handle one operation at a time, use a lock to enforce mutual +// exclusion. +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "synchdisk.h" + + +//---------------------------------------------------------------------- +// SynchDisk::SynchDisk +// Initialize the synchronous interface to the physical disk, in turn +// initializing the physical disk. +// +//---------------------------------------------------------------------- + +SynchDisk::SynchDisk() +{ + semaphore = new Semaphore("synch disk", 0); + lock = new Lock("synch disk lock"); + disk = new Disk(this); +} + +//---------------------------------------------------------------------- +// SynchDisk::~SynchDisk +// De-allocate data structures needed for the synchronous disk +// abstraction. +//---------------------------------------------------------------------- + +SynchDisk::~SynchDisk() +{ + delete disk; + delete lock; + delete semaphore; +} + +//---------------------------------------------------------------------- +// SynchDisk::ReadSector +// Read the contents of a disk sector into a buffer. Return only +// after the data has been read. +// +// "sectorNumber" -- the disk sector to read +// "data" -- the buffer to hold the contents of the disk sector +//---------------------------------------------------------------------- + +void +SynchDisk::ReadSector(int sectorNumber, char* data) +{ + lock->Acquire(); // only one disk I/O at a time + disk->ReadRequest(sectorNumber, data); + semaphore->P(); // wait for interrupt + lock->Release(); +} + +//---------------------------------------------------------------------- +// SynchDisk::WriteSector +// Write the contents of a buffer into a disk sector. Return only +// after the data has been written. +// +// "sectorNumber" -- the disk sector to be written +// "data" -- the new contents of the disk sector +//---------------------------------------------------------------------- + +void +SynchDisk::WriteSector(int sectorNumber, char* data) +{ + lock->Acquire(); // only one disk I/O at a time + disk->WriteRequest(sectorNumber, data); + semaphore->P(); // wait for interrupt + lock->Release(); +} + +//---------------------------------------------------------------------- +// SynchDisk::CallBack +// Disk interrupt handler. Wake up any thread waiting for the disk +// request to finish. +//---------------------------------------------------------------------- + +void +SynchDisk::CallBack() +{ + semaphore->V(); +} diff --git a/code/filesys/synchdisk.h b/code/filesys/synchdisk.h new file mode 100644 index 0000000..cdd024a --- /dev/null +++ b/code/filesys/synchdisk.h @@ -0,0 +1,55 @@ +// synchdisk.h +// Data structures to export a synchronous interface to the raw +// disk device. +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" + +#ifndef SYNCHDISK_H +#define SYNCHDISK_H + +#include "disk.h" +#include "synch.h" +#include "callback.h" + +// The following class defines a "synchronous" disk abstraction. +// As with other I/O devices, the raw physical disk is an asynchronous device -- +// requests to read or write portions of the disk return immediately, +// and an interrupt occurs later to signal that the operation completed. +// (Also, the physical characteristics of the disk device assume that +// only one operation can be requested at a time). +// +// This class provides the abstraction that for any individual thread +// making a request, it waits around until the operation finishes before +// returning. + +class SynchDisk : public CallBackObj { + public: + SynchDisk(); // Initialize a synchronous disk, + // by initializing the raw Disk. + ~SynchDisk(); // De-allocate the synch disk data + + void ReadSector(int sectorNumber, char* data); + // Read/write a disk sector, returning + // only once the data is actually read + // or written. These call + // Disk::ReadRequest/WriteRequest and + // then wait until the request is done. + void WriteSector(int sectorNumber, char* data); + + void CallBack(); // Called by the disk device interrupt + // handler, to signal that the + // current disk operation is complete. + + private: + Disk *disk; // Raw disk device + Semaphore *semaphore; // To synchronize requesting thread + // with the interrupt handler + Lock *lock; // Only one read/write request + // can be sent to the disk at a time +}; + +#endif // SYNCHDISK_H diff --git a/code/lib/bitmap.cc b/code/lib/bitmap.cc new file mode 100644 index 0000000..df975ed --- /dev/null +++ b/code/lib/bitmap.cc @@ -0,0 +1,191 @@ +// bitmap.cc +// Routines to manage a bitmap -- an array of bits each of which +// can be either on or off. Represented as an array of integers. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "debug.h" +#include "bitmap.h" + +//---------------------------------------------------------------------- +// BitMap::BitMap +// Initialize a bitmap with "numItems" bits, so that every bit is clear. +// it can be added somewhere on a list. +// +// "numItems" is the number of bits in the bitmap. +//---------------------------------------------------------------------- + +Bitmap::Bitmap(int numItems) +{ + int i; + + ASSERT(numItems > 0); + + numBits = numItems; + numWords = divRoundUp(numBits, BitsInWord); + map = new unsigned int[numWords]; + for (i = 0; i < numWords; i++) { + map[i] = 0; // initialize map to keep Purify happy + } + for (i = 0; i < numBits; i++) { + Clear(i); + } +} + +//---------------------------------------------------------------------- +// Bitmap::~Bitmap +// De-allocate a bitmap. +//---------------------------------------------------------------------- + +Bitmap::~Bitmap() +{ + delete map; +} + +//---------------------------------------------------------------------- +// Bitmap::Set +// Set the "nth" bit in a bitmap. +// +// "which" is the number of the bit to be set. +//---------------------------------------------------------------------- + +void +Bitmap::Mark(int which) +{ + ASSERT(which >= 0 && which < numBits); + + map[which / BitsInWord] |= 1 << (which % BitsInWord); + + ASSERT(Test(which)); +} + +//---------------------------------------------------------------------- +// Bitmap::Clear +// Clear the "nth" bit in a bitmap. +// +// "which" is the number of the bit to be cleared. +//---------------------------------------------------------------------- + +void +Bitmap::Clear(int which) +{ + ASSERT(which >= 0 && which < numBits); + + map[which / BitsInWord] &= ~(1 << (which % BitsInWord)); + + ASSERT(!Test(which)); +} + +//---------------------------------------------------------------------- +// Bitmap::Test +// Return TRUE if the "nth" bit is set. +// +// "which" is the number of the bit to be tested. +//---------------------------------------------------------------------- + +bool +Bitmap::Test(int which) const +{ + ASSERT(which >= 0 && which < numBits); + + if (map[which / BitsInWord] & (1 << (which % BitsInWord))) { + return TRUE; + } else { + return FALSE; + } +} + +//---------------------------------------------------------------------- +// Bitmap::FindAndSet +// Return the number of the first bit which is clear. +// As a side effect, set the bit (mark it as in use). +// (In other words, find and allocate a bit.) +// +// If no bits are clear, return -1. +//---------------------------------------------------------------------- + +int +Bitmap::FindAndSet() +{ + for (int i = 0; i < numBits; i++) { + if (!Test(i)) { + Mark(i); + return i; + } + } + return -1; +} + +//---------------------------------------------------------------------- +// Bitmap::NumClear +// Return the number of clear bits in the bitmap. +// (In other words, how many bits are unallocated?) +//---------------------------------------------------------------------- + +int +Bitmap::NumClear() const +{ + int count = 0; + + for (int i = 0; i < numBits; i++) { + if (!Test(i)) { + count++; + } + } + return count; +} + +//---------------------------------------------------------------------- +// Bitmap::Print +// Print the contents of the bitmap, for debugging. +// +// Could be done in a number of ways, but we just print the #'s of +// all the bits that are set in the bitmap. +//---------------------------------------------------------------------- + +void +Bitmap::Print() const +{ + cout << "Bitmap set:\n"; + for (int i = 0; i < numBits; i++) { + if (Test(i)) { + cout << i << ", "; + } + } + cout << "\n"; +} + + +//---------------------------------------------------------------------- +// Bitmap::SelfTest +// Test whether this module is working. +//---------------------------------------------------------------------- + +void +Bitmap::SelfTest() +{ + int i; + + ASSERT(numBits >= BitsInWord); // bitmap must be big enough + + ASSERT(NumClear() == numBits); // bitmap must be empty + ASSERT(FindAndSet() == 0); + Mark(31); + ASSERT(Test(0) && Test(31)); + + ASSERT(FindAndSet() == 1); + Clear(0); + Clear(1); + Clear(31); + + for (i = 0; i < numBits; i++) { + Mark(i); + } + ASSERT(FindAndSet() == -1); // bitmap should be full! + for (i = 0; i < numBits; i++) { + Clear(i); + } +} diff --git a/code/lib/bitmap.h b/code/lib/bitmap.h new file mode 100644 index 0000000..081f38f --- /dev/null +++ b/code/lib/bitmap.h @@ -0,0 +1,59 @@ +// bitmap.h +// Data structures defining a bitmap -- an array of bits each of which +// can be either on or off. +// +// Represented as an array of unsigned integers, on which we do +// modulo arithmetic to find the bit we are interested in. +// +// The bitmap can be parameterized with with the number of bits being +// managed. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef BITMAP_H +#define BITMAP_H + +#include "copyright.h" +#include "utility.h" + +// Definitions helpful for representing a bitmap as an array of integers +const int BitsInByte = 8; +const int BitsInWord = sizeof(unsigned int) * BitsInByte; + +// The following class defines a "bitmap" -- an array of bits, +// each of which can be independently set, cleared, and tested. +// +// Most useful for managing the allocation of the elements of an array -- +// for instance, disk sectors, or main memory pages. +// Each bit represents whether the corresponding sector or page is +// in use or free. + +class Bitmap { + public: + Bitmap(int numItems); // Initialize a bitmap, with "numItems" bits + // initially, all bits are cleared. + ~Bitmap(); // De-allocate bitmap + + void Mark(int which); // Set the "nth" bit + void Clear(int which); // Clear the "nth" bit + bool Test(int which) const; // Is the "nth" bit set? + int FindAndSet(); // Return the # of a clear bit, and as a side + // effect, set the bit. + // If no bits are clear, return -1. + int NumClear() const; // Return the number of clear bits + + void Print() const; // Print contents of bitmap + void SelfTest(); // Test whether bitmap is working + + protected: + int numBits; // number of bits in the bitmap + int numWords; // number of words of bitmap storage + // (rounded up if numBits is not a + // multiple of the number of bits in + // a word) + unsigned int *map; // bit storage +}; + +#endif // BITMAP_H diff --git a/code/lib/copyright.h b/code/lib/copyright.h new file mode 100644 index 0000000..b2fa8a8 --- /dev/null +++ b/code/lib/copyright.h @@ -0,0 +1,24 @@ +/* +Copyright (c) 1992-1996 The Regents of the University of California. +All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose, without fee, and without written agreement is +hereby granted, provided that the above copyright notice and the following +two paragraphs appear in all copies of this software. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT +OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF +CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +*/ + +#ifdef MAIN /* include the copyright message in every executable */ +static char *copyright = "Copyright (c) 1992-1993 The Regents of the University of California. All rights reserved."; +#endif // MAIN diff --git a/code/lib/debug.cc b/code/lib/debug.cc new file mode 100644 index 0000000..6a90bdf --- /dev/null +++ b/code/lib/debug.cc @@ -0,0 +1,45 @@ +// debug.cc +// Debugging routines. Allows users to control whether to +// print DEBUG statements, based on a command line argument. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "utility.h" +#include "debug.h" +#include "string.h" + +//---------------------------------------------------------------------- +// Debug::Debug +// Initialize so that only DEBUG messages with a flag in flagList +// will be printed. +// +// If the flag is "+", we enable all DEBUG messages. +// +// "flagList" is a string of characters for whose DEBUG messages are +// to be enabled. +//---------------------------------------------------------------------- + +Debug::Debug(char *flagList) +{ + enableFlags = flagList; +} + + +//---------------------------------------------------------------------- +// Debug::IsEnabled +// Return TRUE if DEBUG messages with "flag" are to be printed. +//---------------------------------------------------------------------- + +bool +Debug::IsEnabled(char flag) +{ + if (enableFlags != NULL) { + return ((strchr(enableFlags, flag) != 0) + || (strchr(enableFlags, '+') != 0)); + } else { + return FALSE; + } +} diff --git a/code/lib/debug.h b/code/lib/debug.h new file mode 100644 index 0000000..cb5eba2 --- /dev/null +++ b/code/lib/debug.h @@ -0,0 +1,96 @@ +// debug.h +// Data structures for debugging routines. +// +// The debugging routines allow the user to turn on selected +// debugging messages, controllable from the command line arguments +// passed to Nachos (-d). You are encouraged to add your own +// debugging flags. Please.... +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef DEBUG_H +#define DEBUG_H + +#include "copyright.h" +#include "utility.h" +#include "sysdep.h" + +// The pre-defined debugging flags are: + +const char dbgAll = '+'; // turn on all debug messages +const char dbgThread = 't'; // threads +const char dbgSynch = 's'; // locks, semaphores, condition vars +const char dbgInt = 'i'; // interrupt emulation +const char dbgMach = 'm'; // machine emulation +const char dbgDisk = 'd'; // disk emulation +const char dbgFile = 'f'; // file system +const char dbgAddr = 'a'; // address spaces +const char dbgNet = 'n'; // network emulation +const char dbgSys = 'u'; // systemcall + +class Debug { + public: + Debug(char *flagList); + + bool IsEnabled(char flag); + + private: + char *enableFlags; // controls which DEBUG messages are printed +}; + +extern Debug *debug; + + +//---------------------------------------------------------------------- +// DEBUG +// If flag is enabled, print a message. +//---------------------------------------------------------------------- +#define DEBUG(flag,expr) \ + if (!debug->IsEnabled(flag)) {} else { \ + cerr << expr << "\n"; \ + } + + +//---------------------------------------------------------------------- +// ASSERT +// If condition is false, print a message and dump core. +// Useful for documenting assumptions in the code. +// +// NOTE: needs to be a #define, to be able to print the location +// where the error occurred. +//---------------------------------------------------------------------- +#define ASSERT(condition) \ + if (condition) {} else { \ + cerr << "Assertion failed: line " << __LINE__ << " file " << __FILE__ << "\n"; \ + Abort(); \ + } + +//---------------------------------------------------------------------- +// ASSERTNOTREACHED +// Print a message and dump core (equivalent to ASSERT(FALSE) without +// making the compiler whine). Useful for documenting when +// code should not be reached. +// +// NOTE: needs to be a #define, to be able to print the location +// where the error occurred. +//---------------------------------------------------------------------- + +#define ASSERTNOTREACHED() \ + { \ + cerr << "Assertion failed: line " << __LINE__ << " file " << __FILE__ << "\n"; \ + Abort(); \ + } + +//---------------------------------------------------------------------- +// ASSERTUNIMPLEMENTED +// Print a message that unimplemented code is executed and dump core +//---------------------------------------------------------------------- +#define UNIMPLEMENTED() \ +{ \ + cerr << "Reached UNIMPLEMENTED function " << __FUNCTION__ << " in file: " \ + << __FILE__ << " line: " << __LINE__ << ".\n"; \ +} + +#endif // DEBUG_H diff --git a/code/lib/hash.cc b/code/lib/hash.cc new file mode 100644 index 0000000..635cd52 --- /dev/null +++ b/code/lib/hash.cc @@ -0,0 +1,360 @@ +// hash.cc +// Routines to manage a self-expanding hash table of arbitrary things. +// The hashing function is supplied by the objects being put into +// the table; we use chaining to resolve hash conflicts. +// +// The hash table is implemented as an array of sorted lists, +// and we expand the hash table if the number of elements in the table +// gets too big. +// +// NOTE: Mutual exclusion must be provided by the caller. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +const int InitialBuckets = 4; // how big a hash table do we start with +const int ResizeRatio = 3; // when do we grow the hash table? +const int IncreaseSizeBy = 4; // how much do we grow table when needed? + +#include "copyright.h" + +//---------------------------------------------------------------------- +// HashTable::HashTable +// Initialize a hash table, empty to start with. +// Elements can now be added to the table. +//---------------------------------------------------------------------- + +template +HashTable::HashTable(Key (*get)(T x), unsigned (*hFunc)(Key x)) +{ + numItems = 0; + InitBuckets(InitialBuckets); + getKey = get; + hash = hFunc; +} + +//---------------------------------------------------------------------- +// HashTable::InitBuckets +// Initialize the bucket array for a hash table. +// Called by the constructor and by ReHash(). +//---------------------------------------------------------------------- + +template +void +HashTable::InitBuckets(int sz) +{ + numBuckets = sz; + buckets = new Bucket[numBuckets]; + for (int i = 0; i < sz; i++) { + buckets[i] = new List; + } +} + +//---------------------------------------------------------------------- +// HashTable::~HashTable +// Prepare a hash table for deallocation. +//---------------------------------------------------------------------- + +template +HashTable::~HashTable() +{ + ASSERT(IsEmpty()); // make sure table is empty + DeleteBuckets(buckets, numBuckets); +} + +//---------------------------------------------------------------------- +// HashTable::DeleteBuckets +// De-Initialize the bucket array for a hash table. +// Called by the destructor and by ReHash(). +//---------------------------------------------------------------------- + +template +void +HashTable::DeleteBuckets(List **table, int sz) +{ + for (int i = 0; i < sz; i++) { + delete table[i]; + } + delete [] table; +} + +//---------------------------------------------------------------------- +// HashTable::HashValue +// Return hash table bucket that would contain key. +//---------------------------------------------------------------------- + +template +int +HashTable::HashValue(Key key) const +{ + int result = (*hash)(key) % numBuckets; + ASSERT(result >= 0 && result < numBuckets); + return result; +} + +//---------------------------------------------------------------------- +// HashTable::Insert +// Put an item into the hashtable. +// +// Resize the table if the # of elements / # of buckets is too big. +// Then allocate a HashElement to keep track of the key, item pair, +// and add it to the right bucket. +// +// "key" is the key we'll use to find this item. +// "item" is the thing to put in the table. +//---------------------------------------------------------------------- + +template +void +HashTable::Insert(T item) +{ + Key key = getKey(item); + + ASSERT(!IsInTable(key)); + + if ((numItems / numBuckets) >= ResizeRatio) { + ReHash(); + } + + buckets[HashValue(key)]->Append(item); + numItems++; + + ASSERT(IsInTable(key)); +} + +//---------------------------------------------------------------------- +// HashTable::ReHash +// Increase the size of the hashtable, by +// (i) making a new table +// (ii) moving all the elements into the new table +// (iii) deleting the old table +//---------------------------------------------------------------------- + +template +void +HashTable::ReHash() +{ + Bucket *oldTable = buckets; + int oldSize = numBuckets; + T item; + + SanityCheck(); + InitBuckets(numBuckets * IncreaseSizeBy); + + for (int i = 0; i < oldSize; i++) { + while (!oldTable[i]->IsEmpty()) { + item = oldTable[i]->RemoveFront(); + buckets[HashValue(getKey(item))]->Append(item); + } + } + DeleteBuckets(oldTable, oldSize); + SanityCheck(); +} + +//---------------------------------------------------------------------- +// HashTable::FindInBucket +// Find an item in a hash table bucket, from it's key +// +// "bucket" -- the list storing the item, if it's in the table +// "key" -- the key uniquely identifying the item +// +// Returns: +// Whether item is found, and if found, the item. +//---------------------------------------------------------------------- + +template +bool +HashTable::FindInBucket(int bucket, + Key key, T *itemPtr) const +{ + ListIterator iterator(buckets[bucket]); + + for (; !iterator.IsDone(); iterator.Next()) { + if (key == getKey(iterator.Item())) { // found! + *itemPtr = iterator.Item(); + return TRUE; + } + } + *itemPtr = NULL; + return FALSE; +} + +//---------------------------------------------------------------------- +// HashTable::Find +// Find an item from the hash table. +// +// Returns: +// The item or NULL if not found. +//---------------------------------------------------------------------- + +template +bool +HashTable::Find(Key key, T *itemPtr) const +{ + int bucket = HashValue(key); + + return FindInBucket(bucket, key, itemPtr); +} + +//---------------------------------------------------------------------- +// HashTable::Remove +// Remove an item from the hash table. The item must be in the table. +// +// Returns: +// The removed item. +//---------------------------------------------------------------------- + +template +T +HashTable::Remove(Key key) +{ + int bucket = HashValue(key); + T item; + bool found = FindInBucket(bucket, key, &item); + + ASSERT(found); // item must be in table + + buckets[bucket]->Remove(item); + numItems--; + + ASSERT(!IsInTable(key)); + return item; +} + + +//---------------------------------------------------------------------- +// HashTable::Apply +// Apply function to every item in the hash table. +// +// "func" -- the function to apply +//---------------------------------------------------------------------- + +template +void +HashTable::Apply(void (*func)(T)) const +{ + for (int bucket = 0; bucket < numBuckets; bucket++) { + buckets[bucket]->Apply(func); + } +} + +//---------------------------------------------------------------------- +// HashTable::FindNextFullBucket +// Find the next bucket in the hash table that has any items in it. +// +// "bucket" -- where to start looking for full buckets +//---------------------------------------------------------------------- + +template +int +HashTable::FindNextFullBucket(int bucket) const +{ + for (; bucket < numBuckets; bucket++) { + if (!buckets[bucket]->IsEmpty()) { + break; + } + } + return bucket; +} + +//---------------------------------------------------------------------- +// HashTable::SanityCheck +// Test whether this is still a legal hash table. +// +// Tests: are all the buckets legal? +// does the table have the right # of elements? +// do all the elements hash to where they are stored? +//---------------------------------------------------------------------- + +template +void +HashTable::SanityCheck() const +{ + int numFound = 0; + ListIterator *iterator; + + for (int i = 0; i < numBuckets; i++) { + buckets[i]->SanityCheck(); + numFound += buckets[i]->NumInList(); + iterator = new ListIterator(buckets[i]); + for (; !iterator->IsDone(); iterator->Next()) { + ASSERT(i == HashValue(getKey(iterator->Item()))); + } + delete iterator; + } + ASSERT(numItems == numFound); + +} + +//---------------------------------------------------------------------- +// HashTable::SelfTest +// Test whether this module is working. +//---------------------------------------------------------------------- + +template +void +HashTable::SelfTest(T *p, int numEntries) +{ + int i; + HashIterator *iterator = new HashIterator(this); + + SanityCheck(); + ASSERT(IsEmpty()); // check that table is empty in various ways + for (; !iterator->IsDone(); iterator->Next()) { + ASSERTNOTREACHED(); + } + delete iterator; + + for (i = 0; i < numEntries; i++) { + Insert(p[i]); + ASSERT(IsInTable(getKey(p[i]))); + ASSERT(!IsEmpty()); + } + + // should be able to get out everything we put in + for (i = 0; i < numEntries; i++) { + ASSERT(Remove(getKey(p[i])) == p[i]); + } + + ASSERT(IsEmpty()); + SanityCheck(); +} + + +//---------------------------------------------------------------------- +// HashIterator::HashIterator +// Initialize a data structure to allow us to step through +// every entry in a has table. +//---------------------------------------------------------------------- + +template +HashIterator::HashIterator(HashTable *tbl) +{ + table = tbl; + bucket = table->FindNextFullBucket(0); + bucketIter = NULL; + if (bucket < table->numBuckets) { + bucketIter = new ListIterator(table->buckets[bucket]); + } +} + +//---------------------------------------------------------------------- +// HashIterator::Next +// Update iterator to point to the next item in the table. +//---------------------------------------------------------------------- + +template +void +HashIterator::Next() +{ + bucketIter->Next(); + if (bucketIter->IsDone()) { + delete bucketIter; + bucketIter = NULL; + bucket = table->FindNextFullBucket(++bucket); + if (bucket < table->numBuckets) { + bucketIter = new ListIterator(table->buckets[bucket]); + } + } +} diff --git a/code/lib/hash.h b/code/lib/hash.h new file mode 100644 index 0000000..6e315ff --- /dev/null +++ b/code/lib/hash.h @@ -0,0 +1,123 @@ +// hash.h +// Data structures to manage a hash table to relate arbitrary +// keys to arbitrary values. A hash table allows efficient lookup +// for the value given the key. +// +// I've only tested this implementation when both the key and the +// value are primitive types (ints or pointers). There is no +// guarantee that it will work in general. In particular, it +// assumes that the "==" operator works for both keys and values. +// +// In addition, the key must have Hash() defined: +// unsigned Hash(Key k); +// returns a randomized # based on value of key +// +// The value must have a function defined to retrieve the key: +// Key GetKey(T x); +// +// The hash table automatically resizes itself as items are +// put into the table. The implementation uses chaining +// to resolve hash conflicts. +// +// Allocation and deallocation of the items in the table are to +// be done by the caller. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef HASH_H +#define HASH_H + +#include "copyright.h" +#include "list.h" + +// The following class defines a "hash table" -- allowing quick +// lookup according to the hash function defined for the items +// being put into the table. + +template class HashIterator; + +template +class HashTable { + public: + HashTable(Key (*get)(T x), unsigned (*hFunc)(Key x)); + // initialize a hash table + ~HashTable(); // deallocate a hash table + + void Insert(T item); // Put item into hash table + T Remove(Key key); // Remove item from hash table. + + bool Find(Key key, T *itemPtr) const; + // Find an item from its key + bool IsInTable(Key key) { T dummy; return Find(key, &dummy); } + // Is the item in the table? + + bool IsEmpty() { return numItems == 0; } + // does the table have anything in it + + void Apply(void (*f)(T)) const; + // apply function to all elements in table + + void SanityCheck() const;// is this still a legal hash table? + void SelfTest(T *p, int numItems); + // is the module working? + + private: +typedef List *Bucket; + + Bucket *buckets; // the array of hash buckets + int numBuckets; // the number of buckets + int numItems; // the number of items in the table + + Key (*getKey)(T x); // get Key from value + unsigned (*hash)(Key x); // the hash function + + void InitBuckets(int size);// initialize bucket array + void DeleteBuckets(Bucket *table, int size); + // deallocate bucket array + + int HashValue(Key key) const; + // which bucket does the key hash to? + + void ReHash(); // expand the hash table + + bool FindInBucket(int bucket, Key key, T *itemPtr) const; + // find item in bucket + int FindNextFullBucket(int start) const; + // find next full bucket starting from this one + + friend class HashIterator; +}; + +// The following class can be used to step through a hash table -- +// same interface as ListIterator. Example code: +// HashIterator iter(table); +// +// for (; !iter->IsDone(); iter->Next()) { +// Operation on iter->Item() +// } + +template +class HashIterator { + public: + HashIterator(HashTable *table); // initialize an iterator + ~HashIterator() { if (bucketIter != NULL) delete bucketIter;}; + // destruct an iterator + + bool IsDone() { return (bucket == table->numBuckets); }; + // return TRUE if no more items in table + T Item() { ASSERT(!IsDone()); return bucketIter->Item(); }; + // return current item in table + void Next(); // update iterator to point to next + + private: + HashTable *table; // the hash table we're stepping through + int bucket; // current bucket we are in + ListIterator *bucketIter; // where we are in the bucket +}; + +#include "hash.cc" // templates are really like macros + // so needs to be included in every + // file that uses the template +#endif // HASH_H diff --git a/code/lib/libtest.cc b/code/lib/libtest.cc new file mode 100644 index 0000000..777143b --- /dev/null +++ b/code/lib/libtest.cc @@ -0,0 +1,85 @@ +// libtest.cc +// Driver code to call self-test routines for standard library +// classes -- bitmaps, lists, sorted lists, and hash tables. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "libtest.h" +#include "bitmap.h" +#include "list.h" +#include "hash.h" +#include "sysdep.h" + +//---------------------------------------------------------------------- +// IntCompare +// Compare two integers together. Serves as the comparison +// function for testing SortedLists +//---------------------------------------------------------------------- + +static int +IntCompare(int x, int y) { + if (x < y) return -1; + else if (x == y) return 0; + else return 1; +} + +//---------------------------------------------------------------------- +// HashInt, HashKey +// Compute a hash function on an integer. Serves as the +// hashing function for testing HashTables. +//---------------------------------------------------------------------- + +static unsigned int +HashInt(int key) { + return (unsigned int) key; +} + +//---------------------------------------------------------------------- +// HashKey +// Convert a string into an integer. Serves as the function +// to retrieve the key from the item in the hash table, for +// testing HashTables. Should be able to use "atoi" directly, +// but some compilers complain about that. +//---------------------------------------------------------------------- + +static int +HashKey(char *str) { + return atoi(str); +} + +// Array of values to be inserted into a List or SortedList. +static int listTestVector[] = { 9, 5, 7 }; + +// Array of values to be inserted into the HashTable +// There are enough here to force a ReHash(). +static char *hashTestVector[] = { "0", "1", "2", "3", "4", "5", "6", + "7", "8", "9", "10", "11", "12", "13", "14"}; + +//---------------------------------------------------------------------- +// LibSelfTest +// Run self tests on bitmaps, lists, sorted lists, and +// hash tables. +//---------------------------------------------------------------------- + +void +LibSelfTest () { + Bitmap *map = new Bitmap(200); + List *list = new List; + SortedList *sortList = new SortedList(IntCompare); + HashTable *hashTable = + new HashTable(HashKey, HashInt); + + + map->SelfTest(); + list->SelfTest(listTestVector, sizeof(listTestVector)/sizeof(int)); + sortList->SelfTest(listTestVector, sizeof(listTestVector)/sizeof(int)); + hashTable->SelfTest(hashTestVector, sizeof(hashTestVector)/sizeof(char *)); + + delete map; + delete list; + delete sortList; + delete hashTable; +} diff --git a/code/lib/libtest.h b/code/lib/libtest.h new file mode 100644 index 0000000..4e831c8 --- /dev/null +++ b/code/lib/libtest.h @@ -0,0 +1,15 @@ +// libtest.h +// Defines self test module for standard library routines. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef LIBTEST_H +#define LIBTEST_H + +#include "copyright.h" + +extern void LibSelfTest(); + +#endif // LIBTEST_H diff --git a/code/lib/list.cc b/code/lib/list.cc new file mode 100644 index 0000000..e3d5a99 --- /dev/null +++ b/code/lib/list.cc @@ -0,0 +1,408 @@ +// list.cc +// Routines to manage a singly linked list of "things". +// Lists are implemented as templates so that we can store +// anything on the list in a type-safe manner. +// +// A "ListElement" is allocated for each item to be put on the +// list; it is de-allocated when the item is removed. This means +// we don't need to keep a "next" pointer in every object we +// want to put on a list. +// +// NOTE: Mutual exclusion must be provided by the caller. +// If you want a synchronized list, you must use the routines +// in synchlist.cc. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" + +//---------------------------------------------------------------------- +// ListElement::ListElement +// Initialize a list element, so it can be added somewhere on a list. +// +// "itm" is the thing to be put on the list. +//---------------------------------------------------------------------- + +template +ListElement::ListElement(T itm) +{ + item = itm; + next = NULL; // always initialize to something! +} + +//---------------------------------------------------------------------- +// List::List +// Initialize a list, empty to start with. +// Elements can now be added to the list. +//---------------------------------------------------------------------- + +template +List::List() +{ + first = last = NULL; + numInList = 0; +} + +//---------------------------------------------------------------------- +// List::~List +// Prepare a list for deallocation. +// This does *NOT* free list elements, nor does it +// free the data those elements point to. +// Normally, the list should be empty when this is called. +//---------------------------------------------------------------------- + +template +List::~List() +{ +} + +//---------------------------------------------------------------------- +// List::Append +// Append an "item" to the end of the list. +// +// Allocate a ListElement to keep track of the item. +// If the list is empty, then this will be the only element. +// Otherwise, put it at the end. +// +// "item" is the thing to put on the list. +//---------------------------------------------------------------------- + +template +void List::Append(T item) +{ + ListElement *element = new ListElement(item); + + ASSERT(!this->IsInList(item)); + if (IsEmpty()) + { // list is empty + first = element; + last = element; + } + else + { // else put it after last + last->next = element; + last = element; + } + numInList++; + ASSERT(this->IsInList(item)); +} + +//---------------------------------------------------------------------- +// List::Prepend +// Same as Append, only put "item" on the front. +//---------------------------------------------------------------------- + +template +void List::Prepend(T item) +{ + ListElement *element = new ListElement(item); + + ASSERT(!this->IsInList(item)); + if (IsEmpty()) + { // list is empty + first = element; + last = element; + } + else + { // else put it before first + element->next = first; + first = element; + } + numInList++; + ASSERT(this->IsInList(item)); +} + +//---------------------------------------------------------------------- +// List::RemoveFront +// Remove the first "item" from the front of the list. +// List must not be empty. +// +// Returns: +// The removed item. +//---------------------------------------------------------------------- + +template +T List::RemoveFront() +{ + ListElement *element = first; + T thing; + + ASSERT(!IsEmpty()); + + thing = first->item; + if (first == last) + { // list had one item, now has none + first = NULL; + last = NULL; + } + else + { + first = element->next; + } + numInList--; + delete element; + return thing; +} + +//---------------------------------------------------------------------- +// List::Remove +// Remove a specific item from the list. Must be in the list! +//---------------------------------------------------------------------- + +template +void List::Remove(T item) +{ + ListElement *prev, *ptr; + T removed; + + ASSERT(this->IsInList(item)); + + // if first item on list is match, then remove from front + if (item == first->item) + { + removed = RemoveFront(); + ASSERT(item == removed); + } + else + { + prev = first; + for (ptr = first->next; ptr != NULL; prev = ptr, ptr = ptr->next) + { + if (item == ptr->item) + { + prev->next = ptr->next; + if (prev->next == NULL) + { + last = prev; + } + delete ptr; + numInList--; + break; + } + } + ASSERT(ptr != NULL); // should always find item! + } + ASSERT(!this->IsInList(item)); +} + +//---------------------------------------------------------------------- +// List::IsInList +// Return TRUE if the item is in the list. +//---------------------------------------------------------------------- + +template +bool List::IsInList(T item) const +{ + ListElement *ptr; + + for (ptr = first; ptr != NULL; ptr = ptr->next) + { + if (item == ptr->item) + { + return TRUE; + } + } + return FALSE; +} + +//---------------------------------------------------------------------- +// List::Apply +// Apply function to every item on a list. +// +// "func" -- the function to apply +//---------------------------------------------------------------------- + +template +void List::Apply(void (*func)(T)) const +{ + ListElement *ptr; + + for (ptr = first; ptr != NULL; ptr = ptr->next) + { + (*func)(ptr->item); + } +} + +//---------------------------------------------------------------------- +// SortedList::Insert +// Insert an "item" into a list, so that the list elements are +// sorted in increasing order. +// +// Allocate a ListElement to keep track of the item. +// If the list is empty, then this will be the only element. +// Otherwise, walk through the list, one element at a time, +// to find where the new item should be placed. +// +// "item" is the thing to put on the list. +//---------------------------------------------------------------------- + +template +void SortedList::Insert(T item) +{ + ListElement *element = new ListElement(item); + ListElement *ptr; // keep track + + ASSERT(!this->IsInList(item)); + if (this->IsEmpty()) + { // if list is empty, put at front + this->first = element; + this->last = element; + } + else if (compare(item, this->first->item) < 0) + { // item goes at front + element->next = this->first; + this->first = element; + } + else + { // look for first elt in list bigger than item + for (ptr = this->first; ptr->next != NULL; ptr = ptr->next) + { + if (compare(item, ptr->next->item) < 0) + { + element->next = ptr->next; + ptr->next = element; + this->numInList++; + return; + } + } + this->last->next = element; // item goes at end of list + this->last = element; + } + this->numInList++; + ASSERT(this->IsInList(item)); +} + +//---------------------------------------------------------------------- +// List::SanityCheck +// Test whether this is still a legal list. +// +// Tests: do I get to last starting from first? +// does the list have the right # of elements? +//---------------------------------------------------------------------- + +template +void List::SanityCheck() const +{ + ListElement *ptr; + int numFound; + + if (first == NULL) + { + ASSERT((numInList == 0) && (last == NULL)); + } + else if (first == last) + { + ASSERT((numInList == 1) && (last->next == NULL)); + } + else + { + for (numFound = 1, ptr = first; ptr != last; ptr = ptr->next) + { + numFound++; + ASSERT(numFound <= numInList); // prevent infinite loop + } + ASSERT(numFound == numInList); + ASSERT(last->next == NULL); + } +} + +//---------------------------------------------------------------------- +// List::SelfTest +// Test whether this module is working. +//---------------------------------------------------------------------- + +template +void List::SelfTest(T *p, int numEntries) +{ + int i; + ListIterator *iterator = new ListIterator(this); + + SanityCheck(); + // check various ways that list is empty + ASSERT(IsEmpty() && (first == NULL)); + for (; !iterator->IsDone(); iterator->Next()) + { + ASSERTNOTREACHED(); // nothing on list + } + + for (i = 0; i < numEntries; i++) + { + Append(p[i]); + ASSERT(this->IsInList(p[i])); + ASSERT(!IsEmpty()); + } + SanityCheck(); + + // should be able to get out everything we put in + for (i = 0; i < numEntries; i++) + { + Remove(p[i]); + ASSERT(!this->IsInList(p[i])); + } + ASSERT(IsEmpty()); + SanityCheck(); + delete iterator; +} + +//---------------------------------------------------------------------- +// SortedList::SanityCheck +// Test whether this is still a legal sorted list. +// +// Test: is the list sorted? +//---------------------------------------------------------------------- + +template +void SortedList::SanityCheck() const +{ + ListElement *prev, *ptr; + + List::SanityCheck(); + if (this->first != this->last) + { + for (prev = this->first, ptr = this->first->next; ptr != NULL; + prev = ptr, ptr = ptr->next) + { + ASSERT(compare(prev->item, ptr->item) <= 0); + } + } +} + +//---------------------------------------------------------------------- +// SortedList::SelfTest +// Test whether this module is working. +//---------------------------------------------------------------------- + +template +void SortedList::SelfTest(T *p, int numEntries) +{ + int i; + T *q = new T[numEntries]; + + List::SelfTest(p, numEntries); + + for (i = 0; i < numEntries; i++) + { + Insert(p[i]); + ASSERT(this->IsInList(p[i])); + } + SanityCheck(); + + // should be able to get out everything we put in + for (i = 0; i < numEntries; i++) + { + q[i] = this->RemoveFront(); + ASSERT(!this->IsInList(q[i])); + } + ASSERT(this->IsEmpty()); + + // make sure everything came out in the right order + for (i = 0; i < (numEntries - 1); i++) + { + ASSERT(compare(q[i], q[i + 1]) <= 0); + } + SanityCheck(); + + delete q; +} \ No newline at end of file diff --git a/code/lib/list.h b/code/lib/list.h new file mode 100644 index 0000000..f780069 --- /dev/null +++ b/code/lib/list.h @@ -0,0 +1,142 @@ +// list.h +// Data structures to manage LISP-like lists. +// +// As in LISP, a list can contain any type of data structure +// as an item on the list: thread control blocks, +// pending interrupts, etc. Allocation and deallocation of the +// items on the list are to be done by the caller. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef LIST_H +#define LIST_H + +#include "copyright.h" +#include "debug.h" + +// The following class defines a "list element" -- which is +// used to keep track of one item on a list. It is equivalent to a +// LISP cell, with a "car" ("next") pointing to the next element on the list, +// and a "cdr" ("item") pointing to the item on the list. +// +// This class is private to this module (and classes that inherit +// from this module). Made public for notational convenience. + +template +class ListElement { + public: + ListElement(T itm); // initialize a list element + ListElement *next; // next element on list, NULL if this is last + T item; // item on the list +}; + +// The following class defines a "list" -- a singly linked list of +// list elements, each of which points to a single item on the list. +// The class has been tested only for primitive types (ints, pointers); +// no guarantees it will work in general. For instance, all types +// to be inserted into a list must have a "==" operator defined. + +template class ListIterator; + +template +class List { + public: + List(); // initialize the list + virtual ~List(); // de-allocate the list + + virtual void Prepend(T item);// Put item at the beginning of the list + virtual void Append(T item); // Put item at the end of the list + + T Front() { return first->item; } + // Return first item on list + // without removing it + T RemoveFront(); // Take item off the front of the list + void Remove(T item); // Remove specific item from list + + bool IsInList(T item) const;// is the item in the list? + + unsigned int NumInList() { return numInList;}; + // how many items in the list? + bool IsEmpty() { return (numInList == 0); }; + // is the list empty? + + void Apply(void (*f)(T)) const; + // apply function to all elements in list + + virtual void SanityCheck() const; + // has this list been corrupted? + void SelfTest(T *p, int numEntries); + // verify module is working + + protected: + ListElement *first; // Head of the list, NULL if list is empty + ListElement *last; // Last element of list + int numInList; // number of elements in list + + friend class ListIterator; +}; + +// The following class defines a "sorted list" -- a singly linked list of +// list elements, arranged so that "Remove" always returns the smallest +// element. +// All types to be inserted onto a sorted list must have a "Compare" +// function defined: +// int Compare(T x, T y) +// returns -1 if x < y +// returns 0 if x == y +// returns 1 if x > y + +template +class SortedList : public List { + public: + SortedList(int (*comp)(T x, T y)) : List() { compare = comp;}; + ~SortedList() {}; // base class destructor called automatically + + void Insert(T item); // insert an item onto the list in sorted order + + void SanityCheck() const; // has this list been corrupted? + void SelfTest(T *p, int numEntries); + // verify module is working + + private: + int (*compare)(T x, T y); // function for sorting list elements + + void Prepend(T item) { Insert(item); } // *pre*pending has no meaning + // in a sorted list + void Append(T item) { Insert(item); } // neither does *ap*pend + +}; + +// The following class can be used to step through a list. +// Example code: +// ListIterator *iter(list); +// +// for (; !iter->IsDone(); iter->Next()) { +// Operation on iter->Item() +// } + +template +class ListIterator { + public: + ListIterator(List *list) { current = list->first; } + // initialize an iterator + + bool IsDone() { return current == NULL; }; + // return TRUE if we are at the end of the list + + T Item() { ASSERT(!IsDone()); return current->item; }; + // return current element on list + + void Next() { current = current->next; }; + // update iterator to point to next + + private: + ListElement *current; // where we are in the list +}; + +#include "list.cc" // templates are really like macros + // so needs to be included in every + // file that uses the template +#endif // LIST_H diff --git a/code/lib/sysdep.cc b/code/lib/sysdep.cc new file mode 100644 index 0000000..a83c8da --- /dev/null +++ b/code/lib/sysdep.cc @@ -0,0 +1,571 @@ +// sysdep.cc +// Implementation of system-dependent interface. Nachos uses the +// routines defined here, rather than directly calling the UNIX library, +// to simplify porting between versions of UNIX, and even to +// other systems, such as MSDOS. +// +// On UNIX, almost all of these routines are simple wrappers +// for the underlying UNIX system calls. +// +// NOTE: all of these routines refer to operations on the underlying +// host machine (e.g., the DECstation, SPARC, etc.), supporting the +// Nachos simulation code. Nachos implements similar operations, +// (such as opening a file), but those are implemented in terms +// of hardware devices, which are simulated by calls to the underlying +// routines in the host workstation OS. +// +// This file includes lots of calls to C routines. C++ requires +// us to wrap all C definitions with a "extern "C" block". +// This prevents the internal forms of the names from being +// changed by the C++ compiler. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "debug.h" +#include "sysdep.h" +#include +#include +#include +#include +#include +#include +#include + +#ifdef SOLARIS +// KMS +// for open() +#include +#endif + +#ifdef LINUX // at this point, linux doesn't support mprotect +#define NO_MPROT +#endif +#ifdef DOS // neither does DOS +#define NO_MPROT +#endif + +extern "C" { +#include +#include + +#ifndef NO_MPROT +#include +#endif + +// UNIX routines called by procedures in this file + +#if defined CYGWIN + size_t getpagesize(void); +#else + int getpagesize(void); +#endif +unsigned sleep(unsigned); +//#ifdef SOLARIS +//int usleep(useconds_t); +//#else +//void usleep(unsigned int); // rcgood - to avoid spinning processes. +//#endif + + +#ifndef NO_MPROT + +#ifdef OSF +#define OSF_OR_AIX +#endif +#ifdef AIX +#define OSF_OR_AIX +#endif + +#ifdef OSF_OR_AIX +int mprotect(const void *, long unsigned int, int); +#else +int mprotect(char *, unsigned int, int); +#endif +#endif + +#if defined(BSD) || defined(SOLARIS) || defined(LINUX) +//KMS +// added Solaris and LINUX +int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, + struct timeval *timeout); +#else +int select(int numBits, void *readFds, void *writeFds, void *exceptFds, + struct timeval *timeout); +#endif + +int socket(int, int, int); + +#if defined(SUNOS) || defined(ULTRIX) +long tell(int); +int bind (int, const void*, int); +int recvfrom (int, void*, int, int, void*, int *); +int sendto (int, const void*, int, int, void*, int); +#endif + +} + +//---------------------------------------------------------------------- +// CallOnUserAbort +// Arrange that "func" will be called when the user aborts (e.g., by +// hitting ctl-C. +//---------------------------------------------------------------------- + +void +CallOnUserAbort(void (*func)(int)) +{ + (void)signal(SIGINT, func); +} + +//---------------------------------------------------------------------- +// Delay +// Put the UNIX process running Nachos to sleep for x seconds, +// to give the user time to start up another invocation of Nachos +// in a different UNIX shell. +//---------------------------------------------------------------------- + +void +Delay(int seconds) +{ + (void) sleep((unsigned) seconds); +} + +//---------------------------------------------------------------------- +// UDelay +// Put the UNIX process running Nachos to sleep for x microseconds, +// to prevent an idle Nachos process from spinning... +//---------------------------------------------------------------------- + +void +UDelay(unsigned int useconds) +{ +//#ifdef SOLARIS +// usleep(useconds_t useconds); +//#else +// usleep(useconds); +//#endif /* SOLARIS */ + +} + +//---------------------------------------------------------------------- +// Abort +// Quit and drop core. +//---------------------------------------------------------------------- + +void +Abort() +{ + abort(); +} + +//---------------------------------------------------------------------- +// Exit +// Quit without dropping core. +//---------------------------------------------------------------------- + +void +Exit(int exitCode) +{ + exit(exitCode); +} + +//---------------------------------------------------------------------- +// RandomInit +// Initialize the pseudo-random number generator. We use the +// now obsolete "srand" and "rand" because they are more portable! +//---------------------------------------------------------------------- + +void +RandomInit(unsigned seed) +{ + srand(seed); +} + +//---------------------------------------------------------------------- +// RandomNumber +// Return a pseudo-random number. +//---------------------------------------------------------------------- + +unsigned int +RandomNumber() +{ + return rand(); +} + +//---------------------------------------------------------------------- +// AllocBoundedArray +// Return an array, with the two pages just before +// and after the array unmapped, to catch illegal references off +// the end of the array. Particularly useful for catching overflow +// beyond fixed-size thread execution stacks. +// +// Note: Just return the useful part! +// +// "size" -- amount of useful space needed (in bytes) +//---------------------------------------------------------------------- + +char * +AllocBoundedArray(int size) +{ +#ifdef NO_MPROT + return new char[size]; +#else + int pgSize = getpagesize(); + char *ptr = new char[pgSize * 2 + size]; + + mprotect(ptr, pgSize, 0); + mprotect(ptr + pgSize + size, pgSize, 0); + return ptr + pgSize; +#endif +} + +//---------------------------------------------------------------------- +// DeallocBoundedArray +// Deallocate an array of integers, unprotecting its two boundary pages. +// +// "ptr" -- the array to be deallocated +// "size" -- amount of useful space in the array (in bytes) +//---------------------------------------------------------------------- + +#ifdef NO_MPROT +void +DeallocBoundedArray(char *ptr, int /* size */) +{ + delete [] ptr; +} +#else +void +DeallocBoundedArray(char *ptr, int size) +{ + int pgSize = getpagesize(); + + mprotect(ptr - pgSize, pgSize, PROT_READ | PROT_WRITE | PROT_EXEC); + mprotect(ptr + size, pgSize, PROT_READ | PROT_WRITE | PROT_EXEC); + delete [] (ptr - pgSize); +} +#endif + +//---------------------------------------------------------------------- +// PollFile +// Check open file or open socket to see if there are any +// characters that can be read immediately. If so, read them +// in, and return TRUE. +// +// "fd" -- the file descriptor of the file to be polled +//---------------------------------------------------------------------- + +bool +PollFile(int fd) +{ +#if defined(SOLARIS) || defined(LINUX) +// KMS + fd_set rfd,wfd,xfd; +#else + int rfd = (1 << fd), wfd = 0, xfd = 0; +#endif + int retVal; + struct timeval pollTime; + +#if defined(SOLARIS) || defined(LINUX) +// KMS + FD_ZERO(&rfd); + FD_ZERO(&wfd); + FD_ZERO(&xfd); + FD_SET(fd,&rfd); +#endif + +// don't wait if there are no characters on the file + pollTime.tv_sec = 0; + pollTime.tv_usec = 0; + +// poll file or socket +#if defined(BSD) + retVal = select(32, (fd_set*)&rfd, (fd_set*)&wfd, (fd_set*)&xfd, &pollTime); +#elif defined(SOLARIS) || defined(LINUX) + // KMS + retVal = select(32, &rfd, &wfd, &xfd, &pollTime); +#else + retVal = select(32, &rfd, &wfd, &xfd, &pollTime); +#endif + + ASSERT((retVal == 0) || (retVal == 1)); + if (retVal == 0) + return FALSE; // no char waiting to be read + return TRUE; +} + +//---------------------------------------------------------------------- +// OpenForWrite +// Open a file for writing. Create it if it doesn't exist; truncate it +// if it does already exist. Return the file descriptor. +// +// "name" -- file name +//---------------------------------------------------------------------- + +int +OpenForWrite(char *name) +{ + int fd = open(name, O_RDWR|O_CREAT|O_TRUNC, 0666); + + ASSERT(fd >= 0); + return fd; +} + +//---------------------------------------------------------------------- +// OpenForReadWrite +// Open a file for reading or writing. +// Return the file descriptor, or error if it doesn't exist. +// +// "name" -- file name +//---------------------------------------------------------------------- + +int +OpenForReadWrite(char *name, bool crashOnError) +{ + int fd = open(name, O_RDWR, 0); + + ASSERT(!crashOnError || fd >= 0); + return fd; +} + +//---------------------------------------------------------------------- +// Read +// Read characters from an open file. Abort if read fails. +//---------------------------------------------------------------------- + +void +Read(int fd, char *buffer, int nBytes) +{ + int retVal = read(fd, buffer, nBytes); + ASSERT(retVal == nBytes); +} + +//---------------------------------------------------------------------- +// ReadPartial +// Read characters from an open file, returning as many as are +// available. +//---------------------------------------------------------------------- + +int +ReadPartial(int fd, char *buffer, int nBytes) +{ + return read(fd, buffer, nBytes); +} + + +//---------------------------------------------------------------------- +// WriteFile +// Write characters to an open file. Abort if write fails. +//---------------------------------------------------------------------- + +void +WriteFile(int fd, char *buffer, int nBytes) +{ + int retVal = write(fd, buffer, nBytes); + ASSERT(retVal == nBytes); +} + +//---------------------------------------------------------------------- +// Lseek +// Change the location within an open file. Abort on error. +//---------------------------------------------------------------------- + +void +Lseek(int fd, int offset, int whence) +{ + int retVal = lseek(fd, offset, whence); + ASSERT(retVal >= 0); +} + +//---------------------------------------------------------------------- +// Tell +// Report the current location within an open file. +//---------------------------------------------------------------------- + +int +Tell(int fd) +{ +#if defined(BSD) || defined(SOLARIS) || defined(LINUX) + return lseek(fd,0,SEEK_CUR); // 386BSD doesn't have the tell() system call + // neither do Solaris and Linux -KMS +#else + return tell(fd); +#endif +} + + +//---------------------------------------------------------------------- +// Close +// Close a file. Abort on error. +//---------------------------------------------------------------------- + +int +Close(int fd) +{ + int retVal = close(fd); + ASSERT(retVal >= 0); + return retVal; +} + +//---------------------------------------------------------------------- +// Unlink +// Delete a file. +//---------------------------------------------------------------------- + +bool +Unlink(char *name) +{ + return unlink(name); +} + +//---------------------------------------------------------------------- +// OpenSocket +// Open an interprocess communication (IPC) connection. For now, +// just open a datagram port where other Nachos (simulating +// workstations on a network) can send messages to this Nachos. +//---------------------------------------------------------------------- + +int +OpenSocket() +{ + int sockID; + + sockID = socket(AF_UNIX, SOCK_DGRAM, 0); + ASSERT(sockID >= 0); + + return sockID; +} + +//---------------------------------------------------------------------- +// CloseSocket +// Close the IPC connection. +//---------------------------------------------------------------------- + +void +CloseSocket(int sockID) +{ + (void) close(sockID); +} + +//---------------------------------------------------------------------- +// InitSocketName +// Initialize a UNIX socket address -- magical! +//---------------------------------------------------------------------- + +static void +InitSocketName(struct sockaddr_un *uname, char *name) +{ + uname->sun_family = AF_UNIX; + strcpy(uname->sun_path, name); +} + +//---------------------------------------------------------------------- +// AssignNameToSocket +// Give a UNIX file name to the IPC port, so other instances of Nachos +// can locate the port. +//---------------------------------------------------------------------- + +void +AssignNameToSocket(char *socketName, int sockID) +{ + struct sockaddr_un uName; + int retVal; + + (void) unlink(socketName); // in case it's still around from last time + + InitSocketName(&uName, socketName); + retVal = bind(sockID, (struct sockaddr *) &uName, sizeof(uName)); + ASSERT(retVal >= 0); + DEBUG(dbgNet, "Created socket " << socketName); +} + +//---------------------------------------------------------------------- +// DeAssignNameToSocket +// Delete the UNIX file name we assigned to our IPC port, on cleanup. +//---------------------------------------------------------------------- +void +DeAssignNameToSocket(char *socketName) +{ + (void) unlink(socketName); +} + +//---------------------------------------------------------------------- +// PollSocket +// Return TRUE if there are any messages waiting to arrive on the +// IPC port. +//---------------------------------------------------------------------- +bool +PollSocket(int sockID) +{ + return PollFile(sockID); // on UNIX, socket ID's are just file ID's +} + +//---------------------------------------------------------------------- +// ReadFromSocket +// Read a fixed size packet off the IPC port. Abort on error. +//---------------------------------------------------------------------- +void +ReadFromSocket(int sockID, char *buffer, int packetSize) +{ + int retVal; + struct sockaddr_un uName; +#ifdef LINUX + socklen_t size = sizeof(uName); +#else + int size = sizeof(uName); +#endif + + retVal = recvfrom(sockID, buffer, packetSize, 0, + (struct sockaddr *) &uName, &size); + + if (retVal != packetSize) { + perror("in recvfrom"); +#if defined CYGWIN + cerr << "called with " << packetSize << ", got back " << retVal + << ", and " << "\n"; +#else + cerr << "called with " << packetSize << ", got back " << retVal + << ", and " << errno << "\n"; +#endif + } + ASSERT(retVal == packetSize); +} + +//---------------------------------------------------------------------- +// modified by KMS to add retry... +// SendToSocket +// Transmit a fixed size packet to another Nachos' IPC port. +// Try 10 times with a one second delay between attempts. +// This is useful, e.g., to give the other socket a chance +// to get set up. +// Terminate if we still fail after 10 tries. +//---------------------------------------------------------------------- +void +SendToSocket(int sockID, char *buffer, int packetSize, char *toName) +{ + struct sockaddr_un uName; + int retVal; + int retryCount; + + InitSocketName(&uName, toName); + + for(retryCount=0;retryCount < 10;retryCount++) { + retVal = sendto(sockID, buffer, packetSize, 0, + (struct sockaddr *) &uName, sizeof(uName)); + if (retVal == packetSize) return; + // if we did not succeed, we should see a negative + // return value indicating complete failure. If we + // don't, something fishy is going on... + ASSERT(retVal < 0); + // wait a second before trying again + Delay(1); + } + // At this point, we have failed many times + // The most common reason for this is that the target machine + // has halted and its socket no longer exists. + // We simply do nothing (drop the packet). + // This may mask other kinds of failures, but it is the + // right thing to do in the common case. +} diff --git a/code/lib/sysdep.h b/code/lib/sysdep.h new file mode 100644 index 0000000..a4e861e --- /dev/null +++ b/code/lib/sysdep.h @@ -0,0 +1,75 @@ +// sysdep.h +// System-dependent interface. Nachos uses the routines defined +// here, rather than directly calling the UNIX library functions, to +// simplify porting between versions of UNIX, and even to +// other systems, such as MSDOS and the Macintosh. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef SYSDEP_H +#define SYSDEP_H + +#include "copyright.h" +#include +#include +#include +#include + +using namespace std; + +// Process control: abort, exit, and sleep +extern void Abort(); +extern void Exit(int exitCode); +extern void Delay(int seconds); +extern void UDelay(unsigned int usec);// rcgood - to avoid spinners. + +// Initialize system so that cleanUp routine is called when user hits ctl-C +extern void CallOnUserAbort(void (*cleanup)(int)); + +// Initialize the pseudo random number generator +extern void RandomInit(unsigned seed); +extern unsigned int RandomNumber(); + +// Allocate, de-allocate an array, such that de-referencing +// just beyond either end of the array will cause an error +extern char *AllocBoundedArray(int size); +extern void DeallocBoundedArray(char *p, int size); + +// Check file to see if there are any characters to be read. +// If no characters in the file, return without waiting. +extern bool PollFile(int fd); + +// File operations: open/read/write/lseek/close, and check for error +// For simulating the disk and the console devices. +extern int OpenForWrite(char *name); +extern int OpenForReadWrite(char *name, bool crashOnError); +extern void Read(int fd, char *buffer, int nBytes); +extern int ReadPartial(int fd, char *buffer, int nBytes); +extern void WriteFile(int fd, char *buffer, int nBytes); +extern void Lseek(int fd, int offset, int whence); +extern int Tell(int fd); +extern int Close(int fd); +extern bool Unlink(char *name); + +// Other C library routines that are used by Nachos. +// These are assumed to be portable, so we don't include a wrapper. +extern "C" { +int atoi(const char *str); +double atof(const char *str); +int abs(int i); +void bcopy(const void *s1, void *s2, size_t n); +void bzero(void *s, size_t n); +} + +// Interprocess communication operations, for simulating the network +extern int OpenSocket(); +extern void CloseSocket(int sockID); +extern void AssignNameToSocket(char *socketName, int sockID); +extern void DeAssignNameToSocket(char *socketName); +extern bool PollSocket(int sockID); +extern void ReadFromSocket(int sockID, char *buffer, int packetSize); +extern void SendToSocket(int sockID, char *buffer, int packetSize,char *toName); + +#endif // SYSDEP_H diff --git a/code/lib/utility.h b/code/lib/utility.h new file mode 100644 index 0000000..9c79d89 --- /dev/null +++ b/code/lib/utility.h @@ -0,0 +1,38 @@ +// utility.h +// Miscellaneous useful definitions. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef UTILITY_H +#define UTILITY_H + +#include "copyright.h" + +// Miscellaneous useful routines + +#define NULL 0 +#define TRUE true +#define FALSE false +// #define bool int // necessary on the Mac? + +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#define max(a,b) (((a) > (b)) ? (a) : (b)) + +// Divide and either round up or down +#define divRoundDown(n,s) ((n) / (s)) +#define divRoundUp(n,s) (((n) / (s)) + ((((n) % (s)) > 0) ? 1 : 0)) + +// This declares the type "VoidFunctionPtr" to be a "pointer to a +// function taking an arbitrary pointer argument and returning nothing". With +// such a function pointer (say it is "func"), we can call it like this: +// +// (*func) ("help!"); +// +// This is used by Thread::Fork as well as a couple of other places. + +typedef void (*VoidFunctionPtr)(void *arg); +typedef void (*VoidNoArgFunctionPtr)(); + +#endif // UTILITY_H diff --git a/code/machine/callback.h b/code/machine/callback.h new file mode 100644 index 0000000..da36341 --- /dev/null +++ b/code/machine/callback.h @@ -0,0 +1,44 @@ +// callback.h +// Data structure to allow an object to register a "callback". +// On an asynchronous operation, the call to start the operation +// returns immediately. When the operation completes, the called +// object must somehow notify the caller of the completion. +// In the general case, the called object doesn't know the type +// of the caller. +// +// We implement this using virtual functions in C++. An object +// that needs to register a callback is set up as a derived class of +// the abstract base class "CallbackObj". When we pass a +// pointer to the object to a lower level module, that module +// calls back via "obj->CallBack()", without knowing the +// type of the object being called back. +// +// Note that this isn't a general-purpose mechanism, +// because a class can only register a single callback. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. +// + +#ifndef CALLBACK_H +#define CALLBACK_H + +#include "copyright.h" + +// Abstract base class for objects that register callbacks + +class CallBackObj { + public: + virtual void CallBack() = 0; + protected: + CallBackObj() {}; // to prevent anyone from creating + // an instance of this class. Only + // allow creation of instances of + // classes derived from this class. + virtual ~CallBackObj() {}; +}; + +#endif diff --git a/code/machine/console.cc b/code/machine/console.cc new file mode 100644 index 0000000..9f9514c --- /dev/null +++ b/code/machine/console.cc @@ -0,0 +1,174 @@ +// console.cc +// Routines to simulate a serial port to a console device. +// A console has input (a keyboard) and output (a display). +// These are each simulated by operations on UNIX files. +// The simulated device is asynchronous, so we have to invoke +// the interrupt handler (after a simulated delay), to signal that +// a byte has arrived and/or that a written byte has departed. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "console.h" +#include "main.h" +#include "stdio.h" +//---------------------------------------------------------------------- +// ConsoleInput::ConsoleInput +// Initialize the simulation of the input for a hardware console device. +// +// "readFile" -- UNIX file simulating the keyboard (NULL -> use stdin) +// "toCall" is the interrupt handler to call when a character arrives +// from the keyboard +//---------------------------------------------------------------------- + +ConsoleInput::ConsoleInput(char *readFile, CallBackObj *toCall) +{ + if (readFile == NULL) + readFileNo = 0; // keyboard = stdin + else + readFileNo = OpenForReadWrite(readFile, TRUE); // should be read-only + + // set up the stuff to emulate asynchronous interrupts + callWhenAvail = toCall; + incoming = EOF; + + // start polling for incoming keystrokes + kernel->interrupt->Schedule(this, ConsoleTime, ConsoleReadInt); +} + +//---------------------------------------------------------------------- +// ConsoleInput::~ConsoleInput +// Clean up console input emulation +//---------------------------------------------------------------------- + +ConsoleInput::~ConsoleInput() +{ + if (readFileNo != 0) + Close(readFileNo); +} + + +//---------------------------------------------------------------------- +// ConsoleInput::CallBack() +// Simulator calls this when a character may be available to be +// read in from the simulated keyboard (eg, the user typed something). +// +// First check to make sure character is available. +// Then invoke the "callBack" registered by whoever wants the character. +//---------------------------------------------------------------------- + +void +ConsoleInput::CallBack() +{ + char c; + int readCount; + + ASSERT(incoming == EOF); + if (!PollFile(readFileNo)) { // nothing to be read + // schedule the next time to poll for a packet + kernel->interrupt->Schedule(this, ConsoleTime, ConsoleReadInt); + } else { + // otherwise, try to read a character + readCount = ReadPartial(readFileNo, &c, sizeof(char)); + if (readCount == 0) { + // this seems to happen at end of file, when the + // console input is a regular file + // don't schedule an interrupt, since there will never + // be any more input + // just do nothing.... + } + else { + // save the character and notify the OS that + // it is available + ASSERT(readCount == sizeof(char)); + incoming = c; + kernel->stats->numConsoleCharsRead++; + } + callWhenAvail->CallBack(); + } +} + +//---------------------------------------------------------------------- +// ConsoleInput::GetChar() +// Read a character from the input buffer, if there is any there. +// Either return the character, or EOF if none buffered. +//---------------------------------------------------------------------- + +char +ConsoleInput::GetChar() +{ + char ch = incoming; + + if (incoming != EOF) { // schedule when next char will arrive + kernel->interrupt->Schedule(this, ConsoleTime, ConsoleReadInt); + } + incoming = EOF; + return ch; +} + + + +//---------------------------------------------------------------------- +// ConsoleOutput::ConsoleOutput +// Initialize the simulation of the output for a hardware console device. +// +// "writeFile" -- UNIX file simulating the display (NULL -> use stdout) +// "toCall" is the interrupt handler to call when a write to +// the display completes. +//---------------------------------------------------------------------- + +ConsoleOutput::ConsoleOutput(char *writeFile, CallBackObj *toCall) +{ + if (writeFile == NULL) + writeFileNo = 1; // display = stdout + else + writeFileNo = OpenForWrite(writeFile); + + callWhenDone = toCall; + putBusy = FALSE; +} + +//---------------------------------------------------------------------- +// ConsoleOutput::~ConsoleOutput +// Clean up console output emulation +//---------------------------------------------------------------------- + +ConsoleOutput::~ConsoleOutput() +{ + if (writeFileNo != 1) + Close(writeFileNo); +} + +//---------------------------------------------------------------------- +// ConsoleOutput::CallBack() +// Simulator calls this when the next character can be output to the +// display. +//---------------------------------------------------------------------- + +void +ConsoleOutput::CallBack() +{ + putBusy = FALSE; + kernel->stats->numConsoleCharsWritten++; + callWhenDone->CallBack(); +} + +//---------------------------------------------------------------------- +// ConsoleOutput::PutChar() +// Write a character to the simulated display, schedule an interrupt +// to occur in the future, and return. +//---------------------------------------------------------------------- + +void +ConsoleOutput::PutChar(char ch) +{ + ASSERT(putBusy == FALSE); + WriteFile(writeFileNo, &ch, sizeof(char)); + putBusy = TRUE; + kernel->interrupt->Schedule(this, ConsoleTime, ConsoleWriteInt); +} + diff --git a/code/machine/console.h b/code/machine/console.h new file mode 100644 index 0000000..24516a7 --- /dev/null +++ b/code/machine/console.h @@ -0,0 +1,90 @@ +// console.h +// Data structures to simulate the behavior of a terminal +// I/O device. A terminal has two parts -- a keyboard input, +// and a display output, each of which produces/accepts +// characters sequentially. +// +// The console hardware device is asynchronous. When a character is +// written to the device, the routine returns immediately, and an +// interrupt handler is called later when the I/O completes. +// For reads, an interrupt handler is called when a character arrives. +// +// In either case, the serial line connecting the computer +// to the console has limited bandwidth (like a modem!), and so +// each character takes measurable time. +// +// The user of the device registers itself to be called "back" when +// the read/write interrupts occur. There is a separate interrupt +// for read and write, and the device is "duplex" -- a character +// can be outgoing and incoming at the same time. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef CONSOLE_H +#define CONSOLE_H + +#include "copyright.h" +#include "utility.h" +#include "callback.h" + +// The following two classes define the input (and output) side of a +// hardware console device. Input (and output) to the device is simulated +// by reading (and writing) to the UNIX file "readFile" (and "writeFile"). +// +// Since input (and output) to the device is asynchronous, the interrupt +// handler "callWhenAvail" is called when a character has arrived to be +// read in (and "callWhenDone" is called when an output character has been +// "put" so that the next character can be written). +// +// In practice, usually a single hardware thing that does both +// serial input and serial output. But conceptually simpler to +// use two objects. + +class ConsoleInput : public CallBackObj { + public: + ConsoleInput(char *readFile, CallBackObj *toCall); + // initialize hardware console input + ~ConsoleInput(); // clean up console emulation + + char GetChar(); // Poll the console input. If a char is + // available, return it. Otherwise, return EOF. + // "callWhenAvail" is called whenever there is + // a char to be gotten + + void CallBack(); // Invoked when a character arrives + // from the keyboard. + + private: + int readFileNo; // UNIX file emulating the keyboard + CallBackObj *callWhenAvail; // Interrupt handler to call when + // there is a char to be read + char incoming; // Contains the character to be read, + // if there is one available. + // Otherwise contains EOF. +}; + +class ConsoleOutput : public CallBackObj { + public: + ConsoleOutput(char *writeFile, CallBackObj *toCall); + // initialize hardware console output + ~ConsoleOutput(); // clean up console emulation + + void PutChar(char ch); // Write "ch" to the console display, + // and return immediately. "callWhenDone" + // will called when the I/O completes. + void CallBack(); // Invoked when next character can be put + // out to the display. + + private: + int writeFileNo; // UNIX file emulating the display + CallBackObj *callWhenDone; // Interrupt handler to call when + // the next char can be put + bool putBusy; // Is a PutChar operation in progress? + // If so, you can't do another one! +}; + +#endif // CONSOLE_H diff --git a/code/machine/disk.cc b/code/machine/disk.cc new file mode 100644 index 0000000..f20b9d1 --- /dev/null +++ b/code/machine/disk.cc @@ -0,0 +1,268 @@ +// disk.cc +// Routines to simulate a physical disk device; reading and writing +// to the disk is simulated as reading and writing to a UNIX file. +// See disk.h for details about the behavior of disks (and +// therefore about the behavior of this simulation). +// +// Disk operations are asynchronous, so we have to invoke an interrupt +// handler when the simulated operation completes. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "disk.h" +#include "debug.h" +#include "sysdep.h" +#include "main.h" + +// We put a magic number at the front of the UNIX file representing the +// disk, to make it less likely we will accidentally treat a useful file +// as a disk (which would probably trash the file's contents). + +const int MagicNumber = 0x456789ab; +const int MagicSize = sizeof(int); +const int DiskSize = (MagicSize + (NumSectors * SectorSize)); + + +//---------------------------------------------------------------------- +// Disk::Disk() +// Initialize a simulated disk. Open the UNIX file (creating it +// if it doesn't exist), and check the magic number to make sure it's +// ok to treat it as Nachos disk storage. +// +// "toCall" -- object to call when disk read/write request completes +//---------------------------------------------------------------------- + +Disk::Disk(CallBackObj *toCall) +{ + int magicNum; + int tmp = 0; + + DEBUG(dbgDisk, "Initializing the disk."); + callWhenDone = toCall; + lastSector = 0; + bufferInit = 0; + + sprintf(diskname,"DISK_%d",kernel->hostName); + fileno = OpenForReadWrite(diskname, FALSE); + if (fileno >= 0) { // file exists, check magic number + Read(fileno, (char *) &magicNum, MagicSize); + ASSERT(magicNum == MagicNumber); + } else { // file doesn't exist, create it + fileno = OpenForWrite(diskname); + magicNum = MagicNumber; + WriteFile(fileno, (char *) &magicNum, MagicSize); // write magic number + + // need to write at end of file, so that reads will not return EOF + Lseek(fileno, DiskSize - sizeof(int), 0); + WriteFile(fileno, (char *)&tmp, sizeof(int)); + } + active = FALSE; +} + +//---------------------------------------------------------------------- +// Disk::~Disk() +// Clean up disk simulation, by closing the UNIX file representing the +// disk. +//---------------------------------------------------------------------- + +Disk::~Disk() +{ + Close(fileno); +} + +//---------------------------------------------------------------------- +// Disk::PrintSector() +// Dump the data in a disk read/write request, for debugging. +//---------------------------------------------------------------------- + +static void +PrintSector (bool writing, int sector, char *data) +{ + int *p = (int *) data; + + if (writing) + cout << "Writing sector: " << sector << "\n"; + else + cout << "Reading sector: " << sector << "\n"; + for (unsigned int i = 0; i < (SectorSize/sizeof(int)); i++) { + cout << p[i] << " "; + } + cout << "\n"; +} + +//---------------------------------------------------------------------- +// Disk::ReadRequest/WriteRequest +// Simulate a request to read/write a single disk sector +// Do the read/write immediately to the UNIX file +// Set up an interrupt handler to be called later, +// that will notify the caller when the simulator says +// the operation has completed. +// +// Note that a disk only allows an entire sector to be read/written, +// not part of a sector. +// +// "sectorNumber" -- the disk sector to read/write +// "data" -- the bytes to be written, the buffer to hold the incoming bytes +//---------------------------------------------------------------------- + +void +Disk::ReadRequest(int sectorNumber, char* data) +{ + int ticks = ComputeLatency(sectorNumber, FALSE); + + ASSERT(!active); // only one request at a time + ASSERT((sectorNumber >= 0) && (sectorNumber < NumSectors)); + + DEBUG(dbgDisk, "Reading from sector " << sectorNumber); + Lseek(fileno, SectorSize * sectorNumber + MagicSize, 0); + Read(fileno, data, SectorSize); + if (debug->IsEnabled('d')) + PrintSector(FALSE, sectorNumber, data); + + active = TRUE; + UpdateLast(sectorNumber); + kernel->stats->numDiskReads++; + kernel->interrupt->Schedule(this, ticks, DiskInt); +} + +void +Disk::WriteRequest(int sectorNumber, char* data) +{ + int ticks = ComputeLatency(sectorNumber, TRUE); + + ASSERT(!active); + ASSERT((sectorNumber >= 0) && (sectorNumber < NumSectors)); + + DEBUG(dbgDisk, "Writing to sector " << sectorNumber); + Lseek(fileno, SectorSize * sectorNumber + MagicSize, 0); + WriteFile(fileno, data, SectorSize); + if (debug->IsEnabled('d')) + PrintSector(TRUE, sectorNumber, data); + + active = TRUE; + UpdateLast(sectorNumber); + kernel->stats->numDiskWrites++; + kernel->interrupt->Schedule(this, ticks, DiskInt); +} + +//---------------------------------------------------------------------- +// Disk::CallBack() +// Called by the machine simulation when the disk interrupt occurs. +//---------------------------------------------------------------------- + +void +Disk::CallBack () +{ + active = FALSE; + callWhenDone->CallBack(); +} + +//---------------------------------------------------------------------- +// Disk::TimeToSeek() +// Returns how long it will take to position the disk head over the correct +// track on the disk. Since when we finish seeking, we are likely +// to be in the middle of a sector that is rotating past the head, +// we also return how long until the head is at the next sector boundary. +// +// Disk seeks at one track per SeekTime ticks (cf. stats.h) +// and rotates at one sector per RotationTime ticks +//---------------------------------------------------------------------- + +int +Disk::TimeToSeek(int newSector, int *rotation) +{ + int newTrack = newSector / SectorsPerTrack; + int oldTrack = lastSector / SectorsPerTrack; + int seek = abs(newTrack - oldTrack) * SeekTime; + // how long will seek take? + int over = (kernel->stats->totalTicks + seek) % RotationTime; + // will we be in the middle of a sector when + // we finish the seek? + + *rotation = 0; + if (over > 0) // if so, need to round up to next full sector + *rotation = RotationTime - over; + return seek; +} + +//---------------------------------------------------------------------- +// Disk::ModuloDiff() +// Return number of sectors of rotational delay between target sector +// "to" and current sector position "from" +//---------------------------------------------------------------------- + +int +Disk::ModuloDiff(int to, int from) +{ + int toOffset = to % SectorsPerTrack; + int fromOffset = from % SectorsPerTrack; + + return ((toOffset - fromOffset) + SectorsPerTrack) % SectorsPerTrack; +} + +//---------------------------------------------------------------------- +// Disk::ComputeLatency() +// Return how long will it take to read/write a disk sector, from +// the current position of the disk head. +// +// Latency = seek time + rotational latency + transfer time +// Disk seeks at one track per SeekTime ticks (cf. stats.h) +// and rotates at one sector per RotationTime ticks +// +// To find the rotational latency, we first must figure out where the +// disk head will be after the seek (if any). We then figure out +// how long it will take to rotate completely past newSector after +// that point. +// +// The disk also has a "track buffer"; the disk continuously reads +// the contents of the current disk track into the buffer. This allows +// read requests to the current track to be satisfied more quickly. +// The contents of the track buffer are discarded after every seek to +// a new track. +//---------------------------------------------------------------------- + +int +Disk::ComputeLatency(int newSector, bool writing) +{ + int rotation; + int seek = TimeToSeek(newSector, &rotation); + int timeAfter = kernel->stats->totalTicks + seek + rotation; + +#ifndef NOTRACKBUF // turn this on if you don't want the track buffer stuff + // check if track buffer applies + if ((writing == FALSE) && (seek == 0) + && (((timeAfter - bufferInit) / RotationTime) + > ModuloDiff(newSector, bufferInit / RotationTime))) { + DEBUG(dbgDisk, "Request latency = " << RotationTime); + return RotationTime; // time to transfer sector from the track buffer + } +#endif + + rotation += ModuloDiff(newSector, timeAfter / RotationTime) * RotationTime; + + DEBUG(dbgDisk, "Request latency = " << (seek + rotation + RotationTime)); + return(seek + rotation + RotationTime); +} + +//---------------------------------------------------------------------- +// Disk::UpdateLast +// Keep track of the most recently requested sector. So we can know +// what is in the track buffer. +//---------------------------------------------------------------------- + +void +Disk::UpdateLast(int newSector) +{ + int rotate; + int seek = TimeToSeek(newSector, &rotate); + + if (seek != 0) + bufferInit = kernel->stats->totalTicks + seek + rotate; + lastSector = newSector; + DEBUG(dbgDisk, "Updating last sector = " << lastSector << " , " << bufferInit); +} diff --git a/code/machine/disk.h b/code/machine/disk.h new file mode 100644 index 0000000..8ec9095 --- /dev/null +++ b/code/machine/disk.h @@ -0,0 +1,92 @@ +// disk.h +// Data structures to emulate a physical disk. A physical disk +// can accept (one at a time) requests to read/write a disk sector; +// when the request is satisfied, the CPU gets an interrupt, and +// the next request can be sent to the disk. +// +// Disk contents are preserved across machine crashes, but if +// a file system operation (eg, create a file) is in progress when the +// system shuts down, the file system may be corrupted. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef DISK_H +#define DISK_H + +#include "copyright.h" +#include "utility.h" +#include "callback.h" + +// The following class defines a physical disk I/O device. The disk +// has a single surface, split up into "tracks", and each track split +// up into "sectors" (the same number of sectors on each track, and each +// sector has the same number of bytes of storage). +// +// Addressing is by sector number -- each sector on the disk is given +// a unique number: track * SectorsPerTrack + offset within a track. +// +// As with other I/O devices, the raw physical disk is an asynchronous device -- +// requests to read or write portions of the disk return immediately, +// and an interrupt is invoked later to signal that the operation completed. +// +// The physical disk is in fact simulated via operations on a UNIX file. +// +// To make life a little more realistic, the simulated time for +// each operation reflects a "track buffer" -- RAM to store the contents +// of the current track as the disk head passes by. The idea is that the +// disk always transfers to the track buffer, in case that data is requested +// later on. This has the benefit of eliminating the need for +// "skip-sector" scheduling -- a read request which comes in shortly after +// the head has passed the beginning of the sector can be satisfied more +// quickly, because its contents are in the track buffer. Most +// disks these days now come with a track buffer. +// +// The track buffer simulation can be disabled by compiling with -DNOTRACKBUF + +const int SectorSize = 128; // number of bytes per disk sector +const int SectorsPerTrack = 32; // number of sectors per disk track +const int NumTracks = 32; // number of tracks per disk +const int NumSectors = (SectorsPerTrack * NumTracks); + // total # of sectors per disk + +class Disk : public CallBackObj { + public: + Disk(CallBackObj *toCall); // Create a simulated disk. + // Invoke toCall->CallBack() + // when each request completes. + ~Disk(); // Deallocate the disk. + + void ReadRequest(int sectorNumber, char* data); + // Read/write an single disk sector. + // These routines send a request to + // the disk and return immediately. + // Only one request allowed at a time! + void WriteRequest(int sectorNumber, char* data); + + void CallBack(); // Invoked when disk request + // finishes. In turn calls, callWhenDone. + + int ComputeLatency(int newSector, bool writing); + // Return how long a request to + // newSector will take: + // (seek + rotational delay + transfer) + + private: + int fileno; // UNIX file number for simulated disk + char diskname[32]; // name of simulated disk's file + CallBackObj *callWhenDone; // Invoke when any disk request finishes + bool active; // Is a disk operation in progress? + int lastSector; // The previous disk request + int bufferInit; // When the track buffer started + // being loaded + + int TimeToSeek(int newSector, int *rotate); // time to get to the new track + int ModuloDiff(int to, int from); // # sectors between to and from + void UpdateLast(int newSector); +}; + +#endif // DISK_H diff --git a/code/machine/interrupt.cc b/code/machine/interrupt.cc new file mode 100644 index 0000000..7c5027f --- /dev/null +++ b/code/machine/interrupt.cc @@ -0,0 +1,361 @@ +// interrupt.cc +// Routines to simulate hardware interrupts. +// +// The hardware provides a routine (SetLevel) to enable or disable +// interrupts. +// +// In order to emulate the hardware, we need to keep track of all +// interrupts the hardware devices would cause, and when they +// are supposed to occur. +// +// This module also keeps track of simulated time. Time advances +// only when the following occur: +// interrupts are re-enabled +// a user instruction is executed +// there is nothing in the ready queue +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "interrupt.h" +#include "main.h" + +// String definitions for debugging messages + +static char *intLevelNames[] = { "off", "on"}; +static char *intTypeNames[] = { "timer", "disk", "console write", + "console read", "network send", + "network recv"}; + +//---------------------------------------------------------------------- +// PendingInterrupt::PendingInterrupt +// Initialize a hardware device interrupt that is to be scheduled +// to occur in the near future. +// +// "callOnInt" is the object to call when the interrupt occurs +// "time" is when (in simulated time) the interrupt is to occur +// "kind" is the hardware device that generated the interrupt +//---------------------------------------------------------------------- + +PendingInterrupt::PendingInterrupt(CallBackObj *callOnInt, + int time, IntType kind) +{ + callOnInterrupt = callOnInt; + when = time; + type = kind; +} + +//---------------------------------------------------------------------- +// PendingCompare +// Compare to interrupts based on which should occur first. +//---------------------------------------------------------------------- + +static int +PendingCompare (PendingInterrupt *x, PendingInterrupt *y) +{ + if (x->when < y->when) { return -1; } + else if (x->when > y->when) { return 1; } + else { return 0; } +} + +//---------------------------------------------------------------------- +// Interrupt::Interrupt +// Initialize the simulation of hardware device interrupts. +// +// Interrupts start disabled, with no interrupts pending, etc. +//---------------------------------------------------------------------- + +Interrupt::Interrupt() +{ + level = IntOff; + pending = new SortedList(PendingCompare); + inHandler = FALSE; + yieldOnReturn = FALSE; + status = SystemMode; +} + +//---------------------------------------------------------------------- +// Interrupt::~Interrupt +// De-allocate the data structures needed by the interrupt simulation. +//---------------------------------------------------------------------- + +Interrupt::~Interrupt() +{ + while (!pending->IsEmpty()) { + delete pending->RemoveFront(); + } + delete pending; +} + +//---------------------------------------------------------------------- +// Interrupt::ChangeLevel +// Change interrupts to be enabled or disabled, without advancing +// the simulated time (normally, enabling interrupts advances the time). +// +// Used internally. +// +// "old" -- the old interrupt status +// "now" -- the new interrupt status +//---------------------------------------------------------------------- + +void +Interrupt::ChangeLevel(IntStatus old, IntStatus now) +{ + level = now; + DEBUG(dbgInt, "\tinterrupts: " << intLevelNames[old] << " -> " << intLevelNames[now]); +} + +//---------------------------------------------------------------------- +// Interrupt::SetLevel +// Change interrupts to be enabled or disabled, and if interrupts +// are being enabled, advance simulated time by calling OneTick(). +// +// Returns: +// The old interrupt status. +// Parameters: +// "now" -- the new interrupt status +//---------------------------------------------------------------------- + +IntStatus +Interrupt::SetLevel(IntStatus now) +{ + IntStatus old = level; + + // interrupt handlers are prohibited from enabling interrupts + ASSERT((now == IntOff) || (inHandler == FALSE)); + + ChangeLevel(old, now); // change to new state + if ((now == IntOn) && (old == IntOff)) { + OneTick(); // advance simulated time + } + return old; +} + +//---------------------------------------------------------------------- +// Interrupt::OneTick +// Advance simulated time and check if there are any pending +// interrupts to be called. +// +// Two things can cause OneTick to be called: +// interrupts are re-enabled +// a user instruction is executed +//---------------------------------------------------------------------- +void +Interrupt::OneTick() +{ + MachineStatus oldStatus = status; + Statistics *stats = kernel->stats; + +// advance simulated time + if (status == SystemMode) { + stats->totalTicks += SystemTick; + stats->systemTicks += SystemTick; + } else { + stats->totalTicks += UserTick; + stats->userTicks += UserTick; + } + DEBUG(dbgInt, "== Tick " << stats->totalTicks << " =="); + +// check any pending interrupts are now ready to fire + ChangeLevel(IntOn, IntOff); // first, turn off interrupts + // (interrupt handlers run with + // interrupts disabled) + CheckIfDue(FALSE); // check for pending interrupts + ChangeLevel(IntOff, IntOn); // re-enable interrupts + if (yieldOnReturn) { // if the timer device handler asked + // for a context switch, ok to do it now + yieldOnReturn = FALSE; + status = SystemMode; // yield is a kernel routine + kernel->currentThread->Yield(); + status = oldStatus; + } +} + +//---------------------------------------------------------------------- +// Interrupt::YieldOnReturn +// Called from within an interrupt handler, to cause a context switch +// (for example, on a time slice) in the interrupted thread, +// when the handler returns. +// +// We can't do the context switch here, because that would switch +// out the interrupt handler, and we want to switch out the +// interrupted thread. +//---------------------------------------------------------------------- + +void +Interrupt::YieldOnReturn() +{ + ASSERT(inHandler == TRUE); + yieldOnReturn = TRUE; +} + +//---------------------------------------------------------------------- +// Interrupt::Idle +// Routine called when there is nothing in the ready queue. +// +// Since something has to be running in order to put a thread +// on the ready queue, the only thing to do is to advance +// simulated time until the next scheduled hardware interrupt. +// +// If there are no pending interrupts, stop. There's nothing +// more for us to do. +//---------------------------------------------------------------------- +void +Interrupt::Idle() +{ + DEBUG(dbgInt, "Machine idling; checking for interrupts."); + status = IdleMode; + if (CheckIfDue(TRUE)) { // check for any pending interrupts + status = SystemMode; + return; // return in case there's now + // a runnable thread + } + + // if there are no pending interrupts, and nothing is on the ready + // queue, it is time to stop. If the console or the network is + // operating, there are *always* pending interrupts, so this code + // is not reached. Instead, the halt must be invoked by the user program. + + DEBUG(dbgInt, "Machine idle. No interrupts to do."); + cout << "No threads ready or runnable, and no pending interrupts.\n"; + cout << "Assuming the program completed.\n"; + Halt(); +} + +//---------------------------------------------------------------------- +// Interrupt::Halt +// Shut down Nachos cleanly, printing out performance statistics. +//---------------------------------------------------------------------- +void +Interrupt::Halt() +{ + cout << "Machine halting!\n\n"; + cout << "This is halt\n"; + kernel->stats->Print(); + delete kernel; // Never returns. +} + +int +Interrupt::CreateFile(char *filename) +{ + return kernel->CreateFile(filename); +} + + +//---------------------------------------------------------------------- +// Interrupt::Schedule +// Arrange for the CPU to be interrupted when simulated time +// reaches "now + when". +// +// Implementation: just put it on a sorted list. +// +// NOTE: the Nachos kernel should not call this routine directly. +// Instead, it is only called by the hardware device simulators. +// +// "toCall" is the object to call when the interrupt occurs +// "fromNow" is how far in the future (in simulated time) the +// interrupt is to occur +// "type" is the hardware device that generated the interrupt +//---------------------------------------------------------------------- +void +Interrupt::Schedule(CallBackObj *toCall, int fromNow, IntType type) +{ + int when = kernel->stats->totalTicks + fromNow; + PendingInterrupt *toOccur = new PendingInterrupt(toCall, when, type); + + DEBUG(dbgInt, "Scheduling interrupt handler the " << intTypeNames[type] << " at time = " << when); + ASSERT(fromNow > 0); + + pending->Insert(toOccur); +} + +//---------------------------------------------------------------------- +// Interrupt::CheckIfDue +// Check if any interrupts are scheduled to occur, and if so, +// fire them off. +// +// Returns: +// TRUE, if we fired off any interrupt handlers +// Params: +// "advanceClock" -- if TRUE, there is nothing in the ready queue, +// so we should simply advance the clock to when the next +// pending interrupt would occur (if any). +//---------------------------------------------------------------------- +bool +Interrupt::CheckIfDue(bool advanceClock) +{ + PendingInterrupt *next; + Statistics *stats = kernel->stats; + + ASSERT(level == IntOff); // interrupts need to be disabled, + // to invoke an interrupt handler + if (debug->IsEnabled(dbgInt)) { + DumpState(); + } + if (pending->IsEmpty()) { // no pending interrupts + return FALSE; + } + next = pending->Front(); + + if (next->when > stats->totalTicks) { + if (!advanceClock) { // not time yet + return FALSE; + } + else { // advance the clock to next interrupt + stats->idleTicks += (next->when - stats->totalTicks); + stats->totalTicks = next->when; + // UDelay(1000L); // rcgood - to stop nachos from spinning. + } + } + + DEBUG(dbgInt, "Invoking interrupt handler for the "); + DEBUG(dbgInt, intTypeNames[next->type] << " at time " << next->when); + + if (kernel->machine != NULL) { + kernel->machine->DelayedLoad(0, 0); + } + + inHandler = TRUE; + do { + next = pending->RemoveFront(); // pull interrupt off list + next->callOnInterrupt->CallBack();// call the interrupt handler + delete next; + } while (!pending->IsEmpty() + && (pending->Front()->when <= stats->totalTicks)); + inHandler = FALSE; + return TRUE; +} + +//---------------------------------------------------------------------- +// PrintPending +// Print information about an interrupt that is scheduled to occur. +// When, where, why, etc. +//---------------------------------------------------------------------- + +static void +PrintPending (PendingInterrupt *pending) +{ + cout << "Interrupt handler "<< intTypeNames[pending->type]; + cout << ", scheduled at " << pending->when; +} + +//---------------------------------------------------------------------- +// DumpState +// Print the complete interrupt state - the status, and all interrupts +// that are scheduled to occur in the future. +//---------------------------------------------------------------------- + +void +Interrupt::DumpState() +{ + cout << "Time: " << kernel->stats->totalTicks; + cout << ", interrupts " << intLevelNames[level] << "\n"; + cout << "Pending interrupts:\n"; + pending->Apply(PrintPending); + cout << "\nEnd of pending interrupts\n"; +} + diff --git a/code/machine/interrupt.h b/code/machine/interrupt.h new file mode 100644 index 0000000..fefff93 --- /dev/null +++ b/code/machine/interrupt.h @@ -0,0 +1,145 @@ +// interrupt.h +// Data structures to emulate low-level interrupt hardware. +// +// The hardware provides a routine (SetLevel) to enable or disable +// interrupts. +// +// In order to emulate the hardware, we need to keep track of all +// interrupts the hardware devices would cause, and when they +// are supposed to occur. +// +// This module also keeps track of simulated time. Time advances +// only when the following occur: +// interrupts are re-enabled +// a user instruction is executed +// there is nothing in the ready queue +// +// As a result, unlike real hardware, interrupts (and thus time-slice +// context switches) cannot occur anywhere in the code where interrupts +// are enabled, but rather only at those places in the code where +// simulated time advances (so that it becomes time to invoke an +// interrupt in the hardware simulation). +// +// NOTE: this means that incorrectly synchronized code may work +// fine on this hardware simulation (even with randomized time slices), +// but it wouldn't work on real hardware. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef INTERRUPT_H +#define INTERRUPT_H + +#include "copyright.h" +#include "list.h" +#include "callback.h" + +// Interrupts can be disabled (IntOff) or enabled (IntOn) +enum IntStatus { IntOff, IntOn }; + +// Nachos can be running kernel code (SystemMode), user code (UserMode), +// or there can be no runnable thread, because the ready list +// is empty (IdleMode). +enum MachineStatus {IdleMode, SystemMode, UserMode}; + +// IntType records which hardware device generated an interrupt. +// In Nachos, we support a hardware timer device, a disk, a console +// display and keyboard, and a network. +enum IntType { TimerInt, DiskInt, ConsoleWriteInt, ConsoleReadInt, + NetworkSendInt, NetworkRecvInt}; + +// The following class defines an interrupt that is scheduled +// to occur in the future. The internal data structures are +// left public to make it simpler to manipulate. + +class PendingInterrupt { + public: + PendingInterrupt(CallBackObj *callOnInt, int time, IntType kind); + // initialize an interrupt that will + // occur in the future + + CallBackObj *callOnInterrupt;// The object (in the hardware device + // emulator) to call when the interrupt occurs + + int when; // When the interrupt is supposed to fire + IntType type; // for debugging +}; + +// The following class defines the data structures for the simulation +// of hardware interrupts. We record whether interrupts are enabled +// or disabled, and any hardware interrupts that are scheduled to occur +// in the future. + +class Interrupt { + public: + Interrupt(); // initialize the interrupt simulation + ~Interrupt(); // de-allocate data structures + + IntStatus SetLevel(IntStatus level); + // Disable or enable interrupts + // and return previous setting. + + void Enable() { (void) SetLevel(IntOn); } + // Enable interrupts. + IntStatus getLevel() {return level;} + // Return whether interrupts + // are enabled or disabled + + void Idle(); // The ready queue is empty, roll + // simulated time forward until the + // next interrupt + + void Halt(); // quit and print out stats + + void PrintInt(int number); + int CreateFile(char *filename); + + void YieldOnReturn(); // cause a context switch on return + // from an interrupt handler + + MachineStatus getStatus() { return status; } + void setStatus(MachineStatus st) { status = st; } + // idle, kernel, user + + void DumpState(); // Print interrupt state + + + // NOTE: the following are internal to the hardware simulation code. + // DO NOT call these directly. I should make them "private", + // but they need to be public since they are called by the + // hardware device simulators. + + void Schedule(CallBackObj *callTo, int when, IntType type); + // Schedule an interrupt to occur + // at time "when". This is called + // by the hardware device simulators. + + void OneTick(); // Advance simulated time + + private: + IntStatus level; // are interrupts enabled or disabled? + SortedList *pending; + // the list of interrupts scheduled + // to occur in the future + //int writeFileNo; //UNIX file emulating the display + bool inHandler; // TRUE if we are running an interrupt handler + //bool putBusy; // Is a PrintInt operation in progress + //If so, you cannoot do another one + bool yieldOnReturn; // TRUE if we are to context switch + // on return from the interrupt handler + MachineStatus status; // idle, kernel mode, user mode + + // these functions are internal to the interrupt simulation code + + bool CheckIfDue(bool advanceClock); + // Check if any interrupts are supposed + // to occur now, and if so, do them + + void ChangeLevel(IntStatus old, // SetLevel, without advancing the + IntStatus now); // simulated time +}; + +#endif // INTERRRUPT_H diff --git a/code/machine/machine.cc b/code/machine/machine.cc new file mode 100644 index 0000000..429d4f7 --- /dev/null +++ b/code/machine/machine.cc @@ -0,0 +1,224 @@ +// machine.cc +// Routines for simulating the execution of user programs. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "machine.h" +#include "main.h" + +// Textual names of the exceptions that can be generated by user program +// execution, for debugging. +static char* exceptionNames[] = { "no exception", "syscall", + "page fault/no TLB entry", "page read only", + "bus error", "address error", "overflow", + "illegal instruction" }; + +//---------------------------------------------------------------------- +// CheckEndian +// Check to be sure that the host really uses the format it says it +// does, for storing the bytes of an integer. Stop on error. +//---------------------------------------------------------------------- + +static +void CheckEndian() +{ + union checkit { + char charword[4]; + unsigned int intword; + } check; + + check.charword[0] = 1; + check.charword[1] = 2; + check.charword[2] = 3; + check.charword[3] = 4; + +#ifdef HOST_IS_BIG_ENDIAN + ASSERT (check.intword == 0x01020304); +#else + ASSERT (check.intword == 0x04030201); +#endif +} + +//---------------------------------------------------------------------- +// Machine::Machine +// Initialize the simulation of user program execution. +// +// "debug" -- if TRUE, drop into the debugger after each user instruction +// is executed. +//---------------------------------------------------------------------- + +Machine::Machine(bool debug) +{ + int i; + + for (i = 0; i < NumTotalRegs; i++) + registers[i] = 0; + mainMemory = new char[MemorySize]; + for (i = 0; i < MemorySize; i++) + mainMemory[i] = 0; +#ifdef USE_TLB + tlb = new TranslationEntry[TLBSize]; + for (i = 0; i < TLBSize; i++) + tlb[i].valid = FALSE; + pageTable = NULL; +#else // use linear page table + tlb = NULL; + pageTable = NULL; +#endif + + singleStep = debug; + CheckEndian(); +} + +//---------------------------------------------------------------------- +// Machine::~Machine +// De-allocate the data structures used to simulate user program execution. +//---------------------------------------------------------------------- + +Machine::~Machine() +{ + delete [] mainMemory; + if (tlb != NULL) + delete [] tlb; +} + +//---------------------------------------------------------------------- +// Machine::RaiseException +// Transfer control to the Nachos kernel from user mode, because +// the user program either invoked a system call, or some exception +// occured (such as the address translation failed). +// +// "which" -- the cause of the kernel trap +// "badVaddr" -- the virtual address causing the trap, if appropriate +//---------------------------------------------------------------------- + +void +Machine::RaiseException(ExceptionType which, int badVAddr) +{ + DEBUG(dbgMach, "Exception: " << exceptionNames[which]); + registers[BadVAddrReg] = badVAddr; + DelayedLoad(0, 0); // finish anything in progress + kernel->interrupt->setStatus(SystemMode); + ExceptionHandler(which); // interrupts are enabled at this point + kernel->interrupt->setStatus(UserMode); +} + +//---------------------------------------------------------------------- +// Machine::Debugger +// Primitive debugger for user programs. Note that we can't use +// gdb to debug user programs, since gdb doesn't run on top of Nachos. +// It could, but you'd have to implement *a lot* more system calls +// to get it to work! +// +// So just allow single-stepping, and printing the contents of memory. +//---------------------------------------------------------------------- + +void Machine::Debugger() +{ + char *buf = new char[80]; + int num; + bool done = FALSE; + + kernel->interrupt->DumpState(); + DumpState(); + while (!done) { + // read commands until we should proceed with more execution + // prompt for input, giving current simulation time in the prompt + cout << kernel->stats->totalTicks << ">"; + // read one line of input (80 chars max) + cin.get(buf, 80); + if (sscanf(buf, "%d", &num) == 1) { + runUntilTime = num; + done = TRUE; + } + else { + runUntilTime = 0; + switch (*buf) { + case '\0': + done = TRUE; + break; + case 'c': + singleStep = FALSE; + done = TRUE; + break; + case '?': + cout << "Machine commands:\n"; + cout << " execute one instruction\n"; + cout << " run until the given timer tick\n"; + cout << " c run until completion\n"; + cout << " ? print help message\n"; + break; + default: + cout << "Unknown command: " << buf << "\n"; + cout << "Type ? for help.\n"; + } + } + // consume the newline delimiter, which does not get + // eaten by cin.get(buf,80) above. + buf[0] = cin.get(); + } + delete [] buf; +} + +//---------------------------------------------------------------------- +// Machine::DumpState +// Print the user program's CPU state. We might print the contents +// of memory, but that seemed like overkill. +//---------------------------------------------------------------------- + +void +Machine::DumpState() +{ + int i; + + cout << "Machine registers:\n"; + for (i = 0; i < NumGPRegs; i++) { + switch (i) { + case StackReg: + cout << "\tSP(" << i << "):\t" << registers[i]; + break; + + case RetAddrReg: + cout << "\tRA(" << i << "):\t" << registers[i]; + break; + + default: + cout << "\t" << i << ":\t" << registers[i]; + break; + } + if ((i % 4) == 3) { cout << "\n"; } + } + + cout << "\tHi:\t" << registers[HiReg]; + cout << "\tLo:\t" << registers[LoReg]; + cout << "\tPC:\t" << registers[PCReg]; + cout << "\tNextPC:\t" << registers[NextPCReg]; + cout << "\tPrevPC:\t" << registers[PrevPCReg]; + cout << "\tLoad:\t" << registers[LoadReg]; + cout << "\tLoadV:\t" << registers[LoadValueReg] << "\n"; +} + +//---------------------------------------------------------------------- +// Machine::ReadRegister/WriteRegister +// Fetch or write the contents of a user program register. +//---------------------------------------------------------------------- + +int +Machine::ReadRegister(int num) +{ + ASSERT((num >= 0) && (num < NumTotalRegs)); + return registers[num]; +} + +void +Machine::WriteRegister(int num, int value) +{ + ASSERT((num >= 0) && (num < NumTotalRegs)); + registers[num] = value; +} + diff --git a/code/machine/machine.h b/code/machine/machine.h new file mode 100644 index 0000000..d8af5c8 --- /dev/null +++ b/code/machine/machine.h @@ -0,0 +1,206 @@ +// machine.h +// Data structures for simulating the execution of user programs +// running on top of Nachos. +// +// User programs are loaded into "mainMemory"; to Nachos, +// this looks just like an array of bytes. Of course, the Nachos +// kernel is in memory too -- but as in most machines these days, +// the kernel is loaded into a separate memory region from user +// programs, and accesses to kernel memory are not translated or paged. +// +// In Nachos, user programs are executed one instruction at a time, +// by the simulator. Each memory reference is translated, checked +// for errors, etc. +// +// DO NOT CHANGE EXCEPT AS NOTED BELOW -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef MACHINE_H +#define MACHINE_H + +#include "copyright.h" +#include "utility.h" +#include "translate.h" + +// Definitions related to the size, and format of user memory + +const int PageSize = 128; // set the page size equal to + // the disk sector size, for simplicity + +// +// You are allowed to change this value. +// Doing so will change the number of pages of physical memory +// available on the simulated machine. +// +const int NumPhysPages = 128; + +const int MemorySize = (NumPhysPages * PageSize); +const int TLBSize = 4; // if there is a TLB, make it small + +enum ExceptionType { NoException, // Everything ok! + SyscallException, // A program executed a system call. + PageFaultException, // No valid translation found + ReadOnlyException, // Write attempted to page marked + // "read-only" + BusErrorException, // Translation resulted in an + // invalid physical address + AddressErrorException, // Unaligned reference or one that + // was beyond the end of the + // address space + OverflowException, // Integer overflow in add or sub. + IllegalInstrException, // Unimplemented or reserved instr. + + NumExceptionTypes +}; + +// User program CPU state. The full set of MIPS registers, plus a few +// more because we need to be able to start/stop a user program between +// any two instructions (thus we need to keep track of things like load +// delay slots, etc.) + +#define StackReg 29 // User's stack pointer +#define RetAddrReg 31 // Holds return address for procedure calls +#define NumGPRegs 32 // 32 general purpose registers on MIPS +#define HiReg 32 // Double register to hold multiply result +#define LoReg 33 +#define PCReg 34 // Current program counter +#define NextPCReg 35 // Next program counter (for branch delay) +#define PrevPCReg 36 // Previous program counter (for debugging) +#define LoadReg 37 // The register target of a delayed load. +#define LoadValueReg 38 // The value to be loaded by a delayed load. +#define BadVAddrReg 39 // The failing virtual address on an exception + +#define NumTotalRegs 40 + +// The following class defines the simulated host workstation hardware, as +// seen by user programs -- the CPU registers, main memory, etc. +// User programs shouldn't be able to tell that they are running on our +// simulator or on the real hardware, except +// we don't support floating point instructions +// the system call interface to Nachos is not the same as UNIX +// (10 system calls in Nachos vs. 200 in UNIX!) +// If we were to implement more of the UNIX system calls, we ought to be +// able to run Nachos on top of Nachos! +// +// The procedures in this class are defined in machine.cc, mipssim.cc, and +// translate.cc. + +class Instruction; +class Interrupt; + +class Machine { + public: + Machine(bool debug); // Initialize the simulation of the hardware + // for running user programs + ~Machine(); // De-allocate the data structures + +// Routines callable by the Nachos kernel + void Run(); // Run a user program + + int ReadRegister(int num); // read the contents of a CPU register + + void WriteRegister(int num, int value); + // store a value into a CPU register + +// Data structures accessible to the Nachos kernel -- main memory and the +// page table/TLB. +// +// Note that *all* communication between the user program and the kernel +// are in terms of these data structures (plus the CPU registers). + + char *mainMemory; // physical memory to store user program, + // code and data, while executing + +// NOTE: the hardware translation of virtual addresses in the user program +// to physical addresses (relative to the beginning of "mainMemory") +// can be controlled by one of: +// a traditional linear page table +// a software-loaded translation lookaside buffer (tlb) -- a cache of +// mappings of virtual page #'s to physical page #'s +// +// If "tlb" is NULL, the linear page table is used +// If "tlb" is non-NULL, the Nachos kernel is responsible for managing +// the contents of the TLB. But the kernel can use any data structure +// it wants (eg, segmented paging) for handling TLB cache misses. +// +// For simplicity, both the page table pointer and the TLB pointer are +// public. However, while there can be multiple page tables (one per address +// space, stored in memory), there is only one TLB (implemented in hardware). +// Thus the TLB pointer should be considered as *read-only*, although +// the contents of the TLB are free to be modified by the kernel software. + + TranslationEntry *tlb; // this pointer should be considered + // "read-only" to Nachos kernel code + + TranslationEntry *pageTable; + unsigned int pageTableSize; + + bool ReadMem(int addr, int size, int* value); + bool WriteMem(int addr, int size, int value); + // Read or write 1, 2, or 4 bytes of virtual + // memory (at addr). Return FALSE if a + // correct translation couldn't be found. + private: + +// Routines internal to the machine simulation -- DO NOT call these directly + void DelayedLoad(int nextReg, int nextVal); + // Do a pending delayed load (modifying a reg) + + void OneInstruction(Instruction *instr); + // Run one instruction of a user program. + + + + ExceptionType Translate(int virtAddr, int* physAddr, int size,bool writing); + // Translate an address, and check for + // alignment. Set the use and dirty bits in + // the translation entry appropriately, + // and return an exception code if the + // translation couldn't be completed. + + void RaiseException(ExceptionType which, int badVAddr); + // Trap to the Nachos kernel, because of a + // system call or other exception. + + void Debugger(); // invoke the user program debugger + void DumpState(); // print the user CPU and memory state + + +// Internal data structures + + int registers[NumTotalRegs]; // CPU registers, for executing user programs + + bool singleStep; // drop back into the debugger after each + // simulated instruction + int runUntilTime; // drop back into the debugger when simulated + // time reaches this value + + friend class Interrupt; // calls DelayedLoad() +}; + +extern void ExceptionHandler(ExceptionType which); + // Entry point into Nachos for handling + // user system calls and exceptions + // Defined in exception.cc + + +// Routines for converting Words and Short Words to and from the +// simulated machine's format of little endian. If the host machine +// is little endian (DEC and Intel), these end up being NOPs. +// +// What is stored in each format: +// host byte ordering: +// kernel data structures +// user registers +// simulated machine byte ordering: +// contents of main memory + +unsigned int WordToHost(unsigned int word); +unsigned short ShortToHost(unsigned short shortword); +unsigned int WordToMachine(unsigned int word); +unsigned short ShortToMachine(unsigned short shortword); + +#endif // MACHINE_H diff --git a/code/machine/mipssim.cc b/code/machine/mipssim.cc new file mode 100644 index 0000000..16d3092 --- /dev/null +++ b/code/machine/mipssim.cc @@ -0,0 +1,828 @@ +// mipssim.cc -- simulate a MIPS R2/3000 processor +// +// This code has been adapted from Ousterhout's MIPSSIM package. +// Byte ordering is little-endian, so we can be compatible with +// DEC RISC systems. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +// Simulation fixes done by Peter E Reissner, class of Winter 1994/95 (York) +// I've not been able to test this extensively. +// Ported to newer version of Nachos at Waterloo by Scott Graham (Mar 99). + + +#include "copyright.h" + +#include "debug.h" +#include "machine.h" +#include "mipssim.h" +#include "main.h" + +static void Mult(int a, int b, bool signedArith, int* hiPtr, int* loPtr); + +// The following class defines an instruction, represented in both +// undecoded binary form +// decoded to identify +// operation to do +// registers to act on +// any immediate operand value + +class Instruction { + public: + void Decode(); // decode the binary representation of the instruction + + unsigned int value; // binary representation of the instruction + + char opCode; // Type of instruction. This is NOT the same as the + // opcode field from the instruction: see defs in mips.h + char rs, rt, rd; // Three registers from instruction. + int extra; // Immediate or target or shamt field or offset. + // Immediates are sign-extended. +}; + +//---------------------------------------------------------------------- +// Machine::Run +// Simulate the execution of a user-level program on Nachos. +// Called by the kernel when the program starts up; never returns. +// +// This routine is re-entrant, in that it can be called multiple +// times concurrently -- one for each thread executing user code. +//---------------------------------------------------------------------- + +void +Machine::Run() +{ + Instruction *instr = new Instruction; // storage for decoded instruction + + if (debug->IsEnabled('m')) { + cout << "Starting program in thread: " << kernel->currentThread->getName(); + cout << ", at time: " << kernel->stats->totalTicks << "\n"; + } + kernel->interrupt->setStatus(UserMode); + for (;;) { + OneInstruction(instr); + kernel->interrupt->OneTick(); + if (singleStep && (runUntilTime <= kernel->stats->totalTicks)) + Debugger(); + } +} + + +//---------------------------------------------------------------------- +// TypeToReg +// Retrieve the register # referred to in an instruction. +//---------------------------------------------------------------------- + +static int +TypeToReg(RegType reg, Instruction *instr) +{ + switch (reg) { + case RS: + return instr->rs; + case RT: + return instr->rt; + case RD: + return instr->rd; + case EXTRA: + return instr->extra; + default: + return -1; + } +} + +//---------------------------------------------------------------------- +// Machine::OneInstruction +// Execute one instruction from a user-level program +// +// If there is any kind of exception or interrupt, we invoke the +// exception handler, and when it returns, we return to Run(), which +// will re-invoke us in a loop. This allows us to +// re-start the instruction execution from the beginning, in +// case any of our state has changed. On a syscall, +// the OS software must increment the PC so execution begins +// at the instruction immediately after the syscall. +// +// This routine is re-entrant, in that it can be called multiple +// times concurrently -- one for each thread executing user code. +// We get re-entrancy by never caching any data -- we always re-start the +// simulation from scratch each time we are called (or after trapping +// back to the Nachos kernel on an exception or interrupt), and we always +// store all data back to the machine registers and memory before +// leaving. This allows the Nachos kernel to control our behavior +// by controlling the contents of memory, the translation table, +// and the register set. +//---------------------------------------------------------------------- + +void +Machine::OneInstruction(Instruction *instr) +{ +#ifdef SIM_FIX + int byte; // described in Kane for LWL,LWR,... +#endif + + int raw; + int nextLoadReg = 0; + int nextLoadValue = 0; // record delayed load operation, to apply + // in the future + + // Fetch instruction + if (!ReadMem(registers[PCReg], 4, &raw)) + return; // exception occurred + instr->value = raw; + instr->Decode(); + + if (debug->IsEnabled('m')) { + struct OpString *str = &opStrings[instr->opCode]; + char buf[80]; + + ASSERT(instr->opCode <= MaxOpcode); + cout << "At PC = " << registers[PCReg]; + sprintf(buf, str->format, TypeToReg(str->args[0], instr), + TypeToReg(str->args[1], instr), TypeToReg(str->args[2], instr)); + cout << "\t" << buf << "\n"; + } + + // Compute next pc, but don't install in case there's an error or branch. + int pcAfter = registers[NextPCReg] + 4; + int sum, diff, tmp, value; + unsigned int rs, rt, imm; + + // Execute the instruction (cf. Kane's book) + switch (instr->opCode) { + + case OP_ADD: + sum = registers[instr->rs] + registers[instr->rt]; + if (!((registers[instr->rs] ^ registers[instr->rt]) & SIGN_BIT) && + ((registers[instr->rs] ^ sum) & SIGN_BIT)) { + RaiseException(OverflowException, 0); + return; + } + registers[instr->rd] = sum; + break; + + case OP_ADDI: + sum = registers[instr->rs] + instr->extra; + if (!((registers[instr->rs] ^ instr->extra) & SIGN_BIT) && + ((instr->extra ^ sum) & SIGN_BIT)) { + RaiseException(OverflowException, 0); + return; + } + registers[instr->rt] = sum; + break; + + case OP_ADDIU: + registers[instr->rt] = registers[instr->rs] + instr->extra; + break; + + case OP_ADDU: + registers[instr->rd] = registers[instr->rs] + registers[instr->rt]; + break; + + case OP_AND: + registers[instr->rd] = registers[instr->rs] & registers[instr->rt]; + break; + + case OP_ANDI: + registers[instr->rt] = registers[instr->rs] & (instr->extra & 0xffff); + break; + + case OP_BEQ: + if (registers[instr->rs] == registers[instr->rt]) + pcAfter = registers[NextPCReg] + IndexToAddr(instr->extra); + break; + + case OP_BGEZAL: + registers[R31] = registers[NextPCReg] + 4; + case OP_BGEZ: + if (!(registers[instr->rs] & SIGN_BIT)) + pcAfter = registers[NextPCReg] + IndexToAddr(instr->extra); + break; + + case OP_BGTZ: + if (registers[instr->rs] > 0) + pcAfter = registers[NextPCReg] + IndexToAddr(instr->extra); + break; + + case OP_BLEZ: + if (registers[instr->rs] <= 0) + pcAfter = registers[NextPCReg] + IndexToAddr(instr->extra); + break; + + case OP_BLTZAL: + registers[R31] = registers[NextPCReg] + 4; + case OP_BLTZ: + if (registers[instr->rs] & SIGN_BIT) + pcAfter = registers[NextPCReg] + IndexToAddr(instr->extra); + break; + + case OP_BNE: + if (registers[instr->rs] != registers[instr->rt]) + pcAfter = registers[NextPCReg] + IndexToAddr(instr->extra); + break; + + case OP_DIV: + if (registers[instr->rt] == 0) { + registers[LoReg] = 0; + registers[HiReg] = 0; + } else { + registers[LoReg] = registers[instr->rs] / registers[instr->rt]; + registers[HiReg] = registers[instr->rs] % registers[instr->rt]; + } + break; + + case OP_DIVU: + rs = (unsigned int) registers[instr->rs]; + rt = (unsigned int) registers[instr->rt]; + if (rt == 0) { + registers[LoReg] = 0; + registers[HiReg] = 0; + } else { + tmp = rs / rt; + registers[LoReg] = (int) tmp; + tmp = rs % rt; + registers[HiReg] = (int) tmp; + } + break; + + case OP_JAL: + registers[R31] = registers[NextPCReg] + 4; + case OP_J: + pcAfter = (pcAfter & 0xf0000000) | IndexToAddr(instr->extra); + break; + + case OP_JALR: + registers[instr->rd] = registers[NextPCReg] + 4; + case OP_JR: + pcAfter = registers[instr->rs]; + break; + + case OP_LB: + case OP_LBU: + tmp = registers[instr->rs] + instr->extra; + if (!ReadMem(tmp, 1, &value)) + return; + + if ((value & 0x80) && (instr->opCode == OP_LB)) + value |= 0xffffff00; + else + value &= 0xff; + nextLoadReg = instr->rt; + nextLoadValue = value; + break; + + case OP_LH: + case OP_LHU: + tmp = registers[instr->rs] + instr->extra; + if (tmp & 0x1) { + RaiseException(AddressErrorException, tmp); + return; + } + if (!ReadMem(tmp, 2, &value)) + return; + + if ((value & 0x8000) && (instr->opCode == OP_LH)) + value |= 0xffff0000; + else + value &= 0xffff; + nextLoadReg = instr->rt; + nextLoadValue = value; + break; + + case OP_LUI: + DEBUG(dbgMach, "Executing: LUI r" << instr->rt << ", " << instr->extra); + registers[instr->rt] = instr->extra << 16; + break; + + case OP_LW: + tmp = registers[instr->rs] + instr->extra; + if (tmp & 0x3) { + RaiseException(AddressErrorException, tmp); + return; + } + if (!ReadMem(tmp, 4, &value)) + return; + nextLoadReg = instr->rt; + nextLoadValue = value; + break; + + case OP_LWL: + tmp = registers[instr->rs] + instr->extra; + +#ifdef SIM_FIX + // The only difference between this code and the BIG ENDIAN code + // is that the ReadMem call is guaranteed an aligned access as it + // should be (Kane's book hides the fact that all memory access + // are done using aligned loads - what the instruction asks for + // is a arbitrary) This is the whole purpose of LWL and LWR etc. + // Then the switch uses 3 - (tmp & 0x3) instead of (tmp & 0x3) + + byte = tmp & 0x3; + // DEBUG('P', "Addr 0x%X\n",tmp-byte); + + if (!ReadMem(tmp-byte, 4, &value)) + return; +#else + // ReadMem assumes all 4 byte requests are aligned on an even + // word boundary. Also, the little endian/big endian swap code would + // fail (I think) if the other cases are ever exercised. + ASSERT((tmp & 0x3) == 0); + + if (!ReadMem(tmp, 4, &value)) + return; +#endif + + if (registers[LoadReg] == instr->rt) + nextLoadValue = registers[LoadValueReg]; + else + nextLoadValue = registers[instr->rt]; +#ifdef SIM_FIX + switch (3 - byte) +#else + switch (tmp & 0x3) +#endif + { + case 0: + nextLoadValue = value; + break; + case 1: + nextLoadValue = (nextLoadValue & 0xff) | (value << 8); + break; + case 2: + nextLoadValue = (nextLoadValue & 0xffff) | (value << 16); + break; + case 3: + nextLoadValue = (nextLoadValue & 0xffffff) | (value << 24); + break; + } + nextLoadReg = instr->rt; + break; + + case OP_LWR: + tmp = registers[instr->rs] + instr->extra; + +#ifdef SIM_FIX + // The only difference between this code and the BIG ENDIAN code + // is that the ReadMem call is guaranteed an aligned access as it + // should be (Kane's book hides the fact that all memory access + // are done using aligned loads - what the instruction asks + // for is a arbitrary) This is the whole purpose of LWL and LWR etc. + // Then the switch uses 3 - (tmp & 0x3) instead of (tmp & 0x3) + + byte = tmp & 0x3; + // DEBUG('P', "Addr 0x%X\n",tmp-byte); + + if (!ReadMem(tmp-byte, 4, &value)) + return; +#else + // ReadMem assumes all 4 byte requests are aligned on an even + // word boundary. Also, the little endian/big endian swap code would + // fail (I think) if the other cases are ever exercised. + ASSERT((tmp & 0x3) == 0); + + if (!ReadMem(tmp, 4, &value)) + return; +#endif + + if (registers[LoadReg] == instr->rt) + nextLoadValue = registers[LoadValueReg]; + else + nextLoadValue = registers[instr->rt]; + +#ifdef SIM_FIX + switch (3 - byte) +#else + switch (tmp & 0x3) +#endif + { + case 0: + nextLoadValue = (nextLoadValue & 0xffffff00) | + ((value >> 24) & 0xff); + break; + case 1: + nextLoadValue = (nextLoadValue & 0xffff0000) | + ((value >> 16) & 0xffff); + break; + case 2: + nextLoadValue = (nextLoadValue & 0xff000000) + | ((value >> 8) & 0xffffff); + break; + case 3: + nextLoadValue = value; + break; + } + nextLoadReg = instr->rt; + break; + + case OP_MFHI: + registers[instr->rd] = registers[HiReg]; + break; + + case OP_MFLO: + registers[instr->rd] = registers[LoReg]; + break; + + case OP_MTHI: + registers[HiReg] = registers[instr->rs]; + break; + + case OP_MTLO: + registers[LoReg] = registers[instr->rs]; + break; + + case OP_MULT: + Mult(registers[instr->rs], registers[instr->rt], TRUE, + ®isters[HiReg], ®isters[LoReg]); + break; + + case OP_MULTU: + Mult(registers[instr->rs], registers[instr->rt], FALSE, + ®isters[HiReg], ®isters[LoReg]); + break; + + case OP_NOR: + registers[instr->rd] = ~(registers[instr->rs] | registers[instr->rt]); + break; + + case OP_OR: + registers[instr->rd] = registers[instr->rs] | registers[instr->rt]; + break; + + case OP_ORI: + registers[instr->rt] = registers[instr->rs] | (instr->extra & 0xffff); + break; + + case OP_SB: + if (!WriteMem((unsigned) + (registers[instr->rs] + instr->extra), 1, registers[instr->rt])) + return; + break; + + case OP_SH: + if (!WriteMem((unsigned) + (registers[instr->rs] + instr->extra), 2, registers[instr->rt])) + return; + break; + + case OP_SLL: + registers[instr->rd] = registers[instr->rt] << instr->extra; + break; + + case OP_SLLV: + registers[instr->rd] = registers[instr->rt] << + (registers[instr->rs] & 0x1f); + break; + + case OP_SLT: + if (registers[instr->rs] < registers[instr->rt]) + registers[instr->rd] = 1; + else + registers[instr->rd] = 0; + break; + + case OP_SLTI: + if (registers[instr->rs] < instr->extra) + registers[instr->rt] = 1; + else + registers[instr->rt] = 0; + break; + + case OP_SLTIU: + rs = registers[instr->rs]; + imm = instr->extra; + if (rs < imm) + registers[instr->rt] = 1; + else + registers[instr->rt] = 0; + break; + + case OP_SLTU: + rs = registers[instr->rs]; + rt = registers[instr->rt]; + if (rs < rt) + registers[instr->rd] = 1; + else + registers[instr->rd] = 0; + break; + + case OP_SRA: + registers[instr->rd] = registers[instr->rt] >> instr->extra; + break; + + case OP_SRAV: + registers[instr->rd] = registers[instr->rt] >> + (registers[instr->rs] & 0x1f); + break; + + case OP_SRL: + tmp = registers[instr->rt]; + tmp >>= instr->extra; + registers[instr->rd] = tmp; + break; + + case OP_SRLV: + tmp = registers[instr->rt]; + tmp >>= (registers[instr->rs] & 0x1f); + registers[instr->rd] = tmp; + break; + + case OP_SUB: + diff = registers[instr->rs] - registers[instr->rt]; + if (((registers[instr->rs] ^ registers[instr->rt]) & SIGN_BIT) && + ((registers[instr->rs] ^ diff) & SIGN_BIT)) { + RaiseException(OverflowException, 0); + return; + } + registers[instr->rd] = diff; + break; + + case OP_SUBU: + registers[instr->rd] = registers[instr->rs] - registers[instr->rt]; + break; + + case OP_SW: + if (!WriteMem((unsigned) + (registers[instr->rs] + instr->extra), 4, registers[instr->rt])) + return; + break; + + case OP_SWL: + tmp = registers[instr->rs] + instr->extra; + +#ifdef SIM_FIX + // The only difference between this code and the BIG ENDIAN code + // is that the ReadMem call is guaranteed an aligned access as it + // should be (Kane's book hides the fact that all memory access + // are done using aligned loads - what the instruction asks for + // is a arbitrary) This is the whole purpose of LWL and LWR etc. + + byte = tmp & 0x3; + // DEBUG('P', "Addr 0x%X\n",tmp-byte); + if (!ReadMem(tmp-byte, 4, &value)) + return; + + // DEBUG('P', "Value 0x%X\n",value); +#else + + // The little endian/big endian swap code would + // fail (I think) if the other cases are ever exercised. + ASSERT((tmp & 0x3) == 0); + + if (!ReadMem((tmp & ~0x3), 4, &value)) + return; +#endif + +#ifdef SIM_FIX + switch( 3 - byte ) +#else + switch (tmp & 0x3) +#endif // SIM_FIX + { + case 0: + value = registers[instr->rt]; + break; + case 1: + value = (value & 0xff000000) | ((registers[instr->rt] >> 8) & + 0xffffff); + break; + case 2: + value = (value & 0xffff0000) | ((registers[instr->rt] >> 16) & + 0xffff); + break; + case 3: + value = (value & 0xffffff00) | ((registers[instr->rt] >> 24) & + 0xff); + break; + } +#ifndef SIM_FIX + if (!WriteMem((tmp & ~0x3), 4, value)) + return; +#else + // DEBUG('P', "Value 0x%X\n",value); + + if (!WriteMem((tmp - byte), 4, value)) + return; +#endif // SIM_FIX + break; + + case OP_SWR: + tmp = registers[instr->rs] + instr->extra; + +#ifndef SIM_FIX + // The little endian/big endian swap code would + // fail (I think) if the other cases are ever exercised. + ASSERT((tmp & 0x3) == 0); + + if (!ReadMem((tmp & ~0x3), 4, &value)) + return; +#else + // The only difference between this code and the BIG ENDIAN code + // is that the ReadMem call is guaranteed an aligned access as + // it should be (Kane's book hides the fact that all memory + // access are done using aligned loads - what the instruction + // asks for is a arbitrary) This is the whole purpose of LWL + // and LWR etc. + + byte = tmp & 0x3; + // DEBUG('P', "Addr 0x%X\n",tmp-byte); + + if (!ReadMem(tmp-byte, 4, &value)) + return; + // DEBUG('P', "Value 0x%X\n",value); +#endif // SIM_FIX + +#ifndef SIM_FIX + switch (tmp & 0x3) +#else + switch( 3 - byte ) +#endif // SIM_FIX + { + case 0: + value = (value & 0xffffff) | (registers[instr->rt] << 24); + break; + case 1: + value = (value & 0xffff) | (registers[instr->rt] << 16); + break; + case 2: + value = (value & 0xff) | (registers[instr->rt] << 8); + break; + case 3: + value = registers[instr->rt]; + break; + } + +#ifndef SIM_FIX + if (!WriteMem((tmp & ~0x3), 4, value)) + return; +#else + // DEBUG('P', "Value 0x%X\n",value); + + if (!WriteMem((tmp - byte), 4, value)) + return; +#endif // SIM_FIX + + + break; + + case OP_SYSCALL: + RaiseException(SyscallException, 0); + return; + + case OP_XOR: + registers[instr->rd] = registers[instr->rs] ^ registers[instr->rt]; + break; + + case OP_XORI: + registers[instr->rt] = registers[instr->rs] ^ (instr->extra & 0xffff); + break; + + case OP_RES: + case OP_UNIMP: + RaiseException(IllegalInstrException, 0); + return; + + default: + ASSERT(FALSE); + } + + // Now we have successfully executed the instruction. + + // Do any delayed load operation + DelayedLoad(nextLoadReg, nextLoadValue); + + // Advance program counters. + registers[PrevPCReg] = registers[PCReg]; // for debugging, in case we + // are jumping into lala-land + registers[PCReg] = registers[NextPCReg]; + registers[NextPCReg] = pcAfter; +} + +//---------------------------------------------------------------------- +// Machine::DelayedLoad +// Simulate effects of a delayed load. +// +// NOTE -- RaiseException/CheckInterrupts must also call DelayedLoad, +// since any delayed load must get applied before we trap to the kernel. +//---------------------------------------------------------------------- + +void +Machine::DelayedLoad(int nextReg, int nextValue) +{ + registers[registers[LoadReg]] = registers[LoadValueReg]; + registers[LoadReg] = nextReg; + registers[LoadValueReg] = nextValue; + registers[0] = 0; // and always make sure R0 stays zero. +} + +//---------------------------------------------------------------------- +// Instruction::Decode +// Decode a MIPS instruction +//---------------------------------------------------------------------- + +void +Instruction::Decode() +{ + OpInfo *opPtr; + + rs = (value >> 21) & 0x1f; + rt = (value >> 16) & 0x1f; + rd = (value >> 11) & 0x1f; + opPtr = &opTable[(value >> 26) & 0x3f]; + opCode = opPtr->opCode; + if (opPtr->format == IFMT) { + extra = value & 0xffff; + if (extra & 0x8000) { + extra |= 0xffff0000; + } + } else if (opPtr->format == RFMT) { + extra = (value >> 6) & 0x1f; + } else { + extra = value & 0x3ffffff; + } + if (opCode == SPECIAL) { + opCode = specialTable[value & 0x3f]; + } else if (opCode == BCOND) { + int i = value & 0x1f0000; + + if (i == 0) { + opCode = OP_BLTZ; + } else if (i == 0x10000) { + opCode = OP_BGEZ; + } else if (i == 0x100000) { + opCode = OP_BLTZAL; + } else if (i == 0x110000) { + opCode = OP_BGEZAL; + } else { + opCode = OP_UNIMP; + } + } +} + +//---------------------------------------------------------------------- +// Mult +// Simulate R2000 multiplication. +// The words at *hiPtr and *loPtr are overwritten with the +// double-length result of the multiplication. +//---------------------------------------------------------------------- + +static void +Mult(int a, int b, bool signedArith, int* hiPtr, int* loPtr) +{ + if ((a == 0) || (b == 0)) { + *hiPtr = *loPtr = 0; + return; + } + + // Compute the sign of the result, then make everything positive + // so unsigned computation can be done in the main loop. + bool negative = FALSE; + if (signedArith) { + if (a < 0) { + negative = !negative; + a = -a; + } + if (b < 0) { + negative = !negative; + b = -b; + } + } + + // Compute the result in unsigned arithmetic (check a's bits one at + // a time, and add in a shifted value of b). + unsigned int bLo = b; + unsigned int bHi = 0; + unsigned int lo = 0; + unsigned int hi = 0; + for (int i = 0; i < 32; i++) { + if (a & 1) { + lo += bLo; + if (lo < bLo) // Carry out of the low bits? + hi += 1; + hi += bHi; + if ((a & 0xfffffffe) == 0) + break; + } + bHi <<= 1; + if (bLo & 0x80000000) + bHi |= 1; + + bLo <<= 1; + a >>= 1; + } + + // If the result is supposed to be negative, compute the two's + // complement of the double-word result. + if (negative) { + hi = ~hi; + lo = ~lo; + lo++; + if (lo == 0) + hi++; + } + + *hiPtr = (int) hi; + *loPtr = (int) lo; +} diff --git a/code/machine/mipssim.h b/code/machine/mipssim.h new file mode 100644 index 0000000..0d4c5a2 --- /dev/null +++ b/code/machine/mipssim.h @@ -0,0 +1,229 @@ +// mipssim.h +// Internal data structures for simulating the MIPS instruction set. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef MIPSSIM_H +#define MIPSSIM_H + +#include "copyright.h" + +/* + * OpCode values. The names are straight from the MIPS + * manual except for the following special ones: + * + * OP_UNIMP - means that this instruction is legal, but hasn't + * been implemented in the simulator yet. + * OP_RES - means that this is a reserved opcode (it isn't + * supported by the architecture). + */ + +#define OP_ADD 1 +#define OP_ADDI 2 +#define OP_ADDIU 3 +#define OP_ADDU 4 +#define OP_AND 5 +#define OP_ANDI 6 +#define OP_BEQ 7 +#define OP_BGEZ 8 +#define OP_BGEZAL 9 +#define OP_BGTZ 10 +#define OP_BLEZ 11 +#define OP_BLTZ 12 +#define OP_BLTZAL 13 +#define OP_BNE 14 + +#define OP_DIV 16 +#define OP_DIVU 17 +#define OP_J 18 +#define OP_JAL 19 +#define OP_JALR 20 +#define OP_JR 21 +#define OP_LB 22 +#define OP_LBU 23 +#define OP_LH 24 +#define OP_LHU 25 +#define OP_LUI 26 +#define OP_LW 27 +#define OP_LWL 28 +#define OP_LWR 29 + +#define OP_MFHI 31 +#define OP_MFLO 32 + +#define OP_MTHI 34 +#define OP_MTLO 35 +#define OP_MULT 36 +#define OP_MULTU 37 +#define OP_NOR 38 +#define OP_OR 39 +#define OP_ORI 40 +#define OP_RFE 41 +#define OP_SB 42 +#define OP_SH 43 +#define OP_SLL 44 +#define OP_SLLV 45 +#define OP_SLT 46 +#define OP_SLTI 47 +#define OP_SLTIU 48 +#define OP_SLTU 49 +#define OP_SRA 50 +#define OP_SRAV 51 +#define OP_SRL 52 +#define OP_SRLV 53 +#define OP_SUB 54 +#define OP_SUBU 55 +#define OP_SW 56 +#define OP_SWL 57 +#define OP_SWR 58 +#define OP_XOR 59 +#define OP_XORI 60 +#define OP_SYSCALL 61 +#define OP_UNIMP 62 +#define OP_RES 63 +#define MaxOpcode 63 + +/* + * Miscellaneous definitions: + */ + +#define IndexToAddr(x) ((x) << 2) + +#define SIGN_BIT 0x80000000 +#define R31 31 + +/* + * The table below is used to translate bits 31:26 of the instruction + * into a value suitable for the "opCode" field of a MemWord structure, + * or into a special value for further decoding. + */ + +#define SPECIAL 100 +#define BCOND 101 + +#define IFMT 1 +#define JFMT 2 +#define RFMT 3 + +struct OpInfo { + int opCode; /* Translated op code. */ + int format; /* Format type (IFMT or JFMT or RFMT) */ +}; + +static OpInfo opTable[] = { + {SPECIAL, RFMT}, {BCOND, IFMT}, {OP_J, JFMT}, {OP_JAL, JFMT}, + {OP_BEQ, IFMT}, {OP_BNE, IFMT}, {OP_BLEZ, IFMT}, {OP_BGTZ, IFMT}, + {OP_ADDI, IFMT}, {OP_ADDIU, IFMT}, {OP_SLTI, IFMT}, {OP_SLTIU, IFMT}, + {OP_ANDI, IFMT}, {OP_ORI, IFMT}, {OP_XORI, IFMT}, {OP_LUI, IFMT}, + {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, + {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, + {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, + {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, + {OP_LB, IFMT}, {OP_LH, IFMT}, {OP_LWL, IFMT}, {OP_LW, IFMT}, + {OP_LBU, IFMT}, {OP_LHU, IFMT}, {OP_LWR, IFMT}, {OP_RES, IFMT}, + {OP_SB, IFMT}, {OP_SH, IFMT}, {OP_SWL, IFMT}, {OP_SW, IFMT}, + {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_SWR, IFMT}, {OP_RES, IFMT}, + {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, + {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, + {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, + {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT} +}; + +/* + * The table below is used to convert the "funct" field of SPECIAL + * instructions into the "opCode" field of a MemWord. + */ + +static int specialTable[] = { + OP_SLL, OP_RES, OP_SRL, OP_SRA, OP_SLLV, OP_RES, OP_SRLV, OP_SRAV, + OP_JR, OP_JALR, OP_RES, OP_RES, OP_SYSCALL, OP_UNIMP, OP_RES, OP_RES, + OP_MFHI, OP_MTHI, OP_MFLO, OP_MTLO, OP_RES, OP_RES, OP_RES, OP_RES, + OP_MULT, OP_MULTU, OP_DIV, OP_DIVU, OP_RES, OP_RES, OP_RES, OP_RES, + OP_ADD, OP_ADDU, OP_SUB, OP_SUBU, OP_AND, OP_OR, OP_XOR, OP_NOR, + OP_RES, OP_RES, OP_SLT, OP_SLTU, OP_RES, OP_RES, OP_RES, OP_RES, + OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, + OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES +}; + + +// Stuff to help print out each instruction, for debugging + +enum RegType { NONE, RS, RT, RD, EXTRA }; + +struct OpString { + char *format; // Printed version of instruction + RegType args[3]; +}; + +static struct OpString opStrings[] = { + {"Shouldn't happen", {NONE, NONE, NONE}}, + {"ADD r%d,r%d,r%d", {RD, RS, RT}}, + {"ADDI r%d,r%d,%d", {RT, RS, EXTRA}}, + {"ADDIU r%d,r%d,%d", {RT, RS, EXTRA}}, + {"ADDU r%d,r%d,r%d", {RD, RS, RT}}, + {"AND r%d,r%d,r%d", {RD, RS, RT}}, + {"ANDI r%d,r%d,%d", {RT, RS, EXTRA}}, + {"BEQ r%d,r%d,%d", {RS, RT, EXTRA}}, + {"BGEZ r%d,%d", {RS, EXTRA, NONE}}, + {"BGEZAL r%d,%d", {RS, EXTRA, NONE}}, + {"BGTZ r%d,%d", {RS, EXTRA, NONE}}, + {"BLEZ r%d,%d", {RS, EXTRA, NONE}}, + {"BLTZ r%d,%d", {RS, EXTRA, NONE}}, + {"BLTZAL r%d,%d", {RS, EXTRA, NONE}}, + {"BNE r%d,r%d,%d", {RS, RT, EXTRA}}, + {"Shouldn't happen", {NONE, NONE, NONE}}, + {"DIV r%d,r%d", {RS, RT, NONE}}, + {"DIVU r%d,r%d", {RS, RT, NONE}}, + {"J %d", {EXTRA, NONE, NONE}}, + {"JAL %d", {EXTRA, NONE, NONE}}, + {"JALR r%d,r%d", {RD, RS, NONE}}, + {"JR r%d,r%d", {RD, RS, NONE}}, + {"LB r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"LBU r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"LH r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"LHU r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"LUI r%d,%d", {RT, EXTRA, NONE}}, + {"LW r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"LWL r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"LWR r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"Shouldn't happen", {NONE, NONE, NONE}}, + {"MFHI r%d", {RD, NONE, NONE}}, + {"MFLO r%d", {RD, NONE, NONE}}, + {"Shouldn't happen", {NONE, NONE, NONE}}, + {"MTHI r%d", {RS, NONE, NONE}}, + {"MTLO r%d", {RS, NONE, NONE}}, + {"MULT r%d,r%d", {RS, RT, NONE}}, + {"MULTU r%d,r%d", {RS, RT, NONE}}, + {"NOR r%d,r%d,r%d", {RD, RS, RT}}, + {"OR r%d,r%d,r%d", {RD, RS, RT}}, + {"ORI r%d,r%d,%d", {RT, RS, EXTRA}}, + {"RFE", {NONE, NONE, NONE}}, + {"SB r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"SH r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"SLL r%d,r%d,%d", {RD, RT, EXTRA}}, + {"SLLV r%d,r%d,r%d", {RD, RT, RS}}, + {"SLT r%d,r%d,r%d", {RD, RS, RT}}, + {"SLTI r%d,r%d,%d", {RT, RS, EXTRA}}, + {"SLTIU r%d,r%d,%d", {RT, RS, EXTRA}}, + {"SLTU r%d,r%d,r%d", {RD, RS, RT}}, + {"SRA r%d,r%d,%d", {RD, RT, EXTRA}}, + {"SRAV r%d,r%d,r%d", {RD, RT, RS}}, + {"SRL r%d,r%d,%d", {RD, RT, EXTRA}}, + {"SRLV r%d,r%d,r%d", {RD, RT, RS}}, + {"SUB r%d,r%d,r%d", {RD, RS, RT}}, + {"SUBU r%d,r%d,r%d", {RD, RS, RT}}, + {"SW r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"SWL r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"SWR r%d,%d(r%d)", {RT, EXTRA, RS}}, + {"XOR r%d,r%d,r%d", {RD, RS, RT}}, + {"XORI r%d,r%d,%d", {RT, RS, EXTRA}}, + {"SYSCALL", {NONE, NONE, NONE}}, + {"Unimplemented", {NONE, NONE, NONE}}, + {"Reserved", {NONE, NONE, NONE}} + }; + +#endif // MIPSSIM_H diff --git a/code/machine/network.cc b/code/machine/network.cc new file mode 100644 index 0000000..395ffb2 --- /dev/null +++ b/code/machine/network.cc @@ -0,0 +1,182 @@ +// network.cc +// Routines to simulate a network interface, using UNIX sockets +// to deliver packets between multiple invocations of nachos. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "network.h" +#include "main.h" + +//----------------------------------------------------------------------- +// NetworkInput::NetworkInput +// Initialize the simulation for the network input +// +// "toCall" is the interrupt handler to call when packet arrives +//----------------------------------------------------------------------- + +NetworkInput::NetworkInput(CallBackObj *toCall) +{ + // set up the stuff to emulate asynchronous interrupts + callWhenAvail = toCall; + packetAvail = FALSE; + inHdr.length = 0; + + sock = OpenSocket(); + sprintf(sockName, "SOCKET_%d", kernel->hostName); + AssignNameToSocket(sockName, sock); // Bind socket to a filename + // in the current directory. + + // start polling for incoming packets + kernel->interrupt->Schedule(this, NetworkTime, NetworkRecvInt); +} + +//----------------------------------------------------------------------- +// NetworkInput::NetworkInput +// Deallocate the simulation for the network input +// (basically, deallocate the input mailbox) +//----------------------------------------------------------------------- + +NetworkInput::~NetworkInput() +{ + CloseSocket(sock); + DeAssignNameToSocket(sockName); +} + +//----------------------------------------------------------------------- +// NetworkInput::CallBack +// Simulator calls this when a packet may be available to +// be read in from the simulated network. +// +// First check to make sure packet is available & there's space to +// pull it in. Then invoke the "callBack" registered by whoever +// wants the packet. +//----------------------------------------------------------------------- + +void +NetworkInput::CallBack() +{ + // schedule the next time to poll for a packet + kernel->interrupt->Schedule(this, NetworkTime, NetworkRecvInt); + + if (inHdr.length != 0) // do nothing if packet is already buffered + return; + if (!PollSocket(sock)) // do nothing if no packet to be read + return; + + // otherwise, read packet in + char *buffer = new char[MaxWireSize]; + ReadFromSocket(sock, buffer, MaxWireSize); + + // divide packet into header and data + inHdr = *(PacketHeader *)buffer; + ASSERT((inHdr.to == kernel->hostName) && (inHdr.length <= MaxPacketSize)); + bcopy(buffer + sizeof(PacketHeader), inbox, inHdr.length); + delete [] buffer ; + + DEBUG(dbgNet, "Network received packet from " << inHdr.from << ", length " << inHdr.length); + kernel->stats->numPacketsRecvd++; + + // tell post office that the packet has arrived + callWhenAvail->CallBack(); +} + +//----------------------------------------------------------------------- +// NetworkInput::Receive +// Read a packet, if one is buffered +//----------------------------------------------------------------------- + +PacketHeader +NetworkInput::Receive(char* data) +{ + PacketHeader hdr = inHdr; + + inHdr.length = 0; + if (hdr.length != 0) { + bcopy(inbox, data, hdr.length); + } + return hdr; +} + +//----------------------------------------------------------------------- +// NetworkOutput::NetworkOutput +// Initialize the simulation for sending network packets +// +// "reliability" says whether we drop packets to emulate unreliable links +// "toCall" is the interrupt handler to call when next packet can be sent +//----------------------------------------------------------------------- + +NetworkOutput::NetworkOutput(double reliability, CallBackObj *toCall) +{ + if (reliability < 0) chanceToWork = 0; + else if (reliability > 1) chanceToWork = 1; + else chanceToWork = reliability; + + // set up the stuff to emulate asynchronous interrupts + callWhenDone = toCall; + sendBusy = FALSE; + sock = OpenSocket(); +} + +//----------------------------------------------------------------------- +// NetworkOutput::~NetworkOutput +// Deallocate the simulation for sending network packets +//----------------------------------------------------------------------- + +NetworkOutput::~NetworkOutput() +{ + CloseSocket(sock); +} + +//----------------------------------------------------------------------- +// NetworkOutput::CallBack +// Called by simulator when another packet can be sent. +//----------------------------------------------------------------------- + +void +NetworkOutput::CallBack() +{ + sendBusy = FALSE; + kernel->stats->numPacketsSent++; + callWhenDone->CallBack(); +} + +//----------------------------------------------------------------------- +// NetworkOutput::Send +// Send a packet into the simulated network, to the destination in hdr. +// Concatenate hdr and data, and schedule an interrupt to tell the user +// when the next packet can be sent +// +// Note we always pad out a packet to MaxWireSize before putting it into +// the socket, because it's simpler at the receive end. +//----------------------------------------------------------------------- + +void +NetworkOutput::Send(PacketHeader hdr, char* data) +{ + char toName[32]; + + sprintf(toName, "SOCKET_%d", (int)hdr.to); + + ASSERT((sendBusy == FALSE) && (hdr.length > 0) && + (hdr.length <= MaxPacketSize) && (hdr.from == kernel->hostName)); + DEBUG(dbgNet, "Sending to addr " << hdr.to << ", length " << hdr.length); + + kernel->interrupt->Schedule(this, NetworkTime, NetworkSendInt); + + if (RandomNumber() % 100 >= chanceToWork * 100) { // emulate a lost packet + DEBUG(dbgNet, "oops, lost it!"); + return; + } + + // concatenate hdr and data into a single buffer, and send it out + char *buffer = new char[MaxWireSize]; + *(PacketHeader *)buffer = hdr; + bcopy(data, buffer + sizeof(PacketHeader), hdr.length); + SendToSocket(sock, buffer, MaxWireSize, toName); + delete [] buffer; +} diff --git a/code/machine/network.h b/code/machine/network.h new file mode 100644 index 0000000..f725bd7 --- /dev/null +++ b/code/machine/network.h @@ -0,0 +1,110 @@ +// network.h +// Data structures to emulate a physical network connection. +// The network provides the abstraction of ordered, unreliable, +// fixed-size packet delivery to other machines on the network. +// +// You may note that the interface to the network is similar to +// the console device -- both are full duplex channels. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef NETWORK_H +#define NETWORK_H + +#include "copyright.h" +#include "utility.h" +#include "callback.h" + +// Network address -- uniquely identifies a machine. This machine's ID +// is given on the command line. +typedef int NetworkAddress; + +// The following class defines the network packet header. +// The packet header is prepended to the data payload by the Network driver, +// before the packet is sent over the wire. The format on the wire is: +// packet header (PacketHeader) +// data (containing MailHeader from the PostOffice!) + +class PacketHeader { + public: + NetworkAddress to; // Destination machine ID + NetworkAddress from; // source machine ID + unsigned length; // bytes of packet data, excluding the + // packet header (but including the + // MailHeader prepended by the post office) +}; + +#define MaxWireSize 64 // largest packet that can go out on the wire +#define MaxPacketSize (MaxWireSize - sizeof(struct PacketHeader)) + // data "payload" of the largest packet + + +// The following two classes defines a physical network device. The network +// is capable of delivering fixed sized packets, in order but unreliably, +// to other machines connected to the network. +// +// The "reliability" of the network can be specified to the constructor. +// This number, between 0 and 1, is the chance that the network will lose +// a packet. Note that you can change the seed for the random number +// generator, by changing the arguments to RandomInit() in Initialize(). +// The random number generator is used to choose which packets to drop. + +class NetworkInput : public CallBackObj{ + public: + NetworkInput(CallBackObj *toCall); + // Allocate and initialize network input driver + ~NetworkInput(); // De-allocate the network input driver data + + PacketHeader Receive(char* data); + // Poll the network for incoming messages. + // If there is a packet waiting, copy the + // packet into "data" and return the header. + // If no packet is waiting, return a header + // with length 0. + + void CallBack(); // A packet may have arrived. + + private: + int sock; // UNIX socket number for incoming packets + char sockName[32]; // File name corresponding to UNIX socket + + CallBackObj *callWhenAvail; // Interrupt handler, signalling packet has + // arrived. + bool packetAvail; // Packet has arrived, can be pulled off of + // network + PacketHeader inHdr; // Information about arrived packet + char inbox[MaxPacketSize]; // Data for arrived packet +}; + +class NetworkOutput : public CallBackObj { + public: + NetworkOutput(double reliability, CallBackObj *toCall); + // Allocate and initialize network output driver + ~NetworkOutput(); // De-allocate the network input driver data + + void Send(PacketHeader hdr, char* data); + // Send the packet data to a remote machine, + // specified by "hdr". Returns immediately. + // "callWhenDone" is invoked once the next + // packet can be sent. Note that callWhenDone + // is called whether or not the packet is + // dropped, and note that the "from" field of + // the PacketHeader is filled in automatically + // by Send(). + + void CallBack(); // Interrupt handler, called when message is + // sent + + private: + int sock; // UNIX socket number for outgoing packets + double chanceToWork; // Likelihood packet will be dropped + CallBackObj *callWhenDone; // Interrupt handler, signalling next packet + // can be sent. + bool sendBusy; // Packet is being sent. +}; + +#endif // NETWORK_H diff --git a/code/machine/stats.cc b/code/machine/stats.cc new file mode 100644 index 0000000..11999be --- /dev/null +++ b/code/machine/stats.cc @@ -0,0 +1,45 @@ +// stats.h +// Routines for managing statistics about Nachos performance. +// +// DO NOT CHANGE -- these stats are maintained by the machine emulation. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "debug.h" +#include "stats.h" + +//---------------------------------------------------------------------- +// Statistics::Statistics +// Initialize performance metrics to zero, at system startup. +//---------------------------------------------------------------------- + +Statistics::Statistics() +{ + totalTicks = idleTicks = systemTicks = userTicks = 0; + numDiskReads = numDiskWrites = 0; + numConsoleCharsRead = numConsoleCharsWritten = 0; + numPageFaults = numPacketsSent = numPacketsRecvd = 0; +} + +//---------------------------------------------------------------------- +// Statistics::Print +// Print performance metrics, when we've finished everything +// at system shutdown. +//---------------------------------------------------------------------- + +void +Statistics::Print() +{ + cout << "Ticks: total " << totalTicks << ", idle " << idleTicks; + cout << ", system " << systemTicks << ", user " << userTicks <<"\n"; + cout << "Disk I/O: reads " << numDiskReads; + cout << ", writes " << numDiskWrites << "\n"; + cout << "Console I/O: reads " << numConsoleCharsRead; + cout << ", writes " << numConsoleCharsWritten << "\n"; + cout << "Paging: faults " << numPageFaults << "\n"; + cout << "Network I/O: packets received " << numPacketsRecvd; + cout << ", sent " << numPacketsSent << "\n"; +} diff --git a/code/machine/stats.h b/code/machine/stats.h new file mode 100644 index 0000000..946c3b9 --- /dev/null +++ b/code/machine/stats.h @@ -0,0 +1,60 @@ +// stats.h +// Data structures for gathering statistics about Nachos performance. +// +// DO NOT CHANGE -- these stats are maintained by the machine emulation +// +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef STATS_H +#define STATS_H + +#include "copyright.h" + +// The following class defines the statistics that are to be kept +// about Nachos behavior -- how much time (ticks) elapsed, how +// many user instructions executed, etc. +// +// The fields in this class are public to make it easier to update. + +class Statistics { + public: + int totalTicks; // Total time running Nachos + int idleTicks; // Time spent idle (no threads to run) + int systemTicks; // Time spent executing system code + int userTicks; // Time spent executing user code + // (this is also equal to # of + // user instructions executed) + + int numDiskReads; // number of disk read requests + int numDiskWrites; // number of disk write requests + int numConsoleCharsRead; // number of characters read from the keyboard + int numConsoleCharsWritten; // number of characters written to the display + int numPageFaults; // number of virtual memory page faults + int numPacketsSent; // number of packets sent over the network + int numPacketsRecvd; // number of packets received over the network + + Statistics(); // initialize everything to zero + + void Print(); // print collected statistics +}; + +// Constants used to reflect the relative time an operation would +// take in a real system. A "tick" is a just a unit of time -- if you +// like, a microsecond. +// +// Since Nachos kernel code is directly executed, and the time spent +// in the kernel measured by the number of calls to enable interrupts, +// these time constants are none too exact. + +const int UserTick = 1; // advance for each user-level instruction +const int SystemTick = 10; // advance each time interrupts are enabled +const int RotationTime = 500; // time disk takes to rotate one sector +const int SeekTime = 500; // time disk takes to seek past one track +const int ConsoleTime = 100; // time to read or write one character +const int NetworkTime = 100; // time to send or receive one packet +const int TimerTicks = 100; // (average) time between timer interrupts + +#endif // STATS_H diff --git a/code/machine/timer.cc b/code/machine/timer.cc new file mode 100644 index 0000000..2c6ccbd --- /dev/null +++ b/code/machine/timer.cc @@ -0,0 +1,81 @@ +// timer.cc +// Routines to emulate a hardware timer device. +// +// A hardware timer generates a CPU interrupt every X milliseconds. +// This means it can be used for implementing time-slicing. +// +// We emulate a hardware timer by scheduling an interrupt to occur +// every time stats->totalTicks has increased by TimerTicks. +// +// In order to introduce some randomness into time-slicing, if "doRandom" +// is set, then the interrupt is comes after a random number of ticks. +// +// Remember -- nothing in here is part of Nachos. It is just +// an emulation for the hardware that Nachos is running on top of. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "timer.h" +#include "main.h" +#include "sysdep.h" + +//---------------------------------------------------------------------- +// Timer::Timer +// Initialize a hardware timer device. Save the place to call +// on each interrupt, and then arrange for the timer to start +// generating interrupts. +// +// "doRandom" -- if true, arrange for the interrupts to occur +// at random, instead of fixed, intervals. +// "toCall" is the interrupt handler to call when the timer expires. +//---------------------------------------------------------------------- + +Timer::Timer(bool doRandom, CallBackObj *toCall) +{ + randomize = doRandom; + callPeriodically = toCall; + disable = FALSE; + SetInterrupt(); +} + +//---------------------------------------------------------------------- +// Timer::CallBack +// Routine called when interrupt is generated by the hardware +// timer device. Schedule the next interrupt, and invoke the +// interrupt handler. +//---------------------------------------------------------------------- +void +Timer::CallBack() +{ + // invoke the Nachos interrupt handler for this device + callPeriodically->CallBack(); + + SetInterrupt(); // do last, to let software interrupt handler + // decide if it wants to disable future interrupts +} + +//---------------------------------------------------------------------- +// Timer::SetInterrupt +// Cause a timer interrupt to occur in the future, unless +// future interrupts have been disabled. The delay is either +// fixed or random. +//---------------------------------------------------------------------- + +void +Timer::SetInterrupt() +{ + if (!disable) { + int delay = TimerTicks; + + if (randomize) { + delay = 1 + (RandomNumber() % (TimerTicks * 2)); + } + // schedule the next timer device interrupt + kernel->interrupt->Schedule(this, delay, TimerInt); + } +} diff --git a/code/machine/timer.h b/code/machine/timer.h new file mode 100644 index 0000000..f02fef5 --- /dev/null +++ b/code/machine/timer.h @@ -0,0 +1,53 @@ +// timer.h +// Data structures to emulate a hardware timer. +// +// A hardware timer generates a CPU interrupt every X milliseconds. +// This means it can be used for implementing time-slicing, or for +// having a thread go to sleep for a specific period of time. +// +// We emulate a hardware timer by scheduling an interrupt to occur +// every time stats->totalTicks has increased by TimerTicks. +// +// In order to introduce some randomness into time-slicing, if "doRandom" +// is set, then the interrupt comes after a random number of ticks. +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef TIMER_H +#define TIMER_H + +#include "copyright.h" +#include "utility.h" +#include "callback.h" + +// The following class defines a hardware timer. +class Timer : public CallBackObj { + public: + Timer(bool doRandom, CallBackObj *toCall); + // Initialize the timer, and callback to "toCall" + // every time slice. + virtual ~Timer() {} + + void Disable() { disable = TRUE; } + // Turn timer device off, so it doesn't + // generate any more interrupts. + + private: + bool randomize; // set if we need to use a random timeout delay + CallBackObj *callPeriodically; // call this every TimerTicks time units + bool disable; // turn off the timer device after next + // interrupt. + + void CallBack(); // called internally when the hardware + // timer generates an interrupt + + void SetInterrupt(); // cause an interrupt to occur in the + // the future after a fixed or random + // delay +}; + +#endif // TIMER_H diff --git a/code/machine/translate.cc b/code/machine/translate.cc new file mode 100644 index 0000000..969203b --- /dev/null +++ b/code/machine/translate.cc @@ -0,0 +1,250 @@ +// translate.cc +// Routines to translate virtual addresses to physical addresses. +// Software sets up a table of legal translations. We look up +// in the table on every memory reference to find the true physical +// memory location. +// +// Two types of translation are supported here. +// +// Linear page table -- the virtual page # is used as an index +// into the table, to find the physical page #. +// +// Translation lookaside buffer -- associative lookup in the table +// to find an entry with the same virtual page #. If found, +// this entry is used for the translation. +// If not, it traps to software with an exception. +// +// In practice, the TLB is much smaller than the amount of physical +// memory (16 entries is common on a machine that has 1000's of +// pages). Thus, there must also be a backup translation scheme +// (such as page tables), but the hardware doesn't need to know +// anything at all about that. +// +// Note that the contents of the TLB are specific to an address space. +// If the address space changes, so does the contents of the TLB! +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "main.h" + +// Routines for converting Words and Short Words to and from the +// simulated machine's format of little endian. These end up +// being NOPs when the host machine is also little endian (DEC and Intel). + +unsigned int +WordToHost(unsigned int word) { +#ifdef HOST_IS_BIG_ENDIAN + register unsigned long result; + result = (word >> 24) & 0x000000ff; + result |= (word >> 8) & 0x0000ff00; + result |= (word << 8) & 0x00ff0000; + result |= (word << 24) & 0xff000000; + return result; +#else + return word; +#endif /* HOST_IS_BIG_ENDIAN */ +} + +unsigned short +ShortToHost(unsigned short shortword) { +#ifdef HOST_IS_BIG_ENDIAN + register unsigned short result; + result = (shortword << 8) & 0xff00; + result |= (shortword >> 8) & 0x00ff; + return result; +#else + return shortword; +#endif /* HOST_IS_BIG_ENDIAN */ +} + +unsigned int +WordToMachine(unsigned int word) { return WordToHost(word); } + +unsigned short +ShortToMachine(unsigned short shortword) { return ShortToHost(shortword); } + + +//---------------------------------------------------------------------- +// Machine::ReadMem +// Read "size" (1, 2, or 4) bytes of virtual memory at "addr" into +// the location pointed to by "value". +// +// Returns FALSE if the translation step from virtual to physical memory +// failed. +// +// "addr" -- the virtual address to read from +// "size" -- the number of bytes to read (1, 2, or 4) +// "value" -- the place to write the result +//---------------------------------------------------------------------- + +bool +Machine::ReadMem(int addr, int size, int *value) +{ + int data; + ExceptionType exception; + int physicalAddress; + + DEBUG(dbgAddr, "Reading VA " << addr << ", size " << size); + + exception = Translate(addr, &physicalAddress, size, FALSE); + if (exception != NoException) { + RaiseException(exception, addr); + return FALSE; + } + switch (size) { + case 1: + data = mainMemory[physicalAddress]; + *value = data; + break; + + case 2: + data = *(unsigned short *) &mainMemory[physicalAddress]; + *value = ShortToHost(data); + break; + + case 4: + data = *(unsigned int *) &mainMemory[physicalAddress]; + *value = WordToHost(data); + break; + + default: ASSERT(FALSE); + } + + DEBUG(dbgAddr, "\tvalue read = " << *value); + return (TRUE); +} + +//---------------------------------------------------------------------- +// Machine::WriteMem +// Write "size" (1, 2, or 4) bytes of the contents of "value" into +// virtual memory at location "addr". +// +// Returns FALSE if the translation step from virtual to physical memory +// failed. +// +// "addr" -- the virtual address to write to +// "size" -- the number of bytes to be written (1, 2, or 4) +// "value" -- the data to be written +//---------------------------------------------------------------------- + +bool +Machine::WriteMem(int addr, int size, int value) +{ + ExceptionType exception; + int physicalAddress; + + DEBUG(dbgAddr, "Writing VA " << addr << ", size " << size << ", value " << value); + + exception = Translate(addr, &physicalAddress, size, TRUE); + if (exception != NoException) { + RaiseException(exception, addr); + return FALSE; + } + switch (size) { + case 1: + mainMemory[physicalAddress] = (unsigned char) (value & 0xff); + break; + + case 2: + *(unsigned short *) &mainMemory[physicalAddress] + = ShortToMachine((unsigned short) (value & 0xffff)); + break; + + case 4: + *(unsigned int *) &mainMemory[physicalAddress] + = WordToMachine((unsigned int) value); + break; + + default: ASSERT(FALSE); + } + + return TRUE; +} + +//---------------------------------------------------------------------- +// Machine::Translate +// Translate a virtual address into a physical address, using +// either a page table or a TLB. Check for alignment and all sorts +// of other errors, and if everything is ok, set the use/dirty bits in +// the translation table entry, and store the translated physical +// address in "physAddr". If there was an error, returns the type +// of the exception. +// +// "virtAddr" -- the virtual address to translate +// "physAddr" -- the place to store the physical address +// "size" -- the amount of memory being read or written +// "writing" -- if TRUE, check the "read-only" bit in the TLB +//---------------------------------------------------------------------- + +ExceptionType +Machine::Translate(int virtAddr, int* physAddr, int size, bool writing) +{ + int i; + unsigned int vpn, offset; + TranslationEntry *entry; + unsigned int pageFrame; + + DEBUG(dbgAddr, "\tTranslate " << virtAddr << (writing ? " , write" : " , read")); + +// check for alignment errors + if (((size == 4) && (virtAddr & 0x3)) || ((size == 2) && (virtAddr & 0x1))){ + DEBUG(dbgAddr, "Alignment problem at " << virtAddr << ", size " << size); + return AddressErrorException; + } + // we must have either a TLB or a page table, but not both! + ASSERT(tlb == NULL || pageTable == NULL); + ASSERT(tlb != NULL || pageTable != NULL); + +// calculate the virtual page number, and offset within the page, +// from the virtual address + vpn = (unsigned) virtAddr / PageSize; + offset = (unsigned) virtAddr % PageSize; + + if (tlb == NULL) { // => page table => vpn is index into table + if (vpn >= pageTableSize) { + DEBUG(dbgAddr, "Illegal virtual page # " << virtAddr); + return AddressErrorException; + } else if (!pageTable[vpn].valid) { + DEBUG(dbgAddr, "Invalid virtual page # " << virtAddr); + return PageFaultException; + } + entry = &pageTable[vpn]; + } else { + for (entry = NULL, i = 0; i < TLBSize; i++) + if (tlb[i].valid && (tlb[i].virtualPage == ((int)vpn))) { + entry = &tlb[i]; // FOUND! + break; + } + if (entry == NULL) { // not found + DEBUG(dbgAddr, "Invalid TLB entry for this virtual page!"); + return PageFaultException; // really, this is a TLB fault, + // the page may be in memory, + // but not in the TLB + } + } + + if (entry->readOnly && writing) { // trying to write to a read-only page + DEBUG(dbgAddr, "Write to read-only page at " << virtAddr); + return ReadOnlyException; + } + pageFrame = entry->physicalPage; + + // if the pageFrame is too big, there is something really wrong! + // An invalid translation was loaded into the page table or TLB. + if (pageFrame >= NumPhysPages) { + DEBUG(dbgAddr, "Illegal pageframe " << pageFrame); + return BusErrorException; + } + entry->use = TRUE; // set the use, dirty bits + if (writing) + entry->dirty = TRUE; + *physAddr = pageFrame * PageSize + offset; + ASSERT((*physAddr >= 0) && ((*physAddr + size) <= MemorySize)); + DEBUG(dbgAddr, "phys addr = " << *physAddr); + return NoException; +} diff --git a/code/machine/translate.h b/code/machine/translate.h new file mode 100644 index 0000000..8f355cd --- /dev/null +++ b/code/machine/translate.h @@ -0,0 +1,45 @@ +// translate.h +// Data structures for managing the translation from +// virtual page # -> physical page #, used for managing +// physical memory on behalf of user programs. +// +// The data structures in this file are "dual-use" - they +// serve both as a page table entry, and as an entry in +// a software-managed translation lookaside buffer (TLB). +// Either way, each entry is of the form: +// . +// +// DO NOT CHANGE -- part of the machine emulation +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef TLB_H +#define TLB_H + +#include "copyright.h" +#include "utility.h" + +// The following class defines an entry in a translation table -- either +// in a page table or a TLB. Each entry defines a mapping from one +// virtual page to one physical page. +// In addition, there are some extra bits for access control (valid and +// read-only) and some bits for usage information (use and dirty). + +class TranslationEntry { + public: + int virtualPage; // The page number in virtual memory. + int physicalPage; // The page number in real memory (relative to the + // start of "mainMemory" + bool valid; // If this bit is set, the translation is ignored. + // (In other words, the entry hasn't been initialized.) + bool readOnly; // If this bit is set, the user program is not allowed + // to modify the contents of the page. + bool use; // This bit is set by the hardware every time the + // page is referenced or modified. + bool dirty; // This bit is set by the hardware every time the + // page is modified. +}; + +#endif diff --git a/code/network/post.cc b/code/network/post.cc new file mode 100644 index 0000000..c9dcb20 --- /dev/null +++ b/code/network/post.cc @@ -0,0 +1,344 @@ +// post.cc +// Routines to deliver incoming network messages to the correct +// "address" -- a mailbox, or a holding area for incoming messages. +// This module operates just like the US postal service (in other +// words, it works, but it's slow, and you can't really be sure if +// your mail really got through!). +// +// Note that once we prepend the MailHdr to the outgoing message data, +// the combination (MailHdr plus data) looks like "data" to the Network +// device. +// +// The implementation synchronizes incoming messages with threads +// waiting for those messages. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "post.h" + +//---------------------------------------------------------------------- +// Mail::Mail +// Initialize a single mail message, by concatenating the headers to +// the data. +// +// "pktH" -- source, destination machine ID's +// "mailH" -- source, destination mailbox ID's +// "data" -- payload data +//---------------------------------------------------------------------- + +Mail::Mail(PacketHeader pktH, MailHeader mailH, char *msgData) +{ + ASSERT(mailH.length <= MaxMailSize); + + pktHdr = pktH; + mailHdr = mailH; + bcopy(msgData, data, mailHdr.length); +} + +//---------------------------------------------------------------------- +// MailBox::MailBox +// Initialize a single mail box within the post office, so that it +// can receive incoming messages. +// +// Just initialize a list of messages, representing the mailbox. +//---------------------------------------------------------------------- + + +MailBox::MailBox() +{ + messages = new SynchList(); +} + +//---------------------------------------------------------------------- +// MailBox::~MailBox +// De-allocate a single mail box within the post office. +// +// Just delete the mailbox, and throw away all the queued messages +// in the mailbox. +//---------------------------------------------------------------------- + +MailBox::~MailBox() +{ + delete messages; +} + +//---------------------------------------------------------------------- +// PrintHeader +// Print the message header -- the destination machine ID and mailbox +// #, source machine ID and mailbox #, and message length. +// +// "pktHdr" -- source, destination machine ID's +// "mailHdr" -- source, destination mailbox ID's +//---------------------------------------------------------------------- + +static void +PrintHeader(PacketHeader pktHdr, MailHeader mailHdr) +{ + cout << "From (" << pktHdr.from << ", " << mailHdr.from << ") to (" << + pktHdr.to << ", " << mailHdr.to << ") bytes " << mailHdr.length << "\n"; +} + +//---------------------------------------------------------------------- +// MailBox::Put +// Add a message to the mailbox. If anyone is waiting for message +// arrival, wake them up! +// +// We need to reconstruct the Mail message (by concatenating the headers +// to the data), to simplify queueing the message on the SynchList. +// +// "pktHdr" -- source, destination machine ID's +// "mailHdr" -- source, destination mailbox ID's +// "data" -- payload message data +//---------------------------------------------------------------------- + +void +MailBox::Put(PacketHeader pktHdr, MailHeader mailHdr, char *data) +{ + Mail *mail = new Mail(pktHdr, mailHdr, data); + + messages->Append(mail); // put on the end of the list of + // arrived messages, and wake up + // any waiters +} + +//---------------------------------------------------------------------- +// MailBox::Get +// Get a message from a mailbox, parsing it into the packet header, +// mailbox header, and data. +// +// The calling thread waits if there are no messages in the mailbox. +// +// "pktHdr" -- address to put: source, destination machine ID's +// "mailHdr" -- address to put: source, destination mailbox ID's +// "data" -- address to put: payload message data +//---------------------------------------------------------------------- + +void +MailBox::Get(PacketHeader *pktHdr, MailHeader *mailHdr, char *data) +{ + DEBUG(dbgNet, "Waiting for mail in mailbox"); + Mail *mail = messages->RemoveFront(); // remove message from list; + // will wait if list is empty + + *pktHdr = mail->pktHdr; + *mailHdr = mail->mailHdr; + if (debug->IsEnabled('n')) { + cout << "Got mail from mailbox: "; + PrintHeader(*pktHdr, *mailHdr); + } + bcopy(mail->data, data, mail->mailHdr.length); + // copy the message data into + // the caller's buffer + delete mail; // we've copied out the stuff we + // need, we can now discard the message +} + +//---------------------------------------------------------------------- +// PostOfficeInput::PostOfficeInput +// Initialize the post office input queues as a collection of mailboxes. +// Also initialize the network device, to allow post offices +// on different machines to deliver messages to one another. +// +// We use a separate thread "the postal worker" to wait for messages +// to arrive, and deliver them to the correct mailbox. Note that +// delivering messages to the mailboxes can't be done directly +// by the interrupt handlers, because it requires a Lock. +// +// "nBoxes" is the number of mail boxes in this Post Office +//---------------------------------------------------------------------- + +PostOfficeInput::PostOfficeInput(int nBoxes) +{ + messageAvailable = new Semaphore("message available", 0); + + numBoxes = nBoxes; + boxes = new MailBox[nBoxes]; + + network = new NetworkInput(this); + + Thread *t = new Thread("postal worker", 1); + + t->Fork(PostOfficeInput::PostalDelivery, this); +} + +//---------------------------------------------------------------------- +// PostOfficeInput::~PostOfficeInput +// De-allocate the post office data structures. +// +// Since the postal helper is waiting on the "messageAvail" semaphore, +// we don't deallocate it! This leaves garbage lying about, +// but the alternative is worse! +//---------------------------------------------------------------------- + +PostOfficeInput::~PostOfficeInput() +{ + delete network; + delete [] boxes; +} + +//---------------------------------------------------------------------- +// PostOffice::PostalDelivery +// Wait for incoming messages, and put them in the right mailbox. +// +// Incoming messages have had the PacketHeader stripped off, +// but the MailHeader is still tacked on the front of the data. +//---------------------------------------------------------------------- + +void +PostOfficeInput::PostalDelivery(void* data) +{ + PostOfficeInput* _this = (PostOfficeInput*)data; + PacketHeader pktHdr; + MailHeader mailHdr; + char *buffer = new char[MaxPacketSize]; + + for (;;) { + // first, wait for a message + _this->messageAvailable->P(); + pktHdr = _this->network->Receive(buffer); + + mailHdr = *(MailHeader *)buffer; + if (debug->IsEnabled('n')) { + cout << "Putting mail into mailbox: "; + PrintHeader(pktHdr, mailHdr); + } + + // check that arriving message is legal! + ASSERT(0 <= mailHdr.to && mailHdr.to < _this->numBoxes); + ASSERT(mailHdr.length <= MaxMailSize); + + // put into mailbox + _this->boxes[mailHdr.to].Put(pktHdr, mailHdr, buffer + sizeof(MailHeader)); + } +} + +//---------------------------------------------------------------------- +// PostOfficeInput::Receive +// Retrieve a message from a specific box if one is available, +// otherwise wait for a message to arrive in the box. +// +// Note that the MailHeader + data looks just like normal payload +// data to the Network. +// +// +// "box" -- mailbox ID in which to look for message +// "pktHdr" -- address to put: source, destination machine ID's +// "mailHdr" -- address to put: source, destination mailbox ID's +// "data" -- address to put: payload message data +//---------------------------------------------------------------------- + +void +PostOfficeInput::Receive(int box, PacketHeader *pktHdr, + MailHeader *mailHdr, char* data) +{ + ASSERT((box >= 0) && (box < numBoxes)); + + boxes[box].Get(pktHdr, mailHdr, data); + ASSERT(mailHdr->length <= MaxMailSize); +} + +//---------------------------------------------------------------------- +// PostOffice::CallBack +// Interrupt handler, called when a packet arrives from the network. +// +// Signal the PostalDelivery routine that it is time to get to work! +//---------------------------------------------------------------------- + +void +PostOfficeInput::CallBack() +{ + messageAvailable->V(); +} + +//---------------------------------------------------------------------- +// PostOfficeOutput::PostOfficeOutput +// Initialize the post office output queue. +// +// "reliability" is the probability that a network packet will +// be delivered (e.g., reliability = 1 means the network never +// drops any packets; reliability = 0 means the network never +// delivers any packets) +//---------------------------------------------------------------------- + +PostOfficeOutput::PostOfficeOutput(double reliability) +{ + messageSent = new Semaphore("message sent", 0); + sendLock = new Lock("message send lock"); + + network = new NetworkOutput(reliability, this); +} + +//---------------------------------------------------------------------- +// PostOfficeOutput::~PostOfficeOutput +// De-allocate the post office data structures. +//---------------------------------------------------------------------- + +PostOfficeOutput::~PostOfficeOutput() +{ + delete network; + delete messageSent; + delete sendLock; +} + +//---------------------------------------------------------------------- +// PostOfficeOutput::Send +// Concatenate the MailHeader to the front of the data, and pass +// the result to the Network for delivery to the destination machine. +// +// Note that the MailHeader + data looks just like normal payload +// data to the Network. +// +// "pktHdr" -- source, destination machine ID's +// "mailHdr" -- source, destination mailbox ID's +// "data" -- payload message data +//---------------------------------------------------------------------- + +void +PostOfficeOutput::Send(PacketHeader pktHdr, MailHeader mailHdr, char* data) +{ + char* buffer = new char[MaxPacketSize]; // space to hold concatenated + // mailHdr + data + + if (debug->IsEnabled('n')) { + cout << "Post send: "; + PrintHeader(pktHdr, mailHdr); + } + ASSERT(mailHdr.length <= MaxMailSize); + ASSERT(0 <= mailHdr.to); + + // fill in pktHdr, for the Network layer + pktHdr.from = kernel->hostName; + pktHdr.length = mailHdr.length + sizeof(MailHeader); + + // concatenate MailHeader and data + bcopy((char *)&mailHdr, buffer, sizeof(MailHeader)); + bcopy(data, buffer + sizeof(MailHeader), mailHdr.length); + + sendLock->Acquire(); // only one message can be sent + // to the network at any one time + network->Send(pktHdr, buffer); + messageSent->P(); // wait for interrupt to tell us + // ok to send the next message + sendLock->Release(); + + delete [] buffer; // we've sent the message, so + // we can delete our buffer +} + +//---------------------------------------------------------------------- +// PostOfficeOutput::CallBack +// Interrupt handler, called when the next packet can be put onto the +// network. +// +// Called even if the previous packet was dropped. +//---------------------------------------------------------------------- + +void +PostOfficeOutput::CallBack() +{ + messageSent->V(); +} + diff --git a/code/network/post.h b/code/network/post.h new file mode 100644 index 0000000..99efa2b --- /dev/null +++ b/code/network/post.h @@ -0,0 +1,151 @@ +// post.h +// Data structures for providing the abstraction of unreliable, +// ordered, fixed-size message delivery to mailboxes on other +// (directly connected) machines. Messages can be dropped by +// the network, but they are never corrupted. +// +// The US Post Office (and Canada Post! -KMS) +// delivers mail to the addressed mailbox. +// By analogy, our post office delivers packets to a specific buffer +// (MailBox), based on the mailbox number stored in the packet header. +// Mail waits in the box until a thread asks for it; if the mailbox +// is empty, threads can wait for mail to arrive in it. +// +// Thus, the service our post office provides is to de-multiplex +// incoming packets, delivering them to the appropriate thread. +// +// With each message, you get a return address, which consists of a "from +// address", which is the id of the machine that sent the message, and +// a "from box", which is the number of a mailbox on the sending machine +// to which you can send an acknowledgement, if your protocol requires +// this. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef POST_H +#define POST_H + +#include "copyright.h" +#include "utility.h" +#include "callback.h" +#include "network.h" +#include "synchlist.h" +#include "synch.h" + +// Mailbox address -- uniquely identifies a mailbox on a given machine. +// A mailbox is just a place for temporary storage for messages. +typedef int MailBoxAddress; + +// The following class defines part of the message header. +// This is prepended to the message by the PostOffice, before the message +// is sent to the Network. + +class MailHeader { + public: + MailBoxAddress to; // Destination mail box + MailBoxAddress from; // Mail box to reply to + unsigned length; // Bytes of message data (excluding the + // mail header) +}; + +// Maximum "payload" -- real data -- that can included in a single message +// Excluding the MailHeader and the PacketHeader + +#define MaxMailSize (MaxPacketSize - sizeof(MailHeader)) + + +// The following class defines the format of an incoming/outgoing +// "Mail" message. The message format is layered: +// network header (PacketHeader) +// post office header (MailHeader) +// data + +class Mail { + public: + Mail(PacketHeader pktH, MailHeader mailH, char *msgData); + // Initialize a mail message by + // concatenating the headers to the data + + PacketHeader pktHdr; // Header appended by Network + MailHeader mailHdr; // Header appended by PostOffice + char data[MaxMailSize]; // Payload -- message data +}; + +// The following class defines a single mailbox, or temporary storage +// for messages. Incoming messages are put by the PostOffice into the +// appropriate mailbox, and these messages can then be retrieved by +// threads on this machine. + +class MailBox { + public: + MailBox(); // Allocate and initialize mail box + ~MailBox(); // De-allocate mail box + + void Put(PacketHeader pktHdr, MailHeader mailHdr, char *data); + // Atomically put a message into the mailbox + void Get(PacketHeader *pktHdr, MailHeader *mailHdr, char *data); + // Atomically get a message out of the + // mailbox (and wait if there is no message + // to get!) + private: + SynchList *messages; // A mailbox is just a list of arrived messages +}; + +// The following two classes defines a "Post Office", or a collection of +// mailboxes. The Post Office provides two main operations: +// Send -- send a message to a mailbox on a remote machine +// Receive -- wait until a message is in the mailbox, then remove and +// return it. +// +// Incoming messages are put by the PostOffice into the +// appropriate mailbox, waking up any threads waiting on Receive. + +class PostOfficeInput : public CallBackObj { + public: + PostOfficeInput(int nBoxes); // Allocate and initialize Post Office + ~PostOfficeInput(); // De-allocate Post Office data + + void Receive(int box, PacketHeader *pktHdr, + MailHeader *mailHdr, char *data); + // Retrieve a message from "box". Wait if + // there is no message in the box. + + static void PostalDelivery(void* data); + // Wait for incoming messages, + // and then put them in the correct mailbox + + void CallBack(); // Called when incoming packet has arrived + // and can be pulled off of network + // (i.e., time to call PostalDelivery) + + private: + NetworkInput *network; // Physical network connection + MailBox *boxes; // Table of mail boxes to hold incoming mail + int numBoxes; // Number of mail boxes + Semaphore *messageAvailable;// V'ed when message has arrived from network +}; + +class PostOfficeOutput : public CallBackObj { + public: + PostOfficeOutput(double reliability); + // Allocate and initialize output + // "reliability" is how many packets + // get dropped by the underlying network + ~PostOfficeOutput(); // De-allocate Post Office data + + void Send(PacketHeader pktHdr, MailHeader mailHdr, char *data); + // Send a message to a mailbox on a remote + // machine. The fromBox in the MailHeader is + // the return box for ack's. + + void CallBack(); // Called when outgoing packet has been + // put on network; next packet can now be sent + + private: + NetworkOutput *network; // Physical network connection + Semaphore *messageSent; // V'ed when next message can be sent to network + Lock *sendLock; // Only one outgoing message at a time +}; +#endif diff --git a/code/test/DISK_0 b/code/test/DISK_0 new file mode 100644 index 0000000..e6ad155 Binary files /dev/null and b/code/test/DISK_0 differ diff --git a/code/test/Makefile b/code/test/Makefile new file mode 100644 index 0000000..db472c6 --- /dev/null +++ b/code/test/Makefile @@ -0,0 +1,203 @@ +# +# Makefile for building user programs to run on top of Nachos +# +# Use "make" to build the test executable(s) +# Use "make clean" to remove .o files and .coff files +# Use "make distclean" to remove all files produced by make, including +# the test executables +# +# This is a GNU Makefile. It must be used with the GNU make program. +# At UW, the GNU make program is /software/gnu/bin/make. +# In many other places it is known as "gmake". +# You may wish to include /software/gnu/bin/ early in your command +# search path, so that you will be using GNU make when you type "make". +# +# Several things to be aware of: +# +# It should not be necessary to build the test executables for +# every type of host machine on which Nachos runs. You should +# be able to build them once, and then use them regardless of +# the host machine type. That is because the test executables +# run on the simulated MIPS machine, and not on the host. +# +# However: +# (1) if you are experiencing problems with the test executables, +# it would be prudent to rebuild them on the host machine +# on which you are currently running Nachos. To do this, +# just type "make distclean", and then "make" +# +# (2) the procedure used to build the test executables does +# depend on the host machine you are on. All of the machine +# dependencies are isolated in the Makefile.dep file. +# It should be possible to build the test executables on +# any MFCF machine. In the MFCF environment, this makefile +# should automatically figure out what type of host you are +# on, and should use the appropriate procedure. +# However, if you are working outside the MFCF environment, +# you will need to build a cross-compiler, build coff2noff, +# and edit Makefile.dep in this directory before you +# can build the test programs. +# +# Nachos assumes that the location of the program startup routine (the +# location the kernel jumps to when the program initially starts up) +# is at location 0. This means: start.o must be the first .o passed +# to ld, in order for the routine "Start" to be loaded at location 0 +# +# When you make the test programs, you will see messages like these: +# numsections 3 +# Loading 3 sections: +# ".text", filepos 0xd0, mempos 0x0, size 0x440 +# ".data", filepos 0x510, mempos 0x440, size 0x0 +# ".bss", filepos 0x0, mempos 0x440, size 0x12c0 +# These messages are normal. They come from the coff2noff program. +# They are useful in that they tell you how big the various parts of your +# compiled user program are, and where in the address space +# coff2noff is going to place them. This information is also +# recorded in the header of the executable file that coff2noff +# creates. See the method AddrSpace::Load (in userprog/addrspace.cc) +# for an example of how this header is used by the Nachos OS to set up the +# address space for a new process that will run the executable. +# +# +# Adding New Test Programs: +# +# You are free to write new test programs, and to modify the +# existing programs. If you write a new program, you will +# need to modify this makefile so that the new program will +# get built. +# You will need to make the following changes for each program +# you add: +# (1) add the program's name to PROGRAMS variable definition +# (2) add dependencies and build commands for the new +# program. The easiest way to do this is to +# copy the dependencies and commands for an +# existing program, and then change the names. +# +# For example, if you write a test program in foo.c, for which +# the executable is to be called foo, you should do the following: +# +# change the PROGRAMS definition to look like this: +# +# PROGRAMS = halt shell matmult sort foo +# +# add these dependencies/commands: +# +# foo.o: foo.c +# $(CC) $(CFLAGS) -c foo.c +# foo: foo.o start.o +# $(LD) $(LDFLAGS) start.o foo.o -o foo.coff +# $(COFF2NOFF) foo.coff foo +# +# Be careful when you copy the commands! The commands +# must be indented with a *TAB*, not a bunch of spaces. +# +# +############################################################################# +# Makefile.dep contains all machine-dependent definitions +# If you are trying to build coff2noff somewhere outside +# of the MFCF environment, you will almost certainly want +# to visit and edit Makefile.dep before doing so +############################################################################# + +include Makefile.dep + +CC = $(GCCDIR)gcc +AS = $(GCCDIR)as +LD = $(GCCDIR)ld + +INCDIR =-I../userprog -I../lib +CFLAGS = -G 0 -c $(INCDIR) -B../../usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/ -B../../usr/local/nachos/decstation-ultrix/bin/ + +ifeq ($(hosttype),unknown) +PROGRAMS = unknownhost +else +# change this if you create a new test program! +# PROGRAMS = add halt consoleIO_test1 consoleIO_test2 fileIO_test1 fileIO_test2 +PROGRAMS = halt +endif + +all: $(PROGRAMS) + +start.o: start.S ../userprog/syscall.h + $(CC) $(CFLAGS) $(ASFLAGS) -c start.S + +halt.o: halt.c + $(CC) $(CFLAGS) -c halt.c +halt: halt.o start.o + $(LD) $(LDFLAGS) start.o halt.o -o halt.coff + $(COFF2NOFF) halt.coff halt + +add.o: add.c + $(CC) $(CFLAGS) -c add.c + +add: add.o start.o + $(LD) $(LDFLAGS) start.o add.o -o add.coff + $(COFF2NOFF) add.coff add + +shell.o: shell.c + $(CC) $(CFLAGS) -c shell.c +shell: shell.o start.o + $(LD) $(LDFLAGS) start.o shell.o -o shell.coff + $(COFF2NOFF) shell.coff shell + +sort.o: sort.c + $(CC) $(CFLAGS) -c sort.c +sort: sort.o start.o + $(LD) $(LDFLAGS) start.o sort.o -o sort.coff + $(COFF2NOFF) sort.coff sort + +segments.o: segments.c + $(CC) $(CFLAGS) -c segments.c +segments: segments.o start.o + $(LD) $(LDFLAGS) start.o segments.o -o segments.coff + $(COFF2NOFF) segments.coff segments + +matmult.o: matmult.c + $(CC) $(CFLAGS) -c matmult.c +matmult: matmult.o start.o + $(LD) $(LDFLAGS) start.o matmult.o -o matmult.coff + $(COFF2NOFF) matmult.coff matmult + +consoleIO_test1.o: consoleIO_test1.c + $(CC) $(CFLAGS) -c consoleIO_test1.c +consoleIO_test1: consoleIO_test1.o start.o + $(LD) $(LDFLAGS) start.o consoleIO_test1.o -o consoleIO_test1.coff + $(COFF2NOFF) consoleIO_test1.coff consoleIO_test1 + +consoleIO_test2.o: consoleIO_test2.c + $(CC) $(CFLAGS) -c consoleIO_test2.c +consoleIO_test2: consoleIO_test2.o start.o + $(LD) $(LDFLAGS) start.o consoleIO_test2.o -o consoleIO_test2.coff + $(COFF2NOFF) consoleIO_test2.coff consoleIO_test2 + +fileIO_test1.o: fileIO_test1.c + $(CC) $(CFLAGS) -c fileIO_test1.c +fileIO_test1: fileIO_test1.o start.o + $(LD) $(LDFLAGS) start.o fileIO_test1.o -o fileIO_test1.coff + $(COFF2NOFF) fileIO_test1.coff fileIO_test1 + +fileIO_test2.o: fileIO_test2.c + $(CC) $(CFLAGS) -c fileIO_test2.c +fileIO_test2: fileIO_test2.o start.o + $(LD) $(LDFLAGS) start.o fileIO_test2.o -o fileIO_test2.coff + $(COFF2NOFF) fileIO_test2.coff fileIO_test2 + +fileIO_test3.o: fileIO_test3.c + $(CC) $(CFLAGS) -c fileIO_test3.c +fileIO_test3: fileIO_test3.o start.o + $(LD) $(LDFLAGS) start.o fileIO_test3.o -o fileIO_test3.coff + $(COFF2NOFF) fileIO_test3.coff fileIO_test3 + + +clean: + $(RM) -f *.o *.ii + $(RM) -f *.coff + +distclean: clean + $(RM) -f $(PROGRAMS) + +unknownhost: + @echo Host type could not be determined. + @echo make is terminating. + @echo If you are on an MFCF machine, contact the instructor to report this problem + @echo Otherwise, edit Makefile.dep and try again. diff --git a/code/test/Makefile.dep b/code/test/Makefile.dep new file mode 100644 index 0000000..0330b6d --- /dev/null +++ b/code/test/Makefile.dep @@ -0,0 +1,63 @@ +############################################################################# +# Machine-specific definitions +# +# If you are not in the MFCF environment, you can either add a new +# automatic test for your machine/OS type, or you should set the +# necessary variables "manually" here +############################################################################# + +# unfortunately, command line arguments to uname are not +# very consistent across UNIX flavours. However, the following +# seem to work almost everywhere in MFCF land + +osname = $(shell uname -s) +osrelease = $(shell uname -r) + +hosttype = unknown + +# Test for x86 Linux +# !!! COMMENT THE FOLLOWING LINES OUT IF BUILDING FOR SOLARIS HOST !!! +# !!! ADD PATH TO CPP and CROSS COMPILER + +ifeq ($(osname),Linux) +# full path name of your cpp program i.e.: +CPP = ../../usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/cpp +# directory in which your gcc cross-compiler lives i.e.: +GCCDIR = ../../usr/local/nachos/bin/decstation-ultrix- +LDFLAGS = -T script -N +ASFLAGS = -mips2 +CPPFLAGS = $(INCDIR) +COFF2NOFF = ../../coff2noff/coff2noff.x86Linux +hosttype = x86Linux +endif + +ifeq ($(osname),Windows) +CPP = /usr/local/nachosxdev/lib/gcc-lib/decstation-ultrix/2.95.3/cpp0 +# directory in which your gcc cross-compiler lives i.e.: +GCCDIR = /usr/local/nachosxdev/bin/decstation-ultrix- +LDFLAGS = -T script -N +ASFLAGS = -mips2 +CPPFLAGS = $(INCDIR) +COFF2NOFF = ../../coff2noff/coff2noff.Windows +hosttype = Windows +endif + +# Note: +# If you are trying to build on MacOS X +# try something like this, substituting whatever +# uname -s returns on your machine for the XXX +# +#ifeq ($(osname),XXX) +#CPP = full path name of your cpp program +#GCCDIR = directory in which your gcc cross-compiler lives +#LDFLAGS = -T script -N +#ASFLAGS = -mips2 +#CPPFLAGS = $(INCDIR) +#COFF2NOFF = full pathname of your coff2noff program +# Note: it has been moved to part of the Nachos distribution +# COFF2NOFF = ../../coff2noff.mipsUltrix +#hosttype = MacOS +#endif + + + diff --git a/code/test/a b/code/test/a new file mode 100644 index 0000000..705a5fb Binary files /dev/null and b/code/test/a differ diff --git a/code/test/add b/code/test/add new file mode 100644 index 0000000..14aeee0 Binary files /dev/null and b/code/test/add differ diff --git a/code/test/add.c b/code/test/add.c new file mode 100644 index 0000000..9e73c9e --- /dev/null +++ b/code/test/add.c @@ -0,0 +1,20 @@ +/* add.c + * Simple program to test whether the systemcall interface works. + * + * Just do a add syscall that adds two values and returns the result. + * + */ + +#include "syscall.h" + +int +main() +{ + int result; + + result = Add(42, 23); + PrintInt(result); +// printf("result is %d\n", result); + Halt(); + /* not reached */ +} diff --git a/code/test/consoleIO_test1 b/code/test/consoleIO_test1 new file mode 100644 index 0000000..8f4131f Binary files /dev/null and b/code/test/consoleIO_test1 differ diff --git a/code/test/consoleIO_test1.c b/code/test/consoleIO_test1.c new file mode 100644 index 0000000..5de3402 --- /dev/null +++ b/code/test/consoleIO_test1.c @@ -0,0 +1,12 @@ +#include "syscall.h" + +int +main() +{ + int n; + for (n=9;n>5;n--) { + PrintInt(n); + } + Halt(); +} + diff --git a/code/test/consoleIO_test2 b/code/test/consoleIO_test2 new file mode 100644 index 0000000..540cf82 Binary files /dev/null and b/code/test/consoleIO_test2 differ diff --git a/code/test/consoleIO_test2.c b/code/test/consoleIO_test2.c new file mode 100644 index 0000000..f9417a3 --- /dev/null +++ b/code/test/consoleIO_test2.c @@ -0,0 +1,13 @@ +#include "syscall.h" + +int +main() +{ + int n; + for (n=15;n<=19;n++){ + + PrintInt(n); + } + Halt(); +} + diff --git a/code/test/fileIO_test1 b/code/test/fileIO_test1 new file mode 100644 index 0000000..192f089 Binary files /dev/null and b/code/test/fileIO_test1 differ diff --git a/code/test/fileIO_test1.c b/code/test/fileIO_test1.c new file mode 100644 index 0000000..9c3b6b7 --- /dev/null +++ b/code/test/fileIO_test1.c @@ -0,0 +1,20 @@ +#include "syscall.h" + +int main(void) +{ + char test[] = "abcdefghijklmnopqrstuvwxyz"; + int success = Create("file1.test"); + OpenFileId fid; + int i; + if (success != 1) MSG("Failed on creating file"); + fid = Open("file1.test"); + if (fid == -1) MSG("Failed on opening file"); + for (i = 0; i < 26; ++i) { + int count = Write(test + i, 1, fid); + if (count != 1) MSG("Failed on writing file"); + } + success = Close(fid); + if (success != 1) MSG("Failed on closing file"); + Halt(); +} + diff --git a/code/test/fileIO_test2 b/code/test/fileIO_test2 new file mode 100644 index 0000000..3ea2bd4 Binary files /dev/null and b/code/test/fileIO_test2 differ diff --git a/code/test/fileIO_test2.c b/code/test/fileIO_test2.c new file mode 100644 index 0000000..efeab44 --- /dev/null +++ b/code/test/fileIO_test2.c @@ -0,0 +1,22 @@ +#include "syscall.h" + +int main(void) +{ + // you should run fileIO_test1 first before running this one + char test[26]; + char check[] = "abcdefghijklmnopqrstuvwxyz"; + OpenFileId fid; + int count, success, i; + fid = Open("file1.test"); + if (fid == -1) MSG("Failed on opening file"); + count = Read(test, 26, fid); + if (count != 26) MSG("Failed on reading file"); + success = Close(fid); + if (success != 1) MSG("Failed on closing file"); + for (i = 0; i < 26; ++i) { + if (test[i] != check[i]) MSG("Failed: reading wrong result"); + } + MSG("Passed! ^_^"); + Halt(); +} + diff --git a/code/test/halt b/code/test/halt new file mode 100644 index 0000000..66bd0c3 Binary files /dev/null and b/code/test/halt differ diff --git a/code/test/halt.c b/code/test/halt.c new file mode 100644 index 0000000..a359899 --- /dev/null +++ b/code/test/halt.c @@ -0,0 +1,20 @@ +/* halt.c + * Simple program to test whether running a user program works. + * + * Just do a "syscall" that shuts down the OS. + * + * NOTE: for some reason, user programs with global data structures + * sometimes haven't worked in the Nachos environment. So be careful + * out there! One option is to allocate data structures as + * automatics within a procedure, but if you do this, you have to + * be careful to allocate a big enough stack to hold the automatics! + */ + +#include "syscall.h" + +int +main() +{ + Halt(); + /* not reached */ +} diff --git a/code/test/matmult.c b/code/test/matmult.c new file mode 100644 index 0000000..7806949 --- /dev/null +++ b/code/test/matmult.c @@ -0,0 +1,38 @@ +/* matmult.c + * Test program to do matrix multiplication on large arrays. + * + * Intended to stress virtual memory system. + * + * Ideally, we could read the matrices off of the file system, + * and store the result back to the file system! + */ + +#include "syscall.h" + +#define Dim 20 /* sum total of the arrays doesn't fit in + * physical memory + */ + +int A[Dim][Dim]; +int B[Dim][Dim]; +int C[Dim][Dim]; + +int +main() +{ + int i, j, k; + + for (i = 0; i < Dim; i++) /* first initialize the matrices */ + for (j = 0; j < Dim; j++) { + A[i][j] = i; + B[i][j] = j; + C[i][j] = 0; + } + + for (i = 0; i < Dim; i++) /* then multiply them together */ + for (j = 0; j < Dim; j++) + for (k = 0; k < Dim; k++) + C[i][j] += A[i][k] * B[k][j]; + + Exit(C[Dim-1][Dim-1]); /* and then we're done */ +} diff --git a/code/test/os_students.sh b/code/test/os_students.sh new file mode 100644 index 0000000..1ed78a1 --- /dev/null +++ b/code/test/os_students.sh @@ -0,0 +1,3 @@ +make clean +make +../build.linux/nachos -e halt \ No newline at end of file diff --git a/code/test/script b/code/test/script new file mode 100644 index 0000000..54e3215 --- /dev/null +++ b/code/test/script @@ -0,0 +1,36 @@ +OUTPUT_FORMAT("ecoff-littlemips") +ENTRY(__start) +SECTIONS +{ + .text 0 : { + _ftext = . ; + *(.init) + eprol = .; + *(.text) + *(.fini) + etext = .; + _etext = .; + } + .rdata . : { + *(.rdata) + } + _fdata = .; + .data . : { + *(.data) + CONSTRUCTORS + } + edata = .; + _edata = .; + _fbss = .; + .sbss . : { + *(.sbss) + *(.scommon) + } + .bss . : { + *(.bss) + *(COMMON) + } + end = .; + _end = .; +} + diff --git a/code/test/segments.c b/code/test/segments.c new file mode 100644 index 0000000..83c985c --- /dev/null +++ b/code/test/segments.c @@ -0,0 +1,41 @@ + +/* segments.c + * Simple program to illustrate different segments and to show + * how parameters are passed and the syscall is generated. + * + * objdump below refers to: + * /software/gcc_nachos/bin/decstation-ultrix-objdump + * + * Compile this "gmake segments" + * Then use objdump to examine output. + * objdump -d segments.coff - to disassemble + * objdump -s segments.coff - to see contents of segments + * objdump -x segments.coff - to see symbol table information + * nachos -d m -s -x segments + */ + +#define N (5) /* N is replaced by the preprocessor */ + +unsigned int initdata1 = 0xdeadbeef; /* initialized data put in .data segment */ +int initdata2 = 0xbb; /* same as above */ +const int blah = 0xff; /* into .rdata segment */ +int uninitdata[N]; /* allocate space in .bss segment */ + +main() +{ + /* automatic variable stored on stack or in register */ + int i; + int stack1 = 0xaa; + int stack2; + const int stack3 = 0xee; /* in reg or on stack not .rdata */ + char *str = "Hello World .rdata segment\n"; + + /* str is stored on the stack or in a register + * but text that is initialized is stored in .rdata + */ + + for (i=0; i 0 ) { + newProc = Exec(buffer); + Join(newProc); + } + } +} + diff --git a/code/test/sort b/code/test/sort new file mode 100644 index 0000000..5f2996a Binary files /dev/null and b/code/test/sort differ diff --git a/code/test/sort.c b/code/test/sort.c new file mode 100644 index 0000000..0948627 --- /dev/null +++ b/code/test/sort.c @@ -0,0 +1,69 @@ +/* sort.c + * Test program to sort a large number of integers. + * + * Intention is to stress virtual memory system. + * + * Ideally, we could read the unsorted array off of the file system, + * and store the result back to the file system! + */ + + +/* +#define UNIX +#define UNIX_DEBUG +*/ + +#ifdef UNIX +#include +#define Exit exit +#else +#include "syscall.h" +#endif /* UNIX */ + +#define SIZE (1024) + +int A[SIZE]; /* size of physical memory; with code, we'll run out of space!*/ + +int +main() +{ + int i, j, tmp; + + /* first initialize the array, in reverse sorted order */ + for (i = 0; i < SIZE; i++) { + A[i] = (SIZE-1) - i; + } + + /* then sort! */ + for (i = 0; i < SIZE; i++) { + for (j = 0; j < (SIZE-1); j++) { + if (A[j] > A[j + 1]) { /* out of order -> need to swap ! */ + tmp = A[j]; + A[j] = A[j + 1]; + A[j + 1] = tmp; + } + } + } + +#ifdef UNIX_DEBUG + for (i=0; iinterrupt; + MachineStatus status = interrupt->getStatus(); + + if (status != IdleMode) { + interrupt->YieldOnReturn(); + } +} diff --git a/code/threads/alarm.h b/code/threads/alarm.h new file mode 100644 index 0000000..3803d17 --- /dev/null +++ b/code/threads/alarm.h @@ -0,0 +1,42 @@ +// alarm.h +// Data structures for a software alarm clock. +// +// We make use of a hardware timer device, that generates +// an interrupt every X time ticks (on real systems, X is +// usually between 0.25 - 10 milliseconds). +// +// From this, we provide the ability for a thread to be +// woken up after a delay; we also provide time-slicing. +// +// NOTE: this abstraction is not completely implemented. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef ALARM_H +#define ALARM_H + +#include "copyright.h" +#include "utility.h" +#include "callback.h" +#include "timer.h" + +// The following class defines a software alarm clock. +class Alarm : public CallBackObj { + public: + Alarm(bool doRandomYield); // Initialize the timer, and callback + // to "toCall" every time slice. + ~Alarm() { delete timer; } + + void WaitUntil(int x); // suspend execution until time > now + x + // this method is not yet implemented + + private: + Timer *timer; // the hardware timer device + + void CallBack(); // called when the hardware + // timer generates an interrupt +}; + +#endif // ALARM_H diff --git a/code/threads/kernel.cc b/code/threads/kernel.cc new file mode 100644 index 0000000..621044c --- /dev/null +++ b/code/threads/kernel.cc @@ -0,0 +1,311 @@ +// kernel.cc +// Initialization and cleanup routines for the Nachos kernel. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "debug.h" +#include "main.h" +#include "kernel.h" +#include "sysdep.h" +#include "synch.h" +#include "synchlist.h" +#include "libtest.h" +#include "string.h" +#include "synchdisk.h" +#include "post.h" +#include "synchconsole.h" + +//---------------------------------------------------------------------- +// Kernel::Kernel +// Interpret command line arguments in order to determine flags +// for the initialization (see also comments in main.cc) +//---------------------------------------------------------------------- + +Kernel::Kernel(int argc, char **argv) +{ + randomSlice = FALSE; + debugUserProg = FALSE; + consoleIn = NULL; // default is stdin + consoleOut = NULL; // default is stdout +#ifndef FILESYS_STUB + formatFlag = FALSE; +#endif + reliability = 1; // network reliability, default is 1.0 + hostName = 0; // machine id, also UNIX socket name + // 0 is the default machine id + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "-rs") == 0) { + ASSERT(i + 1 < argc); + RandomInit(atoi(argv[i + 1]));// initialize pseudo-random + // number generator + randomSlice = TRUE; + i++; + } else if (strcmp(argv[i], "-s") == 0) { + debugUserProg = TRUE; + } else if (strcmp(argv[i], "-e") == 0) { + execfile[++execfileNum]= argv[++i]; + cout << execfile[execfileNum] << "\n"; + } else if (strcmp(argv[i], "-ci") == 0) { + ASSERT(i + 1 < argc); + consoleIn = argv[i + 1]; + i++; + } else if (strcmp(argv[i], "-co") == 0) { + ASSERT(i + 1 < argc); + consoleOut = argv[i + 1]; + i++; +#ifndef FILESYS_STUB + } else if (strcmp(argv[i], "-f") == 0) { + formatFlag = TRUE; +#endif + } else if (strcmp(argv[i], "-n") == 0) { + ASSERT(i + 1 < argc); // next argument is float + reliability = atof(argv[i + 1]); + i++; + } else if (strcmp(argv[i], "-m") == 0) { + ASSERT(i + 1 < argc); // next argument is int + hostName = atoi(argv[i + 1]); + i++; + } else if (strcmp(argv[i], "-u") == 0) { + cout << "Partial usage: nachos [-rs randomSeed]\n"; + cout << "Partial usage: nachos [-s]\n"; + cout << "Partial usage: nachos [-ci consoleIn] [-co consoleOut]\n"; +#ifndef FILESYS_STUB + cout << "Partial usage: nachos [-nf]\n"; +#endif + cout << "Partial usage: nachos [-n #] [-m #]\n"; + } + } +} + +//---------------------------------------------------------------------- +// Kernel::Initialize +// Initialize Nachos global data structures. Separate from the +// constructor because some of these refer to earlier initialized +// data via the "kernel" global variable. +//---------------------------------------------------------------------- + +void +Kernel::Initialize() +{ + // We didn't explicitly allocate the current thread we are running in. + // But if it ever tries to give up the CPU, we better have a Thread + // object to save its state. + + + currentThread = new Thread("main", threadNum++); + currentThread->setStatus(RUNNING); + + stats = new Statistics(); // collect statistics + interrupt = new Interrupt; // start up interrupt handling + scheduler = new Scheduler(); // initialize the ready queue + alarm = new Alarm(randomSlice); // start up time slicing + machine = new Machine(debugUserProg); + synchConsoleIn = new SynchConsoleInput(consoleIn); // input from stdin + synchConsoleOut = new SynchConsoleOutput(consoleOut); // output to stdout + synchDisk = new SynchDisk(); // +#ifdef FILESYS_STUB + fileSystem = new FileSystem(); +#else + fileSystem = new FileSystem(formatFlag); +#endif // FILESYS_STUB + postOfficeIn = new PostOfficeInput(10); + postOfficeOut = new PostOfficeOutput(reliability); + + interrupt->Enable(); +} + +//---------------------------------------------------------------------- +// Kernel::~Kernel +// Nachos is halting. De-allocate global data structures. +//---------------------------------------------------------------------- + +Kernel::~Kernel() +{ + delete stats; + delete interrupt; + delete scheduler; + delete alarm; + delete machine; + delete synchConsoleIn; + delete synchConsoleOut; + delete synchDisk; + delete fileSystem; + delete postOfficeIn; + delete postOfficeOut; + + Exit(0); +} + +//---------------------------------------------------------------------- +// Kernel::ThreadSelfTest +// Test threads, semaphores, synchlists +//---------------------------------------------------------------------- + +void +Kernel::ThreadSelfTest() { + Semaphore *semaphore; + SynchList *synchList; + + LibSelfTest(); // test library routines + + currentThread->SelfTest(); // test thread switching + + // test semaphore operation + semaphore = new Semaphore("test", 0); + semaphore->SelfTest(); + delete semaphore; + + // test locks, condition variables + // using synchronized lists + synchList = new SynchList; + synchList->SelfTest(9); + delete synchList; + +} + +//---------------------------------------------------------------------- +// Kernel::ConsoleTest +// Test the synchconsole +//---------------------------------------------------------------------- + +void +Kernel::ConsoleTest() { + char ch; + + cout << "Testing the console device.\n" + << "Typed characters will be echoed, until ^D is typed.\n" + << "Note newlines are needed to flush input through UNIX.\n"; + cout.flush(); + + do { + ch = synchConsoleIn->GetChar(); + if(ch != EOF) synchConsoleOut->PutChar(ch); // echo it! + } while (ch != EOF); + + cout << "\n"; + +} + +//---------------------------------------------------------------------- +// Kernel::NetworkTest +// Test whether the post office is working. On machines #0 and #1, do: +// +// 1. send a message to the other machine at mail box #0 +// 2. wait for the other machine's message to arrive (in our mailbox #0) +// 3. send an acknowledgment for the other machine's message +// 4. wait for an acknowledgement from the other machine to our +// original message +// +// This test works best if each Nachos machine has its own window +//---------------------------------------------------------------------- + +void +Kernel::NetworkTest() { + + if (hostName == 0 || hostName == 1) { + // if we're machine 1, send to 0 and vice versa + int farHost = (hostName == 0 ? 1 : 0); + PacketHeader outPktHdr, inPktHdr; + MailHeader outMailHdr, inMailHdr; + char *data = "Hello there!"; + char *ack = "Got it!"; + char buffer[MaxMailSize]; + + // construct packet, mail header for original message + // To: destination machine, mailbox 0 + // From: our machine, reply to: mailbox 1 + outPktHdr.to = farHost; + outMailHdr.to = 0; + outMailHdr.from = 1; + outMailHdr.length = strlen(data) + 1; + + // Send the first message + postOfficeOut->Send(outPktHdr, outMailHdr, data); + + // Wait for the first message from the other machine + postOfficeIn->Receive(0, &inPktHdr, &inMailHdr, buffer); + cout << "Got: " << buffer << " : from " << inPktHdr.from << ", box " + << inMailHdr.from << "\n"; + cout.flush(); + + // Send acknowledgement to the other machine (using "reply to" mailbox + // in the message that just arrived + outPktHdr.to = inPktHdr.from; + outMailHdr.to = inMailHdr.from; + outMailHdr.length = strlen(ack) + 1; + postOfficeOut->Send(outPktHdr, outMailHdr, ack); + + // Wait for the ack from the other machine to the first message we sent + postOfficeIn->Receive(1, &inPktHdr, &inMailHdr, buffer); + cout << "Got: " << buffer << " : from " << inPktHdr.from << ", box " + << inMailHdr.from << "\n"; + cout.flush(); + } + + // Then we're done! +} + +void ForkExecute(Thread *t) +{ + if ( !t->space->Load(t->getName()) ) { + return; // executable not found + } + + t->space->Execute(t->getName()); + +} + +void Kernel::ExecAll() +{ + for (int i=1;i<=execfileNum;i++) { + int a = Exec(execfile[i]); + } + currentThread->Finish(); + //Kernel::Exec(); +} + + +int Kernel::Exec(char* name) +{ + t[threadNum] = new Thread(name, threadNum); + t[threadNum]->space = new AddrSpace(); + t[threadNum]->Fork((VoidFunctionPtr) &ForkExecute, (void *)t[threadNum]); + threadNum++; + + return threadNum-1; +/* + cout << "Total threads number is " << execfileNum << endl; + for (int n=1;n<=execfileNum;n++) { + t[n] = new Thread(execfile[n]); + t[n]->space = new AddrSpace(); + t[n]->Fork((VoidFunctionPtr) &ForkExecute, (void *)t[n]); + cout << "Thread " << execfile[n] << " is executing." << endl; + } + cout << "debug Kernel::Run finished.\n"; +*/ +// Thread *t1 = new Thread(execfile[1]); +// Thread *t1 = new Thread("../test/test1"); +// Thread *t2 = new Thread("../test/test2"); + +// AddrSpace *halt = new AddrSpace(); +// t1->space = new AddrSpace(); +// t2->space = new AddrSpace(); + +// halt->Execute("../test/halt"); +// t1->Fork((VoidFunctionPtr) &ForkExecute, (void *)t1); +// t2->Fork((VoidFunctionPtr) &ForkExecute, (void *)t2); + +// currentThread->Finish(); +// Kernel::Run(); +// cout << "after ThreadedKernel:Run();" << endl; // unreachable +} + +int Kernel::CreateFile(char *filename) +{ + return fileSystem->Create(filename); +} + + diff --git a/code/threads/kernel.h b/code/threads/kernel.h new file mode 100644 index 0000000..d04e6f3 --- /dev/null +++ b/code/threads/kernel.h @@ -0,0 +1,86 @@ +// kernel.h +// Global variables for the Nachos kernel. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef KERNEL_H +#define KERNEL_H + +#include "copyright.h" +#include "debug.h" +#include "utility.h" +#include "thread.h" +#include "scheduler.h" +#include "interrupt.h" +#include "stats.h" +#include "alarm.h" +#include "filesys.h" +#include "machine.h" + +class PostOfficeInput; +class PostOfficeOutput; +class SynchConsoleInput; +class SynchConsoleOutput; +class SynchDisk; + + + +class Kernel { + public: + Kernel(int argc, char **argv); + // Interpret command line arguments + ~Kernel(); // deallocate the kernel + + void Initialize(); // initialize the kernel -- separated + // from constructor because + // refers to "kernel" as a global + void ExecAll(); + int Exec(char* name); + void ThreadSelfTest(); // self test of threads and synchronization + + void ConsoleTest(); // interactive console self test + void NetworkTest(); // interactive 2-machine network test + Thread* getThread(int threadID){return t[threadID];} + + int CreateFile(char* filename); // fileSystem call + +// These are public for notational convenience; really, +// they're global variables used everywhere. + + Thread *currentThread; // the thread holding the CPU + Scheduler *scheduler; // the ready list + Interrupt *interrupt; // interrupt status + Statistics *stats; // performance metrics + Alarm *alarm; // the software alarm clock + Machine *machine; // the simulated CPU + SynchConsoleInput *synchConsoleIn; + SynchConsoleOutput *synchConsoleOut; + SynchDisk *synchDisk; + FileSystem *fileSystem; + PostOfficeInput *postOfficeIn; + PostOfficeOutput *postOfficeOut; + + int hostName; // machine identifier + + private: + + Thread* t[10]; + char* execfile[10]; + int execfileNum; + int threadNum; + bool randomSlice; // enable pseudo-random time slicing + bool debugUserProg; // single step user program + double reliability; // likelihood messages are dropped + char *consoleIn; // file to read console input from + char *consoleOut; // file to send console output to +#ifndef FILESYS_STUB + bool formatFlag; // format the disk if this is true +#endif +}; + + +#endif // KERNEL_H + + diff --git a/code/threads/main.cc b/code/threads/main.cc new file mode 100644 index 0000000..093b7d3 --- /dev/null +++ b/code/threads/main.cc @@ -0,0 +1,297 @@ +// main.cc +// Driver code to initialize, selftest, and run the +// operating system kernel. +// +// Usage: nachos -d -rs +// -s -x -ci -co +// -f -cp +// -p -r -l -D +// -n -m +// -z -K -C -N +// +// -d causes certain debugging messages to be printed (see debug.h) +// -rs causes Yield to occur at random (but repeatable) spots +// -z prints the copyright message +// -s causes user programs to be executed in single-step mode +// -x runs a user program +// -ci specify file for console input (stdin is the default) +// -co specify file for console output (stdout is the default) +// -n sets the network reliability +// -m sets this machine's host id (needed for the network) +// -K run a simple self test of kernel threads and synchronization +// -C run an interactive console test +// -N run a two-machine network test (see Kernel::NetworkTest) +// +// Filesystem-related flags: +// -f forces the Nachos disk to be formatted +// -cp copies a file from UNIX to Nachos +// -p prints a Nachos file to stdout +// -r removes a Nachos file from the file system +// -l lists the contents of the Nachos directory +// -D prints the contents of the entire file system +// +// Note: the file system flags are not used if the stub filesystem +// is being used +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#define MAIN +#include "copyright.h" +#undef MAIN + +#include "main.h" +#include "filesys.h" +#include "openfile.h" +#include "sysdep.h" + +// global variables +Kernel *kernel; +Debug *debug; + + +//---------------------------------------------------------------------- +// Cleanup +// Delete kernel data structures; called when user hits "ctl-C". +//---------------------------------------------------------------------- + +static void +Cleanup(int x) +{ + cerr << "\nCleaning up after signal " << x << "\n"; + delete kernel; +} + +//------------------------------------------------------------------- +// Constant used by "Copy" and "Print" +// It is the number of bytes read from the Unix file (for Copy) +// or the Nachos file (for Print) by each read operation +//------------------------------------------------------------------- +static const int TransferSize = 128; + + +#ifndef FILESYS_STUB +//---------------------------------------------------------------------- +// Copy +// Copy the contents of the UNIX file "from" to the Nachos file "to" +//---------------------------------------------------------------------- + +static void +Copy(char *from, char *to) +{ + int fd; + OpenFile* openFile; + int amountRead, fileLength; + char *buffer; + +// Open UNIX file + if ((fd = OpenForReadWrite(from,FALSE)) < 0) { + printf("Copy: couldn't open input file %s\n", from); + return; + } + +// Figure out length of UNIX file + Lseek(fd, 0, 2); + fileLength = Tell(fd); + Lseek(fd, 0, 0); + +// Create a Nachos file of the same length + DEBUG('f', "Copying file " << from << " of size " << fileLength << " to file " << to); + if (!kernel->fileSystem->Create(to, fileLength)) { // Create Nachos file + printf("Copy: couldn't create output file %s\n", to); + Close(fd); + return; + } + + openFile = kernel->fileSystem->Open(to); + ASSERT(openFile != NULL); + +// Copy the data in TransferSize chunks + buffer = new char[TransferSize]; + while ((amountRead=ReadPartial(fd, buffer, sizeof(char)*TransferSize)) > 0) + openFile->Write(buffer, amountRead); + delete [] buffer; + +// Close the UNIX and the Nachos files + delete openFile; + Close(fd); +} + +#endif // FILESYS_STUB + +//---------------------------------------------------------------------- +// Print +// Print the contents of the Nachos file "name". +//---------------------------------------------------------------------- + +void +Print(char *name) +{ + OpenFile *openFile; + int i, amountRead; + char *buffer; + + if ((openFile = kernel->fileSystem->Open(name)) == NULL) { + printf("Print: unable to open file %s\n", name); + return; + } + + buffer = new char[TransferSize]; + while ((amountRead = openFile->Read(buffer, TransferSize)) > 0) + for (i = 0; i < amountRead; i++) + printf("%c", buffer[i]); + delete [] buffer; + + delete openFile; // close the Nachos file + return; +} + + + +//---------------------------------------------------------------------- +// main +// Bootstrap the operating system kernel. +// +// Initialize kernel data structures +// Call some test routines +// Call "Run" to start an initial user program running +// +// "argc" is the number of command line arguments (including the name +// of the command) -- ex: "nachos -d +" -> argc = 3 +// "argv" is an array of strings, one for each command line argument +// ex: "nachos -d +" -> argv = {"nachos", "-d", "+"} +//---------------------------------------------------------------------- + +int +main(int argc, char **argv) +{ + int i; + char *debugArg = ""; + char *userProgName = NULL; // default is not to execute a user prog + bool threadTestFlag = false; + bool consoleTestFlag = false; + bool networkTestFlag = false; +#ifndef FILESYS_STUB + char *copyUnixFileName = NULL; // UNIX file to be copied into Nachos + char *copyNachosFileName = NULL; // name of copied file in Nachos + char *printFileName = NULL; + char *removeFileName = NULL; + bool dirListFlag = false; + bool dumpFlag = false; +#endif //FILESYS_STUB + + // some command line arguments are handled here. + // those that set kernel parameters are handled in + // the Kernel constructor + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-d") == 0) { + ASSERT(i + 1 < argc); // next argument is debug string + debugArg = argv[i + 1]; + i++; + } + else if (strcmp(argv[i], "-z") == 0) { + cout << copyright << "\n"; + } + else if (strcmp(argv[i], "-x") == 0) { + ASSERT(i + 1 < argc); + userProgName = argv[i + 1]; + i++; + } + else if (strcmp(argv[i], "-K") == 0) { + threadTestFlag = TRUE; + } + else if (strcmp(argv[i], "-C") == 0) { + consoleTestFlag = TRUE; + } + else if (strcmp(argv[i], "-N") == 0) { + networkTestFlag = TRUE; + } +#ifndef FILESYS_STUB + else if (strcmp(argv[i], "-cp") == 0) { + ASSERT(i + 2 < argc); + copyUnixFileName = argv[i + 1]; + copyNachosFileName = argv[i + 2]; + i += 2; + } + else if (strcmp(argv[i], "-p") == 0) { + ASSERT(i + 1 < argc); + printFileName = argv[i + 1]; + i++; + } + else if (strcmp(argv[i], "-r") == 0) { + ASSERT(i + 1 < argc); + removeFileName = argv[i + 1]; + i++; + } + else if (strcmp(argv[i], "-l") == 0) { + dirListFlag = true; + } + else if (strcmp(argv[i], "-D") == 0) { + dumpFlag = true; + } +#endif //FILESYS_STUB + else if (strcmp(argv[i], "-u") == 0) { + cout << "Partial usage: nachos [-z -d debugFlags]\n"; + cout << "Partial usage: nachos [-x programName]\n"; + cout << "Partial usage: nachos [-K] [-C] [-N]\n"; +#ifndef FILESYS_STUB + cout << "Partial usage: nachos [-cp UnixFile NachosFile]\n"; + cout << "Partial usage: nachos [-p fileName] [-r fileName]\n"; + cout << "Partial usage: nachos [-l] [-D]\n"; +#endif //FILESYS_STUB + } + + } + debug = new Debug(debugArg); + + DEBUG(dbgThread, "Entering main"); + + kernel = new Kernel(argc, argv); + + kernel->Initialize(); + + CallOnUserAbort(Cleanup); // if user hits ctl-C + + // at this point, the kernel is ready to do something + // run some tests, if requested + if (threadTestFlag) { + kernel->ThreadSelfTest(); // test threads and synchronization + } + if (consoleTestFlag) { + kernel->ConsoleTest(); // interactive test of the synchronized console + } + if (networkTestFlag) { + kernel->NetworkTest(); // two-machine test of the network + } + +#ifndef FILESYS_STUB + if (removeFileName != NULL) { + kernel->fileSystem->Remove(removeFileName); + } + if (copyUnixFileName != NULL && copyNachosFileName != NULL) { + Copy(copyUnixFileName,copyNachosFileName); + } + if (dumpFlag) { + kernel->fileSystem->Print(); + } + if (dirListFlag) { + kernel->fileSystem->List(); + } + if (printFileName != NULL) { + Print(printFileName); + } +#endif // FILESYS_STUB + + // finally, run an initial user program if requested to do so + + kernel->ExecAll(); + // If we don't run a user program, we may get here. + // Calling "return" would terminate the program. + // Instead, call Halt, which will first clean up, then + // terminate. +// kernel->interrupt->Halt(); + + ASSERTNOTREACHED(); +} + diff --git a/code/threads/main.h b/code/threads/main.h new file mode 100644 index 0000000..2bb2232 --- /dev/null +++ b/code/threads/main.h @@ -0,0 +1,19 @@ +// main.h +// This file defines the Nachos global variables +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef MAIN_H +#define MAIN_H + +#include "copyright.h" +#include "debug.h" +#include "kernel.h" + +extern Kernel *kernel; +extern Debug *debug; + +#endif // MAIN_H + diff --git a/code/threads/scheduler.cc b/code/threads/scheduler.cc new file mode 100644 index 0000000..0a8170c --- /dev/null +++ b/code/threads/scheduler.cc @@ -0,0 +1,179 @@ +// scheduler.cc +// Routines to choose the next thread to run, and to dispatch to +// that thread. +// +// These routines assume that interrupts are already disabled. +// If interrupts are disabled, we can assume mutual exclusion +// (since we are on a uniprocessor). +// +// NOTE: We can't use Locks to provide mutual exclusion here, since +// if we needed to wait for a lock, and the lock was busy, we would +// end up calling FindNextToRun(), and that would put us in an +// infinite loop. +// +// Very simple implementation -- no priorities, straight FIFO. +// Might need to be improved in later assignments. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "debug.h" +#include "scheduler.h" +#include "main.h" + +//---------------------------------------------------------------------- +// Scheduler::Scheduler +// Initialize the list of ready but not running threads. +// Initially, no ready threads. +//---------------------------------------------------------------------- + +Scheduler::Scheduler() +{ + readyList = new List; + toBeDestroyed = NULL; +} + +//---------------------------------------------------------------------- +// Scheduler::~Scheduler +// De-allocate the list of ready threads. +//---------------------------------------------------------------------- + +Scheduler::~Scheduler() +{ + delete readyList; +} + +//---------------------------------------------------------------------- +// Scheduler::ReadyToRun +// Mark a thread as ready, but not running. +// Put it on the ready list, for later scheduling onto the CPU. +// +// "thread" is the thread to be put on the ready list. +//---------------------------------------------------------------------- + +void +Scheduler::ReadyToRun (Thread *thread) +{ + ASSERT(kernel->interrupt->getLevel() == IntOff); + DEBUG(dbgThread, "Putting thread on ready list: " << thread->getName()); + //cout << "Putting thread on ready list: " << thread->getName() << endl ; + thread->setStatus(READY); + readyList->Append(thread); +} + +//---------------------------------------------------------------------- +// Scheduler::FindNextToRun +// Return the next thread to be scheduled onto the CPU. +// If there are no ready threads, return NULL. +// Side effect: +// Thread is removed from the ready list. +//---------------------------------------------------------------------- + +Thread * +Scheduler::FindNextToRun () +{ + ASSERT(kernel->interrupt->getLevel() == IntOff); + + if (readyList->IsEmpty()) { + return NULL; + } else { + return readyList->RemoveFront(); + } +} + +//---------------------------------------------------------------------- +// Scheduler::Run +// Dispatch the CPU to nextThread. Save the state of the old thread, +// and load the state of the new thread, by calling the machine +// dependent context switch routine, SWITCH. +// +// Note: we assume the state of the previously running thread has +// already been changed from running to blocked or ready (depending). +// Side effect: +// The global variable kernel->currentThread becomes nextThread. +// +// "nextThread" is the thread to be put into the CPU. +// "finishing" is set if the current thread is to be deleted +// once we're no longer running on its stack +// (when the next thread starts running) +//---------------------------------------------------------------------- + +void +Scheduler::Run (Thread *nextThread, bool finishing) +{ + Thread *oldThread = kernel->currentThread; + + ASSERT(kernel->interrupt->getLevel() == IntOff); + + if (finishing) { // mark that we need to delete current thread + ASSERT(toBeDestroyed == NULL); + toBeDestroyed = oldThread; + } + + if (oldThread->space != NULL) { // if this thread is a user program, + oldThread->SaveUserState(); // save the user's CPU registers + oldThread->space->SaveState(); + } + + oldThread->CheckOverflow(); // check if the old thread + // had an undetected stack overflow + + kernel->currentThread = nextThread; // switch to the next thread + nextThread->setStatus(RUNNING); // nextThread is now running + + DEBUG(dbgThread, "Switching from: " << oldThread->getName() << " to: " << nextThread->getName()); + + // This is a machine-dependent assembly language routine defined + // in switch.s. You may have to think + // a bit to figure out what happens after this, both from the point + // of view of the thread and from the perspective of the "outside world". + + SWITCH(oldThread, nextThread); + + // we're back, running oldThread + + // interrupts are off when we return from switch! + ASSERT(kernel->interrupt->getLevel() == IntOff); + + DEBUG(dbgThread, "Now in thread: " << oldThread->getName()); + + CheckToBeDestroyed(); // check if thread we were running + // before this one has finished + // and needs to be cleaned up + + if (oldThread->space != NULL) { // if there is an address space + oldThread->RestoreUserState(); // to restore, do it. + oldThread->space->RestoreState(); + } +} + +//---------------------------------------------------------------------- +// Scheduler::CheckToBeDestroyed +// If the old thread gave up the processor because it was finishing, +// we need to delete its carcass. Note we cannot delete the thread +// before now (for example, in Thread::Finish()), because up to this +// point, we were still running on the old thread's stack! +//---------------------------------------------------------------------- + +void +Scheduler::CheckToBeDestroyed() +{ + if (toBeDestroyed != NULL) { + delete toBeDestroyed; + toBeDestroyed = NULL; + } +} + +//---------------------------------------------------------------------- +// Scheduler::Print +// Print the scheduler state -- in other words, the contents of +// the ready list. For debugging. +//---------------------------------------------------------------------- +void +Scheduler::Print() +{ + cout << "Ready list contents:\n"; + readyList->Apply(ThreadPrint); +} diff --git a/code/threads/scheduler.h b/code/threads/scheduler.h new file mode 100644 index 0000000..36964d6 --- /dev/null +++ b/code/threads/scheduler.h @@ -0,0 +1,44 @@ +// scheduler.h +// Data structures for the thread dispatcher and scheduler. +// Primarily, the list of threads that are ready to run. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef SCHEDULER_H +#define SCHEDULER_H + +#include "copyright.h" +#include "list.h" +#include "thread.h" + +// The following class defines the scheduler/dispatcher abstraction -- +// the data structures and operations needed to keep track of which +// thread is running, and which threads are ready but not running. + +class Scheduler { + public: + Scheduler(); // Initialize list of ready threads + ~Scheduler(); // De-allocate ready list + + void ReadyToRun(Thread* thread); + // Thread can be dispatched. + Thread* FindNextToRun(); // Dequeue first thread on the ready + // list, if any, and return thread. + void Run(Thread* nextThread, bool finishing); + // Cause nextThread to start running + void CheckToBeDestroyed();// Check if thread that had been + // running needs to be deleted + void Print(); // Print contents of ready list + + // SelfTest for scheduler is implemented in class Thread + + private: + List *readyList; // queue of threads that are ready to run, + // but not running + Thread *toBeDestroyed; // finishing thread to be destroyed + // by the next thread that runs +}; + +#endif // SCHEDULER_H diff --git a/code/threads/switch.S b/code/threads/switch.S new file mode 100644 index 0000000..770609a --- /dev/null +++ b/code/threads/switch.S @@ -0,0 +1,750 @@ +/* switch.s + * Machine dependent context switch routines. DO NOT MODIFY THESE! + * + * Context switching is inherently machine dependent, since + * the registers to be saved, how to set up an initial + * call frame, etc, are all specific to a processor architecture. + * + * This file currently supports the following architectures: + * DEC MIPS (DECMIPS) + * DEC Alpha (ALPHA) + * SUN SPARC (SPARC) + * HP PA-RISC (PARISC) + * Intel 386 (x86) + * IBM RS6000 (PowerPC) -- I hope it will also work for Mac PowerPC + * + * We define two routines for each architecture: + * + * ThreadRoot(InitialPC, InitialArg, WhenDonePC, StartupPC) + * InitialPC - The program counter of the procedure to run + * in this thread. + * InitialArg - The single argument to the thread. + * WhenDonePC - The routine to call when the thread returns. + * StartupPC - Routine to call when the thread is started. + * + * ThreadRoot is called from the SWITCH() routine to start + * a thread for the first time. + * + * SWITCH(oldThread, newThread) + * oldThread - The current thread that was running, where the + * CPU register state is to be saved. + * newThread - The new thread to be run, where the CPU register + * state is to be loaded from. + */ + +/* + Copyright (c) 1992-1996 The Regents of the University of California. + All rights reserved. See copyright.h for copyright notice and limitation + of liability and disclaimer of warranty provisions. + */ + +#include "copyright.h" +#include "switch.h" + + +#ifdef DECMIPS + +/* Symbolic register names */ +#define z $0 /* zero register */ +#define a0 $4 /* argument registers */ +#define a1 $5 +#define s0 $16 /* callee saved */ +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define sp $29 /* stack pointer */ +#define fp $30 /* frame pointer */ +#define ra $31 /* return address */ + + .text + .align 2 + + .globl ThreadRoot + .ent ThreadRoot,0 +ThreadRoot: + or fp,z,z # Clearing the frame pointer here + # makes gdb backtraces of thread stacks + # end here (I hope!) + + jal StartupPC # call startup procedure + move a0, InitialArg + jal InitialPC # call main procedure + jal WhenDonePC # when done, call clean up procedure + + # NEVER REACHED + .end ThreadRoot + + # a0 -- pointer to old Thread + # a1 -- pointer to new Thread + .globl SWITCH + .ent SWITCH,0 +SWITCH: + sw sp, SP(a0) # save new stack pointer + sw s0, S0(a0) # save all the callee-save registers + sw s1, S1(a0) + sw s2, S2(a0) + sw s3, S3(a0) + sw s4, S4(a0) + sw s5, S5(a0) + sw s6, S6(a0) + sw s7, S7(a0) + sw fp, FP(a0) # save frame pointer + sw ra, PC(a0) # save return address + + lw sp, SP(a1) # load the new stack pointer + lw s0, S0(a1) # load the callee-save registers + lw s1, S1(a1) + lw s2, S2(a1) + lw s3, S3(a1) + lw s4, S4(a1) + lw s5, S5(a1) + lw s6, S6(a1) + lw s7, S7(a1) + lw fp, FP(a1) + lw ra, PC(a1) # load the return address + + j ra + .end SWITCH + +#endif // DECMIPS + + + +#ifdef SPARC + +/* NOTE! These files appear not to exist on Solaris -- + * you need to find where (the SPARC-specific) MINFRAME, ST_FLUSH_WINDOWS, ... + * are defined. (I don't have a Solaris machine, so I have no way to tell.) + */ +#ifdef SOLARIS +#include +#include +#else +#include +#include +#endif +.seg "text" + +/* SPECIAL to the SPARC: + * The first two instruction of ThreadRoot are skipped because + * the address of ThreadRoot is made the return address of SWITCH() + * by the routine Thread::StackAllocate. SWITCH() jumps here on the + * "ret" instruction which is really at "jmp %o7+8". The 8 skips the + * two nops at the beginning of the routine. + */ + +#ifdef SOLARIS +.globl ThreadRoot +ThreadRoot: +#else +.globl _ThreadRoot +_ThreadRoot: +#endif + nop ; nop /* These 2 nops are skipped because we are called + * with a jmp+8 instruction. */ + clr %fp /* Clearing the frame pointer makes gdb backtraces + * of thread stacks end here. */ + /* Currently the arguments are in out registers we + * save them into local registers so they won't be + * trashed during the calls we make. */ + mov InitialPC, %l0 + mov InitialArg, %l1 + mov WhenDonePC, %l2 + /* Execute the code: + * call StartupPC(); + * call InitialPC(InitialArg); + * call WhenDonePC(); + */ + call StartupPC,0 + nop + call %l0, 1 + mov %l1, %o0 /* Using delay slot to setup argument to InitialPC */ + call %l2, 0 + nop + /* WhenDonePC call should never return. If it does + * we execute a trap into the debugger. */ + ta ST_BREAKPOINT + + +#ifdef SOLARIS +.globl SWITCH +SWITCH: +#else +.globl _SWITCH +_SWITCH: +#endif + save %sp, -SA(MINFRAME), %sp + st %fp, [%i0] + st %i0, [%i0+I0] + st %i1, [%i0+I1] + st %i2, [%i0+I2] + st %i3, [%i0+I3] + st %i4, [%i0+I4] + st %i5, [%i0+I5] + st %i7, [%i0+I7] + ta ST_FLUSH_WINDOWS + nop + mov %i1, %l0 + ld [%l0+I0], %i0 + ld [%l0+I1], %i1 + ld [%l0+I2], %i2 + ld [%l0+I3], %i3 + ld [%l0+I4], %i4 + ld [%l0+I5], %i5 + ld [%l0+I7], %i7 + ld [%l0], %i6 + ret + restore + +#endif // SPARC + + + +#ifdef PARISC + + ;rp = r2, sp = r30 + ;arg0 = r26, arg1 = r25, arg2 = r24, arg3 = r23 + + .SPACE $TEXT$ + .SUBSPA $CODE$ +ThreadRoot + .PROC + .CALLINFO CALLER,FRAME=0 + .ENTER + + .CALL + ble 0(%r6) ;call StartupPC + stw %r31, -24(%sp) ;put return address in proper stack + ;location for StartupPC export stub. + + or %r4, 0, %arg0 ;load InitialArg + .CALL ;in=26 + ble 0(%r3) ;call InitialPC + stw %r31, -24(%sp) ;put return address in proper stack + ;location for InitialPC export stub. + + .CALL + ble 0(%r5) ;call WhenDonePC + stw %r31, -24(%sp) ;put return address in proper stack + ;location for StartupPC export stub. + .LEAVE + + .PROCEND + + +SWITCH + .PROC + .CALLINFO CALLER,FRAME=0 + .ENTRY + + ; save process state of oldThread + stw %sp, SP(%arg0) ;save stack pointer + stw %r3, S0(%arg0) ;save callee-save registers + stw %r4, S1(%arg0) + stw %r5, S2(%arg0) + stw %r6, S3(%arg0) + stw %r7, S4(%arg0) + stw %r8, S5(%arg0) + stw %r9, S6(%arg0) + stw %r10, S7(%arg0) + stw %r11, S8(%arg0) + stw %r12, S9(%arg0) + stw %r13, S10(%arg0) + stw %r14, S11(%arg0) + stw %r15, S12(%arg0) + stw %r16, S13(%arg0) + stw %r17, S14(%arg0) + stw %r18, S15(%arg0) + stw %rp, PC(%arg0) ;save program counter + + ; restore process state of nextThread + ldw SP(%arg1), %sp ;restore stack pointer + ldw S0(%arg1), %r3 ;restore callee-save registers + ldw S1(%arg1), %r4 + ldw S2(%arg1), %r5 + ldw S3(%arg1), %r6 + ldw S4(%arg1), %r7 + ldw S5(%arg1), %r8 + ldw S6(%arg1), %r9 + ldw S7(%arg1), %r10 + ldw S8(%arg1), %r11 + ldw S9(%arg1), %r12 + ldw S10(%arg1), %r13 + ldw S11(%arg1), %r14 + ldw S12(%arg1), %r15 + ldw S13(%arg1), %r16 + ldw S14(%arg1), %r17 + ldw PC(%arg1), %rp ;save program counter + bv 0(%rp) + .EXIT + ldw S15(%arg1), %r18 + + .PROCEND + + .EXPORT SWITCH,ENTRY,PRIV_LEV=3,RTNVAL=GR + .EXPORT ThreadRoot,ENTRY,PRIV_LEV=3,RTNVAL=GR + +#endif // PARISC + + + +#ifdef x86 + + .text + .align 2 + + .globl ThreadRoot + .globl _ThreadRoot + +/* void ThreadRoot( void ) +** +** expects the following registers to be initialized: +** eax points to startup function (interrupt enable) +** edx contains inital argument to thread function +** esi points to thread function +** edi point to Thread::Finish() +*/ +_ThreadRoot: +ThreadRoot: + pushl %ebp + movl %esp,%ebp + pushl InitialArg + call *StartupPC + call *InitialPC + call *WhenDonePC + + # NOT REACHED + movl %ebp,%esp + popl %ebp + ret + + + +/* void SWITCH( thread *t1, thread *t2 ) +** +** on entry, stack looks like this: +** 8(esp) -> thread *t2 +** 4(esp) -> thread *t1 +** (esp) -> return address +** +** we push the current eax on the stack so that we can use it as +** a pointer to t1, this decrements esp by 4, so when we use it +** to reference stuff on the stack, we add 4 to the offset. +*/ + .comm _eax_save,4 + + .globl SWITCH + .globl _SWITCH +_SWITCH: +SWITCH: + movl %eax,_eax_save # save the value of eax + movl 4(%esp),%eax # move pointer to t1 into eax + movl %ebx,_EBX(%eax) # save registers + movl %ecx,_ECX(%eax) + movl %edx,_EDX(%eax) + movl %esi,_ESI(%eax) + movl %edi,_EDI(%eax) + movl %ebp,_EBP(%eax) + movl %esp,_ESP(%eax) # save stack pointer + movl _eax_save,%ebx # get the saved value of eax + movl %ebx,_EAX(%eax) # store it + movl 0(%esp),%ebx # get return address from stack into ebx + movl %ebx,_PC(%eax) # save it into the pc storage + + movl 8(%esp),%eax # move pointer to t2 into eax + + movl _EAX(%eax),%ebx # get new value for eax into ebx + movl %ebx,_eax_save # save it + movl _EBX(%eax),%ebx # retore old registers + movl _ECX(%eax),%ecx + movl _EDX(%eax),%edx + movl _ESI(%eax),%esi + movl _EDI(%eax),%edi + movl _EBP(%eax),%ebp + movl _ESP(%eax),%esp # restore stack pointer + movl _PC(%eax),%eax # restore return address into eax + movl %eax,4(%esp) # copy over the ret address on the stack + movl _eax_save,%eax + + ret + +#endif // x86 + + +#if defined(ApplePowerPC) + + /* The AIX PowerPC code is incompatible with the assembler on MacOS X + * and Linux. So the SWITCH code was adapted for IBM 750 compatible + * processors, and ThreadRoot is modeled after the more reasonable + * looking ThreadRoot's in this file. + * + * Joshua LeVasseur + */ + + .align 2 + .globl _SWITCH +_SWITCH: + stw r1, 0(r3) /* Store stack pointer. */ + stmw r13, 20(r3) /* Store general purpose registers 13 - 31. */ + stfd f14, 96(r3) /* Store floating point registers 14 -31. */ + stfd f15, 104(r3) + stfd f16, 112(r3) + stfd f17, 120(r3) + stfd f18, 128(r3) + stfd f19, 136(r3) + stfd f20, 144(r3) + stfd f21, 152(r3) + stfd f22, 160(r3) + stfd f23, 168(r3) + stfd f24, 176(r3) + stfd f25, 184(r3) + stfd f26, 192(r3) + stfd f27, 200(r3) + stfd f28, 208(r3) + stfd f29, 216(r3) + stfd f30, 224(r3) + stfd f31, 232(r3) + + mflr r0 + stw r0, 244(r3) /* Spill the link register. */ + + mfcr r12 + stw r12, 240(r3) /* Spill the condition register. */ + + lwz r1, 0(r4) /* Load the incoming stack pointer. */ + + lwz r0, 244(r4) /* Load the incoming link register. */ + mtlr r0 /* Restore the link register. */ + + lwz r12, 240(r4) /* Load the condition register value. */ + mtcrf 0xff, r12 /* Restore the condition register. */ + + lmw r13, 20(r4) /* Restore registers r13 - r31. */ + + lfd f14, 96(r4) /* Restore floating point register f14 - f31. */ + lfd f15, 104(r4) + lfd f16, 112(r4) + lfd f17, 120(r4) + lfd f18, 128(r4) + lfd f19, 136(r4) + lfd f20, 144(r4) + lfd f21, 152(r4) + lfd f22, 160(r4) + lfd f23, 168(r4) + lfd f24, 176(r4) + lfd f25, 184(r4) + lfd f26, 192(r4) + lfd f27, 200(r4) + lfd f28, 208(r4) + lfd f29, 216(r4) + lfd f30, 224(r4) + lfd f31, 232(r4) + + /* When a thread first starts, the following blr instruction jumps + * to ThreadRoot. ThreadRoot expects the incoming thread block + * in r4. + */ + blr /* Branch to the address held in link register. */ + + + .align 2 + .globl _ThreadRoot +_ThreadRoot: + lwz r20, 16(r4) /* StartupPCState - ThreadBegin */ + lwz r21, 8(r4) /* InitialArgState - arg */ + lwz r22, 4(r4) /* InitialPCState - func */ + lwz r23, 12(r4) /* WhenDonePCState - ThreadFinish */ + + /* Call ThreadBegin function. */ + mtctr r20 /* The function pointer. */ + bctrl + + /* Call the target function. */ + mr r3, r21 /* Function arg. */ + mtctr r22 /* Function pointer. */ + bctrl + + /* Call the ThreadFinish function. */ + mtctr r23 + bctrl + + /* We shouldn't execute here. */ +1: b 1b + + +#endif + + +#if defined(PowerPC) && !defined(ApplePowerPC) + .globl branch[ds] + .csect branch[ds] + .long .branch[PR] + .long TOC[tc0] + .long 0 + .toc + T.branch: .tc .branch[tc], branch[ds] + .globl .branch[PR] + .csect .branch[PR] + + l 0, 0x0(11) # load function address into r0 + mtctr 0 # move r0 into counter register + l 2, 0x4(11) # move new TOC address into r2 + l 11, 0x8(11) # reset function address + bctr # branch to the counter register + + + .globl ThreadRoot[ds] + .csect ThreadRoot[ds] + .long .ThreadRoot[PR] + .long TOC[tc0] + .long 0 + .toc + T.ThreadRoot: .tc .ThreadRoot[tc], ThreadRoot[ds] + .globl .ThreadRoot[PR] + .csect .ThreadRoot[PR] + + .set argarea, 32 + .set linkarea, 24 + .set locstckarea, 0 + .set nfprs, 18 + .set ngprs, 19 + .set szdsa, 8*nfprs+4*ngprs+linkarea+argarea+locstckarea + + + mflr 0 + mfcr 12 + bl ._savef14 + cror 0xf, 0xf, 0xf + stm 13, -8*nfprs-4*ngprs(1) + st 0, 8(1) + st 12, 4(1) + st 4, 24(1) + st 5, 28(1) + st 6, 32(1) + stu 1, -szdsa(1) + + muli 11,3,1 # copy contents of register r24 to r11 + bl .branch[PR] # call function branch + cror 0xf, 0xf, 0xf # no operation + + ai 1,1,szdsa + lm 13, -8*nfprs-4*ngprs(1) + bl ._restf14 + cror 0xf, 0xf, 0xf + l 0, 8(1) + l 12, 4(1) + mtlr 0 + mtcrf 0x38, 12 + l 4, 24(1) + l 5, 28(1) + l 6, 32(1) + + mflr 0 + mfcr 12 + bl ._savef14 + cror 0xf, 0xf, 0xf + stm 13, -8*nfprs-4*ngprs(1) + st 0, 8(1) + st 12, 4(1) + st 6, 24(1) + stu 1, -szdsa(1) + + muli 3, 4,1 # load user function parameter r22 to r3 + muli 11,5,1 # copy contents of register r21 to r11 + bl .branch[PR] # call function branch + cror 0xf, 0xf, 0xf # no operation + + ai 1,1,szdsa + lm 13, -8*nfprs-4*ngprs(1) + bl ._restf14 + cror 0xf, 0xf, 0xf + l 0, 8(1) + l 12, 4(1) + mtlr 0 + mtcrf 0x38, 12 + l 6, 24(1) + + muli 11,6,1 # copy contents of register r23 to r11 + bl .branch[PR] # call function branch + cror 0xf, 0xf, 0xf # no operation + brl # the programme should not return here. + + .extern ._savef14 + .extern ._restf14 + + + + + .globl SWITCH[ds] + .csect SWITCH[ds] + .long .SWITCH[PR] + .long TOC[tc0] + .long 0 + .toc + T.SWITCH: .tc .SWITCH[tc], SWITCH[ds] + .globl .SWITCH[PR] + .csect .SWITCH[PR] + + st 1, 0(3) # store stack pointer + stm 13, 20(3) # store general purpose registers (13 -31) + stfd 14, 96(3) # store floating point registers (14 -31) + stfd 15, 104(3) # there is no single instruction to do for + stfd 16, 112(3) # floating point registers. so do one by one + stfd 17, 120(3) + stfd 18, 128(3) + stfd 19, 136(3) + stfd 20, 144(3) + stfd 21, 152(3) + stfd 22, 160(3) + stfd 23, 168(3) + stfd 24, 176(3) + stfd 25, 184(3) + stfd 26, 192(3) + stfd 27, 200(3) + stfd 28, 208(3) + stfd 29, 216(3) + stfd 30, 224(3) + stfd 31, 232(3) + mflr 0 # move link register value to register 0 + st 0, 244(3) # store link register value + + mfcr 12 # move condition register to register 12 + st 12, 240(3) # store condition register value + + + l 1, 0(4) # load stack pointer + l 0, 244(4) # load link register value + mtlr 0 + l 12, 240(4) # load condition register value + mtcrf 0x38, 12 + + + + lm 13, 20(4) # load into general purpose registers (13 -31) + lfd 14, 96(4) # load into floating point registers (14 -31) + lfd 15, 104(4) # there is no single instruction for + lfd 16, 112(4) # loading into more than one floating point + lfd 17, 120(4) # registers. so do one by one. + lfd 18, 128(4) + lfd 19, 136(4) + lfd 20, 144(4) + lfd 21, 152(4) + lfd 22, 160(4) + lfd 23, 168(4) + lfd 24, 176(4) + lfd 25, 184(4) + lfd 26, 192(4) + lfd 27, 200(4) + lfd 28, 208(4) + lfd 29, 216(4) + lfd 30, 224(4) + lfd 31, 232(4) + l 3, 16(4) + l 5, 4(4) + l 6, 12(4) + l 4, 8(4) + + brl # branch to the address held in link register. +#endif // PowerPC + + +#ifdef ALPHA + +/* + * Porting to Alpha was done by Shuichi Oikawa (shui@sfc.keio.ac.jp). + */ + +/* + * Symbolic register names and register saving rules + * + * Legend: + * T Saved by caller (Temporaries) + * S Saved by callee (call-Safe registers) + */ + +#define v0 $0 /* (T) return value */ +#define t0 $1 /* (T) temporary registers */ +#define s0 $9 /* (S) call-safe registers */ +#define s1 $10 +#define s2 $11 +#define s3 $12 +#define s4 $13 +#define s5 $14 +#define s6 $15 +#define a0 $16 /* (T) argument registers */ +#define a1 $17 +#define ai $25 /* (T) argument information */ +#define ra $26 /* (T) return address */ +#define pv $27 /* (T) procedure value */ +#define gp $29 /* (T) (local) data pointer */ +#define sp $30 /* (S) stack pointer */ +#define zero $31 /* wired zero */ + + .set noreorder # unless overridden + .align 3 + .text + + .globl ThreadRoot + .ent ThreadRoot,0 +ThreadRoot: + .frame sp,0,ra + ldgp gp,0(pv) + + mov zero,s6 # Clearing the frame pointer here + # makes gdb backtraces of thread stacks + # end here (I hope!) + mov StartupPC,pv + jsr ra,(pv) # call startup procedure + ldgp gp,0(ra) + + mov InitialArg,a0 + mov InitialPC,pv + jsr ra,(pv) # call main procedure + ldgp gp,0(ra) + + mov WhenDonePC,pv + jsr ra,(pv) # when done, call clean up procedure + ldgp gp,0(ra) + + .end ThreadRoot # NEVER REACHED + +/* a0 -- pointer to old Thread * + * a1 -- pointer to new Thread */ + .globl SWITCH + .ent SWITCH,0 +SWITCH: + .frame sp,0,ra + ldgp gp,0(pv) + + stq ra, PC(a0) # save return address + stq gp, GP(a0) + stq sp, SP(a0) # save new stack pointer + stq s0, S0(a0) # save all the callee-save registers + stq s1, S1(a0) + stq s2, S2(a0) + stq s3, S3(a0) + stq s4, S4(a0) + stq s5, S5(a0) + stq s6, S6(a0) # save frame pointer + + ldq ra, PC(a1) # load the return address + ldq gp, GP(a1) + ldq sp, SP(a1) # load the new stack pointer + ldq s0, S0(a1) # load the callee-save registers + ldq s1, S1(a1) + ldq s2, S2(a1) + ldq s3, S3(a1) + ldq s4, S4(a1) + ldq s5, S5(a1) + ldq s6, S6(a1) + + mov ra,pv + ret zero,(ra) + + .end SWITCH + +#endif // ALPHA diff --git a/code/threads/switch.h b/code/threads/switch.h new file mode 100644 index 0000000..42639d1 --- /dev/null +++ b/code/threads/switch.h @@ -0,0 +1,268 @@ +/* switch.h + * Definitions needed for implementing context switching. + * + * Context switching is inherently machine dependent, since + * the registers to be saved, how to set up an initial + * call frame, etc, are all specific to a processor architecture. + * + * This file currently supports the DEC MIPS, DEC Alpha, SUN SPARC, + * HP PARISC, IBM PowerPC, and Intel x86 architectures. + */ + +/* + Copyright (c) 1992-1996 The Regents of the University of California. + All rights reserved. See copyright.h for copyright notice and limitation + of liability and disclaimer of warranty provisions. + */ + +#ifndef SWITCH_H +#define SWITCH_H + +#include "copyright.h" + +#ifdef DECMIPS + +/* Registers that must be saved during a context switch. + * These are the offsets from the beginning of the Thread object, + * in bytes, used in switch.s + */ +#define SP 0 +#define S0 4 +#define S1 8 +#define S2 12 +#define S3 16 +#define S4 20 +#define S5 24 +#define S6 28 +#define S7 32 +#define FP 36 +#define PC 40 + +/* To fork a thread, we set up its saved register state, so that + * when we switch to the thread, it will start running in ThreadRoot. + * + * The following are the initial registers we need to set up to + * pass values into ThreadRoot (for instance, containing the procedure + * for the thread to run). The first set is the registers as used + * by ThreadRoot; the second set is the locations for these initial + * values in the Thread object -- used in Thread::AllocateStack(). + */ + +#define InitialPC s0 +#define InitialArg s1 +#define WhenDonePC s2 +#define StartupPC s3 + +#define PCState (PC/4-1) +#define FPState (FP/4-1) +#define InitialPCState (S0/4-1) +#define InitialArgState (S1/4-1) +#define WhenDonePCState (S2/4-1) +#define StartupPCState (S3/4-1) + +#endif // DECMIPS + +#ifdef SPARC + +/* Registers that must be saved during a context switch. See comment above. */ +#define I0 4 +#define I1 8 +#define I2 12 +#define I3 16 +#define I4 20 +#define I5 24 +#define I6 28 +#define I7 32 + +/* Aliases used for clearing code. */ +#define FP I6 +#define PC I7 + +/* Registers for ThreadRoot. See comment above. */ +#define InitialPC %o0 +#define InitialArg %o1 +#define WhenDonePC %o2 +#define StartupPC %o3 + +#define PCState (PC/4-1) +#define InitialPCState (I0/4-1) +#define InitialArgState (I1/4-1) +#define WhenDonePCState (I2/4-1) +#define StartupPCState (I3/4-1) + +#endif // SPARC + +#ifdef PARISC + +/* Registers that must be saved during a context switch. See comment above. */ +#define SP 0 +#define S0 4 +#define S1 8 +#define S2 12 +#define S3 16 +#define S4 20 +#define S5 24 +#define S6 28 +#define S7 32 +#define S8 36 +#define S9 40 +#define S10 44 +#define S11 48 +#define S12 52 +#define S13 56 +#define S14 60 +#define S15 64 +#define PC 68 + +/* Registers for ThreadRoot. See comment above. */ +#define InitialPC %r3 /* S0 */ +#define InitialArg %r4 +#define WhenDonePC %r5 +#define StartupPC %r6 + +#define PCState (PC/4-1) +#define InitialPCState (S0/4-1) +#define InitialArgState (S1/4-1) +#define WhenDonePCState (S2/4-1) +#define StartupPCState (S3/4-1) + +#endif // PARISC + +#ifdef x86 + +/* the offsets of the registers from the beginning of the thread object */ +#define _ESP 0 +#define _EAX 4 +#define _EBX 8 +#define _ECX 12 +#define _EDX 16 +#define _EBP 20 +#define _ESI 24 +#define _EDI 28 +#define _PC 32 + +/* These definitions are used in Thread::AllocateStack(). */ +#define PCState (_PC/4-1) +#define FPState (_EBP/4-1) +#define InitialPCState (_ESI/4-1) +#define InitialArgState (_EDX/4-1) +#define WhenDonePCState (_EDI/4-1) +#define StartupPCState (_ECX/4-1) + +#define InitialPC %esi +#define InitialArg %edx +#define WhenDonePC %edi +#define StartupPC %ecx + +#endif // x86 + +#ifdef PowerPC + + #define SP 0 // stack pointer + #define P1 4 // parameters + #define P2 8 + #define P3 12 + #define P4 16 + #define GP13 20 // general purpose registers 13-31 + #define GP14 24 + #define GP15 28 + #define GP16 32 + #define GP17 36 + #define GP18 40 + #define GP19 44 + #define GP20 48 + #define GP21 52 + #define GP22 56 + #define GP23 60 + #define GP24 64 + #define GP25 68 + #define GP26 72 + #define GP27 76 + #define GP28 80 + #define GP29 84 + #define GP30 88 + #define GP31 92 + #define FP13 96 // floating point registers 14-31 + #define FP15 104 + #define FP16 112 + #define FP17 120 + #define FP18 128 + #define FP19 136 + #define FP20 144 + #define FP21 152 + #define FP22 160 + #define FP23 168 + #define FP24 176 + #define FP25 184 + #define FP26 192 + #define FP27 200 + #define FP28 208 + #define FP29 216 + #define FP30 224 + #define FP31 232 + #define CR 240 // control register + #define LR 244 // link register + #define TOC 248 // Table Of Contents + + + // for ThreadRoot assembly function + + #define InitialPCState 0 // (P1/4 - 1) // user function address + #define InitialArgState 1 // (P2/4 - 1) // user function argument + #define WhenDonePCState 2 // (P3/4 - 1) // clean up function addr + #define StartupPCState 3 // (P4/4 - 1) // start up function addr + #define PCState 60 // (LR/4 - 1) // ThreadRoot addr (first time). + // Later PC addr when SWITCH + // occured + + #define InitialLR 21 + #define InitialArg 22 + #define WhenDoneLR 23 + #define StartupLR 24 + +#endif // PowerPC + +#ifdef ALPHA + +/* + * Porting to Alpha was done by Shuichi Oikawa (shui@sfc.keio.ac.jp). + */ +/* Registers that must be saved during a context switch. + * These are the offsets from the beginning of the Thread object, + * in bytes, used in switch.s + */ +#define SP (0*8) +#define S0 (1*8) +#define S1 (2*8) +#define S2 (3*8) +#define S3 (4*8) +#define S4 (5*8) +#define S5 (6*8) +#define S6 (7*8) /* used as FP (Frame Pointer) */ +#define GP (8*8) +#define PC (9*8) + +/* To fork a thread, we set up its saved register state, so that + * when we switch to the thread, it will start running in ThreadRoot. + * + * The following are the initial registers we need to set up to + * pass values into ThreadRoot (for instance, containing the procedure + * for the thread to run). The first set is the registers as used + * by ThreadRoot; the second set is the locations for these initial + * values in the Thread object -- used in Thread::StackAllocate(). + */ +#define InitialPC s0 +#define InitialArg s1 +#define WhenDonePC s2 +#define StartupPC s3 + +#define PCState (PC/8-1) +#define FPState (S6/8-1) +#define InitialPCState (S0/8-1) +#define InitialArgState (S1/8-1) +#define WhenDonePCState (S2/8-1) +#define StartupPCState (S3/8-1) + +#endif // HOST_ALPHA + +#endif // SWITCH_H diff --git a/code/threads/synch.cc b/code/threads/synch.cc new file mode 100644 index 0000000..5be111c --- /dev/null +++ b/code/threads/synch.cc @@ -0,0 +1,297 @@ +// synch.cc +// Routines for synchronizing threads. Three kinds of +// synchronization routines are defined here: semaphores, locks +// and condition variables. +// +// Any implementation of a synchronization routine needs some +// primitive atomic operation. We assume Nachos is running on +// a uniprocessor, and thus atomicity can be provided by +// turning off interrupts. While interrupts are disabled, no +// context switch can occur, and thus the current thread is guaranteed +// to hold the CPU throughout, until interrupts are reenabled. +// +// Because some of these routines might be called with interrupts +// already disabled (Semaphore::V for one), instead of turning +// on interrupts at the end of the atomic operation, we always simply +// re-set the interrupt state back to its original value (whether +// that be disabled or enabled). +// +// Once we'e implemented one set of higher level atomic operations, +// we can implement others using that implementation. We illustrate +// this by implementing locks and condition variables on top of +// semaphores, instead of directly enabling and disabling interrupts. +// +// Locks are implemented using a semaphore to keep track of +// whether the lock is held or not -- a semaphore value of 0 means +// the lock is busy; a semaphore value of 1 means the lock is free. +// +// The implementation of condition variables using semaphores is +// a bit trickier, as explained below under Condition::Wait. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "synch.h" +#include "main.h" + +//---------------------------------------------------------------------- +// Semaphore::Semaphore +// Initialize a semaphore, so that it can be used for synchronization. +// +// "debugName" is an arbitrary name, useful for debugging. +// "initialValue" is the initial value of the semaphore. +//---------------------------------------------------------------------- + +Semaphore::Semaphore(char* debugName, int initialValue) +{ + name = debugName; + value = initialValue; + queue = new List; +} + +//---------------------------------------------------------------------- +// Semaphore::Semaphore +// De-allocate semaphore, when no longer needed. Assume no one +// is still waiting on the semaphore! +//---------------------------------------------------------------------- + +Semaphore::~Semaphore() +{ + delete queue; +} + +//---------------------------------------------------------------------- +// Semaphore::P +// Wait until semaphore value > 0, then decrement. Checking the +// value and decrementing must be done atomically, so we +// need to disable interrupts before checking the value. +// +// Note that Thread::Sleep assumes that interrupts are disabled +// when it is called. +//---------------------------------------------------------------------- + +void +Semaphore::P() +{ + Interrupt *interrupt = kernel->interrupt; + Thread *currentThread = kernel->currentThread; + + // disable interrupts + IntStatus oldLevel = interrupt->SetLevel(IntOff); + + while (value == 0) { // semaphore not available + queue->Append(currentThread); // so go to sleep + currentThread->Sleep(FALSE); + } + value--; // semaphore available, consume its value + + // re-enable interrupts + (void) interrupt->SetLevel(oldLevel); +} + +//---------------------------------------------------------------------- +// Semaphore::V +// Increment semaphore value, waking up a waiter if necessary. +// As with P(), this operation must be atomic, so we need to disable +// interrupts. Scheduler::ReadyToRun() assumes that interrupts +// are disabled when it is called. +//---------------------------------------------------------------------- + +void +Semaphore::V() +{ + Interrupt *interrupt = kernel->interrupt; + + // disable interrupts + IntStatus oldLevel = interrupt->SetLevel(IntOff); + + if (!queue->IsEmpty()) { // make thread ready. + kernel->scheduler->ReadyToRun(queue->RemoveFront()); + } + value++; + + // re-enable interrupts + (void) interrupt->SetLevel(oldLevel); +} + +//---------------------------------------------------------------------- +// Semaphore::SelfTest, SelfTestHelper +// Test the semaphore implementation, by using a semaphore +// to control two threads ping-ponging back and forth. +//---------------------------------------------------------------------- + +static Semaphore *ping; +static void +SelfTestHelper (Semaphore *pong) +{ + for (int i = 0; i < 10; i++) { + ping->P(); + pong->V(); + } +} + +void +Semaphore::SelfTest() +{ + Thread *helper = new Thread("ping", 1); + + ASSERT(value == 0); // otherwise test won't work! + ping = new Semaphore("ping", 0); + helper->Fork((VoidFunctionPtr) SelfTestHelper, this); + for (int i = 0; i < 10; i++) { + ping->V(); + this->P(); + } + delete ping; +} + +//---------------------------------------------------------------------- +// Lock::Lock +// Initialize a lock, so that it can be used for synchronization. +// Initially, unlocked. +// +// "debugName" is an arbitrary name, useful for debugging. +//---------------------------------------------------------------------- + +Lock::Lock(char* debugName) +{ + name = debugName; + semaphore = new Semaphore("lock", 1); // initially, unlocked + lockHolder = NULL; +} + +//---------------------------------------------------------------------- +// Lock::~Lock +// Deallocate a lock +//---------------------------------------------------------------------- +Lock::~Lock() +{ + delete semaphore; +} + +//---------------------------------------------------------------------- +// Lock::Acquire +// Atomically wait until the lock is free, then set it to busy. +// Equivalent to Semaphore::P(), with the semaphore value of 0 +// equal to busy, and semaphore value of 1 equal to free. +//---------------------------------------------------------------------- + +void Lock::Acquire() +{ + semaphore->P(); + lockHolder = kernel->currentThread; +} + +//---------------------------------------------------------------------- +// Lock::Release +// Atomically set lock to be free, waking up a thread waiting +// for the lock, if any. +// Equivalent to Semaphore::V(), with the semaphore value of 0 +// equal to busy, and semaphore value of 1 equal to free. +// +// By convention, only the thread that acquired the lock +// may release it. +//--------------------------------------------------------------------- + +void Lock::Release() +{ + ASSERT(IsHeldByCurrentThread()); + lockHolder = NULL; + semaphore->V(); +} + +//---------------------------------------------------------------------- +// Condition::Condition +// Initialize a condition variable, so that it can be +// used for synchronization. Initially, no one is waiting +// on the condition. +// +// "debugName" is an arbitrary name, useful for debugging. +//---------------------------------------------------------------------- +Condition::Condition(char* debugName) +{ + name = debugName; + waitQueue = new List; +} + +//---------------------------------------------------------------------- +// Condition::Condition +// Deallocate the data structures implementing a condition variable. +//---------------------------------------------------------------------- + +Condition::~Condition() +{ + delete waitQueue; +} + +//---------------------------------------------------------------------- +// Condition::Wait +// Atomically release monitor lock and go to sleep. +// Our implementation uses semaphores to implement this, by +// allocating a semaphore for each waiting thread. The signaller +// will V() this semaphore, so there is no chance the waiter +// will miss the signal, even though the lock is released before +// calling P(). +// +// Note: we assume Mesa-style semantics, which means that the +// waiter must re-acquire the monitor lock when waking up. +// +// "conditionLock" -- lock protecting the use of this condition +//---------------------------------------------------------------------- + +void Condition::Wait(Lock* conditionLock) +{ + Semaphore *waiter; + + ASSERT(conditionLock->IsHeldByCurrentThread()); + + waiter = new Semaphore("condition", 0); + waitQueue->Append(waiter); + conditionLock->Release(); + waiter->P(); + conditionLock->Acquire(); + delete waiter; +} + +//---------------------------------------------------------------------- +// Condition::Signal +// Wake up a thread waiting on this condition, if any. +// +// Note: we assume Mesa-style semantics, which means that the +// signaller doesn't give up control immediately to the thread +// being woken up (unlike Hoare-style). +// +// Also note: we assume the caller holds the monitor lock +// (unlike what is described in Birrell's paper). This allows +// us to access waitQueue without disabling interrupts. +// +// "conditionLock" -- lock protecting the use of this condition +//---------------------------------------------------------------------- + +void Condition::Signal(Lock* conditionLock) +{ + Semaphore *waiter; + + ASSERT(conditionLock->IsHeldByCurrentThread()); + + if (!waitQueue->IsEmpty()) { + waiter = waitQueue->RemoveFront(); + waiter->V(); + } +} + +//---------------------------------------------------------------------- +// Condition::Broadcast +// Wake up all threads waiting on this condition, if any. +// +// "conditionLock" -- lock protecting the use of this condition +//---------------------------------------------------------------------- + +void Condition::Broadcast(Lock* conditionLock) +{ + while (!waitQueue->IsEmpty()) { + Signal(conditionLock); + } +} diff --git a/code/threads/synch.h b/code/threads/synch.h new file mode 100644 index 0000000..2281df9 --- /dev/null +++ b/code/threads/synch.h @@ -0,0 +1,144 @@ +// synch.h +// Data structures for synchronizing threads. +// +// Three kinds of synchronization are defined here: semaphores, +// locks, and condition variables. The implementation for +// semaphores is given; for the latter two, only the procedure +// interface is given -- they are to be implemented as part of +// the first assignment. +// +// Note that all the synchronization objects take a "name" as +// part of the initialization. This is solely for debugging purposes. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// synch.h -- synchronization primitives. + +#ifndef SYNCH_H +#define SYNCH_H + +#include "copyright.h" +#include "thread.h" +#include "list.h" +#include "main.h" + +// The following class defines a "semaphore" whose value is a non-negative +// integer. The semaphore has only two operations P() and V(): +// +// P() -- waits until value > 0, then decrement +// +// V() -- increment, waking up a thread waiting in P() if necessary +// +// Note that the interface does *not* allow a thread to read the value of +// the semaphore directly -- even if you did read the value, the +// only thing you would know is what the value used to be. You don't +// know what the value is now, because by the time you get the value +// into a register, a context switch might have occurred, +// and some other thread might have called P or V, so the true value might +// now be different. + +class Semaphore { + public: + Semaphore(char* debugName, int initialValue); // set initial value + ~Semaphore(); // de-allocate semaphore + char* getName() { return name;} // debugging assist + + void P(); // these are the only operations on a semaphore + void V(); // they are both *atomic* + void SelfTest(); // test routine for semaphore implementation + + private: + char* name; // useful for debugging + int value; // semaphore value, always >= 0 + List *queue; + // threads waiting in P() for the value to be > 0 + }; + +// The following class defines a "lock". A lock can be BUSY or FREE. +// There are only two operations allowed on a lock: +// +// Acquire -- wait until the lock is FREE, then set it to BUSY +// +// Release -- set lock to be FREE, waking up a thread waiting +// in Acquire if necessary +// +// In addition, by convention, only the thread that acquired the lock +// may release it. As with semaphores, you can't read the lock value +// (because the value might change immediately after you read it). + +class Lock { + public: + Lock(char* debugName); // initialize lock to be FREE + ~Lock(); // deallocate lock + char* getName() { return name; } // debugging assist + + void Acquire(); // these are the only operations on a lock + void Release(); // they are both *atomic* + + bool IsHeldByCurrentThread() { + return lockHolder == kernel->currentThread; } + // return true if the current thread + // holds this lock. + + // Note: SelfTest routine provided by SynchList + + private: + char *name; // debugging assist + Thread *lockHolder; // thread currently holding lock + Semaphore *semaphore; // we use a semaphore to implement lock +}; + +// The following class defines a "condition variable". A condition +// variable does not have a value, but threads may be queued, waiting +// on the variable. These are only operations on a condition variable: +// +// Wait() -- release the lock, relinquish the CPU until signaled, +// then re-acquire the lock +// +// Signal() -- wake up a thread, if there are any waiting on +// the condition +// +// Broadcast() -- wake up all threads waiting on the condition +// +// All operations on a condition variable must be made while +// the current thread has acquired a lock. Indeed, all accesses +// to a given condition variable must be protected by the same lock. +// In other words, mutual exclusion must be enforced among threads calling +// the condition variable operations. +// +// In Nachos, condition variables are assumed to obey *Mesa*-style +// semantics. When a Signal or Broadcast wakes up another thread, +// it simply puts the thread on the ready list, and it is the responsibility +// of the woken thread to re-acquire the lock (this re-acquire is +// taken care of within Wait()). By contrast, some define condition +// variables according to *Hoare*-style semantics -- where the signalling +// thread gives up control over the lock and the CPU to the woken thread, +// which runs immediately and gives back control over the lock to the +// signaller when the woken thread leaves the critical section. +// +// The consequence of using Mesa-style semantics is that some other thread +// can acquire the lock, and change data structures, before the woken +// thread gets a chance to run. The advantage to Mesa-style semantics +// is that it is a lot easier to implement than Hoare-style. + +class Condition { + public: + Condition(char* debugName); // initialize condition to + // "no one waiting" + ~Condition(); // deallocate the condition + char* getName() { return (name); } + + void Wait(Lock *conditionLock); // these are the 3 operations on + // condition variables; releasing the + // lock and going to sleep are + // *atomic* in Wait() + void Signal(Lock *conditionLock); // conditionLock must be held by + void Broadcast(Lock *conditionLock);// the currentThread for all of + // these operations + // SelfTest routine provided by SyncLists + + private: + char* name; + List *waitQueue; // list of waiting threads +}; +#endif // SYNCH_H diff --git a/code/threads/synchlist.cc b/code/threads/synchlist.cc new file mode 100644 index 0000000..4c2fdae --- /dev/null +++ b/code/threads/synchlist.cc @@ -0,0 +1,130 @@ +// synchlist.cc +// Routines for synchronized access to a list. +// +// Implemented in "monitor"-style -- surround each procedure with a +// lock acquire and release pair, using condition signal and wait for +// synchronization. +// +// Copyright (c) 1992-1993 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "synchlist.h" + +//---------------------------------------------------------------------- +// SynchList::SynchList +// Allocate and initialize the data structures needed for a +// synchronized list, empty to start with. +// Elements can now be added to the list. +//---------------------------------------------------------------------- + +template +SynchList::SynchList() +{ + list = new List; + lock = new Lock("list lock"); + listEmpty = new Condition("list empty cond"); +} + +//---------------------------------------------------------------------- +// SynchList::~SynchList +// De-allocate the data structures created for synchronizing a list. +//---------------------------------------------------------------------- + +template +SynchList::~SynchList() +{ + delete listEmpty; + delete lock; + delete list; +} + +//---------------------------------------------------------------------- +// SynchList::Append +// Append an "item" to the end of the list. Wake up anyone +// waiting for an element to be appended. +// +// "item" is the thing to put on the list. +//---------------------------------------------------------------------- + +template +void +SynchList::Append(T item) +{ + lock->Acquire(); // enforce mutual exclusive access to the list + list->Append(item); + listEmpty->Signal(lock); // wake up a waiter, if any + lock->Release(); +} + +//---------------------------------------------------------------------- +// SynchList::RemoveFront +// Remove an "item" from the beginning of the list. Wait if +// the list is empty. +// Returns: +// The removed item. +//---------------------------------------------------------------------- + +template +T +SynchList::RemoveFront() +{ + T item; + + lock->Acquire(); // enforce mutual exclusion + while (list->IsEmpty()) + listEmpty->Wait(lock); // wait until list isn't empty + item = list->RemoveFront(); + lock->Release(); + return item; +} + +//---------------------------------------------------------------------- +// SynchList::Apply +// Apply function to every item on a list. +// +// "func" -- the function to apply +//---------------------------------------------------------------------- + +template +void +SynchList::Apply(void (*func)(T)) +{ + lock->Acquire(); // enforce mutual exclusion + list->Apply(func); + lock->Release(); +} + +//---------------------------------------------------------------------- +// SynchList::SelfTest, SelfTestHelper +// Test whether the SynchList implementation is working, +// by having two threads ping-pong a value between them +// using two synchronized lists. +//---------------------------------------------------------------------- + +template +void +SynchList::SelfTestHelper (void* data) +{ + SynchList* _this = (SynchList*)data; + for (int i = 0; i < 10; i++) { + _this->Append(_this->selfTestPing->RemoveFront()); + } +} + +template +void +SynchList::SelfTest(T val) +{ + Thread *helper = new Thread("ping", 1); + + ASSERT(list->IsEmpty()); + selfTestPing = new SynchList; + helper->Fork(SynchList::SelfTestHelper, this); + for (int i = 0; i < 10; i++) { + selfTestPing->Append(val); + ASSERT(val == this->RemoveFront()); + } + delete selfTestPing; +} diff --git a/code/threads/synchlist.h b/code/threads/synchlist.h new file mode 100644 index 0000000..b6d32e8 --- /dev/null +++ b/code/threads/synchlist.h @@ -0,0 +1,51 @@ +// synchlist.h +// Data structures for synchronized access to a list. +// +// Identical interface to List, except accesses are synchronized. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef SYNCHLIST_H +#define SYNCHLIST_H + +#include "copyright.h" +#include "list.h" +#include "synch.h" + +// The following class defines a "synchronized list" -- a list for which +// these constraints hold: +// 1. Threads trying to remove an item from a list will +// wait until the list has an element on it. +// 2. One thread at a time can access list data structures + +template +class SynchList { + public: + SynchList(); // initialize a synchronized list + ~SynchList(); // de-allocate a synchronized list + + void Append(T item); // append item to the end of the list, + // and wake up any thread waiting in remove + + T RemoveFront(); // remove the first item from the front of + // the list, waiting if the list is empty + + void Apply(void (*f)(T)); // apply function to all elements in list + + void SelfTest(T value); // test the SynchList implementation + + private: + List *list; // the list of things + Lock *lock; // enforce mutual exclusive access to the list + Condition *listEmpty; // wait in Remove if the list is empty + + // these are only to assist SelfTest() + SynchList *selfTestPing; + static void SelfTestHelper(void* data); +}; + +#include "synchlist.cc" + +#endif // SYNCHLIST_H diff --git a/code/threads/thread.cc b/code/threads/thread.cc new file mode 100644 index 0000000..b1ca43c --- /dev/null +++ b/code/threads/thread.cc @@ -0,0 +1,435 @@ +// thread.cc +// Routines to manage threads. These are the main operations: +// +// Fork -- create a thread to run a procedure concurrently +// with the caller (this is done in two steps -- first +// allocate the Thread object, then call Fork on it) +// Begin -- called when the forked procedure starts up, to turn +// interrupts on and clean up after last thread +// Finish -- called when the forked procedure finishes, to clean up +// Yield -- relinquish control over the CPU to another ready thread +// Sleep -- relinquish control over the CPU, but thread is now blocked. +// In other words, it will not run again, until explicitly +// put back on the ready queue. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "thread.h" +#include "switch.h" +#include "synch.h" +#include "sysdep.h" + +// this is put at the top of the execution stack, for detecting stack overflows +const int STACK_FENCEPOST = 0xdedbeef; + +//---------------------------------------------------------------------- +// Thread::Thread +// Initialize a thread control block, so that we can then call +// Thread::Fork. +// +// "threadName" is an arbitrary string, useful for debugging. +//---------------------------------------------------------------------- + +Thread::Thread(char* threadName, int threadID) +{ + ID = threadID; + name = threadName; + stackTop = NULL; + stack = NULL; + status = JUST_CREATED; + for (int i = 0; i < MachineStateSize; i++) { + machineState[i] = NULL; // not strictly necessary, since + // new thread ignores contents + // of machine registers + } + space = NULL; +} + +//---------------------------------------------------------------------- +// Thread::~Thread +// De-allocate a thread. +// +// NOTE: the current thread *cannot* delete itself directly, +// since it is still running on the stack that we need to delete. +// +// NOTE: if this is the main thread, we can't delete the stack +// because we didn't allocate it -- we got it automatically +// as part of starting up Nachos. +//---------------------------------------------------------------------- + +Thread::~Thread() +{ + DEBUG(dbgThread, "Deleting thread: " << name); + ASSERT(this != kernel->currentThread); + if (stack != NULL) + DeallocBoundedArray((char *) stack, StackSize * sizeof(int)); +} + +//---------------------------------------------------------------------- +// Thread::Fork +// Invoke (*func)(arg), allowing caller and callee to execute +// concurrently. +// +// NOTE: although our definition allows only a single argument +// to be passed to the procedure, it is possible to pass multiple +// arguments by making them fields of a structure, and passing a pointer +// to the structure as "arg". +// +// Implemented as the following steps: +// 1. Allocate a stack +// 2. Initialize the stack so that a call to SWITCH will +// cause it to run the procedure +// 3. Put the thread on the ready queue +// +// "func" is the procedure to run concurrently. +// "arg" is a single argument to be passed to the procedure. +//---------------------------------------------------------------------- + +void +Thread::Fork(VoidFunctionPtr func, void *arg) +{ + Interrupt *interrupt = kernel->interrupt; + Scheduler *scheduler = kernel->scheduler; + IntStatus oldLevel; + + DEBUG(dbgThread, "Forking thread: " << name << " f(a): " << (int) func << " " << arg); + StackAllocate(func, arg); + + oldLevel = interrupt->SetLevel(IntOff); + scheduler->ReadyToRun(this); // ReadyToRun assumes that interrupts + // are disabled! + (void) interrupt->SetLevel(oldLevel); +} + +//---------------------------------------------------------------------- +// Thread::CheckOverflow +// Check a thread's stack to see if it has overrun the space +// that has been allocated for it. If we had a smarter compiler, +// we wouldn't need to worry about this, but we don't. +// +// NOTE: Nachos will not catch all stack overflow conditions. +// In other words, your program may still crash because of an overflow. +// +// If you get bizarre results (such as seg faults where there is no code) +// then you *may* need to increase the stack size. You can avoid stack +// overflows by not putting large data structures on the stack. +// Don't do this: void foo() { int bigArray[10000]; ... } +//---------------------------------------------------------------------- + +void +Thread::CheckOverflow() +{ + if (stack != NULL) { +#ifdef HPUX // Stacks grow upward on the Snakes + ASSERT(stack[StackSize - 1] == STACK_FENCEPOST); +#else + ASSERT(*stack == STACK_FENCEPOST); +#endif + } +} + +//---------------------------------------------------------------------- +// Thread::Begin +// Called by ThreadRoot when a thread is about to begin +// executing the forked procedure. +// +// It's main responsibilities are: +// 1. deallocate the previously running thread if it finished +// (see Thread::Finish()) +// 2. enable interrupts (so we can get time-sliced) +//---------------------------------------------------------------------- + +void +Thread::Begin () +{ + ASSERT(this == kernel->currentThread); + DEBUG(dbgThread, "Beginning thread: " << name); + + kernel->scheduler->CheckToBeDestroyed(); + kernel->interrupt->Enable(); +} + +//---------------------------------------------------------------------- +// Thread::Finish +// Called by ThreadRoot when a thread is done executing the +// forked procedure. +// +// NOTE: we can't immediately de-allocate the thread data structure +// or the execution stack, because we're still running in the thread +// and we're still on the stack! Instead, we tell the scheduler +// to call the destructor, once it is running in the context of a different thread. +// +// NOTE: we disable interrupts, because Sleep() assumes interrupts +// are disabled. +//---------------------------------------------------------------------- + +// +void +Thread::Finish () +{ + (void) kernel->interrupt->SetLevel(IntOff); + ASSERT(this == kernel->currentThread); + + DEBUG(dbgThread, "Finishing thread: " << name); + Sleep(TRUE); // invokes SWITCH + // not reached +} + + +//---------------------------------------------------------------------- +// Thread::Yield +// Relinquish the CPU if any other thread is ready to run. +// If so, put the thread on the end of the ready list, so that +// it will eventually be re-scheduled. +// +// NOTE: returns immediately if no other thread on the ready queue. +// Otherwise returns when the thread eventually works its way +// to the front of the ready list and gets re-scheduled. +// +// NOTE: we disable interrupts, so that looking at the thread +// on the front of the ready list, and switching to it, can be done +// atomically. On return, we re-set the interrupt level to its +// original state, in case we are called with interrupts disabled. +// +// Similar to Thread::Sleep(), but a little different. +//---------------------------------------------------------------------- + +void +Thread::Yield () +{ + Thread *nextThread; + IntStatus oldLevel = kernel->interrupt->SetLevel(IntOff); + + ASSERT(this == kernel->currentThread); + + DEBUG(dbgThread, "Yielding thread: " << name); + + nextThread = kernel->scheduler->FindNextToRun(); + if (nextThread != NULL) { + kernel->scheduler->ReadyToRun(this); + kernel->scheduler->Run(nextThread, FALSE); + } + (void) kernel->interrupt->SetLevel(oldLevel); +} + +//---------------------------------------------------------------------- +// Thread::Sleep +// Relinquish the CPU, because the current thread has either +// finished or is blocked waiting on a synchronization +// variable (Semaphore, Lock, or Condition). In the latter case, +// eventually some thread will wake this thread up, and put it +// back on the ready queue, so that it can be re-scheduled. +// +// NOTE: if there are no threads on the ready queue, that means +// we have no thread to run. "Interrupt::Idle" is called +// to signify that we should idle the CPU until the next I/O interrupt +// occurs (the only thing that could cause a thread to become +// ready to run). +// +// NOTE: we assume interrupts are already disabled, because it +// is called from the synchronization routines which must +// disable interrupts for atomicity. We need interrupts off +// so that there can't be a time slice between pulling the first thread +// off the ready list, and switching to it. +//---------------------------------------------------------------------- +void +Thread::Sleep (bool finishing) +{ + Thread *nextThread; + + ASSERT(this == kernel->currentThread); + ASSERT(kernel->interrupt->getLevel() == IntOff); + + DEBUG(dbgThread, "Sleeping thread: " << name); + + status = BLOCKED; + //cout << "debug Thread::Sleep " << name << "wait for Idle\n"; + while ((nextThread = kernel->scheduler->FindNextToRun()) == NULL) { + kernel->interrupt->Idle(); // no one to run, wait for an interrupt + } + // returns when it's time for us to run + kernel->scheduler->Run(nextThread, finishing); +} + +//---------------------------------------------------------------------- +// ThreadBegin, ThreadFinish, ThreadPrint +// Dummy functions because C++ does not (easily) allow pointers to member +// functions. So we create a dummy C function +// (which we can pass a pointer to), that then simply calls the +// member function. +//---------------------------------------------------------------------- + +static void ThreadFinish() { kernel->currentThread->Finish(); } +static void ThreadBegin() { kernel->currentThread->Begin(); } +void ThreadPrint(Thread *t) { t->Print(); } + +#ifdef PARISC + +//---------------------------------------------------------------------- +// PLabelToAddr +// On HPUX, function pointers don't always directly point to code, +// so we need to do the conversion. +//---------------------------------------------------------------------- + +static void * +PLabelToAddr(void *plabel) +{ + int funcPtr = (int) plabel; + + if (funcPtr & 0x02) { + // L-Field is set. This is a PLT pointer + funcPtr -= 2; // Get rid of the L bit + return (*(void **)funcPtr); + } else { + // L-field not set. + return plabel; + } +} +#endif + +//---------------------------------------------------------------------- +// Thread::StackAllocate +// Allocate and initialize an execution stack. The stack is +// initialized with an initial stack frame for ThreadRoot, which: +// enables interrupts +// calls (*func)(arg) +// calls Thread::Finish +// +// "func" is the procedure to be forked +// "arg" is the parameter to be passed to the procedure +//---------------------------------------------------------------------- + +void +Thread::StackAllocate (VoidFunctionPtr func, void *arg) +{ + stack = (int *) AllocBoundedArray(StackSize * sizeof(int)); + +#ifdef PARISC + // HP stack works from low addresses to high addresses + // everyone else works the other way: from high addresses to low addresses + stackTop = stack + 16; // HP requires 64-byte frame marker + stack[StackSize - 1] = STACK_FENCEPOST; +#endif + +#ifdef SPARC + stackTop = stack + StackSize - 96; // SPARC stack must contains at + // least 1 activation record + // to start with. + *stack = STACK_FENCEPOST; +#endif + +#ifdef PowerPC // RS6000 + stackTop = stack + StackSize - 16; // RS6000 requires 64-byte frame marker + *stack = STACK_FENCEPOST; +#endif + +#ifdef DECMIPS + stackTop = stack + StackSize - 4; // -4 to be on the safe side! + *stack = STACK_FENCEPOST; +#endif + +#ifdef ALPHA + stackTop = stack + StackSize - 8; // -8 to be on the safe side! + *stack = STACK_FENCEPOST; +#endif + + +#ifdef x86 + // the x86 passes the return address on the stack. In order for SWITCH() + // to go to ThreadRoot when we switch to this thread, the return addres + // used in SWITCH() must be the starting address of ThreadRoot. + stackTop = stack + StackSize - 4; // -4 to be on the safe side! + *(--stackTop) = (int) ThreadRoot; + *stack = STACK_FENCEPOST; +#endif + +#ifdef PARISC + machineState[PCState] = PLabelToAddr(ThreadRoot); + machineState[StartupPCState] = PLabelToAddr(ThreadBegin); + machineState[InitialPCState] = PLabelToAddr(func); + machineState[InitialArgState] = arg; + machineState[WhenDonePCState] = PLabelToAddr(ThreadFinish); +#else + machineState[PCState] = (void*)ThreadRoot; + machineState[StartupPCState] = (void*)ThreadBegin; + machineState[InitialPCState] = (void*)func; + machineState[InitialArgState] = (void*)arg; + machineState[WhenDonePCState] = (void*)ThreadFinish; +#endif +} + +#include "machine.h" + +//---------------------------------------------------------------------- +// Thread::SaveUserState +// Save the CPU state of a user program on a context switch. +// +// Note that a user program thread has *two* sets of CPU registers -- +// one for its state while executing user code, one for its state +// while executing kernel code. This routine saves the former. +//---------------------------------------------------------------------- + +void +Thread::SaveUserState() +{ + for (int i = 0; i < NumTotalRegs; i++) + userRegisters[i] = kernel->machine->ReadRegister(i); +} + +//---------------------------------------------------------------------- +// Thread::RestoreUserState +// Restore the CPU state of a user program on a context switch. +// +// Note that a user program thread has *two* sets of CPU registers -- +// one for its state while executing user code, one for its state +// while executing kernel code. This routine restores the former. +//---------------------------------------------------------------------- + +void +Thread::RestoreUserState() +{ + for (int i = 0; i < NumTotalRegs; i++) + kernel->machine->WriteRegister(i, userRegisters[i]); +} + + +//---------------------------------------------------------------------- +// SimpleThread +// Loop 5 times, yielding the CPU to another ready thread +// each iteration. +// +// "which" is simply a number identifying the thread, for debugging +// purposes. +//---------------------------------------------------------------------- + +static void +SimpleThread(int which) +{ + int num; + + for (num = 0; num < 5; num++) { + cout << "*** thread " << which << " looped " << num << " times\n"; + kernel->currentThread->Yield(); + } +} + +//---------------------------------------------------------------------- +// Thread::SelfTest +// Set up a ping-pong between two threads, by forking a thread +// to call SimpleThread, and then calling SimpleThread ourselves. +//---------------------------------------------------------------------- + +void +Thread::SelfTest() +{ + DEBUG(dbgThread, "Entering Thread::SelfTest"); + + Thread *t = new Thread("forked thread", 1); + + t->Fork((VoidFunctionPtr) SimpleThread, (void *) 1); + kernel->currentThread->Yield(); + SimpleThread(0); +} diff --git a/code/threads/thread.h b/code/threads/thread.h new file mode 100644 index 0000000..e311430 --- /dev/null +++ b/code/threads/thread.h @@ -0,0 +1,152 @@ +// thread.h +// Data structures for managing threads. A thread represents +// sequential execution of code within a program. +// So the state of a thread includes the program counter, +// the processor registers, and the execution stack. +// +// Note that because we allocate a fixed size stack for each +// thread, it is possible to overflow the stack -- for instance, +// by recursing to too deep a level. The most common reason +// for this occuring is allocating large data structures +// on the stack. For instance, this will cause problems: +// +// void foo() { int buf[1000]; ...} +// +// Instead, you should allocate all data structures dynamically: +// +// void foo() { int *buf = new int[1000]; ...} +// +// +// Bad things happen if you overflow the stack, and in the worst +// case, the problem may not be caught explicitly. Instead, +// the only symptom may be bizarre segmentation faults. (Of course, +// other problems can cause seg faults, so that isn't a sure sign +// that your thread stacks are too small.) +// +// One thing to try if you find yourself with seg faults is to +// increase the size of thread stack -- ThreadStackSize. +// +// In this interface, forking a thread takes two steps. +// We must first allocate a data structure for it: "t = new Thread". +// Only then can we do the fork: "t->fork(f, arg)". +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef THREAD_H +#define THREAD_H + +#include "copyright.h" +#include "utility.h" +#include "sysdep.h" +#include "machine.h" +#include "addrspace.h" + +// CPU register state to be saved on context switch. +// The x86 needs to save only a few registers, +// SPARC and MIPS needs to save 10 registers, +// the Snake needs 18, +// and the RS6000 needs to save 75 (!) +// For simplicity, I just take the maximum over all architectures. + +#define MachineStateSize 75 + + +// Size of the thread's private execution stack. +// WATCH OUT IF THIS ISN'T BIG ENOUGH!!!!! +const int StackSize = (8 * 1024); // in words + + +// Thread state +enum ThreadStatus { JUST_CREATED, RUNNING, READY, BLOCKED, ZOMBIE }; + + +// The following class defines a "thread control block" -- which +// represents a single thread of execution. +// +// Every thread has: +// an execution stack for activation records ("stackTop" and "stack") +// space to save CPU registers while not running ("machineState") +// a "status" (running/ready/blocked) +// +// Some threads also belong to a user address space; threads +// that only run in the kernel have a NULL address space. + +class Thread { + private: + // NOTE: DO NOT CHANGE the order of these first two members. + // THEY MUST be in this position for SWITCH to work. + int *stackTop; // the current stack pointer + void *machineState[MachineStateSize]; // all registers except for stackTop + + public: + Thread(char* debugName, int threadID); // initialize a Thread + ~Thread(); // deallocate a Thread + // NOTE -- thread being deleted + // must not be running when delete + // is called + + // basic thread operations + + void Fork(VoidFunctionPtr func, void *arg); + // Make thread run (*func)(arg) + void Yield(); // Relinquish the CPU if any + // other thread is runnable + void Sleep(bool finishing); // Put the thread to sleep and + // relinquish the processor + void Begin(); // Startup code for the thread + void Finish(); // The thread is done executing + + void CheckOverflow(); // Check if thread stack has overflowed + void setStatus(ThreadStatus st) { status = st; } + ThreadStatus getStatus() { return (status); } + char* getName() { return (name); } + + int getID() { return (ID); } + void Print() { cout << name; } + void SelfTest(); // test whether thread impl is working + + private: + // some of the private data for this class is listed above + + int *stack; // Bottom of the stack + // NULL if this is the main thread + // (If NULL, don't deallocate stack) + ThreadStatus status; // ready, running or blocked + char* name; + int ID; + void StackAllocate(VoidFunctionPtr func, void *arg); + // Allocate a stack for thread. + // Used internally by Fork() + +// A thread running a user program actually has *two* sets of CPU registers -- +// one for its state while executing user code, one for its state +// while executing kernel code. + + int userRegisters[NumTotalRegs]; // user-level CPU register state + + public: + void SaveUserState(); // save user-level register state + void RestoreUserState(); // restore user-level register state + + AddrSpace *space; // User code this thread is running. +}; + +// external function, dummy routine whose sole job is to call Thread::Print +extern void ThreadPrint(Thread *thread); + +// Magical machine-dependent routines, defined in switch.s + +extern "C" { +// First frame on thread execution stack; +// call ThreadBegin +// call "func" +// (when func returns, if ever) call ThreadFinish() +void ThreadRoot(); + +// Stop running oldThread and start running newThread +void SWITCH(Thread *oldThread, Thread *newThread); +} + +#endif // THREAD_H diff --git a/code/userprog/addrspace.cc b/code/userprog/addrspace.cc new file mode 100644 index 0000000..cd99551 --- /dev/null +++ b/code/userprog/addrspace.cc @@ -0,0 +1,316 @@ +// addrspace.cc +// Routines to manage address spaces (executing user programs). +// +// In order to run a user program, you must: +// +// 1. link with the -n -T 0 option +// 2. run coff2noff to convert the object file to Nachos format +// (Nachos object code format is essentially just a simpler +// version of the UNIX executable object code format) +// 3. load the NOFF file into the Nachos file system +// (if you are using the "stub" file system, you +// don't need to do this last step) +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "main.h" +#include "addrspace.h" +#include "machine.h" +#include "noff.h" + +//---------------------------------------------------------------------- +// SwapHeader +// Do little endian to big endian conversion on the bytes in the +// object file header, in case the file was generated on a little +// endian machine, and we're now running on a big endian machine. +//---------------------------------------------------------------------- + +static void +SwapHeader (NoffHeader *noffH) +{ + noffH->noffMagic = WordToHost(noffH->noffMagic); + noffH->code.size = WordToHost(noffH->code.size); + noffH->code.virtualAddr = WordToHost(noffH->code.virtualAddr); + noffH->code.inFileAddr = WordToHost(noffH->code.inFileAddr); +#ifdef RDATA + noffH->readonlyData.size = WordToHost(noffH->readonlyData.size); + noffH->readonlyData.virtualAddr = + WordToHost(noffH->readonlyData.virtualAddr); + noffH->readonlyData.inFileAddr = + WordToHost(noffH->readonlyData.inFileAddr); +#endif + noffH->initData.size = WordToHost(noffH->initData.size); + noffH->initData.virtualAddr = WordToHost(noffH->initData.virtualAddr); + noffH->initData.inFileAddr = WordToHost(noffH->initData.inFileAddr); + noffH->uninitData.size = WordToHost(noffH->uninitData.size); + noffH->uninitData.virtualAddr = WordToHost(noffH->uninitData.virtualAddr); + noffH->uninitData.inFileAddr = WordToHost(noffH->uninitData.inFileAddr); + +#ifdef RDATA + DEBUG(dbgAddr, "code = " << noffH->code.size << + " readonly = " << noffH->readonlyData.size << + " init = " << noffH->initData.size << + " uninit = " << noffH->uninitData.size << "\n"); +#endif +} + +//---------------------------------------------------------------------- +// AddrSpace::AddrSpace +// Create an address space to run a user program. +// Set up the translation from program memory to physical +// memory. For now, this is really simple (1:1), since we are +// only uniprogramming, and we have a single unsegmented page table +//---------------------------------------------------------------------- + +AddrSpace::AddrSpace() +{ + pageTable = new TranslationEntry[NumPhysPages]; + for (int i = 0; i < NumPhysPages; i++) { + pageTable[i].virtualPage = i; // for now, virt page # = phys page # + pageTable[i].physicalPage = i; + pageTable[i].valid = TRUE; + pageTable[i].use = FALSE; + pageTable[i].dirty = FALSE; + pageTable[i].readOnly = FALSE; + } + + // zero out the entire address space + bzero(kernel->machine->mainMemory, MemorySize); +} + +//---------------------------------------------------------------------- +// AddrSpace::~AddrSpace +// Dealloate an address space. +//---------------------------------------------------------------------- + +AddrSpace::~AddrSpace() +{ + delete pageTable; +} + + +//---------------------------------------------------------------------- +// AddrSpace::Load +// Load a user program into memory from a file. +// +// Assumes that the page table has been initialized, and that +// the object code file is in NOFF format. +// +// "fileName" is the file containing the object code to load into memory +//---------------------------------------------------------------------- + +bool +AddrSpace::Load(char *fileName) +{ + OpenFile *executable = kernel->fileSystem->Open(fileName); + NoffHeader noffH; + unsigned int size; + + if (executable == NULL) { + cerr << "Unable to open file " << fileName << "\n"; + return FALSE; + } + + executable->ReadAt((char *)&noffH, sizeof(noffH), 0); + if ((noffH.noffMagic != NOFFMAGIC) && + (WordToHost(noffH.noffMagic) == NOFFMAGIC)) + SwapHeader(&noffH); + ASSERT(noffH.noffMagic == NOFFMAGIC); + +#ifdef RDATA +// how big is address space? + size = noffH.code.size + noffH.readonlyData.size + noffH.initData.size + + noffH.uninitData.size + UserStackSize; + // we need to increase the size + // to leave room for the stack +#else +// how big is address space? + size = noffH.code.size + noffH.initData.size + noffH.uninitData.size + + UserStackSize; // we need to increase the size + // to leave room for the stack +#endif + numPages = divRoundUp(size, PageSize); + size = numPages * PageSize; + + ASSERT(numPages <= NumPhysPages); // check we're not trying + // to run anything too big -- + // at least until we have + // virtual memory + + DEBUG(dbgAddr, "Initializing address space: " << numPages << ", " << size); + +// then, copy in the code and data segments into memory +// Note: this code assumes that virtual address = physical address + if (noffH.code.size > 0) { + DEBUG(dbgAddr, "Initializing code segment."); + DEBUG(dbgAddr, noffH.code.virtualAddr << ", " << noffH.code.size); + executable->ReadAt( + &(kernel->machine->mainMemory[noffH.code.virtualAddr]), + noffH.code.size, noffH.code.inFileAddr); + } + if (noffH.initData.size > 0) { + DEBUG(dbgAddr, "Initializing data segment."); + DEBUG(dbgAddr, noffH.initData.virtualAddr << ", " << noffH.initData.size); + executable->ReadAt( + &(kernel->machine->mainMemory[noffH.initData.virtualAddr]), + noffH.initData.size, noffH.initData.inFileAddr); + } + +#ifdef RDATA + if (noffH.readonlyData.size > 0) { + DEBUG(dbgAddr, "Initializing read only data segment."); + DEBUG(dbgAddr, noffH.readonlyData.virtualAddr << ", " << noffH.readonlyData.size); + executable->ReadAt( + &(kernel->machine->mainMemory[noffH.readonlyData.virtualAddr]), + noffH.readonlyData.size, noffH.readonlyData.inFileAddr); + } +#endif + + delete executable; // close file + return TRUE; // success +} + +//---------------------------------------------------------------------- +// AddrSpace::Execute +// Run a user program using the current thread +// +// The program is assumed to have already been loaded into +// the address space +// +//---------------------------------------------------------------------- + +void +AddrSpace::Execute(char* fileName) +{ + + kernel->currentThread->space = this; + + this->InitRegisters(); // set the initial register values + this->RestoreState(); // load page table register + + kernel->machine->Run(); // jump to the user progam + + ASSERTNOTREACHED(); // machine->Run never returns; + // the address space exits + // by doing the syscall "exit" +} + + +//---------------------------------------------------------------------- +// AddrSpace::InitRegisters +// Set the initial values for the user-level register set. +// +// We write these directly into the "machine" registers, so +// that we can immediately jump to user code. Note that these +// will be saved/restored into the currentThread->userRegisters +// when this thread is context switched out. +//---------------------------------------------------------------------- + +void +AddrSpace::InitRegisters() +{ + Machine *machine = kernel->machine; + int i; + + for (i = 0; i < NumTotalRegs; i++) + machine->WriteRegister(i, 0); + + // Initial program counter -- must be location of "Start", which + // is assumed to be virtual address zero + machine->WriteRegister(PCReg, 0); + + // Need to also tell MIPS where next instruction is, because + // of branch delay possibility + // Since instructions occupy four bytes each, the next instruction + // after start will be at virtual address four. + machine->WriteRegister(NextPCReg, 4); + + // Set the stack register to the end of the address space, where we + // allocated the stack; but subtract off a bit, to make sure we don't + // accidentally reference off the end! + machine->WriteRegister(StackReg, numPages * PageSize - 16); + DEBUG(dbgAddr, "Initializing stack pointer: " << numPages * PageSize - 16); +} + +//---------------------------------------------------------------------- +// AddrSpace::SaveState +// On a context switch, save any machine state, specific +// to this address space, that needs saving. +// +// For now, don't need to save anything! +//---------------------------------------------------------------------- + +void AddrSpace::SaveState() +{} + +//---------------------------------------------------------------------- +// AddrSpace::RestoreState +// On a context switch, restore the machine state so that +// this address space can run. +// +// For now, tell the machine where to find the page table. +//---------------------------------------------------------------------- + +void AddrSpace::RestoreState() +{ + kernel->machine->pageTable = pageTable; + kernel->machine->pageTableSize = numPages; +} + + +//---------------------------------------------------------------------- +// AddrSpace::Translate +// Translate the virtual address in _vaddr_ to a physical address +// and store the physical address in _paddr_. +// The flag _isReadWrite_ is false (0) for read-only access; true (1) +// for read-write access. +// Return any exceptions caused by the address translation. +//---------------------------------------------------------------------- +ExceptionType +AddrSpace::Translate(unsigned int vaddr, unsigned int *paddr, int isReadWrite) +{ + TranslationEntry *pte; + int pfn; + unsigned int vpn = vaddr / PageSize; + unsigned int offset = vaddr % PageSize; + + if(vpn >= numPages) { + return AddressErrorException; + } + + pte = &pageTable[vpn]; + + if(isReadWrite && pte->readOnly) { + return ReadOnlyException; + } + + pfn = pte->physicalPage; + + // if the pageFrame is too big, there is something really wrong! + // An invalid translation was loaded into the page table or TLB. + if (pfn >= NumPhysPages) { + DEBUG(dbgAddr, "Illegal physical page " << pfn); + return BusErrorException; + } + + pte->use = TRUE; // set the use, dirty bits + + if(isReadWrite) + pte->dirty = TRUE; + + *paddr = pfn*PageSize + offset; + + ASSERT((*paddr < MemorySize)); + + //cerr << " -- AddrSpace::Translate(): vaddr: " << vaddr << + // ", paddr: " << *paddr << "\n"; + + return NoException; +} + + + + diff --git a/code/userprog/addrspace.h b/code/userprog/addrspace.h new file mode 100644 index 0000000..7c59306 --- /dev/null +++ b/code/userprog/addrspace.h @@ -0,0 +1,53 @@ +// addrspace.h +// Data structures to keep track of executing user programs +// (address spaces). +// +// For now, we don't keep any information about address spaces. +// The user level CPU state is saved and restored in the thread +// executing the user program (see thread.h). +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef ADDRSPACE_H +#define ADDRSPACE_H + +#include "copyright.h" +#include "filesys.h" + +#define UserStackSize 1024 // increase this as necessary! + +class AddrSpace { + public: + AddrSpace(); // Create an address space. + ~AddrSpace(); // De-allocate an address space + + bool Load(char *fileName); // Load a program into addr space from + // a file + // return false if not found + + void Execute(char *fileName); // Run a program + // assumes the program has already + // been loaded + + void SaveState(); // Save/restore address space-specific + void RestoreState(); // info on a context switch + + // Translate virtual address _vaddr_ + // to physical address _paddr_. _mode_ + // is 0 for Read, 1 for Write. + ExceptionType Translate(unsigned int vaddr, unsigned int *paddr, int mode); + + private: + TranslationEntry *pageTable; // Assume linear page table translation + // for now! + unsigned int numPages; // Number of pages in the virtual + // address space + + void InitRegisters(); // Initialize user-level CPU registers, + // before jumping to user code + +}; + +#endif // ADDRSPACE_H diff --git a/code/userprog/errno.h b/code/userprog/errno.h new file mode 100644 index 0000000..acaa8c3 --- /dev/null +++ b/code/userprog/errno.h @@ -0,0 +1,84 @@ +/* errno.h + * Error codes for system calls. + * + * Do not modify the contents of this file. + * + * Try to use the most descriptive error number for the error. + * You may find it helpful to see what errors equivalent UNIX + * system calls return under various error conditions. + * For example the man page for the write system call "man 2 write" + * provides a list of different error number values for different + * conditions. + * NOTE: there are way more errors here than you should be supporting + * and many more error conditions listed in man pages than + * Nachos can possibly generate. The list here is to give you + * some ideas and to hopefully standardize on some error numbers. + * + * ALSO NOTE: These definitions may not correspond to Solaris definitions + * (for copyright reasons these are taken from Linux). + */ + +#ifndef ERRNO_H +#define ERRNO_H + +#include "copyright.h" + +#define EPERM -1 /* Operation not permitted */ +#define ENOENT -2 /* No such file or directory */ +#define ESRCH -3 /* No such process */ +#define EINTR -4 /* Interrupted system call */ +#define EIO -5 /* I/O error */ +#define ENXIO -6 /* No such device or address */ +#define E2BIG -7 /* Arg list too long */ +#define ENOEXEC -8 /* Exec format error */ +#define EBADF -9 /* Bad file number */ +#define ECHILD -10 /* No child processes */ +#define EAGAIN -11 /* Try again */ +#define ENOMEM -12 /* Out of memory */ +#define EACCES -13 /* Permission denied */ +#define EFAULT -14 /* Bad address */ +#define ENOTBLK -15 /* Block device required */ +#define EBUSY -16 /* Device or resource busy */ +#define EEXIST -17 /* File exists */ +#define EXDEV -18 /* Cross-device link */ +#define ENODEV -19 /* No such device */ +#define ENOTDIR -20 /* Not a directory */ +#define EISDIR -21 /* Is a directory */ +#define EINVAL -22 /* Invalid argument */ +#define ENFILE -23 /* File table overflow */ +#define EMFILE -24 /* Too many open files */ +#define ENOTTY -25 /* Not a typewriter */ +#define ETXTBSY -26 /* Text file busy */ +#define EFBIG -27 /* File too large */ +#define ENOSPC -28 /* No space left on device */ +#define ESPIPE -29 /* Illegal seek */ +#define EROFS -30 /* Read-only file system */ +#define EMLINK -31 /* Too many links */ +#define EPIPE -32 /* Broken pipe */ +#define EDOM -33 /* Math argument out of domain of func */ +#define ERANGE -34 /* Math result not representable */ +#define EDEADLK -35 /* Resource deadlock would occur */ +#define ENAMETOOLONG -36 /* File name too long */ +#define ENOLCK -37 /* No record locks available */ +#define ENOSYS -38 /* Function not implemented */ +#define ENOTEMPTY -39 /* Directory not empty */ +#define ELOOP -40 /* Too many symbolic links encountered */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define ENOMSG -42 /* No message of desired type */ +#define EIDRM -43 /* Identifier removed */ +#define ECHRNG -44 /* Channel number out of range */ +#define EL2NSYNC -45 /* Level 2 not synchronized */ +#define EL3HLT -46 /* Level 3 halted */ +#define EL3RST -47 /* Level 3 reset */ +#define ELNRNG -48 /* Link number out of range */ +#define EUNATCH -49 /* Protocol driver not attached */ +#define ENOCSI -50 /* No CSI structure available */ +#define EL2HLT -51 /* Level 2 halted */ +#define EBADE -52 /* Invalid exchange */ +#define EBADR -53 /* Invalid request descriptor */ +#define EXFULL -54 /* Exchange full */ +#define ENOANO -55 /* No anode */ +#define EBADRQC -56 /* Invalid request code */ +#define EBADSLT -57 /* Invalid slot */ + +#endif // ERRNO_H diff --git a/code/userprog/exception.cc b/code/userprog/exception.cc new file mode 100644 index 0000000..cdcd82f --- /dev/null +++ b/code/userprog/exception.cc @@ -0,0 +1,132 @@ +// exception.cc +// Entry point into the Nachos kernel from user programs. +// There are two kinds of things that can cause control to +// transfer back to here from user code: +// +// syscall -- The user code explicitly requests to call a procedure +// in the Nachos kernel. Right now, the only function we support is +// "Halt". +// +// exceptions -- The user code does something that the CPU can't handle. +// For instance, accessing memory that doesn't exist, arithmetic errors, +// etc. +// +// Interrupts (which can also cause control to transfer from user +// code into the Nachos kernel) are handled elsewhere. +// +// For now, this only handles the Halt() system call. +// Everything else core dumps. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "main.h" +#include "syscall.h" +#include "ksyscall.h" +//---------------------------------------------------------------------- +// ExceptionHandler +// Entry point into the Nachos kernel. Called when a user program +// is executing, and either does a syscall, or generates an addressing +// or arithmetic exception. +// +// For system calls, the following is the calling convention: +// +// system call code -- r2 +// arg1 -- r4 +// arg2 -- r5 +// arg3 -- r6 +// arg4 -- r7 +// +// The result of the system call, if any, must be put back into r2. +// +// If you are handling a system call, don't forget to increment the pc +// before returning. (Or else you'll loop making the same system call forever!) +// +// "which" is the kind of exception. The list of possible exceptions +// is in machine.h. +//---------------------------------------------------------------------- + +void +ExceptionHandler(ExceptionType which) +{ + int type = kernel->machine->ReadRegister(2); + int val; + int status, exit, threadID, programID; + DEBUG(dbgSys, "Received Exception " << which << " type: " << type << "\n"); + switch (which) { + case SyscallException: + switch(type) { + case SC_Halt: + DEBUG(dbgSys, "Shutdown, initiated by user program.\n"); + SysHalt(); + cout<<"in exception\n"; + ASSERTNOTREACHED(); + break; + case SC_MSG: + DEBUG(dbgSys, "Message received.\n"); + val = kernel->machine->ReadRegister(4); + { + char *msg = &(kernel->machine->mainMemory[val]); + cout << msg << endl; + } + SysHalt(); + ASSERTNOTREACHED(); + break; + case SC_Create: + val = kernel->machine->ReadRegister(4); + { + char *filename = &(kernel->machine->mainMemory[val]); + //cout << filename << endl; + status = SysCreate(filename); + kernel->machine->WriteRegister(2, (int) status); + } + kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg)); + kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4); + kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); + return; + ASSERTNOTREACHED(); + break; + case SC_Add: + DEBUG(dbgSys, "Add " << kernel->machine->ReadRegister(4) << " + " << kernel->machine->ReadRegister(5) << "\n"); + /* Process SysAdd Systemcall*/ + int result; + result = SysAdd(/* int op1 */(int)kernel->machine->ReadRegister(4), + /* int op2 */(int)kernel->machine->ReadRegister(5)); + DEBUG(dbgSys, "Add returning with " << result << "\n"); + /* Prepare Result */ + kernel->machine->WriteRegister(2, (int)result); + /* Modify return point */ + { + /* set previous programm counter (debugging only)*/ + kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg)); + + /* set programm counter to next instruction (all Instructions are 4 byte wide)*/ + kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4); + + /* set next programm counter for brach execution */ + kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); + } + cout << "result is " << result << "\n"; + return; + ASSERTNOTREACHED(); + break; + case SC_Exit: + DEBUG(dbgAddr, "Program exit\n"); + val=kernel->machine->ReadRegister(4); + cout << "return value:" << val << endl; + kernel->currentThread->Finish(); + break; + default: + cerr << "Unexpected system call " << type << "\n"; + break; + } + break; + default: + cerr << "Unexpected user mode exception " << (int)which << "\n"; + break; + } + ASSERTNOTREACHED(); +} + diff --git a/code/userprog/ksyscall.h b/code/userprog/ksyscall.h new file mode 100644 index 0000000..c27fd41 --- /dev/null +++ b/code/userprog/ksyscall.h @@ -0,0 +1,38 @@ +/************************************************************** + * + * userprog/ksyscall.h + * + * Kernel interface for systemcalls + * + * by Marcus Voelp (c) Universitaet Karlsruhe + * + **************************************************************/ + +#ifndef __USERPROG_KSYSCALL_H__ +#define __USERPROG_KSYSCALL_H__ + +#include "kernel.h" + +#include "synchconsole.h" + + +void SysHalt() +{ + kernel->interrupt->Halt(); +} + +int SysAdd(int op1, int op2) +{ + return op1 + op2; +} + +int SysCreate(char *filename) +{ + // return value + // 1: success + // 0: failed + return kernel->interrupt->CreateFile(filename); +} + + +#endif /* ! __USERPROG_KSYSCALL_H__ */ diff --git a/code/userprog/noff.h b/code/userprog/noff.h new file mode 100644 index 0000000..a8b5551 --- /dev/null +++ b/code/userprog/noff.h @@ -0,0 +1,28 @@ +/* noff.h + * Data structures defining the Nachos Object Code Format + * + * Basically, we only know about three types of segments: + * code (read-only), initialized data, and unitialized data + */ + +#define NOFFMAGIC 0xbadfad /* magic number denoting Nachos + * object code file + */ + +typedef struct segment { + int virtualAddr; /* location of segment in virt addr space */ + int inFileAddr; /* location of segment in this file */ + int size; /* size of segment */ +} Segment; + +typedef struct noffHeader { + int noffMagic; /* should be NOFFMAGIC */ + Segment code; /* executable code segment */ + Segment initData; /* initialized data segment */ +#ifdef RDATA + Segment readonlyData; /* read only data */ +#endif + Segment uninitData; /* uninitialized data segment -- + * should be zero'ed before use + */ +} NoffHeader; diff --git a/code/userprog/synchconsole.cc b/code/userprog/synchconsole.cc new file mode 100644 index 0000000..346ffe6 --- /dev/null +++ b/code/userprog/synchconsole.cc @@ -0,0 +1,119 @@ +// synchconsole.cc +// Routines providing synchronized access to the keyboard +// and console display hardware devices. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#include "copyright.h" +#include "synchconsole.h" + +//---------------------------------------------------------------------- +// SynchConsoleInput::SynchConsoleInput +// Initialize synchronized access to the keyboard +// +// "inputFile" -- if NULL, use stdin as console device +// otherwise, read from this file +//---------------------------------------------------------------------- + +SynchConsoleInput::SynchConsoleInput(char *inputFile) +{ + consoleInput = new ConsoleInput(inputFile, this); + lock = new Lock("console in"); + waitFor = new Semaphore("console in", 0); +} + +//---------------------------------------------------------------------- +// SynchConsoleInput::~SynchConsoleInput +// Deallocate data structures for synchronized access to the keyboard +//---------------------------------------------------------------------- + +SynchConsoleInput::~SynchConsoleInput() +{ + delete consoleInput; + delete lock; + delete waitFor; +} + +//---------------------------------------------------------------------- +// SynchConsoleInput::GetChar +// Read a character typed at the keyboard, waiting if necessary. +//---------------------------------------------------------------------- + +char +SynchConsoleInput::GetChar() +{ + char ch; + + lock->Acquire(); + waitFor->P(); // wait for EOF or a char to be available. + ch = consoleInput->GetChar(); + lock->Release(); + return ch; +} + +//---------------------------------------------------------------------- +// SynchConsoleInput::CallBack +// Interrupt handler called when keystroke is hit; wake up +// anyone waiting. +//---------------------------------------------------------------------- + +void +SynchConsoleInput::CallBack() +{ + waitFor->V(); +} + +//---------------------------------------------------------------------- +// SynchConsoleOutput::SynchConsoleOutput +// Initialize synchronized access to the console display +// +// "outputFile" -- if NULL, use stdout as console device +// otherwise, read from this file +//---------------------------------------------------------------------- + +SynchConsoleOutput::SynchConsoleOutput(char *outputFile) +{ + consoleOutput = new ConsoleOutput(outputFile, this); + lock = new Lock("console out"); + waitFor = new Semaphore("console out", 0); +} + +//---------------------------------------------------------------------- +// SynchConsoleOutput::~SynchConsoleOutput +// Deallocate data structures for synchronized access to the keyboard +//---------------------------------------------------------------------- + +SynchConsoleOutput::~SynchConsoleOutput() +{ + delete consoleOutput; + delete lock; + delete waitFor; +} + +//---------------------------------------------------------------------- +// SynchConsoleOutput::PutChar +// Write a character to the console display, waiting if necessary. +//---------------------------------------------------------------------- + +void +SynchConsoleOutput::PutChar(char ch) +{ + lock->Acquire(); + consoleOutput->PutChar(ch); + waitFor->P(); + lock->Release(); +} + +//---------------------------------------------------------------------- +// SynchConsoleOutput::CallBack +// Interrupt handler called when it's safe to send the next +// character can be sent to the display. +//---------------------------------------------------------------------- + +void +SynchConsoleOutput::CallBack() +{ + waitFor->V(); +} diff --git a/code/userprog/synchconsole.h b/code/userprog/synchconsole.h new file mode 100644 index 0000000..b0f7a97 --- /dev/null +++ b/code/userprog/synchconsole.h @@ -0,0 +1,53 @@ +// synchconsole.h +// Data structures for synchronized access to the keyboard +// and console display devices. +// +// NOTE: this abstraction is not completely implemented. +// +// Copyright (c) 1992-1996 The Regents of the University of California. +// All rights reserved. See copyright.h for copyright notice and limitation +// of liability and disclaimer of warranty provisions. + +#ifndef SYNCHCONSOLE_H +#define SYNCHCONSOLE_H + +#include "copyright.h" +#include "utility.h" +#include "callback.h" +#include "console.h" +#include "synch.h" + +// The following two classes define synchronized input and output to +// a console device + +class SynchConsoleInput : public CallBackObj { + public: + SynchConsoleInput(char *inputFile); // Initialize the console device + ~SynchConsoleInput(); // Deallocate console device + + char GetChar(); // Read a character, waiting if necessary + + private: + ConsoleInput *consoleInput; // the hardware keyboard + Lock *lock; // only one reader at a time + Semaphore *waitFor; // wait for callBack + + void CallBack(); // called when a keystroke is available +}; + +class SynchConsoleOutput : public CallBackObj { + public: + SynchConsoleOutput(char *outputFile); // Initialize the console device + ~SynchConsoleOutput(); + + void PutChar(char ch); // Write a character, waiting if necessary + + private: + ConsoleOutput *consoleOutput;// the hardware display + Lock *lock; // only one writer at a time + Semaphore *waitFor; // wait for callBack + + void CallBack(); // called when more data can be written +}; + +#endif // SYNCHCONSOLE_H diff --git a/code/userprog/syscall.h b/code/userprog/syscall.h new file mode 100644 index 0000000..9fad2e3 --- /dev/null +++ b/code/userprog/syscall.h @@ -0,0 +1,183 @@ +/* syscalls.h + * Nachos system call interface. These are Nachos kernel operations + * that can be invoked from user programs, by trapping to the kernel + * via the "syscall" instruction. + * + * This file is included by user programs and by the Nachos kernel. + * + * Copyright (c) 1992-1993 The Regents of the University of California. + * All rights reserved. See copyright.h for copyright notice and limitation + * of liability and disclaimer of warranty provisions. + */ + +#ifndef SYSCALLS_H +#define SYSCALLS_H + +#include "copyright.h" +#include "errno.h" +/* system call codes -- used by the stubs to tell the kernel which system call + * is being asked for + */ +#define SC_Halt 0 +#define SC_Exit 1 +#define SC_Exec 2 +#define SC_Join 3 +#define SC_Create 4 +#define SC_Remove 5 +#define SC_Open 6 +#define SC_Read 7 +#define SC_Write 8 +#define SC_Seek 9 +#define SC_Close 10 +#define SC_ThreadFork 11 +#define SC_ThreadYield 12 +#define SC_ExecV 13 +#define SC_ThreadExit 14 +#define SC_ThreadJoin 15 +#define SC_Add 42 +#define SC_MSG 100 + +#ifndef IN_ASM + +/* The system call interface. These are the operations the Nachos + * kernel needs to support, to be able to run user programs. + * + * Each of these is invoked by a user program by simply calling the + * procedure; an assembly language stub stuffs the system call code + * into a register, and traps to the kernel. The kernel procedures + * are then invoked in the Nachos kernel, after appropriate error checking, + * from the system call entry point in exception.cc. + */ + +/* Stop Nachos, and print out performance stats */ +void Halt(); + +/* + * Add the two operants and return the result + */ + +int Add(int op1, int op2); +/* + * Just for simply showing message, not a safe way for console IO + */ +void MSG(char *msg); + +/* Address space control operations: Exit, Exec, Execv, and Join */ + +/* This user program is done (status = 0 means exited normally). */ +void Exit(int status); + +/* A unique identifier for an executing user program (address space) */ +typedef int SpaceId; + +/* A unique identifier for a thread within a task */ +typedef int ThreadId; + +/* Run the specified executable, with no args */ +/* This can be implemented as a call to ExecV. + */ +SpaceId Exec(char* exec_name); + +/* Run the executable, stored in the Nachos file "argv[0]", with + * parameters stored in argv[1..argc-1] and return the + * address space identifier + */ +SpaceId ExecV(int argc, char* argv[]); + +/* Only return once the user program "id" has finished. + * Return the exit status. + */ +int Join(SpaceId id); + + +/* File system operations: Create, Remove, Open, Read, Write, Close + * These functions are patterned after UNIX -- files represent + * both files *and* hardware I/O devices. + * + * Note that the Nachos file system has a stub implementation, which + * can be used to support these system calls if the regular Nachos + * file system has not been implemented. + */ + +/* A unique identifier for an open Nachos file. */ +typedef int OpenFileId; + +/* when an address space starts up, it has two open files, representing + * keyboard input and display output (in UNIX terms, stdin and stdout). + * Read and Write can be used directly on these, without first opening + * the console device. + */ + +#define SysConsoleInput 0 +#define SysConsoleOutput 1 + +/* Create a Nachos file, with name "name" */ +/* Note: Create does not open the file. */ +/* Return 1 on success, negative error code on failure */ +int Create(char *name); + +/* Remove a Nachos file, with name "name" */ +int Remove(char *name); + +/* Open the Nachos file "name", and return an "OpenFileId" that can + * be used to read and write to the file. + */ +OpenFileId Open(char *name); + +/* Write "size" bytes from "buffer" to the open file. + * Return the number of bytes actually read on success. + * On failure, a negative error code is returned. + */ +int Write(char *buffer, int size, OpenFileId id); + +/* Read "size" bytes from the open file into "buffer". + * Return the number of bytes actually read -- if the open file isn't + * long enough, or if it is an I/O device, and there aren't enough + * characters to read, return whatever is available (for I/O devices, + * you should always wait until you can return at least one character). + */ +int Read(char *buffer, int size, OpenFileId id); + +/* Set the seek position of the open file "id" + * to the byte "position". + */ +int Seek(int position, OpenFileId id); + +/* Close the file, we're done reading and writing to it. + * Return 1 on success, negative error code on failure + */ +int Close(OpenFileId id); + + +/* User-level thread operations: Fork and Yield. To allow multiple + * threads to run within a user program. + * + * Could define other operations, such as LockAcquire, LockRelease, etc. + */ + +/* Fork a thread to run a procedure ("func") in the *same* address space + * as the current thread. + * Return a positive ThreadId on success, negative error code on failure + */ +ThreadId ThreadFork(void (*func)()); + +/* Yield the CPU to another runnable thread, whether in this address space + * or not. + */ +void ThreadYield(); + +/* + * Blocks current thread until lokal thread ThreadID exits with ThreadExit. + * Function returns the ExitCode of ThreadExit() of the exiting thread. + */ +int ThreadJoin(ThreadId id); + +/* + * Deletes current thread and returns ExitCode to every waiting lokal thread. + */ +void ThreadExit(int ExitCode); + +#endif /* IN_ASM */ + +#endif /* SYSCALL_H */ + diff --git a/coff2noff/Makefile b/coff2noff/Makefile new file mode 100644 index 0000000..5ab69d4 --- /dev/null +++ b/coff2noff/Makefile @@ -0,0 +1,63 @@ +# Makefile for: +# coff2noff -- converts a normal MIPS executable into a Nachos executable +# +# This is a GNU Makefile. It must be used with the GNU make program. +# At UW, the GNU make program is /software/gnu/bin/make. +# In many other places it is known as "gmake". +# You may wish to include /software/gnu/bin/ early in your command +# search path, so that you will be using GNU make when you type "make". +# +# Use "make" to build the executable(s) +# Use "make clean" to remove .o files +# Use "make distclean" to remove all files produced by make, including +# the executable +# +# +# Copyright (c) 1992-1996 The Regents of the University of California. +# All rights reserved. See copyright.h for copyright notice and limitation +# of liability and disclaimer of warranty provisions. +# +# This file has been modified for use at Waterloo +# +############################################################################# +# Makefile.dep contains all machine-dependent definitions +# If you are trying to build coff2noff somewhere outside +# of the MFCF environment, you will almost certainly want +# to visit and edit Makefile.dep before doing so +############################################################################# +include Makefile.dep + +CC=gcc +CFLAGS= $(HOSTCFLAGS) -DRDATA -m32 +LD=gcc -m32 +RM = /bin/rm +MV = /bin/mv + +ifeq ($(hosttype),unknown) +buildtargets = unknownhost +else +buildtargets = coff2noff.$(hosttype) +endif + +all: $(buildtargets) + +# converts a COFF file to Nachos object format +coff2noff.$(hosttype): coff2noff.o + $(LD) coff2noff.o -o coff2noff.$(hosttype) + strip coff2noff.$(hosttype) + +clean: + $(RM) -f coff2noff.o + +distclean: clean + $(MV) coff2noff.c temp.c + $(RM) -f coff2noff.* + $(MV) temp.c coff2noff.c + + +unknownhost: + @echo Host type could not be determined. + @echo make is terminating + @echo If you are on an MFCF machine, contact the instructor + @echo to report this problem + @echo Otherwise, edit Makefile.dep and try again. diff --git a/coff2noff/Makefile.dep b/coff2noff/Makefile.dep new file mode 100644 index 0000000..b523c5b --- /dev/null +++ b/coff2noff/Makefile.dep @@ -0,0 +1,91 @@ +############################################################################# +# Machine-specific definitions +# +# In the MFCF environment, this attempts to determine automatically +# the machine type and OS type. If it cannot, it gives up and +# prints a message. +# +# If you are not in the MFCF environment, you can either add a new +# automatic test for your machine/OS type, or you can set the +# necessary variables "manually" here +############################################################################# + +# unfortunately, command line arguments to uname are not +# very consistent across UNIX flavours. However, the following +# seem to work almost everywhere in MFCF land + +osname = $(shell uname -s) +osrelease = $(shell uname -r) + +hosttype = unknown + +# Test for Solaris (5.6) +# At Waterloo: agnesi,bacon,fenchel,fitch,lassar,magnus,merrill +# If Solaris, we assume we are on a SPARC, which is not necessarily +# a good assumption outside of MFCF +ifeq ($(osname),SunOS) +ifeq ($(osrelease),5.6) +HOSTCFLAGS = -DHOST_IS_BIG_ENDIAN +hosttype = sparcSolaris +endif +endif + +# Test for Solaris (5.5) +# At Waterloo: hermite.math,markov.math,picard.math,wronski.math,... +# If Solaris, we assume we are on a SPARC, which is not necessarily +# a good assumption outside of MFCF +ifeq ($(osname),SunOS) +ifeq ($(osrelease),5.5) +HOSTCFLAGS = -DHOST_IS_BIG_ENDIAN +hosttype = sparcSolaris +endif +endif + +# Test for Solaris (5.4) +# At Waterloo: hume.math, hypatia.math,... +# This is the same setup as Solaris 5.5 +# If Solaris, we assume we are on a SPARC, which is not necessarily +# a good assumption outside of MFCF +ifeq ($(osname),SunOS) +ifeq ($(osrelease),5.4) +HOSTCFLAGS = -DHOST_IS_BIG_ENDIAN +hosttype = sparcSolaris +endif +endif + +# Test for SunOS 4.xx +# At Waterloo: descartes,cayley,napier,.... +# If SunOS, we assume we are on a SPARC, which is not necessarily +# a good assumption outside of MFCF +ifeq ($(osname),SunOS) +ifeq ($(osrelease),4.1.3_U1) +HOSTCFLAGS = -DHOST_IS_BIG_ENDIAN +hosttype = sparcSunOS +endif +endif + +# Test for ULTRIX +# At Waterloo: cantor.math,noether.math +# Assume ULTRIX on a MIPS architecture +ifeq ($(osname),ULTRIX) +HOSTCFLAGS = +hosttype = mipsUltrix +endif + +# Note: +# If you are trying to build on Linux on an x86 +# try something like this, substituting whatever +# uname -s returns on your machine for the XXX +# +ifeq ($(osname),Linux) +HOSTCFLAGS = +hosttype = x86Linux +endif + +ifeq ($(osname),CYGWIN_NT-5.1) +HOSTCFLAGS = +hosttype = x86Linux +endif + + + diff --git a/coff2noff/coff.h b/coff2noff/coff.h new file mode 100644 index 0000000..a7cf79d --- /dev/null +++ b/coff2noff/coff.h @@ -0,0 +1,49 @@ +/* coff.h + * Data structures that describe the MIPS COFF format. + */ + +struct filehdr { + unsigned short f_magic; /* magic number */ + unsigned short f_nscns; /* number of sections */ + long f_timdat; /* time & date stamp */ + long f_symptr; /* file pointer to symbolic header */ + long f_nsyms; /* sizeof(symbolic hdr) */ + unsigned short f_opthdr; /* sizeof(optional hdr) */ + unsigned short f_flags; /* flags */ + }; + +#define MIPSELMAGIC 0x0162 + +#define OMAGIC 0407 +#define SOMAGIC 0x0701 + +typedef struct aouthdr { + short magic; /* see above */ + short vstamp; /* version stamp */ + long tsize; /* text size in bytes, padded to DW bdry*/ + long dsize; /* initialized data " " */ + long bsize; /* uninitialized data " " */ + long entry; /* entry pt. */ + long text_start; /* base of text used for this file */ + long data_start; /* base of data used for this file */ + long bss_start; /* base of bss used for this file */ + long gprmask; /* general purpose register mask */ + long cprmask[4]; /* co-processor register masks */ + long gp_value; /* the gp value used for this object */ + } AOUTHDR; +#define AOUTHSZ sizeof(AOUTHDR) + + +struct scnhdr { + char s_name[8]; /* section name */ + long s_paddr; /* physical address, aliased s_nlib */ + long s_vaddr; /* virtual address */ + long s_size; /* section size */ + long s_scnptr; /* file ptr to raw data for section */ + long s_relptr; /* file ptr to relocation */ + long s_lnnoptr; /* file ptr to gp histogram */ + unsigned short s_nreloc; /* number of relocation entries */ + unsigned short s_nlnno; /* number of gp histogram entries */ + long s_flags; /* flags */ + }; + diff --git a/coff2noff/coff2noff.c b/coff2noff/coff2noff.c new file mode 100644 index 0000000..1d9b7cb --- /dev/null +++ b/coff2noff/coff2noff.c @@ -0,0 +1,300 @@ +/* coff2noff.c + * + * This program reads in a COFF format file, and outputs a NOFF format file. + * The NOFF format is essentially just a simpler version of the COFF file, + * recording where each segment is in the NOFF file, and where it is to + * go in the virtual address space. + * + * Assumes coff file is linked with either + * gld with -N -Ttext 0 + * ld with -N -T 0 + * to make sure the object file has no shared text. + * + * Also assumes that the COFF file has at most 3 segments: + * .text -- read-only executable instructions + * .data -- initialized data + * .bss/.sbss -- uninitialized data (should be zero'd on program startup) +#ifdef RDATA + * .rdata -- read-only data (e.g., string literals). + * mark this segment readonly to prevent it from being modified +#endif + * + * + * Copyright (c) 1992-1993 The Regents of the University of California. + * All rights reserved. See copyright.h for copyright notice and limitation + * of liability and disclaimer of warranty provisions. + */ + +/* + * Modified at UW by KMS, August, 1997 + * The modified program always writes the NOFF header in little-endian + * format, rather than host format. This is to avoid the problem + * that user programs run through coff2noff on a big-endian host + * would not run properly on Nachos machines running on little-endian + * hosts. + * + * Note that the Nachos address space loading code + * (in AddrSpace::Load) on big-endian hosts converts the header + * to big-endian format when it is read in. + * Thus, the little-endian header NOFF + * header should work OK whether Nachos is running on a little-endian + * host or a big-endian host. + */ + +#define MAIN +#include "copyright.h" +#undef MAIN + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "coff.h" +#include "noff.h" + +/****************************************************************/ +/* Routines for converting words and short words to and from the + * simulated machine's format of little endian. These end up + * being NOPs when the host machine is little endian. + */ + +unsigned int +WordToHost(unsigned int word) { +#ifdef HOST_IS_BIG_ENDIAN + register unsigned long result; + result = (word >> 24) & 0x000000ff; + result |= (word >> 8) & 0x0000ff00; + result |= (word << 8) & 0x00ff0000; + result |= (word << 24) & 0xff000000; + return result; +#else + return word; +#endif /* HOST_IS_BIG_ENDIAN */ +} + +unsigned short +ShortToHost(unsigned short shortword) { +#if HOST_IS_BIG_ENDIAN + register unsigned short result; + result = (shortword << 8) & 0xff00; + result |= (shortword >> 8) & 0x00ff; + return result; +#else + return shortword; +#endif /* HOST_IS_BIG_ENDIAN */ +} + +unsigned int +WordToMachine(unsigned int word) { return WordToHost(word); } + +unsigned short +ShortToMachine(unsigned short shortword) { return ShortToHost(shortword); } + +// this routine was borrowed from userprog/addrspace.cc +// on a big-endian machine, it converts all fields of +// the NOFF header to little-endian format +// on a little-endian machine, where the header is already +// in little-endian format, it does nothing +static void +SwapHeader (NoffHeader *noffH) +{ + noffH->noffMagic = WordToHost(noffH->noffMagic); + noffH->code.size = WordToHost(noffH->code.size); + noffH->code.virtualAddr = WordToHost(noffH->code.virtualAddr); + noffH->code.inFileAddr = WordToHost(noffH->code.inFileAddr); +#ifdef RDATA + noffH->readonlyData.size = WordToHost(noffH->readonlyData.size); + noffH->readonlyData.virtualAddr = + WordToHost(noffH->readonlyData.virtualAddr); + noffH->readonlyData.inFileAddr = + WordToHost(noffH->readonlyData.inFileAddr); +#endif + noffH->initData.size = WordToHost(noffH->initData.size); + noffH->initData.virtualAddr = WordToHost(noffH->initData.virtualAddr); + noffH->initData.inFileAddr = WordToHost(noffH->initData.inFileAddr); + noffH->uninitData.size = WordToHost(noffH->uninitData.size); + noffH->uninitData.virtualAddr = WordToHost(noffH->uninitData.virtualAddr); + noffH->uninitData.inFileAddr = WordToHost(noffH->uninitData.inFileAddr); +} + +/****************************************************************/ + +#define ReadStruct(f,s) Read(f,(char *)&s,sizeof(s)) + +char *noffFileName = NULL; + +/* read and check for error */ +void Read(int fd, char *buf, int nBytes) +{ + if (read(fd, buf, nBytes) != nBytes) { + fprintf(stderr, "File is too short\n"); + unlink(noffFileName); + exit(1); + } +} + +/* write and check for error */ +void Write(int fd, char *buf, int nBytes) +{ + if (write(fd, buf, nBytes) != nBytes) { + fprintf(stderr, "Unable to write file\n"); + unlink(noffFileName); + exit(1); + } +} + +int main(int argc, char **argv) +{ + int fdIn, fdOut, numsections, i, inNoffFile; + struct filehdr fileh; + struct aouthdr systemh; + struct scnhdr *sections; + char *buffer; + NoffHeader noffH; + + if (argc < 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(1); + } + +/* open the COFF file (input) */ + fdIn = open(argv[1], O_RDONLY, 0); + if (fdIn == -1) { + perror(argv[1]); + exit(1); + } + +/* open the NOFF file (output) */ + fdOut = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC , 0666); + if (fdIn == -1) { + perror(argv[2]); + exit(1); + } + noffFileName = argv[2]; + +/* Read in the file header and check the magic number. */ + ReadStruct(fdIn,fileh); + fileh.f_magic = ShortToHost(fileh.f_magic); + fileh.f_nscns = ShortToHost(fileh.f_nscns); + if (fileh.f_magic != MIPSELMAGIC) { + fprintf(stderr, "File is not a MIPSEL COFF file\n"); + unlink(noffFileName); + exit(1); + } + +/* Read in the system header and check the magic number */ + ReadStruct(fdIn,systemh); + systemh.magic = ShortToHost(systemh.magic); + if (systemh.magic != OMAGIC) { + fprintf(stderr, "File is not a OMAGIC file\n"); + unlink(noffFileName); + exit(1); + } + +/* Read in the section headers. */ + numsections = fileh.f_nscns; + printf("numsections %d \n",numsections); + sections = (struct scnhdr *)malloc(numsections * sizeof(struct scnhdr)); + Read(fdIn, (char *) sections, numsections * sizeof(struct scnhdr)); + + for (i = 0; i < numsections; i++) { + sections[i].s_paddr = WordToHost(sections[i].s_paddr); + sections[i].s_size = WordToHost(sections[i].s_size); + sections[i].s_scnptr = WordToHost(sections[i].s_scnptr); + } + + /* initialize the NOFF header, in case not all the segments are defined + * in the COFF file + */ + noffH.noffMagic = NOFFMAGIC; + noffH.code.size = 0; + noffH.initData.size = 0; + noffH.uninitData.size = 0; +#ifdef RDATA + noffH.readonlyData.size = 0; +#endif + + + /* Copy the segments in */ + inNoffFile = sizeof(NoffHeader); + lseek(fdOut, inNoffFile, 0); + printf("Loading %d sections:\n", numsections); + for (i = 0; i < numsections; i++) { + printf("\t\"%s\", filepos 0x%x, mempos 0x%x, size 0x%x\n", + sections[i].s_name, (unsigned int)sections[i].s_scnptr, + (unsigned int)sections[i].s_paddr, (unsigned int)sections[i].s_size); + if (sections[i].s_size == 0) { + /* do nothing! */ + } else if (!strcmp(sections[i].s_name, ".text")) { + noffH.code.virtualAddr = sections[i].s_paddr; + noffH.code.inFileAddr = inNoffFile; + noffH.code.size = sections[i].s_size; + lseek(fdIn, sections[i].s_scnptr, 0); + buffer = malloc(sections[i].s_size); + Read(fdIn, buffer, sections[i].s_size); + Write(fdOut, buffer, sections[i].s_size); + free(buffer); + inNoffFile += sections[i].s_size; + } else if (!strcmp(sections[i].s_name, ".data")){ + + noffH.initData.virtualAddr = sections[i].s_paddr; + noffH.initData.inFileAddr = inNoffFile; + noffH.initData.size = sections[i].s_size; + lseek(fdIn, sections[i].s_scnptr, 0); + buffer = malloc(sections[i].s_size); + Read(fdIn, buffer, sections[i].s_size); + Write(fdOut, buffer, sections[i].s_size); + free(buffer); + inNoffFile += sections[i].s_size; +#ifdef RDATA + } else if (!strcmp(sections[i].s_name, ".rdata")){ + + noffH.readonlyData.virtualAddr = sections[i].s_paddr; + noffH.readonlyData.inFileAddr = inNoffFile; + noffH.readonlyData.size = sections[i].s_size; + lseek(fdIn, sections[i].s_scnptr, 0); + buffer = malloc(sections[i].s_size); + Read(fdIn, buffer, sections[i].s_size); + Write(fdOut, buffer, sections[i].s_size); + free(buffer); + inNoffFile += sections[i].s_size; +#endif + } else if (!strcmp(sections[i].s_name, ".bss")){ + /* need to check if we have both .bss and .sbss -- make sure they + * are contiguous + */ + if (noffH.uninitData.size != 0) { + if (sections[i].s_paddr == (noffH.uninitData.virtualAddr + + noffH.uninitData.size)) { + fprintf(stderr, "Can't handle both bss and sbss\n"); + unlink(noffFileName); + exit(1); + } + noffH.uninitData.size += sections[i].s_size; + } else { + noffH.uninitData.virtualAddr = sections[i].s_paddr; + noffH.uninitData.size = sections[i].s_size; + } + /* we don't need to copy the uninitialized data! */ + } else { + fprintf(stderr, "Unknown segment type: %s\n", sections[i].s_name); + unlink(noffFileName); + exit(1); + } + } + lseek(fdOut, 0, 0); + + // convert the NOFF header to little-endian before + // writing it to the file + SwapHeader(&noffH); + + Write(fdOut, (char *)&noffH, sizeof(NoffHeader)); + close(fdIn); + close(fdOut); + exit(0); +} diff --git a/coff2noff/coff2noff.o b/coff2noff/coff2noff.o new file mode 100644 index 0000000..45473f4 Binary files /dev/null and b/coff2noff/coff2noff.o differ diff --git a/coff2noff/coff2noff.x86Linux b/coff2noff/coff2noff.x86Linux new file mode 100755 index 0000000..db3155b Binary files /dev/null and b/coff2noff/coff2noff.x86Linux differ diff --git a/coff2noff/copyright.h b/coff2noff/copyright.h new file mode 100644 index 0000000..b2fa8a8 --- /dev/null +++ b/coff2noff/copyright.h @@ -0,0 +1,24 @@ +/* +Copyright (c) 1992-1996 The Regents of the University of California. +All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose, without fee, and without written agreement is +hereby granted, provided that the above copyright notice and the following +two paragraphs appear in all copies of this software. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT +OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF +CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +*/ + +#ifdef MAIN /* include the copyright message in every executable */ +static char *copyright = "Copyright (c) 1992-1993 The Regents of the University of California. All rights reserved."; +#endif // MAIN diff --git a/coff2noff/noff.h b/coff2noff/noff.h new file mode 100644 index 0000000..a8b5551 --- /dev/null +++ b/coff2noff/noff.h @@ -0,0 +1,28 @@ +/* noff.h + * Data structures defining the Nachos Object Code Format + * + * Basically, we only know about three types of segments: + * code (read-only), initialized data, and unitialized data + */ + +#define NOFFMAGIC 0xbadfad /* magic number denoting Nachos + * object code file + */ + +typedef struct segment { + int virtualAddr; /* location of segment in virt addr space */ + int inFileAddr; /* location of segment in this file */ + int size; /* size of segment */ +} Segment; + +typedef struct noffHeader { + int noffMagic; /* should be NOFFMAGIC */ + Segment code; /* executable code segment */ + Segment initData; /* initialized data segment */ +#ifdef RDATA + Segment readonlyData; /* read only data */ +#endif + Segment uninitData; /* uninitialized data segment -- + * should be zero'ed before use + */ +} NoffHeader; diff --git a/usr/local/nachos/bin/cpp b/usr/local/nachos/bin/cpp new file mode 100755 index 0000000..64db39a Binary files /dev/null and b/usr/local/nachos/bin/cpp differ diff --git a/usr/local/nachos/bin/decstation-ultrix-addr2line b/usr/local/nachos/bin/decstation-ultrix-addr2line new file mode 100755 index 0000000..20f1068 Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-addr2line differ diff --git a/usr/local/nachos/bin/decstation-ultrix-ar b/usr/local/nachos/bin/decstation-ultrix-ar new file mode 100755 index 0000000..9161945 Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-ar differ diff --git a/usr/local/nachos/bin/decstation-ultrix-as b/usr/local/nachos/bin/decstation-ultrix-as new file mode 100755 index 0000000..62793d5 Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-as differ diff --git a/usr/local/nachos/bin/decstation-ultrix-c++filt b/usr/local/nachos/bin/decstation-ultrix-c++filt new file mode 100755 index 0000000..9bf235b Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-c++filt differ diff --git a/usr/local/nachos/bin/decstation-ultrix-gasp b/usr/local/nachos/bin/decstation-ultrix-gasp new file mode 100755 index 0000000..c718547 Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-gasp differ diff --git a/usr/local/nachos/bin/decstation-ultrix-gcc b/usr/local/nachos/bin/decstation-ultrix-gcc new file mode 100755 index 0000000..0fdb507 Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-gcc differ diff --git a/usr/local/nachos/bin/decstation-ultrix-ld b/usr/local/nachos/bin/decstation-ultrix-ld new file mode 100755 index 0000000..5a6182d Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-ld differ diff --git a/usr/local/nachos/bin/decstation-ultrix-nm b/usr/local/nachos/bin/decstation-ultrix-nm new file mode 100755 index 0000000..0ddf196 Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-nm differ diff --git a/usr/local/nachos/bin/decstation-ultrix-objcopy b/usr/local/nachos/bin/decstation-ultrix-objcopy new file mode 100755 index 0000000..092ac3f Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-objcopy differ diff --git a/usr/local/nachos/bin/decstation-ultrix-objdump b/usr/local/nachos/bin/decstation-ultrix-objdump new file mode 100755 index 0000000..8ebae5b Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-objdump differ diff --git a/usr/local/nachos/bin/decstation-ultrix-protoize b/usr/local/nachos/bin/decstation-ultrix-protoize new file mode 100755 index 0000000..d92716c Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-protoize differ diff --git a/usr/local/nachos/bin/decstation-ultrix-ranlib b/usr/local/nachos/bin/decstation-ultrix-ranlib new file mode 100755 index 0000000..bf80d51 Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-ranlib differ diff --git a/usr/local/nachos/bin/decstation-ultrix-readelf b/usr/local/nachos/bin/decstation-ultrix-readelf new file mode 100755 index 0000000..ef7eb1b Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-readelf differ diff --git a/usr/local/nachos/bin/decstation-ultrix-size b/usr/local/nachos/bin/decstation-ultrix-size new file mode 100755 index 0000000..b21864f Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-size differ diff --git a/usr/local/nachos/bin/decstation-ultrix-strings b/usr/local/nachos/bin/decstation-ultrix-strings new file mode 100755 index 0000000..d0d0d6a Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-strings differ diff --git a/usr/local/nachos/bin/decstation-ultrix-strip b/usr/local/nachos/bin/decstation-ultrix-strip new file mode 100755 index 0000000..c514798 Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-strip differ diff --git a/usr/local/nachos/bin/decstation-ultrix-unprotoize b/usr/local/nachos/bin/decstation-ultrix-unprotoize new file mode 100755 index 0000000..200b7d4 Binary files /dev/null and b/usr/local/nachos/bin/decstation-ultrix-unprotoize differ diff --git a/usr/local/nachos/bin/gcov b/usr/local/nachos/bin/gcov new file mode 100755 index 0000000..9187e23 Binary files /dev/null and b/usr/local/nachos/bin/gcov differ diff --git a/usr/local/nachos/decstation-ultrix/bin/ar b/usr/local/nachos/decstation-ultrix/bin/ar new file mode 100755 index 0000000..9161945 Binary files /dev/null and b/usr/local/nachos/decstation-ultrix/bin/ar differ diff --git a/usr/local/nachos/decstation-ultrix/bin/as b/usr/local/nachos/decstation-ultrix/bin/as new file mode 100755 index 0000000..62793d5 Binary files /dev/null and b/usr/local/nachos/decstation-ultrix/bin/as differ diff --git a/usr/local/nachos/decstation-ultrix/bin/gcc b/usr/local/nachos/decstation-ultrix/bin/gcc new file mode 100755 index 0000000..0fdb507 Binary files /dev/null and b/usr/local/nachos/decstation-ultrix/bin/gcc differ diff --git a/usr/local/nachos/decstation-ultrix/bin/ld b/usr/local/nachos/decstation-ultrix/bin/ld new file mode 100755 index 0000000..5a6182d Binary files /dev/null and b/usr/local/nachos/decstation-ultrix/bin/ld differ diff --git a/usr/local/nachos/decstation-ultrix/bin/nm b/usr/local/nachos/decstation-ultrix/bin/nm new file mode 100755 index 0000000..0ddf196 Binary files /dev/null and b/usr/local/nachos/decstation-ultrix/bin/nm differ diff --git a/usr/local/nachos/decstation-ultrix/bin/ranlib b/usr/local/nachos/decstation-ultrix/bin/ranlib new file mode 100755 index 0000000..bf80d51 Binary files /dev/null and b/usr/local/nachos/decstation-ultrix/bin/ranlib differ diff --git a/usr/local/nachos/decstation-ultrix/bin/strip b/usr/local/nachos/decstation-ultrix/bin/strip new file mode 100755 index 0000000..c514798 Binary files /dev/null and b/usr/local/nachos/decstation-ultrix/bin/strip differ diff --git a/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.x b/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.x new file mode 100644 index 0000000..95340f9 --- /dev/null +++ b/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.x @@ -0,0 +1,52 @@ +OUTPUT_FORMAT("ecoff-littlemips", "ecoff-bigmips", + "ecoff-littlemips") + SEARCH_DIR(/usr/local/nachos/decstation-ultrix/lib); +ENTRY(__start) +SECTIONS +{ + . = 0x400000 + SIZEOF_HEADERS; + .text : { + _ftext = . ; + *(.init) + eprol = .; + *(.text) + PROVIDE (__runtime_reloc_start = .); + *(.rel.sdata) + PROVIDE (__runtime_reloc_stop = .); + *(.fini) + etext = .; + _etext = .; + } + . = 0x10000000; + .rdata : { + *(.rdata) + } + _fdata = ALIGN(16); + .data : { + *(.data) + CONSTRUCTORS + } + _gp = ALIGN(16) + 0x8000; + .lit8 : { + *(.lit8) + } + .lit4 : { + *(.lit4) + } + .sdata : { + *(.sdata) + } + edata = .; + _edata = .; + _fbss = .; + .sbss : { + *(.sbss) + *(.scommon) + } + .bss : { + *(.bss) + *(COMMON) + } + end = .; + _end = .; +} diff --git a/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xbn b/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xbn new file mode 100644 index 0000000..6da09b5 --- /dev/null +++ b/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xbn @@ -0,0 +1,52 @@ +OUTPUT_FORMAT("ecoff-littlemips", "ecoff-bigmips", + "ecoff-littlemips") + SEARCH_DIR(/usr/local/nachos/decstation-ultrix/lib); +ENTRY(__start) +SECTIONS +{ + . = 0x400000 + SIZEOF_HEADERS; + .text : { + _ftext = . ; + *(.init) + eprol = .; + *(.text) + PROVIDE (__runtime_reloc_start = .); + *(.rel.sdata) + PROVIDE (__runtime_reloc_stop = .); + *(.fini) + etext = .; + _etext = .; + } + . = .; + .rdata : { + *(.rdata) + } + _fdata = ALIGN(16); + .data : { + *(.data) + CONSTRUCTORS + } + _gp = ALIGN(16) + 0x8000; + .lit8 : { + *(.lit8) + } + .lit4 : { + *(.lit4) + } + .sdata : { + *(.sdata) + } + edata = .; + _edata = .; + _fbss = .; + .sbss : { + *(.sbss) + *(.scommon) + } + .bss : { + *(.bss) + *(COMMON) + } + end = .; + _end = .; +} diff --git a/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xn b/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xn new file mode 100644 index 0000000..6da09b5 --- /dev/null +++ b/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xn @@ -0,0 +1,52 @@ +OUTPUT_FORMAT("ecoff-littlemips", "ecoff-bigmips", + "ecoff-littlemips") + SEARCH_DIR(/usr/local/nachos/decstation-ultrix/lib); +ENTRY(__start) +SECTIONS +{ + . = 0x400000 + SIZEOF_HEADERS; + .text : { + _ftext = . ; + *(.init) + eprol = .; + *(.text) + PROVIDE (__runtime_reloc_start = .); + *(.rel.sdata) + PROVIDE (__runtime_reloc_stop = .); + *(.fini) + etext = .; + _etext = .; + } + . = .; + .rdata : { + *(.rdata) + } + _fdata = ALIGN(16); + .data : { + *(.data) + CONSTRUCTORS + } + _gp = ALIGN(16) + 0x8000; + .lit8 : { + *(.lit8) + } + .lit4 : { + *(.lit4) + } + .sdata : { + *(.sdata) + } + edata = .; + _edata = .; + _fbss = .; + .sbss : { + *(.sbss) + *(.scommon) + } + .bss : { + *(.bss) + *(COMMON) + } + end = .; + _end = .; +} diff --git a/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xr b/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xr new file mode 100644 index 0000000..2750ef9 --- /dev/null +++ b/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xr @@ -0,0 +1,40 @@ +OUTPUT_FORMAT("ecoff-littlemips", "ecoff-bigmips", + "ecoff-littlemips") + SEARCH_DIR(/usr/local/nachos/decstation-ultrix/lib); +ENTRY(__start) +SECTIONS +{ + .text : { + ; + *(.init) + ; + *(.text) + *(.rel.sdata) + *(.fini) + ; + ; + } + .rdata : { + *(.rdata) + } + .data : { + *(.data) + } + .lit8 : { + *(.lit8) + } + .lit4 : { + *(.lit4) + } + .sdata : { + *(.sdata) + } + .sbss : { + *(.sbss) + *(.scommon) + } + .bss : { + *(.bss) + *(COMMON) + } +} diff --git a/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xu b/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xu new file mode 100644 index 0000000..98277db --- /dev/null +++ b/usr/local/nachos/decstation-ultrix/lib/ldscripts/mipslit.xu @@ -0,0 +1,41 @@ +OUTPUT_FORMAT("ecoff-littlemips", "ecoff-bigmips", + "ecoff-littlemips") + SEARCH_DIR(/usr/local/nachos/decstation-ultrix/lib); +ENTRY(__start) +SECTIONS +{ + .text : { + ; + *(.init) + ; + *(.text) + *(.rel.sdata) + *(.fini) + ; + ; + } + .rdata : { + *(.rdata) + } + .data : { + *(.data) + CONSTRUCTORS + } + .lit8 : { + *(.lit8) + } + .lit4 : { + *(.lit4) + } + .sdata : { + *(.sdata) + } + .sbss : { + *(.sbss) + *(.scommon) + } + .bss : { + *(.bss) + *(COMMON) + } +} diff --git a/usr/local/nachos/include/ansidecl.h b/usr/local/nachos/include/ansidecl.h new file mode 100644 index 0000000..1030867 --- /dev/null +++ b/usr/local/nachos/include/ansidecl.h @@ -0,0 +1,224 @@ +/* ANSI and traditional C compatability macros + Copyright 1991, 1992, 1996, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* ANSI and traditional C compatibility macros + + ANSI C is assumed if __STDC__ is #defined. + + Macro ANSI C definition Traditional C definition + ----- ---- - ---------- ----------- - ---------- + PTR `void *' `char *' + LONG_DOUBLE `long double' `double' + VOLATILE `volatile' `' + SIGNED `signed' `' + PTRCONST `void *const' `char *' + ANSI_PROTOTYPES 1 not defined + + CONST is also defined, but is obsolete. Just use const. + + obsolete -- DEFUN (name, arglist, args) + + Defines function NAME. + + ARGLIST lists the arguments, separated by commas and enclosed in + parentheses. ARGLIST becomes the argument list in traditional C. + + ARGS list the arguments with their types. It becomes a prototype in + ANSI C, and the type declarations in traditional C. Arguments should + be separated with `AND'. For functions with a variable number of + arguments, the last thing listed should be `DOTS'. + + obsolete -- DEFUN_VOID (name) + + Defines a function NAME, which takes no arguments. + + obsolete -- EXFUN (name, (prototype)) -- obsolete. + + Replaced by PARAMS. Do not use; will disappear someday soon. + Was used in external function declarations. + In ANSI C it is `NAME PROTOTYPE' (so PROTOTYPE should be enclosed in + parentheses). In traditional C it is `NAME()'. + For a function that takes no arguments, PROTOTYPE should be `(void)'. + + obsolete -- PROTO (type, name, (prototype) -- obsolete. + + This one has also been replaced by PARAMS. Do not use. + + PARAMS ((args)) + + We could use the EXFUN macro to handle prototype declarations, but + the name is misleading and the result is ugly. So we just define a + simple macro to handle the parameter lists, as in: + + static int foo PARAMS ((int, char)); + + This produces: `static int foo();' or `static int foo (int, char);' + + EXFUN would have done it like this: + + static int EXFUN (foo, (int, char)); + + but the function is not external...and it's hard to visually parse + the function name out of the mess. EXFUN should be considered + obsolete; new code should be written to use PARAMS. + + DOTS is also obsolete. + + Examples: + + extern int printf PARAMS ((const char *format, ...)); +*/ + +#ifndef _ANSIDECL_H + +#define _ANSIDECL_H 1 + + +/* Every source file includes this file, + so they will all get the switch for lint. */ +/* LINTLIBRARY */ + + +#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32) +/* All known AIX compilers implement these things (but don't always + define __STDC__). The RISC/OS MIPS compiler defines these things + in SVR4 mode, but does not define __STDC__. */ + +#define PTR void * +#define PTRCONST void *CONST +#define LONG_DOUBLE long double + +#ifndef IN_GCC +#define AND , +#define NOARGS void +#define VOLATILE volatile +#define SIGNED signed +#endif /* ! IN_GCC */ + +#define PARAMS(paramlist) paramlist +#define ANSI_PROTOTYPES 1 + +#define VPARAMS(ARGS) ARGS +#define VA_START(va_list,var) va_start(va_list,var) + +/* These are obsolete. Do not use. */ +#ifndef IN_GCC +#define CONST const +#define DOTS , ... +#define PROTO(type, name, arglist) type name arglist +#define EXFUN(name, proto) name proto +#define DEFUN(name, arglist, args) name(args) +#define DEFUN_VOID(name) name(void) +#endif /* ! IN_GCC */ + +#else /* Not ANSI C. */ + +#define PTR char * +#define PTRCONST PTR +#define LONG_DOUBLE double + +#ifndef IN_GCC +#define AND ; +#define NOARGS +#define VOLATILE +#define SIGNED +#endif /* !IN_GCC */ + +#ifndef const /* some systems define it in header files for non-ansi mode */ +#define const +#endif + +#define PARAMS(paramlist) () + +#define VPARAMS(ARGS) (va_alist) va_dcl +#define VA_START(va_list,var) va_start(va_list) + +/* These are obsolete. Do not use. */ +#ifndef IN_GCC +#define CONST +#define DOTS +#define PROTO(type, name, arglist) type name () +#define EXFUN(name, proto) name() +#define DEFUN(name, arglist, args) name arglist args; +#define DEFUN_VOID(name) name() +#endif /* ! IN_GCC */ + +#endif /* ANSI C. */ + +/* Using MACRO(x,y) in cpp #if conditionals does not work with some + older preprocessors. Thus we can't define something like this: + +#define HAVE_GCC_VERSION(MAJOR, MINOR) \ + (__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR))) + +and then test "#if HAVE_GCC_VERSION(2,7)". + +So instead we use the macro below and test it against specific values. */ + +/* This macro simplifies testing whether we are using gcc, and if it + is of a particular minimum version. (Both major & minor numbers are + significant.) This macro will evaluate to 0 if we are not using + gcc at all. */ +#ifndef GCC_VERSION +#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) +#endif /* GCC_VERSION */ + +/* Define macros for some gcc attributes. This permits us to use the + macros freely, and know that they will come into play for the + version of gcc in which they are supported. */ + +#if (GCC_VERSION < 2007) +# define __attribute__(x) +#endif + +/* Attribute __malloc__ on functions was valid as of gcc 2.96. */ +#ifndef ATTRIBUTE_MALLOC +# if (GCC_VERSION >= 2096) +# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) +# else +# define ATTRIBUTE_MALLOC +# endif /* GNUC >= 2.96 */ +#endif /* ATTRIBUTE_MALLOC */ + +/* Attributes on labels were valid as of gcc 2.93. */ +#ifndef ATTRIBUTE_UNUSED_LABEL +# if (GCC_VERSION >= 2093) +# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED +# else +# define ATTRIBUTE_UNUSED_LABEL +# endif /* GNUC >= 2.93 */ +#endif /* ATTRIBUTE_UNUSED_LABEL */ + +#ifndef ATTRIBUTE_UNUSED +#define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +#endif /* ATTRIBUTE_UNUSED */ + +#ifndef ATTRIBUTE_NORETURN +#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +#endif /* ATTRIBUTE_NORETURN */ + +#ifndef ATTRIBUTE_PRINTF +#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) +#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2) +#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3) +#define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4) +#define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5) +#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6) +#endif /* ATTRIBUTE_PRINTF */ + +#endif /* ansidecl.h */ diff --git a/usr/local/nachos/include/bfd.h b/usr/local/nachos/include/bfd.h new file mode 100644 index 0000000..67a88be --- /dev/null +++ b/usr/local/nachos/include/bfd.h @@ -0,0 +1,3231 @@ +/* Main header file for the bfd library -- portable access to object files. + Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 + Free Software Foundation, Inc. + Contributed by Cygnus Support. + +** NOTE: bfd.h and bfd-in2.h are GENERATED files. Don't change them; +** instead, change bfd-in.h or the other BFD source files processed to +** generate these files. + +This file is part of BFD, the Binary File Descriptor library. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* bfd.h -- The only header file required by users of the bfd library + +The bfd.h file is generated from bfd-in.h and various .c files; if you +change it, your changes will probably be lost. + +All the prototypes and definitions following the comment "THE FOLLOWING +IS EXTRACTED FROM THE SOURCE" are extracted from the source files for +BFD. If you change it, someone oneday will extract it from the source +again, and your changes will be lost. To save yourself from this bind, +change the definitions in the source in the bfd directory. Type "make +docs" and then "make headers" in that directory, and magically this file +will change to reflect your changes. + +If you don't have the tools to perform the extraction, then you are +safe from someone on your system trampling over your header files. +You should still maintain the equivalence between the source and this +file though; every change you make to the .c file should be reflected +here. */ + +#ifndef __BFD_H_SEEN__ +#define __BFD_H_SEEN__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ansidecl.h" + +/* These two lines get substitutions done by commands in Makefile.in. */ +#define BFD_VERSION "2.10" +#define BFD_ARCH_SIZE 32 +#define BFD_HOST_64BIT_LONG 0 +#if 0 +#define BFD_HOST_64_BIT +#define BFD_HOST_U_64_BIT +#endif + +#if BFD_ARCH_SIZE >= 64 +#define BFD64 +#endif + +#ifndef INLINE +#if __GNUC__ >= 2 +#define INLINE __inline__ +#else +#define INLINE +#endif +#endif + +/* forward declaration */ +typedef struct _bfd bfd; + +/* To squelch erroneous compiler warnings ("illegal pointer + combination") from the SVR3 compiler, we would like to typedef + boolean to int (it doesn't like functions which return boolean. + Making sure they are never implicitly declared to return int + doesn't seem to help). But this file is not configured based on + the host. */ +/* General rules: functions which are boolean return true on success + and false on failure (unless they're a predicate). -- bfd.doc */ +/* I'm sure this is going to break something and someone is going to + force me to change it. */ +/* typedef enum boolean {false, true} boolean; */ +/* Yup, SVR4 has a "typedef enum boolean" in -fnf */ +/* It gets worse if the host also defines a true/false enum... -sts */ +/* And even worse if your compiler has built-in boolean types... -law */ +#if defined (__GNUG__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6)) +#define TRUE_FALSE_ALREADY_DEFINED +#endif +#ifdef MPW +/* Pre-emptive strike - get the file with the enum. */ +#include +#define TRUE_FALSE_ALREADY_DEFINED +#endif /* MPW */ +#ifndef TRUE_FALSE_ALREADY_DEFINED +typedef enum bfd_boolean {false, true} boolean; +#define BFD_TRUE_FALSE +#else +/* Use enum names that will appear nowhere else. */ +typedef enum bfd_boolean {bfd_fffalse, bfd_tttrue} boolean; +#endif + +/* A pointer to a position in a file. */ +/* FIXME: This should be using off_t from . + For now, try to avoid breaking stuff by not including here. + This will break on systems with 64-bit file offsets (e.g. 4.4BSD). + Probably the best long-term answer is to avoid using file_ptr AND off_t + in this header file, and to handle this in the BFD implementation + rather than in its interface. */ +/* typedef off_t file_ptr; */ +typedef long int file_ptr; + +/* Support for different sizes of target format ints and addresses. + If the type `long' is at least 64 bits, BFD_HOST_64BIT_LONG will be + set to 1 above. Otherwise, if gcc is being used, this code will + use gcc's "long long" type. Otherwise, BFD_HOST_64_BIT must be + defined above. */ + +#ifndef BFD_HOST_64_BIT +# if BFD_HOST_64BIT_LONG +# define BFD_HOST_64_BIT long +# define BFD_HOST_U_64_BIT unsigned long +# else +# ifdef __GNUC__ +# if __GNUC__ >= 2 +# define BFD_HOST_64_BIT long long +# define BFD_HOST_U_64_BIT unsigned long long +# endif /* __GNUC__ >= 2 */ +# endif /* ! defined (__GNUC__) */ +# endif /* ! BFD_HOST_64BIT_LONG */ +#endif /* ! defined (BFD_HOST_64_BIT) */ + +#ifdef BFD64 + +#ifndef BFD_HOST_64_BIT + #error No 64 bit integer type available +#endif /* ! defined (BFD_HOST_64_BIT) */ + +typedef BFD_HOST_U_64_BIT bfd_vma; +typedef BFD_HOST_64_BIT bfd_signed_vma; +typedef BFD_HOST_U_64_BIT bfd_size_type; +typedef BFD_HOST_U_64_BIT symvalue; + +#ifndef fprintf_vma +#if BFD_HOST_64BIT_LONG +#define sprintf_vma(s,x) sprintf (s, "%016lx", x) +#define fprintf_vma(f,x) fprintf (f, "%016lx", x) +#else +#define _bfd_int64_low(x) ((unsigned long) (((x) & 0xffffffff))) +#define _bfd_int64_high(x) ((unsigned long) (((x) >> 32) & 0xffffffff)) +#define fprintf_vma(s,x) \ + fprintf ((s), "%08lx%08lx", _bfd_int64_high (x), _bfd_int64_low (x)) +#define sprintf_vma(s,x) \ + sprintf ((s), "%08lx%08lx", _bfd_int64_high (x), _bfd_int64_low (x)) +#endif +#endif + +#else /* not BFD64 */ + +/* Represent a target address. Also used as a generic unsigned type + which is guaranteed to be big enough to hold any arithmetic types + we need to deal with. */ +typedef unsigned long bfd_vma; + +/* A generic signed type which is guaranteed to be big enough to hold any + arithmetic types we need to deal with. Can be assumed to be compatible + with bfd_vma in the same way that signed and unsigned ints are compatible + (as parameters, in assignment, etc). */ +typedef long bfd_signed_vma; + +typedef unsigned long symvalue; +typedef unsigned long bfd_size_type; + +/* Print a bfd_vma x on stream s. */ +#define fprintf_vma(s,x) fprintf(s, "%08lx", x) +#define sprintf_vma(s,x) sprintf(s, "%08lx", x) + +#endif /* not BFD64 */ + +#define printf_vma(x) fprintf_vma(stdout,x) + +typedef unsigned int flagword; /* 32 bits of flags */ +typedef unsigned char bfd_byte; + +/** File formats */ + +typedef enum bfd_format { + bfd_unknown = 0, /* file format is unknown */ + bfd_object, /* linker/assember/compiler output */ + bfd_archive, /* object archive file */ + bfd_core, /* core dump */ + bfd_type_end} /* marks the end; don't use it! */ + bfd_format; + +/* Values that may appear in the flags field of a BFD. These also + appear in the object_flags field of the bfd_target structure, where + they indicate the set of flags used by that backend (not all flags + are meaningful for all object file formats) (FIXME: at the moment, + the object_flags values have mostly just been copied from backend + to another, and are not necessarily correct). */ + +/* No flags. */ +#define BFD_NO_FLAGS 0x00 + +/* BFD contains relocation entries. */ +#define HAS_RELOC 0x01 + +/* BFD is directly executable. */ +#define EXEC_P 0x02 + +/* BFD has line number information (basically used for F_LNNO in a + COFF header). */ +#define HAS_LINENO 0x04 + +/* BFD has debugging information. */ +#define HAS_DEBUG 0x08 + +/* BFD has symbols. */ +#define HAS_SYMS 0x10 + +/* BFD has local symbols (basically used for F_LSYMS in a COFF + header). */ +#define HAS_LOCALS 0x20 + +/* BFD is a dynamic object. */ +#define DYNAMIC 0x40 + +/* Text section is write protected (if D_PAGED is not set, this is + like an a.out NMAGIC file) (the linker sets this by default, but + clears it for -r or -N). */ +#define WP_TEXT 0x80 + +/* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the + linker sets this by default, but clears it for -r or -n or -N). */ +#define D_PAGED 0x100 + +/* BFD is relaxable (this means that bfd_relax_section may be able to + do something) (sometimes bfd_relax_section can do something even if + this is not set). */ +#define BFD_IS_RELAXABLE 0x200 + +/* This may be set before writing out a BFD to request using a + traditional format. For example, this is used to request that when + writing out an a.out object the symbols not be hashed to eliminate + duplicates. */ +#define BFD_TRADITIONAL_FORMAT 0x400 + +/* This flag indicates that the BFD contents are actually cached in + memory. If this is set, iostream points to a bfd_in_memory struct. */ +#define BFD_IN_MEMORY 0x800 + +/* symbols and relocation */ + +/* A count of carsyms (canonical archive symbols). */ +typedef unsigned long symindex; + +/* How to perform a relocation. */ +typedef const struct reloc_howto_struct reloc_howto_type; + +#define BFD_NO_MORE_SYMBOLS ((symindex) ~0) + +/* General purpose part of a symbol X; + target specific parts are in libcoff.h, libaout.h, etc. */ + +#define bfd_get_section(x) ((x)->section) +#define bfd_get_output_section(x) ((x)->section->output_section) +#define bfd_set_section(x,y) ((x)->section) = (y) +#define bfd_asymbol_base(x) ((x)->section->vma) +#define bfd_asymbol_value(x) (bfd_asymbol_base(x) + (x)->value) +#define bfd_asymbol_name(x) ((x)->name) +/*Perhaps future: #define bfd_asymbol_bfd(x) ((x)->section->owner)*/ +#define bfd_asymbol_bfd(x) ((x)->the_bfd) +#define bfd_asymbol_flavour(x) (bfd_asymbol_bfd(x)->xvec->flavour) + +/* A canonical archive symbol. */ +/* This is a type pun with struct ranlib on purpose! */ +typedef struct carsym { + char *name; + file_ptr file_offset; /* look here to find the file */ +} carsym; /* to make these you call a carsymogen */ + + +/* Used in generating armaps (archive tables of contents). + Perhaps just a forward definition would do? */ +struct orl { /* output ranlib */ + char **name; /* symbol name */ + file_ptr pos; /* bfd* or file position */ + int namidx; /* index into string table */ +}; + + +/* Linenumber stuff */ +typedef struct lineno_cache_entry { + unsigned int line_number; /* Linenumber from start of function*/ + union { + struct symbol_cache_entry *sym; /* Function name */ + unsigned long offset; /* Offset into section */ + } u; +} alent; + +/* object and core file sections */ + +#define align_power(addr, align) \ + ( ((addr) + ((1<<(align))-1)) & (-1 << (align))) + +typedef struct sec *sec_ptr; + +#define bfd_get_section_name(bfd, ptr) ((ptr)->name + 0) +#define bfd_get_section_vma(bfd, ptr) ((ptr)->vma + 0) +#define bfd_get_section_alignment(bfd, ptr) ((ptr)->alignment_power + 0) +#define bfd_section_name(bfd, ptr) ((ptr)->name) +#define bfd_section_size(bfd, ptr) (bfd_get_section_size_before_reloc(ptr)) +#define bfd_section_vma(bfd, ptr) ((ptr)->vma) +#define bfd_section_lma(bfd, ptr) ((ptr)->lma) +#define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power) +#define bfd_get_section_flags(bfd, ptr) ((ptr)->flags + 0) +#define bfd_get_section_userdata(bfd, ptr) ((ptr)->userdata) + +#define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0) + +#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma= (val)), ((ptr)->user_set_vma = (boolean)true), true) +#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),true) +#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),true) + +typedef struct stat stat_type; + +typedef enum bfd_print_symbol +{ + bfd_print_symbol_name, + bfd_print_symbol_more, + bfd_print_symbol_all +} bfd_print_symbol_type; + +/* Information about a symbol that nm needs. */ + +typedef struct _symbol_info +{ + symvalue value; + char type; + CONST char *name; /* Symbol name. */ + unsigned char stab_type; /* Stab type. */ + char stab_other; /* Stab other. */ + short stab_desc; /* Stab desc. */ + CONST char *stab_name; /* String for stab type. */ +} symbol_info; + +/* Get the name of a stabs type code. */ + +extern const char *bfd_get_stab_name PARAMS ((int)); + +/* Hash table routines. There is no way to free up a hash table. */ + +/* An element in the hash table. Most uses will actually use a larger + structure, and an instance of this will be the first field. */ + +struct bfd_hash_entry +{ + /* Next entry for this hash code. */ + struct bfd_hash_entry *next; + /* String being hashed. */ + const char *string; + /* Hash code. This is the full hash code, not the index into the + table. */ + unsigned long hash; +}; + +/* A hash table. */ + +struct bfd_hash_table +{ + /* The hash array. */ + struct bfd_hash_entry **table; + /* The number of slots in the hash table. */ + unsigned int size; + /* A function used to create new elements in the hash table. The + first entry is itself a pointer to an element. When this + function is first invoked, this pointer will be NULL. However, + having the pointer permits a hierarchy of method functions to be + built each of which calls the function in the superclass. Thus + each function should be written to allocate a new block of memory + only if the argument is NULL. */ + struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, + struct bfd_hash_table *, + const char *)); + /* An objalloc for this hash table. This is a struct objalloc *, + but we use PTR to avoid requiring the inclusion of objalloc.h. */ + PTR memory; +}; + +/* Initialize a hash table. */ +extern boolean bfd_hash_table_init + PARAMS ((struct bfd_hash_table *, + struct bfd_hash_entry *(*) (struct bfd_hash_entry *, + struct bfd_hash_table *, + const char *))); + +/* Initialize a hash table specifying a size. */ +extern boolean bfd_hash_table_init_n + PARAMS ((struct bfd_hash_table *, + struct bfd_hash_entry *(*) (struct bfd_hash_entry *, + struct bfd_hash_table *, + const char *), + unsigned int size)); + +/* Free up a hash table. */ +extern void bfd_hash_table_free PARAMS ((struct bfd_hash_table *)); + +/* Look up a string in a hash table. If CREATE is true, a new entry + will be created for this string if one does not already exist. The + COPY argument must be true if this routine should copy the string + into newly allocated memory when adding an entry. */ +extern struct bfd_hash_entry *bfd_hash_lookup + PARAMS ((struct bfd_hash_table *, const char *, boolean create, + boolean copy)); + +/* Replace an entry in a hash table. */ +extern void bfd_hash_replace + PARAMS ((struct bfd_hash_table *, struct bfd_hash_entry *old, + struct bfd_hash_entry *nw)); + +/* Base method for creating a hash table entry. */ +extern struct bfd_hash_entry *bfd_hash_newfunc + PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, + const char *)); + +/* Grab some space for a hash table entry. */ +extern PTR bfd_hash_allocate PARAMS ((struct bfd_hash_table *, + unsigned int)); + +/* Traverse a hash table in a random order, calling a function on each + element. If the function returns false, the traversal stops. The + INFO argument is passed to the function. */ +extern void bfd_hash_traverse PARAMS ((struct bfd_hash_table *, + boolean (*) (struct bfd_hash_entry *, + PTR), + PTR info)); + +/* Semi-portable string concatenation in cpp. + The CAT4 hack is to avoid a problem with some strict ANSI C preprocessors. + The problem is, "32_" is not a valid preprocessing token, and we don't + want extra underscores (e.g., "nlm_32_"). The XCAT2 macro will cause the + inner CAT macros to be evaluated first, producing still-valid pp-tokens. + Then the final concatenation can be done. (Sigh.) */ +#ifndef CAT +#ifdef SABER +#define CAT(a,b) a##b +#define CAT3(a,b,c) a##b##c +#define CAT4(a,b,c,d) a##b##c##d +#else +#if defined(__STDC__) || defined(ALMOST_STDC) +#define CAT(a,b) a##b +#define CAT3(a,b,c) a##b##c +#define XCAT2(a,b) CAT(a,b) +#define CAT4(a,b,c,d) XCAT2(CAT(a,b),CAT(c,d)) +#else +#define CAT(a,b) a/**/b +#define CAT3(a,b,c) a/**/b/**/c +#define CAT4(a,b,c,d) a/**/b/**/c/**/d +#endif +#endif +#endif + +#define COFF_SWAP_TABLE (PTR) &bfd_coff_std_swap_table + +/* User program access to BFD facilities */ + +/* Direct I/O routines, for programs which know more about the object + file than BFD does. Use higher level routines if possible. */ + +extern bfd_size_type bfd_read + PARAMS ((PTR, bfd_size_type size, bfd_size_type nitems, bfd *abfd)); +extern bfd_size_type bfd_write + PARAMS ((const PTR, bfd_size_type size, bfd_size_type nitems, bfd *abfd)); +extern int bfd_seek PARAMS ((bfd *abfd, file_ptr fp, int direction)); +extern long bfd_tell PARAMS ((bfd *abfd)); +extern int bfd_flush PARAMS ((bfd *abfd)); +extern int bfd_stat PARAMS ((bfd *abfd, struct stat *)); + + +/* Cast from const char * to char * so that caller can assign to + a char * without a warning. */ +#define bfd_get_filename(abfd) ((char *) (abfd)->filename) +#define bfd_get_cacheable(abfd) ((abfd)->cacheable) +#define bfd_get_format(abfd) ((abfd)->format) +#define bfd_get_target(abfd) ((abfd)->xvec->name) +#define bfd_get_flavour(abfd) ((abfd)->xvec->flavour) +#define bfd_big_endian(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG) +#define bfd_little_endian(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_LITTLE) +#define bfd_header_big_endian(abfd) \ + ((abfd)->xvec->header_byteorder == BFD_ENDIAN_BIG) +#define bfd_header_little_endian(abfd) \ + ((abfd)->xvec->header_byteorder == BFD_ENDIAN_LITTLE) +#define bfd_get_file_flags(abfd) ((abfd)->flags) +#define bfd_applicable_file_flags(abfd) ((abfd)->xvec->object_flags) +#define bfd_applicable_section_flags(abfd) ((abfd)->xvec->section_flags) +#define bfd_my_archive(abfd) ((abfd)->my_archive) +#define bfd_has_map(abfd) ((abfd)->has_armap) + +#define bfd_valid_reloc_types(abfd) ((abfd)->xvec->valid_reloc_types) +#define bfd_usrdata(abfd) ((abfd)->usrdata) + +#define bfd_get_start_address(abfd) ((abfd)->start_address) +#define bfd_get_symcount(abfd) ((abfd)->symcount) +#define bfd_get_outsymbols(abfd) ((abfd)->outsymbols) +#define bfd_count_sections(abfd) ((abfd)->section_count) + +#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char) + +#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = (boolean)(bool)), true) + +extern boolean bfd_record_phdr + PARAMS ((bfd *, unsigned long, boolean, flagword, boolean, bfd_vma, + boolean, boolean, unsigned int, struct sec **)); + +/* Byte swapping routines. */ + +bfd_vma bfd_getb64 PARAMS ((const unsigned char *)); +bfd_vma bfd_getl64 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getb_signed_64 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getl_signed_64 PARAMS ((const unsigned char *)); +bfd_vma bfd_getb32 PARAMS ((const unsigned char *)); +bfd_vma bfd_getl32 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getb_signed_32 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getl_signed_32 PARAMS ((const unsigned char *)); +bfd_vma bfd_getb16 PARAMS ((const unsigned char *)); +bfd_vma bfd_getl16 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getb_signed_16 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getl_signed_16 PARAMS ((const unsigned char *)); +void bfd_putb64 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putl64 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putb32 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putl32 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putb16 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putl16 PARAMS ((bfd_vma, unsigned char *)); + +/* Externally visible ECOFF routines. */ + +#if defined(__STDC__) || defined(ALMOST_STDC) +struct ecoff_debug_info; +struct ecoff_debug_swap; +struct ecoff_extr; +struct symbol_cache_entry; +struct bfd_link_info; +struct bfd_link_hash_entry; +struct bfd_elf_version_tree; +#endif +extern bfd_vma bfd_ecoff_get_gp_value PARAMS ((bfd * abfd)); +extern boolean bfd_ecoff_set_gp_value PARAMS ((bfd *abfd, bfd_vma gp_value)); +extern boolean bfd_ecoff_set_regmasks + PARAMS ((bfd *abfd, unsigned long gprmask, unsigned long fprmask, + unsigned long *cprmask)); +extern PTR bfd_ecoff_debug_init + PARAMS ((bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, + struct bfd_link_info *)); +extern void bfd_ecoff_debug_free + PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, + struct bfd_link_info *)); +extern boolean bfd_ecoff_debug_accumulate + PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, + bfd *input_bfd, struct ecoff_debug_info *input_debug, + const struct ecoff_debug_swap *input_swap, + struct bfd_link_info *)); +extern boolean bfd_ecoff_debug_accumulate_other + PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, bfd *input_bfd, + struct bfd_link_info *)); +extern boolean bfd_ecoff_debug_externals + PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap, + boolean relocateable, + boolean (*get_extr) (struct symbol_cache_entry *, + struct ecoff_extr *), + void (*set_index) (struct symbol_cache_entry *, + bfd_size_type))); +extern boolean bfd_ecoff_debug_one_external + PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap, + const char *name, struct ecoff_extr *esym)); +extern bfd_size_type bfd_ecoff_debug_size + PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap)); +extern boolean bfd_ecoff_write_debug + PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap, file_ptr where)); +extern boolean bfd_ecoff_write_accumulated_debug + PARAMS ((PTR handle, bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap, + struct bfd_link_info *info, file_ptr where)); +extern boolean bfd_mips_ecoff_create_embedded_relocs + PARAMS ((bfd *, struct bfd_link_info *, struct sec *, struct sec *, + char **)); + +/* Externally visible ELF routines. */ + +struct bfd_link_needed_list +{ + struct bfd_link_needed_list *next; + bfd *by; + const char *name; +}; + +extern boolean bfd_elf32_record_link_assignment + PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean)); +extern boolean bfd_elf64_record_link_assignment + PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean)); +extern struct bfd_link_needed_list *bfd_elf_get_needed_list + PARAMS ((bfd *, struct bfd_link_info *)); +extern boolean bfd_elf_get_bfd_needed_list + PARAMS ((bfd *, struct bfd_link_needed_list **)); +extern boolean bfd_elf32_size_dynamic_sections + PARAMS ((bfd *, const char *, const char *, boolean, const char *, + const char * const *, struct bfd_link_info *, struct sec **, + struct bfd_elf_version_tree *)); +extern boolean bfd_elf64_size_dynamic_sections + PARAMS ((bfd *, const char *, const char *, boolean, const char *, + const char * const *, struct bfd_link_info *, struct sec **, + struct bfd_elf_version_tree *)); +extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *)); +extern const char *bfd_elf_get_dt_soname PARAMS ((bfd *)); + +/* Return an upper bound on the number of bytes required to store a + copy of ABFD's program header table entries. Return -1 if an error + occurs; bfd_get_error will return an appropriate code. */ +extern long bfd_get_elf_phdr_upper_bound PARAMS ((bfd *abfd)); + +/* Copy ABFD's program header table entries to *PHDRS. The entries + will be stored as an array of Elf_Internal_Phdr structures, as + defined in include/elf/internal.h. To find out how large the + buffer needs to be, call bfd_get_elf_phdr_upper_bound. + + Return the number of program header table entries read, or -1 if an + error occurs; bfd_get_error will return an appropriate code. */ +extern int bfd_get_elf_phdrs PARAMS ((bfd *abfd, void *phdrs)); + +/* SunOS shared library support routines for the linker. */ + +extern struct bfd_link_needed_list *bfd_sunos_get_needed_list + PARAMS ((bfd *, struct bfd_link_info *)); +extern boolean bfd_sunos_record_link_assignment + PARAMS ((bfd *, struct bfd_link_info *, const char *)); +extern boolean bfd_sunos_size_dynamic_sections + PARAMS ((bfd *, struct bfd_link_info *, struct sec **, struct sec **, + struct sec **)); + +/* Linux shared library support routines for the linker. */ + +extern boolean bfd_i386linux_size_dynamic_sections + PARAMS ((bfd *, struct bfd_link_info *)); +extern boolean bfd_m68klinux_size_dynamic_sections + PARAMS ((bfd *, struct bfd_link_info *)); +extern boolean bfd_sparclinux_size_dynamic_sections + PARAMS ((bfd *, struct bfd_link_info *)); + +/* mmap hacks */ + +struct _bfd_window_internal; +typedef struct _bfd_window_internal bfd_window_internal; + +typedef struct _bfd_window { + /* What the user asked for. */ + PTR data; + bfd_size_type size; + /* The actual window used by BFD. Small user-requested read-only + regions sharing a page may share a single window into the object + file. Read-write versions shouldn't until I've fixed things to + keep track of which portions have been claimed by the + application; don't want to give the same region back when the + application wants two writable copies! */ + struct _bfd_window_internal *i; +} bfd_window; + +extern void bfd_init_window PARAMS ((bfd_window *)); +extern void bfd_free_window PARAMS ((bfd_window *)); +extern boolean bfd_get_file_window + PARAMS ((bfd *, file_ptr, bfd_size_type, bfd_window *, boolean)); + +/* XCOFF support routines for the linker. */ + +extern boolean bfd_xcoff_link_record_set + PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, + bfd_size_type)); +extern boolean bfd_xcoff_import_symbol + PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, + bfd_vma, const char *, const char *, const char *)); +extern boolean bfd_xcoff_export_symbol + PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, + boolean)); +extern boolean bfd_xcoff_link_count_reloc + PARAMS ((bfd *, struct bfd_link_info *, const char *)); +extern boolean bfd_xcoff_record_link_assignment + PARAMS ((bfd *, struct bfd_link_info *, const char *)); +extern boolean bfd_xcoff_size_dynamic_sections + PARAMS ((bfd *, struct bfd_link_info *, const char *, const char *, + unsigned long, unsigned long, unsigned long, boolean, + int, boolean, boolean, struct sec **)); + +/* Externally visible COFF routines. */ + +#if defined(__STDC__) || defined(ALMOST_STDC) +struct internal_syment; +union internal_auxent; +#endif + +extern boolean bfd_coff_get_syment + PARAMS ((bfd *, struct symbol_cache_entry *, struct internal_syment *)); + +extern boolean bfd_coff_get_auxent + PARAMS ((bfd *, struct symbol_cache_entry *, int, union internal_auxent *)); + +extern boolean bfd_coff_set_symbol_class + PARAMS ((bfd *, struct symbol_cache_entry *, unsigned int)); + +/* ARM Interworking support. Called from linker. */ +extern boolean bfd_arm_allocate_interworking_sections + PARAMS ((struct bfd_link_info *)); + +extern boolean bfd_arm_process_before_allocation + PARAMS ((bfd *, struct bfd_link_info *, int)); + +extern boolean bfd_arm_get_bfd_for_interworking + PARAMS ((bfd *, struct bfd_link_info *)); + +/* PE ARM Interworking support. Called from linker. */ +extern boolean bfd_arm_pe_allocate_interworking_sections + PARAMS ((struct bfd_link_info *)); + +extern boolean bfd_arm_pe_process_before_allocation + PARAMS ((bfd *, struct bfd_link_info *, int)); + +extern boolean bfd_arm_pe_get_bfd_for_interworking + PARAMS ((bfd *, struct bfd_link_info *)); + +/* ELF ARM Interworking support. Called from linker. */ +extern boolean bfd_elf32_arm_allocate_interworking_sections + PARAMS ((struct bfd_link_info *)); + +extern boolean bfd_elf32_arm_process_before_allocation + PARAMS ((bfd *, struct bfd_link_info *, int)); + +extern boolean bfd_elf32_arm_get_bfd_for_interworking + PARAMS ((bfd *, struct bfd_link_info *)); + +/* And more from the source. */ +void +bfd_init PARAMS ((void)); + +bfd * +bfd_openr PARAMS ((CONST char *filename, CONST char *target)); + +bfd * +bfd_fdopenr PARAMS ((CONST char *filename, CONST char *target, int fd)); + +bfd * +bfd_openstreamr PARAMS ((const char *, const char *, PTR)); + +bfd * +bfd_openw PARAMS ((CONST char *filename, CONST char *target)); + +boolean +bfd_close PARAMS ((bfd *abfd)); + +boolean +bfd_close_all_done PARAMS ((bfd *)); + +bfd * +bfd_create PARAMS ((CONST char *filename, bfd *templ)); + +boolean +bfd_make_writable PARAMS ((bfd *abfd)); + +boolean +bfd_make_readable PARAMS ((bfd *abfd)); + + + /* Byte swapping macros for user section data. */ + +#define bfd_put_8(abfd, val, ptr) \ + ((void) (*((unsigned char *)(ptr)) = (unsigned char)(val))) +#define bfd_put_signed_8 \ + bfd_put_8 +#define bfd_get_8(abfd, ptr) \ + (*(unsigned char *)(ptr)) +#define bfd_get_signed_8(abfd, ptr) \ + ((*(unsigned char *)(ptr) ^ 0x80) - 0x80) + +#define bfd_put_16(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_putx16, ((val),(ptr))) +#define bfd_put_signed_16 \ + bfd_put_16 +#define bfd_get_16(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx16, (ptr)) +#define bfd_get_signed_16(abfd, ptr) \ + BFD_SEND (abfd, bfd_getx_signed_16, (ptr)) + +#define bfd_put_32(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_putx32, ((val),(ptr))) +#define bfd_put_signed_32 \ + bfd_put_32 +#define bfd_get_32(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx32, (ptr)) +#define bfd_get_signed_32(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx_signed_32, (ptr)) + +#define bfd_put_64(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_putx64, ((val), (ptr))) +#define bfd_put_signed_64 \ + bfd_put_64 +#define bfd_get_64(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx64, (ptr)) +#define bfd_get_signed_64(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx_signed_64, (ptr)) + +#define bfd_get(bits, abfd, ptr) \ + ((bits) == 8 ? bfd_get_8 (abfd, ptr) \ + : (bits) == 16 ? bfd_get_16 (abfd, ptr) \ + : (bits) == 32 ? bfd_get_32 (abfd, ptr) \ + : (bits) == 64 ? bfd_get_64 (abfd, ptr) \ + : (abort (), (bfd_vma) - 1)) + +#define bfd_put(bits, abfd, val, ptr) \ + ((bits) == 8 ? bfd_put_8 (abfd, val, ptr) \ + : (bits) == 16 ? bfd_put_16 (abfd, val, ptr) \ + : (bits) == 32 ? bfd_put_32 (abfd, val, ptr) \ + : (bits) == 64 ? bfd_put_64 (abfd, val, ptr) \ + : (abort (), (void) 0)) + + + /* Byte swapping macros for file header data. */ + +#define bfd_h_put_8(abfd, val, ptr) \ + bfd_put_8 (abfd, val, ptr) +#define bfd_h_put_signed_8(abfd, val, ptr) \ + bfd_put_8 (abfd, val, ptr) +#define bfd_h_get_8(abfd, ptr) \ + bfd_get_8 (abfd, ptr) +#define bfd_h_get_signed_8(abfd, ptr) \ + bfd_get_signed_8 (abfd, ptr) + +#define bfd_h_put_16(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_h_putx16,(val,ptr)) +#define bfd_h_put_signed_16 \ + bfd_h_put_16 +#define bfd_h_get_16(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx16,(ptr)) +#define bfd_h_get_signed_16(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx_signed_16, (ptr)) + +#define bfd_h_put_32(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_h_putx32,(val,ptr)) +#define bfd_h_put_signed_32 \ + bfd_h_put_32 +#define bfd_h_get_32(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx32,(ptr)) +#define bfd_h_get_signed_32(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx_signed_32, (ptr)) + +#define bfd_h_put_64(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_h_putx64,(val, ptr)) +#define bfd_h_put_signed_64 \ + bfd_h_put_64 +#define bfd_h_get_64(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx64,(ptr)) +#define bfd_h_get_signed_64(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx_signed_64, (ptr)) + + /* This structure is used for a comdat section, as in PE. A comdat + section is associated with a particular symbol. When the linker + sees a comdat section, it keeps only one of the sections with a + given name and associated with a given symbol. */ + +struct bfd_comdat_info +{ + /* The name of the symbol associated with a comdat section. */ + const char *name; + + /* The local symbol table index of the symbol associated with a + comdat section. This is only meaningful to the object file format + specific code; it is not an index into the list returned by + bfd_canonicalize_symtab. */ + long symbol; + + /* If this section is being discarded, the linker uses this field + to point to the input section which is being kept. */ + struct sec *sec; +}; + +typedef struct sec +{ + /* The name of the section; the name isn't a copy, the pointer is + the same as that passed to bfd_make_section. */ + + CONST char *name; + + /* Which section is it; 0..nth. */ + + int index; + + /* The next section in the list belonging to the BFD, or NULL. */ + + struct sec *next; + + /* The field flags contains attributes of the section. Some + flags are read in from the object file, and some are + synthesized from other information. */ + + flagword flags; + +#define SEC_NO_FLAGS 0x000 + + /* Tells the OS to allocate space for this section when loading. + This is clear for a section containing debug information + only. */ +#define SEC_ALLOC 0x001 + + /* Tells the OS to load the section from the file when loading. + This is clear for a .bss section. */ +#define SEC_LOAD 0x002 + + /* The section contains data still to be relocated, so there is + some relocation information too. */ +#define SEC_RELOC 0x004 + +#if 0 /* Obsolete ? */ +#define SEC_BALIGN 0x008 +#endif + + /* A signal to the OS that the section contains read only + data. */ +#define SEC_READONLY 0x010 + + /* The section contains code only. */ +#define SEC_CODE 0x020 + + /* The section contains data only. */ +#define SEC_DATA 0x040 + + /* The section will reside in ROM. */ +#define SEC_ROM 0x080 + + /* The section contains constructor information. This section + type is used by the linker to create lists of constructors and + destructors used by <>. When a back end sees a symbol + which should be used in a constructor list, it creates a new + section for the type of name (e.g., <<__CTOR_LIST__>>), attaches + the symbol to it, and builds a relocation. To build the lists + of constructors, all the linker has to do is catenate all the + sections called <<__CTOR_LIST__>> and relocate the data + contained within - exactly the operations it would peform on + standard data. */ +#define SEC_CONSTRUCTOR 0x100 + + /* The section is a constructor, and should be placed at the + end of the text, data, or bss section(?). */ +#define SEC_CONSTRUCTOR_TEXT 0x1100 +#define SEC_CONSTRUCTOR_DATA 0x2100 +#define SEC_CONSTRUCTOR_BSS 0x3100 + + /* The section has contents - a data section could be + <> | <>; a debug section could be + <> */ +#define SEC_HAS_CONTENTS 0x200 + + /* An instruction to the linker to not output the section + even if it has information which would normally be written. */ +#define SEC_NEVER_LOAD 0x400 + + /* The section is a COFF shared library section. This flag is + only for the linker. If this type of section appears in + the input file, the linker must copy it to the output file + without changing the vma or size. FIXME: Although this + was originally intended to be general, it really is COFF + specific (and the flag was renamed to indicate this). It + might be cleaner to have some more general mechanism to + allow the back end to control what the linker does with + sections. */ +#define SEC_COFF_SHARED_LIBRARY 0x800 + + /* The section contains common symbols (symbols may be defined + multiple times, the value of a symbol is the amount of + space it requires, and the largest symbol value is the one + used). Most targets have exactly one of these (which we + translate to bfd_com_section_ptr), but ECOFF has two. */ +#define SEC_IS_COMMON 0x8000 + + /* The section contains only debugging information. For + example, this is set for ELF .debug and .stab sections. + strip tests this flag to see if a section can be + discarded. */ +#define SEC_DEBUGGING 0x10000 + + /* The contents of this section are held in memory pointed to + by the contents field. This is checked by + bfd_get_section_contents, and the data is retrieved from + memory if appropriate. */ +#define SEC_IN_MEMORY 0x20000 + + /* The contents of this section are to be excluded by the + linker for executable and shared objects unless those + objects are to be further relocated. */ +#define SEC_EXCLUDE 0x40000 + + /* The contents of this section are to be sorted by the + based on the address specified in the associated symbol + table. */ +#define SEC_SORT_ENTRIES 0x80000 + + /* When linking, duplicate sections of the same name should be + discarded, rather than being combined into a single section as + is usually done. This is similar to how common symbols are + handled. See SEC_LINK_DUPLICATES below. */ +#define SEC_LINK_ONCE 0x100000 + + /* If SEC_LINK_ONCE is set, this bitfield describes how the linker + should handle duplicate sections. */ +#define SEC_LINK_DUPLICATES 0x600000 + + /* This value for SEC_LINK_DUPLICATES means that duplicate + sections with the same name should simply be discarded. */ +#define SEC_LINK_DUPLICATES_DISCARD 0x0 + + /* This value for SEC_LINK_DUPLICATES means that the linker + should warn if there are any duplicate sections, although + it should still only link one copy. */ +#define SEC_LINK_DUPLICATES_ONE_ONLY 0x200000 + + /* This value for SEC_LINK_DUPLICATES means that the linker + should warn if any duplicate sections are a different size. */ +#define SEC_LINK_DUPLICATES_SAME_SIZE 0x400000 + + /* This value for SEC_LINK_DUPLICATES means that the linker + should warn if any duplicate sections contain different + contents. */ +#define SEC_LINK_DUPLICATES_SAME_CONTENTS 0x600000 + + /* This section was created by the linker as part of dynamic + relocation or other arcane processing. It is skipped when + going through the first-pass output, trusting that someone + else up the line will take care of it later. */ +#define SEC_LINKER_CREATED 0x800000 + + /* This section should not be subject to garbage collection. */ +#define SEC_KEEP 0x1000000 + + /* This section contains "short" data, and should be placed + "near" the GP. */ +#define SEC_SMALL_DATA 0x2000000 + + /* This section contains data which may be shared with other + executables or shared objects. */ +#define SEC_SHARED 0x4000000 + + /* End of section flags. */ + + /* Some internal packed boolean fields. */ + + /* See the vma field. */ + unsigned int user_set_vma : 1; + + /* Whether relocations have been processed. */ + unsigned int reloc_done : 1; + + /* A mark flag used by some of the linker backends. */ + unsigned int linker_mark : 1; + + /* A mark flag used by some linker backends for garbage collection. */ + unsigned int gc_mark : 1; + + /* End of internal packed boolean fields. */ + + /* The virtual memory address of the section - where it will be + at run time. The symbols are relocated against this. The + user_set_vma flag is maintained by bfd; if it's not set, the + backend can assign addresses (for example, in <>, where + the default address for <<.data>> is dependent on the specific + target and various flags). */ + + bfd_vma vma; + + /* The load address of the section - where it would be in a + rom image; really only used for writing section header + information. */ + + bfd_vma lma; + + /* The size of the section in octets, as it will be output. + Contains a value even if the section has no contents (e.g., the + size of <<.bss>>). This will be filled in after relocation. */ + + bfd_size_type _cooked_size; + + /* The original size on disk of the section, in octets. Normally this + value is the same as the size, but if some relaxing has + been done, then this value will be bigger. */ + + bfd_size_type _raw_size; + + /* If this section is going to be output, then this value is the + offset in *bytes* into the output section of the first byte in the + input section (byte ==> smallest addressable unit on the + target). In most cases, if this was going to start at the + 100th octet (8-bit quantity) in the output section, this value + would be 100. However, if the target byte size is 16 bits + (bfd_octets_per_byte is "2"), this value would be 50. */ + + bfd_vma output_offset; + + /* The output section through which to map on output. */ + + struct sec *output_section; + + /* The alignment requirement of the section, as an exponent of 2 - + e.g., 3 aligns to 2^3 (or 8). */ + + unsigned int alignment_power; + + /* If an input section, a pointer to a vector of relocation + records for the data in this section. */ + + struct reloc_cache_entry *relocation; + + /* If an output section, a pointer to a vector of pointers to + relocation records for the data in this section. */ + + struct reloc_cache_entry **orelocation; + + /* The number of relocation records in one of the above */ + + unsigned reloc_count; + + /* Information below is back end specific - and not always used + or updated. */ + + /* File position of section data */ + + file_ptr filepos; + + /* File position of relocation info */ + + file_ptr rel_filepos; + + /* File position of line data */ + + file_ptr line_filepos; + + /* Pointer to data for applications */ + + PTR userdata; + + /* If the SEC_IN_MEMORY flag is set, this points to the actual + contents. */ + unsigned char *contents; + + /* Attached line number information */ + + alent *lineno; + + /* Number of line number records */ + + unsigned int lineno_count; + + /* Optional information about a COMDAT entry; NULL if not COMDAT */ + + struct bfd_comdat_info *comdat; + + /* When a section is being output, this value changes as more + linenumbers are written out */ + + file_ptr moving_line_filepos; + + /* What the section number is in the target world */ + + int target_index; + + PTR used_by_bfd; + + /* If this is a constructor section then here is a list of the + relocations created to relocate items within it. */ + + struct relent_chain *constructor_chain; + + /* The BFD which owns the section. */ + + bfd *owner; + + /* A symbol which points at this section only */ + struct symbol_cache_entry *symbol; + struct symbol_cache_entry **symbol_ptr_ptr; + + struct bfd_link_order *link_order_head; + struct bfd_link_order *link_order_tail; +} asection ; + + /* These sections are global, and are managed by BFD. The application + and target back end are not permitted to change the values in + these sections. New code should use the section_ptr macros rather + than referring directly to the const sections. The const sections + may eventually vanish. */ +#define BFD_ABS_SECTION_NAME "*ABS*" +#define BFD_UND_SECTION_NAME "*UND*" +#define BFD_COM_SECTION_NAME "*COM*" +#define BFD_IND_SECTION_NAME "*IND*" + + /* the absolute section */ +extern const asection bfd_abs_section; +#define bfd_abs_section_ptr ((asection *) &bfd_abs_section) +#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr) + /* Pointer to the undefined section */ +extern const asection bfd_und_section; +#define bfd_und_section_ptr ((asection *) &bfd_und_section) +#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr) + /* Pointer to the common section */ +extern const asection bfd_com_section; +#define bfd_com_section_ptr ((asection *) &bfd_com_section) + /* Pointer to the indirect section */ +extern const asection bfd_ind_section; +#define bfd_ind_section_ptr ((asection *) &bfd_ind_section) +#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr) + +extern const struct symbol_cache_entry * const bfd_abs_symbol; +extern const struct symbol_cache_entry * const bfd_com_symbol; +extern const struct symbol_cache_entry * const bfd_und_symbol; +extern const struct symbol_cache_entry * const bfd_ind_symbol; +#define bfd_get_section_size_before_reloc(section) \ + ((section)->reloc_done ? (abort (), (bfd_size_type) 1) \ + : (section)->_raw_size) +#define bfd_get_section_size_after_reloc(section) \ + ((section)->reloc_done ? (section)->_cooked_size \ + : (abort (), (bfd_size_type) 1)) +asection * +bfd_get_section_by_name PARAMS ((bfd *abfd, CONST char *name)); + +asection * +bfd_make_section_old_way PARAMS ((bfd *abfd, CONST char *name)); + +asection * +bfd_make_section_anyway PARAMS ((bfd *abfd, CONST char *name)); + +asection * +bfd_make_section PARAMS ((bfd *, CONST char *name)); + +boolean +bfd_set_section_flags PARAMS ((bfd *abfd, asection *sec, flagword flags)); + +void +bfd_map_over_sections PARAMS ((bfd *abfd, + void (*func)(bfd *abfd, + asection *sect, + PTR obj), + PTR obj)); + +boolean +bfd_set_section_size PARAMS ((bfd *abfd, asection *sec, bfd_size_type val)); + +boolean +bfd_set_section_contents + PARAMS ((bfd *abfd, + asection *section, + PTR data, + file_ptr offset, + bfd_size_type count)); + +boolean +bfd_get_section_contents + PARAMS ((bfd *abfd, asection *section, PTR location, + file_ptr offset, bfd_size_type count)); + +boolean +bfd_copy_private_section_data PARAMS ((bfd *ibfd, asection *isec, bfd *obfd, asection *osec)); + +#define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \ + BFD_SEND (obfd, _bfd_copy_private_section_data, \ + (ibfd, isection, obfd, osection)) +void +_bfd_strip_section_from_output + PARAMS ((struct bfd_link_info *info, asection *section)); + +enum bfd_architecture +{ + bfd_arch_unknown, /* File arch not known */ + bfd_arch_obscure, /* Arch known, not one of these */ + bfd_arch_m68k, /* Motorola 68xxx */ +#define bfd_mach_m68000 1 +#define bfd_mach_m68008 2 +#define bfd_mach_m68010 3 +#define bfd_mach_m68020 4 +#define bfd_mach_m68030 5 +#define bfd_mach_m68040 6 +#define bfd_mach_m68060 7 +#define bfd_mach_cpu32 8 + bfd_arch_vax, /* DEC Vax */ + bfd_arch_i960, /* Intel 960 */ + /* The order of the following is important. + lower number indicates a machine type that + only accepts a subset of the instructions + available to machines with higher numbers. + The exception is the "ca", which is + incompatible with all other machines except + "core". */ + +#define bfd_mach_i960_core 1 +#define bfd_mach_i960_ka_sa 2 +#define bfd_mach_i960_kb_sb 3 +#define bfd_mach_i960_mc 4 +#define bfd_mach_i960_xa 5 +#define bfd_mach_i960_ca 6 +#define bfd_mach_i960_jx 7 +#define bfd_mach_i960_hx 8 + + bfd_arch_a29k, /* AMD 29000 */ + bfd_arch_sparc, /* SPARC */ +#define bfd_mach_sparc 1 + /* The difference between v8plus and v9 is that v9 is a true 64 bit env. */ +#define bfd_mach_sparc_sparclet 2 +#define bfd_mach_sparc_sparclite 3 +#define bfd_mach_sparc_v8plus 4 +#define bfd_mach_sparc_v8plusa 5 /* with ultrasparc add'ns */ +#define bfd_mach_sparc_sparclite_le 6 +#define bfd_mach_sparc_v9 7 +#define bfd_mach_sparc_v9a 8 /* with ultrasparc add'ns */ + /* Nonzero if MACH has the v9 instruction set. */ +#define bfd_mach_sparc_v9_p(mach) \ + ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9a) + bfd_arch_mips, /* MIPS Rxxxx */ +#define bfd_mach_mips3000 3000 +#define bfd_mach_mips3900 3900 +#define bfd_mach_mips4000 4000 +#define bfd_mach_mips4010 4010 +#define bfd_mach_mips4100 4100 +#define bfd_mach_mips4111 4111 +#define bfd_mach_mips4300 4300 +#define bfd_mach_mips4400 4400 +#define bfd_mach_mips4600 4600 +#define bfd_mach_mips4650 4650 +#define bfd_mach_mips5000 5000 +#define bfd_mach_mips6000 6000 +#define bfd_mach_mips8000 8000 +#define bfd_mach_mips10000 10000 +#define bfd_mach_mips16 16 + bfd_arch_i386, /* Intel 386 */ +#define bfd_mach_i386_i386 0 +#define bfd_mach_i386_i8086 1 +#define bfd_mach_i386_i386_intel_syntax 2 + bfd_arch_we32k, /* AT&T WE32xxx */ + bfd_arch_tahoe, /* CCI/Harris Tahoe */ + bfd_arch_i860, /* Intel 860 */ + bfd_arch_i370, /* IBM 360/370 Mainframes */ + bfd_arch_romp, /* IBM ROMP PC/RT */ + bfd_arch_alliant, /* Alliant */ + bfd_arch_convex, /* Convex */ + bfd_arch_m88k, /* Motorola 88xxx */ + bfd_arch_pyramid, /* Pyramid Technology */ + bfd_arch_h8300, /* Hitachi H8/300 */ +#define bfd_mach_h8300 1 +#define bfd_mach_h8300h 2 +#define bfd_mach_h8300s 3 + bfd_arch_powerpc, /* PowerPC */ + bfd_arch_rs6000, /* IBM RS/6000 */ + bfd_arch_hppa, /* HP PA RISC */ + bfd_arch_d10v, /* Mitsubishi D10V */ +#define bfd_mach_d10v 0 +#define bfd_mach_d10v_ts2 2 +#define bfd_mach_d10v_ts3 3 + bfd_arch_d30v, /* Mitsubishi D30V */ + bfd_arch_z8k, /* Zilog Z8000 */ +#define bfd_mach_z8001 1 +#define bfd_mach_z8002 2 + bfd_arch_h8500, /* Hitachi H8/500 */ + bfd_arch_sh, /* Hitachi SH */ +#define bfd_mach_sh 0 +#define bfd_mach_sh2 0x20 +#define bfd_mach_sh_dsp 0x2d +#define bfd_mach_sh3 0x30 +#define bfd_mach_sh3_dsp 0x3d +#define bfd_mach_sh3e 0x3e +#define bfd_mach_sh4 0x40 + bfd_arch_alpha, /* Dec Alpha */ +#define bfd_mach_alpha_ev4 0x10 +#define bfd_mach_alpha_ev5 0x20 +#define bfd_mach_alpha_ev6 0x30 + bfd_arch_arm, /* Advanced Risc Machines ARM */ +#define bfd_mach_arm_2 1 +#define bfd_mach_arm_2a 2 +#define bfd_mach_arm_3 3 +#define bfd_mach_arm_3M 4 +#define bfd_mach_arm_4 5 +#define bfd_mach_arm_4T 6 +#define bfd_mach_arm_5 7 +#define bfd_mach_arm_5T 8 + bfd_arch_ns32k, /* National Semiconductors ns32000 */ + bfd_arch_w65, /* WDC 65816 */ + bfd_arch_tic30, /* Texas Instruments TMS320C30 */ + bfd_arch_tic80, /* TI TMS320c80 (MVP) */ + bfd_arch_v850, /* NEC V850 */ +#define bfd_mach_v850 0 +#define bfd_mach_v850e 'E' +#define bfd_mach_v850ea 'A' + bfd_arch_arc, /* Argonaut RISC Core */ +#define bfd_mach_arc_base 0 + bfd_arch_m32r, /* Mitsubishi M32R/D */ +#define bfd_mach_m32r 0 /* backwards compatibility */ +#define bfd_mach_m32rx 'x' + bfd_arch_mn10200, /* Matsushita MN10200 */ + bfd_arch_mn10300, /* Matsushita MN10300 */ +#define bfd_mach_mn10300 300 +#define bfd_mach_am33 330 + bfd_arch_fr30, +#define bfd_mach_fr30 0x46523330 + bfd_arch_mcore, + bfd_arch_pj, + bfd_arch_avr, /* Atmel AVR microcontrollers */ +#define bfd_mach_avr1 1 +#define bfd_mach_avr2 2 +#define bfd_mach_avr3 3 +#define bfd_mach_avr4 4 + bfd_arch_last + }; + +typedef struct bfd_arch_info +{ + int bits_per_word; + int bits_per_address; + int bits_per_byte; + enum bfd_architecture arch; + unsigned long mach; + const char *arch_name; + const char *printable_name; + unsigned int section_align_power; + /* true if this is the default machine for the architecture */ + boolean the_default; + const struct bfd_arch_info * (*compatible) + PARAMS ((const struct bfd_arch_info *a, + const struct bfd_arch_info *b)); + + boolean (*scan) PARAMS ((const struct bfd_arch_info *, const char *)); + + const struct bfd_arch_info *next; +} bfd_arch_info_type; +const char * +bfd_printable_name PARAMS ((bfd *abfd)); + +const bfd_arch_info_type * +bfd_scan_arch PARAMS ((const char *string)); + +const char ** +bfd_arch_list PARAMS ((void)); + +const bfd_arch_info_type * +bfd_arch_get_compatible PARAMS (( + const bfd *abfd, + const bfd *bbfd)); + +void +bfd_set_arch_info PARAMS ((bfd *abfd, const bfd_arch_info_type *arg)); + +enum bfd_architecture +bfd_get_arch PARAMS ((bfd *abfd)); + +unsigned long +bfd_get_mach PARAMS ((bfd *abfd)); + +unsigned int +bfd_arch_bits_per_byte PARAMS ((bfd *abfd)); + +unsigned int +bfd_arch_bits_per_address PARAMS ((bfd *abfd)); + +const bfd_arch_info_type * +bfd_get_arch_info PARAMS ((bfd *abfd)); + +const bfd_arch_info_type * +bfd_lookup_arch + PARAMS ((enum bfd_architecture + arch, + unsigned long machine)); + +const char * +bfd_printable_arch_mach + PARAMS ((enum bfd_architecture arch, unsigned long machine)); + +unsigned int +bfd_octets_per_byte PARAMS ((bfd *abfd)); + +unsigned int +bfd_arch_mach_octets_per_byte PARAMS ((enum bfd_architecture arch, + unsigned long machine)); + +typedef enum bfd_reloc_status +{ + /* No errors detected */ + bfd_reloc_ok, + + /* The relocation was performed, but there was an overflow. */ + bfd_reloc_overflow, + + /* The address to relocate was not within the section supplied. */ + bfd_reloc_outofrange, + + /* Used by special functions */ + bfd_reloc_continue, + + /* Unsupported relocation size requested. */ + bfd_reloc_notsupported, + + /* Unused */ + bfd_reloc_other, + + /* The symbol to relocate against was undefined. */ + bfd_reloc_undefined, + + /* The relocation was performed, but may not be ok - presently + generated only when linking i960 coff files with i960 b.out + symbols. If this type is returned, the error_message argument + to bfd_perform_relocation will be set. */ + bfd_reloc_dangerous + } + bfd_reloc_status_type; + + +typedef struct reloc_cache_entry +{ + /* A pointer into the canonical table of pointers */ + struct symbol_cache_entry **sym_ptr_ptr; + + /* offset in section */ + bfd_size_type address; + + /* addend for relocation value */ + bfd_vma addend; + + /* Pointer to how to perform the required relocation */ + reloc_howto_type *howto; + +} arelent; +enum complain_overflow +{ + /* Do not complain on overflow. */ + complain_overflow_dont, + + /* Complain if the bitfield overflows, whether it is considered + as signed or unsigned. */ + complain_overflow_bitfield, + + /* Complain if the value overflows when considered as signed + number. */ + complain_overflow_signed, + + /* Complain if the value overflows when considered as an + unsigned number. */ + complain_overflow_unsigned +}; + +struct reloc_howto_struct +{ + /* The type field has mainly a documentary use - the back end can + do what it wants with it, though normally the back end's + external idea of what a reloc number is stored + in this field. For example, a PC relative word relocation + in a coff environment has the type 023 - because that's + what the outside world calls a R_PCRWORD reloc. */ + unsigned int type; + + /* The value the final relocation is shifted right by. This drops + unwanted data from the relocation. */ + unsigned int rightshift; + + /* The size of the item to be relocated. This is *not* a + power-of-two measure. To get the number of bytes operated + on by a type of relocation, use bfd_get_reloc_size. */ + int size; + + /* The number of bits in the item to be relocated. This is used + when doing overflow checking. */ + unsigned int bitsize; + + /* Notes that the relocation is relative to the location in the + data section of the addend. The relocation function will + subtract from the relocation value the address of the location + being relocated. */ + boolean pc_relative; + + /* The bit position of the reloc value in the destination. + The relocated value is left shifted by this amount. */ + unsigned int bitpos; + + /* What type of overflow error should be checked for when + relocating. */ + enum complain_overflow complain_on_overflow; + + /* If this field is non null, then the supplied function is + called rather than the normal function. This allows really + strange relocation methods to be accomodated (e.g., i960 callj + instructions). */ + bfd_reloc_status_type (*special_function) + PARAMS ((bfd *abfd, + arelent *reloc_entry, + struct symbol_cache_entry *symbol, + PTR data, + asection *input_section, + bfd *output_bfd, + char **error_message)); + + /* The textual name of the relocation type. */ + char *name; + + /* Some formats record a relocation addend in the section contents + rather than with the relocation. For ELF formats this is the + distinction between USE_REL and USE_RELA (though the code checks + for USE_REL == 1/0). The value of this field is TRUE if the + addend is recorded with the section contents; when performing a + partial link (ld -r) the section contents (the data) will be + modified. The value of this field is FALSE if addends are + recorded with the relocation (in arelent.addend); when performing + a partial link the relocation will be modified. + All relocations for all ELF USE_RELA targets should set this field + to FALSE (values of TRUE should be looked on with suspicion). + However, the converse is not true: not all relocations of all ELF + USE_REL targets set this field to TRUE. Why this is so is peculiar + to each particular target. For relocs that aren't used in partial + links (e.g. GOT stuff) it doesn't matter what this is set to. */ + boolean partial_inplace; + + /* The src_mask selects which parts of the read in data + are to be used in the relocation sum. E.g., if this was an 8 bit + byte of data which we read and relocated, this would be + 0x000000ff. When we have relocs which have an addend, such as + sun4 extended relocs, the value in the offset part of a + relocating field is garbage so we never use it. In this case + the mask would be 0x00000000. */ + bfd_vma src_mask; + + /* The dst_mask selects which parts of the instruction are replaced + into the instruction. In most cases src_mask == dst_mask, + except in the above special case, where dst_mask would be + 0x000000ff, and src_mask would be 0x00000000. */ + bfd_vma dst_mask; + + /* When some formats create PC relative instructions, they leave + the value of the pc of the place being relocated in the offset + slot of the instruction, so that a PC relative relocation can + be made just by adding in an ordinary offset (e.g., sun3 a.out). + Some formats leave the displacement part of an instruction + empty (e.g., m88k bcs); this flag signals the fact.*/ + boolean pcrel_offset; + +}; +#define HOWTO(C, R,S,B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \ + {(unsigned)C,R,S,B, P, BI, O,SF,NAME,INPLACE,MASKSRC,MASKDST,PC} +#define NEWHOWTO( FUNCTION, NAME,SIZE,REL,IN) HOWTO(0,0,SIZE,0,REL,0,complain_overflow_dont,FUNCTION, NAME,false,0,0,IN) + +#define EMPTY_HOWTO(C) \ + HOWTO((C),0,0,0,false,0,complain_overflow_dont,NULL,NULL,false,0,0,false) + +#define HOWTO_PREPARE(relocation, symbol) \ + { \ + if (symbol != (asymbol *)NULL) { \ + if (bfd_is_com_section (symbol->section)) { \ + relocation = 0; \ + } \ + else { \ + relocation = symbol->value; \ + } \ + } \ +} +unsigned int +bfd_get_reloc_size PARAMS ((reloc_howto_type *)); + +typedef struct relent_chain { + arelent relent; + struct relent_chain *next; +} arelent_chain; +bfd_reloc_status_type + +bfd_check_overflow + PARAMS ((enum complain_overflow how, + unsigned int bitsize, + unsigned int rightshift, + unsigned int addrsize, + bfd_vma relocation)); + +bfd_reloc_status_type + +bfd_perform_relocation + PARAMS ((bfd *abfd, + arelent *reloc_entry, + PTR data, + asection *input_section, + bfd *output_bfd, + char **error_message)); + +bfd_reloc_status_type + +bfd_install_relocation + PARAMS ((bfd *abfd, + arelent *reloc_entry, + PTR data, bfd_vma data_start, + asection *input_section, + char **error_message)); + +enum bfd_reloc_code_real { + _dummy_first_bfd_reloc_code_real, + + +/* Basic absolute relocations of N bits. */ + BFD_RELOC_64, + BFD_RELOC_32, + BFD_RELOC_26, + BFD_RELOC_24, + BFD_RELOC_16, + BFD_RELOC_14, + BFD_RELOC_8, + +/* PC-relative relocations. Sometimes these are relative to the address +of the relocation itself; sometimes they are relative to the start of +the section containing the relocation. It depends on the specific target. + +The 24-bit relocation is used in some Intel 960 configurations. */ + BFD_RELOC_64_PCREL, + BFD_RELOC_32_PCREL, + BFD_RELOC_24_PCREL, + BFD_RELOC_16_PCREL, + BFD_RELOC_12_PCREL, + BFD_RELOC_8_PCREL, + +/* For ELF. */ + BFD_RELOC_32_GOT_PCREL, + BFD_RELOC_16_GOT_PCREL, + BFD_RELOC_8_GOT_PCREL, + BFD_RELOC_32_GOTOFF, + BFD_RELOC_16_GOTOFF, + BFD_RELOC_LO16_GOTOFF, + BFD_RELOC_HI16_GOTOFF, + BFD_RELOC_HI16_S_GOTOFF, + BFD_RELOC_8_GOTOFF, + BFD_RELOC_32_PLT_PCREL, + BFD_RELOC_24_PLT_PCREL, + BFD_RELOC_16_PLT_PCREL, + BFD_RELOC_8_PLT_PCREL, + BFD_RELOC_32_PLTOFF, + BFD_RELOC_16_PLTOFF, + BFD_RELOC_LO16_PLTOFF, + BFD_RELOC_HI16_PLTOFF, + BFD_RELOC_HI16_S_PLTOFF, + BFD_RELOC_8_PLTOFF, + +/* Relocations used by 68K ELF. */ + BFD_RELOC_68K_GLOB_DAT, + BFD_RELOC_68K_JMP_SLOT, + BFD_RELOC_68K_RELATIVE, + +/* Linkage-table relative. */ + BFD_RELOC_32_BASEREL, + BFD_RELOC_16_BASEREL, + BFD_RELOC_LO16_BASEREL, + BFD_RELOC_HI16_BASEREL, + BFD_RELOC_HI16_S_BASEREL, + BFD_RELOC_8_BASEREL, + BFD_RELOC_RVA, + +/* Absolute 8-bit relocation, but used to form an address like 0xFFnn. */ + BFD_RELOC_8_FFnn, + +/* These PC-relative relocations are stored as word displacements -- +i.e., byte displacements shifted right two bits. The 30-bit word +displacement (<<32_PCREL_S2>> -- 32 bits, shifted 2) is used on the +SPARC. (SPARC tools generally refer to this as <>.) The +signed 16-bit displacement is used on the MIPS, and the 23-bit +displacement is used on the Alpha. */ + BFD_RELOC_32_PCREL_S2, + BFD_RELOC_16_PCREL_S2, + BFD_RELOC_23_PCREL_S2, + +/* High 22 bits and low 10 bits of 32-bit value, placed into lower bits of +the target word. These are used on the SPARC. */ + BFD_RELOC_HI22, + BFD_RELOC_LO10, + +/* For systems that allocate a Global Pointer register, these are +displacements off that register. These relocation types are +handled specially, because the value the register will have is +decided relatively late. */ + BFD_RELOC_GPREL16, + BFD_RELOC_GPREL32, + +/* Reloc types used for i960/b.out. */ + BFD_RELOC_I960_CALLJ, + +/* SPARC ELF relocations. There is probably some overlap with other +relocation types already defined. */ + BFD_RELOC_NONE, + BFD_RELOC_SPARC_WDISP22, + BFD_RELOC_SPARC22, + BFD_RELOC_SPARC13, + BFD_RELOC_SPARC_GOT10, + BFD_RELOC_SPARC_GOT13, + BFD_RELOC_SPARC_GOT22, + BFD_RELOC_SPARC_PC10, + BFD_RELOC_SPARC_PC22, + BFD_RELOC_SPARC_WPLT30, + BFD_RELOC_SPARC_COPY, + BFD_RELOC_SPARC_GLOB_DAT, + BFD_RELOC_SPARC_JMP_SLOT, + BFD_RELOC_SPARC_RELATIVE, + BFD_RELOC_SPARC_UA32, + +/* I think these are specific to SPARC a.out (e.g., Sun 4). */ + BFD_RELOC_SPARC_BASE13, + BFD_RELOC_SPARC_BASE22, + +/* SPARC64 relocations */ +#define BFD_RELOC_SPARC_64 BFD_RELOC_64 + BFD_RELOC_SPARC_10, + BFD_RELOC_SPARC_11, + BFD_RELOC_SPARC_OLO10, + BFD_RELOC_SPARC_HH22, + BFD_RELOC_SPARC_HM10, + BFD_RELOC_SPARC_LM22, + BFD_RELOC_SPARC_PC_HH22, + BFD_RELOC_SPARC_PC_HM10, + BFD_RELOC_SPARC_PC_LM22, + BFD_RELOC_SPARC_WDISP16, + BFD_RELOC_SPARC_WDISP19, + BFD_RELOC_SPARC_7, + BFD_RELOC_SPARC_6, + BFD_RELOC_SPARC_5, +#define BFD_RELOC_SPARC_DISP64 BFD_RELOC_64_PCREL + BFD_RELOC_SPARC_PLT64, + BFD_RELOC_SPARC_HIX22, + BFD_RELOC_SPARC_LOX10, + BFD_RELOC_SPARC_H44, + BFD_RELOC_SPARC_M44, + BFD_RELOC_SPARC_L44, + BFD_RELOC_SPARC_REGISTER, + +/* SPARC little endian relocation */ + BFD_RELOC_SPARC_REV32, + +/* Alpha ECOFF and ELF relocations. Some of these treat the symbol or +"addend" in some special way. +For GPDISP_HI16 ("gpdisp") relocations, the symbol is ignored when +writing; when reading, it will be the absolute section symbol. The +addend is the displacement in bytes of the "lda" instruction from +the "ldah" instruction (which is at the address of this reloc). */ + BFD_RELOC_ALPHA_GPDISP_HI16, + +/* For GPDISP_LO16 ("ignore") relocations, the symbol is handled as +with GPDISP_HI16 relocs. The addend is ignored when writing the +relocations out, and is filled in with the file's GP value on +reading, for convenience. */ + BFD_RELOC_ALPHA_GPDISP_LO16, + +/* The ELF GPDISP relocation is exactly the same as the GPDISP_HI16 +relocation except that there is no accompanying GPDISP_LO16 +relocation. */ + BFD_RELOC_ALPHA_GPDISP, + +/* The Alpha LITERAL/LITUSE relocs are produced by a symbol reference; +the assembler turns it into a LDQ instruction to load the address of +the symbol, and then fills in a register in the real instruction. + +The LITERAL reloc, at the LDQ instruction, refers to the .lita +section symbol. The addend is ignored when writing, but is filled +in with the file's GP value on reading, for convenience, as with the +GPDISP_LO16 reloc. + +The ELF_LITERAL reloc is somewhere between 16_GOTOFF and GPDISP_LO16. +It should refer to the symbol to be referenced, as with 16_GOTOFF, +but it generates output not based on the position within the .got +section, but relative to the GP value chosen for the file during the +final link stage. + +The LITUSE reloc, on the instruction using the loaded address, gives +information to the linker that it might be able to use to optimize +away some literal section references. The symbol is ignored (read +as the absolute section symbol), and the "addend" indicates the type +of instruction using the register: +1 - "memory" fmt insn +2 - byte-manipulation (byte offset reg) +3 - jsr (target of branch) + +The GNU linker currently doesn't do any of this optimizing. */ + BFD_RELOC_ALPHA_LITERAL, + BFD_RELOC_ALPHA_ELF_LITERAL, + BFD_RELOC_ALPHA_LITUSE, + +/* The BFD_RELOC_ALPHA_USER_* relocations are used by the assembler to +process the explicit !!sequence relocations, and are mapped +into the normal relocations at the end of processing. */ + BFD_RELOC_ALPHA_USER_LITERAL, + BFD_RELOC_ALPHA_USER_LITUSE_BASE, + BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF, + BFD_RELOC_ALPHA_USER_LITUSE_JSR, + BFD_RELOC_ALPHA_USER_GPDISP, + BFD_RELOC_ALPHA_USER_GPRELHIGH, + BFD_RELOC_ALPHA_USER_GPRELLOW, + +/* The HINT relocation indicates a value that should be filled into the +"hint" field of a jmp/jsr/ret instruction, for possible branch- +prediction logic which may be provided on some processors. */ + BFD_RELOC_ALPHA_HINT, + +/* The LINKAGE relocation outputs a linkage pair in the object file, +which is filled by the linker. */ + BFD_RELOC_ALPHA_LINKAGE, + +/* The CODEADDR relocation outputs a STO_CA in the object file, +which is filled by the linker. */ + BFD_RELOC_ALPHA_CODEADDR, + +/* Bits 27..2 of the relocation address shifted right 2 bits; +simple reloc otherwise. */ + BFD_RELOC_MIPS_JMP, + +/* The MIPS16 jump instruction. */ + BFD_RELOC_MIPS16_JMP, + +/* MIPS16 GP relative reloc. */ + BFD_RELOC_MIPS16_GPREL, + +/* High 16 bits of 32-bit value; simple reloc. */ + BFD_RELOC_HI16, + +/* High 16 bits of 32-bit value but the low 16 bits will be sign +extended and added to form the final result. If the low 16 +bits form a negative number, we need to add one to the high value +to compensate for the borrow when the low bits are added. */ + BFD_RELOC_HI16_S, + +/* Low 16 bits. */ + BFD_RELOC_LO16, + +/* Like BFD_RELOC_HI16_S, but PC relative. */ + BFD_RELOC_PCREL_HI16_S, + +/* Like BFD_RELOC_LO16, but PC relative. */ + BFD_RELOC_PCREL_LO16, + +/* Relocation relative to the global pointer. */ +#define BFD_RELOC_MIPS_GPREL BFD_RELOC_GPREL16 + +/* Relocation against a MIPS literal section. */ + BFD_RELOC_MIPS_LITERAL, + +/* MIPS ELF relocations. */ + BFD_RELOC_MIPS_GOT16, + BFD_RELOC_MIPS_CALL16, +#define BFD_RELOC_MIPS_GPREL32 BFD_RELOC_GPREL32 + BFD_RELOC_MIPS_GOT_HI16, + BFD_RELOC_MIPS_GOT_LO16, + BFD_RELOC_MIPS_CALL_HI16, + BFD_RELOC_MIPS_CALL_LO16, + BFD_RELOC_MIPS_SUB, + BFD_RELOC_MIPS_GOT_PAGE, + BFD_RELOC_MIPS_GOT_OFST, + BFD_RELOC_MIPS_GOT_DISP, + + +/* i386/elf relocations */ + BFD_RELOC_386_GOT32, + BFD_RELOC_386_PLT32, + BFD_RELOC_386_COPY, + BFD_RELOC_386_GLOB_DAT, + BFD_RELOC_386_JUMP_SLOT, + BFD_RELOC_386_RELATIVE, + BFD_RELOC_386_GOTOFF, + BFD_RELOC_386_GOTPC, + +/* ns32k relocations */ + BFD_RELOC_NS32K_IMM_8, + BFD_RELOC_NS32K_IMM_16, + BFD_RELOC_NS32K_IMM_32, + BFD_RELOC_NS32K_IMM_8_PCREL, + BFD_RELOC_NS32K_IMM_16_PCREL, + BFD_RELOC_NS32K_IMM_32_PCREL, + BFD_RELOC_NS32K_DISP_8, + BFD_RELOC_NS32K_DISP_16, + BFD_RELOC_NS32K_DISP_32, + BFD_RELOC_NS32K_DISP_8_PCREL, + BFD_RELOC_NS32K_DISP_16_PCREL, + BFD_RELOC_NS32K_DISP_32_PCREL, + +/* Picojava relocs. Not all of these appear in object files. */ + BFD_RELOC_PJ_CODE_HI16, + BFD_RELOC_PJ_CODE_LO16, + BFD_RELOC_PJ_CODE_DIR16, + BFD_RELOC_PJ_CODE_DIR32, + BFD_RELOC_PJ_CODE_REL16, + BFD_RELOC_PJ_CODE_REL32, + +/* Power(rs6000) and PowerPC relocations. */ + BFD_RELOC_PPC_B26, + BFD_RELOC_PPC_BA26, + BFD_RELOC_PPC_TOC16, + BFD_RELOC_PPC_B16, + BFD_RELOC_PPC_B16_BRTAKEN, + BFD_RELOC_PPC_B16_BRNTAKEN, + BFD_RELOC_PPC_BA16, + BFD_RELOC_PPC_BA16_BRTAKEN, + BFD_RELOC_PPC_BA16_BRNTAKEN, + BFD_RELOC_PPC_COPY, + BFD_RELOC_PPC_GLOB_DAT, + BFD_RELOC_PPC_JMP_SLOT, + BFD_RELOC_PPC_RELATIVE, + BFD_RELOC_PPC_LOCAL24PC, + BFD_RELOC_PPC_EMB_NADDR32, + BFD_RELOC_PPC_EMB_NADDR16, + BFD_RELOC_PPC_EMB_NADDR16_LO, + BFD_RELOC_PPC_EMB_NADDR16_HI, + BFD_RELOC_PPC_EMB_NADDR16_HA, + BFD_RELOC_PPC_EMB_SDAI16, + BFD_RELOC_PPC_EMB_SDA2I16, + BFD_RELOC_PPC_EMB_SDA2REL, + BFD_RELOC_PPC_EMB_SDA21, + BFD_RELOC_PPC_EMB_MRKREF, + BFD_RELOC_PPC_EMB_RELSEC16, + BFD_RELOC_PPC_EMB_RELST_LO, + BFD_RELOC_PPC_EMB_RELST_HI, + BFD_RELOC_PPC_EMB_RELST_HA, + BFD_RELOC_PPC_EMB_BIT_FLD, + BFD_RELOC_PPC_EMB_RELSDA, + +/* IBM 370/390 relocations */ + BFD_RELOC_I370_D12, + +/* The type of reloc used to build a contructor table - at the moment +probably a 32 bit wide absolute relocation, but the target can choose. +It generally does map to one of the other relocation types. */ + BFD_RELOC_CTOR, + +/* ARM 26 bit pc-relative branch. The lowest two bits must be zero and are +not stored in the instruction. */ + BFD_RELOC_ARM_PCREL_BRANCH, + +/* These relocs are only used within the ARM assembler. They are not +(at present) written to any object files. */ + BFD_RELOC_ARM_IMMEDIATE, + BFD_RELOC_ARM_ADRL_IMMEDIATE, + BFD_RELOC_ARM_OFFSET_IMM, + BFD_RELOC_ARM_SHIFT_IMM, + BFD_RELOC_ARM_SWI, + BFD_RELOC_ARM_MULTI, + BFD_RELOC_ARM_CP_OFF_IMM, + BFD_RELOC_ARM_ADR_IMM, + BFD_RELOC_ARM_LDR_IMM, + BFD_RELOC_ARM_LITERAL, + BFD_RELOC_ARM_IN_POOL, + BFD_RELOC_ARM_OFFSET_IMM8, + BFD_RELOC_ARM_HWLITERAL, + BFD_RELOC_ARM_THUMB_ADD, + BFD_RELOC_ARM_THUMB_IMM, + BFD_RELOC_ARM_THUMB_SHIFT, + BFD_RELOC_ARM_THUMB_OFFSET, + BFD_RELOC_ARM_GOT12, + BFD_RELOC_ARM_GOT32, + BFD_RELOC_ARM_JUMP_SLOT, + BFD_RELOC_ARM_COPY, + BFD_RELOC_ARM_GLOB_DAT, + BFD_RELOC_ARM_PLT32, + BFD_RELOC_ARM_RELATIVE, + BFD_RELOC_ARM_GOTOFF, + BFD_RELOC_ARM_GOTPC, + +/* Hitachi SH relocs. Not all of these appear in object files. */ + BFD_RELOC_SH_PCDISP8BY2, + BFD_RELOC_SH_PCDISP12BY2, + BFD_RELOC_SH_IMM4, + BFD_RELOC_SH_IMM4BY2, + BFD_RELOC_SH_IMM4BY4, + BFD_RELOC_SH_IMM8, + BFD_RELOC_SH_IMM8BY2, + BFD_RELOC_SH_IMM8BY4, + BFD_RELOC_SH_PCRELIMM8BY2, + BFD_RELOC_SH_PCRELIMM8BY4, + BFD_RELOC_SH_SWITCH16, + BFD_RELOC_SH_SWITCH32, + BFD_RELOC_SH_USES, + BFD_RELOC_SH_COUNT, + BFD_RELOC_SH_ALIGN, + BFD_RELOC_SH_CODE, + BFD_RELOC_SH_DATA, + BFD_RELOC_SH_LABEL, + +/* Thumb 23-, 12- and 9-bit pc-relative branches. The lowest bit must +be zero and is not stored in the instruction. */ + BFD_RELOC_THUMB_PCREL_BRANCH9, + BFD_RELOC_THUMB_PCREL_BRANCH12, + BFD_RELOC_THUMB_PCREL_BRANCH23, + +/* Argonaut RISC Core (ARC) relocs. +ARC 22 bit pc-relative branch. The lowest two bits must be zero and are +not stored in the instruction. The high 20 bits are installed in bits 26 +through 7 of the instruction. */ + BFD_RELOC_ARC_B22_PCREL, + +/* ARC 26 bit absolute branch. The lowest two bits must be zero and are not +stored in the instruction. The high 24 bits are installed in bits 23 +through 0. */ + BFD_RELOC_ARC_B26, + +/* Mitsubishi D10V relocs. +This is a 10-bit reloc with the right 2 bits +assumed to be 0. */ + BFD_RELOC_D10V_10_PCREL_R, + +/* Mitsubishi D10V relocs. +This is a 10-bit reloc with the right 2 bits +assumed to be 0. This is the same as the previous reloc +except it is in the left container, i.e., +shifted left 15 bits. */ + BFD_RELOC_D10V_10_PCREL_L, + +/* This is an 18-bit reloc with the right 2 bits +assumed to be 0. */ + BFD_RELOC_D10V_18, + +/* This is an 18-bit reloc with the right 2 bits +assumed to be 0. */ + BFD_RELOC_D10V_18_PCREL, + +/* Mitsubishi D30V relocs. +This is a 6-bit absolute reloc. */ + BFD_RELOC_D30V_6, + +/* This is a 6-bit pc-relative reloc with +the right 3 bits assumed to be 0. */ + BFD_RELOC_D30V_9_PCREL, + +/* This is a 6-bit pc-relative reloc with +the right 3 bits assumed to be 0. Same +as the previous reloc but on the right side +of the container. */ + BFD_RELOC_D30V_9_PCREL_R, + +/* This is a 12-bit absolute reloc with the +right 3 bitsassumed to be 0. */ + BFD_RELOC_D30V_15, + +/* This is a 12-bit pc-relative reloc with +the right 3 bits assumed to be 0. */ + BFD_RELOC_D30V_15_PCREL, + +/* This is a 12-bit pc-relative reloc with +the right 3 bits assumed to be 0. Same +as the previous reloc but on the right side +of the container. */ + BFD_RELOC_D30V_15_PCREL_R, + +/* This is an 18-bit absolute reloc with +the right 3 bits assumed to be 0. */ + BFD_RELOC_D30V_21, + +/* This is an 18-bit pc-relative reloc with +the right 3 bits assumed to be 0. */ + BFD_RELOC_D30V_21_PCREL, + +/* This is an 18-bit pc-relative reloc with +the right 3 bits assumed to be 0. Same +as the previous reloc but on the right side +of the container. */ + BFD_RELOC_D30V_21_PCREL_R, + +/* This is a 32-bit absolute reloc. */ + BFD_RELOC_D30V_32, + +/* This is a 32-bit pc-relative reloc. */ + BFD_RELOC_D30V_32_PCREL, + +/* Mitsubishi M32R relocs. +This is a 24 bit absolute address. */ + BFD_RELOC_M32R_24, + +/* This is a 10-bit pc-relative reloc with the right 2 bits assumed to be 0. */ + BFD_RELOC_M32R_10_PCREL, + +/* This is an 18-bit reloc with the right 2 bits assumed to be 0. */ + BFD_RELOC_M32R_18_PCREL, + +/* This is a 26-bit reloc with the right 2 bits assumed to be 0. */ + BFD_RELOC_M32R_26_PCREL, + +/* This is a 16-bit reloc containing the high 16 bits of an address +used when the lower 16 bits are treated as unsigned. */ + BFD_RELOC_M32R_HI16_ULO, + +/* This is a 16-bit reloc containing the high 16 bits of an address +used when the lower 16 bits are treated as signed. */ + BFD_RELOC_M32R_HI16_SLO, + +/* This is a 16-bit reloc containing the lower 16 bits of an address. */ + BFD_RELOC_M32R_LO16, + +/* This is a 16-bit reloc containing the small data area offset for use in +add3, load, and store instructions. */ + BFD_RELOC_M32R_SDA16, + +/* This is a 9-bit reloc */ + BFD_RELOC_V850_9_PCREL, + +/* This is a 22-bit reloc */ + BFD_RELOC_V850_22_PCREL, + +/* This is a 16 bit offset from the short data area pointer. */ + BFD_RELOC_V850_SDA_16_16_OFFSET, + +/* This is a 16 bit offset (of which only 15 bits are used) from the +short data area pointer. */ + BFD_RELOC_V850_SDA_15_16_OFFSET, + +/* This is a 16 bit offset from the zero data area pointer. */ + BFD_RELOC_V850_ZDA_16_16_OFFSET, + +/* This is a 16 bit offset (of which only 15 bits are used) from the +zero data area pointer. */ + BFD_RELOC_V850_ZDA_15_16_OFFSET, + +/* This is an 8 bit offset (of which only 6 bits are used) from the +tiny data area pointer. */ + BFD_RELOC_V850_TDA_6_8_OFFSET, + +/* This is an 8bit offset (of which only 7 bits are used) from the tiny +data area pointer. */ + BFD_RELOC_V850_TDA_7_8_OFFSET, + +/* This is a 7 bit offset from the tiny data area pointer. */ + BFD_RELOC_V850_TDA_7_7_OFFSET, + +/* This is a 16 bit offset from the tiny data area pointer. */ + BFD_RELOC_V850_TDA_16_16_OFFSET, + +/* This is a 5 bit offset (of which only 4 bits are used) from the tiny +data area pointer. */ + BFD_RELOC_V850_TDA_4_5_OFFSET, + +/* This is a 4 bit offset from the tiny data area pointer. */ + BFD_RELOC_V850_TDA_4_4_OFFSET, + +/* This is a 16 bit offset from the short data area pointer, with the +bits placed non-contigously in the instruction. */ + BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET, + +/* This is a 16 bit offset from the zero data area pointer, with the +bits placed non-contigously in the instruction. */ + BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET, + +/* This is a 6 bit offset from the call table base pointer. */ + BFD_RELOC_V850_CALLT_6_7_OFFSET, + +/* This is a 16 bit offset from the call table base pointer. */ + BFD_RELOC_V850_CALLT_16_16_OFFSET, + + +/* This is a 32bit pcrel reloc for the mn10300, offset by two bytes in the +instruction. */ + BFD_RELOC_MN10300_32_PCREL, + +/* This is a 16bit pcrel reloc for the mn10300, offset by two bytes in the +instruction. */ + BFD_RELOC_MN10300_16_PCREL, + +/* This is a 8bit DP reloc for the tms320c30, where the most +significant 8 bits of a 24 bit word are placed into the least +significant 8 bits of the opcode. */ + BFD_RELOC_TIC30_LDP, + +/* This is a 48 bit reloc for the FR30 that stores 32 bits. */ + BFD_RELOC_FR30_48, + +/* This is a 32 bit reloc for the FR30 that stores 20 bits split up into +two sections. */ + BFD_RELOC_FR30_20, + +/* This is a 16 bit reloc for the FR30 that stores a 6 bit word offset in +4 bits. */ + BFD_RELOC_FR30_6_IN_4, + +/* This is a 16 bit reloc for the FR30 that stores an 8 bit byte offset +into 8 bits. */ + BFD_RELOC_FR30_8_IN_8, + +/* This is a 16 bit reloc for the FR30 that stores a 9 bit short offset +into 8 bits. */ + BFD_RELOC_FR30_9_IN_8, + +/* This is a 16 bit reloc for the FR30 that stores a 10 bit word offset +into 8 bits. */ + BFD_RELOC_FR30_10_IN_8, + +/* This is a 16 bit reloc for the FR30 that stores a 9 bit pc relative +short offset into 8 bits. */ + BFD_RELOC_FR30_9_PCREL, + +/* This is a 16 bit reloc for the FR30 that stores a 12 bit pc relative +short offset into 11 bits. */ + BFD_RELOC_FR30_12_PCREL, + +/* Motorola Mcore relocations. */ + BFD_RELOC_MCORE_PCREL_IMM8BY4, + BFD_RELOC_MCORE_PCREL_IMM11BY2, + BFD_RELOC_MCORE_PCREL_IMM4BY2, + BFD_RELOC_MCORE_PCREL_32, + BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2, + BFD_RELOC_MCORE_RVA, + +/* This is a 16 bit reloc for the AVR that stores 8 bit pc relative +short offset into 7 bits. */ + BFD_RELOC_AVR_7_PCREL, + +/* This is a 16 bit reloc for the AVR that stores 13 bit pc relative +short offset into 12 bits. */ + BFD_RELOC_AVR_13_PCREL, + +/* This is a 16 bit reloc for the AVR that stores 17 bit value (usually +program memory address) into 16 bits. */ + BFD_RELOC_AVR_16_PM, + +/* This is a 16 bit reloc for the AVR that stores 8 bit value (usually +data memory address) into 8 bit immediate value of LDI insn. */ + BFD_RELOC_AVR_LO8_LDI, + +/* This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit +of data memory address) into 8 bit immediate value of LDI insn. */ + BFD_RELOC_AVR_HI8_LDI, + +/* This is a 16 bit reloc for the AVR that stores 8 bit value (most high 8 bit +of program memory address) into 8 bit immediate value of LDI insn. */ + BFD_RELOC_AVR_HH8_LDI, + +/* This is a 16 bit reloc for the AVR that stores negated 8 bit value +(usually data memory address) into 8 bit immediate value of SUBI insn. */ + BFD_RELOC_AVR_LO8_LDI_NEG, + +/* This is a 16 bit reloc for the AVR that stores negated 8 bit value +(high 8 bit of data memory address) into 8 bit immediate value of +SUBI insn. */ + BFD_RELOC_AVR_HI8_LDI_NEG, + +/* This is a 16 bit reloc for the AVR that stores negated 8 bit value +(most high 8 bit of program memory address) into 8 bit immediate value +of LDI or SUBI insn. */ + BFD_RELOC_AVR_HH8_LDI_NEG, + +/* This is a 16 bit reloc for the AVR that stores 8 bit value (usually +command address) into 8 bit immediate value of LDI insn. */ + BFD_RELOC_AVR_LO8_LDI_PM, + +/* This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit +of command address) into 8 bit immediate value of LDI insn. */ + BFD_RELOC_AVR_HI8_LDI_PM, + +/* This is a 16 bit reloc for the AVR that stores 8 bit value (most high 8 bit +of command address) into 8 bit immediate value of LDI insn. */ + BFD_RELOC_AVR_HH8_LDI_PM, + +/* This is a 16 bit reloc for the AVR that stores negated 8 bit value +(usually command address) into 8 bit immediate value of SUBI insn. */ + BFD_RELOC_AVR_LO8_LDI_PM_NEG, + +/* This is a 16 bit reloc for the AVR that stores negated 8 bit value +(high 8 bit of 16 bit command address) into 8 bit immediate value +of SUBI insn. */ + BFD_RELOC_AVR_HI8_LDI_PM_NEG, + +/* This is a 16 bit reloc for the AVR that stores negated 8 bit value +(high 6 bit of 22 bit command address) into 8 bit immediate +value of SUBI insn. */ + BFD_RELOC_AVR_HH8_LDI_PM_NEG, + +/* This is a 32 bit reloc for the AVR that stores 23 bit value +into 22 bits. */ + BFD_RELOC_AVR_CALL, + +/* These two relocations are used by the linker to determine which of +the entries in a C++ virtual function table are actually used. When +the --gc-sections option is given, the linker will zero out the entries +that are not used, so that the code for those functions need not be +included in the output. + +VTABLE_INHERIT is a zero-space relocation used to describe to the +linker the inheritence tree of a C++ virtual function table. The +relocation's symbol should be the parent class' vtable, and the +relocation should be located at the child vtable. + +VTABLE_ENTRY is a zero-space relocation that describes the use of a +virtual function table entry. The reloc's symbol should refer to the +table of the class mentioned in the code. Off of that base, an offset +describes the entry that is being used. For Rela hosts, this offset +is stored in the reloc's addend. For Rel hosts, we are forced to put +this offset in the reloc's section offset. */ + BFD_RELOC_VTABLE_INHERIT, + BFD_RELOC_VTABLE_ENTRY, + BFD_RELOC_UNUSED }; +typedef enum bfd_reloc_code_real bfd_reloc_code_real_type; +reloc_howto_type * + +bfd_reloc_type_lookup PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); + +const char * +bfd_get_reloc_code_name PARAMS ((bfd_reloc_code_real_type code)); + + +typedef struct symbol_cache_entry +{ + /* A pointer to the BFD which owns the symbol. This information + is necessary so that a back end can work out what additional + information (invisible to the application writer) is carried + with the symbol. + + This field is *almost* redundant, since you can use section->owner + instead, except that some symbols point to the global sections + bfd_{abs,com,und}_section. This could be fixed by making + these globals be per-bfd (or per-target-flavor). FIXME. */ + + struct _bfd *the_bfd; /* Use bfd_asymbol_bfd(sym) to access this field. */ + + /* The text of the symbol. The name is left alone, and not copied; the + application may not alter it. */ + CONST char *name; + + /* The value of the symbol. This really should be a union of a + numeric value with a pointer, since some flags indicate that + a pointer to another symbol is stored here. */ + symvalue value; + + /* Attributes of a symbol: */ + +#define BSF_NO_FLAGS 0x00 + + /* The symbol has local scope; <> in <>. The value + is the offset into the section of the data. */ +#define BSF_LOCAL 0x01 + + /* The symbol has global scope; initialized data in <>. The + value is the offset into the section of the data. */ +#define BSF_GLOBAL 0x02 + + /* The symbol has global scope and is exported. The value is + the offset into the section of the data. */ +#define BSF_EXPORT BSF_GLOBAL /* no real difference */ + + /* A normal C symbol would be one of: + <>, <>, <> or + <> */ + + /* The symbol is a debugging record. The value has an arbitary + meaning, unless BSF_DEBUGGING_RELOC is also set. */ +#define BSF_DEBUGGING 0x08 + + /* The symbol denotes a function entry point. Used in ELF, + perhaps others someday. */ +#define BSF_FUNCTION 0x10 + + /* Used by the linker. */ +#define BSF_KEEP 0x20 +#define BSF_KEEP_G 0x40 + + /* A weak global symbol, overridable without warnings by + a regular global symbol of the same name. */ +#define BSF_WEAK 0x80 + + /* This symbol was created to point to a section, e.g. ELF's + STT_SECTION symbols. */ +#define BSF_SECTION_SYM 0x100 + + /* The symbol used to be a common symbol, but now it is + allocated. */ +#define BSF_OLD_COMMON 0x200 + + /* The default value for common data. */ +#define BFD_FORT_COMM_DEFAULT_VALUE 0 + + /* In some files the type of a symbol sometimes alters its + location in an output file - ie in coff a <> symbol + which is also <> symbol appears where it was + declared and not at the end of a section. This bit is set + by the target BFD part to convey this information. */ + +#define BSF_NOT_AT_END 0x400 + + /* Signal that the symbol is the label of constructor section. */ +#define BSF_CONSTRUCTOR 0x800 + + /* Signal that the symbol is a warning symbol. The name is a + warning. The name of the next symbol is the one to warn about; + if a reference is made to a symbol with the same name as the next + symbol, a warning is issued by the linker. */ +#define BSF_WARNING 0x1000 + + /* Signal that the symbol is indirect. This symbol is an indirect + pointer to the symbol with the same name as the next symbol. */ +#define BSF_INDIRECT 0x2000 + + /* BSF_FILE marks symbols that contain a file name. This is used + for ELF STT_FILE symbols. */ +#define BSF_FILE 0x4000 + + /* Symbol is from dynamic linking information. */ +#define BSF_DYNAMIC 0x8000 + + /* The symbol denotes a data object. Used in ELF, and perhaps + others someday. */ +#define BSF_OBJECT 0x10000 + + /* This symbol is a debugging symbol. The value is the offset + into the section of the data. BSF_DEBUGGING should be set + as well. */ +#define BSF_DEBUGGING_RELOC 0x20000 + + flagword flags; + + /* A pointer to the section to which this symbol is + relative. This will always be non NULL, there are special + sections for undefined and absolute symbols. */ + struct sec *section; + + /* Back end special data. */ + union + { + PTR p; + bfd_vma i; + } udata; + +} asymbol; +#define bfd_get_symtab_upper_bound(abfd) \ + BFD_SEND (abfd, _bfd_get_symtab_upper_bound, (abfd)) +boolean +bfd_is_local_label PARAMS ((bfd *abfd, asymbol *sym)); + +boolean +bfd_is_local_label_name PARAMS ((bfd *abfd, const char *name)); + +#define bfd_is_local_label_name(abfd, name) \ + BFD_SEND (abfd, _bfd_is_local_label_name, (abfd, name)) +#define bfd_canonicalize_symtab(abfd, location) \ + BFD_SEND (abfd, _bfd_canonicalize_symtab,\ + (abfd, location)) +boolean +bfd_set_symtab PARAMS ((bfd *abfd, asymbol **location, unsigned int count)); + +void +bfd_print_symbol_vandf PARAMS ((PTR file, asymbol *symbol)); + +#define bfd_make_empty_symbol(abfd) \ + BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) +#define bfd_make_debug_symbol(abfd,ptr,size) \ + BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size)) +int +bfd_decode_symclass PARAMS ((asymbol *symbol)); + +boolean +bfd_is_undefined_symclass PARAMS ((int symclass)); + +void +bfd_symbol_info PARAMS ((asymbol *symbol, symbol_info *ret)); + +boolean +bfd_copy_private_symbol_data PARAMS ((bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym)); + +#define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \ + BFD_SEND (obfd, _bfd_copy_private_symbol_data, \ + (ibfd, isymbol, obfd, osymbol)) +struct _bfd +{ + /* The filename the application opened the BFD with. */ + CONST char *filename; + + /* A pointer to the target jump table. */ + const struct bfd_target *xvec; + + /* To avoid dragging too many header files into every file that + includes `<>', IOSTREAM has been declared as a "char + *", and MTIME as a "long". Their correct types, to which they + are cast when used, are "FILE *" and "time_t". The iostream + is the result of an fopen on the filename. However, if the + BFD_IN_MEMORY flag is set, then iostream is actually a pointer + to a bfd_in_memory struct. */ + PTR iostream; + + /* Is the file descriptor being cached? That is, can it be closed as + needed, and re-opened when accessed later? */ + + boolean cacheable; + + /* Marks whether there was a default target specified when the + BFD was opened. This is used to select which matching algorithm + to use to choose the back end. */ + + boolean target_defaulted; + + /* The caching routines use these to maintain a + least-recently-used list of BFDs */ + + struct _bfd *lru_prev, *lru_next; + + /* When a file is closed by the caching routines, BFD retains + state information on the file here: */ + + file_ptr where; + + /* and here: (``once'' means at least once) */ + + boolean opened_once; + + /* Set if we have a locally maintained mtime value, rather than + getting it from the file each time: */ + + boolean mtime_set; + + /* File modified time, if mtime_set is true: */ + + long mtime; + + /* Reserved for an unimplemented file locking extension.*/ + + int ifd; + + /* The format which belongs to the BFD. (object, core, etc.) */ + + bfd_format format; + + /* The direction the BFD was opened with*/ + + enum bfd_direction {no_direction = 0, + read_direction = 1, + write_direction = 2, + both_direction = 3} direction; + + /* Format_specific flags*/ + + flagword flags; + + /* Currently my_archive is tested before adding origin to + anything. I believe that this can become always an add of + origin, with origin set to 0 for non archive files. */ + + file_ptr origin; + + /* Remember when output has begun, to stop strange things + from happening. */ + boolean output_has_begun; + + /* Pointer to linked list of sections*/ + struct sec *sections; + + /* The number of sections */ + unsigned int section_count; + + /* Stuff only useful for object files: + The start address. */ + bfd_vma start_address; + + /* Used for input and output*/ + unsigned int symcount; + + /* Symbol table for output BFD (with symcount entries) */ + struct symbol_cache_entry **outsymbols; + + /* Pointer to structure which contains architecture information*/ + const struct bfd_arch_info *arch_info; + + /* Stuff only useful for archives:*/ + PTR arelt_data; + struct _bfd *my_archive; /* The containing archive BFD. */ + struct _bfd *next; /* The next BFD in the archive. */ + struct _bfd *archive_head; /* The first BFD in the archive. */ + boolean has_armap; + + /* A chain of BFD structures involved in a link. */ + struct _bfd *link_next; + + /* A field used by _bfd_generic_link_add_archive_symbols. This will + be used only for archive elements. */ + int archive_pass; + + /* Used by the back end to hold private data. */ + + union + { + struct aout_data_struct *aout_data; + struct artdata *aout_ar_data; + struct _oasys_data *oasys_obj_data; + struct _oasys_ar_data *oasys_ar_data; + struct coff_tdata *coff_obj_data; + struct pe_tdata *pe_obj_data; + struct xcoff_tdata *xcoff_obj_data; + struct ecoff_tdata *ecoff_obj_data; + struct ieee_data_struct *ieee_data; + struct ieee_ar_data_struct *ieee_ar_data; + struct srec_data_struct *srec_data; + struct ihex_data_struct *ihex_data; + struct tekhex_data_struct *tekhex_data; + struct elf_obj_tdata *elf_obj_data; + struct nlm_obj_tdata *nlm_obj_data; + struct bout_data_struct *bout_data; + struct sun_core_struct *sun_core_data; + struct sco5_core_struct *sco5_core_data; + struct trad_core_struct *trad_core_data; + struct som_data_struct *som_data; + struct hpux_core_struct *hpux_core_data; + struct hppabsd_core_struct *hppabsd_core_data; + struct sgi_core_struct *sgi_core_data; + struct lynx_core_struct *lynx_core_data; + struct osf_core_struct *osf_core_data; + struct cisco_core_struct *cisco_core_data; + struct versados_data_struct *versados_data; + struct netbsd_core_struct *netbsd_core_data; + PTR any; + } tdata; + + /* Used by the application to hold private data*/ + PTR usrdata; + + /* Where all the allocated stuff under this BFD goes. This is a + struct objalloc *, but we use PTR to avoid requiring the inclusion of + objalloc.h. */ + PTR memory; +}; + +typedef enum bfd_error +{ + bfd_error_no_error = 0, + bfd_error_system_call, + bfd_error_invalid_target, + bfd_error_wrong_format, + bfd_error_invalid_operation, + bfd_error_no_memory, + bfd_error_no_symbols, + bfd_error_no_armap, + bfd_error_no_more_archived_files, + bfd_error_malformed_archive, + bfd_error_file_not_recognized, + bfd_error_file_ambiguously_recognized, + bfd_error_no_contents, + bfd_error_nonrepresentable_section, + bfd_error_no_debug_section, + bfd_error_bad_value, + bfd_error_file_truncated, + bfd_error_file_too_big, + bfd_error_invalid_error_code +} bfd_error_type; + +bfd_error_type +bfd_get_error PARAMS ((void)); + +void +bfd_set_error PARAMS ((bfd_error_type error_tag)); + +CONST char * +bfd_errmsg PARAMS ((bfd_error_type error_tag)); + +void +bfd_perror PARAMS ((CONST char *message)); + +typedef void (*bfd_error_handler_type) PARAMS ((const char *, ...)); + +bfd_error_handler_type +bfd_set_error_handler PARAMS ((bfd_error_handler_type)); + +void +bfd_set_error_program_name PARAMS ((const char *)); + +bfd_error_handler_type +bfd_get_error_handler PARAMS ((void)); + +long +bfd_get_reloc_upper_bound PARAMS ((bfd *abfd, asection *sect)); + +long +bfd_canonicalize_reloc + PARAMS ((bfd *abfd, + asection *sec, + arelent **loc, + asymbol **syms)); + +void +bfd_set_reloc + PARAMS ((bfd *abfd, asection *sec, arelent **rel, unsigned int count) + + ); + +boolean +bfd_set_file_flags PARAMS ((bfd *abfd, flagword flags)); + +boolean +bfd_set_start_address PARAMS ((bfd *abfd, bfd_vma vma)); + +long +bfd_get_mtime PARAMS ((bfd *abfd)); + +long +bfd_get_size PARAMS ((bfd *abfd)); + +int +bfd_get_gp_size PARAMS ((bfd *abfd)); + +void +bfd_set_gp_size PARAMS ((bfd *abfd, int i)); + +bfd_vma +bfd_scan_vma PARAMS ((CONST char *string, CONST char **end, int base)); + +boolean +bfd_copy_private_bfd_data PARAMS ((bfd *ibfd, bfd *obfd)); + +#define bfd_copy_private_bfd_data(ibfd, obfd) \ + BFD_SEND (obfd, _bfd_copy_private_bfd_data, \ + (ibfd, obfd)) +boolean +bfd_merge_private_bfd_data PARAMS ((bfd *ibfd, bfd *obfd)); + +#define bfd_merge_private_bfd_data(ibfd, obfd) \ + BFD_SEND (obfd, _bfd_merge_private_bfd_data, \ + (ibfd, obfd)) +boolean +bfd_set_private_flags PARAMS ((bfd *abfd, flagword flags)); + +#define bfd_set_private_flags(abfd, flags) \ + BFD_SEND (abfd, _bfd_set_private_flags, \ + (abfd, flags)) +#define bfd_sizeof_headers(abfd, reloc) \ + BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc)) + +#define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \ + BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, sec, syms, off, file, func, line)) + + /* Do these three do anything useful at all, for any back end? */ +#define bfd_debug_info_start(abfd) \ + BFD_SEND (abfd, _bfd_debug_info_start, (abfd)) + +#define bfd_debug_info_end(abfd) \ + BFD_SEND (abfd, _bfd_debug_info_end, (abfd)) + +#define bfd_debug_info_accumulate(abfd, section) \ + BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section)) + + +#define bfd_stat_arch_elt(abfd, stat) \ + BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat)) + +#define bfd_update_armap_timestamp(abfd) \ + BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd)) + +#define bfd_set_arch_mach(abfd, arch, mach)\ + BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach)) + +#define bfd_relax_section(abfd, section, link_info, again) \ + BFD_SEND (abfd, _bfd_relax_section, (abfd, section, link_info, again)) + +#define bfd_gc_sections(abfd, link_info) \ + BFD_SEND (abfd, _bfd_gc_sections, (abfd, link_info)) + +#define bfd_link_hash_table_create(abfd) \ + BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd)) + +#define bfd_link_add_symbols(abfd, info) \ + BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info)) + +#define bfd_final_link(abfd, info) \ + BFD_SEND (abfd, _bfd_final_link, (abfd, info)) + +#define bfd_free_cached_info(abfd) \ + BFD_SEND (abfd, _bfd_free_cached_info, (abfd)) + +#define bfd_get_dynamic_symtab_upper_bound(abfd) \ + BFD_SEND (abfd, _bfd_get_dynamic_symtab_upper_bound, (abfd)) + +#define bfd_print_private_bfd_data(abfd, file)\ + BFD_SEND (abfd, _bfd_print_private_bfd_data, (abfd, file)) + +#define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \ + BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols)) + +#define bfd_get_dynamic_reloc_upper_bound(abfd) \ + BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd)) + +#define bfd_canonicalize_dynamic_reloc(abfd, arels, asyms) \ + BFD_SEND (abfd, _bfd_canonicalize_dynamic_reloc, (abfd, arels, asyms)) + +extern bfd_byte *bfd_get_relocated_section_contents + PARAMS ((bfd *, struct bfd_link_info *, + struct bfd_link_order *, bfd_byte *, + boolean, asymbol **)); + +symindex +bfd_get_next_mapent PARAMS ((bfd *abfd, symindex previous, carsym **sym)); + +boolean +bfd_set_archive_head PARAMS ((bfd *output, bfd *new_head)); + +bfd * +bfd_openr_next_archived_file PARAMS ((bfd *archive, bfd *previous)); + +CONST char * +bfd_core_file_failing_command PARAMS ((bfd *abfd)); + +int +bfd_core_file_failing_signal PARAMS ((bfd *abfd)); + +boolean +core_file_matches_executable_p + PARAMS ((bfd *core_bfd, bfd *exec_bfd)); + +#define BFD_SEND(bfd, message, arglist) \ + ((*((bfd)->xvec->message)) arglist) + +#ifdef DEBUG_BFD_SEND +#undef BFD_SEND +#define BFD_SEND(bfd, message, arglist) \ + (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ + ((*((bfd)->xvec->message)) arglist) : \ + (bfd_assert (__FILE__,__LINE__), NULL)) +#endif +#define BFD_SEND_FMT(bfd, message, arglist) \ + (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) + +#ifdef DEBUG_BFD_SEND +#undef BFD_SEND_FMT +#define BFD_SEND_FMT(bfd, message, arglist) \ + (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ + (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) : \ + (bfd_assert (__FILE__,__LINE__), NULL)) +#endif +enum bfd_flavour { + bfd_target_unknown_flavour, + bfd_target_aout_flavour, + bfd_target_coff_flavour, + bfd_target_ecoff_flavour, + bfd_target_elf_flavour, + bfd_target_ieee_flavour, + bfd_target_nlm_flavour, + bfd_target_oasys_flavour, + bfd_target_tekhex_flavour, + bfd_target_srec_flavour, + bfd_target_ihex_flavour, + bfd_target_som_flavour, + bfd_target_os9k_flavour, + bfd_target_versados_flavour, + bfd_target_msdos_flavour, + bfd_target_ovax_flavour, + bfd_target_evax_flavour +}; + +enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN }; + + /* Forward declaration. */ +typedef struct bfd_link_info _bfd_link_info; + +typedef struct bfd_target +{ + char *name; + enum bfd_flavour flavour; + enum bfd_endian byteorder; + enum bfd_endian header_byteorder; + flagword object_flags; + flagword section_flags; + char symbol_leading_char; + char ar_pad_char; + unsigned short ar_max_namelen; + bfd_vma (*bfd_getx64) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_getx_signed_64) PARAMS ((const bfd_byte *)); + void (*bfd_putx64) PARAMS ((bfd_vma, bfd_byte *)); + bfd_vma (*bfd_getx32) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_getx_signed_32) PARAMS ((const bfd_byte *)); + void (*bfd_putx32) PARAMS ((bfd_vma, bfd_byte *)); + bfd_vma (*bfd_getx16) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_getx_signed_16) PARAMS ((const bfd_byte *)); + void (*bfd_putx16) PARAMS ((bfd_vma, bfd_byte *)); + bfd_vma (*bfd_h_getx64) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_h_getx_signed_64) PARAMS ((const bfd_byte *)); + void (*bfd_h_putx64) PARAMS ((bfd_vma, bfd_byte *)); + bfd_vma (*bfd_h_getx32) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_h_getx_signed_32) PARAMS ((const bfd_byte *)); + void (*bfd_h_putx32) PARAMS ((bfd_vma, bfd_byte *)); + bfd_vma (*bfd_h_getx16) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_h_getx_signed_16) PARAMS ((const bfd_byte *)); + void (*bfd_h_putx16) PARAMS ((bfd_vma, bfd_byte *)); + const struct bfd_target *(*_bfd_check_format[bfd_type_end]) PARAMS ((bfd *)); + boolean (*_bfd_set_format[bfd_type_end]) PARAMS ((bfd *)); + boolean (*_bfd_write_contents[bfd_type_end]) PARAMS ((bfd *)); + + /* Generic entry points. */ +#define BFD_JUMP_TABLE_GENERIC(NAME)\ +CAT(NAME,_close_and_cleanup),\ +CAT(NAME,_bfd_free_cached_info),\ +CAT(NAME,_new_section_hook),\ +CAT(NAME,_get_section_contents),\ +CAT(NAME,_get_section_contents_in_window) + + /* Called when the BFD is being closed to do any necessary cleanup. */ + boolean (*_close_and_cleanup) PARAMS ((bfd *)); + /* Ask the BFD to free all cached information. */ + boolean (*_bfd_free_cached_info) PARAMS ((bfd *)); + /* Called when a new section is created. */ + boolean (*_new_section_hook) PARAMS ((bfd *, sec_ptr)); + /* Read the contents of a section. */ + boolean (*_bfd_get_section_contents) PARAMS ((bfd *, sec_ptr, PTR, + file_ptr, bfd_size_type)); + boolean (*_bfd_get_section_contents_in_window) + PARAMS ((bfd *, sec_ptr, bfd_window *, + file_ptr, bfd_size_type)); + + /* Entry points to copy private data. */ +#define BFD_JUMP_TABLE_COPY(NAME)\ +CAT(NAME,_bfd_copy_private_bfd_data),\ +CAT(NAME,_bfd_merge_private_bfd_data),\ +CAT(NAME,_bfd_copy_private_section_data),\ +CAT(NAME,_bfd_copy_private_symbol_data),\ +CAT(NAME,_bfd_set_private_flags),\ +CAT(NAME,_bfd_print_private_bfd_data)\ + /* Called to copy BFD general private data from one object file + to another. */ + boolean (*_bfd_copy_private_bfd_data) PARAMS ((bfd *, bfd *)); + /* Called to merge BFD general private data from one object file + to a common output file when linking. */ + boolean (*_bfd_merge_private_bfd_data) PARAMS ((bfd *, bfd *)); + /* Called to copy BFD private section data from one object file + to another. */ + boolean (*_bfd_copy_private_section_data) PARAMS ((bfd *, sec_ptr, + bfd *, sec_ptr)); + /* Called to copy BFD private symbol data from one symbol + to another. */ + boolean (*_bfd_copy_private_symbol_data) PARAMS ((bfd *, asymbol *, + bfd *, asymbol *)); + /* Called to set private backend flags */ + boolean (*_bfd_set_private_flags) PARAMS ((bfd *, flagword)); + + /* Called to print private BFD data */ + boolean (*_bfd_print_private_bfd_data) PARAMS ((bfd *, PTR)); + + /* Core file entry points. */ +#define BFD_JUMP_TABLE_CORE(NAME)\ +CAT(NAME,_core_file_failing_command),\ +CAT(NAME,_core_file_failing_signal),\ +CAT(NAME,_core_file_matches_executable_p) + char * (*_core_file_failing_command) PARAMS ((bfd *)); + int (*_core_file_failing_signal) PARAMS ((bfd *)); + boolean (*_core_file_matches_executable_p) PARAMS ((bfd *, bfd *)); + + /* Archive entry points. */ +#define BFD_JUMP_TABLE_ARCHIVE(NAME)\ +CAT(NAME,_slurp_armap),\ +CAT(NAME,_slurp_extended_name_table),\ +CAT(NAME,_construct_extended_name_table),\ +CAT(NAME,_truncate_arname),\ +CAT(NAME,_write_armap),\ +CAT(NAME,_read_ar_hdr),\ +CAT(NAME,_openr_next_archived_file),\ +CAT(NAME,_get_elt_at_index),\ +CAT(NAME,_generic_stat_arch_elt),\ +CAT(NAME,_update_armap_timestamp) + boolean (*_bfd_slurp_armap) PARAMS ((bfd *)); + boolean (*_bfd_slurp_extended_name_table) PARAMS ((bfd *)); + boolean (*_bfd_construct_extended_name_table) + PARAMS ((bfd *, char **, bfd_size_type *, const char **)); + void (*_bfd_truncate_arname) PARAMS ((bfd *, CONST char *, char *)); + boolean (*write_armap) PARAMS ((bfd *arch, + unsigned int elength, + struct orl *map, + unsigned int orl_count, + int stridx)); + PTR (*_bfd_read_ar_hdr_fn) PARAMS ((bfd *)); + bfd * (*openr_next_archived_file) PARAMS ((bfd *arch, bfd *prev)); +#define bfd_get_elt_at_index(b,i) BFD_SEND(b, _bfd_get_elt_at_index, (b,i)) + bfd * (*_bfd_get_elt_at_index) PARAMS ((bfd *, symindex)); + int (*_bfd_stat_arch_elt) PARAMS ((bfd *, struct stat *)); + boolean (*_bfd_update_armap_timestamp) PARAMS ((bfd *)); + + /* Entry points used for symbols. */ +#define BFD_JUMP_TABLE_SYMBOLS(NAME)\ +CAT(NAME,_get_symtab_upper_bound),\ +CAT(NAME,_get_symtab),\ +CAT(NAME,_make_empty_symbol),\ +CAT(NAME,_print_symbol),\ +CAT(NAME,_get_symbol_info),\ +CAT(NAME,_bfd_is_local_label_name),\ +CAT(NAME,_get_lineno),\ +CAT(NAME,_find_nearest_line),\ +CAT(NAME,_bfd_make_debug_symbol),\ +CAT(NAME,_read_minisymbols),\ +CAT(NAME,_minisymbol_to_symbol) + long (*_bfd_get_symtab_upper_bound) PARAMS ((bfd *)); + long (*_bfd_canonicalize_symtab) PARAMS ((bfd *, + struct symbol_cache_entry **)); + struct symbol_cache_entry * + (*_bfd_make_empty_symbol) PARAMS ((bfd *)); + void (*_bfd_print_symbol) PARAMS ((bfd *, PTR, + struct symbol_cache_entry *, + bfd_print_symbol_type)); +#define bfd_print_symbol(b,p,s,e) BFD_SEND(b, _bfd_print_symbol, (b,p,s,e)) + void (*_bfd_get_symbol_info) PARAMS ((bfd *, + struct symbol_cache_entry *, + symbol_info *)); +#define bfd_get_symbol_info(b,p,e) BFD_SEND(b, _bfd_get_symbol_info, (b,p,e)) + boolean (*_bfd_is_local_label_name) PARAMS ((bfd *, const char *)); + + alent * (*_get_lineno) PARAMS ((bfd *, struct symbol_cache_entry *)); + boolean (*_bfd_find_nearest_line) PARAMS ((bfd *abfd, + struct sec *section, struct symbol_cache_entry **symbols, + bfd_vma offset, CONST char **file, CONST char **func, + unsigned int *line)); + /* Back-door to allow format-aware applications to create debug symbols + while using BFD for everything else. Currently used by the assembler + when creating COFF files. */ + asymbol * (*_bfd_make_debug_symbol) PARAMS (( + bfd *abfd, + void *ptr, + unsigned long size)); +#define bfd_read_minisymbols(b, d, m, s) \ + BFD_SEND (b, _read_minisymbols, (b, d, m, s)) + long (*_read_minisymbols) PARAMS ((bfd *, boolean, PTR *, + unsigned int *)); +#define bfd_minisymbol_to_symbol(b, d, m, f) \ + BFD_SEND (b, _minisymbol_to_symbol, (b, d, m, f)) + asymbol *(*_minisymbol_to_symbol) PARAMS ((bfd *, boolean, const PTR, + asymbol *)); + + /* Routines for relocs. */ +#define BFD_JUMP_TABLE_RELOCS(NAME)\ +CAT(NAME,_get_reloc_upper_bound),\ +CAT(NAME,_canonicalize_reloc),\ +CAT(NAME,_bfd_reloc_type_lookup) + long (*_get_reloc_upper_bound) PARAMS ((bfd *, sec_ptr)); + long (*_bfd_canonicalize_reloc) PARAMS ((bfd *, sec_ptr, arelent **, + struct symbol_cache_entry **)); + /* See documentation on reloc types. */ + reloc_howto_type * + (*reloc_type_lookup) PARAMS ((bfd *abfd, + bfd_reloc_code_real_type code)); + + /* Routines used when writing an object file. */ +#define BFD_JUMP_TABLE_WRITE(NAME)\ +CAT(NAME,_set_arch_mach),\ +CAT(NAME,_set_section_contents) + boolean (*_bfd_set_arch_mach) PARAMS ((bfd *, enum bfd_architecture, + unsigned long)); + boolean (*_bfd_set_section_contents) PARAMS ((bfd *, sec_ptr, PTR, + file_ptr, bfd_size_type)); + + /* Routines used by the linker. */ +#define BFD_JUMP_TABLE_LINK(NAME)\ +CAT(NAME,_sizeof_headers),\ +CAT(NAME,_bfd_get_relocated_section_contents),\ +CAT(NAME,_bfd_relax_section),\ +CAT(NAME,_bfd_link_hash_table_create),\ +CAT(NAME,_bfd_link_add_symbols),\ +CAT(NAME,_bfd_final_link),\ +CAT(NAME,_bfd_link_split_section),\ +CAT(NAME,_bfd_gc_sections) + int (*_bfd_sizeof_headers) PARAMS ((bfd *, boolean)); + bfd_byte * (*_bfd_get_relocated_section_contents) PARAMS ((bfd *, + struct bfd_link_info *, struct bfd_link_order *, + bfd_byte *data, boolean relocateable, + struct symbol_cache_entry **)); + + boolean (*_bfd_relax_section) PARAMS ((bfd *, struct sec *, + struct bfd_link_info *, boolean *again)); + + /* Create a hash table for the linker. Different backends store + different information in this table. */ + struct bfd_link_hash_table *(*_bfd_link_hash_table_create) PARAMS ((bfd *)); + + /* Add symbols from this object file into the hash table. */ + boolean (*_bfd_link_add_symbols) PARAMS ((bfd *, struct bfd_link_info *)); + + /* Do a link based on the link_order structures attached to each + section of the BFD. */ + boolean (*_bfd_final_link) PARAMS ((bfd *, struct bfd_link_info *)); + + /* Should this section be split up into smaller pieces during linking. */ + boolean (*_bfd_link_split_section) PARAMS ((bfd *, struct sec *)); + + /* Remove sections that are not referenced from the output. */ + boolean (*_bfd_gc_sections) PARAMS ((bfd *, struct bfd_link_info *)); + + /* Routines to handle dynamic symbols and relocs. */ +#define BFD_JUMP_TABLE_DYNAMIC(NAME)\ +CAT(NAME,_get_dynamic_symtab_upper_bound),\ +CAT(NAME,_canonicalize_dynamic_symtab),\ +CAT(NAME,_get_dynamic_reloc_upper_bound),\ +CAT(NAME,_canonicalize_dynamic_reloc) + /* Get the amount of memory required to hold the dynamic symbols. */ + long (*_bfd_get_dynamic_symtab_upper_bound) PARAMS ((bfd *)); + /* Read in the dynamic symbols. */ + long (*_bfd_canonicalize_dynamic_symtab) + PARAMS ((bfd *, struct symbol_cache_entry **)); + /* Get the amount of memory required to hold the dynamic relocs. */ + long (*_bfd_get_dynamic_reloc_upper_bound) PARAMS ((bfd *)); + /* Read in the dynamic relocs. */ + long (*_bfd_canonicalize_dynamic_reloc) + PARAMS ((bfd *, arelent **, struct symbol_cache_entry **)); + + /* Opposite endian version of this target. */ + const struct bfd_target * alternative_target; + + PTR backend_data; + +} bfd_target; +boolean +bfd_set_default_target PARAMS ((const char *name)); + +const bfd_target * +bfd_find_target PARAMS ((CONST char *target_name, bfd *abfd)); + +const char ** +bfd_target_list PARAMS ((void)); + +const bfd_target * +bfd_search_for_target PARAMS ((int (* search_func)(const bfd_target *, void *), void *)); + +boolean +bfd_check_format PARAMS ((bfd *abfd, bfd_format format)); + +boolean +bfd_check_format_matches PARAMS ((bfd *abfd, bfd_format format, char ***matching)); + +boolean +bfd_set_format PARAMS ((bfd *abfd, bfd_format format)); + +CONST char * +bfd_format_string PARAMS ((bfd_format format)); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/usr/local/nachos/include/bfdlink.h b/usr/local/nachos/include/bfdlink.h new file mode 100644 index 0000000..bb827a3 --- /dev/null +++ b/usr/local/nachos/include/bfdlink.h @@ -0,0 +1,530 @@ +/* bfdlink.h -- header file for BFD link routines + Copyright 1993, 94, 95, 96, 97, 1999 Free Software Foundation, Inc. + Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support. + +This file is part of BFD, the Binary File Descriptor library. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef BFDLINK_H +#define BFDLINK_H + +/* Which symbols to strip during a link. */ +enum bfd_link_strip +{ + strip_none, /* Don't strip any symbols. */ + strip_debugger, /* Strip debugging symbols. */ + strip_some, /* keep_hash is the list of symbols to keep. */ + strip_all /* Strip all symbols. */ +}; + +/* Which local symbols to discard during a link. This is irrelevant + if strip_all is used. */ +enum bfd_link_discard +{ + discard_none, /* Don't discard any locals. */ + discard_l, /* Discard local temporary symbols. */ + discard_all /* Discard all locals. */ +}; + +/* These are the possible types of an entry in the BFD link hash + table. */ + +enum bfd_link_hash_type +{ + bfd_link_hash_new, /* Symbol is new. */ + bfd_link_hash_undefined, /* Symbol seen before, but undefined. */ + bfd_link_hash_undefweak, /* Symbol is weak and undefined. */ + bfd_link_hash_defined, /* Symbol is defined. */ + bfd_link_hash_defweak, /* Symbol is weak and defined. */ + bfd_link_hash_common, /* Symbol is common. */ + bfd_link_hash_indirect, /* Symbol is an indirect link. */ + bfd_link_hash_warning /* Like indirect, but warn if referenced. */ +}; + +/* The linking routines use a hash table which uses this structure for + its elements. */ + +struct bfd_link_hash_entry +{ + /* Base hash table entry structure. */ + struct bfd_hash_entry root; + /* Type of this entry. */ + enum bfd_link_hash_type type; + + /* Undefined and common symbols are kept in a linked list through + this field. This field is not in the union because that would + force us to remove entries from the list when we changed their + type, which would force the list to be doubly linked, which would + waste more memory. When an undefined or common symbol is + created, it should be added to this list, the head of which is in + the link hash table itself. As symbols are defined, they need + not be removed from the list; anything which reads the list must + doublecheck the symbol type. + + Weak symbols are not kept on this list. + + Defined and defweak symbols use this field as a reference marker. + If the field is not NULL, or this structure is the tail of the + undefined symbol list, the symbol has been referenced. If the + symbol is undefined and becomes defined, this field will + automatically be non-NULL since the symbol will have been on the + undefined symbol list. */ + struct bfd_link_hash_entry *next; + /* A union of information depending upon the type. */ + union + { + /* Nothing is kept for bfd_hash_new. */ + /* bfd_link_hash_undefined, bfd_link_hash_undefweak. */ + struct + { + bfd *abfd; /* BFD symbol was found in. */ + } undef; + /* bfd_link_hash_defined, bfd_link_hash_defweak. */ + struct + { + bfd_vma value; /* Symbol value. */ + asection *section; /* Symbol section. */ + } def; + /* bfd_link_hash_indirect, bfd_link_hash_warning. */ + struct + { + struct bfd_link_hash_entry *link; /* Real symbol. */ + const char *warning; /* Warning (bfd_link_hash_warning only). */ + } i; + /* bfd_link_hash_common. */ + struct + { + /* The linker needs to know three things about common + symbols: the size, the alignment, and the section in + which the symbol should be placed. We store the size + here, and we allocate a small structure to hold the + section and the alignment. The alignment is stored as a + power of two. We don't store all the information + directly because we don't want to increase the size of + the union; this structure is a major space user in the + linker. */ + bfd_size_type size; /* Common symbol size. */ + struct bfd_link_hash_common_entry + { + unsigned int alignment_power; /* Alignment. */ + asection *section; /* Symbol section. */ + } *p; + } c; + } u; +}; + +/* This is the link hash table. It is a derived class of + bfd_hash_table. */ + +struct bfd_link_hash_table +{ + /* The hash table itself. */ + struct bfd_hash_table table; + /* The back end which created this hash table. This indicates the + type of the entries in the hash table, which is sometimes + important information when linking object files of different + types together. */ + const bfd_target *creator; + /* A linked list of undefined and common symbols, linked through the + next field in the bfd_link_hash_entry structure. */ + struct bfd_link_hash_entry *undefs; + /* Entries are added to the tail of the undefs list. */ + struct bfd_link_hash_entry *undefs_tail; +}; + +/* Look up an entry in a link hash table. If FOLLOW is true, this + follows bfd_link_hash_indirect and bfd_link_hash_warning links to + the real symbol. */ +extern struct bfd_link_hash_entry *bfd_link_hash_lookup + PARAMS ((struct bfd_link_hash_table *, const char *, boolean create, + boolean copy, boolean follow)); + +/* Look up an entry in the main linker hash table if the symbol might + be wrapped. This should only be used for references to an + undefined symbol, not for definitions of a symbol. */ + +extern struct bfd_link_hash_entry *bfd_wrapped_link_hash_lookup + PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean, boolean, + boolean)); + +/* Traverse a link hash table. */ +extern void bfd_link_hash_traverse + PARAMS ((struct bfd_link_hash_table *, + boolean (*) (struct bfd_link_hash_entry *, PTR), + PTR)); + +/* Add an entry to the undefs list. */ +extern void bfd_link_add_undef + PARAMS ((struct bfd_link_hash_table *, struct bfd_link_hash_entry *)); + +/* This structure holds all the information needed to communicate + between BFD and the linker when doing a link. */ + +struct bfd_link_info +{ + /* Function callbacks. */ + const struct bfd_link_callbacks *callbacks; + /* true if BFD should generate a relocateable object file. */ + boolean relocateable; + /* true if BFD should generate a "task linked" object file, + similar to relocatable but also with globals converted to statics. */ + boolean task_link; + /* true if BFD should generate a shared object. */ + boolean shared; + /* true if BFD should pre-bind symbols in a shared object. */ + boolean symbolic; + /* true if shared objects should be linked directly, not shared. */ + boolean static_link; + /* true if the output file should be in a traditional format. This + is equivalent to the setting of the BFD_TRADITIONAL_FORMAT flag + on the output file, but may be checked when reading the input + files. */ + boolean traditional_format; + /* true if we want to produced optimized output files. This might + need much more time and therefore must be explicitly selected. */ + boolean optimize; + /* true if BFD should generate errors for undefined symbols + even if generating a shared object. */ + boolean no_undefined; + /* Which symbols to strip. */ + enum bfd_link_strip strip; + /* Which local symbols to discard. */ + enum bfd_link_discard discard; + /* true if symbols should be retained in memory, false if they + should be freed and reread. */ + boolean keep_memory; + /* The list of input BFD's involved in the link. These are chained + together via the link_next field. */ + bfd *input_bfds; + /* If a symbol should be created for each input BFD, this is section + where those symbols should be placed. It must be a section in + the output BFD. It may be NULL, in which case no such symbols + will be created. This is to support CREATE_OBJECT_SYMBOLS in the + linker command language. */ + asection *create_object_symbols_section; + /* Hash table handled by BFD. */ + struct bfd_link_hash_table *hash; + /* Hash table of symbols to keep. This is NULL unless strip is + strip_some. */ + struct bfd_hash_table *keep_hash; + /* true if every symbol should be reported back via the notice + callback. */ + boolean notice_all; + /* Hash table of symbols to report back via the notice callback. If + this is NULL, and notice_all is false, then no symbols are + reported back. */ + struct bfd_hash_table *notice_hash; + /* Hash table of symbols which are being wrapped (the --wrap linker + option). If this is NULL, no symbols are being wrapped. */ + struct bfd_hash_table *wrap_hash; + /* If a base output file is wanted, then this points to it */ + PTR base_file; + + /* If non-zero, specifies that branches which are problematic for the + MPC860 C0 (or earlier) should be checked for and modified. It gives the + number of bytes that should be checked at the end of each text page. */ + int mpc860c0; + + /* The function to call when the executable or shared object is + loaded. */ + const char *init_function; + /* The function to call when the executable or shared object is + unloaded. */ + const char *fini_function; +}; + +/* This structures holds a set of callback functions. These are + called by the BFD linker routines. The first argument to each + callback function is the bfd_link_info structure being used. Each + function returns a boolean value. If the function returns false, + then the BFD function which called it will return with a failure + indication. */ + +struct bfd_link_callbacks +{ + /* A function which is called when an object is added from an + archive. ABFD is the archive element being added. NAME is the + name of the symbol which caused the archive element to be pulled + in. */ + boolean (*add_archive_element) PARAMS ((struct bfd_link_info *, + bfd *abfd, + const char *name)); + /* A function which is called when a symbol is found with multiple + definitions. NAME is the symbol which is defined multiple times. + OBFD is the old BFD, OSEC is the old section, OVAL is the old + value, NBFD is the new BFD, NSEC is the new section, and NVAL is + the new value. OBFD may be NULL. OSEC and NSEC may be + bfd_com_section or bfd_ind_section. */ + boolean (*multiple_definition) PARAMS ((struct bfd_link_info *, + const char *name, + bfd *obfd, + asection *osec, + bfd_vma oval, + bfd *nbfd, + asection *nsec, + bfd_vma nval)); + /* A function which is called when a common symbol is defined + multiple times. NAME is the symbol appearing multiple times. + OBFD is the BFD of the existing symbol; it may be NULL if this is + not known. OTYPE is the type of the existing symbol, which may + be bfd_link_hash_defined, bfd_link_hash_defweak, + bfd_link_hash_common, or bfd_link_hash_indirect. If OTYPE is + bfd_link_hash_common, OSIZE is the size of the existing symbol. + NBFD is the BFD of the new symbol. NTYPE is the type of the new + symbol, one of bfd_link_hash_defined, bfd_link_hash_common, or + bfd_link_hash_indirect. If NTYPE is bfd_link_hash_common, NSIZE + is the size of the new symbol. */ + boolean (*multiple_common) PARAMS ((struct bfd_link_info *, + const char *name, + bfd *obfd, + enum bfd_link_hash_type otype, + bfd_vma osize, + bfd *nbfd, + enum bfd_link_hash_type ntype, + bfd_vma nsize)); + /* A function which is called to add a symbol to a set. ENTRY is + the link hash table entry for the set itself (e.g., + __CTOR_LIST__). RELOC is the relocation to use for an entry in + the set when generating a relocateable file, and is also used to + get the size of the entry when generating an executable file. + ABFD, SEC and VALUE identify the value to add to the set. */ + boolean (*add_to_set) PARAMS ((struct bfd_link_info *, + struct bfd_link_hash_entry *entry, + bfd_reloc_code_real_type reloc, + bfd *abfd, asection *sec, bfd_vma value)); + /* A function which is called when the name of a g++ constructor or + destructor is found. This is only called by some object file + formats. CONSTRUCTOR is true for a constructor, false for a + destructor. This will use BFD_RELOC_CTOR when generating a + relocateable file. NAME is the name of the symbol found. ABFD, + SECTION and VALUE are the value of the symbol. */ + boolean (*constructor) PARAMS ((struct bfd_link_info *, + boolean constructor, + const char *name, bfd *abfd, asection *sec, + bfd_vma value)); + /* A function which is called to issue a linker warning. For + example, this is called when there is a reference to a warning + symbol. WARNING is the warning to be issued. SYMBOL is the name + of the symbol which triggered the warning; it may be NULL if + there is none. ABFD, SECTION and ADDRESS identify the location + which trigerred the warning; either ABFD or SECTION or both may + be NULL if the location is not known. */ + boolean (*warning) PARAMS ((struct bfd_link_info *, + const char *warning, const char *symbol, + bfd *abfd, asection *section, + bfd_vma address)); + /* A function which is called when a relocation is attempted against + an undefined symbol. NAME is the symbol which is undefined. + ABFD, SECTION and ADDRESS identify the location from which the + reference is made. FATAL indicates whether an undefined symbol is + a fatal error or not. In some cases SECTION may be NULL. */ + boolean (*undefined_symbol) PARAMS ((struct bfd_link_info *, + const char *name, bfd *abfd, + asection *section, + bfd_vma address, + boolean fatal)); + /* A function which is called when a reloc overflow occurs. NAME is + the name of the symbol or section the reloc is against, + RELOC_NAME is the name of the relocation, and ADDEND is any + addend that is used. ABFD, SECTION and ADDRESS identify the + location at which the overflow occurs; if this is the result of a + bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then + ABFD will be NULL. */ + boolean (*reloc_overflow) PARAMS ((struct bfd_link_info *, + const char *name, + const char *reloc_name, bfd_vma addend, + bfd *abfd, asection *section, + bfd_vma address)); + /* A function which is called when a dangerous reloc is performed. + The canonical example is an a29k IHCONST reloc which does not + follow an IHIHALF reloc. MESSAGE is an appropriate message. + ABFD, SECTION and ADDRESS identify the location at which the + problem occurred; if this is the result of a + bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then + ABFD will be NULL. */ + boolean (*reloc_dangerous) PARAMS ((struct bfd_link_info *, + const char *message, + bfd *abfd, asection *section, + bfd_vma address)); + /* A function which is called when a reloc is found to be attached + to a symbol which is not being written out. NAME is the name of + the symbol. ABFD, SECTION and ADDRESS identify the location of + the reloc; if this is the result of a + bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then + ABFD will be NULL. */ + boolean (*unattached_reloc) PARAMS ((struct bfd_link_info *, + const char *name, + bfd *abfd, asection *section, + bfd_vma address)); + /* A function which is called when a symbol in notice_hash is + defined or referenced. NAME is the symbol. ABFD, SECTION and + ADDRESS are the value of the symbol. If SECTION is + bfd_und_section, this is a reference. */ + boolean (*notice) PARAMS ((struct bfd_link_info *, const char *name, + bfd *abfd, asection *section, bfd_vma address)); +}; + +/* The linker builds link_order structures which tell the code how to + include input data in the output file. */ + +/* These are the types of link_order structures. */ + +enum bfd_link_order_type +{ + bfd_undefined_link_order, /* Undefined. */ + bfd_indirect_link_order, /* Built from a section. */ + bfd_fill_link_order, /* Fill with a 16 bit constant. */ + bfd_data_link_order, /* Set to explicit data. */ + bfd_section_reloc_link_order, /* Relocate against a section. */ + bfd_symbol_reloc_link_order /* Relocate against a symbol. */ +}; + +/* This is the link_order structure itself. These form a chain + attached to the section whose contents they are describing. */ + +struct bfd_link_order +{ + /* Next link_order in chain. */ + struct bfd_link_order *next; + /* Type of link_order. */ + enum bfd_link_order_type type; + /* Offset within output section. */ + bfd_vma offset; + /* Size within output section. */ + bfd_size_type size; + /* Type specific information. */ + union + { + struct + { + /* Section to include. If this is used, then + section->output_section must be the section the + link_order is attached to, section->output_offset must + equal the link_order offset field, and section->_raw_size + must equal the link_order size field. Maybe these + restrictions should be relaxed someday. */ + asection *section; + } indirect; + struct + { + /* Value to fill with. */ + unsigned int value; + } fill; + struct + { + /* Data to put into file. The size field gives the number + of bytes which this field points to. */ + bfd_byte *contents; + } data; + struct + { + /* Description of reloc to generate. Used for + bfd_section_reloc_link_order and + bfd_symbol_reloc_link_order. */ + struct bfd_link_order_reloc *p; + } reloc; + } u; +}; + +/* A linker order of type bfd_section_reloc_link_order or + bfd_symbol_reloc_link_order means to create a reloc against a + section or symbol, respectively. This is used to implement -Ur to + generate relocs for the constructor tables. The + bfd_link_order_reloc structure describes the reloc that BFD should + create. It is similar to a arelent, but I didn't use arelent + because the linker does not know anything about most symbols, and + any asymbol structure it creates will be partially meaningless. + This information could logically be in the bfd_link_order struct, + but I didn't want to waste the space since these types of relocs + are relatively rare. */ + +struct bfd_link_order_reloc +{ + /* Reloc type. */ + bfd_reloc_code_real_type reloc; + + union + { + /* For type bfd_section_reloc_link_order, this is the section + the reloc should be against. This must be a section in the + output BFD, not any of the input BFDs. */ + asection *section; + /* For type bfd_symbol_reloc_link_order, this is the name of the + symbol the reloc should be against. */ + const char *name; + } u; + + /* Addend to use. The object file should contain zero. The BFD + backend is responsible for filling in the contents of the object + file correctly. For some object file formats (e.g., COFF) the + addend must be stored into in the object file, and for some + (e.g., SPARC a.out) it is kept in the reloc. */ + bfd_vma addend; +}; + +/* Allocate a new link_order for a section. */ +extern struct bfd_link_order *bfd_new_link_order PARAMS ((bfd *, asection *)); + +/* These structures are used to describe version information for the + ELF linker. These structures could be manipulated entirely inside + BFD, but it would be a pain. Instead, the regular linker sets up + these structures, and then passes them into BFD. */ + +/* Regular expressions for a version. */ + +struct bfd_elf_version_expr +{ + /* Next regular expression for this version. */ + struct bfd_elf_version_expr *next; + /* Regular expression. */ + const char *pattern; + /* Matching function. */ + int (*match) PARAMS((struct bfd_elf_version_expr *, const char *)); +}; + +/* Version dependencies. */ + +struct bfd_elf_version_deps +{ + /* Next dependency for this version. */ + struct bfd_elf_version_deps *next; + /* The version which this version depends upon. */ + struct bfd_elf_version_tree *version_needed; +}; + +/* A node in the version tree. */ + +struct bfd_elf_version_tree +{ + /* Next version. */ + struct bfd_elf_version_tree *next; + /* Name of this version. */ + const char *name; + /* Version number. */ + unsigned int vernum; + /* Regular expressions for global symbols in this version. */ + struct bfd_elf_version_expr *globals; + /* Regular expressions for local symbols in this version. */ + struct bfd_elf_version_expr *locals; + /* List of versions which this version depends upon. */ + struct bfd_elf_version_deps *deps; + /* Index of the version name. This is used within BFD. */ + unsigned int name_indx; + /* Whether this version tree was used. This is used within BFD. */ + int used; +}; + +#endif diff --git a/usr/local/nachos/info/cpp.info b/usr/local/nachos/info/cpp.info new file mode 100644 index 0000000..88f9c42 --- /dev/null +++ b/usr/local/nachos/info/cpp.info @@ -0,0 +1,80 @@ +This is Info file cpp.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/cpp.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* Cpp: (cpp). The GNU C preprocessor. +END-INFO-DIR-ENTRY + + This file documents the GNU C Preprocessor. + + Copyright 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1997, 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. + + +Indirect: +cpp.info-1: 947 +cpp.info-2: 50078 +cpp.info-3: 91263 + +Tag Table: +(Indirect) +Node: Top947 +Node: Global Actions3856 +Node: Directives6376 +Node: Header Files8063 +Node: Header Uses8722 +Node: Include Syntax10214 +Node: Include Operation13356 +Node: Once-Only15218 +Node: Inheritance17643 +Node: Macros20176 +Node: Simple Macros21090 +Node: Argument Macros24078 +Node: Predefined29876 +Node: Standard Predefined30306 +Node: Nonstandard Predefined37964 +Node: Stringification41540 +Node: Concatenation44466 +Node: Undefining47739 +Node: Redefining48778 +Node: Macro Pitfalls50078 +Node: Misnesting51182 +Node: Macro Parentheses52196 +Node: Swallow Semicolon54064 +Node: Side Effects55962 +Node: Self-Reference57660 +Node: Argument Prescan59936 +Node: Cascaded Macros64938 +Node: Newlines in Args66083 +Node: Conditionals67428 +Node: Conditional Uses68780 +Node: Conditional Syntax70203 +Node: #if Directive70789 +Node: #else Directive73078 +Node: #elif Directive73745 +Node: Deleted Code75123 +Node: Conditionals-Macros76184 +Node: Assertions79869 +Node: #error Directive84104 +Node: Combining Sources85589 +Node: Other Directives88500 +Node: Output89954 +Node: Invocation91263 +Node: Concept Index106047 +Node: Index109059 + +End Tag Table diff --git a/usr/local/nachos/info/cpp.info-1 b/usr/local/nachos/info/cpp.info-1 new file mode 100644 index 0000000..fbba980 --- /dev/null +++ b/usr/local/nachos/info/cpp.info-1 @@ -0,0 +1,1186 @@ +This is Info file cpp.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/cpp.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* Cpp: (cpp). The GNU C preprocessor. +END-INFO-DIR-ENTRY + + This file documents the GNU C Preprocessor. + + Copyright 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1997, 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. + + +File: cpp.info, Node: Top, Next: Global Actions, Up: (DIR) + +The C Preprocessor +****************** + + The C preprocessor is a "macro processor" that is used automatically +by the C compiler to transform your program before actual compilation. +It is called a macro processor because it allows you to define "macros", +which are brief abbreviations for longer constructs. + + The C preprocessor provides four separate facilities that you can +use as you see fit: + + * Inclusion of header files. These are files of declarations that + can be substituted into your program. + + * Macro expansion. You can define "macros", which are abbreviations + for arbitrary fragments of C code, and then the C preprocessor will + replace the macros with their definitions throughout the program. + + * Conditional compilation. Using special preprocessing directives, + you can include or exclude parts of the program according to + various conditions. + + * Line control. If you use a program to combine or rearrange source + files into an intermediate file which is then compiled, you can + use line control to inform the compiler of where each source line + originally came from. + + C preprocessors vary in some details. This manual discusses the GNU +C preprocessor, the C Compatible Compiler Preprocessor. The GNU C +preprocessor provides a superset of the features of ANSI Standard C. + + ANSI Standard C requires the rejection of many harmless constructs +commonly used by today's C programs. Such incompatibility would be +inconvenient for users, so the GNU C preprocessor is configured to +accept these constructs by default. Strictly speaking, to get ANSI +Standard C, you must use the options `-trigraphs', `-undef' and +`-pedantic', but in practice the consequences of having strict ANSI +Standard C make it undesirable to do this. *Note Invocation::. + + The C preprocessor is designed for C-like languages; you may run into +problems if you apply it to other kinds of languages, because it assumes +that it is dealing with C. For example, the C preprocessor sometimes +outputs extra white space to avoid inadvertent C token concatenation, +and this may cause problems with other languages. + +* Menu: + +* Global Actions:: Actions made uniformly on all input files. +* Directives:: General syntax of preprocessing directives. +* Header Files:: How and why to use header files. +* Macros:: How and why to use macros. +* Conditionals:: How and why to use conditionals. +* Combining Sources:: Use of line control when you combine source files. +* Other Directives:: Miscellaneous preprocessing directives. +* Output:: Format of output from the C preprocessor. +* Invocation:: How to invoke the preprocessor; command options. +* Concept Index:: Index of concepts and terms. +* Index:: Index of directives, predefined macros and options. + + +File: cpp.info, Node: Global Actions, Next: Directives, Prev: Top, Up: Top + +Transformations Made Globally +============================= + + Most C preprocessor features are inactive unless you give specific +directives to request their use. (Preprocessing directives are lines +starting with `#'; *note Directives::.). But there are three +transformations that the preprocessor always makes on all the input it +receives, even in the absence of directives. + + * All C comments are replaced with single spaces. + + * Backslash-Newline sequences are deleted, no matter where. This + feature allows you to break long lines for cosmetic purposes + without changing their meaning. + + * Predefined macro names are replaced with their expansions (*note + Predefined::.). + + The first two transformations are done *before* nearly all other +parsing and before preprocessing directives are recognized. Thus, for +example, you can split a line cosmetically with Backslash-Newline +anywhere (except when trigraphs are in use; see below). + + /* + */ # /* + */ defi\ + ne FO\ + O 10\ + 20 + +is equivalent into `#define FOO 1020'. You can split even an escape +sequence with Backslash-Newline. For example, you can split `"foo\bar"' +between the `\' and the `b' to get + + "foo\\ + bar" + +This behavior is unclean: in all other contexts, a Backslash can be +inserted in a string constant as an ordinary character by writing a +double Backslash, and this creates an exception. But the ANSI C +standard requires it. (Strict ANSI C does not allow Newlines in string +constants, so they do not consider this a problem.) + + But there are a few exceptions to all three transformations. + + * C comments and predefined macro names are not recognized inside a + `#include' directive in which the file name is delimited with `<' + and `>'. + + * C comments and predefined macro names are never recognized within a + character or string constant. (Strictly speaking, this is the + rule, not an exception, but it is worth noting here anyway.) + + * Backslash-Newline may not safely be used within an ANSI "trigraph". + Trigraphs are converted before Backslash-Newline is deleted. If + you write what looks like a trigraph with a Backslash-Newline + inside, the Backslash-Newline is deleted as usual, but it is then + too late to recognize the trigraph. + + This exception is relevant only if you use the `-trigraphs' option + to enable trigraph processing. *Note Invocation::. + + +File: cpp.info, Node: Directives, Next: Header Files, Prev: Global Actions, Up: Top + +Preprocessing Directives +======================== + + Most preprocessor features are active only if you use preprocessing +directives to request their use. + + Preprocessing directives are lines in your program that start with +`#'. The `#' is followed by an identifier that is the "directive name". +For example, `#define' is the directive that defines a macro. +Whitespace is also allowed before and after the `#'. + + The set of valid directive names is fixed. Programs cannot define +new preprocessing directives. + + Some directive names require arguments; these make up the rest of +the directive line and must be separated from the directive name by +whitespace. For example, `#define' must be followed by a macro name +and the intended expansion of the macro. *Note Simple Macros::. + + A preprocessing directive cannot be more than one line in normal +circumstances. It may be split cosmetically with Backslash-Newline, +but that has no effect on its meaning. Comments containing Newlines +can also divide the directive into multiple lines, but the comments are +changed to Spaces before the directive is interpreted. The only way a +significant Newline can occur in a preprocessing directive is within a +string constant or character constant. Note that most C compilers that +might be applied to the output from the preprocessor do not accept +string or character constants containing Newlines. + + The `#' and the directive name cannot come from a macro expansion. +For example, if `foo' is defined as a macro expanding to `define', that +does not make `#foo' a valid preprocessing directive. + + +File: cpp.info, Node: Header Files, Next: Macros, Prev: Directives, Up: Top + +Header Files +============ + + A header file is a file containing C declarations and macro +definitions (*note Macros::.) to be shared between several source +files. You request the use of a header file in your program with the C +preprocessing directive `#include'. + +* Menu: + +* Header Uses:: What header files are used for. +* Include Syntax:: How to write `#include' directives. +* Include Operation:: What `#include' does. +* Once-Only:: Preventing multiple inclusion of one header file. +* Inheritance:: Including one header file in another header file. + + +File: cpp.info, Node: Header Uses, Next: Include Syntax, Prev: Header Files, Up: Header Files + +Uses of Header Files +-------------------- + + Header files serve two kinds of purposes. + + * System header files declare the interfaces to parts of the + operating system. You include them in your program to supply the + definitions and declarations you need to invoke system calls and + libraries. + + * Your own header files contain declarations for interfaces between + the source files of your program. Each time you have a group of + related declarations and macro definitions all or most of which + are needed in several different source files, it is a good idea to + create a header file for them. + + Including a header file produces the same results in C compilation as +copying the header file into each source file that needs it. But such +copying would be time-consuming and error-prone. With a header file, +the related declarations appear in only one place. If they need to be +changed, they can be changed in one place, and programs that include +the header file will automatically use the new version when next +recompiled. The header file eliminates the labor of finding and +changing all the copies as well as the risk that a failure to find one +copy will result in inconsistencies within a program. + + The usual convention is to give header files names that end with +`.h'. Avoid unusual characters in header file names, as they reduce +portability. + + +File: cpp.info, Node: Include Syntax, Next: Include Operation, Prev: Header Uses, Up: Header Files + +The `#include' Directive +------------------------ + + Both user and system header files are included using the +preprocessing directive `#include'. It has three variants: + +`#include ' + This variant is used for system header files. It searches for a + file named FILE in a list of directories specified by you, then in + a standard list of system directories. You specify directories to + search for header files with the command option `-I' (*note + Invocation::.). The option `-nostdinc' inhibits searching the + standard system directories; in this case only the directories you + specify are searched. + + The parsing of this form of `#include' is slightly special because + comments are not recognized within the `<...>'. Thus, in + `#include ' the `/*' does not start a comment and the + directive specifies inclusion of a system header file named + `x/*y'. Of course, a header file with such a name is unlikely to + exist on Unix, where shell wildcard features would make it hard to + manipulate. + + The argument FILE may not contain a `>' character. It may, + however, contain a `<' character. + +`#include "FILE"' + This variant is used for header files of your own program. It + searches for a file named FILE first in the current directory, + then in the same directories used for system header files. The + current directory is the directory of the current input file. It + is tried first because it is presumed to be the location of the + files that the current input file refers to. (If the `-I-' option + is used, the special treatment of the current directory is + inhibited.) + + The argument FILE may not contain `"' characters. If backslashes + occur within FILE, they are considered ordinary text characters, + not escape characters. None of the character escape sequences + appropriate to string constants in C are processed. Thus, + `#include "x\n\\y"' specifies a filename containing three + backslashes. It is not clear why this behavior is ever useful, but + the ANSI standard specifies it. + +`#include ANYTHING ELSE' + This variant is called a "computed #include". Any `#include' + directive whose argument does not fit the above two forms is a + computed include. The text ANYTHING ELSE is checked for macro + calls, which are expanded (*note Macros::.). When this is done, + the result must fit one of the above two variants--in particular, + the expanded text must in the end be surrounded by either quotes + or angle braces. + + This feature allows you to define a macro which controls the file + name to be used at a later point in the program. One application + of this is to allow a site-specific configuration file for your + program to specify the names of the system include files to be + used. This can help in porting the program to various operating + systems in which the necessary system header files are found in + different places. + + +File: cpp.info, Node: Include Operation, Next: Once-Only, Prev: Include Syntax, Up: Header Files + +How `#include' Works +-------------------- + + The `#include' directive works by directing the C preprocessor to +scan the specified file as input before continuing with the rest of the +current file. The output from the preprocessor contains the output +already generated, followed by the output resulting from the included +file, followed by the output that comes from the text after the +`#include' directive. For example, given a header file `header.h' as +follows, + + char *test (); + +and a main program called `program.c' that uses the header file, like +this, + + int x; + #include "header.h" + + main () + { + printf (test ()); + } + +the output generated by the C preprocessor for `program.c' as input +would be + + int x; + char *test (); + + main () + { + printf (test ()); + } + + Included files are not limited to declarations and macro +definitions; those are merely the typical uses. Any fragment of a C +program can be included from another file. The include file could even +contain the beginning of a statement that is concluded in the +containing file, or the end of a statement that was started in the +including file. However, a comment or a string or character constant +may not start in the included file and finish in the including file. +An unterminated comment, string constant or character constant in an +included file is considered to end (with an error message) at the end +of the file. + + It is possible for a header file to begin or end a syntactic unit +such as a function definition, but that would be very confusing, so +don't do it. + + The line following the `#include' directive is always treated as a +separate line by the C preprocessor even if the included file lacks a +final newline. + + +File: cpp.info, Node: Once-Only, Next: Inheritance, Prev: Include Operation, Up: Header Files + +Once-Only Include Files +----------------------- + + Very often, one header file includes another. It can easily result +that a certain header file is included more than once. This may lead +to errors, if the header file defines structure types or typedefs, and +is certainly wasteful. Therefore, we often wish to prevent multiple +inclusion of a header file. + + The standard way to do this is to enclose the entire real contents +of the file in a conditional, like this: + + #ifndef FILE_FOO_SEEN + #define FILE_FOO_SEEN + + THE ENTIRE FILE + + #endif /* FILE_FOO_SEEN */ + + The macro `FILE_FOO_SEEN' indicates that the file has been included +once already. In a user header file, the macro name should not begin +with `_'. In a system header file, this name should begin with `__' to +avoid conflicts with user programs. In any kind of header file, the +macro name should contain the name of the file and some additional +text, to avoid conflicts with other header files. + + The GNU C preprocessor is programmed to notice when a header file +uses this particular construct and handle it efficiently. If a header +file is contained entirely in a `#ifndef' conditional, then it records +that fact. If a subsequent `#include' specifies the same file, and the +macro in the `#ifndef' is already defined, then the file is entirely +skipped, without even reading it. + + There is also an explicit directive to tell the preprocessor that it +need not include a file more than once. This is called `#pragma once', +and was used *in addition to* the `#ifndef' conditional around the +contents of the header file. `#pragma once' is now obsolete and should +not be used at all. + + In the Objective C language, there is a variant of `#include' called +`#import' which includes a file, but does so at most once. If you use +`#import' *instead of* `#include', then you don't need the conditionals +inside the header file to prevent multiple execution of the contents. + + `#import' is obsolete because it is not a well designed feature. It +requires the users of a header file--the applications programmers--to +know that a certain header file should only be included once. It is +much better for the header file's implementor to write the file so that +users don't need to know this. Using `#ifndef' accomplishes this goal. + + +File: cpp.info, Node: Inheritance, Prev: Once-Only, Up: Header Files + +Inheritance and Header Files +---------------------------- + + "Inheritance" is what happens when one object or file derives some +of its contents by virtual copying from another object or file. In the +case of C header files, inheritance means that one header file includes +another header file and then replaces or adds something. + + If the inheriting header file and the base header file have different +names, then inheritance is straightforward: simply write `#include +"BASE"' in the inheriting file. + + Sometimes it is necessary to give the inheriting file the same name +as the base file. This is less straightforward. + + For example, suppose an application program uses the system header +`sys/signal.h', but the version of `/usr/include/sys/signal.h' on a +particular system doesn't do what the application program expects. It +might be convenient to define a "local" version, perhaps under the name +`/usr/local/include/sys/signal.h', to override or add to the one +supplied by the system. + + You can do this by compiling with the option `-I.', and writing a +file `sys/signal.h' that does what the application program expects. +But making this file include the standard `sys/signal.h' is not so +easy--writing `#include ' in that file doesn't work, +because it includes your own version of the file, not the standard +system version. Used in that file itself, this leads to an infinite +recursion and a fatal error in compilation. + + `#include ' would find the proper file, +but that is not clean, since it makes an assumption about where the +system header file is found. This is bad for maintenance, since it +means that any change in where the system's header files are kept +requires a change somewhere else. + + The clean way to solve this problem is to use `#include_next', which +means, "Include the *next* file with this name." This directive works +like `#include' except in searching for the specified file: it starts +searching the list of header file directories *after* the directory in +which the current file was found. + + Suppose you specify `-I /usr/local/include', and the list of +directories to search also includes `/usr/include'; and suppose both +directories contain `sys/signal.h'. Ordinary `#include ' +finds the file under `/usr/local/include'. If that file contains +`#include_next ', it starts searching after that +directory, and finds the file in `/usr/include'. + + +File: cpp.info, Node: Macros, Next: Conditionals, Prev: Header Files, Up: Top + +Macros +====== + + A macro is a sort of abbreviation which you can define once and then +use later. There are many complicated features associated with macros +in the C preprocessor. + +* Menu: + +* Simple Macros:: Macros that always expand the same way. +* Argument Macros:: Macros that accept arguments that are substituted + into the macro expansion. +* Predefined:: Predefined macros that are always available. +* Stringification:: Macro arguments converted into string constants. +* Concatenation:: Building tokens from parts taken from macro arguments. +* Undefining:: Cancelling a macro's definition. +* Redefining:: Changing a macro's definition. +* Macro Pitfalls:: Macros can confuse the unwary. Here we explain + several common problems and strange features. + + +File: cpp.info, Node: Simple Macros, Next: Argument Macros, Prev: Macros, Up: Macros + +Simple Macros +------------- + + A "simple macro" is a kind of abbreviation. It is a name which +stands for a fragment of code. Some people refer to these as "manifest +constants". + + Before you can use a macro, you must "define" it explicitly with the +`#define' directive. `#define' is followed by the name of the macro +and then the code it should be an abbreviation for. For example, + + #define BUFFER_SIZE 1020 + +defines a macro named `BUFFER_SIZE' as an abbreviation for the text +`1020'. If somewhere after this `#define' directive there comes a C +statement of the form + + foo = (char *) xmalloc (BUFFER_SIZE); + +then the C preprocessor will recognize and "expand" the macro +`BUFFER_SIZE', resulting in + + foo = (char *) xmalloc (1020); + + The use of all upper case for macro names is a standard convention. +Programs are easier to read when it is possible to tell at a glance +which names are macros. + + Normally, a macro definition must be a single line, like all C +preprocessing directives. (You can split a long macro definition +cosmetically with Backslash-Newline.) There is one exception: Newlines +can be included in the macro definition if within a string or character +constant. This is because it is not possible for a macro definition to +contain an unbalanced quote character; the definition automatically +extends to include the matching quote character that ends the string or +character constant. Comments within a macro definition may contain +Newlines, which make no difference since the comments are entirely +replaced with Spaces regardless of their contents. + + Aside from the above, there is no restriction on what can go in a +macro body. Parentheses need not balance. The body need not resemble +valid C code. (But if it does not, you may get error messages from the +C compiler when you use the macro.) + + The C preprocessor scans your program sequentially, so macro +definitions take effect at the place you write them. Therefore, the +following input to the C preprocessor + + foo = X; + #define X 4 + bar = X; + +produces as output + + foo = X; + + bar = 4; + + After the preprocessor expands a macro name, the macro's definition +body is appended to the front of the remaining input, and the check for +macro calls continues. Therefore, the macro body can contain calls to +other macros. For example, after + + #define BUFSIZE 1020 + #define TABLESIZE BUFSIZE + +the name `TABLESIZE' when used in the program would go through two +stages of expansion, resulting ultimately in `1020'. + + This is not at all the same as defining `TABLESIZE' to be `1020'. +The `#define' for `TABLESIZE' uses exactly the body you specify--in +this case, `BUFSIZE'--and does not check to see whether it too is the +name of a macro. It's only when you *use* `TABLESIZE' that the result +of its expansion is checked for more macro names. *Note Cascaded +Macros::. + + +File: cpp.info, Node: Argument Macros, Next: Predefined, Prev: Simple Macros, Up: Macros + +Macros with Arguments +--------------------- + + A simple macro always stands for exactly the same text, each time it +is used. Macros can be more flexible when they accept "arguments". +Arguments are fragments of code that you supply each time the macro is +used. These fragments are included in the expansion of the macro +according to the directions in the macro definition. A macro that +accepts arguments is called a "function-like macro" because the syntax +for using it looks like a function call. + + To define a macro that uses arguments, you write a `#define' +directive with a list of "argument names" in parentheses after the name +of the macro. The argument names may be any valid C identifiers, +separated by commas and optionally whitespace. The open-parenthesis +must follow the macro name immediately, with no space in between. + + For example, here is a macro that computes the minimum of two numeric +values, as it is defined in many C programs: + + #define min(X, Y) ((X) < (Y) ? (X) : (Y)) + +(This is not the best way to define a "minimum" macro in GNU C. *Note +Side Effects::, for more information.) + + To use a macro that expects arguments, you write the name of the +macro followed by a list of "actual arguments" in parentheses, +separated by commas. The number of actual arguments you give must +match the number of arguments the macro expects. Examples of use of +the macro `min' include `min (1, 2)' and `min (x + 28, *p)'. + + The expansion text of the macro depends on the arguments you use. +Each of the argument names of the macro is replaced, throughout the +macro definition, with the corresponding actual argument. Using the +same macro `min' defined above, `min (1, 2)' expands into + + ((1) < (2) ? (1) : (2)) + +where `1' has been substituted for `X' and `2' for `Y'. + + Likewise, `min (x + 28, *p)' expands into + + ((x + 28) < (*p) ? (x + 28) : (*p)) + + Parentheses in the actual arguments must balance; a comma within +parentheses does not end an argument. However, there is no requirement +for brackets or braces to balance, and they do not prevent a comma from +separating arguments. Thus, + + macro (array[x = y, x + 1]) + +passes two arguments to `macro': `array[x = y' and `x + 1]'. If you +want to supply `array[x = y, x + 1]' as an argument, you must write it +as `array[(x = y, x + 1)]', which is equivalent C code. + + After the actual arguments are substituted into the macro body, the +entire result is appended to the front of the remaining input, and the +check for macro calls continues. Therefore, the actual arguments can +contain calls to other macros, either with or without arguments, or +even to the same macro. The macro body can also contain calls to other +macros. For example, `min (min (a, b), c)' expands into this text: + + ((((a) < (b) ? (a) : (b))) < (c) + ? (((a) < (b) ? (a) : (b))) + : (c)) + +(Line breaks shown here for clarity would not actually be generated.) + + If a macro `foo' takes one argument, and you want to supply an empty +argument, you must write at least some whitespace between the +parentheses, like this: `foo ( )'. Just `foo ()' is providing no +arguments, which is an error if `foo' expects an argument. But `foo0 +()' is the correct way to call a macro defined to take zero arguments, +like this: + + #define foo0() ... + + If you use the macro name followed by something other than an +open-parenthesis (after ignoring any spaces, tabs and comments that +follow), it is not a call to the macro, and the preprocessor does not +change what you have written. Therefore, it is possible for the same +name to be a variable or function in your program as well as a macro, +and you can choose in each instance whether to refer to the macro (if +an actual argument list follows) or the variable or function (if an +argument list does not follow). + + Such dual use of one name could be confusing and should be avoided +except when the two meanings are effectively synonymous: that is, when +the name is both a macro and a function and the two have similar +effects. You can think of the name simply as a function; use of the +name for purposes other than calling it (such as, to take the address) +will refer to the function, while calls will expand the macro and +generate better but equivalent code. For example, you can use a +function named `min' in the same source file that defines the macro. +If you write `&min' with no argument list, you refer to the function. +If you write `min (x, bb)', with an argument list, the macro is +expanded. If you write `(min) (a, bb)', where the name `min' is not +followed by an open-parenthesis, the macro is not expanded, so you wind +up with a call to the function `min'. + + You may not define the same name as both a simple macro and a macro +with arguments. + + In the definition of a macro with arguments, the list of argument +names must follow the macro name immediately with no space in between. +If there is a space after the macro name, the macro is defined as +taking no arguments, and all the rest of the line is taken to be the +expansion. The reason for this is that it is often useful to define a +macro that takes no arguments and whose definition begins with an +identifier in parentheses. This rule about spaces makes it possible +for you to do either this: + + #define FOO(x) - 1 / (x) + +(which defines `FOO' to take an argument and expand into minus the +reciprocal of that argument) or this: + + #define BAR (x) - 1 / (x) + +(which defines `BAR' to take no argument and always expand into `(x) - +1 / (x)'). + + Note that the *uses* of a macro with arguments can have spaces before +the left parenthesis; it's the *definition* where it matters whether +there is a space. + + +File: cpp.info, Node: Predefined, Next: Stringification, Prev: Argument Macros, Up: Macros + +Predefined Macros +----------------- + + Several simple macros are predefined. You can use them without +giving definitions for them. They fall into two classes: standard +macros and system-specific macros. + +* Menu: + +* Standard Predefined:: Standard predefined macros. +* Nonstandard Predefined:: Nonstandard predefined macros. + + +File: cpp.info, Node: Standard Predefined, Next: Nonstandard Predefined, Prev: Predefined, Up: Predefined + +Standard Predefined Macros +.......................... + + The standard predefined macros are available with the same meanings +regardless of the machine or operating system on which you are using +GNU C. Their names all start and end with double underscores. Those +preceding `__GNUC__' in this table are standardized by ANSI C; the rest +are GNU C extensions. + +`__FILE__' + This macro expands to the name of the current input file, in the + form of a C string constant. The precise name returned is the one + that was specified in `#include' or as the input file name + argument. + +`__LINE__' + This macro expands to the current input line number, in the form + of a decimal integer constant. While we call it a predefined + macro, it's a pretty strange macro, since its "definition" changes + with each new line of source code. + + This and `__FILE__' are useful in generating an error message to + report an inconsistency detected by the program; the message can + state the source line at which the inconsistency was detected. + For example, + + fprintf (stderr, "Internal error: " + "negative string length " + "%d at %s, line %d.", + length, __FILE__, __LINE__); + + A `#include' directive changes the expansions of `__FILE__' and + `__LINE__' to correspond to the included file. At the end of that + file, when processing resumes on the input file that contained the + `#include' directive, the expansions of `__FILE__' and `__LINE__' + revert to the values they had before the `#include' (but + `__LINE__' is then incremented by one as processing moves to the + line after the `#include'). + + The expansions of both `__FILE__' and `__LINE__' are altered if a + `#line' directive is used. *Note Combining Sources::. + +`__DATE__' + This macro expands to a string constant that describes the date on + which the preprocessor is being run. The string constant contains + eleven characters and looks like `"Feb 1 1996"'. + +`__TIME__' + This macro expands to a string constant that describes the time at + which the preprocessor is being run. The string constant contains + eight characters and looks like `"23:59:01"'. + +`__STDC__' + This macro expands to the constant 1, to signify that this is ANSI + Standard C. (Whether that is actually true depends on what C + compiler will operate on the output from the preprocessor.) + + On some hosts, system include files use a different convention, + where `__STDC__' is normally 0, but is 1 if the user specifies + strict conformance to the C Standard. The preprocessor follows + the host convention when processing system include files, but when + processing user files it follows the usual GNU C convention. + + This macro is not defined if the `-traditional' option is used. + +`__STDC_VERSION__' + This macro expands to the C Standard's version number, a long + integer constant of the form `YYYYMML' where YYYY and MM are the + year and month of the Standard version. This signifies which + version of the C Standard the preprocessor conforms to. Like + `__STDC__', whether this version number is accurate for the entire + implementation depends on what C compiler will operate on the + output from the preprocessor. + + This macro is not defined if the `-traditional' option is used. + +`__GNUC__' + This macro is defined if and only if this is GNU C. This macro is + defined only when the entire GNU C compiler is in use; if you + invoke the preprocessor directly, `__GNUC__' is undefined. The + value identifies the major version number of GNU CC (`1' for GNU CC + version 1, which is now obsolete, and `2' for version 2). + +`__GNUC_MINOR__' + The macro contains the minor version number of the compiler. This + can be used to work around differences between different releases + of the compiler (for example, if gcc 2.6.3 is known to support a + feature, you can test for `__GNUC__ > 2 || (__GNUC__ == 2 && + __GNUC_MINOR__ >= 6)'). The last number, `3' in the example + above, denotes the bugfix level of the compiler; no macro contains + this value. + +`__GNUG__' + The GNU C compiler defines this when the compilation language is + C++; use `__GNUG__' to distinguish between GNU C and GNU C++. + +`__cplusplus' + The draft ANSI standard for C++ used to require predefining this + variable. Though it is no longer required, GNU C++ continues to + define it, as do other popular C++ compilers. You can use + `__cplusplus' to test whether a header is compiled by a C compiler + or a C++ compiler. + +`__STRICT_ANSI__' + GNU C defines this macro if and only if the `-ansi' switch was + specified when GNU C was invoked. Its definition is the null + string. This macro exists primarily to direct certain GNU header + files not to define certain traditional Unix constructs which are + incompatible with ANSI C. + +`__BASE_FILE__' + This macro expands to the name of the main input file, in the form + of a C string constant. This is the source file that was specified + as an argument when the C compiler was invoked. + +`__INCLUDE_LEVEL__' + This macro expands to a decimal integer constant that represents + the depth of nesting in include files. The value of this macro is + incremented on every `#include' directive and decremented at every + end of file. For input files specified by command line arguments, + the nesting level is zero. + +`__VERSION__' + This macro expands to a string constant which describes the + version number of GNU C. The string is normally a sequence of + decimal numbers separated by periods, such as `"2.6.0"'. + +`__OPTIMIZE__' + GNU CC defines this macro in optimizing compilations. It causes + certain GNU header files to define alternative macro definitions + for some system library functions. You should not refer to or + test the definition of this macro unless you make very sure that + programs will execute with the same effect regardless. + +`__CHAR_UNSIGNED__' + GNU C defines this macro if and only if the data type `char' is + unsigned on the target machine. It exists to cause the standard + header file `limits.h' to work correctly. You should not refer to + this macro yourself; instead, refer to the standard macros defined + in `limits.h'. The preprocessor uses this macro to determine + whether or not to sign-extend large character constants written in + octal; see *Note The `#if' Directive: #if Directive. + +`__REGISTER_PREFIX__' + This macro expands to a string (not a string constant) describing + the prefix applied to CPU registers in assembler code. You can + use it to write assembler code that is usable in multiple + environments. For example, in the `m68k-aout' environment it + expands to the null string, but in the `m68k-coff' environment it + expands to the string `%'. + +`__USER_LABEL_PREFIX__' + Similar to `__REGISTER_PREFIX__', but describes the prefix applied + to user generated labels in assembler code. For example, in the + `m68k-aout' environment it expands to the string `_', but in the + `m68k-coff' environment it expands to the null string. This does + not work with the `-mno-underscores' option that the i386 OSF/rose + and m88k targets provide nor with the `-mcall*' options of the + rs6000 System V Release 4 target. + + +File: cpp.info, Node: Nonstandard Predefined, Prev: Standard Predefined, Up: Predefined + +Nonstandard Predefined Macros +............................. + + The C preprocessor normally has several predefined macros that vary +between machines because their purpose is to indicate what type of +system and machine is in use. This manual, being for all systems and +machines, cannot tell you exactly what their names are; instead, we +offer a list of some typical ones. You can use `cpp -dM' to see the +values of predefined macros; see *Note Invocation::. + + Some nonstandard predefined macros describe the operating system in +use, with more or less specificity. For example, + +`unix' + `unix' is normally predefined on all Unix systems. + +`BSD' + `BSD' is predefined on recent versions of Berkeley Unix (perhaps + only in version 4.3). + + Other nonstandard predefined macros describe the kind of CPU, with +more or less specificity. For example, + +`vax' + `vax' is predefined on Vax computers. + +`mc68000' + `mc68000' is predefined on most computers whose CPU is a Motorola + 68000, 68010 or 68020. + +`m68k' + `m68k' is also predefined on most computers whose CPU is a 68000, + 68010 or 68020; however, some makers use `mc68000' and some use + `m68k'. Some predefine both names. What happens in GNU C depends + on the system you are using it on. + +`M68020' + `M68020' has been observed to be predefined on some systems that + use 68020 CPUs--in addition to `mc68000' and `m68k', which are + less specific. + +`_AM29K' +`_AM29000' + Both `_AM29K' and `_AM29000' are predefined for the AMD 29000 CPU + family. + +`ns32000' + `ns32000' is predefined on computers which use the National + Semiconductor 32000 series CPU. + + Yet other nonstandard predefined macros describe the manufacturer of +the system. For example, + +`sun' + `sun' is predefined on all models of Sun computers. + +`pyr' + `pyr' is predefined on all models of Pyramid computers. + +`sequent' + `sequent' is predefined on all models of Sequent computers. + + These predefined symbols are not only nonstandard, they are contrary +to the ANSI standard because their names do not start with underscores. +Therefore, the option `-ansi' inhibits the definition of these symbols. + + This tends to make `-ansi' useless, since many programs depend on the +customary nonstandard predefined symbols. Even system header files +check them and will generate incorrect declarations if they do not find +the names that are expected. You might think that the header files +supplied for the Uglix computer would not need to test what machine +they are running on, because they can simply assume it is the Uglix; +but often they do, and they do so using the customary names. As a +result, very few C programs will compile with `-ansi'. We intend to +avoid such problems on the GNU system. + + What, then, should you do in an ANSI C program to test the type of +machine it will run on? + + GNU C offers a parallel series of symbols for this purpose, whose +names are made from the customary ones by adding `__' at the beginning +and end. Thus, the symbol `__vax__' would be available on a Vax, and +so on. + + The set of nonstandard predefined names in the GNU C preprocessor is +controlled (when `cpp' is itself compiled) by the macro +`CPP_PREDEFINES', which should be a string containing `-D' options, +separated by spaces. For example, on the Sun 3, we use the following +definition: + + #define CPP_PREDEFINES "-Dmc68000 -Dsun -Dunix -Dm68k" + +This macro is usually specified in `tm.h'. + + +File: cpp.info, Node: Stringification, Next: Concatenation, Prev: Predefined, Up: Macros + +Stringification +--------------- + + "Stringification" means turning a code fragment into a string +constant whose contents are the text for the code fragment. For +example, stringifying `foo (z)' results in `"foo (z)"'. + + In the C preprocessor, stringification is an option available when +macro arguments are substituted into the macro definition. In the body +of the definition, when an argument name appears, the character `#' +before the name specifies stringification of the corresponding actual +argument when it is substituted at that point in the definition. The +same argument may be substituted in other places in the definition +without stringification if the argument name appears in those places +with no `#'. + + Here is an example of a macro definition that uses stringification: + + #define WARN_IF(EXP) \ + do { if (EXP) \ + fprintf (stderr, "Warning: " #EXP "\n"); } \ + while (0) + +Here the actual argument for `EXP' is substituted once as given, into +the `if' statement, and once as stringified, into the argument to +`fprintf'. The `do' and `while (0)' are a kludge to make it possible +to write `WARN_IF (ARG);', which the resemblance of `WARN_IF' to a +function would make C programmers want to do; see *Note Swallow +Semicolon::. + + The stringification feature is limited to transforming one macro +argument into one string constant: there is no way to combine the +argument with other text and then stringify it all together. But the +example above shows how an equivalent result can be obtained in ANSI +Standard C using the feature that adjacent string constants are +concatenated as one string constant. The preprocessor stringifies the +actual value of `EXP' into a separate string constant, resulting in +text like + + do { if (x == 0) \ + fprintf (stderr, "Warning: " "x == 0" "\n"); } \ + while (0) + +but the C compiler then sees three consecutive string constants and +concatenates them into one, producing effectively + + do { if (x == 0) \ + fprintf (stderr, "Warning: x == 0\n"); } \ + while (0) + + Stringification in C involves more than putting doublequote +characters around the fragment; it is necessary to put backslashes in +front of all doublequote characters, and all backslashes in string and +character constants, in order to get a valid C string constant with the +proper contents. Thus, stringifying `p = "foo\n";' results in `"p = +\"foo\\n\";"'. However, backslashes that are not inside of string or +character constants are not duplicated: `\n' by itself stringifies to +`"\n"'. + + Whitespace (including comments) in the text being stringified is +handled according to precise rules. All leading and trailing +whitespace is ignored. Any sequence of whitespace in the middle of the +text is converted to a single space in the stringified result. + + +File: cpp.info, Node: Concatenation, Next: Undefining, Prev: Stringification, Up: Macros + +Concatenation +------------- + + "Concatenation" means joining two strings into one. In the context +of macro expansion, concatenation refers to joining two lexical units +into one longer one. Specifically, an actual argument to the macro can +be concatenated with another actual argument or with fixed text to +produce a longer name. The longer name might be the name of a function, +variable or type, or a C keyword; it might even be the name of another +macro, in which case it will be expanded. + + When you define a macro, you request concatenation with the special +operator `##' in the macro body. When the macro is called, after +actual arguments are substituted, all `##' operators are deleted, and +so is any whitespace next to them (including whitespace that was part +of an actual argument). The result is to concatenate the syntactic +tokens on either side of the `##'. + + Consider a C program that interprets named commands. There probably +needs to be a table of commands, perhaps an array of structures +declared as follows: + + struct command + { + char *name; + void (*function) (); + }; + + struct command commands[] = + { + { "quit", quit_command}, + { "help", help_command}, + ... + }; + + It would be cleaner not to have to give each command name twice, +once in the string constant and once in the function name. A macro +which takes the name of a command as an argument can make this +unnecessary. The string constant can be created with stringification, +and the function name by concatenating the argument with `_command'. +Here is how it is done: + + #define COMMAND(NAME) { #NAME, NAME ## _command } + + struct command commands[] = + { + COMMAND (quit), + COMMAND (help), + ... + }; + + The usual case of concatenation is concatenating two names (or a +name and a number) into a longer name. But this isn't the only valid +case. It is also possible to concatenate two numbers (or a number and +a name, such as `1.5' and `e3') into a number. Also, multi-character +operators such as `+=' can be formed by concatenation. In some cases +it is even possible to piece together a string constant. However, two +pieces of text that don't together form a valid lexical unit cannot be +concatenated. For example, concatenation with `x' on one side and `+' +on the other is not meaningful because those two characters can't fit +together in any lexical unit of C. The ANSI standard says that such +attempts at concatenation are undefined, but in the GNU C preprocessor +it is well defined: it puts the `x' and `+' side by side with no +particular special results. + + Keep in mind that the C preprocessor converts comments to whitespace +before macros are even considered. Therefore, you cannot create a +comment by concatenating `/' and `*': the `/*' sequence that starts a +comment is not a lexical unit, but rather the beginning of a "long" +space character. Also, you can freely use comments next to a `##' in a +macro definition, or in actual arguments that will be concatenated, +because the comments will be converted to spaces at first sight, and +concatenation will later discard the spaces. + + +File: cpp.info, Node: Undefining, Next: Redefining, Prev: Concatenation, Up: Macros + +Undefining Macros +----------------- + + To "undefine" a macro means to cancel its definition. This is done +with the `#undef' directive. `#undef' is followed by the macro name to +be undefined. + + Like definition, undefinition occurs at a specific point in the +source file, and it applies starting from that point. The name ceases +to be a macro name, and from that point on it is treated by the +preprocessor as if it had never been a macro name. + + For example, + + #define FOO 4 + x = FOO; + #undef FOO + x = FOO; + +expands into + + x = 4; + + x = FOO; + +In this example, `FOO' had better be a variable or function as well as +(temporarily) a macro, in order for the result of the expansion to be +valid C code. + + The same form of `#undef' directive will cancel definitions with +arguments or definitions that don't expect arguments. The `#undef' +directive has no effect when used on a name not currently defined as a +macro. + + +File: cpp.info, Node: Redefining, Next: Macro Pitfalls, Prev: Undefining, Up: Macros + +Redefining Macros +----------------- + + "Redefining" a macro means defining (with `#define') a name that is +already defined as a macro. + + A redefinition is trivial if the new definition is transparently +identical to the old one. You probably wouldn't deliberately write a +trivial redefinition, but they can happen automatically when a header +file is included more than once (*note Header Files::.), so they are +accepted silently and without effect. + + Nontrivial redefinition is considered likely to be an error, so it +provokes a warning message from the preprocessor. However, sometimes it +is useful to change the definition of a macro in mid-compilation. You +can inhibit the warning by undefining the macro with `#undef' before the +second definition. + + In order for a redefinition to be trivial, the new definition must +exactly match the one already in effect, with two possible exceptions: + + * Whitespace may be added or deleted at the beginning or the end. + + * Whitespace may be changed in the middle (but not inside strings). + However, it may not be eliminated entirely, and it may not be added + where there was no whitespace at all. + + Recall that a comment counts as whitespace. + diff --git a/usr/local/nachos/info/cpp.info-2 b/usr/local/nachos/info/cpp.info-2 new file mode 100644 index 0000000..f5bfed6 --- /dev/null +++ b/usr/local/nachos/info/cpp.info-2 @@ -0,0 +1,1063 @@ +This is Info file cpp.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/cpp.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* Cpp: (cpp). The GNU C preprocessor. +END-INFO-DIR-ENTRY + + This file documents the GNU C Preprocessor. + + Copyright 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1997, 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. + + +File: cpp.info, Node: Macro Pitfalls, Prev: Redefining, Up: Macros + +Pitfalls and Subtleties of Macros +--------------------------------- + + In this section we describe some special rules that apply to macros +and macro expansion, and point out certain cases in which the rules have +counterintuitive consequences that you must watch out for. + +* Menu: + +* Misnesting:: Macros can contain unmatched parentheses. +* Macro Parentheses:: Why apparently superfluous parentheses + may be necessary to avoid incorrect grouping. +* Swallow Semicolon:: Macros that look like functions + but expand into compound statements. +* Side Effects:: Unsafe macros that cause trouble when + arguments contain side effects. +* Self-Reference:: Macros whose definitions use the macros' own names. +* Argument Prescan:: Actual arguments are checked for macro calls + before they are substituted. +* Cascaded Macros:: Macros whose definitions use other macros. +* Newlines in Args:: Sometimes line numbers get confused. + + +File: cpp.info, Node: Misnesting, Next: Macro Parentheses, Prev: Macro Pitfalls, Up: Macro Pitfalls + +Improperly Nested Constructs +............................ + + Recall that when a macro is called with arguments, the arguments are +substituted into the macro body and the result is checked, together with +the rest of the input file, for more macro calls. + + It is possible to piece together a macro call coming partially from +the macro body and partially from the actual arguments. For example, + + #define double(x) (2*(x)) + #define call_with_1(x) x(1) + +would expand `call_with_1 (double)' into `(2*(1))'. + + Macro definitions do not have to have balanced parentheses. By +writing an unbalanced open parenthesis in a macro body, it is possible +to create a macro call that begins inside the macro body but ends +outside of it. For example, + + #define strange(file) fprintf (file, "%s %d", + ... + strange(stderr) p, 35) + +This bizarre example expands to `fprintf (stderr, "%s %d", p, 35)'! + + +File: cpp.info, Node: Macro Parentheses, Next: Swallow Semicolon, Prev: Misnesting, Up: Macro Pitfalls + +Unintended Grouping of Arithmetic +................................. + + You may have noticed that in most of the macro definition examples +shown above, each occurrence of a macro argument name had parentheses +around it. In addition, another pair of parentheses usually surround +the entire macro definition. Here is why it is best to write macros +that way. + + Suppose you define a macro as follows, + + #define ceil_div(x, y) (x + y - 1) / y + +whose purpose is to divide, rounding up. (One use for this operation is +to compute how many `int' objects are needed to hold a certain number +of `char' objects.) Then suppose it is used as follows: + + a = ceil_div (b & c, sizeof (int)); + +This expands into + + a = (b & c + sizeof (int) - 1) / sizeof (int); + +which does not do what is intended. The operator-precedence rules of C +make it equivalent to this: + + a = (b & (c + sizeof (int) - 1)) / sizeof (int); + +But what we want is this: + + a = ((b & c) + sizeof (int) - 1)) / sizeof (int); + +Defining the macro as + + #define ceil_div(x, y) ((x) + (y) - 1) / (y) + +provides the desired result. + + Unintended grouping can result in another way. Consider `sizeof +ceil_div(1, 2)'. That has the appearance of a C expression that would +compute the size of the type of `ceil_div (1, 2)', but in fact it means +something very different. Here is what it expands to: + + sizeof ((1) + (2) - 1) / (2) + +This would take the size of an integer and divide it by two. The +precedence rules have put the division outside the `sizeof' when it was +intended to be inside. + + Parentheses around the entire macro definition can prevent such +problems. Here, then, is the recommended way to define `ceil_div': + + #define ceil_div(x, y) (((x) + (y) - 1) / (y)) + + +File: cpp.info, Node: Swallow Semicolon, Next: Side Effects, Prev: Macro Parentheses, Up: Macro Pitfalls + +Swallowing the Semicolon +........................ + + Often it is desirable to define a macro that expands into a compound +statement. Consider, for example, the following macro, that advances a +pointer (the argument `p' says where to find it) across whitespace +characters: + + #define SKIP_SPACES(p, limit) \ + { register char *lim = (limit); \ + while (p != lim) { \ + if (*p++ != ' ') { \ + p--; break; }}} + +Here Backslash-Newline is used to split the macro definition, which must +be a single line, so that it resembles the way such C code would be +laid out if not part of a macro definition. + + A call to this macro might be `SKIP_SPACES (p, lim)'. Strictly +speaking, the call expands to a compound statement, which is a complete +statement with no need for a semicolon to end it. But it looks like a +function call. So it minimizes confusion if you can use it like a +function call, writing a semicolon afterward, as in `SKIP_SPACES (p, +lim);' + + But this can cause trouble before `else' statements, because the +semicolon is actually a null statement. Suppose you write + + if (*p != 0) + SKIP_SPACES (p, lim); + else ... + +The presence of two statements--the compound statement and a null +statement--in between the `if' condition and the `else' makes invalid C +code. + + The definition of the macro `SKIP_SPACES' can be altered to solve +this problem, using a `do ... while' statement. Here is how: + + #define SKIP_SPACES(p, limit) \ + do { register char *lim = (limit); \ + while (p != lim) { \ + if (*p++ != ' ') { \ + p--; break; }}} \ + while (0) + + Now `SKIP_SPACES (p, lim);' expands into + + do {...} while (0); + +which is one statement. + + +File: cpp.info, Node: Side Effects, Next: Self-Reference, Prev: Swallow Semicolon, Up: Macro Pitfalls + +Duplication of Side Effects +........................... + + Many C programs define a macro `min', for "minimum", like this: + + #define min(X, Y) ((X) < (Y) ? (X) : (Y)) + + When you use this macro with an argument containing a side effect, +as shown here, + + next = min (x + y, foo (z)); + +it expands as follows: + + next = ((x + y) < (foo (z)) ? (x + y) : (foo (z))); + +where `x + y' has been substituted for `X' and `foo (z)' for `Y'. + + The function `foo' is used only once in the statement as it appears +in the program, but the expression `foo (z)' has been substituted twice +into the macro expansion. As a result, `foo' might be called two times +when the statement is executed. If it has side effects or if it takes +a long time to compute, the results might not be what you intended. We +say that `min' is an "unsafe" macro. + + The best solution to this problem is to define `min' in a way that +computes the value of `foo (z)' only once. The C language offers no +standard way to do this, but it can be done with GNU C extensions as +follows: + + #define min(X, Y) \ + ({ typeof (X) __x = (X), __y = (Y); \ + (__x < __y) ? __x : __y; }) + + If you do not wish to use GNU C extensions, the only solution is to +be careful when *using* the macro `min'. For example, you can +calculate the value of `foo (z)', save it in a variable, and use that +variable in `min': + + #define min(X, Y) ((X) < (Y) ? (X) : (Y)) + ... + { + int tem = foo (z); + next = min (x + y, tem); + } + +(where we assume that `foo' returns type `int'). + + +File: cpp.info, Node: Self-Reference, Next: Argument Prescan, Prev: Side Effects, Up: Macro Pitfalls + +Self-Referential Macros +....................... + + A "self-referential" macro is one whose name appears in its +definition. A special feature of ANSI Standard C is that the +self-reference is not considered a macro call. It is passed into the +preprocessor output unchanged. + + Let's consider an example: + + #define foo (4 + foo) + +where `foo' is also a variable in your program. + + Following the ordinary rules, each reference to `foo' will expand +into `(4 + foo)'; then this will be rescanned and will expand into `(4 ++ (4 + foo))'; and so on until it causes a fatal error (memory full) in +the preprocessor. + + However, the special rule about self-reference cuts this process +short after one step, at `(4 + foo)'. Therefore, this macro definition +has the possibly useful effect of causing the program to add 4 to the +value of `foo' wherever `foo' is referred to. + + In most cases, it is a bad idea to take advantage of this feature. A +person reading the program who sees that `foo' is a variable will not +expect that it is a macro as well. The reader will come across the +identifier `foo' in the program and think its value should be that of +the variable `foo', whereas in fact the value is four greater. + + The special rule for self-reference applies also to "indirect" +self-reference. This is the case where a macro X expands to use a +macro `y', and the expansion of `y' refers to the macro `x'. The +resulting reference to `x' comes indirectly from the expansion of `x', +so it is a self-reference and is not further expanded. Thus, after + + #define x (4 + y) + #define y (2 * x) + +`x' would expand into `(4 + (2 * x))'. Clear? + + But suppose `y' is used elsewhere, not from the definition of `x'. +Then the use of `x' in the expansion of `y' is not a self-reference +because `x' is not "in progress". So it does expand. However, the +expansion of `x' contains a reference to `y', and that is an indirect +self-reference now because `y' is "in progress". The result is that +`y' expands to `(2 * (4 + y))'. + + It is not clear that this behavior would ever be useful, but it is +specified by the ANSI C standard, so you may need to understand it. + + +File: cpp.info, Node: Argument Prescan, Next: Cascaded Macros, Prev: Self-Reference, Up: Macro Pitfalls + +Separate Expansion of Macro Arguments +..................................... + + We have explained that the expansion of a macro, including the +substituted actual arguments, is scanned over again for macro calls to +be expanded. + + What really happens is more subtle: first each actual argument text +is scanned separately for macro calls. Then the results of this are +substituted into the macro body to produce the macro expansion, and the +macro expansion is scanned again for macros to expand. + + The result is that the actual arguments are scanned *twice* to expand +macro calls in them. + + Most of the time, this has no effect. If the actual argument +contained any macro calls, they are expanded during the first scan. +The result therefore contains no macro calls, so the second scan does +not change it. If the actual argument were substituted as given, with +no prescan, the single remaining scan would find the same macro calls +and produce the same results. + + You might expect the double scan to change the results when a +self-referential macro is used in an actual argument of another macro +(*note Self-Reference::.): the self-referential macro would be expanded +once in the first scan, and a second time in the second scan. But this +is not what happens. The self-references that do not expand in the +first scan are marked so that they will not expand in the second scan +either. + + The prescan is not done when an argument is stringified or +concatenated. Thus, + + #define str(s) #s + #define foo 4 + str (foo) + +expands to `"foo"'. Once more, prescan has been prevented from having +any noticeable effect. + + More precisely, stringification and concatenation use the argument as +written, in un-prescanned form. The same actual argument would be used +in prescanned form if it is substituted elsewhere without +stringification or concatenation. + + #define str(s) #s lose(s) + #define foo 4 + str (foo) + + expands to `"foo" lose(4)'. + + You might now ask, "Why mention the prescan, if it makes no +difference? And why not skip it and make the preprocessor faster?" +The answer is that the prescan does make a difference in three special +cases: + + * Nested calls to a macro. + + * Macros that call other macros that stringify or concatenate. + + * Macros whose expansions contain unshielded commas. + + We say that "nested" calls to a macro occur when a macro's actual +argument contains a call to that very macro. For example, if `f' is a +macro that expects one argument, `f (f (1))' is a nested pair of calls +to `f'. The desired expansion is made by expanding `f (1)' and +substituting that into the definition of `f'. The prescan causes the +expected result to happen. Without the prescan, `f (1)' itself would +be substituted as an actual argument, and the inner use of `f' would +appear during the main scan as an indirect self-reference and would not +be expanded. Here, the prescan cancels an undesirable side effect (in +the medical, not computational, sense of the term) of the special rule +for self-referential macros. + + But prescan causes trouble in certain other cases of nested macro +calls. Here is an example: + + #define foo a,b + #define bar(x) lose(x) + #define lose(x) (1 + (x)) + + bar(foo) + +We would like `bar(foo)' to turn into `(1 + (foo))', which would then +turn into `(1 + (a,b))'. But instead, `bar(foo)' expands into +`lose(a,b)', and you get an error because `lose' requires a single +argument. In this case, the problem is easily solved by the same +parentheses that ought to be used to prevent misnesting of arithmetic +operations: + + #define foo (a,b) + #define bar(x) lose((x)) + + The problem is more serious when the operands of the macro are not +expressions; for example, when they are statements. Then parentheses +are unacceptable because they would make for invalid C code: + + #define foo { int a, b; ... } + +In GNU C you can shield the commas using the `({...})' construct which +turns a compound statement into an expression: + + #define foo ({ int a, b; ... }) + + Or you can rewrite the macro definition to avoid such commas: + + #define foo { int a; int b; ... } + + There is also one case where prescan is useful. It is possible to +use prescan to expand an argument and then stringify it--if you use two +levels of macros. Let's add a new macro `xstr' to the example shown +above: + + #define xstr(s) str(s) + #define str(s) #s + #define foo 4 + xstr (foo) + + This expands into `"4"', not `"foo"'. The reason for the difference +is that the argument of `xstr' is expanded at prescan (because `xstr' +does not specify stringification or concatenation of the argument). +The result of prescan then forms the actual argument for `str'. `str' +uses its argument without prescan because it performs stringification; +but it cannot prevent or undo the prescanning already done by `xstr'. + + +File: cpp.info, Node: Cascaded Macros, Next: Newlines in Args, Prev: Argument Prescan, Up: Macro Pitfalls + +Cascaded Use of Macros +...................... + + A "cascade" of macros is when one macro's body contains a reference +to another macro. This is very common practice. For example, + + #define BUFSIZE 1020 + #define TABLESIZE BUFSIZE + + This is not at all the same as defining `TABLESIZE' to be `1020'. +The `#define' for `TABLESIZE' uses exactly the body you specify--in +this case, `BUFSIZE'--and does not check to see whether it too is the +name of a macro. + + It's only when you *use* `TABLESIZE' that the result of its expansion +is checked for more macro names. + + This makes a difference if you change the definition of `BUFSIZE' at +some point in the source file. `TABLESIZE', defined as shown, will +always expand using the definition of `BUFSIZE' that is currently in +effect: + + #define BUFSIZE 1020 + #define TABLESIZE BUFSIZE + #undef BUFSIZE + #define BUFSIZE 37 + +Now `TABLESIZE' expands (in two stages) to `37'. (The `#undef' is to +prevent any warning about the nontrivial redefinition of `BUFSIZE'.) + + +File: cpp.info, Node: Newlines in Args, Prev: Cascaded Macros, Up: Macro Pitfalls + +Newlines in Macro Arguments +--------------------------- + + Traditional macro processing carries forward all newlines in macro +arguments into the expansion of the macro. This means that, if some of +the arguments are substituted more than once, or not at all, or out of +order, newlines can be duplicated, lost, or moved around within the +expansion. If the expansion consists of multiple statements, then the +effect is to distort the line numbers of some of these statements. The +result can be incorrect line numbers, in error messages or displayed in +a debugger. + + The GNU C preprocessor operating in ANSI C mode adjusts appropriately +for multiple use of an argument--the first use expands all the +newlines, and subsequent uses of the same argument produce no newlines. +But even in this mode, it can produce incorrect line numbering if +arguments are used out of order, or not used at all. + + Here is an example illustrating this problem: + + #define ignore_second_arg(a,b,c) a; c + + ignore_second_arg (foo (), + ignored (), + syntax error); + +The syntax error triggered by the tokens `syntax error' results in an +error message citing line four, even though the statement text comes +from line five. + + +File: cpp.info, Node: Conditionals, Next: Combining Sources, Prev: Macros, Up: Top + +Conditionals +============ + + In a macro processor, a "conditional" is a directive that allows a +part of the program to be ignored during compilation, on some +conditions. In the C preprocessor, a conditional can test either an +arithmetic expression or whether a name is defined as a macro. + + A conditional in the C preprocessor resembles in some ways an `if' +statement in C, but it is important to understand the difference between +them. The condition in an `if' statement is tested during the execution +of your program. Its purpose is to allow your program to behave +differently from run to run, depending on the data it is operating on. +The condition in a preprocessing conditional directive is tested when +your program is compiled. Its purpose is to allow different code to be +included in the program depending on the situation at the time of +compilation. + +* Menu: + +* Uses: Conditional Uses. What conditionals are for. +* Syntax: Conditional Syntax. How conditionals are written. +* Deletion: Deleted Code. Making code into a comment. +* Macros: Conditionals-Macros. Why conditionals are used with macros. +* Assertions:: How and why to use assertions. +* Errors: #error Directive. Detecting inconsistent compilation parameters. + + +File: cpp.info, Node: Conditional Uses, Next: Conditional Syntax, Up: Conditionals + +Why Conditionals are Used +------------------------- + + Generally there are three kinds of reason to use a conditional. + + * A program may need to use different code depending on the machine + or operating system it is to run on. In some cases the code for + one operating system may be erroneous on another operating system; + for example, it might refer to library routines that do not exist + on the other system. When this happens, it is not enough to avoid + executing the invalid code: merely having it in the program makes + it impossible to link the program and run it. With a + preprocessing conditional, the offending code can be effectively + excised from the program when it is not valid. + + * You may want to be able to compile the same source file into two + different programs. Sometimes the difference between the programs + is that one makes frequent time-consuming consistency checks on its + intermediate data, or prints the values of those data for + debugging, while the other does not. + + * A conditional whose condition is always false is a good way to + exclude code from the program but keep it as a sort of comment for + future reference. + + Most simple programs that are intended to run on only one machine +will not need to use preprocessing conditionals. + + +File: cpp.info, Node: Conditional Syntax, Next: Deleted Code, Prev: Conditional Uses, Up: Conditionals + +Syntax of Conditionals +---------------------- + + A conditional in the C preprocessor begins with a "conditional +directive": `#if', `#ifdef' or `#ifndef'. *Note Conditionals-Macros::, +for information on `#ifdef' and `#ifndef'; only `#if' is explained here. + +* Menu: + +* If: #if Directive. Basic conditionals using `#if' and `#endif'. +* Else: #else Directive. Including some text if the condition fails. +* Elif: #elif Directive. Testing several alternative possibilities. + + +File: cpp.info, Node: #if Directive, Next: #else Directive, Up: Conditional Syntax + +The `#if' Directive +................... + + The `#if' directive in its simplest form consists of + + #if EXPRESSION + CONTROLLED TEXT + #endif /* EXPRESSION */ + + The comment following the `#endif' is not required, but it is a good +practice because it helps people match the `#endif' to the +corresponding `#if'. Such comments should always be used, except in +short conditionals that are not nested. In fact, you can put anything +at all after the `#endif' and it will be ignored by the GNU C +preprocessor, but only comments are acceptable in ANSI Standard C. + + EXPRESSION is a C expression of integer type, subject to stringent +restrictions. It may contain + + * Integer constants, which are all regarded as `long' or `unsigned + long'. + + * Character constants, which are interpreted according to the + character set and conventions of the machine and operating system + on which the preprocessor is running. The GNU C preprocessor uses + the C data type `char' for these character constants; therefore, + whether some character codes are negative is determined by the C + compiler used to compile the preprocessor. If it treats `char' as + signed, then character codes large enough to set the sign bit will + be considered negative; otherwise, no character code is considered + negative. + + * Arithmetic operators for addition, subtraction, multiplication, + division, bitwise operations, shifts, comparisons, and logical + operations (`&&' and `||'). + + * Identifiers that are not macros, which are all treated as zero(!). + + * Macro calls. All macro calls in the expression are expanded before + actual computation of the expression's value begins. + + Note that `sizeof' operators and `enum'-type values are not allowed. +`enum'-type values, like all other identifiers that are not taken as +macro calls and expanded, are treated as zero. + + The CONTROLLED TEXT inside of a conditional can include +preprocessing directives. Then the directives inside the conditional +are obeyed only if that branch of the conditional succeeds. The text +can also contain other conditional groups. However, the `#if' and +`#endif' directives must balance. + + +File: cpp.info, Node: #else Directive, Next: #elif Directive, Prev: #if Directive, Up: Conditional Syntax + +The `#else' Directive +..................... + + The `#else' directive can be added to a conditional to provide +alternative text to be used if the condition is false. This is what it +looks like: + + #if EXPRESSION + TEXT-IF-TRUE + #else /* Not EXPRESSION */ + TEXT-IF-FALSE + #endif /* Not EXPRESSION */ + + If EXPRESSION is nonzero, and thus the TEXT-IF-TRUE is active, then +`#else' acts like a failing conditional and the TEXT-IF-FALSE is +ignored. Contrariwise, if the `#if' conditional fails, the +TEXT-IF-FALSE is considered included. + + +File: cpp.info, Node: #elif Directive, Prev: #else Directive, Up: Conditional Syntax + +The `#elif' Directive +..................... + + One common case of nested conditionals is used to check for more +than two possible alternatives. For example, you might have + + #if X == 1 + ... + #else /* X != 1 */ + #if X == 2 + ... + #else /* X != 2 */ + ... + #endif /* X != 2 */ + #endif /* X != 1 */ + + Another conditional directive, `#elif', allows this to be abbreviated +as follows: + + #if X == 1 + ... + #elif X == 2 + ... + #else /* X != 2 and X != 1*/ + ... + #endif /* X != 2 and X != 1*/ + + `#elif' stands for "else if". Like `#else', it goes in the middle +of a `#if'-`#endif' pair and subdivides it; it does not require a +matching `#endif' of its own. Like `#if', the `#elif' directive +includes an expression to be tested. + + The text following the `#elif' is processed only if the original +`#if'-condition failed and the `#elif' condition succeeds. More than +one `#elif' can go in the same `#if'-`#endif' group. Then the text +after each `#elif' is processed only if the `#elif' condition succeeds +after the original `#if' and any previous `#elif' directives within it +have failed. `#else' is equivalent to `#elif 1', and `#else' is +allowed after any number of `#elif' directives, but `#elif' may not +follow `#else'. + + +File: cpp.info, Node: Deleted Code, Next: Conditionals-Macros, Prev: Conditional Syntax, Up: Conditionals + +Keeping Deleted Code for Future Reference +----------------------------------------- + + If you replace or delete a part of the program but want to keep the +old code around as a comment for future reference, the easy way to do +this is to put `#if 0' before it and `#endif' after it. This is better +than using comment delimiters `/*' and `*/' since those won't work if +the code already contains comments (C comments do not nest). + + This works even if the code being turned off contains conditionals, +but they must be entire conditionals (balanced `#if' and `#endif'). + + Conversely, do not use `#if 0' for comments which are not C code. +Use the comment delimiters `/*' and `*/' instead. The interior of `#if +0' must consist of complete tokens; in particular, singlequote +characters must balance. But comments often contain unbalanced +singlequote characters (known in English as apostrophes). These +confuse `#if 0'. They do not confuse `/*'. + + +File: cpp.info, Node: Conditionals-Macros, Next: Assertions, Prev: Deleted Code, Up: Conditionals + +Conditionals and Macros +----------------------- + + Conditionals are useful in connection with macros or assertions, +because those are the only ways that an expression's value can vary +from one compilation to another. A `#if' directive whose expression +uses no macros or assertions is equivalent to `#if 1' or `#if 0'; you +might as well determine which one, by computing the value of the +expression yourself, and then simplify the program. + + For example, here is a conditional that tests the expression +`BUFSIZE == 1020', where `BUFSIZE' must be a macro. + + #if BUFSIZE == 1020 + printf ("Large buffers!\n"); + #endif /* BUFSIZE is large */ + + (Programmers often wish they could test the size of a variable or +data type in `#if', but this does not work. The preprocessor does not +understand `sizeof', or typedef names, or even the type keywords such +as `int'.) + + The special operator `defined' is used in `#if' expressions to test +whether a certain name is defined as a macro. Either `defined NAME' or +`defined (NAME)' is an expression whose value is 1 if NAME is defined +as macro at the current point in the program, and 0 otherwise. For the +`defined' operator it makes no difference what the definition of the +macro is; all that matters is whether there is a definition. Thus, for +example, + + #if defined (vax) || defined (ns16000) + +would succeed if either of the names `vax' and `ns16000' is defined as +a macro. You can test the same condition using assertions (*note +Assertions::.), like this: + + #if #cpu (vax) || #cpu (ns16000) + + If a macro is defined and later undefined with `#undef', subsequent +use of the `defined' operator returns 0, because the name is no longer +defined. If the macro is defined again with another `#define', +`defined' will recommence returning 1. + + Conditionals that test whether just one name is defined are very +common, so there are two special short conditional directives for this +case. + +`#ifdef NAME' + is equivalent to `#if defined (NAME)'. + +`#ifndef NAME' + is equivalent to `#if ! defined (NAME)'. + + Macro definitions can vary between compilations for several reasons. + + * Some macros are predefined on each kind of machine. For example, + on a Vax, the name `vax' is a predefined macro. On other + machines, it would not be defined. + + * Many more macros are defined by system header files. Different + systems and machines define different macros, or give them + different values. It is useful to test these macros with + conditionals to avoid using a system feature on a machine where it + is not implemented. + + * Macros are a common way of allowing users to customize a program + for different machines or applications. For example, the macro + `BUFSIZE' might be defined in a configuration file for your + program that is included as a header file in each source file. You + would use `BUFSIZE' in a preprocessing conditional in order to + generate different code depending on the chosen configuration. + + * Macros can be defined or undefined with `-D' and `-U' command + options when you compile the program. You can arrange to compile + the same source file into two different programs by choosing a + macro name to specify which program you want, writing conditionals + to test whether or how this macro is defined, and then controlling + the state of the macro with compiler command options. *Note + Invocation::. + + Assertions are usually predefined, but can be defined with +preprocessor directives or command-line options. + + +File: cpp.info, Node: Assertions, Next: #error Directive, Prev: Conditionals-Macros, Up: Conditionals + +Assertions +---------- + + "Assertions" are a more systematic alternative to macros in writing +conditionals to test what sort of computer or system the compiled +program will run on. Assertions are usually predefined, but you can +define them with preprocessing directives or command-line options. + + The macros traditionally used to describe the type of target are not +classified in any way according to which question they answer; they may +indicate a hardware architecture, a particular hardware model, an +operating system, a particular version of an operating system, or +specific configuration options. These are jumbled together in a single +namespace. In contrast, each assertion consists of a named question and +an answer. The question is usually called the "predicate". An +assertion looks like this: + + #PREDICATE (ANSWER) + +You must use a properly formed identifier for PREDICATE. The value of +ANSWER can be any sequence of words; all characters are significant +except for leading and trailing whitespace, and differences in internal +whitespace sequences are ignored. Thus, `x + y' is different from +`x+y' but equivalent to `x + y'. `)' is not allowed in an answer. + + Here is a conditional to test whether the answer ANSWER is asserted +for the predicate PREDICATE: + + #if #PREDICATE (ANSWER) + +There may be more than one answer asserted for a given predicate. If +you omit the answer, you can test whether *any* answer is asserted for +PREDICATE: + + #if #PREDICATE + + Most of the time, the assertions you test will be predefined +assertions. GNU C provides three predefined predicates: `system', +`cpu', and `machine'. `system' is for assertions about the type of +software, `cpu' describes the type of computer architecture, and +`machine' gives more information about the computer. For example, on a +GNU system, the following assertions would be true: + + #system (gnu) + #system (mach) + #system (mach 3) + #system (mach 3.SUBVERSION) + #system (hurd) + #system (hurd VERSION) + +and perhaps others. The alternatives with more or less version +information let you ask more or less detailed questions about the type +of system software. + + On a Unix system, you would find `#system (unix)' and perhaps one of: +`#system (aix)', `#system (bsd)', `#system (hpux)', `#system (lynx)', +`#system (mach)', `#system (posix)', `#system (svr3)', `#system +(svr4)', or `#system (xpg4)' with possible version numbers following. + + Other values for `system' are `#system (mvs)' and `#system (vms)'. + + *Portability note:* Many Unix C compilers provide only one answer +for the `system' assertion: `#system (unix)', if they support +assertions at all. This is less than useful. + + An assertion with a multi-word answer is completely different from +several assertions with individual single-word answers. For example, +the presence of `system (mach 3.0)' does not mean that `system (3.0)' +is true. It also does not directly imply `system (mach)', but in GNU +C, that last will normally be asserted as well. + + The current list of possible assertion values for `cpu' is: `#cpu +(a29k)', `#cpu (alpha)', `#cpu (arm)', `#cpu (clipper)', `#cpu +(convex)', `#cpu (elxsi)', `#cpu (tron)', `#cpu (h8300)', `#cpu +(i370)', `#cpu (i386)', `#cpu (i860)', `#cpu (i960)', `#cpu (m68k)', +`#cpu (m88k)', `#cpu (mips)', `#cpu (ns32k)', `#cpu (hppa)', `#cpu +(pyr)', `#cpu (ibm032)', `#cpu (rs6000)', `#cpu (sh)', `#cpu (sparc)', +`#cpu (spur)', `#cpu (tahoe)', `#cpu (vax)', `#cpu (we32000)'. + + You can create assertions within a C program using `#assert', like +this: + + #assert PREDICATE (ANSWER) + +(Note the absence of a `#' before PREDICATE.) + + Each time you do this, you assert a new true answer for PREDICATE. +Asserting one answer does not invalidate previously asserted answers; +they all remain true. The only way to remove an assertion is with +`#unassert'. `#unassert' has the same syntax as `#assert'. You can +also remove all assertions about PREDICATE like this: + + #unassert PREDICATE + + You can also add or cancel assertions using command options when you +run `gcc' or `cpp'. *Note Invocation::. + + +File: cpp.info, Node: #error Directive, Prev: Assertions, Up: Conditionals + +The `#error' and `#warning' Directives +-------------------------------------- + + The directive `#error' causes the preprocessor to report a fatal +error. The rest of the line that follows `#error' is used as the error +message. The line must consist of complete tokens. + + You would use `#error' inside of a conditional that detects a +combination of parameters which you know the program does not properly +support. For example, if you know that the program will not run +properly on a Vax, you might write + + #ifdef __vax__ + #error "Won't work on Vaxen. See comments at get_last_object." + #endif + +*Note Nonstandard Predefined::, for why this works. + + If you have several configuration parameters that must be set up by +the installation in a consistent way, you can use conditionals to detect +an inconsistency and report it with `#error'. For example, + + #if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \ + || HASH_TABLE_SIZE % 5 == 0 + #error HASH_TABLE_SIZE should not be divisible by a small prime + #endif + + The directive `#warning' is like the directive `#error', but causes +the preprocessor to issue a warning and continue preprocessing. The +rest of the line that follows `#warning' is used as the warning message. + + You might use `#warning' in obsolete header files, with a message +directing the user to the header file which should be used instead. + + +File: cpp.info, Node: Combining Sources, Next: Other Directives, Prev: Conditionals, Up: Top + +Combining Source Files +====================== + + One of the jobs of the C preprocessor is to inform the C compiler of +where each line of C code came from: which source file and which line +number. + + C code can come from multiple source files if you use `#include'; +both `#include' and the use of conditionals and macros can cause the +line number of a line in the preprocessor output to be different from +the line's number in the original source file. You will appreciate the +value of making both the C compiler (in error messages) and symbolic +debuggers such as GDB use the line numbers in your source file. + + The C preprocessor builds on this feature by offering a directive by +which you can control the feature explicitly. This is useful when a +file for input to the C preprocessor is the output from another program +such as the `bison' parser generator, which operates on another file +that is the true source file. Parts of the output from `bison' are +generated from scratch, other parts come from a standard parser file. +The rest are copied nearly verbatim from the source file, but their +line numbers in the `bison' output are not the same as their original +line numbers. Naturally you would like compiler error messages and +symbolic debuggers to know the original source file and line number of +each line in the `bison' input. + + `bison' arranges this by writing `#line' directives into the output +file. `#line' is a directive that specifies the original line number +and source file name for subsequent input in the current preprocessor +input file. `#line' has three variants: + +`#line LINENUM' + Here LINENUM is a decimal integer constant. This specifies that + the line number of the following line of input, in its original + source file, was LINENUM. + +`#line LINENUM FILENAME' + Here LINENUM is a decimal integer constant and FILENAME is a + string constant. This specifies that the following line of input + came originally from source file FILENAME and its line number there + was LINENUM. Keep in mind that FILENAME is not just a file name; + it is surrounded by doublequote characters so that it looks like a + string constant. + +`#line ANYTHING ELSE' + ANYTHING ELSE is checked for macro calls, which are expanded. The + result should be a decimal integer constant followed optionally by + a string constant, as described above. + + `#line' directives alter the results of the `__FILE__' and +`__LINE__' predefined macros from that point on. *Note Standard +Predefined::. + + The output of the preprocessor (which is the input for the rest of +the compiler) contains directives that look much like `#line' +directives. They start with just `#' instead of `#line', but this is +followed by a line number and file name as in `#line'. *Note Output::. + + +File: cpp.info, Node: Other Directives, Next: Output, Prev: Combining Sources, Up: Top + +Miscellaneous Preprocessing Directives +====================================== + + This section describes three additional preprocessing directives. +They are not very useful, but are mentioned for completeness. + + The "null directive" consists of a `#' followed by a Newline, with +only whitespace (including comments) in between. A null directive is +understood as a preprocessing directive but has no effect on the +preprocessor output. The primary significance of the existence of the +null directive is that an input line consisting of just a `#' will +produce no output, rather than a line of output containing just a `#'. +Supposedly some old C programs contain such lines. + + The ANSI standard specifies that the effect of the `#pragma' +directive is implementation-defined. In the GNU C preprocessor, +`#pragma' directives are not used, except for `#pragma once' (*note +Once-Only::.). However, they are left in the preprocessor output, so +they are available to the compilation pass. + + The `#ident' directive is supported for compatibility with certain +other systems. It is followed by a line of text. On some systems, the +text is copied into a special place in the object file; on most systems, +the text is ignored and this directive has no effect. Typically +`#ident' is only used in header files supplied with those systems where +it is meaningful. + + +File: cpp.info, Node: Output, Next: Invocation, Prev: Other Directives, Up: Top + +C Preprocessor Output +===================== + + The output from the C preprocessor looks much like the input, except +that all preprocessing directive lines have been replaced with blank +lines and all comments with spaces. Whitespace within a line is not +altered; however, unless `-traditional' is used, spaces may be inserted +into the expansions of macro calls to prevent tokens from being +concatenated. + + Source file name and line number information is conveyed by lines of +the form + + # LINENUM FILENAME FLAGS + +which are inserted as needed into the middle of the input (but never +within a string or character constant). Such a line means that the +following line originated in file FILENAME at line LINENUM. + + After the file name comes zero or more flags, which are `1', `2', +`3', or `4'. If there are multiple flags, spaces separate them. Here +is what the flags mean: + +`1' + This indicates the start of a new file. + +`2' + This indicates returning to a file (after having included another + file). + +`3' + This indicates that the following text comes from a system header + file, so certain warnings should be suppressed. + +`4' + This indicates that the following text should be treated as C. + diff --git a/usr/local/nachos/info/cpp.info-3 b/usr/local/nachos/info/cpp.info-3 new file mode 100644 index 0000000..a081350 --- /dev/null +++ b/usr/local/nachos/info/cpp.info-3 @@ -0,0 +1,558 @@ +This is Info file cpp.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/cpp.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* Cpp: (cpp). The GNU C preprocessor. +END-INFO-DIR-ENTRY + + This file documents the GNU C Preprocessor. + + Copyright 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1997, 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. + + +File: cpp.info, Node: Invocation, Next: Concept Index, Prev: Output, Up: Top + +Invoking the C Preprocessor +=========================== + + Most often when you use the C preprocessor you will not have to +invoke it explicitly: the C compiler will do so automatically. +However, the preprocessor is sometimes useful on its own. + + The C preprocessor expects two file names as arguments, INFILE and +OUTFILE. The preprocessor reads INFILE together with any other files +it specifies with `#include'. All the output generated by the combined +input files is written in OUTFILE. + + Either INFILE or OUTFILE may be `-', which as INFILE means to read +from standard input and as OUTFILE means to write to standard output. +Also, if OUTFILE or both file names are omitted, the standard output +and standard input are used for the omitted file names. + + Here is a table of command options accepted by the C preprocessor. +These options can also be given when compiling a C program; they are +passed along automatically to the preprocessor when it is invoked by the +compiler. + +`-P' + Inhibit generation of `#'-lines with line-number information in + the output from the preprocessor (*note Output::.). This might be + useful when running the preprocessor on something that is not C + code and will be sent to a program which might be confused by the + `#'-lines. + +`-C' + Do not discard comments: pass them through to the output file. + Comments appearing in arguments of a macro call will be copied to + the output before the expansion of the macro call. + +`-traditional' + Try to imitate the behavior of old-fashioned C, as opposed to ANSI + C. + + * Traditional macro expansion pays no attention to singlequote + or doublequote characters; macro argument symbols are + replaced by the argument values even when they appear within + apparent string or character constants. + + * Traditionally, it is permissible for a macro expansion to end + in the middle of a string or character constant. The + constant continues into the text surrounding the macro call. + + * However, traditionally the end of the line terminates a + string or character constant, with no error. + + * In traditional C, a comment is equivalent to no text at all. + (In ANSI C, a comment counts as whitespace.) + + * Traditional C does not have the concept of a "preprocessing + number". It considers `1.0e+4' to be three tokens: `1.0e', + `+', and `4'. + + * A macro is not suppressed within its own definition, in + traditional C. Thus, any macro that is used recursively + inevitably causes an error. + + * The character `#' has no special meaning within a macro + definition in traditional C. + + * In traditional C, the text at the end of a macro expansion + can run together with the text after the macro call, to + produce a single token. (This is impossible in ANSI C.) + + * Traditionally, `\' inside a macro argument suppresses the + syntactic significance of the following character. + + Use the `-traditional' option when preprocessing Fortran code, so + that singlequotes and doublequotes within Fortran comment lines + (which are generally not recognized as such by the preprocessor) + do not cause diagnostics about unterminated character or string + constants. + + However, this option does not prevent diagnostics about + unterminated comments when a C-style comment appears to start, but + not end, within Fortran-style commentary. + + So, the following Fortran comment lines are accepted with + `-traditional': + + C This isn't an unterminated character constant + C Neither is "20000000000, an octal constant + C in some dialects of Fortran + + However, this type of comment line will likely produce a + diagnostic, or at least unexpected output from the preprocessor, + due to the unterminated comment: + + C Some Fortran compilers accept /* as starting + C an inline comment. + + Note that `g77' automatically supplies the `-traditional' option + when it invokes the preprocessor. However, a future version of + `g77' might use a different, more-Fortran-aware preprocessor in + place of `cpp'. + +`-trigraphs' + Process ANSI standard trigraph sequences. These are + three-character sequences, all starting with `??', that are + defined by ANSI C to stand for single characters. For example, + `??/' stands for `\', so `'??/n'' is a character constant for a + newline. Strictly speaking, the GNU C preprocessor does not + support all programs in ANSI Standard C unless `-trigraphs' is + used, but if you ever notice the difference it will be with relief. + + You don't want to know any more about trigraphs. + +`-pedantic' + Issue warnings required by the ANSI C standard in certain cases + such as when text other than a comment follows `#else' or `#endif'. + +`-pedantic-errors' + Like `-pedantic', except that errors are produced rather than + warnings. + +`-Wtrigraphs' + Warn if any trigraphs are encountered. Currently this only works + if you have turned trigraphs on with `-trigraphs' or `-ansi'; in + the future this restriction will be removed. + +`-Wcomment' + Warn whenever a comment-start sequence `/*' appears in a `/*' + comment, or whenever a Backslash-Newline appears in a `//' comment. + +`-Wall' + Requests both `-Wtrigraphs' and `-Wcomment' (but not + `-Wtraditional' or `-Wundef'). + +`-Wtraditional' + Warn about certain constructs that behave differently in + traditional and ANSI C. + +`-Wundef' + Warn if an undefined identifier is evaluated in an `#if' directive. + +`-I DIRECTORY' + Add the directory DIRECTORY to the head of the list of directories + to be searched for header files (*note Include Syntax::.). This + can be used to override a system header file, substituting your + own version, since these directories are searched before the system + header file directories. If you use more than one `-I' option, + the directories are scanned in left-to-right order; the standard + system directories come after. + +`-I-' + Any directories specified with `-I' options before the `-I-' + option are searched only for the case of `#include "FILE"'; they + are not searched for `#include '. + + If additional directories are specified with `-I' options after + the `-I-', these directories are searched for all `#include' + directives. + + In addition, the `-I-' option inhibits the use of the current + directory as the first search directory for `#include "FILE"'. + Therefore, the current directory is searched only if it is + requested explicitly with `-I.'. Specifying both `-I-' and `-I.' + allows you to control precisely which directories are searched + before the current one and which are searched after. + +`-nostdinc' + Do not search the standard system directories for header files. + Only the directories you have specified with `-I' options (and the + current directory, if appropriate) are searched. + +`-nostdinc++' + Do not search for header files in the C++-specific standard + directories, but do still search the other standard directories. + (This option is used when building the C++ library.) + +`-remap' + When searching for a header file in a directory, remap file names + if a file named `header.gcc' exists in that directory. This can + be used to work around limitations of file systems with file name + restrictions. The `header.gcc' file should contain a series of + lines with two tokens on each line: the first token is the name to + map, and the second token is the actual name to use. + +`-D NAME' + Predefine NAME as a macro, with definition `1'. + +`-D NAME=DEFINITION' + Predefine NAME as a macro, with definition DEFINITION. There are + no restrictions on the contents of DEFINITION, but if you are + invoking the preprocessor from a shell or shell-like program you + may need to use the shell's quoting syntax to protect characters + such as spaces that have a meaning in the shell syntax. If you + use more than one `-D' for the same NAME, the rightmost definition + takes effect. + +`-U NAME' + Do not predefine NAME. If both `-U' and `-D' are specified for + one name, the `-U' beats the `-D' and the name is not predefined. + +`-undef' + Do not predefine any nonstandard macros. + +`-gcc' + Define the macros __GNUC__ and __GNUC_MINOR__. These are defined + automatically when you use `gcc -E'; you can turn them off in that + case with `-no-gcc'. + +`-A PREDICATE(ANSWER)' + Make an assertion with the predicate PREDICATE and answer ANSWER. + *Note Assertions::. + + You can use `-A-' to disable all predefined assertions; it also + undefines all predefined macros and all macros that preceded it on + the command line. + +`-dM' + Instead of outputting the result of preprocessing, output a list of + `#define' directives for all the macros defined during the + execution of the preprocessor, including predefined macros. This + gives you a way of finding out what is predefined in your version + of the preprocessor; assuming you have no file `foo.h', the command + + touch foo.h; cpp -dM foo.h + + will show the values of any predefined macros. + +`-dD' + Like `-dM' except in two respects: it does *not* include the + predefined macros, and it outputs *both* the `#define' directives + and the result of preprocessing. Both kinds of output go to the + standard output file. + +`-dI' + Output `#include' directives in addition to the result of + preprocessing. + +`-M [-MG]' + Instead of outputting the result of preprocessing, output a rule + suitable for `make' describing the dependencies of the main source + file. The preprocessor outputs one `make' rule containing the + object file name for that source file, a colon, and the names of + all the included files. If there are many included files then the + rule is split into several lines using `\'-newline. + + `-MG' says to treat missing header files as generated files and + assume they live in the same directory as the source file. It + must be specified in addition to `-M'. + + This feature is used in automatic updating of makefiles. + +`-MM [-MG]' + Like `-M' but mention only the files included with `#include + "FILE"'. System header files included with `#include ' are + omitted. + +`-MD FILE' + Like `-M' but the dependency information is written to FILE. This + is in addition to compiling the file as specified--`-MD' does not + inhibit ordinary compilation the way `-M' does. + + When invoking `gcc', do not specify the FILE argument. `gcc' will + create file names made by replacing ".c" with ".d" at the end of + the input file names. + + In Mach, you can use the utility `md' to merge multiple dependency + files into a single dependency file suitable for using with the + `make' command. + +`-MMD FILE' + Like `-MD' except mention only user header files, not system + header files. + +`-H' + Print the name of each header file used, in addition to other + normal activities. + +`-imacros FILE' + Process FILE as input, discarding the resulting output, before + processing the regular input file. Because the output generated + from FILE is discarded, the only effect of `-imacros FILE' is to + make the macros defined in FILE available for use in the main + input. + +`-include FILE' + Process FILE as input, and include all the resulting output, + before processing the regular input file. + +`-idirafter DIR' + Add the directory DIR to the second include path. The directories + on the second include path are searched when a header file is not + found in any of the directories in the main include path (the one + that `-I' adds to). + +`-iprefix PREFIX' + Specify PREFIX as the prefix for subsequent `-iwithprefix' options. + +`-iwithprefix DIR' + Add a directory to the second include path. The directory's name + is made by concatenating PREFIX and DIR, where PREFIX was + specified previously with `-iprefix'. + +`-isystem DIR' + Add a directory to the beginning of the second include path, + marking it as a system directory, so that it gets the same special + treatment as is applied to the standard system directories. + +`-x c' +`-x c++' +`-x objective-c' +`-x assembler-with-cpp' + Specify the source language: C, C++, Objective-C, or assembly. + This has nothing to do with standards conformance or extensions; + it merely selects which base syntax to expect. If you give none + of these options, cpp will deduce the language from the extension + of the source file: `.c', `.cc', `.m', or `.S'. Some other common + extensions for C++ and assembly are also recognized. If cpp does + not recognize the extension, it will treat the file as C; this is + the most generic mode. + + *Note:* Previous versions of cpp accepted a `-lang' option which + selected both the language and the standards conformance level. + This option has been removed, because it conflicts with the `-l' + option. + +`-std=STANDARD' +`-ansi' + Specify the standard to which the code should conform. Currently + cpp only knows about the standards for C; other language standards + will be added in the future. + + STANDARD may be one of: + `iso9899:1990' + The ISO C standard from 1990. + + `iso9899:199409' + `c89' + The 1990 C standard, as amended in 1994. `c89' is the + customary shorthand for this version of the standard. + + The `-ansi' option is equivalent to `-std=c89'. + + `iso9899:199x' + `c9x' + The revised ISO C standard, which is expected to be + promulgated some time in 1999. It has not been approved yet, + hence the `x'. + + `gnu89' + The 1990 C standard plus GNU extensions. This is the default. + + `gnu9x' + The 199x C standard plus GNU extensions. + +`-Wp,-lint' + Look for commands to the program checker `lint' embedded in + comments, and emit them preceded by `#pragma lint'. For example, + the comment `/* NOTREACHED */' becomes `#pragma lint NOTREACHED'. + + Because of the clash with `-l', you must use the awkward syntax + above. In a future release, this option will be replaced by + `-flint' or `-Wlint'; we are not sure which yet. + +`-$' + Forbid the use of `$' in identifiers. The C standard does not + permit this, but it is a common extension. + + +File: cpp.info, Node: Concept Index, Next: Index, Prev: Invocation, Up: Top + +Concept Index +************* + +* Menu: + +* ##: Concatenation. +* arguments in macro definitions: Argument Macros. +* assertions: Assertions. +* assertions, undoing: Assertions. +* blank macro arguments: Argument Macros. +* cascaded macros: Cascaded Macros. +* commenting out code: Deleted Code. +* computed #include: Include Syntax. +* concatenation: Concatenation. +* conditionals: Conditionals. +* directives: Directives. +* expansion of arguments: Argument Prescan. +* Fortran: Invocation. +* function-like macro: Argument Macros. +* g77: Invocation. +* header file: Header Files. +* including just once: Once-Only. +* inheritance: Inheritance. +* invocation of the preprocessor: Invocation. +* line control: Combining Sources. +* macro argument expansion: Argument Prescan. +* macro body uses macro: Cascaded Macros. +* macros with argument: Argument Macros. +* manifest constant: Simple Macros. +* newlines in macro arguments: Newlines in Args. +* null directive: Other Directives. +* options: Invocation. +* output format: Output. +* overriding a header file: Inheritance. +* parentheses in macro bodies: Macro Parentheses. +* pitfalls of macros: Macro Pitfalls. +* predefined macros: Predefined. +* predicates: Assertions. +* preprocessing directives: Directives. +* prescan of macro arguments: Argument Prescan. +* problems with macros: Macro Pitfalls. +* redefining macros: Redefining. +* repeated inclusion: Once-Only. +* retracting assertions: Assertions. +* second include path: Invocation. +* self-reference: Self-Reference. +* semicolons (after macro calls): Swallow Semicolon. +* side effects (in macro arguments): Side Effects. +* simple macro: Simple Macros. +* space as macro argument: Argument Macros. +* standard predefined macros: Standard Predefined. +* stringification: Stringification. +* testing predicates: Assertions. +* unassert: Assertions. +* undefining macros: Undefining. +* unsafe macros: Side Effects. +* unterminated: Invocation. + + +File: cpp.info, Node: Index, Prev: Concept Index, Up: Top + +Index of Directives, Macros and Options +*************************************** + +* Menu: + +* #assert: Assertions. +* #cpu: Assertions. +* #define: Argument Macros. +* #elif: #elif Directive. +* #else: #else Directive. +* #error: #error Directive. +* #ident: Other Directives. +* #if: Conditional Syntax. +* #ifdef: Conditionals-Macros. +* #ifndef: Conditionals-Macros. +* #import: Once-Only. +* #include: Include Syntax. +* #include_next: Inheritance. +* #line: Combining Sources. +* #machine: Assertions. +* #pragma: Other Directives. +* #pragma once: Once-Only. +* #system: Assertions. +* #unassert: Assertions. +* #warning: #error Directive. +* -$: Invocation. +* -A: Invocation. +* -ansi: Invocation. +* -C: Invocation. +* -D: Invocation. +* -dD: Invocation. +* -dI: Invocation. +* -dM: Invocation. +* -gcc: Invocation. +* -H: Invocation. +* -I: Invocation. +* -idirafter: Invocation. +* -imacros: Invocation. +* -include: Invocation. +* -iprefix: Invocation. +* -isystem: Invocation. +* -iwithprefix: Invocation. +* -lint: Invocation. +* -M: Invocation. +* -MD: Invocation. +* -MM: Invocation. +* -MMD: Invocation. +* -nostdinc: Invocation. +* -nostdinc++: Invocation. +* -P: Invocation. +* -pedantic: Invocation. +* -pedantic-errors: Invocation. +* -remap: Invocation. +* -std: Invocation. +* -traditional: Invocation. +* -trigraphs: Invocation. +* -U: Invocation. +* -undef: Invocation. +* -Wall: Invocation. +* -Wcomment: Invocation. +* -Wtraditional: Invocation. +* -Wtrigraphs: Invocation. +* -Wundef: Invocation. +* -x assembler-with-cpp: Invocation. +* -x c: Invocation. +* -x objective-c: Invocation. +* __BASE_FILE__: Standard Predefined. +* __CHAR_UNSIGNED__: Standard Predefined. +* __cplusplus: Standard Predefined. +* __DATE__: Standard Predefined. +* __FILE__: Standard Predefined. +* __GNUC__: Standard Predefined. +* __GNUC_MINOR__: Standard Predefined. +* __GNUG__: Standard Predefined. +* __INCLUDE_LEVEL_: Standard Predefined. +* __LINE__: Standard Predefined. +* __OPTIMIZE__: Standard Predefined. +* __REGISTER_PREFIX__: Standard Predefined. +* __STDC__: Standard Predefined. +* __STDC_VERSION__: Standard Predefined. +* __STRICT_ANSI__: Standard Predefined. +* __TIME__: Standard Predefined. +* __USER_LABEL_PREFIX__: Standard Predefined. +* __VERSION__: Standard Predefined. +* _AM29000: Nonstandard Predefined. +* _AM29K: Nonstandard Predefined. +* BSD: Nonstandard Predefined. +* defined: Conditionals-Macros. +* M68020: Nonstandard Predefined. +* m68k: Nonstandard Predefined. +* mc68000: Nonstandard Predefined. +* ns32000: Nonstandard Predefined. +* pyr: Nonstandard Predefined. +* sequent: Nonstandard Predefined. +* sun: Nonstandard Predefined. +* system header files: Header Uses. +* unix: Nonstandard Predefined. +* vax: Nonstandard Predefined. + + diff --git a/usr/local/nachos/info/gcc.info b/usr/local/nachos/info/gcc.info new file mode 100644 index 0000000..9dd072e --- /dev/null +++ b/usr/local/nachos/info/gcc.info @@ -0,0 +1,329 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +Indirect: +gcc.info-1: 1468 +gcc.info-2: 42003 +gcc.info-3: 75234 +gcc.info-4: 122510 +gcc.info-5: 166689 +gcc.info-6: 213193 +gcc.info-7: 260569 +gcc.info-8: 302186 +gcc.info-9: 349051 +gcc.info-10: 399031 +gcc.info-11: 440266 +gcc.info-12: 488386 +gcc.info-13: 529896 +gcc.info-14: 578788 +gcc.info-15: 626050 +gcc.info-16: 671156 +gcc.info-17: 721050 +gcc.info-18: 769831 +gcc.info-19: 816705 +gcc.info-20: 865531 +gcc.info-21: 915283 +gcc.info-22: 952344 +gcc.info-23: 994139 +gcc.info-24: 1039021 +gcc.info-25: 1084921 +gcc.info-26: 1129014 +gcc.info-27: 1178605 +gcc.info-28: 1218283 +gcc.info-29: 1263090 +gcc.info-30: 1287554 + +Tag Table: +(Indirect) +Node: Top1468 +Node: G++ and GCC3229 +Node: Invoking GCC5627 +Node: Option Summary8988 +Node: Overall Options23740 +Node: Invoking G++28760 +Node: C Dialect Options30217 +Node: C++ Dialect Options42003 +Node: Warning Options57982 +Node: Debugging Options75234 +Node: Optimize Options92302 +Node: Preprocessor Options109774 +Node: Assembler Options116237 +Node: Link Options116604 +Node: Directory Options122510 +Node: Target Options126375 +Node: Submodel Options130006 +Node: M680x0 Options131556 +Node: VAX Options137072 +Node: SPARC Options137607 +Node: Convex Options147471 +Node: AMD29K Options149652 +Node: ARM Options153048 +Node: Thumb Options161069 +Node: MN10200 Options163039 +Node: MN10300 Options163563 +Node: M32R/D Options164339 +Node: M88K Options166689 +Node: RS/6000 and PowerPC Options174627 +Node: RT Options193741 +Node: MIPS Options195445 +Node: i386 Options205190 +Node: HPPA Options213193 +Node: Intel 960 Options217464 +Node: DEC Alpha Options220406 +Node: Clipper Options229800 +Node: H8/300 Options230199 +Node: SH Options231013 +Node: System V Options231832 +Node: TMS320C3x/C4x Options232650 +Node: V850 Options238155 +Node: ARC Options240164 +Node: NS32K Options241366 +Node: Code Gen Options245586 +Node: Environment Variables260569 +Node: Running Protoize266755 +Node: Installation273121 +Node: Configuration Files300581 +Node: Configurations302186 +Node: Other Dir341310 +Node: Cross-Compiler343026 +Node: Steps of Cross344857 +Node: Configure Cross345975 +Node: Tools and Libraries346612 +Node: Cross Runtime349051 +Node: Cross Headers353132 +Node: Build Cross355131 +Node: Sun Install357007 +Node: VMS Install358679 +Node: Collect2368609 +Node: Header Dirs371174 +Node: C Extensions372598 +Node: Statement Exprs376123 +Node: Local Labels378017 +Node: Labels as Values380079 +Node: Nested Functions381943 +Node: Constructing Calls385786 +Node: Naming Types387843 +Node: Typeof388937 +Node: Lvalues390802 +Node: Conditionals393242 +Node: Long Long394133 +Node: Complex395573 +Node: Hex Floats397434 +Node: Zero Length398354 +Node: Variable Length399031 +Node: Macro Varargs401556 +Node: Subscripting403659 +Node: Pointer Arith404142 +Node: Initializers404707 +Node: Constructors405172 +Node: Labeled Elements406866 +Node: Case Ranges409495 +Node: Cast to Union410176 +Node: Function Attributes411254 +Node: Function Prototypes427178 +Node: C++ Comments428980 +Node: Dollar Signs429516 +Node: Character Escapes429974 +Node: Alignment430261 +Node: Variable Attributes431733 +Node: Type Attributes440266 +Node: Inline449477 +Node: Extended Asm453719 +Node: Asm Labels468652 +Node: Explicit Reg Vars469971 +Node: Global Reg Vars471426 +Node: Local Reg Vars475991 +Node: Alternate Keywords477795 +Node: Incomplete Enums479197 +Node: Function Names479953 +Node: Return Address481227 +Node: Other Builtins483270 +Node: Deprecated Features485736 +Node: C++ Extensions487013 +Node: Naming Results488386 +Node: Min and Max491700 +Node: Destructors and Goto493140 +Node: C++ Interface493616 +Node: Template Instantiation498850 +Node: Bound member functions507465 +Node: C++ Signatures508798 +Node: Gcov513142 +Node: Gcov Intro513665 +Node: Invoking Gcov516346 +Node: Gcov and Optimization521957 +Node: Gcov Data Files523381 +Node: Trouble526951 +Node: Actual Bugs528629 +Node: Installation Problems529896 +Node: Cross-Compiler Problems543574 +Node: Interoperation545045 +Node: External Bugs558323 +Node: Incompatibilities560446 +Node: Fixed Headers568918 +Node: Standard Libraries571228 +Node: Disappointments572469 +Node: C++ Misunderstandings577008 +Node: Static Definitions577734 +Node: Temporaries578788 +Node: Copy Assignment580766 +Node: Protoize Caveats582577 +Node: Non-bugs586533 +Node: Warnings and Errors596164 +Node: Bugs597925 +Node: Bug Criteria599273 +Node: Bug Lists601711 +Node: Bug Reporting602827 +Node: Sending Patches615050 +Node: Service620425 +Node: Contributing620992 +Node: VMS621798 +Node: Include Files and VMS622184 +Node: Global Declarations626050 +Node: VMS Misc630355 +Node: Portability634662 +Node: Interface636411 +Node: Passes640993 +Node: RTL659344 +Node: RTL Objects661312 +Node: RTL Classes664358 +Node: Accessors668776 +Node: Flags671156 +Node: Machine Modes681491 +Node: Constants689125 +Node: Regs and Memory694313 +Node: Arithmetic706789 +Node: Comparisons712687 +Node: Bit Fields716750 +Node: Conversions718162 +Node: RTL Declarations721050 +Node: Side Effects721859 +Node: Incdec734863 +Node: Assembler738364 +Node: Insns739886 +Node: Calls763221 +Node: Sharing765816 +Node: Reading RTL768892 +Node: Machine Desc769831 +Node: Patterns771684 +Node: Example774628 +Node: RTL Template775756 +Node: Output Template788835 +Node: Output Statement792817 +Node: Constraints796530 +Node: Simple Constraints797533 +Node: Multi-Alternative809445 +Node: Class Preferences812281 +Node: Modifiers813161 +Node: Machine Constraints816705 +Node: No Constraints825767 +Node: Standard Names826888 +Node: Pattern Ordering864304 +Node: Dependent Patterns865531 +Node: Jump Patterns868346 +Node: Insn Canonicalizations874162 +Node: Peephole Definitions877657 +Node: Expander Definitions884575 +Node: Insn Splitting891960 +Node: Insn Attributes898891 +Node: Defining Attributes899938 +Node: Expressions901950 +Node: Tagging Insns908544 +Node: Attr Example912907 +Node: Insn Lengths915283 +Node: Constant Attributes918576 +Node: Delay Slots919736 +Node: Function Units922947 +Node: Target Macros928617 +Node: Driver930500 +Node: Run-time Target946047 +Node: Storage Layout952344 +Node: Type Layout969671 +Node: Registers976444 +Node: Register Basics977424 +Node: Allocation Order982220 +Node: Values in Registers983636 +Node: Leaf Functions988756 +Node: Stack Registers991534 +Node: Obsolete Register Macros992367 +Node: Register Classes994139 +Node: Stack and Calling1014146 +Node: Frame Layout1014601 +Node: Stack Checking1020098 +Node: Frame Registers1023678 +Node: Elimination1028093 +Node: Stack Arguments1032349 +Node: Register Arguments1039021 +Node: Scalar Return1049531 +Node: Aggregate Return1053769 +Node: Caller Saves1057484 +Node: Function Entry1059023 +Node: Profiling1069925 +Node: Varargs1077006 +Node: Trampolines1084921 +Node: Library Calls1091639 +Node: Addressing Modes1099697 +Node: Condition Code1110105 +Node: Costs1116304 +Node: Sections1129014 +Node: PIC1135245 +Node: Assembler Format1137954 +Node: File Framework1139020 +Node: Data Output1143718 +Node: Uninitialized Data1150912 +Node: Label Output1156318 +Node: Initialization1167524 +Node: Macros for Initialization1173667 +Node: Instruction Output1178605 +Node: Dispatch Tables1186792 +Node: Exception Region Output1189345 +Node: Alignment Output1192339 +Node: Debugging Info1194562 +Node: All Debuggers1195171 +Node: DBX Options1197999 +Node: DBX Hooks1203282 +Node: File Names and DBX1206922 +Node: SDB and DWARF1208895 +Node: Cross-compilation1211717 +Node: Misc1218283 +Node: Config1242660 +Node: Fragments1249923 +Node: Target Fragment1250519 +Node: Host Fragment1254674 +Node: Funding1255276 +Node: GNU/Linux1257775 +Node: Copying1263090 +Node: Contributors1282278 +Node: Index1287554 + +End Tag Table diff --git a/usr/local/nachos/info/gcc.info-1 b/usr/local/nachos/info/gcc.info-1 new file mode 100644 index 0000000..0c347bb --- /dev/null +++ b/usr/local/nachos/info/gcc.info-1 @@ -0,0 +1,954 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Top, Next: G++ and GCC, Up: (DIR) + +Introduction +************ + + This manual documents how to run, install and port the GNU compiler, +as well as its new features and incompatibilities, and how to report +bugs. It corresponds to GCC version 2.95. + +* Menu: + + +* G++ and GCC:: You can compile C or C++ programs. +* Invoking GCC:: Command options supported by `gcc'. +* Installation:: How to configure, compile and install GCC. +* C Extensions:: GNU extensions to the C language family. +* C++ Extensions:: GNU extensions to the C++ language. +* Gcov:: gcov: a GCC test coverage program. +* Trouble:: If you have trouble installing GCC. +* Bugs:: How, why and where to report bugs. +* Service:: How to find suppliers of support for GCC. +* Contributing:: How to contribute to testing and developing GCC. +* VMS:: Using GCC on VMS. + +* Portability:: Goals of GCC's portability features. +* Interface:: Function-call interface of GCC output. +* Passes:: Order of passes, what they do, and what each file is for. +* RTL:: The intermediate representation that most passes work on. +* Machine Desc:: How to write machine description instruction patterns. +* Target Macros:: How to write the machine description C macros. +* Config:: Writing the `xm-MACHINE.h' file. +* Fragments:: Writing the `t-TARGET' and `x-HOST' files. + +* Funding:: How to help assure funding for free software. +* GNU/Linux:: Linux and the GNU Project + +* Copying:: GNU General Public License says + how you can copy and share GCC. +* Contributors:: People who have contributed to GCC. + +* Index:: Index of concepts and symbol names. + + +File: gcc.info, Node: G++ and GCC, Next: Invoking GCC, Prev: Top, Up: Top + +Compile C, C++, Objective C, or Fortran +*************************************** + + The C, C++, and Objective C, and Fortran versions of the compiler are +integrated; this is why we use the name "GNU Compiler Collection". GCC +can compile programs written in C, C++, Objective C, or Fortran. The +Fortran compiler is described in a separate manual. + + "GCC" is a common shorthand term for the GNU Compiler Collection. +This is both the most general name for the compiler, and the name used +when the emphasis is on compiling C programs (as the abbreviation +formerly stood for "GNU C Compiler"). + + When referring to C++ compilation, it is usual to call the compiler +"G++". Since there is only one compiler, it is also accurate to call +it "GCC" no matter what the language context; however, the term "G++" +is more useful when the emphasis is on compiling C++ programs. + + We use the name "GCC" to refer to the compilation system as a whole, +and more specifically to the language-independent part of the compiler. +For example, we refer to the optimization options as affecting the +behavior of "GCC" or sometimes just "the compiler". + + Front ends for other languages, such as Ada 9X, Fortran, Modula-3, +and Pascal, are under development. These front-ends, like that for +C++, are built in subdirectories of GCC and link to it. The result is +an integrated compiler that can compile programs written in C, C++, +Objective C, or any of the languages for which you have installed front +ends. + + In this manual, we only discuss the options for the C, Objective-C, +and C++ compilers and those of the GCC core. Consult the documentation +of the other front ends for the options to use when compiling programs +written in other languages. + + G++ is a *compiler*, not merely a preprocessor. G++ builds object +code directly from your C++ program source. There is no intermediate C +version of the program. (By contrast, for example, some other +implementations use a program that generates a C program from your C++ +source.) Avoiding an intermediate C representation of the program means +that you get better object code, and better debugging information. The +GNU debugger, GDB, works with this information in the object code to +give you comprehensive C++ source-level editing capabilities (*note C +and C++: (gdb.info)C.). + + +File: gcc.info, Node: Invoking GCC, Next: Installation, Prev: G++ and GCC, Up: Top + +GCC Command Options +******************* + + When you invoke GCC, it normally does preprocessing, compilation, +assembly and linking. The "overall options" allow you to stop this +process at an intermediate stage. For example, the `-c' option says +not to run the linker. Then the output consists of object files output +by the assembler. + + Other options are passed on to one stage of processing. Some options +control the preprocessor and others the compiler itself. Yet other +options control the assembler and linker; most of these are not +documented here, since you rarely need to use any of them. + + Most of the command line options that you can use with GCC are useful +for C programs; when an option is only useful with another language +(usually C++), the explanation says so explicitly. If the description +for a particular option does not mention a source language, you can use +that option with all supported languages. + + *Note Compiling C++ Programs: Invoking G++, for a summary of special +options for compiling C++ programs. + + The `gcc' program accepts options and file names as operands. Many +options have multiletter names; therefore multiple single-letter options +may *not* be grouped: `-dr' is very different from `-d -r'. + + You can mix options and other arguments. For the most part, the +order you use doesn't matter. Order does matter when you use several +options of the same kind; for example, if you specify `-L' more than +once, the directories are searched in the order specified. + + Many options have long names starting with `-f' or with `-W'--for +example, `-fforce-mem', `-fstrength-reduce', `-Wformat' and so on. +Most of these have both positive and negative forms; the negative form +of `-ffoo' would be `-fno-foo'. This manual documents only one of +these two forms, whichever one is not the default. + +* Menu: + +* Option Summary:: Brief list of all options, without explanations. +* Overall Options:: Controlling the kind of output: + an executable, object files, assembler files, + or preprocessed source. +* Invoking G++:: Compiling C++ programs. +* C Dialect Options:: Controlling the variant of C language compiled. +* C++ Dialect Options:: Variations on C++. +* Warning Options:: How picky should the compiler be? +* Debugging Options:: Symbol tables, measurements, and debugging dumps. +* Optimize Options:: How much optimization? +* Preprocessor Options:: Controlling header files and macro definitions. + Also, getting dependency information for Make. +* Assembler Options:: Passing options to the assembler. +* Link Options:: Specifying libraries and so on. +* Directory Options:: Where to find header files and libraries. + Where to find the compiler executable files. +* Target Options:: Running a cross-compiler, or an old version of GCC. +* Submodel Options:: Specifying minor hardware or convention variations, + such as 68010 vs 68020. +* Code Gen Options:: Specifying conventions for function calls, data layout + and register usage. +* Environment Variables:: Env vars that affect GCC. +* Running Protoize:: Automatically adding or removing function prototypes. + + +File: gcc.info, Node: Option Summary, Next: Overall Options, Up: Invoking GCC + +Option Summary +============== + + Here is a summary of all the options, grouped by type. Explanations +are in the following sections. + +*Overall Options* + *Note Options Controlling the Kind of Output: Overall Options. + -c -S -E -o FILE -pipe -v --help -x LANGUAGE + +*C Language Options* + *Note Options Controlling C Dialect: C Dialect Options. + -ansi -flang-isoc9x -fallow-single-precision -fcond-mismatch -fno-asm + -fno-builtin -ffreestanding -fhosted -fsigned-bitfields -fsigned-char + -funsigned-bitfields -funsigned-char -fwritable-strings + -traditional -traditional-cpp -trigraphs + +*C++ Language Options* + *Note Options Controlling C++ Dialect: C++ Dialect Options. + -fno-access-control -fcheck-new -fconserve-space -fdollars-in-identifiers + -fno-elide-constructors -fexternal-templates -ffor-scope + -fno-for-scope -fno-gnu-keywords -fguiding-decls -fhandle-signatures + -fhonor-std -fhuge-objects -fno-implicit-templates -finit-priority + -fno-implement-inlines -fname-mangling-version-N -fno-default-inline + -foperator-names -fno-optional-diags -fpermissive -frepo -fstrict-prototype + -fsquangle -ftemplate-depth-N -fthis-is-variable -fvtable-thunks + -nostdinc++ -Wctor-dtor-privacy -Wno-deprecated -Weffc++ + -Wno-non-template-friend + -Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual + -Wno-pmf-conversions -Wreorder -Wsign-promo -Wsynth + +*Warning Options* + *Note Options to Request or Suppress Warnings: Warning Options. + -fsyntax-only -pedantic -pedantic-errors + -w -W -Wall -Waggregate-return -Wbad-function-cast + -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment + -Wconversion -Werror -Wformat + -Wid-clash-LEN -Wimplicit -Wimplicit-int + -Wimplicit-function-declaration -Wimport + -Werror-implicit-function-declaration -Winline + -Wlarger-than-LEN -Wlong-long + -Wmain -Wmissing-declarations -Wmissing-noreturn + -Wmissing-prototypes -Wmultichar -Wnested-externs -Wno-import + -Wparentheses -Wpointer-arith -Wredundant-decls + -Wreturn-type -Wshadow -Wsign-compare -Wstrict-prototypes + -Wswitch -Wtraditional + -Wtrigraphs -Wundef -Wuninitialized -Wunused -Wwrite-strings + -Wunknown-pragmas + +*Debugging Options* + *Note Options for Debugging Your Program or GCC: Debugging Options. + -a -ax -dLETTERS -fdump-unnumbered -fpretend-float + -fprofile-arcs -ftest-coverage + -g -gLEVEL -gcoff -gdwarf -gdwarf-1 -gdwarf-1+ -gdwarf-2 + -ggdb -gstabs -gstabs+ -gxcoff -gxcoff+ + -p -pg -print-file-name=LIBRARY -print-libgcc-file-name + -print-prog-name=PROGRAM -print-search-dirs -save-temps + +*Optimization Options* + *Note Options that Control Optimization: Optimize Options. + -fbranch-probabilities -foptimize-register-moves + -fcaller-saves -fcse-follow-jumps -fcse-skip-blocks + -fdelayed-branch -fexpensive-optimizations + -ffast-math -ffloat-store -fforce-addr -fforce-mem + -fdata-sections -ffunction-sections -fgcse + -finline-functions -finline-limit-N -fkeep-inline-functions + -fno-default-inline -fno-defer-pop -fno-function-cse + -fno-inline -fno-peephole -fomit-frame-pointer -fregmove + -frerun-cse-after-loop -frerun-loop-opt -fschedule-insns + -fschedule-insns2 -fstrength-reduce -fthread-jumps + -funroll-all-loops -funroll-loops + -fmove-all-movables -freduce-all-givs -fstrict-aliasing + -O -O0 -O1 -O2 -O3 -Os + +*Preprocessor Options* + *Note Options Controlling the Preprocessor: Preprocessor Options. + -AQUESTION(ANSWER) -C -dD -dM -dN + -DMACRO[=DEFN] -E -H + -idirafter DIR + -include FILE -imacros FILE + -iprefix FILE -iwithprefix DIR + -iwithprefixbefore DIR -isystem DIR -isystem-c++ DIR + -M -MD -MM -MMD -MG -nostdinc -P -trigraphs + -undef -UMACRO -Wp,OPTION + +*Assembler Option* + *Note Passing Options to the Assembler: Assembler Options. + -Wa,OPTION + +*Linker Options* + *Note Options for Linking: Link Options. + OBJECT-FILE-NAME -lLIBRARY + -nostartfiles -nodefaultlibs -nostdlib + -s -static -shared -symbolic + -Wl,OPTION -Xlinker OPTION + -u SYMBOL + +*Directory Options* + *Note Options for Directory Search: Directory Options. + -BPREFIX -IDIR -I- -LDIR -specs=FILE + +*Target Options* + *Note Target Options::. + -b MACHINE -V VERSION + +*Machine Dependent Options* + *Note Hardware Models and Configurations: Submodel Options. + *M680x0 Options* + -m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 + -m68060 -mcpu32 -m5200 -m68881 -mbitfield -mc68000 -mc68020 + -mfpa -mnobitfield -mrtd -mshort -msoft-float + -malign-int + + *VAX Options* + -mg -mgnu -munix + + *SPARC Options* + -mcpu=CPU TYPE + -mtune=CPU TYPE + -mcmodel=CODE MODEL + -malign-jumps=NUM -malign-loops=NUM + -malign-functions=NUM + -m32 -m64 + -mapp-regs -mbroken-saverestore -mcypress -mepilogue + -mflat -mfpu -mhard-float -mhard-quad-float + -mimpure-text -mlive-g0 -mno-app-regs -mno-epilogue + -mno-flat -mno-fpu -mno-impure-text + -mno-stack-bias -mno-unaligned-doubles + -msoft-float -msoft-quad-float -msparclite -mstack-bias + -msupersparc -munaligned-doubles -mv8 + + *Convex Options* + -mc1 -mc2 -mc32 -mc34 -mc38 + -margcount -mnoargcount + -mlong32 -mlong64 + -mvolatile-cache -mvolatile-nocache + + *AMD29K Options* + -m29000 -m29050 -mbw -mnbw -mdw -mndw + -mlarge -mnormal -msmall + -mkernel-registers -mno-reuse-arg-regs + -mno-stack-check -mno-storem-bug + -mreuse-arg-regs -msoft-float -mstack-check + -mstorem-bug -muser-registers + + *ARM Options* + -mapcs-frame -mno-apcs-frame + -mapcs-26 -mapcs-32 + -mapcs-stack-check -mno-apcs-stack-check + -mapcs-float -mno-apcs-float + -mapcs-reentrant -mno-apcs-reentrant + -msched-prolog -mno-sched-prolog + -mlittle-endian -mbig-endian -mwords-little-endian + -mshort-load-bytes -mno-short-load-bytes -mshort-load-words -mno-short-load-words + -msoft-float -mhard-float -mfpe + -mthumb-interwork -mno-thumb-interwork + -mcpu= -march= -mfpe= + -mstructure-size-boundary= + -mbsd -mxopen -mno-symrename + -mabort-on-noreturn + -mno-sched-prolog + + *Thumb Options* + -mtpcs-frame -mno-tpcs-frame + -mtpcs-leaf-frame -mno-tpcs-leaf-frame + -mlittle-endian -mbig-endian + -mthumb-interwork -mno-thumb-interwork + -mstructure-size-boundary= + + *MN10200 Options* + -mrelax + + *MN10300 Options* + -mmult-bug + -mno-mult-bug + -mrelax + + *M32R/D Options* + -mcode-model=MODEL TYPE -msdata=SDATA TYPE + -G NUM + + *M88K Options* + -m88000 -m88100 -m88110 -mbig-pic + -mcheck-zero-division -mhandle-large-shift + -midentify-revision -mno-check-zero-division + -mno-ocs-debug-info -mno-ocs-frame-position + -mno-optimize-arg-area -mno-serialize-volatile + -mno-underscores -mocs-debug-info + -mocs-frame-position -moptimize-arg-area + -mserialize-volatile -mshort-data-NUM -msvr3 + -msvr4 -mtrap-large-shift -muse-div-instruction + -mversion-03.00 -mwarn-passed-structs + + *RS/6000 and PowerPC Options* + -mcpu=CPU TYPE + -mtune=CPU TYPE + -mpower -mno-power -mpower2 -mno-power2 + -mpowerpc -mno-powerpc + -mpowerpc-gpopt -mno-powerpc-gpopt + -mpowerpc-gfxopt -mno-powerpc-gfxopt + -mnew-mnemonics -mno-new-mnemonics + -mfull-toc -mminimal-toc -mno-fop-in-toc -mno-sum-in-toc + -maix64 -maix32 -mxl-call -mno-xl-call -mthreads -mpe + -msoft-float -mhard-float -mmultiple -mno-multiple + -mstring -mno-string -mupdate -mno-update + -mfused-madd -mno-fused-madd -mbit-align -mno-bit-align + -mstrict-align -mno-strict-align -mrelocatable + -mno-relocatable -mrelocatable-lib -mno-relocatable-lib + -mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian + -mcall-aix -mcall-sysv -mprototype -mno-prototype + -msim -mmvme -mads -myellowknife -memb -msdata + -msdata=OPT -G NUM + + *RT Options* + -mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs + -mfull-fp-blocks -mhc-struct-return -min-line-mul + -mminimum-fp-blocks -mnohc-struct-return + + *MIPS Options* + -mabicalls -mcpu=CPU TYPE -membedded-data + -membedded-pic -mfp32 -mfp64 -mgas -mgp32 -mgp64 + -mgpopt -mhalf-pic -mhard-float -mint64 -mips1 + -mips2 -mips3 -mips4 -mlong64 -mlong32 -mlong-calls -mmemcpy + -mmips-as -mmips-tfile -mno-abicalls + -mno-embedded-data -mno-embedded-pic + -mno-gpopt -mno-long-calls + -mno-memcpy -mno-mips-tfile -mno-rnames -mno-stats + -mrnames -msoft-float + -m4650 -msingle-float -mmad + -mstats -EL -EB -G NUM -nocpp + -mabi=32 -mabi=n32 -mabi=64 -mabi=eabi + + *i386 Options* + -mcpu=CPU TYPE + -march=CPU TYPE + -mieee-fp -mno-fancy-math-387 + -mno-fp-ret-in-387 -msoft-float -msvr3-shlib + -mno-wide-multiply -mrtd -malign-double + -mreg-alloc=LIST -mregparm=NUM + -malign-jumps=NUM -malign-loops=NUM + -malign-functions=NUM -mpreferred-stack-boundary=NUM + + *HPPA Options* + -march=ARCHITECTURE TYPE + -mbig-switch -mdisable-fpregs -mdisable-indexing + -mfast-indirect-calls -mgas -mjump-in-delay + -mlong-load-store -mno-big-switch -mno-disable-fpregs + -mno-disable-indexing -mno-fast-indirect-calls -mno-gas + -mno-jump-in-delay -mno-long-load-store + -mno-portable-runtime -mno-soft-float -mno-space + -mno-space-regs -msoft-float -mpa-risc-1-0 + -mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime + -mschedule=CPU TYPE -mspace -mspace-regs + + *Intel 960 Options* + -mCPU TYPE -masm-compat -mclean-linkage + -mcode-align -mcomplex-addr -mleaf-procedures + -mic-compat -mic2.0-compat -mic3.0-compat + -mintel-asm -mno-clean-linkage -mno-code-align + -mno-complex-addr -mno-leaf-procedures + -mno-old-align -mno-strict-align -mno-tail-call + -mnumerics -mold-align -msoft-float -mstrict-align + -mtail-call + + *DEC Alpha Options* + -mfp-regs -mno-fp-regs -mno-soft-float -msoft-float + -malpha-as -mgas + -mieee -mieee-with-inexact -mieee-conformant + -mfp-trap-mode=MODE -mfp-rounding-mode=MODE + -mtrap-precision=MODE -mbuild-constants + -mcpu=CPU TYPE + -mbwx -mno-bwx -mcix -mno-cix -mmax -mno-max + -mmemory-latency=TIME + + *Clipper Options* + -mc300 -mc400 + + *H8/300 Options* + -mrelax -mh -ms -mint32 -malign-300 + + *SH Options* + -m1 -m2 -m3 -m3e -mb -ml -mdalign -mrelax + + *System V Options* + -Qy -Qn -YP,PATHS -Ym,DIR + + *ARC Options* + -EB -EL + -mmangle-cpu -mcpu=CPU -mtext=TEXT SECTION + -mdata=DATA SECTION -mrodata=READONLY DATA SECTION + + *TMS320C3x/C4x Options* + -mcpu=CPU -mbig -msmall -mregparm -mmemparm + -mfast-fix -mmpyi -mbk -mti -mdp-isr-reload + -mrpts=COUNT -mrptb -mdb -mloop-unsigned + -mparallel-insns -mparallel-mpy -mpreserve-float + + *V850 Options* + -mlong-calls -mno-long-calls -mep -mno-ep + -mprolog-function -mno-prolog-function -mspace + -mtda=N -msda=N -mzda=N + -mv850 -mbig-switch + + *NS32K Options* + -m32032 -m32332 -m32532 -m32081 -m32381 -mmult-add -mnomult-add + -msoft-float -mrtd -mnortd -mregparam -mnoregparam -msb -mnosb + -mbitfield -mnobitfield -mhimem -mnohimem + +*Code Generation Options* + *Note Options for Code Generation Conventions: Code Gen Options. + -fcall-saved-REG -fcall-used-REG + -fexceptions -ffixed-REG -finhibit-size-directive + -fcheck-memory-usage -fprefix-function-name + -fno-common -fno-ident -fno-gnu-linker + -fpcc-struct-return -fpic -fPIC + -freg-struct-return -fshared-data -fshort-enums + -fshort-double -fvolatile -fvolatile-global -fvolatile-static + -fverbose-asm -fpack-struct -fstack-check + -fargument-alias -fargument-noalias + -fargument-noalias-global + -fleading-underscore + +* Menu: + +* Overall Options:: Controlling the kind of output: + an executable, object files, assembler files, + or preprocessed source. +* C Dialect Options:: Controlling the variant of C language compiled. +* C++ Dialect Options:: Variations on C++. +* Warning Options:: How picky should the compiler be? +* Debugging Options:: Symbol tables, measurements, and debugging dumps. +* Optimize Options:: How much optimization? +* Preprocessor Options:: Controlling header files and macro definitions. + Also, getting dependency information for Make. +* Assembler Options:: Passing options to the assembler. +* Link Options:: Specifying libraries and so on. +* Directory Options:: Where to find header files and libraries. + Where to find the compiler executable files. +* Target Options:: Running a cross-compiler, or an old version of GCC. + + +File: gcc.info, Node: Overall Options, Next: Invoking G++, Prev: Option Summary, Up: Invoking GCC + +Options Controlling the Kind of Output +====================================== + + Compilation can involve up to four stages: preprocessing, compilation +proper, assembly and linking, always in that order. The first three +stages apply to an individual source file, and end by producing an +object file; linking combines all the object files (those newly +compiled, and those specified as input) into an executable file. + + For any given input file, the file name suffix determines what kind +of compilation is done: + +`FILE.c' + C source code which must be preprocessed. + +`FILE.i' + C source code which should not be preprocessed. + +`FILE.ii' + C++ source code which should not be preprocessed. + +`FILE.m' + Objective-C source code. Note that you must link with the library + `libobjc.a' to make an Objective-C program work. + +`FILE.h' + C header file (not to be compiled or linked). + +`FILE.cc' +`FILE.cxx' +`FILE.cpp' +`FILE.C' + C++ source code which must be preprocessed. Note that in `.cxx', + the last two letters must both be literally `x'. Likewise, `.C' + refers to a literal capital C. + +`FILE.s' + Assembler code. + +`FILE.S' + Assembler code which must be preprocessed. + +`OTHER' + An object file to be fed straight into linking. Any file name + with no recognized suffix is treated this way. + + You can specify the input language explicitly with the `-x' option: + +`-x LANGUAGE' + Specify explicitly the LANGUAGE for the following input files + (rather than letting the compiler choose a default based on the + file name suffix). This option applies to all following input + files until the next `-x' option. Possible values for LANGUAGE + are: + c objective-c c++ + c-header cpp-output c++-cpp-output + assembler assembler-with-cpp + +`-x none' + Turn off any specification of a language, so that subsequent files + are handled according to their file name suffixes (as they are if + `-x' has not been used at all). + + If you only want some of the stages of compilation, you can use `-x' +(or filename suffixes) to tell `gcc' where to start, and one of the +options `-c', `-S', or `-E' to say where `gcc' is to stop. Note that +some combinations (for example, `-x cpp-output -E' instruct `gcc' to do +nothing at all. + +`-c' + Compile or assemble the source files, but do not link. The linking + stage simply is not done. The ultimate output is in the form of an + object file for each source file. + + By default, the object file name for a source file is made by + replacing the suffix `.c', `.i', `.s', etc., with `.o'. + + Unrecognized input files, not requiring compilation or assembly, + are ignored. + +`-S' + Stop after the stage of compilation proper; do not assemble. The + output is in the form of an assembler code file for each + non-assembler input file specified. + + By default, the assembler file name for a source file is made by + replacing the suffix `.c', `.i', etc., with `.s'. + + Input files that don't require compilation are ignored. + +`-E' + Stop after the preprocessing stage; do not run the compiler + proper. The output is in the form of preprocessed source code, + which is sent to the standard output. + + Input files which don't require preprocessing are ignored. + +`-o FILE' + Place output in file FILE. This applies regardless to whatever + sort of output is being produced, whether it be an executable file, + an object file, an assembler file or preprocessed C code. + + Since only one output file can be specified, it does not make + sense to use `-o' when compiling more than one input file, unless + you are producing an executable file as output. + + If `-o' is not specified, the default is to put an executable file + in `a.out', the object file for `SOURCE.SUFFIX' in `SOURCE.o', its + assembler file in `SOURCE.s', and all preprocessed C source on + standard output. + +`-v' + Print (on standard error output) the commands executed to run the + stages of compilation. Also print the version number of the + compiler driver program and of the preprocessor and the compiler + proper. + +`-pipe' + Use pipes rather than temporary files for communication between the + various stages of compilation. This fails to work on some systems + where the assembler is unable to read from a pipe; but the GNU + assembler has no trouble. + +`--help' + Print (on the standard output) a description of the command line + options understood by `gcc'. If the `-v' option is also specified + then `--help' will also be passed on to the various processes + invoked by `gcc', so that they can display the command line options + they accept. If the `-W' option is also specified then command + line options which have no documentation associated with them will + also be displayed. + + +File: gcc.info, Node: Invoking G++, Next: C Dialect Options, Prev: Overall Options, Up: Invoking GCC + +Compiling C++ Programs +====================== + + C++ source files conventionally use one of the suffixes `.C', `.cc', +`.cpp', `.c++', `.cp', or `.cxx'; preprocessed C++ files use the suffix +`.ii'. GCC recognizes files with these names and compiles them as C++ +programs even if you call the compiler the same way as for compiling C +programs (usually with the name `gcc'). + + However, C++ programs often require class libraries as well as a +compiler that understands the C++ language--and under some +circumstances, you might want to compile programs from standard input, +or otherwise without a suffix that flags them as C++ programs. `g++' +is a program that calls GCC with the default language set to C++, and +automatically specifies linking against the C++ library. On many +systems, the script `g++' is also installed with the name `c++'. + + When you compile C++ programs, you may specify many of the same +command-line options that you use for compiling programs in any +language; or command-line options meaningful for C and related +languages; or options that are meaningful only for C++ programs. *Note +Options Controlling C Dialect: C Dialect Options, for explanations of +options for languages related to C. *Note Options Controlling C++ +Dialect: C++ Dialect Options, for explanations of options that are +meaningful only for C++ programs. + + +File: gcc.info, Node: C Dialect Options, Next: C++ Dialect Options, Prev: Invoking G++, Up: Invoking GCC + +Options Controlling C Dialect +============================= + + The following options control the dialect of C (or languages derived +from C, such as C++ and Objective C) that the compiler accepts: + +`-ansi' + In C mode, support all ANSI standard C programs. In C++ mode, + remove GNU extensions that conflict with ANSI C++. + + This turns off certain features of GCC that are incompatible with + ANSI C (when compiling C code), or of ANSI standard C++ (when + compiling C++ code), such as the `asm' and `typeof' keywords, and + predefined macros such as `unix' and `vax' that identify the type + of system you are using. It also enables the undesirable and + rarely used ANSI trigraph feature. For the C compiler, it + disables recognition of C++ style `//' comments as well as the + `inline' keyword. For the C++ compiler, `-foperator-names' is + enabled as well. + + The alternate keywords `__asm__', `__extension__', `__inline__' + and `__typeof__' continue to work despite `-ansi'. You would not + want to use them in an ANSI C program, of course, but it is useful + to put them in header files that might be included in compilations + done with `-ansi'. Alternate predefined macros such as `__unix__' + and `__vax__' are also available, with or without `-ansi'. + + The `-ansi' option does not cause non-ANSI programs to be rejected + gratuitously. For that, `-pedantic' is required in addition to + `-ansi'. *Note Warning Options::. + + The macro `__STRICT_ANSI__' is predefined when the `-ansi' option + is used. Some header files may notice this macro and refrain from + declaring certain functions or defining certain macros that the + ANSI standard doesn't call for; this is to avoid interfering with + any programs that might use these names for other things. + + The functions `alloca', `abort', `exit', and `_exit' are not + builtin functions when `-ansi' is used. + +`-flang-isoc9x' + Enable support for features found in the C9X standard. In + particular, enable support for the C9X `restrict' keyword. + + Even when this option is not specified, you can still use some C9X + features in so far as they do not conflict with previous C + standards. For example, you may use `__restrict__' even when + -flang-isoc9x is not specified. + +`-fno-asm' + Do not recognize `asm', `inline' or `typeof' as a keyword, so that + code can use these words as identifiers. You can use the keywords + `__asm__', `__inline__' and `__typeof__' instead. `-ansi' implies + `-fno-asm'. + + In C++, this switch only affects the `typeof' keyword, since `asm' + and `inline' are standard keywords. You may want to use the + `-fno-gnu-keywords' flag instead, as it also disables the other, + C++-specific, extension keywords such as `headof'. + +`-fno-builtin' + Don't recognize builtin functions that do not begin with + `__builtin_' as prefix. Currently, the functions affected include + `abort', `abs', `alloca', `cos', `exit', `fabs', `ffs', `labs', + `memcmp', `memcpy', `sin', `sqrt', `strcmp', `strcpy', and + `strlen'. + + GCC normally generates special code to handle certain builtin + functions more efficiently; for instance, calls to `alloca' may + become single instructions that adjust the stack directly, and + calls to `memcpy' may become inline copy loops. The resulting + code is often both smaller and faster, but since the function + calls no longer appear as such, you cannot set a breakpoint on + those calls, nor can you change the behavior of the functions by + linking with a different library. + + The `-ansi' option prevents `alloca' and `ffs' from being builtin + functions, since these functions do not have an ANSI standard + meaning. + +`-fhosted' + Assert that compilation takes place in a hosted environment. This + implies `-fbuiltin'. A hosted environment is one in which the + entire standard library is available, and in which `main' has a + return type of `int'. Examples are nearly everything except a + kernel. This is equivalent to `-fno-freestanding'. + +`-ffreestanding' + Assert that compilation takes place in a freestanding environment. + This implies `-fno-builtin'. A freestanding environment is one + in which the standard library may not exist, and program startup + may not necessarily be at `main'. The most obvious example is an + OS kernel. This is equivalent to `-fno-hosted'. + +`-trigraphs' + Support ANSI C trigraphs. You don't want to know about this + brain-damage. The `-ansi' option implies `-trigraphs'. + +`-traditional' + Attempt to support some aspects of traditional C compilers. + Specifically: + + * All `extern' declarations take effect globally even if they + are written inside of a function definition. This includes + implicit declarations of functions. + + * The newer keywords `typeof', `inline', `signed', `const' and + `volatile' are not recognized. (You can still use the + alternative keywords such as `__typeof__', `__inline__', and + so on.) + + * Comparisons between pointers and integers are always allowed. + + * Integer types `unsigned short' and `unsigned char' promote to + `unsigned int'. + + * Out-of-range floating point literals are not an error. + + * Certain constructs which ANSI regards as a single invalid + preprocessing number, such as `0xe-0xd', are treated as + expressions instead. + + * String "constants" are not necessarily constant; they are + stored in writable space, and identical looking constants are + allocated separately. (This is the same as the effect of + `-fwritable-strings'.) + + * All automatic variables not declared `register' are preserved + by `longjmp'. Ordinarily, GNU C follows ANSI C: automatic + variables not declared `volatile' may be clobbered. + + * The character escape sequences `\x' and `\a' evaluate as the + literal characters `x' and `a' respectively. Without + `-traditional', `\x' is a prefix for the hexadecimal + representation of a character, and `\a' produces a bell. + + You may wish to use `-fno-builtin' as well as `-traditional' if + your program uses names that are normally GNU C builtin functions + for other purposes of its own. + + You cannot use `-traditional' if you include any header files that + rely on ANSI C features. Some vendors are starting to ship + systems with ANSI C header files and you cannot use `-traditional' + on such systems to compile files that include any system headers. + + The `-traditional' option also enables `-traditional-cpp', which + is described next. + +`-traditional-cpp' + Attempt to support some aspects of traditional C preprocessors. + Specifically: + + * Comments convert to nothing at all, rather than to a space. + This allows traditional token concatenation. + + * In a preprocessing directive, the `#' symbol must appear as + the first character of a line. + + * Macro arguments are recognized within string constants in a + macro definition (and their values are stringified, though + without additional quote marks, when they appear in such a + context). The preprocessor always considers a string + constant to end at a newline. + + * The predefined macro `__STDC__' is not defined when you use + `-traditional', but `__GNUC__' is (since the GNU extensions + which `__GNUC__' indicates are not affected by + `-traditional'). If you need to write header files that work + differently depending on whether `-traditional' is in use, by + testing both of these predefined macros you can distinguish + four situations: GNU C, traditional GNU C, other ANSI C + compilers, and other old C compilers. The predefined macro + `__STDC_VERSION__' is also not defined when you use + `-traditional'. *Note Standard Predefined Macros: + (cpp.info)Standard Predefined, for more discussion of these + and other predefined macros. + + * The preprocessor considers a string constant to end at a + newline (unless the newline is escaped with `\'). (Without + `-traditional', string constants can contain the newline + character as typed.) + +`-fcond-mismatch' + Allow conditional expressions with mismatched types in the second + and third arguments. The value of such an expression is void. + +`-funsigned-char' + Let the type `char' be unsigned, like `unsigned char'. + + Each kind of machine has a default for what `char' should be. It + is either like `unsigned char' by default or like `signed char' by + default. + + Ideally, a portable program should always use `signed char' or + `unsigned char' when it depends on the signedness of an object. + But many programs have been written to use plain `char' and expect + it to be signed, or expect it to be unsigned, depending on the + machines they were written for. This option, and its inverse, let + you make such a program work with the opposite default. + + The type `char' is always a distinct type from each of `signed + char' or `unsigned char', even though its behavior is always just + like one of those two. + +`-fsigned-char' + Let the type `char' be signed, like `signed char'. + + Note that this is equivalent to `-fno-unsigned-char', which is the + negative form of `-funsigned-char'. Likewise, the option + `-fno-signed-char' is equivalent to `-funsigned-char'. + + You may wish to use `-fno-builtin' as well as `-traditional' if + your program uses names that are normally GNU C builtin functions + for other purposes of its own. + + You cannot use `-traditional' if you include any header files that + rely on ANSI C features. Some vendors are starting to ship + systems with ANSI C header files and you cannot use `-traditional' + on such systems to compile files that include any system headers. + +`-fsigned-bitfields' +`-funsigned-bitfields' +`-fno-signed-bitfields' +`-fno-unsigned-bitfields' + These options control whether a bitfield is signed or unsigned, + when the declaration does not use either `signed' or `unsigned'. + By default, such a bitfield is signed, because this is consistent: + the basic integer types such as `int' are signed types. + + However, when `-traditional' is used, bitfields are all unsigned + no matter what. + +`-fwritable-strings' + Store string constants in the writable data segment and don't + uniquize them. This is for compatibility with old programs which + assume they can write into string constants. The option + `-traditional' also has this effect. + + Writing into string constants is a very bad idea; "constants" + should be constant. + +`-fallow-single-precision' + Do not promote single precision math operations to double + precision, even when compiling with `-traditional'. + + Traditional K&R C promotes all floating point operations to double + precision, regardless of the sizes of the operands. On the + architecture for which you are compiling, single precision may be + faster than double precision. If you must use `-traditional', + but want to use single precision operations when the operands are + single precision, use this option. This option has no effect + when compiling with ANSI or GNU C conventions (the default). + diff --git a/usr/local/nachos/info/gcc.info-10 b/usr/local/nachos/info/gcc.info-10 new file mode 100644 index 0000000..aad0405 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-10 @@ -0,0 +1,1065 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Variable Length, Next: Macro Varargs, Prev: Zero Length, Up: C Extensions + +Arrays of Variable Length +========================= + + Variable-length automatic arrays are allowed in GNU C. These arrays +are declared like any other automatic arrays, but with a length that is +not a constant expression. The storage is allocated at the point of +declaration and deallocated when the brace-level is exited. For +example: + + FILE * + concat_fopen (char *s1, char *s2, char *mode) + { + char str[strlen (s1) + strlen (s2) + 1]; + strcpy (str, s1); + strcat (str, s2); + return fopen (str, mode); + } + + Jumping or breaking out of the scope of the array name deallocates +the storage. Jumping into the scope is not allowed; you get an error +message for it. + + You can use the function `alloca' to get an effect much like +variable-length arrays. The function `alloca' is available in many +other C implementations (but not in all). On the other hand, +variable-length arrays are more elegant. + + There are other differences between these two methods. Space +allocated with `alloca' exists until the containing *function* returns. +The space for a variable-length array is deallocated as soon as the +array name's scope ends. (If you use both variable-length arrays and +`alloca' in the same function, deallocation of a variable-length array +will also deallocate anything more recently allocated with `alloca'.) + + You can also use variable-length arrays as arguments to functions: + + struct entry + tester (int len, char data[len][len]) + { + ... + } + + The length of an array is computed once when the storage is allocated +and is remembered for the scope of the array in case you access it with +`sizeof'. + + If you want to pass the array first and the length afterward, you can +use a forward declaration in the parameter list--another GNU extension. + + struct entry + tester (int len; char data[len][len], int len) + { + ... + } + + The `int len' before the semicolon is a "parameter forward +declaration", and it serves the purpose of making the name `len' known +when the declaration of `data' is parsed. + + You can write any number of such parameter forward declarations in +the parameter list. They can be separated by commas or semicolons, but +the last one must end with a semicolon, which is followed by the "real" +parameter declarations. Each forward declaration must match a "real" +declaration in parameter name and data type. + + +File: gcc.info, Node: Macro Varargs, Next: Subscripting, Prev: Variable Length, Up: C Extensions + +Macros with Variable Numbers of Arguments +========================================= + + In GNU C, a macro can accept a variable number of arguments, much as +a function can. The syntax for defining the macro looks much like that +used for a function. Here is an example: + + #define eprintf(format, args...) \ + fprintf (stderr, format , ## args) + + Here `args' is a "rest argument": it takes in zero or more +arguments, as many as the call contains. All of them plus the commas +between them form the value of `args', which is substituted into the +macro body where `args' is used. Thus, we have this expansion: + + eprintf ("%s:%d: ", input_file_name, line_number) + ==> + fprintf (stderr, "%s:%d: " , input_file_name, line_number) + +Note that the comma after the string constant comes from the definition +of `eprintf', whereas the last comma comes from the value of `args'. + + The reason for using `##' is to handle the case when `args' matches +no arguments at all. In this case, `args' has an empty value. In this +case, the second comma in the definition becomes an embarrassment: if +it got through to the expansion of the macro, we would get something +like this: + + fprintf (stderr, "success!\n" , ) + +which is invalid C syntax. `##' gets rid of the comma, so we get the +following instead: + + fprintf (stderr, "success!\n") + + This is a special feature of the GNU C preprocessor: `##' before a +rest argument that is empty discards the preceding sequence of +non-whitespace characters from the macro definition. (If another macro +argument precedes, none of it is discarded.) + + It might be better to discard the last preprocessor token instead of +the last preceding sequence of non-whitespace characters; in fact, we +may someday change this feature to do so. We advise you to write the +macro definition so that the preceding sequence of non-whitespace +characters is just a single token, so that the meaning will not change +if we change the definition of this feature. + + +File: gcc.info, Node: Subscripting, Next: Pointer Arith, Prev: Macro Varargs, Up: C Extensions + +Non-Lvalue Arrays May Have Subscripts +===================================== + + Subscripting is allowed on arrays that are not lvalues, even though +the unary `&' operator is not. For example, this is valid in GNU C +though not valid in other C dialects: + + struct foo {int a[4];}; + + struct foo f(); + + bar (int index) + { + return f().a[index]; + } + + +File: gcc.info, Node: Pointer Arith, Next: Initializers, Prev: Subscripting, Up: C Extensions + +Arithmetic on `void'- and Function-Pointers +=========================================== + + In GNU C, addition and subtraction operations are supported on +pointers to `void' and on pointers to functions. This is done by +treating the size of a `void' or of a function as 1. + + A consequence of this is that `sizeof' is also allowed on `void' and +on function types, and returns 1. + + The option `-Wpointer-arith' requests a warning if these extensions +are used. + + +File: gcc.info, Node: Initializers, Next: Constructors, Prev: Pointer Arith, Up: C Extensions + +Non-Constant Initializers +========================= + + As in standard C++, the elements of an aggregate initializer for an +automatic variable are not required to be constant expressions in GNU C. +Here is an example of an initializer with run-time varying elements: + + foo (float f, float g) + { + float beat_freqs[2] = { f-g, f+g }; + ... + } + + +File: gcc.info, Node: Constructors, Next: Labeled Elements, Prev: Initializers, Up: C Extensions + +Constructor Expressions +======================= + + GNU C supports constructor expressions. A constructor looks like a +cast containing an initializer. Its value is an object of the type +specified in the cast, containing the elements specified in the +initializer. + + Usually, the specified type is a structure. Assume that `struct +foo' and `structure' are declared as shown: + + struct foo {int a; char b[2];} structure; + +Here is an example of constructing a `struct foo' with a constructor: + + structure = ((struct foo) {x + y, 'a', 0}); + +This is equivalent to writing the following: + + { + struct foo temp = {x + y, 'a', 0}; + structure = temp; + } + + You can also construct an array. If all the elements of the +constructor are (made up of) simple constant expressions, suitable for +use in initializers, then the constructor is an lvalue and can be +coerced to a pointer to its first element, as shown here: + + char **foo = (char *[]) { "x", "y", "z" }; + + Array constructors whose elements are not simple constants are not +very useful, because the constructor is not an lvalue. There are only +two valid ways to use it: to subscript it, or initialize an array +variable with it. The former is probably slower than a `switch' +statement, while the latter does the same thing an ordinary C +initializer would do. Here is an example of subscripting an array +constructor: + + output = ((int[]) { 2, x, 28 }) [input]; + + Constructor expressions for scalar types and union types are is also +allowed, but then the constructor expression is equivalent to a cast. + + +File: gcc.info, Node: Labeled Elements, Next: Cast to Union, Prev: Constructors, Up: C Extensions + +Labeled Elements in Initializers +================================ + + Standard C requires the elements of an initializer to appear in a +fixed order, the same as the order of the elements in the array or +structure being initialized. + + In GNU C you can give the elements in any order, specifying the array +indices or structure field names they apply to. This extension is not +implemented in GNU C++. + + To specify an array index, write `[INDEX]' or `[INDEX] =' before the +element value. For example, + + int a[6] = { [4] 29, [2] = 15 }; + +is equivalent to + + int a[6] = { 0, 0, 15, 0, 29, 0 }; + +The index values must be constant expressions, even if the array being +initialized is automatic. + + To initialize a range of elements to the same value, write `[FIRST +... LAST] = VALUE'. For example, + + int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 }; + +Note that the length of the array is the highest value specified plus +one. + + In a structure initializer, specify the name of a field to initialize +with `FIELDNAME:' before the element value. For example, given the +following structure, + + struct point { int x, y; }; + +the following initialization + + struct point p = { y: yvalue, x: xvalue }; + +is equivalent to + + struct point p = { xvalue, yvalue }; + + Another syntax which has the same meaning is `.FIELDNAME ='., as +shown here: + + struct point p = { .y = yvalue, .x = xvalue }; + + You can also use an element label (with either the colon syntax or +the period-equal syntax) when initializing a union, to specify which +element of the union should be used. For example, + + union foo { int i; double d; }; + + union foo f = { d: 4 }; + +will convert 4 to a `double' to store it in the union using the second +element. By contrast, casting 4 to type `union foo' would store it +into the union as the integer `i', since it is an integer. (*Note Cast +to Union::.) + + You can combine this technique of naming elements with ordinary C +initialization of successive elements. Each initializer element that +does not have a label applies to the next consecutive element of the +array or structure. For example, + + int a[6] = { [1] = v1, v2, [4] = v4 }; + +is equivalent to + + int a[6] = { 0, v1, v2, 0, v4, 0 }; + + Labeling the elements of an array initializer is especially useful +when the indices are characters or belong to an `enum' type. For +example: + + int whitespace[256] + = { [' '] = 1, ['\t'] = 1, ['\h'] = 1, + ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 }; + + +File: gcc.info, Node: Case Ranges, Next: Function Attributes, Prev: Cast to Union, Up: C Extensions + +Case Ranges +=========== + + You can specify a range of consecutive values in a single `case' +label, like this: + + case LOW ... HIGH: + +This has the same effect as the proper number of individual `case' +labels, one for each integer value from LOW to HIGH, inclusive. + + This feature is especially useful for ranges of ASCII character +codes: + + case 'A' ... 'Z': + + *Be careful:* Write spaces around the `...', for otherwise it may be +parsed wrong when you use it with integer values. For example, write +this: + + case 1 ... 5: + +rather than this: + + case 1...5: + + +File: gcc.info, Node: Cast to Union, Next: Case Ranges, Prev: Labeled Elements, Up: C Extensions + +Cast to a Union Type +==================== + + A cast to union type is similar to other casts, except that the type +specified is a union type. You can specify the type either with `union +TAG' or with a typedef name. A cast to union is actually a constructor +though, not a cast, and hence does not yield an lvalue like normal +casts. (*Note Constructors::.) + + The types that may be cast to the union type are those of the members +of the union. Thus, given the following union and variables: + + union foo { int i; double d; }; + int x; + double y; + +both `x' and `y' can be cast to type `union' foo. + + Using the cast as the right-hand side of an assignment to a variable +of union type is equivalent to storing in a member of the union: + + union foo u; + ... + u = (union foo) x == u.i = x + u = (union foo) y == u.d = y + + You can also use the union cast as a function argument: + + void hack (union foo); + ... + hack ((union foo) x); + + +File: gcc.info, Node: Function Attributes, Next: Function Prototypes, Prev: Case Ranges, Up: C Extensions + +Declaring Attributes of Functions +================================= + + In GNU C, you declare certain things about functions called in your +program which help the compiler optimize function calls and check your +code more carefully. + + The keyword `__attribute__' allows you to specify special attributes +when making a declaration. This keyword is followed by an attribute +specification inside double parentheses. Nine attributes, `noreturn', +`const', `format', `no_instrument_function', `section', `constructor', +`destructor', `unused' and `weak' are currently defined for functions. +Other attributes, including `section' are supported for variables +declarations (*note Variable Attributes::.) and for types (*note Type +Attributes::.). + + You may also specify attributes with `__' preceding and following +each keyword. This allows you to use them in header files without +being concerned about a possible macro of the same name. For example, +you may use `__noreturn__' instead of `noreturn'. + +`noreturn' + A few standard library functions, such as `abort' and `exit', + cannot return. GNU CC knows this automatically. Some programs + define their own functions that never return. You can declare them + `noreturn' to tell the compiler this fact. For example, + + void fatal () __attribute__ ((noreturn)); + + void + fatal (...) + { + ... /* Print error message. */ ... + exit (1); + } + + The `noreturn' keyword tells the compiler to assume that `fatal' + cannot return. It can then optimize without regard to what would + happen if `fatal' ever did return. This makes slightly better + code. More importantly, it helps avoid spurious warnings of + uninitialized variables. + + Do not assume that registers saved by the calling function are + restored before calling the `noreturn' function. + + It does not make sense for a `noreturn' function to have a return + type other than `void'. + + The attribute `noreturn' is not implemented in GNU C versions + earlier than 2.5. An alternative way to declare that a function + does not return, which works in the current version and in some + older versions, is as follows: + + typedef void voidfn (); + + volatile voidfn fatal; + +`const' + Many functions do not examine any values except their arguments, + and have no effects except the return value. Such a function can + be subject to common subexpression elimination and loop + optimization just as an arithmetic operator would be. These + functions should be declared with the attribute `const'. For + example, + + int square (int) __attribute__ ((const)); + + says that the hypothetical function `square' is safe to call fewer + times than the program says. + + The attribute `const' is not implemented in GNU C versions earlier + than 2.5. An alternative way to declare that a function has no + side effects, which works in the current version and in some older + versions, is as follows: + + typedef int intfn (); + + extern const intfn square; + + This approach does not work in GNU C++ from 2.6.0 on, since the + language specifies that the `const' must be attached to the return + value. + + Note that a function that has pointer arguments and examines the + data pointed to must *not* be declared `const'. Likewise, a + function that calls a non-`const' function usually must not be + `const'. It does not make sense for a `const' function to return + `void'. + +`format (ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)' + The `format' attribute specifies that a function takes `printf', + `scanf', or `strftime' style arguments which should be type-checked + against a format string. For example, the declaration: + + extern int + my_printf (void *my_object, const char *my_format, ...) + __attribute__ ((format (printf, 2, 3))); + + causes the compiler to check the arguments in calls to `my_printf' + for consistency with the `printf' style format string argument + `my_format'. + + The parameter ARCHETYPE determines how the format string is + interpreted, and should be either `printf', `scanf', or + `strftime'. The parameter STRING-INDEX specifies which argument + is the format string argument (starting from 1), while + FIRST-TO-CHECK is the number of the first argument to check + against the format string. For functions where the arguments are + not available to be checked (such as `vprintf'), specify the third + parameter as zero. In this case the compiler only checks the + format string for consistency. + + In the example above, the format string (`my_format') is the second + argument of the function `my_print', and the arguments to check + start with the third argument, so the correct parameters for the + format attribute are 2 and 3. + + The `format' attribute allows you to identify your own functions + which take format strings as arguments, so that GNU CC can check + the calls to these functions for errors. The compiler always + checks formats for the ANSI library functions `printf', `fprintf', + `sprintf', `scanf', `fscanf', `sscanf', `strftime', `vprintf', + `vfprintf' and `vsprintf' whenever such warnings are requested + (using `-Wformat'), so there is no need to modify the header file + `stdio.h'. + +`format_arg (STRING-INDEX)' + The `format_arg' attribute specifies that a function takes + `printf' or `scanf' style arguments, modifies it (for example, to + translate it into another language), and passes it to a `printf' + or `scanf' style function. For example, the declaration: + + extern char * + my_dgettext (char *my_domain, const char *my_format) + __attribute__ ((format_arg (2))); + + causes the compiler to check the arguments in calls to + `my_dgettext' whose result is passed to a `printf', `scanf', or + `strftime' type function for consistency with the `printf' style + format string argument `my_format'. + + The parameter STRING-INDEX specifies which argument is the format + string argument (starting from 1). + + The `format-arg' attribute allows you to identify your own + functions which modify format strings, so that GNU CC can check the + calls to `printf', `scanf', or `strftime' function whose operands + are a call to one of your own function. The compiler always + treats `gettext', `dgettext', and `dcgettext' in this manner. + +`no_instrument_function' + If `-finstrument-functions' is given, profiling function calls will + be generated at entry and exit of most user-compiled functions. + Functions with this attribute will not be so instrumented. + +`section ("section-name")' + Normally, the compiler places the code it generates in the `text' + section. Sometimes, however, you need additional sections, or you + need certain particular functions to appear in special sections. + The `section' attribute specifies that a function lives in a + particular section. For example, the declaration: + + extern void foobar (void) __attribute__ ((section ("bar"))); + + puts the function `foobar' in the `bar' section. + + Some file formats do not support arbitrary sections so the + `section' attribute is not available on all platforms. If you + need to map the entire contents of a module to a particular + section, consider using the facilities of the linker instead. + +`constructor' +`destructor' + The `constructor' attribute causes the function to be called + automatically before execution enters `main ()'. Similarly, the + `destructor' attribute causes the function to be called + automatically after `main ()' has completed or `exit ()' has been + called. Functions with these attributes are useful for + initializing data that will be used implicitly during the + execution of the program. + + These attributes are not currently implemented for Objective C. + +`unused' + This attribute, attached to a function, means that the function is + meant to be possibly unused. GNU CC will not produce a warning + for this function. GNU C++ does not currently support this + attribute as definitions without parameters are valid in C++. + +`weak' + The `weak' attribute causes the declaration to be emitted as a weak + symbol rather than a global. This is primarily useful in defining + library functions which can be overridden in user code, though it + can also be used with non-function declarations. Weak symbols are + supported for ELF targets, and also for a.out targets when using + the GNU assembler and linker. + +`alias ("target")' + The `alias' attribute causes the declaration to be emitted as an + alias for another symbol, which must be specified. For instance, + + void __f () { /* do something */; } + void f () __attribute__ ((weak, alias ("__f"))); + + declares `f' to be a weak alias for `__f'. In C++, the mangled + name for the target must be used. + + Not all target machines support this attribute. + +`no_check_memory_usage' + If `-fcheck-memory-usage' is given, calls to support routines will + be generated before most memory accesses, to permit support code to + record usage and detect uses of uninitialized or unallocated + storage. Since the compiler cannot handle them properly, `asm' + statements are not allowed. Declaring a function with this + attribute disables the memory checking code for that function, + permitting the use of `asm' statements without requiring separate + compilation with different options, and allowing you to write + support routines of your own if you wish, without getting infinite + recursion if they get compiled with this option. + +`regparm (NUMBER)' + On the Intel 386, the `regparm' attribute causes the compiler to + pass up to NUMBER integer arguments in registers EAX, EDX, and ECX + instead of on the stack. Functions that take a variable number of + arguments will continue to be passed all of their arguments on the + stack. + +`stdcall' + On the Intel 386, the `stdcall' attribute causes the compiler to + assume that the called function will pop off the stack space used + to pass arguments, unless it takes a variable number of arguments. + + The PowerPC compiler for Windows NT currently ignores the `stdcall' + attribute. + +`cdecl' + On the Intel 386, the `cdecl' attribute causes the compiler to + assume that the calling function will pop off the stack space used + to pass arguments. This is useful to override the effects of the + `-mrtd' switch. + + The PowerPC compiler for Windows NT currently ignores the `cdecl' + attribute. + +`longcall' + On the RS/6000 and PowerPC, the `longcall' attribute causes the + compiler to always call the function via a pointer, so that + functions which reside further than 64 megabytes (67,108,864 + bytes) from the current location can be called. + +`dllimport' + On the PowerPC running Windows NT, the `dllimport' attribute causes + the compiler to call the function via a global pointer to the + function pointer that is set up by the Windows NT dll library. + The pointer name is formed by combining `__imp_' and the function + name. + +`dllexport' + On the PowerPC running Windows NT, the `dllexport' attribute causes + the compiler to provide a global pointer to the function pointer, + so that it can be called with the `dllimport' attribute. The + pointer name is formed by combining `__imp_' and the function name. + +`exception (EXCEPT-FUNC [, EXCEPT-ARG])' + On the PowerPC running Windows NT, the `exception' attribute causes + the compiler to modify the structured exception table entry it + emits for the declared function. The string or identifier + EXCEPT-FUNC is placed in the third entry of the structured + exception table. It represents a function, which is called by the + exception handling mechanism if an exception occurs. If it was + specified, the string or identifier EXCEPT-ARG is placed in the + fourth entry of the structured exception table. + +`function_vector' + Use this option on the H8/300 and H8/300H to indicate that the + specified function should be called through the function vector. + Calling a function through the function vector will reduce code + size, however; the function vector has a limited size (maximum 128 + entries on the H8/300 and 64 entries on the H8/300H) and shares + space with the interrupt vector. + + You must use GAS and GLD from GNU binutils version 2.7 or later for + this option to work correctly. + +`interrupt_handler' + Use this option on the H8/300 and H8/300H to indicate that the + specified function is an interrupt handler. The compiler will + generate function entry and exit sequences suitable for use in an + interrupt handler when this attribute is present. + +`eightbit_data' + Use this option on the H8/300 and H8/300H to indicate that the + specified variable should be placed into the eight bit data + section. The compiler will generate more efficient code for + certain operations on data in the eight bit data area. Note the + eight bit data area is limited to 256 bytes of data. + + You must use GAS and GLD from GNU binutils version 2.7 or later for + this option to work correctly. + +`tiny_data' + Use this option on the H8/300H to indicate that the specified + variable should be placed into the tiny data section. The + compiler will generate more efficient code for loads and stores on + data in the tiny data section. Note the tiny data area is limited + to slightly under 32kbytes of data. + +`interrupt' + Use this option on the M32R/D to indicate that the specified + function is an interrupt handler. The compiler will generate + function entry and exit sequences suitable for use in an interrupt + handler when this attribute is present. + +`model (MODEL-NAME)' + Use this attribute on the M32R/D to set the addressability of an + object, and the code generated for a function. The identifier + MODEL-NAME is one of `small', `medium', or `large', representing + each of the code models. + + Small model objects live in the lower 16MB of memory (so that their + addresses can be loaded with the `ld24' instruction), and are + callable with the `bl' instruction. + + Medium model objects may live anywhere in the 32 bit address space + (the compiler will generate `seth/add3' instructions to load their + addresses), and are callable with the `bl' instruction. + + Large model objects may live anywhere in the 32 bit address space + (the compiler will generate `seth/add3' instructions to load their + addresses), and may not be reachable with the `bl' instruction + (the compiler will generate the much slower `seth/add3/jl' + instruction sequence). + + You can specify multiple attributes in a declaration by separating +them by commas within the double parentheses or by immediately +following an attribute declaration with another attribute declaration. + + Some people object to the `__attribute__' feature, suggesting that +ANSI C's `#pragma' should be used instead. There are two reasons for +not doing this. + + 1. It is impossible to generate `#pragma' commands from a macro. + + 2. There is no telling what the same `#pragma' might mean in another + compiler. + + These two reasons apply to almost any application that might be +proposed for `#pragma'. It is basically a mistake to use `#pragma' for +*anything*. + + +File: gcc.info, Node: Function Prototypes, Next: C++ Comments, Prev: Function Attributes, Up: C Extensions + +Prototypes and Old-Style Function Definitions +============================================= + + GNU C extends ANSI C to allow a function prototype to override a +later old-style non-prototype definition. Consider the following +example: + + /* Use prototypes unless the compiler is old-fashioned. */ + #ifdef __STDC__ + #define P(x) x + #else + #define P(x) () + #endif + + /* Prototype function declaration. */ + int isroot P((uid_t)); + + /* Old-style function definition. */ + int + isroot (x) /* ??? lossage here ??? */ + uid_t x; + { + return x == 0; + } + + Suppose the type `uid_t' happens to be `short'. ANSI C does not +allow this example, because subword arguments in old-style +non-prototype definitions are promoted. Therefore in this example the +function definition's argument is really an `int', which does not match +the prototype argument type of `short'. + + This restriction of ANSI C makes it hard to write code that is +portable to traditional C compilers, because the programmer does not +know whether the `uid_t' type is `short', `int', or `long'. Therefore, +in cases like these GNU C allows a prototype to override a later +old-style definition. More precisely, in GNU C, a function prototype +argument type overrides the argument type specified by a later +old-style definition if the former type is the same as the latter type +before promotion. Thus in GNU C the above example is equivalent to the +following: + + int isroot (uid_t); + + int + isroot (uid_t x) + { + return x == 0; + } + + GNU C++ does not support old-style function definitions, so this +extension is irrelevant. + + +File: gcc.info, Node: C++ Comments, Next: Dollar Signs, Prev: Function Prototypes, Up: C Extensions + +C++ Style Comments +================== + + In GNU C, you may use C++ style comments, which start with `//' and +continue until the end of the line. Many other C implementations allow +such comments, and they are likely to be in a future C standard. +However, C++ style comments are not recognized if you specify `-ansi' +or `-traditional', since they are incompatible with traditional +constructs like `dividend//*comment*/divisor'. + + +File: gcc.info, Node: Dollar Signs, Next: Character Escapes, Prev: C++ Comments, Up: C Extensions + +Dollar Signs in Identifier Names +================================ + + In GNU C, you may normally use dollar signs in identifier names. +This is because many traditional C implementations allow such +identifiers. However, dollar signs in identifiers are not supported on +a few target machines, typically because the target assembler does not +allow them. + + +File: gcc.info, Node: Character Escapes, Next: Variable Attributes, Prev: Dollar Signs, Up: C Extensions + +The Character in Constants +================================ + + You can use the sequence `\e' in a string or character constant to +stand for the ASCII character . + + +File: gcc.info, Node: Alignment, Next: Inline, Prev: Type Attributes, Up: C Extensions + +Inquiring on Alignment of Types or Variables +============================================ + + The keyword `__alignof__' allows you to inquire about how an object +is aligned, or the minimum alignment usually required by a type. Its +syntax is just like `sizeof'. + + For example, if the target machine requires a `double' value to be +aligned on an 8-byte boundary, then `__alignof__ (double)' is 8. This +is true on many RISC machines. On more traditional machine designs, +`__alignof__ (double)' is 4 or even 2. + + Some machines never actually require alignment; they allow reference +to any data type even at an odd addresses. For these machines, +`__alignof__' reports the *recommended* alignment of a type. + + When the operand of `__alignof__' is an lvalue rather than a type, +the value is the largest alignment that the lvalue is known to have. +It may have this alignment as a result of its data type, or because it +is part of a structure and inherits alignment from that structure. For +example, after this declaration: + + struct foo { int x; char y; } foo1; + +the value of `__alignof__ (foo1.y)' is probably 2 or 4, the same as +`__alignof__ (int)', even though the data type of `foo1.y' does not +itself demand any alignment. + + A related feature which lets you specify the alignment of an object +is `__attribute__ ((aligned (ALIGNMENT)))'; see the following section. + + +File: gcc.info, Node: Variable Attributes, Next: Type Attributes, Prev: Character Escapes, Up: C Extensions + +Specifying Attributes of Variables +================================== + + The keyword `__attribute__' allows you to specify special attributes +of variables or structure fields. This keyword is followed by an +attribute specification inside double parentheses. Eight attributes +are currently defined for variables: `aligned', `mode', `nocommon', +`packed', `section', `transparent_union', `unused', and `weak'. Other +attributes are available for functions (*note Function Attributes::.) +and for types (*note Type Attributes::.). + + You may also specify attributes with `__' preceding and following +each keyword. This allows you to use them in header files without +being concerned about a possible macro of the same name. For example, +you may use `__aligned__' instead of `aligned'. + +`aligned (ALIGNMENT)' + This attribute specifies a minimum alignment for the variable or + structure field, measured in bytes. For example, the declaration: + + int x __attribute__ ((aligned (16))) = 0; + + causes the compiler to allocate the global variable `x' on a + 16-byte boundary. On a 68040, this could be used in conjunction + with an `asm' expression to access the `move16' instruction which + requires 16-byte aligned operands. + + You can also specify the alignment of structure fields. For + example, to create a double-word aligned `int' pair, you could + write: + + struct foo { int x[2] __attribute__ ((aligned (8))); }; + + This is an alternative to creating a union with a `double' member + that forces the union to be double-word aligned. + + It is not possible to specify the alignment of functions; the + alignment of functions is determined by the machine's requirements + and cannot be changed. You cannot specify alignment for a typedef + name because such a name is just an alias, not a distinct type. + + As in the preceding examples, you can explicitly specify the + alignment (in bytes) that you wish the compiler to use for a given + variable or structure field. Alternatively, you can leave out the + alignment factor and just ask the compiler to align a variable or + field to the maximum useful alignment for the target machine you + are compiling for. For example, you could write: + + short array[3] __attribute__ ((aligned)); + + Whenever you leave out the alignment factor in an `aligned' + attribute specification, the compiler automatically sets the + alignment for the declared variable or field to the largest + alignment which is ever used for any data type on the target + machine you are compiling for. Doing this can often make copy + operations more efficient, because the compiler can use whatever + instructions copy the biggest chunks of memory when performing + copies to or from the variables or fields that you have aligned + this way. + + The `aligned' attribute can only increase the alignment; but you + can decrease it by specifying `packed' as well. See below. + + Note that the effectiveness of `aligned' attributes may be limited + by inherent limitations in your linker. On many systems, the + linker is only able to arrange for variables to be aligned up to a + certain maximum alignment. (For some linkers, the maximum + supported alignment may be very very small.) If your linker is + only able to align variables up to a maximum of 8 byte alignment, + then specifying `aligned(16)' in an `__attribute__' will still + only provide you with 8 byte alignment. See your linker + documentation for further information. + +`mode (MODE)' + This attribute specifies the data type for the + declaration--whichever type corresponds to the mode MODE. This in + effect lets you request an integer or floating point type + according to its width. + + You may also specify a mode of `byte' or `__byte__' to indicate + the mode corresponding to a one-byte integer, `word' or `__word__' + for the mode of a one-word integer, and `pointer' or `__pointer__' + for the mode used to represent pointers. + +`nocommon' + This attribute specifies requests GNU CC not to place a variable + "common" but instead to allocate space for it directly. If you + specify the `-fno-common' flag, GNU CC will do this for all + variables. + + Specifying the `nocommon' attribute for a variable provides an + initialization of zeros. A variable may only be initialized in one + source file. + +`packed' + The `packed' attribute specifies that a variable or structure field + should have the smallest possible alignment--one byte for a + variable, and one bit for a field, unless you specify a larger + value with the `aligned' attribute. + + Here is a structure in which the field `x' is packed, so that it + immediately follows `a': + + struct foo + { + char a; + int x[2] __attribute__ ((packed)); + }; + +`section ("section-name")' + Normally, the compiler places the objects it generates in sections + like `data' and `bss'. Sometimes, however, you need additional + sections, or you need certain particular variables to appear in + special sections, for example to map to special hardware. The + `section' attribute specifies that a variable (or function) lives + in a particular section. For example, this small program uses + several specific section names: + + struct duart a __attribute__ ((section ("DUART_A"))) = { 0 }; + struct duart b __attribute__ ((section ("DUART_B"))) = { 0 }; + char stack[10000] __attribute__ ((section ("STACK"))) = { 0 }; + int init_data __attribute__ ((section ("INITDATA"))) = 0; + + main() + { + /* Initialize stack pointer */ + init_sp (stack + sizeof (stack)); + + /* Initialize initialized data */ + memcpy (&init_data, &data, &edata - &data); + + /* Turn on the serial ports */ + init_duart (&a); + init_duart (&b); + } + + Use the `section' attribute with an *initialized* definition of a + *global* variable, as shown in the example. GNU CC issues a + warning and otherwise ignores the `section' attribute in + uninitialized variable declarations. + + You may only use the `section' attribute with a fully initialized + global definition because of the way linkers work. The linker + requires each object be defined once, with the exception that + uninitialized variables tentatively go in the `common' (or `bss') + section and can be multiply "defined". You can force a variable + to be initialized with the `-fno-common' flag or the `nocommon' + attribute. + + Some file formats do not support arbitrary sections so the + `section' attribute is not available on all platforms. If you + need to map the entire contents of a module to a particular + section, consider using the facilities of the linker instead. + +`transparent_union' + This attribute, attached to a function parameter which is a union, + means that the corresponding argument may have the type of any + union member, but the argument is passed as if its type were that + of the first union member. For more details see *Note Type + Attributes::. You can also use this attribute on a `typedef' for + a union data type; then it applies to all function parameters with + that type. + +`unused' + This attribute, attached to a variable, means that the variable is + meant to be possibly unused. GNU CC will not produce a warning + for this variable. + +`weak' + The `weak' attribute is described in *Note Function Attributes::. + +`model (MODEL-NAME)' + Use this attribute on the M32R/D to set the addressability of an + object. The identifier MODEL-NAME is one of `small', `medium', or + `large', representing each of the code models. + + Small model objects live in the lower 16MB of memory (so that their + addresses can be loaded with the `ld24' instruction). + + Medium and large model objects may live anywhere in the 32 bit + address space (the compiler will generate `seth/add3' instructions + to load their addresses). + + To specify multiple attributes, separate them by commas within the +double parentheses: for example, `__attribute__ ((aligned (16), +packed))'. + diff --git a/usr/local/nachos/info/gcc.info-11 b/usr/local/nachos/info/gcc.info-11 new file mode 100644 index 0000000..b31425e --- /dev/null +++ b/usr/local/nachos/info/gcc.info-11 @@ -0,0 +1,1065 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Type Attributes, Next: Alignment, Prev: Variable Attributes, Up: C Extensions + +Specifying Attributes of Types +============================== + + The keyword `__attribute__' allows you to specify special attributes +of `struct' and `union' types when you define such types. This keyword +is followed by an attribute specification inside double parentheses. +Three attributes are currently defined for types: `aligned', `packed', +and `transparent_union'. Other attributes are defined for functions +(*note Function Attributes::.) and for variables (*note Variable +Attributes::.). + + You may also specify any one of these attributes with `__' preceding +and following its keyword. This allows you to use these attributes in +header files without being concerned about a possible macro of the same +name. For example, you may use `__aligned__' instead of `aligned'. + + You may specify the `aligned' and `transparent_union' attributes +either in a `typedef' declaration or just past the closing curly brace +of a complete enum, struct or union type *definition* and the `packed' +attribute only past the closing brace of a definition. + + You may also specify attributes between the enum, struct or union +tag and the name of the type rather than after the closing brace. + +`aligned (ALIGNMENT)' + This attribute specifies a minimum alignment (in bytes) for + variables of the specified type. For example, the declarations: + + struct S { short f[3]; } __attribute__ ((aligned (8))); + typedef int more_aligned_int __attribute__ ((aligned (8))); + + force the compiler to insure (as far as it can) that each variable + whose type is `struct S' or `more_aligned_int' will be allocated + and aligned *at least* on a 8-byte boundary. On a Sparc, having + all variables of type `struct S' aligned to 8-byte boundaries + allows the compiler to use the `ldd' and `std' (doubleword load and + store) instructions when copying one variable of type `struct S' to + another, thus improving run-time efficiency. + + Note that the alignment of any given `struct' or `union' type is + required by the ANSI C standard to be at least a perfect multiple + of the lowest common multiple of the alignments of all of the + members of the `struct' or `union' in question. This means that + you *can* effectively adjust the alignment of a `struct' or `union' + type by attaching an `aligned' attribute to any one of the members + of such a type, but the notation illustrated in the example above + is a more obvious, intuitive, and readable way to request the + compiler to adjust the alignment of an entire `struct' or `union' + type. + + As in the preceding example, you can explicitly specify the + alignment (in bytes) that you wish the compiler to use for a given + `struct' or `union' type. Alternatively, you can leave out the + alignment factor and just ask the compiler to align a type to the + maximum useful alignment for the target machine you are compiling + for. For example, you could write: + + struct S { short f[3]; } __attribute__ ((aligned)); + + Whenever you leave out the alignment factor in an `aligned' + attribute specification, the compiler automatically sets the + alignment for the type to the largest alignment which is ever used + for any data type on the target machine you are compiling for. + Doing this can often make copy operations more efficient, because + the compiler can use whatever instructions copy the biggest chunks + of memory when performing copies to or from the variables which + have types that you have aligned this way. + + In the example above, if the size of each `short' is 2 bytes, then + the size of the entire `struct S' type is 6 bytes. The smallest + power of two which is greater than or equal to that is 8, so the + compiler sets the alignment for the entire `struct S' type to 8 + bytes. + + Note that although you can ask the compiler to select a + time-efficient alignment for a given type and then declare only + individual stand-alone objects of that type, the compiler's + ability to select a time-efficient alignment is primarily useful + only when you plan to create arrays of variables having the + relevant (efficiently aligned) type. If you declare or use arrays + of variables of an efficiently-aligned type, then it is likely + that your program will also be doing pointer arithmetic (or + subscripting, which amounts to the same thing) on pointers to the + relevant type, and the code that the compiler generates for these + pointer arithmetic operations will often be more efficient for + efficiently-aligned types than for other types. + + The `aligned' attribute can only increase the alignment; but you + can decrease it by specifying `packed' as well. See below. + + Note that the effectiveness of `aligned' attributes may be limited + by inherent limitations in your linker. On many systems, the + linker is only able to arrange for variables to be aligned up to a + certain maximum alignment. (For some linkers, the maximum + supported alignment may be very very small.) If your linker is + only able to align variables up to a maximum of 8 byte alignment, + then specifying `aligned(16)' in an `__attribute__' will still + only provide you with 8 byte alignment. See your linker + documentation for further information. + +`packed' + This attribute, attached to an `enum', `struct', or `union' type + definition, specified that the minimum required memory be used to + represent the type. + + Specifying this attribute for `struct' and `union' types is + equivalent to specifying the `packed' attribute on each of the + structure or union members. Specifying the `-fshort-enums' flag + on the line is equivalent to specifying the `packed' attribute on + all `enum' definitions. + + You may only specify this attribute after a closing curly brace on + an `enum' definition, not in a `typedef' declaration, unless that + declaration also contains the definition of the `enum'. + +`transparent_union' + This attribute, attached to a `union' type definition, indicates + that any function parameter having that union type causes calls to + that function to be treated in a special way. + + First, the argument corresponding to a transparent union type can + be of any type in the union; no cast is required. Also, if the + union contains a pointer type, the corresponding argument can be a + null pointer constant or a void pointer expression; and if the + union contains a void pointer type, the corresponding argument can + be any pointer expression. If the union member type is a pointer, + qualifiers like `const' on the referenced type must be respected, + just as with normal pointer conversions. + + Second, the argument is passed to the function using the calling + conventions of first member of the transparent union, not the + calling conventions of the union itself. All members of the union + must have the same machine representation; this is necessary for + this argument passing to work properly. + + Transparent unions are designed for library functions that have + multiple interfaces for compatibility reasons. For example, + suppose the `wait' function must accept either a value of type + `int *' to comply with Posix, or a value of type `union wait *' to + comply with the 4.1BSD interface. If `wait''s parameter were + `void *', `wait' would accept both kinds of arguments, but it + would also accept any other pointer type and this would make + argument type checking less useful. Instead, `' might + define the interface as follows: + + typedef union + { + int *__ip; + union wait *__up; + } wait_status_ptr_t __attribute__ ((__transparent_union__)); + + pid_t wait (wait_status_ptr_t); + + This interface allows either `int *' or `union wait *' arguments + to be passed, using the `int *' calling convention. The program + can call `wait' with arguments of either type: + + int w1 () { int w; return wait (&w); } + int w2 () { union wait w; return wait (&w); } + + With this interface, `wait''s implementation might look like this: + + pid_t wait (wait_status_ptr_t p) + { + return waitpid (-1, p.__ip, 0); + } + +`unused' + When attached to a type (including a `union' or a `struct'), this + attribute means that variables of that type are meant to appear + possibly unused. GNU CC will not produce a warning for any + variables of that type, even if the variable appears to do + nothing. This is often the case with lock or thread classes, + which are usually defined and then not referenced, but contain + constructors and destructors that have nontrivial bookkeeping + functions. + + To specify multiple attributes, separate them by commas within the +double parentheses: for example, `__attribute__ ((aligned (16), +packed))'. + + +File: gcc.info, Node: Inline, Next: Extended Asm, Prev: Alignment, Up: C Extensions + +An Inline Function is As Fast As a Macro +======================================== + + By declaring a function `inline', you can direct GNU CC to integrate +that function's code into the code for its callers. This makes +execution faster by eliminating the function-call overhead; in +addition, if any of the actual argument values are constant, their known +values may permit simplifications at compile time so that not all of the +inline function's code needs to be included. The effect on code size is +less predictable; object code may be larger or smaller with function +inlining, depending on the particular case. Inlining of functions is an +optimization and it really "works" only in optimizing compilation. If +you don't use `-O', no function is really inline. + + To declare a function inline, use the `inline' keyword in its +declaration, like this: + + inline int + inc (int *a) + { + (*a)++; + } + + (If you are writing a header file to be included in ANSI C programs, +write `__inline__' instead of `inline'. *Note Alternate Keywords::.) +You can also make all "simple enough" functions inline with the option +`-finline-functions'. + + Note that certain usages in a function definition can make it +unsuitable for inline substitution. Among these usages are: use of +varargs, use of alloca, use of variable sized data types (*note +Variable Length::.), use of computed goto (*note Labels as Values::.), +use of nonlocal goto, and nested functions (*note Nested Functions::.). +Using `-Winline' will warn when a function marked `inline' could not +be substituted, and will give the reason for the failure. + + Note that in C and Objective C, unlike C++, the `inline' keyword +does not affect the linkage of the function. + + GNU CC automatically inlines member functions defined within the +class body of C++ programs even if they are not explicitly declared +`inline'. (You can override this with `-fno-default-inline'; *note +Options Controlling C++ Dialect: C++ Dialect Options..) + + When a function is both inline and `static', if all calls to the +function are integrated into the caller, and the function's address is +never used, then the function's own assembler code is never referenced. +In this case, GNU CC does not actually output assembler code for the +function, unless you specify the option `-fkeep-inline-functions'. +Some calls cannot be integrated for various reasons (in particular, +calls that precede the function's definition cannot be integrated, and +neither can recursive calls within the definition). If there is a +nonintegrated call, then the function is compiled to assembler code as +usual. The function must also be compiled as usual if the program +refers to its address, because that can't be inlined. + + When an inline function is not `static', then the compiler must +assume that there may be calls from other source files; since a global +symbol can be defined only once in any program, the function must not +be defined in the other source files, so the calls therein cannot be +integrated. Therefore, a non-`static' inline function is always +compiled on its own in the usual fashion. + + If you specify both `inline' and `extern' in the function +definition, then the definition is used only for inlining. In no case +is the function compiled on its own, not even if you refer to its +address explicitly. Such an address becomes an external reference, as +if you had only declared the function, and had not defined it. + + This combination of `inline' and `extern' has almost the effect of a +macro. The way to use it is to put a function definition in a header +file with these keywords, and put another copy of the definition +(lacking `inline' and `extern') in a library file. The definition in +the header file will cause most calls to the function to be inlined. +If any uses of the function remain, they will refer to the single copy +in the library. + + GNU C does not inline any functions when not optimizing. It is not +clear whether it is better to inline or not, in this case, but we found +that a correct implementation when not optimizing was difficult. So we +did the easy thing, and turned it off. + + +File: gcc.info, Node: Extended Asm, Next: Asm Labels, Prev: Inline, Up: C Extensions + +Assembler Instructions with C Expression Operands +================================================= + + In an assembler instruction using `asm', you can specify the +operands of the instruction using C expressions. This means you need +not guess which registers or memory locations will contain the data you +want to use. + + You must specify an assembler instruction template much like what +appears in a machine description, plus an operand constraint string for +each operand. + + For example, here is how to use the 68881's `fsinx' instruction: + + asm ("fsinx %1,%0" : "=f" (result) : "f" (angle)); + +Here `angle' is the C expression for the input operand while `result' +is that of the output operand. Each has `"f"' as its operand +constraint, saying that a floating point register is required. The `=' +in `=f' indicates that the operand is an output; all output operands' +constraints must use `='. The constraints use the same language used +in the machine description (*note Constraints::.). + + Each operand is described by an operand-constraint string followed by +the C expression in parentheses. A colon separates the assembler +template from the first output operand and another separates the last +output operand from the first input, if any. Commas separate the +operands within each group. The total number of operands is limited to +ten or to the maximum number of operands in any instruction pattern in +the machine description, whichever is greater. + + If there are no output operands but there are input operands, you +must place two consecutive colons surrounding the place where the output +operands would go. + + Output operand expressions must be lvalues; the compiler can check +this. The input operands need not be lvalues. The compiler cannot +check whether the operands have data types that are reasonable for the +instruction being executed. It does not parse the assembler instruction +template and does not know what it means or even whether it is valid +assembler input. The extended `asm' feature is most often used for +machine instructions the compiler itself does not know exist. If the +output expression cannot be directly addressed (for example, it is a +bit field), your constraint must allow a register. In that case, GNU CC +will use the register as the output of the `asm', and then store that +register into the output. + + The ordinary output operands must be write-only; GNU CC will assume +that the values in these operands before the instruction are dead and +need not be generated. Extended asm supports input-output or read-write +operands. Use the constraint character `+' to indicate such an operand +and list it with the output operands. + + When the constraints for the read-write operand (or the operand in +which only some of the bits are to be changed) allows a register, you +may, as an alternative, logically split its function into two separate +operands, one input operand and one write-only output operand. The +connection between them is expressed by constraints which say they need +to be in the same location when the instruction executes. You can use +the same C expression for both operands, or different expressions. For +example, here we write the (fictitious) `combine' instruction with +`bar' as its read-only source operand and `foo' as its read-write +destination: + + asm ("combine %2,%0" : "=r" (foo) : "0" (foo), "g" (bar)); + +The constraint `"0"' for operand 1 says that it must occupy the same +location as operand 0. A digit in constraint is allowed only in an +input operand and it must refer to an output operand. + + Only a digit in the constraint can guarantee that one operand will +be in the same place as another. The mere fact that `foo' is the value +of both operands is not enough to guarantee that they will be in the +same place in the generated assembler code. The following would not +work reliably: + + asm ("combine %2,%0" : "=r" (foo) : "r" (foo), "g" (bar)); + + Various optimizations or reloading could cause operands 0 and 1 to +be in different registers; GNU CC knows no reason not to do so. For +example, the compiler might find a copy of the value of `foo' in one +register and use it for operand 1, but generate the output operand 0 in +a different register (copying it afterward to `foo''s own address). Of +course, since the register for operand 1 is not even mentioned in the +assembler code, the result will not work, but GNU CC can't tell that. + + Some instructions clobber specific hard registers. To describe this, +write a third colon after the input operands, followed by the names of +the clobbered hard registers (given as strings). Here is a realistic +example for the VAX: + + asm volatile ("movc3 %0,%1,%2" + : /* no outputs */ + : "g" (from), "g" (to), "g" (count) + : "r0", "r1", "r2", "r3", "r4", "r5"); + + It is an error for a clobber description to overlap an input or +output operand (for example, an operand describing a register class +with one member, mentioned in the clobber list). Most notably, it is +invalid to describe that an input operand is modified, but unused as +output. It has to be specified as an input and output operand anyway. +Note that if there are only unused output operands, you will then also +need to specify `volatile' for the `asm' construct, as described below. + + If you refer to a particular hardware register from the assembler +code, you will probably have to list the register after the third colon +to tell the compiler the register's value is modified. In some +assemblers, the register names begin with `%'; to produce one `%' in the +assembler code, you must write `%%' in the input. + + If your assembler instruction can alter the condition code register, +add `cc' to the list of clobbered registers. GNU CC on some machines +represents the condition codes as a specific hardware register; `cc' +serves to name this register. On other machines, the condition code is +handled differently, and specifying `cc' has no effect. But it is +valid no matter what the machine. + + If your assembler instruction modifies memory in an unpredictable +fashion, add `memory' to the list of clobbered registers. This will +cause GNU CC to not keep memory values cached in registers across the +assembler instruction. + + You can put multiple assembler instructions together in a single +`asm' template, separated either with newlines (written as `\n') or +with semicolons if the assembler allows such semicolons. The GNU +assembler allows semicolons and most Unix assemblers seem to do so. +The input operands are guaranteed not to use any of the clobbered +registers, and neither will the output operands' addresses, so you can +read and write the clobbered registers as many times as you like. Here +is an example of multiple instructions in a template; it assumes the +subroutine `_foo' accepts arguments in registers 9 and 10: + + asm ("movl %0,r9;movl %1,r10;call _foo" + : /* no outputs */ + : "g" (from), "g" (to) + : "r9", "r10"); + + Unless an output operand has the `&' constraint modifier, GNU CC may +allocate it in the same register as an unrelated input operand, on the +assumption the inputs are consumed before the outputs are produced. +This assumption may be false if the assembler code actually consists of +more than one instruction. In such a case, use `&' for each output +operand that may not overlap an input. *Note Modifiers::. + + If you want to test the condition code produced by an assembler +instruction, you must include a branch and a label in the `asm' +construct, as follows: + + asm ("clr %0;frob %1;beq 0f;mov #1,%0;0:" + : "g" (result) + : "g" (input)); + +This assumes your assembler supports local labels, as the GNU assembler +and most Unix assemblers do. + + Speaking of labels, jumps from one `asm' to another are not +supported. The compiler's optimizers do not know about these jumps, and +therefore they cannot take account of them when deciding how to +optimize. + + Usually the most convenient way to use these `asm' instructions is to +encapsulate them in macros that look like functions. For example, + + #define sin(x) \ + ({ double __value, __arg = (x); \ + asm ("fsinx %1,%0": "=f" (__value): "f" (__arg)); \ + __value; }) + +Here the variable `__arg' is used to make sure that the instruction +operates on a proper `double' value, and to accept only those arguments +`x' which can convert automatically to a `double'. + + Another way to make sure the instruction operates on the correct data +type is to use a cast in the `asm'. This is different from using a +variable `__arg' in that it converts more different types. For +example, if the desired type were `int', casting the argument to `int' +would accept a pointer with no complaint, while assigning the argument +to an `int' variable named `__arg' would warn about using a pointer +unless the caller explicitly casts it. + + If an `asm' has output operands, GNU CC assumes for optimization +purposes the instruction has no side effects except to change the output +operands. This does not mean instructions with a side effect cannot be +used, but you must be careful, because the compiler may eliminate them +if the output operands aren't used, or move them out of loops, or +replace two with one if they constitute a common subexpression. Also, +if your instruction does have a side effect on a variable that otherwise +appears not to change, the old value of the variable may be reused later +if it happens to be found in a register. + + You can prevent an `asm' instruction from being deleted, moved +significantly, or combined, by writing the keyword `volatile' after the +`asm'. For example: + + #define get_and_set_priority(new) \ + ({ int __old; \ + asm volatile ("get_and_set_priority %0, %1": "=g" (__old) : "g" (new)); \ + __old; }) + +If you write an `asm' instruction with no outputs, GNU CC will know the +instruction has side-effects and will not delete the instruction or +move it outside of loops. If the side-effects of your instruction are +not purely external, but will affect variables in your program in ways +other than reading the inputs and clobbering the specified registers or +memory, you should write the `volatile' keyword to prevent future +versions of GNU CC from moving the instruction around within a core +region. + + An `asm' instruction without any operands or clobbers (and "old +style" `asm') will not be deleted or moved significantly, regardless, +unless it is unreachable, the same wasy as if you had written a +`volatile' keyword. + + Note that even a volatile `asm' instruction can be moved in ways +that appear insignificant to the compiler, such as across jump +instructions. You can't expect a sequence of volatile `asm' +instructions to remain perfectly consecutive. If you want consecutive +output, use a single `asm'. + + It is a natural idea to look for a way to give access to the +condition code left by the assembler instruction. However, when we +attempted to implement this, we found no way to make it work reliably. +The problem is that output operands might need reloading, which would +result in additional following "store" instructions. On most machines, +these instructions would alter the condition code before there was time +to test it. This problem doesn't arise for ordinary "test" and +"compare" instructions because they don't have any output operands. + + If you are writing a header file that should be includable in ANSI C +programs, write `__asm__' instead of `asm'. *Note Alternate Keywords::. + +i386 floating point asm operands +-------------------------------- + + There are several rules on the usage of stack-like regs in +asm_operands insns. These rules apply only to the operands that are +stack-like regs: + + 1. Given a set of input regs that die in an asm_operands, it is + necessary to know which are implicitly popped by the asm, and + which must be explicitly popped by gcc. + + An input reg that is implicitly popped by the asm must be + explicitly clobbered, unless it is constrained to match an output + operand. + + 2. For any input reg that is implicitly popped by an asm, it is + necessary to know how to adjust the stack to compensate for the + pop. If any non-popped input is closer to the top of the + reg-stack than the implicitly popped reg, it would not be possible + to know what the stack looked like -- it's not clear how the rest + of the stack "slides up". + + All implicitly popped input regs must be closer to the top of the + reg-stack than any input that is not implicitly popped. + + It is possible that if an input dies in an insn, reload might use + the input reg for an output reload. Consider this example: + + asm ("foo" : "=t" (a) : "f" (b)); + + This asm says that input B is not popped by the asm, and that the + asm pushes a result onto the reg-stack, ie, the stack is one + deeper after the asm than it was before. But, it is possible that + reload will think that it can use the same reg for both the input + and the output, if input B dies in this insn. + + If any input operand uses the `f' constraint, all output reg + constraints must use the `&' earlyclobber. + + The asm above would be written as + + asm ("foo" : "=&t" (a) : "f" (b)); + + 3. Some operands need to be in particular places on the stack. All + output operands fall in this category -- there is no other way to + know which regs the outputs appear in unless the user indicates + this in the constraints. + + Output operands must specifically indicate which reg an output + appears in after an asm. `=f' is not allowed: the operand + constraints must select a class with a single reg. + + 4. Output operands may not be "inserted" between existing stack regs. + Since no 387 opcode uses a read/write operand, all output operands + are dead before the asm_operands, and are pushed by the + asm_operands. It makes no sense to push anywhere but the top of + the reg-stack. + + Output operands must start at the top of the reg-stack: output + operands may not "skip" a reg. + + 5. Some asm statements may need extra stack space for internal + calculations. This can be guaranteed by clobbering stack registers + unrelated to the inputs and outputs. + + + Here are a couple of reasonable asms to want to write. This asm +takes one input, which is internally popped, and produces two outputs. + + asm ("fsincos" : "=t" (cos), "=u" (sin) : "0" (inp)); + + This asm takes two inputs, which are popped by the `fyl2xp1' opcode, +and replaces them with one output. The user must code the `st(1)' +clobber for reg-stack.c to know that `fyl2xp1' pops both inputs. + + asm ("fyl2xp1" : "=t" (result) : "0" (x), "u" (y) : "st(1)"); + + +File: gcc.info, Node: Asm Labels, Next: Explicit Reg Vars, Prev: Extended Asm, Up: C Extensions + +Controlling Names Used in Assembler Code +======================================== + + You can specify the name to be used in the assembler code for a C +function or variable by writing the `asm' (or `__asm__') keyword after +the declarator as follows: + + int foo asm ("myfoo") = 2; + +This specifies that the name to be used for the variable `foo' in the +assembler code should be `myfoo' rather than the usual `_foo'. + + On systems where an underscore is normally prepended to the name of +a C function or variable, this feature allows you to define names for +the linker that do not start with an underscore. + + You cannot use `asm' in this way in a function *definition*; but you +can get the same effect by writing a declaration for the function +before its definition and putting `asm' there, like this: + + extern func () asm ("FUNC"); + + func (x, y) + int x, y; + ... + + It is up to you to make sure that the assembler names you choose do +not conflict with any other assembler symbols. Also, you must not use a +register name; that would produce completely invalid assembler code. +GNU CC does not as yet have the ability to store static variables in +registers. Perhaps that will be added. + + +File: gcc.info, Node: Explicit Reg Vars, Next: Alternate Keywords, Prev: Asm Labels, Up: C Extensions + +Variables in Specified Registers +================================ + + GNU C allows you to put a few global variables into specified +hardware registers. You can also specify the register in which an +ordinary register variable should be allocated. + + * Global register variables reserve registers throughout the program. + This may be useful in programs such as programming language + interpreters which have a couple of global variables that are + accessed very often. + + * Local register variables in specific registers do not reserve the + registers. The compiler's data flow analysis is capable of + determining where the specified registers contain live values, and + where they are available for other uses. Stores into local + register variables may be deleted when they appear to be dead + according to dataflow analysis. References to local register + variables may be deleted or moved or simplified. + + These local variables are sometimes convenient for use with the + extended `asm' feature (*note Extended Asm::.), if you want to + write one output of the assembler instruction directly into a + particular register. (This will work provided the register you + specify fits the constraints specified for that operand in the + `asm'.) + +* Menu: + +* Global Reg Vars:: +* Local Reg Vars:: + + +File: gcc.info, Node: Global Reg Vars, Next: Local Reg Vars, Up: Explicit Reg Vars + +Defining Global Register Variables +---------------------------------- + + You can define a global register variable in GNU C like this: + + register int *foo asm ("a5"); + +Here `a5' is the name of the register which should be used. Choose a +register which is normally saved and restored by function calls on your +machine, so that library routines will not clobber it. + + Naturally the register name is cpu-dependent, so you would need to +conditionalize your program according to cpu type. The register `a5' +would be a good choice on a 68000 for a variable of pointer type. On +machines with register windows, be sure to choose a "global" register +that is not affected magically by the function call mechanism. + + In addition, operating systems on one type of cpu may differ in how +they name the registers; then you would need additional conditionals. +For example, some 68000 operating systems call this register `%a5'. + + Eventually there may be a way of asking the compiler to choose a +register automatically, but first we need to figure out how it should +choose and how to enable you to guide the choice. No solution is +evident. + + Defining a global register variable in a certain register reserves +that register entirely for this use, at least within the current +compilation. The register will not be allocated for any other purpose +in the functions in the current compilation. The register will not be +saved and restored by these functions. Stores into this register are +never deleted even if they would appear to be dead, but references may +be deleted or moved or simplified. + + It is not safe to access the global register variables from signal +handlers, or from more than one thread of control, because the system +library routines may temporarily use the register for other things +(unless you recompile them specially for the task at hand). + + It is not safe for one function that uses a global register variable +to call another such function `foo' by way of a third function `lose' +that was compiled without knowledge of this variable (i.e. in a +different source file in which the variable wasn't declared). This is +because `lose' might save the register and put some other value there. +For example, you can't expect a global register variable to be +available in the comparison-function that you pass to `qsort', since +`qsort' might have put something else in that register. (If you are +prepared to recompile `qsort' with the same global register variable, +you can solve this problem.) + + If you want to recompile `qsort' or other source files which do not +actually use your global register variable, so that they will not use +that register for any other purpose, then it suffices to specify the +compiler option `-ffixed-REG'. You need not actually add a global +register declaration to their source code. + + A function which can alter the value of a global register variable +cannot safely be called from a function compiled without this variable, +because it could clobber the value the caller expects to find there on +return. Therefore, the function which is the entry point into the part +of the program that uses the global register variable must explicitly +save and restore the value which belongs to its caller. + + On most machines, `longjmp' will restore to each global register +variable the value it had at the time of the `setjmp'. On some +machines, however, `longjmp' will not change the value of global +register variables. To be portable, the function that called `setjmp' +should make other arrangements to save the values of the global register +variables, and to restore them in a `longjmp'. This way, the same +thing will happen regardless of what `longjmp' does. + + All global register variable declarations must precede all function +definitions. If such a declaration could appear after function +definitions, the declaration would be too late to prevent the register +from being used for other purposes in the preceding functions. + + Global register variables may not have initial values, because an +executable file has no means to supply initial contents for a register. + + On the Sparc, there are reports that g3 ... g7 are suitable +registers, but certain library functions, such as `getwd', as well as +the subroutines for division and remainder, modify g3 and g4. g1 and +g2 are local temporaries. + + On the 68000, a2 ... a5 should be suitable, as should d2 ... d7. Of +course, it will not do to use more than a few of those. + + +File: gcc.info, Node: Local Reg Vars, Prev: Global Reg Vars, Up: Explicit Reg Vars + +Specifying Registers for Local Variables +---------------------------------------- + + You can define a local register variable with a specified register +like this: + + register int *foo asm ("a5"); + +Here `a5' is the name of the register which should be used. Note that +this is the same syntax used for defining global register variables, +but for a local variable it would appear within a function. + + Naturally the register name is cpu-dependent, but this is not a +problem, since specific registers are most often useful with explicit +assembler instructions (*note Extended Asm::.). Both of these things +generally require that you conditionalize your program according to cpu +type. + + In addition, operating systems on one type of cpu may differ in how +they name the registers; then you would need additional conditionals. +For example, some 68000 operating systems call this register `%a5'. + + Defining such a register variable does not reserve the register; it +remains available for other uses in places where flow control determines +the variable's value is not live. However, these registers are made +unavailable for use in the reload pass; excessive use of this feature +leaves the compiler too few available registers to compile certain +functions. + + This option does not guarantee that GNU CC will generate code that +has this variable in the register you specify at all times. You may not +code an explicit reference to this register in an `asm' statement and +assume it will always refer to this variable. + + Stores into local register variables may be deleted when they appear +to be dead according to dataflow analysis. References to local +register variables may be deleted or moved or simplified. + + +File: gcc.info, Node: Alternate Keywords, Next: Incomplete Enums, Prev: Explicit Reg Vars, Up: C Extensions + +Alternate Keywords +================== + + The option `-traditional' disables certain keywords; `-ansi' +disables certain others. This causes trouble when you want to use GNU C +extensions, or ANSI C features, in a general-purpose header file that +should be usable by all programs, including ANSI C programs and +traditional ones. The keywords `asm', `typeof' and `inline' cannot be +used since they won't work in a program compiled with `-ansi', while +the keywords `const', `volatile', `signed', `typeof' and `inline' won't +work in a program compiled with `-traditional'. + + The way to solve these problems is to put `__' at the beginning and +end of each problematical keyword. For example, use `__asm__' instead +of `asm', `__const__' instead of `const', and `__inline__' instead of +`inline'. + + Other C compilers won't accept these alternative keywords; if you +want to compile with another compiler, you can define the alternate +keywords as macros to replace them with the customary keywords. It +looks like this: + + #ifndef __GNUC__ + #define __asm__ asm + #endif + + `-pedantic' causes warnings for many GNU C extensions. You can +prevent such warnings within one expression by writing `__extension__' +before the expression. `__extension__' has no effect aside from this. + + +File: gcc.info, Node: Incomplete Enums, Next: Function Names, Prev: Alternate Keywords, Up: C Extensions + +Incomplete `enum' Types +======================= + + You can define an `enum' tag without specifying its possible values. +This results in an incomplete type, much like what you get if you write +`struct foo' without describing the elements. A later declaration +which does specify the possible values completes the type. + + You can't allocate variables or storage using the type while it is +incomplete. However, you can work with pointers to that type. + + This extension may not be very useful, but it makes the handling of +`enum' more consistent with the way `struct' and `union' are handled. + + This extension is not supported by GNU C++. + + +File: gcc.info, Node: Function Names, Next: Return Address, Prev: Incomplete Enums, Up: C Extensions + +Function Names as Strings +========================= + + GNU CC predefines two string variables to be the name of the current +function. The variable `__FUNCTION__' is the name of the function as +it appears in the source. The variable `__PRETTY_FUNCTION__' is the +name of the function pretty printed in a language specific fashion. + + These names are always the same in a C function, but in a C++ +function they may be different. For example, this program: + + extern "C" { + extern int printf (char *, ...); + } + + class a { + public: + sub (int i) + { + printf ("__FUNCTION__ = %s\n", __FUNCTION__); + printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__); + } + }; + + int + main (void) + { + a ax; + ax.sub (0); + return 0; + } + +gives this output: + + __FUNCTION__ = sub + __PRETTY_FUNCTION__ = int a::sub (int) + + These names are not macros: they are predefined string variables. +For example, `#ifdef __FUNCTION__' does not have any special meaning +inside a function, since the preprocessor does not do anything special +with the identifier `__FUNCTION__'. + + +File: gcc.info, Node: Return Address, Next: Other Builtins, Prev: Function Names, Up: C Extensions + +Getting the Return or Frame Address of a Function +================================================= + + These functions may be used to get information about the callers of a +function. + +`__builtin_return_address (LEVEL)' + This function returns the return address of the current function, + or of one of its callers. The LEVEL argument is number of frames + to scan up the call stack. A value of `0' yields the return + address of the current function, a value of `1' yields the return + address of the caller of the current function, and so forth. + + The LEVEL argument must be a constant integer. + + On some machines it may be impossible to determine the return + address of any function other than the current one; in such cases, + or when the top of the stack has been reached, this function will + return `0'. + + This function should only be used with a non-zero argument for + debugging purposes. + +`__builtin_frame_address (LEVEL)' + This function is similar to `__builtin_return_address', but it + returns the address of the function frame rather than the return + address of the function. Calling `__builtin_frame_address' with a + value of `0' yields the frame address of the current function, a + value of `1' yields the frame address of the caller of the current + function, and so forth. + + The frame is the area on the stack which holds local variables and + saved registers. The frame address is normally the address of the + first word pushed on to the stack by the function. However, the + exact definition depends upon the processor and the calling + convention. If the processor has a dedicated frame pointer + register, and the function has a frame, then + `__builtin_frame_address' will return the value of the frame + pointer register. + + The caveats that apply to `__builtin_return_address' apply to this + function as well. + + +File: gcc.info, Node: Other Builtins, Next: Deprecated Features, Prev: Return Address, Up: C Extensions + +Other built-in functions provided by GNU CC +=========================================== + + GNU CC provides a large number of built-in functions other than the +ones mentioned above. Some of these are for internal use in the +processing of exceptions or variable-length argument lists and will not +be documented here because they may change from time to time; we do not +recommend general use of these functions. + + The remaining functions are provided for optimization purposes. + + GNU CC includes builtin versions of many of the functions in the +standard C library. These will always be treated as having the same +meaning as the C library function even if you specify the +`-fno-builtin' (*note C Dialect Options::.) option. These functions +correspond to the C library functions `alloca', `ffs', `abs', `fabsf', +`fabs', `fabsl', `labs', `memcpy', `memcmp', `strcmp', `strcpy', +`strlen', `sqrtf', `sqrt', `sqrtl', `sinf', `sin', `sinl', `cosf', +`cos', and `cosl'. + + You can use the builtin function `__builtin_constant_p' to determine +if a value is known to be constant at compile-time and hence that GNU +CC can perform constant-folding on expressions involving that value. +The argument of the function is the value to test. The function +returns the integer 1 if the argument is known to be a compile-time +constant and 0 if it is not known to be a compile-time constant. A +return of 0 does not indicate that the value is *not* a constant, but +merely that GNU CC cannot prove it is a constant with the specified +value of the `-O' option. + + You would typically use this function in an embedded application +where memory was a critical resource. If you have some complex +calculation, you may want it to be folded if it involves constants, but +need to call a function if it does not. For example: + + #define Scale_Value(X) \ + (__builtin_constant_p (X) ? ((X) * SCALE + OFFSET) : Scale (X)) + + You may use this builtin function in either a macro or an inline +function. However, if you use it in an inlined function and pass an +argument of the function as the argument to the builtin, GNU CC will +never return 1 when you call the inline function with a string constant +or constructor expression (*note Constructors::.) and will not return 1 +when you pass a constant numeric value to the inline function unless you +specify the `-O' option. + + +File: gcc.info, Node: Deprecated Features, Prev: Other Builtins, Up: C Extensions + +Deprecated Features +=================== + + In the past, the GNU C++ compiler was extended to experiment with new +features, at a time when the C++ language was still evolving. Now that +the C++ standard is complete, some of those features are superceded by +superior alternatives. Using the old features might cause a warning in +some cases that the feature will be dropped in the future. In other +cases, the feature might be gone already. + + While the list below is not exhaustive, it documents some of the +options that are now deprecated: + +`-fthis-is-variable' + In early versions of C++, assignment to this could be used to + implement application-defined memory allocation. Now, allocation + functions (`operator new') are the standard-conforming way to + achieve the same effect. + +`-fexternal-templates' +`-falt-external-templates' + These are two of the many ways for g++ to implement template + instantiation. *Note Template Instantiation::. The C++ standard + clearly defines how template definitions have to be organized + across implementation units. g++ has an implicit instantiation + mechanism that should work just fine for standard-conforming code. + + +File: gcc.info, Node: C++ Extensions, Next: Gcov, Prev: C Extensions, Up: Top + +Extensions to the C++ Language +****************************** + + The GNU compiler provides these extensions to the C++ language (and +you can also use most of the C language extensions in your C++ +programs). If you want to write code that checks whether these +features are available, you can test for the GNU compiler the same way +as for C programs: check for a predefined macro `__GNUC__'. You can +also use `__GNUG__' to test specifically for GNU C++ (*note Standard +Predefined Macros: (cpp.info)Standard Predefined.). + +* Menu: + +* Naming Results:: Giving a name to C++ function return values. +* Min and Max:: C++ Minimum and maximum operators. +* Destructors and Goto:: Goto is safe to use in C++ even when destructors + are needed. +* C++ Interface:: You can use a single C++ header file for both + declarations and definitions. +* Template Instantiation:: Methods for ensuring that exactly one copy of + each needed template instantiation is emitted. +* Bound member functions:: You can extract a function pointer to the + method denoted by a `->*' or `.*' expression. +* C++ Signatures:: You can specify abstract types to get subtype + polymorphism independent from inheritance. + diff --git a/usr/local/nachos/info/gcc.info-12 b/usr/local/nachos/info/gcc.info-12 new file mode 100644 index 0000000..f59bab9 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-12 @@ -0,0 +1,965 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Naming Results, Next: Min and Max, Up: C++ Extensions + +Named Return Values in C++ +========================== + + GNU C++ extends the function-definition syntax to allow you to +specify a name for the result of a function outside the body of the +definition, in C++ programs: + + TYPE + FUNCTIONNAME (ARGS) return RESULTNAME; + { + ... + BODY + ... + } + + You can use this feature to avoid an extra constructor call when a +function result has a class type. For example, consider a function +`m', declared as `X v = m ();', whose result is of class `X': + + X + m () + { + X b; + b.a = 23; + return b; + } + + Although `m' appears to have no arguments, in fact it has one +implicit argument: the address of the return value. At invocation, the +address of enough space to hold `v' is sent in as the implicit argument. +Then `b' is constructed and its `a' field is set to the value 23. +Finally, a copy constructor (a constructor of the form `X(X&)') is +applied to `b', with the (implicit) return value location as the +target, so that `v' is now bound to the return value. + + But this is wasteful. The local `b' is declared just to hold +something that will be copied right out. While a compiler that +combined an "elision" algorithm with interprocedural data flow analysis +could conceivably eliminate all of this, it is much more practical to +allow you to assist the compiler in generating efficient code by +manipulating the return value explicitly, thus avoiding the local +variable and copy constructor altogether. + + Using the extended GNU C++ function-definition syntax, you can avoid +the temporary allocation and copying by naming `r' as your return value +at the outset, and assigning to its `a' field directly: + + X + m () return r; + { + r.a = 23; + } + +The declaration of `r' is a standard, proper declaration, whose effects +are executed *before* any of the body of `m'. + + Functions of this type impose no additional restrictions; in +particular, you can execute `return' statements, or return implicitly by +reaching the end of the function body ("falling off the edge"). Cases +like + + X + m () return r (23); + { + return; + } + +(or even `X m () return r (23); { }') are unambiguous, since the return +value `r' has been initialized in either case. The following code may +be hard to read, but also works predictably: + + X + m () return r; + { + X b; + return b; + } + + The return value slot denoted by `r' is initialized at the outset, +but the statement `return b;' overrides this value. The compiler deals +with this by destroying `r' (calling the destructor if there is one, or +doing nothing if there is not), and then reinitializing `r' with `b'. + + This extension is provided primarily to help people who use +overloaded operators, where there is a great need to control not just +the arguments, but the return values of functions. For classes where +the copy constructor incurs a heavy performance penalty (especially in +the common case where there is a quick default constructor), this is a +major savings. The disadvantage of this extension is that you do not +control when the default constructor for the return value is called: it +is always called at the beginning. + + +File: gcc.info, Node: Min and Max, Next: Destructors and Goto, Prev: Naming Results, Up: C++ Extensions + +Minimum and Maximum Operators in C++ +==================================== + + It is very convenient to have operators which return the "minimum" +or the "maximum" of two arguments. In GNU C++ (but not in GNU C), + +`A ? B' + is the "maximum", returning the larger of the numeric values A and + B. + + These operations are not primitive in ordinary C++, since you can +use a macro to return the minimum of two things in C++, as in the +following example. + + #define MIN(X,Y) ((X) < (Y) ? : (X) : (Y)) + +You might then use `int min = MIN (i, j);' to set MIN to the minimum +value of variables I and J. + + However, side effects in `X' or `Y' may cause unintended behavior. +For example, `MIN (i++, j++)' will fail, incrementing the smaller +counter twice. A GNU C extension allows you to write safe macros that +avoid this kind of problem (*note Naming an Expression's Type: Naming +Types.). However, writing `MIN' and `MAX' as macros also forces you to +use function-call notation for a fundamental arithmetic operation. +Using GNU C++ extensions, you can write `int min = i ?' are built into the compiler, they properly +handle expressions with side-effects; `int min = i++ ' to the end of each + template header. + + For library code, if you want the library to provide all of the + template instantiations it needs, just try to link all of its + object files together; the link will fail, but cause the + instantiations to be generated as a side effect. Be warned, + however, that this may cause conflicts if multiple libraries try + to provide the same instantiations. For greater control, use + explicit instantiation as described in the next option. + + 2. Compile your code with `-fno-implicit-templates' to disable the + implicit generation of template instances, and explicitly + instantiate all the ones you use. This approach requires more + knowledge of exactly which instances you need than do the others, + but it's less mysterious and allows greater control. You can + scatter the explicit instantiations throughout your program, + perhaps putting them in the translation units where the instances + are used or the translation units that define the templates + themselves; you can put all of the explicit instantiations you + need into one big file; or you can create small files like + + #include "Foo.h" + #include "Foo.cc" + + template class Foo; + template ostream& operator << + (ostream&, const Foo&); + + for each of the instances you need, and create a template + instantiation library from those. + + If you are using Cfront-model code, you can probably get away with + not using `-fno-implicit-templates' when compiling files that don't + `#include' the member template definitions. + + If you use one big file to do the instantiations, you may want to + compile it without `-fno-implicit-templates' so you get all of the + instances required by your explicit instantiations (but not by any + other files) without having to specify them as well. + + g++ has extended the template instantiation syntax outlined in the + Working Paper to allow forward declaration of explicit + instantiations and instantiation of the compiler support data for + a template class (i.e. the vtable) without instantiating any of + its members: + + extern template int max (int, int); + inline template class Foo; + + 3. Do nothing. Pretend g++ does implement automatic instantiation + management. Code written for the Borland model will work fine, but + each translation unit will contain instances of each of the + templates it uses. In a large program, this can lead to an + unacceptable amount of code duplication. + + 4. Add `#pragma interface' to all files containing template + definitions. For each of these files, add `#pragma implementation + "FILENAME"' to the top of some `.C' file which `#include's it. + Then compile everything with `-fexternal-templates'. The + templates will then only be expanded in the translation unit which + implements them (i.e. has a `#pragma implementation' line for the + file where they live); all other files will use external + references. If you're lucky, everything should work properly. If + you get undefined symbol errors, you need to make sure that each + template instance which is used in the program is used in the file + which implements that template. If you don't have any use for a + particular instance in that file, you can just instantiate it + explicitly, using the syntax from the latest C++ working paper: + + template class A; + template ostream& operator << (ostream&, const A&); + + This strategy will work with code written for either model. If + you are using code written for the Cfront model, the file + containing a class template and the file containing its member + templates should be implemented in the same translation unit. + + A slight variation on this approach is to instead use the flag + `-falt-external-templates'; this flag causes template instances to + be emitted in the translation unit that implements the header + where they are first instantiated, rather than the one which + implements the file where the templates are defined. This header + must be the same in all translation units, or things are likely to + break. + + *Note Declarations and Definitions in One Header: C++ Interface, + for more discussion of these pragmas. + + +File: gcc.info, Node: Bound member functions, Next: C++ Signatures, Prev: Template Instantiation, Up: C++ Extensions + +Extracting the function pointer from a bound pointer to member function +======================================================================= + + In C++, pointer to member functions (PMFs) are implemented using a +wide pointer of sorts to handle all the possible call mechanisms; the +PMF needs to store information about how to adjust the `this' pointer, +and if the function pointed to is virtual, where to find the vtable, and +where in the vtable to look for the member function. If you are using +PMFs in an inner loop, you should really reconsider that decision. If +that is not an option, you can extract the pointer to the function that +would be called for a given object/PMF pair and call it directly inside +the inner loop, to save a bit of time. + + Note that you will still be paying the penalty for the call through a +function pointer; on most modern architectures, such a call defeats the +branch prediction features of the CPU. This is also true of normal +virtual function calls. + + The syntax for this extension is + + extern A a; + extern int (A::*fp)(); + typedef int (*fptr)(A *); + + fptr p = (fptr)(a.*fp); + + You must specify `-Wno-pmf-conversions' to use this extension. + + +File: gcc.info, Node: C++ Signatures, Prev: Bound member functions, Up: C++ Extensions + +Type Abstraction using Signatures +================================= + + In GNU C++, you can use the keyword `signature' to define a +completely abstract class interface as a datatype. You can connect this +abstraction with actual classes using signature pointers. If you want +to use signatures, run the GNU compiler with the `-fhandle-signatures' +command-line option. (With this option, the compiler reserves a second +keyword `sigof' as well, for a future extension.) + + Roughly, signatures are type abstractions or interfaces of classes. +Some other languages have similar facilities. C++ signatures are +related to ML's signatures, Haskell's type classes, definition modules +in Modula-2, interface modules in Modula-3, abstract types in Emerald, +type modules in Trellis/Owl, categories in Scratchpad II, and types in +POOL-I. For a more detailed discussion of signatures, see `Signatures: +A Language Extension for Improving Type Abstraction and Subtype +Polymorphism in C++' by Gerald Baumgartner and Vincent F. Russo (Tech +report CSD-TR-95-051, Dept. of Computer Sciences, Purdue University, +August 1995, a slightly improved version appeared in +*Software--Practice & Experience*, 25(8), pp. 863-889, August 1995). +You can get the tech report by anonymous FTP from `ftp.cs.purdue.edu' +in `pub/gb/Signature-design.ps.gz'. + + Syntactically, a signature declaration is a collection of member +function declarations and nested type declarations. For example, this +signature declaration defines a new abstract type `S' with member +functions `int foo ()' and `int bar (int)': + + signature S + { + int foo (); + int bar (int); + }; + + Since signature types do not include implementation definitions, you +cannot write an instance of a signature directly. Instead, you can +define a pointer to any class that contains the required interfaces as a +"signature pointer". Such a class "implements" the signature type. + + To use a class as an implementation of `S', you must ensure that the +class has public member functions `int foo ()' and `int bar (int)'. +The class can have other member functions as well, public or not; as +long as it offers what's declared in the signature, it is suitable as +an implementation of that signature type. + + For example, suppose that `C' is a class that meets the requirements +of signature `S' (`C' "conforms to" `S'). Then + + C obj; + S * p = &obj; + +defines a signature pointer `p' and initializes it to point to an +object of type `C'. The member function call `int i = p->foo ();' +executes `obj.foo ()'. + + Abstract virtual classes provide somewhat similar facilities in +standard C++. There are two main advantages to using signatures +instead: + + 1. Subtyping becomes independent from inheritance. A class or + signature type `T' is a subtype of a signature type `S' + independent of any inheritance hierarchy as long as all the member + functions declared in `S' are also found in `T'. So you can + define a subtype hierarchy that is completely independent from any + inheritance (implementation) hierarchy, instead of being forced to + use types that mirror the class inheritance hierarchy. + + 2. Signatures allow you to work with existing class hierarchies as + implementations of a signature type. If those class hierarchies + are only available in compiled form, you're out of luck with + abstract virtual classes, since an abstract virtual class cannot + be retrofitted on top of existing class hierarchies. So you would + be required to write interface classes as subtypes of the abstract + virtual class. + + There is one more detail about signatures. A signature declaration +can contain member function *definitions* as well as member function +declarations. A signature member function with a full definition is +called a *default implementation*; classes need not contain that +particular interface in order to conform. For example, a class `C' can +conform to the signature + + signature T + { + int f (int); + int f0 () { return f (0); }; + }; + +whether or not `C' implements the member function `int f0 ()'. If you +define `C::f0', that definition takes precedence; otherwise, the +default implementation `S::f0' applies. + + +File: gcc.info, Node: Gcov, Next: Trouble, Prev: C++ Extensions, Up: Top + +`gcov': a Test Coverage Program +******************************* + + `gcov' is a tool you can use in conjunction with GNU CC to test code +coverage in your programs. + + This chapter describes version 1.5 of `gcov'. + +* Menu: + +* Gcov Intro:: Introduction to gcov. +* Invoking Gcov:: How to use gcov. +* Gcov and Optimization:: Using gcov with GCC optimization. +* Gcov Data Files:: The files used by gcov. + + +File: gcc.info, Node: Gcov Intro, Next: Invoking Gcov, Up: Gcov + +Introduction to `gcov' +====================== + + `gcov' is a test coverage program. Use it in concert with GNU CC to +analyze your programs to help create more efficient, faster running +code. You can use `gcov' as a profiling tool to help discover where +your optimization efforts will best affect your code. You can also use +`gcov' along with the other profiling tool, `gprof', to assess which +parts of your code use the greatest amount of computing time. + + Profiling tools help you analyze your code's performance. Using a +profiler such as `gcov' or `gprof', you can find out some basic +performance statistics, such as: + + * how often each line of code executes + + * what lines of code are actually executed + + * how much computing time each section of code uses + + Once you know these things about how your code works when compiled, +you can look at each module to see which modules should be optimized. +`gcov' helps you determine where to work on optimization. + + Software developers also use coverage testing in concert with +testsuites, to make sure software is actually good enough for a release. +Testsuites can verify that a program works as expected; a coverage +program tests to see how much of the program is exercised by the +testsuite. Developers can then determine what kinds of test cases need +to be added to the testsuites to create both better testing and a better +final product. + + You should compile your code without optimization if you plan to use +`gcov' because the optimization, by combining some lines of code into +one function, may not give you as much information as you need to look +for `hot spots' where the code is using a great deal of computer time. +Likewise, because `gcov' accumulates statistics by line (at the lowest +resolution), it works best with a programming style that places only +one statement on each line. If you use complicated macros that expand +to loops or to other control structures, the statistics are less +helpful--they only report on the line where the macro call appears. If +your complex macros behave like functions, you can replace them with +inline functions to solve this problem. + + `gcov' creates a logfile called `SOURCEFILE.gcov' which indicates +how many times each line of a source file `SOURCEFILE.c' has executed. +You can use these logfiles along with `gprof' to aid in fine-tuning the +performance of your programs. `gprof' gives timing information you can +use along with the information you get from `gcov'. + + `gcov' works only on code compiled with GNU CC. It is not +compatible with any other profiling or test coverage mechanism. + + +File: gcc.info, Node: Invoking Gcov, Next: Gcov and Optimization, Prev: Gcov Intro, Up: Gcov + +Invoking gcov +============= + + gcov [-b] [-v] [-n] [-l] [-f] [-o directory] SOURCEFILE + +`-b' + Write branch frequencies to the output file, and write branch + summary info to the standard output. This option allows you to + see how often each branch in your program was taken. + +`-v' + Display the `gcov' version number (on the standard error stream). + +`-n' + Do not create the `gcov' output file. + +`-l' + Create long file names for included source files. For example, if + the header file `x.h' contains code, and was included in the file + `a.c', then running `gcov' on the file `a.c' will produce an + output file called `a.c.x.h.gcov' instead of `x.h.gcov'. This can + be useful if `x.h' is included in multiple source files. + +`-f' + Output summaries for each function in addition to the file level + summary. + +`-o' + The directory where the object files live. Gcov will search for + `.bb', `.bbg', and `.da' files in this directory. + + When using `gcov', you must first compile your program with two +special GNU CC options: `-fprofile-arcs -ftest-coverage'. This tells +the compiler to generate additional information needed by gcov +(basically a flow graph of the program) and also includes additional +code in the object files for generating the extra profiling information +needed by gcov. These additional files are placed in the directory +where the source code is located. + + Running the program will cause profile output to be generated. For +each source file compiled with -fprofile-arcs, an accompanying `.da' +file will be placed in the source directory. + + Running `gcov' with your program's source file names as arguments +will now produce a listing of the code along with frequency of execution +for each line. For example, if your program is called `tmp.c', this is +what you see when you use the basic `gcov' facility: + + $ gcc -fprofile-arcs -ftest-coverage tmp.c + $ a.out + $ gcov tmp.c + 87.50% of 8 source lines executed in file tmp.c + Creating tmp.c.gcov. + + The file `tmp.c.gcov' contains output from `gcov'. Here is a sample: + + main() + { + 1 int i, total; + + 1 total = 0; + + 11 for (i = 0; i < 10; i++) + 10 total += i; + + 1 if (total != 45) + ###### printf ("Failure\n"); + else + 1 printf ("Success\n"); + 1 } + + When you use the `-b' option, your output looks like this: + + $ gcov -b tmp.c + 87.50% of 8 source lines executed in file tmp.c + 80.00% of 5 branches executed in file tmp.c + 80.00% of 5 branches taken at least once in file tmp.c + 50.00% of 2 calls executed in file tmp.c + Creating tmp.c.gcov. + + Here is a sample of a resulting `tmp.c.gcov' file: + + main() + { + 1 int i, total; + + 1 total = 0; + + 11 for (i = 0; i < 10; i++) + branch 0 taken = 91% + branch 1 taken = 100% + branch 2 taken = 100% + 10 total += i; + + 1 if (total != 45) + branch 0 taken = 100% + ###### printf ("Failure\n"); + call 0 never executed + branch 1 never executed + else + 1 printf ("Success\n"); + call 0 returns = 100% + 1 } + + For each basic block, a line is printed after the last line of the +basic block describing the branch or call that ends the basic block. +There can be multiple branches and calls listed for a single source +line if there are multiple basic blocks that end on that line. In this +case, the branches and calls are each given a number. There is no +simple way to map these branches and calls back to source constructs. +In general, though, the lowest numbered branch or call will correspond +to the leftmost construct on the source line. + + For a branch, if it was executed at least once, then a percentage +indicating the number of times the branch was taken divided by the +number of times the branch was executed will be printed. Otherwise, the +message "never executed" is printed. + + For a call, if it was executed at least once, then a percentage +indicating the number of times the call returned divided by the number +of times the call was executed will be printed. This will usually be +100%, but may be less for functions call `exit' or `longjmp', and thus +may not return everytime they are called. + + The execution counts are cumulative. If the example program were +executed again without removing the `.da' file, the count for the +number of times each line in the source was executed would be added to +the results of the previous run(s). This is potentially useful in +several ways. For example, it could be used to accumulate data over a +number of program runs as part of a test verification suite, or to +provide more accurate long-term information over a large number of +program runs. + + The data in the `.da' files is saved immediately before the program +exits. For each source file compiled with -fprofile-arcs, the profiling +code first attempts to read in an existing `.da' file; if the file +doesn't match the executable (differing number of basic block counts) it +will ignore the contents of the file. It then adds in the new execution +counts and finally writes the data to the file. + + +File: gcc.info, Node: Gcov and Optimization, Next: Gcov Data Files, Prev: Invoking Gcov, Up: Gcov + +Using `gcov' with GCC Optimization +================================== + + If you plan to use `gcov' to help optimize your code, you must first +compile your program with two special GNU CC options: `-fprofile-arcs +-ftest-coverage'. Aside from that, you can use any other GNU CC +options; but if you want to prove that every single line in your +program was executed, you should not compile with optimization at the +same time. On some machines the optimizer can eliminate some simple +code lines by combining them with other lines. For example, code like +this: + + if (a != b) + c = 1; + else + c = 0; + +can be compiled into one instruction on some machines. In this case, +there is no way for `gcov' to calculate separate execution counts for +each line because there isn't separate code for each line. Hence the +`gcov' output looks like this if you compiled the program with +optimization: + + 100 if (a != b) + 100 c = 1; + 100 else + 100 c = 0; + + The output shows that this block of code, combined by optimization, +executed 100 times. In one sense this result is correct, because there +was only one instruction representing all four of these lines. However, +the output does not indicate how many times the result was 0 and how +many times the result was 1. + + +File: gcc.info, Node: Gcov Data Files, Prev: Gcov and Optimization, Up: Gcov + +Brief description of `gcov' data files +====================================== + + `gcov' uses three files for doing profiling. The names of these +files are derived from the original *source* file by substituting the +file suffix with either `.bb', `.bbg', or `.da'. All of these files +are placed in the same directory as the source file, and contain data +stored in a platform-independent method. + + The `.bb' and `.bbg' files are generated when the source file is +compiled with the GNU CC `-ftest-coverage' option. The `.bb' file +contains a list of source files (including headers), functions within +those files, and line numbers corresponding to each basic block in the +source file. + + The `.bb' file format consists of several lists of 4-byte integers +which correspond to the line numbers of each basic block in the file. +Each list is terminated by a line number of 0. A line number of -1 is +used to designate that the source file name (padded to a 4-byte +boundary and followed by another -1) follows. In addition, a line +number of -2 is used to designate that the name of a function (also +padded to a 4-byte boundary and followed by a -2) follows. + + The `.bbg' file is used to reconstruct the program flow graph for +the source file. It contains a list of the program flow arcs (possible +branches taken from one basic block to another) for each function which, +in combination with the `.bb' file, enables gcov to reconstruct the +program flow. + + In the `.bbg' file, the format is: + number of basic blocks for function #0 (4-byte number) + total number of arcs for function #0 (4-byte number) + count of arcs in basic block #0 (4-byte number) + destination basic block of arc #0 (4-byte number) + flag bits (4-byte number) + destination basic block of arc #1 (4-byte number) + flag bits (4-byte number) + ... + destination basic block of arc #N (4-byte number) + flag bits (4-byte number) + count of arcs in basic block #1 (4-byte number) + destination basic block of arc #0 (4-byte number) + flag bits (4-byte number) + ... + + A -1 (stored as a 4-byte number) is used to separate each function's +list of basic blocks, and to verify that the file has been read +correctly. + + The `.da' file is generated when a program containing object files +built with the GNU CC `-fprofile-arcs' option is executed. A separate +`.da' file is created for each source file compiled with this option, +and the name of the `.da' file is stored as an absolute pathname in the +resulting object file. This path name is derived from the source file +name by substituting a `.da' suffix. + + The format of the `.da' file is fairly simple. The first 8-byte +number is the number of counts in the file, followed by the counts +(stored as 8-byte numbers). Each count corresponds to the number of +times each arc in the program is executed. The counts are cumulative; +each time the program is executed, it attemps to combine the existing +`.da' files with the new counts for this invocation of the program. It +ignores the contents of any `.da' files whose number of arcs doesn't +correspond to the current program, and merely overwrites them instead. + + All three of these files use the functions in `gcov-io.h' to store +integers; the functions in this header provide a machine-independent +mechanism for storing and retrieving data from a stream. + + +File: gcc.info, Node: Trouble, Next: Bugs, Prev: Gcov, Up: Top + +Known Causes of Trouble with GCC +******************************** + + This section describes known problems that affect users of GCC. Most +of these are not GCC bugs per se--if they were, we would fix them. But +the result for a user may be like the result of a bug. + + Some of these problems are due to bugs in other software, some are +missing features that are too much work to add, and some are places +where people's opinions differ as to what is best. + +* Menu: + +* Actual Bugs:: Bugs we will fix later. +* Installation Problems:: Problems that manifest when you install GCC. +* Cross-Compiler Problems:: Common problems of cross compiling with GCC. +* Interoperation:: Problems using GCC with other compilers, + and with certain linkers, assemblers and debuggers. +* External Bugs:: Problems compiling certain programs. +* Incompatibilities:: GCC is incompatible with traditional C. +* Fixed Headers:: GNU C uses corrected versions of system header files. + This is necessary, but doesn't always work smoothly. +* Standard Libraries:: GNU C uses the system C library, which might not be + compliant with the ISO/ANSI C standard. +* Disappointments:: Regrettable things we can't change, but not quite bugs. +* C++ Misunderstandings:: Common misunderstandings with GNU C++. +* Protoize Caveats:: Things to watch out for when using `protoize'. +* Non-bugs:: Things we think are right, but some others disagree. +* Warnings and Errors:: Which problems in your code get warnings, + and which get errors. + + +File: gcc.info, Node: Actual Bugs, Next: Installation Problems, Up: Trouble + +Actual Bugs We Haven't Fixed Yet +================================ + + * The `fixincludes' script interacts badly with automounters; if the + directory of system header files is automounted, it tends to be + unmounted while `fixincludes' is running. This would seem to be a + bug in the automounter. We don't know any good way to work around + it. + + * The `fixproto' script will sometimes add prototypes for the + `sigsetjmp' and `siglongjmp' functions that reference the + `jmp_buf' type before that type is defined. To work around this, + edit the offending file and place the typedef in front of the + prototypes. + + * There are several obscure case of mis-using struct, union, and + enum tags that are not detected as errors by the compiler. + + * When `-pedantic-errors' is specified, GCC will incorrectly give an + error message when a function name is specified in an expression + involving the comma operator. + + * Loop unrolling doesn't work properly for certain C++ programs. + This is a bug in the C++ front end. It sometimes emits incorrect + debug info, and the loop unrolling code is unable to recover from + this error. + diff --git a/usr/local/nachos/info/gcc.info-13 b/usr/local/nachos/info/gcc.info-13 new file mode 100644 index 0000000..df1e9dd --- /dev/null +++ b/usr/local/nachos/info/gcc.info-13 @@ -0,0 +1,1143 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Installation Problems, Next: Cross-Compiler Problems, Prev: Actual Bugs, Up: Trouble + +Installation Problems +===================== + + This is a list of problems (and some apparent problems which don't +really mean anything is wrong) that show up during installation of GNU +CC. + + * On certain systems, defining certain environment variables such as + `CC' can interfere with the functioning of `make'. + + * If you encounter seemingly strange errors when trying to build the + compiler in a directory other than the source directory, it could + be because you have previously configured the compiler in the + source directory. Make sure you have done all the necessary + preparations. *Note Other Dir::. + + * If you build GCC on a BSD system using a directory stored in a + System V file system, problems may occur in running `fixincludes' + if the System V file system doesn't support symbolic links. These + problems result in a failure to fix the declaration of `size_t' in + `sys/types.h'. If you find that `size_t' is a signed type and + that type mismatches occur, this could be the cause. + + The solution is not to use such a directory for building GCC. + + * In previous versions of GCC, the `gcc' driver program looked for + `as' and `ld' in various places; for example, in files beginning + with `/usr/local/lib/gcc-'. GCC version 2 looks for them in the + directory `/usr/local/lib/gcc-lib/TARGET/VERSION'. + + Thus, to use a version of `as' or `ld' that is not the system + default, for example `gas' or GNU `ld', you must put them in that + directory (or make links to them from that directory). + + * Some commands executed when making the compiler may fail (return a + non-zero status) and be ignored by `make'. These failures, which + are often due to files that were not found, are expected, and can + safely be ignored. + + * It is normal to have warnings in compiling certain files about + unreachable code and about enumeration type clashes. These files' + names begin with `insn-'. Also, `real.c' may get some warnings + that you can ignore. + + * Sometimes `make' recompiles parts of the compiler when installing + the compiler. In one case, this was traced down to a bug in + `make'. Either ignore the problem or switch to GNU Make. + + * If you have installed a program known as purify, you may find that + it causes errors while linking `enquire', which is part of building + GCC. The fix is to get rid of the file `real-ld' which purify + installs--so that GCC won't try to use it. + + * On GNU/Linux SLS 1.01, there is a problem with `libc.a': it does + not contain the obstack functions. However, GCC assumes that the + obstack functions are in `libc.a' when it is the GNU C library. + To work around this problem, change the `__GNU_LIBRARY__' + conditional around line 31 to `#if 1'. + + * On some 386 systems, building the compiler never finishes because + `enquire' hangs due to a hardware problem in the motherboard--it + reports floating point exceptions to the kernel incorrectly. You + can install GCC except for `float.h' by patching out the command to + run `enquire'. You may also be able to fix the problem for real by + getting a replacement motherboard. This problem was observed in + Revision E of the Micronics motherboard, and is fixed in Revision + F. It has also been observed in the MYLEX MXA-33 motherboard. + + If you encounter this problem, you may also want to consider + removing the FPU from the socket during the compilation. + Alternatively, if you are running SCO Unix, you can reboot and + force the FPU to be ignored. To do this, type `hd(40)unix auto + ignorefpu'. + + * On some 386 systems, GCC crashes trying to compile `enquire.c'. + This happens on machines that don't have a 387 FPU chip. On 386 + machines, the system kernel is supposed to emulate the 387 when you + don't have one. The crash is due to a bug in the emulator. + + One of these systems is the Unix from Interactive Systems: 386/ix. + On this system, an alternate emulator is provided, and it does + work. To use it, execute this command as super-user: + + ln /etc/emulator.rel1 /etc/emulator + + and then reboot the system. (The default emulator file remains + present under the name `emulator.dflt'.) + + Try using `/etc/emulator.att', if you have such a problem on the + SCO system. + + Another system which has this problem is Esix. We don't know + whether it has an alternate emulator that works. + + On NetBSD 0.8, a similar problem manifests itself as these error + messages: + + enquire.c: In function `fprop': + enquire.c:2328: floating overflow + + * On SCO systems, when compiling GCC with the system's compiler, do + not use `-O'. Some versions of the system's compiler miscompile + GCC with `-O'. + + * Sometimes on a Sun 4 you may observe a crash in the program + `genflags' or `genoutput' while building GCC. This is said to be + due to a bug in `sh'. You can probably get around it by running + `genflags' or `genoutput' manually and then retrying the `make'. + + * On Solaris 2, executables of GCC version 2.0.2 are commonly + available, but they have a bug that shows up when compiling current + versions of GCC: undefined symbol errors occur during assembly if + you use `-g'. + + The solution is to compile the current version of GCC without + `-g'. That makes a working compiler which you can use to recompile + with `-g'. + + * Solaris 2 comes with a number of optional OS packages. Some of + these packages are needed to use GCC fully. If you did not + install all optional packages when installing Solaris, you will + need to verify that the packages that GCC needs are installed. + + To check whether an optional package is installed, use the + `pkginfo' command. To add an optional package, use the `pkgadd' + command. For further details, see the Solaris documentation. + + For Solaris 2.0 and 2.1, GCC needs six packages: `SUNWarc', + `SUNWbtool', `SUNWesu', `SUNWhea', `SUNWlibm', and `SUNWtoo'. + + For Solaris 2.2, GCC needs an additional seventh package: + `SUNWsprot'. + + * On Solaris 2, trying to use the linker and other tools in + `/usr/ucb' to install GCC has been observed to cause trouble. For + example, the linker may hang indefinitely. The fix is to remove + `/usr/ucb' from your `PATH'. + + * If you use the 1.31 version of the MIPS assembler (such as was + shipped with Ultrix 3.1), you will need to use the + -fno-delayed-branch switch when optimizing floating point code. + Otherwise, the assembler will complain when the GCC compiler fills + a branch delay slot with a floating point instruction, such as + `add.d'. + + * If on a MIPS system you get an error message saying "does not have + gp sections for all it's [sic] sectons [sic]", don't worry about + it. This happens whenever you use GAS with the MIPS linker, but + there is not really anything wrong, and it is okay to use the + output file. You can stop such warnings by installing the GNU + linker. + + It would be nice to extend GAS to produce the gp tables, but they + are optional, and there should not be a warning about their + absence. + + * In Ultrix 4.0 on the MIPS machine, `stdio.h' does not work with GNU + CC at all unless it has been fixed with `fixincludes'. This causes + problems in building GCC. Once GCC is installed, the problems go + away. + + To work around this problem, when making the stage 1 compiler, + specify this option to Make: + + GCC_FOR_TARGET="./xgcc -B./ -I./include" + + When making stage 2 and stage 3, specify this option: + + CFLAGS="-g -I./include" + + * Users have reported some problems with version 2.0 of the MIPS + compiler tools that were shipped with Ultrix 4.1. Version 2.10 + which came with Ultrix 4.2 seems to work fine. + + Users have also reported some problems with version 2.20 of the + MIPS compiler tools that were shipped with RISC/os 4.x. The + earlier version 2.11 seems to work fine. + + * Some versions of the MIPS linker will issue an assertion failure + when linking code that uses `alloca' against shared libraries on + RISC-OS 5.0, and DEC's OSF/1 systems. This is a bug in the + linker, that is supposed to be fixed in future revisions. To + protect against this, GCC passes `-non_shared' to the linker + unless you pass an explicit `-shared' or `-call_shared' switch. + + * On System V release 3, you may get this error message while + linking: + + ld fatal: failed to write symbol name SOMETHING + in strings table for file WHATEVER + + This probably indicates that the disk is full or your ULIMIT won't + allow the file to be as large as it needs to be. + + This problem can also result because the kernel parameter `MAXUMEM' + is too small. If so, you must regenerate the kernel and make the + value much larger. The default value is reported to be 1024; a + value of 32768 is said to work. Smaller values may also work. + + * On System V, if you get an error like this, + + /usr/local/lib/bison.simple: In function `yyparse': + /usr/local/lib/bison.simple:625: virtual memory exhausted + + that too indicates a problem with disk space, ULIMIT, or `MAXUMEM'. + + * Current GCC versions probably do not work on version 2 of the NeXT + operating system. + + * On NeXTStep 3.0, the Objective C compiler does not work, due, + apparently, to a kernel bug that it happens to trigger. This + problem does not happen on 3.1. + + * On the Tower models 4N0 and 6N0, by default a process is not + allowed to have more than one megabyte of memory. GCC cannot + compile itself (or many other programs) with `-O' in that much + memory. + + To solve this problem, reconfigure the kernel adding the following + line to the configuration file: + + MAXUMEM = 4096 + + * On HP 9000 series 300 or 400 running HP-UX release 8.0, there is a + bug in the assembler that must be fixed before GCC can be built. + This bug manifests itself during the first stage of compilation, + while building `libgcc2.a': + + _floatdisf + cc1: warning: `-g' option not supported on this version of GCC + cc1: warning: `-g1' option not supported on this version of GCC + ./xgcc: Internal compiler error: program as got fatal signal 11 + + A patched version of the assembler is available by anonymous ftp + from `altdorf.ai.mit.edu' as the file + `archive/cph/hpux-8.0-assembler'. If you have HP software support, + the patch can also be obtained directly from HP, as described in + the following note: + + This is the patched assembler, to patch SR#1653-010439, where + the assembler aborts on floating point constants. + + The bug is not really in the assembler, but in the shared + library version of the function "cvtnum(3c)". The bug on + "cvtnum(3c)" is SR#4701-078451. Anyway, the attached + assembler uses the archive library version of "cvtnum(3c)" + and thus does not exhibit the bug. + + This patch is also known as PHCO_4484. + + * On HP-UX version 8.05, but not on 8.07 or more recent versions, + the `fixproto' shell script triggers a bug in the system shell. + If you encounter this problem, upgrade your operating system or + use BASH (the GNU shell) to run `fixproto'. + + * Some versions of the Pyramid C compiler are reported to be unable + to compile GCC. You must use an older version of GCC for + bootstrapping. One indication of this problem is if you get a + crash when GCC compiles the function `muldi3' in file `libgcc2.c'. + + You may be able to succeed by getting GCC version 1, installing it, + and using it to compile GCC version 2. The bug in the Pyramid C + compiler does not seem to affect GCC version 1. + + * There may be similar problems on System V Release 3.1 on 386 + systems. + + * On the Intel Paragon (an i860 machine), if you are using operating + system version 1.0, you will get warnings or errors about + redefinition of `va_arg' when you build GCC. + + If this happens, then you need to link most programs with the + library `iclib.a'. You must also modify `stdio.h' as follows: + before the lines + + #if defined(__i860__) && !defined(_VA_LIST) + #include + + insert the line + + #if __PGC__ + + and after the lines + + extern int vprintf(const char *, va_list ); + extern int vsprintf(char *, const char *, va_list ); + #endif + + insert the line + + #endif /* __PGC__ */ + + These problems don't exist in operating system version 1.1. + + * On the Altos 3068, programs compiled with GCC won't work unless you + fix a kernel bug. This happens using system versions V.2.2 1.0gT1 + and V.2.2 1.0e and perhaps later versions as well. See the file + `README.ALTOS'. + + * You will get several sorts of compilation and linking errors on the + we32k if you don't follow the special instructions. *Note + Configurations::. + + * A bug in the HP-UX 8.05 (and earlier) shell will cause the fixproto + program to report an error of the form: + + ./fixproto: sh internal 1K buffer overflow + + To fix this, change the first line of the fixproto script to look + like: + + #!/bin/ksh + + +File: gcc.info, Node: Cross-Compiler Problems, Next: Interoperation, Prev: Installation Problems, Up: Trouble + +Cross-Compiler Problems +======================= + + You may run into problems with cross compilation on certain machines, +for several reasons. + + * Cross compilation can run into trouble for certain machines because + some target machines' assemblers require floating point numbers to + be written as *integer* constants in certain contexts. + + The compiler writes these integer constants by examining the + floating point value as an integer and printing that integer, + because this is simple to write and independent of the details of + the floating point representation. But this does not work if the + compiler is running on a different machine with an incompatible + floating point format, or even a different byte-ordering. + + In addition, correct constant folding of floating point values + requires representing them in the target machine's format. (The C + standard does not quite require this, but in practice it is the + only way to win.) + + It is now possible to overcome these problems by defining macros + such as `REAL_VALUE_TYPE'. But doing so is a substantial amount of + work for each target machine. *Note Cross-compilation::. + + * At present, the program `mips-tfile' which adds debug support to + object files on MIPS systems does not work in a cross compile + environment. + + +File: gcc.info, Node: Interoperation, Next: External Bugs, Prev: Cross-Compiler Problems, Up: Trouble + +Interoperation +============== + + This section lists various difficulties encountered in using GNU C or +GNU C++ together with other compilers or with the assemblers, linkers, +libraries and debuggers on certain systems. + + * Objective C does not work on the RS/6000. + + * GNU C++ does not do name mangling in the same way as other C++ + compilers. This means that object files compiled with one compiler + cannot be used with another. + + This effect is intentional, to protect you from more subtle + problems. Compilers differ as to many internal details of C++ + implementation, including: how class instances are laid out, how + multiple inheritance is implemented, and how virtual function + calls are handled. If the name encoding were made the same, your + programs would link against libraries provided from other + compilers--but the programs would then crash when run. + Incompatible libraries are then detected at link time, rather than + at run time. + + * Older GDB versions sometimes fail to read the output of GCC version + 2. If you have trouble, get GDB version 4.4 or later. + + * DBX rejects some files produced by GCC, though it accepts similar + constructs in output from PCC. Until someone can supply a coherent + description of what is valid DBX input and what is not, there is + nothing I can do about these problems. You are on your own. + + * The GNU assembler (GAS) does not support PIC. To generate PIC + code, you must use some other assembler, such as `/bin/as'. + + * On some BSD systems, including some versions of Ultrix, use of + profiling causes static variable destructors (currently used only + in C++) not to be run. + + * Use of `-I/usr/include' may cause trouble. + + Many systems come with header files that won't work with GCC unless + corrected by `fixincludes'. The corrected header files go in a new + directory; GCC searches this directory before `/usr/include'. If + you use `-I/usr/include', this tells GCC to search `/usr/include' + earlier on, before the corrected headers. The result is that you + get the uncorrected header files. + + Instead, you should use these options (when compiling C programs): + + -I/usr/local/lib/gcc-lib/TARGET/VERSION/include -I/usr/include + + For C++ programs, GCC also uses a special directory that defines + C++ interfaces to standard C subroutines. This directory is meant + to be searched *before* other standard include directories, so + that it takes precedence. If you are compiling C++ programs and + specifying include directories explicitly, use this option first, + then the two options above: + + -I/usr/local/lib/g++-include + + * On some SGI systems, when you use `-lgl_s' as an option, it gets + translated magically to `-lgl_s -lX11_s -lc_s'. Naturally, this + does not happen when you use GCC. You must specify all three + options explicitly. + + * On a Sparc, GCC aligns all values of type `double' on an 8-byte + boundary, and it expects every `double' to be so aligned. The Sun + compiler usually gives `double' values 8-byte alignment, with one + exception: function arguments of type `double' may not be aligned. + + As a result, if a function compiled with Sun CC takes the address + of an argument of type `double' and passes this pointer of type + `double *' to a function compiled with GCC, dereferencing the + pointer may cause a fatal signal. + + One way to solve this problem is to compile your entire program + with GNU CC. Another solution is to modify the function that is + compiled with Sun CC to copy the argument into a local variable; + local variables are always properly aligned. A third solution is + to modify the function that uses the pointer to dereference it via + the following function `access_double' instead of directly with + `*': + + inline double + access_double (double *unaligned_ptr) + { + union d2i { double d; int i[2]; }; + + union d2i *p = (union d2i *) unaligned_ptr; + union d2i u; + + u.i[0] = p->i[0]; + u.i[1] = p->i[1]; + + return u.d; + } + + Storing into the pointer can be done likewise with the same union. + + * On Solaris, the `malloc' function in the `libmalloc.a' library may + allocate memory that is only 4 byte aligned. Since GCC on the + Sparc assumes that doubles are 8 byte aligned, this may result in a + fatal signal if doubles are stored in memory allocated by the + `libmalloc.a' library. + + The solution is to not use the `libmalloc.a' library. Use instead + `malloc' and related functions from `libc.a'; they do not have + this problem. + + * Sun forgot to include a static version of `libdl.a' with some + versions of SunOS (mainly 4.1). This results in undefined symbols + when linking static binaries (that is, if you use `-static'). If + you see undefined symbols `_dlclose', `_dlsym' or `_dlopen' when + linking, compile and link against the file `mit/util/misc/dlsym.c' + from the MIT version of X windows. + + * The 128-bit long double format that the Sparc port supports + currently works by using the architecturally defined quad-word + floating point instructions. Since there is no hardware that + supports these instructions they must be emulated by the operating + system. Long doubles do not work in Sun OS versions 4.0.3 and + earlier, because the kernel emulator uses an obsolete and + incompatible format. Long doubles do not work in Sun OS version + 4.1.1 due to a problem in a Sun library. Long doubles do work on + Sun OS versions 4.1.2 and higher, but GCC does not enable them by + default. Long doubles appear to work in Sun OS 5.x (Solaris 2.x). + + * On HP-UX version 9.01 on the HP PA, the HP compiler `cc' does not + compile GCC correctly. We do not yet know why. However, GCC + compiled on earlier HP-UX versions works properly on HP-UX 9.01 + and can compile itself properly on 9.01. + + * On the HP PA machine, ADB sometimes fails to work on functions + compiled with GCC. Specifically, it fails to work on functions + that use `alloca' or variable-size arrays. This is because GCC + doesn't generate HP-UX unwind descriptors for such functions. It + may even be impossible to generate them. + + * Debugging (`-g') is not supported on the HP PA machine, unless you + use the preliminary GNU tools (*note Installation::.). + + * Taking the address of a label may generate errors from the HP-UX + PA assembler. GAS for the PA does not have this problem. + + * Using floating point parameters for indirect calls to static + functions will not work when using the HP assembler. There simply + is no way for GCC to specify what registers hold arguments for + static functions when using the HP assembler. GAS for the PA does + not have this problem. + + * In extremely rare cases involving some very large functions you may + receive errors from the HP linker complaining about an out of + bounds unconditional branch offset. This used to occur more often + in previous versions of GCC, but is now exceptionally rare. If + you should run into it, you can work around by making your + function smaller. + + * GCC compiled code sometimes emits warnings from the HP-UX + assembler of the form: + + (warning) Use of GR3 when + frame >= 8192 may cause conflict. + + These warnings are harmless and can be safely ignored. + + * The current version of the assembler (`/bin/as') for the RS/6000 + has certain problems that prevent the `-g' option in GCC from + working. Note that `Makefile.in' uses `-g' by default when + compiling `libgcc2.c'. + + IBM has produced a fixed version of the assembler. The upgraded + assembler unfortunately was not included in any of the AIX 3.2 + update PTF releases (3.2.2, 3.2.3, or 3.2.3e). Users of AIX 3.1 + should request PTF U403044 from IBM and users of AIX 3.2 should + request PTF U416277. See the file `README.RS6000' for more + details on these updates. + + You can test for the presense of a fixed assembler by using the + command + + as -u < /dev/null + + If the command exits normally, the assembler fix already is + installed. If the assembler complains that "-u" is an unknown + flag, you need to order the fix. + + * On the IBM RS/6000, compiling code of the form + + extern int foo; + + ... foo ... + + static int foo; + + will cause the linker to report an undefined symbol `foo'. + Although this behavior differs from most other systems, it is not a + bug because redefining an `extern' variable as `static' is + undefined in ANSI C. + + * AIX on the RS/6000 provides support (NLS) for environments outside + of the United States. Compilers and assemblers use NLS to support + locale-specific representations of various objects including + floating-point numbers ("." vs "," for separating decimal + fractions). There have been problems reported where the library + linked with GCC does not produce the same floating-point formats + that the assembler accepts. If you have this problem, set the + LANG environment variable to "C" or "En_US". + + * Even if you specify `-fdollars-in-identifiers', you cannot + successfully use `$' in identifiers on the RS/6000 due to a + restriction in the IBM assembler. GAS supports these identifiers. + + * On the RS/6000, XLC version 1.3.0.0 will miscompile `jump.c'. XLC + version 1.3.0.1 or later fixes this problem. You can obtain + XLC-1.3.0.2 by requesting PTF 421749 from IBM. + + * There is an assembler bug in versions of DG/UX prior to 5.4.2.01 + that occurs when the `fldcr' instruction is used. GCC uses + `fldcr' on the 88100 to serialize volatile memory references. Use + the option `-mno-serialize-volatile' if your version of the + assembler has this bug. + + * On VMS, GAS versions 1.38.1 and earlier may cause spurious warning + messages from the linker. These warning messages complain of + mismatched psect attributes. You can ignore them. *Note VMS + Install::. + + * On NewsOS version 3, if you include both of the files `stddef.h' + and `sys/types.h', you get an error because there are two typedefs + of `size_t'. You should change `sys/types.h' by adding these + lines around the definition of `size_t': + + #ifndef _SIZE_T + #define _SIZE_T + ACTUAL TYPEDEF HERE + #endif + + * On the Alliant, the system's own convention for returning + structures and unions is unusual, and is not compatible with GCC + no matter what options are used. + + * On the IBM RT PC, the MetaWare HighC compiler (hc) uses a different + convention for structure and union returning. Use the option + `-mhc-struct-return' to tell GCC to use a convention compatible + with it. + + * On Ultrix, the Fortran compiler expects registers 2 through 5 to + be saved by function calls. However, the C compiler uses + conventions compatible with BSD Unix: registers 2 through 5 may be + clobbered by function calls. + + GCC uses the same convention as the Ultrix C compiler. You can use + these options to produce code compatible with the Fortran compiler: + + -fcall-saved-r2 -fcall-saved-r3 -fcall-saved-r4 -fcall-saved-r5 + + * On the WE32k, you may find that programs compiled with GCC do not + work with the standard shared C library. You may need to link with + the ordinary C compiler. If you do so, you must specify the + following options: + + -L/usr/local/lib/gcc-lib/we32k-att-sysv/2.8.1 -lgcc -lc_s + + The first specifies where to find the library `libgcc.a' specified + with the `-lgcc' option. + + GCC does linking by invoking `ld', just as `cc' does, and there is + no reason why it *should* matter which compilation program you use + to invoke `ld'. If someone tracks this problem down, it can + probably be fixed easily. + + * On the Alpha, you may get assembler errors about invalid syntax as + a result of floating point constants. This is due to a bug in the + C library functions `ecvt', `fcvt' and `gcvt'. Given valid + floating point numbers, they sometimes print `NaN'. + + * On Irix 4.0.5F (and perhaps in some other versions), an assembler + bug sometimes reorders instructions incorrectly when optimization + is turned on. If you think this may be happening to you, try + using the GNU assembler; GAS version 2.1 supports ECOFF on Irix. + + Or use the `-noasmopt' option when you compile GCC with itself, + and then again when you compile your program. (This is a temporary + kludge to turn off assembler optimization on Irix.) If this + proves to be what you need, edit the assembler spec in the file + `specs' so that it unconditionally passes `-O0' to the assembler, + and never passes `-O2' or `-O3'. + + +File: gcc.info, Node: External Bugs, Next: Incompatibilities, Prev: Interoperation, Up: Trouble + +Problems Compiling Certain Programs +=================================== + + Certain programs have problems compiling. + + * Parse errors may occur compiling X11 on a Decstation running + Ultrix 4.2 because of problems in DEC's versions of the X11 header + files `X11/Xlib.h' and `X11/Xutil.h'. People recommend adding + `-I/usr/include/mit' to use the MIT versions of the header files, + using the `-traditional' switch to turn off ANSI C, or fixing the + header files by adding this: + + #ifdef __STDC__ + #define NeedFunctionPrototypes 0 + #endif + + * If you have trouble compiling Perl on a SunOS 4 system, it may be + because Perl specifies `-I/usr/ucbinclude'. This accesses the + unfixed header files. Perl specifies the options + + -traditional -Dvolatile=__volatile__ + -I/usr/include/sun -I/usr/ucbinclude + -fpcc-struct-return + + most of which are unnecessary with GCC 2.4.5 and newer versions. + You can make a properly working Perl by setting `ccflags' to + `-fwritable-strings' (implied by the `-traditional' in the + original options) and `cppflags' to empty in `config.sh', then + typing `./doSH; make depend; make'. + + * On various 386 Unix systems derived from System V, including SCO, + ISC, and ESIX, you may get error messages about running out of + virtual memory while compiling certain programs. + + You can prevent this problem by linking GCC with the GNU malloc + (which thus replaces the malloc that comes with the system). GNU + malloc is available as a separate package, and also in the file + `src/gmalloc.c' in the GNU Emacs 19 distribution. + + If you have installed GNU malloc as a separate library package, + use this option when you relink GCC: + + MALLOC=/usr/local/lib/libgmalloc.a + + Alternatively, if you have compiled `gmalloc.c' from Emacs 19, copy + the object file to `gmalloc.o' and use this option when you relink + GCC: + + MALLOC=gmalloc.o + + +File: gcc.info, Node: Incompatibilities, Next: Fixed Headers, Prev: External Bugs, Up: Trouble + +Incompatibilities of GCC +======================== + + There are several noteworthy incompatibilities between GNU C and most +existing (non-ANSI) versions of C. The `-traditional' option +eliminates many of these incompatibilities, *but not all*, by telling +GNU C to behave like the other C compilers. + + * GCC normally makes string constants read-only. If several + identical-looking string constants are used, GCC stores only one + copy of the string. + + One consequence is that you cannot call `mktemp' with a string + constant argument. The function `mktemp' always alters the string + its argument points to. + + Another consequence is that `sscanf' does not work on some systems + when passed a string constant as its format control string or + input. This is because `sscanf' incorrectly tries to write into + the string constant. Likewise `fscanf' and `scanf'. + + The best solution to these problems is to change the program to use + `char'-array variables with initialization strings for these + purposes instead of string constants. But if this is not possible, + you can use the `-fwritable-strings' flag, which directs GCC to + handle string constants the same way most C compilers do. + `-traditional' also has this effect, among others. + + * `-2147483648' is positive. + + This is because 2147483648 cannot fit in the type `int', so + (following the ANSI C rules) its data type is `unsigned long int'. + Negating this value yields 2147483648 again. + + * GCC does not substitute macro arguments when they appear inside of + string constants. For example, the following macro in GCC + + #define foo(a) "a" + + will produce output `"a"' regardless of what the argument A is. + + The `-traditional' option directs GCC to handle such cases (among + others) in the old-fashioned (non-ANSI) fashion. + + * When you use `setjmp' and `longjmp', the only automatic variables + guaranteed to remain valid are those declared `volatile'. This is + a consequence of automatic register allocation. Consider this + function: + + jmp_buf j; + + foo () + { + int a, b; + + a = fun1 (); + if (setjmp (j)) + return a; + + a = fun2 (); + /* `longjmp (j)' may occur in `fun3'. */ + return a + fun3 (); + } + + Here `a' may or may not be restored to its first value when the + `longjmp' occurs. If `a' is allocated in a register, then its + first value is restored; otherwise, it keeps the last value stored + in it. + + If you use the `-W' option with the `-O' option, you will get a + warning when GCC thinks such a problem might be possible. + + The `-traditional' option directs GNU C to put variables in the + stack by default, rather than in registers, in functions that call + `setjmp'. This results in the behavior found in traditional C + compilers. + + * Programs that use preprocessing directives in the middle of macro + arguments do not work with GCC. For example, a program like this + will not work: + + foobar ( + #define luser + hack) + + ANSI C does not permit such a construct. It would make sense to + support it when `-traditional' is used, but it is too much work to + implement. + + * Declarations of external variables and functions within a block + apply only to the block containing the declaration. In other + words, they have the same scope as any other declaration in the + same place. + + In some other C compilers, a `extern' declaration affects all the + rest of the file even if it happens within a block. + + The `-traditional' option directs GNU C to treat all `extern' + declarations as global, like traditional compilers. + + * In traditional C, you can combine `long', etc., with a typedef + name, as shown here: + + typedef int foo; + typedef long foo bar; + + In ANSI C, this is not allowed: `long' and other type modifiers + require an explicit `int'. Because this criterion is expressed by + Bison grammar rules rather than C code, the `-traditional' flag + cannot alter it. + + * PCC allows typedef names to be used as function parameters. The + difficulty described immediately above applies here too. + + * PCC allows whitespace in the middle of compound assignment + operators such as `+='. GCC, following the ANSI standard, does not + allow this. The difficulty described immediately above applies + here too. + + * GCC complains about unterminated character constants inside of + preprocessing conditionals that fail. Some programs have English + comments enclosed in conditionals that are guaranteed to fail; if + these comments contain apostrophes, GCC will probably report an + error. For example, this code would produce an error: + + #if 0 + You can't expect this to work. + #endif + + The best solution to such a problem is to put the text into an + actual C comment delimited by `/*...*/'. However, `-traditional' + suppresses these error messages. + + * Many user programs contain the declaration `long time ();'. In the + past, the system header files on many systems did not actually + declare `time', so it did not matter what type your program + declared it to return. But in systems with ANSI C headers, `time' + is declared to return `time_t', and if that is not the same as + `long', then `long time ();' is erroneous. + + The solution is to change your program to use `time_t' as the + return type of `time'. + + * When compiling functions that return `float', PCC converts it to a + double. GCC actually returns a `float'. If you are concerned + with PCC compatibility, you should declare your functions to return + `double'; you might as well say what you mean. + + * When compiling functions that return structures or unions, GCC + output code normally uses a method different from that used on most + versions of Unix. As a result, code compiled with GCC cannot call + a structure-returning function compiled with PCC, and vice versa. + + The method used by GCC is as follows: a structure or union which is + 1, 2, 4 or 8 bytes long is returned like a scalar. A structure or + union with any other size is stored into an address supplied by + the caller (usually in a special, fixed register, but on some + machines it is passed on the stack). The machine-description + macros `STRUCT_VALUE' and `STRUCT_INCOMING_VALUE' tell GCC where + to pass this address. + + By contrast, PCC on most target machines returns structures and + unions of any size by copying the data into an area of static + storage, and then returning the address of that storage as if it + were a pointer value. The caller must copy the data from that + memory area to the place where the value is wanted. GCC does not + use this method because it is slower and nonreentrant. + + On some newer machines, PCC uses a reentrant convention for all + structure and union returning. GCC on most of these machines uses + a compatible convention when returning structures and unions in + memory, but still returns small structures and unions in registers. + + You can tell GCC to use a compatible convention for all structure + and union returning with the option `-fpcc-struct-return'. + + * GNU C complains about program fragments such as `0x74ae-0x4000' + which appear to be two hexadecimal constants separated by the minus + operator. Actually, this string is a single "preprocessing token". + Each such token must correspond to one token in C. Since this + does not, GNU C prints an error message. Although it may appear + obvious that what is meant is an operator and two values, the ANSI + C standard specifically requires that this be treated as erroneous. + + A "preprocessing token" is a "preprocessing number" if it begins + with a digit and is followed by letters, underscores, digits, + periods and `e+', `e-', `E+', or `E-' character sequences. + + To make the above program fragment valid, place whitespace in + front of the minus sign. This whitespace will end the + preprocessing number. + + +File: gcc.info, Node: Fixed Headers, Next: Standard Libraries, Prev: Incompatibilities, Up: Trouble + +Fixed Header Files +================== + + GCC needs to install corrected versions of some system header files. +This is because most target systems have some header files that won't +work with GCC unless they are changed. Some have bugs, some are +incompatible with ANSI C, and some depend on special features of other +compilers. + + Installing GCC automatically creates and installs the fixed header +files, by running a program called `fixincludes' (or for certain +targets an alternative such as `fixinc.svr4'). Normally, you don't +need to pay attention to this. But there are cases where it doesn't do +the right thing automatically. + + * If you update the system's header files, such as by installing a + new system version, the fixed header files of GCC are not + automatically updated. The easiest way to update them is to + reinstall GCC. (If you want to be clever, look in the makefile + and you can find a shortcut.) + + * On some systems, in particular SunOS 4, header file directories + contain machine-specific symbolic links in certain places. This + makes it possible to share most of the header files among hosts + running the same version of SunOS 4 on different machine models. + + The programs that fix the header files do not understand this + special way of using symbolic links; therefore, the directory of + fixed header files is good only for the machine model used to + build it. + + In SunOS 4, only programs that look inside the kernel will notice + the difference between machine models. Therefore, for most + purposes, you need not be concerned about this. + + It is possible to make separate sets of fixed header files for the + different machine models, and arrange a structure of symbolic + links so as to use the proper set, but you'll have to do this by + hand. + + * On Lynxos, GCC by default does not fix the header files. This is + because bugs in the shell cause the `fixincludes' script to fail. + + This means you will encounter problems due to bugs in the system + header files. It may be no comfort that they aren't GCC's fault, + but it does mean that there's nothing for us to do about them. + + +File: gcc.info, Node: Standard Libraries, Next: Disappointments, Prev: Fixed Headers, Up: Trouble + +Standard Libraries +================== + + GCC by itself attempts to be what the ISO/ANSI C standard calls a +"conforming freestanding implementation". This means all ANSI C +language features are available, as well as the contents of `float.h', +`limits.h', `stdarg.h', and `stddef.h'. The rest of the C library is +supplied by the vendor of the operating system. If that C library +doesn't conform to the C standards, then your programs might get +warnings (especially when using `-Wall') that you don't expect. + + For example, the `sprintf' function on SunOS 4.1.3 returns `char *' +while the C standard says that `sprintf' returns an `int'. The +`fixincludes' program could make the prototype for this function match +the Standard, but that would be wrong, since the function will still +return `char *'. + + If you need a Standard compliant library, then you need to find one, +as GCC does not provide one. The GNU C library (called `glibc') has +been ported to a number of operating systems, and provides ANSI/ISO, +POSIX, BSD and SystemV compatibility. You could also ask your operating +system vendor if newer libraries are available. + + +File: gcc.info, Node: Disappointments, Next: C++ Misunderstandings, Prev: Standard Libraries, Up: Trouble + +Disappointments and Misunderstandings +===================================== + + These problems are perhaps regrettable, but we don't know any +practical way around them. + + * Certain local variables aren't recognized by debuggers when you + compile with optimization. + + This occurs because sometimes GCC optimizes the variable out of + existence. There is no way to tell the debugger how to compute the + value such a variable "would have had", and it is not clear that + would be desirable anyway. So GCC simply does not mention the + eliminated variable when it writes debugging information. + + You have to expect a certain amount of disagreement between the + executable and your source code, when you use optimization. + + * Users often think it is a bug when GCC reports an error for code + like this: + + int foo (struct mumble *); + + struct mumble { ... }; + + int foo (struct mumble *x) + { ... } + + This code really is erroneous, because the scope of `struct + mumble' in the prototype is limited to the argument list + containing it. It does not refer to the `struct mumble' defined + with file scope immediately below--they are two unrelated types + with similar names in different scopes. + + But in the definition of `foo', the file-scope type is used + because that is available to be inherited. Thus, the definition + and the prototype do not match, and you get an error. + + This behavior may seem silly, but it's what the ANSI standard + specifies. It is easy enough for you to make your code work by + moving the definition of `struct mumble' above the prototype. + It's not worth being incompatible with ANSI C just to avoid an + error for the example shown above. + + * Accesses to bitfields even in volatile objects works by accessing + larger objects, such as a byte or a word. You cannot rely on what + size of object is accessed in order to read or write the bitfield; + it may even vary for a given bitfield according to the precise + usage. + + If you care about controlling the amount of memory that is + accessed, use volatile but do not use bitfields. + + * GCC comes with shell scripts to fix certain known problems in + system header files. They install corrected copies of various + header files in a special directory where only GCC will normally + look for them. The scripts adapt to various systems by searching + all the system header files for the problem cases that we know + about. + + If new system header files are installed, nothing automatically + arranges to update the corrected header files. You will have to + reinstall GCC to fix the new header files. More specifically, go + to the build directory and delete the files `stmp-fixinc' and + `stmp-headers', and the subdirectory `include'; then do `make + install' again. + + * On 68000 and x86 systems, for instance, you can get paradoxical + results if you test the precise values of floating point numbers. + For example, you can find that a floating point value which is not + a NaN is not equal to itself. This results from the fact that the + floating point registers hold a few more bits of precision than + fit in a `double' in memory. Compiled code moves values between + memory and floating point registers at its convenience, and moving + them into memory truncates them. + + You can partially avoid this problem by using the `-ffloat-store' + option (*note Optimize Options::.). + + * On the MIPS, variable argument functions using `varargs.h' cannot + have a floating point value for the first argument. The reason + for this is that in the absence of a prototype in scope, if the + first argument is a floating point, it is passed in a floating + point register, rather than an integer register. + + If the code is rewritten to use the ANSI standard `stdarg.h' + method of variable arguments, and the prototype is in scope at the + time of the call, everything will work fine. + + * On the H8/300 and H8/300H, variable argument functions must be + implemented using the ANSI standard `stdarg.h' method of variable + arguments. Furthermore, calls to functions using `stdarg.h' + variable arguments must have a prototype for the called function + in scope at the time of the call. + + +File: gcc.info, Node: C++ Misunderstandings, Next: Protoize Caveats, Prev: Disappointments, Up: Trouble + +Common Misunderstandings with GNU C++ +===================================== + + C++ is a complex language and an evolving one, and its standard +definition (the ISO C++ standard) was only recently completed. As a +result, your C++ compiler may occasionally surprise you, even when its +behavior is correct. This section discusses some areas that frequently +give rise to questions of this sort. + +* Menu: + +* Static Definitions:: Static member declarations are not definitions +* Temporaries:: Temporaries may vanish before you expect +* Copy Assignment:: Copy Assignment operators copy virtual bases twice + + +File: gcc.info, Node: Static Definitions, Next: Temporaries, Up: C++ Misunderstandings + +Declare *and* Define Static Members +----------------------------------- + + When a class has static data members, it is not enough to *declare* +the static member; you must also *define* it. For example: + + class Foo + { + ... + void method(); + static int bar; + }; + + This declaration only establishes that the class `Foo' has an `int' +named `Foo::bar', and a member function named `Foo::method'. But you +still need to define *both* `method' and `bar' elsewhere. According to +the draft ANSI standard, you must supply an initializer in one (and +only one) source file, such as: + + int Foo::bar = 0; + + Other C++ compilers may not correctly implement the standard +behavior. As a result, when you switch to `g++' from one of these +compilers, you may discover that a program that appeared to work +correctly in fact does not conform to the standard: `g++' reports as +undefined symbols any static data members that lack definitions. + diff --git a/usr/local/nachos/info/gcc.info-14 b/usr/local/nachos/info/gcc.info-14 new file mode 100644 index 0000000..8d863e6 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-14 @@ -0,0 +1,1089 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Temporaries, Next: Copy Assignment, Prev: Static Definitions, Up: C++ Misunderstandings + +Temporaries May Vanish Before You Expect +---------------------------------------- + + It is dangerous to use pointers or references to *portions* of a +temporary object. The compiler may very well delete the object before +you expect it to, leaving a pointer to garbage. The most common place +where this problem crops up is in classes like string classes, +especially ones that define a conversion function to type `char *' or +`const char *' - which is one reason why the standard `string' class +requires you to call the `c_str' member function. However, any class +that returns a pointer to some internal structure is potentially +subject to this problem. + + For example, a program may use a function `strfunc' that returns +`string' objects, and another function `charfunc' that operates on +pointers to `char': + + string strfunc (); + void charfunc (const char *); + + void + f () + { + const char *p = strfunc().c_str(); + ... + charfunc (p); + ... + charfunc (p); + } + +In this situation, it may seem reasonable to save a pointer to the C +string returned by the `c_str' member function and use that rather than +call `c_str' repeatedly. However, the temporary string created by the +call to `strfunc' is destroyed after `p' is initialized, at which point +`p' is left pointing to freed memory. + + Code like this may run successfully under some other compilers, +particularly obsolete cfront-based compilers that delete temporaries +along with normal local variables. However, the GNU C++ behavior is +standard-conforming, so if your program depends on late destruction of +temporaries it is not portable. + + The safe way to write such code is to give the temporary a name, +which forces it to remain until the end of the scope of the name. For +example: + + string& tmp = strfunc (); + charfunc (tmp.c_str ()); + + +File: gcc.info, Node: Copy Assignment, Prev: Temporaries, Up: C++ Misunderstandings + +Implicit Copy-Assignment for Virtual Bases +------------------------------------------ + + When a base class is virtual, only one subobject of the base class +belongs to each full object. Also, the constructors and destructors are +invoked only once, and called from the most-derived class. However, such +objects behave unspecified when being assigned. For example: + + struct Base{ + char *name; + Base(char *n) : name(strdup(n)){} + Base& operator= (const Base& other){ + free (name); + name = strdup (other.name); + } + }; + + struct A:virtual Base{ + int val; + A():Base("A"){} + }; + + struct B:virtual Base{ + int bval; + B():Base("B"){} + }; + + struct Derived:public A, public B{ + Derived():Base("Derived"){} + }; + + void func(Derived &d1, Derived &d2) + { + d1 = d2; + } + + The C++ standard specifies that `Base::Base' is only called once +when constructing or copy-constructing a Derived object. It is +unspecified whether `Base::operator=' is called more than once when the +implicit copy-assignment for Derived objects is invoked (as it is +inside `func' in the example). + + g++ implements the "intuitive" algorithm for copy-assignment: assign +all direct bases, then assign all members. In that algorithm, the +virtual base subobject can be encountered many times. In the example, +copying proceeds in the following order: `val', `name' (via `strdup'), +`bval', and `name' again. + + If application code relies on copy-assignment, a user-defined +copy-assignment operator removes any uncertainties. With such an +operator, the application can define whether and how the virtual base +subobject is assigned. + + +File: gcc.info, Node: Protoize Caveats, Next: Non-bugs, Prev: C++ Misunderstandings, Up: Trouble + +Caveats of using `protoize' +=========================== + + The conversion programs `protoize' and `unprotoize' can sometimes +change a source file in a way that won't work unless you rearrange it. + + * `protoize' can insert references to a type name or type tag before + the definition, or in a file where they are not defined. + + If this happens, compiler error messages should show you where the + new references are, so fixing the file by hand is straightforward. + + * There are some C constructs which `protoize' cannot figure out. + For example, it can't determine argument types for declaring a + pointer-to-function variable; this you must do by hand. `protoize' + inserts a comment containing `???' each time it finds such a + variable; so you can find all such variables by searching for this + string. ANSI C does not require declaring the argument types of + pointer-to-function types. + + * Using `unprotoize' can easily introduce bugs. If the program + relied on prototypes to bring about conversion of arguments, these + conversions will not take place in the program without prototypes. + One case in which you can be sure `unprotoize' is safe is when you + are removing prototypes that were made with `protoize'; if the + program worked before without any prototypes, it will work again + without them. + + You can find all the places where this problem might occur by + compiling the program with the `-Wconversion' option. It prints a + warning whenever an argument is converted. + + * Both conversion programs can be confused if there are macro calls + in and around the text to be converted. In other words, the + standard syntax for a declaration or definition must not result + from expanding a macro. This problem is inherent in the design of + C and cannot be fixed. If only a few functions have confusing + macro calls, you can easily convert them manually. + + * `protoize' cannot get the argument types for a function whose + definition was not actually compiled due to preprocessing + conditionals. When this happens, `protoize' changes nothing in + regard to such a function. `protoize' tries to detect such + instances and warn about them. + + You can generally work around this problem by using `protoize' step + by step, each time specifying a different set of `-D' options for + compilation, until all of the functions have been converted. + There is no automatic way to verify that you have got them all, + however. + + * Confusion may result if there is an occasion to convert a function + declaration or definition in a region of source code where there + is more than one formal parameter list present. Thus, attempts to + convert code containing multiple (conditionally compiled) versions + of a single function header (in the same vicinity) may not produce + the desired (or expected) results. + + If you plan on converting source files which contain such code, it + is recommended that you first make sure that each conditionally + compiled region of source code which contains an alternative + function header also contains at least one additional follower + token (past the final right parenthesis of the function header). + This should circumvent the problem. + + * `unprotoize' can become confused when trying to convert a function + definition or declaration which contains a declaration for a + pointer-to-function formal argument which has the same name as the + function being defined or declared. We recommand you avoid such + choices of formal parameter names. + + * You might also want to correct some of the indentation by hand and + break long lines. (The conversion programs don't write lines + longer than eighty characters in any case.) + + +File: gcc.info, Node: Non-bugs, Next: Warnings and Errors, Prev: Protoize Caveats, Up: Trouble + +Certain Changes We Don't Want to Make +===================================== + + This section lists changes that people frequently request, but which +we do not make because we think GCC is better without them. + + * Checking the number and type of arguments to a function which has + an old-fashioned definition and no prototype. + + Such a feature would work only occasionally--only for calls that + appear in the same file as the called function, following the + definition. The only way to check all calls reliably is to add a + prototype for the function. But adding a prototype eliminates the + motivation for this feature. So the feature is not worthwhile. + + * Warning about using an expression whose type is signed as a shift + count. + + Shift count operands are probably signed more often than unsigned. + Warning about this would cause far more annoyance than good. + + * Warning about assigning a signed value to an unsigned variable. + + Such assignments must be very common; warning about them would + cause more annoyance than good. + + * Warning about unreachable code. + + It's very common to have unreachable code in machine-generated + programs. For example, this happens normally in some files of GNU + C itself. + + * Warning when a non-void function value is ignored. + + Coming as I do from a Lisp background, I balk at the idea that + there is something dangerous about discarding a value. There are + functions that return values which some callers may find useful; + it makes no sense to clutter the program with a cast to `void' + whenever the value isn't useful. + + * Assuming (for optimization) that the address of an external symbol + is never zero. + + This assumption is false on certain systems when `#pragma weak' is + used. + + * Making `-fshort-enums' the default. + + This would cause storage layout to be incompatible with most other + C compilers. And it doesn't seem very important, given that you + can get the same result in other ways. The case where it matters + most is when the enumeration-valued object is inside a structure, + and in that case you can specify a field width explicitly. + + * Making bitfields unsigned by default on particular machines where + "the ABI standard" says to do so. + + The ANSI C standard leaves it up to the implementation whether a + bitfield declared plain `int' is signed or not. This in effect + creates two alternative dialects of C. + + The GNU C compiler supports both dialects; you can specify the + signed dialect with `-fsigned-bitfields' and the unsigned dialect + with `-funsigned-bitfields'. However, this leaves open the + question of which dialect to use by default. + + Currently, the preferred dialect makes plain bitfields signed, + because this is simplest. Since `int' is the same as `signed int' + in every other context, it is cleanest for them to be the same in + bitfields as well. + + Some computer manufacturers have published Application Binary + Interface standards which specify that plain bitfields should be + unsigned. It is a mistake, however, to say anything about this + issue in an ABI. This is because the handling of plain bitfields + distinguishes two dialects of C. Both dialects are meaningful on + every type of machine. Whether a particular object file was + compiled using signed bitfields or unsigned is of no concern to + other object files, even if they access the same bitfields in the + same data structures. + + A given program is written in one or the other of these two + dialects. The program stands a chance to work on most any machine + if it is compiled with the proper dialect. It is unlikely to work + at all if compiled with the wrong dialect. + + Many users appreciate the GNU C compiler because it provides an + environment that is uniform across machines. These users would be + inconvenienced if the compiler treated plain bitfields differently + on certain machines. + + Occasionally users write programs intended only for a particular + machine type. On these occasions, the users would benefit if the + GNU C compiler were to support by default the same dialect as the + other compilers on that machine. But such applications are rare. + And users writing a program to run on more than one type of + machine cannot possibly benefit from this kind of compatibility. + + This is why GCC does and will treat plain bitfields in the same + fashion on all types of machines (by default). + + There are some arguments for making bitfields unsigned by default + on all machines. If, for example, this becomes a universal de + facto standard, it would make sense for GCC to go along with it. + This is something to be considered in the future. + + (Of course, users strongly concerned about portability should + indicate explicitly in each bitfield whether it is signed or not. + In this way, they write programs which have the same meaning in + both C dialects.) + + * Undefining `__STDC__' when `-ansi' is not used. + + Currently, GCC defines `__STDC__' as long as you don't use + `-traditional'. This provides good results in practice. + + Programmers normally use conditionals on `__STDC__' to ask whether + it is safe to use certain features of ANSI C, such as function + prototypes or ANSI token concatenation. Since plain `gcc' supports + all the features of ANSI C, the correct answer to these questions + is "yes". + + Some users try to use `__STDC__' to check for the availability of + certain library facilities. This is actually incorrect usage in + an ANSI C program, because the ANSI C standard says that a + conforming freestanding implementation should define `__STDC__' + even though it does not have the library facilities. `gcc -ansi + -pedantic' is a conforming freestanding implementation, and it is + therefore required to define `__STDC__', even though it does not + come with an ANSI C library. + + Sometimes people say that defining `__STDC__' in a compiler that + does not completely conform to the ANSI C standard somehow + violates the standard. This is illogical. The standard is a + standard for compilers that claim to support ANSI C, such as `gcc + -ansi'--not for other compilers such as plain `gcc'. Whatever the + ANSI C standard says is relevant to the design of plain `gcc' + without `-ansi' only for pragmatic reasons, not as a requirement. + + GCC normally defines `__STDC__' to be 1, and in addition defines + `__STRICT_ANSI__' if you specify the `-ansi' option. On some + hosts, system include files use a different convention, where + `__STDC__' is normally 0, but is 1 if the user specifies strict + conformance to the C Standard. GCC follows the host convention + when processing system include files, but when processing user + files it follows the usual GNU C convention. + + * Undefining `__STDC__' in C++. + + Programs written to compile with C++-to-C translators get the + value of `__STDC__' that goes with the C compiler that is + subsequently used. These programs must test `__STDC__' to + determine what kind of C preprocessor that compiler uses: whether + they should concatenate tokens in the ANSI C fashion or in the + traditional fashion. + + These programs work properly with GNU C++ if `__STDC__' is defined. + They would not work otherwise. + + In addition, many header files are written to provide prototypes + in ANSI C but not in traditional C. Many of these header files + can work without change in C++ provided `__STDC__' is defined. If + `__STDC__' is not defined, they will all fail, and will all need + to be changed to test explicitly for C++ as well. + + * Deleting "empty" loops. + + Historically, GCC has not deleted "empty" loops under the + assumption that the most likely reason you would put one in a + program is to have a delay, so deleting them will not make real + programs run any faster. + + However, the rationale here is that optimization of a nonempty loop + cannot produce an empty one, which holds for C but is not always + the case for C++. + + Moreover, with `-funroll-loops' small "empty" loops are already + removed, so the current behavior is both sub-optimal and + inconsistent and will change in the future. + + * Making side effects happen in the same order as in some other + compiler. + + It is never safe to depend on the order of evaluation of side + effects. For example, a function call like this may very well + behave differently from one compiler to another: + + void func (int, int); + + int i = 2; + func (i++, i++); + + There is no guarantee (in either the C or the C++ standard language + definitions) that the increments will be evaluated in any + particular order. Either increment might happen first. `func' + might get the arguments `2, 3', or it might get `3, 2', or even + `2, 2'. + + * Not allowing structures with volatile fields in registers. + + Strictly speaking, there is no prohibition in the ANSI C standard + against allowing structures with volatile fields in registers, but + it does not seem to make any sense and is probably not what you + wanted to do. So the compiler will give an error message in this + case. + + +File: gcc.info, Node: Warnings and Errors, Prev: Non-bugs, Up: Trouble + +Warning Messages and Error Messages +=================================== + + The GNU compiler can produce two kinds of diagnostics: errors and +warnings. Each kind has a different purpose: + + *Errors* report problems that make it impossible to compile your + program. GCC reports errors with the source file name and line + number where the problem is apparent. + + *Warnings* report other unusual conditions in your code that *may* + indicate a problem, although compilation can (and does) proceed. + Warning messages also report the source file name and line number, + but include the text `warning:' to distinguish them from error + messages. + + Warnings may indicate danger points where you should check to make +sure that your program really does what you intend; or the use of +obsolete features; or the use of nonstandard features of GNU C or C++. +Many warnings are issued only if you ask for them, with one of the `-W' +options (for instance, `-Wall' requests a variety of useful warnings). + + GCC always tries to compile your program if possible; it never +gratuitously rejects a program whose meaning is clear merely because +(for instance) it fails to conform to a standard. In some cases, +however, the C and C++ standards specify that certain extensions are +forbidden, and a diagnostic *must* be issued by a conforming compiler. +The `-pedantic' option tells GCC to issue warnings in such cases; +`-pedantic-errors' says to make them errors instead. This does not +mean that *all* non-ANSI constructs get warnings or errors. + + *Note Options to Request or Suppress Warnings: Warning Options, for +more detail on these and related command-line options. + + +File: gcc.info, Node: Bugs, Next: Service, Prev: Trouble, Up: Top + +Reporting Bugs +************** + + Your bug reports play an essential role in making GCC reliable. + + When you encounter a problem, the first thing to do is to see if it +is already known. *Note Trouble::. If it isn't known, then you should +report the problem. + + Reporting a bug may help you by bringing a solution to your problem, +or it may not. (If it does not, look in the service directory; see +*Note Service::.) In any case, the principal function of a bug report +is to help the entire community by making the next version of GCC work +better. Bug reports are your contribution to the maintenance of GCC. + + Since the maintainers are very overloaded, we cannot respond to every +bug report. However, if the bug has not been fixed, we are likely to +send you a patch and ask you to tell us whether it works. + + In order for a bug report to serve its purpose, you must include the +information that makes for fixing the bug. + +* Menu: + +* Criteria: Bug Criteria. Have you really found a bug? +* Where: Bug Lists. Where to send your bug report. +* Reporting: Bug Reporting. How to report a bug effectively. +* Patches: Sending Patches. How to send a patch for GCC. +* Known: Trouble. Known problems. +* Help: Service. Where to ask for help. + + +File: gcc.info, Node: Bug Criteria, Next: Bug Lists, Up: Bugs + +Have You Found a Bug? +===================== + + If you are not sure whether you have found a bug, here are some +guidelines: + + * If the compiler gets a fatal signal, for any input whatever, that + is a compiler bug. Reliable compilers never crash. + + * If the compiler produces invalid assembly code, for any input + whatever (except an `asm' statement), that is a compiler bug, + unless the compiler reports errors (not just warnings) which would + ordinarily prevent the assembler from being run. + + * If the compiler produces valid assembly code that does not + correctly execute the input source code, that is a compiler bug. + + However, you must double-check to make sure, because you may have + run into an incompatibility between GNU C and traditional C (*note + Incompatibilities::.). These incompatibilities might be considered + bugs, but they are inescapable consequences of valuable features. + + Or you may have a program whose behavior is undefined, which + happened by chance to give the desired results with another C or + C++ compiler. + + For example, in many nonoptimizing compilers, you can write `x;' + at the end of a function instead of `return x;', with the same + results. But the value of the function is undefined if `return' + is omitted; it is not a bug when GCC produces different results. + + Problems often result from expressions with two increment + operators, as in `f (*p++, *p++)'. Your previous compiler might + have interpreted that expression the way you intended; GCC might + interpret it another way. Neither compiler is wrong. The bug is + in your code. + + After you have localized the error to a single source line, it + should be easy to check for these things. If your program is + correct and well defined, you have found a compiler bug. + + * If the compiler produces an error message for valid input, that is + a compiler bug. + + * If the compiler does not produce an error message for invalid + input, that is a compiler bug. However, you should note that your + idea of "invalid input" might be my idea of "an extension" or + "support for traditional practice". + + * If you are an experienced user of C or C++ (or Fortran or + Objective-C) compilers, your suggestions for improvement of GCC + are welcome in any case. + + +File: gcc.info, Node: Bug Lists, Next: Bug Reporting, Prev: Bug Criteria, Up: Bugs + +Where to Report Bugs +==================== + + Send bug reports for the GNU Compiler Collection to +`gcc-bugs@gcc.gnu.org'. In accordance with the GNU-wide convention, in +which bug reports for tool "foo" are sent to `bug-foo@gnu.org', the +address `bug-gcc@gnu.org' may also be used; it will forward to the +address given above. + + Please read +`' for bug +reporting instructions before you post a bug report. + + Often people think of posting bug reports to the newsgroup instead of +mailing them. This appears to work, but it has one problem which can be +crucial: a newsgroup posting does not contain a mail path back to the +sender. Thus, if maintainers need more information, they may be unable +to reach you. For this reason, you should always send bug reports by +mail to the proper mailing list. + + As a last resort, send bug reports on paper to: + + GNU Compiler Bugs + Free Software Foundation + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA + + +File: gcc.info, Node: Bug Reporting, Next: Sending Patches, Prev: Bug Lists, Up: Bugs + +How to Report Bugs +================== + + You may find additional and/or more up-to-date instructions at +`'. + + The fundamental principle of reporting bugs usefully is this: +*report all the facts*. If you are not sure whether to state a fact or +leave it out, state it! + + Often people omit facts because they think they know what causes the +problem and they conclude that some details don't matter. Thus, you +might assume that the name of the variable you use in an example does +not matter. Well, probably it doesn't, but one cannot be sure. +Perhaps the bug is a stray memory reference which happens to fetch from +the location where that name is stored in memory; perhaps, if the name +were different, the contents of that location would fool the compiler +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 someone to +fix the bug if it is not known. It isn't very important what happens if +the bug is already known. Therefore, always write your bug reports on +the assumption that the bug is not known. + + Sometimes people give a few sketchy facts and ask, "Does this ring a +bell?" This cannot help us fix a bug, so it is basically useless. We +respond by asking for enough details to enable us to investigate. You +might as well expedite matters by sending them to begin with. + + Try to make your bug report self-contained. If we have to ask you +for more information, it is best if you include all the previous +information in your response, as well as the information that was +missing. + + Please report each bug in a separate message. This makes it easier +for us to track which bugs have been fixed and to forward your bugs +reports to the appropriate maintainer. + + To enable someone to investigate the bug, you should include all +these things: + + * The version of GCC. You can get this by running it with the `-v' + option. + + Without this, we won't know whether there is any point in looking + for the bug in the current version of GCC. + + * A complete input file that will reproduce the bug. If the bug is + in the C preprocessor, send a source file and any header files + that it requires. If the bug is in the compiler proper (`cc1'), + send the preprocessor output generated by adding `-save-temps' to + the compilation command (*note Debugging Options::.). When you do + this, use the same `-I', `-D' or `-U' options that you used in + actual compilation. Then send the INPUT.i or INPUT.ii files + generated. + + A single statement is not enough of an example. In order to + compile it, it must be embedded in a complete file of compiler + input; and the bug might depend on the details of how this is done. + + Without a real example one can compile, all anyone can do about + your bug report is wish you luck. It would be futile to try to + guess how to provoke the bug. For example, bugs in register + allocation and reloading frequently depend on every little detail + of the function they happen in. + + Even if the input file that fails comes from a GNU program, you + should still send the complete test case. Don't ask the GCC + maintainers to do the extra work of obtaining the program in + question--they are all overworked as it is. Also, the problem may + depend on what is in the header files on your system; it is + unreliable for the GCC maintainers to try the problem with the + header files available to them. By sending CPP output, you can + eliminate this source of uncertainty and save us a certain + percentage of wild goose chases. + + * The command arguments you gave GCC to compile that example and + observe the bug. For example, did you use `-O'? To guarantee you + won't omit something important, list all the options. + + If we were to try to guess the arguments, we would probably guess + wrong and then we would not encounter the bug. + + * The type of machine you are using, and the operating system name + and version number. + + * The operands you gave to the `configure' command when you installed + the compiler. + + * A complete list of any modifications you have made to the compiler + source. (We don't promise to investigate the bug unless it + happens in an unmodified compiler. But if you've made + modifications and don't tell us, then you are sending us on a wild + goose chase.) + + Be precise about these changes. A description in English is not + enough--send a context diff for them. + + Adding files of your own (such as a machine description for a + machine we don't support) is a modification of the compiler source. + + * Details of any other deviations from the standard procedure for + installing GCC. + + * A description of what behavior you observe that you believe is + incorrect. For example, "The compiler gets a fatal signal," or, + "The assembler instruction at line 208 in the output is incorrect." + + Of course, if the bug is that the compiler gets a fatal signal, + then one can't miss it. But if the bug is incorrect output, the + maintainer might not notice unless it is glaringly wrong. None of + us has time to study all the assembler code from a 50-line C + program just on the chance that one instruction might be wrong. + We need *you* to do this part! + + 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 compiler 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 the copy here would not. If + you said to expect a crash, then when the compiler here fails to + crash, we would know that the bug was not happening. If you don't + say to expect a crash, then we would not know whether the bug was + happening. We would not be able to draw any conclusion from our + observations. + + If the problem is a diagnostic when compiling GCC with some other + compiler, say whether it is a warning or an error. + + Often the observed symptom is incorrect output when your program + is run. Sad to say, this is not enough information unless the + program is short and simple. None of us has time to study a large + program to figure out how it would work if compiled correctly, + much less which line of it was compiled wrong. So you will have + to do that. Tell us which source line it is, and what incorrect + result happens when that line is executed. A person who + understands the program can find this as easily as finding a bug + in the program itself. + + * If you send examples of assembler code output from GCC, please use + `-g' when you make them. The debugging information includes + source line numbers which are essential for correlating the output + with the input. + + * If you wish to mention something in the GCC source, refer to it by + context, not by line number. + + The line numbers in the development sources don't match those in + your sources. Your line numbers would convey no useful + information to the maintainers. + + * Additional information from a debugger might enable someone to + find a problem on a machine which he does not have available. + However, you need to think when you collect this information if + you want it to have any chance of being useful. + + For example, many people send just a backtrace, but that is never + useful by itself. A simple backtrace with arguments conveys little + about GCC because the compiler is largely data-driven; the same + functions are called over and over for different RTL insns, doing + different things depending on the details of the insn. + + Most of the arguments listed in the backtrace are useless because + they are pointers to RTL list structure. The numeric values of the + pointers, which the debugger prints in the backtrace, have no + significance whatever; all that matters is the contents of the + objects they point to (and most of the contents are other such + pointers). + + In addition, most compiler passes consist of one or more loops that + scan the RTL insn sequence. The most vital piece of information + about such a loop--which insn it has reached--is usually in a + local variable, not in an argument. + + What you need to provide in addition to a backtrace are the values + of the local variables for several stack frames up. When a local + variable or an argument is an RTX, first print its value and then + use the GDB command `pr' to print the RTL expression that it points + to. (If GDB doesn't run on your machine, use your debugger to call + the function `debug_rtx' with the RTX as an argument.) In + general, whenever a variable is a pointer, its value is no use + without the data it points to. + + Here are some things that are not necessary: + + * A description of the envelope of the bug. + + Often people who encounter a bug spend a lot of time investigating + which changes to the input file will make the bug go away and which + changes will not affect it. + + This is often time consuming and not very useful, because the way + we will find the bug is by running a single example under the + debugger with breakpoints, not by pure deduction from a series of + examples. You might as well save your time for something else. + + Of course, if you can find a simpler example to report *instead* of + the original one, that is a convenience. Errors in the output + will be easier to spot, running under the debugger will take less + time, etc. Most GCC bugs involve just one function, so the most + straightforward way to simplify an example is to delete all the + function definitions except the one where the bug occurs. Those + earlier in the file may be replaced by external declarations if + the crucial function depends on them. (Exception: inline + functions may affect compilation of functions defined later in the + file.) + + However, simplification is not vital; if you don't want to do this, + report the bug anyway and send the entire test case you used. + + * In particular, some people insert conditionals `#ifdef BUG' around + a statement which, if removed, makes the bug not happen. These + are just clutter; we won't pay any attention to them anyway. + Besides, you should send us cpp output, and that can't have + conditionals. + + * A patch for the bug. + + A patch for the bug is useful if it is a good one. But don't 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 a program as complicated as GCC it is very hard to + construct an example that will make the program follow a certain + path through the code. If you don't send the example, we won't be + able to construct one, so we won't be able to verify that the bug + is fixed. + + And if we can't understand what bug you are trying to fix, or why + your patch should be an improvement, we won't install it. A test + case will help us to understand. + + *Note Sending Patches::, for guidelines on how to make it easy for + us to understand and install your patches. + + * A guess about what the bug is or what it depends on. + + Such guesses are usually wrong. Even I can't guess right about + such things without first using the debugger to find the facts. + + * A core dump file. + + We have no way of examining a core dump for your type of machine + unless we have an identical system--and if we do have one, we + should be able to reproduce the crash ourselves. + + +File: gcc.info, Node: Sending Patches, Prev: Bug Reporting, Up: Bugs + +Sending Patches for GCC +======================= + + If you would like to write bug fixes or improvements for the GNU C +compiler, that is very helpful. Send suggested fixes to the patches +mailing list, `gcc-patches@gcc.gnu.org'. + + Please follow these guidelines so we can study your patches +efficiently. If you don't follow these guidelines, your information +might still be useful, but using it will take extra work. Maintaining +GNU C is a lot of work in the best of circumstances, and we can't keep +up unless you do your best to help. + + * Send an explanation with your changes of what problem they fix or + what improvement they bring about. For a bug fix, just include a + copy of the bug report, and explain why the change fixes the bug. + + (Referring to a bug report is not as good as including it, because + then we will have to look it up, and we have probably already + deleted it if we've already fixed the bug.) + + * Always include a proper bug report for the problem you think you + have fixed. We need to convince ourselves that the change is + right before installing it. Even if it is right, we might have + trouble judging it if we don't have a way to reproduce the problem. + + * Include all the comments that are appropriate to help people + reading the source in the future understand why this change was + needed. + + * Don't mix together changes made for different reasons. Send them + *individually*. + + If you make two changes for separate reasons, then we might not + want to install them both. We might want to install just one. If + you send them all jumbled together in a single set of diffs, we + have to do extra work to disentangle them--to figure out which + parts of the change serve which purpose. If we don't have time + for this, we might have to ignore your changes entirely. + + If you send each change as soon as you have written it, with its + own explanation, then the two changes never get tangled up, and we + can consider each one properly without any extra work to + disentangle them. + + Ideally, each change you send should be impossible to subdivide + into parts that we might want to consider separately, because each + of its parts gets its motivation from the other parts. + + * Send each change as soon as that change is finished. Sometimes + people think they are helping us by accumulating many changes to + send them all together. As explained above, this is absolutely + the worst thing you could do. + + Since you should send each change separately, you might as well + send it right away. That gives us the option of installing it + immediately if it is important. + + * Use `diff -c' to make your diffs. Diffs without context are hard + for us to install reliably. More than that, they make it hard for + us to study the diffs to decide whether we want to install them. + Unidiff format is better than contextless diffs, but not as easy + to read as `-c' format. + + If you have GNU diff, use `diff -cp', which shows the name of the + function that each change occurs in. + + * Write the change log entries for your changes. We get lots of + changes, and we don't have time to do all the change log writing + ourselves. + + Read the `ChangeLog' file to see what sorts of information to put + in, and to learn the style that we use. The purpose of the change + log is to show people where to find what was changed. So you need + to be specific about what functions you changed; in large + functions, it's often helpful to indicate where within the + function the change was. + + On the other hand, once you have shown people where to find the + change, you need not explain its purpose. Thus, if you add a new + function, all you need to say about it is that it is new. If you + feel that the purpose needs explaining, it probably does--but the + explanation will be much more useful if you put it in comments in + the code. + + If you would like your name to appear in the header line for who + made the change, send us the header line. + + * When you write the fix, keep in mind that we can't install a + change that would break other systems. + + People often suggest fixing a problem by changing + machine-independent files such as `toplev.c' to do something + special that a particular system needs. Sometimes it is totally + obvious that such changes would break GCC for almost all users. + We can't possibly make a change like that. At best it might tell + us how to write another patch that would solve the problem + acceptably. + + Sometimes people send fixes that *might* be an improvement in + general--but it is hard to be sure of this. It's hard to install + such changes because we have to study them very carefully. Of + course, a good explanation of the reasoning by which you concluded + the change was correct can help convince us. + + The safest changes are changes to the configuration files for a + particular machine. These are safe because they can't create new + bugs on other machines. + + Please help us keep up with the workload by designing the patch in + a form that is good to install. + + +File: gcc.info, Node: Service, Next: Contributing, Prev: Bugs, Up: Top + +How To Get Help with GCC +************************ + + If you need help installing, using or changing GCC, there are two +ways to find it: + + * Send a message to a suitable network mailing list. First try + `gcc-bugs@gcc.gnu.org' or `bug-gcc@gnu.org', and if that brings no + response, try `gcc@gcc.gnu.org'. + + * Look in the service directory for someone who might help you for a + fee. The service directory is found in the file named `SERVICE' + in the GCC distribution. + + +File: gcc.info, Node: Contributing, Next: VMS, Prev: Service, Up: Top + +Contributing to GCC Development +******************************* + + If you would like to help pretest GCC releases to assure they work +well, or if you would like to work on improving GCC, please contact the +maintainers at `gcc@gcc.gnu.org'. A pretester should be willing to try +to investigate bugs as well as report them. + + If you'd like to work on improvements, please ask for suggested +projects or suggest your own ideas. If you have already written an +improvement, please tell us about it. If you have not yet started +work, it is useful to contact `gcc@gcc.gnu.org' before you start; the +maintainers may be able to suggest ways to make your extension fit in +better with the rest of GCC and with other development plans. + + +File: gcc.info, Node: VMS, Next: Portability, Prev: Contributing, Up: Top + +Using GCC on VMS +**************** + + Here is how to use GCC on VMS. + +* Menu: + +* Include Files and VMS:: Where the preprocessor looks for the include files. +* Global Declarations:: How to do globaldef, globalref and globalvalue with + GCC. +* VMS Misc:: Misc information. + + +File: gcc.info, Node: Include Files and VMS, Next: Global Declarations, Up: VMS + +Include Files and VMS +===================== + + Due to the differences between the filesystems of Unix and VMS, GCC +attempts to translate file names in `#include' into names that VMS will +understand. The basic strategy is to prepend a prefix to the +specification of the include file, convert the whole filename to a VMS +filename, and then try to open the file. GCC tries various prefixes +one by one until one of them succeeds: + + 1. The first prefix is the `GNU_CC_INCLUDE:' logical name: this is + where GNU C header files are traditionally stored. If you wish to + store header files in non-standard locations, then you can assign + the logical `GNU_CC_INCLUDE' to be a search list, where each + element of the list is suitable for use with a rooted logical. + + 2. The next prefix tried is `SYS$SYSROOT:[SYSLIB.]'. This is where + VAX-C header files are traditionally stored. + + 3. If the include file specification by itself is a valid VMS + filename, the preprocessor then uses this name with no prefix in + an attempt to open the include file. + + 4. If the file specification is not a valid VMS filename (i.e. does + not contain a device or a directory specifier, and contains a `/' + character), the preprocessor tries to convert it from Unix syntax + to VMS syntax. + + Conversion works like this: the first directory name becomes a + device, and the rest of the directories are converted into + VMS-format directory names. For example, the name `X11/foobar.h' + is translated to `X11:[000000]foobar.h' or `X11:foobar.h', + whichever one can be opened. This strategy allows you to assign a + logical name to point to the actual location of the header files. + + 5. If none of these strategies succeeds, the `#include' fails. + + Include directives of the form: + + #include foobar + +are a common source of incompatibility between VAX-C and GCC. VAX-C +treats this much like a standard `#include ' directive. That +is incompatible with the ANSI C behavior implemented by GCC: to expand +the name `foobar' as a macro. Macro expansion should eventually yield +one of the two standard formats for `#include': + + #include "FILE" + #include + + If you have this problem, the best solution is to modify the source +to convert the `#include' directives to one of the two standard forms. +That will work with either compiler. If you want a quick and dirty fix, +define the file names as macros with the proper expansion, like this: + + #define stdio + +This will work, as long as the name doesn't conflict with anything else +in the program. + + Another source of incompatibility is that VAX-C assumes that: + + #include "foobar" + +is actually asking for the file `foobar.h'. GCC does not make this +assumption, and instead takes what you ask for literally; it tries to +read the file `foobar'. The best way to avoid this problem is to +always specify the desired file extension in your include directives. + + GCC for VMS is distributed with a set of include files that is +sufficient to compile most general purpose programs. Even though the +GCC distribution does not contain header files to define constants and +structures for some VMS system-specific functions, there is no reason +why you cannot use GCC with any of these functions. You first may have +to generate or create header files, either by using the public domain +utility `UNSDL' (which can be found on a DECUS tape), or by extracting +the relevant modules from one of the system macro libraries, and using +an editor to construct a C header file. + + A `#include' file name cannot contain a DECNET node name. The +preprocessor reports an I/O error if you attempt to use a node name, +whether explicitly, or implicitly via a logical name. + diff --git a/usr/local/nachos/info/gcc.info-15 b/usr/local/nachos/info/gcc.info-15 new file mode 100644 index 0000000..5f308c6 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-15 @@ -0,0 +1,1012 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Global Declarations, Next: VMS Misc, Prev: Include Files and VMS, Up: VMS + +Global Declarations and VMS +=========================== + + GCC does not provide the `globalref', `globaldef' and `globalvalue' +keywords of VAX-C. You can get the same effect with an obscure feature +of GAS, the GNU assembler. (This requires GAS version 1.39 or later.) +The following macros allow you to use this feature in a fairly natural +way: + + #ifdef __GNUC__ + #define GLOBALREF(TYPE,NAME) \ + TYPE NAME \ + asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME) + #define GLOBALDEF(TYPE,NAME,VALUE) \ + TYPE NAME \ + asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME) \ + = VALUE + #define GLOBALVALUEREF(TYPE,NAME) \ + const TYPE NAME[1] \ + asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME) + #define GLOBALVALUEDEF(TYPE,NAME,VALUE) \ + const TYPE NAME[1] \ + asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME) \ + = {VALUE} + #else + #define GLOBALREF(TYPE,NAME) \ + globalref TYPE NAME + #define GLOBALDEF(TYPE,NAME,VALUE) \ + globaldef TYPE NAME = VALUE + #define GLOBALVALUEDEF(TYPE,NAME,VALUE) \ + globalvalue TYPE NAME = VALUE + #define GLOBALVALUEREF(TYPE,NAME) \ + globalvalue TYPE NAME + #endif + +(The `_$$PsectAttributes_GLOBALSYMBOL' prefix at the start of the name +is removed by the assembler, after it has modified the attributes of +the symbol). These macros are provided in the VMS binaries +distribution in a header file `GNU_HACKS.H'. An example of the usage +is: + + GLOBALREF (int, ijk); + GLOBALDEF (int, jkl, 0); + + The macros `GLOBALREF' and `GLOBALDEF' cannot be used +straightforwardly for arrays, since there is no way to insert the array +dimension into the declaration at the right place. However, you can +declare an array with these macros if you first define a typedef for the +array type, like this: + + typedef int intvector[10]; + GLOBALREF (intvector, foo); + + Array and structure initializers will also break the macros; you can +define the initializer to be a macro of its own, or you can expand the +`GLOBALDEF' macro by hand. You may find a case where you wish to use +the `GLOBALDEF' macro with a large array, but you are not interested in +explicitly initializing each element of the array. In such cases you +can use an initializer like: `{0,}', which will initialize the entire +array to `0'. + + A shortcoming of this implementation is that a variable declared with +`GLOBALVALUEREF' or `GLOBALVALUEDEF' is always an array. For example, +the declaration: + + GLOBALVALUEREF(int, ijk); + +declares the variable `ijk' as an array of type `int [1]'. This is +done because a globalvalue is actually a constant; its "value" is what +the linker would normally consider an address. That is not how an +integer value works in C, but it is how an array works. So treating +the symbol as an array name gives consistent results--with the +exception that the value seems to have the wrong type. *Don't try to +access an element of the array.* It doesn't have any elements. The +array "address" may not be the address of actual storage. + + The fact that the symbol is an array may lead to warnings where the +variable is used. Insert type casts to avoid the warnings. Here is an +example; it takes advantage of the ANSI C feature allowing macros that +expand to use the same name as the macro itself. + + GLOBALVALUEREF (int, ss$_normal); + GLOBALVALUEDEF (int, xyzzy,123); + #ifdef __GNUC__ + #define ss$_normal ((int) ss$_normal) + #define xyzzy ((int) xyzzy) + #endif + + Don't use `globaldef' or `globalref' with a variable whose type is +an enumeration type; this is not implemented. Instead, make the +variable an integer, and use a `globalvaluedef' for each of the +enumeration values. An example of this would be: + + #ifdef __GNUC__ + GLOBALDEF (int, color, 0); + GLOBALVALUEDEF (int, RED, 0); + GLOBALVALUEDEF (int, BLUE, 1); + GLOBALVALUEDEF (int, GREEN, 3); + #else + enum globaldef color {RED, BLUE, GREEN = 3}; + #endif + + +File: gcc.info, Node: VMS Misc, Prev: Global Declarations, Up: VMS + +Other VMS Issues +================ + + GCC automatically arranges for `main' to return 1 by default if you +fail to specify an explicit return value. This will be interpreted by +VMS as a status code indicating a normal successful completion. +Version 1 of GCC did not provide this default. + + GCC on VMS works only with the GNU assembler, GAS. You need version +1.37 or later of GAS in order to produce value debugging information for +the VMS debugger. Use the ordinary VMS linker with the object files +produced by GAS. + + Under previous versions of GCC, the generated code would occasionally +give strange results when linked to the sharable `VAXCRTL' library. +Now this should work. + + A caveat for use of `const' global variables: the `const' modifier +must be specified in every external declaration of the variable in all +of the source files that use that variable. Otherwise the linker will +issue warnings about conflicting attributes for the variable. Your +program will still work despite the warnings, but the variable will be +placed in writable storage. + + Although the VMS linker does distinguish between upper and lower case +letters in global symbols, most VMS compilers convert all such symbols +into upper case and most run-time library routines also have upper case +names. To be able to reliably call such routines, GCC (by means of the +assembler GAS) converts global symbols into upper case like other VMS +compilers. However, since the usual practice in C is to distinguish +case, GCC (via GAS) tries to preserve usual C behavior by augmenting +each name that is not all lower case. This means truncating the name +to at most 23 characters and then adding more characters at the end +which encode the case pattern of those 23. Names which contain at +least one dollar sign are an exception; they are converted directly into +upper case without augmentation. + + Name augmentation yields bad results for programs that use +precompiled libraries (such as Xlib) which were generated by another +compiler. You can use the compiler option `/NOCASE_HACK' to inhibit +augmentation; it makes external C functions and variables +case-independent as is usual on VMS. Alternatively, you could write +all references to the functions and variables in such libraries using +lower case; this will work on VMS, but is not portable to other +systems. The compiler option `/NAMES' also provides control over +global name handling. + + Function and variable names are handled somewhat differently with GNU +C++. The GNU C++ compiler performs "name mangling" on function names, +which means that it adds information to the function name to describe +the data types of the arguments that the function takes. One result of +this is that the name of a function can become very long. Since the +VMS linker only recognizes the first 31 characters in a name, special +action is taken to ensure that each function and variable has a unique +name that can be represented in 31 characters. + + If the name (plus a name augmentation, if required) is less than 32 +characters in length, then no special action is performed. If the name +is longer than 31 characters, the assembler (GAS) will generate a hash +string based upon the function name, truncate the function name to 23 +characters, and append the hash string to the truncated name. If the +`/VERBOSE' compiler option is used, the assembler will print both the +full and truncated names of each symbol that is truncated. + + The `/NOCASE_HACK' compiler option should not be used when you are +compiling programs that use libg++. libg++ has several instances of +objects (i.e. `Filebuf' and `filebuf') which become indistinguishable +in a case-insensitive environment. This leads to cases where you need +to inhibit augmentation selectively (if you were using libg++ and Xlib +in the same program, for example). There is no special feature for +doing this, but you can get the result by defining a macro for each +mixed case symbol for which you wish to inhibit augmentation. The +macro should expand into the lower case equivalent of itself. For +example: + + #define StuDlyCapS studlycaps + + These macro definitions can be placed in a header file to minimize +the number of changes to your source code. + + +File: gcc.info, Node: Portability, Next: Interface, Prev: VMS, Up: Top + +GCC and Portability +******************* + + The main goal of GCC was to make a good, fast compiler for machines +in the class that the GNU system aims to run on: 32-bit machines that +address 8-bit bytes and have several general registers. Elegance, +theoretical power and simplicity are only secondary. + + GCC gets most of the information about the target machine from a +machine description which gives an algebraic formula for each of the +machine's instructions. This is a very clean way to describe the +target. But when the compiler needs information that is difficult to +express in this fashion, I have not hesitated to define an ad-hoc +parameter to the machine description. The purpose of portability is to +reduce the total work needed on the compiler; it was not of interest +for its own sake. + + GCC does not contain machine dependent code, but it does contain code +that depends on machine parameters such as endianness (whether the most +significant byte has the highest or lowest address of the bytes in a +word) and the availability of autoincrement addressing. In the +RTL-generation pass, it is often necessary to have multiple strategies +for generating code for a particular kind of syntax tree, strategies +that are usable for different combinations of parameters. Often I have +not tried to address all possible cases, but only the common ones or +only the ones that I have encountered. As a result, a new target may +require additional strategies. You will know if this happens because +the compiler will call `abort'. Fortunately, the new strategies can be +added in a machine-independent fashion, and will affect only the target +machines that need them. + + +File: gcc.info, Node: Interface, Next: Passes, Prev: Portability, Up: Top + +Interfacing to GCC Output +************************* + + GCC is normally configured to use the same function calling +convention normally in use on the target system. This is done with the +machine-description macros described (*note Target Macros::.). + + However, returning of structure and union values is done differently +on some target machines. As a result, functions compiled with PCC +returning such types cannot be called from code compiled with GCC, and +vice versa. This does not cause trouble often because few Unix library +routines return structures or unions. + + GCC code returns structures and unions that are 1, 2, 4 or 8 bytes +long in the same registers used for `int' or `double' return values. +(GCC typically allocates variables of such types in registers also.) +Structures and unions of other sizes are returned by storing them into +an address passed by the caller (usually in a register). The +machine-description macros `STRUCT_VALUE' and `STRUCT_INCOMING_VALUE' +tell GCC where to pass this address. + + By contrast, PCC on most target machines returns structures and +unions of any size by copying the data into an area of static storage, +and then returning the address of that storage as if it were a pointer +value. The caller must copy the data from that memory area to the +place where the value is wanted. This is slower than the method used +by GCC, and fails to be reentrant. + + On some target machines, such as RISC machines and the 80386, the +standard system convention is to pass to the subroutine the address of +where to return the value. On these machines, GCC has been configured +to be compatible with the standard compiler, when this method is used. +It may not be compatible for structures of 1, 2, 4 or 8 bytes. + + GCC uses the system's standard convention for passing arguments. On +some machines, the first few arguments are passed in registers; in +others, all are passed on the stack. It would be possible to use +registers for argument passing on any machine, and this would probably +result in a significant speedup. But the result would be complete +incompatibility with code that follows the standard convention. So this +change is practical only if you are switching to GCC as the sole C +compiler for the system. We may implement register argument passing on +certain machines once we have a complete GNU system so that we can +compile the libraries with GCC. + + On some machines (particularly the Sparc), certain types of arguments +are passed "by invisible reference". This means that the value is +stored in memory, and the address of the memory location is passed to +the subroutine. + + If you use `longjmp', beware of automatic variables. ANSI C says +that automatic variables that are not declared `volatile' have undefined +values after a `longjmp'. And this is all GCC promises to do, because +it is very difficult to restore register variables correctly, and one +of GCC's features is that it can put variables in registers without +your asking it to. + + If you want a variable to be unaltered by `longjmp', and you don't +want to write `volatile' because old C compilers don't accept it, just +take the address of the variable. If a variable's address is ever +taken, even if just to compute it and ignore it, then the variable +cannot go in a register: + + { + int careful; + &careful; + ... + } + + Code compiled with GCC may call certain library routines. Most of +them handle arithmetic for which there are no instructions. This +includes multiply and divide on some machines, and floating point +operations on any machine for which floating point support is disabled +with `-msoft-float'. Some standard parts of the C library, such as +`bcopy' or `memcpy', are also called automatically. The usual function +call interface is used for calling the library routines. + + These library routines should be defined in the library `libgcc.a', +which GCC automatically searches whenever it links a program. On +machines that have multiply and divide instructions, if hardware +floating point is in use, normally `libgcc.a' is not needed, but it is +searched just in case. + + Each arithmetic function is defined in `libgcc1.c' to use the +corresponding C arithmetic operator. As long as the file is compiled +with another C compiler, which supports all the C arithmetic operators, +this file will work portably. However, `libgcc1.c' does not work if +compiled with GCC, because each arithmetic function would compile into +a call to itself! + + +File: gcc.info, Node: Passes, Next: RTL, Prev: Interface, Up: Top + +Passes and Files of the Compiler +******************************** + + The overall control structure of the compiler is in `toplev.c'. This +file is responsible for initialization, decoding arguments, opening and +closing files, and sequencing the passes. + + The parsing pass is invoked only once, to parse the entire input. +The RTL intermediate code for a function is generated as the function +is parsed, a statement at a time. Each statement is read in as a +syntax tree and then converted to RTL; then the storage for the tree +for the statement is reclaimed. Storage for types (and the expressions +for their sizes), declarations, and a representation of the binding +contours and how they nest, remain until the function is finished being +compiled; these are all needed to output the debugging information. + + Each time the parsing pass reads a complete function definition or +top-level declaration, it calls either the function +`rest_of_compilation', or the function `rest_of_decl_compilation' in +`toplev.c', which are responsible for all further processing necessary, +ending with output of the assembler language. All other compiler +passes run, in sequence, within `rest_of_compilation'. When that +function returns from compiling a function definition, the storage used +for that function definition's compilation is entirely freed, unless it +is an inline function (*note An Inline Function is As Fast As a Macro: +Inline.). + + Here is a list of all the passes of the compiler and their source +files. Also included is a description of where debugging dumps can be +requested with `-d' options. + + * Parsing. This pass reads the entire text of a function definition, + constructing partial syntax trees. This and RTL generation are no + longer truly separate passes (formerly they were), but it is + easier to think of them as separate. + + The tree representation does not entirely follow C syntax, because + it is intended to support other languages as well. + + Language-specific data type analysis is also done in this pass, + and every tree node that represents an expression has a data type + attached. Variables are represented as declaration nodes. + + Constant folding and some arithmetic simplifications are also done + during this pass. + + The language-independent source files for parsing are + `stor-layout.c', `fold-const.c', and `tree.c'. There are also + header files `tree.h' and `tree.def' which define the format of + the tree representation. + + The source files to parse C are `c-parse.in', `c-decl.c', + `c-typeck.c', `c-aux-info.c', `c-convert.c', and `c-lang.c' along + with header files `c-lex.h', and `c-tree.h'. + + The source files for parsing C++ are `cp-parse.y', `cp-class.c', + `cp-cvt.c', `cp-decl.c', `cp-decl2.c', `cp-dem.c', `cp-except.c', + `cp-expr.c', `cp-init.c', `cp-lex.c', `cp-method.c', `cp-ptree.c', + `cp-search.c', `cp-tree.c', `cp-type2.c', and `cp-typeck.c', along + with header files `cp-tree.def', `cp-tree.h', and `cp-decl.h'. + + The special source files for parsing Objective C are + `objc-parse.y', `objc-actions.c', `objc-tree.def', and + `objc-actions.h'. Certain C-specific files are used for this as + well. + + The file `c-common.c' is also used for all of the above languages. + + * RTL generation. This is the conversion of syntax tree into RTL + code. It is actually done statement-by-statement during parsing, + but for most purposes it can be thought of as a separate pass. + + This is where the bulk of target-parameter-dependent code is found, + since often it is necessary for strategies to apply only when + certain standard kinds of instructions are available. The purpose + of named instruction patterns is to provide this information to + the RTL generation pass. + + Optimization is done in this pass for `if'-conditions that are + comparisons, boolean operations or conditional expressions. Tail + recursion is detected at this time also. Decisions are made about + how best to arrange loops and how to output `switch' statements. + + The source files for RTL generation include `stmt.c', `calls.c', + `expr.c', `explow.c', `expmed.c', `function.c', `optabs.c' and + `emit-rtl.c'. Also, the file `insn-emit.c', generated from the + machine description by the program `genemit', is used in this + pass. The header file `expr.h' is used for communication within + this pass. + + The header files `insn-flags.h' and `insn-codes.h', generated from + the machine description by the programs `genflags' and `gencodes', + tell this pass which standard names are available for use and + which patterns correspond to them. + + Aside from debugging information output, none of the following + passes refers to the tree structure representation of the function + (only part of which is saved). + + The decision of whether the function can and should be expanded + inline in its subsequent callers is made at the end of rtl + generation. The function must meet certain criteria, currently + related to the size of the function and the types and number of + parameters it has. Note that this function may contain loops, + recursive calls to itself (tail-recursive functions can be + inlined!), gotos, in short, all constructs supported by GCC. The + file `integrate.c' contains the code to save a function's rtl for + later inlining and to inline that rtl when the function is called. + The header file `integrate.h' is also used for this purpose. + + The option `-dr' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.rtl' to + the input file name. + + * Jump optimization. This pass simplifies jumps to the following + instruction, jumps across jumps, and jumps to jumps. It deletes + unreferenced labels and unreachable code, except that unreachable + code that contains a loop is not recognized as unreachable in this + pass. (Such loops are deleted later in the basic block analysis.) + It also converts some code originally written with jumps into + sequences of instructions that directly set values from the + results of comparisons, if the machine has such instructions. + + Jump optimization is performed two or three times. The first time + is immediately following RTL generation. The second time is after + CSE, but only if CSE says repeated jump optimization is needed. + The last time is right before the final pass. That time, + cross-jumping and deletion of no-op move instructions are done + together with the optimizations described above. + + The source file of this pass is `jump.c'. + + The option `-dj' causes a debugging dump of the RTL code after + this pass is run for the first time. This dump file's name is + made by appending `.jump' to the input file name. + + * Register scan. This pass finds the first and last use of each + register, as a guide for common subexpression elimination. Its + source is in `regclass.c'. + + * Jump threading. This pass detects a condition jump that branches + to an identical or inverse test. Such jumps can be `threaded' + through the second conditional test. The source code for this + pass is in `jump.c'. This optimization is only performed if + `-fthread-jumps' is enabled. + + * Common subexpression elimination. This pass also does constant + propagation. Its source file is `cse.c'. If constant propagation + causes conditional jumps to become unconditional or to become + no-ops, jump optimization is run again when CSE is finished. + + The option `-ds' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.cse' to + the input file name. + + * Global common subexpression elimination. This pass performs GCSE + using Morel-Renvoise Partial Redundancy Elimination, with the + exception that it does not try to move invariants out of loops - + that is left to the loop optimization pass. This pass also + performs global constant and copy propagation. + + The source file for this pass is gcse.c. + + The option `-dG' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.gcse' to + the input file name. + + * Loop optimization. This pass moves constant expressions out of + loops, and optionally does strength-reduction and loop unrolling + as well. Its source files are `loop.c' and `unroll.c', plus the + header `loop.h' used for communication between them. Loop + unrolling uses some functions in `integrate.c' and the header + `integrate.h'. + + The option `-dL' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.loop' to + the input file name. + + * If `-frerun-cse-after-loop' was enabled, a second common + subexpression elimination pass is performed after the loop + optimization pass. Jump threading is also done again at this time + if it was specified. + + The option `-dt' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.cse2' to + the input file name. + + * Stupid register allocation is performed at this point in a + nonoptimizing compilation. It does a little data flow analysis as + well. When stupid register allocation is in use, the next pass + executed is the reloading pass; the others in between are skipped. + The source file is `stupid.c'. + + * Data flow analysis (`flow.c'). This pass divides the program into + basic blocks (and in the process deletes unreachable loops); then + it computes which pseudo-registers are live at each point in the + program, and makes the first instruction that uses a value point at + the instruction that computed the value. + + This pass also deletes computations whose results are never used, + and combines memory references with add or subtract instructions + to make autoincrement or autodecrement addressing. + + The option `-df' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.flow' to + the input file name. If stupid register allocation is in use, this + dump file reflects the full results of such allocation. + + * Instruction combination (`combine.c'). This pass attempts to + combine groups of two or three instructions that are related by + data flow into single instructions. It combines the RTL + expressions for the instructions by substitution, simplifies the + result using algebra, and then attempts to match the result + against the machine description. + + The option `-dc' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.combine' + to the input file name. + + * Register movement (`regmove.c'). This pass looks for cases where + matching constraints would force an instruction to need a reload, + and this reload would be a register to register move. It them + attempts to change the registers used by the instruction to avoid + the move instruction. + + The option `-dN' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.regmove' + to the input file name. + + * Instruction scheduling (`sched.c'). This pass looks for + instructions whose output will not be available by the time that + it is used in subsequent instructions. (Memory loads and floating + point instructions often have this behavior on RISC machines). It + re-orders instructions within a basic block to try to separate the + definition and use of items that otherwise would cause pipeline + stalls. + + Instruction scheduling is performed twice. The first time is + immediately after instruction combination and the second is + immediately after reload. + + The option `-dS' causes a debugging dump of the RTL code after this + pass is run for the first time. The dump file's name is made by + appending `.sched' to the input file name. + + * Register class preferencing. The RTL code is scanned to find out + which register class is best for each pseudo register. The source + file is `regclass.c'. + + * Local register allocation (`local-alloc.c'). This pass allocates + hard registers to pseudo registers that are used only within one + basic block. Because the basic block is linear, it can use fast + and powerful techniques to do a very good job. + + The option `-dl' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.lreg' to + the input file name. + + * Global register allocation (`global.c'). This pass allocates hard + registers for the remaining pseudo registers (those whose life + spans are not contained in one basic block). + + * Reloading. This pass renumbers pseudo registers with the hardware + registers numbers they were allocated. Pseudo registers that did + not get hard registers are replaced with stack slots. Then it + finds instructions that are invalid because a value has failed to + end up in a register, or has ended up in a register of the wrong + kind. It fixes up these instructions by reloading the + problematical values temporarily into registers. Additional + instructions are generated to do the copying. + + The reload pass also optionally eliminates the frame pointer and + inserts instructions to save and restore call-clobbered registers + around calls. + + Source files are `reload.c' and `reload1.c', plus the header + `reload.h' used for communication between them. + + The option `-dg' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.greg' to + the input file name. + + * Instruction scheduling is repeated here to try to avoid pipeline + stalls due to memory loads generated for spilled pseudo registers. + + The option `-dR' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.sched2' + to the input file name. + + * Jump optimization is repeated, this time including cross-jumping + and deletion of no-op move instructions. + + The option `-dJ' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.jump2' to + the input file name. + + * Delayed branch scheduling. This optional pass attempts to find + instructions that can go into the delay slots of other + instructions, usually jumps and calls. The source file name is + `reorg.c'. + + The option `-dd' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.dbr' to + the input file name. + + * Conversion from usage of some hard registers to usage of a register + stack may be done at this point. Currently, this is supported only + for the floating-point registers of the Intel 80387 coprocessor. + The source file name is `reg-stack.c'. + + The options `-dk' causes a debugging dump of the RTL code after + this pass. This dump file's name is made by appending `.stack' to + the input file name. + + * Final. This pass outputs the assembler code for the function. It + is also responsible for identifying spurious test and compare + instructions. Machine-specific peephole optimizations are + performed at the same time. The function entry and exit sequences + are generated directly as assembler code in this pass; they never + exist as RTL. + + The source files are `final.c' plus `insn-output.c'; the latter is + generated automatically from the machine description by the tool + `genoutput'. The header file `conditions.h' is used for + communication between these files. + + * Debugging information output. This is run after final because it + must output the stack slot offsets for pseudo registers that did + not get hard registers. Source files are `dbxout.c' for DBX + symbol table format, `sdbout.c' for SDB symbol table format, and + `dwarfout.c' for DWARF symbol table format. + + Some additional files are used by all or many passes: + + * Every pass uses `machmode.def' and `machmode.h' which define the + machine modes. + + * Several passes use `real.h', which defines the default + representation of floating point constants and how to operate on + them. + + * All the passes that work with RTL use the header files `rtl.h' and + `rtl.def', and subroutines in file `rtl.c'. The tools `gen*' also + use these files to read and work with the machine description RTL. + + * Several passes refer to the header file `insn-config.h' which + contains a few parameters (C macro definitions) generated + automatically from the machine description RTL by the tool + `genconfig'. + + * Several passes use the instruction recognizer, which consists of + `recog.c' and `recog.h', plus the files `insn-recog.c' and + `insn-extract.c' that are generated automatically from the machine + description by the tools `genrecog' and `genextract'. + + * Several passes use the header files `regs.h' which defines the + information recorded about pseudo register usage, and + `basic-block.h' which defines the information recorded about basic + blocks. + + * `hard-reg-set.h' defines the type `HARD_REG_SET', a bit-vector + with a bit for each hard register, and some macros to manipulate + it. This type is just `int' if the machine has few enough hard + registers; otherwise it is an array of `int' and some of the + macros expand into loops. + + * Several passes use instruction attributes. A definition of the + attributes defined for a particular machine is in file + `insn-attr.h', which is generated from the machine description by + the program `genattr'. The file `insn-attrtab.c' contains + subroutines to obtain the attribute values for insns. It is + generated from the machine description by the program `genattrtab'. + + +File: gcc.info, Node: RTL, Next: Machine Desc, Prev: Passes, Up: Top + +RTL Representation +****************** + + Most of the work of the compiler is done on an intermediate +representation called register transfer language. In this language, +the instructions to be output are described, pretty much one by one, in +an algebraic form that describes what the instruction does. + + RTL is inspired by Lisp lists. It has both an internal form, made +up of structures that point at other structures, and a textual form +that is used in the machine description and in printed debugging dumps. +The textual form uses nested parentheses to indicate the pointers in +the internal form. + +* Menu: + +* RTL Objects:: Expressions vs vectors vs strings vs integers. +* RTL Classes:: Categories of RTL expresion objects, and their structure. +* Accessors:: Macros to access expression operands or vector elts. +* Flags:: Other flags in an RTL expression. +* Machine Modes:: Describing the size and format of a datum. +* Constants:: Expressions with constant values. +* Regs and Memory:: Expressions representing register contents or memory. +* Arithmetic:: Expressions representing arithmetic on other expressions. +* Comparisons:: Expressions representing comparison of expressions. +* Bit Fields:: Expressions representing bitfields in memory or reg. +* Conversions:: Extending, truncating, floating or fixing. +* RTL Declarations:: Declaring volatility, constancy, etc. +* Side Effects:: Expressions for storing in registers, etc. +* Incdec:: Embedded side-effects for autoincrement addressing. +* Assembler:: Representing `asm' with operands. +* Insns:: Expression types for entire insns. +* Calls:: RTL representation of function call insns. +* Sharing:: Some expressions are unique; others *must* be copied. +* Reading RTL:: Reading textual RTL from a file. + + +File: gcc.info, Node: RTL Objects, Next: RTL Classes, Prev: RTL, Up: RTL + +RTL Object Types +================ + + RTL uses five kinds of objects: expressions, integers, wide integers, +strings and vectors. Expressions are the most important ones. An RTL +expression ("RTX", for short) is a C structure, but it is usually +referred to with a pointer; a type that is given the typedef name `rtx'. + + An integer is simply an `int'; their written form uses decimal +digits. A wide integer is an integral object whose type is +`HOST_WIDE_INT' (*note Config::.); their written form uses decimal +digits. + + A string is a sequence of characters. In core it is represented as a +`char *' in usual C fashion, and it is written in C syntax as well. +However, strings in RTL may never be null. If you write an empty +string in a machine description, it is represented in core as a null +pointer rather than as a pointer to a null character. In certain +contexts, these null pointers instead of strings are valid. Within RTL +code, strings are most commonly found inside `symbol_ref' expressions, +but they appear in other contexts in the RTL expressions that make up +machine descriptions. + + A vector contains an arbitrary number of pointers to expressions. +The number of elements in the vector is explicitly present in the +vector. The written form of a vector consists of square brackets +(`[...]') surrounding the elements, in sequence and with whitespace +separating them. Vectors of length zero are not created; null pointers +are used instead. + + Expressions are classified by "expression codes" (also called RTX +codes). The expression code is a name defined in `rtl.def', which is +also (in upper case) a C enumeration constant. The possible expression +codes and their meanings are machine-independent. The code of an RTX +can be extracted with the macro `GET_CODE (X)' and altered with +`PUT_CODE (X, NEWCODE)'. + + The expression code determines how many operands the expression +contains, and what kinds of objects they are. In RTL, unlike Lisp, you +cannot tell by looking at an operand what kind of object it is. +Instead, you must know from its context--from the expression code of +the containing expression. For example, in an expression of code +`subreg', the first operand is to be regarded as an expression and the +second operand as an integer. In an expression of code `plus', there +are two operands, both of which are to be regarded as expressions. In +a `symbol_ref' expression, there is one operand, which is to be +regarded as a string. + + Expressions are written as parentheses containing the name of the +expression type, its flags and machine mode if any, and then the +operands of the expression (separated by spaces). + + Expression code names in the `md' file are written in lower case, +but when they appear in C code they are written in upper case. In this +manual, they are shown as follows: `const_int'. + + In a few contexts a null pointer is valid where an expression is +normally wanted. The written form of this is `(nil)'. + + +File: gcc.info, Node: RTL Classes, Next: Accessors, Prev: RTL Objects, Up: RTL + +RTL Classes and Formats +======================= + + The various expression codes are divided into several "classes", +which are represented by single characters. You can determine the class +of an RTX code with the macro `GET_RTX_CLASS (CODE)'. Currently, +`rtx.def' defines these classes: + +`o' + An RTX code that represents an actual object, such as a register + (`REG') or a memory location (`MEM', `SYMBOL_REF'). Constants and + basic transforms on objects (`ADDRESSOF', `HIGH', `LO_SUM') are + also included. Note that `SUBREG' and `STRICT_LOW_PART' are not + in this class, but in class `x'. + +`<' + An RTX code for a comparison, such as `NE' or `LT'. + +`1' + An RTX code for a unary arithmetic operation, such as `NEG', + `NOT', or `ABS'. This category also includes value extension + (sign or zero) and conversions between integer and floating point. + +`c' + An RTX code for a commutative binary operation, such as `PLUS' or + `AND'. `NE' and `EQ' are comparisons, so they have class `<'. + +`2' + An RTX code for a non-commutative binary operation, such as + `MINUS', `DIV', or `ASHIFTRT'. + +`b' + An RTX code for a bitfield operation. Currently only + `ZERO_EXTRACT' and `SIGN_EXTRACT'. These have three inputs and + are lvalues (so they can be used for insertion as well). *Note + Bit Fields::. + +`3' + An RTX code for other three input operations. Currently only + `IF_THEN_ELSE'. + +`i' + An RTX code for an entire instruction: `INSN', `JUMP_INSN', and + `CALL_INSN'. *Note Insns::. + +`m' + An RTX code for something that matches in insns, such as + `MATCH_DUP'. These only occur in machine descriptions. + +`x' + All other RTX codes. This category includes the remaining codes + used only in machine descriptions (`DEFINE_*', etc.). It also + includes all the codes describing side effects (`SET', `USE', + `CLOBBER', etc.) and the non-insns that may appear on an insn + chain, such as `NOTE', `BARRIER', and `CODE_LABEL'. + + For each expression type `rtl.def' specifies the number of contained +objects and their kinds, with four possibilities: `e' for expression +(actually a pointer to an expression), `i' for integer, `w' for wide +integer, `s' for string, and `E' for vector of expressions. The +sequence of letters for an expression code is called its "format". For +example, the format of `subreg' is `ei'. + + A few other format characters are used occasionally: + +`u' + `u' is equivalent to `e' except that it is printed differently in + debugging dumps. It is used for pointers to insns. + +`n' + `n' is equivalent to `i' except that it is printed differently in + debugging dumps. It is used for the line number or code number of + a `note' insn. + +`S' + `S' indicates a string which is optional. In the RTL objects in + core, `S' is equivalent to `s', but when the object is read, from + an `md' file, the string value of this operand may be omitted. An + omitted string is taken to be the null string. + +`V' + `V' indicates a vector which is optional. In the RTL objects in + core, `V' is equivalent to `E', but when the object is read from + an `md' file, the vector value of this operand may be omitted. An + omitted vector is effectively the same as a vector of no elements. + +`0' + `0' means a slot whose contents do not fit any normal category. + `0' slots are not printed at all in dumps, and are often used in + special ways by small parts of the compiler. + + There are macros to get the number of operands and the format of an +expression code: + +`GET_RTX_LENGTH (CODE)' + Number of operands of an RTX of code CODE. + +`GET_RTX_FORMAT (CODE)' + The format of an RTX of code CODE, as a C string. + + Some classes of RTX codes always have the same format. For example, +it is safe to assume that all comparison operations have format `ee'. + +`1' + All codes of this class have format `e'. + +`<' +`c' +`2' + All codes of these classes have format `ee'. + +`b' +`3' + All codes of these classes have format `eee'. + +`i' + All codes of this class have formats that begin with `iuueiee'. + *Note Insns::. Note that not all RTL objects linked onto an insn + chain are of class `i'. + +`o' +`m' +`x' + You can make no assumptions about the format of these codes. + + +File: gcc.info, Node: Accessors, Next: Flags, Prev: RTL Classes, Up: RTL + +Access to Operands +================== + + Operands of expressions are accessed using the macros `XEXP', +`XINT', `XWINT' and `XSTR'. Each of these macros takes two arguments: +an expression-pointer (RTX) and an operand number (counting from zero). +Thus, + + XEXP (X, 2) + +accesses operand 2 of expression X, as an expression. + + XINT (X, 2) + +accesses the same operand as an integer. `XSTR', used in the same +fashion, would access it as a string. + + Any operand can be accessed as an integer, as an expression or as a +string. You must choose the correct method of access for the kind of +value actually stored in the operand. You would do this based on the +expression code of the containing expression. That is also how you +would know how many operands there are. + + For example, if X is a `subreg' expression, you know that it has two +operands which can be correctly accessed as `XEXP (X, 0)' and `XINT (X, +1)'. If you did `XINT (X, 0)', you would get the address of the +expression operand but cast as an integer; that might occasionally be +useful, but it would be cleaner to write `(int) XEXP (X, 0)'. `XEXP +(X, 1)' would also compile without error, and would return the second, +integer operand cast as an expression pointer, which would probably +result in a crash when accessed. Nothing stops you from writing `XEXP +(X, 28)' either, but this will access memory past the end of the +expression with unpredictable results. + + Access to operands which are vectors is more complicated. You can +use the macro `XVEC' to get the vector-pointer itself, or the macros +`XVECEXP' and `XVECLEN' to access the elements and length of a vector. + +`XVEC (EXP, IDX)' + Access the vector-pointer which is operand number IDX in EXP. + +`XVECLEN (EXP, IDX)' + Access the length (number of elements) in the vector which is in + operand number IDX in EXP. This value is an `int'. + +`XVECEXP (EXP, IDX, ELTNUM)' + Access element number ELTNUM in the vector which is in operand + number IDX in EXP. This value is an RTX. + + It is up to you to make sure that ELTNUM is not negative and is + less than `XVECLEN (EXP, IDX)'. + + All the macros defined in this section expand into lvalues and +therefore can be used to assign the operands, lengths and vector +elements as well as to access them. + diff --git a/usr/local/nachos/info/gcc.info-16 b/usr/local/nachos/info/gcc.info-16 new file mode 100644 index 0000000..cb22104 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-16 @@ -0,0 +1,1205 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Flags, Next: Machine Modes, Prev: Accessors, Up: RTL + +Flags in an RTL Expression +========================== + + RTL expressions contain several flags (one-bit bitfields) and other +values that are used in certain types of expression. Most often they +are accessed with the following macros: + +`MEM_VOLATILE_P (X)' + In `mem' expressions, nonzero for volatile memory references. + Stored in the `volatil' field and printed as `/v'. + +`MEM_IN_STRUCT_P (X)' + In `mem' expressions, nonzero for reference to an entire structure, + union or array, or to a component of one. Zero for references to a + scalar variable or through a pointer to a scalar. Stored in the + `in_struct' field and printed as `/s'. If both this flag and + MEM_SCALAR_P are clear, then we don't know whether this MEM is in a + structure or not. Both flags should never be simultaneously set. + +`MEM_SCALAR_P (X)' + In `mem' expressions, nonzero for reference to a scalar known not + to be a member of a structure, union, or array. Zero for such + references and for indirections through pointers, even pointers + pointing to scalar types. If both this flag and MEM_STRUCT_P are + clear, then we don't know whether this MEM is in a structure or + not. Both flags should never be simultaneously set. + +`MEM_ALIAS_SET (X)' + In `mem' expressions, the alias set to which X belongs. If zero, + X is not in any alias set, and may alias anything. If nonzero, X + may only alias objects in the same alias set. This value is set + (in a language-specific manner) by the front-end. This field is + not a bit-field; it is in an integer, found as the second argument + to the `mem'. + +`REG_LOOP_TEST_P' + In `reg' expressions, nonzero if this register's entire life is + contained in the exit test code for some loop. Stored in the + `in_struct' field and printed as `/s'. + +`REG_USERVAR_P (X)' + In a `reg', nonzero if it corresponds to a variable present in the + user's source code. Zero for temporaries generated internally by + the compiler. Stored in the `volatil' field and printed as `/v'. + +`REG_FUNCTION_VALUE_P (X)' + Nonzero in a `reg' if it is the place in which this function's + value is going to be returned. (This happens only in a hard + register.) Stored in the `integrated' field and printed as `/i'. + + The same hard register may be used also for collecting the values + of functions called by this one, but `REG_FUNCTION_VALUE_P' is zero + in this kind of use. + +`SUBREG_PROMOTED_VAR_P' + Nonzero in a `subreg' if it was made when accessing an object that + was promoted to a wider mode in accord with the `PROMOTED_MODE' + machine description macro (*note Storage Layout::.). In this + case, the mode of the `subreg' is the declared mode of the object + and the mode of `SUBREG_REG' is the mode of the register that + holds the object. Promoted variables are always either sign- or + zero-extended to the wider mode on every assignment. Stored in + the `in_struct' field and printed as `/s'. + +`SUBREG_PROMOTED_UNSIGNED_P' + Nonzero in a `subreg' that has `SUBREG_PROMOTED_VAR_P' nonzero if + the object being referenced is kept zero-extended and zero if it + is kept sign-extended. Stored in the `unchanging' field and + printed as `/u'. + +`RTX_UNCHANGING_P (X)' + Nonzero in a `reg' or `mem' if the value is not changed. (This + flag is not set for memory references via pointers to constants. + Such pointers only guarantee that the object will not be changed + explicitly by the current function. The object might be changed by + other functions or by aliasing.) Stored in the `unchanging' field + and printed as `/u'. + +`RTX_INTEGRATED_P (INSN)' + Nonzero in an insn if it resulted from an in-line function call. + Stored in the `integrated' field and printed as `/i'. + +`RTX_FRAME_RELATED_P (X)' + Nonzero in an insn or expression which is part of a function + prologue and sets the stack pointer, sets the frame pointer, or + saves a register. This flag is required for exception handling + support on targets with RTL prologues. + +`SYMBOL_REF_USED (X)' + In a `symbol_ref', indicates that X has been used. This is + normally only used to ensure that X is only declared external + once. Stored in the `used' field. + +`SYMBOL_REF_FLAG (X)' + In a `symbol_ref', this is used as a flag for machine-specific + purposes. Stored in the `volatil' field and printed as `/v'. + +`LABEL_OUTSIDE_LOOP_P' + In `label_ref' expressions, nonzero if this is a reference to a + label that is outside the innermost loop containing the reference + to the label. Stored in the `in_struct' field and printed as `/s'. + +`INSN_DELETED_P (INSN)' + In an insn, nonzero if the insn has been deleted. Stored in the + `volatil' field and printed as `/v'. + +`INSN_ANNULLED_BRANCH_P (INSN)' + In an `insn' in the delay slot of a branch insn, indicates that an + annulling branch should be used. See the discussion under + `sequence' below. Stored in the `unchanging' field and printed as + `/u'. + +`INSN_FROM_TARGET_P (INSN)' + In an `insn' in a delay slot of a branch, indicates that the insn + is from the target of the branch. If the branch insn has + `INSN_ANNULLED_BRANCH_P' set, this insn will only be executed if + the branch is taken. For annulled branches with + `INSN_FROM_TARGET_P' clear, the insn will be executed only if the + branch is not taken. When `INSN_ANNULLED_BRANCH_P' is not set, + this insn will always be executed. Stored in the `in_struct' + field and printed as `/s'. + +`CONSTANT_POOL_ADDRESS_P (X)' + Nonzero in a `symbol_ref' if it refers to part of the current + function's "constants pool". These are addresses close to the + beginning of the function, and GNU CC assumes they can be addressed + directly (perhaps with the help of base registers). Stored in the + `unchanging' field and printed as `/u'. + +`CONST_CALL_P (X)' + In a `call_insn', indicates that the insn represents a call to a + const function. Stored in the `unchanging' field and printed as + `/u'. + +`LABEL_PRESERVE_P (X)' + In a `code_label', indicates that the label can never be deleted. + Labels referenced by a non-local goto will have this bit set. + Stored in the `in_struct' field and printed as `/s'. + +`SCHED_GROUP_P (INSN)' + During instruction scheduling, in an insn, indicates that the + previous insn must be scheduled together with this insn. This is + used to ensure that certain groups of instructions will not be + split up by the instruction scheduling pass, for example, `use' + insns before a `call_insn' may not be separated from the + `call_insn'. Stored in the `in_struct' field and printed as `/s'. + + These are the fields which the above macros refer to: + +`used' + Normally, this flag is used only momentarily, at the end of RTL + generation for a function, to count the number of times an + expression appears in insns. Expressions that appear more than + once are copied, according to the rules for shared structure + (*note Sharing::.). + + In a `symbol_ref', it indicates that an external declaration for + the symbol has already been written. + + In a `reg', it is used by the leaf register renumbering code to + ensure that each register is only renumbered once. + +`volatil' + This flag is used in `mem', `symbol_ref' and `reg' expressions and + in insns. In RTL dump files, it is printed as `/v'. + + In a `mem' expression, it is 1 if the memory reference is volatile. + Volatile memory references may not be deleted, reordered or + combined. + + In a `symbol_ref' expression, it is used for machine-specific + purposes. + + In a `reg' expression, it is 1 if the value is a user-level + variable. 0 indicates an internal compiler temporary. + + In an insn, 1 means the insn has been deleted. + +`in_struct' + In `mem' expressions, it is 1 if the memory datum referred to is + all or part of a structure or array; 0 if it is (or might be) a + scalar variable. A reference through a C pointer has 0 because + the pointer might point to a scalar variable. This information + allows the compiler to determine something about possible cases of + aliasing. + + In an insn in the delay slot of a branch, 1 means that this insn + is from the target of the branch. + + During instruction scheduling, in an insn, 1 means that this insn + must be scheduled as part of a group together with the previous + insn. + + In `reg' expressions, it is 1 if the register has its entire life + contained within the test expression of some loop. + + In `subreg' expressions, 1 means that the `subreg' is accessing an + object that has had its mode promoted from a wider mode. + + In `label_ref' expressions, 1 means that the referenced label is + outside the innermost loop containing the insn in which the + `label_ref' was found. + + In `code_label' expressions, it is 1 if the label may never be + deleted. This is used for labels which are the target of + non-local gotos. + + In an RTL dump, this flag is represented as `/s'. + +`unchanging' + In `reg' and `mem' expressions, 1 means that the value of the + expression never changes. + + In `subreg' expressions, it is 1 if the `subreg' references an + unsigned object whose mode has been promoted to a wider mode. + + In an insn, 1 means that this is an annulling branch. + + In a `symbol_ref' expression, 1 means that this symbol addresses + something in the per-function constants pool. + + In a `call_insn', 1 means that this instruction is a call to a + const function. + + In an RTL dump, this flag is represented as `/u'. + +`integrated' + In some kinds of expressions, including insns, this flag means the + rtl was produced by procedure integration. + + In a `reg' expression, this flag indicates the register containing + the value to be returned by the current function. On machines + that pass parameters in registers, the same register number may be + used for parameters as well, but this flag is not set on such uses. + + +File: gcc.info, Node: Machine Modes, Next: Constants, Prev: Flags, Up: RTL + +Machine Modes +============= + + A machine mode describes a size of data object and the +representation used for it. In the C code, machine modes are +represented by an enumeration type, `enum machine_mode', defined in +`machmode.def'. Each RTL expression has room for a machine mode and so +do certain kinds of tree expressions (declarations and types, to be +precise). + + In debugging dumps and machine descriptions, the machine mode of an +RTL expression is written after the expression code with a colon to +separate them. The letters `mode' which appear at the end of each +machine mode name are omitted. For example, `(reg:SI 38)' is a `reg' +expression with machine mode `SImode'. If the mode is `VOIDmode', it +is not written at all. + + Here is a table of machine modes. The term "byte" below refers to an +object of `BITS_PER_UNIT' bits (*note Storage Layout::.). + +`QImode' + "Quarter-Integer" mode represents a single byte treated as an + integer. + +`HImode' + "Half-Integer" mode represents a two-byte integer. + +`PSImode' + "Partial Single Integer" mode represents an integer which occupies + four bytes but which doesn't really use all four. On some + machines, this is the right mode to use for pointers. + +`SImode' + "Single Integer" mode represents a four-byte integer. + +`PDImode' + "Partial Double Integer" mode represents an integer which occupies + eight bytes but which doesn't really use all eight. On some + machines, this is the right mode to use for certain pointers. + +`DImode' + "Double Integer" mode represents an eight-byte integer. + +`TImode' + "Tetra Integer" (?) mode represents a sixteen-byte integer. + +`SFmode' + "Single Floating" mode represents a single-precision (four byte) + floating point number. + +`DFmode' + "Double Floating" mode represents a double-precision (eight byte) + floating point number. + +`XFmode' + "Extended Floating" mode represents a triple-precision (twelve + byte) floating point number. This mode is used for IEEE extended + floating point. On some systems not all bits within these bytes + will actually be used. + +`TFmode' + "Tetra Floating" mode represents a quadruple-precision (sixteen + byte) floating point number. + +`CCmode' + "Condition Code" mode represents the value of a condition code, + which is a machine-specific set of bits used to represent the + result of a comparison operation. Other machine-specific modes + may also be used for the condition code. These modes are not used + on machines that use `cc0' (see *note Condition Code::.). + +`BLKmode' + "Block" mode represents values that are aggregates to which none of + the other modes apply. In RTL, only memory references can have + this mode, and only if they appear in string-move or vector + instructions. On machines which have no such instructions, + `BLKmode' will not appear in RTL. + +`VOIDmode' + Void mode means the absence of a mode or an unspecified mode. For + example, RTL expressions of code `const_int' have mode `VOIDmode' + because they can be taken to have whatever mode the context + requires. In debugging dumps of RTL, `VOIDmode' is expressed by + the absence of any mode. + +`SCmode, DCmode, XCmode, TCmode' + These modes stand for a complex number represented as a pair of + floating point values. The floating point values are in `SFmode', + `DFmode', `XFmode', and `TFmode', respectively. + +`CQImode, CHImode, CSImode, CDImode, CTImode, COImode' + These modes stand for a complex number represented as a pair of + integer values. The integer values are in `QImode', `HImode', + `SImode', `DImode', `TImode', and `OImode', respectively. + + The machine description defines `Pmode' as a C macro which expands +into the machine mode used for addresses. Normally this is the mode +whose size is `BITS_PER_WORD', `SImode' on 32-bit machines. + + The only modes which a machine description must support are +`QImode', and the modes corresponding to `BITS_PER_WORD', +`FLOAT_TYPE_SIZE' and `DOUBLE_TYPE_SIZE'. The compiler will attempt to +use `DImode' for 8-byte structures and unions, but this can be +prevented by overriding the definition of `MAX_FIXED_MODE_SIZE'. +Alternatively, you can have the compiler use `TImode' for 16-byte +structures and unions. Likewise, you can arrange for the C type `short +int' to avoid using `HImode'. + + Very few explicit references to machine modes remain in the compiler +and these few references will soon be removed. Instead, the machine +modes are divided into mode classes. These are represented by the +enumeration type `enum mode_class' defined in `machmode.h'. The +possible mode classes are: + +`MODE_INT' + Integer modes. By default these are `QImode', `HImode', `SImode', + `DImode', and `TImode'. + +`MODE_PARTIAL_INT' + The "partial integer" modes, `PSImode' and `PDImode'. + +`MODE_FLOAT' + floating point modes. By default these are `SFmode', `DFmode', + `XFmode' and `TFmode'. + +`MODE_COMPLEX_INT' + Complex integer modes. (These are not currently implemented). + +`MODE_COMPLEX_FLOAT' + Complex floating point modes. By default these are `SCmode', + `DCmode', `XCmode', and `TCmode'. + +`MODE_FUNCTION' + Algol or Pascal function variables including a static chain. + (These are not currently implemented). + +`MODE_CC' + Modes representing condition code values. These are `CCmode' plus + any modes listed in the `EXTRA_CC_MODES' macro. *Note Jump + Patterns::, also see *Note Condition Code::. + +`MODE_RANDOM' + This is a catchall mode class for modes which don't fit into the + above classes. Currently `VOIDmode' and `BLKmode' are in + `MODE_RANDOM'. + + Here are some C macros that relate to machine modes: + +`GET_MODE (X)' + Returns the machine mode of the RTX X. + +`PUT_MODE (X, NEWMODE)' + Alters the machine mode of the RTX X to be NEWMODE. + +`NUM_MACHINE_MODES' + Stands for the number of machine modes available on the target + machine. This is one greater than the largest numeric value of any + machine mode. + +`GET_MODE_NAME (M)' + Returns the name of mode M as a string. + +`GET_MODE_CLASS (M)' + Returns the mode class of mode M. + +`GET_MODE_WIDER_MODE (M)' + Returns the next wider natural mode. For example, the expression + `GET_MODE_WIDER_MODE (QImode)' returns `HImode'. + +`GET_MODE_SIZE (M)' + Returns the size in bytes of a datum of mode M. + +`GET_MODE_BITSIZE (M)' + Returns the size in bits of a datum of mode M. + +`GET_MODE_MASK (M)' + Returns a bitmask containing 1 for all bits in a word that fit + within mode M. This macro can only be used for modes whose + bitsize is less than or equal to `HOST_BITS_PER_INT'. + +`GET_MODE_ALIGNMENT (M))' + Return the required alignment, in bits, for an object of mode M. + +`GET_MODE_UNIT_SIZE (M)' + Returns the size in bytes of the subunits of a datum of mode M. + This is the same as `GET_MODE_SIZE' except in the case of complex + modes. For them, the unit size is the size of the real or + imaginary part. + +`GET_MODE_NUNITS (M)' + Returns the number of units contained in a mode, i.e., + `GET_MODE_SIZE' divided by `GET_MODE_UNIT_SIZE'. + +`GET_CLASS_NARROWEST_MODE (C)' + Returns the narrowest mode in mode class C. + + The global variables `byte_mode' and `word_mode' contain modes whose +classes are `MODE_INT' and whose bitsizes are either `BITS_PER_UNIT' or +`BITS_PER_WORD', respectively. On 32-bit machines, these are `QImode' +and `SImode', respectively. + + +File: gcc.info, Node: Constants, Next: Regs and Memory, Prev: Machine Modes, Up: RTL + +Constant Expression Types +========================= + + The simplest RTL expressions are those that represent constant +values. + +`(const_int I)' + This type of expression represents the integer value I. I is + customarily accessed with the macro `INTVAL' as in `INTVAL (EXP)', + which is equivalent to `XWINT (EXP, 0)'. + + There is only one expression object for the integer value zero; it + is the value of the variable `const0_rtx'. Likewise, the only + expression for integer value one is found in `const1_rtx', the only + expression for integer value two is found in `const2_rtx', and the + only expression for integer value negative one is found in + `constm1_rtx'. Any attempt to create an expression of code + `const_int' and value zero, one, two or negative one will return + `const0_rtx', `const1_rtx', `const2_rtx' or `constm1_rtx' as + appropriate. + + Similarly, there is only one object for the integer whose value is + `STORE_FLAG_VALUE'. It is found in `const_true_rtx'. If + `STORE_FLAG_VALUE' is one, `const_true_rtx' and `const1_rtx' will + point to the same object. If `STORE_FLAG_VALUE' is -1, + `const_true_rtx' and `constm1_rtx' will point to the same object. + +`(const_double:M ADDR I0 I1 ...)' + Represents either a floating-point constant of mode M or an + integer constant too large to fit into `HOST_BITS_PER_WIDE_INT' + bits but small enough to fit within twice that number of bits (GNU + CC does not provide a mechanism to represent even larger + constants). In the latter case, M will be `VOIDmode'. + + ADDR is used to contain the `mem' expression that corresponds to + the location in memory that at which the constant can be found. If + it has not been allocated a memory location, but is on the chain + of all `const_double' expressions in this compilation (maintained + using an undisplayed field), ADDR contains `const0_rtx'. If it is + not on the chain, ADDR contains `cc0_rtx'. ADDR is customarily + accessed with the macro `CONST_DOUBLE_MEM' and the chain field via + `CONST_DOUBLE_CHAIN'. + + If M is `VOIDmode', the bits of the value are stored in I0 and I1. + I0 is customarily accessed with the macro `CONST_DOUBLE_LOW' and + I1 with `CONST_DOUBLE_HIGH'. + + If the constant is floating point (regardless of its precision), + then the number of integers used to store the value depends on the + size of `REAL_VALUE_TYPE' (*note Cross-compilation::.). The + integers represent a floating point number, but not precisely in + the target machine's or host machine's floating point format. To + convert them to the precise bit pattern used by the target + machine, use the macro `REAL_VALUE_TO_TARGET_DOUBLE' and friends + (*note Data Output::.). + + The macro `CONST0_RTX (MODE)' refers to an expression with value 0 + in mode MODE. If mode MODE is of mode class `MODE_INT', it + returns `const0_rtx'. Otherwise, it returns a `CONST_DOUBLE' + expression in mode MODE. Similarly, the macro `CONST1_RTX (MODE)' + refers to an expression with value 1 in mode MODE and similarly + for `CONST2_RTX'. + +`(const_string STR)' + Represents a constant string with value STR. Currently this is + used only for insn attributes (*note Insn Attributes::.) since + constant strings in C are placed in memory. + +`(symbol_ref:MODE SYMBOL)' + Represents the value of an assembler label for data. SYMBOL is a + string that describes the name of the assembler label. If it + starts with a `*', the label is the rest of SYMBOL not including + the `*'. Otherwise, the label is SYMBOL, usually prefixed with + `_'. + + The `symbol_ref' contains a mode, which is usually `Pmode'. + Usually that is the only mode for which a symbol is directly valid. + +`(label_ref LABEL)' + Represents the value of an assembler label for code. It contains + one operand, an expression, which must be a `code_label' that + appears in the instruction sequence to identify the place where + the label should go. + + The reason for using a distinct expression type for code label + references is so that jump optimization can distinguish them. + +`(const:M EXP)' + Represents a constant that is the result of an assembly-time + arithmetic computation. The operand, EXP, is an expression that + contains only constants (`const_int', `symbol_ref' and `label_ref' + expressions) combined with `plus' and `minus'. However, not all + combinations are valid, since the assembler cannot do arbitrary + arithmetic on relocatable symbols. + + M should be `Pmode'. + +`(high:M EXP)' + Represents the high-order bits of EXP, usually a `symbol_ref'. + The number of bits is machine-dependent and is normally the number + of bits specified in an instruction that initializes the high + order bits of a register. It is used with `lo_sum' to represent + the typical two-instruction sequence used in RISC machines to + reference a global memory location. + + M should be `Pmode'. + + +File: gcc.info, Node: Regs and Memory, Next: Arithmetic, Prev: Constants, Up: RTL + +Registers and Memory +==================== + + Here are the RTL expression types for describing access to machine +registers and to main memory. + +`(reg:M N)' + For small values of the integer N (those that are less than + `FIRST_PSEUDO_REGISTER'), this stands for a reference to machine + register number N: a "hard register". For larger values of N, it + stands for a temporary value or "pseudo register". The compiler's + strategy is to generate code assuming an unlimited number of such + pseudo registers, and later convert them into hard registers or + into memory references. + + M is the machine mode of the reference. It is necessary because + machines can generally refer to each register in more than one + mode. For example, a register may contain a full word but there + may be instructions to refer to it as a half word or as a single + byte, as well as instructions to refer to it as a floating point + number of various precisions. + + Even for a register that the machine can access in only one mode, + the mode must always be specified. + + The symbol `FIRST_PSEUDO_REGISTER' is defined by the machine + description, since the number of hard registers on the machine is + an invariant characteristic of the machine. Note, however, that + not all of the machine registers must be general registers. All + the machine registers that can be used for storage of data are + given hard register numbers, even those that can be used only in + certain instructions or can hold only certain types of data. + + A hard register may be accessed in various modes throughout one + function, but each pseudo register is given a natural mode and is + accessed only in that mode. When it is necessary to describe an + access to a pseudo register using a nonnatural mode, a `subreg' + expression is used. + + A `reg' expression with a machine mode that specifies more than + one word of data may actually stand for several consecutive + registers. If in addition the register number specifies a + hardware register, then it actually represents several consecutive + hardware registers starting with the specified one. + + Each pseudo register number used in a function's RTL code is + represented by a unique `reg' expression. + + Some pseudo register numbers, those within the range of + `FIRST_VIRTUAL_REGISTER' to `LAST_VIRTUAL_REGISTER' only appear + during the RTL generation phase and are eliminated before the + optimization phases. These represent locations in the stack frame + that cannot be determined until RTL generation for the function + has been completed. The following virtual register numbers are + defined: + + `VIRTUAL_INCOMING_ARGS_REGNUM' + This points to the first word of the incoming arguments + passed on the stack. Normally these arguments are placed + there by the caller, but the callee may have pushed some + arguments that were previously passed in registers. + + When RTL generation is complete, this virtual register is + replaced by the sum of the register given by + `ARG_POINTER_REGNUM' and the value of `FIRST_PARM_OFFSET'. + + `VIRTUAL_STACK_VARS_REGNUM' + If `FRAME_GROWS_DOWNWARD' is defined, this points to + immediately above the first variable on the stack. + Otherwise, it points to the first variable on the stack. + + `VIRTUAL_STACK_VARS_REGNUM' is replaced with the sum of the + register given by `FRAME_POINTER_REGNUM' and the value + `STARTING_FRAME_OFFSET'. + + `VIRTUAL_STACK_DYNAMIC_REGNUM' + This points to the location of dynamically allocated memory + on the stack immediately after the stack pointer has been + adjusted by the amount of memory desired. + + This virtual register is replaced by the sum of the register + given by `STACK_POINTER_REGNUM' and the value + `STACK_DYNAMIC_OFFSET'. + + `VIRTUAL_OUTGOING_ARGS_REGNUM' + This points to the location in the stack at which outgoing + arguments should be written when the stack is pre-pushed + (arguments pushed using push insns should always use + `STACK_POINTER_REGNUM'). + + This virtual register is replaced by the sum of the register + given by `STACK_POINTER_REGNUM' and the value + `STACK_POINTER_OFFSET'. + +`(subreg:M REG WORDNUM)' + `subreg' expressions are used to refer to a register in a machine + mode other than its natural one, or to refer to one register of a + multi-word `reg' that actually refers to several registers. + + Each pseudo-register has a natural mode. If it is necessary to + operate on it in a different mode--for example, to perform a + fullword move instruction on a pseudo-register that contains a + single byte--the pseudo-register must be enclosed in a `subreg'. + In such a case, WORDNUM is zero. + + Usually M is at least as narrow as the mode of REG, in which case + it is restricting consideration to only the bits of REG that are + in M. + + Sometimes M is wider than the mode of REG. These `subreg' + expressions are often called "paradoxical". They are used in + cases where we want to refer to an object in a wider mode but do + not care what value the additional bits have. The reload pass + ensures that paradoxical references are only made to hard + registers. + + The other use of `subreg' is to extract the individual registers of + a multi-register value. Machine modes such as `DImode' and + `TImode' can indicate values longer than a word, values which + usually require two or more consecutive registers. To access one + of the registers, use a `subreg' with mode `SImode' and a WORDNUM + that says which register. + + Storing in a non-paradoxical `subreg' has undefined results for + bits belonging to the same word as the `subreg'. This laxity makes + it easier to generate efficient code for such instructions. To + represent an instruction that preserves all the bits outside of + those in the `subreg', use `strict_low_part' around the `subreg'. + + The compilation parameter `WORDS_BIG_ENDIAN', if set to 1, says + that word number zero is the most significant part; otherwise, it + is the least significant part. + + On a few targets, `FLOAT_WORDS_BIG_ENDIAN' disagrees with + `WORDS_BIG_ENDIAN'. However, most parts of the compiler treat + floating point values as if they had the same endianness as + integer values. This works because they handle them solely as a + collection of integer values, with no particular numerical value. + Only real.c and the runtime libraries care about + `FLOAT_WORDS_BIG_ENDIAN'. + + Between the combiner pass and the reload pass, it is possible to + have a paradoxical `subreg' which contains a `mem' instead of a + `reg' as its first operand. After the reload pass, it is also + possible to have a non-paradoxical `subreg' which contains a + `mem'; this usually occurs when the `mem' is a stack slot which + replaced a pseudo register. + + Note that it is not valid to access a `DFmode' value in `SFmode' + using a `subreg'. On some machines the most significant part of a + `DFmode' value does not have the same format as a single-precision + floating value. + + It is also not valid to access a single word of a multi-word value + in a hard register when less registers can hold the value than + would be expected from its size. For example, some 32-bit + machines have floating-point registers that can hold an entire + `DFmode' value. If register 10 were such a register `(subreg:SI + (reg:DF 10) 1)' would be invalid because there is no way to + convert that reference to a single machine register. The reload + pass prevents `subreg' expressions such as these from being formed. + + The first operand of a `subreg' expression is customarily accessed + with the `SUBREG_REG' macro and the second operand is customarily + accessed with the `SUBREG_WORD' macro. + +`(scratch:M)' + This represents a scratch register that will be required for the + execution of a single instruction and not used subsequently. It is + converted into a `reg' by either the local register allocator or + the reload pass. + + `scratch' is usually present inside a `clobber' operation (*note + Side Effects::.). + +`(cc0)' + This refers to the machine's condition code register. It has no + operands and may not have a machine mode. There are two ways to + use it: + + * To stand for a complete set of condition code flags. This is + best on most machines, where each comparison sets the entire + series of flags. + + With this technique, `(cc0)' may be validly used in only two + contexts: as the destination of an assignment (in test and + compare instructions) and in comparison operators comparing + against zero (`const_int' with value zero; that is to say, + `const0_rtx'). + + * To stand for a single flag that is the result of a single + condition. This is useful on machines that have only a + single flag bit, and in which comparison instructions must + specify the condition to test. + + With this technique, `(cc0)' may be validly used in only two + contexts: as the destination of an assignment (in test and + compare instructions) where the source is a comparison + operator, and as the first operand of `if_then_else' (in a + conditional branch). + + There is only one expression object of code `cc0'; it is the value + of the variable `cc0_rtx'. Any attempt to create an expression of + code `cc0' will return `cc0_rtx'. + + Instructions can set the condition code implicitly. On many + machines, nearly all instructions set the condition code based on + the value that they compute or store. It is not necessary to + record these actions explicitly in the RTL because the machine + description includes a prescription for recognizing the + instructions that do so (by means of the macro + `NOTICE_UPDATE_CC'). *Note Condition Code::. Only instructions + whose sole purpose is to set the condition code, and instructions + that use the condition code, need mention `(cc0)'. + + On some machines, the condition code register is given a register + number and a `reg' is used instead of `(cc0)'. This is usually the + preferable approach if only a small subset of instructions modify + the condition code. Other machines store condition codes in + general registers; in such cases a pseudo register should be used. + + Some machines, such as the Sparc and RS/6000, have two sets of + arithmetic instructions, one that sets and one that does not set + the condition code. This is best handled by normally generating + the instruction that does not set the condition code, and making a + pattern that both performs the arithmetic and sets the condition + code register (which would not be `(cc0)' in this case). For + examples, search for `addcc' and `andcc' in `sparc.md'. + +`(pc)' + This represents the machine's program counter. It has no operands + and may not have a machine mode. `(pc)' may be validly used only + in certain specific contexts in jump instructions. + + There is only one expression object of code `pc'; it is the value + of the variable `pc_rtx'. Any attempt to create an expression of + code `pc' will return `pc_rtx'. + + All instructions that do not jump alter the program counter + implicitly by incrementing it, but there is no need to mention + this in the RTL. + +`(mem:M ADDR)' + This RTX represents a reference to main memory at an address + represented by the expression ADDR. M specifies how large a unit + of memory is accessed. + +`(addressof:M REG)' + This RTX represents a request for the address of register REG. + Its mode is always `Pmode'. If there are any `addressof' + expressions left in the function after CSE, REG is forced into the + stack and the `addressof' expression is replaced with a `plus' + expression for the address of its stack slot. + + +File: gcc.info, Node: Arithmetic, Next: Comparisons, Prev: Regs and Memory, Up: RTL + +RTL Expressions for Arithmetic +============================== + + Unless otherwise specified, all the operands of arithmetic +expressions must be valid for mode M. An operand is valid for mode M +if it has mode M, or if it is a `const_int' or `const_double' and M is +a mode of class `MODE_INT'. + + For commutative binary operations, constants should be placed in the +second operand. + +`(plus:M X Y)' + Represents the sum of the values represented by X and Y carried + out in machine mode M. + +`(lo_sum:M X Y)' + Like `plus', except that it represents that sum of X and the + low-order bits of Y. The number of low order bits is + machine-dependent but is normally the number of bits in a `Pmode' + item minus the number of bits set by the `high' code (*note + Constants::.). + + M should be `Pmode'. + +`(minus:M X Y)' + Like `plus' but represents subtraction. + +`(compare:M X Y)' + Represents the result of subtracting Y from X for purposes of + comparison. The result is computed without overflow, as if with + infinite precision. + + Of course, machines can't really subtract with infinite precision. + However, they can pretend to do so when only the sign of the + result will be used, which is the case when the result is stored + in the condition code. And that is the only way this kind of + expression may validly be used: as a value to be stored in the + condition codes. + + The mode M is not related to the modes of X and Y, but instead is + the mode of the condition code value. If `(cc0)' is used, it is + `VOIDmode'. Otherwise it is some mode in class `MODE_CC', often + `CCmode'. *Note Condition Code::. + + Normally, X and Y must have the same mode. Otherwise, `compare' + is valid only if the mode of X is in class `MODE_INT' and Y is a + `const_int' or `const_double' with mode `VOIDmode'. The mode of X + determines what mode the comparison is to be done in; thus it must + not be `VOIDmode'. + + If one of the operands is a constant, it should be placed in the + second operand and the comparison code adjusted as appropriate. + + A `compare' specifying two `VOIDmode' constants is not valid since + there is no way to know in what mode the comparison is to be + performed; the comparison must either be folded during the + compilation or the first operand must be loaded into a register + while its mode is still known. + +`(neg:M X)' + Represents the negation (subtraction from zero) of the value + represented by X, carried out in mode M. + +`(mult:M X Y)' + Represents the signed product of the values represented by X and Y + carried out in machine mode M. + + Some machines support a multiplication that generates a product + wider than the operands. Write the pattern for this as + + (mult:M (sign_extend:M X) (sign_extend:M Y)) + + where M is wider than the modes of X and Y, which need not be the + same. + + Write patterns for unsigned widening multiplication similarly using + `zero_extend'. + +`(div:M X Y)' + Represents the quotient in signed division of X by Y, carried out + in machine mode M. If M is a floating point mode, it represents + the exact quotient; otherwise, the integerized quotient. + + Some machines have division instructions in which the operands and + quotient widths are not all the same; you should represent such + instructions using `truncate' and `sign_extend' as in, + + (truncate:M1 (div:M2 X (sign_extend:M2 Y))) + +`(udiv:M X Y)' + Like `div' but represents unsigned division. + +`(mod:M X Y)' +`(umod:M X Y)' + Like `div' and `udiv' but represent the remainder instead of the + quotient. + +`(smin:M X Y)' +`(smax:M X Y)' + Represents the smaller (for `smin') or larger (for `smax') of X + and Y, interpreted as signed integers in mode M. + +`(umin:M X Y)' +`(umax:M X Y)' + Like `smin' and `smax', but the values are interpreted as unsigned + integers. + +`(not:M X)' + Represents the bitwise complement of the value represented by X, + carried out in mode M, which must be a fixed-point machine mode. + +`(and:M X Y)' + Represents the bitwise logical-and of the values represented by X + and Y, carried out in machine mode M, which must be a fixed-point + machine mode. + +`(ior:M X Y)' + Represents the bitwise inclusive-or of the values represented by X + and Y, carried out in machine mode M, which must be a fixed-point + mode. + +`(xor:M X Y)' + Represents the bitwise exclusive-or of the values represented by X + and Y, carried out in machine mode M, which must be a fixed-point + mode. + +`(ashift:M X C)' + Represents the result of arithmetically shifting X left by C + places. X have mode M, a fixed-point machine mode. C be a + fixed-point mode or be a constant with mode `VOIDmode'; which mode + is determined by the mode called for in the machine description + entry for the left-shift instruction. For example, on the Vax, + the mode of C is `QImode' regardless of M. + +`(lshiftrt:M X C)' +`(ashiftrt:M X C)' + Like `ashift' but for right shift. Unlike the case for left shift, + these two operations are distinct. + +`(rotate:M X C)' +`(rotatert:M X C)' + Similar but represent left and right rotate. If C is a constant, + use `rotate'. + +`(abs:M X)' + Represents the absolute value of X, computed in mode M. + +`(sqrt:M X)' + Represents the square root of X, computed in mode M. Most often M + will be a floating point mode. + +`(ffs:M X)' + Represents one plus the index of the least significant 1-bit in X, + represented as an integer of mode M. (The value is zero if X is + zero.) The mode of X need not be M; depending on the target + machine, various mode combinations may be valid. + + +File: gcc.info, Node: Comparisons, Next: Bit Fields, Prev: Arithmetic, Up: RTL + +Comparison Operations +===================== + + Comparison operators test a relation on two operands and are +considered to represent a machine-dependent nonzero value described by, +but not necessarily equal to, `STORE_FLAG_VALUE' (*note Misc::.) if +the relation holds, or zero if it does not. The mode of the comparison +operation is independent of the mode of the data being compared. If +the comparison operation is being tested (e.g., the first operand of an +`if_then_else'), the mode must be `VOIDmode'. If the comparison +operation is producing data to be stored in some variable, the mode +must be in class `MODE_INT'. All comparison operations producing data +must use the same mode, which is machine-specific. + + There are two ways that comparison operations may be used. The +comparison operators may be used to compare the condition codes `(cc0)' +against zero, as in `(eq (cc0) (const_int 0))'. Such a construct +actually refers to the result of the preceding instruction in which the +condition codes were set. The instructing setting the condition code +must be adjacent to the instruction using the condition code; only +`note' insns may separate them. + + Alternatively, a comparison operation may directly compare two data +objects. The mode of the comparison is determined by the operands; they +must both be valid for a common machine mode. A comparison with both +operands constant would be invalid as the machine mode could not be +deduced from it, but such a comparison should never exist in RTL due to +constant folding. + + In the example above, if `(cc0)' were last set to `(compare X Y)', +the comparison operation is identical to `(eq X Y)'. Usually only one +style of comparisons is supported on a particular machine, but the +combine pass will try to merge the operations to produce the `eq' shown +in case it exists in the context of the particular insn involved. + + Inequality comparisons come in two flavors, signed and unsigned. +Thus, there are distinct expression codes `gt' and `gtu' for signed and +unsigned greater-than. These can produce different results for the same +pair of integer values: for example, 1 is signed greater-than -1 but not +unsigned greater-than, because -1 when regarded as unsigned is actually +`0xffffffff' which is greater than 1. + + The signed comparisons are also used for floating point values. +Floating point comparisons are distinguished by the machine modes of +the operands. + +`(eq:M X Y)' + 1 if the values represented by X and Y are equal, otherwise 0. + +`(ne:M X Y)' + 1 if the values represented by X and Y are not equal, otherwise 0. + +`(gt:M X Y)' + 1 if the X is greater than Y. If they are fixed-point, the + comparison is done in a signed sense. + +`(gtu:M X Y)' + Like `gt' but does unsigned comparison, on fixed-point numbers + only. + +`(lt:M X Y)' +`(ltu:M X Y)' + Like `gt' and `gtu' but test for "less than". + +`(ge:M X Y)' +`(geu:M X Y)' + Like `gt' and `gtu' but test for "greater than or equal". + +`(le:M X Y)' +`(leu:M X Y)' + Like `gt' and `gtu' but test for "less than or equal". + +`(if_then_else COND THEN ELSE)' + This is not a comparison operation but is listed here because it is + always used in conjunction with a comparison operation. To be + precise, COND is a comparison expression. This expression + represents a choice, according to COND, between the value + represented by THEN and the one represented by ELSE. + + On most machines, `if_then_else' expressions are valid only to + express conditional jumps. + +`(cond [TEST1 VALUE1 TEST2 VALUE2 ...] DEFAULT)' + Similar to `if_then_else', but more general. Each of TEST1, + TEST2, ... is performed in turn. The result of this expression is + the VALUE corresponding to the first non-zero test, or DEFAULT if + none of the tests are non-zero expressions. + + This is currently not valid for instruction patterns and is + supported only for insn attributes. *Note Insn Attributes::. + + +File: gcc.info, Node: Bit Fields, Next: Conversions, Prev: Comparisons, Up: RTL + +Bit Fields +========== + + Special expression codes exist to represent bitfield instructions. +These types of expressions are lvalues in RTL; they may appear on the +left side of an assignment, indicating insertion of a value into the +specified bit field. + +`(sign_extract:M LOC SIZE POS)' + This represents a reference to a sign-extended bit field contained + or starting in LOC (a memory or register reference). The bit field + is SIZE bits wide and starts at bit POS. The compilation option + `BITS_BIG_ENDIAN' says which end of the memory unit POS counts + from. + + If LOC is in memory, its mode must be a single-byte integer mode. + If LOC is in a register, the mode to use is specified by the + operand of the `insv' or `extv' pattern (*note Standard Names::.) + and is usually a full-word integer mode, which is the default if + none is specified. + + The mode of POS is machine-specific and is also specified in the + `insv' or `extv' pattern. + + The mode M is the same as the mode that would be used for LOC if + it were a register. + +`(zero_extract:M LOC SIZE POS)' + Like `sign_extract' but refers to an unsigned or zero-extended bit + field. The same sequence of bits are extracted, but they are + filled to an entire word with zeros instead of by sign-extension. + + +File: gcc.info, Node: Conversions, Next: RTL Declarations, Prev: Bit Fields, Up: RTL + +Conversions +=========== + + All conversions between machine modes must be represented by +explicit conversion operations. For example, an expression which is +the sum of a byte and a full word cannot be written as `(plus:SI +(reg:QI 34) (reg:SI 80))' because the `plus' operation requires two +operands of the same machine mode. Therefore, the byte-sized operand +is enclosed in a conversion operation, as in + + (plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80)) + + The conversion operation is not a mere placeholder, because there +may be more than one way of converting from a given starting mode to +the desired final mode. The conversion operation code says how to do +it. + + For all conversion operations, X must not be `VOIDmode' because the +mode in which to do the conversion would not be known. The conversion +must either be done at compile-time or X must be placed into a register. + +`(sign_extend:M X)' + Represents the result of sign-extending the value X to machine + mode M. M must be a fixed-point mode and X a fixed-point value of + a mode narrower than M. + +`(zero_extend:M X)' + Represents the result of zero-extending the value X to machine + mode M. M must be a fixed-point mode and X a fixed-point value of + a mode narrower than M. + +`(float_extend:M X)' + Represents the result of extending the value X to machine mode M. + M must be a floating point mode and X a floating point value of a + mode narrower than M. + +`(truncate:M X)' + Represents the result of truncating the value X to machine mode M. + M must be a fixed-point mode and X a fixed-point value of a mode + wider than M. + +`(float_truncate:M X)' + Represents the result of truncating the value X to machine mode M. + M must be a floating point mode and X a floating point value of a + mode wider than M. + +`(float:M X)' + Represents the result of converting fixed point value X, regarded + as signed, to floating point mode M. + +`(unsigned_float:M X)' + Represents the result of converting fixed point value X, regarded + as unsigned, to floating point mode M. + +`(fix:M X)' + When M is a fixed point mode, represents the result of converting + floating point value X to mode M, regarded as signed. How + rounding is done is not specified, so this operation may be used + validly in compiling C code only for integer-valued operands. + +`(unsigned_fix:M X)' + Represents the result of converting floating point value X to + fixed point mode M, regarded as unsigned. How rounding is done is + not specified. + +`(fix:M X)' + When M is a floating point mode, represents the result of + converting floating point value X (valid for mode M) to an + integer, still represented in floating point mode M, by rounding + towards zero. + diff --git a/usr/local/nachos/info/gcc.info-17 b/usr/local/nachos/info/gcc.info-17 new file mode 100644 index 0000000..50a6b2f --- /dev/null +++ b/usr/local/nachos/info/gcc.info-17 @@ -0,0 +1,1085 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: RTL Declarations, Next: Side Effects, Prev: Conversions, Up: RTL + +Declarations +============ + + Declaration expression codes do not represent arithmetic operations +but rather state assertions about their operands. + +`(strict_low_part (subreg:M (reg:N R) 0))' + This expression code is used in only one context: as the + destination operand of a `set' expression. In addition, the + operand of this expression must be a non-paradoxical `subreg' + expression. + + The presence of `strict_low_part' says that the part of the + register which is meaningful in mode N, but is not part of mode M, + is not to be altered. Normally, an assignment to such a subreg is + allowed to have undefined effects on the rest of the register when + M is less than a word. + + +File: gcc.info, Node: Side Effects, Next: Incdec, Prev: RTL Declarations, Up: RTL + +Side Effect Expressions +======================= + + The expression codes described so far represent values, not actions. +But machine instructions never produce values; they are meaningful only +for their side effects on the state of the machine. Special expression +codes are used to represent side effects. + + The body of an instruction is always one of these side effect codes; +the codes described above, which represent values, appear only as the +operands of these. + +`(set LVAL X)' + Represents the action of storing the value of X into the place + represented by LVAL. LVAL must be an expression representing a + place that can be stored in: `reg' (or `subreg' or + `strict_low_part'), `mem', `pc' or `cc0'. + + If LVAL is a `reg', `subreg' or `mem', it has a machine mode; then + X must be valid for that mode. + + If LVAL is a `reg' whose machine mode is less than the full width + of the register, then it means that the part of the register + specified by the machine mode is given the specified value and the + rest of the register receives an undefined value. Likewise, if + LVAL is a `subreg' whose machine mode is narrower than the mode of + the register, the rest of the register can be changed in an + undefined way. + + If LVAL is a `strict_low_part' of a `subreg', then the part of the + register specified by the machine mode of the `subreg' is given + the value X and the rest of the register is not changed. + + If LVAL is `(cc0)', it has no machine mode, and X may be either a + `compare' expression or a value that may have any mode. The + latter case represents a "test" instruction. The expression `(set + (cc0) (reg:M N))' is equivalent to `(set (cc0) (compare (reg:M N) + (const_int 0)))'. Use the former expression to save space during + the compilation. + + If LVAL is `(pc)', we have a jump instruction, and the + possibilities for X are very limited. It may be a `label_ref' + expression (unconditional jump). It may be an `if_then_else' + (conditional jump), in which case either the second or the third + operand must be `(pc)' (for the case which does not jump) and the + other of the two must be a `label_ref' (for the case which does + jump). X may also be a `mem' or `(plus:SI (pc) Y)', where Y may + be a `reg' or a `mem'; these unusual patterns are used to + represent jumps through branch tables. + + If LVAL is neither `(cc0)' nor `(pc)', the mode of LVAL must not + be `VOIDmode' and the mode of X must be valid for the mode of LVAL. + + LVAL is customarily accessed with the `SET_DEST' macro and X with + the `SET_SRC' macro. + +`(return)' + As the sole expression in a pattern, represents a return from the + current function, on machines where this can be done with one + instruction, such as Vaxes. On machines where a multi-instruction + "epilogue" must be executed in order to return from the function, + returning is done by jumping to a label which precedes the + epilogue, and the `return' expression code is never used. + + Inside an `if_then_else' expression, represents the value to be + placed in `pc' to return to the caller. + + Note that an insn pattern of `(return)' is logically equivalent to + `(set (pc) (return))', but the latter form is never used. + +`(call FUNCTION NARGS)' + Represents a function call. FUNCTION is a `mem' expression whose + address is the address of the function to be called. NARGS is an + expression which can be used for two purposes: on some machines it + represents the number of bytes of stack argument; on others, it + represents the number of argument registers. + + Each machine has a standard machine mode which FUNCTION must have. + The machine description defines macro `FUNCTION_MODE' to expand + into the requisite mode name. The purpose of this mode is to + specify what kind of addressing is allowed, on machines where the + allowed kinds of addressing depend on the machine mode being + addressed. + +`(clobber X)' + Represents the storing or possible storing of an unpredictable, + undescribed value into X, which must be a `reg', `scratch' or + `mem' expression. + + One place this is used is in string instructions that store + standard values into particular hard registers. It may not be + worth the trouble to describe the values that are stored, but it + is essential to inform the compiler that the registers will be + altered, lest it attempt to keep data in them across the string + instruction. + + If X is `(mem:BLK (const_int 0))', it means that all memory + locations must be presumed clobbered. + + Note that the machine description classifies certain hard + registers as "call-clobbered". All function call instructions are + assumed by default to clobber these registers, so there is no need + to use `clobber' expressions to indicate this fact. Also, each + function call is assumed to have the potential to alter any memory + location, unless the function is declared `const'. + + If the last group of expressions in a `parallel' are each a + `clobber' expression whose arguments are `reg' or `match_scratch' + (*note RTL Template::.) expressions, the combiner phase can add + the appropriate `clobber' expressions to an insn it has + constructed when doing so will cause a pattern to be matched. + + This feature can be used, for example, on a machine that whose + multiply and add instructions don't use an MQ register but which + has an add-accumulate instruction that does clobber the MQ + register. Similarly, a combined instruction might require a + temporary register while the constituent instructions might not. + + When a `clobber' expression for a register appears inside a + `parallel' with other side effects, the register allocator + guarantees that the register is unoccupied both before and after + that insn. However, the reload phase may allocate a register used + for one of the inputs unless the `&' constraint is specified for + the selected alternative (*note Modifiers::.). You can clobber + either a specific hard register, a pseudo register, or a `scratch' + expression; in the latter two cases, GNU CC will allocate a hard + register that is available there for use as a temporary. + + For instructions that require a temporary register, you should use + `scratch' instead of a pseudo-register because this will allow the + combiner phase to add the `clobber' when required. You do this by + coding (`clobber' (`match_scratch' ...)). If you do clobber a + pseudo register, use one which appears nowhere else--generate a + new one each time. Otherwise, you may confuse CSE. + + There is one other known use for clobbering a pseudo register in a + `parallel': when one of the input operands of the insn is also + clobbered by the insn. In this case, using the same pseudo + register in the clobber and elsewhere in the insn produces the + expected results. + +`(use X)' + Represents the use of the value of X. It indicates that the value + in X at this point in the program is needed, even though it may + not be apparent why this is so. Therefore, the compiler will not + attempt to delete previous instructions whose only effect is to + store a value in X. X must be a `reg' expression. + + During the reload phase, an insn that has a `use' as pattern can + carry a reg_equal note. These `use' insns will be deleted before + the reload phase exits. + + During the delayed branch scheduling phase, X may be an insn. + This indicates that X previously was located at this place in the + code and its data dependencies need to be taken into account. + These `use' insns will be deleted before the delayed branch + scheduling phase exits. + +`(parallel [X0 X1 ...])' + Represents several side effects performed in parallel. The square + brackets stand for a vector; the operand of `parallel' is a vector + of expressions. X0, X1 and so on are individual side effect + expressions--expressions of code `set', `call', `return', + `clobber' or `use'. + + "In parallel" means that first all the values used in the + individual side-effects are computed, and second all the actual + side-effects are performed. For example, + + (parallel [(set (reg:SI 1) (mem:SI (reg:SI 1))) + (set (mem:SI (reg:SI 1)) (reg:SI 1))]) + + says unambiguously that the values of hard register 1 and the + memory location addressed by it are interchanged. In both places + where `(reg:SI 1)' appears as a memory address it refers to the + value in register 1 *before* the execution of the insn. + + It follows that it is *incorrect* to use `parallel' and expect the + result of one `set' to be available for the next one. For + example, people sometimes attempt to represent a jump-if-zero + instruction this way: + + (parallel [(set (cc0) (reg:SI 34)) + (set (pc) (if_then_else + (eq (cc0) (const_int 0)) + (label_ref ...) + (pc)))]) + + But this is incorrect, because it says that the jump condition + depends on the condition code value *before* this instruction, not + on the new value that is set by this instruction. + + Peephole optimization, which takes place together with final + assembly code output, can produce insns whose patterns consist of + a `parallel' whose elements are the operands needed to output the + resulting assembler code--often `reg', `mem' or constant + expressions. This would not be well-formed RTL at any other stage + in compilation, but it is ok then because no further optimization + remains to be done. However, the definition of the macro + `NOTICE_UPDATE_CC', if any, must deal with such insns if you + define any peephole optimizations. + +`(sequence [INSNS ...])' + Represents a sequence of insns. Each of the INSNS that appears in + the vector is suitable for appearing in the chain of insns, so it + must be an `insn', `jump_insn', `call_insn', `code_label', + `barrier' or `note'. + + A `sequence' RTX is never placed in an actual insn during RTL + generation. It represents the sequence of insns that result from a + `define_expand' *before* those insns are passed to `emit_insn' to + insert them in the chain of insns. When actually inserted, the + individual sub-insns are separated out and the `sequence' is + forgotten. + + After delay-slot scheduling is completed, an insn and all the + insns that reside in its delay slots are grouped together into a + `sequence'. The insn requiring the delay slot is the first insn + in the vector; subsequent insns are to be placed in the delay slot. + + `INSN_ANNULLED_BRANCH_P' is set on an insn in a delay slot to + indicate that a branch insn should be used that will conditionally + annul the effect of the insns in the delay slots. In such a case, + `INSN_FROM_TARGET_P' indicates that the insn is from the target of + the branch and should be executed only if the branch is taken; + otherwise the insn should be executed only if the branch is not + taken. *Note Delay Slots::. + + These expression codes appear in place of a side effect, as the body +of an insn, though strictly speaking they do not always describe side +effects as such: + +`(asm_input S)' + Represents literal assembler code as described by the string S. + +`(unspec [OPERANDS ...] INDEX)' +`(unspec_volatile [OPERANDS ...] INDEX)' + Represents a machine-specific operation on OPERANDS. INDEX + selects between multiple machine-specific operations. + `unspec_volatile' is used for volatile operations and operations + that may trap; `unspec' is used for other operations. + + These codes may appear inside a `pattern' of an insn, inside a + `parallel', or inside an expression. + +`(addr_vec:M [LR0 LR1 ...])' + Represents a table of jump addresses. The vector elements LR0, + etc., are `label_ref' expressions. The mode M specifies how much + space is given to each address; normally M would be `Pmode'. + +`(addr_diff_vec:M BASE [LR0 LR1 ...] MIN MAX FLAGS)' + Represents a table of jump addresses expressed as offsets from + BASE. The vector elements LR0, etc., are `label_ref' expressions + and so is BASE. The mode M specifies how much space is given to + each address-difference. MIN and MAX are set up by branch + shortening and hold a label with a minimum and a maximum address, + respectively. FLAGS indicates the relative position of BASE, MIN + and MAX to the cointaining insn and of MIN and MAX to BASE. See + rtl.def for details. + + +File: gcc.info, Node: Incdec, Next: Assembler, Prev: Side Effects, Up: RTL + +Embedded Side-Effects on Addresses +================================== + + Six special side-effect expression codes appear as memory addresses. + +`(pre_dec:M X)' + Represents the side effect of decrementing X by a standard amount + and represents also the value that X has after being decremented. + X must be a `reg' or `mem', but most machines allow only a `reg'. + M must be the machine mode for pointers on the machine in use. + The amount X is decremented by is the length in bytes of the + machine mode of the containing memory reference of which this + expression serves as the address. Here is an example of its use: + + (mem:DF (pre_dec:SI (reg:SI 39))) + + This says to decrement pseudo register 39 by the length of a + `DFmode' value and use the result to address a `DFmode' value. + +`(pre_inc:M X)' + Similar, but specifies incrementing X instead of decrementing it. + +`(post_dec:M X)' + Represents the same side effect as `pre_dec' but a different + value. The value represented here is the value X has before being + decremented. + +`(post_inc:M X)' + Similar, but specifies incrementing X instead of decrementing it. + +`(post_modify:M X Y)' + Represents the side effect of setting X to Y and represents X + before X is modified. X must be a `reg' or `mem', but most + machines allow only a `reg'. M must be the machine mode for + pointers on the machine in use. The amount X is decremented by is + the length in bytes of the machine mode of the containing memory + reference of which this expression serves as the address. Note + that this is not currently implemented. + + The expression Y must be one of three forms: + `(plus:M X Z)', `(minus:M X Z)', or `(plus:M X I)', where Z + is an index register and I is a constant. + + Here is an example of its use: + + (mem:SF (post_modify:SI (reg:SI 42) (plus (reg:SI 42) (reg:SI 48)))) + + This says to modify pseudo register 42 by adding the contents of + pseudo register 48 to it, after the use of what ever 42 points to. + +`(pre_modify:M X EXPR)' + Similar except side effects happen before the use. + + These embedded side effect expressions must be used with care. +Instruction patterns may not use them. Until the `flow' pass of the +compiler, they may occur only to represent pushes onto the stack. The +`flow' pass finds cases where registers are incremented or decremented +in one instruction and used as an address shortly before or after; +these cases are then transformed to use pre- or post-increment or +-decrement. + + If a register used as the operand of these expressions is used in +another address in an insn, the original value of the register is used. +Uses of the register outside of an address are not permitted within the +same insn as a use in an embedded side effect expression because such +insns behave differently on different machines and hence must be treated +as ambiguous and disallowed. + + An instruction that can be represented with an embedded side effect +could also be represented using `parallel' containing an additional +`set' to describe how the address register is altered. This is not +done because machines that allow these operations at all typically +allow them wherever a memory address is called for. Describing them as +additional parallel stores would require doubling the number of entries +in the machine description. + + +File: gcc.info, Node: Assembler, Next: Insns, Prev: Incdec, Up: RTL + +Assembler Instructions as Expressions +===================================== + + The RTX code `asm_operands' represents a value produced by a +user-specified assembler instruction. It is used to represent an `asm' +statement with arguments. An `asm' statement with a single output +operand, like this: + + asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z)); + +is represented using a single `asm_operands' RTX which represents the +value that is stored in `outputvar': + + (set RTX-FOR-OUTPUTVAR + (asm_operands "foo %1,%2,%0" "a" 0 + [RTX-FOR-ADDITION-RESULT RTX-FOR-*Z] + [(asm_input:M1 "g") + (asm_input:M2 "di")])) + +Here the operands of the `asm_operands' RTX are the assembler template +string, the output-operand's constraint, the index-number of the output +operand among the output operands specified, a vector of input operand +RTX's, and a vector of input-operand modes and constraints. The mode +M1 is the mode of the sum `x+y'; M2 is that of `*z'. + + When an `asm' statement has multiple output values, its insn has +several such `set' RTX's inside of a `parallel'. Each `set' contains a +`asm_operands'; all of these share the same assembler template and +vectors, but each contains the constraint for the respective output +operand. They are also distinguished by the output-operand index +number, which is 0, 1, ... for successive output operands. + + +File: gcc.info, Node: Insns, Next: Calls, Prev: Assembler, Up: RTL + +Insns +===== + + The RTL representation of the code for a function is a doubly-linked +chain of objects called "insns". Insns are expressions with special +codes that are used for no other purpose. Some insns are actual +instructions; others represent dispatch tables for `switch' statements; +others represent labels to jump to or various sorts of declarative +information. + + In addition to its own specific data, each insn must have a unique +id-number that distinguishes it from all other insns in the current +function (after delayed branch scheduling, copies of an insn with the +same id-number may be present in multiple places in a function, but +these copies will always be identical and will only appear inside a +`sequence'), and chain pointers to the preceding and following insns. +These three fields occupy the same position in every insn, independent +of the expression code of the insn. They could be accessed with `XEXP' +and `XINT', but instead three special macros are always used: + +`INSN_UID (I)' + Accesses the unique id of insn I. + +`PREV_INSN (I)' + Accesses the chain pointer to the insn preceding I. If I is the + first insn, this is a null pointer. + +`NEXT_INSN (I)' + Accesses the chain pointer to the insn following I. If I is the + last insn, this is a null pointer. + + The first insn in the chain is obtained by calling `get_insns'; the +last insn is the result of calling `get_last_insn'. Within the chain +delimited by these insns, the `NEXT_INSN' and `PREV_INSN' pointers must +always correspond: if INSN is not the first insn, + + NEXT_INSN (PREV_INSN (INSN)) == INSN + +is always true and if INSN is not the last insn, + + PREV_INSN (NEXT_INSN (INSN)) == INSN + +is always true. + + After delay slot scheduling, some of the insns in the chain might be +`sequence' expressions, which contain a vector of insns. The value of +`NEXT_INSN' in all but the last of these insns is the next insn in the +vector; the value of `NEXT_INSN' of the last insn in the vector is the +same as the value of `NEXT_INSN' for the `sequence' in which it is +contained. Similar rules apply for `PREV_INSN'. + + This means that the above invariants are not necessarily true for +insns inside `sequence' expressions. Specifically, if INSN is the +first insn in a `sequence', `NEXT_INSN (PREV_INSN (INSN))' is the insn +containing the `sequence' expression, as is the value of `PREV_INSN +(NEXT_INSN (INSN))' is INSN is the last insn in the `sequence' +expression. You can use these expressions to find the containing +`sequence' expression. + + Every insn has one of the following six expression codes: + +`insn' + The expression code `insn' is used for instructions that do not + jump and do not do function calls. `sequence' expressions are + always contained in insns with code `insn' even if one of those + insns should jump or do function calls. + + Insns with code `insn' have four additional fields beyond the three + mandatory ones listed above. These four are described in a table + below. + +`jump_insn' + The expression code `jump_insn' is used for instructions that may + jump (or, more generally, may contain `label_ref' expressions). If + there is an instruction to return from the current function, it is + recorded as a `jump_insn'. + + `jump_insn' insns have the same extra fields as `insn' insns, + accessed in the same way and in addition contain a field + `JUMP_LABEL' which is defined once jump optimization has completed. + + For simple conditional and unconditional jumps, this field + contains the `code_label' to which this insn will (possibly + conditionally) branch. In a more complex jump, `JUMP_LABEL' + records one of the labels that the insn refers to; the only way to + find the others is to scan the entire body of the insn. + + Return insns count as jumps, but since they do not refer to any + labels, they have zero in the `JUMP_LABEL' field. + +`call_insn' + The expression code `call_insn' is used for instructions that may + do function calls. It is important to distinguish these + instructions because they imply that certain registers and memory + locations may be altered unpredictably. + + `call_insn' insns have the same extra fields as `insn' insns, + accessed in the same way and in addition contain a field + `CALL_INSN_FUNCTION_USAGE', which contains a list (chain of + `expr_list' expressions) containing `use' and `clobber' + expressions that denote hard registers used or clobbered by the + called function. A register specified in a `clobber' in this list + is modified *after* the execution of the `call_insn', while a + register in a `clobber' in the body of the `call_insn' is + clobbered before the insn completes execution. `clobber' + expressions in this list augment registers specified in + `CALL_USED_REGISTERS' (*note Register Basics::.). + +`code_label' + A `code_label' insn represents a label that a jump insn can jump + to. It contains two special fields of data in addition to the + three standard ones. `CODE_LABEL_NUMBER' is used to hold the + "label number", a number that identifies this label uniquely among + all the labels in the compilation (not just in the current + function). Ultimately, the label is represented in the assembler + output as an assembler label, usually of the form `LN' where N is + the label number. + + When a `code_label' appears in an RTL expression, it normally + appears within a `label_ref' which represents the address of the + label, as a number. + + The field `LABEL_NUSES' is only defined once the jump optimization + phase is completed and contains the number of times this label is + referenced in the current function. + +`barrier' + Barriers are placed in the instruction stream when control cannot + flow past them. They are placed after unconditional jump + instructions to indicate that the jumps are unconditional and + after calls to `volatile' functions, which do not return (e.g., + `exit'). They contain no information beyond the three standard + fields. + +`note' + `note' insns are used to represent additional debugging and + declarative information. They contain two nonstandard fields, an + integer which is accessed with the macro `NOTE_LINE_NUMBER' and a + string accessed with `NOTE_SOURCE_FILE'. + + If `NOTE_LINE_NUMBER' is positive, the note represents the + position of a source line and `NOTE_SOURCE_FILE' is the source + file name that the line came from. These notes control generation + of line number data in the assembler output. + + Otherwise, `NOTE_LINE_NUMBER' is not really a line number but a + code with one of the following values (and `NOTE_SOURCE_FILE' must + contain a null pointer): + + `NOTE_INSN_DELETED' + Such a note is completely ignorable. Some passes of the + compiler delete insns by altering them into notes of this + kind. + + `NOTE_INSN_BLOCK_BEG' + `NOTE_INSN_BLOCK_END' + These types of notes indicate the position of the beginning + and end of a level of scoping of variable names. They + control the output of debugging information. + + `NOTE_INSN_EH_REGION_BEG' + `NOTE_INSN_EH_REGION_END' + These types of notes indicate the position of the beginning + and end of a level of scoping for exception handling. + `NOTE_BLOCK_NUMBER' identifies which `CODE_LABEL' is + associated with the given region. + + `NOTE_INSN_LOOP_BEG' + `NOTE_INSN_LOOP_END' + These types of notes indicate the position of the beginning + and end of a `while' or `for' loop. They enable the loop + optimizer to find loops quickly. + + `NOTE_INSN_LOOP_CONT' + Appears at the place in a loop that `continue' statements + jump to. + + `NOTE_INSN_LOOP_VTOP' + This note indicates the place in a loop where the exit test + begins for those loops in which the exit test has been + duplicated. This position becomes another virtual start of + the loop when considering loop invariants. + + `NOTE_INSN_FUNCTION_END' + Appears near the end of the function body, just before the + label that `return' statements jump to (on machine where a + single instruction does not suffice for returning). This + note may be deleted by jump optimization. + + `NOTE_INSN_SETJMP' + Appears following each call to `setjmp' or a related function. + + These codes are printed symbolically when they appear in debugging + dumps. + + The machine mode of an insn is normally `VOIDmode', but some phases +use the mode for various purposes. + + The common subexpression elimination pass sets the mode of an insn to +`QImode' when it is the first insn in a block that has already been +processed. + + The second Haifa scheduling pass, for targets that can multiple +issue, sets the mode of an insn to `TImode' when it is believed that the +instruction begins an issue group. That is, when the instruction +cannot issue simultaneously with the previous. This may be relied on +by later passes, in particular machine-dependant reorg. + + Here is a table of the extra fields of `insn', `jump_insn' and +`call_insn' insns: + +`PATTERN (I)' + An expression for the side effect performed by this insn. This + must be one of the following codes: `set', `call', `use', + `clobber', `return', `asm_input', `asm_output', `addr_vec', + `addr_diff_vec', `trap_if', `unspec', `unspec_volatile', + `parallel', or `sequence'. If it is a `parallel', each element of + the `parallel' must be one these codes, except that `parallel' + expressions cannot be nested and `addr_vec' and `addr_diff_vec' + are not permitted inside a `parallel' expression. + +`INSN_CODE (I)' + An integer that says which pattern in the machine description + matches this insn, or -1 if the matching has not yet been + attempted. + + Such matching is never attempted and this field remains -1 on an + insn whose pattern consists of a single `use', `clobber', + `asm_input', `addr_vec' or `addr_diff_vec' expression. + + Matching is also never attempted on insns that result from an `asm' + statement. These contain at least one `asm_operands' expression. + The function `asm_noperands' returns a non-negative value for such + insns. + + In the debugging output, this field is printed as a number + followed by a symbolic representation that locates the pattern in + the `md' file as some small positive or negative offset from a + named pattern. + +`LOG_LINKS (I)' + A list (chain of `insn_list' expressions) giving information about + dependencies between instructions within a basic block. Neither a + jump nor a label may come between the related insns. + +`REG_NOTES (I)' + A list (chain of `expr_list' and `insn_list' expressions) giving + miscellaneous information about the insn. It is often information + pertaining to the registers used in this insn. + + The `LOG_LINKS' field of an insn is a chain of `insn_list' +expressions. Each of these has two operands: the first is an insn, and +the second is another `insn_list' expression (the next one in the +chain). The last `insn_list' in the chain has a null pointer as second +operand. The significant thing about the chain is which insns appear +in it (as first operands of `insn_list' expressions). Their order is +not significant. + + This list is originally set up by the flow analysis pass; it is a +null pointer until then. Flow only adds links for those data +dependencies which can be used for instruction combination. For each +insn, the flow analysis pass adds a link to insns which store into +registers values that are used for the first time in this insn. The +instruction scheduling pass adds extra links so that every dependence +will be represented. Links represent data dependencies, +antidependencies and output dependencies; the machine mode of the link +distinguishes these three types: antidependencies have mode +`REG_DEP_ANTI', output dependencies have mode `REG_DEP_OUTPUT', and +data dependencies have mode `VOIDmode'. + + The `REG_NOTES' field of an insn is a chain similar to the +`LOG_LINKS' field but it includes `expr_list' expressions in addition +to `insn_list' expressions. There are several kinds of register notes, +which are distinguished by the machine mode, which in a register note +is really understood as being an `enum reg_note'. The first operand OP +of the note is data whose meaning depends on the kind of note. + + The macro `REG_NOTE_KIND (X)' returns the kind of register note. +Its counterpart, the macro `PUT_REG_NOTE_KIND (X, NEWKIND)' sets the +register note type of X to be NEWKIND. + + Register notes are of three classes: They may say something about an +input to an insn, they may say something about an output of an insn, or +they may create a linkage between two insns. There are also a set of +values that are only used in `LOG_LINKS'. + + These register notes annotate inputs to an insn: + +`REG_DEAD' + The value in OP dies in this insn; that is to say, altering the + value immediately after this insn would not affect the future + behavior of the program. + + This does not necessarily mean that the register OP has no useful + value after this insn since it may also be an output of the insn. + In such a case, however, a `REG_DEAD' note would be redundant and + is usually not present until after the reload pass, but no code + relies on this fact. + +`REG_INC' + The register OP is incremented (or decremented; at this level + there is no distinction) by an embedded side effect inside this + insn. This means it appears in a `post_inc', `pre_inc', + `post_dec' or `pre_dec' expression. + +`REG_NONNEG' + The register OP is known to have a nonnegative value when this + insn is reached. This is used so that decrement and branch until + zero instructions, such as the m68k dbra, can be matched. + + The `REG_NONNEG' note is added to insns only if the machine + description has a `decrement_and_branch_until_zero' pattern. + +`REG_NO_CONFLICT' + This insn does not cause a conflict between OP and the item being + set by this insn even though it might appear that it does. In + other words, if the destination register and OP could otherwise be + assigned the same register, this insn does not prevent that + assignment. + + Insns with this note are usually part of a block that begins with a + `clobber' insn specifying a multi-word pseudo register (which will + be the output of the block), a group of insns that each set one + word of the value and have the `REG_NO_CONFLICT' note attached, + and a final insn that copies the output to itself with an attached + `REG_EQUAL' note giving the expression being computed. This block + is encapsulated with `REG_LIBCALL' and `REG_RETVAL' notes on the + first and last insns, respectively. + +`REG_LABEL' + This insn uses OP, a `code_label', but is not a `jump_insn'. The + presence of this note allows jump optimization to be aware that OP + is, in fact, being used. + + The following notes describe attributes of outputs of an insn: + +`REG_EQUIV' +`REG_EQUAL' + This note is only valid on an insn that sets only one register and + indicates that that register will be equal to OP at run time; the + scope of this equivalence differs between the two types of notes. + The value which the insn explicitly copies into the register may + look different from OP, but they will be equal at run time. If the + output of the single `set' is a `strict_low_part' expression, the + note refers to the register that is contained in `SUBREG_REG' of + the `subreg' expression. + + For `REG_EQUIV', the register is equivalent to OP throughout the + entire function, and could validly be replaced in all its + occurrences by OP. ("Validly" here refers to the data flow of the + program; simple replacement may make some insns invalid.) For + example, when a constant is loaded into a register that is never + assigned any other value, this kind of note is used. + + When a parameter is copied into a pseudo-register at entry to a + function, a note of this kind records that the register is + equivalent to the stack slot where the parameter was passed. + Although in this case the register may be set by other insns, it + is still valid to replace the register by the stack slot + throughout the function. + + A `REG_EQUIV' note is also used on an instruction which copies a + register parameter into a pseudo-register at entry to a function, + if there is a stack slot where that parameter could be stored. + Although other insns may set the pseudo-register, it is valid for + the compiler to replace the pseudo-register by stack slot + throughout the function, provided the compiler ensures that the + stack slot is properly initialized by making the replacement in + the initial copy instruction as well. This is used on machines + for which the calling convention allocates stack space for + register parameters. See `REG_PARM_STACK_SPACE' in *Note Stack + Arguments::. + + In the case of `REG_EQUAL', the register that is set by this insn + will be equal to OP at run time at the end of this insn but not + necessarily elsewhere in the function. In this case, OP is + typically an arithmetic expression. For example, when a sequence + of insns such as a library call is used to perform an arithmetic + operation, this kind of note is attached to the insn that produces + or copies the final value. + + These two notes are used in different ways by the compiler passes. + `REG_EQUAL' is used by passes prior to register allocation (such as + common subexpression elimination and loop optimization) to tell + them how to think of that value. `REG_EQUIV' notes are used by + register allocation to indicate that there is an available + substitute expression (either a constant or a `mem' expression for + the location of a parameter on the stack) that may be used in + place of a register if insufficient registers are available. + + Except for stack homes for parameters, which are indicated by a + `REG_EQUIV' note and are not useful to the early optimization + passes and pseudo registers that are equivalent to a memory + location throughout there entire life, which is not detected until + later in the compilation, all equivalences are initially indicated + by an attached `REG_EQUAL' note. In the early stages of register + allocation, a `REG_EQUAL' note is changed into a `REG_EQUIV' note + if OP is a constant and the insn represents the only set of its + destination register. + + Thus, compiler passes prior to register allocation need only check + for `REG_EQUAL' notes and passes subsequent to register allocation + need only check for `REG_EQUIV' notes. + +`REG_UNUSED' + The register OP being set by this insn will not be used in a + subsequent insn. This differs from a `REG_DEAD' note, which + indicates that the value in an input will not be used subsequently. + These two notes are independent; both may be present for the same + register. + +`REG_WAS_0' + The single output of this insn contained zero before this insn. + OP is the insn that set it to zero. You can rely on this note if + it is present and OP has not been deleted or turned into a `note'; + its absence implies nothing. + + These notes describe linkages between insns. They occur in pairs: +one insn has one of a pair of notes that points to a second insn, which +has the inverse note pointing back to the first insn. + +`REG_RETVAL' + This insn copies the value of a multi-insn sequence (for example, a + library call), and OP is the first insn of the sequence (for a + library call, the first insn that was generated to set up the + arguments for the library call). + + Loop optimization uses this note to treat such a sequence as a + single operation for code motion purposes and flow analysis uses + this note to delete such sequences whose results are dead. + + A `REG_EQUAL' note will also usually be attached to this insn to + provide the expression being computed by the sequence. + + These notes will be deleted after reload, since they are no longer + accurate or useful. + +`REG_LIBCALL' + This is the inverse of `REG_RETVAL': it is placed on the first + insn of a multi-insn sequence, and it points to the last one. + + These notes are deleted after reload, since they are no longer + useful or accurate. + +`REG_CC_SETTER' +`REG_CC_USER' + On machines that use `cc0', the insns which set and use `cc0' set + and use `cc0' are adjacent. However, when branch delay slot + filling is done, this may no longer be true. In this case a + `REG_CC_USER' note will be placed on the insn setting `cc0' to + point to the insn using `cc0' and a `REG_CC_SETTER' note will be + placed on the insn using `cc0' to point to the insn setting `cc0'. + + These values are only used in the `LOG_LINKS' field, and indicate +the type of dependency that each link represents. Links which indicate +a data dependence (a read after write dependence) do not use any code, +they simply have mode `VOIDmode', and are printed without any +descriptive text. + +`REG_DEP_ANTI' + This indicates an anti dependence (a write after read dependence). + +`REG_DEP_OUTPUT' + This indicates an output dependence (a write after write + dependence). + + These notes describe information gathered from gcov profile data. +They are stored in the `REG_NOTES' field of an insn as an `expr_list'. + +`REG_EXEC_COUNT' + This is used to indicate the number of times a basic block was + executed according to the profile data. The note is attached to + the first insn in the basic block. + +`REG_BR_PROB' + This is used to specify the ratio of branches to non-branches of a + branch insn according to the profile data. The value is stored as + a value between 0 and REG_BR_PROB_BASE; larger values indicate a + higher probability that the branch will be taken. + +`REG_BR_PRED' + These notes are found in JUMP insns after delayed branch scheduling + has taken place. They indicate both the direction and the + likelyhood of the JUMP. The format is a bitmask of ATTR_FLAG_* + values. + +`REG_FRAME_RELATED_EXPR' + This is used on an RTX_FRAME_RELATED_P insn wherein the attached + expression is used in place of the actual insn pattern. This is + done in cases where the pattern is either complex or misleading. + + For convenience, the machine mode in an `insn_list' or `expr_list' +is printed using these symbolic codes in debugging dumps. + + The only difference between the expression codes `insn_list' and +`expr_list' is that the first operand of an `insn_list' is assumed to +be an insn and is printed in debugging dumps as the insn's unique id; +the first operand of an `expr_list' is printed in the ordinary way as +an expression. + + +File: gcc.info, Node: Calls, Next: Sharing, Prev: Insns, Up: RTL + +RTL Representation of Function-Call Insns +========================================= + + Insns that call subroutines have the RTL expression code `call_insn'. +These insns must satisfy special rules, and their bodies must use a +special RTL expression code, `call'. + + A `call' expression has two operands, as follows: + + (call (mem:FM ADDR) NBYTES) + +Here NBYTES is an operand that represents the number of bytes of +argument data being passed to the subroutine, FM is a machine mode +(which must equal as the definition of the `FUNCTION_MODE' macro in the +machine description) and ADDR represents the address of the subroutine. + + For a subroutine that returns no value, the `call' expression as +shown above is the entire body of the insn, except that the insn might +also contain `use' or `clobber' expressions. + + For a subroutine that returns a value whose mode is not `BLKmode', +the value is returned in a hard register. If this register's number is +R, then the body of the call insn looks like this: + + (set (reg:M R) + (call (mem:FM ADDR) NBYTES)) + +This RTL expression makes it clear (to the optimizer passes) that the +appropriate register receives a useful value in this insn. + + When a subroutine returns a `BLKmode' value, it is handled by +passing to the subroutine the address of a place to store the value. +So the call insn itself does not "return" any value, and it has the +same RTL form as a call that returns nothing. + + On some machines, the call instruction itself clobbers some register, +for example to contain the return address. `call_insn' insns on these +machines should have a body which is a `parallel' that contains both +the `call' expression and `clobber' expressions that indicate which +registers are destroyed. Similarly, if the call instruction requires +some register other than the stack pointer that is not explicitly +mentioned it its RTL, a `use' subexpression should mention that +register. + + Functions that are called are assumed to modify all registers listed +in the configuration macro `CALL_USED_REGISTERS' (*note Register +Basics::.) and, with the exception of `const' functions and library +calls, to modify all of memory. + + Insns containing just `use' expressions directly precede the +`call_insn' insn to indicate which registers contain inputs to the +function. Similarly, if registers other than those in +`CALL_USED_REGISTERS' are clobbered by the called function, insns +containing a single `clobber' follow immediately after the call to +indicate which registers. + + +File: gcc.info, Node: Sharing, Next: Reading RTL, Prev: Calls, Up: RTL + +Structure Sharing Assumptions +============================= + + The compiler assumes that certain kinds of RTL expressions are +unique; there do not exist two distinct objects representing the same +value. In other cases, it makes an opposite assumption: that no RTL +expression object of a certain kind appears in more than one place in +the containing structure. + + These assumptions refer to a single function; except for the RTL +objects that describe global variables and external functions, and a +few standard objects such as small integer constants, no RTL objects +are common to two functions. + + * Each pseudo-register has only a single `reg' object to represent + it, and therefore only a single machine mode. + + * For any symbolic label, there is only one `symbol_ref' object + referring to it. + + * There is only one `const_int' expression with value 0, only one + with value 1, and only one with value -1. Some other integer + values are also stored uniquely. + + * There is only one `pc' expression. + + * There is only one `cc0' expression. + + * There is only one `const_double' expression with value 0 for each + floating point mode. Likewise for values 1 and 2. + + * No `label_ref' or `scratch' appears in more than one place in the + RTL structure; in other words, it is safe to do a tree-walk of all + the insns in the function and assume that each time a `label_ref' + or `scratch' is seen it is distinct from all others that are seen. + + * Only one `mem' object is normally created for each static variable + or stack slot, so these objects are frequently shared in all the + places they appear. However, separate but equal objects for these + variables are occasionally made. + + * When a single `asm' statement has multiple output operands, a + distinct `asm_operands' expression is made for each output operand. + However, these all share the vector which contains the sequence of + input operands. This sharing is used later on to test whether two + `asm_operands' expressions come from the same statement, so all + optimizations must carefully preserve the sharing if they copy the + vector at all. + + * No RTL object appears in more than one place in the RTL structure + except as described above. Many passes of the compiler rely on + this by assuming that they can modify RTL objects in place without + unwanted side-effects on other insns. + + * During initial RTL generation, shared structure is freely + introduced. After all the RTL for a function has been generated, + all shared structure is copied by `unshare_all_rtl' in + `emit-rtl.c', after which the above rules are guaranteed to be + followed. + + * During the combiner pass, shared structure within an insn can exist + temporarily. However, the shared structure is copied before the + combiner is finished with the insn. This is done by calling + `copy_rtx_if_shared', which is a subroutine of `unshare_all_rtl'. + + +File: gcc.info, Node: Reading RTL, Prev: Sharing, Up: RTL + +Reading RTL +=========== + + To read an RTL object from a file, call `read_rtx'. It takes one +argument, a stdio stream, and returns a single RTL object. + + Reading RTL from a file is very slow. This is not currently a +problem since reading RTL occurs only as part of building the compiler. + + People frequently have the idea of using RTL stored as text in a +file as an interface between a language front end and the bulk of GNU +CC. This idea is not feasible. + + GNU CC was designed to use RTL internally only. Correct RTL for a +given program is very dependent on the particular target machine. And +the RTL does not contain all the information about the program. + + The proper way to interface GNU CC to a new language front end is +with the "tree" data structure. There is no manual for this data +structure, but it is described in the files `tree.h' and `tree.def'. + diff --git a/usr/local/nachos/info/gcc.info-18 b/usr/local/nachos/info/gcc.info-18 new file mode 100644 index 0000000..2988aa1 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-18 @@ -0,0 +1,1066 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Machine Desc, Next: Target Macros, Prev: RTL, Up: Top + +Machine Descriptions +******************** + + A machine description has two parts: a file of instruction patterns +(`.md' file) and a C header file of macro definitions. + + The `.md' file for a target machine contains a pattern for each +instruction that the target machine supports (or at least each +instruction that is worth telling the compiler about). It may also +contain comments. A semicolon causes the rest of the line to be a +comment, unless the semicolon is inside a quoted string. + + See the next chapter for information on the C header file. + +* Menu: + +* Patterns:: How to write instruction patterns. +* Example:: An explained example of a `define_insn' pattern. +* RTL Template:: The RTL template defines what insns match a pattern. +* Output Template:: The output template says how to make assembler code + from such an insn. +* Output Statement:: For more generality, write C code to output + the assembler code. +* Constraints:: When not all operands are general operands. +* Standard Names:: Names mark patterns to use for code generation. +* Pattern Ordering:: When the order of patterns makes a difference. +* Dependent Patterns:: Having one pattern may make you need another. +* Jump Patterns:: Special considerations for patterns for jump insns. +* Insn Canonicalizations::Canonicalization of Instructions +* Peephole Definitions::Defining machine-specific peephole optimizations. +* Expander Definitions::Generating a sequence of several RTL insns + for a standard operation. +* Insn Splitting:: Splitting Instructions into Multiple Instructions +* Insn Attributes:: Specifying the value of attributes for generated insns. + + +File: gcc.info, Node: Patterns, Next: Example, Up: Machine Desc + +Everything about Instruction Patterns +===================================== + + Each instruction pattern contains an incomplete RTL expression, with +pieces to be filled in later, operand constraints that restrict how the +pieces can be filled in, and an output pattern or C code to generate +the assembler output, all wrapped up in a `define_insn' expression. + + A `define_insn' is an RTL expression containing four or five +operands: + + 1. An optional name. The presence of a name indicate that this + instruction pattern can perform a certain standard job for the + RTL-generation pass of the compiler. This pass knows certain + names and will use the instruction patterns with those names, if + the names are defined in the machine description. + + The absence of a name is indicated by writing an empty string + where the name should go. Nameless instruction patterns are never + used for generating RTL code, but they may permit several simpler + insns to be combined later on. + + Names that are not thus known and used in RTL-generation have no + effect; they are equivalent to no name at all. + + 2. The "RTL template" (*note RTL Template::.) is a vector of + incomplete RTL expressions which show what the instruction should + look like. It is incomplete because it may contain + `match_operand', `match_operator', and `match_dup' expressions + that stand for operands of the instruction. + + If the vector has only one element, that element is the template + for the instruction pattern. If the vector has multiple elements, + then the instruction pattern is a `parallel' expression containing + the elements described. + + 3. A condition. This is a string which contains a C expression that + is the final test to decide whether an insn body matches this + pattern. + + For a named pattern, the condition (if present) may not depend on + the data in the insn being matched, but only the + target-machine-type flags. The compiler needs to test these + conditions during initialization in order to learn exactly which + named instructions are available in a particular run. + + For nameless patterns, the condition is applied only when matching + an individual insn, and only after the insn has matched the + pattern's recognition template. The insn's operands may be found + in the vector `operands'. + + 4. The "output template": a string that says how to output matching + insns as assembler code. `%' in this string specifies where to + substitute the value of an operand. *Note Output Template::. + + When simple substitution isn't general enough, you can specify a + piece of C code to compute the output. *Note Output Statement::. + + 5. Optionally, a vector containing the values of attributes for insns + matching this pattern. *Note Insn Attributes::. + + +File: gcc.info, Node: Example, Next: RTL Template, Prev: Patterns, Up: Machine Desc + +Example of `define_insn' +======================== + + Here is an actual example of an instruction pattern, for the +68000/68020. + + (define_insn "tstsi" + [(set (cc0) + (match_operand:SI 0 "general_operand" "rm"))] + "" + "* + { if (TARGET_68020 || ! ADDRESS_REG_P (operands[0])) + return \"tstl %0\"; + return \"cmpl #0,%0\"; }") + + This is an instruction that sets the condition codes based on the +value of a general operand. It has no condition, so any insn whose RTL +description has the form shown may be handled according to this +pattern. The name `tstsi' means "test a `SImode' value" and tells the +RTL generation pass that, when it is necessary to test such a value, an +insn to do so can be constructed using this pattern. + + The output control string is a piece of C code which chooses which +output template to return based on the kind of operand and the specific +type of CPU for which code is being generated. + + `"rm"' is an operand constraint. Its meaning is explained below. + + +File: gcc.info, Node: RTL Template, Next: Output Template, Prev: Example, Up: Machine Desc + +RTL Template +============ + + The RTL template is used to define which insns match the particular +pattern and how to find their operands. For named patterns, the RTL +template also says how to construct an insn from specified operands. + + Construction involves substituting specified operands into a copy of +the template. Matching involves determining the values that serve as +the operands in the insn being matched. Both of these activities are +controlled by special expression types that direct matching and +substitution of the operands. + +`(match_operand:M N PREDICATE CONSTRAINT)' + This expression is a placeholder for operand number N of the insn. + When constructing an insn, operand number N will be substituted + at this point. When matching an insn, whatever appears at this + position in the insn will be taken as operand number N; but it + must satisfy PREDICATE or this instruction pattern will not match + at all. + + Operand numbers must be chosen consecutively counting from zero in + each instruction pattern. There may be only one `match_operand' + expression in the pattern for each operand number. Usually + operands are numbered in the order of appearance in `match_operand' + expressions. In the case of a `define_expand', any operand numbers + used only in `match_dup' expressions have higher values than all + other operand numbers. + + PREDICATE is a string that is the name of a C function that + accepts two arguments, an expression and a machine mode. During + matching, the function will be called with the putative operand as + the expression and M as the mode argument (if M is not specified, + `VOIDmode' will be used, which normally causes PREDICATE to accept + any mode). If it returns zero, this instruction pattern fails to + match. PREDICATE may be an empty string; then it means no test is + to be done on the operand, so anything which occurs in this + position is valid. + + Most of the time, PREDICATE will reject modes other than M--but + not always. For example, the predicate `address_operand' uses M + as the mode of memory ref that the address should be valid for. + Many predicates accept `const_int' nodes even though their mode is + `VOIDmode'. + + CONSTRAINT controls reloading and the choice of the best register + class to use for a value, as explained later (*note + Constraints::.). + + People are often unclear on the difference between the constraint + and the predicate. The predicate helps decide whether a given + insn matches the pattern. The constraint plays no role in this + decision; instead, it controls various decisions in the case of an + insn which does match. + + On CISC machines, the most common PREDICATE is + `"general_operand"'. This function checks that the putative + operand is either a constant, a register or a memory reference, + and that it is valid for mode M. + + For an operand that must be a register, PREDICATE should be + `"register_operand"'. Using `"general_operand"' would be valid, + since the reload pass would copy any non-register operands through + registers, but this would make GNU CC do extra work, it would + prevent invariant operands (such as constant) from being removed + from loops, and it would prevent the register allocator from doing + the best possible job. On RISC machines, it is usually most + efficient to allow PREDICATE to accept only objects that the + constraints allow. + + For an operand that must be a constant, you must be sure to either + use `"immediate_operand"' for PREDICATE, or make the instruction + pattern's extra condition require a constant, or both. You cannot + expect the constraints to do this work! If the constraints allow + only constants, but the predicate allows something else, the + compiler will crash when that case arises. + +`(match_scratch:M N CONSTRAINT)' + This expression is also a placeholder for operand number N and + indicates that operand must be a `scratch' or `reg' expression. + + When matching patterns, this is equivalent to + + (match_operand:M N "scratch_operand" PRED) + + but, when generating RTL, it produces a (`scratch':M) expression. + + If the last few expressions in a `parallel' are `clobber' + expressions whose operands are either a hard register or + `match_scratch', the combiner can add or delete them when + necessary. *Note Side Effects::. + +`(match_dup N)' + This expression is also a placeholder for operand number N. It is + used when the operand needs to appear more than once in the insn. + + In construction, `match_dup' acts just like `match_operand': the + operand is substituted into the insn being constructed. But in + matching, `match_dup' behaves differently. It assumes that operand + number N has already been determined by a `match_operand' + appearing earlier in the recognition template, and it matches only + an identical-looking expression. + +`(match_operator:M N PREDICATE [OPERANDS...])' + This pattern is a kind of placeholder for a variable RTL expression + code. + + When constructing an insn, it stands for an RTL expression whose + expression code is taken from that of operand N, and whose + operands are constructed from the patterns OPERANDS. + + When matching an expression, it matches an expression if the + function PREDICATE returns nonzero on that expression *and* the + patterns OPERANDS match the operands of the expression. + + Suppose that the function `commutative_operator' is defined as + follows, to match any expression whose operator is one of the + commutative arithmetic operators of RTL and whose mode is MODE: + + int + commutative_operator (x, mode) + rtx x; + enum machine_mode mode; + { + enum rtx_code code = GET_CODE (x); + if (GET_MODE (x) != mode) + return 0; + return (GET_RTX_CLASS (code) == 'c' + || code == EQ || code == NE); + } + + Then the following pattern will match any RTL expression consisting + of a commutative operator applied to two general operands: + + (match_operator:SI 3 "commutative_operator" + [(match_operand:SI 1 "general_operand" "g") + (match_operand:SI 2 "general_operand" "g")]) + + Here the vector `[OPERANDS...]' contains two patterns because the + expressions to be matched all contain two operands. + + When this pattern does match, the two operands of the commutative + operator are recorded as operands 1 and 2 of the insn. (This is + done by the two instances of `match_operand'.) Operand 3 of the + insn will be the entire commutative expression: use `GET_CODE + (operands[3])' to see which commutative operator was used. + + The machine mode M of `match_operator' works like that of + `match_operand': it is passed as the second argument to the + predicate function, and that function is solely responsible for + deciding whether the expression to be matched "has" that mode. + + When constructing an insn, argument 3 of the gen-function will + specify the operation (i.e. the expression code) for the + expression to be made. It should be an RTL expression, whose + expression code is copied into a new expression whose operands are + arguments 1 and 2 of the gen-function. The subexpressions of + argument 3 are not used; only its expression code matters. + + When `match_operator' is used in a pattern for matching an insn, + it usually best if the operand number of the `match_operator' is + higher than that of the actual operands of the insn. This improves + register allocation because the register allocator often looks at + operands 1 and 2 of insns to see if it can do register tying. + + There is no way to specify constraints in `match_operator'. The + operand of the insn which corresponds to the `match_operator' + never has any constraints because it is never reloaded as a whole. + However, if parts of its OPERANDS are matched by `match_operand' + patterns, those parts may have constraints of their own. + +`(match_op_dup:M N[OPERANDS...])' + Like `match_dup', except that it applies to operators instead of + operands. When constructing an insn, operand number N will be + substituted at this point. But in matching, `match_op_dup' behaves + differently. It assumes that operand number N has already been + determined by a `match_operator' appearing earlier in the + recognition template, and it matches only an identical-looking + expression. + +`(match_parallel N PREDICATE [SUBPAT...])' + This pattern is a placeholder for an insn that consists of a + `parallel' expression with a variable number of elements. This + expression should only appear at the top level of an insn pattern. + + When constructing an insn, operand number N will be substituted at + this point. When matching an insn, it matches if the body of the + insn is a `parallel' expression with at least as many elements as + the vector of SUBPAT expressions in the `match_parallel', if each + SUBPAT matches the corresponding element of the `parallel', *and* + the function PREDICATE returns nonzero on the `parallel' that is + the body of the insn. It is the responsibility of the predicate + to validate elements of the `parallel' beyond those listed in the + `match_parallel'. + + A typical use of `match_parallel' is to match load and store + multiple expressions, which can contain a variable number of + elements in a `parallel'. For example, + + (define_insn "" + [(match_parallel 0 "load_multiple_operation" + [(set (match_operand:SI 1 "gpc_reg_operand" "=r") + (match_operand:SI 2 "memory_operand" "m")) + (use (reg:SI 179)) + (clobber (reg:SI 179))])] + "" + "loadm 0,0,%1,%2") + + This example comes from `a29k.md'. The function + `load_multiple_operations' is defined in `a29k.c' and checks that + subsequent elements in the `parallel' are the same as the `set' in + the pattern, except that they are referencing subsequent registers + and memory locations. + + An insn that matches this pattern might look like: + + (parallel + [(set (reg:SI 20) (mem:SI (reg:SI 100))) + (use (reg:SI 179)) + (clobber (reg:SI 179)) + (set (reg:SI 21) + (mem:SI (plus:SI (reg:SI 100) + (const_int 4)))) + (set (reg:SI 22) + (mem:SI (plus:SI (reg:SI 100) + (const_int 8))))]) + +`(match_par_dup N [SUBPAT...])' + Like `match_op_dup', but for `match_parallel' instead of + `match_operator'. + +`(match_insn PREDICATE)' + Match a complete insn. Unlike the other `match_*' recognizers, + `match_insn' does not take an operand number. + + The machine mode M of `match_insn' works like that of + `match_operand': it is passed as the second argument to the + predicate function, and that function is solely responsible for + deciding whether the expression to be matched "has" that mode. + +`(match_insn2 N PREDICATE)' + Match a complete insn. + + The machine mode M of `match_insn2' works like that of + `match_operand': it is passed as the second argument to the + predicate function, and that function is solely responsible for + deciding whether the expression to be matched "has" that mode. + +`(address (match_operand:M N "address_operand" ""))' + This complex of expressions is a placeholder for an operand number + N in a "load address" instruction: an operand which specifies a + memory location in the usual way, but for which the actual operand + value used is the address of the location, not the contents of the + location. + + `address' expressions never appear in RTL code, only in machine + descriptions. And they are used only in machine descriptions that + do not use the operand constraint feature. When operand + constraints are in use, the letter `p' in the constraint serves + this purpose. + + M is the machine mode of the *memory location being addressed*, + not the machine mode of the address itself. That mode is always + the same on a given target machine (it is `Pmode', which normally + is `SImode'), so there is no point in mentioning it; thus, no + machine mode is written in the `address' expression. If some day + support is added for machines in which addresses of different + kinds of objects appear differently or are used differently (such + as the PDP-10), different formats would perhaps need different + machine modes and these modes might be written in the `address' + expression. + + +File: gcc.info, Node: Output Template, Next: Output Statement, Prev: RTL Template, Up: Machine Desc + +Output Templates and Operand Substitution +========================================= + + The "output template" is a string which specifies how to output the +assembler code for an instruction pattern. Most of the template is a +fixed string which is output literally. The character `%' is used to +specify where to substitute an operand; it can also be used to identify +places where different variants of the assembler require different +syntax. + + In the simplest case, a `%' followed by a digit N says to output +operand N at that point in the string. + + `%' followed by a letter and a digit says to output an operand in an +alternate fashion. Four letters have standard, built-in meanings +described below. The machine description macro `PRINT_OPERAND' can +define additional letters with nonstandard meanings. + + `%cDIGIT' can be used to substitute an operand that is a constant +value without the syntax that normally indicates an immediate operand. + + `%nDIGIT' is like `%cDIGIT' except that the value of the constant is +negated before printing. + + `%aDIGIT' can be used to substitute an operand as if it were a +memory reference, with the actual operand treated as the address. This +may be useful when outputting a "load address" instruction, because +often the assembler syntax for such an instruction requires you to +write the operand as if it were a memory reference. + + `%lDIGIT' is used to substitute a `label_ref' into a jump +instruction. + + `%=' outputs a number which is unique to each instruction in the +entire compilation. This is useful for making local labels to be +referred to more than once in a single template that generates multiple +assembler instructions. + + `%' followed by a punctuation character specifies a substitution that +does not use an operand. Only one case is standard: `%%' outputs a `%' +into the assembler code. Other nonstandard cases can be defined in the +`PRINT_OPERAND' macro. You must also define which punctuation +characters are valid with the `PRINT_OPERAND_PUNCT_VALID_P' macro. + + The template may generate multiple assembler instructions. Write +the text for the instructions, with `\;' between them. + + When the RTL contains two operands which are required by constraint +to match each other, the output template must refer only to the +lower-numbered operand. Matching operands are not always identical, +and the rest of the compiler arranges to put the proper RTL expression +for printing into the lower-numbered operand. + + One use of nonstandard letters or punctuation following `%' is to +distinguish between different assembler languages for the same machine; +for example, Motorola syntax versus MIT syntax for the 68000. Motorola +syntax requires periods in most opcode names, while MIT syntax does +not. For example, the opcode `movel' in MIT syntax is `move.l' in +Motorola syntax. The same file of patterns is used for both kinds of +output syntax, but the character sequence `%.' is used in each place +where Motorola syntax wants a period. The `PRINT_OPERAND' macro for +Motorola syntax defines the sequence to output a period; the macro for +MIT syntax defines it to do nothing. + + As a special case, a template consisting of the single character `#' +instructs the compiler to first split the insn, and then output the +resulting instructions separately. This helps eliminate redundancy in +the output templates. If you have a `define_insn' that needs to emit +multiple assembler instructions, and there is an matching `define_split' +already defined, then you can simply use `#' as the output template +instead of writing an output template that emits the multiple assembler +instructions. + + If the macro `ASSEMBLER_DIALECT' is defined, you can use construct +of the form `{option0|option1|option2}' in the templates. These +describe multiple variants of assembler language syntax. *Note +Instruction Output::. + + +File: gcc.info, Node: Output Statement, Next: Constraints, Prev: Output Template, Up: Machine Desc + +C Statements for Assembler Output +================================= + + Often a single fixed template string cannot produce correct and +efficient assembler code for all the cases that are recognized by a +single instruction pattern. For example, the opcodes may depend on the +kinds of operands; or some unfortunate combinations of operands may +require extra machine instructions. + + If the output control string starts with a `@', then it is actually +a series of templates, each on a separate line. (Blank lines and +leading spaces and tabs are ignored.) The templates correspond to the +pattern's constraint alternatives (*note Multi-Alternative::.). For +example, if a target machine has a two-address add instruction `addr' +to add into a register and another `addm' to add a register to memory, +you might write this pattern: + + (define_insn "addsi3" + [(set (match_operand:SI 0 "general_operand" "=r,m") + (plus:SI (match_operand:SI 1 "general_operand" "0,0") + (match_operand:SI 2 "general_operand" "g,r")))] + "" + "@ + addr %2,%0 + addm %2,%0") + + If the output control string starts with a `*', then it is not an +output template but rather a piece of C program that should compute a +template. It should execute a `return' statement to return the +template-string you want. Most such templates use C string literals, +which require doublequote characters to delimit them. To include these +doublequote characters in the string, prefix each one with `\'. + + The operands may be found in the array `operands', whose C data type +is `rtx []'. + + It is very common to select different ways of generating assembler +code based on whether an immediate operand is within a certain range. +Be careful when doing this, because the result of `INTVAL' is an +integer on the host machine. If the host machine has more bits in an +`int' than the target machine has in the mode in which the constant +will be used, then some of the bits you get from `INTVAL' will be +superfluous. For proper results, you must carefully disregard the +values of those bits. + + It is possible to output an assembler instruction and then go on to +output or compute more of them, using the subroutine `output_asm_insn'. +This receives two arguments: a template-string and a vector of +operands. The vector may be `operands', or it may be another array of +`rtx' that you declare locally and initialize yourself. + + When an insn pattern has multiple alternatives in its constraints, +often the appearance of the assembler code is determined mostly by +which alternative was matched. When this is so, the C code can test +the variable `which_alternative', which is the ordinal number of the +alternative that was actually satisfied (0 for the first, 1 for the +second alternative, etc.). + + For example, suppose there are two opcodes for storing zero, `clrreg' +for registers and `clrmem' for memory locations. Here is how a pattern +could use `which_alternative' to choose between them: + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r,m") + (const_int 0))] + "" + "* + return (which_alternative == 0 + ? \"clrreg %0\" : \"clrmem %0\"); + ") + + The example above, where the assembler code to generate was *solely* +determined by the alternative, could also have been specified as +follows, having the output control string start with a `@': + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r,m") + (const_int 0))] + "" + "@ + clrreg %0 + clrmem %0") + + +File: gcc.info, Node: Constraints, Next: Standard Names, Prev: Output Statement, Up: Machine Desc + +Operand Constraints +=================== + + Each `match_operand' in an instruction pattern can specify a +constraint for the type of operands allowed. Constraints can say +whether an operand may be in a register, and which kinds of register; +whether the operand can be a memory reference, and which kinds of +address; whether the operand may be an immediate constant, and which +possible values it may have. Constraints can also require two operands +to match. + +* Menu: + +* Simple Constraints:: Basic use of constraints. +* Multi-Alternative:: When an insn has two alternative constraint-patterns. +* Class Preferences:: Constraints guide which hard register to put things in. +* Modifiers:: More precise control over effects of constraints. +* Machine Constraints:: Existing constraints for some particular machines. +* No Constraints:: Describing a clean machine without constraints. + + +File: gcc.info, Node: Simple Constraints, Next: Multi-Alternative, Up: Constraints + +Simple Constraints +------------------ + + The simplest kind of constraint is a string full of letters, each of +which describes one kind of operand that is permitted. Here are the +letters that are allowed: + +`m' + A memory operand is allowed, with any kind of address that the + machine supports in general. + +`o' + A memory operand is allowed, but only if the address is + "offsettable". This means that adding a small integer (actually, + the width in bytes of the operand, as determined by its machine + mode) may be added to the address and the result is also a valid + memory address. + + For example, an address which is constant is offsettable; so is an + address that is the sum of a register and a constant (as long as a + slightly larger constant is also within the range of + address-offsets supported by the machine); but an autoincrement or + autodecrement address is not offsettable. More complicated + indirect/indexed addresses may or may not be offsettable depending + on the other addressing modes that the machine supports. + + Note that in an output operand which can be matched by another + operand, the constraint letter `o' is valid only when accompanied + by both `<' (if the target machine has predecrement addressing) + and `>' (if the target machine has preincrement addressing). + +`V' + A memory operand that is not offsettable. In other words, + anything that would fit the `m' constraint but not the `o' + constraint. + +`<' + A memory operand with autodecrement addressing (either + predecrement or postdecrement) is allowed. + +`>' + A memory operand with autoincrement addressing (either + preincrement or postincrement) is allowed. + +`r' + A register operand is allowed provided that it is in a general + register. + +`d', `a', `f', ... + Other letters can be defined in machine-dependent fashion to stand + for particular classes of registers. `d', `a' and `f' are defined + on the 68000/68020 to stand for data, address and floating point + registers. + +`i' + An immediate integer operand (one with constant value) is allowed. + This includes symbolic constants whose values will be known only at + assembly time. + +`n' + An immediate integer operand with a known numeric value is allowed. + Many systems cannot support assembly-time constants for operands + less than a word wide. Constraints for these operands should use + `n' rather than `i'. + +`I', `J', `K', ... `P' + Other letters in the range `I' through `P' may be defined in a + machine-dependent fashion to permit immediate integer operands with + explicit integer values in specified ranges. For example, on the + 68000, `I' is defined to stand for the range of values 1 to 8. + This is the range permitted as a shift count in the shift + instructions. + +`E' + An immediate floating operand (expression code `const_double') is + allowed, but only if the target floating point format is the same + as that of the host machine (on which the compiler is running). + +`F' + An immediate floating operand (expression code `const_double') is + allowed. + +`G', `H' + `G' and `H' may be defined in a machine-dependent fashion to + permit immediate floating operands in particular ranges of values. + +`s' + An immediate integer operand whose value is not an explicit + integer is allowed. + + This might appear strange; if an insn allows a constant operand + with a value not known at compile time, it certainly must allow + any known value. So why use `s' instead of `i'? Sometimes it + allows better code to be generated. + + For example, on the 68000 in a fullword instruction it is possible + to use an immediate operand; but if the immediate value is between + -128 and 127, better code results from loading the value into a + register and using the register. This is because the load into + the register can be done with a `moveq' instruction. We arrange + for this to happen by defining the letter `K' to mean "any integer + outside the range -128 to 127", and then specifying `Ks' in the + operand constraints. + +`g' + Any register, memory or immediate integer operand is allowed, + except for registers that are not general registers. + +`X' + Any operand whatsoever is allowed, even if it does not satisfy + `general_operand'. This is normally used in the constraint of a + `match_scratch' when certain alternatives will not actually + require a scratch register. + +`0', `1', `2', ... `9' + An operand that matches the specified operand number is allowed. + If a digit is used together with letters within the same + alternative, the digit should come last. + + This is called a "matching constraint" and what it really means is + that the assembler has only a single operand that fills two roles + considered separate in the RTL insn. For example, an add insn has + two input operands and one output operand in the RTL, but on most + CISC machines an add instruction really has only two operands, one + of them an input-output operand: + + addl #35,r12 + + Matching constraints are used in these circumstances. More + precisely, the two operands that match must include one input-only + operand and one output-only operand. Moreover, the digit must be a + smaller number than the number of the operand that uses it in the + constraint. + + For operands to match in a particular case usually means that they + are identical-looking RTL expressions. But in a few special cases + specific kinds of dissimilarity are allowed. For example, `*x' as + an input operand will match `*x++' as an output operand. For + proper results in such cases, the output template should always + use the output-operand's number when printing the operand. + +`p' + An operand that is a valid memory address is allowed. This is for + "load address" and "push address" instructions. + + `p' in the constraint must be accompanied by `address_operand' as + the predicate in the `match_operand'. This predicate interprets + the mode specified in the `match_operand' as the mode of the memory + reference for which the address would be valid. + +`Q', `R', `S', ... `U' + Letters in the range `Q' through `U' may be defined in a + machine-dependent fashion to stand for arbitrary operand types. + The machine description macro `EXTRA_CONSTRAINT' is passed the + operand as its first argument and the constraint letter as its + second operand. + + A typical use for this would be to distinguish certain types of + memory references that affect other insn operands. + + Do not define these constraint letters to accept register + references (`reg'); the reload pass does not expect this and would + not handle it properly. + + In order to have valid assembler code, each operand must satisfy its +constraint. But a failure to do so does not prevent the pattern from +applying to an insn. Instead, it directs the compiler to modify the +code so that the constraint will be satisfied. Usually this is done by +copying an operand into a register. + + Contrast, therefore, the two instruction patterns that follow: + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r") + (plus:SI (match_dup 0) + (match_operand:SI 1 "general_operand" "r")))] + "" + "...") + +which has two operands, one of which must appear in two places, and + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r") + (plus:SI (match_operand:SI 1 "general_operand" "0") + (match_operand:SI 2 "general_operand" "r")))] + "" + "...") + +which has three operands, two of which are required by a constraint to +be identical. If we are considering an insn of the form + + (insn N PREV NEXT + (set (reg:SI 3) + (plus:SI (reg:SI 6) (reg:SI 109))) + ...) + +the first pattern would not apply at all, because this insn does not +contain two identical subexpressions in the right place. The pattern +would say, "That does not look like an add instruction; try other +patterns." The second pattern would say, "Yes, that's an add +instruction, but there is something wrong with it." It would direct +the reload pass of the compiler to generate additional insns to make +the constraint true. The results might look like this: + + (insn N2 PREV N + (set (reg:SI 3) (reg:SI 6)) + ...) + + (insn N N2 NEXT + (set (reg:SI 3) + (plus:SI (reg:SI 3) (reg:SI 109))) + ...) + + It is up to you to make sure that each operand, in each pattern, has +constraints that can handle any RTL expression that could be present for +that operand. (When multiple alternatives are in use, each pattern +must, for each possible combination of operand expressions, have at +least one alternative which can handle that combination of operands.) +The constraints don't need to *allow* any possible operand--when this is +the case, they do not constrain--but they must at least point the way to +reloading any possible operand so that it will fit. + + * If the constraint accepts whatever operands the predicate permits, + there is no problem: reloading is never necessary for this operand. + + For example, an operand whose constraints permit everything except + registers is safe provided its predicate rejects registers. + + An operand whose predicate accepts only constant values is safe + provided its constraints include the letter `i'. If any possible + constant value is accepted, then nothing less than `i' will do; if + the predicate is more selective, then the constraints may also be + more selective. + + * Any operand expression can be reloaded by copying it into a + register. So if an operand's constraints allow some kind of + register, it is certain to be safe. It need not permit all + classes of registers; the compiler knows how to copy a register + into another register of the proper class in order to make an + instruction valid. + + * A nonoffsettable memory reference can be reloaded by copying the + address into a register. So if the constraint uses the letter + `o', all memory references are taken care of. + + * A constant operand can be reloaded by allocating space in memory to + hold it as preinitialized data. Then the memory reference can be + used in place of the constant. So if the constraint uses the + letters `o' or `m', constant operands are not a problem. + + * If the constraint permits a constant and a pseudo register used in + an insn was not allocated to a hard register and is equivalent to + a constant, the register will be replaced with the constant. If + the predicate does not permit a constant and the insn is + re-recognized for some reason, the compiler will crash. Thus the + predicate must always recognize any objects allowed by the + constraint. + + If the operand's predicate can recognize registers, but the +constraint does not permit them, it can make the compiler crash. When +this operand happens to be a register, the reload pass will be stymied, +because it does not know how to copy a register temporarily into memory. + + If the predicate accepts a unary operator, the constraint applies to +the operand. For example, the MIPS processor at ISA level 3 supports an +instruction which adds two registers in `SImode' to produce a `DImode' +result, but only if the registers are correctly sign extended. This +predicate for the input operands accepts a `sign_extend' of an `SImode' +register. Write the constraint to indicate the type of register that +is required for the operand of the `sign_extend'. + + +File: gcc.info, Node: Multi-Alternative, Next: Class Preferences, Prev: Simple Constraints, Up: Constraints + +Multiple Alternative Constraints +-------------------------------- + + Sometimes a single instruction has multiple alternative sets of +possible operands. For example, on the 68000, a logical-or instruction +can combine register or an immediate value into memory, or it can +combine any kind of operand into a register; but it cannot combine one +memory location into another. + + These constraints are represented as multiple alternatives. An +alternative can be described by a series of letters for each operand. +The overall constraint for an operand is made from the letters for this +operand from the first alternative, a comma, the letters for this +operand from the second alternative, a comma, and so on until the last +alternative. Here is how it is done for fullword logical-or on the +68000: + + (define_insn "iorsi3" + [(set (match_operand:SI 0 "general_operand" "=m,d") + (ior:SI (match_operand:SI 1 "general_operand" "%0,0") + (match_operand:SI 2 "general_operand" "dKs,dmKs")))] + ...) + + The first alternative has `m' (memory) for operand 0, `0' for +operand 1 (meaning it must match operand 0), and `dKs' for operand 2. +The second alternative has `d' (data register) for operand 0, `0' for +operand 1, and `dmKs' for operand 2. The `=' and `%' in the +constraints apply to all the alternatives; their meaning is explained +in the next section (*note Class Preferences::.). + + If all the operands fit any one alternative, the instruction is +valid. Otherwise, for each alternative, the compiler counts how many +instructions must be added to copy the operands so that that +alternative applies. The alternative requiring the least copying is +chosen. If two alternatives need the same amount of copying, the one +that comes first is chosen. These choices can be altered with the `?' +and `!' characters: + +`?' + Disparage slightly the alternative that the `?' appears in, as a + choice when no alternative applies exactly. The compiler regards + this alternative as one unit more costly for each `?' that appears + in it. + +`!' + Disparage severely the alternative that the `!' appears in. This + alternative can still be used if it fits without reloading, but if + reloading is needed, some other alternative will be used. + + When an insn pattern has multiple alternatives in its constraints, +often the appearance of the assembler code is determined mostly by which +alternative was matched. When this is so, the C code for writing the +assembler code can use the variable `which_alternative', which is the +ordinal number of the alternative that was actually satisfied (0 for +the first, 1 for the second alternative, etc.). *Note Output +Statement::. + + +File: gcc.info, Node: Class Preferences, Next: Modifiers, Prev: Multi-Alternative, Up: Constraints + +Register Class Preferences +-------------------------- + + The operand constraints have another function: they enable the +compiler to decide which kind of hardware register a pseudo register is +best allocated to. The compiler examines the constraints that apply to +the insns that use the pseudo register, looking for the +machine-dependent letters such as `d' and `a' that specify classes of +registers. The pseudo register is put in whichever class gets the most +"votes". The constraint letters `g' and `r' also vote: they vote in +favor of a general register. The machine description says which +registers are considered general. + + Of course, on some machines all registers are equivalent, and no +register classes are defined. Then none of this complexity is relevant. + + +File: gcc.info, Node: Modifiers, Next: Machine Constraints, Prev: Class Preferences, Up: Constraints + +Constraint Modifier Characters +------------------------------ + + Here are constraint modifier characters. + +`=' + Means that this operand is write-only for this instruction: the + previous value is discarded and replaced by output data. + +`+' + Means that this operand is both read and written by the + instruction. + + When the compiler fixes up the operands to satisfy the constraints, + it needs to know which operands are inputs to the instruction and + which are outputs from it. `=' identifies an output; `+' + identifies an operand that is both input and output; all other + operands are assumed to be input only. + +`&' + Means (in a particular alternative) that this operand is an + "earlyclobber" operand, which is modified before the instruction is + finished using the input operands. Therefore, this operand may + not lie in a register that is used as an input operand or as part + of any memory address. + + `&' applies only to the alternative in which it is written. In + constraints with multiple alternatives, sometimes one alternative + requires `&' while others do not. See, for example, the `movdf' + insn of the 68000. + + An input operand can be tied to an earlyclobber operand if its only + use as an input occurs before the early result is written. Adding + alternatives of this form often allows GCC to produce better code + when only some of the inputs can be affected by the earlyclobber. + See, for example, the `mulsi3' insn of the ARM. + + `&' does not obviate the need to write `='. + +`%' + Declares the instruction to be commutative for this operand and the + following operand. This means that the compiler may interchange + the two operands if that is the cheapest way to make all operands + fit the constraints. This is often used in patterns for addition + instructions that really have only two operands: the result must + go in one of the arguments. Here for example, is how the 68000 + halfword-add instruction is defined: + + (define_insn "addhi3" + [(set (match_operand:HI 0 "general_operand" "=m,r") + (plus:HI (match_operand:HI 1 "general_operand" "%0,0") + (match_operand:HI 2 "general_operand" "di,g")))] + ...) + +`#' + Says that all following characters, up to the next comma, are to be + ignored as a constraint. They are significant only for choosing + register preferences. + +`*' + Says that the following character should be ignored when choosing + register preferences. `*' has no effect on the meaning of the + constraint as a constraint, and no effect on reloading. + + Here is an example: the 68000 has an instruction to sign-extend a + halfword in a data register, and can also sign-extend a value by + copying it into an address register. While either kind of + register is acceptable, the constraints on an address-register + destination are less strict, so it is best if register allocation + makes an address register its goal. Therefore, `*' is used so + that the `d' constraint letter (for data register) is ignored when + computing register preferences. + + (define_insn "extendhisi2" + [(set (match_operand:SI 0 "general_operand" "=*d,a") + (sign_extend:SI + (match_operand:HI 1 "general_operand" "0,g")))] + ...) + diff --git a/usr/local/nachos/info/gcc.info-19 b/usr/local/nachos/info/gcc.info-19 new file mode 100644 index 0000000..b7d96cd --- /dev/null +++ b/usr/local/nachos/info/gcc.info-19 @@ -0,0 +1,1332 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Machine Constraints, Next: No Constraints, Prev: Modifiers, Up: Constraints + +Constraints for Particular Machines +----------------------------------- + + Whenever possible, you should use the general-purpose constraint +letters in `asm' arguments, since they will convey meaning more readily +to people reading your code. Failing that, use the constraint letters +that usually have very similar meanings across architectures. The most +commonly used constraints are `m' and `r' (for memory and +general-purpose registers respectively; *note Simple Constraints::.), +and `I', usually the letter indicating the most common +immediate-constant format. + + For each machine architecture, the `config/MACHINE.h' file defines +additional constraints. These constraints are used by the compiler +itself for instruction generation, as well as for `asm' statements; +therefore, some of the constraints are not particularly interesting for +`asm'. The constraints are defined through these macros: + +`REG_CLASS_FROM_LETTER' + Register class constraints (usually lower case). + +`CONST_OK_FOR_LETTER_P' + Immediate constant constraints, for non-floating point constants of + word size or smaller precision (usually upper case). + +`CONST_DOUBLE_OK_FOR_LETTER_P' + Immediate constant constraints, for all floating point constants + and for constants of greater than word size precision (usually + upper case). + +`EXTRA_CONSTRAINT' + Special cases of registers or memory. This macro is not required, + and is only defined for some machines. + + Inspecting these macro definitions in the compiler source for your +machine is the best way to be certain you have the right constraints. +However, here is a summary of the machine-dependent constraints +available on some particular machines. + +*ARM family--`arm.h'* + + `f' + Floating-point register + + `F' + One of the floating-point constants 0.0, 0.5, 1.0, 2.0, 3.0, + 4.0, 5.0 or 10.0 + + `G' + Floating-point constant that would satisfy the constraint `F' + if it were negated + + `I' + Integer that is valid as an immediate operand in a data + processing instruction. That is, an integer in the range 0 + to 255 rotated by a multiple of 2 + + `J' + Integer in the range -4095 to 4095 + + `K' + Integer that satisfies constraint `I' when inverted (ones + complement) + + `L' + Integer that satisfies constraint `I' when negated (twos + complement) + + `M' + Integer in the range 0 to 32 + + `Q' + A memory reference where the exact address is in a single + register (``m'' is preferable for `asm' statements) + + `R' + An item in the constant pool + + `S' + A symbol in the text segment of the current file + +*AMD 29000 family--`a29k.h'* + + `l' + Local register 0 + + `b' + Byte Pointer (`BP') register + + `q' + `Q' register + + `h' + Special purpose register + + `A' + First accumulator register + + `a' + Other accumulator register + + `f' + Floating point register + + `I' + Constant greater than 0, less than 0x100 + + `J' + Constant greater than 0, less than 0x10000 + + `K' + Constant whose high 24 bits are on (1) + + `L' + 16 bit constant whose high 8 bits are on (1) + + `M' + 32 bit constant whose high 16 bits are on (1) + + `N' + 32 bit negative constant that fits in 8 bits + + `O' + The constant 0x80000000 or, on the 29050, any 32 bit constant + whose low 16 bits are 0. + + `P' + 16 bit negative constant that fits in 8 bits + + `G' + `H' + A floating point constant (in `asm' statements, use the + machine independent `E' or `F' instead) + +*IBM RS6000--`rs6000.h'* + + `b' + Address base register + + `f' + Floating point register + + `h' + `MQ', `CTR', or `LINK' register + + `q' + `MQ' register + + `c' + `CTR' register + + `l' + `LINK' register + + `x' + `CR' register (condition register) number 0 + + `y' + `CR' register (condition register) + + `z' + `FPMEM' stack memory for FPR-GPR transfers + + `I' + Signed 16 bit constant + + `J' + Constant whose low 16 bits are 0 + + `K' + Constant whose high 16 bits are 0 + + `L' + Constant suitable as a mask operand + + `M' + Constant larger than 31 + + `N' + Exact power of 2 + + `O' + Zero + + `P' + Constant whose negation is a signed 16 bit constant + + `G' + Floating point constant that can be loaded into a register + with one instruction per word + + `Q' + Memory operand that is an offset from a register (`m' is + preferable for `asm' statements) + + `R' + AIX TOC entry + + `S' + Constant suitable as a 64-bit mask operand + + `U' + System V Release 4 small data area reference + +*Intel 386--`i386.h'* + + `q' + `a', `b', `c', or `d' register + + `A' + `a', or `d' register (for 64-bit ints) + + `f' + Floating point register + + `t' + First (top of stack) floating point register + + `u' + Second floating point register + + `a' + `a' register + + `b' + `b' register + + `c' + `c' register + + `d' + `d' register + + `D' + `di' register + + `S' + `si' register + + `I' + Constant in range 0 to 31 (for 32 bit shifts) + + `J' + Constant in range 0 to 63 (for 64 bit shifts) + + `K' + `0xff' + + `L' + `0xffff' + + `M' + 0, 1, 2, or 3 (shifts for `lea' instruction) + + `N' + Constant in range 0 to 255 (for `out' instruction) + + `G' + Standard 80387 floating point constant + +*Intel 960--`i960.h'* + + `f' + Floating point register (`fp0' to `fp3') + + `l' + Local register (`r0' to `r15') + + `b' + Global register (`g0' to `g15') + + `d' + Any local or global register + + `I' + Integers from 0 to 31 + + `J' + 0 + + `K' + Integers from -31 to 0 + + `G' + Floating point 0 + + `H' + Floating point 1 + +*MIPS--`mips.h'* + + `d' + General-purpose integer register + + `f' + Floating-point register (if available) + + `h' + `Hi' register + + `l' + `Lo' register + + `x' + `Hi' or `Lo' register + + `y' + General-purpose integer register + + `z' + Floating-point status register + + `I' + Signed 16 bit constant (for arithmetic instructions) + + `J' + Zero + + `K' + Zero-extended 16-bit constant (for logic instructions) + + `L' + Constant with low 16 bits zero (can be loaded with `lui') + + `M' + 32 bit constant which requires two instructions to load (a + constant which is not `I', `K', or `L') + + `N' + Negative 16 bit constant + + `O' + Exact power of two + + `P' + Positive 16 bit constant + + `G' + Floating point zero + + `Q' + Memory reference that can be loaded with more than one + instruction (`m' is preferable for `asm' statements) + + `R' + Memory reference that can be loaded with one instruction (`m' + is preferable for `asm' statements) + + `S' + Memory reference in external OSF/rose PIC format (`m' is + preferable for `asm' statements) + +*Motorola 680x0--`m68k.h'* + + `a' + Address register + + `d' + Data register + + `f' + 68881 floating-point register, if available + + `x' + Sun FPA (floating-point) register, if available + + `y' + First 16 Sun FPA registers, if available + + `I' + Integer in the range 1 to 8 + + `J' + 16 bit signed number + + `K' + Signed number whose magnitude is greater than 0x80 + + `L' + Integer in the range -8 to -1 + + `M' + Signed number whose magnitude is greater than 0x100 + + `G' + Floating point constant that is not a 68881 constant + + `H' + Floating point constant that can be used by Sun FPA + +*SPARC--`sparc.h'* + + `f' + Floating-point register that can hold 32 or 64 bit values. + + `e' + Floating-point register that can hold 64 or 128 bit values. + + `I' + Signed 13 bit constant + + `J' + Zero + + `K' + 32 bit constant with the low 12 bits clear (a constant that + can be loaded with the `sethi' instruction) + + `G' + Floating-point zero + + `H' + Signed 13 bit constant, sign-extended to 32 or 64 bits + + `Q' + Memory reference that can be loaded with one instruction + (`m' is more appropriate for `asm' statements) + + `S' + Constant, or memory address + + `T' + Memory address aligned to an 8-byte boundary + + `U' + Even register + + +File: gcc.info, Node: No Constraints, Prev: Machine Constraints, Up: Constraints + +Not Using Constraints +--------------------- + + Some machines are so clean that operand constraints are not +required. For example, on the Vax, an operand valid in one context is +valid in any other context. On such a machine, every operand +constraint would be `g', excepting only operands of "load address" +instructions which are written as if they referred to a memory +location's contents but actual refer to its address. They would have +constraint `p'. + + For such machines, instead of writing `g' and `p' for all the +constraints, you can choose to write a description with empty +constraints. Then you write `""' for the constraint in every +`match_operand'. Address operands are identified by writing an +`address' expression around the `match_operand', not by their +constraints. + + When the machine description has just empty constraints, certain +parts of compilation are skipped, making the compiler faster. However, +few machines actually do not need constraints; all machine descriptions +now in existence use constraints. + + +File: gcc.info, Node: Standard Names, Next: Pattern Ordering, Prev: Constraints, Up: Machine Desc + +Standard Pattern Names For Generation +===================================== + + Here is a table of the instruction names that are meaningful in the +RTL generation pass of the compiler. Giving one of these names to an +instruction pattern tells the RTL generation pass that it can use the +pattern to accomplish a certain task. + +`movM' + Here M stands for a two-letter machine mode name, in lower case. + This instruction pattern moves data with that machine mode from + operand 1 to operand 0. For example, `movsi' moves full-word data. + + If operand 0 is a `subreg' with mode M of a register whose own + mode is wider than M, the effect of this instruction is to store + the specified value in the part of the register that corresponds + to mode M. The effect on the rest of the register is undefined. + + This class of patterns is special in several ways. First of all, + each of these names *must* be defined, because there is no other + way to copy a datum from one place to another. + + Second, these patterns are not used solely in the RTL generation + pass. Even the reload pass can generate move insns to copy values + from stack slots into temporary registers. When it does so, one + of the operands is a hard register and the other is an operand + that can need to be reloaded into a register. + + Therefore, when given such a pair of operands, the pattern must + generate RTL which needs no reloading and needs no temporary + registers--no registers other than the operands. For example, if + you support the pattern with a `define_expand', then in such a + case the `define_expand' mustn't call `force_reg' or any other such + function which might generate new pseudo registers. + + This requirement exists even for subword modes on a RISC machine + where fetching those modes from memory normally requires several + insns and some temporary registers. Look in `spur.md' to see how + the requirement can be satisfied. + + During reload a memory reference with an invalid address may be + passed as an operand. Such an address will be replaced with a + valid address later in the reload pass. In this case, nothing may + be done with the address except to use it as it stands. If it is + copied, it will not be replaced with a valid address. No attempt + should be made to make such an address into a valid address and no + routine (such as `change_address') that will do so may be called. + Note that `general_operand' will fail when applied to such an + address. + + The global variable `reload_in_progress' (which must be explicitly + declared if required) can be used to determine whether such special + handling is required. + + The variety of operands that have reloads depends on the rest of + the machine description, but typically on a RISC machine these can + only be pseudo registers that did not get hard registers, while on + other machines explicit memory references will get optional + reloads. + + If a scratch register is required to move an object to or from + memory, it can be allocated using `gen_reg_rtx' prior to life + analysis. + + If there are cases needing scratch registers after reload, you + must define `SECONDARY_INPUT_RELOAD_CLASS' and perhaps also + `SECONDARY_OUTPUT_RELOAD_CLASS' to detect them, and provide + patterns `reload_inM' or `reload_outM' to handle them. *Note + Register Classes::. + + The global variable `no_new_pseudos' can be used to determine if it + is unsafe to create new pseudo registers. If this variable is + nonzero, then it is unsafe to call `gen_reg_rtx' to allocate a new + pseudo. + + The constraints on a `movM' must permit moving any hard register + to any other hard register provided that `HARD_REGNO_MODE_OK' + permits mode M in both registers and `REGISTER_MOVE_COST' applied + to their classes returns a value of 2. + + It is obligatory to support floating point `movM' instructions + into and out of any registers that can hold fixed point values, + because unions and structures (which have modes `SImode' or + `DImode') can be in those registers and they may have floating + point members. + + There may also be a need to support fixed point `movM' + instructions in and out of floating point registers. + Unfortunately, I have forgotten why this was so, and I don't know + whether it is still true. If `HARD_REGNO_MODE_OK' rejects fixed + point values in floating point registers, then the constraints of + the fixed point `movM' instructions must be designed to avoid ever + trying to reload into a floating point register. + +`reload_inM' +`reload_outM' + Like `movM', but used when a scratch register is required to move + between operand 0 and operand 1. Operand 2 describes the scratch + register. See the discussion of the `SECONDARY_RELOAD_CLASS' + macro in *note Register Classes::.. + +`movstrictM' + Like `movM' except that if operand 0 is a `subreg' with mode M of + a register whose natural mode is wider, the `movstrictM' + instruction is guaranteed not to alter any of the register except + the part which belongs to mode M. + +`load_multiple' + Load several consecutive memory locations into consecutive + registers. Operand 0 is the first of the consecutive registers, + operand 1 is the first memory location, and operand 2 is a + constant: the number of consecutive registers. + + Define this only if the target machine really has such an + instruction; do not define this if the most efficient way of + loading consecutive registers from memory is to do them one at a + time. + + On some machines, there are restrictions as to which consecutive + registers can be stored into memory, such as particular starting or + ending register numbers or only a range of valid counts. For those + machines, use a `define_expand' (*note Expander Definitions::.) + and make the pattern fail if the restrictions are not met. + + Write the generated insn as a `parallel' with elements being a + `set' of one register from the appropriate memory location (you may + also need `use' or `clobber' elements). Use a `match_parallel' + (*note RTL Template::.) to recognize the insn. See `a29k.md' and + `rs6000.md' for examples of the use of this insn pattern. + +`store_multiple' + Similar to `load_multiple', but store several consecutive registers + into consecutive memory locations. Operand 0 is the first of the + consecutive memory locations, operand 1 is the first register, and + operand 2 is a constant: the number of consecutive registers. + +`addM3' + Add operand 2 and operand 1, storing the result in operand 0. All + operands must have mode M. This can be used even on two-address + machines, by means of constraints requiring operands 1 and 0 to be + the same location. + +`subM3', `mulM3' +`divM3', `udivM3', `modM3', `umodM3' +`sminM3', `smaxM3', `uminM3', `umaxM3' +`andM3', `iorM3', `xorM3' + Similar, for other arithmetic operations. + +`mulhisi3' + Multiply operands 1 and 2, which have mode `HImode', and store a + `SImode' product in operand 0. + +`mulqihi3', `mulsidi3' + Similar widening-multiplication instructions of other widths. + +`umulqihi3', `umulhisi3', `umulsidi3' + Similar widening-multiplication instructions that do unsigned + multiplication. + +`mulM3_highpart' + Perform a signed multiplication of operands 1 and 2, which have + mode M, and store the most significant half of the product in + operand 0. The least significant half of the product is discarded. + +`umulM3_highpart' + Similar, but the multiplication is unsigned. + +`divmodM4' + Signed division that produces both a quotient and a remainder. + Operand 1 is divided by operand 2 to produce a quotient stored in + operand 0 and a remainder stored in operand 3. + + For machines with an instruction that produces both a quotient and + a remainder, provide a pattern for `divmodM4' but do not provide + patterns for `divM3' and `modM3'. This allows optimization in the + relatively common case when both the quotient and remainder are + computed. + + If an instruction that just produces a quotient or just a remainder + exists and is more efficient than the instruction that produces + both, write the output routine of `divmodM4' to call + `find_reg_note' and look for a `REG_UNUSED' note on the quotient + or remainder and generate the appropriate instruction. + +`udivmodM4' + Similar, but does unsigned division. + +`ashlM3' + Arithmetic-shift operand 1 left by a number of bits specified by + operand 2, and store the result in operand 0. Here M is the mode + of operand 0 and operand 1; operand 2's mode is specified by the + instruction pattern, and the compiler will convert the operand to + that mode before generating the instruction. + +`ashrM3', `lshrM3', `rotlM3', `rotrM3' + Other shift and rotate instructions, analogous to the `ashlM3' + instructions. + +`negM2' + Negate operand 1 and store the result in operand 0. + +`absM2' + Store the absolute value of operand 1 into operand 0. + +`sqrtM2' + Store the square root of operand 1 into operand 0. + + The `sqrt' built-in function of C always uses the mode which + corresponds to the C data type `double'. + +`ffsM2' + Store into operand 0 one plus the index of the least significant + 1-bit of operand 1. If operand 1 is zero, store zero. M is the + mode of operand 0; operand 1's mode is specified by the instruction + pattern, and the compiler will convert the operand to that mode + before generating the instruction. + + The `ffs' built-in function of C always uses the mode which + corresponds to the C data type `int'. + +`one_cmplM2' + Store the bitwise-complement of operand 1 into operand 0. + +`cmpM' + Compare operand 0 and operand 1, and set the condition codes. The + RTL pattern should look like this: + + (set (cc0) (compare (match_operand:M 0 ...) + (match_operand:M 1 ...))) + +`tstM' + Compare operand 0 against zero, and set the condition codes. The + RTL pattern should look like this: + + (set (cc0) (match_operand:M 0 ...)) + + `tstM' patterns should not be defined for machines that do not use + `(cc0)'. Doing so would confuse the optimizer since it would no + longer be clear which `set' operations were comparisons. The + `cmpM' patterns should be used instead. + +`movstrM' + Block move instruction. The addresses of the destination and + source strings are the first two operands, and both are in mode + `Pmode'. + + The number of bytes to move is the third operand, in mode M. + Usually, you specify `word_mode' for M. However, if you can + generate better code knowing the range of valid lengths is smaller + than those representable in a full word, you should provide a + pattern with a mode corresponding to the range of values you can + handle efficiently (e.g., `QImode' for values in the range 0-127; + note we avoid numbers that appear negative) and also a pattern + with `word_mode'. + + The fourth operand is the known shared alignment of the source and + destination, in the form of a `const_int' rtx. Thus, if the + compiler knows that both source and destination are word-aligned, + it may provide the value 4 for this operand. + + Descriptions of multiple `movstrM' patterns can only be beneficial + if the patterns for smaller modes have fewer restrictions on their + first, second and fourth operands. Note that the mode M in + `movstrM' does not impose any restriction on the mode of + individually moved data units in the block. + + These patterns need not give special consideration to the + possibility that the source and destination strings might overlap. + +`clrstrM' + Block clear instruction. The addresses of the destination string + is the first operand, in mode `Pmode'. The number of bytes to + clear is the second operand, in mode M. See `movstrM' for a + discussion of the choice of mode. + + The third operand is the known alignment of the destination, in + the form of a `const_int' rtx. Thus, if the compiler knows that + the destination is word-aligned, it may provide the value 4 for + this operand. + + The use for multiple `clrstrM' is as for `movstrM'. + +`cmpstrM' + Block compare instruction, with five operands. Operand 0 is the + output; it has mode M. The remaining four operands are like the + operands of `movstrM'. The two memory blocks specified are + compared byte by byte in lexicographic order. The effect of the + instruction is to store a value in operand 0 whose sign indicates + the result of the comparison. + +`strlenM' + Compute the length of a string, with three operands. Operand 0 is + the result (of mode M), operand 1 is a `mem' referring to the + first character of the string, operand 2 is the character to + search for (normally zero), and operand 3 is a constant describing + the known alignment of the beginning of the string. + +`floatMN2' + Convert signed integer operand 1 (valid for fixed point mode M) to + floating point mode N and store in operand 0 (which has mode N). + +`floatunsMN2' + Convert unsigned integer operand 1 (valid for fixed point mode M) + to floating point mode N and store in operand 0 (which has mode N). + +`fixMN2' + Convert operand 1 (valid for floating point mode M) to fixed point + mode N as a signed number and store in operand 0 (which has mode + N). This instruction's result is defined only when the value of + operand 1 is an integer. + +`fixunsMN2' + Convert operand 1 (valid for floating point mode M) to fixed point + mode N as an unsigned number and store in operand 0 (which has + mode N). This instruction's result is defined only when the value + of operand 1 is an integer. + +`ftruncM2' + Convert operand 1 (valid for floating point mode M) to an integer + value, still represented in floating point mode M, and store it in + operand 0 (valid for floating point mode M). + +`fix_truncMN2' + Like `fixMN2' but works for any floating point value of mode M by + converting the value to an integer. + +`fixuns_truncMN2' + Like `fixunsMN2' but works for any floating point value of mode M + by converting the value to an integer. + +`truncMN2' + Truncate operand 1 (valid for mode M) to mode N and store in + operand 0 (which has mode N). Both modes must be fixed point or + both floating point. + +`extendMN2' + Sign-extend operand 1 (valid for mode M) to mode N and store in + operand 0 (which has mode N). Both modes must be fixed point or + both floating point. + +`zero_extendMN2' + Zero-extend operand 1 (valid for mode M) to mode N and store in + operand 0 (which has mode N). Both modes must be fixed point. + +`extv' + Extract a bit field from operand 1 (a register or memory operand), + where operand 2 specifies the width in bits and operand 3 the + starting bit, and store it in operand 0. Operand 0 must have mode + `word_mode'. Operand 1 may have mode `byte_mode' or `word_mode'; + often `word_mode' is allowed only for registers. Operands 2 and 3 + must be valid for `word_mode'. + + The RTL generation pass generates this instruction only with + constants for operands 2 and 3. + + The bit-field value is sign-extended to a full word integer before + it is stored in operand 0. + +`extzv' + Like `extv' except that the bit-field value is zero-extended. + +`insv' + Store operand 3 (which must be valid for `word_mode') into a bit + field in operand 0, where operand 1 specifies the width in bits and + operand 2 the starting bit. Operand 0 may have mode `byte_mode' or + `word_mode'; often `word_mode' is allowed only for registers. + Operands 1 and 2 must be valid for `word_mode'. + + The RTL generation pass generates this instruction only with + constants for operands 1 and 2. + +`movMODEcc' + Conditionally move operand 2 or operand 3 into operand 0 according + to the comparison in operand 1. If the comparison is true, + operand 2 is moved into operand 0, otherwise operand 3 is moved. + + The mode of the operands being compared need not be the same as + the operands being moved. Some machines, sparc64 for example, + have instructions that conditionally move an integer value based + on the floating point condition codes and vice versa. + + If the machine does not have conditional move instructions, do not + define these patterns. + +`sCOND' + Store zero or nonzero in the operand according to the condition + codes. Value stored is nonzero iff the condition COND is true. + COND is the name of a comparison operation expression code, such + as `eq', `lt' or `leu'. + + You specify the mode that the operand must have when you write the + `match_operand' expression. The compiler automatically sees which + mode you have used and supplies an operand of that mode. + + The value stored for a true condition must have 1 as its low bit, + or else must be negative. Otherwise the instruction is not + suitable and you should omit it from the machine description. You + describe to the compiler exactly which value is stored by defining + the macro `STORE_FLAG_VALUE' (*note Misc::.). If a description + cannot be found that can be used for all the `sCOND' patterns, you + should omit those operations from the machine description. + + These operations may fail, but should do so only in relatively + uncommon cases; if they would fail for common cases involving + integer comparisons, it is best to omit these patterns. + + If these operations are omitted, the compiler will usually + generate code that copies the constant one to the target and + branches around an assignment of zero to the target. If this code + is more efficient than the potential instructions used for the + `sCOND' pattern followed by those required to convert the result + into a 1 or a zero in `SImode', you should omit the `sCOND' + operations from the machine description. + +`bCOND' + Conditional branch instruction. Operand 0 is a `label_ref' that + refers to the label to jump to. Jump if the condition codes meet + condition COND. + + Some machines do not follow the model assumed here where a + comparison instruction is followed by a conditional branch + instruction. In that case, the `cmpM' (and `tstM') patterns should + simply store the operands away and generate all the required insns + in a `define_expand' (*note Expander Definitions::.) for the + conditional branch operations. All calls to expand `bCOND' + patterns are immediately preceded by calls to expand either a + `cmpM' pattern or a `tstM' pattern. + + Machines that use a pseudo register for the condition code value, + or where the mode used for the comparison depends on the condition + being tested, should also use the above mechanism. *Note Jump + Patterns::. + + The above discussion also applies to the `movMODEcc' and `sCOND' + patterns. + +`call' + Subroutine call instruction returning no value. Operand 0 is the + function to call; operand 1 is the number of bytes of arguments + pushed as a `const_int'; operand 2 is the number of registers used + as operands. + + On most machines, operand 2 is not actually stored into the RTL + pattern. It is supplied for the sake of some RISC machines which + need to put this information into the assembler code; they can put + it in the RTL instead of operand 1. + + Operand 0 should be a `mem' RTX whose address is the address of the + function. Note, however, that this address can be a `symbol_ref' + expression even if it would not be a legitimate memory address on + the target machine. If it is also not a valid argument for a call + instruction, the pattern for this operation should be a + `define_expand' (*note Expander Definitions::.) that places the + address into a register and uses that register in the call + instruction. + +`call_value' + Subroutine call instruction returning a value. Operand 0 is the + hard register in which the value is returned. There are three more + operands, the same as the three operands of the `call' instruction + (but with numbers increased by one). + + Subroutines that return `BLKmode' objects use the `call' insn. + +`call_pop', `call_value_pop' + Similar to `call' and `call_value', except used if defined and if + `RETURN_POPS_ARGS' is non-zero. They should emit a `parallel' + that contains both the function call and a `set' to indicate the + adjustment made to the frame pointer. + + For machines where `RETURN_POPS_ARGS' can be non-zero, the use of + these patterns increases the number of functions for which the + frame pointer can be eliminated, if desired. + +`untyped_call' + Subroutine call instruction returning a value of any type. + Operand 0 is the function to call; operand 1 is a memory location + where the result of calling the function is to be stored; operand + 2 is a `parallel' expression where each element is a `set' + expression that indicates the saving of a function return value + into the result block. + + This instruction pattern should be defined to support + `__builtin_apply' on machines where special instructions are needed + to call a subroutine with arbitrary arguments or to save the value + returned. This instruction pattern is required on machines that + have multiple registers that can hold a return value (i.e. + `FUNCTION_VALUE_REGNO_P' is true for more than one register). + +`return' + Subroutine return instruction. This instruction pattern name + should be defined only if a single instruction can do all the work + of returning from a function. + + Like the `movM' patterns, this pattern is also used after the RTL + generation phase. In this case it is to support machines where + multiple instructions are usually needed to return from a + function, but some class of functions only requires one + instruction to implement a return. Normally, the applicable + functions are those which do not need to save any registers or + allocate stack space. + + For such machines, the condition specified in this pattern should + only be true when `reload_completed' is non-zero and the function's + epilogue would only be a single instruction. For machines with + register windows, the routine `leaf_function_p' may be used to + determine if a register window push is required. + + Machines that have conditional return instructions should define + patterns such as + + (define_insn "" + [(set (pc) + (if_then_else (match_operator + 0 "comparison_operator" + [(cc0) (const_int 0)]) + (return) + (pc)))] + "CONDITION" + "...") + + where CONDITION would normally be the same condition specified on + the named `return' pattern. + +`untyped_return' + Untyped subroutine return instruction. This instruction pattern + should be defined to support `__builtin_return' on machines where + special instructions are needed to return a value of any type. + + Operand 0 is a memory location where the result of calling a + function with `__builtin_apply' is stored; operand 1 is a + `parallel' expression where each element is a `set' expression + that indicates the restoring of a function return value from the + result block. + +`nop' + No-op instruction. This instruction pattern name should always be + defined to output a no-op in assembler code. `(const_int 0)' will + do as an RTL pattern. + +`indirect_jump' + An instruction to jump to an address which is operand zero. This + pattern name is mandatory on all machines. + +`casesi' + Instruction to jump through a dispatch table, including bounds + checking. This instruction takes five operands: + + 1. The index to dispatch on, which has mode `SImode'. + + 2. The lower bound for indices in the table, an integer constant. + + 3. The total range of indices in the table--the largest index + minus the smallest one (both inclusive). + + 4. A label that precedes the table itself. + + 5. A label to jump to if the index has a value outside the + bounds. (If the machine-description macro + `CASE_DROPS_THROUGH' is defined, then an out-of-bounds index + drops through to the code following the jump table instead of + jumping to this label. In that case, this label is not + actually used by the `casesi' instruction, but it is always + provided as an operand.) + + The table is a `addr_vec' or `addr_diff_vec' inside of a + `jump_insn'. The number of elements in the table is one plus the + difference between the upper bound and the lower bound. + +`tablejump' + Instruction to jump to a variable address. This is a low-level + capability which can be used to implement a dispatch table when + there is no `casesi' pattern. + + This pattern requires two operands: the address or offset, and a + label which should immediately precede the jump table. If the + macro `CASE_VECTOR_PC_RELATIVE' evaluates to a nonzero value then + the first operand is an offset which counts from the address of + the table; otherwise, it is an absolute address to jump to. In + either case, the first operand has mode `Pmode'. + + The `tablejump' insn is always the last insn before the jump table + it uses. Its assembler code normally has no need to use the + second operand, but you should incorporate it in the RTL pattern so + that the jump optimizer will not delete the table as unreachable + code. + +`canonicalize_funcptr_for_compare' + Canonicalize the function pointer in operand 1 and store the result + into operand 0. + + Operand 0 is always a `reg' and has mode `Pmode'; operand 1 may be + a `reg', `mem', `symbol_ref', `const_int', etc and also has mode + `Pmode'. + + Canonicalization of a function pointer usually involves computing + the address of the function which would be called if the function + pointer were used in an indirect call. + + Only define this pattern if function pointers on the target machine + can have different values but still call the same function when + used in an indirect call. + +`save_stack_block' +`save_stack_function' +`save_stack_nonlocal' +`restore_stack_block' +`restore_stack_function' +`restore_stack_nonlocal' + Most machines save and restore the stack pointer by copying it to + or from an object of mode `Pmode'. Do not define these patterns on + such machines. + + Some machines require special handling for stack pointer saves and + restores. On those machines, define the patterns corresponding to + the non-standard cases by using a `define_expand' (*note Expander + Definitions::.) that produces the required insns. The three types + of saves and restores are: + + 1. `save_stack_block' saves the stack pointer at the start of a + block that allocates a variable-sized object, and + `restore_stack_block' restores the stack pointer when the + block is exited. + + 2. `save_stack_function' and `restore_stack_function' do a + similar job for the outermost block of a function and are + used when the function allocates variable-sized objects or + calls `alloca'. Only the epilogue uses the restored stack + pointer, allowing a simpler save or restore sequence on some + machines. + + 3. `save_stack_nonlocal' is used in functions that contain labels + branched to by nested functions. It saves the stack pointer + in such a way that the inner function can use + `restore_stack_nonlocal' to restore the stack pointer. The + compiler generates code to restore the frame and argument + pointer registers, but some machines require saving and + restoring additional data such as register window information + or stack backchains. Place insns in these patterns to save + and restore any such required data. + + When saving the stack pointer, operand 0 is the save area and + operand 1 is the stack pointer. The mode used to allocate the + save area defaults to `Pmode' but you can override that choice by + defining the `STACK_SAVEAREA_MODE' macro (*note Storage + Layout::.). You must specify an integral mode, or `VOIDmode' if + no save area is needed for a particular type of save (either + because no save is needed or because a machine-specific save area + can be used). Operand 0 is the stack pointer and operand 1 is the + save area for restore operations. If `save_stack_block' is + defined, operand 0 must not be `VOIDmode' since these saves can be + arbitrarily nested. + + A save area is a `mem' that is at a constant offset from + `virtual_stack_vars_rtx' when the stack pointer is saved for use by + nonlocal gotos and a `reg' in the other two cases. + +`allocate_stack' + Subtract (or add if `STACK_GROWS_DOWNWARD' is undefined) operand 1 + from the stack pointer to create space for dynamically allocated + data. + + Store the resultant pointer to this space into operand 0. If you + are allocating space from the main stack, do this by emitting a + move insn to copy `virtual_stack_dynamic_rtx' to operand 0. If + you are allocating the space elsewhere, generate code to copy the + location of the space to operand 0. In the latter case, you must + ensure this space gets freed when the corresponding space on the + main stack is free. + + Do not define this pattern if all that must be done is the + subtraction. Some machines require other operations such as stack + probes or maintaining the back chain. Define this pattern to emit + those operations in addition to updating the stack pointer. + +`probe' + Some machines require instructions to be executed after space is + allocated from the stack, for example to generate a reference at + the bottom of the stack. + + If you need to emit instructions before the stack has been + adjusted, put them into the `allocate_stack' pattern. Otherwise, + define this pattern to emit the required instructions. + + No operands are provided. + +`check_stack' + If stack checking cannot be done on your system by probing the + stack with a load or store instruction (*note Stack Checking::.), + define this pattern to perform the needed check and signaling an + error if the stack has overflowed. The single operand is the + location in the stack furthest from the current stack pointer that + you need to validate. Normally, on machines where this pattern is + needed, you would obtain the stack limit from a global or + thread-specific variable or register. + +`nonlocal_goto' + Emit code to generate a non-local goto, e.g., a jump from one + function to a label in an outer function. This pattern has four + arguments, each representing a value to be used in the jump. The + first argument is to be loaded into the frame pointer, the second + is the address to branch to (code to dispatch to the actual label), + the third is the address of a location where the stack is saved, + and the last is the address of the label, to be placed in the + location for the incoming static chain. + + On most machines you need not define this pattern, since GNU CC + will already generate the correct code, which is to load the frame + pointer and static chain, restore the stack (using the + `restore_stack_nonlocal' pattern, if defined), and jump indirectly + to the dispatcher. You need only define this pattern if this code + will not work on your machine. + +`nonlocal_goto_receiver' + This pattern, if defined, contains code needed at the target of a + nonlocal goto after the code already generated by GNU CC. You + will not normally need to define this pattern. A typical reason + why you might need this pattern is if some value, such as a + pointer to a global table, must be restored when the frame pointer + is restored. Note that a nonlocal goto only ocurrs within a + unit-of-translation, so a global table pointer that is shared by + all functions of a given module need not be restored. There are + no arguments. + +`exception_receiver' + This pattern, if defined, contains code needed at the site of an + exception handler that isn't needed at the site of a nonlocal + goto. You will not normally need to define this pattern. A + typical reason why you might need this pattern is if some value, + such as a pointer to a global table, must be restored after + control flow is branched to the handler of an exception. There + are no arguments. + +`builtin_setjmp_setup' + This pattern, if defined, contains additional code needed to + initialize the `jmp_buf'. You will not normally need to define + this pattern. A typical reason why you might need this pattern is + if some value, such as a pointer to a global table, must be + restored. Though it is preferred that the pointer value be + recalculated if possible (given the address of a label for + instance). The single argument is a pointer to the `jmp_buf'. + Note that the buffer is five words long and that the first three + are normally used by the generic mechanism. + +`builtin_setjmp_receiver' + This pattern, if defined, contains code needed at the site of an + builtin setjmp that isn't needed at the site of a nonlocal goto. + You will not normally need to define this pattern. A typical + reason why you might need this pattern is if some value, such as a + pointer to a global table, must be restored. It takes one + argument, which is the label to which builtin_longjmp transfered + control; this pattern may be emitted at a small offset from that + label. + +`builtin_longjmp' + This pattern, if defined, performs the entire action of the + longjmp. You will not normally need to define this pattern unless + you also define `builtin_setjmp_setup'. The single argument is a + pointer to the `jmp_buf'. + +`eh_epilogue' + This pattern, if defined, affects the way `__builtin_eh_return', + and thence `__throw' are built. It is intended to allow + communication between the exception handling machinery and the + normal epilogue code for the target. + + The pattern takes three arguments. The first is the exception + context pointer. This will have already been copied to the + function return register appropriate for a pointer; normally this + can be ignored. The second argument is an offset to be added to + the stack pointer. It will have been copied to some arbitrary + call-clobbered hard reg so that it will survive until after reload + to when the normal epilogue is generated. The final argument is + the address of the exception handler to which the function should + return. This will normally need to copied by the pattern to some + special register. + + This pattern must be defined if `RETURN_ADDR_RTX' does not yield + something that can be reliably and permanently modified, i.e. a + fixed hard register or a stack memory reference. + +`prologue' + This pattern, if defined, emits RTL for entry to a function. The + function entry is resposible for setting up the stack frame, + initializing the frame pointer register, saving callee saved + registers, etc. + + Using a prologue pattern is generally preferred over defining + `FUNCTION_PROLOGUE' to emit assembly code for the prologue. + + The `prologue' pattern is particularly useful for targets which + perform instruction scheduling. + +`epilogue' + This pattern, if defined, emits RTL for exit from a function. The + function exit is resposible for deallocating the stack frame, + restoring callee saved registers and emitting the return + instruction. + + Using an epilogue pattern is generally preferred over defining + `FUNCTION_EPILOGUE' to emit assembly code for the prologue. + + The `epilogue' pattern is particularly useful for targets which + perform instruction scheduling or which have delay slots for their + return instruction. + +`sibcall_epilogue' + This pattern, if defined, emits RTL for exit from a function + without the final branch back to the calling function. This + pattern will be emitted before any sibling call (aka tail call) + sites. + + The `sibcall_epilogue' pattern must not clobber any arguments used + for parameter passing or any stack slots for arguments passed to + the current function. + + +File: gcc.info, Node: Pattern Ordering, Next: Dependent Patterns, Prev: Standard Names, Up: Machine Desc + +When the Order of Patterns Matters +================================== + + Sometimes an insn can match more than one instruction pattern. Then +the pattern that appears first in the machine description is the one +used. Therefore, more specific patterns (patterns that will match +fewer things) and faster instructions (those that will produce better +code when they do match) should usually go first in the description. + + In some cases the effect of ordering the patterns can be used to hide +a pattern when it is not valid. For example, the 68000 has an +instruction for converting a fullword to floating point and another for +converting a byte to floating point. An instruction converting an +integer to floating point could match either one. We put the pattern +to convert the fullword first to make sure that one will be used rather +than the other. (Otherwise a large integer might be generated as a +single-byte immediate quantity, which would not work.) Instead of +using this pattern ordering it would be possible to make the pattern +for convert-a-byte smart enough to deal properly with any constant +value. + diff --git a/usr/local/nachos/info/gcc.info-2 b/usr/local/nachos/info/gcc.info-2 new file mode 100644 index 0000000..5fccf7e --- /dev/null +++ b/usr/local/nachos/info/gcc.info-2 @@ -0,0 +1,837 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: C++ Dialect Options, Next: Warning Options, Prev: C Dialect Options, Up: Invoking GCC + +Options Controlling C++ Dialect +=============================== + + This section describes the command-line options that are only +meaningful for C++ programs; but you can also use most of the GNU +compiler options regardless of what language your program is in. For +example, you might compile a file `firstClass.C' like this: + + g++ -g -frepo -O -c firstClass.C + +In this example, only `-frepo' is an option meant only for C++ +programs; you can use the other options with any language supported by +GCC. + + Here is a list of options that are *only* for compiling C++ programs: + +`-fno-access-control' + Turn off all access checking. This switch is mainly useful for + working around bugs in the access control code. + +`-fcheck-new' + Check that the pointer returned by `operator new' is non-null + before attempting to modify the storage allocated. The current + Working Paper requires that `operator new' never return a null + pointer, so this check is normally unnecessary. + + An alternative to using this option is to specify that your + `operator new' does not throw any exceptions; if you declare it + `throw()', g++ will check the return value. See also `new + (nothrow)'. + +`-fconserve-space' + Put uninitialized or runtime-initialized global variables into the + common segment, as C does. This saves space in the executable at + the cost of not diagnosing duplicate definitions. If you compile + with this flag and your program mysteriously crashes after + `main()' has completed, you may have an object that is being + destroyed twice because two definitions were merged. + + This option is no longer useful on most targets, now that support + has been added for putting variables into BSS without making them + common. + +`-fdollars-in-identifiers' + Accept `$' in identifiers. You can also explicitly prohibit use of + `$' with the option `-fno-dollars-in-identifiers'. (GNU C allows + `$' by default on most target systems, but there are a few + exceptions.) Traditional C allowed the character `$' to form part + of identifiers. However, ANSI C and C++ forbid `$' in identifiers. + +`-fno-elide-constructors' + The C++ standard allows an implementation to omit creating a + temporary which is only used to initialize another object of the + same type. Specifying this option disables that optimization, and + forces g++ to call the copy constructor in all cases. + +`-fexternal-templates' + Cause template instantiations to obey `#pragma interface' and + `implementation'; template instances are emitted or not according + to the location of the template definition. *Note Template + Instantiation::, for more information. + + This option is deprecated. + +`-falt-external-templates' + Similar to -fexternal-templates, but template instances are + emitted or not according to the place where they are first + instantiated. *Note Template Instantiation::, for more + information. + + This option is deprecated. + +`-ffor-scope' +`-fno-for-scope' + If -ffor-scope is specified, the scope of variables declared in a + for-init-statement is limited to the `for' loop itself, as + specified by the draft C++ standard. If -fno-for-scope is + specified, the scope of variables declared in a for-init-statement + extends to the end of the enclosing scope, as was the case in old + versions of gcc, and other (traditional) implementations of C++. + + The default if neither flag is given to follow the standard, but + to allow and give a warning for old-style code that would + otherwise be invalid, or have different behavior. + +`-fno-gnu-keywords' + Do not recognize `classof', `headof', `signature', `sigof' or + `typeof' as a keyword, so that code can use these words as + identifiers. You can use the keywords `__classof__', + `__headof__', `__signature__', `__sigof__', and `__typeof__' + instead. `-ansi' implies `-fno-gnu-keywords'. + +`-fguiding-decls' + Treat a function declaration with the same type as a potential + function template instantiation as though it declares that + instantiation, not a normal function. If a definition is given + for the function later in the translation unit (or another + translation unit if the target supports weak symbols), that + definition will be used; otherwise the template will be + instantiated. This behavior reflects the C++ language prior to + September 1996, when guiding declarations were removed. + + This option implies `-fname-mangling-version-0', and will not work + with other name mangling versions. Like all options that change + the ABI, all C++ code, *including libgcc.a* must be built with the + same setting of this option. + +`-fhandle-signatures' + Recognize the `signature' and `sigof' keywords for specifying + abstract types. The default (`-fno-handle-signatures') is not to + recognize them. *Note Type Abstraction using Signatures: C++ + Signatures. + +`-fhonor-std' + Treat the `namespace std' as a namespace, instead of ignoring it. + For compatibility with earlier versions of g++, the compiler will, + by default, ignore `namespace-declarations', `using-declarations', + `using-directives', and `namespace-names', if they involve `std'. + +`-fhuge-objects' + Support virtual function calls for objects that exceed the size + representable by a `short int'. Users should not use this flag by + default; if you need to use it, the compiler will tell you so. + + This flag is not useful when compiling with -fvtable-thunks. + + Like all options that change the ABI, all C++ code, *including + libgcc* must be built with the same setting of this option. + +`-fno-implicit-templates' + Never emit code for non-inline templates which are instantiated + implicitly (i.e. by use); only emit code for explicit + instantiations. *Note Template Instantiation::, for more + information. + +`-fno-implicit-inline-templates' + Don't emit code for implicit instantiations of inline templates, + either. The default is to handle inlines differently so that + compiles with and without optimization will need the same set of + explicit instantiations. + +`-finit-priority' + Support `__attribute__ ((init_priority (n)))' for controlling the + order of initialization of file-scope objects. On ELF targets, + this requires GNU ld 2.10 or later. + +`-fno-implement-inlines' + To save space, do not emit out-of-line copies of inline functions + controlled by `#pragma implementation'. This will cause linker + errors if these functions are not inlined everywhere they are + called. + +`-fname-mangling-version-N' + Control the way in which names are mangled. Version 0 is + compatible with versions of g++ before 2.8. Version 1 is the + default. Version 1 will allow correct mangling of function + templates. For example, version 0 mangling does not mangle + foo and foo given this declaration: + + template void foo(T t); + + Like all options that change the ABI, all C++ code, *including + libgcc* must be built with the same setting of this option. + +`-foperator-names' + Recognize the operator name keywords `and', `bitand', `bitor', + `compl', `not', `or' and `xor' as synonyms for the symbols they + refer to. `-ansi' implies `-foperator-names'. + +`-fno-optional-diags' + Disable diagnostics that the standard says a compiler does not + need to issue. Currently, the only such diagnostic issued by g++ + is the one for a name having multiple meanings within a class. + +`-fpermissive' + Downgrade messages about nonconformant code from errors to + warnings. By default, g++ effectively sets `-pedantic-errors' + without `-pedantic'; this option reverses that. This behavior and + this option are superceded by `-pedantic', which works as it does + for GNU C. + +`-frepo' + Enable automatic template instantiation. This option also implies + `-fno-implicit-templates'. *Note Template Instantiation::, for + more information. + +`-fno-rtti' + Disable generation of the information used by C++ runtime type + identification features (`dynamic_cast' and `typeid'). If you + don't use those parts of the language (or exception handling, + which uses `dynamic_cast' internally), you can save some space by + using this flag. + +`-fstrict-prototype' + Within an `extern "C"' linkage specification, treat a function + declaration with no arguments, such as `int foo ();', as declaring + the function to take no arguments. Normally, such a declaration + means that the function `foo' can take any combination of + arguments, as in C. `-pedantic' implies `-fstrict-prototype' + unless overridden with `-fno-strict-prototype'. + + Specifying this option will also suppress implicit declarations of + functions. + + This flag no longer affects declarations with C++ linkage. + +`-fsquangle' +`-fno-squangle' + `-fsquangle' will enable a compressed form of name mangling for + identifiers. In particular, it helps to shorten very long names by + recognizing types and class names which occur more than once, + replacing them with special short ID codes. This option also + requires any C++ libraries being used to be compiled with this + option as well. The compiler has this disabled (the equivalent of + `-fno-squangle') by default. + + Like all options that change the ABI, all C++ code, *including + libgcc.a* must be built with the same setting of this option. + +`-ftemplate-depth-N' + Set the maximum instantiation depth for template classes to N. A + limit on the template instantiation depth is needed to detect + endless recursions during template class instantiation. ANSI/ISO + C++ conforming programs must not rely on a maximum depth greater + than 17. + +`-fthis-is-variable' + Permit assignment to `this'. The incorporation of user-defined + free store management into C++ has made assignment to `this' an + anachronism. Therefore, by default it is invalid to assign to + `this' within a class member function; that is, GNU C++ treats + `this' in a member function of class `X' as a non-lvalue of type + `X *'. However, for backwards compatibility, you can make it + valid with `-fthis-is-variable'. + +`-fvtable-thunks' + Use `thunks' to implement the virtual function dispatch table + (`vtable'). The traditional (cfront-style) approach to + implementing vtables was to store a pointer to the function and two + offsets for adjusting the `this' pointer at the call site. Newer + implementations store a single pointer to a `thunk' function which + does any necessary adjustment and then calls the target function. + + This option also enables a heuristic for controlling emission of + vtables; if a class has any non-inline virtual functions, the + vtable will be emitted in the translation unit containing the + first one of those. + + Like all options that change the ABI, all C++ code, *including + libgcc.a* must be built with the same setting of this option. + +`-nostdinc++' + Do not search for header files in the standard directories + specific to C++, but do still search the other standard + directories. (This option is used when building the C++ library.) + + In addition, these optimization, warning, and code generation options +have meanings only for C++ programs: + +`-fno-default-inline' + Do not assume `inline' for functions defined inside a class scope. + *Note Options That Control Optimization: Optimize Options. Note + that these functions will have linkage like inline functions; they + just won't be inlined by default. + +`-Wctor-dtor-privacy (C++ only)' + Warn when a class seems unusable, because all the constructors or + destructors in a class are private and the class has no friends or + public static member functions. + +`-Wnon-virtual-dtor (C++ only)' + Warn when a class declares a non-virtual destructor that should + probably be virtual, because it looks like the class will be used + polymorphically. + +`-Wreorder (C++ only)' + Warn when the order of member initializers given in the code does + not match the order in which they must be executed. For instance: + + struct A { + int i; + int j; + A(): j (0), i (1) { } + }; + + Here the compiler will warn that the member initializers for `i' + and `j' will be rearranged to match the declaration order of the + members. + + The following `-W...' options are not affected by `-Wall'. + +`-Weffc++ (C++ only)' + Warn about violations of various style guidelines from Scott + Meyers' `Effective C++' books. If you use this option, you should + be aware that the standard library headers do not obey all of + these guidelines; you can use `grep -v' to filter out those + warnings. + +`-Wno-deprecated (C++ only)' + Do not warn about usage of deprecated features. *Note Deprecated + Features::. + +`-Wno-non-template-friend (C++ only)' + Disable warnings when non-templatized friend functions are declared + within a template. With the advent of explicit template + specification support in g++, if the name of the friend is an + unqualified-id (ie, `friend foo(int)'), the C++ language + specification demands that the friend declare or define an + ordinary, nontemplate function. (Section 14.5.3). Before g++ + implemented explicit specification, unqualified-ids could be + interpreted as a particular specialization of a templatized + function. Because this non-conforming behavior is no longer the + default behavior for g++, `-Wnon-template-friend' allows the + compiler to check existing code for potential trouble spots, and + is on by default. This new compiler behavior can also be turned + off with the flag `-fguiding-decls', which activates the older, + non-specification compiler code, or with + `-Wno-non-template-friend' which keeps the conformant compiler + code but disables the helpful warning. + +`-Wold-style-cast (C++ only)' + Warn if an old-style (C-style) cast is used within a C++ program. + The new-style casts (`static_cast', `reinterpret_cast', and + `const_cast') are less vulnerable to unintended effects. + +`-Woverloaded-virtual (C++ only)' + Warn when a derived class function declaration may be an error in + defining a virtual function. In a derived class, the definitions + of virtual functions must match the type signature of a virtual + function declared in the base class. With this option, the + compiler warns when you define a function with the same name as a + virtual function, but with a type signature that does not match any + declarations from the base class. + +`-Wno-pmf-conversions (C++ only)' + Disable the diagnostic for converting a bound pointer to member + function to a plain pointer. + +`-Wsign-promo (C++ only)' + Warn when overload resolution chooses a promotion from unsigned or + enumeral type to a signed type over a conversion to an unsigned + type of the same size. Previous versions of g++ would try to + preserve unsignedness, but the standard mandates the current + behavior. + +`-Wsynth (C++ only)' + Warn when g++'s synthesis behavior does not match that of cfront. + For instance: + + struct A { + operator int (); + A& operator = (int); + }; + + main () + { + A a,b; + a = b; + } + + In this example, g++ will synthesize a default `A& operator = + (const A&);', while cfront will use the user-defined `operator ='. + + +File: gcc.info, Node: Warning Options, Next: Debugging Options, Prev: C++ Dialect Options, Up: Invoking GCC + +Options to Request or Suppress Warnings +======================================= + + Warnings are diagnostic messages that report constructions which are +not inherently erroneous but which are risky or suggest there may have +been an error. + + You can request many specific warnings with options beginning `-W', +for example `-Wimplicit' to request warnings on implicit declarations. +Each of these specific warning options also has a negative form +beginning `-Wno-' to turn off warnings; for example, `-Wno-implicit'. +This manual lists only one of the two forms, whichever is not the +default. + + These options control the amount and kinds of warnings produced by +GCC: + +`-fsyntax-only' + Check the code for syntax errors, but don't do anything beyond + that. + +`-pedantic' + Issue all the warnings demanded by strict ANSI C and ISO C++; + reject all programs that use forbidden extensions. + + Valid ANSI C and ISO C++ programs should compile properly with or + without this option (though a rare few will require `-ansi'). + However, without this option, certain GNU extensions and + traditional C and C++ features are supported as well. With this + option, they are rejected. + + `-pedantic' does not cause warning messages for use of the + alternate keywords whose names begin and end with `__'. Pedantic + warnings are also disabled in the expression that follows + `__extension__'. However, only system header files should use + these escape routes; application programs should avoid them. + *Note Alternate Keywords::. + + This option is not intended to be useful; it exists only to satisfy + pedants who would otherwise claim that GCC fails to support the + ANSI standard. + + Some users try to use `-pedantic' to check programs for strict ANSI + C conformance. They soon find that it does not do quite what they + want: it finds some non-ANSI practices, but not all--only those + for which ANSI C *requires* a diagnostic. + + A feature to report any failure to conform to ANSI C might be + useful in some instances, but would require considerable + additional work and would be quite different from `-pedantic'. We + don't have plans to support such a feature in the near future. + +`-pedantic-errors' + Like `-pedantic', except that errors are produced rather than + warnings. + +`-w' + Inhibit all warning messages. + +`-Wno-import' + Inhibit warning messages about the use of `#import'. + +`-Wchar-subscripts' + Warn if an array subscript has type `char'. This is a common cause + of error, as programmers often forget that this type is signed on + some machines. + +`-Wcomment' + Warn whenever a comment-start sequence `/*' appears in a `/*' + comment, or whenever a Backslash-Newline appears in a `//' comment. + +`-Wformat' + Check calls to `printf' and `scanf', etc., to make sure that the + arguments supplied have types appropriate to the format string + specified. + +`-Wimplicit-int' + Warn when a declaration does not specify a type. + +`-Wimplicit-function-declaration' +`-Werror-implicit-function-declaration' + Give a warning (or error) whenever a function is used before being + declared. + +`-Wimplicit' + Same as `-Wimplicit-int' and `-Wimplicit-function-' + `declaration'. + +`-Wmain' + Warn if the type of `main' is suspicious. `main' should be a + function with external linkage, returning int, taking either zero + arguments, two, or three arguments of appropriate types. + +`-Wmultichar' + Warn if a multicharacter constant (`'FOOF'') is used. Usually they + indicate a typo in the user's code, as they have + implementation-defined values, and should not be used in portable + code. + +`-Wparentheses' + Warn if parentheses are omitted in certain contexts, such as when + there is an assignment in a context where a truth value is + expected, or when operators are nested whose precedence people + often get confused about. + + Also warn about constructions where there may be confusion to which + `if' statement an `else' branch belongs. Here is an example of + such a case: + + { + if (a) + if (b) + foo (); + else + bar (); + } + + In C, every `else' branch belongs to the innermost possible `if' + statement, which in this example is `if (b)'. This is often not + what the programmer expected, as illustrated in the above example + by indentation the programmer chose. When there is the potential + for this confusion, GNU C will issue a warning when this flag is + specified. To eliminate the warning, add explicit braces around + the innermost `if' statement so there is no way the `else' could + belong to the enclosing `if'. The resulting code would look like + this: + + { + if (a) + { + if (b) + foo (); + else + bar (); + } + } + +`-Wreturn-type' + Warn whenever a function is defined with a return-type that + defaults to `int'. Also warn about any `return' statement with no + return-value in a function whose return-type is not `void'. + +`-Wswitch' + Warn whenever a `switch' statement has an index of enumeral type + and lacks a `case' for one or more of the named codes of that + enumeration. (The presence of a `default' label prevents this + warning.) `case' labels outside the enumeration range also + provoke warnings when this option is used. + +`-Wtrigraphs' + Warn if any trigraphs are encountered (assuming they are enabled). + +`-Wunused' + Warn whenever a variable is unused aside from its declaration, + whenever a function is declared static but never defined, whenever + a label is declared but not used, and whenever a statement + computes a result that is explicitly not used. + + In order to get a warning about an unused function parameter, you + must specify both `-W' and `-Wunused'. + + To suppress this warning for an expression, simply cast it to + void. For unused variables, parameters and labels, use the + `unused' attribute (*note Variable Attributes::.). + +`-Wuninitialized' + An automatic variable is used without first being initialized. + + These warnings are possible only in optimizing compilation, + because they require data flow information that is computed only + when optimizing. If you don't specify `-O', you simply won't get + these warnings. + + These warnings occur only for variables that are candidates for + register allocation. Therefore, they do not occur for a variable + that is declared `volatile', or whose address is taken, or whose + size is other than 1, 2, 4 or 8 bytes. Also, they do not occur for + structures, unions or arrays, even when they are in registers. + + Note that there may be no warning about a variable that is used + only to compute a value that itself is never used, because such + computations may be deleted by data flow analysis before the + warnings are printed. + + These warnings are made optional because GCC is not smart enough + to see all the reasons why the code might be correct despite + appearing to have an error. Here is one example of how this can + happen: + + { + int x; + switch (y) + { + case 1: x = 1; + break; + case 2: x = 4; + break; + case 3: x = 5; + } + foo (x); + } + + If the value of `y' is always 1, 2 or 3, then `x' is always + initialized, but GCC doesn't know this. Here is another common + case: + + { + int save_y; + if (change_y) save_y = y, y = new_y; + ... + if (change_y) y = save_y; + } + + This has no bug because `save_y' is used only if it is set. + + Some spurious warnings can be avoided if you declare all the + functions you use that never return as `noreturn'. *Note Function + Attributes::. + +`-Wunknown-pragmas' + Warn when a #pragma directive is encountered which is not + understood by GCC. If this command line option is used, warnings + will even be issued for unknown pragmas in system header files. + This is not the case if the warnings were only enabled by the + `-Wall' command line option. + +`-Wall' + All of the above `-W' options combined. This enables all the + warnings about constructions that some users consider + questionable, and that are easy to avoid (or modify to prevent the + warning), even in conjunction with macros. + + The following `-W...' options are not implied by `-Wall'. Some of +them warn about constructions that users generally do not consider +questionable, but which occasionally you might wish to check for; +others warn about constructions that are necessary or hard to avoid in +some cases, and there is no simple way to modify the code to suppress +the warning. + +`-W' + Print extra warning messages for these events: + + * A nonvolatile automatic variable might be changed by a call to + `longjmp'. These warnings as well are possible only in + optimizing compilation. + + The compiler sees only the calls to `setjmp'. It cannot know + where `longjmp' will be called; in fact, a signal handler + could call it at any point in the code. As a result, you may + get a warning even when there is in fact no problem because + `longjmp' cannot in fact be called at the place which would + cause a problem. + + * A function can return either with or without a value. + (Falling off the end of the function body is considered + returning without a value.) For example, this function would + evoke such a warning: + + foo (a) + { + if (a > 0) + return a; + } + + * An expression-statement or the left-hand side of a comma + expression contains no side effects. To suppress the + warning, cast the unused expression to void. For example, an + expression such as `x[i,j]' will cause a warning, but + `x[(void)i,j]' will not. + + * An unsigned value is compared against zero with `<' or `<='. + + * A comparison like `x<=y<=z' appears; this is equivalent to + `(x<=y ? 1 : 0) <= z', which is a different interpretation + from that of ordinary mathematical notation. + + * Storage-class specifiers like `static' are not the first + things in a declaration. According to the C Standard, this + usage is obsolescent. + + * If `-Wall' or `-Wunused' is also specified, warn about unused + arguments. + + * A comparison between signed and unsigned values could produce + an incorrect result when the signed value is converted to + unsigned. (But don't warn if `-Wno-sign-compare' is also + specified.) + + * An aggregate has a partly bracketed initializer. For + example, the following code would evoke such a warning, + because braces are missing around the initializer for `x.h': + + struct s { int f, g; }; + struct t { struct s h; int i; }; + struct t x = { 1, 2, 3 }; + + * An aggregate has an initializer which does not initialize all + members. For example, the following code would cause such a + warning, because `x.h' would be implicitly initialized to + zero: + + struct s { int f, g, h; }; + struct s x = { 3, 4 }; + +`-Wtraditional' + Warn about certain constructs that behave differently in + traditional and ANSI C. + + * Macro arguments occurring within string constants in the + macro body. These would substitute the argument in + traditional C, but are part of the constant in ANSI C. + + * A function declared external in one block and then used after + the end of the block. + + * A `switch' statement has an operand of type `long'. + + * A non-`static' function declaration follows a `static' one. + This construct is not accepted by some traditional C + compilers. + +`-Wundef' + Warn if an undefined identifier is evaluated in an `#if' directive. + +`-Wshadow' + Warn whenever a local variable shadows another local variable. + +`-Wid-clash-LEN' + Warn whenever two distinct identifiers match in the first LEN + characters. This may help you prepare a program that will compile + with certain obsolete, brain-damaged compilers. + +`-Wlarger-than-LEN' + Warn whenever an object of larger than LEN bytes is defined. + +`-Wpointer-arith' + Warn about anything that depends on the "size of" a function type + or of `void'. GNU C assigns these types a size of 1, for + convenience in calculations with `void *' pointers and pointers to + functions. + +`-Wbad-function-cast' + Warn whenever a function call is cast to a non-matching type. For + example, warn if `int malloc()' is cast to `anything *'. + +`-Wcast-qual' + Warn whenever a pointer is cast so as to remove a type qualifier + from the target type. For example, warn if a `const char *' is + cast to an ordinary `char *'. + +`-Wcast-align' + Warn whenever a pointer is cast such that the required alignment + of the target is increased. For example, warn if a `char *' is + cast to an `int *' on machines where integers can only be accessed + at two- or four-byte boundaries. + +`-Wwrite-strings' + Give string constants the type `const char[LENGTH]' so that + copying the address of one into a non-`const' `char *' pointer + will get a warning. These warnings will help you find at compile + time code that can try to write into a string constant, but only + if you have been very careful about using `const' in declarations + and prototypes. Otherwise, it will just be a nuisance; this is + why we did not make `-Wall' request these warnings. + +`-Wconversion' + Warn if a prototype causes a type conversion that is different + from what would happen to the same argument in the absence of a + prototype. This includes conversions of fixed point to floating + and vice versa, and conversions changing the width or signedness + of a fixed point argument except when the same as the default + promotion. + + Also, warn if a negative integer constant expression is implicitly + converted to an unsigned type. For example, warn about the + assignment `x = -1' if `x' is unsigned. But do not warn about + explicit casts like `(unsigned) -1'. + +`-Wsign-compare' + Warn when a comparison between signed and unsigned values could + produce an incorrect result when the signed value is converted to + unsigned. This warning is also enabled by `-W'; to get the other + warnings of `-W' without this warning, use `-W -Wno-sign-compare'. + +`-Waggregate-return' + Warn if any functions that return structures or unions are defined + or called. (In languages where you can return an array, this also + elicits a warning.) + +`-Wstrict-prototypes' + Warn if a function is declared or defined without specifying the + argument types. (An old-style function definition is permitted + without a warning if preceded by a declaration which specifies the + argument types.) + +`-Wmissing-prototypes' + Warn if a global function is defined without a previous prototype + declaration. This warning is issued even if the definition itself + provides a prototype. The aim is to detect global functions that + fail to be declared in header files. + +`-Wmissing-declarations' + Warn if a global function is defined without a previous + declaration. Do so even if the definition itself provides a + prototype. Use this option to detect global functions that are + not declared in header files. + +`-Wmissing-noreturn' + Warn about functions which might be candidates for attribute + `noreturn'. Note these are only possible candidates, not absolute + ones. Care should be taken to manually verify functions actually + do not ever return before adding the `noreturn' attribute, + otherwise subtle code generation bugs could be introduced. + +`-Wredundant-decls' + Warn if anything is declared more than once in the same scope, + even in cases where multiple declaration is valid and changes + nothing. + +`-Wnested-externs' + Warn if an `extern' declaration is encountered within an function. + +`-Winline' + Warn if a function can not be inlined, and either it was declared + as inline, or else the `-finline-functions' option was given. + +`-Wlong-long' + Warn if `long long' type is used. This is default. To inhibit + the warning messages, use `-Wno-long-long'. Flags `-Wlong-long' + and `-Wno-long-long' are taken into account only when `-pedantic' + flag is used. + +`-Werror' + Make all warnings into errors. + diff --git a/usr/local/nachos/info/gcc.info-20 b/usr/local/nachos/info/gcc.info-20 new file mode 100644 index 0000000..2a48fb8 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-20 @@ -0,0 +1,1168 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Dependent Patterns, Next: Jump Patterns, Prev: Pattern Ordering, Up: Machine Desc + +Interdependence of Patterns +=========================== + + Every machine description must have a named pattern for each of the +conditional branch names `bCOND'. The recognition template must always +have the form + + (set (pc) + (if_then_else (COND (cc0) (const_int 0)) + (label_ref (match_operand 0 "" "")) + (pc))) + +In addition, every machine description must have an anonymous pattern +for each of the possible reverse-conditional branches. Their templates +look like + + (set (pc) + (if_then_else (COND (cc0) (const_int 0)) + (pc) + (label_ref (match_operand 0 "" "")))) + +They are necessary because jump optimization can turn direct-conditional +branches into reverse-conditional branches. + + It is often convenient to use the `match_operator' construct to +reduce the number of patterns that must be specified for branches. For +example, + + (define_insn "" + [(set (pc) + (if_then_else (match_operator 0 "comparison_operator" + [(cc0) (const_int 0)]) + (pc) + (label_ref (match_operand 1 "" ""))))] + "CONDITION" + "...") + + In some cases machines support instructions identical except for the +machine mode of one or more operands. For example, there may be +"sign-extend halfword" and "sign-extend byte" instructions whose +patterns are + + (set (match_operand:SI 0 ...) + (extend:SI (match_operand:HI 1 ...))) + + (set (match_operand:SI 0 ...) + (extend:SI (match_operand:QI 1 ...))) + +Constant integers do not specify a machine mode, so an instruction to +extend a constant value could match either pattern. The pattern it +actually will match is the one that appears first in the file. For +correct results, this must be the one for the widest possible mode +(`HImode', here). If the pattern matches the `QImode' instruction, the +results will be incorrect if the constant value does not actually fit +that mode. + + Such instructions to extend constants are rarely generated because +they are optimized away, but they do occasionally happen in nonoptimized +compilations. + + If a constraint in a pattern allows a constant, the reload pass may +replace a register with a constant permitted by the constraint in some +cases. Similarly for memory references. Because of this substitution, +you should not provide separate patterns for increment and decrement +instructions. Instead, they should be generated from the same pattern +that supports register-register add insns by examining the operands and +generating the appropriate machine instruction. + + +File: gcc.info, Node: Jump Patterns, Next: Insn Canonicalizations, Prev: Dependent Patterns, Up: Machine Desc + +Defining Jump Instruction Patterns +================================== + + For most machines, GNU CC assumes that the machine has a condition +code. A comparison insn sets the condition code, recording the results +of both signed and unsigned comparison of the given operands. A +separate branch insn tests the condition code and branches or not +according its value. The branch insns come in distinct signed and +unsigned flavors. Many common machines, such as the Vax, the 68000 and +the 32000, work this way. + + Some machines have distinct signed and unsigned compare +instructions, and only one set of conditional branch instructions. The +easiest way to handle these machines is to treat them just like the +others until the final stage where assembly code is written. At this +time, when outputting code for the compare instruction, peek ahead at +the following branch using `next_cc0_user (insn)'. (The variable +`insn' refers to the insn being output, in the output-writing code in +an instruction pattern.) If the RTL says that is an unsigned branch, +output an unsigned compare; otherwise output a signed compare. When +the branch itself is output, you can treat signed and unsigned branches +identically. + + The reason you can do this is that GNU CC always generates a pair of +consecutive RTL insns, possibly separated by `note' insns, one to set +the condition code and one to test it, and keeps the pair inviolate +until the end. + + To go with this technique, you must define the machine-description +macro `NOTICE_UPDATE_CC' to do `CC_STATUS_INIT'; in other words, no +compare instruction is superfluous. + + Some machines have compare-and-branch instructions and no condition +code. A similar technique works for them. When it is time to "output" +a compare instruction, record its operands in two static variables. +When outputting the branch-on-condition-code instruction that follows, +actually output a compare-and-branch instruction that uses the +remembered operands. + + It also works to define patterns for compare-and-branch instructions. +In optimizing compilation, the pair of compare and branch instructions +will be combined according to these patterns. But this does not happen +if optimization is not requested. So you must use one of the solutions +above in addition to any special patterns you define. + + In many RISC machines, most instructions do not affect the condition +code and there may not even be a separate condition code register. On +these machines, the restriction that the definition and use of the +condition code be adjacent insns is not necessary and can prevent +important optimizations. For example, on the IBM RS/6000, there is a +delay for taken branches unless the condition code register is set three +instructions earlier than the conditional branch. The instruction +scheduler cannot perform this optimization if it is not permitted to +separate the definition and use of the condition code register. + + On these machines, do not use `(cc0)', but instead use a register to +represent the condition code. If there is a specific condition code +register in the machine, use a hard register. If the condition code or +comparison result can be placed in any general register, or if there are +multiple condition registers, use a pseudo register. + + On some machines, the type of branch instruction generated may +depend on the way the condition code was produced; for example, on the +68k and Sparc, setting the condition code directly from an add or +subtract instruction does not clear the overflow bit the way that a test +instruction does, so a different branch instruction must be used for +some conditional branches. For machines that use `(cc0)', the set and +use of the condition code must be adjacent (separated only by `note' +insns) allowing flags in `cc_status' to be used. (*Note Condition +Code::.) Also, the comparison and branch insns can be located from +each other by using the functions `prev_cc0_setter' and `next_cc0_user'. + + However, this is not true on machines that do not use `(cc0)'. On +those machines, no assumptions can be made about the adjacency of the +compare and branch insns and the above methods cannot be used. Instead, +we use the machine mode of the condition code register to record +different formats of the condition code register. + + Registers used to store the condition code value should have a mode +that is in class `MODE_CC'. Normally, it will be `CCmode'. If +additional modes are required (as for the add example mentioned above in +the Sparc), define the macro `EXTRA_CC_MODES' to list the additional +modes required (*note Condition Code::.). Also define `EXTRA_CC_NAMES' +to list the names of those modes and `SELECT_CC_MODE' to choose a mode +given an operand of a compare. + + If it is known during RTL generation that a different mode will be +required (for example, if the machine has separate compare instructions +for signed and unsigned quantities, like most IBM processors), they can +be specified at that time. + + If the cases that require different modes would be made by +instruction combination, the macro `SELECT_CC_MODE' determines which +machine mode should be used for the comparison result. The patterns +should be written using that mode. To support the case of the add on +the Sparc discussed above, we have the pattern + + (define_insn "" + [(set (reg:CC_NOOV 0) + (compare:CC_NOOV + (plus:SI (match_operand:SI 0 "register_operand" "%r") + (match_operand:SI 1 "arith_operand" "rI")) + (const_int 0)))] + "" + "...") + + The `SELECT_CC_MODE' macro on the Sparc returns `CC_NOOVmode' for +comparisons whose argument is a `plus'. + + +File: gcc.info, Node: Insn Canonicalizations, Next: Peephole Definitions, Prev: Jump Patterns, Up: Machine Desc + +Canonicalization of Instructions +================================ + + There are often cases where multiple RTL expressions could represent +an operation performed by a single machine instruction. This situation +is most commonly encountered with logical, branch, and +multiply-accumulate instructions. In such cases, the compiler attempts +to convert these multiple RTL expressions into a single canonical form +to reduce the number of insn patterns required. + + In addition to algebraic simplifications, following canonicalizations +are performed: + + * For commutative and comparison operators, a constant is always + made the second operand. If a machine only supports a constant as + the second operand, only patterns that match a constant in the + second operand need be supplied. + + For these operators, if only one operand is a `neg', `not', + `mult', `plus', or `minus' expression, it will be the first + operand. + + * For the `compare' operator, a constant is always the second operand + on machines where `cc0' is used (*note Jump Patterns::.). On other + machines, there are rare cases where the compiler might want to + construct a `compare' with a constant as the first operand. + However, these cases are not common enough for it to be worthwhile + to provide a pattern matching a constant as the first operand + unless the machine actually has such an instruction. + + An operand of `neg', `not', `mult', `plus', or `minus' is made the + first operand under the same conditions as above. + + * `(minus X (const_int N))' is converted to `(plus X (const_int + -N))'. + + * Within address computations (i.e., inside `mem'), a left shift is + converted into the appropriate multiplication by a power of two. + + * De`Morgan's Law is used to move bitwise negation inside a bitwise + logical-and or logical-or operation. If this results in only one + operand being a `not' expression, it will be the first one. + + A machine that has an instruction that performs a bitwise + logical-and of one operand with the bitwise negation of the other + should specify the pattern for that instruction as + + (define_insn "" + [(set (match_operand:M 0 ...) + (and:M (not:M (match_operand:M 1 ...)) + (match_operand:M 2 ...)))] + "..." + "...") + + Similarly, a pattern for a "NAND" instruction should be written + + (define_insn "" + [(set (match_operand:M 0 ...) + (ior:M (not:M (match_operand:M 1 ...)) + (not:M (match_operand:M 2 ...))))] + "..." + "...") + + In both cases, it is not necessary to include patterns for the many + logically equivalent RTL expressions. + + * The only possible RTL expressions involving both bitwise + exclusive-or and bitwise negation are `(xor:M X Y)' and `(not:M + (xor:M X Y))'. + + * The sum of three items, one of which is a constant, will only + appear in the form + + (plus:M (plus:M X Y) CONSTANT) + + * On machines that do not use `cc0', `(compare X (const_int 0))' + will be converted to X. + + * Equality comparisons of a group of bits (usually a single bit) + with zero will be written using `zero_extract' rather than the + equivalent `and' or `sign_extract' operations. + + +File: gcc.info, Node: Peephole Definitions, Next: Expander Definitions, Prev: Insn Canonicalizations, Up: Machine Desc + +Machine-Specific Peephole Optimizers +==================================== + + In addition to instruction patterns the `md' file may contain +definitions of machine-specific peephole optimizations. + + The combiner does not notice certain peephole optimizations when the +data flow in the program does not suggest that it should try them. For +example, sometimes two consecutive insns related in purpose can be +combined even though the second one does not appear to use a register +computed in the first one. A machine-specific peephole optimizer can +detect such opportunities. + + A definition looks like this: + + (define_peephole + [INSN-PATTERN-1 + INSN-PATTERN-2 + ...] + "CONDITION" + "TEMPLATE" + "OPTIONAL INSN-ATTRIBUTES") + +The last string operand may be omitted if you are not using any +machine-specific information in this machine description. If present, +it must obey the same rules as in a `define_insn'. + + In this skeleton, INSN-PATTERN-1 and so on are patterns to match +consecutive insns. The optimization applies to a sequence of insns when +INSN-PATTERN-1 matches the first one, INSN-PATTERN-2 matches the next, +and so on. + + Each of the insns matched by a peephole must also match a +`define_insn'. Peepholes are checked only at the last stage just +before code generation, and only optionally. Therefore, any insn which +would match a peephole but no `define_insn' will cause a crash in code +generation in an unoptimized compilation, or at various optimization +stages. + + The operands of the insns are matched with `match_operands', +`match_operator', and `match_dup', as usual. What is not usual is that +the operand numbers apply to all the insn patterns in the definition. +So, you can check for identical operands in two insns by using +`match_operand' in one insn and `match_dup' in the other. + + The operand constraints used in `match_operand' patterns do not have +any direct effect on the applicability of the peephole, but they will +be validated afterward, so make sure your constraints are general enough +to apply whenever the peephole matches. If the peephole matches but +the constraints are not satisfied, the compiler will crash. + + It is safe to omit constraints in all the operands of the peephole; +or you can write constraints which serve as a double-check on the +criteria previously tested. + + Once a sequence of insns matches the patterns, the CONDITION is +checked. This is a C expression which makes the final decision whether +to perform the optimization (we do so if the expression is nonzero). If +CONDITION is omitted (in other words, the string is empty) then the +optimization is applied to every sequence of insns that matches the +patterns. + + The defined peephole optimizations are applied after register +allocation is complete. Therefore, the peephole definition can check +which operands have ended up in which kinds of registers, just by +looking at the operands. + + The way to refer to the operands in CONDITION is to write +`operands[I]' for operand number I (as matched by `(match_operand I +...)'). Use the variable `insn' to refer to the last of the insns +being matched; use `prev_active_insn' to find the preceding insns. + + When optimizing computations with intermediate results, you can use +CONDITION to match only when the intermediate results are not used +elsewhere. Use the C expression `dead_or_set_p (INSN, OP)', where INSN +is the insn in which you expect the value to be used for the last time +(from the value of `insn', together with use of `prev_nonnote_insn'), +and OP is the intermediate value (from `operands[I]'). + + Applying the optimization means replacing the sequence of insns with +one new insn. The TEMPLATE controls ultimate output of assembler code +for this combined insn. It works exactly like the template of a +`define_insn'. Operand numbers in this template are the same ones used +in matching the original sequence of insns. + + The result of a defined peephole optimizer does not need to match +any of the insn patterns in the machine description; it does not even +have an opportunity to match them. The peephole optimizer definition +itself serves as the insn pattern to control how the insn is output. + + Defined peephole optimizers are run as assembler code is being +output, so the insns they produce are never combined or rearranged in +any way. + + Here is an example, taken from the 68000 machine description: + + (define_peephole + [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4))) + (set (match_operand:DF 0 "register_operand" "=f") + (match_operand:DF 1 "register_operand" "ad"))] + "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])" + "* + { + rtx xoperands[2]; + xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); + #ifdef MOTOROLA + output_asm_insn (\"move.l %1,(sp)\", xoperands); + output_asm_insn (\"move.l %1,-(sp)\", operands); + return \"fmove.d (sp)+,%0\"; + #else + output_asm_insn (\"movel %1,sp@\", xoperands); + output_asm_insn (\"movel %1,sp@-\", operands); + return \"fmoved sp@+,%0\"; + #endif + } + ") + + The effect of this optimization is to change + + jbsr _foobar + addql #4,sp + movel d1,sp@- + movel d0,sp@- + fmoved sp@+,fp0 + +into + + jbsr _foobar + movel d1,sp@ + movel d0,sp@- + fmoved sp@+,fp0 + + INSN-PATTERN-1 and so on look *almost* like the second operand of +`define_insn'. There is one important difference: the second operand +of `define_insn' consists of one or more RTX's enclosed in square +brackets. Usually, there is only one: then the same action can be +written as an element of a `define_peephole'. But when there are +multiple actions in a `define_insn', they are implicitly enclosed in a +`parallel'. Then you must explicitly write the `parallel', and the +square brackets within it, in the `define_peephole'. Thus, if an insn +pattern looks like this, + + (define_insn "divmodsi4" + [(set (match_operand:SI 0 "general_operand" "=d") + (div:SI (match_operand:SI 1 "general_operand" "0") + (match_operand:SI 2 "general_operand" "dmsK"))) + (set (match_operand:SI 3 "general_operand" "=d") + (mod:SI (match_dup 1) (match_dup 2)))] + "TARGET_68020" + "divsl%.l %2,%3:%0") + +then the way to mention this insn in a peephole is as follows: + + (define_peephole + [... + (parallel + [(set (match_operand:SI 0 "general_operand" "=d") + (div:SI (match_operand:SI 1 "general_operand" "0") + (match_operand:SI 2 "general_operand" "dmsK"))) + (set (match_operand:SI 3 "general_operand" "=d") + (mod:SI (match_dup 1) (match_dup 2)))]) + ...] + ...) + + +File: gcc.info, Node: Expander Definitions, Next: Insn Splitting, Prev: Peephole Definitions, Up: Machine Desc + +Defining RTL Sequences for Code Generation +========================================== + + On some target machines, some standard pattern names for RTL +generation cannot be handled with single insn, but a sequence of RTL +insns can represent them. For these target machines, you can write a +`define_expand' to specify how to generate the sequence of RTL. + + A `define_expand' is an RTL expression that looks almost like a +`define_insn'; but, unlike the latter, a `define_expand' is used only +for RTL generation and it can produce more than one RTL insn. + + A `define_expand' RTX has four operands: + + * The name. Each `define_expand' must have a name, since the only + use for it is to refer to it by name. + + * The RTL template. This is just like the RTL template for a + `define_peephole' in that it is a vector of RTL expressions each + being one insn. + + * The condition, a string containing a C expression. This + expression is used to express how the availability of this pattern + depends on subclasses of target machine, selected by command-line + options when GNU CC is run. This is just like the condition of a + `define_insn' that has a standard name. Therefore, the condition + (if present) may not depend on the data in the insn being matched, + but only the target-machine-type flags. The compiler needs to + test these conditions during initialization in order to learn + exactly which named instructions are available in a particular run. + + * The preparation statements, a string containing zero or more C + statements which are to be executed before RTL code is generated + from the RTL template. + + Usually these statements prepare temporary registers for use as + internal operands in the RTL template, but they can also generate + RTL insns directly by calling routines such as `emit_insn', etc. + Any such insns precede the ones that come from the RTL template. + + Every RTL insn emitted by a `define_expand' must match some +`define_insn' in the machine description. Otherwise, the compiler will +crash when trying to generate code for the insn or trying to optimize +it. + + The RTL template, in addition to controlling generation of RTL insns, +also describes the operands that need to be specified when this pattern +is used. In particular, it gives a predicate for each operand. + + A true operand, which needs to be specified in order to generate RTL +from the pattern, should be described with a `match_operand' in its +first occurrence in the RTL template. This enters information on the +operand's predicate into the tables that record such things. GNU CC +uses the information to preload the operand into a register if that is +required for valid RTL code. If the operand is referred to more than +once, subsequent references should use `match_dup'. + + The RTL template may also refer to internal "operands" which are +temporary registers or labels used only within the sequence made by the +`define_expand'. Internal operands are substituted into the RTL +template with `match_dup', never with `match_operand'. The values of +the internal operands are not passed in as arguments by the compiler +when it requests use of this pattern. Instead, they are computed +within the pattern, in the preparation statements. These statements +compute the values and store them into the appropriate elements of +`operands' so that `match_dup' can find them. + + There are two special macros defined for use in the preparation +statements: `DONE' and `FAIL'. Use them with a following semicolon, as +a statement. + +`DONE' + Use the `DONE' macro to end RTL generation for the pattern. The + only RTL insns resulting from the pattern on this occasion will be + those already emitted by explicit calls to `emit_insn' within the + preparation statements; the RTL template will not be generated. + +`FAIL' + Make the pattern fail on this occasion. When a pattern fails, it + means that the pattern was not truly available. The calling + routines in the compiler will try other strategies for code + generation using other patterns. + + Failure is currently supported only for binary (addition, + multiplication, shifting, etc.) and bitfield (`extv', `extzv', and + `insv') operations. + + Here is an example, the definition of left-shift for the SPUR chip: + + (define_expand "ashlsi3" + [(set (match_operand:SI 0 "register_operand" "") + (ashift:SI + + (match_operand:SI 1 "register_operand" "") + (match_operand:SI 2 "nonmemory_operand" "")))] + "" + " + + { + if (GET_CODE (operands[2]) != CONST_INT + || (unsigned) INTVAL (operands[2]) > 3) + FAIL; + }") + +This example uses `define_expand' so that it can generate an RTL insn +for shifting when the shift-count is in the supported range of 0 to 3 +but fail in other cases where machine insns aren't available. When it +fails, the compiler tries another strategy using different patterns +(such as, a library call). + + If the compiler were able to handle nontrivial condition-strings in +patterns with names, then it would be possible to use a `define_insn' +in that case. Here is another case (zero-extension on the 68000) which +makes more use of the power of `define_expand': + + (define_expand "zero_extendhisi2" + [(set (match_operand:SI 0 "general_operand" "") + (const_int 0)) + (set (strict_low_part + (subreg:HI + (match_dup 0) + 0)) + (match_operand:HI 1 "general_operand" ""))] + "" + "operands[1] = make_safe_from (operands[1], operands[0]);") + +Here two RTL insns are generated, one to clear the entire output operand +and the other to copy the input operand into its low half. This +sequence is incorrect if the input operand refers to [the old value of] +the output operand, so the preparation statement makes sure this isn't +so. The function `make_safe_from' copies the `operands[1]' into a +temporary register if it refers to `operands[0]'. It does this by +emitting another RTL insn. + + Finally, a third example shows the use of an internal operand. +Zero-extension on the SPUR chip is done by `and'-ing the result against +a halfword mask. But this mask cannot be represented by a `const_int' +because the constant value is too large to be legitimate on this +machine. So it must be copied into a register with `force_reg' and +then the register used in the `and'. + + (define_expand "zero_extendhisi2" + [(set (match_operand:SI 0 "register_operand" "") + (and:SI (subreg:SI + (match_operand:HI 1 "register_operand" "") + 0) + (match_dup 2)))] + "" + "operands[2] + = force_reg (SImode, GEN_INT (65535)); ") + + *Note:* If the `define_expand' is used to serve a standard binary or +unary arithmetic operation or a bitfield operation, then the last insn +it generates must not be a `code_label', `barrier' or `note'. It must +be an `insn', `jump_insn' or `call_insn'. If you don't need a real insn +at the end, emit an insn to copy the result of the operation into +itself. Such an insn will generate no code, but it can avoid problems +in the compiler. + + +File: gcc.info, Node: Insn Splitting, Next: Insn Attributes, Prev: Expander Definitions, Up: Machine Desc + +Defining How to Split Instructions +================================== + + There are two cases where you should specify how to split a pattern +into multiple insns. On machines that have instructions requiring delay +slots (*note Delay Slots::.) or that have instructions whose output is +not available for multiple cycles (*note Function Units::.), the +compiler phases that optimize these cases need to be able to move insns +into one-instruction delay slots. However, some insns may generate +more than one machine instruction. These insns cannot be placed into a +delay slot. + + Often you can rewrite the single insn as a list of individual insns, +each corresponding to one machine instruction. The disadvantage of +doing so is that it will cause the compilation to be slower and require +more space. If the resulting insns are too complex, it may also +suppress some optimizations. The compiler splits the insn if there is a +reason to believe that it might improve instruction or delay slot +scheduling. + + The insn combiner phase also splits putative insns. If three insns +are merged into one insn with a complex expression that cannot be +matched by some `define_insn' pattern, the combiner phase attempts to +split the complex pattern into two insns that are recognized. Usually +it can break the complex pattern into two patterns by splitting out some +subexpression. However, in some other cases, such as performing an +addition of a large constant in two insns on a RISC machine, the way to +split the addition into two insns is machine-dependent. + + The `define_split' definition tells the compiler how to split a +complex insn into several simpler insns. It looks like this: + + (define_split + [INSN-PATTERN] + "CONDITION" + [NEW-INSN-PATTERN-1 + NEW-INSN-PATTERN-2 + ...] + "PREPARATION STATEMENTS") + + INSN-PATTERN is a pattern that needs to be split and CONDITION is +the final condition to be tested, as in a `define_insn'. When an insn +matching INSN-PATTERN and satisfying CONDITION is found, it is replaced +in the insn list with the insns given by NEW-INSN-PATTERN-1, +NEW-INSN-PATTERN-2, etc. + + The PREPARATION STATEMENTS are similar to those statements that are +specified for `define_expand' (*note Expander Definitions::.) and are +executed before the new RTL is generated to prepare for the generated +code or emit some insns whose pattern is not fixed. Unlike those in +`define_expand', however, these statements must not generate any new +pseudo-registers. Once reload has completed, they also must not +allocate any space in the stack frame. + + Patterns are matched against INSN-PATTERN in two different +circumstances. If an insn needs to be split for delay slot scheduling +or insn scheduling, the insn is already known to be valid, which means +that it must have been matched by some `define_insn' and, if +`reload_completed' is non-zero, is known to satisfy the constraints of +that `define_insn'. In that case, the new insn patterns must also be +insns that are matched by some `define_insn' and, if `reload_completed' +is non-zero, must also satisfy the constraints of those definitions. + + As an example of this usage of `define_split', consider the following +example from `a29k.md', which splits a `sign_extend' from `HImode' to +`SImode' into a pair of shift insns: + + (define_split + [(set (match_operand:SI 0 "gen_reg_operand" "") + (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))] + "" + [(set (match_dup 0) + (ashift:SI (match_dup 1) + (const_int 16))) + (set (match_dup 0) + (ashiftrt:SI (match_dup 0) + (const_int 16)))] + " + { operands[1] = gen_lowpart (SImode, operands[1]); }") + + When the combiner phase tries to split an insn pattern, it is always +the case that the pattern is *not* matched by any `define_insn'. The +combiner pass first tries to split a single `set' expression and then +the same `set' expression inside a `parallel', but followed by a +`clobber' of a pseudo-reg to use as a scratch register. In these +cases, the combiner expects exactly two new insn patterns to be +generated. It will verify that these patterns match some `define_insn' +definitions, so you need not do this test in the `define_split' (of +course, there is no point in writing a `define_split' that will never +produce insns that match). + + Here is an example of this use of `define_split', taken from +`rs6000.md': + + (define_split + [(set (match_operand:SI 0 "gen_reg_operand" "") + (plus:SI (match_operand:SI 1 "gen_reg_operand" "") + (match_operand:SI 2 "non_add_cint_operand" "")))] + "" + [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3))) + (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))] + " + { + int low = INTVAL (operands[2]) & 0xffff; + int high = (unsigned) INTVAL (operands[2]) >> 16; + + if (low & 0x8000) + high++, low |= 0xffff0000; + + operands[3] = GEN_INT (high << 16); + operands[4] = GEN_INT (low); + }") + + Here the predicate `non_add_cint_operand' matches any `const_int' +that is *not* a valid operand of a single add insn. The add with the +smaller displacement is written so that it can be substituted into the +address of a subsequent operation. + + An example that uses a scratch register, from the same file, +generates an equality comparison of a register and a large constant: + + (define_split + [(set (match_operand:CC 0 "cc_reg_operand" "") + (compare:CC (match_operand:SI 1 "gen_reg_operand" "") + (match_operand:SI 2 "non_short_cint_operand" ""))) + (clobber (match_operand:SI 3 "gen_reg_operand" ""))] + "find_single_use (operands[0], insn, 0) + && (GET_CODE (*find_single_use (operands[0], insn, 0)) == EQ + || GET_CODE (*find_single_use (operands[0], insn, 0)) == NE)" + [(set (match_dup 3) (xor:SI (match_dup 1) (match_dup 4))) + (set (match_dup 0) (compare:CC (match_dup 3) (match_dup 5)))] + " + { + /* Get the constant we are comparing against, C, and see what it + looks like sign-extended to 16 bits. Then see what constant + could be XOR'ed with C to get the sign-extended value. */ + + int c = INTVAL (operands[2]); + int sextc = (c << 16) >> 16; + int xorv = c ^ sextc; + + operands[4] = GEN_INT (xorv); + operands[5] = GEN_INT (sextc); + }") + + To avoid confusion, don't write a single `define_split' that accepts +some insns that match some `define_insn' as well as some insns that +don't. Instead, write two separate `define_split' definitions, one for +the insns that are valid and one for the insns that are not valid. + + +File: gcc.info, Node: Insn Attributes, Prev: Insn Splitting, Up: Machine Desc + +Instruction Attributes +====================== + + In addition to describing the instruction supported by the target +machine, the `md' file also defines a group of "attributes" and a set of +values for each. Every generated insn is assigned a value for each +attribute. One possible attribute would be the effect that the insn +has on the machine's condition code. This attribute can then be used +by `NOTICE_UPDATE_CC' to track the condition codes. + +* Menu: + +* Defining Attributes:: Specifying attributes and their values. +* Expressions:: Valid expressions for attribute values. +* Tagging Insns:: Assigning attribute values to insns. +* Attr Example:: An example of assigning attributes. +* Insn Lengths:: Computing the length of insns. +* Constant Attributes:: Defining attributes that are constant. +* Delay Slots:: Defining delay slots required for a machine. +* Function Units:: Specifying information for insn scheduling. + + +File: gcc.info, Node: Defining Attributes, Next: Expressions, Up: Insn Attributes + +Defining Attributes and their Values +------------------------------------ + + The `define_attr' expression is used to define each attribute +required by the target machine. It looks like: + + (define_attr NAME LIST-OF-VALUES DEFAULT) + + NAME is a string specifying the name of the attribute being defined. + + LIST-OF-VALUES is either a string that specifies a comma-separated +list of values that can be assigned to the attribute, or a null string +to indicate that the attribute takes numeric values. + + DEFAULT is an attribute expression that gives the value of this +attribute for insns that match patterns whose definition does not +include an explicit value for this attribute. *Note Attr Example::, +for more information on the handling of defaults. *Note Constant +Attributes::, for information on attributes that do not depend on any +particular insn. + + For each defined attribute, a number of definitions are written to +the `insn-attr.h' file. For cases where an explicit set of values is +specified for an attribute, the following are defined: + + * A `#define' is written for the symbol `HAVE_ATTR_NAME'. + + * An enumeral class is defined for `attr_NAME' with elements of the + form `UPPER-NAME_UPPER-VALUE' where the attribute name and value + are first converted to upper case. + + * A function `get_attr_NAME' is defined that is passed an insn and + returns the attribute value for that insn. + + For example, if the following is present in the `md' file: + + (define_attr "type" "branch,fp,load,store,arith" ...) + +the following lines will be written to the file `insn-attr.h'. + + #define HAVE_ATTR_type + enum attr_type {TYPE_BRANCH, TYPE_FP, TYPE_LOAD, + TYPE_STORE, TYPE_ARITH}; + extern enum attr_type get_attr_type (); + + If the attribute takes numeric values, no `enum' type will be +defined and the function to obtain the attribute's value will return +`int'. + + +File: gcc.info, Node: Expressions, Next: Tagging Insns, Prev: Defining Attributes, Up: Insn Attributes + +Attribute Expressions +--------------------- + + RTL expressions used to define attributes use the codes described +above plus a few specific to attribute definitions, to be discussed +below. Attribute value expressions must have one of the following +forms: + +`(const_int I)' + The integer I specifies the value of a numeric attribute. I must + be non-negative. + + The value of a numeric attribute can be specified either with a + `const_int', or as an integer represented as a string in + `const_string', `eq_attr' (see below), `attr', `symbol_ref', + simple arithmetic expressions, and `set_attr' overrides on + specific instructions (*note Tagging Insns::.). + +`(const_string VALUE)' + The string VALUE specifies a constant attribute value. If VALUE + is specified as `"*"', it means that the default value of the + attribute is to be used for the insn containing this expression. + `"*"' obviously cannot be used in the DEFAULT expression of a + `define_attr'. + + If the attribute whose value is being specified is numeric, VALUE + must be a string containing a non-negative integer (normally + `const_int' would be used in this case). Otherwise, it must + contain one of the valid values for the attribute. + +`(if_then_else TEST TRUE-VALUE FALSE-VALUE)' + TEST specifies an attribute test, whose format is defined below. + The value of this expression is TRUE-VALUE if TEST is true, + otherwise it is FALSE-VALUE. + +`(cond [TEST1 VALUE1 ...] DEFAULT)' + The first operand of this expression is a vector containing an even + number of expressions and consisting of pairs of TEST and VALUE + expressions. The value of the `cond' expression is that of the + VALUE corresponding to the first true TEST expression. If none of + the TEST expressions are true, the value of the `cond' expression + is that of the DEFAULT expression. + + TEST expressions can have one of the following forms: + +`(const_int I)' + This test is true if I is non-zero and false otherwise. + +`(not TEST)' +`(ior TEST1 TEST2)' +`(and TEST1 TEST2)' + These tests are true if the indicated logical function is true. + +`(match_operand:M N PRED CONSTRAINTS)' + This test is true if operand N of the insn whose attribute value + is being determined has mode M (this part of the test is ignored + if M is `VOIDmode') and the function specified by the string PRED + returns a non-zero value when passed operand N and mode M (this + part of the test is ignored if PRED is the null string). + + The CONSTRAINTS operand is ignored and should be the null string. + +`(le ARITH1 ARITH2)' +`(leu ARITH1 ARITH2)' +`(lt ARITH1 ARITH2)' +`(ltu ARITH1 ARITH2)' +`(gt ARITH1 ARITH2)' +`(gtu ARITH1 ARITH2)' +`(ge ARITH1 ARITH2)' +`(geu ARITH1 ARITH2)' +`(ne ARITH1 ARITH2)' +`(eq ARITH1 ARITH2)' + These tests are true if the indicated comparison of the two + arithmetic expressions is true. Arithmetic expressions are formed + with `plus', `minus', `mult', `div', `mod', `abs', `neg', `and', + `ior', `xor', `not', `ashift', `lshiftrt', and `ashiftrt' + expressions. + + `const_int' and `symbol_ref' are always valid terms (*note Insn + Lengths::.,for additional forms). `symbol_ref' is a string + denoting a C expression that yields an `int' when evaluated by the + `get_attr_...' routine. It should normally be a global variable. + +`(eq_attr NAME VALUE)' + NAME is a string specifying the name of an attribute. + + VALUE is a string that is either a valid value for attribute NAME, + a comma-separated list of values, or `!' followed by a value or + list. If VALUE does not begin with a `!', this test is true if + the value of the NAME attribute of the current insn is in the list + specified by VALUE. If VALUE begins with a `!', this test is true + if the attribute's value is *not* in the specified list. + + For example, + + (eq_attr "type" "load,store") + + is equivalent to + + (ior (eq_attr "type" "load") (eq_attr "type" "store")) + + If NAME specifies an attribute of `alternative', it refers to the + value of the compiler variable `which_alternative' (*note Output + Statement::.) and the values must be small integers. For example, + + (eq_attr "alternative" "2,3") + + is equivalent to + + (ior (eq (symbol_ref "which_alternative") (const_int 2)) + (eq (symbol_ref "which_alternative") (const_int 3))) + + Note that, for most attributes, an `eq_attr' test is simplified in + cases where the value of the attribute being tested is known for + all insns matching a particular pattern. This is by far the most + common case. + +`(attr_flag NAME)' + The value of an `attr_flag' expression is true if the flag + specified by NAME is true for the `insn' currently being scheduled. + + NAME is a string specifying one of a fixed set of flags to test. + Test the flags `forward' and `backward' to determine the direction + of a conditional branch. Test the flags `very_likely', `likely', + `very_unlikely', and `unlikely' to determine if a conditional + branch is expected to be taken. + + If the `very_likely' flag is true, then the `likely' flag is also + true. Likewise for the `very_unlikely' and `unlikely' flags. + + This example describes a conditional branch delay slot which can + be nullified for forward branches that are taken (annul-true) or + for backward branches which are not taken (annul-false). + + (define_delay (eq_attr "type" "cbranch") + [(eq_attr "in_branch_delay" "true") + (and (eq_attr "in_branch_delay" "true") + (attr_flag "forward")) + (and (eq_attr "in_branch_delay" "true") + (attr_flag "backward"))]) + + The `forward' and `backward' flags are false if the current `insn' + being scheduled is not a conditional branch. + + The `very_likely' and `likely' flags are true if the `insn' being + scheduled is not a conditional branch. The `very_unlikely' and + `unlikely' flags are false if the `insn' being scheduled is not a + conditional branch. + + `attr_flag' is only used during delay slot scheduling and has no + meaning to other passes of the compiler. + +`(attr NAME)' + The value of another attribute is returned. This is most useful + for numeric attributes, as `eq_attr' and `attr_flag' produce more + efficient code for non-numeric attributes. + + +File: gcc.info, Node: Tagging Insns, Next: Attr Example, Prev: Expressions, Up: Insn Attributes + +Assigning Attribute Values to Insns +----------------------------------- + + The value assigned to an attribute of an insn is primarily +determined by which pattern is matched by that insn (or which +`define_peephole' generated it). Every `define_insn' and +`define_peephole' can have an optional last argument to specify the +values of attributes for matching insns. The value of any attribute +not specified in a particular insn is set to the default value for that +attribute, as specified in its `define_attr'. Extensive use of default +values for attributes permits the specification of the values for only +one or two attributes in the definition of most insn patterns, as seen +in the example in the next section. + + The optional last argument of `define_insn' and `define_peephole' is +a vector of expressions, each of which defines the value for a single +attribute. The most general way of assigning an attribute's value is +to use a `set' expression whose first operand is an `attr' expression +giving the name of the attribute being set. The second operand of the +`set' is an attribute expression (*note Expressions::.) giving the +value of the attribute. + + When the attribute value depends on the `alternative' attribute +(i.e., which is the applicable alternative in the constraint of the +insn), the `set_attr_alternative' expression can be used. It allows +the specification of a vector of attribute expressions, one for each +alternative. + + When the generality of arbitrary attribute expressions is not +required, the simpler `set_attr' expression can be used, which allows +specifying a string giving either a single attribute value or a list of +attribute values, one for each alternative. + + The form of each of the above specifications is shown below. In +each case, NAME is a string specifying the attribute to be set. + +`(set_attr NAME VALUE-STRING)' + VALUE-STRING is either a string giving the desired attribute value, + or a string containing a comma-separated list giving the values for + succeeding alternatives. The number of elements must match the + number of alternatives in the constraint of the insn pattern. + + Note that it may be useful to specify `*' for some alternative, in + which case the attribute will assume its default value for insns + matching that alternative. + +`(set_attr_alternative NAME [VALUE1 VALUE2 ...])' + Depending on the alternative of the insn, the value will be one of + the specified values. This is a shorthand for using a `cond' with + tests on the `alternative' attribute. + +`(set (attr NAME) VALUE)' + The first operand of this `set' must be the special RTL expression + `attr', whose sole operand is a string giving the name of the + attribute being set. VALUE is the value of the attribute. + + The following shows three different ways of representing the same +attribute value specification: + + (set_attr "type" "load,store,arith") + + (set_attr_alternative "type" + [(const_string "load") (const_string "store") + (const_string "arith")]) + + (set (attr "type") + (cond [(eq_attr "alternative" "1") (const_string "load") + (eq_attr "alternative" "2") (const_string "store")] + (const_string "arith"))) + + The `define_asm_attributes' expression provides a mechanism to +specify the attributes assigned to insns produced from an `asm' +statement. It has the form: + + (define_asm_attributes [ATTR-SETS]) + +where ATTR-SETS is specified the same as for both the `define_insn' and +the `define_peephole' expressions. + + These values will typically be the "worst case" attribute values. +For example, they might indicate that the condition code will be +clobbered. + + A specification for a `length' attribute is handled specially. The +way to compute the length of an `asm' insn is to multiply the length +specified in the expression `define_asm_attributes' by the number of +machine instructions specified in the `asm' statement, determined by +counting the number of semicolons and newlines in the string. +Therefore, the value of the `length' attribute specified in a +`define_asm_attributes' should be the maximum possible length of a +single machine instruction. + + +File: gcc.info, Node: Attr Example, Next: Insn Lengths, Prev: Tagging Insns, Up: Insn Attributes + +Example of Attribute Specifications +----------------------------------- + + The judicious use of defaulting is important in the efficient use of +insn attributes. Typically, insns are divided into "types" and an +attribute, customarily called `type', is used to represent this value. +This attribute is normally used only to define the default value for +other attributes. An example will clarify this usage. + + Assume we have a RISC machine with a condition code and in which only +full-word operations are performed in registers. Let us assume that we +can divide all insns into loads, stores, (integer) arithmetic +operations, floating point operations, and branches. + + Here we will concern ourselves with determining the effect of an +insn on the condition code and will limit ourselves to the following +possible effects: The condition code can be set unpredictably +(clobbered), not be changed, be set to agree with the results of the +operation, or only changed if the item previously set into the +condition code has been modified. + + Here is part of a sample `md' file for such a machine: + + (define_attr "type" "load,store,arith,fp,branch" (const_string "arith")) + + (define_attr "cc" "clobber,unchanged,set,change0" + (cond [(eq_attr "type" "load") + (const_string "change0") + (eq_attr "type" "store,branch") + (const_string "unchanged") + (eq_attr "type" "arith") + (if_then_else (match_operand:SI 0 "" "") + (const_string "set") + (const_string "clobber"))] + (const_string "clobber"))) + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r,r,m") + (match_operand:SI 1 "general_operand" "r,m,r"))] + "" + "@ + move %0,%1 + load %0,%1 + store %0,%1" + [(set_attr "type" "arith,load,store")]) + + Note that we assume in the above example that arithmetic operations +performed on quantities smaller than a machine word clobber the +condition code since they will set the condition code to a value +corresponding to the full-word result. + diff --git a/usr/local/nachos/info/gcc.info-21 b/usr/local/nachos/info/gcc.info-21 new file mode 100644 index 0000000..3d938fb --- /dev/null +++ b/usr/local/nachos/info/gcc.info-21 @@ -0,0 +1,886 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Insn Lengths, Next: Constant Attributes, Prev: Attr Example, Up: Insn Attributes + +Computing the Length of an Insn +------------------------------- + + For many machines, multiple types of branch instructions are +provided, each for different length branch displacements. In most +cases, the assembler will choose the correct instruction to use. +However, when the assembler cannot do so, GCC can when a special +attribute, the `length' attribute, is defined. This attribute must be +defined to have numeric values by specifying a null string in its +`define_attr'. + + In the case of the `length' attribute, two additional forms of +arithmetic terms are allowed in test expressions: + +`(match_dup N)' + This refers to the address of operand N of the current insn, which + must be a `label_ref'. + +`(pc)' + This refers to the address of the *current* insn. It might have + been more consistent with other usage to make this the address of + the *next* insn but this would be confusing because the length of + the current insn is to be computed. + + For normal insns, the length will be determined by value of the +`length' attribute. In the case of `addr_vec' and `addr_diff_vec' insn +patterns, the length is computed as the number of vectors multiplied by +the size of each vector. + + Lengths are measured in addressable storage units (bytes). + + The following macros can be used to refine the length computation: + +`FIRST_INSN_ADDRESS' + When the `length' insn attribute is used, this macro specifies the + value to be assigned to the address of the first insn in a + function. If not specified, 0 is used. + +`ADJUST_INSN_LENGTH (INSN, LENGTH)' + If defined, modifies the length assigned to instruction INSN as a + function of the context in which it is used. LENGTH is an lvalue + that contains the initially computed length of the insn and should + be updated with the correct length of the insn. + + This macro will normally not be required. A case in which it is + required is the ROMP. On this machine, the size of an `addr_vec' + insn must be increased by two to compensate for the fact that + alignment may be required. + + The routine that returns `get_attr_length' (the value of the +`length' attribute) can be used by the output routine to determine the +form of the branch instruction to be written, as the example below +illustrates. + + As an example of the specification of variable-length branches, +consider the IBM 360. If we adopt the convention that a register will +be set to the starting address of a function, we can jump to labels +within 4k of the start using a four-byte instruction. Otherwise, we +need a six-byte sequence to load the address from memory and then +branch to it. + + On such a machine, a pattern for a branch instruction might be +specified as follows: + + (define_insn "jump" + [(set (pc) + (label_ref (match_operand 0 "" "")))] + "" + "* + { + return (get_attr_length (insn) == 4 + ? \"b %l0\" : \"l r15,=a(%l0); br r15\"); + }" + [(set (attr "length") (if_then_else (lt (match_dup 0) (const_int 4096)) + (const_int 4) + (const_int 6)))]) + + +File: gcc.info, Node: Constant Attributes, Next: Delay Slots, Prev: Insn Lengths, Up: Insn Attributes + +Constant Attributes +------------------- + + A special form of `define_attr', where the expression for the +default value is a `const' expression, indicates an attribute that is +constant for a given run of the compiler. Constant attributes may be +used to specify which variety of processor is used. For example, + + (define_attr "cpu" "m88100,m88110,m88000" + (const + (cond [(symbol_ref "TARGET_88100") (const_string "m88100") + (symbol_ref "TARGET_88110") (const_string "m88110")] + (const_string "m88000")))) + + (define_attr "memory" "fast,slow" + (const + (if_then_else (symbol_ref "TARGET_FAST_MEM") + (const_string "fast") + (const_string "slow")))) + + The routine generated for constant attributes has no parameters as it +does not depend on any particular insn. RTL expressions used to define +the value of a constant attribute may use the `symbol_ref' form, but +may not use either the `match_operand' form or `eq_attr' forms +involving insn attributes. + + +File: gcc.info, Node: Delay Slots, Next: Function Units, Prev: Constant Attributes, Up: Insn Attributes + +Delay Slot Scheduling +--------------------- + + The insn attribute mechanism can be used to specify the requirements +for delay slots, if any, on a target machine. An instruction is said to +require a "delay slot" if some instructions that are physically after +the instruction are executed as if they were located before it. +Classic examples are branch and call instructions, which often execute +the following instruction before the branch or call is performed. + + On some machines, conditional branch instructions can optionally +"annul" instructions in the delay slot. This means that the +instruction will not be executed for certain branch outcomes. Both +instructions that annul if the branch is true and instructions that +annul if the branch is false are supported. + + Delay slot scheduling differs from instruction scheduling in that +determining whether an instruction needs a delay slot is dependent only +on the type of instruction being generated, not on data flow between the +instructions. See the next section for a discussion of data-dependent +instruction scheduling. + + The requirement of an insn needing one or more delay slots is +indicated via the `define_delay' expression. It has the following form: + + (define_delay TEST + [DELAY-1 ANNUL-TRUE-1 ANNUL-FALSE-1 + DELAY-2 ANNUL-TRUE-2 ANNUL-FALSE-2 + ...]) + + TEST is an attribute test that indicates whether this `define_delay' +applies to a particular insn. If so, the number of required delay +slots is determined by the length of the vector specified as the second +argument. An insn placed in delay slot N must satisfy attribute test +DELAY-N. ANNUL-TRUE-N is an attribute test that specifies which insns +may be annulled if the branch is true. Similarly, ANNUL-FALSE-N +specifies which insns in the delay slot may be annulled if the branch +is false. If annulling is not supported for that delay slot, `(nil)' +should be coded. + + For example, in the common case where branch and call insns require +a single delay slot, which may contain any insn other than a branch or +call, the following would be placed in the `md' file: + + (define_delay (eq_attr "type" "branch,call") + [(eq_attr "type" "!branch,call") (nil) (nil)]) + + Multiple `define_delay' expressions may be specified. In this case, +each such expression specifies different delay slot requirements and +there must be no insn for which tests in two `define_delay' expressions +are both true. + + For example, if we have a machine that requires one delay slot for +branches but two for calls, no delay slot can contain a branch or call +insn, and any valid insn in the delay slot for the branch can be +annulled if the branch is true, we might represent this as follows: + + (define_delay (eq_attr "type" "branch") + [(eq_attr "type" "!branch,call") + (eq_attr "type" "!branch,call") + (nil)]) + + (define_delay (eq_attr "type" "call") + [(eq_attr "type" "!branch,call") (nil) (nil) + (eq_attr "type" "!branch,call") (nil) (nil)]) + + +File: gcc.info, Node: Function Units, Prev: Delay Slots, Up: Insn Attributes + +Specifying Function Units +------------------------- + + On most RISC machines, there are instructions whose results are not +available for a specific number of cycles. Common cases are +instructions that load data from memory. On many machines, a pipeline +stall will result if the data is referenced too soon after the load +instruction. + + In addition, many newer microprocessors have multiple function +units, usually one for integer and one for floating point, and often +will incur pipeline stalls when a result that is needed is not yet +ready. + + The descriptions in this section allow the specification of how much +time must elapse between the execution of an instruction and the time +when its result is used. It also allows specification of when the +execution of an instruction will delay execution of similar instructions +due to function unit conflicts. + + For the purposes of the specifications in this section, a machine is +divided into "function units", each of which execute a specific class +of instructions in first-in-first-out order. Function units that +accept one instruction each cycle and allow a result to be used in the +succeeding instruction (usually via forwarding) need not be specified. +Classic RISC microprocessors will normally have a single function unit, +which we can call `memory'. The newer "superscalar" processors will +often have function units for floating point operations, usually at +least a floating point adder and multiplier. + + Each usage of a function units by a class of insns is specified with +a `define_function_unit' expression, which looks like this: + + (define_function_unit NAME MULTIPLICITY SIMULTANEITY + TEST READY-DELAY ISSUE-DELAY + [CONFLICT-LIST]) + + NAME is a string giving the name of the function unit. + + MULTIPLICITY is an integer specifying the number of identical units +in the processor. If more than one unit is specified, they will be +scheduled independently. Only truly independent units should be +counted; a pipelined unit should be specified as a single unit. (The +only common example of a machine that has multiple function units for a +single instruction class that are truly independent and not pipelined +are the two multiply and two increment units of the CDC 6600.) + + SIMULTANEITY specifies the maximum number of insns that can be +executing in each instance of the function unit simultaneously or zero +if the unit is pipelined and has no limit. + + All `define_function_unit' definitions referring to function unit +NAME must have the same name and values for MULTIPLICITY and +SIMULTANEITY. + + TEST is an attribute test that selects the insns we are describing +in this definition. Note that an insn may use more than one function +unit and a function unit may be specified in more than one +`define_function_unit'. + + READY-DELAY is an integer that specifies the number of cycles after +which the result of the instruction can be used without introducing any +stalls. + + ISSUE-DELAY is an integer that specifies the number of cycles after +the instruction matching the TEST expression begins using this unit +until a subsequent instruction can begin. A cost of N indicates an N-1 +cycle delay. A subsequent instruction may also be delayed if an +earlier instruction has a longer READY-DELAY value. This blocking +effect is computed using the SIMULTANEITY, READY-DELAY, ISSUE-DELAY, +and CONFLICT-LIST terms. For a normal non-pipelined function unit, +SIMULTANEITY is one, the unit is taken to block for the READY-DELAY +cycles of the executing insn, and smaller values of ISSUE-DELAY are +ignored. + + CONFLICT-LIST is an optional list giving detailed conflict costs for +this unit. If specified, it is a list of condition test expressions to +be applied to insns chosen to execute in NAME following the particular +insn matching TEST that is already executing in NAME. For each insn in +the list, ISSUE-DELAY specifies the conflict cost; for insns not in the +list, the cost is zero. If not specified, CONFLICT-LIST defaults to +all instructions that use the function unit. + + Typical uses of this vector are where a floating point function unit +can pipeline either single- or double-precision operations, but not +both, or where a memory unit can pipeline loads, but not stores, etc. + + As an example, consider a classic RISC machine where the result of a +load instruction is not available for two cycles (a single "delay" +instruction is required) and where only one load instruction can be +executed simultaneously. This would be specified as: + + (define_function_unit "memory" 1 1 (eq_attr "type" "load") 2 0) + + For the case of a floating point function unit that can pipeline +either single or double precision, but not both, the following could be +specified: + + (define_function_unit + "fp" 1 0 (eq_attr "type" "sp_fp") 4 4 [(eq_attr "type" "dp_fp")]) + (define_function_unit + "fp" 1 0 (eq_attr "type" "dp_fp") 4 4 [(eq_attr "type" "sp_fp")]) + + *Note:* The scheduler attempts to avoid function unit conflicts and +uses all the specifications in the `define_function_unit' expression. +It has recently come to our attention that these specifications may not +allow modeling of some of the newer "superscalar" processors that have +insns using multiple pipelined units. These insns will cause a +potential conflict for the second unit used during their execution and +there is no way of representing that conflict. We welcome any examples +of how function unit conflicts work in such processors and suggestions +for their representation. + + +File: gcc.info, Node: Target Macros, Next: Config, Prev: Machine Desc, Up: Top + +Target Description Macros +************************* + + In addition to the file `MACHINE.md', a machine description includes +a C header file conventionally given the name `MACHINE.h'. This header +file defines numerous macros that convey the information about the +target machine that does not fit into the scheme of the `.md' file. +The file `tm.h' should be a link to `MACHINE.h'. The header file +`config.h' includes `tm.h' and most compiler source files include +`config.h'. + +* Menu: + +* Driver:: Controlling how the driver runs the compilation passes. +* Run-time Target:: Defining `-m' options like `-m68000' and `-m68020'. +* Storage Layout:: Defining sizes and alignments of data. +* Type Layout:: Defining sizes and properties of basic user data types. +* Registers:: Naming and describing the hardware registers. +* Register Classes:: Defining the classes of hardware registers. +* Stack and Calling:: Defining which way the stack grows and by how much. +* Varargs:: Defining the varargs macros. +* Trampolines:: Code set up at run time to enter a nested function. +* Library Calls:: Controlling how library routines are implicitly called. +* Addressing Modes:: Defining addressing modes valid for memory operands. +* Condition Code:: Defining how insns update the condition code. +* Costs:: Defining relative costs of different operations. +* Sections:: Dividing storage into text, data, and other sections. +* PIC:: Macros for position independent code. +* Assembler Format:: Defining how to write insns and pseudo-ops to output. +* Debugging Info:: Defining the format of debugging output. +* Cross-compilation:: Handling floating point for cross-compilers. +* Misc:: Everything else. + + +File: gcc.info, Node: Driver, Next: Run-time Target, Up: Target Macros + +Controlling the Compilation Driver, `gcc' +========================================= + + You can control the compilation driver. + +`SWITCH_TAKES_ARG (CHAR)' + A C expression which determines whether the option `-CHAR' takes + arguments. The value should be the number of arguments that + option takes-zero, for many options. + + By default, this macro is defined as `DEFAULT_SWITCH_TAKES_ARG', + which handles the standard options properly. You need not define + `SWITCH_TAKES_ARG' unless you wish to add additional options which + take arguments. Any redefinition should call + `DEFAULT_SWITCH_TAKES_ARG' and then check for additional options. + +`WORD_SWITCH_TAKES_ARG (NAME)' + A C expression which determines whether the option `-NAME' takes + arguments. The value should be the number of arguments that + option takes-zero, for many options. This macro rather than + `SWITCH_TAKES_ARG' is used for multi-character option names. + + By default, this macro is defined as + `DEFAULT_WORD_SWITCH_TAKES_ARG', which handles the standard options + properly. You need not define `WORD_SWITCH_TAKES_ARG' unless you + wish to add additional options which take arguments. Any + redefinition should call `DEFAULT_WORD_SWITCH_TAKES_ARG' and then + check for additional options. + +`SWITCH_CURTAILS_COMPILATION (CHAR)' + A C expression which determines whether the option `-CHAR' stops + compilation before the generation of an executable. The value is + boolean, non-zero if the option does stop an executable from being + generated, zero otherwise. + + By default, this macro is defined as + `DEFAULT_SWITCH_CURTAILS_COMPILATION', which handles the standard + options properly. You need not define + `SWITCH_CURTAILS_COMPILATION' unless you wish to add additional + options which affect the generation of an executable. Any + redefinition should call `DEFAULT_SWITCH_CURTAILS_COMPILATION' and + then check for additional options. + +`SWITCHES_NEED_SPACES' + A string-valued C expression which enumerates the options for which + the linker needs a space between the option and its argument. + + If this macro is not defined, the default value is `""'. + +`CPP_SPEC' + A C string constant that tells the GNU CC driver program options to + pass to CPP. It can also specify how to translate options you + give to GNU CC into options for GNU CC to pass to the CPP. + + Do not define this macro if it does not need to do anything. + +`NO_BUILTIN_SIZE_TYPE' + If this macro is defined, the preprocessor will not define the + builtin macro `__SIZE_TYPE__'. The macro `__SIZE_TYPE__' must + then be defined by `CPP_SPEC' instead. + + This should be defined if `SIZE_TYPE' depends on target dependent + flags which are not accessible to the preprocessor. Otherwise, it + should not be defined. + +`NO_BUILTIN_PTRDIFF_TYPE' + If this macro is defined, the preprocessor will not define the + builtin macro `__PTRDIFF_TYPE__'. The macro `__PTRDIFF_TYPE__' + must then be defined by `CPP_SPEC' instead. + + This should be defined if `PTRDIFF_TYPE' depends on target + dependent flags which are not accessible to the preprocessor. + Otherwise, it should not be defined. + +`SIGNED_CHAR_SPEC' + A C string constant that tells the GNU CC driver program options to + pass to CPP. By default, this macro is defined to pass the option + `-D__CHAR_UNSIGNED__' to CPP if `char' will be treated as + `unsigned char' by `cc1'. + + Do not define this macro unless you need to override the default + definition. + +`CC1_SPEC' + A C string constant that tells the GNU CC driver program options to + pass to `cc1'. It can also specify how to translate options you + give to GNU CC into options for GNU CC to pass to the `cc1'. + + Do not define this macro if it does not need to do anything. + +`CC1PLUS_SPEC' + A C string constant that tells the GNU CC driver program options to + pass to `cc1plus'. It can also specify how to translate options + you give to GNU CC into options for GNU CC to pass to the + `cc1plus'. + + Do not define this macro if it does not need to do anything. + +`ASM_SPEC' + A C string constant that tells the GNU CC driver program options to + pass to the assembler. It can also specify how to translate + options you give to GNU CC into options for GNU CC to pass to the + assembler. See the file `sun3.h' for an example of this. + + Do not define this macro if it does not need to do anything. + +`ASM_FINAL_SPEC' + A C string constant that tells the GNU CC driver program how to + run any programs which cleanup after the normal assembler. + Normally, this is not needed. See the file `mips.h' for an + example of this. + + Do not define this macro if it does not need to do anything. + +`LINK_SPEC' + A C string constant that tells the GNU CC driver program options to + pass to the linker. It can also specify how to translate options + you give to GNU CC into options for GNU CC to pass to the linker. + + Do not define this macro if it does not need to do anything. + +`LIB_SPEC' + Another C string constant used much like `LINK_SPEC'. The + difference between the two is that `LIB_SPEC' is used at the end + of the command given to the linker. + + If this macro is not defined, a default is provided that loads the + standard C library from the usual place. See `gcc.c'. + +`LIBGCC_SPEC' + Another C string constant that tells the GNU CC driver program how + and when to place a reference to `libgcc.a' into the linker + command line. This constant is placed both before and after the + value of `LIB_SPEC'. + + If this macro is not defined, the GNU CC driver provides a default + that passes the string `-lgcc' to the linker unless the `-shared' + option is specified. + +`STARTFILE_SPEC' + Another C string constant used much like `LINK_SPEC'. The + difference between the two is that `STARTFILE_SPEC' is used at the + very beginning of the command given to the linker. + + If this macro is not defined, a default is provided that loads the + standard C startup file from the usual place. See `gcc.c'. + +`ENDFILE_SPEC' + Another C string constant used much like `LINK_SPEC'. The + difference between the two is that `ENDFILE_SPEC' is used at the + very end of the command given to the linker. + + Do not define this macro if it does not need to do anything. + +`EXTRA_SPECS' + Define this macro to provide additional specifications to put in + the `specs' file that can be used in various specifications like + `CC1_SPEC'. + + The definition should be an initializer for an array of structures, + containing a string constant, that defines the specification name, + and a string constant that provides the specification. + + Do not define this macro if it does not need to do anything. + + `EXTRA_SPECS' is useful when an architecture contains several + related targets, which have various `..._SPECS' which are similar + to each other, and the maintainer would like one central place to + keep these definitions. + + For example, the PowerPC System V.4 targets use `EXTRA_SPECS' to + define either `_CALL_SYSV' when the System V calling sequence is + used or `_CALL_AIX' when the older AIX-based calling sequence is + used. + + The `config/rs6000/rs6000.h' target file defines: + + #define EXTRA_SPECS \ + { "cpp_sysv_default", CPP_SYSV_DEFAULT }, + + #define CPP_SYS_DEFAULT "" + + The `config/rs6000/sysv.h' target file defines: + #undef CPP_SPEC + #define CPP_SPEC \ + "%{posix: -D_POSIX_SOURCE } \ + %{mcall-sysv: -D_CALL_SYSV } %{mcall-aix: -D_CALL_AIX } \ + %{!mcall-sysv: %{!mcall-aix: %(cpp_sysv_default) }} \ + %{msoft-float: -D_SOFT_FLOAT} %{mcpu=403: -D_SOFT_FLOAT}" + + #undef CPP_SYSV_DEFAULT + #define CPP_SYSV_DEFAULT "-D_CALL_SYSV" + + while the `config/rs6000/eabiaix.h' target file defines + `CPP_SYSV_DEFAULT' as: + + #undef CPP_SYSV_DEFAULT + #define CPP_SYSV_DEFAULT "-D_CALL_AIX" + +`LINK_LIBGCC_SPECIAL' + Define this macro if the driver program should find the library + `libgcc.a' itself and should not pass `-L' options to the linker. + If you do not define this macro, the driver program will pass the + argument `-lgcc' to tell the linker to do the search and will pass + `-L' options to it. + +`LINK_LIBGCC_SPECIAL_1' + Define this macro if the driver program should find the library + `libgcc.a'. If you do not define this macro, the driver program + will pass the argument `-lgcc' to tell the linker to do the search. + This macro is similar to `LINK_LIBGCC_SPECIAL', except that it does + not affect `-L' options. + +`LINK_COMMAND_SPEC' + A C string constant giving the complete command line need to + execute the linker. When you do this, you will need to update + your port each time a change is made to the link command line + within `gcc.c'. Therefore, define this macro only if you need to + completely redefine the command line for invoking the linker and + there is no other way to accomplish the effect you need. + +`MULTILIB_DEFAULTS' + Define this macro as a C expression for the initializer of an + array of string to tell the driver program which options are + defaults for this target and thus do not need to be handled + specially when using `MULTILIB_OPTIONS'. + + Do not define this macro if `MULTILIB_OPTIONS' is not defined in + the target makefile fragment or if none of the options listed in + `MULTILIB_OPTIONS' are set by default. *Note Target Fragment::. + +`RELATIVE_PREFIX_NOT_LINKDIR' + Define this macro to tell `gcc' that it should only translate a + `-B' prefix into a `-L' linker option if the prefix indicates an + absolute file name. + +`STANDARD_EXEC_PREFIX' + Define this macro as a C string constant if you wish to override + the standard choice of `/usr/local/lib/gcc-lib/' as the default + prefix to try when searching for the executable files of the + compiler. + +`MD_EXEC_PREFIX' + If defined, this macro is an additional prefix to try after + `STANDARD_EXEC_PREFIX'. `MD_EXEC_PREFIX' is not searched when the + `-b' option is used, or the compiler is built as a cross compiler. + If you define `MD_EXEC_PREFIX', then be sure to add it to the + list of directories used to find the assembler in `configure.in'. + +`STANDARD_STARTFILE_PREFIX' + Define this macro as a C string constant if you wish to override + the standard choice of `/usr/local/lib/' as the default prefix to + try when searching for startup files such as `crt0.o'. + +`MD_STARTFILE_PREFIX' + If defined, this macro supplies an additional prefix to try after + the standard prefixes. `MD_EXEC_PREFIX' is not searched when the + `-b' option is used, or when the compiler is built as a cross + compiler. + +`MD_STARTFILE_PREFIX_1' + If defined, this macro supplies yet another prefix to try after the + standard prefixes. It is not searched when the `-b' option is + used, or when the compiler is built as a cross compiler. + +`INIT_ENVIRONMENT' + Define this macro as a C string constant if you wish to set + environment variables for programs called by the driver, such as + the assembler and loader. The driver passes the value of this + macro to `putenv' to initialize the necessary environment + variables. + +`LOCAL_INCLUDE_DIR' + Define this macro as a C string constant if you wish to override + the standard choice of `/usr/local/include' as the default prefix + to try when searching for local header files. `LOCAL_INCLUDE_DIR' + comes before `SYSTEM_INCLUDE_DIR' in the search order. + + Cross compilers do not use this macro and do not search either + `/usr/local/include' or its replacement. + +`SYSTEM_INCLUDE_DIR' + Define this macro as a C string constant if you wish to specify a + system-specific directory to search for header files before the + standard directory. `SYSTEM_INCLUDE_DIR' comes before + `STANDARD_INCLUDE_DIR' in the search order. + + Cross compilers do not use this macro and do not search the + directory specified. + +`STANDARD_INCLUDE_DIR' + Define this macro as a C string constant if you wish to override + the standard choice of `/usr/include' as the default prefix to try + when searching for header files. + + Cross compilers do not use this macro and do not search either + `/usr/include' or its replacement. + +`STANDARD_INCLUDE_COMPONENT' + The "component" corresponding to `STANDARD_INCLUDE_DIR'. See + `INCLUDE_DEFAULTS', below, for the description of components. If + you do not define this macro, no component is used. + +`INCLUDE_DEFAULTS' + Define this macro if you wish to override the entire default + search path for include files. For a native compiler, the default + search path usually consists of `GCC_INCLUDE_DIR', + `LOCAL_INCLUDE_DIR', `SYSTEM_INCLUDE_DIR', + `GPLUSPLUS_INCLUDE_DIR', and `STANDARD_INCLUDE_DIR'. In addition, + `GPLUSPLUS_INCLUDE_DIR' and `GCC_INCLUDE_DIR' are defined + automatically by `Makefile', and specify private search areas for + GCC. The directory `GPLUSPLUS_INCLUDE_DIR' is used only for C++ + programs. + + The definition should be an initializer for an array of structures. + Each array element should have four elements: the directory name (a + string constant), the component name, and flag for C++-only + directories, and a flag showing that the includes in the directory + don't need to be wrapped in `extern `C'' when compiling C++. Mark + the end of the array with a null element. + + The component name denotes what GNU package the include file is + part of, if any, in all upper-case letters. For example, it might + be `GCC' or `BINUTILS'. If the package is part of the a + vendor-supplied operating system, code the component name as `0'. + + For example, here is the definition used for VAX/VMS: + + #define INCLUDE_DEFAULTS \ + { \ + { "GNU_GXX_INCLUDE:", "G++", 1, 1}, \ + { "GNU_CC_INCLUDE:", "GCC", 0, 0}, \ + { "SYS$SYSROOT:[SYSLIB.]", 0, 0, 0}, \ + { ".", 0, 0, 0}, \ + { 0, 0, 0, 0} \ + } + + Here is the order of prefixes tried for exec files: + + 1. Any prefixes specified by the user with `-B'. + + 2. The environment variable `GCC_EXEC_PREFIX', if any. + + 3. The directories specified by the environment variable + `COMPILER_PATH'. + + 4. The macro `STANDARD_EXEC_PREFIX'. + + 5. `/usr/lib/gcc/'. + + 6. The macro `MD_EXEC_PREFIX', if any. + + Here is the order of prefixes tried for startfiles: + + 1. Any prefixes specified by the user with `-B'. + + 2. The environment variable `GCC_EXEC_PREFIX', if any. + + 3. The directories specified by the environment variable + `LIBRARY_PATH' (native only, cross compilers do not use this). + + 4. The macro `STANDARD_EXEC_PREFIX'. + + 5. `/usr/lib/gcc/'. + + 6. The macro `MD_EXEC_PREFIX', if any. + + 7. The macro `MD_STARTFILE_PREFIX', if any. + + 8. The macro `STANDARD_STARTFILE_PREFIX'. + + 9. `/lib/'. + + 10. `/usr/lib/'. + + +File: gcc.info, Node: Run-time Target, Next: Storage Layout, Prev: Driver, Up: Target Macros + +Run-time Target Specification +============================= + + Here are run-time target specifications. + +`CPP_PREDEFINES' + Define this to be a string constant containing `-D' options to + define the predefined macros that identify this machine and system. + These macros will be predefined unless the `-ansi' option is + specified. + + In addition, a parallel set of macros are predefined, whose names + are made by appending `__' at the beginning and at the end. These + `__' macros are permitted by the ANSI standard, so they are + predefined regardless of whether `-ansi' is specified. + + For example, on the Sun, one can use the following value: + + "-Dmc68000 -Dsun -Dunix" + + The result is to define the macros `__mc68000__', `__sun__' and + `__unix__' unconditionally, and the macros `mc68000', `sun' and + `unix' provided `-ansi' is not specified. + +`extern int target_flags;' + This declaration should be present. + +`TARGET_...' + This series of macros is to allow compiler command arguments to + enable or disable the use of optional features of the target + machine. For example, one machine description serves both the + 68000 and the 68020; a command argument tells the compiler whether + it should use 68020-only instructions or not. This command + argument works by means of a macro `TARGET_68020' that tests a bit + in `target_flags'. + + Define a macro `TARGET_FEATURENAME' for each such option. Its + definition should test a bit in `target_flags'; for example: + + #define TARGET_68020 (target_flags & 1) + + One place where these macros are used is in the + condition-expressions of instruction patterns. Note how + `TARGET_68020' appears frequently in the 68000 machine description + file, `m68k.md'. Another place they are used is in the + definitions of the other macros in the `MACHINE.h' file. + +`TARGET_SWITCHES' + This macro defines names of command options to set and clear bits + in `target_flags'. Its definition is an initializer with a + subgrouping for each command option. + + Each subgrouping contains a string constant, that defines the + option name, a number, which contains the bits to set in + `target_flags', and a second string which is the description + displayed by -help. If the number is negative then the bits + specified by the number are cleared instead of being set. If the + description string is present but empty, then no help information + will be displayed for that option, but it will not count as an + undocumented option. The actual option name is made by appending + `-m' to the specified name. + + One of the subgroupings should have a null string. The number in + this grouping is the default value for `target_flags'. Any target + options act starting with that value. + + Here is an example which defines `-m68000' and `-m68020' with + opposite meanings, and picks the latter as the default: + + #define TARGET_SWITCHES \ + { { "68020", 1, "" }, \ + { "68000", -1, "Compile for the 68000" }, \ + { "", 1, "" }} + +`TARGET_OPTIONS' + This macro is similar to `TARGET_SWITCHES' but defines names of + command options that have values. Its definition is an + initializer with a subgrouping for each command option. + + Each subgrouping contains a string constant, that defines the + fixed part of the option name, the address of a variable, and a + description string. The variable, type `char *', is set to the + variable part of the given option if the fixed part matches. The + actual option name is made by appending `-m' to the specified name. + + Here is an example which defines `-mshort-data-NUMBER'. If the + given option is `-mshort-data-512', the variable `m88k_short_data' + will be set to the string `"512"'. + + extern char *m88k_short_data; + #define TARGET_OPTIONS \ + { { "short-data-", &m88k_short_data, "Specify the size of the short data section" } } + +`TARGET_VERSION' + This macro is a C statement to print on `stderr' a string + describing the particular machine description choice. Every + machine description should define `TARGET_VERSION'. For example: + + #ifdef MOTOROLA + #define TARGET_VERSION \ + fprintf (stderr, " (68k, Motorola syntax)"); + #else + #define TARGET_VERSION \ + fprintf (stderr, " (68k, MIT syntax)"); + #endif + +`OVERRIDE_OPTIONS' + Sometimes certain combinations of command options do not make + sense on a particular target machine. You can define a macro + `OVERRIDE_OPTIONS' to take account of this. This macro, if + defined, is executed once just after all the command options have + been parsed. + + Don't use this macro to turn on various extra optimizations for + `-O'. That is what `OPTIMIZATION_OPTIONS' is for. + +`OPTIMIZATION_OPTIONS (LEVEL, SIZE)' + Some machines may desire to change what optimizations are + performed for various optimization levels. This macro, if + defined, is executed once just after the optimization level is + determined and before the remainder of the command options have + been parsed. Values set in this macro are used as the default + values for the other command line options. + + LEVEL is the optimization level specified; 2 if `-O2' is + specified, 1 if `-O' is specified, and 0 if neither is specified. + + SIZE is non-zero if `-Os' is specified and zero otherwise. + + You should not use this macro to change options that are not + machine-specific. These should uniformly selected by the same + optimization level on all supported machines. Use this macro to + enable machine-specific optimizations. + + *Do not examine `write_symbols' in this macro!* The debugging + options are not supposed to alter the generated code. + +`CAN_DEBUG_WITHOUT_FP' + Define this macro if debugging can be performed even without a + frame pointer. If this macro is defined, GNU CC will turn on the + `-fomit-frame-pointer' option whenever `-O' is specified. + diff --git a/usr/local/nachos/info/gcc.info-22 b/usr/local/nachos/info/gcc.info-22 new file mode 100644 index 0000000..c8de253 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-22 @@ -0,0 +1,1002 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Storage Layout, Next: Type Layout, Prev: Run-time Target, Up: Target Macros + +Storage Layout +============== + + Note that the definitions of the macros in this table which are +sizes or alignments measured in bits do not need to be constant. They +can be C expressions that refer to static variables, such as the +`target_flags'. *Note Run-time Target::. + +`BITS_BIG_ENDIAN' + Define this macro to have the value 1 if the most significant bit + in a byte has the lowest number; otherwise define it to have the + value zero. This means that bit-field instructions count from the + most significant bit. If the machine has no bit-field + instructions, then this must still be defined, but it doesn't + matter which value it is defined to. This macro need not be a + constant. + + This macro does not affect the way structure fields are packed into + bytes or words; that is controlled by `BYTES_BIG_ENDIAN'. + +`BYTES_BIG_ENDIAN' + Define this macro to have the value 1 if the most significant byte + in a word has the lowest number. This macro need not be a + constant. + +`WORDS_BIG_ENDIAN' + Define this macro to have the value 1 if, in a multiword object, + the most significant word has the lowest number. This applies to + both memory locations and registers; GNU CC fundamentally assumes + that the order of words in memory is the same as the order in + registers. This macro need not be a constant. + +`LIBGCC2_WORDS_BIG_ENDIAN' + Define this macro if WORDS_BIG_ENDIAN is not constant. This must + be a constant value with the same meaning as WORDS_BIG_ENDIAN, + which will be used only when compiling libgcc2.c. Typically the + value will be set based on preprocessor defines. + +`FLOAT_WORDS_BIG_ENDIAN' + Define this macro to have the value 1 if `DFmode', `XFmode' or + `TFmode' floating point numbers are stored in memory with the word + containing the sign bit at the lowest address; otherwise define it + to have the value 0. This macro need not be a constant. + + You need not define this macro if the ordering is the same as for + multi-word integers. + +`BITS_PER_UNIT' + Define this macro to be the number of bits in an addressable + storage unit (byte); normally 8. + +`BITS_PER_WORD' + Number of bits in a word; normally 32. + +`MAX_BITS_PER_WORD' + Maximum number of bits in a word. If this is undefined, the + default is `BITS_PER_WORD'. Otherwise, it is the constant value + that is the largest value that `BITS_PER_WORD' can have at + run-time. + +`UNITS_PER_WORD' + Number of storage units in a word; normally 4. + +`MIN_UNITS_PER_WORD' + Minimum number of units in a word. If this is undefined, the + default is `UNITS_PER_WORD'. Otherwise, it is the constant value + that is the smallest value that `UNITS_PER_WORD' can have at + run-time. + +`POINTER_SIZE' + Width of a pointer, in bits. You must specify a value no wider + than the width of `Pmode'. If it is not equal to the width of + `Pmode', you must define `POINTERS_EXTEND_UNSIGNED'. + +`POINTERS_EXTEND_UNSIGNED' + A C expression whose value is nonzero if pointers that need to be + extended from being `POINTER_SIZE' bits wide to `Pmode' are to be + zero-extended and zero if they are to be sign-extended. + + You need not define this macro if the `POINTER_SIZE' is equal to + the width of `Pmode'. + +`PROMOTE_MODE (M, UNSIGNEDP, TYPE)' + A macro to update M and UNSIGNEDP when an object whose type is + TYPE and which has the specified mode and signedness is to be + stored in a register. This macro is only called when TYPE is a + scalar type. + + On most RISC machines, which only have operations that operate on + a full register, define this macro to set M to `word_mode' if M is + an integer mode narrower than `BITS_PER_WORD'. In most cases, + only integer modes should be widened because wider-precision + floating-point operations are usually more expensive than their + narrower counterparts. + + For most machines, the macro definition does not change UNSIGNEDP. + However, some machines, have instructions that preferentially + handle either signed or unsigned quantities of certain modes. For + example, on the DEC Alpha, 32-bit loads from memory and 32-bit add + instructions sign-extend the result to 64 bits. On such machines, + set UNSIGNEDP according to which kind of extension is more + efficient. + + Do not define this macro if it would never modify M. + +`PROMOTE_FUNCTION_ARGS' + Define this macro if the promotion described by `PROMOTE_MODE' + should also be done for outgoing function arguments. + +`PROMOTE_FUNCTION_RETURN' + Define this macro if the promotion described by `PROMOTE_MODE' + should also be done for the return value of functions. + + If this macro is defined, `FUNCTION_VALUE' must perform the same + promotions done by `PROMOTE_MODE'. + +`PROMOTE_FOR_CALL_ONLY' + Define this macro if the promotion described by `PROMOTE_MODE' + should *only* be performed for outgoing function arguments or + function return values, as specified by `PROMOTE_FUNCTION_ARGS' + and `PROMOTE_FUNCTION_RETURN', respectively. + +`PARM_BOUNDARY' + Normal alignment required for function parameters on the stack, in + bits. All stack parameters receive at least this much alignment + regardless of data type. On most machines, this is the same as the + size of an integer. + +`STACK_BOUNDARY' + Define this macro if there is a guaranteed alignment for the stack + pointer on this machine. The definition is a C expression for the + desired alignment (measured in bits). This value is used as a + default if PREFERRED_STACK_BOUNDARY is not defined. + +`PREFERRED_STACK_BOUNDARY' + Define this macro if you wish to preserve a certain alignment for + the stack pointer. The definition is a C expression for the + desired alignment (measured in bits). If STACK_BOUNDARY is also + defined, this macro must evaluate to a value equal to or larger + than STACK_BOUNDARY. + + If `PUSH_ROUNDING' is not defined, the stack will always be aligned + to the specified boundary. If `PUSH_ROUNDING' is defined and + specifies a less strict alignment than `PREFERRED_STACK_BOUNDARY', + the stack may be momentarily unaligned while pushing arguments. + +`FUNCTION_BOUNDARY' + Alignment required for a function entry point, in bits. + +`BIGGEST_ALIGNMENT' + Biggest alignment that any data type can require on this machine, + in bits. + +`MINIMUM_ATOMIC_ALIGNMENT' + If defined, the smallest alignment, in bits, that can be given to + an object that can be referenced in one operation, without + disturbing any nearby object. Normally, this is `BITS_PER_UNIT', + but may be larger on machines that don't have byte or half-word + store operations. + +`BIGGEST_FIELD_ALIGNMENT' + Biggest alignment that any structure field can require on this + machine, in bits. If defined, this overrides `BIGGEST_ALIGNMENT' + for structure fields only. + +`ADJUST_FIELD_ALIGN (FIELD, COMPUTED)' + An expression for the alignment of a structure field FIELD if the + alignment computed in the usual way is COMPUTED. GNU CC uses this + value instead of the value in `BIGGEST_ALIGNMENT' or + `BIGGEST_FIELD_ALIGNMENT', if defined, for structure fields only. + +`MAX_OFILE_ALIGNMENT' + Biggest alignment supported by the object file format of this + machine. Use this macro to limit the alignment which can be + specified using the `__attribute__ ((aligned (N)))' construct. If + not defined, the default value is `BIGGEST_ALIGNMENT'. + +`DATA_ALIGNMENT (TYPE, BASIC-ALIGN)' + If defined, a C expression to compute the alignment for a + variables in the static store. TYPE is the data type, and + BASIC-ALIGN is the alignment that the object would ordinarily + have. The value of this macro is used instead of that alignment + to align the object. + + If this macro is not defined, then BASIC-ALIGN is used. + + One use of this macro is to increase alignment of medium-size data + to make it all fit in fewer cache lines. Another is to cause + character arrays to be word-aligned so that `strcpy' calls that + copy constants to character arrays can be done inline. + +`CONSTANT_ALIGNMENT (CONSTANT, BASIC-ALIGN)' + If defined, a C expression to compute the alignment given to a + constant that is being placed in memory. CONSTANT is the constant + and BASIC-ALIGN is the alignment that the object would ordinarily + have. The value of this macro is used instead of that alignment to + align the object. + + If this macro is not defined, then BASIC-ALIGN is used. + + The typical use of this macro is to increase alignment for string + constants to be word aligned so that `strcpy' calls that copy + constants can be done inline. + +`LOCAL_ALIGNMENT (TYPE, BASIC-ALIGN)' + If defined, a C expression to compute the alignment for a + variables in the local store. TYPE is the data type, and + BASIC-ALIGN is the alignment that the object would ordinarily + have. The value of this macro is used instead of that alignment + to align the object. + + If this macro is not defined, then BASIC-ALIGN is used. + + One use of this macro is to increase alignment of medium-size data + to make it all fit in fewer cache lines. + +`EMPTY_FIELD_BOUNDARY' + Alignment in bits to be given to a structure bit field that + follows an empty field such as `int : 0;'. + + Note that `PCC_BITFIELD_TYPE_MATTERS' also affects the alignment + that results from an empty field. + +`STRUCTURE_SIZE_BOUNDARY' + Number of bits which any structure or union's size must be a + multiple of. Each structure or union's size is rounded up to a + multiple of this. + + If you do not define this macro, the default is the same as + `BITS_PER_UNIT'. + +`STRICT_ALIGNMENT' + Define this macro to be the value 1 if instructions will fail to + work if given data not on the nominal alignment. If instructions + will merely go slower in that case, define this macro as 0. + +`PCC_BITFIELD_TYPE_MATTERS' + Define this if you wish to imitate the way many other C compilers + handle alignment of bitfields and the structures that contain them. + + The behavior is that the type written for a bitfield (`int', + `short', or other integer type) imposes an alignment for the + entire structure, as if the structure really did contain an + ordinary field of that type. In addition, the bitfield is placed + within the structure so that it would fit within such a field, not + crossing a boundary for it. + + Thus, on most machines, a bitfield whose type is written as `int' + would not cross a four-byte boundary, and would force four-byte + alignment for the whole structure. (The alignment used may not be + four bytes; it is controlled by the other alignment parameters.) + + If the macro is defined, its definition should be a C expression; + a nonzero value for the expression enables this behavior. + + Note that if this macro is not defined, or its value is zero, some + bitfields may cross more than one alignment boundary. The + compiler can support such references if there are `insv', `extv', + and `extzv' insns that can directly reference memory. + + The other known way of making bitfields work is to define + `STRUCTURE_SIZE_BOUNDARY' as large as `BIGGEST_ALIGNMENT'. Then + every structure can be accessed with fullwords. + + Unless the machine has bitfield instructions or you define + `STRUCTURE_SIZE_BOUNDARY' that way, you must define + `PCC_BITFIELD_TYPE_MATTERS' to have a nonzero value. + + If your aim is to make GNU CC use the same conventions for laying + out bitfields as are used by another compiler, here is how to + investigate what the other compiler does. Compile and run this + program: + + struct foo1 + { + char x; + char :0; + char y; + }; + + struct foo2 + { + char x; + int :0; + char y; + }; + + main () + { + printf ("Size of foo1 is %d\n", + sizeof (struct foo1)); + printf ("Size of foo2 is %d\n", + sizeof (struct foo2)); + exit (0); + } + + If this prints 2 and 5, then the compiler's behavior is what you + would get from `PCC_BITFIELD_TYPE_MATTERS'. + +`BITFIELD_NBYTES_LIMITED' + Like PCC_BITFIELD_TYPE_MATTERS except that its effect is limited to + aligning a bitfield within the structure. + +`ROUND_TYPE_SIZE (TYPE, COMPUTED, SPECIFIED)' + Define this macro as an expression for the overall size of a type + (given by TYPE as a tree node) when the size computed in the usual + way is COMPUTED and the alignment is SPECIFIED. + + The default is to round COMPUTED up to a multiple of SPECIFIED. + +`ROUND_TYPE_ALIGN (TYPE, COMPUTED, SPECIFIED)' + Define this macro as an expression for the alignment of a type + (given by TYPE as a tree node) if the alignment computed in the + usual way is COMPUTED and the alignment explicitly specified was + SPECIFIED. + + The default is to use SPECIFIED if it is larger; otherwise, use + the smaller of COMPUTED and `BIGGEST_ALIGNMENT' + +`MAX_FIXED_MODE_SIZE' + An integer expression for the size in bits of the largest integer + machine mode that should actually be used. All integer machine + modes of this size or smaller can be used for structures and + unions with the appropriate sizes. If this macro is undefined, + `GET_MODE_BITSIZE (DImode)' is assumed. + +`STACK_SAVEAREA_MODE (SAVE_LEVEL)' + If defined, an expression of type `enum machine_mode' that + specifies the mode of the save area operand of a + `save_stack_LEVEL' named pattern (*note Standard Names::.). + SAVE_LEVEL is one of `SAVE_BLOCK', `SAVE_FUNCTION', or + `SAVE_NONLOCAL' and selects which of the three named patterns is + having its mode specified. + + You need not define this macro if it always returns `Pmode'. You + would most commonly define this macro if the `save_stack_LEVEL' + patterns need to support both a 32- and a 64-bit mode. + +`STACK_SIZE_MODE' + If defined, an expression of type `enum machine_mode' that + specifies the mode of the size increment operand of an + `allocate_stack' named pattern (*note Standard Names::.). + + You need not define this macro if it always returns `word_mode'. + You would most commonly define this macro if the `allocate_stack' + pattern needs to support both a 32- and a 64-bit mode. + +`CHECK_FLOAT_VALUE (MODE, VALUE, OVERFLOW)' + A C statement to validate the value VALUE (of type `double') for + mode MODE. This means that you check whether VALUE fits within + the possible range of values for mode MODE on this target machine. + The mode MODE is always a mode of class `MODE_FLOAT'. OVERFLOW + is nonzero if the value is already known to be out of range. + + If VALUE is not valid or if OVERFLOW is nonzero, you should set + OVERFLOW to 1 and then assign some valid value to VALUE. Allowing + an invalid value to go through the compiler can produce incorrect + assembler code which may even cause Unix assemblers to crash. + + This macro need not be defined if there is no work for it to do. + +`TARGET_FLOAT_FORMAT' + A code distinguishing the floating point format of the target + machine. There are three defined values: + + `IEEE_FLOAT_FORMAT' + This code indicates IEEE floating point. It is the default; + there is no need to define this macro when the format is IEEE. + + `VAX_FLOAT_FORMAT' + This code indicates the peculiar format used on the Vax. + + `UNKNOWN_FLOAT_FORMAT' + This code indicates any other format. + + The value of this macro is compared with `HOST_FLOAT_FORMAT' + (*note Config::.) to determine whether the target machine has the + same format as the host machine. If any other formats are + actually in use on supported machines, new codes should be defined + for them. + + The ordering of the component words of floating point values + stored in memory is controlled by `FLOAT_WORDS_BIG_ENDIAN' for the + target machine and `HOST_FLOAT_WORDS_BIG_ENDIAN' for the host. + +`DEFAULT_VTABLE_THUNKS' + GNU CC supports two ways of implementing C++ vtables: traditional + or with so-called "thunks". The flag `-fvtable-thunk' chooses + between them. Define this macro to be a C expression for the + default value of that flag. If `DEFAULT_VTABLE_THUNKS' is 0, GNU + CC uses the traditional implementation by default. The "thunk" + implementation is more efficient (especially if you have provided + an implementation of `ASM_OUTPUT_MI_THUNK', see *Note Function + Entry::), but is not binary compatible with code compiled using + the traditional implementation. If you are writing a new ports, + define `DEFAULT_VTABLE_THUNKS' to 1. + + If you do not define this macro, the default for `-fvtable-thunk' + is 0. + + +File: gcc.info, Node: Type Layout, Next: Registers, Prev: Storage Layout, Up: Target Macros + +Layout of Source Language Data Types +==================================== + + These macros define the sizes and other characteristics of the +standard basic data types used in programs being compiled. Unlike the +macros in the previous section, these apply to specific features of C +and related languages, rather than to fundamental aspects of storage +layout. + +`INT_TYPE_SIZE' + A C expression for the size in bits of the type `int' on the + target machine. If you don't define this, the default is one word. + +`MAX_INT_TYPE_SIZE' + Maximum number for the size in bits of the type `int' on the target + machine. If this is undefined, the default is `INT_TYPE_SIZE'. + Otherwise, it is the constant value that is the largest value that + `INT_TYPE_SIZE' can have at run-time. This is used in `cpp'. + +`SHORT_TYPE_SIZE' + A C expression for the size in bits of the type `short' on the + target machine. If you don't define this, the default is half a + word. (If this would be less than one storage unit, it is rounded + up to one unit.) + +`LONG_TYPE_SIZE' + A C expression for the size in bits of the type `long' on the + target machine. If you don't define this, the default is one word. + +`MAX_LONG_TYPE_SIZE' + Maximum number for the size in bits of the type `long' on the + target machine. If this is undefined, the default is + `LONG_TYPE_SIZE'. Otherwise, it is the constant value that is the + largest value that `LONG_TYPE_SIZE' can have at run-time. This is + used in `cpp'. + +`LONG_LONG_TYPE_SIZE' + A C expression for the size in bits of the type `long long' on the + target machine. If you don't define this, the default is two + words. If you want to support GNU Ada on your machine, the value + of macro must be at least 64. + +`CHAR_TYPE_SIZE' + A C expression for the size in bits of the type `char' on the + target machine. If you don't define this, the default is one + quarter of a word. (If this would be less than one storage unit, + it is rounded up to one unit.) + +`MAX_CHAR_TYPE_SIZE' + Maximum number for the size in bits of the type `char' on the + target machine. If this is undefined, the default is + `CHAR_TYPE_SIZE'. Otherwise, it is the constant value that is the + largest value that `CHAR_TYPE_SIZE' can have at run-time. This is + used in `cpp'. + +`FLOAT_TYPE_SIZE' + A C expression for the size in bits of the type `float' on the + target machine. If you don't define this, the default is one word. + +`DOUBLE_TYPE_SIZE' + A C expression for the size in bits of the type `double' on the + target machine. If you don't define this, the default is two + words. + +`LONG_DOUBLE_TYPE_SIZE' + A C expression for the size in bits of the type `long double' on + the target machine. If you don't define this, the default is two + words. + +`WIDEST_HARDWARE_FP_SIZE' + A C expression for the size in bits of the widest floating-point + format supported by the hardware. If you define this macro, you + must specify a value less than or equal to the value of + `LONG_DOUBLE_TYPE_SIZE'. If you do not define this macro, the + value of `LONG_DOUBLE_TYPE_SIZE' is the default. + +`DEFAULT_SIGNED_CHAR' + An expression whose value is 1 or 0, according to whether the type + `char' should be signed or unsigned by default. The user can + always override this default with the options `-fsigned-char' and + `-funsigned-char'. + +`DEFAULT_SHORT_ENUMS' + A C expression to determine whether to give an `enum' type only as + many bytes as it takes to represent the range of possible values + of that type. A nonzero value means to do that; a zero value + means all `enum' types should be allocated like `int'. + + If you don't define the macro, the default is 0. + +`SIZE_TYPE' + A C expression for a string describing the name of the data type + to use for size values. The typedef name `size_t' is defined + using the contents of the string. + + The string can contain more than one keyword. If so, separate + them with spaces, and write first any length keyword, then + `unsigned' if appropriate, and finally `int'. The string must + exactly match one of the data type names defined in the function + `init_decl_processing' in the file `c-decl.c'. You may not omit + `int' or change the order--that would cause the compiler to crash + on startup. + + If you don't define this macro, the default is `"long unsigned + int"'. + +`PTRDIFF_TYPE' + A C expression for a string describing the name of the data type + to use for the result of subtracting two pointers. The typedef + name `ptrdiff_t' is defined using the contents of the string. See + `SIZE_TYPE' above for more information. + + If you don't define this macro, the default is `"long int"'. + +`WCHAR_TYPE' + A C expression for a string describing the name of the data type + to use for wide characters. The typedef name `wchar_t' is defined + using the contents of the string. See `SIZE_TYPE' above for more + information. + + If you don't define this macro, the default is `"int"'. + +`WCHAR_TYPE_SIZE' + A C expression for the size in bits of the data type for wide + characters. This is used in `cpp', which cannot make use of + `WCHAR_TYPE'. + +`MAX_WCHAR_TYPE_SIZE' + Maximum number for the size in bits of the data type for wide + characters. If this is undefined, the default is + `WCHAR_TYPE_SIZE'. Otherwise, it is the constant value that is the + largest value that `WCHAR_TYPE_SIZE' can have at run-time. This is + used in `cpp'. + +`OBJC_INT_SELECTORS' + Define this macro if the type of Objective C selectors should be + `int'. + + If this macro is not defined, then selectors should have the type + `struct objc_selector *'. + +`OBJC_SELECTORS_WITHOUT_LABELS' + Define this macro if the compiler can group all the selectors + together into a vector and use just one label at the beginning of + the vector. Otherwise, the compiler must give each selector its + own assembler label. + + On certain machines, it is important to have a separate label for + each selector because this enables the linker to eliminate + duplicate selectors. + +`TARGET_BELL' + A C constant expression for the integer value for escape sequence + `\a'. + +`TARGET_BS' +`TARGET_TAB' +`TARGET_NEWLINE' + C constant expressions for the integer values for escape sequences + `\b', `\t' and `\n'. + +`TARGET_VT' +`TARGET_FF' +`TARGET_CR' + C constant expressions for the integer values for escape sequences + `\v', `\f' and `\r'. + + +File: gcc.info, Node: Registers, Next: Register Classes, Prev: Type Layout, Up: Target Macros + +Register Usage +============== + + This section explains how to describe what registers the target +machine has, and how (in general) they can be used. + + The description of which registers a specific instruction can use is +done with register classes; see *Note Register Classes::. For +information on using registers to access a stack frame, see *Note Frame +Registers::. For passing values in registers, see *Note Register +Arguments::. For returning values in registers, see *Note Scalar +Return::. + +* Menu: + +* Register Basics:: Number and kinds of registers. +* Allocation Order:: Order in which registers are allocated. +* Values in Registers:: What kinds of values each reg can hold. +* Leaf Functions:: Renumbering registers for leaf functions. +* Stack Registers:: Handling a register stack such as 80387. +* Obsolete Register Macros:: Macros formerly used for the 80387. + + +File: gcc.info, Node: Register Basics, Next: Allocation Order, Up: Registers + +Basic Characteristics of Registers +---------------------------------- + + Registers have various characteristics. + +`FIRST_PSEUDO_REGISTER' + Number of hardware registers known to the compiler. They receive + numbers 0 through `FIRST_PSEUDO_REGISTER-1'; thus, the first + pseudo register's number really is assigned the number + `FIRST_PSEUDO_REGISTER'. + +`FIXED_REGISTERS' + An initializer that says which registers are used for fixed + purposes all throughout the compiled code and are therefore not + available for general allocation. These would include the stack + pointer, the frame pointer (except on machines where that can be + used as a general register when no frame pointer is needed), the + program counter on machines where that is considered one of the + addressable registers, and any other numbered register with a + standard use. + + This information is expressed as a sequence of numbers, separated + by commas and surrounded by braces. The Nth number is 1 if + register N is fixed, 0 otherwise. + + The table initialized from this macro, and the table initialized by + the following one, may be overridden at run time either + automatically, by the actions of the macro + `CONDITIONAL_REGISTER_USAGE', or by the user with the command + options `-ffixed-REG', `-fcall-used-REG' and `-fcall-saved-REG'. + +`CALL_USED_REGISTERS' + Like `FIXED_REGISTERS' but has 1 for each register that is + clobbered (in general) by function calls as well as for fixed + registers. This macro therefore identifies the registers that are + not available for general allocation of values that must live + across function calls. + + If a register has 0 in `CALL_USED_REGISTERS', the compiler + automatically saves it on function entry and restores it on + function exit, if the register is used within the function. + +`HARD_REGNO_CALL_PART_CLOBBERED (REGNO, MODE)' + A C expression that is non-zero if it is not permissible to store a + value of mode MODE in hard register number REGNO across a call + without some part of it being clobbered. For most machines this + macro need not be defined. It is only required for machines that + do not preserve the entire contents of a register across a call. + +`CONDITIONAL_REGISTER_USAGE' + Zero or more C statements that may conditionally modify four + variables `fixed_regs', `call_used_regs', `global_regs' (these + three are of type `char []') and `reg_class_contents' (of type + `HARD_REG_SET'). Before the macro is called `fixed_regs', + `call_used_regs' and `reg_class_contents' have been initialized + from `FIXED_REGISTERS', `CALL_USED_REGISTERS' and + `REG_CLASS_CONTENTS', respectively, `global_regs' has been + cleared, and any `-ffixed-REG', `-fcall-used-REG' and + `-fcall-saved-REG' command options have been applied. + + This is necessary in case the fixed or call-clobbered registers + depend on target flags. + + You need not define this macro if it has no work to do. + + If the usage of an entire class of registers depends on the target + flags, you may indicate this to GCC by using this macro to modify + `fixed_regs' and `call_used_regs' to 1 for each of the registers + in the classes which should not be used by GCC. Also define the + macro `REG_CLASS_FROM_LETTER' to return `NO_REGS' if it is called + with a letter for a class that shouldn't be used. + + (However, if this class is not included in `GENERAL_REGS' and all + of the insn patterns whose constraints permit this class are + controlled by target switches, then GCC will automatically avoid + using these registers when the target switches are opposed to + them.) + +`NON_SAVING_SETJMP' + If this macro is defined and has a nonzero value, it means that + `setjmp' and related functions fail to save the registers, or that + `longjmp' fails to restore them. To compensate, the compiler + avoids putting variables in registers in functions that use + `setjmp'. + +`INCOMING_REGNO (OUT)' + Define this macro if the target machine has register windows. + This C expression returns the register number as seen by the + called function corresponding to the register number OUT as seen + by the calling function. Return OUT if register number OUT is not + an outbound register. + +`OUTGOING_REGNO (IN)' + Define this macro if the target machine has register windows. + This C expression returns the register number as seen by the + calling function corresponding to the register number IN as seen + by the called function. Return IN if register number IN is not an + inbound register. + + +File: gcc.info, Node: Allocation Order, Next: Values in Registers, Prev: Register Basics, Up: Registers + +Order of Allocation of Registers +-------------------------------- + + Registers are allocated in order. + +`REG_ALLOC_ORDER' + If defined, an initializer for a vector of integers, containing the + numbers of hard registers in the order in which GNU CC should + prefer to use them (from most preferred to least). + + If this macro is not defined, registers are used lowest numbered + first (all else being equal). + + One use of this macro is on machines where the highest numbered + registers must always be saved and the save-multiple-registers + instruction supports only sequences of consecutive registers. On + such machines, define `REG_ALLOC_ORDER' to be an initializer that + lists the highest numbered allocable register first. + +`ORDER_REGS_FOR_LOCAL_ALLOC' + A C statement (sans semicolon) to choose the order in which to + allocate hard registers for pseudo-registers local to a basic + block. + + Store the desired register order in the array `reg_alloc_order'. + Element 0 should be the register to allocate first; element 1, the + next register; and so on. + + The macro body should not assume anything about the contents of + `reg_alloc_order' before execution of the macro. + + On most machines, it is not necessary to define this macro. + + +File: gcc.info, Node: Values in Registers, Next: Leaf Functions, Prev: Allocation Order, Up: Registers + +How Values Fit in Registers +--------------------------- + + This section discusses the macros that describe which kinds of values +(specifically, which machine modes) each register can hold, and how many +consecutive registers are needed for a given mode. + +`HARD_REGNO_NREGS (REGNO, MODE)' + A C expression for the number of consecutive hard registers, + starting at register number REGNO, required to hold a value of mode + MODE. + + On a machine where all registers are exactly one word, a suitable + definition of this macro is + + #define HARD_REGNO_NREGS(REGNO, MODE) \ + ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \ + / UNITS_PER_WORD)) + +`ALTER_HARD_SUBREG (TGT_MODE, WORD, SRC_MODE, REGNO)' + A C expression that returns an adjusted hard register number for + + (subreg:TGT_MODE (reg:SRC_MODE REGNO) WORD) + + This may be needed if the target machine has mixed sized big-endian + registers, like Sparc v9. + +`HARD_REGNO_MODE_OK (REGNO, MODE)' + A C expression that is nonzero if it is permissible to store a + value of mode MODE in hard register number REGNO (or in several + registers starting with that one). For a machine where all + registers are equivalent, a suitable definition is + + #define HARD_REGNO_MODE_OK(REGNO, MODE) 1 + + You need not include code to check for the numbers of fixed + registers, because the allocation mechanism considers them to be + always occupied. + + On some machines, double-precision values must be kept in even/odd + register pairs. You can implement that by defining this macro to + reject odd register numbers for such modes. + + The minimum requirement for a mode to be OK in a register is that + the `movMODE' instruction pattern support moves between the + register and other hard register in the same class and that moving + a value into the register and back out not alter it. + + Since the same instruction used to move `word_mode' will work for + all narrower integer modes, it is not necessary on any machine for + `HARD_REGNO_MODE_OK' to distinguish between these modes, provided + you define patterns `movhi', etc., to take advantage of this. This + is useful because of the interaction between `HARD_REGNO_MODE_OK' + and `MODES_TIEABLE_P'; it is very desirable for all integer modes + to be tieable. + + Many machines have special registers for floating point arithmetic. + Often people assume that floating point machine modes are allowed + only in floating point registers. This is not true. Any + registers that can hold integers can safely *hold* a floating + point machine mode, whether or not floating arithmetic can be done + on it in those registers. Integer move instructions can be used + to move the values. + + On some machines, though, the converse is true: fixed-point machine + modes may not go in floating registers. This is true if the + floating registers normalize any value stored in them, because + storing a non-floating value there would garble it. In this case, + `HARD_REGNO_MODE_OK' should reject fixed-point machine modes in + floating registers. But if the floating registers do not + automatically normalize, if you can store any bit pattern in one + and retrieve it unchanged without a trap, then any machine mode + may go in a floating register, so you can define this macro to say + so. + + The primary significance of special floating registers is rather + that they are the registers acceptable in floating point arithmetic + instructions. However, this is of no concern to + `HARD_REGNO_MODE_OK'. You handle it by writing the proper + constraints for those instructions. + + On some machines, the floating registers are especially slow to + access, so that it is better to store a value in a stack frame + than in such a register if floating point arithmetic is not being + done. As long as the floating registers are not in class + `GENERAL_REGS', they will not be used unless some pattern's + constraint asks for one. + +`MODES_TIEABLE_P (MODE1, MODE2)' + A C expression that is nonzero if a value of mode MODE1 is + accessible in mode MODE2 without copying. + + If `HARD_REGNO_MODE_OK (R, MODE1)' and `HARD_REGNO_MODE_OK (R, + MODE2)' are always the same for any R, then `MODES_TIEABLE_P + (MODE1, MODE2)' should be nonzero. If they differ for any R, you + should define this macro to return zero unless some other + mechanism ensures the accessibility of the value in a narrower + mode. + + You should define this macro to return nonzero in as many cases as + possible since doing so will allow GNU CC to perform better + register allocation. + +`AVOID_CCMODE_COPIES' + Define this macro if the compiler should avoid copies to/from + `CCmode' registers. You should only define this macro if support + fo copying to/from `CCmode' is incomplete. + + +File: gcc.info, Node: Leaf Functions, Next: Stack Registers, Prev: Values in Registers, Up: Registers + +Handling Leaf Functions +----------------------- + + On some machines, a leaf function (i.e., one which makes no calls) +can run more efficiently if it does not make its own register window. +Often this means it is required to receive its arguments in the +registers where they are passed by the caller, instead of the registers +where they would normally arrive. + + The special treatment for leaf functions generally applies only when +other conditions are met; for example, often they may use only those +registers for its own variables and temporaries. We use the term "leaf +function" to mean a function that is suitable for this special +handling, so that functions with no calls are not necessarily "leaf +functions". + + GNU CC assigns register numbers before it knows whether the function +is suitable for leaf function treatment. So it needs to renumber the +registers in order to output a leaf function. The following macros +accomplish this. + +`LEAF_REGISTERS' + A C initializer for a vector, indexed by hard register number, + which contains 1 for a register that is allowable in a candidate + for leaf function treatment. + + If leaf function treatment involves renumbering the registers, + then the registers marked here should be the ones before + renumbering--those that GNU CC would ordinarily allocate. The + registers which will actually be used in the assembler code, after + renumbering, should not be marked with 1 in this vector. + + Define this macro only if the target machine offers a way to + optimize the treatment of leaf functions. + +`LEAF_REG_REMAP (REGNO)' + A C expression whose value is the register number to which REGNO + should be renumbered, when a function is treated as a leaf + function. + + If REGNO is a register number which should not appear in a leaf + function before renumbering, then the expression should yield -1, + which will cause the compiler to abort. + + Define this macro only if the target machine offers a way to + optimize the treatment of leaf functions, and registers need to be + renumbered to do this. + + Normally, `FUNCTION_PROLOGUE' and `FUNCTION_EPILOGUE' must treat +leaf functions specially. They can test the C variable +`current_function_is_leaf' which is nonzero for leaf functions. +`current_function_is_leaf' is set prior to local register allocation +and is valid for the remaining compiler passes. They can also test the +C variable `current_function_uses_only_leaf_regs' which is nonzero for +leaf functions which only use leaf registers. +`current_function_uses_only_leaf_regs' is valid after reload and is +only useful if `LEAF_REGISTERS' is defined. + + +File: gcc.info, Node: Stack Registers, Next: Obsolete Register Macros, Prev: Leaf Functions, Up: Registers + +Registers That Form a Stack +--------------------------- + + There are special features to handle computers where some of the +"registers" form a stack, as in the 80387 coprocessor for the 80386. +Stack registers are normally written by pushing onto the stack, and are +numbered relative to the top of the stack. + + Currently, GNU CC can only handle one group of stack-like registers, +and they must be consecutively numbered. + +`STACK_REGS' + Define this if the machine has any stack-like registers. + +`FIRST_STACK_REG' + The number of the first stack-like register. This one is the top + of the stack. + +`LAST_STACK_REG' + The number of the last stack-like register. This one is the + bottom of the stack. + + +File: gcc.info, Node: Obsolete Register Macros, Prev: Stack Registers, Up: Registers + +Obsolete Macros for Controlling Register Usage +---------------------------------------------- + + These features do not work very well. They exist because they used +to be required to generate correct code for the 80387 coprocessor of the +80386. They are no longer used by that machine description and may be +removed in a later version of the compiler. Don't use them! + +`OVERLAPPING_REGNO_P (REGNO)' + If defined, this is a C expression whose value is nonzero if hard + register number REGNO is an overlapping register. This means a + hard register which overlaps a hard register with a different + number. (Such overlap is undesirable, but occasionally it allows + a machine to be supported which otherwise could not be.) This + macro must return nonzero for *all* the registers which overlap + each other. GNU CC can use an overlapping register only in + certain limited ways. It can be used for allocation within a + basic block, and may be spilled for reloading; that is all. + + If this macro is not defined, it means that none of the hard + registers overlap each other. This is the usual situation. + +`INSN_CLOBBERS_REGNO_P (INSN, REGNO)' + If defined, this is a C expression whose value should be nonzero if + the insn INSN has the effect of mysteriously clobbering the + contents of hard register number REGNO. By "mysterious" we mean + that the insn's RTL expression doesn't describe such an effect. + + If this macro is not defined, it means that no insn clobbers + registers mysteriously. This is the usual situation; all else + being equal, it is best for the RTL expression to show all the + activity. + diff --git a/usr/local/nachos/info/gcc.info-23 b/usr/local/nachos/info/gcc.info-23 new file mode 100644 index 0000000..ac9ea37 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-23 @@ -0,0 +1,989 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Register Classes, Next: Stack and Calling, Prev: Registers, Up: Target Macros + +Register Classes +================ + + On many machines, the numbered registers are not all equivalent. +For example, certain registers may not be allowed for indexed +addressing; certain registers may not be allowed in some instructions. +These machine restrictions are described to the compiler using +"register classes". + + You define a number of register classes, giving each one a name and +saying which of the registers belong to it. Then you can specify +register classes that are allowed as operands to particular instruction +patterns. + + In general, each register will belong to several classes. In fact, +one class must be named `ALL_REGS' and contain all the registers. +Another class must be named `NO_REGS' and contain no registers. Often +the union of two classes will be another class; however, this is not +required. + + One of the classes must be named `GENERAL_REGS'. There is nothing +terribly special about the name, but the operand constraint letters `r' +and `g' specify this class. If `GENERAL_REGS' is the same as +`ALL_REGS', just define it as a macro which expands to `ALL_REGS'. + + Order the classes so that if class X is contained in class Y then X +has a lower class number than Y. + + The way classes other than `GENERAL_REGS' are specified in operand +constraints is through machine-dependent operand constraint letters. +You can define such letters to correspond to various classes, then use +them in operand constraints. + + You should define a class for the union of two classes whenever some +instruction allows both classes. For example, if an instruction allows +either a floating point (coprocessor) register or a general register +for a certain operand, you should define a class `FLOAT_OR_GENERAL_REGS' +which includes both of them. Otherwise you will get suboptimal code. + + You must also specify certain redundant information about the +register classes: for each class, which classes contain it and which +ones are contained in it; for each pair of classes, the largest class +contained in their union. + + When a value occupying several consecutive registers is expected in a +certain class, all the registers used must belong to that class. +Therefore, register classes cannot be used to enforce a requirement for +a register pair to start with an even-numbered register. The way to +specify this requirement is with `HARD_REGNO_MODE_OK'. + + Register classes used for input-operands of bitwise-and or shift +instructions have a special requirement: each such class must have, for +each fixed-point machine mode, a subclass whose registers can transfer +that mode to or from memory. For example, on some machines, the +operations for single-byte values (`QImode') are limited to certain +registers. When this is so, each register class that is used in a +bitwise-and or shift instruction must have a subclass consisting of +registers from which single-byte values can be loaded or stored. This +is so that `PREFERRED_RELOAD_CLASS' can always have a possible value to +return. + +`enum reg_class' + An enumeral type that must be defined with all the register class + names as enumeral values. `NO_REGS' must be first. `ALL_REGS' + must be the last register class, followed by one more enumeral + value, `LIM_REG_CLASSES', which is not a register class but rather + tells how many classes there are. + + Each register class has a number, which is the value of casting + the class name to type `int'. The number serves as an index in + many of the tables described below. + +`N_REG_CLASSES' + The number of distinct register classes, defined as follows: + + #define N_REG_CLASSES (int) LIM_REG_CLASSES + +`REG_CLASS_NAMES' + An initializer containing the names of the register classes as C + string constants. These names are used in writing some of the + debugging dumps. + +`REG_CLASS_CONTENTS' + An initializer containing the contents of the register classes, as + integers which are bit masks. The Nth integer specifies the + contents of class N. The way the integer MASK is interpreted is + that register R is in the class if `MASK & (1 << R)' is 1. + + When the machine has more than 32 registers, an integer does not + suffice. Then the integers are replaced by sub-initializers, + braced groupings containing several integers. Each + sub-initializer must be suitable as an initializer for the type + `HARD_REG_SET' which is defined in `hard-reg-set.h'. + +`REGNO_REG_CLASS (REGNO)' + A C expression whose value is a register class containing hard + register REGNO. In general there is more than one such class; + choose a class which is "minimal", meaning that no smaller class + also contains the register. + +`BASE_REG_CLASS' + A macro whose definition is the name of the class to which a valid + base register must belong. A base register is one used in an + address which is the register value plus a displacement. + +`INDEX_REG_CLASS' + A macro whose definition is the name of the class to which a valid + index register must belong. An index register is one used in an + address where its value is either multiplied by a scale factor or + added to another register (as well as added to a displacement). + +`REG_CLASS_FROM_LETTER (CHAR)' + A C expression which defines the machine-dependent operand + constraint letters for register classes. If CHAR is such a + letter, the value should be the register class corresponding to + it. Otherwise, the value should be `NO_REGS'. The register + letter `r', corresponding to class `GENERAL_REGS', will not be + passed to this macro; you do not need to handle it. + +`REGNO_OK_FOR_BASE_P (NUM)' + A C expression which is nonzero if register number NUM is suitable + for use as a base register in operand addresses. It may be either + a suitable hard register or a pseudo register that has been + allocated such a hard register. + +`REGNO_MODE_OK_FOR_BASE_P (NUM, MODE)' + A C expression that is just like `REGNO_OK_FOR_BASE_P', except that + that expression may examine the mode of the memory reference in + MODE. You should define this macro if the mode of the memory + reference affects whether a register may be used as a base + register. If you define this macro, the compiler will use it + instead of `REGNO_OK_FOR_BASE_P'. + +`REGNO_OK_FOR_INDEX_P (NUM)' + A C expression which is nonzero if register number NUM is suitable + for use as an index register in operand addresses. It may be + either a suitable hard register or a pseudo register that has been + allocated such a hard register. + + The difference between an index register and a base register is + that the index register may be scaled. If an address involves the + sum of two registers, neither one of them scaled, then either one + may be labeled the "base" and the other the "index"; but whichever + labeling is used must fit the machine's constraints of which + registers may serve in each capacity. The compiler will try both + labelings, looking for one that is valid, and will reload one or + both registers only if neither labeling works. + +`PREFERRED_RELOAD_CLASS (X, CLASS)' + A C expression that places additional restrictions on the register + class to use when it is necessary to copy value X into a register + in class CLASS. The value is a register class; perhaps CLASS, or + perhaps another, smaller class. On many machines, the following + definition is safe: + + #define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS + + Sometimes returning a more restrictive class makes better code. + For example, on the 68000, when X is an integer constant that is + in range for a `moveq' instruction, the value of this macro is + always `DATA_REGS' as long as CLASS includes the data registers. + Requiring a data register guarantees that a `moveq' will be used. + + If X is a `const_double', by returning `NO_REGS' you can force X + into a memory constant. This is useful on certain machines where + immediate floating values cannot be loaded into certain kinds of + registers. + +`PREFERRED_OUTPUT_RELOAD_CLASS (X, CLASS)' + Like `PREFERRED_RELOAD_CLASS', but for output reloads instead of + input reloads. If you don't define this macro, the default is to + use CLASS, unchanged. + +`LIMIT_RELOAD_CLASS (MODE, CLASS)' + A C expression that places additional restrictions on the register + class to use when it is necessary to be able to hold a value of + mode MODE in a reload register for which class CLASS would + ordinarily be used. + + Unlike `PREFERRED_RELOAD_CLASS', this macro should be used when + there are certain modes that simply can't go in certain reload + classes. + + The value is a register class; perhaps CLASS, or perhaps another, + smaller class. + + Don't define this macro unless the target machine has limitations + which require the macro to do something nontrivial. + +`SECONDARY_RELOAD_CLASS (CLASS, MODE, X)' +`SECONDARY_INPUT_RELOAD_CLASS (CLASS, MODE, X)' +`SECONDARY_OUTPUT_RELOAD_CLASS (CLASS, MODE, X)' + Many machines have some registers that cannot be copied directly + to or from memory or even from other types of registers. An + example is the `MQ' register, which on most machines, can only be + copied to or from general registers, but not memory. Some + machines allow copying all registers to and from memory, but + require a scratch register for stores to some memory locations + (e.g., those with symbolic address on the RT, and those with + certain symbolic address on the Sparc when compiling PIC). In + some cases, both an intermediate and a scratch register are + required. + + You should define these macros to indicate to the reload phase + that it may need to allocate at least one register for a reload in + addition to the register to contain the data. Specifically, if + copying X to a register CLASS in MODE requires an intermediate + register, you should define `SECONDARY_INPUT_RELOAD_CLASS' to + return the largest register class all of whose registers can be + used as intermediate registers or scratch registers. + + If copying a register CLASS in MODE to X requires an intermediate + or scratch register, `SECONDARY_OUTPUT_RELOAD_CLASS' should be + defined to return the largest register class required. If the + requirements for input and output reloads are the same, the macro + `SECONDARY_RELOAD_CLASS' should be used instead of defining both + macros identically. + + The values returned by these macros are often `GENERAL_REGS'. + Return `NO_REGS' if no spare register is needed; i.e., if X can be + directly copied to or from a register of CLASS in MODE without + requiring a scratch register. Do not define this macro if it + would always return `NO_REGS'. + + If a scratch register is required (either with or without an + intermediate register), you should define patterns for + `reload_inM' or `reload_outM', as required (*note Standard + Names::.. These patterns, which will normally be implemented with + a `define_expand', should be similar to the `movM' patterns, + except that operand 2 is the scratch register. + + Define constraints for the reload register and scratch register + that contain a single register class. If the original reload + register (whose class is CLASS) can meet the constraint given in + the pattern, the value returned by these macros is used for the + class of the scratch register. Otherwise, two additional reload + registers are required. Their classes are obtained from the + constraints in the insn pattern. + + X might be a pseudo-register or a `subreg' of a pseudo-register, + which could either be in a hard register or in memory. Use + `true_regnum' to find out; it will return -1 if the pseudo is in + memory and the hard register number if it is in a register. + + These macros should not be used in the case where a particular + class of registers can only be copied to memory and not to another + class of registers. In that case, secondary reload registers are + not needed and would not be helpful. Instead, a stack location + must be used to perform the copy and the `movM' pattern should use + memory as a intermediate storage. This case often occurs between + floating-point and general registers. + +`SECONDARY_MEMORY_NEEDED (CLASS1, CLASS2, M)' + Certain machines have the property that some registers cannot be + copied to some other registers without using memory. Define this + macro on those machines to be a C expression that is non-zero if + objects of mode M in registers of CLASS1 can only be copied to + registers of class CLASS2 by storing a register of CLASS1 into + memory and loading that memory location into a register of CLASS2. + + Do not define this macro if its value would always be zero. + +`SECONDARY_MEMORY_NEEDED_RTX (MODE)' + Normally when `SECONDARY_MEMORY_NEEDED' is defined, the compiler + allocates a stack slot for a memory location needed for register + copies. If this macro is defined, the compiler instead uses the + memory location defined by this macro. + + Do not define this macro if you do not define + `SECONDARY_MEMORY_NEEDED'. + +`SECONDARY_MEMORY_NEEDED_MODE (MODE)' + When the compiler needs a secondary memory location to copy + between two registers of mode MODE, it normally allocates + sufficient memory to hold a quantity of `BITS_PER_WORD' bits and + performs the store and load operations in a mode that many bits + wide and whose class is the same as that of MODE. + + This is right thing to do on most machines because it ensures that + all bits of the register are copied and prevents accesses to the + registers in a narrower mode, which some machines prohibit for + floating-point registers. + + However, this default behavior is not correct on some machines, + such as the DEC Alpha, that store short integers in floating-point + registers differently than in integer registers. On those + machines, the default widening will not work correctly and you + must define this macro to suppress that widening in some cases. + See the file `alpha.h' for details. + + Do not define this macro if you do not define + `SECONDARY_MEMORY_NEEDED' or if widening MODE to a mode that is + `BITS_PER_WORD' bits wide is correct for your machine. + +`SMALL_REGISTER_CLASSES' + On some machines, it is risky to let hard registers live across + arbitrary insns. Typically, these machines have instructions that + require values to be in specific registers (like an accumulator), + and reload will fail if the required hard register is used for + another purpose across such an insn. + + Define `SMALL_REGISTER_CLASSES' to be an expression with a non-zero + value on these machines. When this macro has a non-zero value, the + compiler will try to minimize the lifetime of hard registers. + + It is always safe to define this macro with a non-zero value, but + if you unnecessarily define it, you will reduce the amount of + optimizations that can be performed in some cases. If you do not + define this macro with a non-zero value when it is required, the + compiler will run out of spill registers and print a fatal error + message. For most machines, you should not define this macro at + all. + +`CLASS_LIKELY_SPILLED_P (CLASS)' + A C expression whose value is nonzero if pseudos that have been + assigned to registers of class CLASS would likely be spilled + because registers of CLASS are needed for spill registers. + + The default value of this macro returns 1 if CLASS has exactly one + register and zero otherwise. On most machines, this default + should be used. Only define this macro to some other expression + if pseudos allocated by `local-alloc.c' end up in memory because + their hard registers were needed for spill registers. If this + macro returns nonzero for those classes, those pseudos will only + be allocated by `global.c', which knows how to reallocate the + pseudo to another register. If there would not be another + register available for reallocation, you should not change the + definition of this macro since the only effect of such a + definition would be to slow down register allocation. + +`CLASS_MAX_NREGS (CLASS, MODE)' + A C expression for the maximum number of consecutive registers of + class CLASS needed to hold a value of mode MODE. + + This is closely related to the macro `HARD_REGNO_NREGS'. In fact, + the value of the macro `CLASS_MAX_NREGS (CLASS, MODE)' should be + the maximum value of `HARD_REGNO_NREGS (REGNO, MODE)' for all + REGNO values in the class CLASS. + + This macro helps control the handling of multiple-word values in + the reload pass. + +`CLASS_CANNOT_CHANGE_SIZE' + If defined, a C expression for a class that contains registers + which the compiler must always access in a mode that is the same + size as the mode in which it loaded the register. + + For the example, loading 32-bit integer or floating-point objects + into floating-point registers on the Alpha extends them to 64-bits. + Therefore loading a 64-bit object and then storing it as a 32-bit + object does not store the low-order 32-bits, as would be the case + for a normal register. Therefore, `alpha.h' defines this macro as + `FLOAT_REGS'. + + Three other special macros describe which operands fit which +constraint letters. + +`CONST_OK_FOR_LETTER_P (VALUE, C)' + A C expression that defines the machine-dependent operand + constraint letters (`I', `J', `K', ... `P') that specify + particular ranges of integer values. If C is one of those + letters, the expression should check that VALUE, an integer, is in + the appropriate range and return 1 if so, 0 otherwise. If C is + not one of those letters, the value should be 0 regardless of + VALUE. + +`CONST_DOUBLE_OK_FOR_LETTER_P (VALUE, C)' + A C expression that defines the machine-dependent operand + constraint letters that specify particular ranges of + `const_double' values (`G' or `H'). + + If C is one of those letters, the expression should check that + VALUE, an RTX of code `const_double', is in the appropriate range + and return 1 if so, 0 otherwise. If C is not one of those + letters, the value should be 0 regardless of VALUE. + + `const_double' is used for all floating-point constants and for + `DImode' fixed-point constants. A given letter can accept either + or both kinds of values. It can use `GET_MODE' to distinguish + between these kinds. + +`EXTRA_CONSTRAINT (VALUE, C)' + A C expression that defines the optional machine-dependent + constraint letters (`Q', `R', `S', `T', `U') that can be used to + segregate specific types of operands, usually memory references, + for the target machine. Normally this macro will not be defined. + If it is required for a particular target machine, it should + return 1 if VALUE corresponds to the operand type represented by + the constraint letter C. If C is not defined as an extra + constraint, the value returned should be 0 regardless of VALUE. + + For example, on the ROMP, load instructions cannot have their + output in r0 if the memory reference contains a symbolic address. + Constraint letter `Q' is defined as representing a memory address + that does *not* contain a symbolic address. An alternative is + specified with a `Q' constraint on the input and `r' on the + output. The next alternative specifies `m' on the input and a + register class that does not include r0 on the output. + + +File: gcc.info, Node: Stack and Calling, Next: Varargs, Prev: Register Classes, Up: Target Macros + +Stack Layout and Calling Conventions +==================================== + + This describes the stack layout and calling conventions. + +* Menu: + +* Frame Layout:: +* Stack Checking:: +* Frame Registers:: +* Elimination:: +* Stack Arguments:: +* Register Arguments:: +* Scalar Return:: +* Aggregate Return:: +* Caller Saves:: +* Function Entry:: +* Profiling:: + + +File: gcc.info, Node: Frame Layout, Next: Stack Checking, Up: Stack and Calling + +Basic Stack Layout +------------------ + + Here is the basic stack layout. + +`STACK_GROWS_DOWNWARD' + Define this macro if pushing a word onto the stack moves the stack + pointer to a smaller address. + + When we say, "define this macro if ...," it means that the + compiler checks this macro only with `#ifdef' so the precise + definition used does not matter. + +`FRAME_GROWS_DOWNWARD' + Define this macro if the addresses of local variable slots are at + negative offsets from the frame pointer. + +`ARGS_GROW_DOWNWARD' + Define this macro if successive arguments to a function occupy + decreasing addresses on the stack. + +`STARTING_FRAME_OFFSET' + Offset from the frame pointer to the first local variable slot to + be allocated. + + If `FRAME_GROWS_DOWNWARD', find the next slot's offset by + subtracting the first slot's length from `STARTING_FRAME_OFFSET'. + Otherwise, it is found by adding the length of the first slot to + the value `STARTING_FRAME_OFFSET'. + +`STACK_POINTER_OFFSET' + Offset from the stack pointer register to the first location at + which outgoing arguments are placed. If not specified, the + default value of zero is used. This is the proper value for most + machines. + + If `ARGS_GROW_DOWNWARD', this is the offset to the location above + the first location at which outgoing arguments are placed. + +`FIRST_PARM_OFFSET (FUNDECL)' + Offset from the argument pointer register to the first argument's + address. On some machines it may depend on the data type of the + function. + + If `ARGS_GROW_DOWNWARD', this is the offset to the location above + the first argument's address. + +`STACK_DYNAMIC_OFFSET (FUNDECL)' + Offset from the stack pointer register to an item dynamically + allocated on the stack, e.g., by `alloca'. + + The default value for this macro is `STACK_POINTER_OFFSET' plus the + length of the outgoing arguments. The default is correct for most + machines. See `function.c' for details. + +`DYNAMIC_CHAIN_ADDRESS (FRAMEADDR)' + A C expression whose value is RTL representing the address in a + stack frame where the pointer to the caller's frame is stored. + Assume that FRAMEADDR is an RTL expression for the address of the + stack frame itself. + + If you don't define this macro, the default is to return the value + of FRAMEADDR--that is, the stack frame address is also the address + of the stack word that points to the previous frame. + +`SETUP_FRAME_ADDRESSES' + If defined, a C expression that produces the machine-specific code + to setup the stack so that arbitrary frames can be accessed. For + example, on the Sparc, we must flush all of the register windows + to the stack before we can access arbitrary stack frames. You + will seldom need to define this macro. + +`BUILTIN_SETJMP_FRAME_VALUE' + If defined, a C expression that contains an rtx that is used to + store the address of the current frame into the built in `setjmp' + buffer. The default value, `virtual_stack_vars_rtx', is correct + for most machines. One reason you may need to define this macro + is if `hard_frame_pointer_rtx' is the appropriate value on your + machine. + +`RETURN_ADDR_RTX (COUNT, FRAMEADDR)' + A C expression whose value is RTL representing the value of the + return address for the frame COUNT steps up from the current + frame, after the prologue. FRAMEADDR is the frame pointer of the + COUNT frame, or the frame pointer of the COUNT - 1 frame if + `RETURN_ADDR_IN_PREVIOUS_FRAME' is defined. + + The value of the expression must always be the correct address when + COUNT is zero, but may be `NULL_RTX' if there is not way to + determine the return address of other frames. + +`RETURN_ADDR_IN_PREVIOUS_FRAME' + Define this if the return address of a particular stack frame is + accessed from the frame pointer of the previous stack frame. + +`INCOMING_RETURN_ADDR_RTX' + A C expression whose value is RTL representing the location of the + incoming return address at the beginning of any function, before + the prologue. This RTL is either a `REG', indicating that the + return value is saved in `REG', or a `MEM' representing a location + in the stack. + + You only need to define this macro if you want to support call + frame debugging information like that provided by DWARF 2. + +`INCOMING_FRAME_SP_OFFSET' + A C expression whose value is an integer giving the offset, in + bytes, from the value of the stack pointer register to the top of + the stack frame at the beginning of any function, before the + prologue. The top of the frame is defined to be the value of the + stack pointer in the previous frame, just before the call + instruction. + + You only need to define this macro if you want to support call + frame debugging information like that provided by DWARF 2. + +`ARG_POINTER_CFA_OFFSET' + A C expression whose value is an integer giving the offset, in + bytes, from the argument pointer to the canonical frame address + (cfa). The final value should coincide with that calculated by + `INCOMING_FRAME_SP_OFFSET'. Which is unfortunately not usable + during virtual register instantiation. + + You only need to define this macro if you want to support call + frame debugging information like that provided by DWARF 2. + + +File: gcc.info, Node: Stack Checking, Next: Frame Registers, Prev: Frame Layout, Up: Stack and Calling + +Specifying How Stack Checking is Done +------------------------------------- + + GNU CC will check that stack references are within the boundaries of +the stack, if the `-fstack-check' is specified, in one of three ways: + + 1. If the value of the `STACK_CHECK_BUILTIN' macro is nonzero, GNU CC + will assume that you have arranged for stack checking to be done at + appropriate places in the configuration files, e.g., in + `FUNCTION_PROLOGUE'. GNU CC will do not other special processing. + + 2. If `STACK_CHECK_BUILTIN' is zero and you defined a named pattern + called `check_stack' in your `md' file, GNU CC will call that + pattern with one argument which is the address to compare the stack + value against. You must arrange for this pattern to report an + error if the stack pointer is out of range. + + 3. If neither of the above are true, GNU CC will generate code to + periodically "probe" the stack pointer using the values of the + macros defined below. + + Normally, you will use the default values of these macros, so GNU CC +will use the third approach. + +`STACK_CHECK_BUILTIN' + A nonzero value if stack checking is done by the configuration + files in a machine-dependent manner. You should define this macro + if stack checking is require by the ABI of your machine or if you + would like to have to stack checking in some more efficient way + than GNU CC's portable approach. The default value of this macro + is zero. + +`STACK_CHECK_PROBE_INTERVAL' + An integer representing the interval at which GNU CC must generate + stack probe instructions. You will normally define this macro to + be no larger than the size of the "guard pages" at the end of a + stack area. The default value of 4096 is suitable for most + systems. + +`STACK_CHECK_PROBE_LOAD' + A integer which is nonzero if GNU CC should perform the stack probe + as a load instruction and zero if GNU CC should use a store + instruction. The default is zero, which is the most efficient + choice on most systems. + +`STACK_CHECK_PROTECT' + The number of bytes of stack needed to recover from a stack + overflow, for languages where such a recovery is supported. The + default value of 75 words should be adequate for most machines. + +`STACK_CHECK_MAX_FRAME_SIZE' + The maximum size of a stack frame, in bytes. GNU CC will generate + probe instructions in non-leaf functions to ensure at least this + many bytes of stack are available. If a stack frame is larger + than this size, stack checking will not be reliable and GNU CC + will issue a warning. The default is chosen so that GNU CC only + generates one instruction on most systems. You should normally + not change the default value of this macro. + +`STACK_CHECK_FIXED_FRAME_SIZE' + GNU CC uses this value to generate the above warning message. It + represents the amount of fixed frame used by a function, not + including space for any callee-saved registers, temporaries and + user variables. You need only specify an upper bound for this + amount and will normally use the default of four words. + +`STACK_CHECK_MAX_VAR_SIZE' + The maximum size, in bytes, of an object that GNU CC will place in + the fixed area of the stack frame when the user specifies + `-fstack-check'. GNU CC computed the default from the values of + the above macros and you will normally not need to override that + default. + + +File: gcc.info, Node: Frame Registers, Next: Elimination, Prev: Stack Checking, Up: Stack and Calling + +Registers That Address the Stack Frame +-------------------------------------- + + This discusses registers that address the stack frame. + +`STACK_POINTER_REGNUM' + The register number of the stack pointer register, which must also + be a fixed register according to `FIXED_REGISTERS'. On most + machines, the hardware determines which register this is. + +`FRAME_POINTER_REGNUM' + The register number of the frame pointer register, which is used to + access automatic variables in the stack frame. On some machines, + the hardware determines which register this is. On other + machines, you can choose any register you wish for this purpose. + +`HARD_FRAME_POINTER_REGNUM' + On some machines the offset between the frame pointer and starting + offset of the automatic variables is not known until after register + allocation has been done (for example, because the saved registers + are between these two locations). On those machines, define + `FRAME_POINTER_REGNUM' the number of a special, fixed register to + be used internally until the offset is known, and define + `HARD_FRAME_POINTER_REGNUM' to be the actual hard register number + used for the frame pointer. + + You should define this macro only in the very rare circumstances + when it is not possible to calculate the offset between the frame + pointer and the automatic variables until after register + allocation has been completed. When this macro is defined, you + must also indicate in your definition of `ELIMINABLE_REGS' how to + eliminate `FRAME_POINTER_REGNUM' into either + `HARD_FRAME_POINTER_REGNUM' or `STACK_POINTER_REGNUM'. + + Do not define this macro if it would be the same as + `FRAME_POINTER_REGNUM'. + +`ARG_POINTER_REGNUM' + The register number of the arg pointer register, which is used to + access the function's argument list. On some machines, this is + the same as the frame pointer register. On some machines, the + hardware determines which register this is. On other machines, + you can choose any register you wish for this purpose. If this is + not the same register as the frame pointer register, then you must + mark it as a fixed register according to `FIXED_REGISTERS', or + arrange to be able to eliminate it (*note Elimination::.). + +`RETURN_ADDRESS_POINTER_REGNUM' + The register number of the return address pointer register, which + is used to access the current function's return address from the + stack. On some machines, the return address is not at a fixed + offset from the frame pointer or stack pointer or argument + pointer. This register can be defined to point to the return + address on the stack, and then be converted by `ELIMINABLE_REGS' + into either the frame pointer or stack pointer. + + Do not define this macro unless there is no other way to get the + return address from the stack. + +`STATIC_CHAIN_REGNUM' +`STATIC_CHAIN_INCOMING_REGNUM' + Register numbers used for passing a function's static chain + pointer. If register windows are used, the register number as + seen by the called function is `STATIC_CHAIN_INCOMING_REGNUM', + while the register number as seen by the calling function is + `STATIC_CHAIN_REGNUM'. If these registers are the same, + `STATIC_CHAIN_INCOMING_REGNUM' need not be defined. + + The static chain register need not be a fixed register. + + If the static chain is passed in memory, these macros should not be + defined; instead, the next two macros should be defined. + +`STATIC_CHAIN' +`STATIC_CHAIN_INCOMING' + If the static chain is passed in memory, these macros provide rtx + giving `mem' expressions that denote where they are stored. + `STATIC_CHAIN' and `STATIC_CHAIN_INCOMING' give the locations as + seen by the calling and called functions, respectively. Often the + former will be at an offset from the stack pointer and the latter + at an offset from the frame pointer. + + The variables `stack_pointer_rtx', `frame_pointer_rtx', and + `arg_pointer_rtx' will have been initialized prior to the use of + these macros and should be used to refer to those items. + + If the static chain is passed in a register, the two previous + macros should be defined instead. + + +File: gcc.info, Node: Elimination, Next: Stack Arguments, Prev: Frame Registers, Up: Stack and Calling + +Eliminating Frame Pointer and Arg Pointer +----------------------------------------- + + This is about eliminating the frame pointer and arg pointer. + +`FRAME_POINTER_REQUIRED' + A C expression which is nonzero if a function must have and use a + frame pointer. This expression is evaluated in the reload pass. + If its value is nonzero the function will have a frame pointer. + + The expression can in principle examine the current function and + decide according to the facts, but on most machines the constant 0 + or the constant 1 suffices. Use 0 when the machine allows code to + be generated with no frame pointer, and doing so saves some time + or space. Use 1 when there is no possible advantage to avoiding a + frame pointer. + + In certain cases, the compiler does not know how to produce valid + code without a frame pointer. The compiler recognizes those cases + and automatically gives the function a frame pointer regardless of + what `FRAME_POINTER_REQUIRED' says. You don't need to worry about + them. + + In a function that does not require a frame pointer, the frame + pointer register can be allocated for ordinary usage, unless you + mark it as a fixed register. See `FIXED_REGISTERS' for more + information. + +`INITIAL_FRAME_POINTER_OFFSET (DEPTH-VAR)' + A C statement to store in the variable DEPTH-VAR the difference + between the frame pointer and the stack pointer values immediately + after the function prologue. The value would be computed from + information such as the result of `get_frame_size ()' and the + tables of registers `regs_ever_live' and `call_used_regs'. + + If `ELIMINABLE_REGS' is defined, this macro will be not be used and + need not be defined. Otherwise, it must be defined even if + `FRAME_POINTER_REQUIRED' is defined to always be true; in that + case, you may set DEPTH-VAR to anything. + +`ELIMINABLE_REGS' + If defined, this macro specifies a table of register pairs used to + eliminate unneeded registers that point into the stack frame. If + it is not defined, the only elimination attempted by the compiler + is to replace references to the frame pointer with references to + the stack pointer. + + The definition of this macro is a list of structure + initializations, each of which specifies an original and + replacement register. + + On some machines, the position of the argument pointer is not + known until the compilation is completed. In such a case, a + separate hard register must be used for the argument pointer. + This register can be eliminated by replacing it with either the + frame pointer or the argument pointer, depending on whether or not + the frame pointer has been eliminated. + + In this case, you might specify: + #define ELIMINABLE_REGS \ + {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ + {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \ + {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} + + Note that the elimination of the argument pointer with the stack + pointer is specified first since that is the preferred elimination. + +`CAN_ELIMINATE (FROM-REG, TO-REG)' + A C expression that returns non-zero if the compiler is allowed to + try to replace register number FROM-REG with register number + TO-REG. This macro need only be defined if `ELIMINABLE_REGS' is + defined, and will usually be the constant 1, since most of the + cases preventing register elimination are things that the compiler + already knows about. + +`INITIAL_ELIMINATION_OFFSET (FROM-REG, TO-REG, OFFSET-VAR)' + This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'. It + specifies the initial difference between the specified pair of + registers. This macro must be defined if `ELIMINABLE_REGS' is + defined. + +`LONGJMP_RESTORE_FROM_STACK' + Define this macro if the `longjmp' function restores registers from + the stack frames, rather than from those saved specifically by + `setjmp'. Certain quantities must not be kept in registers across + a call to `setjmp' on such machines. + + +File: gcc.info, Node: Stack Arguments, Next: Register Arguments, Prev: Elimination, Up: Stack and Calling + +Passing Function Arguments on the Stack +--------------------------------------- + + The macros in this section control how arguments are passed on the +stack. See the following section for other macros that control passing +certain arguments in registers. + +`PROMOTE_PROTOTYPES' + Define this macro if an argument declared in a prototype as an + integral type smaller than `int' should actually be passed as an + `int'. In addition to avoiding errors in certain cases of + mismatch, it also makes for better code on certain machines. + +`PUSH_ROUNDING (NPUSHED)' + A C expression that is the number of bytes actually pushed onto the + stack when an instruction attempts to push NPUSHED bytes. + + If the target machine does not have a push instruction, do not + define this macro. That directs GNU CC to use an alternate + strategy: to allocate the entire argument block and then store the + arguments into it. + + On some machines, the definition + + #define PUSH_ROUNDING(BYTES) (BYTES) + + will suffice. But on other machines, instructions that appear to + push one byte actually push two bytes in an attempt to maintain + alignment. Then the definition should be + + #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1) + +`ACCUMULATE_OUTGOING_ARGS' + If defined, the maximum amount of space required for outgoing + arguments will be computed and placed into the variable + `current_function_outgoing_args_size'. No space will be pushed + onto the stack for each call; instead, the function prologue should + increase the stack frame size by this amount. + + Defining both `PUSH_ROUNDING' and `ACCUMULATE_OUTGOING_ARGS' is + not proper. + +`REG_PARM_STACK_SPACE (FNDECL)' + Define this macro if functions should assume that stack space has + been allocated for arguments even when their values are passed in + registers. + + The value of this macro is the size, in bytes, of the area + reserved for arguments passed in registers for the function + represented by FNDECL, which can be zero if GNU CC is calling a + library function. + + This space can be allocated by the caller, or be a part of the + machine-dependent stack frame: `OUTGOING_REG_PARM_STACK_SPACE' says + which. + +`MAYBE_REG_PARM_STACK_SPACE' +`FINAL_REG_PARM_STACK_SPACE (CONST_SIZE, VAR_SIZE)' + Define these macros in addition to the one above if functions might + allocate stack space for arguments even when their values are + passed in registers. These should be used when the stack space + allocated for arguments in registers is not a simple constant + independent of the function declaration. + + The value of the first macro is the size, in bytes, of the area + that we should initially assume would be reserved for arguments + passed in registers. + + The value of the second macro is the actual size, in bytes, of the + area that will be reserved for arguments passed in registers. + This takes two arguments: an integer representing the number of + bytes of fixed sized arguments on the stack, and a tree + representing the number of bytes of variable sized arguments on + the stack. + + When these macros are defined, `REG_PARM_STACK_SPACE' will only be + called for libcall functions, the current function, or for a + function being called when it is known that such stack space must + be allocated. In each case this value can be easily computed. + + When deciding whether a called function needs such stack space, + and how much space to reserve, GNU CC uses these two macros + instead of `REG_PARM_STACK_SPACE'. + +`OUTGOING_REG_PARM_STACK_SPACE' + Define this if it is the responsibility of the caller to allocate + the area reserved for arguments passed in registers. + + If `ACCUMULATE_OUTGOING_ARGS' is defined, this macro controls + whether the space for these arguments counts in the value of + `current_function_outgoing_args_size'. + +`STACK_PARMS_IN_REG_PARM_AREA' + Define this macro if `REG_PARM_STACK_SPACE' is defined, but the + stack parameters don't skip the area specified by it. + + Normally, when a parameter is not passed in registers, it is + placed on the stack beyond the `REG_PARM_STACK_SPACE' area. + Defining this macro suppresses this behavior and causes the + parameter to be passed on the stack in its natural location. + +`RETURN_POPS_ARGS (FUNDECL, FUNTYPE, STACK-SIZE)' + A C expression that should indicate the number of bytes of its own + arguments that a function pops on returning, or 0 if the function + pops no arguments and the caller must therefore pop them all after + the function returns. + + FUNDECL is a C variable whose value is a tree node that describes + the function in question. Normally it is a node of type + `FUNCTION_DECL' that describes the declaration of the function. + From this you can obtain the DECL_MACHINE_ATTRIBUTES of the + function. + + FUNTYPE is a C variable whose value is a tree node that describes + the function in question. Normally it is a node of type + `FUNCTION_TYPE' that describes the data type of the function. + From this it is possible to obtain the data types of the value and + arguments (if known). + + When a call to a library function is being considered, FUNDECL + will contain an identifier node for the library function. Thus, if + you need to distinguish among various library functions, you can + do so by their names. Note that "library function" in this + context means a function used to perform arithmetic, whose name is + known specially in the compiler and was not mentioned in the C + code being compiled. + + STACK-SIZE is the number of bytes of arguments passed on the + stack. If a variable number of bytes is passed, it is zero, and + argument popping will always be the responsibility of the calling + function. + + On the Vax, all functions always pop their arguments, so the + definition of this macro is STACK-SIZE. On the 68000, using the + standard calling convention, no functions pop their arguments, so + the value of the macro is always 0 in this case. But an + alternative calling convention is available in which functions + that take a fixed number of arguments pop them but other functions + (such as `printf') pop nothing (the caller pops all). When this + convention is in use, FUNTYPE is examined to determine whether a + function takes a fixed number of arguments. + diff --git a/usr/local/nachos/info/gcc.info-24 b/usr/local/nachos/info/gcc.info-24 new file mode 100644 index 0000000..9c84f58 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-24 @@ -0,0 +1,982 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Register Arguments, Next: Scalar Return, Prev: Stack Arguments, Up: Stack and Calling + +Passing Arguments in Registers +------------------------------ + + This section describes the macros which let you control how various +types of arguments are passed in registers or how they are arranged in +the stack. + +`FUNCTION_ARG (CUM, MODE, TYPE, NAMED)' + A C expression that controls whether a function argument is passed + in a register, and which register. + + The arguments are CUM, which summarizes all the previous + arguments; MODE, the machine mode of the argument; TYPE, the data + type of the argument as a tree node or 0 if that is not known + (which happens for C support library functions); and NAMED, which + is 1 for an ordinary argument and 0 for nameless arguments that + correspond to `...' in the called function's prototype. + + The value of the expression is usually either a `reg' RTX for the + hard register in which to pass the argument, or zero to pass the + argument on the stack. + + For machines like the Vax and 68000, where normally all arguments + are pushed, zero suffices as a definition. + + The value of the expression can also be a `parallel' RTX. This is + used when an argument is passed in multiple locations. The mode + of the of the `parallel' should be the mode of the entire + argument. The `parallel' holds any number of `expr_list' pairs; + each one describes where part of the argument is passed. In each + `expr_list' the first operand must be a `reg' RTX for the hard + register in which to pass this part of the argument, and the mode + of the register RTX indicates how large this part of the argument + is. The second operand of the `expr_list' is a `const_int' which + gives the offset in bytes into the entire argument of where this + part starts. As a special exception the first `expr_list' in the + `parallel' RTX may have a first operand of zero. This indicates + that the bytes starting from the second operand of that + `expr_list' are stored on the stack and not held in a register. + + The usual way to make the ANSI library `stdarg.h' work on a machine + where some arguments are usually passed in registers, is to cause + nameless arguments to be passed on the stack instead. This is done + by making `FUNCTION_ARG' return 0 whenever NAMED is 0. + + You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the + definition of this macro to determine if this argument is of a + type that must be passed in the stack. If `REG_PARM_STACK_SPACE' + is not defined and `FUNCTION_ARG' returns non-zero for such an + argument, the compiler will abort. If `REG_PARM_STACK_SPACE' is + defined, the argument will be computed in the stack and then + loaded into a register. + +`MUST_PASS_IN_STACK (MODE, TYPE)' + Define as a C expression that evaluates to nonzero if we do not + know how to pass TYPE solely in registers. The file `expr.h' + defines a definition that is usually appropriate, refer to + `expr.h' for additional documentation. + +`FUNCTION_INCOMING_ARG (CUM, MODE, TYPE, NAMED)' + Define this macro if the target machine has "register windows", so + that the register in which a function sees an arguments is not + necessarily the same as the one in which the caller passed the + argument. + + For such machines, `FUNCTION_ARG' computes the register in which + the caller passes the value, and `FUNCTION_INCOMING_ARG' should be + defined in a similar fashion to tell the function being called + where the arguments will arrive. + + If `FUNCTION_INCOMING_ARG' is not defined, `FUNCTION_ARG' serves + both purposes. + +`FUNCTION_ARG_PARTIAL_NREGS (CUM, MODE, TYPE, NAMED)' + A C expression for the number of words, at the beginning of an + argument, must be put in registers. The value must be zero for + arguments that are passed entirely in registers or that are + entirely pushed on the stack. + + On some machines, certain arguments must be passed partially in + registers and partially in memory. On these machines, typically + the first N words of arguments are passed in registers, and the + rest on the stack. If a multi-word argument (a `double' or a + structure) crosses that boundary, its first few words must be + passed in registers and the rest must be pushed. This macro tells + the compiler when this occurs, and how many of the words should go + in registers. + + `FUNCTION_ARG' for these arguments should return the first + register to be used by the caller for this argument; likewise + `FUNCTION_INCOMING_ARG', for the called function. + +`FUNCTION_ARG_PASS_BY_REFERENCE (CUM, MODE, TYPE, NAMED)' + A C expression that indicates when an argument must be passed by + reference. If nonzero for an argument, a copy of that argument is + made in memory and a pointer to the argument is passed instead of + the argument itself. The pointer is passed in whatever way is + appropriate for passing a pointer to that type. + + On machines where `REG_PARM_STACK_SPACE' is not defined, a suitable + definition of this macro might be + #define FUNCTION_ARG_PASS_BY_REFERENCE\ + (CUM, MODE, TYPE, NAMED) \ + MUST_PASS_IN_STACK (MODE, TYPE) + +`FUNCTION_ARG_CALLEE_COPIES (CUM, MODE, TYPE, NAMED)' + If defined, a C expression that indicates when it is the called + function's responsibility to make a copy of arguments passed by + invisible reference. Normally, the caller makes a copy and passes + the address of the copy to the routine being called. When + FUNCTION_ARG_CALLEE_COPIES is defined and is nonzero, the caller + does not make a copy. Instead, it passes a pointer to the "live" + value. The called function must not modify this value. If it can + be determined that the value won't be modified, it need not make a + copy; otherwise a copy must be made. + +`CUMULATIVE_ARGS' + A C type for declaring a variable that is used as the first + argument of `FUNCTION_ARG' and other related values. For some + target machines, the type `int' suffices and can hold the number + of bytes of argument so far. + + There is no need to record in `CUMULATIVE_ARGS' anything about the + arguments that have been passed on the stack. The compiler has + other variables to keep track of that. For target machines on + which all arguments are passed on the stack, there is no need to + store anything in `CUMULATIVE_ARGS'; however, the data structure + must exist and should not be empty, so use `int'. + +`INIT_CUMULATIVE_ARGS (CUM, FNTYPE, LIBNAME, INDIRECT)' + A C statement (sans semicolon) for initializing the variable CUM + for the state at the beginning of the argument list. The variable + has type `CUMULATIVE_ARGS'. The value of FNTYPE is the tree node + for the data type of the function which will receive the args, or 0 + if the args are to a compiler support library function. The value + of INDIRECT is nonzero when processing an indirect call, for + example a call through a function pointer. The value of INDIRECT + is zero for a call to an explicitly named function, a library + function call, or when `INIT_CUMULATIVE_ARGS' is used to find + arguments for the function being compiled. + + When processing a call to a compiler support library function, + LIBNAME identifies which one. It is a `symbol_ref' rtx which + contains the name of the function, as a string. LIBNAME is 0 when + an ordinary C function call is being processed. Thus, each time + this macro is called, either LIBNAME or FNTYPE is nonzero, but + never both of them at once. + +`INIT_CUMULATIVE_INCOMING_ARGS (CUM, FNTYPE, LIBNAME)' + Like `INIT_CUMULATIVE_ARGS' but overrides it for the purposes of + finding the arguments for the function being compiled. If this + macro is undefined, `INIT_CUMULATIVE_ARGS' is used instead. + + The value passed for LIBNAME is always 0, since library routines + with special calling conventions are never compiled with GNU CC. + The argument LIBNAME exists for symmetry with + `INIT_CUMULATIVE_ARGS'. + +`FUNCTION_ARG_ADVANCE (CUM, MODE, TYPE, NAMED)' + A C statement (sans semicolon) to update the summarizer variable + CUM to advance past an argument in the argument list. The values + MODE, TYPE and NAMED describe that argument. Once this is done, + the variable CUM is suitable for analyzing the *following* + argument with `FUNCTION_ARG', etc. + + This macro need not do anything if the argument in question was + passed on the stack. The compiler knows how to track the amount + of stack space used for arguments without any special help. + +`FUNCTION_ARG_PADDING (MODE, TYPE)' + If defined, a C expression which determines whether, and in which + direction, to pad out an argument with extra space. The value + should be of type `enum direction': either `upward' to pad above + the argument, `downward' to pad below, or `none' to inhibit + padding. + + The *amount* of padding is always just enough to reach the next + multiple of `FUNCTION_ARG_BOUNDARY'; this macro does not control + it. + + This macro has a default definition which is right for most + systems. For little-endian machines, the default is to pad + upward. For big-endian machines, the default is to pad downward + for an argument of constant size shorter than an `int', and upward + otherwise. + +`FUNCTION_ARG_BOUNDARY (MODE, TYPE)' + If defined, a C expression that gives the alignment boundary, in + bits, of an argument with the specified mode and type. If it is + not defined, `PARM_BOUNDARY' is used for all arguments. + +`FUNCTION_ARG_REGNO_P (REGNO)' + A C expression that is nonzero if REGNO is the number of a hard + register in which function arguments are sometimes passed. This + does *not* include implicit arguments such as the static chain and + the structure-value address. On many machines, no registers can be + used for this purpose since all function arguments are pushed on + the stack. + +`LOAD_ARGS_REVERSED' + If defined, the order in which arguments are loaded into their + respective argument registers is reversed so that the last + argument is loaded first. This macro only effects arguments + passed in registers. + + +File: gcc.info, Node: Scalar Return, Next: Aggregate Return, Prev: Register Arguments, Up: Stack and Calling + +How Scalar Function Values Are Returned +--------------------------------------- + + This section discusses the macros that control returning scalars as +values--values that can fit in registers. + +`TRADITIONAL_RETURN_FLOAT' + Define this macro if `-traditional' should not cause functions + declared to return `float' to convert the value to `double'. + +`FUNCTION_VALUE (VALTYPE, FUNC)' + A C expression to create an RTX representing the place where a + function returns a value of data type VALTYPE. VALTYPE is a tree + node representing a data type. Write `TYPE_MODE (VALTYPE)' to get + the machine mode used to represent that type. On many machines, + only the mode is relevant. (Actually, on most machines, scalar + values are returned in the same place regardless of mode). + + The value of the expression is usually a `reg' RTX for the hard + register where the return value is stored. The value can also be a + `parallel' RTX, if the return value is in multiple places. See + `FUNCTION_ARG' for an explanation of the `parallel' form. + + If `PROMOTE_FUNCTION_RETURN' is defined, you must apply the same + promotion rules specified in `PROMOTE_MODE' if VALTYPE is a scalar + type. + + If the precise function being called is known, FUNC is a tree node + (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer. This + makes it possible to use a different value-returning convention + for specific functions when all their calls are known. + + `FUNCTION_VALUE' is not used for return vales with aggregate data + types, because these are returned in another way. See + `STRUCT_VALUE_REGNUM' and related macros, below. + +`FUNCTION_OUTGOING_VALUE (VALTYPE, FUNC)' + Define this macro if the target machine has "register windows" so + that the register in which a function returns its value is not the + same as the one in which the caller sees the value. + + For such machines, `FUNCTION_VALUE' computes the register in which + the caller will see the value. `FUNCTION_OUTGOING_VALUE' should be + defined in a similar fashion to tell the function where to put the + value. + + If `FUNCTION_OUTGOING_VALUE' is not defined, `FUNCTION_VALUE' + serves both purposes. + + `FUNCTION_OUTGOING_VALUE' is not used for return vales with + aggregate data types, because these are returned in another way. + See `STRUCT_VALUE_REGNUM' and related macros, below. + +`LIBCALL_VALUE (MODE)' + A C expression to create an RTX representing the place where a + library function returns a value of mode MODE. If the precise + function being called is known, FUNC is a tree node + (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer. This + makes it possible to use a different value-returning convention + for specific functions when all their calls are known. + + Note that "library function" in this context means a compiler + support routine, used to perform arithmetic, whose name is known + specially by the compiler and was not mentioned in the C code being + compiled. + + The definition of `LIBRARY_VALUE' need not be concerned aggregate + data types, because none of the library functions returns such + types. + +`FUNCTION_VALUE_REGNO_P (REGNO)' + A C expression that is nonzero if REGNO is the number of a hard + register in which the values of called function may come back. + + A register whose use for returning values is limited to serving as + the second of a pair (for a value of type `double', say) need not + be recognized by this macro. So for most machines, this definition + suffices: + + #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0) + + If the machine has register windows, so that the caller and the + called function use different registers for the return value, this + macro should recognize only the caller's register numbers. + +`APPLY_RESULT_SIZE' + Define this macro if `untyped_call' and `untyped_return' need more + space than is implied by `FUNCTION_VALUE_REGNO_P' for saving and + restoring an arbitrary return value. + + +File: gcc.info, Node: Aggregate Return, Next: Caller Saves, Prev: Scalar Return, Up: Stack and Calling + +How Large Values Are Returned +----------------------------- + + When a function value's mode is `BLKmode' (and in some other cases), +the value is not returned according to `FUNCTION_VALUE' (*note Scalar +Return::.). Instead, the caller passes the address of a block of +memory in which the value should be stored. This address is called the +"structure value address". + + This section describes how to control returning structure values in +memory. + +`RETURN_IN_MEMORY (TYPE)' + A C expression which can inhibit the returning of certain function + values in registers, based on the type of value. A nonzero value + says to return the function value in memory, just as large + structures are always returned. Here TYPE will be a C expression + of type `tree', representing the data type of the value. + + Note that values of mode `BLKmode' must be explicitly handled by + this macro. Also, the option `-fpcc-struct-return' takes effect + regardless of this macro. On most systems, it is possible to + leave the macro undefined; this causes a default definition to be + used, whose value is the constant 1 for `BLKmode' values, and 0 + otherwise. + + Do not use this macro to indicate that structures and unions + should always be returned in memory. You should instead use + `DEFAULT_PCC_STRUCT_RETURN' to indicate this. + +`DEFAULT_PCC_STRUCT_RETURN' + Define this macro to be 1 if all structure and union return values + must be in memory. Since this results in slower code, this should + be defined only if needed for compatibility with other compilers + or with an ABI. If you define this macro to be 0, then the + conventions used for structure and union return values are decided + by the `RETURN_IN_MEMORY' macro. + + If not defined, this defaults to the value 1. + +`STRUCT_VALUE_REGNUM' + If the structure value address is passed in a register, then + `STRUCT_VALUE_REGNUM' should be the number of that register. + +`STRUCT_VALUE' + If the structure value address is not passed in a register, define + `STRUCT_VALUE' as an expression returning an RTX for the place + where the address is passed. If it returns 0, the address is + passed as an "invisible" first argument. + +`STRUCT_VALUE_INCOMING_REGNUM' + On some architectures the place where the structure value address + is found by the called function is not the same place that the + caller put it. This can be due to register windows, or it could + be because the function prologue moves it to a different place. + + If the incoming location of the structure value address is in a + register, define this macro as the register number. + +`STRUCT_VALUE_INCOMING' + If the incoming location is not a register, then you should define + `STRUCT_VALUE_INCOMING' as an expression for an RTX for where the + called function should find the value. If it should find the + value on the stack, define this to create a `mem' which refers to + the frame pointer. A definition of 0 means that the address is + passed as an "invisible" first argument. + +`PCC_STATIC_STRUCT_RETURN' + Define this macro if the usual system convention on the target + machine for returning structures and unions is for the called + function to return the address of a static variable containing the + value. + + Do not define this if the usual system convention is for the + caller to pass an address to the subroutine. + + This macro has effect in `-fpcc-struct-return' mode, but it does + nothing when you use `-freg-struct-return' mode. + + +File: gcc.info, Node: Caller Saves, Next: Function Entry, Prev: Aggregate Return, Up: Stack and Calling + +Caller-Saves Register Allocation +-------------------------------- + + If you enable it, GNU CC can save registers around function calls. +This makes it possible to use call-clobbered registers to hold +variables that must live across calls. + +`DEFAULT_CALLER_SAVES' + Define this macro if function calls on the target machine do not + preserve any registers; in other words, if `CALL_USED_REGISTERS' + has 1 for all registers. When defined, this macro enables + `-fcaller-saves' by default for all optimization levels. It has + no effect for optimization levels 2 and higher, where + `-fcaller-saves' is the default. + +`CALLER_SAVE_PROFITABLE (REFS, CALLS)' + A C expression to determine whether it is worthwhile to consider + placing a pseudo-register in a call-clobbered hard register and + saving and restoring it around each function call. The expression + should be 1 when this is worth doing, and 0 otherwise. + + If you don't define this macro, a default is used which is good on + most machines: `4 * CALLS < REFS'. + +`HARD_REGNO_CALLER_SAVE_MODE (REGNO, NREGS)' + A C expression specifying which mode is required for saving NREGS + of a pseudo-register in call-clobbered hard register REGNO. If + REGNO is unsuitable for caller save, `VOIDmode' should be + returned. For most machines this macro need not be defined since + GCC will select the smallest suitable mode. + + +File: gcc.info, Node: Function Entry, Next: Profiling, Prev: Caller Saves, Up: Stack and Calling + +Function Entry and Exit +----------------------- + + This section describes the macros that output function entry +("prologue") and exit ("epilogue") code. + +`FUNCTION_PROLOGUE (FILE, SIZE)' + A C compound statement that outputs the assembler code for entry + to a function. The prologue is responsible for setting up the + stack frame, initializing the frame pointer register, saving + registers that must be saved, and allocating SIZE additional bytes + of storage for the local variables. SIZE is an integer. FILE is + a stdio stream to which the assembler code should be output. + + The label for the beginning of the function need not be output by + this macro. That has already been done when the macro is run. + + To determine which registers to save, the macro can refer to the + array `regs_ever_live': element R is nonzero if hard register R is + used anywhere within the function. This implies the function + prologue should save register R, provided it is not one of the + call-used registers. (`FUNCTION_EPILOGUE' must likewise use + `regs_ever_live'.) + + On machines that have "register windows", the function entry code + does not save on the stack the registers that are in the windows, + even if they are supposed to be preserved by function calls; + instead it takes appropriate steps to "push" the register stack, + if any non-call-used registers are used in the function. + + On machines where functions may or may not have frame-pointers, the + function entry code must vary accordingly; it must set up the frame + pointer if one is wanted, and not otherwise. To determine whether + a frame pointer is in wanted, the macro can refer to the variable + `frame_pointer_needed'. The variable's value will be 1 at run + time in a function that needs a frame pointer. *Note + Elimination::. + + The function entry code is responsible for allocating any stack + space required for the function. This stack space consists of the + regions listed below. In most cases, these regions are allocated + in the order listed, with the last listed region closest to the + top of the stack (the lowest address if `STACK_GROWS_DOWNWARD' is + defined, and the highest address if it is not defined). You can + use a different order for a machine if doing so is more convenient + or required for compatibility reasons. Except in cases where + required by standard or by a debugger, there is no reason why the + stack layout used by GCC need agree with that used by other + compilers for a machine. + + * A region of `current_function_pretend_args_size' bytes of + uninitialized space just underneath the first argument + arriving on the stack. (This may not be at the very start of + the allocated stack region if the calling sequence has pushed + anything else since pushing the stack arguments. But + usually, on such machines, nothing else has been pushed yet, + because the function prologue itself does all the pushing.) + This region is used on machines where an argument may be + passed partly in registers and partly in memory, and, in some + cases to support the features in `varargs.h' and `stdargs.h'. + + * An area of memory used to save certain registers used by the + function. The size of this area, which may also include + space for such things as the return address and pointers to + previous stack frames, is machine-specific and usually + depends on which registers have been used in the function. + Machines with register windows often do not require a save + area. + + * A region of at least SIZE bytes, possibly rounded up to an + allocation boundary, to contain the local variables of the + function. On some machines, this region and the save area + may occur in the opposite order, with the save area closer to + the top of the stack. + + * Optionally, when `ACCUMULATE_OUTGOING_ARGS' is defined, a + region of `current_function_outgoing_args_size' bytes to be + used for outgoing argument lists of the function. *Note + Stack Arguments::. + + Normally, it is necessary for the macros `FUNCTION_PROLOGUE' and + `FUNCTION_EPILOGUE' to treat leaf functions specially. The C + variable `current_function_is_leaf' is nonzero for such a function. + +`EXIT_IGNORE_STACK' + Define this macro as a C expression that is nonzero if the return + instruction or the function epilogue ignores the value of the stack + pointer; in other words, if it is safe to delete an instruction to + adjust the stack pointer before a return from the function. + + Note that this macro's value is relevant only for functions for + which frame pointers are maintained. It is never safe to delete a + final stack adjustment in a function that has no frame pointer, + and the compiler knows this regardless of `EXIT_IGNORE_STACK'. + +`EPILOGUE_USES (REGNO)' + Define this macro as a C expression that is nonzero for registers + are used by the epilogue or the `return' pattern. The stack and + frame pointer registers are already be assumed to be used as + needed. + +`FUNCTION_EPILOGUE (FILE, SIZE)' + A C compound statement that outputs the assembler code for exit + from a function. The epilogue is responsible for restoring the + saved registers and stack pointer to their values when the + function was called, and returning control to the caller. This + macro takes the same arguments as the macro `FUNCTION_PROLOGUE', + and the registers to restore are determined from `regs_ever_live' + and `CALL_USED_REGISTERS' in the same way. + + On some machines, there is a single instruction that does all the + work of returning from the function. On these machines, give that + instruction the name `return' and do not define the macro + `FUNCTION_EPILOGUE' at all. + + Do not define a pattern named `return' if you want the + `FUNCTION_EPILOGUE' to be used. If you want the target switches + to control whether return instructions or epilogues are used, + define a `return' pattern with a validity condition that tests the + target switches appropriately. If the `return' pattern's validity + condition is false, epilogues will be used. + + On machines where functions may or may not have frame-pointers, the + function exit code must vary accordingly. Sometimes the code for + these two cases is completely different. To determine whether a + frame pointer is wanted, the macro can refer to the variable + `frame_pointer_needed'. The variable's value will be 1 when + compiling a function that needs a frame pointer. + + Normally, `FUNCTION_PROLOGUE' and `FUNCTION_EPILOGUE' must treat + leaf functions specially. The C variable + `current_function_is_leaf' is nonzero for such a function. *Note + Leaf Functions::. + + On some machines, some functions pop their arguments on exit while + others leave that for the caller to do. For example, the 68020 + when given `-mrtd' pops arguments in functions that take a fixed + number of arguments. + + Your definition of the macro `RETURN_POPS_ARGS' decides which + functions pop their own arguments. `FUNCTION_EPILOGUE' needs to + know what was decided. The variable that is called + `current_function_pops_args' is the number of bytes of its + arguments that a function should pop. *Note Scalar Return::. + +`DELAY_SLOTS_FOR_EPILOGUE' + Define this macro if the function epilogue contains delay slots to + which instructions from the rest of the function can be "moved". + The definition should be a C expression whose value is an integer + representing the number of delay slots there. + +`ELIGIBLE_FOR_EPILOGUE_DELAY (INSN, N)' + A C expression that returns 1 if INSN can be placed in delay slot + number N of the epilogue. + + The argument N is an integer which identifies the delay slot now + being considered (since different slots may have different rules of + eligibility). It is never negative and is always less than the + number of epilogue delay slots (what `DELAY_SLOTS_FOR_EPILOGUE' + returns). If you reject a particular insn for a given delay slot, + in principle, it may be reconsidered for a subsequent delay slot. + Also, other insns may (at least in principle) be considered for + the so far unfilled delay slot. + + The insns accepted to fill the epilogue delay slots are put in an + RTL list made with `insn_list' objects, stored in the variable + `current_function_epilogue_delay_list'. The insn for the first + delay slot comes first in the list. Your definition of the macro + `FUNCTION_EPILOGUE' should fill the delay slots by outputting the + insns in this list, usually by calling `final_scan_insn'. + + You need not define this macro if you did not define + `DELAY_SLOTS_FOR_EPILOGUE'. + +`ASM_OUTPUT_MI_THUNK (FILE, THUNK_FNDECL, DELTA, FUNCTION)' + A C compound statement that outputs the assembler code for a thunk + function, used to implement C++ virtual function calls with + multiple inheritance. The thunk acts as a wrapper around a + virtual function, adjusting the implicit object parameter before + handing control off to the real function. + + First, emit code to add the integer DELTA to the location that + contains the incoming first argument. Assume that this argument + contains a pointer, and is the one used to pass the `this' pointer + in C++. This is the incoming argument *before* the function + prologue, e.g. `%o0' on a sparc. The addition must preserve the + values of all other incoming arguments. + + After the addition, emit code to jump to FUNCTION, which is a + `FUNCTION_DECL'. This is a direct pure jump, not a call, and does + not touch the return address. Hence returning from FUNCTION will + return to whoever called the current `thunk'. + + The effect must be as if FUNCTION had been called directly with + the adjusted first argument. This macro is responsible for + emitting all of the code for a thunk function; `FUNCTION_PROLOGUE' + and `FUNCTION_EPILOGUE' are not invoked. + + The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already + been extracted from it.) It might possibly be useful on some + targets, but probably not. + + If you do not define this macro, the target-independent code in + the C++ frontend will generate a less efficient heavyweight thunk + that calls FUNCTION instead of jumping to it. The generic + approach does not support varargs. + + +File: gcc.info, Node: Profiling, Prev: Function Entry, Up: Stack and Calling + +Generating Code for Profiling +----------------------------- + + These macros will help you generate code for profiling. + +`FUNCTION_PROFILER (FILE, LABELNO)' + A C statement or compound statement to output to FILE some + assembler code to call the profiling subroutine `mcount'. Before + calling, the assembler code must load the address of a counter + variable into a register where `mcount' expects to find the + address. The name of this variable is `LP' followed by the number + LABELNO, so you would generate the name using `LP%d' in a + `fprintf'. + + The details of how the address should be passed to `mcount' are + determined by your operating system environment, not by GNU CC. To + figure them out, compile a small program for profiling using the + system's installed C compiler and look at the assembler code that + results. + +`PROFILE_BEFORE_PROLOGUE' + Define this macro if the code for function profiling should come + before the function prologue. Normally, the profiling code comes + after. + +`FUNCTION_BLOCK_PROFILER (FILE, LABELNO)' + A C statement or compound statement to output to FILE some + assembler code to initialize basic-block profiling for the current + object module. The global compile flag `profile_block_flag' + distinguishes two profile modes. + + `profile_block_flag != 2' + Output code to call the subroutine `__bb_init_func' once per + object module, passing it as its sole argument the address of + a block allocated in the object module. + + The name of the block is a local symbol made with this + statement: + + ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0); + + Of course, since you are writing the definition of + `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, + you can take a short cut in the definition of this macro and + use the name that you know will result. + + The first word of this block is a flag which will be nonzero + if the object module has already been initialized. So test + this word first, and do not call `__bb_init_func' if the flag + is nonzero. BLOCK_OR_LABEL contains a unique number which + may be used to generate a label as a branch destination when + `__bb_init_func' will not be called. + + Described in assembler language, the code to be output looks + like: + + cmp (LPBX0),0 + bne local_label + parameter1 <- LPBX0 + call __bb_init_func + local_label: + + `profile_block_flag == 2' + Output code to call the subroutine `__bb_init_trace_func' and + pass two parameters to it. The first parameter is the same as + for `__bb_init_func'. The second parameter is the number of + the first basic block of the function as given by + BLOCK_OR_LABEL. Note that `__bb_init_trace_func' has to be + called, even if the object module has been initialized + already. + + Described in assembler language, the code to be output looks + like: + parameter1 <- LPBX0 + parameter2 <- BLOCK_OR_LABEL + call __bb_init_trace_func + +`BLOCK_PROFILER (FILE, BLOCKNO)' + A C statement or compound statement to output to FILE some + assembler code to increment the count associated with the basic + block number BLOCKNO. The global compile flag + `profile_block_flag' distinguishes two profile modes. + + `profile_block_flag != 2' + Output code to increment the counter directly. Basic blocks + are numbered separately from zero within each compilation. + The count associated with block number BLOCKNO is at index + BLOCKNO in a vector of words; the name of this array is a + local symbol made with this statement: + + ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 2); + + Of course, since you are writing the definition of + `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, + you can take a short cut in the definition of this macro and + use the name that you know will result. + + Described in assembler language, the code to be output looks + like: + + inc (LPBX2+4*BLOCKNO) + + `profile_block_flag == 2' + Output code to initialize the global structure `__bb' and + call the function `__bb_trace_func', which will increment the + counter. + + `__bb' consists of two words. In the first word, the current + basic block number, as given by BLOCKNO, has to be stored. In + the second word, the address of a block allocated in the + object module has to be stored. The address is given by the + label created with this statement: + + ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0); + + Described in assembler language, the code to be output looks + like: + move BLOCKNO -> (__bb) + move LPBX0 -> (__bb+4) + call __bb_trace_func + +`FUNCTION_BLOCK_PROFILER_EXIT (FILE)' + A C statement or compound statement to output to FILE assembler + code to call function `__bb_trace_ret'. The assembler code should + only be output if the global compile flag `profile_block_flag' == + 2. This macro has to be used at every place where code for + returning from a function is generated (e.g. `FUNCTION_EPILOGUE'). + Although you have to write the definition of `FUNCTION_EPILOGUE' + as well, you have to define this macro to tell the compiler, that + the proper call to `__bb_trace_ret' is produced. + +`MACHINE_STATE_SAVE (ID)' + A C statement or compound statement to save all registers, which + may be clobbered by a function call, including condition codes. + The `asm' statement will be mostly likely needed to handle this + task. Local labels in the assembler code can be concatenated with + the string ID, to obtain a unique lable name. + + Registers or condition codes clobbered by `FUNCTION_PROLOGUE' or + `FUNCTION_EPILOGUE' must be saved in the macros + `FUNCTION_BLOCK_PROFILER', `FUNCTION_BLOCK_PROFILER_EXIT' and + `BLOCK_PROFILER' prior calling `__bb_init_trace_func', + `__bb_trace_ret' and `__bb_trace_func' respectively. + +`MACHINE_STATE_RESTORE (ID)' + A C statement or compound statement to restore all registers, + including condition codes, saved by `MACHINE_STATE_SAVE'. + + Registers or condition codes clobbered by `FUNCTION_PROLOGUE' or + `FUNCTION_EPILOGUE' must be restored in the macros + `FUNCTION_BLOCK_PROFILER', `FUNCTION_BLOCK_PROFILER_EXIT' and + `BLOCK_PROFILER' after calling `__bb_init_trace_func', + `__bb_trace_ret' and `__bb_trace_func' respectively. + +`BLOCK_PROFILER_CODE' + A C function or functions which are needed in the library to + support block profiling. + + +File: gcc.info, Node: Varargs, Next: Trampolines, Prev: Stack and Calling, Up: Target Macros + +Implementing the Varargs Macros +=============================== + + GNU CC comes with an implementation of `varargs.h' and `stdarg.h' +that work without change on machines that pass arguments on the stack. +Other machines require their own implementations of varargs, and the +two machine independent header files must have conditionals to include +it. + + ANSI `stdarg.h' differs from traditional `varargs.h' mainly in the +calling convention for `va_start'. The traditional implementation +takes just one argument, which is the variable in which to store the +argument pointer. The ANSI implementation of `va_start' takes an +additional second argument. The user is supposed to write the last +named argument of the function here. + + However, `va_start' should not use this argument. The way to find +the end of the named arguments is with the built-in functions described +below. + +`__builtin_saveregs ()' + Use this built-in function to save the argument registers in + memory so that the varargs mechanism can access them. Both ANSI + and traditional versions of `va_start' must use + `__builtin_saveregs', unless you use `SETUP_INCOMING_VARARGS' (see + below) instead. + + On some machines, `__builtin_saveregs' is open-coded under the + control of the macro `EXPAND_BUILTIN_SAVEREGS'. On other machines, + it calls a routine written in assembler language, found in + `libgcc2.c'. + + Code generated for the call to `__builtin_saveregs' appears at the + beginning of the function, as opposed to where the call to + `__builtin_saveregs' is written, regardless of what the code is. + This is because the registers must be saved before the function + starts to use them for its own purposes. + +`__builtin_args_info (CATEGORY)' + Use this built-in function to find the first anonymous arguments in + registers. + + In general, a machine may have several categories of registers + used for arguments, each for a particular category of data types. + (For example, on some machines, floating-point registers are used + for floating-point arguments while other arguments are passed in + the general registers.) To make non-varargs functions use the + proper calling convention, you have defined the `CUMULATIVE_ARGS' + data type to record how many registers in each category have been + used so far + + `__builtin_args_info' accesses the same data structure of type + `CUMULATIVE_ARGS' after the ordinary argument layout is finished + with it, with CATEGORY specifying which word to access. Thus, the + value indicates the first unused register in a given category. + + Normally, you would use `__builtin_args_info' in the implementation + of `va_start', accessing each category just once and storing the + value in the `va_list' object. This is because `va_list' will + have to update the values, and there is no way to alter the values + accessed by `__builtin_args_info'. + +`__builtin_next_arg (LASTARG)' + This is the equivalent of `__builtin_args_info', for stack + arguments. It returns the address of the first anonymous stack + argument, as type `void *'. If `ARGS_GROW_DOWNWARD', it returns + the address of the location above the first anonymous stack + argument. Use it in `va_start' to initialize the pointer for + fetching arguments from the stack. Also use it in `va_start' to + verify that the second parameter LASTARG is the last named argument + of the current function. + +`__builtin_classify_type (OBJECT)' + Since each machine has its own conventions for which data types are + passed in which kind of register, your implementation of `va_arg' + has to embody these conventions. The easiest way to categorize the + specified data type is to use `__builtin_classify_type' together + with `sizeof' and `__alignof__'. + + `__builtin_classify_type' ignores the value of OBJECT, considering + only its data type. It returns an integer describing what kind of + type that is--integer, floating, pointer, structure, and so on. + + The file `typeclass.h' defines an enumeration that you can use to + interpret the values of `__builtin_classify_type'. + + These machine description macros help implement varargs: + +`EXPAND_BUILTIN_SAVEREGS (ARGS)' + If defined, is a C expression that produces the machine-specific + code for a call to `__builtin_saveregs'. This code will be moved + to the very beginning of the function, before any parameter access + are made. The return value of this function should be an RTX that + contains the value to use as the return of `__builtin_saveregs'. + + The argument ARGS is a `tree_list' containing the arguments that + were passed to `__builtin_saveregs'. + + If this macro is not defined, the compiler will output an ordinary + call to the library function `__builtin_saveregs'. + +`SETUP_INCOMING_VARARGS (ARGS_SO_FAR, MODE, TYPE, PRETEND_ARGS_SIZE, SECOND_TIME)' + This macro offers an alternative to using `__builtin_saveregs' and + defining the macro `EXPAND_BUILTIN_SAVEREGS'. Use it to store the + anonymous register arguments into the stack so that all the + arguments appear to have been passed consecutively on the stack. + Once this is done, you can use the standard implementation of + varargs that works for machines that pass all their arguments on + the stack. + + The argument ARGS_SO_FAR is the `CUMULATIVE_ARGS' data structure, + containing the values that obtain after processing of the named + arguments. The arguments MODE and TYPE describe the last named + argument--its machine mode and its data type as a tree node. + + The macro implementation should do two things: first, push onto the + stack all the argument registers *not* used for the named + arguments, and second, store the size of the data thus pushed into + the `int'-valued variable whose name is supplied as the argument + PRETEND_ARGS_SIZE. The value that you store here will serve as + additional offset for setting up the stack frame. + + Because you must generate code to push the anonymous arguments at + compile time without knowing their data types, + `SETUP_INCOMING_VARARGS' is only useful on machines that have just + a single category of argument register and use it uniformly for + all data types. + + If the argument SECOND_TIME is nonzero, it means that the + arguments of the function are being analyzed for the second time. + This happens for an inline function, which is not actually + compiled until the end of the source file. The macro + `SETUP_INCOMING_VARARGS' should not generate any instructions in + this case. + +`STRICT_ARGUMENT_NAMING' + Define this macro to be a nonzero value if the location where a + function argument is passed depends on whether or not it is a + named argument. + + This macro controls how the NAMED argument to `FUNCTION_ARG' is + set for varargs and stdarg functions. If this macro returns a + nonzero value, the NAMED argument is always true for named + arguments, and false for unnamed arguments. If it returns a value + of zero, but `SETUP_INCOMING_VARARGS' is defined, then all + arguments are treated as named. Otherwise, all named arguments + except the last are treated as named. + + You need not define this macro if it always returns zero. + +`PRETEND_OUTGOING_VARARGS_NAMED' + If you need to conditionally change ABIs so that one works with + `SETUP_INCOMING_VARARGS', but the other works like neither + `SETUP_INCOMING_VARARGS' nor `STRICT_ARGUMENT_NAMING' was defined, + then define this macro to return nonzero if + `SETUP_INCOMING_VARARGS' is used, zero otherwise. Otherwise, you + should not define this macro. + diff --git a/usr/local/nachos/info/gcc.info-25 b/usr/local/nachos/info/gcc.info-25 new file mode 100644 index 0000000..540edec --- /dev/null +++ b/usr/local/nachos/info/gcc.info-25 @@ -0,0 +1,980 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Trampolines, Next: Library Calls, Prev: Varargs, Up: Target Macros + +Trampolines for Nested Functions +================================ + + A "trampoline" is a small piece of code that is created at run time +when the address of a nested function is taken. It normally resides on +the stack, in the stack frame of the containing function. These macros +tell GNU CC how to generate code to allocate and initialize a +trampoline. + + The instructions in the trampoline must do two things: load a +constant address into the static chain register, and jump to the real +address of the nested function. On CISC machines such as the m68k, +this requires two instructions, a move immediate and a jump. Then the +two addresses exist in the trampoline as word-long immediate operands. +On RISC machines, it is often necessary to load each address into a +register in two parts. Then pieces of each address form separate +immediate operands. + + The code generated to initialize the trampoline must store the +variable parts--the static chain value and the function address--into +the immediate operands of the instructions. On a CISC machine, this is +simply a matter of copying each address to a memory reference at the +proper offset from the start of the trampoline. On a RISC machine, it +may be necessary to take out pieces of the address and store them +separately. + +`TRAMPOLINE_TEMPLATE (FILE)' + A C statement to output, on the stream FILE, assembler code for a + block of data that contains the constant parts of a trampoline. + This code should not include a label--the label is taken care of + automatically. + + If you do not define this macro, it means no template is needed + for the target. Do not define this macro on systems where the + block move code to copy the trampoline into place would be larger + than the code to generate it on the spot. + +`TRAMPOLINE_SECTION' + The name of a subroutine to switch to the section in which the + trampoline template is to be placed (*note Sections::.). The + default is a value of `readonly_data_section', which places the + trampoline in the section containing read-only data. + +`TRAMPOLINE_SIZE' + A C expression for the size in bytes of the trampoline, as an + integer. + +`TRAMPOLINE_ALIGNMENT' + Alignment required for trampolines, in bits. + + If you don't define this macro, the value of `BIGGEST_ALIGNMENT' + is used for aligning trampolines. + +`INITIALIZE_TRAMPOLINE (ADDR, FNADDR, STATIC_CHAIN)' + A C statement to initialize the variable parts of a trampoline. + ADDR is an RTX for the address of the trampoline; FNADDR is an RTX + for the address of the nested function; STATIC_CHAIN is an RTX for + the static chain value that should be passed to the function when + it is called. + +`ALLOCATE_TRAMPOLINE (FP)' + A C expression to allocate run-time space for a trampoline. The + expression value should be an RTX representing a memory reference + to the space for the trampoline. + + If this macro is not defined, by default the trampoline is + allocated as a stack slot. This default is right for most + machines. The exceptions are machines where it is impossible to + execute instructions in the stack area. On such machines, you may + have to implement a separate stack, using this macro in + conjunction with `FUNCTION_PROLOGUE' and `FUNCTION_EPILOGUE'. + + FP points to a data structure, a `struct function', which + describes the compilation status of the immediate containing + function of the function which the trampoline is for. Normally + (when `ALLOCATE_TRAMPOLINE' is not defined), the stack slot for the + trampoline is in the stack frame of this containing function. + Other allocation strategies probably must do something analogous + with this information. + + Implementing trampolines is difficult on many machines because they +have separate instruction and data caches. Writing into a stack +location fails to clear the memory in the instruction cache, so when +the program jumps to that location, it executes the old contents. + + Here are two possible solutions. One is to clear the relevant parts +of the instruction cache whenever a trampoline is set up. The other is +to make all trampolines identical, by having them jump to a standard +subroutine. The former technique makes trampoline execution faster; the +latter makes initialization faster. + + To clear the instruction cache when a trampoline is initialized, +define the following macros which describe the shape of the cache. + +`INSN_CACHE_SIZE' + The total size in bytes of the cache. + +`INSN_CACHE_LINE_WIDTH' + The length in bytes of each cache line. The cache is divided into + cache lines which are disjoint slots, each holding a contiguous + chunk of data fetched from memory. Each time data is brought into + the cache, an entire line is read at once. The data loaded into a + cache line is always aligned on a boundary equal to the line size. + +`INSN_CACHE_DEPTH' + The number of alternative cache lines that can hold any particular + memory location. + + Alternatively, if the machine has system calls or instructions to +clear the instruction cache directly, you can define the following +macro. + +`CLEAR_INSN_CACHE (BEG, END)' + If defined, expands to a C expression clearing the *instruction + cache* in the specified interval. If it is not defined, and the + macro INSN_CACHE_SIZE is defined, some generic code is generated + to clear the cache. The definition of this macro would typically + be a series of `asm' statements. Both BEG and END are both pointer + expressions. + + To use a standard subroutine, define the following macro. In +addition, you must make sure that the instructions in a trampoline fill +an entire cache line with identical instructions, or else ensure that +the beginning of the trampoline code is always aligned at the same +point in its cache line. Look in `m68k.h' as a guide. + +`TRANSFER_FROM_TRAMPOLINE' + Define this macro if trampolines need a special subroutine to do + their work. The macro should expand to a series of `asm' + statements which will be compiled with GNU CC. They go in a + library function named `__transfer_from_trampoline'. + + If you need to avoid executing the ordinary prologue code of a + compiled C function when you jump to the subroutine, you can do so + by placing a special label of your own in the assembler code. Use + one `asm' statement to generate an assembler label, and another to + make the label global. Then trampolines can use that label to + jump directly to your special assembler code. + + +File: gcc.info, Node: Library Calls, Next: Addressing Modes, Prev: Trampolines, Up: Target Macros + +Implicit Calls to Library Routines +================================== + + Here is an explanation of implicit calls to library routines. + +`MULSI3_LIBCALL' + A C string constant giving the name of the function to call for + multiplication of one signed full-word by another. If you do not + define this macro, the default name is used, which is `__mulsi3', + a function defined in `libgcc.a'. + +`DIVSI3_LIBCALL' + A C string constant giving the name of the function to call for + division of one signed full-word by another. If you do not define + this macro, the default name is used, which is `__divsi3', a + function defined in `libgcc.a'. + +`UDIVSI3_LIBCALL' + A C string constant giving the name of the function to call for + division of one unsigned full-word by another. If you do not + define this macro, the default name is used, which is `__udivsi3', + a function defined in `libgcc.a'. + +`MODSI3_LIBCALL' + A C string constant giving the name of the function to call for the + remainder in division of one signed full-word by another. If you + do not define this macro, the default name is used, which is + `__modsi3', a function defined in `libgcc.a'. + +`UMODSI3_LIBCALL' + A C string constant giving the name of the function to call for the + remainder in division of one unsigned full-word by another. If + you do not define this macro, the default name is used, which is + `__umodsi3', a function defined in `libgcc.a'. + +`MULDI3_LIBCALL' + A C string constant giving the name of the function to call for + multiplication of one signed double-word by another. If you do not + define this macro, the default name is used, which is `__muldi3', + a function defined in `libgcc.a'. + +`DIVDI3_LIBCALL' + A C string constant giving the name of the function to call for + division of one signed double-word by another. If you do not + define this macro, the default name is used, which is `__divdi3', a + function defined in `libgcc.a'. + +`UDIVDI3_LIBCALL' + A C string constant giving the name of the function to call for + division of one unsigned full-word by another. If you do not + define this macro, the default name is used, which is `__udivdi3', + a function defined in `libgcc.a'. + +`MODDI3_LIBCALL' + A C string constant giving the name of the function to call for the + remainder in division of one signed double-word by another. If + you do not define this macro, the default name is used, which is + `__moddi3', a function defined in `libgcc.a'. + +`UMODDI3_LIBCALL' + A C string constant giving the name of the function to call for the + remainder in division of one unsigned full-word by another. If + you do not define this macro, the default name is used, which is + `__umoddi3', a function defined in `libgcc.a'. + +`INIT_TARGET_OPTABS' + Define this macro as a C statement that declares additional library + routines renames existing ones. `init_optabs' calls this macro + after initializing all the normal library routines. + +`TARGET_EDOM' + The value of `EDOM' on the target machine, as a C integer constant + expression. If you don't define this macro, GNU CC does not + attempt to deposit the value of `EDOM' into `errno' directly. + Look in `/usr/include/errno.h' to find the value of `EDOM' on your + system. + + If you do not define `TARGET_EDOM', then compiled code reports + domain errors by calling the library function and letting it + report the error. If mathematical functions on your system use + `matherr' when there is an error, then you should leave + `TARGET_EDOM' undefined so that `matherr' is used normally. + +`GEN_ERRNO_RTX' + Define this macro as a C expression to create an rtl expression + that refers to the global "variable" `errno'. (On certain systems, + `errno' may not actually be a variable.) If you don't define this + macro, a reasonable default is used. + +`TARGET_MEM_FUNCTIONS' + Define this macro if GNU CC should generate calls to the System V + (and ANSI C) library functions `memcpy' and `memset' rather than + the BSD functions `bcopy' and `bzero'. + +`LIBGCC_NEEDS_DOUBLE' + Define this macro if only `float' arguments cannot be passed to + library routines (so they must be converted to `double'). This + macro affects both how library calls are generated and how the + library routines in `libgcc1.c' accept their arguments. It is + useful on machines where floating and fixed point arguments are + passed differently, such as the i860. + +`FLOAT_ARG_TYPE' + Define this macro to override the type used by the library + routines to pick up arguments of type `float'. (By default, they + use a union of `float' and `int'.) + + The obvious choice would be `float'--but that won't work with + traditional C compilers that expect all arguments declared as + `float' to arrive as `double'. To avoid this conversion, the + library routines ask for the value as some other type and then + treat it as a `float'. + + On some systems, no other type will work for this. For these + systems, you must use `LIBGCC_NEEDS_DOUBLE' instead, to force + conversion of the values `double' before they are passed. + +`FLOATIFY (PASSED-VALUE)' + Define this macro to override the way library routines redesignate + a `float' argument as a `float' instead of the type it was passed + as. The default is an expression which takes the `float' field of + the union. + +`FLOAT_VALUE_TYPE' + Define this macro to override the type used by the library + routines to return values that ought to have type `float'. (By + default, they use `int'.) + + The obvious choice would be `float'--but that won't work with + traditional C compilers gratuitously convert values declared as + `float' into `double'. + +`INTIFY (FLOAT-VALUE)' + Define this macro to override the way the value of a + `float'-returning library routine should be packaged in order to + return it. These functions are actually declared to return type + `FLOAT_VALUE_TYPE' (normally `int'). + + These values can't be returned as type `float' because traditional + C compilers would gratuitously convert the value to a `double'. + + A local variable named `intify' is always available when the macro + `INTIFY' is used. It is a union of a `float' field named `f' and + a field named `i' whose type is `FLOAT_VALUE_TYPE' or `int'. + + If you don't define this macro, the default definition works by + copying the value through that union. + +`nongcc_SI_type' + Define this macro as the name of the data type corresponding to + `SImode' in the system's own C compiler. + + You need not define this macro if that type is `long int', as it + usually is. + +`nongcc_word_type' + Define this macro as the name of the data type corresponding to the + word_mode in the system's own C compiler. + + You need not define this macro if that type is `long int', as it + usually is. + +`perform_...' + Define these macros to supply explicit C statements to carry out + various arithmetic operations on types `float' and `double' in the + library routines in `libgcc1.c'. See that file for a full list of + these macros and their arguments. + + On most machines, you don't need to define any of these macros, + because the C compiler that comes with the system takes care of + doing them. + +`NEXT_OBJC_RUNTIME' + Define this macro to generate code for Objective C message sending + using the calling convention of the NeXT system. This calling + convention involves passing the object, the selector and the + method arguments all at once to the method-lookup library function. + + The default calling convention passes just the object and the + selector to the lookup function, which returns a pointer to the + method. + + +File: gcc.info, Node: Addressing Modes, Next: Condition Code, Prev: Library Calls, Up: Target Macros + +Addressing Modes +================ + + This is about addressing modes. + +`HAVE_POST_INCREMENT' + A C expression that is nonzero the machine supports post-increment + addressing. + +`HAVE_PRE_INCREMENT' +`HAVE_POST_DECREMENT' +`HAVE_PRE_DECREMENT' + Similar for other kinds of addressing. + +`CONSTANT_ADDRESS_P (X)' + A C expression that is 1 if the RTX X is a constant which is a + valid address. On most machines, this can be defined as + `CONSTANT_P (X)', but a few machines are more restrictive in which + constant addresses are supported. + + `CONSTANT_P' accepts integer-values expressions whose values are + not explicitly known, such as `symbol_ref', `label_ref', and + `high' expressions and `const' arithmetic expressions, in addition + to `const_int' and `const_double' expressions. + +`MAX_REGS_PER_ADDRESS' + A number, the maximum number of registers that can appear in a + valid memory address. Note that it is up to you to specify a + value equal to the maximum number that `GO_IF_LEGITIMATE_ADDRESS' + would ever accept. + +`GO_IF_LEGITIMATE_ADDRESS (MODE, X, LABEL)' + A C compound statement with a conditional `goto LABEL;' executed + if X (an RTX) is a legitimate memory address on the target machine + for a memory operand of mode MODE. + + It usually pays to define several simpler macros to serve as + subroutines for this one. Otherwise it may be too complicated to + understand. + + This macro must exist in two variants: a strict variant and a + non-strict one. The strict variant is used in the reload pass. It + must be defined so that any pseudo-register that has not been + allocated a hard register is considered a memory reference. In + contexts where some kind of register is required, a pseudo-register + with no hard register must be rejected. + + The non-strict variant is used in other passes. It must be + defined to accept all pseudo-registers in every context where some + kind of register is required. + + Compiler source files that want to use the strict variant of this + macro define the macro `REG_OK_STRICT'. You should use an `#ifdef + REG_OK_STRICT' conditional to define the strict variant in that + case and the non-strict variant otherwise. + + Subroutines to check for acceptable registers for various purposes + (one for base registers, one for index registers, and so on) are + typically among the subroutines used to define + `GO_IF_LEGITIMATE_ADDRESS'. Then only these subroutine macros + need have two variants; the higher levels of macros may be the + same whether strict or not. + + Normally, constant addresses which are the sum of a `symbol_ref' + and an integer are stored inside a `const' RTX to mark them as + constant. Therefore, there is no need to recognize such sums + specifically as legitimate addresses. Normally you would simply + recognize any `const' as legitimate. + + Usually `PRINT_OPERAND_ADDRESS' is not prepared to handle constant + sums that are not marked with `const'. It assumes that a naked + `plus' indicates indexing. If so, then you *must* reject such + naked constant sums as illegitimate addresses, so that none of + them will be given to `PRINT_OPERAND_ADDRESS'. + + On some machines, whether a symbolic address is legitimate depends + on the section that the address refers to. On these machines, + define the macro `ENCODE_SECTION_INFO' to store the information + into the `symbol_ref', and then check for it here. When you see a + `const', you will have to look inside it to find the `symbol_ref' + in order to determine the section. *Note Assembler Format::. + + The best way to modify the name string is by adding text to the + beginning, with suitable punctuation to prevent any ambiguity. + Allocate the new name in `saveable_obstack'. You will have to + modify `ASM_OUTPUT_LABELREF' to remove and decode the added text + and output the name accordingly, and define `STRIP_NAME_ENCODING' + to access the original name string. + + You can check the information stored here into the `symbol_ref' in + the definitions of the macros `GO_IF_LEGITIMATE_ADDRESS' and + `PRINT_OPERAND_ADDRESS'. + +`REG_OK_FOR_BASE_P (X)' + A C expression that is nonzero if X (assumed to be a `reg' RTX) is + valid for use as a base register. For hard registers, it should + always accept those which the hardware permits and reject the + others. Whether the macro accepts or rejects pseudo registers + must be controlled by `REG_OK_STRICT' as described above. This + usually requires two variant definitions, of which `REG_OK_STRICT' + controls the one actually used. + +`REG_MODE_OK_FOR_BASE_P (X, MODE)' + A C expression that is just like `REG_OK_FOR_BASE_P', except that + that expression may examine the mode of the memory reference in + MODE. You should define this macro if the mode of the memory + reference affects whether a register may be used as a base + register. If you define this macro, the compiler will use it + instead of `REG_OK_FOR_BASE_P'. + +`REG_OK_FOR_INDEX_P (X)' + A C expression that is nonzero if X (assumed to be a `reg' RTX) is + valid for use as an index register. + + The difference between an index register and a base register is + that the index register may be scaled. If an address involves the + sum of two registers, neither one of them scaled, then either one + may be labeled the "base" and the other the "index"; but whichever + labeling is used must fit the machine's constraints of which + registers may serve in each capacity. The compiler will try both + labelings, looking for one that is valid, and will reload one or + both registers only if neither labeling works. + +`LEGITIMIZE_ADDRESS (X, OLDX, MODE, WIN)' + A C compound statement that attempts to replace X with a valid + memory address for an operand of mode MODE. WIN will be a C + statement label elsewhere in the code; the macro definition may use + + GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN); + + to avoid further processing if the address has become legitimate. + + X will always be the result of a call to `break_out_memory_refs', + and OLDX will be the operand that was given to that function to + produce X. + + The code generated by this macro should not alter the substructure + of X. If it transforms X into a more legitimate form, it should + assign X (which will always be a C variable) a new value. + + It is not necessary for this macro to come up with a legitimate + address. The compiler has standard ways of doing so in all cases. + In fact, it is safe for this macro to do nothing. But often a + machine-dependent strategy can generate better code. + +`LEGITIMIZE_RELOAD_ADDRESS (X, MODE, OPNUM, TYPE, IND_LEVELS, WIN)' + A C compound statement that attempts to replace X, which is an + address that needs reloading, with a valid memory address for an + operand of mode MODE. WIN will be a C statement label elsewhere + in the code. It is not necessary to define this macro, but it + might be useful for performance reasons. + + For example, on the i386, it is sometimes possible to use a single + reload register instead of two by reloading a sum of two pseudo + registers into a register. On the other hand, for number of RISC + processors offsets are limited so that often an intermediate + address needs to be generated in order to address a stack slot. + By defining LEGITIMIZE_RELOAD_ADDRESS appropriately, the + intermediate addresses generated for adjacent some stack slots can + be made identical, and thus be shared. + + *Note*: This macro should be used with caution. It is necessary + to know something of how reload works in order to effectively use + this, and it is quite easy to produce macros that build in too + much knowledge of reload internals. + + *Note*: This macro must be able to reload an address created by a + previous invocation of this macro. If it fails to handle such + addresses then the compiler may generate incorrect code or abort. + + The macro definition should use `push_reload' to indicate parts + that need reloading; OPNUM, TYPE and IND_LEVELS are usually + suitable to be passed unaltered to `push_reload'. + + The code generated by this macro must not alter the substructure of + X. If it transforms X into a more legitimate form, it should + assign X (which will always be a C variable) a new value. This + also applies to parts that you change indirectly by calling + `push_reload'. + + The macro definition may use `strict_memory_address_p' to test if + the address has become legitimate. + + If you want to change only a part of X, one standard way of doing + this is to use `copy_rtx'. Note, however, that is unshares only a + single level of rtl. Thus, if the part to be changed is not at the + top level, you'll need to replace first the top leve It is not + necessary for this macro to come up with a legitimate address; + but often a machine-dependent strategy can generate better code. + +`GO_IF_MODE_DEPENDENT_ADDRESS (ADDR, LABEL)' + A C statement or compound statement with a conditional `goto + LABEL;' executed if memory address X (an RTX) can have different + meanings depending on the machine mode of the memory reference it + is used for or if the address is valid for some modes but not + others. + + Autoincrement and autodecrement addresses typically have + mode-dependent effects because the amount of the increment or + decrement is the size of the operand being addressed. Some + machines have other mode-dependent addresses. Many RISC machines + have no mode-dependent addresses. + + You may assume that ADDR is a valid address for the machine. + +`LEGITIMATE_CONSTANT_P (X)' + A C expression that is nonzero if X is a legitimate constant for + an immediate operand on the target machine. You can assume that X + satisfies `CONSTANT_P', so you need not check this. In fact, `1' + is a suitable definition for this macro on machines where anything + `CONSTANT_P' is valid. + + +File: gcc.info, Node: Condition Code, Next: Costs, Prev: Addressing Modes, Up: Target Macros + +Condition Code Status +===================== + + This describes the condition code status. + + The file `conditions.h' defines a variable `cc_status' to describe +how the condition code was computed (in case the interpretation of the +condition code depends on the instruction that it was set by). This +variable contains the RTL expressions on which the condition code is +currently based, and several standard flags. + + Sometimes additional machine-specific flags must be defined in the +machine description header file. It can also add additional +machine-specific information by defining `CC_STATUS_MDEP'. + +`CC_STATUS_MDEP' + C code for a data type which is used for declaring the `mdep' + component of `cc_status'. It defaults to `int'. + + This macro is not used on machines that do not use `cc0'. + +`CC_STATUS_MDEP_INIT' + A C expression to initialize the `mdep' field to "empty". The + default definition does nothing, since most machines don't use the + field anyway. If you want to use the field, you should probably + define this macro to initialize it. + + This macro is not used on machines that do not use `cc0'. + +`NOTICE_UPDATE_CC (EXP, INSN)' + A C compound statement to set the components of `cc_status' + appropriately for an insn INSN whose body is EXP. It is this + macro's responsibility to recognize insns that set the condition + code as a byproduct of other activity as well as those that + explicitly set `(cc0)'. + + This macro is not used on machines that do not use `cc0'. + + If there are insns that do not set the condition code but do alter + other machine registers, this macro must check to see whether they + invalidate the expressions that the condition code is recorded as + reflecting. For example, on the 68000, insns that store in address + registers do not set the condition code, which means that usually + `NOTICE_UPDATE_CC' can leave `cc_status' unaltered for such insns. + But suppose that the previous insn set the condition code based + on location `a4@(102)' and the current insn stores a new value in + `a4'. Although the condition code is not changed by this, it will + no longer be true that it reflects the contents of `a4@(102)'. + Therefore, `NOTICE_UPDATE_CC' must alter `cc_status' in this case + to say that nothing is known about the condition code value. + + The definition of `NOTICE_UPDATE_CC' must be prepared to deal with + the results of peephole optimization: insns whose patterns are + `parallel' RTXs containing various `reg', `mem' or constants which + are just the operands. The RTL structure of these insns is not + sufficient to indicate what the insns actually do. What + `NOTICE_UPDATE_CC' should do when it sees one is just to run + `CC_STATUS_INIT'. + + A possible definition of `NOTICE_UPDATE_CC' is to call a function + that looks at an attribute (*note Insn Attributes::.) named, for + example, `cc'. This avoids having detailed information about + patterns in two places, the `md' file and in `NOTICE_UPDATE_CC'. + +`EXTRA_CC_MODES' + A list of names to be used for additional modes for condition code + values in registers (*note Jump Patterns::.). These names are + added to `enum machine_mode' and all have class `MODE_CC'. By + convention, they should start with `CC' and end with `mode'. + + You should only define this macro if your machine does not use + `cc0' and only if additional modes are required. + +`EXTRA_CC_NAMES' + A list of C strings giving the names for the modes listed in + `EXTRA_CC_MODES'. For example, the Sparc defines this macro and + `EXTRA_CC_MODES' as + + #define EXTRA_CC_MODES CC_NOOVmode, CCFPmode, CCFPEmode + #define EXTRA_CC_NAMES "CC_NOOV", "CCFP", "CCFPE" + + This macro is not required if `EXTRA_CC_MODES' is not defined. + +`SELECT_CC_MODE (OP, X, Y)' + Returns a mode from class `MODE_CC' to be used when comparison + operation code OP is applied to rtx X and Y. For example, on the + Sparc, `SELECT_CC_MODE' is defined as (see *note Jump Patterns::. + for a description of the reason for this definition) + + #define SELECT_CC_MODE(OP,X,Y) \ + (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \ + ? ((OP == EQ || OP == NE) ? CCFPmode : CCFPEmode) \ + : ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS \ + || GET_CODE (X) == NEG) \ + ? CC_NOOVmode : CCmode)) + + You need not define this macro if `EXTRA_CC_MODES' is not defined. + +`CANONICALIZE_COMPARISON (CODE, OP0, OP1)' + One some machines not all possible comparisons are defined, but + you can convert an invalid comparison into a valid one. For + example, the Alpha does not have a `GT' comparison, but you can + use an `LT' comparison instead and swap the order of the operands. + + On such machines, define this macro to be a C statement to do any + required conversions. CODE is the initial comparison code and OP0 + and OP1 are the left and right operands of the comparison, + respectively. You should modify CODE, OP0, and OP1 as required. + + GNU CC will not assume that the comparison resulting from this + macro is valid but will see if the resulting insn matches a + pattern in the `md' file. + + You need not define this macro if it would never change the + comparison code or operands. + +`REVERSIBLE_CC_MODE (MODE)' + A C expression whose value is one if it is always safe to reverse a + comparison whose mode is MODE. If `SELECT_CC_MODE' can ever + return MODE for a floating-point inequality comparison, then + `REVERSIBLE_CC_MODE (MODE)' must be zero. + + You need not define this macro if it would always returns zero or + if the floating-point format is anything other than + `IEEE_FLOAT_FORMAT'. For example, here is the definition used on + the Sparc, where floating-point inequality comparisons are always + given `CCFPEmode': + + #define REVERSIBLE_CC_MODE(MODE) ((MODE) != CCFPEmode) + + +File: gcc.info, Node: Costs, Next: Sections, Prev: Condition Code, Up: Target Macros + +Describing Relative Costs of Operations +======================================= + + These macros let you describe the relative speed of various +operations on the target machine. + +`CONST_COSTS (X, CODE, OUTER_CODE)' + A part of a C `switch' statement that describes the relative costs + of constant RTL expressions. It must contain `case' labels for + expression codes `const_int', `const', `symbol_ref', `label_ref' + and `const_double'. Each case must ultimately reach a `return' + statement to return the relative cost of the use of that kind of + constant value in an expression. The cost may depend on the + precise value of the constant, which is available for examination + in X, and the rtx code of the expression in which it is contained, + found in OUTER_CODE. + + CODE is the expression code--redundant, since it can be obtained + with `GET_CODE (X)'. + +`RTX_COSTS (X, CODE, OUTER_CODE)' + Like `CONST_COSTS' but applies to nonconstant RTL expressions. + This can be used, for example, to indicate how costly a multiply + instruction is. In writing this macro, you can use the construct + `COSTS_N_INSNS (N)' to specify a cost equal to N fast + instructions. OUTER_CODE is the code of the expression in which X + is contained. + + This macro is optional; do not define it if the default cost + assumptions are adequate for the target machine. + +`DEFAULT_RTX_COSTS (X, CODE, OUTER_CODE)' + This macro, if defined, is called for any case not handled by the + `RTX_COSTS' or `CONST_COSTS' macros. This eliminates the need to + put case labels into the macro, but the code, or any functions it + calls, must assume that the RTL in X could be of any type that has + not already been handled. The arguments are the same as for + `RTX_COSTS', and the macro should execute a return statement giving + the cost of any RTL expressions that it can handle. The default + cost calculation is used for any RTL for which this macro does not + return a value. + + This macro is optional; do not define it if the default cost + assumptions are adequate for the target machine. + +`ADDRESS_COST (ADDRESS)' + An expression giving the cost of an addressing mode that contains + ADDRESS. If not defined, the cost is computed from the ADDRESS + expression and the `CONST_COSTS' values. + + For most CISC machines, the default cost is a good approximation + of the true cost of the addressing mode. However, on RISC + machines, all instructions normally have the same length and + execution time. Hence all addresses will have equal costs. + + In cases where more than one form of an address is known, the form + with the lowest cost will be used. If multiple forms have the + same, lowest, cost, the one that is the most complex will be used. + + For example, suppose an address that is equal to the sum of a + register and a constant is used twice in the same basic block. + When this macro is not defined, the address will be computed in a + register and memory references will be indirect through that + register. On machines where the cost of the addressing mode + containing the sum is no higher than that of a simple indirect + reference, this will produce an additional instruction and + possibly require an additional register. Proper specification of + this macro eliminates this overhead for such machines. + + Similar use of this macro is made in strength reduction of loops. + + ADDRESS need not be valid as an address. In such a case, the cost + is not relevant and can be any value; invalid addresses need not be + assigned a different cost. + + On machines where an address involving more than one register is as + cheap as an address computation involving only one register, + defining `ADDRESS_COST' to reflect this can cause two registers to + be live over a region of code where only one would have been if + `ADDRESS_COST' were not defined in that manner. This effect should + be considered in the definition of this macro. Equivalent costs + should probably only be given to addresses with different numbers + of registers on machines with lots of registers. + + This macro will normally either not be defined or be defined as a + constant. + +`REGISTER_MOVE_COST (FROM, TO)' + A C expression for the cost of moving data from a register in class + FROM to one in class TO. The classes are expressed using the + enumeration values such as `GENERAL_REGS'. A value of 2 is the + default; other values are interpreted relative to that. + + It is not required that the cost always equal 2 when FROM is the + same as TO; on some machines it is expensive to move between + registers if they are not general registers. + + If reload sees an insn consisting of a single `set' between two + hard registers, and if `REGISTER_MOVE_COST' applied to their + classes returns a value of 2, reload does not check to ensure that + the constraints of the insn are met. Setting a cost of other than + 2 will allow reload to verify that the constraints are met. You + should do this if the `movM' pattern's constraints do not allow + such copying. + +`MEMORY_MOVE_COST (MODE, CLASS, IN)' + A C expression for the cost of moving data of mode MODE between a + register of class CLASS and memory; IN is zero if the value is to + be written to memory, non-zero if it is to be read in. This cost + is relative to those in `REGISTER_MOVE_COST'. If moving between + registers and memory is more expensive than between two registers, + you should define this macro to express the relative cost. + + If you do not define this macro, GNU CC uses a default cost of 4 + plus the cost of copying via a secondary reload register, if one is + needed. If your machine requires a secondary reload register to + copy between memory and a register of CLASS but the reload + mechanism is more complex than copying via an intermediate, define + this macro to reflect the actual cost of the move. + + GNU CC defines the function `memory_move_secondary_cost' if + secondary reloads are needed. It computes the costs due to + copying via a secondary register. If your machine copies from + memory using a secondary register in the conventional way but the + default base value of 4 is not correct for your machine, define + this macro to add some other value to the result of that function. + The arguments to that function are the same as to this macro. + +`BRANCH_COST' + A C expression for the cost of a branch instruction. A value of 1 + is the default; other values are interpreted relative to that. + + Here are additional macros which do not specify precise relative +costs, but only that certain actions are more expensive than GNU CC +would ordinarily expect. + +`SLOW_BYTE_ACCESS' + Define this macro as a C expression which is nonzero if accessing + less than a word of memory (i.e. a `char' or a `short') is no + faster than accessing a word of memory, i.e., if such access + require more than one instruction or if there is no difference in + cost between byte and (aligned) word loads. + + When this macro is not defined, the compiler will access a field by + finding the smallest containing object; when it is defined, a + fullword load will be used if alignment permits. Unless bytes + accesses are faster than word accesses, using word accesses is + preferable since it may eliminate subsequent memory access if + subsequent accesses occur to other fields in the same word of the + structure, but to different bytes. + +`SLOW_ZERO_EXTEND' + Define this macro if zero-extension (of a `char' or `short' to an + `int') can be done faster if the destination is a register that is + known to be zero. + + If you define this macro, you must have instruction patterns that + recognize RTL structures like this: + + (set (strict_low_part (subreg:QI (reg:SI ...) 0)) ...) + + and likewise for `HImode'. + +`SLOW_UNALIGNED_ACCESS' + Define this macro to be the value 1 if unaligned accesses have a + cost many times greater than aligned accesses, for example if they + are emulated in a trap handler. + + When this macro is non-zero, the compiler will act as if + `STRICT_ALIGNMENT' were non-zero when generating code for block + moves. This can cause significantly more instructions to be + produced. Therefore, do not set this macro non-zero if unaligned + accesses only add a cycle or two to the time for a memory access. + + If the value of this macro is always zero, it need not be defined. + +`DONT_REDUCE_ADDR' + Define this macro to inhibit strength reduction of memory + addresses. (On some machines, such strength reduction seems to do + harm rather than good.) + +`MOVE_RATIO' + The threshold of number of scalar memory-to-memory move insns, + *below* which a sequence of insns should be generated instead of a + string move insn or a library call. Increasing the value will + always make code faster, but eventually incurs high cost in + increased code size. + + Note that on machines with no memory-to-memory move insns, this + macro denotes the corresponding number of memory-to-memory + *sequences*. + + If you don't define this, a reasonable default is used. + +`MOVE_BY_PIECES_P (SIZE, ALIGNMENT)' + A C expression used to determine whether `move_by_pieces' will be + used to copy a chunk of memory, or whether some other block move + mechanism will be used. Defaults to 1 if `move_by_pieces_ninsns' + returns less than `MOVE_RATIO'. + +`MOVE_MAX_PIECES' + A C expression used by `move_by_pieces' to determine the largest + unit a load or store used to copy memory is. Defaults to + `MOVE_MAX'. + +`USE_LOAD_POST_INCREMENT (MODE)' + A C expression used to determine whether a load postincrement is a + good thing to use for a given mode. Defaults to the value of + `HAVE_POST_INCREMENT'. + +`USE_LOAD_POST_DECREMENT (MODE)' + A C expression used to determine whether a load postdecrement is a + good thing to use for a given mode. Defaults to the value of + `HAVE_POST_DECREMENT'. + +`USE_LOAD_PRE_INCREMENT (MODE)' + A C expression used to determine whether a load preincrement is a + good thing to use for a given mode. Defaults to the value of + `HAVE_PRE_INCREMENT'. + +`USE_LOAD_PRE_DECREMENT (MODE)' + A C expression used to determine whether a load predecrement is a + good thing to use for a given mode. Defaults to the value of + `HAVE_PRE_DECREMENT'. + +`USE_STORE_POST_INCREMENT (MODE)' + A C expression used to determine whether a store postincrement is + a good thing to use for a given mode. Defaults to the value of + `HAVE_POST_INCREMENT'. + +`USE_STORE_POST_DECREMENT (MODE)' + A C expression used to determine whether a store postdeccrement is + a good thing to use for a given mode. Defaults to the value of + `HAVE_POST_DECREMENT'. + +`USE_STORE_PRE_INCREMENT (MODE)' + This macro is used to determine whether a store preincrement is a + good thing to use for a given mode. Defaults to the value of + `HAVE_PRE_INCREMENT'. + +`USE_STORE_PRE_DECREMENT (MODE)' + This macro is used to determine whether a store predecrement is a + good thing to use for a given mode. Defaults to the value of + `HAVE_PRE_DECREMENT'. + +`NO_FUNCTION_CSE' + Define this macro if it is as good or better to call a constant + function address than to call an address kept in a register. + +`NO_RECURSIVE_FUNCTION_CSE' + Define this macro if it is as good or better for a function to call + itself with an explicit address than to call an address kept in a + register. + +`ADJUST_COST (INSN, LINK, DEP_INSN, COST)' + A C statement (sans semicolon) to update the integer variable COST + based on the relationship between INSN that is dependent on + DEP_INSN through the dependence LINK. The default is to make no + adjustment to COST. This can be used for example to specify to + the scheduler that an output- or anti-dependence does not incur + the same cost as a data-dependence. + +`ADJUST_PRIORITY (INSN)' + A C statement (sans semicolon) to update the integer scheduling + priority `INSN_PRIORITY(INSN)'. Reduce the priority to execute + the INSN earlier, increase the priority to execute INSN later. + Do not define this macro if you do not need to adjust the + scheduling priorities of insns. + diff --git a/usr/local/nachos/info/gcc.info-26 b/usr/local/nachos/info/gcc.info-26 new file mode 100644 index 0000000..ba308a9 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-26 @@ -0,0 +1,1107 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Sections, Next: PIC, Prev: Costs, Up: Target Macros + +Dividing the Output into Sections (Texts, Data, ...) +==================================================== + + An object file is divided into sections containing different types of +data. In the most common case, there are three sections: the "text +section", which holds instructions and read-only data; the "data +section", which holds initialized writable data; and the "bss section", +which holds uninitialized data. Some systems have other kinds of +sections. + + The compiler must tell the assembler when to switch sections. These +macros control what commands to output to tell the assembler this. You +can also define additional sections. + +`TEXT_SECTION_ASM_OP' + A C expression whose value is a string containing the assembler + operation that should precede instructions and read-only data. + Normally `".text"' is right. + +`DATA_SECTION_ASM_OP' + A C expression whose value is a string containing the assembler + operation to identify the following data as writable initialized + data. Normally `".data"' is right. + +`SHARED_SECTION_ASM_OP' + If defined, a C expression whose value is a string containing the + assembler operation to identify the following data as shared data. + If not defined, `DATA_SECTION_ASM_OP' will be used. + +`BSS_SECTION_ASM_OP' + If defined, a C expression whose value is a string containing the + assembler operation to identify the following data as + uninitialized global data. If not defined, and neither + `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined, + uninitialized global data will be output in the data section if + `-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be + used. + +`SHARED_BSS_SECTION_ASM_OP' + If defined, a C expression whose value is a string containing the + assembler operation to identify the following data as + uninitialized global shared data. If not defined, and + `BSS_SECTION_ASM_OP' is, the latter will be used. + +`INIT_SECTION_ASM_OP' + If defined, a C expression whose value is a string containing the + assembler operation to identify the following data as + initialization code. If not defined, GNU CC will assume such a + section does not exist. + +`EXTRA_SECTIONS' + A list of names for sections other than the standard two, which are + `in_text' and `in_data'. You need not define this macro on a + system with no other sections (that GCC needs to use). + +`EXTRA_SECTION_FUNCTIONS' + One or more functions to be defined in `varasm.c'. These + functions should do jobs analogous to those of `text_section' and + `data_section', for your additional sections. Do not define this + macro if you do not define `EXTRA_SECTIONS'. + +`READONLY_DATA_SECTION' + On most machines, read-only variables, constants, and jump tables + are placed in the text section. If this is not the case on your + machine, this macro should be defined to be the name of a function + (either `data_section' or a function defined in `EXTRA_SECTIONS') + that switches to the section to be used for read-only items. + + If these items should be placed in the text section, this macro + should not be defined. + +`SELECT_SECTION (EXP, RELOC)' + A C statement or statements to switch to the appropriate section + for output of EXP. You can assume that EXP is either a `VAR_DECL' + node or a constant of some sort. RELOC indicates whether the + initial value of EXP requires link-time relocations. Select the + section by calling `text_section' or one of the alternatives for + other sections. + + Do not define this macro if you put all read-only variables and + constants in the read-only data section (usually the text section). + +`SELECT_RTX_SECTION (MODE, RTX)' + A C statement or statements to switch to the appropriate section + for output of RTX in mode MODE. You can assume that RTX is some + kind of constant in RTL. The argument MODE is redundant except in + the case of a `const_int' rtx. Select the section by calling + `text_section' or one of the alternatives for other sections. + + Do not define this macro if you put all constants in the read-only + data section. + +`JUMP_TABLES_IN_TEXT_SECTION' + Define this macro to be an expression with a non-zero value if jump + tables (for `tablejump' insns) should be output in the text + section, along with the assembler instructions. Otherwise, the + readonly data section is used. + + This macro is irrelevant if there is no separate readonly data + section. + +`ENCODE_SECTION_INFO (DECL)' + Define this macro if references to a symbol must be treated + differently depending on something about the variable or function + named by the symbol (such as what section it is in). + + The macro definition, if any, is executed immediately after the + rtl for DECL has been created and stored in `DECL_RTL (DECL)'. + The value of the rtl will be a `mem' whose address is a + `symbol_ref'. + + The usual thing for this macro to do is to record a flag in the + `symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified + name string in the `symbol_ref' (if one bit is not enough + information). + +`STRIP_NAME_ENCODING (VAR, SYM_NAME)' + Decode SYM_NAME and store the real name part in VAR, sans the + characters that encode section info. Define this macro if + `ENCODE_SECTION_INFO' alters the symbol's name string. + +`UNIQUE_SECTION_P (DECL)' + A C expression which evaluates to true if DECL should be placed + into a unique section for some target-specific reason. If you do + not define this macro, the default is `0'. Note that the flag + `-ffunction-sections' will also cause functions to be placed into + unique sections. + +`UNIQUE_SECTION (DECL, RELOC)' + A C statement to build up a unique section name, expressed as a + STRING_CST node, and assign it to `DECL_SECTION_NAME (DECL)'. + RELOC indicates whether the initial value of EXP requires + link-time relocations. If you do not define this macro, GNU CC + will use the symbol name prefixed by `.' as the section name. + + +File: gcc.info, Node: PIC, Next: Assembler Format, Prev: Sections, Up: Target Macros + +Position Independent Code +========================= + + This section describes macros that help implement generation of +position independent code. Simply defining these macros is not enough +to generate valid PIC; you must also add support to the macros +`GO_IF_LEGITIMATE_ADDRESS' and `PRINT_OPERAND_ADDRESS', as well as +`LEGITIMIZE_ADDRESS'. You must modify the definition of `movsi' to do +something appropriate when the source operand contains a symbolic +address. You may also need to alter the handling of switch statements +so that they use relative addresses. + +`PIC_OFFSET_TABLE_REGNUM' + The register number of the register used to address a table of + static data addresses in memory. In some cases this register is + defined by a processor's "application binary interface" (ABI). + When this macro is defined, RTL is generated for this register + once, as with the stack pointer and frame pointer registers. If + this macro is not defined, it is up to the machine-dependent files + to allocate such a register (if necessary). + +`PIC_OFFSET_TABLE_REG_CALL_CLOBBERED' + Define this macro if the register defined by + `PIC_OFFSET_TABLE_REGNUM' is clobbered by calls. Do not define + this macro if `PIC_OFFSET_TABLE_REGNUM' is not defined. + +`FINALIZE_PIC' + By generating position-independent code, when two different + programs (A and B) share a common library (libC.a), the text of + the library can be shared whether or not the library is linked at + the same address for both programs. In some of these + environments, position-independent code requires not only the use + of different addressing modes, but also special code to enable the + use of these addressing modes. + + The `FINALIZE_PIC' macro serves as a hook to emit these special + codes once the function is being compiled into assembly code, but + not before. (It is not done before, because in the case of + compiling an inline function, it would lead to multiple PIC + prologues being included in functions which used inline functions + and were compiled to assembly language.) + +`LEGITIMATE_PIC_OPERAND_P (X)' + A C expression that is nonzero if X is a legitimate immediate + operand on the target machine when generating position independent + code. You can assume that X satisfies `CONSTANT_P', so you need + not check this. You can also assume FLAG_PIC is true, so you need + not check it either. You need not define this macro if all + constants (including `SYMBOL_REF') can be immediate operands when + generating position independent code. + + +File: gcc.info, Node: Assembler Format, Next: Debugging Info, Prev: PIC, Up: Target Macros + +Defining the Output Assembler Language +====================================== + + This section describes macros whose principal purpose is to describe +how to write instructions in assembler language-rather than what the +instructions do. + +* Menu: + +* File Framework:: Structural information for the assembler file. +* Data Output:: Output of constants (numbers, strings, addresses). +* Uninitialized Data:: Output of uninitialized variables. +* Label Output:: Output and generation of labels. +* Initialization:: General principles of initialization + and termination routines. +* Macros for Initialization:: + Specific macros that control the handling of + initialization and termination routines. +* Instruction Output:: Output of actual instructions. +* Dispatch Tables:: Output of jump tables. +* Exception Region Output:: Output of exception region code. +* Alignment Output:: Pseudo ops for alignment and skipping data. + + +File: gcc.info, Node: File Framework, Next: Data Output, Up: Assembler Format + +The Overall Framework of an Assembler File +------------------------------------------ + + This describes the overall framework of an assembler file. + +`ASM_FILE_START (STREAM)' + A C expression which outputs to the stdio stream STREAM some + appropriate text to go at the start of an assembler file. + + Normally this macro is defined to output a line containing + `#NO_APP', which is a comment that has no effect on most + assemblers but tells the GNU assembler that it can save time by not + checking for certain assembler constructs. + + On systems that use SDB, it is necessary to output certain + commands; see `attasm.h'. + +`ASM_FILE_END (STREAM)' + A C expression which outputs to the stdio stream STREAM some + appropriate text to go at the end of an assembler file. + + If this macro is not defined, the default is to output nothing + special at the end of the file. Most systems don't require any + definition. + + On systems that use SDB, it is necessary to output certain + commands; see `attasm.h'. + +`ASM_IDENTIFY_GCC (FILE)' + A C statement to output assembler commands which will identify the + object file as having been compiled with GNU CC (or another GNU + compiler). + + If you don't define this macro, the string `gcc_compiled.:' is + output. This string is calculated to define a symbol which, on + BSD systems, will never be defined for any other reason. GDB + checks for the presence of this symbol when reading the symbol + table of an executable. + + On non-BSD systems, you must arrange communication with GDB in + some other fashion. If GDB is not used on your system, you can + define this macro with an empty body. + +`ASM_COMMENT_START' + A C string constant describing how to begin a comment in the target + assembler language. The compiler assumes that the comment will + end at the end of the line. + +`ASM_APP_ON' + A C string constant for text to be output before each `asm' + statement or group of consecutive ones. Normally this is + `"#APP"', which is a comment that has no effect on most assemblers + but tells the GNU assembler that it must check the lines that + follow for all valid assembler constructs. + +`ASM_APP_OFF' + A C string constant for text to be output after each `asm' + statement or group of consecutive ones. Normally this is + `"#NO_APP"', which tells the GNU assembler to resume making the + time-saving assumptions that are valid for ordinary compiler + output. + +`ASM_OUTPUT_SOURCE_FILENAME (STREAM, NAME)' + A C statement to output COFF information or DWARF debugging + information which indicates that filename NAME is the current + source file to the stdio stream STREAM. + + This macro need not be defined if the standard form of output for + the file format in use is appropriate. + +`OUTPUT_QUOTED_STRING (STREAM, NAME)' + A C statement to output the string STRING to the stdio stream + STREAM. If you do not call the function `output_quoted_string' in + your config files, GNU CC will only call it to output filenames to + the assembler source. So you can use it to canonicalize the format + of the filename using this macro. + +`ASM_OUTPUT_SOURCE_LINE (STREAM, LINE)' + A C statement to output DBX or SDB debugging information before + code for line number LINE of the current source file to the stdio + stream STREAM. + + This macro need not be defined if the standard form of debugging + information for the debugger in use is appropriate. + +`ASM_OUTPUT_IDENT (STREAM, STRING)' + A C statement to output something to the assembler file to handle a + `#ident' directive containing the text STRING. If this macro is + not defined, nothing is output for a `#ident' directive. + +`ASM_OUTPUT_SECTION_NAME (STREAM, DECL, NAME, RELOC)' + A C statement to output something to the assembler file to switch + to section NAME for object DECL which is either a `FUNCTION_DECL', + a `VAR_DECL' or `NULL_TREE'. RELOC indicates whether the initial + value of EXP requires link-time relocations. Some target formats + do not support arbitrary sections. Do not define this macro in + such cases. + + At present this macro is only used to support section attributes. + When this macro is undefined, section attributes are disabled. + +`OBJC_PROLOGUE' + A C statement to output any assembler statements which are + required to precede any Objective C object definitions or message + sending. The statement is executed only when compiling an + Objective C program. + + +File: gcc.info, Node: Data Output, Next: Uninitialized Data, Prev: File Framework, Up: Assembler Format + +Output of Data +-------------- + + This describes data output. + +`ASM_OUTPUT_LONG_DOUBLE (STREAM, VALUE)' +`ASM_OUTPUT_DOUBLE (STREAM, VALUE)' +`ASM_OUTPUT_FLOAT (STREAM, VALUE)' +`ASM_OUTPUT_THREE_QUARTER_FLOAT (STREAM, VALUE)' +`ASM_OUTPUT_SHORT_FLOAT (STREAM, VALUE)' +`ASM_OUTPUT_BYTE_FLOAT (STREAM, VALUE)' + A C statement to output to the stdio stream STREAM an assembler + instruction to assemble a floating-point constant of `TFmode', + `DFmode', `SFmode', `TQFmode', `HFmode', or `QFmode', + respectively, whose value is VALUE. VALUE will be a C expression + of type `REAL_VALUE_TYPE'. Macros such as + `REAL_VALUE_TO_TARGET_DOUBLE' are useful for writing these + definitions. + +`ASM_OUTPUT_QUADRUPLE_INT (STREAM, EXP)' +`ASM_OUTPUT_DOUBLE_INT (STREAM, EXP)' +`ASM_OUTPUT_INT (STREAM, EXP)' +`ASM_OUTPUT_SHORT (STREAM, EXP)' +`ASM_OUTPUT_CHAR (STREAM, EXP)' + A C statement to output to the stdio stream STREAM an assembler + instruction to assemble an integer of 16, 8, 4, 2 or 1 bytes, + respectively, whose value is VALUE. The argument EXP will be an + RTL expression which represents a constant value. Use + `output_addr_const (STREAM, EXP)' to output this value as an + assembler expression. + + For sizes larger than `UNITS_PER_WORD', if the action of a macro + would be identical to repeatedly calling the macro corresponding to + a size of `UNITS_PER_WORD', once for each word, you need not define + the macro. + +`ASM_OUTPUT_BYTE (STREAM, VALUE)' + A C statement to output to the stdio stream STREAM an assembler + instruction to assemble a single byte containing the number VALUE. + +`ASM_BYTE_OP' + A C string constant giving the pseudo-op to use for a sequence of + single-byte constants. If this macro is not defined, the default + is `"byte"'. + +`ASM_OUTPUT_ASCII (STREAM, PTR, LEN)' + A C statement to output to the stdio stream STREAM an assembler + instruction to assemble a string constant containing the LEN bytes + at PTR. PTR will be a C expression of type `char *' and LEN a C + expression of type `int'. + + If the assembler has a `.ascii' pseudo-op as found in the Berkeley + Unix assembler, do not define the macro `ASM_OUTPUT_ASCII'. + +`CONSTANT_POOL_BEFORE_FUNCTION' + You may define this macro as a C expression. You should define the + expression to have a non-zero value if GNU CC should output the + constant pool for a function before the code for the function, or + a zero value if GNU CC should output the constant pool after the + function. If you do not define this macro, the usual case, GNU CC + will output the constant pool before the function. + +`ASM_OUTPUT_POOL_PROLOGUE (FILE FUNNAME FUNDECL SIZE)' + A C statement to output assembler commands to define the start of + the constant pool for a function. FUNNAME is a string giving the + name of the function. Should the return type of the function be + required, it can be obtained via FUNDECL. SIZE is the size, in + bytes, of the constant pool that will be written immediately after + this call. + + If no constant-pool prefix is required, the usual case, this macro + need not be defined. + +`ASM_OUTPUT_SPECIAL_POOL_ENTRY (FILE, X, MODE, ALIGN, LABELNO, JUMPTO)' + A C statement (with or without semicolon) to output a constant in + the constant pool, if it needs special treatment. (This macro + need not do anything for RTL expressions that can be output + normally.) + + The argument FILE is the standard I/O stream to output the + assembler code on. X is the RTL expression for the constant to + output, and MODE is the machine mode (in case X is a `const_int'). + ALIGN is the required alignment for the value X; you should + output an assembler directive to force this much alignment. + + The argument LABELNO is a number to use in an internal label for + the address of this pool entry. The definition of this macro is + responsible for outputting the label definition at the proper + place. Here is how to do this: + + ASM_OUTPUT_INTERNAL_LABEL (FILE, "LC", LABELNO); + + When you output a pool entry specially, you should end with a + `goto' to the label JUMPTO. This will prevent the same pool entry + from being output a second time in the usual manner. + + You need not define this macro if it would do nothing. + +`CONSTANT_AFTER_FUNCTION_P (EXP)' + Define this macro as a C expression which is nonzero if the + constant EXP, of type `tree', should be output after the code for a + function. The compiler will normally output all constants before + the function; you need not define this macro if this is OK. + +`ASM_OUTPUT_POOL_EPILOGUE (FILE FUNNAME FUNDECL SIZE)' + A C statement to output assembler commands to at the end of the + constant pool for a function. FUNNAME is a string giving the name + of the function. Should the return type of the function be + required, you can obtain it via FUNDECL. SIZE is the size, in + bytes, of the constant pool that GNU CC wrote immediately before + this call. + + If no constant-pool epilogue is required, the usual case, you need + not define this macro. + +`IS_ASM_LOGICAL_LINE_SEPARATOR (C)' + Define this macro as a C expression which is nonzero if C is used + as a logical line separator by the assembler. + + If you do not define this macro, the default is that only the + character `;' is treated as a logical line separator. + +`ASM_OPEN_PAREN' +`ASM_CLOSE_PAREN' + These macros are defined as C string constant, describing the + syntax in the assembler for grouping arithmetic expressions. The + following definitions are correct for most assemblers: + + #define ASM_OPEN_PAREN "(" + #define ASM_CLOSE_PAREN ")" + + These macros are provided by `real.h' for writing the definitions of +`ASM_OUTPUT_DOUBLE' and the like: + +`REAL_VALUE_TO_TARGET_SINGLE (X, L)' +`REAL_VALUE_TO_TARGET_DOUBLE (X, L)' +`REAL_VALUE_TO_TARGET_LONG_DOUBLE (X, L)' + These translate X, of type `REAL_VALUE_TYPE', to the target's + floating point representation, and store its bit pattern in the + array of `long int' whose address is L. The number of elements in + the output array is determined by the size of the desired target + floating point data type: 32 bits of it go in each `long int' array + element. Each array element holds 32 bits of the result, even if + `long int' is wider than 32 bits on the host machine. + + The array element values are designed so that you can print them + out using `fprintf' in the order they should appear in the target + machine's memory. + +`REAL_VALUE_TO_DECIMAL (X, FORMAT, STRING)' + This macro converts X, of type `REAL_VALUE_TYPE', to a decimal + number and stores it as a string into STRING. You must pass, as + STRING, the address of a long enough block of space to hold the + result. + + The argument FORMAT is a `printf'-specification that serves as a + suggestion for how to format the output string. + + +File: gcc.info, Node: Uninitialized Data, Next: Label Output, Prev: Data Output, Up: Assembler Format + +Output of Uninitialized Variables +--------------------------------- + + Each of the macros in this section is used to do the whole job of +outputting a single uninitialized variable. + +`ASM_OUTPUT_COMMON (STREAM, NAME, SIZE, ROUNDED)' + A C statement (sans semicolon) to output to the stdio stream + STREAM the assembler definition of a common-label named NAME whose + size is SIZE bytes. The variable ROUNDED is the size rounded up + to whatever alignment the caller wants. + + Use the expression `assemble_name (STREAM, NAME)' to output the + name itself; before and after that, output the additional + assembler syntax for defining the name, and a newline. + + This macro controls how the assembler definitions of uninitialized + common global variables are output. + +`ASM_OUTPUT_ALIGNED_COMMON (STREAM, NAME, SIZE, ALIGNMENT)' + Like `ASM_OUTPUT_COMMON' except takes the required alignment as a + separate, explicit argument. If you define this macro, it is used + in place of `ASM_OUTPUT_COMMON', and gives you more flexibility in + handling the required alignment of the variable. The alignment is + specified as the number of bits. + +`ASM_OUTPUT_ALIGNED_DECL_COMMON (STREAM, DECL, NAME, SIZE, ALIGNMENT)' + Like `ASM_OUTPUT_ALIGNED_COMMON' except that DECL of the variable + to be output, if there is one, or `NULL_TREE' if there is not + corresponding variable. If you define this macro, GNU CC wil use + it in place of both `ASM_OUTPUT_COMMON' and + `ASM_OUTPUT_ALIGNED_COMMON'. Define this macro when you need to + see the variable's decl in order to chose what to output. + +`ASM_OUTPUT_SHARED_COMMON (STREAM, NAME, SIZE, ROUNDED)' + If defined, it is similar to `ASM_OUTPUT_COMMON', except that it + is used when NAME is shared. If not defined, `ASM_OUTPUT_COMMON' + will be used. + +`ASM_OUTPUT_BSS (STREAM, DECL, NAME, SIZE, ROUNDED)' + A C statement (sans semicolon) to output to the stdio stream + STREAM the assembler definition of uninitialized global DECL named + NAME whose size is SIZE bytes. The variable ROUNDED is the size + rounded up to whatever alignment the caller wants. + + Try to use function `asm_output_bss' defined in `varasm.c' when + defining this macro. If unable, use the expression `assemble_name + (STREAM, NAME)' to output the name itself; before and after that, + output the additional assembler syntax for defining the name, and + a newline. + + This macro controls how the assembler definitions of uninitialized + global variables are output. This macro exists to properly + support languages like `c++' which do not have `common' data. + However, this macro currently is not defined for all targets. If + this macro and `ASM_OUTPUT_ALIGNED_BSS' are not defined then + `ASM_OUTPUT_COMMON' or `ASM_OUTPUT_ALIGNED_COMMON' or + `ASM_OUTPUT_ALIGNED_DECL_COMMON' is used. + +`ASM_OUTPUT_ALIGNED_BSS (STREAM, DECL, NAME, SIZE, ALIGNMENT)' + Like `ASM_OUTPUT_BSS' except takes the required alignment as a + separate, explicit argument. If you define this macro, it is used + in place of `ASM_OUTPUT_BSS', and gives you more flexibility in + handling the required alignment of the variable. The alignment is + specified as the number of bits. + + Try to use function `asm_output_aligned_bss' defined in file + `varasm.c' when defining this macro. + +`ASM_OUTPUT_SHARED_BSS (STREAM, DECL, NAME, SIZE, ROUNDED)' + If defined, it is similar to `ASM_OUTPUT_BSS', except that it is + used when NAME is shared. If not defined, `ASM_OUTPUT_BSS' will + be used. + +`ASM_OUTPUT_LOCAL (STREAM, NAME, SIZE, ROUNDED)' + A C statement (sans semicolon) to output to the stdio stream + STREAM the assembler definition of a local-common-label named NAME + whose size is SIZE bytes. The variable ROUNDED is the size + rounded up to whatever alignment the caller wants. + + Use the expression `assemble_name (STREAM, NAME)' to output the + name itself; before and after that, output the additional + assembler syntax for defining the name, and a newline. + + This macro controls how the assembler definitions of uninitialized + static variables are output. + +`ASM_OUTPUT_ALIGNED_LOCAL (STREAM, NAME, SIZE, ALIGNMENT)' + Like `ASM_OUTPUT_LOCAL' except takes the required alignment as a + separate, explicit argument. If you define this macro, it is used + in place of `ASM_OUTPUT_LOCAL', and gives you more flexibility in + handling the required alignment of the variable. The alignment is + specified as the number of bits. + +`ASM_OUTPUT_ALIGNED_DECL_LOCAL (STREAM, DECL, NAME, SIZE, ALIGNMENT)' + Like `ASM_OUTPUT_ALIGNED_DECL' except that DECL of the variable to + be output, if there is one, or `NULL_TREE' if there is not + corresponding variable. If you define this macro, GNU CC wil use + it in place of both `ASM_OUTPUT_DECL' and + `ASM_OUTPUT_ALIGNED_DECL'. Define this macro when you need to see + the variable's decl in order to chose what to output. + +`ASM_OUTPUT_SHARED_LOCAL (STREAM, NAME, SIZE, ROUNDED)' + If defined, it is similar to `ASM_OUTPUT_LOCAL', except that it is + used when NAME is shared. If not defined, `ASM_OUTPUT_LOCAL' will + be used. + + +File: gcc.info, Node: Label Output, Next: Initialization, Prev: Uninitialized Data, Up: Assembler Format + +Output and Generation of Labels +------------------------------- + + This is about outputting labels. + +`ASM_OUTPUT_LABEL (STREAM, NAME)' + A C statement (sans semicolon) to output to the stdio stream + STREAM the assembler definition of a label named NAME. Use the + expression `assemble_name (STREAM, NAME)' to output the name + itself; before and after that, output the additional assembler + syntax for defining the name, and a newline. + +`ASM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL)' + A C statement (sans semicolon) to output to the stdio stream + STREAM any text necessary for declaring the name NAME of a + function which is being defined. This macro is responsible for + outputting the label definition (perhaps using + `ASM_OUTPUT_LABEL'). The argument DECL is the `FUNCTION_DECL' + tree node representing the function. + + If this macro is not defined, then the function name is defined in + the usual manner as a label (by means of `ASM_OUTPUT_LABEL'). + +`ASM_DECLARE_FUNCTION_SIZE (STREAM, NAME, DECL)' + A C statement (sans semicolon) to output to the stdio stream + STREAM any text necessary for declaring the size of a function + which is being defined. The argument NAME is the name of the + function. The argument DECL is the `FUNCTION_DECL' tree node + representing the function. + + If this macro is not defined, then the function size is not + defined. + +`ASM_DECLARE_OBJECT_NAME (STREAM, NAME, DECL)' + A C statement (sans semicolon) to output to the stdio stream + STREAM any text necessary for declaring the name NAME of an + initialized variable which is being defined. This macro must + output the label definition (perhaps using `ASM_OUTPUT_LABEL'). + The argument DECL is the `VAR_DECL' tree node representing the + variable. + + If this macro is not defined, then the variable name is defined in + the usual manner as a label (by means of `ASM_OUTPUT_LABEL'). + +`ASM_FINISH_DECLARE_OBJECT (STREAM, DECL, TOPLEVEL, ATEND)' + A C statement (sans semicolon) to finish up declaring a variable + name once the compiler has processed its initializer fully and + thus has had a chance to determine the size of an array when + controlled by an initializer. This is used on systems where it's + necessary to declare something about the size of the object. + + If you don't define this macro, that is equivalent to defining it + to do nothing. + +`ASM_GLOBALIZE_LABEL (STREAM, NAME)' + A C statement (sans semicolon) to output to the stdio stream + STREAM some commands that will make the label NAME global; that + is, available for reference from other files. Use the expression + `assemble_name (STREAM, NAME)' to output the name itself; before + and after that, output the additional assembler syntax for making + that name global, and a newline. + +`ASM_WEAKEN_LABEL' + A C statement (sans semicolon) to output to the stdio stream + STREAM some commands that will make the label NAME weak; that is, + available for reference from other files but only used if no other + definition is available. Use the expression `assemble_name + (STREAM, NAME)' to output the name itself; before and after that, + output the additional assembler syntax for making that name weak, + and a newline. + + If you don't define this macro, GNU CC will not support weak + symbols and you should not define the `SUPPORTS_WEAK' macro. + +`SUPPORTS_WEAK' + A C expression which evaluates to true if the target supports weak + symbols. + + If you don't define this macro, `defaults.h' provides a default + definition. If `ASM_WEAKEN_LABEL' is defined, the default + definition is `1'; otherwise, it is `0'. Define this macro if you + want to control weak symbol support with a compiler flag such as + `-melf'. + +`MAKE_DECL_ONE_ONLY' + A C statement (sans semicolon) to mark DECL to be emitted as a + public symbol such that extra copies in multiple translation units + will be discarded by the linker. Define this macro if your object + file format provides support for this concept, such as the `COMDAT' + section flags in the Microsoft Windows PE/COFF format, and this + support requires changes to DECL, such as putting it in a separate + section. + +`SUPPORTS_ONE_ONLY' + A C expression which evaluates to true if the target supports + one-only semantics. + + If you don't define this macro, `varasm.c' provides a default + definition. If `MAKE_DECL_ONE_ONLY' is defined, the default + definition is `1'; otherwise, it is `0'. Define this macro if you + want to control one-only symbol support with a compiler flag, or if + setting the `DECL_ONE_ONLY' flag is enough to mark a declaration to + be emitted as one-only. + +`ASM_OUTPUT_EXTERNAL (STREAM, DECL, NAME)' + A C statement (sans semicolon) to output to the stdio stream + STREAM any text necessary for declaring the name of an external + symbol named NAME which is referenced in this compilation but not + defined. The value of DECL is the tree node for the declaration. + + This macro need not be defined if it does not need to output + anything. The GNU assembler and most Unix assemblers don't + require anything. + +`ASM_OUTPUT_EXTERNAL_LIBCALL (STREAM, SYMREF)' + A C statement (sans semicolon) to output on STREAM an assembler + pseudo-op to declare a library function name external. The name + of the library function is given by SYMREF, which has type `rtx' + and is a `symbol_ref'. + + This macro need not be defined if it does not need to output + anything. The GNU assembler and most Unix assemblers don't + require anything. + +`ASM_OUTPUT_LABELREF (STREAM, NAME)' + A C statement (sans semicolon) to output to the stdio stream + STREAM a reference in assembler syntax to a label named NAME. + This should add `_' to the front of the name, if that is customary + on your operating system, as it is in most Berkeley Unix systems. + This macro is used in `assemble_name'. + +`ASM_OUTPUT_INTERNAL_LABEL (STREAM, PREFIX, NUM)' + A C statement to output to the stdio stream STREAM a label whose + name is made from the string PREFIX and the number NUM. + + It is absolutely essential that these labels be distinct from the + labels used for user-level functions and variables. Otherwise, + certain programs will have name conflicts with internal labels. + + It is desirable to exclude internal labels from the symbol table + of the object file. Most assemblers have a naming convention for + labels that should be excluded; on many systems, the letter `L' at + the beginning of a label has this effect. You should find out what + convention your system uses, and follow it. + + The usual definition of this macro is as follows: + + fprintf (STREAM, "L%s%d:\n", PREFIX, NUM) + +`ASM_GENERATE_INTERNAL_LABEL (STRING, PREFIX, NUM)' + A C statement to store into the string STRING a label whose name + is made from the string PREFIX and the number NUM. + + This string, when output subsequently by `assemble_name', should + produce the output that `ASM_OUTPUT_INTERNAL_LABEL' would produce + with the same PREFIX and NUM. + + If the string begins with `*', then `assemble_name' will output + the rest of the string unchanged. It is often convenient for + `ASM_GENERATE_INTERNAL_LABEL' to use `*' in this way. If the + string doesn't start with `*', then `ASM_OUTPUT_LABELREF' gets to + output the string, and may change it. (Of course, + `ASM_OUTPUT_LABELREF' is also part of your machine description, so + you should know what it does on your machine.) + +`ASM_FORMAT_PRIVATE_NAME (OUTVAR, NAME, NUMBER)' + A C expression to assign to OUTVAR (which is a variable of type + `char *') a newly allocated string made from the string NAME and + the number NUMBER, with some suitable punctuation added. Use + `alloca' to get space for the string. + + The string will be used as an argument to `ASM_OUTPUT_LABELREF' to + produce an assembler label for an internal static variable whose + name is NAME. Therefore, the string must be such as to result in + valid assembler code. The argument NUMBER is different each time + this macro is executed; it prevents conflicts between + similarly-named internal static variables in different scopes. + + Ideally this string should not be a valid C identifier, to prevent + any conflict with the user's own symbols. Most assemblers allow + periods or percent signs in assembler symbols; putting at least + one of these between the name and the number will suffice. + +`ASM_OUTPUT_DEF (STREAM, NAME, VALUE)' + A C statement to output to the stdio stream STREAM assembler code + which defines (equates) the symbol NAME to have the value VALUE. + + If SET_ASM_OP is defined, a default definition is provided which is + correct for most systems. + +`ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL (STREAM, SYMBOL, HIGH, LOW)' + A C statement to output to the stdio stream STREAM assembler code + which defines (equates) the symbol SYMBOL to have a value equal to + the difference of the two symbols HIGH and LOW, i.e. HIGH minus + LOW. GNU CC guarantees that the symbols HIGH and LOW are already + known by the assembler so that the difference resolves into a + constant. + + If SET_ASM_OP is defined, a default definition is provided which is + correct for most systems. + +`ASM_OUTPUT_WEAK_ALIAS (STREAM, NAME, VALUE)' + A C statement to output to the stdio stream STREAM assembler code + which defines (equates) the weak symbol NAME to have the value + VALUE. + + Define this macro if the target only supports weak aliases; define + ASM_OUTPUT_DEF instead if possible. + +`OBJC_GEN_METHOD_LABEL (BUF, IS_INST, CLASS_NAME, CAT_NAME, SEL_NAME)' + Define this macro to override the default assembler names used for + Objective C methods. + + The default name is a unique method number followed by the name of + the class (e.g. `_1_Foo'). For methods in categories, the name of + the category is also included in the assembler name (e.g. + `_1_Foo_Bar'). + + These names are safe on most systems, but make debugging difficult + since the method's selector is not present in the name. + Therefore, particular systems define other ways of computing names. + + BUF is an expression of type `char *' which gives you a buffer in + which to store the name; its length is as long as CLASS_NAME, + CAT_NAME and SEL_NAME put together, plus 50 characters extra. + + The argument IS_INST specifies whether the method is an instance + method or a class method; CLASS_NAME is the name of the class; + CAT_NAME is the name of the category (or NULL if the method is not + in a category); and SEL_NAME is the name of the selector. + + On systems where the assembler can handle quoted names, you can + use this macro to provide more human-readable names. + + +File: gcc.info, Node: Initialization, Next: Macros for Initialization, Prev: Label Output, Up: Assembler Format + +How Initialization Functions Are Handled +---------------------------------------- + + The compiled code for certain languages includes "constructors" +(also called "initialization routines")--functions to initialize data +in the program when the program is started. These functions need to be +called before the program is "started"--that is to say, before `main' +is called. + + Compiling some languages generates "destructors" (also called +"termination routines") that should be called when the program +terminates. + + To make the initialization and termination functions work, the +compiler must output something in the assembler code to cause those +functions to be called at the appropriate time. When you port the +compiler to a new system, you need to specify how to do this. + + There are two major ways that GCC currently supports the execution of +initialization and termination functions. Each way has two variants. +Much of the structure is common to all four variations. + + The linker must build two lists of these functions--a list of +initialization functions, called `__CTOR_LIST__', and a list of +termination functions, called `__DTOR_LIST__'. + + Each list always begins with an ignored function pointer (which may +hold 0, -1, or a count of the function pointers after it, depending on +the environment). This is followed by a series of zero or more function +pointers to constructors (or destructors), followed by a function +pointer containing zero. + + Depending on the operating system and its executable file format, +either `crtstuff.c' or `libgcc2.c' traverses these lists at startup +time and exit time. Constructors are called in reverse order of the +list; destructors in forward order. + + The best way to handle static constructors works only for object file +formats which provide arbitrarily-named sections. A section is set +aside for a list of constructors, and another for a list of destructors. +Traditionally these are called `.ctors' and `.dtors'. Each object file +that defines an initialization function also puts a word in the +constructor section to point to that function. The linker accumulates +all these words into one contiguous `.ctors' section. Termination +functions are handled similarly. + + To use this method, you need appropriate definitions of the macros +`ASM_OUTPUT_CONSTRUCTOR' and `ASM_OUTPUT_DESTRUCTOR'. Usually you can +get them by including `svr4.h'. + + When arbitrary sections are available, there are two variants, +depending upon how the code in `crtstuff.c' is called. On systems that +support an "init" section which is executed at program startup, parts +of `crtstuff.c' are compiled into that section. The program is linked +by the `gcc' driver like this: + + ld -o OUTPUT_FILE crtbegin.o ... crtend.o -lgcc + + The head of a function (`__do_global_ctors') appears in the init +section of `crtbegin.o'; the remainder of the function appears in the +init section of `crtend.o'. The linker will pull these two parts of +the section together, making a whole function. If any of the user's +object files linked into the middle of it contribute code, then that +code will be executed as part of the body of `__do_global_ctors'. + + To use this variant, you must define the `INIT_SECTION_ASM_OP' macro +properly. + + If no init section is available, do not define +`INIT_SECTION_ASM_OP'. Then `__do_global_ctors' is built into the text +section like all other functions, and resides in `libgcc.a'. When GCC +compiles any function called `main', it inserts a procedure call to +`__main' as the first executable code after the function prologue. The +`__main' function, also defined in `libgcc2.c', simply calls +`__do_global_ctors'. + + In file formats that don't support arbitrary sections, there are +again two variants. In the simplest variant, the GNU linker (GNU `ld') +and an `a.out' format must be used. In this case, +`ASM_OUTPUT_CONSTRUCTOR' is defined to produce a `.stabs' entry of type +`N_SETT', referencing the name `__CTOR_LIST__', and with the address of +the void function containing the initialization code as its value. The +GNU linker recognizes this as a request to add the value to a "set"; +the values are accumulated, and are eventually placed in the executable +as a vector in the format described above, with a leading (ignored) +count and a trailing zero element. `ASM_OUTPUT_DESTRUCTOR' is handled +similarly. Since no init section is available, the absence of +`INIT_SECTION_ASM_OP' causes the compilation of `main' to call `__main' +as above, starting the initialization process. + + The last variant uses neither arbitrary sections nor the GNU linker. +This is preferable when you want to do dynamic linking and when using +file formats which the GNU linker does not support, such as `ECOFF'. In +this case, `ASM_OUTPUT_CONSTRUCTOR' does not produce an `N_SETT' +symbol; initialization and termination functions are recognized simply +by their names. This requires an extra program in the linkage step, +called `collect2'. This program pretends to be the linker, for use +with GNU CC; it does its job by running the ordinary linker, but also +arranges to include the vectors of initialization and termination +functions. These functions are called via `__main' as described above. + + Choosing among these configuration options has been simplified by a +set of operating-system-dependent files in the `config' subdirectory. +These files define all of the relevant parameters. Usually it is +sufficient to include one into your specific machine-dependent +configuration file. These files are: + +`aoutos.h' + For operating systems using the `a.out' format. + +`next.h' + For operating systems using the `MachO' format. + +`svr3.h' + For System V Release 3 and similar systems using `COFF' format. + +`svr4.h' + For System V Release 4 and similar systems using `ELF' format. + +`vms.h' + For the VMS operating system. + + The following section describes the specific macros that control and +customize the handling of initialization and termination functions. + + +File: gcc.info, Node: Macros for Initialization, Next: Instruction Output, Prev: Initialization, Up: Assembler Format + +Macros Controlling Initialization Routines +------------------------------------------ + + Here are the macros that control how the compiler handles +initialization and termination functions: + +`INIT_SECTION_ASM_OP' + If defined, a C string constant for the assembler operation to + identify the following data as initialization code. If not + defined, GNU CC will assume such a section does not exist. When + you are using special sections for initialization and termination + functions, this macro also controls how `crtstuff.c' and + `libgcc2.c' arrange to run the initialization functions. + +`HAS_INIT_SECTION' + If defined, `main' will not call `__main' as described above. + This macro should be defined for systems that control the contents + of the init section on a symbol-by-symbol basis, such as OSF/1, + and should not be defined explicitly for systems that support + `INIT_SECTION_ASM_OP'. + +`LD_INIT_SWITCH' + If defined, a C string constant for a switch that tells the linker + that the following symbol is an initialization routine. + +`LD_FINI_SWITCH' + If defined, a C string constant for a switch that tells the linker + that the following symbol is a finalization routine. + +`INVOKE__main' + If defined, `main' will call `__main' despite the presence of + `INIT_SECTION_ASM_OP'. This macro should be defined for systems + where the init section is not actually run automatically, but is + still useful for collecting the lists of constructors and + destructors. + +`ASM_OUTPUT_CONSTRUCTOR (STREAM, NAME)' + Define this macro as a C statement to output on the stream STREAM + the assembler code to arrange to call the function named NAME at + initialization time. + + Assume that NAME is the name of a C function generated + automatically by the compiler. This function takes no arguments. + Use the function `assemble_name' to output the name NAME; this + performs any system-specific syntactic transformations such as + adding an underscore. + + If you don't define this macro, nothing special is output to + arrange to call the function. This is correct when the function + will be called in some other manner--for example, by means of the + `collect2' program, which looks through the symbol table to find + these functions by their names. + +`ASM_OUTPUT_DESTRUCTOR (STREAM, NAME)' + This is like `ASM_OUTPUT_CONSTRUCTOR' but used for termination + functions rather than initialization functions. + + When `ASM_OUTPUT_CONSTRUCTOR' and `ASM_OUTPUT_DESTRUCTOR' are + defined, the initializaiton routine generated for the generated + object file will have static linkage. + + If your system uses `collect2' as the means of processing +constructors, then that program normally uses `nm' to scan an object +file for constructor functions to be called. On such systems you must +not define `ASM_OUTPUT_CONSTRUCTOR' and `ASM_OUTPUT_DESTRUCTOR' as the +object file's initialization routine must have global scope. + + On certain kinds of systems, you can define these macros to make +`collect2' work faster (and, in some cases, make it work at all): + +`OBJECT_FORMAT_COFF' + Define this macro if the system uses COFF (Common Object File + Format) object files, so that `collect2' can assume this format + and scan object files directly for dynamic constructor/destructor + functions. + +`OBJECT_FORMAT_ROSE' + Define this macro if the system uses ROSE format object files, so + that `collect2' can assume this format and scan object files + directly for dynamic constructor/destructor functions. + + These macros are effective only in a native compiler; `collect2' as + part of a cross compiler always uses `nm' for the target machine. + +`REAL_NM_FILE_NAME' + Define this macro as a C string constant containing the file name + to use to execute `nm'. The default is to search the path + normally for `nm'. + + If your system supports shared libraries and has a program to list + the dynamic dependencies of a given library or executable, you can + define these macros to enable support for running initialization + and termination functions in shared libraries: + +`LDD_SUFFIX' + Define this macro to a C string constant containing the name of the + program which lists dynamic dependencies, like `"ldd"' under SunOS + 4. + +`PARSE_LDD_OUTPUT (PTR)' + Define this macro to be C code that extracts filenames from the + output of the program denoted by `LDD_SUFFIX'. PTR is a variable + of type `char *' that points to the beginning of a line of output + from `LDD_SUFFIX'. If the line lists a dynamic dependency, the + code must advance PTR to the beginning of the filename on that + line. Otherwise, it must set PTR to `NULL'. + diff --git a/usr/local/nachos/info/gcc.info-27 b/usr/local/nachos/info/gcc.info-27 new file mode 100644 index 0000000..6f8c73e --- /dev/null +++ b/usr/local/nachos/info/gcc.info-27 @@ -0,0 +1,946 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Instruction Output, Next: Dispatch Tables, Prev: Macros for Initialization, Up: Assembler Format + +Output of Assembler Instructions +-------------------------------- + + This describes assembler instruction output. + +`REGISTER_NAMES' + A C initializer containing the assembler's names for the machine + registers, each one as a C string constant. This is what + translates register numbers in the compiler into assembler + language. + +`ADDITIONAL_REGISTER_NAMES' + If defined, a C initializer for an array of structures containing + a name and a register number. This macro defines additional names + for hard registers, thus allowing the `asm' option in declarations + to refer to registers using alternate names. + +`ASM_OUTPUT_OPCODE (STREAM, PTR)' + Define this macro if you are using an unusual assembler that + requires different names for the machine instructions. + + The definition is a C statement or statements which output an + assembler instruction opcode to the stdio stream STREAM. The + macro-operand PTR is a variable of type `char *' which points to + the opcode name in its "internal" form--the form that is written + in the machine description. The definition should output the + opcode name to STREAM, performing any translation you desire, and + increment the variable PTR to point at the end of the opcode so + that it will not be output twice. + + In fact, your macro definition may process less than the entire + opcode name, or more than the opcode name; but if you want to + process text that includes `%'-sequences to substitute operands, + you must take care of the substitution yourself. Just be sure to + increment PTR over whatever text should not be output normally. + + If you need to look at the operand values, they can be found as the + elements of `recog_operand'. + + If the macro definition does nothing, the instruction is output in + the usual way. + +`FINAL_PRESCAN_INSN (INSN, OPVEC, NOPERANDS)' + If defined, a C statement to be executed just prior to the output + of assembler code for INSN, to modify the extracted operands so + they will be output differently. + + Here the argument OPVEC is the vector containing the operands + extracted from INSN, and NOPERANDS is the number of elements of + the vector which contain meaningful data for this insn. The + contents of this vector are what will be used to convert the insn + template into assembler code, so you can change the assembler + output by changing the contents of the vector. + + This macro is useful when various assembler syntaxes share a single + file of instruction patterns; by defining this macro differently, + you can cause a large class of instructions to be output + differently (such as with rearranged operands). Naturally, + variations in assembler syntax affecting individual insn patterns + ought to be handled by writing conditional output routines in + those patterns. + + If this macro is not defined, it is equivalent to a null statement. + +`FINAL_PRESCAN_LABEL' + If defined, `FINAL_PRESCAN_INSN' will be called on each + `CODE_LABEL'. In that case, OPVEC will be a null pointer and + NOPERANDS will be zero. + +`PRINT_OPERAND (STREAM, X, CODE)' + A C compound statement to output to stdio stream STREAM the + assembler syntax for an instruction operand X. X is an RTL + expression. + + CODE is a value that can be used to specify one of several ways of + printing the operand. It is used when identical operands must be + printed differently depending on the context. CODE comes from the + `%' specification that was used to request printing of the + operand. If the specification was just `%DIGIT' then CODE is 0; + if the specification was `%LTR DIGIT' then CODE is the ASCII code + for LTR. + + If X is a register, this macro should print the register's name. + The names can be found in an array `reg_names' whose type is `char + *[]'. `reg_names' is initialized from `REGISTER_NAMES'. + + When the machine description has a specification `%PUNCT' (a `%' + followed by a punctuation character), this macro is called with a + null pointer for X and the punctuation character for CODE. + +`PRINT_OPERAND_PUNCT_VALID_P (CODE)' + A C expression which evaluates to true if CODE is a valid + punctuation character for use in the `PRINT_OPERAND' macro. If + `PRINT_OPERAND_PUNCT_VALID_P' is not defined, it means that no + punctuation characters (except for the standard one, `%') are used + in this way. + +`PRINT_OPERAND_ADDRESS (STREAM, X)' + A C compound statement to output to stdio stream STREAM the + assembler syntax for an instruction operand that is a memory + reference whose address is X. X is an RTL expression. + + On some machines, the syntax for a symbolic address depends on the + section that the address refers to. On these machines, define the + macro `ENCODE_SECTION_INFO' to store the information into the + `symbol_ref', and then check for it here. *Note Assembler + Format::. + +`DBR_OUTPUT_SEQEND(FILE)' + A C statement, to be executed after all slot-filler instructions + have been output. If necessary, call `dbr_sequence_length' to + determine the number of slots filled in a sequence (zero if not + currently outputting a sequence), to decide how many no-ops to + output, or whatever. + + Don't define this macro if it has nothing to do, but it is helpful + in reading assembly output if the extent of the delay sequence is + made explicit (e.g. with white space). + + Note that output routines for instructions with delay slots must be + prepared to deal with not being output as part of a sequence (i.e. + when the scheduling pass is not run, or when no slot fillers could + be found.) The variable `final_sequence' is null when not + processing a sequence, otherwise it contains the `sequence' rtx + being output. + +`REGISTER_PREFIX' +`LOCAL_LABEL_PREFIX' +`USER_LABEL_PREFIX' +`IMMEDIATE_PREFIX' + If defined, C string expressions to be used for the `%R', `%L', + `%U', and `%I' options of `asm_fprintf' (see `final.c'). These + are useful when a single `md' file must support multiple assembler + formats. In that case, the various `tm.h' files can define these + macros differently. + +`ASSEMBLER_DIALECT' + If your target supports multiple dialects of assembler language + (such as different opcodes), define this macro as a C expression + that gives the numeric index of the assembler language dialect to + use, with zero as the first variant. + + If this macro is defined, you may use constructs of the form + `{option0|option1|option2...}' in the output templates of patterns + (*note Output Template::.) or in the first argument of + `asm_fprintf'. This construct outputs `option0', `option1' or + `option2', etc., if the value of `ASSEMBLER_DIALECT' is zero, one + or two, etc. Any special characters within these strings retain + their usual meaning. + + If you do not define this macro, the characters `{', `|' and `}' + do not have any special meaning when used in templates or operands + to `asm_fprintf'. + + Define the macros `REGISTER_PREFIX', `LOCAL_LABEL_PREFIX', + `USER_LABEL_PREFIX' and `IMMEDIATE_PREFIX' if you can express the + variations in assembler language syntax with that mechanism. + Define `ASSEMBLER_DIALECT' and use the `{option0|option1}' syntax + if the syntax variant are larger and involve such things as + different opcodes or operand order. + +`ASM_OUTPUT_REG_PUSH (STREAM, REGNO)' + A C expression to output to STREAM some assembler code which will + push hard register number REGNO onto the stack. The code need not + be optimal, since this macro is used only when profiling. + +`ASM_OUTPUT_REG_POP (STREAM, REGNO)' + A C expression to output to STREAM some assembler code which will + pop hard register number REGNO off of the stack. The code need + not be optimal, since this macro is used only when profiling. + + +File: gcc.info, Node: Dispatch Tables, Next: Exception Region Output, Prev: Instruction Output, Up: Assembler Format + +Output of Dispatch Tables +------------------------- + + This concerns dispatch tables. + +`ASM_OUTPUT_ADDR_DIFF_ELT (STREAM, BODY, VALUE, REL)' + A C statement to output to the stdio stream STREAM an assembler + pseudo-instruction to generate a difference between two labels. + VALUE and REL are the numbers of two internal labels. The + definitions of these labels are output using + `ASM_OUTPUT_INTERNAL_LABEL', and they must be printed in the same + way here. For example, + + fprintf (STREAM, "\t.word L%d-L%d\n", + VALUE, REL) + + You must provide this macro on machines where the addresses in a + dispatch table are relative to the table's own address. If + defined, GNU CC will also use this macro on all machines when + producing PIC. BODY is the body of the ADDR_DIFF_VEC; it is + provided so that the mode and flags can be read. + +`ASM_OUTPUT_ADDR_VEC_ELT (STREAM, VALUE)' + This macro should be provided on machines where the addresses in a + dispatch table are absolute. + + The definition should be a C statement to output to the stdio + stream STREAM an assembler pseudo-instruction to generate a + reference to a label. VALUE is the number of an internal label + whose definition is output using `ASM_OUTPUT_INTERNAL_LABEL'. For + example, + + fprintf (STREAM, "\t.word L%d\n", VALUE) + +`ASM_OUTPUT_CASE_LABEL (STREAM, PREFIX, NUM, TABLE)' + Define this if the label before a jump-table needs to be output + specially. The first three arguments are the same as for + `ASM_OUTPUT_INTERNAL_LABEL'; the fourth argument is the jump-table + which follows (a `jump_insn' containing an `addr_vec' or + `addr_diff_vec'). + + This feature is used on system V to output a `swbeg' statement for + the table. + + If this macro is not defined, these labels are output with + `ASM_OUTPUT_INTERNAL_LABEL'. + +`ASM_OUTPUT_CASE_END (STREAM, NUM, TABLE)' + Define this if something special must be output at the end of a + jump-table. The definition should be a C statement to be executed + after the assembler code for the table is written. It should write + the appropriate code to stdio stream STREAM. The argument TABLE + is the jump-table insn, and NUM is the label-number of the + preceding label. + + If this macro is not defined, nothing special is output at the end + of the jump-table. + + +File: gcc.info, Node: Exception Region Output, Next: Alignment Output, Prev: Dispatch Tables, Up: Assembler Format + +Assembler Commands for Exception Regions +---------------------------------------- + + This describes commands marking the start and the end of an exception +region. + +`ASM_OUTPUT_EH_REGION_BEG ()' + A C expression to output text to mark the start of an exception + region. + + This macro need not be defined on most platforms. + +`ASM_OUTPUT_EH_REGION_END ()' + A C expression to output text to mark the end of an exception + region. + + This macro need not be defined on most platforms. + +`EXCEPTION_SECTION ()' + A C expression to switch to the section in which the main + exception table is to be placed (*note Sections::.). The default + is a section named `.gcc_except_table' on machines that support + named sections via `ASM_OUTPUT_SECTION_NAME', otherwise if `-fpic' + or `-fPIC' is in effect, the `data_section', otherwise the + `readonly_data_section'. + +`EH_FRAME_SECTION_ASM_OP' + If defined, a C string constant for the assembler operation to + switch to the section for exception handling frame unwind + information. If not defined, GNU CC will provide a default + definition if the target supports named sections. `crtstuff.c' + uses this macro to switch to the appropriate section. + + You should define this symbol if your target supports DWARF 2 frame + unwind information and the default definition does not work. + +`OMIT_EH_TABLE ()' + A C expression that is nonzero if the normal exception table output + should be omitted. + + This macro need not be defined on most platforms. + +`EH_TABLE_LOOKUP ()' + Alternate runtime support for looking up an exception at runtime + and finding the associated handler, if the default method won't + work. + + This macro need not be defined on most platforms. + +`DOESNT_NEED_UNWINDER' + A C expression that decides whether or not the current function + needs to have a function unwinder generated for it. See the file + `except.c' for details on when to define this, and how. + +`MASK_RETURN_ADDR' + An rtx used to mask the return address found via RETURN_ADDR_RTX, + so that it does not contain any extraneous set bits in it. + +`DWARF2_UNWIND_INFO' + Define this macro to 0 if your target supports DWARF 2 frame unwind + information, but it does not yet work with exception handling. + Otherwise, if your target supports this information (if it defines + `INCOMING_RETURN_ADDR_RTX' and either `UNALIGNED_INT_ASM_OP' or + `OBJECT_FORMAT_ELF'), GCC will provide a default definition of 1. + + If this macro is defined to 1, the DWARF 2 unwinder will be the + default exception handling mechanism; otherwise, setjmp/longjmp + will be used by default. + + If this macro is defined to anything, the DWARF 2 unwinder will be + used instead of inline unwinders and __unwind_function in the + non-setjmp case. + + +File: gcc.info, Node: Alignment Output, Prev: Exception Region Output, Up: Assembler Format + +Assembler Commands for Alignment +-------------------------------- + + This describes commands for alignment. + +`LABEL_ALIGN_AFTER_BARRIER (LABEL)' + The alignment (log base 2) to put in front of LABEL, which follows + a BARRIER. + + This macro need not be defined if you don't want any special + alignment to be done at such a time. Most machine descriptions do + not currently define the macro. + +`LOOP_ALIGN (LABEL)' + The alignment (log base 2) to put in front of LABEL, which follows + a NOTE_INSN_LOOP_BEG note. + + This macro need not be defined if you don't want any special + alignment to be done at such a time. Most machine descriptions do + not currently define the macro. + +`LABEL_ALIGN (LABEL)' + The alignment (log base 2) to put in front of LABEL. If + LABEL_ALIGN_AFTER_BARRIER / LOOP_ALIGN specify a different + alignment, the maximum of the specified values is used. + +`ASM_OUTPUT_SKIP (STREAM, NBYTES)' + A C statement to output to the stdio stream STREAM an assembler + instruction to advance the location counter by NBYTES bytes. + Those bytes should be zero when loaded. NBYTES will be a C + expression of type `int'. + +`ASM_NO_SKIP_IN_TEXT' + Define this macro if `ASM_OUTPUT_SKIP' should not be used in the + text section because it fails to put zeros in the bytes that are + skipped. This is true on many Unix systems, where the pseudo-op + to skip bytes produces no-op instructions rather than zeros when + used in the text section. + +`ASM_OUTPUT_ALIGN (STREAM, POWER)' + A C statement to output to the stdio stream STREAM an assembler + command to advance the location counter to a multiple of 2 to the + POWER bytes. POWER will be a C expression of type `int'. + +`ASM_OUTPUT_MAX_SKIP_ALIGN (STREAM, POWER, MAX_SKIP)' + A C statement to output to the stdio stream STREAM an assembler + command to advance the location counter to a multiple of 2 to the + POWER bytes, but only if MAX_SKIP or fewer bytes are needed to + satisfy the alignment request. POWER and MAX_SKIP will be a C + expression of type `int'. + + +File: gcc.info, Node: Debugging Info, Next: Cross-compilation, Prev: Assembler Format, Up: Target Macros + +Controlling Debugging Information Format +======================================== + + This describes how to specify debugging information. + +* Menu: + +* All Debuggers:: Macros that affect all debugging formats uniformly. +* DBX Options:: Macros enabling specific options in DBX format. +* DBX Hooks:: Hook macros for varying DBX format. +* File Names and DBX:: Macros controlling output of file names in DBX format. +* SDB and DWARF:: Macros for SDB (COFF) and DWARF formats. + + +File: gcc.info, Node: All Debuggers, Next: DBX Options, Up: Debugging Info + +Macros Affecting All Debugging Formats +-------------------------------------- + + These macros affect all debugging formats. + +`DBX_REGISTER_NUMBER (REGNO)' + A C expression that returns the DBX register number for the + compiler register number REGNO. In simple cases, the value of this + expression may be REGNO itself. But sometimes there are some + registers that the compiler knows about and DBX does not, or vice + versa. In such cases, some register may need to have one number in + the compiler and another for DBX. + + If two registers have consecutive numbers inside GNU CC, and they + can be used as a pair to hold a multiword value, then they *must* + have consecutive numbers after renumbering with + `DBX_REGISTER_NUMBER'. Otherwise, debuggers will be unable to + access such a pair, because they expect register pairs to be + consecutive in their own numbering scheme. + + If you find yourself defining `DBX_REGISTER_NUMBER' in way that + does not preserve register pairs, then what you must do instead is + redefine the actual register numbering scheme. + +`DEBUGGER_AUTO_OFFSET (X)' + A C expression that returns the integer offset value for an + automatic variable having address X (an RTL expression). The + default computation assumes that X is based on the frame-pointer + and gives the offset from the frame-pointer. This is required for + targets that produce debugging output for DBX or COFF-style + debugging output for SDB and allow the frame-pointer to be + eliminated when the `-g' options is used. + +`DEBUGGER_ARG_OFFSET (OFFSET, X)' + A C expression that returns the integer offset value for an + argument having address X (an RTL expression). The nominal offset + is OFFSET. + +`PREFERRED_DEBUGGING_TYPE' + A C expression that returns the type of debugging output GNU CC + should produce when the user specifies just `-g'. Define this if + you have arranged for GNU CC to support more than one format of + debugging output. Currently, the allowable values are `DBX_DEBUG', + `SDB_DEBUG', `DWARF_DEBUG', `DWARF2_DEBUG', and `XCOFF_DEBUG'. + + When the user specifies `-ggdb', GNU CC normally also uses the + value of this macro to select the debugging output format, but + with two exceptions. If `DWARF2_DEBUGGING_INFO' is defined and + `LINKER_DOES_NOT_WORK_WITH_DWARF2' is not defined, GNU CC uses the + value `DWARF2_DEBUG'. Otherwise, if `DBX_DEBUGGING_INFO' is + defined, GNU CC uses `DBX_DEBUG'. + + The value of this macro only affects the default debugging output; + the user can always get a specific type of output by using + `-gstabs', `-gcoff', `-gdwarf-1', `-gdwarf-2', or `-gxcoff'. + + +File: gcc.info, Node: DBX Options, Next: DBX Hooks, Prev: All Debuggers, Up: Debugging Info + +Specific Options for DBX Output +------------------------------- + + These are specific options for DBX output. + +`DBX_DEBUGGING_INFO' + Define this macro if GNU CC should produce debugging output for DBX + in response to the `-g' option. + +`XCOFF_DEBUGGING_INFO' + Define this macro if GNU CC should produce XCOFF format debugging + output in response to the `-g' option. This is a variant of DBX + format. + +`DEFAULT_GDB_EXTENSIONS' + Define this macro to control whether GNU CC should by default + generate GDB's extended version of DBX debugging information + (assuming DBX-format debugging information is enabled at all). If + you don't define the macro, the default is 1: always generate the + extended information if there is any occasion to. + +`DEBUG_SYMS_TEXT' + Define this macro if all `.stabs' commands should be output while + in the text section. + +`ASM_STABS_OP' + A C string constant naming the assembler pseudo op to use instead + of `.stabs' to define an ordinary debugging symbol. If you don't + define this macro, `.stabs' is used. This macro applies only to + DBX debugging information format. + +`ASM_STABD_OP' + A C string constant naming the assembler pseudo op to use instead + of `.stabd' to define a debugging symbol whose value is the current + location. If you don't define this macro, `.stabd' is used. This + macro applies only to DBX debugging information format. + +`ASM_STABN_OP' + A C string constant naming the assembler pseudo op to use instead + of `.stabn' to define a debugging symbol with no name. If you + don't define this macro, `.stabn' is used. This macro applies + only to DBX debugging information format. + +`DBX_NO_XREFS' + Define this macro if DBX on your system does not support the + construct `xsTAGNAME'. On some systems, this construct is used to + describe a forward reference to a structure named TAGNAME. On + other systems, this construct is not supported at all. + +`DBX_CONTIN_LENGTH' + A symbol name in DBX-format debugging information is normally + continued (split into two separate `.stabs' directives) when it + exceeds a certain length (by default, 80 characters). On some + operating systems, DBX requires this splitting; on others, + splitting must not be done. You can inhibit splitting by defining + this macro with the value zero. You can override the default + splitting-length by defining this macro as an expression for the + length you desire. + +`DBX_CONTIN_CHAR' + Normally continuation is indicated by adding a `\' character to + the end of a `.stabs' string when a continuation follows. To use + a different character instead, define this macro as a character + constant for the character you want to use. Do not define this + macro if backslash is correct for your system. + +`DBX_STATIC_STAB_DATA_SECTION' + Define this macro if it is necessary to go to the data section + before outputting the `.stabs' pseudo-op for a non-global static + variable. + +`DBX_TYPE_DECL_STABS_CODE' + The value to use in the "code" field of the `.stabs' directive for + a typedef. The default is `N_LSYM'. + +`DBX_STATIC_CONST_VAR_CODE' + The value to use in the "code" field of the `.stabs' directive for + a static variable located in the text section. DBX format does not + provide any "right" way to do this. The default is `N_FUN'. + +`DBX_REGPARM_STABS_CODE' + The value to use in the "code" field of the `.stabs' directive for + a parameter passed in registers. DBX format does not provide any + "right" way to do this. The default is `N_RSYM'. + +`DBX_REGPARM_STABS_LETTER' + The letter to use in DBX symbol data to identify a symbol as a + parameter passed in registers. DBX format does not customarily + provide any way to do this. The default is `'P''. + +`DBX_MEMPARM_STABS_LETTER' + The letter to use in DBX symbol data to identify a symbol as a + stack parameter. The default is `'p''. + +`DBX_FUNCTION_FIRST' + Define this macro if the DBX information for a function and its + arguments should precede the assembler code for the function. + Normally, in DBX format, the debugging information entirely + follows the assembler code. + +`DBX_LBRAC_FIRST' + Define this macro if the `N_LBRAC' symbol for a block should + precede the debugging information for variables and functions + defined in that block. Normally, in DBX format, the `N_LBRAC' + symbol comes first. + +`DBX_BLOCKS_FUNCTION_RELATIVE' + Define this macro if the value of a symbol describing the scope of + a block (`N_LBRAC' or `N_RBRAC') should be relative to the start + of the enclosing function. Normally, GNU C uses an absolute + address. + +`DBX_USE_BINCL' + Define this macro if GNU C should generate `N_BINCL' and `N_EINCL' + stabs for included header files, as on Sun systems. This macro + also directs GNU C to output a type number as a pair of a file + number and a type number within the file. Normally, GNU C does not + generate `N_BINCL' or `N_EINCL' stabs, and it outputs a single + number for a type number. + + +File: gcc.info, Node: DBX Hooks, Next: File Names and DBX, Prev: DBX Options, Up: Debugging Info + +Open-Ended Hooks for DBX Format +------------------------------- + + These are hooks for DBX format. + +`DBX_OUTPUT_LBRAC (STREAM, NAME)' + Define this macro to say how to output to STREAM the debugging + information for the start of a scope level for variable names. The + argument NAME is the name of an assembler symbol (for use with + `assemble_name') whose value is the address where the scope begins. + +`DBX_OUTPUT_RBRAC (STREAM, NAME)' + Like `DBX_OUTPUT_LBRAC', but for the end of a scope level. + +`DBX_OUTPUT_ENUM (STREAM, TYPE)' + Define this macro if the target machine requires special handling + to output an enumeration type. The definition should be a C + statement (sans semicolon) to output the appropriate information + to STREAM for the type TYPE. + +`DBX_OUTPUT_FUNCTION_END (STREAM, FUNCTION)' + Define this macro if the target machine requires special output at + the end of the debugging information for a function. The + definition should be a C statement (sans semicolon) to output the + appropriate information to STREAM. FUNCTION is the + `FUNCTION_DECL' node for the function. + +`DBX_OUTPUT_STANDARD_TYPES (SYMS)' + Define this macro if you need to control the order of output of the + standard data types at the beginning of compilation. The argument + SYMS is a `tree' which is a chain of all the predefined global + symbols, including names of data types. + + Normally, DBX output starts with definitions of the types for + integers and characters, followed by all the other predefined + types of the particular language in no particular order. + + On some machines, it is necessary to output different particular + types first. To do this, define `DBX_OUTPUT_STANDARD_TYPES' to + output those symbols in the necessary order. Any predefined types + that you don't explicitly output will be output afterward in no + particular order. + + Be careful not to define this macro so that it works only for C. + There are no global variables to access most of the built-in + types, because another language may have another set of types. + The way to output a particular type is to look through SYMS to see + if you can find it. Here is an example: + + { + tree decl; + for (decl = syms; decl; decl = TREE_CHAIN (decl)) + if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), + "long int")) + dbxout_symbol (decl); + ... + } + + This does nothing if the expected type does not exist. + + See the function `init_decl_processing' in `c-decl.c' to find the + names to use for all the built-in C types. + + Here is another way of finding a particular type: + + { + tree decl; + for (decl = syms; decl; decl = TREE_CHAIN (decl)) + if (TREE_CODE (decl) == TYPE_DECL + && (TREE_CODE (TREE_TYPE (decl)) + == INTEGER_CST) + && TYPE_PRECISION (TREE_TYPE (decl)) == 16 + && TYPE_UNSIGNED (TREE_TYPE (decl))) + /* This must be `unsigned short'. */ + dbxout_symbol (decl); + ... + } + +`NO_DBX_FUNCTION_END' + Some stabs encapsulation formats (in particular ECOFF), cannot + handle the `.stabs "",N_FUN,,0,0,Lscope-function-1' gdb dbx + extention construct. On those machines, define this macro to turn + this feature off without disturbing the rest of the gdb extensions. + + +File: gcc.info, Node: File Names and DBX, Next: SDB and DWARF, Prev: DBX Hooks, Up: Debugging Info + +File Names in DBX Format +------------------------ + + This describes file names in DBX format. + +`DBX_WORKING_DIRECTORY' + Define this if DBX wants to have the current directory recorded in + each object file. + + Note that the working directory is always recorded if GDB + extensions are enabled. + +`DBX_OUTPUT_MAIN_SOURCE_FILENAME (STREAM, NAME)' + A C statement to output DBX debugging information to the stdio + stream STREAM which indicates that file NAME is the main source + file--the file specified as the input file for compilation. This + macro is called only once, at the beginning of compilation. + + This macro need not be defined if the standard form of output for + DBX debugging information is appropriate. + +`DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (STREAM, NAME)' + A C statement to output DBX debugging information to the stdio + stream STREAM which indicates that the current directory during + compilation is named NAME. + + This macro need not be defined if the standard form of output for + DBX debugging information is appropriate. + +`DBX_OUTPUT_MAIN_SOURCE_FILE_END (STREAM, NAME)' + A C statement to output DBX debugging information at the end of + compilation of the main source file NAME. + + If you don't define this macro, nothing special is output at the + end of compilation, which is correct for most machines. + +`DBX_OUTPUT_SOURCE_FILENAME (STREAM, NAME)' + A C statement to output DBX debugging information to the stdio + stream STREAM which indicates that file NAME is the current source + file. This output is generated each time input shifts to a + different source file as a result of `#include', the end of an + included file, or a `#line' command. + + This macro need not be defined if the standard form of output for + DBX debugging information is appropriate. + + +File: gcc.info, Node: SDB and DWARF, Prev: File Names and DBX, Up: Debugging Info + +Macros for SDB and DWARF Output +------------------------------- + + Here are macros for SDB and DWARF output. + +`SDB_DEBUGGING_INFO' + Define this macro if GNU CC should produce COFF-style debugging + output for SDB in response to the `-g' option. + +`DWARF_DEBUGGING_INFO' + Define this macro if GNU CC should produce dwarf format debugging + output in response to the `-g' option. + +`DWARF2_DEBUGGING_INFO' + Define this macro if GNU CC should produce dwarf version 2 format + debugging output in response to the `-g' option. + + To support optional call frame debugging information, you must also + define `INCOMING_RETURN_ADDR_RTX' and either set + `RTX_FRAME_RELATED_P' on the prologue insns if you use RTL for the + prologue, or call `dwarf2out_def_cfa' and `dwarf2out_reg_save' as + appropriate from `FUNCTION_PROLOGUE' if you don't. + +`DWARF2_FRAME_INFO' + Define this macro to a nonzero value if GNU CC should always output + Dwarf 2 frame information. If `DWARF2_UNWIND_INFO' (*note + Exception Region Output::. is nonzero, GNU CC will output this + information not matter how you define `DWARF2_FRAME_INFO'. + +`LINKER_DOES_NOT_WORK_WITH_DWARF2' + Define this macro if the linker does not work with Dwarf version 2. + Normally, if the user specifies only `-ggdb' GNU CC will use Dwarf + version 2 if available; this macro disables this. See the + description of the `PREFERRED_DEBUGGING_TYPE' macro for more + details. + +`PUT_SDB_...' + Define these macros to override the assembler syntax for the + special SDB assembler directives. See `sdbout.c' for a list of + these macros and their arguments. If the standard syntax is used, + you need not define them yourself. + +`SDB_DELIM' + Some assemblers do not support a semicolon as a delimiter, even + between SDB assembler directives. In that case, define this macro + to be the delimiter to use (usually `\n'). It is not necessary to + define a new set of `PUT_SDB_OP' macros if this is the only change + required. + +`SDB_GENERATE_FAKE' + Define this macro to override the usual method of constructing a + dummy name for anonymous structure and union types. See + `sdbout.c' for more information. + +`SDB_ALLOW_UNKNOWN_REFERENCES' + Define this macro to allow references to unknown structure, union, + or enumeration tags to be emitted. Standard COFF does not allow + handling of unknown references, MIPS ECOFF has support for it. + +`SDB_ALLOW_FORWARD_REFERENCES' + Define this macro to allow references to structure, union, or + enumeration tags that have not yet been seen to be handled. Some + assemblers choke if forward tags are used, while some require it. + + +File: gcc.info, Node: Cross-compilation, Next: Misc, Prev: Debugging Info, Up: Target Macros + +Cross Compilation and Floating Point +==================================== + + While all modern machines use 2's complement representation for +integers, there are a variety of representations for floating point +numbers. This means that in a cross-compiler the representation of +floating point numbers in the compiled program may be different from +that used in the machine doing the compilation. + + Because different representation systems may offer different amounts +of range and precision, the cross compiler cannot safely use the host +machine's floating point arithmetic. Therefore, floating point +constants must be represented in the target machine's format. This +means that the cross compiler cannot use `atof' to parse a floating +point constant; it must have its own special routine to use instead. +Also, constant folding must emulate the target machine's arithmetic (or +must not be done at all). + + The macros in the following table should be defined only if you are +cross compiling between different floating point formats. + + Otherwise, don't define them. Then default definitions will be set +up which use `double' as the data type, `==' to test for equality, etc. + + You don't need to worry about how many times you use an operand of +any of these macros. The compiler never uses operands which have side +effects. + +`REAL_VALUE_TYPE' + A macro for the C data type to be used to hold a floating point + value in the target machine's format. Typically this would be a + `struct' containing an array of `int'. + +`REAL_VALUES_EQUAL (X, Y)' + A macro for a C expression which compares for equality the two + values, X and Y, both of type `REAL_VALUE_TYPE'. + +`REAL_VALUES_LESS (X, Y)' + A macro for a C expression which tests whether X is less than Y, + both values being of type `REAL_VALUE_TYPE' and interpreted as + floating point numbers in the target machine's representation. + +`REAL_VALUE_LDEXP (X, SCALE)' + A macro for a C expression which performs the standard library + function `ldexp', but using the target machine's floating point + representation. Both X and the value of the expression have type + `REAL_VALUE_TYPE'. The second argument, SCALE, is an integer. + +`REAL_VALUE_FIX (X)' + A macro whose definition is a C expression to convert the + target-machine floating point value X to a signed integer. X has + type `REAL_VALUE_TYPE'. + +`REAL_VALUE_UNSIGNED_FIX (X)' + A macro whose definition is a C expression to convert the + target-machine floating point value X to an unsigned integer. X + has type `REAL_VALUE_TYPE'. + +`REAL_VALUE_RNDZINT (X)' + A macro whose definition is a C expression to round the + target-machine floating point value X towards zero to an integer + value (but still as a floating point number). X has type + `REAL_VALUE_TYPE', and so does the value. + +`REAL_VALUE_UNSIGNED_RNDZINT (X)' + A macro whose definition is a C expression to round the + target-machine floating point value X towards zero to an unsigned + integer value (but still represented as a floating point number). + X has type `REAL_VALUE_TYPE', and so does the value. + +`REAL_VALUE_ATOF (STRING, MODE)' + A macro for a C expression which converts STRING, an expression of + type `char *', into a floating point number in the target machine's + representation for mode MODE. The value has type + `REAL_VALUE_TYPE'. + +`REAL_INFINITY' + Define this macro if infinity is a possible floating point value, + and therefore division by 0 is legitimate. + +`REAL_VALUE_ISINF (X)' + A macro for a C expression which determines whether X, a floating + point value, is infinity. The value has type `int'. By default, + this is defined to call `isinf'. + +`REAL_VALUE_ISNAN (X)' + A macro for a C expression which determines whether X, a floating + point value, is a "nan" (not-a-number). The value has type `int'. + By default, this is defined to call `isnan'. + + Define the following additional macros if you want to make floating +point constant folding work while cross compiling. If you don't define +them, cross compilation is still possible, but constant folding will +not happen for floating point values. + +`REAL_ARITHMETIC (OUTPUT, CODE, X, Y)' + A macro for a C statement which calculates an arithmetic operation + of the two floating point values X and Y, both of type + `REAL_VALUE_TYPE' in the target machine's representation, to + produce a result of the same type and representation which is + stored in OUTPUT (which will be a variable). + + The operation to be performed is specified by CODE, a tree code + which will always be one of the following: `PLUS_EXPR', + `MINUS_EXPR', `MULT_EXPR', `RDIV_EXPR', `MAX_EXPR', `MIN_EXPR'. + + The expansion of this macro is responsible for checking for + overflow. If overflow happens, the macro expansion should execute + the statement `return 0;', which indicates the inability to + perform the arithmetic operation requested. + +`REAL_VALUE_NEGATE (X)' + A macro for a C expression which returns the negative of the + floating point value X. Both X and the value of the expression + have type `REAL_VALUE_TYPE' and are in the target machine's + floating point representation. + + There is no way for this macro to report overflow, since overflow + can't happen in the negation operation. + +`REAL_VALUE_TRUNCATE (MODE, X)' + A macro for a C expression which converts the floating point value + X to mode MODE. + + Both X and the value of the expression are in the target machine's + floating point representation and have type `REAL_VALUE_TYPE'. + However, the value should have an appropriate bit pattern to be + output properly as a floating constant whose precision accords + with mode MODE. + + There is no way for this macro to report overflow. + +`REAL_VALUE_TO_INT (LOW, HIGH, X)' + A macro for a C expression which converts a floating point value X + into a double-precision integer which is then stored into LOW and + HIGH, two variables of type INT. + +`REAL_VALUE_FROM_INT (X, LOW, HIGH, MODE)' + A macro for a C expression which converts a double-precision + integer found in LOW and HIGH, two variables of type INT, into a + floating point value which is then stored into X. The value is in + the target machine's representation for mode MODE and has the type + `REAL_VALUE_TYPE'. + diff --git a/usr/local/nachos/info/gcc.info-28 b/usr/local/nachos/info/gcc.info-28 new file mode 100644 index 0000000..7b68afd --- /dev/null +++ b/usr/local/nachos/info/gcc.info-28 @@ -0,0 +1,1017 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Misc, Prev: Cross-compilation, Up: Target Macros + +Miscellaneous Parameters +======================== + + Here are several miscellaneous parameters. + +`PREDICATE_CODES' + Define this if you have defined special-purpose predicates in the + file `MACHINE.c'. This macro is called within an initializer of an + array of structures. The first field in the structure is the name + of a predicate and the second field is an array of rtl codes. For + each predicate, list all rtl codes that can be in expressions + matched by the predicate. The list should have a trailing comma. + Here is an example of two entries in the list for a typical RISC + machine: + + #define PREDICATE_CODES \ + {"gen_reg_rtx_operand", {SUBREG, REG}}, \ + {"reg_or_short_cint_operand", {SUBREG, REG, CONST_INT}}, + + Defining this macro does not affect the generated code (however, + incorrect definitions that omit an rtl code that may be matched by + the predicate can cause the compiler to malfunction). Instead, it + allows the table built by `genrecog' to be more compact and + efficient, thus speeding up the compiler. The most important + predicates to include in the list specified by this macro are + those used in the most insn patterns. + +`CASE_VECTOR_MODE' + An alias for a machine mode name. This is the machine mode that + elements of a jump-table should have. + +`CASE_VECTOR_SHORTEN_MODE (MIN_OFFSET, MAX_OFFSET, BODY)' + Optional: return the preferred mode for an `addr_diff_vec' when + the minimum and maximum offset are known. If you define this, it + enables extra code in branch shortening to deal with + `addr_diff_vec'. To make this work, you also have to define + INSN_ALIGN and make the alignment for `addr_diff_vec' explicit. + The BODY argument is provided so that the offset_unsigned and scale + flags can be updated. + +`CASE_VECTOR_PC_RELATIVE' + Define this macro to be a C expression to indicate when jump-tables + should contain relative addresses. If jump-tables never contain + relative addresses, then you need not define this macro. + +`CASE_DROPS_THROUGH' + Define this if control falls through a `case' insn when the index + value is out of range. This means the specified default-label is + actually ignored by the `case' insn proper. + +`CASE_VALUES_THRESHOLD' + Define this to be the smallest number of different values for + which it is best to use a jump-table instead of a tree of + conditional branches. The default is four for machines with a + `casesi' instruction and five otherwise. This is best for most + machines. + +`WORD_REGISTER_OPERATIONS' + Define this macro if operations between registers with integral + mode smaller than a word are always performed on the entire + register. Most RISC machines have this property and most CISC + machines do not. + +`LOAD_EXTEND_OP (MODE)' + Define this macro to be a C expression indicating when insns that + read memory in MODE, an integral mode narrower than a word, set the + bits outside of MODE to be either the sign-extension or the + zero-extension of the data read. Return `SIGN_EXTEND' for values + of MODE for which the insn sign-extends, `ZERO_EXTEND' for which + it zero-extends, and `NIL' for other modes. + + This macro is not called with MODE non-integral or with a width + greater than or equal to `BITS_PER_WORD', so you may return any + value in this case. Do not define this macro if it would always + return `NIL'. On machines where this macro is defined, you will + normally define it as the constant `SIGN_EXTEND' or `ZERO_EXTEND'. + +`SHORT_IMMEDIATES_SIGN_EXTEND' + Define this macro if loading short immediate values into registers + sign extends. + +`IMPLICIT_FIX_EXPR' + An alias for a tree code that should be used by default for + conversion of floating point values to fixed point. Normally, + `FIX_ROUND_EXPR' is used. + +`FIXUNS_TRUNC_LIKE_FIX_TRUNC' + Define this macro if the same instructions that convert a floating + point number to a signed fixed point number also convert validly + to an unsigned one. + +`EASY_DIV_EXPR' + An alias for a tree code that is the easiest kind of division to + compile code for in the general case. It may be `TRUNC_DIV_EXPR', + `FLOOR_DIV_EXPR', `CEIL_DIV_EXPR' or `ROUND_DIV_EXPR'. These four + division operators differ in how they round the result to an + integer. `EASY_DIV_EXPR' is used when it is permissible to use + any of those kinds of division and the choice should be made on + the basis of efficiency. + +`MOVE_MAX' + The maximum number of bytes that a single instruction can move + quickly between memory and registers or between two memory + locations. + +`MAX_MOVE_MAX' + The maximum number of bytes that a single instruction can move + quickly between memory and registers or between two memory + locations. If this is undefined, the default is `MOVE_MAX'. + Otherwise, it is the constant value that is the largest value that + `MOVE_MAX' can have at run-time. + +`SHIFT_COUNT_TRUNCATED' + A C expression that is nonzero if on this machine the number of + bits actually used for the count of a shift operation is equal to + the number of bits needed to represent the size of the object + being shifted. When this macro is non-zero, the compiler will + assume that it is safe to omit a sign-extend, zero-extend, and + certain bitwise `and' instructions that truncates the count of a + shift operation. On machines that have instructions that act on + bitfields at variable positions, which may include `bit test' + instructions, a nonzero `SHIFT_COUNT_TRUNCATED' also enables + deletion of truncations of the values that serve as arguments to + bitfield instructions. + + If both types of instructions truncate the count (for shifts) and + position (for bitfield operations), or if no variable-position + bitfield instructions exist, you should define this macro. + + However, on some machines, such as the 80386 and the 680x0, + truncation only applies to shift operations and not the (real or + pretended) bitfield operations. Define `SHIFT_COUNT_TRUNCATED' to + be zero on such machines. Instead, add patterns to the `md' file + that include the implied truncation of the shift instructions. + + You need not define this macro if it would always have the value + of zero. + +`TRULY_NOOP_TRUNCATION (OUTPREC, INPREC)' + A C expression which is nonzero if on this machine it is safe to + "convert" an integer of INPREC bits to one of OUTPREC bits (where + OUTPREC is smaller than INPREC) by merely operating on it as if it + had only OUTPREC bits. + + On many machines, this expression can be 1. + + When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for + modes for which `MODES_TIEABLE_P' is 0, suboptimal code can result. + If this is the case, making `TRULY_NOOP_TRUNCATION' return 0 in + such cases may improve things. + +`STORE_FLAG_VALUE' + A C expression describing the value returned by a comparison + operator with an integral mode and stored by a store-flag + instruction (`sCOND') when the condition is true. This + description must apply to *all* the `sCOND' patterns and all the + comparison operators whose results have a `MODE_INT' mode. + + A value of 1 or -1 means that the instruction implementing the + comparison operator returns exactly 1 or -1 when the comparison is + true and 0 when the comparison is false. Otherwise, the value + indicates which bits of the result are guaranteed to be 1 when the + comparison is true. This value is interpreted in the mode of the + comparison operation, which is given by the mode of the first + operand in the `sCOND' pattern. Either the low bit or the sign + bit of `STORE_FLAG_VALUE' be on. Presently, only those bits are + used by the compiler. + + If `STORE_FLAG_VALUE' is neither 1 or -1, the compiler will + generate code that depends only on the specified bits. It can also + replace comparison operators with equivalent operations if they + cause the required bits to be set, even if the remaining bits are + undefined. For example, on a machine whose comparison operators + return an `SImode' value and where `STORE_FLAG_VALUE' is defined as + `0x80000000', saying that just the sign bit is relevant, the + expression + + (ne:SI (and:SI X (const_int POWER-OF-2)) (const_int 0)) + + can be converted to + + (ashift:SI X (const_int N)) + + where N is the appropriate shift count to move the bit being + tested into the sign bit. + + There is no way to describe a machine that always sets the + low-order bit for a true value, but does not guarantee the value + of any other bits, but we do not know of any machine that has such + an instruction. If you are trying to port GNU CC to such a + machine, include an instruction to perform a logical-and of the + result with 1 in the pattern for the comparison operators and let + us know (*note How to Report Bugs: Bug Reporting.). + + Often, a machine will have multiple instructions that obtain a + value from a comparison (or the condition codes). Here are rules + to guide the choice of value for `STORE_FLAG_VALUE', and hence the + instructions to be used: + + * Use the shortest sequence that yields a valid definition for + `STORE_FLAG_VALUE'. It is more efficient for the compiler to + "normalize" the value (convert it to, e.g., 1 or 0) than for + the comparison operators to do so because there may be + opportunities to combine the normalization with other + operations. + + * For equal-length sequences, use a value of 1 or -1, with -1 + being slightly preferred on machines with expensive jumps and + 1 preferred on other machines. + + * As a second choice, choose a value of `0x80000001' if + instructions exist that set both the sign and low-order bits + but do not define the others. + + * Otherwise, use a value of `0x80000000'. + + Many machines can produce both the value chosen for + `STORE_FLAG_VALUE' and its negation in the same number of + instructions. On those machines, you should also define a pattern + for those cases, e.g., one matching + + (set A (neg:M (ne:M B C))) + + Some machines can also perform `and' or `plus' operations on + condition code values with less instructions than the corresponding + `sCOND' insn followed by `and' or `plus'. On those machines, + define the appropriate patterns. Use the names `incscc' and + `decscc', respectively, for the patterns which perform `plus' or + `minus' operations on condition code values. See `rs6000.md' for + some examples. The GNU Superoptizer can be used to find such + instruction sequences on other machines. + + You need not define `STORE_FLAG_VALUE' if the machine has no + store-flag instructions. + +`FLOAT_STORE_FLAG_VALUE' + A C expression that gives a non-zero floating point value that is + returned when comparison operators with floating-point results are + true. Define this macro on machine that have comparison + operations that return floating-point values. If there are no + such operations, do not define this macro. + +`Pmode' + An alias for the machine mode for pointers. On most machines, + define this to be the integer mode corresponding to the width of a + hardware pointer; `SImode' on 32-bit machine or `DImode' on 64-bit + machines. On some machines you must define this to be one of the + partial integer modes, such as `PSImode'. + + The width of `Pmode' must be at least as large as the value of + `POINTER_SIZE'. If it is not equal, you must define the macro + `POINTERS_EXTEND_UNSIGNED' to specify how pointers are extended to + `Pmode'. + +`FUNCTION_MODE' + An alias for the machine mode used for memory references to + functions being called, in `call' RTL expressions. On most + machines this should be `QImode'. + +`INTEGRATE_THRESHOLD (DECL)' + A C expression for the maximum number of instructions above which + the function DECL should not be inlined. DECL is a + `FUNCTION_DECL' node. + + The default definition of this macro is 64 plus 8 times the number + of arguments that the function accepts. Some people think a larger + threshold should be used on RISC machines. + +`SCCS_DIRECTIVE' + Define this if the preprocessor should ignore `#sccs' directives + and print no error message. + +`NO_IMPLICIT_EXTERN_C' + Define this macro if the system header files support C++ as well + as C. This macro inhibits the usual method of using system header + files in C++, which is to pretend that the file's contents are + enclosed in `extern "C" {...}'. + +`HANDLE_PRAGMA (GETC, UNGETC, NAME)' + Define this macro if you want to implement any pragmas. If + defined, it is a C expression whose value is 1 if the pragma was + handled by the macro, zero otherwise. The argument GETC is a + function of type `int (*)(void)' which will return the next + character in the input stream, or EOF if no characters are left. + The argument UNGETC is a function of type `void (*)(int)' which + will push a character back into the input stream. The argument + NAME is the word following #pragma in the input stream. The input + stream pointer will be pointing just beyond the end of this word. + The input stream should be left undistrubed if the expression + returns zero, otherwise it should be pointing at the next + character after the end of the pragma. Any characters remaining + on the line will be ignored. + + It is generally a bad idea to implement new uses of `#pragma'. The + only reason to define this macro is for compatibility with other + compilers that do support `#pragma' for the sake of any user + programs which already use it. + + If the pragma can be implemented by atttributes then the macro + `INSERT_ATTRIBUTES' might be a useful one to define as well. + + Note: older versions of this macro only had two arguments: STREAM + and TOKEN. The macro was changed in order to allow it to work + when gcc is built both with and without a cpp library. + +`HANDLE_SYSV_PRAGMA' + Define this macro (to a value of 1) if you want the System V style + pragmas `#pragma pack()' and `#pragma weak [=]' + to be supported by gcc. + + The pack pragma specifies the maximum alignment (in bytes) of + fields within a structure, in much the same way as the + `__aligned__' and `__packed__' `__attribute__'s do. A pack value + of zero resets the behaviour to the default. + + The weak pragma only works if `SUPPORTS_WEAK' and + `ASM_WEAKEN_LABEL' are defined. If enabled it allows the creation + of specifically named weak labels, optionally with a value. + +`HANDLE_PRAGMA_PACK_PUSH_POP' + Define this macro (to a value of 1) if you want to support the + Win32 style pragmas `#pragma pack(push,)' and `#pragma + pack(pop)'. The pack(push,) pragma specifies the maximum + alignment (in bytes) of fields within a structure, in much the + same way as the `__aligned__' and `__packed__' `__attribute__'s + do. A pack value of zero resets the behaviour to the default. + Successive invocations of this pragma cause the previous values to + be stacked, so that invocations of `#pragma pack(pop)' will return + to the previous value. + +`VALID_MACHINE_DECL_ATTRIBUTE (DECL, ATTRIBUTES, IDENTIFIER, ARGS)' + If defined, a C expression whose value is nonzero if IDENTIFIER + with arguments ARGS is a valid machine specific attribute for DECL. + The attributes in ATTRIBUTES have previously been assigned to DECL. + +`VALID_MACHINE_TYPE_ATTRIBUTE (TYPE, ATTRIBUTES, IDENTIFIER, ARGS)' + If defined, a C expression whose value is nonzero if IDENTIFIER + with arguments ARGS is a valid machine specific attribute for TYPE. + The attributes in ATTRIBUTES have previously been assigned to TYPE. + +`COMP_TYPE_ATTRIBUTES (TYPE1, TYPE2)' + If defined, a C expression whose value is zero if the attributes on + TYPE1 and TYPE2 are incompatible, one if they are compatible, and + two if they are nearly compatible (which causes a warning to be + generated). + +`SET_DEFAULT_TYPE_ATTRIBUTES (TYPE)' + If defined, a C statement that assigns default attributes to newly + defined TYPE. + +`MERGE_MACHINE_TYPE_ATTRIBUTES (TYPE1, TYPE2)' + Define this macro if the merging of type attributes needs special + handling. If defined, the result is a list of the combined + TYPE_ATTRIBUTES of TYPE1 and TYPE2. It is assumed that comptypes + has already been called and returned 1. + +`MERGE_MACHINE_DECL_ATTRIBUTES (OLDDECL, NEWDECL)' + Define this macro if the merging of decl attributes needs special + handling. If defined, the result is a list of the combined + DECL_MACHINE_ATTRIBUTES of OLDDECL and NEWDECL. NEWDECL is a + duplicate declaration of OLDDECL. Examples of when this is needed + are when one attribute overrides another, or when an attribute is + nullified by a subsequent definition. + +`INSERT_ATTRIBUTES (NODE, ATTR_PTR, PREFIX_PTR)' + Define this macro if you want to be able to add attributes to a + decl when it is being created. This is normally useful for + backends which wish to implement a pragma by using the attributes + which correspond to the pragma's effect. The NODE argument is the + decl which is being created. The ATTR_PTR argument is a pointer + to the attribute list for this decl. The PREFIX_PTR is a pointer + to the list of attributes that have appeared after the specifiers + and modifiers of the declaration, but before the declaration + proper. + +`SET_DEFAULT_DECL_ATTRIBUTES (DECL, ATTRIBUTES)' + If defined, a C statement that assigns default attributes to newly + defined DECL. + +`DOLLARS_IN_IDENTIFIERS' + Define this macro to control use of the character `$' in identifier + names. 0 means `$' is not allowed by default; 1 means it is + allowed. 1 is the default; there is no need to define this macro + in that case. This macro controls the compiler proper; it does + not affect the preprocessor. + +`NO_DOLLAR_IN_LABEL' + Define this macro if the assembler does not accept the character + `$' in label names. By default constructors and destructors in + G++ have `$' in the identifiers. If this macro is defined, `.' is + used instead. + +`NO_DOT_IN_LABEL' + Define this macro if the assembler does not accept the character + `.' in label names. By default constructors and destructors in G++ + have names that use `.'. If this macro is defined, these names + are rewritten to avoid `.'. + +`DEFAULT_MAIN_RETURN' + Define this macro if the target system expects every program's + `main' function to return a standard "success" value by default + (if no other value is explicitly returned). + + The definition should be a C statement (sans semicolon) to + generate the appropriate rtl instructions. It is used only when + compiling the end of `main'. + +`HAVE_ATEXIT' + Define this if the target system supports the function `atexit' + from the ANSI C standard. If this is not defined, and + `INIT_SECTION_ASM_OP' is not defined, a default `exit' function + will be provided to support C++. + +`EXIT_BODY' + Define this if your `exit' function needs to do something besides + calling an external function `_cleanup' before terminating with + `_exit'. The `EXIT_BODY' macro is only needed if neither + `HAVE_ATEXIT' nor `INIT_SECTION_ASM_OP' are defined. + +`INSN_SETS_ARE_DELAYED (INSN)' + Define this macro as a C expression that is nonzero if it is safe + for the delay slot scheduler to place instructions in the delay + slot of INSN, even if they appear to use a resource set or + clobbered in INSN. INSN is always a `jump_insn' or an `insn'; GNU + CC knows that every `call_insn' has this behavior. On machines + where some `insn' or `jump_insn' is really a function call and + hence has this behavior, you should define this macro. + + You need not define this macro if it would always return zero. + +`INSN_REFERENCES_ARE_DELAYED (INSN)' + Define this macro as a C expression that is nonzero if it is safe + for the delay slot scheduler to place instructions in the delay + slot of INSN, even if they appear to set or clobber a resource + referenced in INSN. INSN is always a `jump_insn' or an `insn'. + On machines where some `insn' or `jump_insn' is really a function + call and its operands are registers whose use is actually in the + subroutine it calls, you should define this macro. Doing so + allows the delay slot scheduler to move instructions which copy + arguments into the argument registers into the delay slot of INSN. + + You need not define this macro if it would always return zero. + +`MACHINE_DEPENDENT_REORG (INSN)' + In rare cases, correct code generation requires extra machine + dependent processing between the second jump optimization pass and + delayed branch scheduling. On those machines, define this macro + as a C statement to act on the code starting at INSN. + +`MULTIPLE_SYMBOL_SPACES' + Define this macro if in some cases global symbols from one + translation unit may not be bound to undefined symbols in another + translation unit without user intervention. For instance, under + Microsoft Windows symbols must be explicitly imported from shared + libraries (DLLs). + +`ISSUE_RATE' + A C expression that returns how many instructions can be issued at + the same time if the machine is a superscalar machine. This is + only used by the `Haifa' scheduler, and not the traditional + scheduler. + +`MD_SCHED_INIT (FILE, VERBOSE)' + A C statement which is executed by the `Haifa' scheduler at the + beginning of each block of instructions that are to be scheduled. + FILE is either a null pointer, or a stdio stream to write any + debug output to. VERBOSE is the verbose level provided by + `-fsched-verbose-'N. + +`MD_SCHED_REORDER (FILE, VERBOSE, READY, N_READY)' + A C statement which is executed by the `Haifa' scheduler after it + has scheduled the ready list to allow the machine description to + reorder it (for example to combine two small instructions together + on `VLIW' machines). FILE is either a null pointer, or a stdio + stream to write any debug output to. VERBOSE is the verbose level + provided by `-fsched-verbose-'N. READY is a pointer to the ready + list of instructions that are ready to be scheduled. N_READY is + the number of elements in the ready list. The scheduler reads the + ready list in reverse order, starting with READY[N_READY-1] and + going to READY[0]. + +`MD_SCHED_VARIABLE_ISSUE (FILE, VERBOSE, INSN, MORE)' + A C statement which is executed by the `Haifa' scheduler after it + has scheduled an insn from the ready list. FILE is either a null + pointer, or a stdio stream to write any debug output to. VERBOSE + is the verbose level provided by `-fsched-verbose-'N. INSN is the + instruction that was scheduled. MORE is the number of + instructions that can be issued in the current cycle. The + `MD_SCHED_VARIABLE_ISSUE' macro is responsible for updating the + value of MORE (typically by MORE-). + +`MAX_INTEGER_COMPUTATION_MODE' + Define this to the largest integer machine mode which can be used + for operations other than load, store and copy operations. + + You need only define this macro if the target holds values larger + than `word_mode' in general purpose registers. Most targets + should not define this macro. + +`MATH_LIBRARY' + Define this macro as a C string constant for the linker argument + to link in the system math library, or `""' if the target does not + have a separate math library. + + You need only define this macro if the default of `"-lm"' is wrong. + + +File: gcc.info, Node: Config, Next: Fragments, Prev: Target Macros, Up: Top + +The Configuration File +********************** + + The configuration file `xm-MACHINE.h' contains macro definitions +that describe the machine and system on which the compiler is running, +unlike the definitions in `MACHINE.h', which describe the machine for +which the compiler is producing output. Most of the values in +`xm-MACHINE.h' are actually the same on all machines that GCC runs on, +so large parts of all configuration files are identical. But there are +some macros that vary: + +`USG' + Define this macro if the host system is System V. + +`VMS' + Define this macro if the host system is VMS. + +`FATAL_EXIT_CODE' + A C expression for the status code to be returned when the compiler + exits after serious errors. + +`SUCCESS_EXIT_CODE' + A C expression for the status code to be returned when the compiler + exits without serious errors. + +`HOST_WORDS_BIG_ENDIAN' + Defined if the host machine stores words of multi-word values in + big-endian order. (GCC does not depend on the host byte ordering + within a word.) + +`HOST_FLOAT_WORDS_BIG_ENDIAN' + Define this macro to be 1 if the host machine stores `DFmode', + `XFmode' or `TFmode' floating point numbers in memory with the + word containing the sign bit at the lowest address; otherwise, + define it to be zero. + + This macro need not be defined if the ordering is the same as for + multi-word integers. + +`HOST_FLOAT_FORMAT' + A numeric code distinguishing the floating point format for the + host machine. See `TARGET_FLOAT_FORMAT' in *Note Storage Layout:: + for the alternatives and default. + +`HOST_BITS_PER_CHAR' + A C expression for the number of bits in `char' on the host + machine. + +`HOST_BITS_PER_SHORT' + A C expression for the number of bits in `short' on the host + machine. + +`HOST_BITS_PER_INT' + A C expression for the number of bits in `int' on the host machine. + +`HOST_BITS_PER_LONG' + A C expression for the number of bits in `long' on the host + machine. + +`ONLY_INT_FIELDS' + Define this macro to indicate that the host compiler only supports + `int' bit fields, rather than other integral types, including + `enum', as do most C compilers. + +`OBSTACK_CHUNK_SIZE' + A C expression for the size of ordinary obstack chunks. If you + don't define this, a usually-reasonable default is used. + +`OBSTACK_CHUNK_ALLOC' + The function used to allocate obstack chunks. If you don't define + this, `xmalloc' is used. + +`OBSTACK_CHUNK_FREE' + The function used to free obstack chunks. If you don't define + this, `free' is used. + +`USE_C_ALLOCA' + Define this macro to indicate that the compiler is running with the + `alloca' implemented in C. This version of `alloca' can be found + in the file `alloca.c'; to use it, you must also alter the + `Makefile' variable `ALLOCA'. (This is done automatically for the + systems on which we know it is needed.) + + If you do define this macro, you should probably do it as follows: + + #ifndef __GNUC__ + #define USE_C_ALLOCA + #else + #define alloca __builtin_alloca + #endif + + so that when the compiler is compiled with GCC it uses the more + efficient built-in `alloca' function. + +`FUNCTION_CONVERSION_BUG' + Define this macro to indicate that the host compiler does not + properly handle converting a function value to a + pointer-to-function when it is used in an expression. + +`MULTIBYTE_CHARS' + Define this macro to enable support for multibyte characters in the + input to GCC. This requires that the host system support the ANSI + C library functions for converting multibyte characters to wide + characters. + +`POSIX' + Define this if your system is POSIX.1 compliant. + +`NO_SYS_SIGLIST' + Define this if your system *does not* provide the variable + `sys_siglist'. + + Some systems do provide this variable, but with a different name + such as `_sys_siglist'. On these systems, you can define + `sys_siglist' as a macro which expands into the name actually + provided. + + Autoconf normally defines `SYS_SIGLIST_DECLARED' when it finds a + declaration of `sys_siglist' in the system header files. However, + when you define `sys_siglist' to a different name autoconf will + not automatically define `SYS_SIGLIST_DECLARED'. Therefore, if + you define `sys_siglist', you should also define + `SYS_SIGLIST_DECLARED'. + +`USE_PROTOTYPES' + Define this to be 1 if you know that the host compiler supports + prototypes, even if it doesn't define __STDC__, or define it to be + 0 if you do not want any prototypes used in compiling GCC. If + `USE_PROTOTYPES' is not defined, it will be determined + automatically whether your compiler supports prototypes by + checking if `__STDC__' is defined. + +`NO_MD_PROTOTYPES' + Define this if you wish suppression of prototypes generated from + the machine description file, but to use other prototypes within + GCC. If `USE_PROTOTYPES' is defined to be 0, or the host compiler + does not support prototypes, this macro has no effect. + +`MD_CALL_PROTOTYPES' + Define this if you wish to generate prototypes for the `gen_call' + or `gen_call_value' functions generated from the machine + description file. If `USE_PROTOTYPES' is defined to be 0, or the + host compiler does not support prototypes, or `NO_MD_PROTOTYPES' + is defined, this macro has no effect. As soon as all of the + machine descriptions are modified to have the appropriate number + of arguments, this macro will be removed. + +`PATH_SEPARATOR' + Define this macro to be a C character constant representing the + character used to separate components in paths. The default value + is the colon character + +`DIR_SEPARATOR' + If your system uses some character other than slash to separate + directory names within a file specification, define this macro to + be a C character constant specifying that character. When GCC + displays file names, the character you specify will be used. GCC + will test for both slash and the character you specify when + parsing filenames. + +`OBJECT_SUFFIX' + Define this macro to be a C string representing the suffix for + object files on your machine. If you do not define this macro, + GCC will use `.o' as the suffix for object files. + +`EXECUTABLE_SUFFIX' + Define this macro to be a C string representing the suffix for + executable files on your machine. If you do not define this + macro, GCC will use the null string as the suffix for object files. + +`COLLECT_EXPORT_LIST' + If defined, `collect2' will scan the individual object files + specified on its command line and create an export list for the + linker. Define this macro for systems like AIX, where the linker + discards object files that are not referenced from `main' and uses + export lists. + + In addition, configuration files for system V define `bcopy', +`bzero' and `bcmp' as aliases. Some files define `alloca' as a macro +when compiled with GCC, in order to take advantage of the benefit of +GCC's built-in `alloca'. + + +File: gcc.info, Node: Fragments, Next: Funding, Prev: Config, Up: Top + +Makefile Fragments +****************** + + When you configure GCC using the `configure' script (*note +Installation::.), it will construct the file `Makefile' from the +template file `Makefile.in'. When it does this, it will incorporate +makefile fragment files from the `config' directory, named `t-TARGET' +and `x-HOST'. If these files do not exist, it means nothing needs to +be added for a given target or host. + +* Menu: + +* Target Fragment:: Writing the `t-TARGET' file. +* Host Fragment:: Writing the `x-HOST' file. + + +File: gcc.info, Node: Target Fragment, Next: Host Fragment, Up: Fragments + +The Target Makefile Fragment +============================ + + The target makefile fragment, `t-TARGET', defines special target +dependent variables and targets used in the `Makefile': + +`LIBGCC1' + The rule to use to build `libgcc1.a'. If your target does not + need to use the functions in `libgcc1.a', set this to empty. + *Note Interface::. + +`CROSS_LIBGCC1' + The rule to use to build `libgcc1.a' when building a cross + compiler. If your target does not need to use the functions in + `libgcc1.a', set this to empty. *Note Cross Runtime::. + +`LIBGCC2_CFLAGS' + Compiler flags to use when compiling `libgcc2.c'. + +`LIB2FUNCS_EXTRA' + A list of source file names to be compiled or assembled and + inserted into `libgcc.a'. + +`CRTSTUFF_T_CFLAGS' + Special flags used when compiling `crtstuff.c'. *Note + Initialization::. + +`CRTSTUFF_T_CFLAGS_S' + Special flags used when compiling `crtstuff.c' for shared linking. + Used if you use `crtbeginS.o' and `crtendS.o' in `EXTRA-PARTS'. + *Note Initialization::. + +`MULTILIB_OPTIONS' + For some targets, invoking GCC in different ways produces objects + that can not be linked together. For example, for some targets GCC + produces both big and little endian code. For these targets, you + must arrange for multiple versions of `libgcc.a' to be compiled, + one for each set of incompatible options. When GCC invokes the + linker, it arranges to link in the right version of `libgcc.a', + based on the command line options used. + + The `MULTILIB_OPTIONS' macro lists the set of options for which + special versions of `libgcc.a' must be built. Write options that + are mutually incompatible side by side, separated by a slash. + Write options that may be used together separated by a space. The + build procedure will build all combinations of compatible options. + + For example, if you set `MULTILIB_OPTIONS' to `m68000/m68020 + msoft-float', `Makefile' will build special versions of `libgcc.a' + using the following sets of options: `-m68000', `-m68020', + `-msoft-float', `-m68000 -msoft-float', and `-m68020 -msoft-float'. + +`MULTILIB_DIRNAMES' + If `MULTILIB_OPTIONS' is used, this variable specifies the + directory names that should be used to hold the various libraries. + Write one element in `MULTILIB_DIRNAMES' for each element in + `MULTILIB_OPTIONS'. If `MULTILIB_DIRNAMES' is not used, the + default value will be `MULTILIB_OPTIONS', with all slashes treated + as spaces. + + For example, if `MULTILIB_OPTIONS' is set to `m68000/m68020 + msoft-float', then the default value of `MULTILIB_DIRNAMES' is + `m68000 m68020 msoft-float'. You may specify a different value if + you desire a different set of directory names. + +`MULTILIB_MATCHES' + Sometimes the same option may be written in two different ways. + If an option is listed in `MULTILIB_OPTIONS', GCC needs to know + about any synonyms. In that case, set `MULTILIB_MATCHES' to a + list of items of the form `option=option' to describe all relevant + synonyms. For example, `m68000=mc68000 m68020=mc68020'. + +`MULTILIB_EXCEPTIONS' + Sometimes when there are multiple sets of `MULTILIB_OPTIONS' being + specified, there are combinations that should not be built. In + that case, set `MULTILIB_EXCEPTIONS' to be all of the switch + exceptions in shell case syntax that should not be built. + + For example, in the PowerPC embedded ABI support, it was not + desirable to build libraries that compiled with the + `-mcall-aixdesc' option and either of the `-mcall-aixdesc' or + `-mlittle' options at the same time, and therefore + `MULTILIB_EXCEPTIONS' is set to `*mrelocatable/*mcall-aixdesc* + *mlittle/*mcall-aixdesc*'. + +`MULTILIB_EXTRA_OPTS' + Sometimes it is desirable that when building multiple versions of + `libgcc.a' certain options should always be passed on to the + compiler. In that case, set `MULTILIB_EXTRA_OPTS' to be the list + of options to be used for all builds. + + +File: gcc.info, Node: Host Fragment, Prev: Target Fragment, Up: Fragments + +The Host Makefile Fragment +========================== + + The host makefile fragment, `x-HOST', defines special host dependent +variables and targets used in the `Makefile': + +`CC' + The compiler to use when building the first stage. + +`CLIB' + Additional host libraries to link with. + +`OLDCC' + The compiler to use when building `libgcc1.a' for a native + compilation. + +`OLDAR' + The version of `ar' to use when building `libgcc1.a' for a native + compilation. + +`INSTALL' + The install program to use. + + +File: gcc.info, Node: Funding, Next: GNU/Linux, Prev: Fragments, Up: Top + +Funding Free Software +********************* + + If you want to have more free software a few years from now, it makes +sense for you to help encourage people to contribute funds for its +development. The most effective approach known is to encourage +commercial redistributors to donate. + + Users of free software systems can boost the pace of development by +encouraging for-a-fee distributors to donate part of their selling price +to free software developers--the Free Software Foundation, and others. + + The way to convince distributors to do this is to demand it and +expect it from them. So when you compare distributors, judge them +partly by how much they give to free software development. Show +distributors they must compete to be the one who gives the most. + + To make this approach work, you must insist on numbers that you can +compare, such as, "We will donate ten dollars to the Frobnitz project +for each disk sold." Don't be satisfied with a vague promise, such as +"A portion of the profits are donated," since it doesn't give a basis +for comparison. + + Even a precise fraction "of the profits from this disk" is not very +meaningful, since creative accounting and unrelated business decisions +can greatly alter what fraction of the sales price counts as profit. +If the price you pay is $50, ten percent of the profit is probably less +than a dollar; it might be a few cents, or nothing at all. + + Some redistributors do development work themselves. This is useful +too; but to keep everyone honest, you need to inquire how much they do, +and what kind. Some kinds of development make much more long-term +difference than others. For example, maintaining a separate version of +a program contributes very little; maintaining the standard version of a +program for the whole community contributes much. Easy new ports +contribute little, since someone else would surely do them; difficult +ports such as adding a new CPU to the GNU Compiler Collection +contribute more; major new features or packages contribute the most. + + By establishing the idea that supporting further development is "the +proper thing to do" when distributing free software for a fee, we can +assure a steady flow of resources into making more free software. + + Copyright (C) 1994 Free Software Foundation, Inc. + Verbatim copying and redistribution of this section is permitted + without royalty; alteration is not permitted. + + +File: gcc.info, Node: GNU/Linux, Next: Copying, Prev: Funding, Up: Top + +Linux and the GNU Project +************************* + + Many computer users run a modified version of the GNU system every +day, without realizing it. Through a peculiar turn of events, the +version of GNU which is widely used today is more often known as +"Linux", and many users are not aware of the extent of its connection +with the GNU Project. + + There really is a Linux; it is a kernel, and these people are using +it. But you can't use a kernel by itself; a kernel is useful only as +part of a whole system. The system in which Linux is typically used is +a modified variant of the GNU system--in other words, a Linux-based GNU +system. + + Many users are not fully aware of the distinction between the kernel, +which is Linux, and the whole system, which they also call "Linux". +The ambiguous use of the name doesn't promote understanding. + + Programmers generally know that Linux is a kernel. But since they +have generally heard the whole system called "Linux" as well, they +often envisage a history which fits that name. For example, many +believe that once Linus Torvalds finished writing the kernel, his +friends looked around for other free software, and for no particular +reason most everything necessary to make a Unix-like system was already +available. + + What they found was no accident--it was the GNU system. The +available free software added up to a complete system because the GNU +Project had been working since 1984 to make one. The GNU Manifesto had +set forth the goal of developing a free Unix-like system, called GNU. +By the time Linux was written, the system was almost finished. + + Most free software projects have the goal of developing a particular +program for a particular job. For example, Linus Torvalds set out to +write a Unix-like kernel (Linux); Donald Knuth set out to write a text +formatter (TeX); Bob Scheifler set out to develop a window system (X +Windows). It's natural to measure the contribution of this kind of +project by specific programs that came from the project. + + If we tried to measure the GNU Project's contribution in this way, +what would we conclude? One CD-ROM vendor found that in their "Linux +distribution", GNU software was the largest single contingent, around +28% of the total source code, and this included some of the essential +major components without which there could be no system. Linux itself +was about 3%. So if you were going to pick a name for the system based +on who wrote the programs in the system, the most appropriate single +choice would be "GNU". + + But we don't think that is the right way to consider the question. +The GNU Project was not, is not, a project to develop specific software +packages. It was not a project to develop a C compiler, although we +did. It was not a project to develop a text editor, although we +developed one. The GNU Project's aim was to develop *a complete free +Unix-like system*. + + Many people have made major contributions to the free software in the +system, and they all deserve credit. But the reason it is *a +system*--and not just a collection of useful programs--is because the +GNU Project set out to make it one. We wrote the programs that were +needed to make a *complete* free system. We wrote essential but +unexciting major components, such as the assembler and linker, because +you can't have a system without them. A complete system needs more +than just programming tools, so we wrote other components as well, such +as the Bourne Again SHell, the PostScript interpreter Ghostscript, and +the GNU C library. + + By the early 90s we had put together the whole system aside from the +kernel (and we were also working on a kernel, the GNU Hurd, which runs +on top of Mach). Developing this kernel has been a lot harder than we +expected, and we are still working on finishing it. + + Fortunately, you don't have to wait for it, because Linux is working +now. When Linus Torvalds wrote Linux, he filled the last major gap. +People could then put Linux together with the GNU system to make a +complete free system: a Linux-based GNU system (or GNU/Linux system, +for short). + + Putting them together sounds simple, but it was not a trivial job. +The GNU C library (called glibc for short) needed substantial changes. +Integrating a complete system as a distribution that would work "out of +the box" was a big job, too. It required addressing the issue of how +to install and boot the system--a problem we had not tackled, because +we hadn't yet reached that point. The people who developed the various +system distributions made a substantial contribution. + + The GNU Project supports GNU/Linux systems as well as *the* GNU +system--even with funds. We funded the rewriting of the Linux-related +extensions to the GNU C library, so that now they are well integrated, +and the newest GNU/Linux systems use the current library release with +no changes. We also funded an early stage of the development of Debian +GNU/Linux. + + We use Linux-based GNU systems today for most of our work, and we +hope you use them too. But please don't confuse the public by using the +name "Linux" ambiguously. Linux is the kernel, one of the essential +major components of the system. The system as a whole is more or less +the GNU system. + diff --git a/usr/local/nachos/info/gcc.info-29 b/usr/local/nachos/info/gcc.info-29 new file mode 100644 index 0000000..a913352 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-29 @@ -0,0 +1,535 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Copying, Next: Contributors, Prev: GNU/Linux, Up: Top + +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. + + 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. + + ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. + Copyright (C) YYYY NAME OF AUTHOR + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 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) YYYY NAME OF AUTHOR + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details + type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + + The hypothetical commands `show w' and `show c' should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and `show +c'; they could even be mouse-clicks or menu items--whatever suits your +program. + + You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the program, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + SIGNATURE OF TY COON, 1 April 1989 + Ty Coon, President of Vice + + This General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Library General Public License instead of this License. + + +File: gcc.info, Node: Contributors, Next: Index, Prev: Copying, Up: Top + +Contributors to GCC +******************* + + In addition to Richard Stallman, several people have written parts +of GCC. + + * The idea of using RTL and some of the optimization ideas came from + the program PO written at the University of Arizona by Jack + Davidson and Christopher Fraser. See "Register Allocation and + Exhaustive Peephole Optimization", Software Practice and + Experience 14 (9), Sept. 1984, 857-866. + + * Paul Rubin wrote most of the preprocessor. + + * Leonard Tower wrote parts of the parser, RTL generator, and RTL + definitions, and of the Vax machine description. + + * Ted Lemon wrote parts of the RTL reader and printer. + + * Jim Wilson implemented loop strength reduction and some other loop + optimizations. + + * Nobuyuki Hikichi of Software Research Associates, Tokyo, + contributed the support for the Sony NEWS machine. + + * Charles LaBrec contributed the support for the Integrated Solutions + 68020 system. + + * Michael Tiemann of Cygnus Support wrote the front end for C++, as + well as the support for inline functions and instruction + scheduling. Also the descriptions of the National Semiconductor + 32000 series cpu, the SPARC cpu and part of the Motorola 88000 cpu. + + * Gerald Baumgartner added the signature extension to the C++ + front-end. + + * Jan Stein of the Chalmers Computer Society provided support for + Genix, as well as part of the 32000 machine description. + + * Randy Smith finished the Sun FPA support. + + * Robert Brown implemented the support for Encore 32000 systems. + + * David Kashtan of SRI adapted GCC to VMS. + + * Alex Crain provided changes for the 3b1. + + * Greg Satz and Chris Hanson assisted in making GCC work on HP-UX for + the 9000 series 300. + + * William Schelter did most of the work on the Intel 80386 support. + + * Christopher Smith did the port for Convex machines. + + * Paul Petersen wrote the machine description for the Alliant FX/8. + + * Dario Dariol contributed the four varieties of sample programs + that print a copy of their source. + + * Alain Lichnewsky ported GCC to the Mips cpu. + + * Devon Bowen, Dale Wiles and Kevin Zachmann ported GCC to the Tahoe. + + * Jonathan Stone wrote the machine description for the Pyramid + computer. + + * Gary Miller ported GCC to Charles River Data Systems machines. + + * Richard Kenner of the New York University Ultracomputer Research + Laboratory wrote the machine descriptions for the AMD 29000, the + DEC Alpha, the IBM RT PC, and the IBM RS/6000 as well as the + support for instruction attributes. He also made changes to + better support RISC processors including changes to common + subexpression elimination, strength reduction, function calling + sequence handling, and condition code support, in addition to + generalizing the code for frame pointer elimination. + + * Richard Kenner and Michael Tiemann jointly developed reorg.c, the + delay slot scheduler. + + * Mike Meissner and Tom Wood of Data General finished the port to the + Motorola 88000. + + * Masanobu Yuhara of Fujitsu Laboratories implemented the machine + description for the Tron architecture (specifically, the Gmicro). + + * NeXT, Inc. donated the front end that supports the Objective C + language. + + * James van Artsdalen wrote the code that makes efficient use of the + Intel 80387 register stack. + + * Mike Meissner at the Open Software Foundation finished the port to + the MIPS cpu, including adding ECOFF debug support, and worked on + the Intel port for the Intel 80386 cpu. Later at Cygnus Support, + he worked on the rs6000 and PowerPC ports. + + * Ron Guilmette implemented the `protoize' and `unprotoize' tools, + the support for Dwarf symbolic debugging information, and much of + the support for System V Release 4. He has also worked heavily on + the Intel 386 and 860 support. + + * Torbjorn Granlund implemented multiply- and divide-by-constant + optimization, improved long long support, and improved leaf + function register allocation. + + * Mike Stump implemented the support for Elxsi 64 bit CPU. + + * John Wehle added the machine description for the Western Electric + 32000 processor used in several 3b series machines (no relation to + the National Semiconductor 32000 processor). + + * Holger Teutsch provided the support for the Clipper cpu. + + * Kresten Krab Thorup wrote the run time support for the Objective C + language. + + * Stephen Moshier contributed the floating point emulator that + assists in cross-compilation and permits support for floating + point numbers wider than 64 bits. + + * David Edelsohn contributed the changes to RS/6000 port to make it + support the PowerPC and POWER2 architectures. + + * Steve Chamberlain wrote the support for the Hitachi SH processor. + + * Peter Schauer wrote the code to allow debugging to work on the + Alpha. + + * Oliver M. Kellogg of Deutsche Aerospace contributed the port to the + MIL-STD-1750A. + + * Michael K. Gschwind contributed the port to the PDP-11. + + * David Reese of Sun Microsystems contributed to the Solaris on + PowerPC port. + diff --git a/usr/local/nachos/info/gcc.info-3 b/usr/local/nachos/info/gcc.info-3 new file mode 100644 index 0000000..f2a614a --- /dev/null +++ b/usr/local/nachos/info/gcc.info-3 @@ -0,0 +1,1158 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Debugging Options, Next: Optimize Options, Prev: Warning Options, Up: Invoking GCC + +Options for Debugging Your Program or GCC +========================================= + + GCC has various special options that are used for debugging either +your program or GCC: + +`-g' + Produce debugging information in the operating system's native + format (stabs, COFF, XCOFF, or DWARF). GDB can work with this + debugging information. + + On most systems that use stabs format, `-g' enables use of extra + debugging information that only GDB can use; this extra information + makes debugging work better in GDB but will probably make other + debuggers crash or refuse to read the program. If you want to + control for certain whether to generate the extra information, use + `-gstabs+', `-gstabs', `-gxcoff+', `-gxcoff', `-gdwarf-1+', or + `-gdwarf-1' (see below). + + Unlike most other C compilers, GCC allows you to use `-g' with + `-O'. The shortcuts taken by optimized code may occasionally + produce surprising results: some variables you declared may not + exist at all; flow of control may briefly move where you did not + expect it; some statements may not be executed because they + compute constant results or their values were already at hand; + some statements may execute in different places because they were + moved out of loops. + + Nevertheless it proves possible to debug optimized output. This + makes it reasonable to use the optimizer for programs that might + have bugs. + + The following options are useful when GCC is generated with the + capability for more than one debugging format. + +`-ggdb' + Produce debugging information for use by GDB. This means to use + the most expressive format available (DWARF 2, stabs, or the + native format if neither of those are supported), including GDB + extensions if at all possible. + +`-gstabs' + Produce debugging information in stabs format (if that is + supported), without GDB extensions. This is the format used by + DBX on most BSD systems. On MIPS, Alpha and System V Release 4 + systems this option produces stabs debugging output which is not + understood by DBX or SDB. On System V Release 4 systems this + option requires the GNU assembler. + +`-gstabs+' + Produce debugging information in stabs format (if that is + supported), using GNU extensions understood only by the GNU + debugger (GDB). The use of these extensions is likely to make + other debuggers crash or refuse to read the program. + +`-gcoff' + Produce debugging information in COFF format (if that is + supported). This is the format used by SDB on most System V + systems prior to System V Release 4. + +`-gxcoff' + Produce debugging information in XCOFF format (if that is + supported). This is the format used by the DBX debugger on IBM + RS/6000 systems. + +`-gxcoff+' + Produce debugging information in XCOFF format (if that is + supported), using GNU extensions understood only by the GNU + debugger (GDB). The use of these extensions is likely to make + other debuggers crash or refuse to read the program, and may cause + assemblers other than the GNU assembler (GAS) to fail with an + error. + +`-gdwarf' + Produce debugging information in DWARF version 1 format (if that is + supported). This is the format used by SDB on most System V + Release 4 systems. + +`-gdwarf+' + Produce debugging information in DWARF version 1 format (if that is + supported), using GNU extensions understood only by the GNU + debugger (GDB). The use of these extensions is likely to make + other debuggers crash or refuse to read the program. + +`-gdwarf-2' + Produce debugging information in DWARF version 2 format (if that is + supported). This is the format used by DBX on IRIX 6. + +`-gLEVEL' +`-ggdbLEVEL' +`-gstabsLEVEL' +`-gcoffLEVEL' +`-gxcoffLEVEL' +`-gdwarfLEVEL' +`-gdwarf-2LEVEL' + Request debugging information and also use LEVEL to specify how + much information. The default level is 2. + + Level 1 produces minimal information, enough for making backtraces + in parts of the program that you don't plan to debug. This + includes descriptions of functions and external variables, but no + information about local variables and no line numbers. + + Level 3 includes extra information, such as all the macro + definitions present in the program. Some debuggers support macro + expansion when you use `-g3'. + +`-p' + Generate extra code to write profile information suitable for the + analysis program `prof'. You must use this option when compiling + the source files you want data about, and you must also use it when + linking. + +`-pg' + Generate extra code to write profile information suitable for the + analysis program `gprof'. You must use this option when compiling + the source files you want data about, and you must also use it when + linking. + +`-a' + Generate extra code to write profile information for basic blocks, + which will record the number of times each basic block is + executed, the basic block start address, and the function name + containing the basic block. If `-g' is used, the line number and + filename of the start of the basic block will also be recorded. + If not overridden by the machine description, the default action is + to append to the text file `bb.out'. + + This data could be analyzed by a program like `tcov'. Note, + however, that the format of the data is not what `tcov' expects. + Eventually GNU `gprof' should be extended to process this data. + +`-Q' + Makes the compiler print out each function name as it is compiled, + and print some statistics about each pass when it finishes. + +`-ax' + Generate extra code to profile basic blocks. Your executable will + produce output that is a superset of that produced when `-a' is + used. Additional output is the source and target address of the + basic blocks where a jump takes place, the number of times a jump + is executed, and (optionally) the complete sequence of basic + blocks being executed. The output is appended to file `bb.out'. + + You can examine different profiling aspects without recompilation. + Your executable will read a list of function names from file + `bb.in'. Profiling starts when a function on the list is entered + and stops when that invocation is exited. To exclude a function + from profiling, prefix its name with `-'. If a function name is + not unique, you can disambiguate it by writing it in the form + `/path/filename.d:functionname'. Your executable will write the + available paths and filenames in file `bb.out'. + + Several function names have a special meaning: + `__bb_jumps__' + Write source, target and frequency of jumps to file `bb.out'. + + `__bb_hidecall__' + Exclude function calls from frequency count. + + `__bb_showret__' + Include function returns in frequency count. + + `__bb_trace__' + Write the sequence of basic blocks executed to file + `bbtrace.gz'. The file will be compressed using the program + `gzip', which must exist in your `PATH'. On systems without + the `popen' function, the file will be named `bbtrace' and + will not be compressed. *Profiling for even a few seconds on + these systems will produce a very large file.* Note: + `__bb_hidecall__' and `__bb_showret__' will not affect the + sequence written to `bbtrace.gz'. + + Here's a short example using different profiling parameters in + file `bb.in'. Assume function `foo' consists of basic blocks 1 + and 2 and is called twice from block 3 of function `main'. After + the calls, block 3 transfers control to block 4 of `main'. + + With `__bb_trace__' and `main' contained in file `bb.in', the + following sequence of blocks is written to file `bbtrace.gz': 0 3 + 1 2 1 2 4. The return from block 2 to block 3 is not shown, + because the return is to a point inside the block and not to the + top. The block address 0 always indicates, that control is + transferred to the trace from somewhere outside the observed + functions. With `-foo' added to `bb.in', the blocks of function + `foo' are removed from the trace, so only 0 3 4 remains. + + With `__bb_jumps__' and `main' contained in file `bb.in', jump + frequencies will be written to file `bb.out'. The frequencies are + obtained by constructing a trace of blocks and incrementing a + counter for every neighbouring pair of blocks in the trace. The + trace 0 3 1 2 1 2 4 displays the following frequencies: + + Jump from block 0x0 to block 0x3 executed 1 time(s) + Jump from block 0x3 to block 0x1 executed 1 time(s) + Jump from block 0x1 to block 0x2 executed 2 time(s) + Jump from block 0x2 to block 0x1 executed 1 time(s) + Jump from block 0x2 to block 0x4 executed 1 time(s) + + With `__bb_hidecall__', control transfer due to call instructions + is removed from the trace, that is the trace is cut into three + parts: 0 3 4, 0 1 2 and 0 1 2. With `__bb_showret__', control + transfer due to return instructions is added to the trace. The + trace becomes: 0 3 1 2 3 1 2 3 4. Note, that this trace is not + the same, as the sequence written to `bbtrace.gz'. It is solely + used for counting jump frequencies. + +`-fprofile-arcs' + Instrument "arcs" during compilation. For each function of your + program, GCC creates a program flow graph, then finds a spanning + tree for the graph. Only arcs that are not on the spanning tree + have to be instrumented: the compiler adds code to count the + number of times that these arcs are executed. When an arc is the + only exit or only entrance to a block, the instrumentation code + can be added to the block; otherwise, a new basic block must be + created to hold the instrumentation code. + + Since not every arc in the program must be instrumented, programs + compiled with this option run faster than programs compiled with + `-a', which adds instrumentation code to every basic block in the + program. The tradeoff: since `gcov' does not have execution + counts for all branches, it must start with the execution counts + for the instrumented branches, and then iterate over the program + flow graph until the entire graph has been solved. Hence, `gcov' + runs a little more slowly than a program which uses information + from `-a'. + + `-fprofile-arcs' also makes it possible to estimate branch + probabilities, and to calculate basic block execution counts. In + general, basic block execution counts do not give enough + information to estimate all branch probabilities. When the + compiled program exits, it saves the arc execution counts to a + file called `SOURCENAME.da'. Use the compiler option + `-fbranch-probabilities' (*note Options that Control Optimization: + Optimize Options.) when recompiling, to optimize using estimated + branch probabilities. + +`-ftest-coverage' + Create data files for the `gcov' code-coverage utility (*note + `gcov': a GCC Test Coverage Program: Gcov.). The data file names + begin with the name of your source file: + + `SOURCENAME.bb' + A mapping from basic blocks to line numbers, which `gcov' + uses to associate basic block execution counts with line + numbers. + + `SOURCENAME.bbg' + A list of all arcs in the program flow graph. This allows + `gcov' to reconstruct the program flow graph, so that it can + compute all basic block and arc execution counts from the + information in the `SOURCENAME.da' file (this last file is + the output from `-fprofile-arcs'). + +`-Q' + Makes the compiler print out each function name as it is compiled, + and print some statistics about each pass when it finishes. + +`-dLETTERS' + Says to make debugging dumps during compilation at times specified + by LETTERS. This is used for debugging the compiler. The file + names for most of the dumps are made by appending a word to the + source file name (e.g. `foo.c.rtl' or `foo.c.jump'). Here are the + possible letters for use in LETTERS, and their meanings: + + `b' + Dump after computing branch probabilities, to `FILE.bp'. + + `c' + Dump after instruction combination, to the file + `FILE.combine'. + + `d' + Dump after delayed branch scheduling, to `FILE.dbr'. + + `D' + Dump all macro definitions, at the end of preprocessing, in + addition to normal output. + + `r' + Dump after RTL generation, to `FILE.rtl'. + + `j' + Dump after first jump optimization, to `FILE.jump'. + + `F' + Dump after purging ADDRESSOF, to `FILE.addressof'. + + `f' + Dump after flow analysis, to `FILE.flow'. + + `g' + Dump after global register allocation, to `FILE.greg'. + + `G' + Dump after GCSE, to `FILE.gcse'. + + `j' + Dump after first jump optimization, to `FILE.jump'. + + `J' + Dump after last jump optimization, to `FILE.jump2'. + + `k' + Dump after conversion from registers to stack, to + `FILE.stack'. + + `l' + Dump after local register allocation, to `FILE.lreg'. + + `L' + Dump after loop optimization, to `FILE.loop'. + + `M' + Dump after performing the machine dependent reorganisation + pass, to `FILE.mach'. + + `N' + Dump after the register move pass, to `FILE.regmove'. + + `r' + Dump after RTL generation, to `FILE.rtl'. + + `R' + Dump after the second instruction scheduling pass, to + `FILE.sched2'. + + `s' + Dump after CSE (including the jump optimization that + sometimes follows CSE), to `FILE.cse'. + + `S' + Dump after the first instruction scheduling pass, to + `FILE.sched'. + + `t' + Dump after the second CSE pass (including the jump + optimization that sometimes follows CSE), to `FILE.cse2'. + + `a' + Produce all the dumps listed above. + + `m' + Print statistics on memory usage, at the end of the run, to + standard error. + + `p' + Annotate the assembler output with a comment indicating which + pattern and alternative was used. The length of each + instruction is also printed. + + `x' + Just generate RTL for a function instead of compiling it. + Usually used with `r'. + + `y' + Dump debugging information during parsing, to standard error. + + `A' + Annotate the assembler output with miscellaneous debugging + information. + +`-fdump-unnumbered' + When doing debugging dumps (see -d option above), suppress + instruction numbers and line number note output. This makes it + more feasible to use diff on debugging dumps for compiler + invokations with different options, in particular with and without + -g. + +`-fpretend-float' + When running a cross-compiler, pretend that the target machine + uses the same floating point format as the host machine. This + causes incorrect output of the actual floating constants, but the + actual instruction sequence will probably be the same as GCC would + make when running on the target machine. + +`-save-temps' + Store the usual "temporary" intermediate files permanently; place + them in the current directory and name them based on the source + file. Thus, compiling `foo.c' with `-c -save-temps' would produce + files `foo.i' and `foo.s', as well as `foo.o'. + +`-print-file-name=LIBRARY' + Print the full absolute name of the library file LIBRARY that + would be used when linking--and don't do anything else. With this + option, GCC does not compile or link anything; it just prints the + file name. + +`-print-prog-name=PROGRAM' + Like `-print-file-name', but searches for a program such as `cpp'. + +`-print-libgcc-file-name' + Same as `-print-file-name=libgcc.a'. + + This is useful when you use `-nostdlib' or `-nodefaultlibs' but + you do want to link with `libgcc.a'. You can do + + gcc -nostdlib FILES... `gcc -print-libgcc-file-name` + +`-print-search-dirs' + Print the name of the configured installation directory and a list + of program and library directories gcc will search--and don't do + anything else. + + This is useful when gcc prints the error message `installation + problem, cannot exec cpp: No such file or directory'. To resolve + this you either need to put `cpp' and the other compiler + components where gcc expects to find them, or you can set the + environment variable `GCC_EXEC_PREFIX' to the directory where you + installed them. Don't forget the trailing '/'. *Note Environment + Variables::. + + +File: gcc.info, Node: Optimize Options, Next: Preprocessor Options, Prev: Debugging Options, Up: Invoking GCC + +Options That Control Optimization +================================= + + These options control various sorts of optimizations: + +`-O' +`-O1' + Optimize. Optimizing compilation takes somewhat more time, and a + lot more memory for a large function. + + Without `-O', the compiler's goal is to reduce the cost of + compilation and to make debugging produce the expected results. + Statements are independent: if you stop the program with a + breakpoint between statements, you can then assign a new value to + any variable or change the program counter to any other statement + in the function and get exactly the results you would expect from + the source code. + + Without `-O', the compiler only allocates variables declared + `register' in registers. The resulting compiled code is a little + worse than produced by PCC without `-O'. + + With `-O', the compiler tries to reduce code size and execution + time. + + When you specify `-O', the compiler turns on `-fthread-jumps' and + `-fdefer-pop' on all machines. The compiler turns on + `-fdelayed-branch' on machines that have delay slots, and + `-fomit-frame-pointer' on machines that can support debugging even + without a frame pointer. On some machines the compiler also turns + on other flags. + +`-O2' + Optimize even more. GCC performs nearly all supported + optimizations that do not involve a space-speed tradeoff. The + compiler does not perform loop unrolling or function inlining when + you specify `-O2'. As compared to `-O', this option increases + both compilation time and the performance of the generated code. + + `-O2' turns on all optional optimizations except for loop + unrolling, function inlining, and strict aliasing optimizations. + It also turns on the `-fforce-mem' option on all machines and + frame pointer elimination on machines where doing so does not + interfere with debugging. + +`-O3' + Optimize yet more. `-O3' turns on all optimizations specified by + `-O2' and also turns on the `inline-functions' option. + +`-O0' + Do not optimize. + +`-Os' + Optimize for size. `-Os' enables all `-O2' optimizations that do + not typically increase code size. It also performs further + optimizations designed to reduce code size. + + If you use multiple `-O' options, with or without level numbers, + the last such option is the one that is effective. + + Options of the form `-fFLAG' specify machine-independent flags. +Most flags have both positive and negative forms; the negative form of +`-ffoo' would be `-fno-foo'. In the table below, only one of the forms +is listed--the one which is not the default. You can figure out the +other form by either removing `no-' or adding it. + +`-ffloat-store' + Do not store floating point variables in registers, and inhibit + other options that might change whether a floating point value is + taken from a register or memory. + + This option prevents undesirable excess precision on machines such + as the 68000 where the floating registers (of the 68881) keep more + precision than a `double' is supposed to have. Similarly for the + x86 architecture. For most programs, the excess precision does + only good, but a few programs rely on the precise definition of + IEEE floating point. Use `-ffloat-store' for such programs, after + modifying them to store all pertinent intermediate computations + into variables. + +`-fno-default-inline' + Do not make member functions inline by default merely because they + are defined inside the class scope (C++ only). Otherwise, when + you specify `-O', member functions defined inside class scope are + compiled inline by default; i.e., you don't need to add `inline' + in front of the member function name. + +`-fno-defer-pop' + Always pop the arguments to each function call as soon as that + function returns. For machines which must pop arguments after a + function call, the compiler normally lets arguments accumulate on + the stack for several function calls and pops them all at once. + +`-fforce-mem' + Force memory operands to be copied into registers before doing + arithmetic on them. This produces better code by making all memory + references potential common subexpressions. When they are not + common subexpressions, instruction combination should eliminate + the separate register-load. The `-O2' option turns on this option. + +`-fforce-addr' + Force memory address constants to be copied into registers before + doing arithmetic on them. This may produce better code just as + `-fforce-mem' may. + +`-fomit-frame-pointer' + Don't keep the frame pointer in a register for functions that + don't need one. This avoids the instructions to save, set up and + restore frame pointers; it also makes an extra register available + in many functions. *It also makes debugging impossible on some + machines.* + + On some machines, such as the Vax, this flag has no effect, because + the standard calling sequence automatically handles the frame + pointer and nothing is saved by pretending it doesn't exist. The + machine-description macro `FRAME_POINTER_REQUIRED' controls + whether a target machine supports this flag. *Note Registers::. + +`-fno-inline' + Don't pay attention to the `inline' keyword. Normally this option + is used to keep the compiler from expanding any functions inline. + Note that if you are not optimizing, no functions can be expanded + inline. + +`-finline-functions' + Integrate all simple functions into their callers. The compiler + heuristically decides which functions are simple enough to be worth + integrating in this way. + + If all calls to a given function are integrated, and the function + is declared `static', then the function is normally not output as + assembler code in its own right. + +`-finline-limit-N' + By default, gcc limits the size of functions that can be inlined. + This flag allows the control of this limit for functions that are + explicitly marked as inline (ie marked with the inline keyword or + defined within the class definition in c++). N is the size of + functions that can be inlined in number of pseudo instructions + (not counting parameter handling). The default value of n is + 10000. Increasing this value can result in more inlined code at + the cost of compilation time and memory consumption. Decreasing + usually makes the compilation faster and less code will be inlined + (which presumably means slower programs). This option is + particularly useful for programs that use inlining heavily such as + those based on recursive templates with c++. + + *Note:* pseudo instruction represents, in this particular context, + an abstract measurement of function's size. In no way, it + represents a count of assembly instructions and as such its exact + meaning might change from one release to an another. + +`-fkeep-inline-functions' + Even if all calls to a given function are integrated, and the + function is declared `static', nevertheless output a separate + run-time callable version of the function. This switch does not + affect `extern inline' functions. + +`-fkeep-static-consts' + Emit variables declared `static const' when optimization isn't + turned on, even if the variables aren't referenced. + + GCC enables this option by default. If you want to force the + compiler to check if the variable was referenced, regardless of + whether or not optimization is turned on, use the + `-fno-keep-static-consts' option. + +`-fno-function-cse' + Do not put function addresses in registers; make each instruction + that calls a constant function contain the function's address + explicitly. + + This option results in less efficient code, but some strange hacks + that alter the assembler output may be confused by the + optimizations performed when this option is not used. + +`-ffast-math' + This option allows GCC to violate some ANSI or IEEE rules and/or + specifications in the interest of optimizing code for speed. For + example, it allows the compiler to assume arguments to the `sqrt' + function are non-negative numbers and that no floating-point values + are NaNs. + + This option should never be turned on by any `-O' option since it + can result in incorrect output for programs which depend on an + exact implementation of IEEE or ANSI rules/specifications for math + functions. + + The following options control specific optimizations. The `-O2' +option turns on all of these optimizations except `-funroll-loops' +`-funroll-all-loops', and `-fstrict-aliasing'. On most machines, the +`-O' option turns on the `-fthread-jumps' and `-fdelayed-branch' +options, but specific machines may handle it differently. + + You can use the following flags in the rare cases when "fine-tuning" +of optimizations to be performed is desired. + +`-fstrength-reduce' + Perform the optimizations of loop strength reduction and + elimination of iteration variables. + +`-fthread-jumps' + Perform optimizations where we check to see if a jump branches to a + location where another comparison subsumed by the first is found. + If so, the first branch is redirected to either the destination of + the second branch or a point immediately following it, depending + on whether the condition is known to be true or false. + +`-fcse-follow-jumps' + In common subexpression elimination, scan through jump instructions + when the target of the jump is not reached by any other path. For + example, when CSE encounters an `if' statement with an `else' + clause, CSE will follow the jump when the condition tested is + false. + +`-fcse-skip-blocks' + This is similar to `-fcse-follow-jumps', but causes CSE to follow + jumps which conditionally skip over blocks. When CSE encounters a + simple `if' statement with no else clause, `-fcse-skip-blocks' + causes CSE to follow the jump around the body of the `if'. + +`-frerun-cse-after-loop' + Re-run common subexpression elimination after loop optimizations + has been performed. + +`-frerun-loop-opt' + Run the loop optimizer twice. + +`-fgcse' + Perform a global common subexpression elimination pass. This pass + also performs global constant and copy propagation. + +`-fexpensive-optimizations' + Perform a number of minor optimizations that are relatively + expensive. + +`-foptimize-register-moves' +`-fregmove' + Attempt to reassign register numbers in move instructions and as + operands of other simple instructions in order to maximize the + amount of register tying. This is especially helpful on machines + with two-operand instructions. GCC enables this optimization by + default with `-O2' or higher. + + Note `-fregmove' and `-foptimize-register-moves' are the same + optimization. + +`-fdelayed-branch' + If supported for the target machine, attempt to reorder + instructions to exploit instruction slots available after delayed + branch instructions. + +`-fschedule-insns' + If supported for the target machine, attempt to reorder + instructions to eliminate execution stalls due to required data + being unavailable. This helps machines that have slow floating + point or memory load instructions by allowing other instructions + to be issued until the result of the load or floating point + instruction is required. + +`-fschedule-insns2' + Similar to `-fschedule-insns', but requests an additional pass of + instruction scheduling after register allocation has been done. + This is especially useful on machines with a relatively small + number of registers and where memory load instructions take more + than one cycle. + +`-ffunction-sections' +`-fdata-sections' + Place each function or data item into its own section in the output + file if the target supports arbitrary sections. The name of the + function or the name of the data item determines the section's name + in the output file. + + Use these options on systems where the linker can perform + optimizations to improve locality of reference in the instruction + space. HPPA processors running HP-UX and Sparc processors running + Solaris 2 have linkers with such optimizations. Other systems + using the ELF object format as well as AIX may have these + optimizations in the future. + + Only use these options when there are significant benefits from + doing so. When you specify these options, the assembler and + linker will create larger object and executable files and will + also be slower. You will not be able to use `gprof' on all + systems if you specify this option and you may have problems with + debugging if you specify both this option and `-g'. + +`-fcaller-saves' + Enable values to be allocated in registers that will be clobbered + by function calls, by emitting extra instructions to save and + restore the registers around such calls. Such allocation is done + only when it seems to result in better code than would otherwise + be produced. + + This option is always enabled by default on certain machines, + usually those which have no call-preserved registers to use + instead. + + For all machines, optimization level 2 and higher enables this + flag by default. + +`-funroll-loops' + Perform the optimization of loop unrolling. This is only done for + loops whose number of iterations can be determined at compile time + or run time. `-funroll-loops' implies both `-fstrength-reduce' and + `-frerun-cse-after-loop'. + +`-funroll-all-loops' + Perform the optimization of loop unrolling. This is done for all + loops and usually makes programs run more slowly. + `-funroll-all-loops' implies `-fstrength-reduce' as well as + `-frerun-cse-after-loop'. + +`-fmove-all-movables' + Forces all invariant computations in loops to be moved outside the + loop. + +`-freduce-all-givs' + Forces all general-induction variables in loops to be + strength-reduced. + + *Note:* When compiling programs written in Fortran, + `-fmove-all-movables' and `-freduce-all-givs' are enabled by + default when you use the optimizer. + + These options may generate better or worse code; results are highly + dependent on the structure of loops within the source code. + + These two options are intended to be removed someday, once they + have helped determine the efficacy of various approaches to + improving loop optimizations. + + Please let us (`gcc@gcc.gnu.org' and `fortran@gnu.org') know how + use of these options affects the performance of your production + code. We're very interested in code that runs *slower* when these + options are *enabled*. + +`-fno-peephole' + Disable any machine-specific peephole optimizations. + +`-fbranch-probabilities' + After running a program compiled with `-fprofile-arcs' (*note + Options for Debugging Your Program or `gcc': Debugging Options.), + you can compile it a second time using `-fbranch-probabilities', + to improve optimizations based on guessing the path a branch might + take. + + With `-fbranch-probabilities', GCC puts a `REG_EXEC_COUNT' note on + the first instruction of each basic block, and a `REG_BR_PROB' + note on each `JUMP_INSN' and `CALL_INSN'. These can be used to + improve optimization. Currently, they are only used in one place: + in `reorg.c', instead of guessing which path a branch is mostly to + take, the `REG_BR_PROB' values are used to exactly determine which + path is taken more often. + +`-fstrict-aliasing' + Allows the compiler to assume the strictest aliasing rules + applicable to the language being compiled. For C (and C++), this + activates optimizations based on the type of expressions. In + particular, an object of one type is assumed never to reside at + the same address as an object of a different type, unless the + types are almost the same. For example, an `unsigned int' can + alias an `int', but not a `void*' or a `double'. A character type + may alias any other type. + + Pay special attention to code like this: + union a_union { + int i; + double d; + }; + + int f() { + a_union t; + t.d = 3.0; + return t.i; + } + The practice of reading from a different union member than the one + most recently written to (called "type-punning") is common. Even + with `-fstrict-aliasing', type-punning is allowed, provided the + memory is accessed through the union type. So, the code above + will work as expected. However, this code might not: + int f() { + a_union t; + int* ip; + t.d = 3.0; + ip = &t.i; + return *ip; + } + + Every language that wishes to perform language-specific alias + analysis should define a function that computes, given an `tree' + node, an alias set for the node. Nodes in different alias sets + are not allowed to alias. For an example, see the C front-end + function `c_get_alias_set'. + + +File: gcc.info, Node: Preprocessor Options, Next: Assembler Options, Prev: Optimize Options, Up: Invoking GCC + +Options Controlling the Preprocessor +==================================== + + These options control the C preprocessor, which is run on each C +source file before actual compilation. + + If you use the `-E' option, nothing is done except preprocessing. +Some of these options make sense only together with `-E' because they +cause the preprocessor output to be unsuitable for actual compilation. + +`-include FILE' + Process FILE as input before processing the regular input file. + In effect, the contents of FILE are compiled first. Any `-D' and + `-U' options on the command line are always processed before + `-include FILE', regardless of the order in which they are + written. All the `-include' and `-imacros' options are processed + in the order in which they are written. + +`-imacros FILE' + Process FILE as input, discarding the resulting output, before + processing the regular input file. Because the output generated + from FILE is discarded, the only effect of `-imacros FILE' is to + make the macros defined in FILE available for use in the main + input. + + Any `-D' and `-U' options on the command line are always processed + before `-imacros FILE', regardless of the order in which they are + written. All the `-include' and `-imacros' options are processed + in the order in which they are written. + +`-idirafter DIR' + Add the directory DIR to the second include path. The directories + on the second include path are searched when a header file is not + found in any of the directories in the main include path (the one + that `-I' adds to). + +`-iprefix PREFIX' + Specify PREFIX as the prefix for subsequent `-iwithprefix' options. + +`-iwithprefix DIR' + Add a directory to the second include path. The directory's name + is made by concatenating PREFIX and DIR, where PREFIX was + specified previously with `-iprefix'. If you have not specified a + prefix yet, the directory containing the installed passes of the + compiler is used as the default. + +`-iwithprefixbefore DIR' + Add a directory to the main include path. The directory's name is + made by concatenating PREFIX and DIR, as in the case of + `-iwithprefix'. + +`-isystem DIR' + Add a directory to the beginning of the second include path, + marking it as a system directory, so that it gets the same special + treatment as is applied to the standard system directories. + +`-nostdinc' + Do not search the standard system directories for header files. + Only the directories you have specified with `-I' options (and the + current directory, if appropriate) are searched. *Note Directory + Options::, for information on `-I'. + + By using both `-nostdinc' and `-I-', you can limit the include-file + search path to only those directories you specify explicitly. + +`-undef' + Do not predefine any nonstandard macros. (Including architecture + flags). + +`-E' + Run only the C preprocessor. Preprocess all the C source files + specified and output the results to standard output or to the + specified output file. + +`-C' + Tell the preprocessor not to discard comments. Used with the `-E' + option. + +`-P' + Tell the preprocessor not to generate `#line' directives. Used + with the `-E' option. + +`-M' + Tell the preprocessor to output a rule suitable for `make' + describing the dependencies of each object file. For each source + file, the preprocessor outputs one `make'-rule whose target is the + object file name for that source file and whose dependencies are + all the `#include' header files it uses. This rule may be a + single line or may be continued with `\'-newline if it is long. + The list of rules is printed on standard output instead of the + preprocessed C program. + + `-M' implies `-E'. + + Another way to specify output of a `make' rule is by setting the + environment variable `DEPENDENCIES_OUTPUT' (*note Environment + Variables::.). + +`-MM' + Like `-M' but the output mentions only the user header files + included with `#include "FILE"'. System header files included + with `#include ' are omitted. + +`-MD' + Like `-M' but the dependency information is written to a file made + by replacing ".c" with ".d" at the end of the input file names. + This is in addition to compiling the file as specified--`-MD' does + not inhibit ordinary compilation the way `-M' does. + + In Mach, you can use the utility `md' to merge multiple dependency + files into a single dependency file suitable for using with the + `make' command. + +`-MMD' + Like `-MD' except mention only user header files, not system + header files. + +`-MG' + Treat missing header files as generated files and assume they live + in the same directory as the source file. If you specify `-MG', + you must also specify either `-M' or `-MM'. `-MG' is not + supported with `-MD' or `-MMD'. + +`-H' + Print the name of each header file used, in addition to other + normal activities. + +`-AQUESTION(ANSWER)' + Assert the answer ANSWER for QUESTION, in case it is tested with a + preprocessing conditional such as `#if #QUESTION(ANSWER)'. `-A-' + disables the standard assertions that normally describe the target + machine. + +`-DMACRO' + Define macro MACRO with the string `1' as its definition. + +`-DMACRO=DEFN' + Define macro MACRO as DEFN. All instances of `-D' on the command + line are processed before any `-U' options. + +`-UMACRO' + Undefine macro MACRO. `-U' options are evaluated after all `-D' + options, but before any `-include' and `-imacros' options. + +`-dM' + Tell the preprocessor to output only a list of the macro + definitions that are in effect at the end of preprocessing. Used + with the `-E' option. + +`-dD' + Tell the preprocessing to pass all macro definitions into the + output, in their proper sequence in the rest of the output. + +`-dN' + Like `-dD' except that the macro arguments and contents are + omitted. Only `#define NAME' is included in the output. + +`-trigraphs' + Support ANSI C trigraphs. The `-ansi' option also has this effect. + +`-Wp,OPTION' + Pass OPTION as an option to the preprocessor. If OPTION contains + commas, it is split into multiple options at the commas. + + +File: gcc.info, Node: Assembler Options, Next: Link Options, Prev: Preprocessor Options, Up: Invoking GCC + +Passing Options to the Assembler +================================ + + You can pass options to the assembler. + +`-Wa,OPTION' + Pass OPTION as an option to the assembler. If OPTION contains + commas, it is split into multiple options at the commas. + + +File: gcc.info, Node: Link Options, Next: Directory Options, Prev: Assembler Options, Up: Invoking GCC + +Options for Linking +=================== + + These options come into play when the compiler links object files +into an executable output file. They are meaningless if the compiler is +not doing a link step. + +`OBJECT-FILE-NAME' + A file name that does not end in a special recognized suffix is + considered to name an object file or library. (Object files are + distinguished from libraries by the linker according to the file + contents.) If linking is done, these object files are used as + input to the linker. + +`-c' +`-S' +`-E' + If any of these options is used, then the linker is not run, and + object file names should not be used as arguments. *Note Overall + Options::. + +`-lLIBRARY' + Search the library named LIBRARY when linking. + + It makes a difference where in the command you write this option; + the linker searches processes libraries and object files in the + order they are specified. Thus, `foo.o -lz bar.o' searches + library `z' after file `foo.o' but before `bar.o'. If `bar.o' + refers to functions in `z', those functions may not be loaded. + + The linker searches a standard list of directories for the library, + which is actually a file named `libLIBRARY.a'. The linker then + uses this file as if it had been specified precisely by name. + + The directories searched include several standard system + directories plus any that you specify with `-L'. + + Normally the files found this way are library files--archive files + whose members are object files. The linker handles an archive + file by scanning through it for members which define symbols that + have so far been referenced but not defined. But if the file that + is found is an ordinary object file, it is linked in the usual + fashion. The only difference between using an `-l' option and + specifying a file name is that `-l' surrounds LIBRARY with `lib' + and `.a' and searches several directories. + +`-lobjc' + You need this special case of the `-l' option in order to link an + Objective C program. + +`-nostartfiles' + Do not use the standard system startup files when linking. The + standard system libraries are used normally, unless `-nostdlib' or + `-nodefaultlibs' is used. + +`-nodefaultlibs' + Do not use the standard system libraries when linking. Only the + libraries you specify will be passed to the linker. The standard + startup files are used normally, unless `-nostartfiles' is used. + The compiler may generate calls to memcmp, memset, and memcpy for + System V (and ANSI C) environments or to bcopy and bzero for BSD + environments. These entries are usually resolved by entries in + libc. These entry points should be supplied through some other + mechanism when this option is specified. + +`-nostdlib' + Do not use the standard system startup files or libraries when + linking. No startup files and only the libraries you specify will + be passed to the linker. The compiler may generate calls to + memcmp, memset, and memcpy for System V (and ANSI C) environments + or to bcopy and bzero for BSD environments. These entries are + usually resolved by entries in libc. These entry points should be + supplied through some other mechanism when this option is + specified. + + One of the standard libraries bypassed by `-nostdlib' and + `-nodefaultlibs' is `libgcc.a', a library of internal subroutines + that GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. (*Note Interfacing to GCC + Output: Interface, for more discussion of `libgcc.a'.) In most + cases, you need `libgcc.a' even when you want to avoid other + standard libraries. In other words, when you specify `-nostdlib' + or `-nodefaultlibs' you should usually specify `-lgcc' as well. + This ensures that you have no unresolved references to internal GCC + library subroutines. (For example, `__main', used to ensure C++ + constructors will be called; *note `collect2': Collect2..) + +`-s' + Remove all symbol table and relocation information from the + executable. + +`-static' + On systems that support dynamic linking, this prevents linking + with the shared libraries. On other systems, this option has no + effect. + +`-shared' + Produce a shared object which can then be linked with other + objects to form an executable. Not all systems support this + option. You must also specify `-fpic' or `-fPIC' on some systems + when you specify this option. + +`-symbolic' + Bind references to global symbols when building a shared object. + Warn about any unresolved references (unless overridden by the + link editor option `-Xlinker -z -Xlinker defs'). Only a few + systems support this option. + +`-Xlinker OPTION' + Pass OPTION as an option to the linker. You can use this to + supply system-specific linker options which GCC does not know how + to recognize. + + If you want to pass an option that takes an argument, you must use + `-Xlinker' twice, once for the option and once for the argument. + For example, to pass `-assert definitions', you must write + `-Xlinker -assert -Xlinker definitions'. It does not work to write + `-Xlinker "-assert definitions"', because this passes the entire + string as a single argument, which is not what the linker expects. + +`-Wl,OPTION' + Pass OPTION as an option to the linker. If OPTION contains + commas, it is split into multiple options at the commas. + +`-u SYMBOL' + Pretend the symbol SYMBOL is undefined, to force linking of + library modules to define it. You can use `-u' multiple times with + different symbols to force loading of additional library modules. + diff --git a/usr/local/nachos/info/gcc.info-30 b/usr/local/nachos/info/gcc.info-30 new file mode 100644 index 0000000..82ebccc --- /dev/null +++ b/usr/local/nachos/info/gcc.info-30 @@ -0,0 +1,2131 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Index, Prev: Contributors, Up: Top + +Index +***** + +* Menu: + +* ! in constraint: Multi-Alternative. +* # in constraint: Modifiers. +* # in template: Output Template. +* #pragma: Misc. +* #pragma implementation, implied: C++ Interface. +* #pragma, reason for not using: Function Attributes. +* $: Dollar Signs. +* % in constraint: Modifiers. +* % in template: Output Template. +* & in constraint: Modifiers. +* ': Incompatibilities. +* (nil): RTL Objects. +* * in constraint: Modifiers. +* * in template: Output Statement. +* + in constraint: Modifiers. +* -lgcc, use with -nodefaultlibs: Link Options. +* -lgcc, use with -nostdlib: Link Options. +* -nodefaultlibs and unresolved references: Link Options. +* -nostdlib and unresolved references: Link Options. +* .sdata/.sdata2 references (PowerPC): RS/6000 and PowerPC Options. +* //: C++ Comments. +* /f in RTL dump: Flags. +* /i in RTL dump: Flags. +* /s in RTL dump: Flags. +* /u in RTL dump: Flags. +* /v in RTL dump: Flags. +* 0 in constraint: Simple Constraints. +* < in constraint: Simple Constraints. +* in constraint: Simple Constraints. +* >?: Min and Max. +* ? in constraint: Multi-Alternative. +* ?: extensions <1>: Conditionals. +* ?: extensions: Lvalues. +* ?: side effect: Conditionals. +* \: Output Template. +* _ in variables in macros: Naming Types. +* __bb: Profiling. +* __bb_init_func: Profiling. +* __bb_init_trace_func: Profiling. +* __bb_trace_func: Profiling. +* __bb_trace_ret: Profiling. +* __builtin_apply: Constructing Calls. +* __builtin_apply_args: Constructing Calls. +* __builtin_args_info: Varargs. +* __builtin_classify_type: Varargs. +* __builtin_constant_p: Other Builtins. +* __builtin_frame_address: Return Address. +* __builtin_next_arg: Varargs. +* __builtin_return: Constructing Calls. +* __builtin_return_address: Return Address. +* __builtin_saveregs: Varargs. +* __CTOR_LIST__: Initialization. +* __DTOR_LIST__: Initialization. +* __extension__: Alternate Keywords. +* __main: Collect2. +* abort <1>: Portability. +* abort: C Dialect Options. +* abs <1>: Arithmetic. +* abs: C Dialect Options. +* abs and attributes: Expressions. +* absM2 instruction pattern: Standard Names. +* absolute value: Arithmetic. +* access to operands: Accessors. +* accessors: Accessors. +* ACCUMULATE_OUTGOING_ARGS: Stack Arguments. +* ACCUMULATE_OUTGOING_ARGS and stack frames: Function Entry. +* ADDITIONAL_REGISTER_NAMES: Instruction Output. +* addM3 instruction pattern: Standard Names. +* addr_diff_vec: Side Effects. +* addr_diff_vec, length of: Insn Lengths. +* addr_vec: Side Effects. +* addr_vec, length of: Insn Lengths. +* address: RTL Template. +* address constraints: Simple Constraints. +* address of a label: Labels as Values. +* ADDRESS_COST: Costs. +* address_operand: Simple Constraints. +* addressing modes: Addressing Modes. +* addressof: Regs and Memory. +* ADJUST_COST: Costs. +* ADJUST_FIELD_ALIGN: Storage Layout. +* ADJUST_INSN_LENGTH: Insn Lengths. +* ADJUST_PRIORITY: Costs. +* aggregates as return values: Aggregate Return. +* alias attribute: Function Attributes. +* aliasing of parameters: Code Gen Options. +* aligned attribute <1>: Type Attributes. +* aligned attribute: Variable Attributes. +* alignment: Alignment. +* ALL_REGS: Register Classes. +* Alliant: Interoperation. +* alloca: C Dialect Options. +* alloca and SunOS: Installation. +* alloca vs variable-length arrays: Variable Length. +* alloca, for SunOS: Sun Install. +* alloca, for Unos: Configurations. +* allocate_stack instruction pattern: Standard Names. +* ALLOCATE_TRAMPOLINE: Trampolines. +* ALTER_HARD_SUBREG: Values in Registers. +* alternate keywords: Alternate Keywords. +* AMD29K options: AMD29K Options. +* analysis, data flow: Passes. +* and: Arithmetic. +* and and attributes: Expressions. +* and, canonicalization of: Insn Canonicalizations. +* andM3 instruction pattern: Standard Names. +* ANSI support: C Dialect Options. +* apostrophes: Incompatibilities. +* APPLY_RESULT_SIZE: Scalar Return. +* ARC Options: ARC Options. +* ARG_POINTER_CFA_OFFSET: Frame Layout. +* ARG_POINTER_REGNUM: Frame Registers. +* ARG_POINTER_REGNUM and virtual registers: Regs and Memory. +* arg_pointer_rtx: Frame Registers. +* ARGS_GROW_DOWNWARD: Frame Layout. +* argument passing: Interface. +* arguments in frame (88k): M88K Options. +* arguments in registers: Register Arguments. +* arguments on stack: Stack Arguments. +* arithmetic libraries: Interface. +* arithmetic shift: Arithmetic. +* arithmetic simplifications: Passes. +* arithmetic, in RTL: Arithmetic. +* ARM options: ARM Options. +* arrays of length zero: Zero Length. +* arrays of variable length: Variable Length. +* arrays, non-lvalue: Subscripting. +* ashift: Arithmetic. +* ashift and attributes: Expressions. +* ashiftrt: Arithmetic. +* ashiftrt and attributes: Expressions. +* ashlM3 instruction pattern: Standard Names. +* ashrM3 instruction pattern: Standard Names. +* asm expressions: Extended Asm. +* ASM_APP_OFF: File Framework. +* ASM_APP_ON: File Framework. +* ASM_BYTE_OP: Data Output. +* ASM_CLOSE_PAREN: Data Output. +* ASM_COMMENT_START: File Framework. +* ASM_DECLARE_FUNCTION_NAME: Label Output. +* ASM_DECLARE_FUNCTION_SIZE: Label Output. +* ASM_DECLARE_OBJECT_NAME: Label Output. +* ASM_FILE_END: File Framework. +* ASM_FILE_START: File Framework. +* ASM_FINAL_SPEC: Driver. +* ASM_FINISH_DECLARE_OBJECT: Label Output. +* ASM_FORMAT_PRIVATE_NAME: Label Output. +* asm_fprintf: Instruction Output. +* ASM_GENERATE_INTERNAL_LABEL: Label Output. +* ASM_GLOBALIZE_LABEL: Label Output. +* ASM_IDENTIFY_GCC: File Framework. +* asm_input: Side Effects. +* ASM_NO_SKIP_IN_TEXT: Alignment Output. +* asm_noperands: Insns. +* ASM_OPEN_PAREN: Data Output. +* asm_operands, RTL sharing: Sharing. +* asm_operands, usage: Assembler. +* ASM_OUTPUT_ADDR_DIFF_ELT: Dispatch Tables. +* ASM_OUTPUT_ADDR_VEC_ELT: Dispatch Tables. +* ASM_OUTPUT_ALIGN: Alignment Output. +* ASM_OUTPUT_ALIGNED_BSS: Uninitialized Data. +* ASM_OUTPUT_ALIGNED_COMMON: Uninitialized Data. +* ASM_OUTPUT_ALIGNED_DECL_COMMON: Uninitialized Data. +* ASM_OUTPUT_ALIGNED_DECL_LOCAL: Uninitialized Data. +* ASM_OUTPUT_ALIGNED_LOCAL: Uninitialized Data. +* ASM_OUTPUT_ASCII: Data Output. +* ASM_OUTPUT_BSS: Uninitialized Data. +* ASM_OUTPUT_BYTE: Data Output. +* ASM_OUTPUT_CASE_END: Dispatch Tables. +* ASM_OUTPUT_CASE_LABEL: Dispatch Tables. +* ASM_OUTPUT_CHAR: Data Output. +* ASM_OUTPUT_COMMON: Uninitialized Data. +* ASM_OUTPUT_CONSTRUCTOR: Macros for Initialization. +* ASM_OUTPUT_DEF: Label Output. +* ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL: Label Output. +* ASM_OUTPUT_DESTRUCTOR: Macros for Initialization. +* ASM_OUTPUT_DOUBLE: Data Output. +* ASM_OUTPUT_DOUBLE_INT: Data Output. +* ASM_OUTPUT_EH_REGION_BEG: Exception Region Output. +* ASM_OUTPUT_EH_REGION_END: Exception Region Output. +* ASM_OUTPUT_EXTERNAL: Label Output. +* ASM_OUTPUT_EXTERNAL_LIBCALL: Label Output. +* ASM_OUTPUT_FLOAT: Data Output. +* ASM_OUTPUT_IDENT: File Framework. +* ASM_OUTPUT_INT: Data Output. +* ASM_OUTPUT_INTERNAL_LABEL: Label Output. +* ASM_OUTPUT_LABEL: Label Output. +* ASM_OUTPUT_LABELREF: Label Output. +* ASM_OUTPUT_LOCAL: Uninitialized Data. +* ASM_OUTPUT_LONG_DOUBLE: Data Output. +* ASM_OUTPUT_MAX_SKIP_ALIGN: Alignment Output. +* ASM_OUTPUT_MI_THUNK: Function Entry. +* ASM_OUTPUT_OPCODE: Instruction Output. +* ASM_OUTPUT_POOL_EPILOGUE: Data Output. +* ASM_OUTPUT_POOL_PROLOGUE: Data Output. +* ASM_OUTPUT_QUADRUPLE_INT: Data Output. +* ASM_OUTPUT_REG_POP: Instruction Output. +* ASM_OUTPUT_REG_PUSH: Instruction Output. +* ASM_OUTPUT_SECTION_NAME: File Framework. +* ASM_OUTPUT_SHARED_BSS: Uninitialized Data. +* ASM_OUTPUT_SHARED_COMMON: Uninitialized Data. +* ASM_OUTPUT_SHARED_LOCAL: Uninitialized Data. +* ASM_OUTPUT_SHORT: Data Output. +* ASM_OUTPUT_SKIP: Alignment Output. +* ASM_OUTPUT_SOURCE_FILENAME: File Framework. +* ASM_OUTPUT_SOURCE_LINE: File Framework. +* ASM_OUTPUT_SPECIAL_POOL_ENTRY: Data Output. +* ASM_OUTPUT_WEAK_ALIAS: Label Output. +* ASM_SPEC: Driver. +* ASM_STABD_OP: DBX Options. +* ASM_STABN_OP: DBX Options. +* ASM_STABS_OP: DBX Options. +* ASM_WEAKEN_LABEL: Label Output. +* assemble_name: Label Output. +* assembler format: File Framework. +* assembler instructions: Extended Asm. +* assembler instructions in RTL: Assembler. +* assembler names for identifiers: Asm Labels. +* assembler syntax, 88k: M88K Options. +* ASSEMBLER_DIALECT: Instruction Output. +* assembly code, invalid: Bug Criteria. +* assigning attribute values to insns: Tagging Insns. +* asterisk in template: Output Statement. +* atof: Cross-compilation. +* attr <1>: Tagging Insns. +* attr: Expressions. +* attr_flag: Expressions. +* attribute expressions: Expressions. +* attribute of types: Type Attributes. +* attribute of variables: Variable Attributes. +* attribute specifications: Attr Example. +* attribute specifications example: Attr Example. +* attributes, defining: Defining Attributes. +* autoincrement addressing, availability: Portability. +* autoincrement/decrement addressing: Simple Constraints. +* autoincrement/decrement analysis: Passes. +* automatic inline for C++ member fns: Inline. +* AVOID_CCMODE_COPIES: Values in Registers. +* backslash: Output Template. +* backtrace for bug reports: Bug Reporting. +* barrier: Insns. +* BASE_REG_CLASS: Register Classes. +* basic blocks: Passes. +* bcmp: Config. +* bCOND instruction pattern: Standard Names. +* bcopy, implicit usage: Library Calls. +* BIGGEST_ALIGNMENT: Storage Layout. +* BIGGEST_FIELD_ALIGNMENT: Storage Layout. +* Bison parser generator: Installation. +* bit fields: Bit Fields. +* bit shift overflow (88k): M88K Options. +* BITFIELD_NBYTES_LIMITED: Storage Layout. +* BITS_BIG_ENDIAN: Storage Layout. +* BITS_BIG_ENDIAN, effect on sign_extract: Bit Fields. +* BITS_PER_UNIT: Storage Layout. +* BITS_PER_WORD: Storage Layout. +* bitwise complement: Arithmetic. +* bitwise exclusive-or: Arithmetic. +* bitwise inclusive-or: Arithmetic. +* bitwise logical-and: Arithmetic. +* BLKmode: Machine Modes. +* BLKmode, and function return values: Calls. +* BLOCK_PROFILER: Profiling. +* BLOCK_PROFILER_CODE: Profiling. +* bound pointer to member function: Bound member functions. +* BRANCH_COST: Costs. +* break_out_memory_refs: Addressing Modes. +* BSS_SECTION_ASM_OP: Sections. +* bug criteria: Bug Criteria. +* bug report mailing lists: Bug Lists. +* bugs: Bugs. +* bugs, known: Trouble. +* builtin functions: C Dialect Options. +* builtin_longjmp instruction pattern: Standard Names. +* BUILTIN_SETJMP_FRAME_VALUE: Frame Layout. +* builtin_setjmp_receiver instruction pattern: Standard Names. +* builtin_setjmp_setup instruction pattern: Standard Names. +* byte writes (29k): AMD29K Options. +* byte_mode: Machine Modes. +* BYTES_BIG_ENDIAN: Storage Layout. +* bzero: Config. +* bzero, implicit usage: Library Calls. +* C compilation options: Invoking GCC. +* C intermediate output, nonexistent: G++ and GCC. +* C language extensions: C Extensions. +* C language, traditional: C Dialect Options. +* C statements for assembler output: Output Statement. +* c++: Invoking G++. +* C++: G++ and GCC. +* C++ comments: C++ Comments. +* C++ compilation options: Invoking GCC. +* C++ interface and implementation headers: C++ Interface. +* C++ language extensions: C++ Extensions. +* C++ member fns, automatically inline: Inline. +* C++ misunderstandings: C++ Misunderstandings. +* C++ named return value: Naming Results. +* C++ options, command line: C++ Dialect Options. +* C++ pragmas, effect on inlining: C++ Interface. +* C++ runtime library: Installation. +* C++ signatures: C++ Signatures. +* C++ source file suffixes: Invoking G++. +* C++ static data, declaring and defining: Static Definitions. +* C++ subtype polymorphism: C++ Signatures. +* C++ type abstraction: C++ Signatures. +* C_INCLUDE_PATH: Environment Variables. +* call: Side Effects. +* call instruction pattern: Standard Names. +* call usage: Calls. +* call-clobbered register: Register Basics. +* call-saved register: Register Basics. +* call-used register: Register Basics. +* call_insn: Insns. +* call_insn and /u: Flags. +* CALL_INSN_FUNCTION_USAGE: Insns. +* call_pop instruction pattern: Standard Names. +* CALL_USED_REGISTERS: Register Basics. +* call_used_regs: Register Basics. +* call_value instruction pattern: Standard Names. +* call_value_pop instruction pattern: Standard Names. +* CALLER_SAVE_PROFITABLE: Caller Saves. +* calling conventions: Stack and Calling. +* calling functions in RTL: Calls. +* calling functions through the function vector on the H8/300 processors: Function Attributes. +* CAN_DEBUG_WITHOUT_FP: Run-time Target. +* CAN_ELIMINATE: Elimination. +* canonicalization of instructions: Insn Canonicalizations. +* CANONICALIZE_COMPARISON: Condition Code. +* canonicalize_funcptr_for_compare instruction pattern: Standard Names. +* case labels in initializers: Labeled Elements. +* case ranges: Case Ranges. +* case sensitivity and VMS: VMS Misc. +* CASE_DROPS_THROUGH: Misc. +* CASE_VALUES_THRESHOLD: Misc. +* CASE_VECTOR_MODE: Misc. +* CASE_VECTOR_PC_RELATIVE: Misc. +* CASE_VECTOR_SHORTEN_MODE: Misc. +* casesi instruction pattern: Standard Names. +* cast to a union: Cast to Union. +* casts as lvalues: Lvalues. +* catgets: Installation. +* CC: Host Fragment. +* cc0: Regs and Memory. +* cc0, RTL sharing: Sharing. +* cc0_rtx: Regs and Memory. +* CC1_SPEC: Driver. +* CC1PLUS_SPEC: Driver. +* cc_status: Condition Code. +* CC_STATUS_MDEP: Condition Code. +* CC_STATUS_MDEP_INIT: Condition Code. +* CCmode: Machine Modes. +* CDImode: Machine Modes. +* change_address: Standard Names. +* CHAR_TYPE_SIZE: Type Layout. +* CHECK_FLOAT_VALUE: Storage Layout. +* check_stack instruction pattern: Standard Names. +* CHImode: Machine Modes. +* class definitions, register: Register Classes. +* class preference constraints: Class Preferences. +* CLASS_LIKELY_SPILLED_P: Register Classes. +* CLASS_MAX_NREGS: Register Classes. +* classes of RTX codes: RTL Classes. +* CLEAR_INSN_CACHE: Trampolines. +* CLIB: Host Fragment. +* clobber: Side Effects. +* clrstrM instruction pattern: Standard Names. +* cmpM instruction pattern: Standard Names. +* cmpstrM instruction pattern: Standard Names. +* code generation conventions: Code Gen Options. +* code generation RTL sequences: Expander Definitions. +* code motion: Passes. +* code_label: Insns. +* code_label and /i: Flags. +* CODE_LABEL_NUMBER: Insns. +* codes, RTL expression: RTL Objects. +* COImode: Machine Modes. +* COLLECT_EXPORT_LIST: Config. +* combiner pass: Regs and Memory. +* command options: Invoking GCC. +* comments, C++ style: C++ Comments. +* common subexpression elimination: Passes. +* COMP_TYPE_ATTRIBUTES: Misc. +* compare: Arithmetic. +* compare, canonicalization of: Insn Canonicalizations. +* comparison of signed and unsigned values, warning: Warning Options. +* compilation in a separate directory: Other Dir. +* compiler bugs, reporting: Bug Reporting. +* compiler compared to C++ preprocessor: G++ and GCC. +* compiler options, C++: C++ Dialect Options. +* compiler passes and files: Passes. +* compiler version, specifying: Target Options. +* COMPILER_PATH: Environment Variables. +* complement, bitwise: Arithmetic. +* complex numbers: Complex. +* compound expressions as lvalues: Lvalues. +* computed gotos: Labels as Values. +* computing the length of an insn: Insn Lengths. +* cond: Comparisons. +* cond and attributes: Expressions. +* condition code register: Regs and Memory. +* condition code status: Condition Code. +* condition codes: Comparisons. +* conditional expressions as lvalues: Lvalues. +* conditional expressions, extensions: Conditionals. +* CONDITIONAL_REGISTER_USAGE: Register Basics. +* conditions, in patterns: Patterns. +* configuration file: Config. +* configurations supported by GNU CC: Configurations. +* conflicting types: Disappointments. +* const applied to function: Function Attributes. +* const function attribute: Function Attributes. +* CONST0_RTX: Constants. +* const0_rtx: Constants. +* CONST1_RTX: Constants. +* const1_rtx: Constants. +* CONST2_RTX: Constants. +* const2_rtx: Constants. +* CONST_CALL_P: Flags. +* CONST_COSTS: Costs. +* const_double: Constants. +* const_double, RTL sharing: Sharing. +* CONST_DOUBLE_CHAIN: Constants. +* CONST_DOUBLE_LOW: Constants. +* CONST_DOUBLE_MEM: Constants. +* CONST_DOUBLE_OK_FOR_LETTER_P: Register Classes. +* const_int: Constants. +* const_int and attribute tests: Expressions. +* const_int and attributes: Expressions. +* const_int, RTL sharing: Sharing. +* CONST_OK_FOR_LETTER_P: Register Classes. +* const_string: Constants. +* const_string and attributes: Expressions. +* const_true_rtx: Constants. +* constant attributes: Constant Attributes. +* constant folding: Passes. +* constant folding and floating point: Cross-compilation. +* constant propagation: Passes. +* CONSTANT_ADDRESS_P: Addressing Modes. +* CONSTANT_AFTER_FUNCTION_P: Data Output. +* CONSTANT_ALIGNMENT: Storage Layout. +* CONSTANT_P: Addressing Modes. +* CONSTANT_POOL_ADDRESS_P: Flags. +* CONSTANT_POOL_BEFORE_FUNCTION: Data Output. +* constants in constraints: Simple Constraints. +* constm1_rtx: Constants. +* constraint modifier characters: Modifiers. +* constraint, matching: Simple Constraints. +* constraints: Constraints. +* constraints, machine specific: Machine Constraints. +* constructing calls: Constructing Calls. +* constructor expressions: Constructors. +* constructor function attribute: Function Attributes. +* constructors vs goto: Destructors and Goto. +* constructors, automatic calls: Collect2. +* constructors, output of: Initialization. +* contributors: Contributors. +* controlling register usage: Register Basics. +* controlling the compilation driver: Driver. +* conventions, run-time: Interface. +* conversions: Conversions. +* Convex options: Convex Options. +* copy propagation: Passes. +* copy_rtx: Addressing Modes. +* copy_rtx_if_shared: Sharing. +* core dump: Bug Criteria. +* cos: C Dialect Options. +* costs of instructions: Costs. +* COSTS_N_INSNS: Costs. +* CPLUS_INCLUDE_PATH: Environment Variables. +* CPP_PREDEFINES: Run-time Target. +* CPP_SPEC: Driver. +* CQImode: Machine Modes. +* cross compilation and floating point: Cross-compilation. +* cross compiling: Target Options. +* cross-compiler, installation: Cross-Compiler. +* cross-jumping: Passes. +* CROSS_LIBGCC1: Target Fragment. +* CRTSTUFF_T_CFLAGS: Target Fragment. +* CRTSTUFF_T_CFLAGS_S: Target Fragment. +* CSImode: Machine Modes. +* CTImode: Machine Modes. +* CUMULATIVE_ARGS: Register Arguments. +* current_function_epilogue_delay_list: Function Entry. +* current_function_is_leaf: Leaf Functions. +* current_function_outgoing_args_size: Stack Arguments. +* current_function_pops_args: Function Entry. +* current_function_pretend_args_size: Function Entry. +* current_function_uses_only_leaf_regs: Leaf Functions. +* d in constraint: Simple Constraints. +* data flow analysis: Passes. +* DATA_ALIGNMENT: Storage Layout. +* data_section: Sections. +* DATA_SECTION_ASM_OP: Sections. +* DBR_OUTPUT_SEQEND: Instruction Output. +* dbr_sequence_length: Instruction Output. +* DBX: Interoperation. +* DBX_BLOCKS_FUNCTION_RELATIVE: DBX Options. +* DBX_CONTIN_CHAR: DBX Options. +* DBX_CONTIN_LENGTH: DBX Options. +* DBX_DEBUGGING_INFO: DBX Options. +* DBX_FUNCTION_FIRST: DBX Options. +* DBX_LBRAC_FIRST: DBX Options. +* DBX_MEMPARM_STABS_LETTER: DBX Options. +* DBX_NO_XREFS: DBX Options. +* DBX_OUTPUT_ENUM: DBX Hooks. +* DBX_OUTPUT_FUNCTION_END: DBX Hooks. +* DBX_OUTPUT_LBRAC: DBX Hooks. +* DBX_OUTPUT_MAIN_SOURCE_DIRECTORY: File Names and DBX. +* DBX_OUTPUT_MAIN_SOURCE_FILE_END: File Names and DBX. +* DBX_OUTPUT_MAIN_SOURCE_FILENAME: File Names and DBX. +* DBX_OUTPUT_RBRAC: DBX Hooks. +* DBX_OUTPUT_SOURCE_FILENAME: File Names and DBX. +* DBX_OUTPUT_STANDARD_TYPES: DBX Hooks. +* DBX_REGISTER_NUMBER: All Debuggers. +* DBX_REGPARM_STABS_CODE: DBX Options. +* DBX_REGPARM_STABS_LETTER: DBX Options. +* DBX_STATIC_CONST_VAR_CODE: DBX Options. +* DBX_STATIC_STAB_DATA_SECTION: DBX Options. +* DBX_TYPE_DECL_STABS_CODE: DBX Options. +* DBX_USE_BINCL: DBX Options. +* DBX_WORKING_DIRECTORY: File Names and DBX. +* DCmode: Machine Modes. +* De Morgan's law: Insn Canonicalizations. +* dead code: Passes. +* dead_or_set_p: Peephole Definitions. +* deallocating variable length arrays: Variable Length. +* debug_rtx: Bug Reporting. +* DEBUG_SYMS_TEXT: DBX Options. +* DEBUGGER_ARG_OFFSET: All Debuggers. +* DEBUGGER_AUTO_OFFSET: All Debuggers. +* debugging information generation: Passes. +* debugging information options: Debugging Options. +* debugging, 88k OCS: M88K Options. +* declaration scope: Incompatibilities. +* declarations inside expressions: Statement Exprs. +* declarations, RTL: RTL Declarations. +* declaring attributes of functions: Function Attributes. +* declaring static data in C++: Static Definitions. +* default implementation, signature member function: C++ Signatures. +* DEFAULT_CALLER_SAVES: Caller Saves. +* DEFAULT_GDB_EXTENSIONS: DBX Options. +* DEFAULT_MAIN_RETURN: Misc. +* DEFAULT_PCC_STRUCT_RETURN: Aggregate Return. +* DEFAULT_RTX_COSTS: Costs. +* DEFAULT_SHORT_ENUMS: Type Layout. +* DEFAULT_SIGNED_CHAR: Type Layout. +* DEFAULT_VTABLE_THUNKS: Storage Layout. +* define_asm_attributes: Tagging Insns. +* define_attr: Defining Attributes. +* define_delay: Delay Slots. +* define_expand: Expander Definitions. +* define_function_unit: Function Units. +* define_insn: Patterns. +* define_insn example: Example. +* define_peephole: Expander Definitions. +* define_split: Insn Splitting. +* defining attributes and their values: Defining Attributes. +* defining jump instruction patterns: Jump Patterns. +* defining peephole optimizers: Peephole Definitions. +* defining RTL sequences for code generation: Expander Definitions. +* defining static data in C++: Static Definitions. +* delay slots, defining: Delay Slots. +* DELAY_SLOTS_FOR_EPILOGUE: Function Entry. +* delayed branch scheduling: Passes. +* dependencies for make as output: Environment Variables. +* dependencies, make: Preprocessor Options. +* DEPENDENCIES_OUTPUT: Environment Variables. +* Dependent Patterns: Dependent Patterns. +* destructor function attribute: Function Attributes. +* destructors vs goto: Destructors and Goto. +* destructors, output of: Initialization. +* detecting -traditional: C Dialect Options. +* DFmode: Machine Modes. +* dialect options: C Dialect Options. +* digits in constraint: Simple Constraints. +* DImode: Machine Modes. +* DIR_SEPARATOR: Config. +* directory options: Directory Options. +* disabling certain registers: Register Basics. +* dispatch table: Dispatch Tables. +* div: Arithmetic. +* div and attributes: Expressions. +* DIVDI3_LIBCALL: Library Calls. +* divide instruction, 88k: M88K Options. +* division: Arithmetic. +* divM3 instruction pattern: Standard Names. +* divmodM4 instruction pattern: Standard Names. +* DIVSI3_LIBCALL: Library Calls. +* DOESNT_NEED_UNWINDER: Exception Region Output. +* dollar signs in identifier names: Dollar Signs. +* DOLLARS_IN_IDENTIFIERS: Misc. +* DONE: Expander Definitions. +* DONT_REDUCE_ADDR: Costs. +* double-word arithmetic: Long Long. +* DOUBLE_TYPE_SIZE: Type Layout. +* downward funargs: Nested Functions. +* driver: Driver. +* DW bit (29k): AMD29K Options. +* DWARF2_DEBUGGING_INFO: SDB and DWARF. +* DWARF2_FRAME_INFO: SDB and DWARF. +* DWARF2_UNWIND_INFO: Exception Region Output. +* DWARF_DEBUGGING_INFO: SDB and DWARF. +* DYNAMIC_CHAIN_ADDRESS: Frame Layout. +* E in constraint: Simple Constraints. +* earlyclobber operand: Modifiers. +* EASY_DIV_EXPR: Misc. +* EDOM, implicit usage: Library Calls. +* eh_epilogue instruction pattern: Standard Names. +* EH_FRAME_SECTION_ASM_OP: Exception Region Output. +* EH_TABLE_LOOKUP: Exception Region Output. +* eight bit data on the H8/300 and H8/300H: Function Attributes. +* ELIGIBLE_FOR_EPILOGUE_DELAY: Function Entry. +* ELIMINABLE_REGS: Elimination. +* empty constraints: No Constraints. +* EMPTY_FIELD_BOUNDARY: Storage Layout. +* ENCODE_SECTION_INFO: Sections. +* ENCODE_SECTION_INFO and address validation: Addressing Modes. +* ENCODE_SECTION_INFO usage: Instruction Output. +* ENDFILE_SPEC: Driver. +* endianness: Portability. +* enum machine_mode: Machine Modes. +* enum reg_class: Register Classes. +* environment variables: Environment Variables. +* epilogue: Function Entry. +* epilogue instruction pattern: Standard Names. +* EPILOGUE_USES: Function Entry. +* eq: Comparisons. +* eq and attributes: Expressions. +* eq_attr: Expressions. +* equal: Comparisons. +* errno, implicit usage: Library Calls. +* error messages: Warnings and Errors. +* escape sequences, traditional: C Dialect Options. +* exception_receiver instruction pattern: Standard Names. +* EXCEPTION_SECTION: Exception Region Output. +* exclamation point: Multi-Alternative. +* exclusive-or, bitwise: Arithmetic. +* EXECUTABLE_SUFFIX: Config. +* exit: C Dialect Options. +* exit status and VMS: VMS Misc. +* EXIT_BODY: Misc. +* EXIT_IGNORE_STACK: Function Entry. +* EXPAND_BUILTIN_SAVEREGS: Varargs. +* expander definitions: Expander Definitions. +* explicit register variables: Explicit Reg Vars. +* expr_list: Insns. +* expression codes: RTL Objects. +* expressions containing statements: Statement Exprs. +* expressions, compound, as lvalues: Lvalues. +* expressions, conditional, as lvalues: Lvalues. +* expressions, constructor: Constructors. +* extended asm: Extended Asm. +* extendMN2 instruction pattern: Standard Names. +* extensible constraints: Simple Constraints. +* extensions, ?: <1>: Conditionals. +* extensions, ?:: Lvalues. +* extensions, C language: C Extensions. +* extensions, C++ language: C++ Extensions. +* extern int target_flags: Run-time Target. +* external declaration scope: Incompatibilities. +* EXTRA_CC_MODES: Condition Code. +* EXTRA_CC_NAMES: Condition Code. +* EXTRA_CONSTRAINT: Register Classes. +* EXTRA_SECTION_FUNCTIONS: Sections. +* EXTRA_SECTIONS: Sections. +* EXTRA_SPECS: Driver. +* extv instruction pattern: Standard Names. +* extzv instruction pattern: Standard Names. +* F in constraint: Simple Constraints. +* fabs: C Dialect Options. +* FAIL: Expander Definitions. +* fatal signal: Bug Criteria. +* FATAL_EXIT_CODE: Config. +* features, optional, in system conventions: Run-time Target. +* ffs <1>: Arithmetic. +* ffs: C Dialect Options. +* ffsM2 instruction pattern: Standard Names. +* file name suffix: Overall Options. +* file names: Link Options. +* files and passes of the compiler: Passes. +* final pass: Passes. +* FINAL_PRESCAN_INSN: Instruction Output. +* FINAL_PRESCAN_LABEL: Instruction Output. +* FINAL_REG_PARM_STACK_SPACE: Stack Arguments. +* final_scan_insn: Function Entry. +* final_sequence: Instruction Output. +* FINALIZE_PIC: PIC. +* FIRST_INSN_ADDRESS: Insn Lengths. +* FIRST_PARM_OFFSET: Frame Layout. +* FIRST_PARM_OFFSET and virtual registers: Regs and Memory. +* FIRST_PSEUDO_REGISTER: Register Basics. +* FIRST_STACK_REG: Stack Registers. +* FIRST_VIRTUAL_REGISTER: Regs and Memory. +* fix: Conversions. +* fix_truncMN2 instruction pattern: Standard Names. +* fixed register: Register Basics. +* FIXED_REGISTERS: Register Basics. +* fixed_regs: Register Basics. +* fixMN2 instruction pattern: Standard Names. +* FIXUNS_TRUNC_LIKE_FIX_TRUNC: Misc. +* fixuns_truncMN2 instruction pattern: Standard Names. +* fixunsMN2 instruction pattern: Standard Names. +* flags in RTL expression: Flags. +* float: Conversions. +* float as function value type: Incompatibilities. +* FLOAT_ARG_TYPE: Library Calls. +* float_extend: Conversions. +* FLOAT_STORE_FLAG_VALUE: Misc. +* float_truncate: Conversions. +* FLOAT_TYPE_SIZE: Type Layout. +* FLOAT_VALUE_TYPE: Library Calls. +* FLOAT_WORDS_BIG_ENDIAN: Storage Layout. +* FLOAT_WORDS_BIG_ENDIAN, (lack of) effect on subreg: Regs and Memory. +* FLOATIFY: Library Calls. +* floating point and cross compilation: Cross-compilation. +* floating point precision <1>: Disappointments. +* floating point precision: Optimize Options. +* floatMN2 instruction pattern: Standard Names. +* floatunsMN2 instruction pattern: Standard Names. +* force_reg: Standard Names. +* format function attribute: Function Attributes. +* format_arg function attribute: Function Attributes. +* forwarding calls: Constructing Calls. +* frame layout: Frame Layout. +* FRAME_GROWS_DOWNWARD: Frame Layout. +* FRAME_GROWS_DOWNWARD and virtual registers: Regs and Memory. +* frame_pointer_needed: Function Entry. +* FRAME_POINTER_REGNUM: Frame Registers. +* FRAME_POINTER_REGNUM and virtual registers: Regs and Memory. +* FRAME_POINTER_REQUIRED: Elimination. +* frame_pointer_rtx: Frame Registers. +* frame_related, inmem: Flags. +* fscanf, and constant strings: Incompatibilities. +* ftruncM2 instruction pattern: Standard Names. +* function addressability on the M32R/D: Function Attributes. +* function attributes: Function Attributes. +* function call conventions: Interface. +* function entry and exit: Function Entry. +* function pointers, arithmetic: Pointer Arith. +* function prototype declarations: Function Prototypes. +* function units, for scheduling: Function Units. +* function, size of pointer to: Pointer Arith. +* function-call insns: Calls. +* FUNCTION_ARG: Register Arguments. +* FUNCTION_ARG_ADVANCE: Register Arguments. +* FUNCTION_ARG_BOUNDARY: Register Arguments. +* FUNCTION_ARG_CALLEE_COPIES: Register Arguments. +* FUNCTION_ARG_PADDING: Register Arguments. +* FUNCTION_ARG_PARTIAL_NREGS: Register Arguments. +* FUNCTION_ARG_PASS_BY_REFERENCE: Register Arguments. +* FUNCTION_ARG_REGNO_P: Register Arguments. +* FUNCTION_BLOCK_PROFILER: Profiling. +* FUNCTION_BLOCK_PROFILER_EXIT: Profiling. +* FUNCTION_BOUNDARY: Storage Layout. +* FUNCTION_CONVERSION_BUG: Config. +* FUNCTION_EPILOGUE: Function Entry. +* FUNCTION_EPILOGUE and trampolines: Trampolines. +* FUNCTION_INCOMING_ARG: Register Arguments. +* FUNCTION_MODE: Misc. +* FUNCTION_OUTGOING_VALUE: Scalar Return. +* FUNCTION_PROFILER: Profiling. +* FUNCTION_PROLOGUE: Function Entry. +* FUNCTION_PROLOGUE and trampolines: Trampolines. +* FUNCTION_VALUE: Scalar Return. +* FUNCTION_VALUE_REGNO_P: Scalar Return. +* functions called via pointer on the RS/6000 and PowerPC: Function Attributes. +* functions in arbitrary sections: Function Attributes. +* functions that are passed arguments in registers on the 386: Function Attributes. +* functions that do not pop the argument stack on the 386: Function Attributes. +* functions that do pop the argument stack on the 386: Function Attributes. +* functions that have no side effects: Function Attributes. +* functions that never return: Function Attributes. +* functions that pop the argument stack on the 386: Function Attributes. +* functions which are exported from a dll on PowerPC Windows NT: Function Attributes. +* functions which are imported from a dll on PowerPC Windows NT: Function Attributes. +* functions which specify exception handling on PowerPC Windows NT: Function Attributes. +* functions with printf, scanf or strftime style arguments: Function Attributes. +* functions, leaf: Leaf Functions. +* g in constraint: Simple Constraints. +* G in constraint: Simple Constraints. +* g++: Invoking G++. +* G++: G++ and GCC. +* GCC: G++ and GCC. +* GCC and portability: Portability. +* GCC command options: Invoking GCC. +* GCC_EXEC_PREFIX: Environment Variables. +* ge: Comparisons. +* ge and attributes: Expressions. +* GEN_ERRNO_RTX: Library Calls. +* gencodes: Passes. +* genconfig: Passes. +* general_operand: RTL Template. +* GENERAL_REGS: Register Classes. +* generalized lvalues: Lvalues. +* generating assembler output: Output Statement. +* generating insns: RTL Template. +* genflags: Passes. +* genflags, crash on Sun 4: Installation Problems. +* get_attr: Expressions. +* get_attr_length: Insn Lengths. +* GET_CLASS_NARROWEST_MODE: Machine Modes. +* GET_CODE: RTL Objects. +* get_frame_size: Elimination. +* get_insns: Insns. +* get_last_insn: Insns. +* GET_MODE: Machine Modes. +* GET_MODE_ALIGNMENT: Machine Modes. +* GET_MODE_BITSIZE: Machine Modes. +* GET_MODE_CLASS: Machine Modes. +* GET_MODE_MASK: Machine Modes. +* GET_MODE_NAME: Machine Modes. +* GET_MODE_NUNITS: Machine Modes. +* GET_MODE_SIZE: Machine Modes. +* GET_MODE_UNIT_SIZE: Machine Modes. +* GET_MODE_WIDER_MODE: Machine Modes. +* GET_RTX_CLASS: RTL Classes. +* GET_RTX_FORMAT: RTL Classes. +* GET_RTX_LENGTH: RTL Classes. +* gettext: Installation. +* geu: Comparisons. +* geu and attributes: Expressions. +* global common subexpression elimination: Passes. +* global offset table: Code Gen Options. +* global register after longjmp: Global Reg Vars. +* global register allocation: Passes. +* global register variables: Global Reg Vars. +* GLOBALDEF: Global Declarations. +* GLOBALREF: Global Declarations. +* GLOBALVALUEDEF: Global Declarations. +* GLOBALVALUEREF: Global Declarations. +* GO_IF_LEGITIMATE_ADDRESS: Addressing Modes. +* GO_IF_MODE_DEPENDENT_ADDRESS: Addressing Modes. +* goto in C++: Destructors and Goto. +* goto with computed label: Labels as Values. +* gp-relative references (MIPS): MIPS Options. +* gprof: Debugging Options. +* greater than: Comparisons. +* grouping options: Invoking GCC. +* gt: Comparisons. +* gt and attributes: Expressions. +* gtu: Comparisons. +* gtu and attributes: Expressions. +* H in constraint: Simple Constraints. +* Haifa scheduler: Installation. +* HANDLE_PRAGMA: Misc. +* HANDLE_PRAGMA_PACK_PUSH_POP: Misc. +* HANDLE_SYSV_PRAGMA: Misc. +* hard registers: Regs and Memory. +* HARD_FRAME_POINTER_REGNUM: Frame Registers. +* HARD_REGNO_CALL_PART_CLOBBERED: Register Basics. +* HARD_REGNO_CALLER_SAVE_MODE: Caller Saves. +* HARD_REGNO_MODE_OK: Values in Registers. +* HARD_REGNO_NREGS: Values in Registers. +* hardware models and configurations, specifying: Submodel Options. +* HAS_INIT_SECTION: Macros for Initialization. +* HAVE_ATEXIT: Misc. +* HAVE_POST_DECREMENT: Addressing Modes. +* HAVE_POST_INCREMENT: Addressing Modes. +* HAVE_PRE_DECREMENT: Addressing Modes. +* HAVE_PRE_INCREMENT: Addressing Modes. +* header files and VMS: Include Files and VMS. +* hex floats: Hex Floats. +* high: Constants. +* HImode: Machine Modes. +* HImode, in insn: Insns. +* host makefile fragment: Host Fragment. +* HOST_BITS_PER_CHAR: Config. +* HOST_BITS_PER_INT: Config. +* HOST_BITS_PER_LONG: Config. +* HOST_BITS_PER_SHORT: Config. +* HOST_FLOAT_FORMAT: Config. +* HOST_FLOAT_WORDS_BIG_ENDIAN: Config. +* HOST_WORDS_BIG_ENDIAN: Config. +* hosted environment: C Dialect Options. +* HPPA Options: HPPA Options. +* I in constraint: Simple Constraints. +* i in constraint: Simple Constraints. +* i386 Options: i386 Options. +* IBM RS/6000 and PowerPC Options: RS/6000 and PowerPC Options. +* IBM RT options: RT Options. +* IBM RT PC: Interoperation. +* identifier names, dollar signs in: Dollar Signs. +* identifiers, names in assembler code: Asm Labels. +* identifying source, compiler (88k): M88K Options. +* IEEE_FLOAT_FORMAT: Storage Layout. +* if_then_else: Comparisons. +* if_then_else and attributes: Expressions. +* if_then_else usage: Side Effects. +* immediate_operand: RTL Template. +* IMMEDIATE_PREFIX: Instruction Output. +* implicit argument: return value: Naming Results. +* IMPLICIT_FIX_EXPR: Misc. +* implied #pragma implementation: C++ Interface. +* in_data: Sections. +* in_struct: Flags. +* in_struct, in code_label: Flags. +* in_struct, in insn: Flags. +* in_struct, in label_ref: Flags. +* in_struct, in mem: Flags. +* in_struct, in reg: Flags. +* in_struct, in subreg: Flags. +* in_text: Sections. +* include files and VMS: Include Files and VMS. +* INCLUDE_DEFAULTS: Driver. +* inclusive-or, bitwise: Arithmetic. +* INCOMING_FRAME_SP_OFFSET: Frame Layout. +* INCOMING_REGNO: Register Basics. +* INCOMING_RETURN_ADDR_RTX: Frame Layout. +* incompatibilities of GCC: Incompatibilities. +* increment operators: Bug Criteria. +* INDEX_REG_CLASS: Register Classes. +* indirect_jump instruction pattern: Standard Names. +* INIT_CUMULATIVE_ARGS: Register Arguments. +* INIT_CUMULATIVE_INCOMING_ARGS: Register Arguments. +* INIT_ENVIRONMENT: Driver. +* INIT_SECTION_ASM_OP <1>: Macros for Initialization. +* INIT_SECTION_ASM_OP: Sections. +* INIT_TARGET_OPTABS: Library Calls. +* INITIAL_ELIMINATION_OFFSET: Elimination. +* INITIAL_FRAME_POINTER_OFFSET: Elimination. +* initialization routines: Initialization. +* initializations in expressions: Constructors. +* INITIALIZE_TRAMPOLINE: Trampolines. +* initializers with labeled elements: Labeled Elements. +* initializers, non-constant: Initializers. +* inline automatic for C++ member fns: Inline. +* inline functions: Inline. +* inline functions, omission of: Inline. +* inline, automatic: Passes. +* inlining and C++ pragmas: C++ Interface. +* INSERT_ATTRIBUTES: Misc. +* insn: Insns. +* insn and /i: Flags. +* insn and /s: Flags. +* insn and /u: Flags. +* insn attributes: Insn Attributes. +* insn canonicalization: Insn Canonicalizations. +* insn lengths, computing: Insn Lengths. +* insn splitting: Insn Splitting. +* insn-attr.h: Defining Attributes. +* INSN_ANNULLED_BRANCH_P: Flags. +* INSN_CACHE_DEPTH: Trampolines. +* INSN_CACHE_LINE_WIDTH: Trampolines. +* INSN_CACHE_SIZE: Trampolines. +* INSN_CLOBBERS_REGNO_P: Obsolete Register Macros. +* INSN_CODE: Insns. +* INSN_DELETED_P: Flags. +* INSN_FROM_TARGET_P: Flags. +* insn_list: Insns. +* INSN_REFERENCES_ARE_DELAYED: Misc. +* INSN_SETS_ARE_DELAYED: Misc. +* INSN_UID: Insns. +* insns: Insns. +* insns, generating: RTL Template. +* insns, recognizing: RTL Template. +* INSTALL: Host Fragment. +* installation trouble: Trouble. +* installing GNU CC: Installation. +* installing GNU CC on the Sun: Sun Install. +* installing GNU CC on VMS: VMS Install. +* instruction attributes: Insn Attributes. +* instruction combination: Passes. +* instruction patterns: Patterns. +* instruction recognizer: Passes. +* instruction scheduling: Passes. +* instruction splitting: Insn Splitting. +* insv instruction pattern: Standard Names. +* INT_TYPE_SIZE: Type Layout. +* INTEGRATE_THRESHOLD: Misc. +* integrated: Flags. +* integrated, in insn: Flags. +* integrated, in reg: Flags. +* integrating function code: Inline. +* Intel 386 Options: i386 Options. +* Interdependence of Patterns: Dependent Patterns. +* interface and implementation headers, C++: C++ Interface. +* interfacing to GCC output: Interface. +* intermediate C version, nonexistent: G++ and GCC. +* Internal Compiler Checking: Installation. +* interrupt handler functions on the H8/300 processors: Function Attributes. +* interrupt handlers on the M32R/D: Function Attributes. +* INTIFY: Library Calls. +* introduction: Top. +* invalid assembly code: Bug Criteria. +* invalid input: Bug Criteria. +* INVOKE__main: Macros for Initialization. +* invoking g++: Invoking G++. +* ior: Arithmetic. +* ior and attributes: Expressions. +* ior, canonicalization of: Insn Canonicalizations. +* iorM3 instruction pattern: Standard Names. +* IS_ASM_LOGICAL_LINE_SEPARATOR: Data Output. +* isinf: Cross-compilation. +* isnan: Cross-compilation. +* ISSUE_RATE: Misc. +* jump instruction patterns: Jump Patterns. +* jump instructions and set: Side Effects. +* jump optimization: Passes. +* jump threading: Passes. +* jump_insn: Insns. +* JUMP_LABEL: Insns. +* JUMP_TABLES_IN_TEXT_SECTION: Sections. +* kernel and user registers (29k): AMD29K Options. +* keywords, alternate: Alternate Keywords. +* known causes of trouble: Trouble. +* LABEL_ALIGN: Alignment Output. +* LABEL_ALIGN_AFTER_BARRIER: Alignment Output. +* LABEL_NUSES: Insns. +* LABEL_OUTSIDE_LOOP_P: Flags. +* LABEL_PRESERVE_P: Flags. +* label_ref: Constants. +* label_ref and /s: Flags. +* label_ref, RTL sharing: Sharing. +* labeled elements in initializers: Labeled Elements. +* labels as values: Labels as Values. +* labs: C Dialect Options. +* LANG: Environment Variables. +* language dialect options: C Dialect Options. +* large bit shifts (88k): M88K Options. +* large return values: Aggregate Return. +* LAST_STACK_REG: Stack Registers. +* LAST_VIRTUAL_REGISTER: Regs and Memory. +* LC_ALL: Environment Variables. +* LC_CTYPE: Environment Variables. +* LC_MESSAGES: Environment Variables. +* LD_FINI_SWITCH: Macros for Initialization. +* LD_INIT_SWITCH: Macros for Initialization. +* LDD_SUFFIX: Macros for Initialization. +* ldexp: Cross-compilation. +* le: Comparisons. +* le and attributes: Expressions. +* leaf functions: Leaf Functions. +* leaf_function_p: Standard Names. +* LEAF_REG_REMAP: Leaf Functions. +* LEAF_REGISTERS: Leaf Functions. +* left rotate: Arithmetic. +* left shift: Arithmetic. +* LEGITIMATE_CONSTANT_P: Addressing Modes. +* LEGITIMATE_PIC_OPERAND_P: PIC. +* LEGITIMIZE_ADDRESS: Addressing Modes. +* LEGITIMIZE_RELOAD_ADDRESS: Addressing Modes. +* length-zero arrays: Zero Length. +* less than: Comparisons. +* less than or equal: Comparisons. +* leu: Comparisons. +* leu and attributes: Expressions. +* LIB2FUNCS_EXTRA: Target Fragment. +* LIB_SPEC: Driver. +* LIBCALL_VALUE: Scalar Return. +* libgcc.a: Library Calls. +* LIBGCC1: Target Fragment. +* LIBGCC2_CFLAGS: Target Fragment. +* LIBGCC2_WORDS_BIG_ENDIAN: Storage Layout. +* LIBGCC_NEEDS_DOUBLE: Library Calls. +* LIBGCC_SPEC: Driver. +* Libraries: Link Options. +* library subroutine names: Library Calls. +* LIBRARY_PATH: Environment Variables. +* libstdc++: Installation. +* LIMIT_RELOAD_CLASS: Register Classes. +* link options: Link Options. +* LINK_COMMAND_SPEC: Driver. +* LINK_LIBGCC_SPECIAL: Driver. +* LINK_LIBGCC_SPECIAL_1: Driver. +* LINK_SPEC: Driver. +* LINKER_DOES_NOT_WORK_WITH_DWARF2: SDB and DWARF. +* lo_sum: Arithmetic. +* load address instruction: Simple Constraints. +* LOAD_ARGS_REVERSED: Register Arguments. +* LOAD_EXTEND_OP: Misc. +* load_multiple instruction pattern: Standard Names. +* local labels: Local Labels. +* local register allocation: Passes. +* local variables in macros: Naming Types. +* local variables, specifying registers: Local Reg Vars. +* LOCAL_ALIGNMENT: Storage Layout. +* LOCAL_INCLUDE_DIR: Driver. +* LOCAL_LABEL_PREFIX: Instruction Output. +* locale: Environment Variables. +* locale definition: Environment Variables. +* LOG_LINKS: Insns. +* logical-and, bitwise: Arithmetic. +* long long data types: Long Long. +* LONG_DOUBLE_TYPE_SIZE: Type Layout. +* LONG_LONG_TYPE_SIZE: Type Layout. +* LONG_TYPE_SIZE: Type Layout. +* longjmp: Global Reg Vars. +* longjmp and automatic variables <1>: Interface. +* longjmp and automatic variables: C Dialect Options. +* longjmp incompatibilities: Incompatibilities. +* longjmp warnings: Warning Options. +* LONGJMP_RESTORE_FROM_STACK: Elimination. +* loop optimization: Passes. +* LOOP_ALIGN: Alignment Output. +* lshiftrt: Arithmetic. +* lshiftrt and attributes: Expressions. +* lshrM3 instruction pattern: Standard Names. +* lt: Comparisons. +* lt and attributes: Expressions. +* ltu: Comparisons. +* lvalues, generalized: Lvalues. +* m in constraint: Simple Constraints. +* M32R/D options: M32R/D Options. +* M680x0 options: M680x0 Options. +* M88k options: M88K Options. +* machine dependent options: Submodel Options. +* machine description macros: Target Macros. +* machine descriptions: Machine Desc. +* machine mode conversions: Conversions. +* machine modes: Machine Modes. +* machine specific constraints: Machine Constraints. +* MACHINE_DEPENDENT_REORG: Misc. +* MACHINE_STATE_RESTORE: Profiling. +* MACHINE_STATE_SAVE: Profiling. +* macro with variable arguments: Macro Varargs. +* macros containing asm: Extended Asm. +* macros, inline alternative: Inline. +* macros, local labels: Local Labels. +* macros, local variables in: Naming Types. +* macros, statements in expressions: Statement Exprs. +* macros, target description: Target Macros. +* macros, types of arguments: Typeof. +* main and the exit status: VMS Misc. +* make: Preprocessor Options. +* MAKE_DECL_ONE_ONLY (DECL): Label Output. +* make_safe_from: Expander Definitions. +* makefile fragment: Fragments. +* MASK_RETURN_ADDR: Exception Region Output. +* match_dup: RTL Template. +* match_dup and attributes: Insn Lengths. +* match_insn: RTL Template. +* match_insn2: RTL Template. +* match_op_dup: RTL Template. +* match_operand: RTL Template. +* match_operand and attributes: Expressions. +* match_operator: RTL Template. +* match_par_dup: RTL Template. +* match_parallel: RTL Template. +* match_scratch: RTL Template. +* matching constraint: Simple Constraints. +* matching operands: Output Template. +* math libraries: Interface. +* math, in RTL: Arithmetic. +* MATH_LIBRARY: Misc. +* MAX_BITS_PER_WORD: Storage Layout. +* MAX_CHAR_TYPE_SIZE: Type Layout. +* MAX_FIXED_MODE_SIZE: Storage Layout. +* MAX_INT_TYPE_SIZE: Type Layout. +* MAX_INTEGER_COMPUTATION_MODE: Misc. +* MAX_LONG_TYPE_SIZE: Type Layout. +* MAX_MOVE_MAX: Misc. +* MAX_OFILE_ALIGNMENT: Storage Layout. +* MAX_REGS_PER_ADDRESS: Addressing Modes. +* MAX_WCHAR_TYPE_SIZE: Type Layout. +* maximum operator: Min and Max. +* MAYBE_REG_PARM_STACK_SPACE: Stack Arguments. +* mcount: Profiling. +* MD_CALL_PROTOTYPES: Config. +* MD_EXEC_PREFIX: Driver. +* MD_SCHED_INIT: Misc. +* MD_SCHED_REORDER: Misc. +* MD_SCHED_VARIABLE_ISSUE: Misc. +* MD_STARTFILE_PREFIX: Driver. +* MD_STARTFILE_PREFIX_1: Driver. +* mem: Regs and Memory. +* mem and /f: Flags. +* mem and /s: Flags. +* mem and /u: Flags. +* mem and /v: Flags. +* mem, RTL sharing: Sharing. +* MEM_ALIAS_SET: Flags. +* MEM_IN_STRUCT_P: Flags. +* MEM_SCALAR_P: Flags. +* MEM_VOLATILE_P: Flags. +* member fns, automatically inline: Inline. +* memcmp: C Dialect Options. +* memcpy: C Dialect Options. +* memcpy, implicit usage: Library Calls. +* memory model (29k): AMD29K Options. +* memory reference, nonoffsettable: Simple Constraints. +* memory references in constraints: Simple Constraints. +* MEMORY_MOVE_COST: Costs. +* memset, implicit usage: Library Calls. +* MERGE_MACHINE_DECL_ATTRIBUTES: Misc. +* MERGE_MACHINE_TYPE_ATTRIBUTES: Misc. +* messages, warning: Warning Options. +* messages, warning and error: Warnings and Errors. +* middle-operands, omitted: Conditionals. +* MIN_UNITS_PER_WORD: Storage Layout. +* minimum operator: Min and Max. +* MINIMUM_ATOMIC_ALIGNMENT: Storage Layout. +* minus: Arithmetic. +* minus and attributes: Expressions. +* minus, canonicalization of: Insn Canonicalizations. +* MIPS options: MIPS Options. +* misunderstandings in C++: C++ Misunderstandings. +* mktemp, and constant strings: Incompatibilities. +* MN10200 options: MN10200 Options. +* MN10300 options: MN10300 Options. +* mod: Arithmetic. +* mod and attributes: Expressions. +* MODDI3_LIBCALL: Library Calls. +* mode attribute: Variable Attributes. +* mode classes: Machine Modes. +* MODE_CC: Machine Modes. +* MODE_COMPLEX_FLOAT: Machine Modes. +* MODE_COMPLEX_INT: Machine Modes. +* MODE_FLOAT: Machine Modes. +* MODE_FUNCTION: Machine Modes. +* MODE_INT: Machine Modes. +* MODE_PARTIAL_INT: Machine Modes. +* MODE_RANDOM: Machine Modes. +* MODES_TIEABLE_P: Values in Registers. +* modifiers in constraints: Modifiers. +* modM3 instruction pattern: Standard Names. +* MODSI3_LIBCALL: Library Calls. +* MOVE_BY_PIECES_P: Costs. +* MOVE_MAX: Misc. +* MOVE_MAX_PIECES: Costs. +* MOVE_RATIO: Costs. +* movM instruction pattern: Standard Names. +* movMODEcc instruction pattern: Standard Names. +* movstrictM instruction pattern: Standard Names. +* movstrM instruction pattern: Standard Names. +* MULDI3_LIBCALL: Library Calls. +* mulhisi3 instruction pattern: Standard Names. +* mulM3 instruction pattern: Standard Names. +* mulqihi3 instruction pattern: Standard Names. +* MULSI3_LIBCALL: Library Calls. +* mulsidi3 instruction pattern: Standard Names. +* mult: Arithmetic. +* mult and attributes: Expressions. +* mult, canonicalization of: Insn Canonicalizations. +* MULTIBYTE_CHARS: Config. +* MULTILIB_DEFAULTS: Driver. +* MULTILIB_DIRNAMES: Target Fragment. +* MULTILIB_EXCEPTIONS: Target Fragment. +* MULTILIB_EXTRA_OPTS: Target Fragment. +* MULTILIB_MATCHES: Target Fragment. +* MULTILIB_OPTIONS: Target Fragment. +* multiple alternative constraints: Multi-Alternative. +* MULTIPLE_SYMBOL_SPACES: Misc. +* multiplication: Arithmetic. +* multiprecision arithmetic: Long Long. +* MUST_PASS_IN_STACK: Register Arguments. +* MUST_PASS_IN_STACK, and FUNCTION_ARG: Register Arguments. +* n in constraint: Simple Constraints. +* N_REG_CLASSES: Register Classes. +* name augmentation: VMS Misc. +* named patterns and conditions: Patterns. +* named return value in C++: Naming Results. +* names used in assembler code: Asm Labels. +* names, pattern: Standard Names. +* naming convention, implementation headers: C++ Interface. +* naming types: Naming Types. +* Native Language Support: Installation. +* ne: Comparisons. +* ne and attributes: Expressions. +* neg: Arithmetic. +* neg and attributes: Expressions. +* neg, canonicalization of: Insn Canonicalizations. +* negM2 instruction pattern: Standard Names. +* nested functions: Nested Functions. +* nested functions, trampolines for: Trampolines. +* newline vs string constants: C Dialect Options. +* next_cc0_user: Jump Patterns. +* NEXT_INSN: Insns. +* NEXT_OBJC_RUNTIME: Library Calls. +* nil: RTL Objects. +* NLS: Installation. +* no constraints: No Constraints. +* no-op move instructions: Passes. +* NO_BUILTIN_PTRDIFF_TYPE: Driver. +* NO_BUILTIN_SIZE_TYPE: Driver. +* no_check_memory_usage function attribute: Function Attributes. +* NO_DBX_FUNCTION_END: DBX Hooks. +* NO_DOLLAR_IN_LABEL: Misc. +* NO_DOT_IN_LABEL: Misc. +* NO_FUNCTION_CSE: Costs. +* NO_IMPLICIT_EXTERN_C: Misc. +* no_instrument_function function attribute: Function Attributes. +* NO_MD_PROTOTYPES: Config. +* no_new_pseudos: Standard Names. +* NO_RECURSIVE_FUNCTION_CSE: Costs. +* NO_REGS: Register Classes. +* NO_SYS_SIGLIST: Config. +* nocommon attribute: Variable Attributes. +* non-constant initializers: Initializers. +* non-static inline function: Inline. +* NON_SAVING_SETJMP: Register Basics. +* nongcc_SI_type: Library Calls. +* nongcc_word_type: Library Calls. +* nonlocal_goto instruction pattern: Standard Names. +* nonlocal_goto_receiver instruction pattern: Standard Names. +* nonoffsettable memory reference: Simple Constraints. +* nop instruction pattern: Standard Names. +* noreturn function attribute: Function Attributes. +* not: Arithmetic. +* not and attributes: Expressions. +* not equal: Comparisons. +* not using constraints: No Constraints. +* not, canonicalization of: Insn Canonicalizations. +* note: Insns. +* NOTE_INSN_BLOCK_BEG: Insns. +* NOTE_INSN_BLOCK_END: Insns. +* NOTE_INSN_DELETED: Insns. +* NOTE_INSN_EH_REGION_BEG: Insns. +* NOTE_INSN_EH_REGION_END: Insns. +* NOTE_INSN_FUNCTION_END: Insns. +* NOTE_INSN_LOOP_BEG: Insns. +* NOTE_INSN_LOOP_CONT: Insns. +* NOTE_INSN_LOOP_END: Insns. +* NOTE_INSN_LOOP_VTOP: Insns. +* NOTE_INSN_SETJMP: Insns. +* NOTE_LINE_NUMBER: Insns. +* NOTE_SOURCE_FILE: Insns. +* NOTICE_UPDATE_CC: Condition Code. +* NS32K options: NS32K Options. +* NUM_MACHINE_MODES: Machine Modes. +* o in constraint: Simple Constraints. +* OBJC_GEN_METHOD_LABEL: Label Output. +* OBJC_INCLUDE_PATH: Environment Variables. +* OBJC_INT_SELECTORS: Type Layout. +* OBJC_PROLOGUE: File Framework. +* OBJC_SELECTORS_WITHOUT_LABELS: Type Layout. +* OBJECT_FORMAT_COFF: Macros for Initialization. +* OBJECT_FORMAT_ROSE: Macros for Initialization. +* OBJECT_SUFFIX: Config. +* Objective C: G++ and GCC. +* Objective C threads: Installation. +* OBSTACK_CHUNK_ALLOC: Config. +* OBSTACK_CHUNK_FREE: Config. +* OBSTACK_CHUNK_SIZE: Config. +* obstack_free: Configurations. +* OCS (88k): M88K Options. +* offsettable address: Simple Constraints. +* old-style function definitions: Function Prototypes. +* OLDAR: Host Fragment. +* OLDCC: Host Fragment. +* OMIT_EH_TABLE: Exception Region Output. +* omitted middle-operands: Conditionals. +* one_cmplM2 instruction pattern: Standard Names. +* ONLY_INT_FIELDS: Config. +* open coding: Inline. +* operand access: Accessors. +* operand constraints: Constraints. +* operand substitution: Output Template. +* operands: Patterns. +* OPTIMIZATION_OPTIONS: Run-time Target. +* optimize options: Optimize Options. +* optional hardware or system features: Run-time Target. +* options to control warnings: Warning Options. +* options, C++: C++ Dialect Options. +* options, code generation: Code Gen Options. +* options, debugging: Debugging Options. +* options, dialect: C Dialect Options. +* options, directory search: Directory Options. +* options, GCC command: Invoking GCC. +* options, grouping: Invoking GCC. +* options, linking: Link Options. +* options, optimization: Optimize Options. +* options, order: Invoking GCC. +* options, preprocessor: Preprocessor Options. +* order of evaluation, side effects: Non-bugs. +* order of options: Invoking GCC. +* order of register allocation: Allocation Order. +* ORDER_REGS_FOR_LOCAL_ALLOC: Allocation Order. +* Ordering of Patterns: Pattern Ordering. +* other directory, compilation in: Other Dir. +* OUTGOING_REG_PARM_STACK_SPACE: Stack Arguments. +* OUTGOING_REGNO: Register Basics. +* output file option: Overall Options. +* output of assembler code: File Framework. +* output statements: Output Statement. +* output templates: Output Template. +* output_addr_const: Data Output. +* output_asm_insn: Output Statement. +* OUTPUT_QUOTED_STRING: File Framework. +* overflow while constant folding: Cross-compilation. +* OVERLAPPING_REGNO_P: Obsolete Register Macros. +* overloaded virtual fn, warning: C++ Dialect Options. +* OVERRIDE_OPTIONS: Run-time Target. +* p in constraint: Simple Constraints. +* packed attribute: Variable Attributes. +* parallel: Side Effects. +* parameter forward declaration: Variable Length. +* parameters, aliased: Code Gen Options. +* parameters, miscellaneous: Misc. +* PARM_BOUNDARY: Storage Layout. +* PARSE_LDD_OUTPUT: Macros for Initialization. +* parser generator, Bison: Installation. +* parsing pass: Passes. +* passes and files of the compiler: Passes. +* passing arguments: Interface. +* PATH_SEPARATOR: Config. +* PATTERN: Insns. +* pattern conditions: Patterns. +* pattern names: Standard Names. +* Pattern Ordering: Pattern Ordering. +* patterns: Patterns. +* pc: Regs and Memory. +* pc and attributes: Insn Lengths. +* pc, RTL sharing: Sharing. +* pc_rtx: Regs and Memory. +* PCC_BITFIELD_TYPE_MATTERS: Storage Layout. +* PCC_STATIC_STRUCT_RETURN: Aggregate Return. +* PDImode: Machine Modes. +* peephole optimization: Passes. +* peephole optimization, RTL representation: Side Effects. +* peephole optimizer definitions: Peephole Definitions. +* percent sign: Output Template. +* perform_...: Library Calls. +* PIC <1>: PIC. +* PIC: Code Gen Options. +* PIC_OFFSET_TABLE_REG_CALL_CLOBBERED: PIC. +* PIC_OFFSET_TABLE_REGNUM: PIC. +* plus: Arithmetic. +* plus and attributes: Expressions. +* plus, canonicalization of: Insn Canonicalizations. +* pmf: Bound member functions. +* Pmode: Misc. +* pointer arguments: Function Attributes. +* pointer to member function: Bound member functions. +* POINTER_SIZE: Storage Layout. +* POINTERS_EXTEND_UNSIGNED: Storage Layout. +* portability: Portability. +* portions of temporary objects, pointers to: Temporaries. +* position independent code: PIC. +* POSIX: Config. +* post_dec: Incdec. +* post_inc: Incdec. +* post_modify: Incdec. +* pragma: Misc. +* pragma, reason for not using: Function Attributes. +* pragmas in C++, effect on inlining: C++ Interface. +* pragmas, interface and implementation: C++ Interface. +* pragmas, warning of unknown: Warning Options. +* pre_dec: Incdec. +* pre_inc: Incdec. +* predefined macros: Run-time Target. +* PREDICATE_CODES: Misc. +* PREFERRED_DEBUGGING_TYPE: All Debuggers. +* PREFERRED_OUTPUT_RELOAD_CLASS: Register Classes. +* PREFERRED_RELOAD_CLASS: Register Classes. +* PREFERRED_STACK_BOUNDARY: Storage Layout. +* preprocessing numbers: Incompatibilities. +* preprocessing tokens: Incompatibilities. +* preprocessor options: Preprocessor Options. +* PRETEND_OUTGOING_VARARGS_NAMED: Varargs. +* prev_active_insn: Peephole Definitions. +* prev_cc0_setter: Jump Patterns. +* PREV_INSN: Insns. +* PRINT_OPERAND: Instruction Output. +* PRINT_OPERAND_ADDRESS: Instruction Output. +* PRINT_OPERAND_PUNCT_VALID_P: Instruction Output. +* probe instruction pattern: Standard Names. +* processor selection (29k): AMD29K Options. +* product: Arithmetic. +* prof: Debugging Options. +* PROFILE_BEFORE_PROLOGUE: Profiling. +* profile_block_flag: Profiling. +* profiling, code generation: Profiling. +* program counter: Regs and Memory. +* prologue: Function Entry. +* prologue instruction pattern: Standard Names. +* PROMOTE_FOR_CALL_ONLY: Storage Layout. +* PROMOTE_FUNCTION_ARGS: Storage Layout. +* PROMOTE_FUNCTION_RETURN: Storage Layout. +* PROMOTE_MODE: Storage Layout. +* PROMOTE_PROTOTYPES: Stack Arguments. +* promotion of formal parameters: Function Prototypes. +* pseudo registers: Regs and Memory. +* PSImode: Machine Modes. +* PTRDIFF_TYPE: Type Layout. +* push address instruction: Simple Constraints. +* push_reload: Addressing Modes. +* PUSH_ROUNDING: Stack Arguments. +* PUSH_ROUNDING, interaction with PREFERRED_STACK_BOUNDARY: Storage Layout. +* PUT_CODE: RTL Objects. +* PUT_MODE: Machine Modes. +* PUT_REG_NOTE_KIND: Insns. +* PUT_SDB_...: SDB and DWARF. +* Q, in constraint: Simple Constraints. +* QImode: Machine Modes. +* QImode, in insn: Insns. +* qsort, and global register variables: Global Reg Vars. +* question mark: Multi-Alternative. +* quotient: Arithmetic. +* r in constraint: Simple Constraints. +* r0-relative references (88k): M88K Options. +* ranges in case statements: Case Ranges. +* read-only strings: Incompatibilities. +* READONLY_DATA_SECTION: Sections. +* REAL_ARITHMETIC: Cross-compilation. +* REAL_INFINITY: Cross-compilation. +* REAL_NM_FILE_NAME: Macros for Initialization. +* REAL_VALUE_ATOF: Cross-compilation. +* REAL_VALUE_FIX: Cross-compilation. +* REAL_VALUE_FROM_INT: Cross-compilation. +* REAL_VALUE_ISINF: Cross-compilation. +* REAL_VALUE_ISNAN: Cross-compilation. +* REAL_VALUE_LDEXP: Cross-compilation. +* REAL_VALUE_NEGATE: Cross-compilation. +* REAL_VALUE_RNDZINT: Cross-compilation. +* REAL_VALUE_TO_DECIMAL: Data Output. +* REAL_VALUE_TO_INT: Cross-compilation. +* REAL_VALUE_TO_TARGET_DOUBLE: Data Output. +* REAL_VALUE_TO_TARGET_LONG_DOUBLE: Data Output. +* REAL_VALUE_TO_TARGET_SINGLE: Data Output. +* REAL_VALUE_TRUNCATE: Cross-compilation. +* REAL_VALUE_TYPE: Cross-compilation. +* REAL_VALUE_UNSIGNED_FIX: Cross-compilation. +* REAL_VALUE_UNSIGNED_RNDZINT: Cross-compilation. +* REAL_VALUES_EQUAL: Cross-compilation. +* REAL_VALUES_LESS: Cross-compilation. +* recog_operand: Instruction Output. +* recognizing insns: RTL Template. +* reg: Regs and Memory. +* reg and /i: Flags. +* reg and /s: Flags. +* reg and /u: Flags. +* reg and /v: Flags. +* reg, RTL sharing: Sharing. +* REG_ALLOC_ORDER: Allocation Order. +* REG_BR_PRED: Insns. +* REG_BR_PROB: Insns. +* REG_CC_SETTER: Insns. +* REG_CC_USER: Insns. +* REG_CLASS_CONTENTS: Register Classes. +* REG_CLASS_FROM_LETTER: Register Classes. +* REG_CLASS_NAMES: Register Classes. +* REG_DEAD: Insns. +* REG_DEP_ANTI: Insns. +* REG_DEP_OUTPUT: Insns. +* REG_EQUAL: Insns. +* REG_EQUIV: Insns. +* REG_EXEC_COUNT: Insns. +* REG_FRAME_RELATED_EXPR: Insns. +* REG_FUNCTION_VALUE_P: Flags. +* REG_INC: Insns. +* REG_LABEL: Insns. +* REG_LIBCALL: Insns. +* REG_LOOP_TEST_P: Flags. +* REG_MODE_OK_FOR_BASE_P: Addressing Modes. +* reg_names: Instruction Output. +* REG_NO_CONFLICT: Insns. +* REG_NONNEG: Insns. +* REG_NOTE_KIND: Insns. +* REG_NOTES: Insns. +* REG_OK_FOR_BASE_P: Addressing Modes. +* REG_OK_FOR_INDEX_P: Addressing Modes. +* REG_OK_STRICT: Addressing Modes. +* REG_PARM_STACK_SPACE: Stack Arguments. +* REG_PARM_STACK_SPACE, and FUNCTION_ARG: Register Arguments. +* REG_RETVAL: Insns. +* REG_UNUSED: Insns. +* REG_USERVAR_P: Flags. +* REG_WAS_0: Insns. +* register allocation: Passes. +* register allocation order: Allocation Order. +* register allocation, stupid: Passes. +* register class definitions: Register Classes. +* register class preference constraints: Class Preferences. +* register class preference pass: Passes. +* register movement: Passes. +* register pairs: Values in Registers. +* register positions in frame (88k): M88K Options. +* Register Transfer Language (RTL): RTL. +* register usage: Registers. +* register use analysis: Passes. +* register variable after longjmp: Global Reg Vars. +* register-to-stack conversion: Passes. +* REGISTER_MOVE_COST: Costs. +* REGISTER_NAMES: Instruction Output. +* register_operand: RTL Template. +* REGISTER_PREFIX: Instruction Output. +* registers: Extended Asm. +* registers arguments: Register Arguments. +* registers for local variables: Local Reg Vars. +* registers in constraints: Simple Constraints. +* registers, global allocation: Explicit Reg Vars. +* registers, global variables in: Global Reg Vars. +* REGNO_MODE_OK_FOR_BASE_P: Register Classes. +* REGNO_OK_FOR_BASE_P: Register Classes. +* REGNO_OK_FOR_INDEX_P: Register Classes. +* REGNO_REG_CLASS: Register Classes. +* regs_ever_live: Function Entry. +* relative costs: Costs. +* RELATIVE_PREFIX_NOT_LINKDIR: Driver. +* reload pass: Regs and Memory. +* reload_completed: Standard Names. +* reload_in instruction pattern: Standard Names. +* reload_in_progress: Standard Names. +* reload_out instruction pattern: Standard Names. +* reloading: Passes. +* remainder: Arithmetic. +* reordering, warning: C++ Dialect Options. +* reporting bugs: Bugs. +* representation of RTL: RTL. +* rest argument (in macro): Macro Varargs. +* rest_of_compilation: Passes. +* rest_of_decl_compilation: Passes. +* restore_stack_block instruction pattern: Standard Names. +* restore_stack_function instruction pattern: Standard Names. +* restore_stack_nonlocal instruction pattern: Standard Names. +* return: Side Effects. +* return instruction pattern: Standard Names. +* return value of main: VMS Misc. +* return value, named, in C++: Naming Results. +* return values in registers: Scalar Return. +* return, in C++ function header: Naming Results. +* RETURN_ADDR_IN_PREVIOUS_FRAME: Frame Layout. +* RETURN_ADDR_RTX: Frame Layout. +* RETURN_ADDRESS_POINTER_REGNUM: Frame Registers. +* RETURN_IN_MEMORY: Aggregate Return. +* RETURN_POPS_ARGS: Stack Arguments. +* returning aggregate values: Aggregate Return. +* returning structures and unions: Interface. +* REVERSIBLE_CC_MODE: Condition Code. +* right rotate: Arithmetic. +* right shift: Arithmetic. +* rotate: Arithmetic. +* rotatert: Arithmetic. +* rotlM3 instruction pattern: Standard Names. +* rotrM3 instruction pattern: Standard Names. +* ROUND_TYPE_ALIGN: Storage Layout. +* ROUND_TYPE_SIZE: Storage Layout. +* RS/6000 and PowerPC Options: RS/6000 and PowerPC Options. +* RT options: RT Options. +* RT PC: Interoperation. +* RTL addition: Arithmetic. +* RTL classes: RTL Classes. +* RTL comparison: Arithmetic. +* RTL comparison operations: Comparisons. +* RTL constant expression types: Constants. +* RTL constants: Constants. +* RTL declarations: RTL Declarations. +* RTL difference: Arithmetic. +* RTL expression: RTL Objects. +* RTL expressions for arithmetic: Arithmetic. +* RTL format: RTL Classes. +* RTL format characters: RTL Classes. +* RTL function-call insns: Calls. +* RTL generation: Passes. +* RTL insn template: RTL Template. +* RTL integers: RTL Objects. +* RTL memory expressions: Regs and Memory. +* RTL object types: RTL Objects. +* RTL postdecrement: Incdec. +* RTL postincrement: Incdec. +* RTL predecrement: Incdec. +* RTL preincrement: Incdec. +* RTL register expressions: Regs and Memory. +* RTL representation: RTL. +* RTL side effect expressions: Side Effects. +* RTL strings: RTL Objects. +* RTL structure sharing assumptions: Sharing. +* RTL subtraction: Arithmetic. +* RTL sum: Arithmetic. +* RTL vectors: RTL Objects. +* RTX (See RTL): RTL Objects. +* RTX codes, classes of: RTL Classes. +* RTX_COSTS: Costs. +* RTX_FRAME_RELATED_P: Flags. +* RTX_INTEGRATED_P: Flags. +* RTX_UNCHANGING_P: Flags. +* run-time conventions: Interface. +* run-time options: Code Gen Options. +* run-time target specification: Run-time Target. +* s in constraint: Simple Constraints. +* save_stack_block instruction pattern: Standard Names. +* save_stack_function instruction pattern: Standard Names. +* save_stack_nonlocal instruction pattern: Standard Names. +* saveable_obstack: Addressing Modes. +* scalars, returned as values: Scalar Return. +* scanf, and constant strings: Incompatibilities. +* SCCS_DIRECTIVE: Misc. +* SCHED_GROUP_P: Flags. +* scheduler, experimental: Installation. +* scheduling, delayed branch: Passes. +* scheduling, instruction: Passes. +* SCmode: Machine Modes. +* sCOND instruction pattern: Standard Names. +* scope of a variable length array: Variable Length. +* scope of declaration: Disappointments. +* scope of external declarations: Incompatibilities. +* scratch: Regs and Memory. +* scratch operands: Regs and Memory. +* scratch, RTL sharing: Sharing. +* SDB_ALLOW_FORWARD_REFERENCES: SDB and DWARF. +* SDB_ALLOW_UNKNOWN_REFERENCES: SDB and DWARF. +* SDB_DEBUGGING_INFO: SDB and DWARF. +* SDB_DELIM: SDB and DWARF. +* SDB_GENERATE_FAKE: SDB and DWARF. +* search path: Directory Options. +* second include path: Preprocessor Options. +* SECONDARY_INPUT_RELOAD_CLASS: Register Classes. +* SECONDARY_MEMORY_NEEDED: Register Classes. +* SECONDARY_MEMORY_NEEDED_MODE: Register Classes. +* SECONDARY_MEMORY_NEEDED_RTX: Register Classes. +* SECONDARY_OUTPUT_RELOAD_CLASS: Register Classes. +* SECONDARY_RELOAD_CLASS: Register Classes. +* section function attribute: Function Attributes. +* section variable attribute: Variable Attributes. +* SELECT_CC_MODE: Condition Code. +* SELECT_RTX_SECTION: Sections. +* SELECT_SECTION: Sections. +* separate directory, compilation in: Other Dir. +* sequence: Side Effects. +* sequential consistency on 88k: M88K Options. +* set: Side Effects. +* set_attr: Tagging Insns. +* set_attr_alternative: Tagging Insns. +* SET_DEFAULT_DECL_ATTRIBUTES: Misc. +* SET_DEFAULT_TYPE_ATTRIBUTES: Misc. +* SET_DEST: Side Effects. +* SET_SRC: Side Effects. +* setjmp: Global Reg Vars. +* setjmp incompatibilities: Incompatibilities. +* SETUP_FRAME_ADDRESSES: Frame Layout. +* SETUP_INCOMING_VARARGS: Varargs. +* SFmode: Machine Modes. +* shared strings: Incompatibilities. +* shared VMS run time system: VMS Misc. +* SHARED_BSS_SECTION_ASM_OP: Sections. +* SHARED_SECTION_ASM_OP: Sections. +* sharing of RTL components: Sharing. +* shift: Arithmetic. +* SHIFT_COUNT_TRUNCATED: Misc. +* SHORT_IMMEDIATES_SIGN_EXTEND: Misc. +* SHORT_TYPE_SIZE: Type Layout. +* sibcall_epilogue instruction pattern: Standard Names. +* side effect in ?:: Conditionals. +* side effects, macro argument: Statement Exprs. +* side effects, order of evaluation: Non-bugs. +* sign_extend: Conversions. +* sign_extract: Bit Fields. +* sign_extract, canonicalization of: Insn Canonicalizations. +* signature: C++ Signatures. +* signature in C++, advantages: C++ Signatures. +* signature member function default implementation: C++ Signatures. +* signatures, C++: C++ Signatures. +* signed and unsigned values, comparison warning: Warning Options. +* signed division: Arithmetic. +* signed maximum: Arithmetic. +* signed minimum: Arithmetic. +* SIGNED_CHAR_SPEC: Driver. +* SImode: Machine Modes. +* simple constraints: Simple Constraints. +* simplifications, arithmetic: Passes. +* sin: C Dialect Options. +* SIZE_TYPE: Type Layout. +* sizeof: Typeof. +* SLOW_BYTE_ACCESS: Costs. +* SLOW_UNALIGNED_ACCESS: Costs. +* SLOW_ZERO_EXTEND: Costs. +* SMALL_REGISTER_CLASSES: Register Classes. +* smaller data references: M32R/D Options. +* smaller data references (88k): M88K Options. +* smaller data references (MIPS): MIPS Options. +* smaller data references (PowerPC): RS/6000 and PowerPC Options. +* smax: Arithmetic. +* smaxM3 instruction pattern: Standard Names. +* smin: Arithmetic. +* sminM3 instruction pattern: Standard Names. +* smulM3_highpart instruction pattern: Standard Names. +* SPARC options: SPARC Options. +* specified registers: Explicit Reg Vars. +* specifying compiler version and target machine: Target Options. +* specifying hardware config: Submodel Options. +* specifying machine version: Target Options. +* specifying registers for local variables: Local Reg Vars. +* speed of instructions: Costs. +* splitting instructions: Insn Splitting. +* sqrt <1>: Arithmetic. +* sqrt: C Dialect Options. +* sqrtM2 instruction pattern: Standard Names. +* square root: Arithmetic. +* sscanf, and constant strings: Incompatibilities. +* stack arguments: Stack Arguments. +* stack checks (29k): AMD29K Options. +* stack frame layout: Frame Layout. +* STACK_BOUNDARY: Storage Layout. +* STACK_CHECK_BUILTIN: Stack Checking. +* STACK_CHECK_FIXED_FRAME_SIZE: Stack Checking. +* STACK_CHECK_MAX_FRAME_SIZE: Stack Checking. +* STACK_CHECK_MAX_VAR_SIZE: Stack Checking. +* STACK_CHECK_PROBE_INTERVAL: Stack Checking. +* STACK_CHECK_PROBE_LOAD: Stack Checking. +* STACK_CHECK_PROTECT: Stack Checking. +* STACK_DYNAMIC_OFFSET: Frame Layout. +* STACK_DYNAMIC_OFFSET and virtual registers: Regs and Memory. +* STACK_GROWS_DOWNWARD: Frame Layout. +* STACK_PARMS_IN_REG_PARM_AREA: Stack Arguments. +* STACK_POINTER_OFFSET: Frame Layout. +* STACK_POINTER_OFFSET and virtual registers: Regs and Memory. +* STACK_POINTER_REGNUM: Frame Registers. +* STACK_POINTER_REGNUM and virtual registers: Regs and Memory. +* stack_pointer_rtx: Frame Registers. +* STACK_REGS: Stack Registers. +* STACK_SAVEAREA_MODE: Storage Layout. +* STACK_SIZE_MODE: Storage Layout. +* stage1: Installation. +* standard pattern names: Standard Names. +* STANDARD_EXEC_PREFIX: Driver. +* STANDARD_INCLUDE_COMPONENT: Driver. +* STANDARD_INCLUDE_DIR: Driver. +* STANDARD_STARTFILE_PREFIX: Driver. +* start files: Tools and Libraries. +* STARTFILE_SPEC: Driver. +* STARTING_FRAME_OFFSET: Frame Layout. +* STARTING_FRAME_OFFSET and virtual registers: Regs and Memory. +* statements inside expressions: Statement Exprs. +* static data in C++, declaring and defining: Static Definitions. +* STATIC_CHAIN: Frame Registers. +* STATIC_CHAIN_INCOMING: Frame Registers. +* STATIC_CHAIN_INCOMING_REGNUM: Frame Registers. +* STATIC_CHAIN_REGNUM: Frame Registers. +* stdarg.h and register arguments: Register Arguments. +* stdarg.h and RT PC: RT Options. +* storage layout: Storage Layout. +* STORE_FLAG_VALUE: Misc. +* store_multiple instruction pattern: Standard Names. +* storem bug (29k): AMD29K Options. +* strcmp: C Dialect Options. +* strcpy <1>: Storage Layout. +* strcpy: C Dialect Options. +* strength-reduction: Passes. +* STRICT_ALIGNMENT: Storage Layout. +* STRICT_ARGUMENT_NAMING: Varargs. +* strict_low_part: RTL Declarations. +* strict_memory_address_p: Addressing Modes. +* string constants: Incompatibilities. +* string constants vs newline: C Dialect Options. +* STRIP_NAME_ENCODING: Sections. +* strlen: C Dialect Options. +* strlenM instruction pattern: Standard Names. +* STRUCT_VALUE: Aggregate Return. +* STRUCT_VALUE_INCOMING: Aggregate Return. +* STRUCT_VALUE_INCOMING_REGNUM: Aggregate Return. +* STRUCT_VALUE_REGNUM: Aggregate Return. +* structure passing (88k): M88K Options. +* structure value address: Aggregate Return. +* STRUCTURE_SIZE_BOUNDARY: Storage Layout. +* structures: Incompatibilities. +* structures, constructor expression: Constructors. +* structures, returning: Interface. +* stupid register allocation: Passes. +* subM3 instruction pattern: Standard Names. +* submodel options: Submodel Options. +* subreg: Regs and Memory. +* subreg and /s: Flags. +* subreg and /u: Flags. +* subreg, in strict_low_part: RTL Declarations. +* subreg, special reload handling: Regs and Memory. +* SUBREG_PROMOTED_UNSIGNED_P: Flags. +* SUBREG_PROMOTED_VAR_P: Flags. +* SUBREG_REG: Regs and Memory. +* SUBREG_WORD: Regs and Memory. +* subscripting: Subscripting. +* subscripting and function values: Subscripting. +* subtype polymorphism, C++: C++ Signatures. +* SUCCESS_EXIT_CODE: Config. +* suffixes for C++ source: Invoking G++. +* Sun installation: Sun Install. +* SUPPORTS_ONE_ONLY: Label Output. +* SUPPORTS_WEAK: Label Output. +* suppressing warnings: Warning Options. +* surprises in C++: C++ Misunderstandings. +* SVr4: M88K Options. +* SWITCH_CURTAILS_COMPILATION: Driver. +* SWITCH_TAKES_ARG: Driver. +* SWITCHES_NEED_SPACES: Driver. +* symbol_ref: Constants. +* symbol_ref and /u: Flags. +* symbol_ref and /v: Flags. +* symbol_ref, RTL sharing: Sharing. +* SYMBOL_REF_FLAG: Flags. +* SYMBOL_REF_FLAG, in ENCODE_SECTION_INFO: Sections. +* SYMBOL_REF_USED: Flags. +* symbolic label: Sharing. +* syntax checking: Warning Options. +* synthesized methods, warning: C++ Dialect Options. +* sys_siglist: Config. +* SYSTEM_INCLUDE_DIR: Driver. +* t-TARGET: Target Fragment. +* tablejump instruction pattern: Standard Names. +* tagging insns: Tagging Insns. +* tail recursion optimization: Passes. +* target description macros: Target Macros. +* target machine, specifying: Target Options. +* target makefile fragment: Target Fragment. +* target options: Target Options. +* target specifications: Run-time Target. +* target-parameter-dependent code: Passes. +* TARGET_BELL: Type Layout. +* TARGET_BS: Type Layout. +* TARGET_CR: Type Layout. +* TARGET_EDOM: Library Calls. +* TARGET_FF: Type Layout. +* TARGET_FLOAT_FORMAT: Storage Layout. +* TARGET_MEM_FUNCTIONS: Library Calls. +* TARGET_NEWLINE: Type Layout. +* TARGET_OPTIONS: Run-time Target. +* TARGET_SWITCHES: Run-time Target. +* TARGET_TAB: Type Layout. +* TARGET_VERSION: Run-time Target. +* TARGET_VT: Type Layout. +* TCmode: Machine Modes. +* tcov: Debugging Options. +* template instantiation: Template Instantiation. +* temporaries, lifetime of: Temporaries. +* termination routines: Initialization. +* text_section: Sections. +* TEXT_SECTION_ASM_OP: Sections. +* TFmode: Machine Modes. +* threads, Objective C: Installation. +* Thumb Options: Thumb Options. +* thunks: Nested Functions. +* TImode: Machine Modes. +* TImode, in insn: Insns. +* tiny data section on the H8/300H: Function Attributes. +* tm.h macros: Target Macros. +* TMPDIR: Environment Variables. +* TMS320C3x/C4x Options: TMS320C3x/C4x Options. +* top level of compiler: Passes. +* traditional C language: C Dialect Options. +* TRADITIONAL_RETURN_FLOAT: Scalar Return. +* TRAMPOLINE_ALIGNMENT: Trampolines. +* TRAMPOLINE_SECTION: Trampolines. +* TRAMPOLINE_SIZE: Trampolines. +* TRAMPOLINE_TEMPLATE: Trampolines. +* trampolines for nested functions: Trampolines. +* TRANSFER_FROM_TRAMPOLINE: Trampolines. +* TRULY_NOOP_TRUNCATION: Misc. +* truncate: Conversions. +* truncMN2 instruction pattern: Standard Names. +* tstM instruction pattern: Standard Names. +* type abstraction, C++: C++ Signatures. +* type alignment: Alignment. +* type attributes: Type Attributes. +* typedef names as function parameters: Incompatibilities. +* typeof: Typeof. +* udiv: Arithmetic. +* UDIVDI3_LIBCALL: Library Calls. +* udivM3 instruction pattern: Standard Names. +* udivmodM4 instruction pattern: Standard Names. +* UDIVSI3_LIBCALL: Library Calls. +* Ultrix calling convention: Interoperation. +* umax: Arithmetic. +* umaxM3 instruction pattern: Standard Names. +* umin: Arithmetic. +* uminM3 instruction pattern: Standard Names. +* umod: Arithmetic. +* UMODDI3_LIBCALL: Library Calls. +* umodM3 instruction pattern: Standard Names. +* UMODSI3_LIBCALL: Library Calls. +* umulhisi3 instruction pattern: Standard Names. +* umulM3_highpart instruction pattern: Standard Names. +* umulqihi3 instruction pattern: Standard Names. +* umulsidi3 instruction pattern: Standard Names. +* unchanging: Flags. +* unchanging, in call_insn: Flags. +* unchanging, in insn: Flags. +* unchanging, in reg and mem: Flags. +* unchanging, in subreg: Flags. +* unchanging, in symbol_ref: Flags. +* undefined behavior: Bug Criteria. +* undefined function value: Bug Criteria. +* underscores in variables in macros: Naming Types. +* underscores, avoiding (88k): M88K Options. +* union, casting to a: Cast to Union. +* unions: Incompatibilities. +* unions, returning: Interface. +* UNIQUE_SECTION: Sections. +* UNIQUE_SECTION_P: Sections. +* UNITS_PER_WORD: Storage Layout. +* unknown pragmas, warning: Warning Options. +* UNKNOWN_FLOAT_FORMAT: Storage Layout. +* unreachable code: Passes. +* unresolved references and -nodefaultlibs: Link Options. +* unresolved references and -nostdlib: Link Options. +* unshare_all_rtl: Sharing. +* unsigned division: Arithmetic. +* unsigned greater than: Comparisons. +* unsigned less than: Comparisons. +* unsigned minimum and maximum: Arithmetic. +* unsigned_fix: Conversions. +* unsigned_float: Conversions. +* unspec: Side Effects. +* unspec_volatile: Side Effects. +* untyped_call instruction pattern: Standard Names. +* untyped_return instruction pattern: Standard Names. +* use: Side Effects. +* USE_C_ALLOCA: Config. +* USE_LOAD_POST_DECREMENT: Costs. +* USE_LOAD_POST_INCREMENT: Costs. +* USE_LOAD_PRE_DECREMENT: Costs. +* USE_LOAD_PRE_INCREMENT: Costs. +* USE_PROTOTYPES: Config. +* USE_STORE_POST_DECREMENT: Costs. +* USE_STORE_POST_INCREMENT: Costs. +* USE_STORE_PRE_DECREMENT: Costs. +* USE_STORE_PRE_INCREMENT: Costs. +* used: Flags. +* used, in symbol_ref: Flags. +* USER_LABEL_PREFIX: Instruction Output. +* USG: Config. +* V in constraint: Simple Constraints. +* V850 Options: V850 Options. +* VALID_MACHINE_DECL_ATTRIBUTE: Misc. +* VALID_MACHINE_TYPE_ATTRIBUTE: Misc. +* value after longjmp: Global Reg Vars. +* values, returned by functions: Scalar Return. +* varargs implementation: Varargs. +* varargs.h and RT PC: RT Options. +* variable addressability on the M32R/D: Variable Attributes. +* variable alignment: Alignment. +* variable attributes: Variable Attributes. +* variable number of arguments: Macro Varargs. +* variable-length array scope: Variable Length. +* variable-length arrays: Variable Length. +* variables in specified registers: Explicit Reg Vars. +* variables, local, in macros: Naming Types. +* Vax calling convention: Interoperation. +* VAX options: VAX Options. +* VAX_FLOAT_FORMAT: Storage Layout. +* VAXCRTL: VMS Misc. +* VIRTUAL_INCOMING_ARGS_REGNUM: Regs and Memory. +* VIRTUAL_OUTGOING_ARGS_REGNUM: Regs and Memory. +* VIRTUAL_STACK_DYNAMIC_REGNUM: Regs and Memory. +* VIRTUAL_STACK_VARS_REGNUM: Regs and Memory. +* VMS: Config. +* VMS and case sensitivity: VMS Misc. +* VMS and include files: Include Files and VMS. +* VMS installation: VMS Install. +* void pointers, arithmetic: Pointer Arith. +* void, size of pointer to: Pointer Arith. +* VOIDmode: Machine Modes. +* volatil: Flags. +* volatil, in insn: Flags. +* volatil, in mem: Flags. +* volatil, in reg: Flags. +* volatil, in symbol_ref: Flags. +* volatile applied to function: Function Attributes. +* volatile memory references: Flags. +* voting between constraint alternatives: Class Preferences. +* warning for comparison of signed and unsigned values: Warning Options. +* warning for overloaded virtual fn: C++ Dialect Options. +* warning for reordering of member initializers: C++ Dialect Options. +* warning for synthesized methods: C++ Dialect Options. +* warning for unknown pragmas: Warning Options. +* warning messages: Warning Options. +* warnings vs errors: Warnings and Errors. +* WCHAR_TYPE: Type Layout. +* WCHAR_TYPE_SIZE: Type Layout. +* weak attribute: Function Attributes. +* which_alternative: Output Statement. +* whitespace: Incompatibilities. +* WIDEST_HARDWARE_FP_SIZE: Type Layout. +* word_mode: Machine Modes. +* WORD_REGISTER_OPERATIONS: Misc. +* WORD_SWITCH_TAKES_ARG: Driver. +* WORDS_BIG_ENDIAN: Storage Layout. +* WORDS_BIG_ENDIAN, effect on subreg: Regs and Memory. +* X in constraint: Simple Constraints. +* x-HOST: Host Fragment. +* XCmode: Machine Modes. +* XCOFF_DEBUGGING_INFO: DBX Options. +* XEXP: Accessors. +* XFmode: Machine Modes. +* XINT: Accessors. +* xm-MACHINE.h: Config. +* xor: Arithmetic. +* xor, canonicalization of: Insn Canonicalizations. +* xorM3 instruction pattern: Standard Names. +* XSTR: Accessors. +* XVEC: Accessors. +* XVECEXP: Accessors. +* XVECLEN: Accessors. +* XWINT: Accessors. +* zero division on 88k: M88K Options. +* zero-length arrays: Zero Length. +* zero_extend: Conversions. +* zero_extendMN2 instruction pattern: Standard Names. +* zero_extract: Bit Fields. +* zero_extract, canonicalization of: Insn Canonicalizations. + + diff --git a/usr/local/nachos/info/gcc.info-4 b/usr/local/nachos/info/gcc.info-4 new file mode 100644 index 0000000..b7eb019 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-4 @@ -0,0 +1,1121 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Directory Options, Next: Target Options, Prev: Link Options, Up: Invoking GCC + +Options for Directory Search +============================ + + These options specify directories to search for header files, for +libraries and for parts of the compiler: + +`-IDIR' + Add the directory DIR to the head of the list of directories to be + searched for header files. This can be used to override a system + header file, substituting your own version, since these + directories are searched before the system header file + directories. If you use more than one `-I' option, the + directories are scanned in left-to-right order; the standard + system directories come after. + +`-I-' + Any directories you specify with `-I' options before the `-I-' + option are searched only for the case of `#include "FILE"'; they + are not searched for `#include '. + + If additional directories are specified with `-I' options after + the `-I-', these directories are searched for all `#include' + directives. (Ordinarily *all* `-I' directories are used this way.) + + In addition, the `-I-' option inhibits the use of the current + directory (where the current input file came from) as the first + search directory for `#include "FILE"'. There is no way to + override this effect of `-I-'. With `-I.' you can specify + searching the directory which was current when the compiler was + invoked. That is not exactly the same as what the preprocessor + does by default, but it is often satisfactory. + + `-I-' does not inhibit the use of the standard system directories + for header files. Thus, `-I-' and `-nostdinc' are independent. + +`-LDIR' + Add directory DIR to the list of directories to be searched for + `-l'. + +`-BPREFIX' + This option specifies where to find the executables, libraries, + include files, and data files of the compiler itself. + + The compiler driver program runs one or more of the subprograms + `cpp', `cc1', `as' and `ld'. It tries PREFIX as a prefix for each + program it tries to run, both with and without `MACHINE/VERSION/' + (*note Target Options::.). + + For each subprogram to be run, the compiler driver first tries the + `-B' prefix, if any. If that name is not found, or if `-B' was + not specified, the driver tries two standard prefixes, which are + `/usr/lib/gcc/' and `/usr/local/lib/gcc-lib/'. If neither of + those results in a file name that is found, the unmodified program + name is searched for using the directories specified in your + `PATH' environment variable. + + `-B' prefixes that effectively specify directory names also apply + to libraries in the linker, because the compiler translates these + options into `-L' options for the linker. They also apply to + includes files in the preprocessor, because the compiler + translates these options into `-isystem' options for the + preprocessor. In this case, the compiler appends `include' to the + prefix. + + The run-time support file `libgcc.a' can also be searched for using + the `-B' prefix, if needed. If it is not found there, the two + standard prefixes above are tried, and that is all. The file is + left out of the link if it is not found by those means. + + Another way to specify a prefix much like the `-B' prefix is to use + the environment variable `GCC_EXEC_PREFIX'. *Note Environment + Variables::. + +`-specs=FILE' + Process FILE after the compiler reads in the standard `specs' + file, in order to override the defaults that the `gcc' driver + program uses when determining what switches to pass to `cc1', + `cc1plus', `as', `ld', etc. More than one `-specs='FILE can be + specified on the command line, and they are processed in order, + from left to right. + + +File: gcc.info, Node: Target Options, Next: Submodel Options, Prev: Directory Options, Up: Invoking GCC + +Specifying Target Machine and Compiler Version +============================================== + + By default, GCC compiles code for the same type of machine that you +are using. However, it can also be installed as a cross-compiler, to +compile for some other type of machine. In fact, several different +configurations of GCC, for different target machines, can be installed +side by side. Then you specify which one to use with the `-b' option. + + In addition, older and newer versions of GCC can be installed side +by side. One of them (probably the newest) will be the default, but +you may sometimes wish to use another. + +`-b MACHINE' + The argument MACHINE specifies the target machine for compilation. + This is useful when you have installed GCC as a cross-compiler. + + The value to use for MACHINE is the same as was specified as the + machine type when configuring GCC as a cross-compiler. For + example, if a cross-compiler was configured with `configure + i386v', meaning to compile for an 80386 running System V, then you + would specify `-b i386v' to run that cross compiler. + + When you do not specify `-b', it normally means to compile for the + same type of machine that you are using. + +`-V VERSION' + The argument VERSION specifies which version of GCC to run. This + is useful when multiple versions are installed. For example, + VERSION might be `2.0', meaning to run GCC version 2.0. + + The default version, when you do not specify `-V', is the last + version of GCC that you installed. + + The `-b' and `-V' options actually work by controlling part of the +file name used for the executable files and libraries used for +compilation. A given version of GCC, for a given target machine, is +normally kept in the directory `/usr/local/lib/gcc-lib/MACHINE/VERSION'. + + Thus, sites can customize the effect of `-b' or `-V' either by +changing the names of these directories or adding alternate names (or +symbolic links). If in directory `/usr/local/lib/gcc-lib/' the file +`80386' is a link to the file `i386v', then `-b 80386' becomes an alias +for `-b i386v'. + + In one respect, the `-b' or `-V' do not completely change to a +different compiler: the top-level driver program `gcc' that you +originally invoked continues to run and invoke the other executables +(preprocessor, compiler per se, assembler and linker) that do the real +work. However, since no real work is done in the driver program, it +usually does not matter that the driver program in use is not the one +for the specified target and version. + + The only way that the driver program depends on the target machine is +in the parsing and handling of special machine-specific options. +However, this is controlled by a file which is found, along with the +other executables, in the directory for the specified version and +target machine. As a result, a single installed driver program adapts +to any specified target machine and compiler version. + + The driver program executable does control one significant thing, +however: the default version and target machine. Therefore, you can +install different instances of the driver program, compiled for +different targets or versions, under different names. + + For example, if the driver for version 2.0 is installed as `ogcc' +and that for version 2.1 is installed as `gcc', then the command `gcc' +will use version 2.1 by default, while `ogcc' will use 2.0 by default. +However, you can choose either version with either command with the +`-V' option. + + +File: gcc.info, Node: Submodel Options, Next: Code Gen Options, Prev: Target Options, Up: Invoking GCC + +Hardware Models and Configurations +================================== + + Earlier we discussed the standard option `-b' which chooses among +different installed compilers for completely different target machines, +such as Vax vs. 68000 vs. 80386. + + In addition, each of these target machine types can have its own +special options, starting with `-m', to choose among various hardware +models or configurations--for example, 68010 vs 68020, floating +coprocessor or none. A single installed version of the compiler can +compile for any model or configuration, according to the options +specified. + + Some configurations of the compiler also support additional special +options, usually for compatibility with other compilers on the same +platform. + + These options are defined by the macro `TARGET_SWITCHES' in the +machine description. The default for the options is also defined by +that macro, which enables you to change the defaults. + +* Menu: + +* M680x0 Options:: +* VAX Options:: +* SPARC Options:: +* Convex Options:: +* AMD29K Options:: +* ARM Options:: +* Thumb Options:: +* MN10200 Options:: +* MN10300 Options:: +* M32R/D Options:: +* M88K Options:: +* RS/6000 and PowerPC Options:: +* RT Options:: +* MIPS Options:: +* i386 Options:: +* HPPA Options:: +* Intel 960 Options:: +* DEC Alpha Options:: +* Clipper Options:: +* H8/300 Options:: +* SH Options:: +* System V Options:: +* TMS320C3x/C4x Options:: +* V850 Options:: +* ARC Options:: +* NS32K Options:: + + +File: gcc.info, Node: M680x0 Options, Next: VAX Options, Up: Submodel Options + +M680x0 Options +-------------- + + These are the `-m' options defined for the 68000 series. The default +values for these options depends on which style of 68000 was selected +when the compiler was configured; the defaults for the most common +choices are given below. + +`-m68000' +`-mc68000' + Generate output for a 68000. This is the default when the + compiler is configured for 68000-based systems. + + Use this option for microcontrollers with a 68000 or EC000 core, + including the 68008, 68302, 68306, 68307, 68322, 68328 and 68356. + +`-m68020' +`-mc68020' + Generate output for a 68020. This is the default when the + compiler is configured for 68020-based systems. + +`-m68881' + Generate output containing 68881 instructions for floating point. + This is the default for most 68020 systems unless `-nfp' was + specified when the compiler was configured. + +`-m68030' + Generate output for a 68030. This is the default when the + compiler is configured for 68030-based systems. + +`-m68040' + Generate output for a 68040. This is the default when the + compiler is configured for 68040-based systems. + + This option inhibits the use of 68881/68882 instructions that have + to be emulated by software on the 68040. Use this option if your + 68040 does not have code to emulate those instructions. + +`-m68060' + Generate output for a 68060. This is the default when the + compiler is configured for 68060-based systems. + + This option inhibits the use of 68020 and 68881/68882 instructions + that have to be emulated by software on the 68060. Use this + option if your 68060 does not have code to emulate those + instructions. + +`-mcpu32' + Generate output for a CPU32. This is the default when the compiler + is configured for CPU32-based systems. + + Use this option for microcontrollers with a CPU32 or CPU32+ core, + including the 68330, 68331, 68332, 68333, 68334, 68336, 68340, + 68341, 68349 and 68360. + +`-m5200' + Generate output for a 520X "coldfire" family cpu. This is the + default when the compiler is configured for 520X-based systems. + + Use this option for microcontroller with a 5200 core, including + the MCF5202, MCF5203, MCF5204 and MCF5202. + +`-m68020-40' + Generate output for a 68040, without using any of the new + instructions. This results in code which can run relatively + efficiently on either a 68020/68881 or a 68030 or a 68040. The + generated code does use the 68881 instructions that are emulated + on the 68040. + +`-m68020-60' + Generate output for a 68060, without using any of the new + instructions. This results in code which can run relatively + efficiently on either a 68020/68881 or a 68030 or a 68040. The + generated code does use the 68881 instructions that are emulated + on the 68060. + +`-mfpa' + Generate output containing Sun FPA instructions for floating point. + +`-msoft-float' + Generate output containing library calls for floating point. + *Warning:* the requisite libraries are not available for all m68k + targets. Normally the facilities of the machine's usual C + compiler are used, but this can't be done directly in + cross-compilation. You must make your own arrangements to provide + suitable library functions for cross-compilation. The embedded + targets `m68k-*-aout' and `m68k-*-coff' do provide software + floating point support. + +`-mshort' + Consider type `int' to be 16 bits wide, like `short int'. + +`-mnobitfield' + Do not use the bit-field instructions. The `-m68000', `-mcpu32' + and `-m5200' options imply `-mnobitfield'. + +`-mbitfield' + Do use the bit-field instructions. The `-m68020' option implies + `-mbitfield'. This is the default if you use a configuration + designed for a 68020. + +`-mrtd' + Use a different function-calling convention, in which functions + that take a fixed number of arguments return with the `rtd' + instruction, which pops their arguments while returning. This + saves one instruction in the caller since there is no need to pop + the arguments there. + + This calling convention is incompatible with the one normally used + on Unix, so you cannot use it if you need to call libraries + compiled with the Unix compiler. + + Also, you must provide function prototypes for all functions that + take variable numbers of arguments (including `printf'); otherwise + incorrect code will be generated for calls to those functions. + + In addition, seriously incorrect code will result if you call a + function with too many arguments. (Normally, extra arguments are + harmlessly ignored.) + + The `rtd' instruction is supported by the 68010, 68020, 68030, + 68040, 68060 and CPU32 processors, but not by the 68000 or 5200. + +`-malign-int' +`-mno-align-int' + Control whether GCC aligns `int', `long', `long long', `float', + `double', and `long double' variables on a 32-bit boundary + (`-malign-int') or a 16-bit boundary (`-mno-align-int'). Aligning + variables on 32-bit boundaries produces code that runs somewhat + faster on processors with 32-bit busses at the expense of more + memory. + + *Warning:* if you use the `-malign-int' switch, GCC will align + structures containing the above types differently than most + published application binary interface specifications for the m68k. + + +File: gcc.info, Node: VAX Options, Next: SPARC Options, Prev: M680x0 Options, Up: Submodel Options + +VAX Options +----------- + + These `-m' options are defined for the Vax: + +`-munix' + Do not output certain jump instructions (`aobleq' and so on) that + the Unix assembler for the Vax cannot handle across long ranges. + +`-mgnu' + Do output those jump instructions, on the assumption that you will + assemble with the GNU assembler. + +`-mg' + Output code for g-format floating point numbers instead of + d-format. + + +File: gcc.info, Node: SPARC Options, Next: Convex Options, Prev: VAX Options, Up: Submodel Options + +SPARC Options +------------- + + These `-m' switches are supported on the SPARC: + +`-mno-app-regs' +`-mapp-regs' + Specify `-mapp-regs' to generate output using the global registers + 2 through 4, which the SPARC SVR4 ABI reserves for applications. + This is the default. + + To be fully SVR4 ABI compliant at the cost of some performance + loss, specify `-mno-app-regs'. You should compile libraries and + system software with this option. + +`-mfpu' +`-mhard-float' + Generate output containing floating point instructions. This is + the default. + +`-mno-fpu' +`-msoft-float' + Generate output containing library calls for floating point. + *Warning:* the requisite libraries are not available for all SPARC + targets. Normally the facilities of the machine's usual C + compiler are used, but this cannot be done directly in + cross-compilation. You must make your own arrangements to provide + suitable library functions for cross-compilation. The embedded + targets `sparc-*-aout' and `sparclite-*-*' do provide software + floating point support. + + `-msoft-float' changes the calling convention in the output file; + therefore, it is only useful if you compile *all* of a program with + this option. In particular, you need to compile `libgcc.a', the + library that comes with GCC, with `-msoft-float' in order for this + to work. + +`-mhard-quad-float' + Generate output containing quad-word (long double) floating point + instructions. + +`-msoft-quad-float' + Generate output containing library calls for quad-word (long + double) floating point instructions. The functions called are + those specified in the SPARC ABI. This is the default. + + As of this writing, there are no sparc implementations that have + hardware support for the quad-word floating point instructions. + They all invoke a trap handler for one of these instructions, and + then the trap handler emulates the effect of the instruction. + Because of the trap handler overhead, this is much slower than + calling the ABI library routines. Thus the `-msoft-quad-float' + option is the default. + +`-mno-epilogue' +`-mepilogue' + With `-mepilogue' (the default), the compiler always emits code for + function exit at the end of each function. Any function exit in + the middle of the function (such as a return statement in C) will + generate a jump to the exit code at the end of the function. + + With `-mno-epilogue', the compiler tries to emit exit code inline + at every function exit. + +`-mno-flat' +`-mflat' + With `-mflat', the compiler does not generate save/restore + instructions and will use a "flat" or single register window + calling convention. This model uses %i7 as the frame pointer and + is compatible with the normal register window model. Code from + either may be intermixed. The local registers and the input + registers (0-5) are still treated as "call saved" registers and + will be saved on the stack as necessary. + + With `-mno-flat' (the default), the compiler emits save/restore + instructions (except for leaf functions) and is the normal mode of + operation. + +`-mno-unaligned-doubles' +`-munaligned-doubles' + Assume that doubles have 8 byte alignment. This is the default. + + With `-munaligned-doubles', GCC assumes that doubles have 8 byte + alignment only if they are contained in another type, or if they + have an absolute address. Otherwise, it assumes they have 4 byte + alignment. Specifying this option avoids some rare compatibility + problems with code generated by other compilers. It is not the + default because it results in a performance loss, especially for + floating point code. + +`-mv8' +`-msparclite' + These two options select variations on the SPARC architecture. + + By default (unless specifically configured for the Fujitsu + SPARClite), GCC generates code for the v7 variant of the SPARC + architecture. + + `-mv8' will give you SPARC v8 code. The only difference from v7 + code is that the compiler emits the integer multiply and integer + divide instructions which exist in SPARC v8 but not in SPARC v7. + + `-msparclite' will give you SPARClite code. This adds the integer + multiply, integer divide step and scan (`ffs') instructions which + exist in SPARClite but not in SPARC v7. + + These options are deprecated and will be deleted in a future GCC + release. They have been replaced with `-mcpu=xxx'. + +`-mcypress' +`-msupersparc' + These two options select the processor for which the code is + optimised. + + With `-mcypress' (the default), the compiler optimizes code for the + Cypress CY7C602 chip, as used in the SparcStation/SparcServer 3xx + series. This is also appropriate for the older SparcStation 1, 2, + IPX etc. + + With `-msupersparc' the compiler optimizes code for the SuperSparc + cpu, as used in the SparcStation 10, 1000 and 2000 series. This + flag also enables use of the full SPARC v8 instruction set. + + These options are deprecated and will be deleted in a future GCC + release. They have been replaced with `-mcpu=xxx'. + +`-mcpu=CPU_TYPE' + Set the instruction set, register set, and instruction scheduling + parameters for machine type CPU_TYPE. Supported values for + CPU_TYPE are `v7', `cypress', `v8', `supersparc', `sparclite', + `hypersparc', `sparclite86x', `f930', `f934', `sparclet', + `tsc701', `v9', and `ultrasparc'. + + Default instruction scheduling parameters are used for values that + select an architecture and not an implementation. These are `v7', + `v8', `sparclite', `sparclet', `v9'. + + Here is a list of each supported architecture and their supported + implementations. + + v7: cypress + v8: supersparc, hypersparc + sparclite: f930, f934, sparclite86x + sparclet: tsc701 + v9: ultrasparc + +`-mtune=CPU_TYPE' + Set the instruction scheduling parameters for machine type + CPU_TYPE, but do not set the instruction set or register set that + the option `-mcpu='CPU_TYPE would. + + The same values for `-mcpu='CPU_TYPE are used for `-mtune=' + CPU_TYPE, though the only useful values are those that select a + particular cpu implementation: `cypress', `supersparc', + `hypersparc', `f930', `f934', `sparclite86x', `tsc701', + `ultrasparc'. + +`-malign-loops=NUM' + Align loops to a 2 raised to a NUM byte boundary. If + `-malign-loops' is not specified, the default is 2. + +`-malign-jumps=NUM' + Align instructions that are only jumped to to a 2 raised to a NUM + byte boundary. If `-malign-jumps' is not specified, the default + is 2. + +`-malign-functions=NUM' + Align the start of functions to a 2 raised to NUM byte boundary. + If `-malign-functions' is not specified, the default is 2 if + compiling for 32 bit sparc, and 5 if compiling for 64 bit sparc. + + These `-m' switches are supported in addition to the above on the +SPARCLET processor. + +`-mlittle-endian' + Generate code for a processor running in little-endian mode. + +`-mlive-g0' + Treat register `%g0' as a normal register. GCC will continue to + clobber it as necessary but will not assume it always reads as 0. + +`-mbroken-saverestore' + Generate code that does not use non-trivial forms of the `save' and + `restore' instructions. Early versions of the SPARCLET processor + do not correctly handle `save' and `restore' instructions used with + arguments. They correctly handle them used without arguments. A + `save' instruction used without arguments increments the current + window pointer but does not allocate a new stack frame. It is + assumed that the window overflow trap handler will properly handle + this case as will interrupt handlers. + + These `-m' switches are supported in addition to the above on SPARC +V9 processors in 64 bit environments. + +`-mlittle-endian' + Generate code for a processor running in little-endian mode. + +`-m32' +`-m64' + Generate code for a 32 bit or 64 bit environment. The 32 bit + environment sets int, long and pointer to 32 bits. The 64 bit + environment sets int to 32 bits and long and pointer to 64 bits. + +`-mcmodel=medlow' + Generate code for the Medium/Low code model: the program must be + linked in the low 32 bits of the address space. Pointers are 64 + bits. Programs can be statically or dynamically linked. + +`-mcmodel=medmid' + Generate code for the Medium/Middle code model: the program must + be linked in the low 44 bits of the address space, the text + segment must be less than 2G bytes, and data segment must be + within 2G of the text segment. Pointers are 64 bits. + +`-mcmodel=medany' + Generate code for the Medium/Anywhere code model: the program may + be linked anywhere in the address space, the text segment must be + less than 2G bytes, and data segment must be within 2G of the text + segment. Pointers are 64 bits. + +`-mcmodel=embmedany' + Generate code for the Medium/Anywhere code model for embedded + systems: assume a 32 bit text and a 32 bit data segment, both + starting anywhere (determined at link time). Register %g4 points + to the base of the data segment. Pointers still 64 bits. + Programs are statically linked, PIC is not supported. + +`-mstack-bias' +`-mno-stack-bias' + With `-mstack-bias', GCC assumes that the stack pointer, and frame + pointer if present, are offset by -2047 which must be added back + when making stack frame references. Otherwise, assume no such + offset is present. + + +File: gcc.info, Node: Convex Options, Next: AMD29K Options, Prev: SPARC Options, Up: Submodel Options + +Convex Options +-------------- + + These `-m' options are defined for Convex: + +`-mc1' + Generate output for C1. The code will run on any Convex machine. + The preprocessor symbol `__convex__c1__' is defined. + +`-mc2' + Generate output for C2. Uses instructions not available on C1. + Scheduling and other optimizations are chosen for max performance + on C2. The preprocessor symbol `__convex_c2__' is defined. + +`-mc32' + Generate output for C32xx. Uses instructions not available on C1. + Scheduling and other optimizations are chosen for max performance + on C32. The preprocessor symbol `__convex_c32__' is defined. + +`-mc34' + Generate output for C34xx. Uses instructions not available on C1. + Scheduling and other optimizations are chosen for max performance + on C34. The preprocessor symbol `__convex_c34__' is defined. + +`-mc38' + Generate output for C38xx. Uses instructions not available on C1. + Scheduling and other optimizations are chosen for max performance + on C38. The preprocessor symbol `__convex_c38__' is defined. + +`-margcount' + Generate code which puts an argument count in the word preceding + each argument list. This is compatible with regular CC, and a few + programs may need the argument count word. GDB and other + source-level debuggers do not need it; this info is in the symbol + table. + +`-mnoargcount' + Omit the argument count word. This is the default. + +`-mvolatile-cache' + Allow volatile references to be cached. This is the default. + +`-mvolatile-nocache' + Volatile references bypass the data cache, going all the way to + memory. This is only needed for multi-processor code that does + not use standard synchronization instructions. Making + non-volatile references to volatile locations will not necessarily + work. + +`-mlong32' + Type long is 32 bits, the same as type int. This is the default. + +`-mlong64' + Type long is 64 bits, the same as type long long. This option is + useless, because no library support exists for it. + + +File: gcc.info, Node: AMD29K Options, Next: ARM Options, Prev: Convex Options, Up: Submodel Options + +AMD29K Options +-------------- + + These `-m' options are defined for the AMD Am29000: + +`-mdw' + Generate code that assumes the `DW' bit is set, i.e., that byte and + halfword operations are directly supported by the hardware. This + is the default. + +`-mndw' + Generate code that assumes the `DW' bit is not set. + +`-mbw' + Generate code that assumes the system supports byte and halfword + write operations. This is the default. + +`-mnbw' + Generate code that assumes the systems does not support byte and + halfword write operations. `-mnbw' implies `-mndw'. + +`-msmall' + Use a small memory model that assumes that all function addresses + are either within a single 256 KB segment or at an absolute + address of less than 256k. This allows the `call' instruction to + be used instead of a `const', `consth', `calli' sequence. + +`-mnormal' + Use the normal memory model: Generate `call' instructions only when + calling functions in the same file and `calli' instructions + otherwise. This works if each file occupies less than 256 KB but + allows the entire executable to be larger than 256 KB. This is + the default. + +`-mlarge' + Always use `calli' instructions. Specify this option if you expect + a single file to compile into more than 256 KB of code. + +`-m29050' + Generate code for the Am29050. + +`-m29000' + Generate code for the Am29000. This is the default. + +`-mkernel-registers' + Generate references to registers `gr64-gr95' instead of to + registers `gr96-gr127'. This option can be used when compiling + kernel code that wants a set of global registers disjoint from + that used by user-mode code. + + Note that when this option is used, register names in `-f' flags + must use the normal, user-mode, names. + +`-muser-registers' + Use the normal set of global registers, `gr96-gr127'. This is the + default. + +`-mstack-check' +`-mno-stack-check' + Insert (or do not insert) a call to `__msp_check' after each stack + adjustment. This is often used for kernel code. + +`-mstorem-bug' +`-mno-storem-bug' + `-mstorem-bug' handles 29k processors which cannot handle the + separation of a mtsrim insn and a storem instruction (most 29000 + chips to date, but not the 29050). + +`-mno-reuse-arg-regs' +`-mreuse-arg-regs' + `-mno-reuse-arg-regs' tells the compiler to only use incoming + argument registers for copying out arguments. This helps detect + calling a function with fewer arguments than it was declared with. + +`-mno-impure-text' +`-mimpure-text' + `-mimpure-text', used in addition to `-shared', tells the compiler + to not pass `-assert pure-text' to the linker when linking a + shared object. + +`-msoft-float' + Generate output containing library calls for floating point. + *Warning:* the requisite libraries are not part of GCC. Normally + the facilities of the machine's usual C compiler are used, but + this can't be done directly in cross-compilation. You must make + your own arrangements to provide suitable library functions for + cross-compilation. + +`-mno-multm' + Do not generate multm or multmu instructions. This is useful for + some embedded systems which do not have trap handlers for these + instructions. + + +File: gcc.info, Node: ARM Options, Next: Thumb Options, Prev: AMD29K Options, Up: Submodel Options + +ARM Options +----------- + + These `-m' options are defined for Advanced RISC Machines (ARM) +architectures: + +`-mapcs-frame' + Generate a stack frame that is compliant with the ARM Procedure + Call Standard for all functions, even if this is not strictly + necessary for correct execution of the code. Specifying + `-fomit-frame-pointer' with this option will cause the stack + frames not to be generated for leaf functions. The default is + `-mno-apcs-frame'. + +`-mapcs' + This is a synonym for `-mapcs-frame'. + +`-mapcs-26' + Generate code for a processor running with a 26-bit program + counter, and conforming to the function calling standards for the + APCS 26-bit option. This option replaces the `-m2' and `-m3' + options of previous releases of the compiler. + +`-mapcs-32' + Generate code for a processor running with a 32-bit program + counter, and conforming to the function calling standards for the + APCS 32-bit option. This option replaces the `-m6' option of + previous releases of the compiler. + +`-mapcs-stack-check' + Generate code to check the amount of stack space available upon + entry to every function (that actually uses some stack space). If + there is insufficient space available then either the function + `__rt_stkovf_split_small' or `__rt_stkovf_split_big' will be + called, depending upon the amount of stack space required. The + run time system is required to provide these functions. The + default is `-mno-apcs-stack-check', since this produces smaller + code. + +`-mapcs-float' + Pass floating point arguments using the float point registers. + This is one of the variants of the APCS. This option is + reccommended if the target hardware has a floating point unit or + if a lot of floating point arithmetic is going to be performed by + the code. The default is `-mno-apcs-float', since integer only + code is slightly increased in size if `-mapcs-float' is used. + +`-mapcs-reentrant' + Generate reentrant, position independent code. This is the + equivalent to specifying the `-fpic' option. The default is + `-mno-apcs-reentrant'. + +`-mthumb-interwork' + Generate code which supports calling between the ARM and THUMB + instruction sets. Without this option the two instruction sets + cannot be reliably used inside one program. The default is + `-mno-thumb-interwork', since slightly larger code is generated + when `-mthumb-interwork' is specified. + +`-mno-sched-prolog' + Prevent the reordering of instructions in the function prolog, or + the merging of those instruction with the instructions in the + function's body. This means that all functions will start with a + recognisable set of instructions (or in fact one of a chioce from + a small set of different function prologues), and this information + can be used to locate the start if functions inside an executable + piece of code. The default is `-msched-prolog'. + +`-mhard-float' + Generate output containing floating point instructions. This is + the default. + +`-msoft-float' + Generate output containing library calls for floating point. + *Warning:* the requisite libraries are not available for all ARM + targets. Normally the facilities of the machine's usual C + compiler are used, but this cannot be done directly in + cross-compilation. You must make your own arrangements to provide + suitable library functions for cross-compilation. + + `-msoft-float' changes the calling convention in the output file; + therefore, it is only useful if you compile *all* of a program with + this option. In particular, you need to compile `libgcc.a', the + library that comes with GCC, with `-msoft-float' in order for this + to work. + +`-mlittle-endian' + Generate code for a processor running in little-endian mode. This + is the default for all standard configurations. + +`-mbig-endian' + Generate code for a processor running in big-endian mode; the + default is to compile code for a little-endian processor. + +`-mwords-little-endian' + This option only applies when generating code for big-endian + processors. Generate code for a little-endian word order but a + big-endian byte order. That is, a byte order of the form + `32107654'. Note: this option should only be used if you require + compatibility with code for big-endian ARM processors generated by + versions of the compiler prior to 2.8. + +`-mshort-load-bytes' + Do not try to load half-words (eg `short's) by loading a word from + an unaligned address. For some targets the MMU is configured to + trap unaligned loads; use this option to generate code that is + safe in these environments. + +`-mno-short-load-bytes' + Use unaligned word loads to load half-words (eg `short's). This + option produces more efficient code, but the MMU is sometimes + configured to trap these instructions. + +`-mshort-load-words' + This is a synonym for the `-mno-short-load-bytes'. + +`-mno-short-load-words' + This is a synonym for the `-mshort-load-bytes'. + +`-mbsd' + This option only applies to RISC iX. Emulate the native BSD-mode + compiler. This is the default if `-ansi' is not specified. + +`-mxopen' + This option only applies to RISC iX. Emulate the native + X/Open-mode compiler. + +`-mno-symrename' + This option only applies to RISC iX. Do not run the assembler + post-processor, `symrename', after code has been assembled. + Normally it is necessary to modify some of the standard symbols in + preparation for linking with the RISC iX C library; this option + suppresses this pass. The post-processor is never run when the + compiler is built for cross-compilation. + +`-mcpu=' +`-mtune=' + This specifies the name of the target ARM processor. GCC uses + this name to determine what kind of instructions it can use when + generating assembly code. Permissable names are: arm2, arm250, + arm3, arm6, arm60, arm600, arm610, arm620, arm7, arm7m, arm7d, + arm7dm, arm7di, arm7dmi, arm70, arm700, arm700i, arm710, arm710c, + arm7100, arm7500, arm7500fe, arm7tdmi, arm8, strongarm, + strongarm110, strongarm1100, arm8, arm810, arm9, arm9tdmi. + `-mtune=' is a synonym for `-mcpue=' to support older versions of + GCC. + +`-march=' + This specifies the name of the target ARM architecture. GCC uses + this name to determine what kind of instructions it can use when + generating assembly code. This option can be used in conjunction + with or instead of the `-mcpu=' option. Permissable names are: + armv2, armv2a, armv3, armv3m, armv4, armv4t + +`-mfpe=' +`-mfp=' + This specifes the version of the floating point emulation + available on the target. Permissable values are 2 and 3. `-mfp=' + is a synonym for `-mfpe=' to support older versions of GCC. + +`-mstructure-size-boundary=' + The size of all structures and unions will be rounded up to a + multiple of the number of bits set by this option. Permissable + values are 8 and 32. The default value varies for different + toolchains. For the COFF targeted toolchain the default value is + 8. Specifying the larger number can produced faster, more + efficient code, but can also increase the size of the program. + The two values are potentially incompatible. Code compiled with + one value cannot necessarily expect to work with code or libraries + compiled with the other value, if they exchange information using + structures or unions. Programmers are encouraged to use the 32 + value as future versions of the toolchain may default to this + value. + +`-mabort-on-noreturn' + Generate a call to the function abort at the end of a noreturn + function. It will be executed if the function tries to return. + + +File: gcc.info, Node: Thumb Options, Next: MN10200 Options, Prev: ARM Options, Up: Submodel Options + +Thumb Options +------------- + +`-mthumb-interwork' + Generate code which supports calling between the THUMB and ARM + instruction sets. Without this option the two instruction sets + cannot be reliably used inside one program. The default is + `-mno-thumb-interwork', since slightly smaller code is generated + with this option. + +`-mtpcs-frame' + Generate a stack frame that is compliant with the Thumb Procedure + Call Standard for all non-leaf functions. (A leaf function is one + that does not call any other functions). The default is + `-mno-apcs-frame'. + +`-mtpcs-leaf-frame' + Generate a stack frame that is compliant with the Thumb Procedure + Call Standard for all leaf functions. (A leaf function is one + that does not call any other functions). The default is + `-mno-apcs-leaf-frame'. + +`-mlittle-endian' + Generate code for a processor running in little-endian mode. This + is the default for all standard configurations. + +`-mbig-endian' + Generate code for a processor running in big-endian mode. + +`-mstructure-size-boundary=' + The size of all structures and unions will be rounded up to a + multiple of the number of bits set by this option. Permissable + values are 8 and 32. The default value varies for different + toolchains. For the COFF targeted toolchain the default value is + 8. Specifying the larger number can produced faster, more + efficient code, but can also increase the size of the program. + The two values are potentially incompatible. Code compiled with + one value cannot necessarily expect to work with code or libraries + compiled with the other value, if they exchange information using + structures or unions. Programmers are encouraged to use the 32 + value as future versions of the toolchain may default to this + value. + + +File: gcc.info, Node: MN10200 Options, Next: MN10300 Options, Prev: Thumb Options, Up: Submodel Options + +MN10200 Options +--------------- + + These `-m' options are defined for Matsushita MN10200 architectures: +`-mrelax' + Indicate to the linker that it should perform a relaxation + optimization pass to shorten branches, calls and absolute memory + addresses. This option only has an effect when used on the + command line for the final link step. + + This option makes symbolic debugging impossible. + + +File: gcc.info, Node: MN10300 Options, Next: M32R/D Options, Prev: MN10200 Options, Up: Submodel Options + +MN10300 Options +--------------- + + These `-m' options are defined for Matsushita MN10300 architectures: + +`-mmult-bug' + Generate code to avoid bugs in the multiply instructions for the + MN10300 processors. This is the default. + +`-mno-mult-bug' + Do not generate code to avoid bugs in the multiply instructions + for the MN10300 processors. + +`-mrelax' + Indicate to the linker that it should perform a relaxation + optimization pass to shorten branches, calls and absolute memory + addresses. This option only has an effect when used on the + command line for the final link step. + + This option makes symbolic debugging impossible. + + +File: gcc.info, Node: M32R/D Options, Next: M88K Options, Prev: MN10300 Options, Up: Submodel Options + +M32R/D Options +-------------- + + These `-m' options are defined for Mitsubishi M32R/D architectures: + +`-mcode-model=small' + Assume all objects live in the lower 16MB of memory (so that their + addresses can be loaded with the `ld24' instruction), and assume + all subroutines are reachable with the `bl' instruction. This is + the default. + + The addressability of a particular object can be set with the + `model' attribute. + +`-mcode-model=medium' + Assume objects may be anywhere in the 32 bit address space (the + compiler will generate `seth/add3' instructions to load their + addresses), and assume all subroutines are reachable with the `bl' + instruction. + +`-mcode-model=large' + Assume objects may be anywhere in the 32 bit address space (the + compiler will generate `seth/add3' instructions to load their + addresses), and assume subroutines may not be reachable with the + `bl' instruction (the compiler will generate the much slower + `seth/add3/jl' instruction sequence). + +`-msdata=none' + Disable use of the small data area. Variables will be put into + one of `.data', `bss', or `.rodata' (unless the `section' + attribute has been specified). This is the default. + + The small data area consists of sections `.sdata' and `.sbss'. + Objects may be explicitly put in the small data area with the + `section' attribute using one of these sections. + +`-msdata=sdata' + Put small global and static data in the small data area, but do not + generate special code to reference them. + +`-msdata=use' + Put small global and static data in the small data area, and + generate special instructions to reference them. + +`-G NUM' + Put global and static objects less than or equal to NUM bytes into + the small data or bss sections instead of the normal data or bss + sections. The default value of NUM is 8. The `-msdata' option + must be set to one of `sdata' or `use' for this option to have any + effect. + + All modules should be compiled with the same `-G NUM' value. + Compiling with different values of NUM may or may not work; if it + doesn't the linker will give an error message - incorrect code + will not be generated. + diff --git a/usr/local/nachos/info/gcc.info-5 b/usr/local/nachos/info/gcc.info-5 new file mode 100644 index 0000000..fea8e7a --- /dev/null +++ b/usr/local/nachos/info/gcc.info-5 @@ -0,0 +1,1102 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: M88K Options, Next: RS/6000 and PowerPC Options, Prev: M32R/D Options, Up: Submodel Options + +M88K Options +------------ + + These `-m' options are defined for Motorola 88k architectures: + +`-m88000' + Generate code that works well on both the m88100 and the m88110. + +`-m88100' + Generate code that works best for the m88100, but that also runs + on the m88110. + +`-m88110' + Generate code that works best for the m88110, and may not run on + the m88100. + +`-mbig-pic' + Obsolete option to be removed from the next revision. Use `-fPIC'. + +`-midentify-revision' + Include an `ident' directive in the assembler output recording the + source file name, compiler name and version, timestamp, and + compilation flags used. + +`-mno-underscores' + In assembler output, emit symbol names without adding an underscore + character at the beginning of each name. The default is to use an + underscore as prefix on each name. + +`-mocs-debug-info' +`-mno-ocs-debug-info' + Include (or omit) additional debugging information (about + registers used in each stack frame) as specified in the 88open + Object Compatibility Standard, "OCS". This extra information + allows debugging of code that has had the frame pointer + eliminated. The default for DG/UX, SVr4, and Delta 88 SVr3.2 is + to include this information; other 88k configurations omit this + information by default. + +`-mocs-frame-position' + When emitting COFF debugging information for automatic variables + and parameters stored on the stack, use the offset from the + canonical frame address, which is the stack pointer (register 31) + on entry to the function. The DG/UX, SVr4, Delta88 SVr3.2, and + BCS configurations use `-mocs-frame-position'; other 88k + configurations have the default `-mno-ocs-frame-position'. + +`-mno-ocs-frame-position' + When emitting COFF debugging information for automatic variables + and parameters stored on the stack, use the offset from the frame + pointer register (register 30). When this option is in effect, + the frame pointer is not eliminated when debugging information is + selected by the -g switch. + +`-moptimize-arg-area' +`-mno-optimize-arg-area' + Control how function arguments are stored in stack frames. + `-moptimize-arg-area' saves space by optimizing them, but this + conflicts with the 88open specifications. The opposite + alternative, `-mno-optimize-arg-area', agrees with 88open + standards. By default GCC does not optimize the argument area. + +`-mshort-data-NUM' + Generate smaller data references by making them relative to `r0', + which allows loading a value using a single instruction (rather + than the usual two). You control which data references are + affected by specifying NUM with this option. For example, if you + specify `-mshort-data-512', then the data references affected are + those involving displacements of less than 512 bytes. + `-mshort-data-NUM' is not effective for NUM greater than 64k. + +`-mserialize-volatile' +`-mno-serialize-volatile' + Do, or don't, generate code to guarantee sequential consistency of + volatile memory references. By default, consistency is guaranteed. + + The order of memory references made by the MC88110 processor does + not always match the order of the instructions requesting those + references. In particular, a load instruction may execute before + a preceding store instruction. Such reordering violates + sequential consistency of volatile memory references, when there + are multiple processors. When consistency must be guaranteed, + GNU C generates special instructions, as needed, to force + execution in the proper order. + + The MC88100 processor does not reorder memory references and so + always provides sequential consistency. However, by default, GNU + C generates the special instructions to guarantee consistency even + when you use `-m88100', so that the code may be run on an MC88110 + processor. If you intend to run your code only on the MC88100 + processor, you may use `-mno-serialize-volatile'. + + The extra code generated to guarantee consistency may affect the + performance of your application. If you know that you can safely + forgo this guarantee, you may use `-mno-serialize-volatile'. + +`-msvr4' +`-msvr3' + Turn on (`-msvr4') or off (`-msvr3') compiler extensions related + to System V release 4 (SVr4). This controls the following: + + 1. Which variant of the assembler syntax to emit. + + 2. `-msvr4' makes the C preprocessor recognize `#pragma weak' + that is used on System V release 4. + + 3. `-msvr4' makes GCC issue additional declaration directives + used in SVr4. + + `-msvr4' is the default for the m88k-motorola-sysv4 and + m88k-dg-dgux m88k configurations. `-msvr3' is the default for all + other m88k configurations. + +`-mversion-03.00' + This option is obsolete, and is ignored. + +`-mno-check-zero-division' +`-mcheck-zero-division' + Do, or don't, generate code to guarantee that integer division by + zero will be detected. By default, detection is guaranteed. + + Some models of the MC88100 processor fail to trap upon integer + division by zero under certain conditions. By default, when + compiling code that might be run on such a processor, GNU C + generates code that explicitly checks for zero-valued divisors and + traps with exception number 503 when one is detected. Use of + mno-check-zero-division suppresses such checking for code + generated to run on an MC88100 processor. + + GNU C assumes that the MC88110 processor correctly detects all + instances of integer division by zero. When `-m88110' is + specified, both `-mcheck-zero-division' and + `-mno-check-zero-division' are ignored, and no explicit checks for + zero-valued divisors are generated. + +`-muse-div-instruction' + Use the div instruction for signed integer division on the MC88100 + processor. By default, the div instruction is not used. + + On the MC88100 processor the signed integer division instruction + div) traps to the operating system on a negative operand. The + operating system transparently completes the operation, but at a + large cost in execution time. By default, when compiling code + that might be run on an MC88100 processor, GNU C emulates signed + integer division using the unsigned integer division instruction + divu), thereby avoiding the large penalty of a trap to the + operating system. Such emulation has its own, smaller, execution + cost in both time and space. To the extent that your code's + important signed integer division operations are performed on two + nonnegative operands, it may be desirable to use the div + instruction directly. + + On the MC88110 processor the div instruction (also known as the + divs instruction) processes negative operands without trapping to + the operating system. When `-m88110' is specified, + `-muse-div-instruction' is ignored, and the div instruction is used + for signed integer division. + + Note that the result of dividing INT_MIN by -1 is undefined. In + particular, the behavior of such a division with and without + `-muse-div-instruction' may differ. + +`-mtrap-large-shift' +`-mhandle-large-shift' + Include code to detect bit-shifts of more than 31 bits; + respectively, trap such shifts or emit code to handle them + properly. By default GCC makes no special provision for large bit + shifts. + +`-mwarn-passed-structs' + Warn when a function passes a struct as an argument or result. + Structure-passing conventions have changed during the evolution of + the C language, and are often the source of portability problems. + By default, GCC issues no such warning. + + +File: gcc.info, Node: RS/6000 and PowerPC Options, Next: RT Options, Prev: M88K Options, Up: Submodel Options + +IBM RS/6000 and PowerPC Options +------------------------------- + + These `-m' options are defined for the IBM RS/6000 and PowerPC: +`-mpower' +`-mno-power' +`-mpower2' +`-mno-power2' +`-mpowerpc' +`-mno-powerpc' +`-mpowerpc-gpopt' +`-mno-powerpc-gpopt' +`-mpowerpc-gfxopt' +`-mno-powerpc-gfxopt' +`-mpowerpc64' +`-mno-powerpc64' + GCC supports two related instruction set architectures for the + RS/6000 and PowerPC. The "POWER" instruction set are those + instructions supported by the `rios' chip set used in the original + RS/6000 systems and the "PowerPC" instruction set is the + architecture of the Motorola MPC5xx, MPC6xx, MPC8xx + microprocessors, and the IBM 4xx microprocessors. + + Neither architecture is a subset of the other. However there is a + large common subset of instructions supported by both. An MQ + register is included in processors supporting the POWER + architecture. + + You use these options to specify which instructions are available + on the processor you are using. The default value of these + options is determined when configuring GCC. Specifying the + `-mcpu=CPU_TYPE' overrides the specification of these options. We + recommend you use the `-mcpu=CPU_TYPE' option rather than the + options listed above. + + The `-mpower' option allows GCC to generate instructions that are + found only in the POWER architecture and to use the MQ register. + Specifying `-mpower2' implies `-power' and also allows GCC to + generate instructions that are present in the POWER2 architecture + but not the original POWER architecture. + + The `-mpowerpc' option allows GCC to generate instructions that + are found only in the 32-bit subset of the PowerPC architecture. + Specifying `-mpowerpc-gpopt' implies `-mpowerpc' and also allows + GCC to use the optional PowerPC architecture instructions in the + General Purpose group, including floating-point square root. + Specifying `-mpowerpc-gfxopt' implies `-mpowerpc' and also allows + GCC to use the optional PowerPC architecture instructions in the + Graphics group, including floating-point select. + + The `-mpowerpc64' option allows GCC to generate the additional + 64-bit instructions that are found in the full PowerPC64 + architecture and to treat GPRs as 64-bit, doubleword quantities. + GCC defaults to `-mno-powerpc64'. + + If you specify both `-mno-power' and `-mno-powerpc', GCC will use + only the instructions in the common subset of both architectures + plus some special AIX common-mode calls, and will not use the MQ + register. Specifying both `-mpower' and `-mpowerpc' permits GCC + to use any instruction from either architecture and to allow use + of the MQ register; specify this for the Motorola MPC601. + +`-mnew-mnemonics' +`-mold-mnemonics' + Select which mnemonics to use in the generated assembler code. + `-mnew-mnemonics' requests output that uses the assembler mnemonics + defined for the PowerPC architecture, while `-mold-mnemonics' + requests the assembler mnemonics defined for the POWER + architecture. Instructions defined in only one architecture have + only one mnemonic; GCC uses that mnemonic irrespective of which of + these options is specified. + + GCC defaults to the mnemonics appropriate for the architecture in + use. Specifying `-mcpu=CPU_TYPE' sometimes overrides the value of + these option. Unless you are building a cross-compiler, you + should normally not specify either `-mnew-mnemonics' or + `-mold-mnemonics', but should instead accept the default. + +`-mcpu=CPU_TYPE' + Set architecture type, register usage, choice of mnemonics, and + instruction scheduling parameters for machine type CPU_TYPE. + Supported values for CPU_TYPE are `rs6000', `rios1', `rios2', + `rsc', `601', `602', `603', `603e', `604', `604e', `620', `740', + `750', `power', `power2', `powerpc', `403', `505', `801', `821', + `823', and `860' and `common'. `-mcpu=power', `-mcpu=power2', and + `-mcpu=powerpc' specify generic POWER, POWER2 and pure PowerPC + (i.e., not MPC601) architecture machine types, with an appropriate, + generic processor model assumed for scheduling purposes. + + Specifying any of the following options: `-mcpu=rios1', + `-mcpu=rios2', `-mcpu=rsc', `-mcpu=power', or `-mcpu=power2' + enables the `-mpower' option and disables the `-mpowerpc' option; + `-mcpu=601' enables both the `-mpower' and `-mpowerpc' options. + All of `-mcpu=602', `-mcpu=603', `-mcpu=603e', `-mcpu=604', + `-mcpu=620', enable the `-mpowerpc' option and disable the + `-mpower' option. Exactly similarly, all of `-mcpu=403', + `-mcpu=505', `-mcpu=821', `-mcpu=860' and `-mcpu=powerpc' enable + the `-mpowerpc' option and disable the `-mpower' option. + `-mcpu=common' disables both the `-mpower' and `-mpowerpc' options. + + AIX versions 4 or greater selects `-mcpu=common' by default, so + that code will operate on all members of the RS/6000 and PowerPC + families. In that case, GCC will use only the instructions in the + common subset of both architectures plus some special AIX + common-mode calls, and will not use the MQ register. GCC assumes + a generic processor model for scheduling purposes. + + Specifying any of the options `-mcpu=rios1', `-mcpu=rios2', + `-mcpu=rsc', `-mcpu=power', or `-mcpu=power2' also disables the + `new-mnemonics' option. Specifying `-mcpu=601', `-mcpu=602', + `-mcpu=603', `-mcpu=603e', `-mcpu=604', `620', `403', or + `-mcpu=powerpc' also enables the `new-mnemonics' option. + + Specifying `-mcpu=403', `-mcpu=821', or `-mcpu=860' also enables + the `-msoft-float' option. + +`-mtune=CPU_TYPE' + Set the instruction scheduling parameters for machine type + CPU_TYPE, but do not set the architecture type, register usage, + choice of mnemonics like `-mcpu='CPU_TYPE would. The same values + for CPU_TYPE are used for `-mtune='CPU_TYPE as for + `-mcpu='CPU_TYPE. The `-mtune='CPU_TYPE option overrides the + `-mcpu='CPU_TYPE option in terms of instruction scheduling + parameters. + +`-mfull-toc' +`-mno-fp-in-toc' +`-mno-sum-in-toc' +`-mminimal-toc' + Modify generation of the TOC (Table Of Contents), which is created + for every executable file. The `-mfull-toc' option is selected by + default. In that case, GCC will allocate at least one TOC entry + for each unique non-automatic variable reference in your program. + GCC will also place floating-point constants in the TOC. However, + only 16,384 entries are available in the TOC. + + If you receive a linker error message that saying you have + overflowed the available TOC space, you can reduce the amount of + TOC space used with the `-mno-fp-in-toc' and `-mno-sum-in-toc' + options. `-mno-fp-in-toc' prevents GCC from putting floating-point + constants in the TOC and `-mno-sum-in-toc' forces GCC to generate + code to calculate the sum of an address and a constant at run-time + instead of putting that sum into the TOC. You may specify one or + both of these options. Each causes GCC to produce very slightly + slower and larger code at the expense of conserving TOC space. + + If you still run out of space in the TOC even when you specify + both of these options, specify `-mminimal-toc' instead. This + option causes GCC to make only one TOC entry for every file. When + you specify this option, GCC will produce code that is slower and + larger but which uses extremely little TOC space. You may wish to + use this option only on files that contain less frequently + executed code. + +`-maix64' +`-maix32' + Enable AIX 64-bit ABI and calling convention: 64-bit pointers, + 64-bit `long' type, and the infrastructure needed to support them. + Specifying `-maix64' implies `-mpowerpc64' and `-mpowerpc', while + `-maix32' disables the 64-bit ABI and implies `-mno-powerpc64'. + GCC defaults to `-maix32'. + +`-mxl-call' +`-mno-xl-call' + On AIX, pass floating-point arguments to prototyped functions + beyond the register save area (RSA) on the stack in addition to + argument FPRs. The AIX calling convention was extended but not + initially documented to handle an obscure K&R C case of calling a + function that takes the address of its arguments with fewer + arguments than declared. AIX XL compilers access floating point + arguments which do not fit in the RSA from the stack when a + subroutine is compiled without optimization. Because always + storing floating-point arguments on the stack is inefficient and + rarely needed, this option is not enabled by default and only is + necessary when calling subroutines compiled by AIX XL compilers + without optimization. + +`-mthreads' + Support "AIX Threads". Link an application written to use + "pthreads" with special libraries and startup code to enable the + application to run. + +`-mpe' + Support "IBM RS/6000 SP" "Parallel Environment" (PE). Link an + application written to use message passing with special startup + code to enable the application to run. The system must have PE + installed in the standard location (`/usr/lpp/ppe.poe/'), or the + `specs' file must be overridden with the `-specs=' option to + specify the appropriate directory location. The Parallel + Environment does not support threads, so the `-mpe' option and the + `-mthreads' option are incompatible. + +`-msoft-float' +`-mhard-float' + Generate code that does not use (uses) the floating-point register + set. Software floating point emulation is provided if you use the + `-msoft-float' option, and pass the option to GCC when linking. + +`-mmultiple' +`-mno-multiple' + Generate code that uses (does not use) the load multiple word + instructions and the store multiple word instructions. These + instructions are generated by default on POWER systems, and not + generated on PowerPC systems. Do not use `-mmultiple' on little + endian PowerPC systems, since those instructions do not work when + the processor is in little endian mode. The exceptions are PPC740 + and PPC750 which permit the instructions usage in little endian + mode. + +`-mstring' +`-mno-string' + Generate code that uses (does not use) the load string instructions + and the store string word instructions to save multiple registers + and do small block moves. These instructions are generated by + default on POWER systems, and not generated on PowerPC systems. + Do not use `-mstring' on little endian PowerPC systems, since those + instructions do not work when the processor is in little endian + mode. The exceptions are PPC740 and PPC750 which permit the + instructions usage in little endian mode. + +`-mupdate' +`-mno-update' + Generate code that uses (does not use) the load or store + instructions that update the base register to the address of the + calculated memory location. These instructions are generated by + default. If you use `-mno-update', there is a small window + between the time that the stack pointer is updated and the address + of the previous frame is stored, which means code that walks the + stack frame across interrupts or signals may get corrupted data. + +`-mfused-madd' +`-mno-fused-madd' + Generate code that uses (does not use) the floating point multiply + and accumulate instructions. These instructions are generated by + default if hardware floating is used. + +`-mno-bit-align' +`-mbit-align' + On System V.4 and embedded PowerPC systems do not (do) force + structures and unions that contain bit fields to be aligned to the + base type of the bit field. + + For example, by default a structure containing nothing but 8 + `unsigned' bitfields of length 1 would be aligned to a 4 byte + boundary and have a size of 4 bytes. By using `-mno-bit-align', + the structure would be aligned to a 1 byte boundary and be one + byte in size. + +`-mno-strict-align' +`-mstrict-align' + On System V.4 and embedded PowerPC systems do not (do) assume that + unaligned memory references will be handled by the system. + +`-mrelocatable' +`-mno-relocatable' + On embedded PowerPC systems generate code that allows (does not + allow) the program to be relocated to a different address at + runtime. If you use `-mrelocatable' on any module, all objects + linked together must be compiled with `-mrelocatable' or + `-mrelocatable-lib'. + +`-mrelocatable-lib' +`-mno-relocatable-lib' + On embedded PowerPC systems generate code that allows (does not + allow) the program to be relocated to a different address at + runtime. Modules compiled with `-mrelocatable-lib' can be linked + with either modules compiled without `-mrelocatable' and + `-mrelocatable-lib' or with modules compiled with the + `-mrelocatable' options. + +`-mno-toc' +`-mtoc' + On System V.4 and embedded PowerPC systems do not (do) assume that + register 2 contains a pointer to a global area pointing to the + addresses used in the program. + +`-mlittle' +`-mlittle-endian' + On System V.4 and embedded PowerPC systems compile code for the + processor in little endian mode. The `-mlittle-endian' option is + the same as `-mlittle'. + +`-mbig' +`-mbig-endian' + On System V.4 and embedded PowerPC systems compile code for the + processor in big endian mode. The `-mbig-endian' option is the + same as `-mbig'. + +`-mcall-sysv' + On System V.4 and embedded PowerPC systems compile code using + calling conventions that adheres to the March 1995 draft of the + System V Application Binary Interface, PowerPC processor + supplement. This is the default unless you configured GCC using + `powerpc-*-eabiaix'. + +`-mcall-sysv-eabi' + Specify both `-mcall-sysv' and `-meabi' options. + +`-mcall-sysv-noeabi' + Specify both `-mcall-sysv' and `-mno-eabi' options. + +`-mcall-aix' + On System V.4 and embedded PowerPC systems compile code using + calling conventions that are similar to those used on AIX. This + is the default if you configured GCC using `powerpc-*-eabiaix'. + +`-mcall-solaris' + On System V.4 and embedded PowerPC systems compile code for the + Solaris operating system. + +`-mcall-linux' + On System V.4 and embedded PowerPC systems compile code for the + Linux-based GNU system. + +`-mprototype' +`-mno-prototype' + On System V.4 and embedded PowerPC systems assume that all calls to + variable argument functions are properly prototyped. Otherwise, + the compiler must insert an instruction before every non + prototyped call to set or clear bit 6 of the condition code + register (CR) to indicate whether floating point values were + passed in the floating point registers in case the function takes + a variable arguments. With `-mprototype', only calls to + prototyped variable argument functions will set or clear the bit. + +`-msim' + On embedded PowerPC systems, assume that the startup module is + called `sim-crt0.o' and that the standard C libraries are + `libsim.a' and `libc.a'. This is the default for + `powerpc-*-eabisim'. configurations. + +`-mmvme' + On embedded PowerPC systems, assume that the startup module is + called `crt0.o' and the standard C libraries are `libmvme.a' and + `libc.a'. + +`-mads' + On embedded PowerPC systems, assume that the startup module is + called `crt0.o' and the standard C libraries are `libads.a' and + `libc.a'. + +`-myellowknife' + On embedded PowerPC systems, assume that the startup module is + called `crt0.o' and the standard C libraries are `libyk.a' and + `libc.a'. + +`-memb' + On embedded PowerPC systems, set the PPC_EMB bit in the ELF flags + header to indicate that `eabi' extended relocations are used. + +`-meabi' +`-mno-eabi' + On System V.4 and embedded PowerPC systems do (do not) adhere to + the Embedded Applications Binary Interface (eabi) which is a set of + modifications to the System V.4 specifications. Selecting `-meabi' + means that the stack is aligned to an 8 byte boundary, a function + `__eabi' is called to from `main' to set up the eabi environment, + and the `-msdata' option can use both `r2' and `r13' to point to + two separate small data areas. Selecting `-mno-eabi' means that + the stack is aligned to a 16 byte boundary, do not call an + initialization function from `main', and the `-msdata' option will + only use `r13' to point to a single small data area. The `-meabi' + option is on by default if you configured GCC using one of the + `powerpc*-*-eabi*' options. + +`-msdata=eabi' + On System V.4 and embedded PowerPC systems, put small initialized + `const' global and static data in the `.sdata2' section, which is + pointed to by register `r2'. Put small initialized non-`const' + global and static data in the `.sdata' section, which is pointed + to by register `r13'. Put small uninitialized global and static + data in the `.sbss' section, which is adjacent to the `.sdata' + section. The `-msdata=eabi' option is incompatible with the + `-mrelocatable' option. The `-msdata=eabi' option also sets the + `-memb' option. + +`-msdata=sysv' + On System V.4 and embedded PowerPC systems, put small global and + static data in the `.sdata' section, which is pointed to by + register `r13'. Put small uninitialized global and static data in + the `.sbss' section, which is adjacent to the `.sdata' section. + The `-msdata=sysv' option is incompatible with the `-mrelocatable' + option. + +`-msdata=default' +`-msdata' + On System V.4 and embedded PowerPC systems, if `-meabi' is used, + compile code the same as `-msdata=eabi', otherwise compile code the + same as `-msdata=sysv'. + +`-msdata-data' + On System V.4 and embedded PowerPC systems, put small global and + static data in the `.sdata' section. Put small uninitialized + global and static data in the `.sbss' section. Do not use + register `r13' to address small data however. This is the default + behavior unless other `-msdata' options are used. + +`-msdata=none' +`-mno-sdata' + On embedded PowerPC systems, put all initialized global and static + data in the `.data' section, and all uninitialized data in the + `.bss' section. + +`-G NUM' + On embedded PowerPC systems, put global and static items less than + or equal to NUM bytes into the small data or bss sections instead + of the normal data or bss section. By default, NUM is 8. The `-G + NUM' switch is also passed to the linker. All modules should be + compiled with the same `-G NUM' value. + +`-mregnames' +`-mno-regnames' + On System V.4 and embedded PowerPC systems do (do not) emit + register names in the assembly language output using symbolic + forms. + + +File: gcc.info, Node: RT Options, Next: MIPS Options, Prev: RS/6000 and PowerPC Options, Up: Submodel Options + +IBM RT Options +-------------- + + These `-m' options are defined for the IBM RT PC: + +`-min-line-mul' + Use an in-line code sequence for integer multiplies. This is the + default. + +`-mcall-lib-mul' + Call `lmul$$' for integer multiples. + +`-mfull-fp-blocks' + Generate full-size floating point data blocks, including the + minimum amount of scratch space recommended by IBM. This is the + default. + +`-mminimum-fp-blocks' + Do not include extra scratch space in floating point data blocks. + This results in smaller code, but slower execution, since scratch + space must be allocated dynamically. + +`-mfp-arg-in-fpregs' + Use a calling sequence incompatible with the IBM calling + convention in which floating point arguments are passed in + floating point registers. Note that `varargs.h' and `stdargs.h' + will not work with floating point operands if this option is + specified. + +`-mfp-arg-in-gregs' + Use the normal calling convention for floating point arguments. + This is the default. + +`-mhc-struct-return' + Return structures of more than one word in memory, rather than in a + register. This provides compatibility with the MetaWare HighC (hc) + compiler. Use the option `-fpcc-struct-return' for compatibility + with the Portable C Compiler (pcc). + +`-mnohc-struct-return' + Return some structures of more than one word in registers, when + convenient. This is the default. For compatibility with the + IBM-supplied compilers, use the option `-fpcc-struct-return' or the + option `-mhc-struct-return'. + + +File: gcc.info, Node: MIPS Options, Next: i386 Options, Prev: RT Options, Up: Submodel Options + +MIPS Options +------------ + + These `-m' options are defined for the MIPS family of computers: + +`-mcpu=CPU TYPE' + Assume the defaults for the machine type CPU TYPE when scheduling + instructions. The choices for CPU TYPE are `r2000', `r3000', + `r3900', `r4000', `r4100', `r4300', `r4400', `r4600', `r4650', + `r5000', `r6000', `r8000', and `orion'. Additionally, the + `r2000', `r3000', `r4000', `r5000', and `r6000' can be abbreviated + as `r2k' (or `r2K'), `r3k', etc. While picking a specific CPU + TYPE will schedule things appropriately for that particular chip, + the compiler will not generate any code that does not meet level 1 + of the MIPS ISA (instruction set architecture) without a `-mipsX' + or `-mabi' switch being used. + +`-mips1' + Issue instructions from level 1 of the MIPS ISA. This is the + default. `r3000' is the default CPU TYPE at this ISA level. + +`-mips2' + Issue instructions from level 2 of the MIPS ISA (branch likely, + square root instructions). `r6000' is the default CPU TYPE at this + ISA level. + +`-mips3' + Issue instructions from level 3 of the MIPS ISA (64 bit + instructions). `r4000' is the default CPU TYPE at this ISA level. + +`-mips4' + Issue instructions from level 4 of the MIPS ISA (conditional move, + prefetch, enhanced FPU instructions). `r8000' is the default CPU + TYPE at this ISA level. + +`-mfp32' + Assume that 32 32-bit floating point registers are available. + This is the default. + +`-mfp64' + Assume that 32 64-bit floating point registers are available. + This is the default when the `-mips3' option is used. + +`-mgp32' + Assume that 32 32-bit general purpose registers are available. + This is the default. + +`-mgp64' + Assume that 32 64-bit general purpose registers are available. + This is the default when the `-mips3' option is used. + +`-mint64' + Force int and long types to be 64 bits wide. See `-mlong32' for an + explanation of the default, and the width of pointers. + +`-mlong64' + Force long types to be 64 bits wide. See `-mlong32' for an + explanation of the default, and the width of pointers. + +`-mlong32' + Force long, int, and pointer types to be 32 bits wide. + + If none of `-mlong32', `-mlong64', or `-mint64' are set, the size + of ints, longs, and pointers depends on the ABI and ISA choosen. + For `-mabi=32', and `-mabi=n32', ints and longs are 32 bits wide. + For `-mabi=64', ints are 32 bits, and longs are 64 bits wide. For + `-mabi=eabi' and either `-mips1' or `-mips2', ints and longs are + 32 bits wide. For `-mabi=eabi' and higher ISAs, ints are 32 bits, + and longs are 64 bits wide. The width of pointer types is the + smaller of the width of longs or the width of general purpose + registers (which in turn depends on the ISA). + +`-mabi=32' +`-mabi=o64' +`-mabi=n32' +`-mabi=64' +`-mabi=eabi' + Generate code for the indicated ABI. The default instruction + level is `-mips1' for `32', `-mips3' for `n32', and `-mips4' + otherwise. Conversely, with `-mips1' or `-mips2', the default ABI + is `32'; otherwise, the default ABI is `64'. + +`-mmips-as' + Generate code for the MIPS assembler, and invoke `mips-tfile' to + add normal debug information. This is the default for all + platforms except for the OSF/1 reference platform, using the + OSF/rose object format. If the either of the `-gstabs' or + `-gstabs+' switches are used, the `mips-tfile' program will + encapsulate the stabs within MIPS ECOFF. + +`-mgas' + Generate code for the GNU assembler. This is the default on the + OSF/1 reference platform, using the OSF/rose object format. Also, + this is the default if the configure option `--with-gnu-as' is + used. + +`-msplit-addresses' +`-mno-split-addresses' + Generate code to load the high and low parts of address constants + separately. This allows `gcc' to optimize away redundant loads of + the high order bits of addresses. This optimization requires GNU + as and GNU ld. This optimization is enabled by default for some + embedded targets where GNU as and GNU ld are standard. + +`-mrnames' +`-mno-rnames' + The `-mrnames' switch says to output code using the MIPS software + names for the registers, instead of the hardware names (ie, A0 + instead of $4). The only known assembler that supports this option + is the Algorithmics assembler. + +`-mgpopt' +`-mno-gpopt' + The `-mgpopt' switch says to write all of the data declarations + before the instructions in the text section, this allows the MIPS + assembler to generate one word memory references instead of using + two words for short global or static data items. This is on by + default if optimization is selected. + +`-mstats' +`-mno-stats' + For each non-inline function processed, the `-mstats' switch + causes the compiler to emit one line to the standard error file to + print statistics about the program (number of registers saved, + stack size, etc.). + +`-mmemcpy' +`-mno-memcpy' + The `-mmemcpy' switch makes all block moves call the appropriate + string function (`memcpy' or `bcopy') instead of possibly + generating inline code. + +`-mmips-tfile' +`-mno-mips-tfile' + The `-mno-mips-tfile' switch causes the compiler not postprocess + the object file with the `mips-tfile' program, after the MIPS + assembler has generated it to add debug support. If `mips-tfile' + is not run, then no local variables will be available to the + debugger. In addition, `stage2' and `stage3' objects will have + the temporary file names passed to the assembler embedded in the + object file, which means the objects will not compare the same. + The `-mno-mips-tfile' switch should only be used when there are + bugs in the `mips-tfile' program that prevents compilation. + +`-msoft-float' + Generate output containing library calls for floating point. + *Warning:* the requisite libraries are not part of GCC. Normally + the facilities of the machine's usual C compiler are used, but + this can't be done directly in cross-compilation. You must make + your own arrangements to provide suitable library functions for + cross-compilation. + +`-mhard-float' + Generate output containing floating point instructions. This is + the default if you use the unmodified sources. + +`-mabicalls' +`-mno-abicalls' + Emit (or do not emit) the pseudo operations `.abicalls', + `.cpload', and `.cprestore' that some System V.4 ports use for + position independent code. + +`-mlong-calls' +`-mno-long-calls' + Do all calls with the `JALR' instruction, which requires loading + up a function's address into a register before the call. You need + to use this switch, if you call outside of the current 512 + megabyte segment to functions that are not through pointers. + +`-mhalf-pic' +`-mno-half-pic' + Put pointers to extern references into the data section and load + them up, rather than put the references in the text section. + +`-membedded-pic' +`-mno-embedded-pic' + Generate PIC code suitable for some embedded systems. All calls + are made using PC relative address, and all data is addressed + using the $gp register. No more than 65536 bytes of global data + may be used. This requires GNU as and GNU ld which do most of the + work. This currently only works on targets which use ECOFF; it + does not work with ELF. + +`-membedded-data' +`-mno-embedded-data' + Allocate variables to the read-only data section first if + possible, then next in the small data section if possible, + otherwise in data. This gives slightly slower code than the + default, but reduces the amount of RAM required when executing, + and thus may be preferred for some embedded systems. + +`-msingle-float' +`-mdouble-float' + The `-msingle-float' switch tells gcc to assume that the floating + point coprocessor only supports single precision operations, as on + the `r4650' chip. The `-mdouble-float' switch permits gcc to use + double precision operations. This is the default. + +`-mmad' +`-mno-mad' + Permit use of the `mad', `madu' and `mul' instructions, as on the + `r4650' chip. + +`-m4650' + Turns on `-msingle-float', `-mmad', and, at least for now, + `-mcpu=r4650'. + +`-mips16' +`-mno-mips16' + Enable 16-bit instructions. + +`-mentry' + Use the entry and exit pseudo ops. This option can only be used + with `-mips16'. + +`-EL' + Compile code for the processor in little endian mode. The + requisite libraries are assumed to exist. + +`-EB' + Compile code for the processor in big endian mode. The requisite + libraries are assumed to exist. + +`-G NUM' + Put global and static items less than or equal to NUM bytes into + the small data or bss sections instead of the normal data or bss + section. This allows the assembler to emit one word memory + reference instructions based on the global pointer (GP or $28), + instead of the normal two words used. By default, NUM is 8 when + the MIPS assembler is used, and 0 when the GNU assembler is used. + The `-G NUM' switch is also passed to the assembler and linker. + All modules should be compiled with the same `-G NUM' value. + +`-nocpp' + Tell the MIPS assembler to not run its preprocessor over user + assembler files (with a `.s' suffix) when assembling them. + + These options are defined by the macro `TARGET_SWITCHES' in the +machine description. The default for the options is also defined by +that macro, which enables you to change the defaults. + + +File: gcc.info, Node: i386 Options, Next: HPPA Options, Prev: MIPS Options, Up: Submodel Options + +Intel 386 Options +----------------- + + These `-m' options are defined for the i386 family of computers: + +`-mcpu=CPU TYPE' + Assume the defaults for the machine type CPU TYPE when scheduling + instructions. The choices for CPU TYPE are: + + `i386' `i486' `i586' `i686' + `pentium' `pentiumpro' `k6' + + While picking a specific CPU TYPE will schedule things + appropriately for that particular chip, the compiler will not + generate any code that does not run on the i386 without the + `-march=CPU TYPE' option being used. `i586' is equivalent to + `pentium' and `i686' is equivalent to `pentiumpro'. `k6' is the + AMD chip as opposed to the Intel ones. + +`-march=CPU TYPE' + Generate instructions for the machine type CPU TYPE. The choices + for CPU TYPE are the same as for `-mcpu'. Moreover, specifying + `-march=CPU TYPE' implies `-mcpu=CPU TYPE'. + +`-m386' +`-m486' +`-mpentium' +`-mpentiumpro' + Synonyms for -mcpu=i386, -mcpu=i486, -mcpu=pentium, and + -mcpu=pentiumpro respectively. These synonyms are deprecated. + +`-mieee-fp' +`-mno-ieee-fp' + Control whether or not the compiler uses IEEE floating point + comparisons. These handle correctly the case where the result of a + comparison is unordered. + +`-msoft-float' + Generate output containing library calls for floating point. + *Warning:* the requisite libraries are not part of GCC. Normally + the facilities of the machine's usual C compiler are used, but + this can't be done directly in cross-compilation. You must make + your own arrangements to provide suitable library functions for + cross-compilation. + + On machines where a function returns floating point results in the + 80387 register stack, some floating point opcodes may be emitted + even if `-msoft-float' is used. + +`-mno-fp-ret-in-387' + Do not use the FPU registers for return values of functions. + + The usual calling convention has functions return values of types + `float' and `double' in an FPU register, even if there is no FPU. + The idea is that the operating system should emulate an FPU. + + The option `-mno-fp-ret-in-387' causes such values to be returned + in ordinary CPU registers instead. + +`-mno-fancy-math-387' + Some 387 emulators do not support the `sin', `cos' and `sqrt' + instructions for the 387. Specify this option to avoid generating + those instructions. This option is the default on FreeBSD. As of + revision 2.6.1, these instructions are not generated unless you + also use the `-ffast-math' switch. + +`-malign-double' +`-mno-align-double' + Control whether GCC aligns `double', `long double', and `long + long' variables on a two word boundary or a one word boundary. + Aligning `double' variables on a two word boundary will produce + code that runs somewhat faster on a `Pentium' at the expense of + more memory. + + *Warning:* if you use the `-malign-double' switch, structures + containing the above types will be aligned differently than the + published application binary interface specifications for the 386. + +`-msvr3-shlib' +`-mno-svr3-shlib' + Control whether GCC places uninitialized locals into `bss' or + `data'. `-msvr3-shlib' places these locals into `bss'. These + options are meaningful only on System V Release 3. + +`-mno-wide-multiply' +`-mwide-multiply' + Control whether GCC uses the `mul' and `imul' that produce 64 bit + results in `eax:edx' from 32 bit operands to do `long long' + multiplies and 32-bit division by constants. + +`-mrtd' + Use a different function-calling convention, in which functions + that take a fixed number of arguments return with the `ret' NUM + instruction, which pops their arguments while returning. This + saves one instruction in the caller since there is no need to pop + the arguments there. + + You can specify that an individual function is called with this + calling sequence with the function attribute `stdcall'. You can + also override the `-mrtd' option by using the function attribute + `cdecl'. *Note Function Attributes::. + + *Warning:* this calling convention is incompatible with the one + normally used on Unix, so you cannot use it if you need to call + libraries compiled with the Unix compiler. + + Also, you must provide function prototypes for all functions that + take variable numbers of arguments (including `printf'); otherwise + incorrect code will be generated for calls to those functions. + + In addition, seriously incorrect code will result if you call a + function with too many arguments. (Normally, extra arguments are + harmlessly ignored.) + +`-mreg-alloc=REGS' + Control the default allocation order of integer registers. The + string REGS is a series of letters specifying a register. The + supported letters are: `a' allocate EAX; `b' allocate EBX; `c' + allocate ECX; `d' allocate EDX; `S' allocate ESI; `D' allocate + EDI; `B' allocate EBP. + +`-mregparm=NUM' + Control how many registers are used to pass integer arguments. By + default, no registers are used to pass arguments, and at most 3 + registers can be used. You can control this behavior for a + specific function by using the function attribute `regparm'. + *Note Function Attributes::. + + *Warning:* if you use this switch, and NUM is nonzero, then you + must build all modules with the same value, including any + libraries. This includes the system libraries and startup modules. + +`-malign-loops=NUM' + Align loops to a 2 raised to a NUM byte boundary. If + `-malign-loops' is not specified, the default is 2 unless gas 2.8 + (or later) is being used in which case the default is to align the + loop on a 16 byte boundary if it is less than 8 bytes away. + +`-malign-jumps=NUM' + Align instructions that are only jumped to to a 2 raised to a NUM + byte boundary. If `-malign-jumps' is not specified, the default is + 2 if optimizing for a 386, and 4 if optimizing for a 486 unless + gas 2.8 (or later) is being used in which case the default is to + align the instruction on a 16 byte boundary if it is less than 8 + bytes away. + +`-malign-functions=NUM' + Align the start of functions to a 2 raised to NUM byte boundary. + If `-malign-functions' is not specified, the default is 2 if + optimizing for a 386, and 4 if optimizing for a 486. + +`-mpreferred-stack-boundary=NUM' + Attempt to keep the stack boundary aligned to a 2 raised to NUM + byte boundary. If `-mpreferred-stack-boundary' is not specified, + the default is 4 (16 bytes or 128 bits). + + The stack is required to be aligned on a 4 byte boundary. On + Pentium and PentiumPro, `double' and `long double' values should be + aligned to an 8 byte boundary (see `-malign-double') or suffer + significant run time performance penalties. On Pentium III, the + Streaming SIMD Extention (SSE) data type `__m128' suffers similar + penalties if it is not 16 byte aligned. + + To ensure proper alignment of this values on the stack, the stack + boundary must be as aligned as that required by any value stored + on the stack. Further, every function must be generated such that + it keeps the stack aligned. Thus calling a function compiled with + a higher preferred stack boundary from a function compiled with a + lower preferred stack boundary will most likely misalign the + stack. It is recommended that libraries that use callbacks always + use the default setting. + + This extra alignment does consume extra stack space. Code that is + sensitive to stack space usage, such as embedded systems and + operating system kernels, may want to reduce the preferred + alignment to `-mpreferred-stack-boundary=2'. + diff --git a/usr/local/nachos/info/gcc.info-6 b/usr/local/nachos/info/gcc.info-6 new file mode 100644 index 0000000..a106a8d --- /dev/null +++ b/usr/local/nachos/info/gcc.info-6 @@ -0,0 +1,1210 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: HPPA Options, Next: Intel 960 Options, Prev: i386 Options, Up: Submodel Options + +HPPA Options +------------ + + These `-m' options are defined for the HPPA family of computers: + +`-march=ARCHITECTURE TYPE' + Generate code for the specified architecture. The choices for + ARCHITECTURE TYPE are `1.0' for PA 1.0, `1.1' for PA 1.1, and + `2.0' for PA 2.0 processors. Refer to `/usr/lib/sched.models' on + an HP-UX system to determine the proper architecture option for + your machine. Code compiled for lower numbered architectures will + run on higher numbered architectures, but not the other way around. + + PA 2.0 support currently requires gas snapshot 19990413 or later. + The next release of binutils (current is 2.9.1) will probably + contain PA 2.0 support. + +`-mpa-risc-1-0' +`-mpa-risc-1-1' +`-mpa-risc-2-0' + Synonyms for -march=1.0, -march=1.1, and -march=2.0 respectively. + +`-mbig-switch' + Generate code suitable for big switch tables. Use this option + only if the assembler/linker complain about out of range branches + within a switch table. + +`-mjump-in-delay' + Fill delay slots of function calls with unconditional jump + instructions by modifying the return pointer for the function call + to be the target of the conditional jump. + +`-mdisable-fpregs' + Prevent floating point registers from being used in any manner. + This is necessary for compiling kernels which perform lazy context + switching of floating point registers. If you use this option and + attempt to perform floating point operations, the compiler will + abort. + +`-mdisable-indexing' + Prevent the compiler from using indexing address modes. This + avoids some rather obscure problems when compiling MIG generated + code under MACH. + +`-mno-space-regs' + Generate code that assumes the target has no space registers. + This allows GCC to generate faster indirect calls and use unscaled + index address modes. + + Such code is suitable for level 0 PA systems and kernels. + +`-mfast-indirect-calls' + Generate code that assumes calls never cross space boundaries. + This allows GCC to emit code which performs faster indirect calls. + + This option will not work in the presense of shared libraries or + nested functions. + +`-mspace' + Optimize for space rather than execution time. Currently this only + enables out of line function prologues and epilogues. This option + is incompatible with PIC code generation and profiling. + +`-mlong-load-store' + Generate 3-instruction load and store sequences as sometimes + required by the HP-UX 10 linker. This is equivalent to the `+k' + option to the HP compilers. + +`-mportable-runtime' + Use the portable calling conventions proposed by HP for ELF + systems. + +`-mgas' + Enable the use of assembler directives only GAS understands. + +`-mschedule=CPU TYPE' + Schedule code according to the constraints for the machine type + CPU TYPE. The choices for CPU TYPE are `700' `7100', `7100LC', + `7200', and `8000'. Refer to `/usr/lib/sched.models' on an HP-UX + system to determine the proper scheduling option for your machine. + +`-mlinker-opt' + Enable the optimization pass in the HPUX linker. Note this makes + symbolic debugging impossible. It also triggers a bug in the HPUX + 8 and HPUX 9 linkers in which they give bogus error messages when + linking some programs. + +`-msoft-float' + Generate output containing library calls for floating point. + *Warning:* the requisite libraries are not available for all HPPA + targets. Normally the facilities of the machine's usual C + compiler are used, but this cannot be done directly in + cross-compilation. You must make your own arrangements to provide + suitable library functions for cross-compilation. The embedded + target `hppa1.1-*-pro' does provide software floating point + support. + + `-msoft-float' changes the calling convention in the output file; + therefore, it is only useful if you compile *all* of a program with + this option. In particular, you need to compile `libgcc.a', the + library that comes with GCC, with `-msoft-float' in order for this + to work. + + +File: gcc.info, Node: Intel 960 Options, Next: DEC Alpha Options, Prev: HPPA Options, Up: Submodel Options + +Intel 960 Options +----------------- + + These `-m' options are defined for the Intel 960 implementations: + +`-mCPU TYPE' + Assume the defaults for the machine type CPU TYPE for some of the + other options, including instruction scheduling, floating point + support, and addressing modes. The choices for CPU TYPE are `ka', + `kb', `mc', `ca', `cf', `sa', and `sb'. The default is `kb'. + +`-mnumerics' +`-msoft-float' + The `-mnumerics' option indicates that the processor does support + floating-point instructions. The `-msoft-float' option indicates + that floating-point support should not be assumed. + +`-mleaf-procedures' +`-mno-leaf-procedures' + Do (or do not) attempt to alter leaf procedures to be callable + with the `bal' instruction as well as `call'. This will result in + more efficient code for explicit calls when the `bal' instruction + can be substituted by the assembler or linker, but less efficient + code in other cases, such as calls via function pointers, or using + a linker that doesn't support this optimization. + +`-mtail-call' +`-mno-tail-call' + Do (or do not) make additional attempts (beyond those of the + machine-independent portions of the compiler) to optimize + tail-recursive calls into branches. You may not want to do this + because the detection of cases where this is not valid is not + totally complete. The default is `-mno-tail-call'. + +`-mcomplex-addr' +`-mno-complex-addr' + Assume (or do not assume) that the use of a complex addressing + mode is a win on this implementation of the i960. Complex + addressing modes may not be worthwhile on the K-series, but they + definitely are on the C-series. The default is currently + `-mcomplex-addr' for all processors except the CB and CC. + +`-mcode-align' +`-mno-code-align' + Align code to 8-byte boundaries for faster fetching (or don't + bother). Currently turned on by default for C-series + implementations only. + +`-mic-compat' +`-mic2.0-compat' +`-mic3.0-compat' + Enable compatibility with iC960 v2.0 or v3.0. + +`-masm-compat' +`-mintel-asm' + Enable compatibility with the iC960 assembler. + +`-mstrict-align' +`-mno-strict-align' + Do not permit (do permit) unaligned accesses. + +`-mold-align' + Enable structure-alignment compatibility with Intel's gcc release + version 1.3 (based on gcc 1.37). This option implies + `-mstrict-align'. + +`-mlong-double-64' + Implement type `long double' as 64-bit floating point numbers. + Without the option `long double' is implemented by 80-bit floating + point numbers. The only reason we have it because there is no + 128-bit `long double' support in `fp-bit.c' yet. So it is only + useful for people using soft-float targets. Otherwise, we should + recommend against use of it. + + +File: gcc.info, Node: DEC Alpha Options, Next: Clipper Options, Prev: Intel 960 Options, Up: Submodel Options + +DEC Alpha Options +----------------- + + These `-m' options are defined for the DEC Alpha implementations: + +`-mno-soft-float' +`-msoft-float' + Use (do not use) the hardware floating-point instructions for + floating-point operations. When `-msoft-float' is specified, + functions in `libgcc1.c' will be used to perform floating-point + operations. Unless they are replaced by routines that emulate the + floating-point operations, or compiled in such a way as to call + such emulations routines, these routines will issue floating-point + operations. If you are compiling for an Alpha without + floating-point operations, you must ensure that the library is + built so as not to call them. + + Note that Alpha implementations without floating-point operations + are required to have floating-point registers. + +`-mfp-reg' +`-mno-fp-regs' + Generate code that uses (does not use) the floating-point register + set. `-mno-fp-regs' implies `-msoft-float'. If the floating-point + register set is not used, floating point operands are passed in + integer registers as if they were integers and floating-point + results are passed in $0 instead of $f0. This is a non-standard + calling sequence, so any function with a floating-point argument + or return value called by code compiled with `-mno-fp-regs' must + also be compiled with that option. + + A typical use of this option is building a kernel that does not + use, and hence need not save and restore, any floating-point + registers. + +`-mieee' + The Alpha architecture implements floating-point hardware + optimized for maximum performance. It is mostly compliant with + the IEEE floating point standard. However, for full compliance, + software assistance is required. This option generates code fully + IEEE compliant code *except* that the INEXACT FLAG is not + maintained (see below). If this option is turned on, the CPP + macro `_IEEE_FP' is defined during compilation. The option is a + shorthand for: `-D_IEEE_FP -mfp-trap-mode=su -mtrap-precision=i + -mieee-conformant'. The resulting code is less efficient but is + able to correctly support denormalized numbers and exceptional + IEEE values such as not-a-number and plus/minus infinity. Other + Alpha compilers call this option `-ieee_with_no_inexact'. + +`-mieee-with-inexact' + This is like `-mieee' except the generated code also maintains the + IEEE INEXACT FLAG. Turning on this option causes the generated + code to implement fully-compliant IEEE math. The option is a + shorthand for `-D_IEEE_FP -D_IEEE_FP_INEXACT' plus the three + following: `-mieee-conformant', `-mfp-trap-mode=sui', and + `-mtrap-precision=i'. On some Alpha implementations the resulting + code may execute significantly slower than the code generated by + default. Since there is very little code that depends on the + INEXACT FLAG, you should normally not specify this option. Other + Alpha compilers call this option `-ieee_with_inexact'. + +`-mfp-trap-mode=TRAP MODE' + This option controls what floating-point related traps are enabled. + Other Alpha compilers call this option `-fptm 'TRAP MODE. The + trap mode can be set to one of four values: + + `n' + This is the default (normal) setting. The only traps that + are enabled are the ones that cannot be disabled in software + (e.g., division by zero trap). + + `u' + In addition to the traps enabled by `n', underflow traps are + enabled as well. + + `su' + Like `su', but the instructions are marked to be safe for + software completion (see Alpha architecture manual for + details). + + `sui' + Like `su', but inexact traps are enabled as well. + +`-mfp-rounding-mode=ROUNDING MODE' + Selects the IEEE rounding mode. Other Alpha compilers call this + option `-fprm 'ROUNDING MODE. The ROUNDING MODE can be one of: + + `n' + Normal IEEE rounding mode. Floating point numbers are + rounded towards the nearest machine number or towards the + even machine number in case of a tie. + + `m' + Round towards minus infinity. + + `c' + Chopped rounding mode. Floating point numbers are rounded + towards zero. + + `d' + Dynamic rounding mode. A field in the floating point control + register (FPCR, see Alpha architecture reference manual) + controls the rounding mode in effect. The C library + initializes this register for rounding towards plus infinity. + Thus, unless your program modifies the FPCR, `d' corresponds + to round towards plus infinity. + +`-mtrap-precision=TRAP PRECISION' + In the Alpha architecture, floating point traps are imprecise. + This means without software assistance it is impossible to recover + from a floating trap and program execution normally needs to be + terminated. GCC can generate code that can assist operating + system trap handlers in determining the exact location that caused + a floating point trap. Depending on the requirements of an + application, different levels of precisions can be selected: + + `p' + Program precision. This option is the default and means a + trap handler can only identify which program caused a + floating point exception. + + `f' + Function precision. The trap handler can determine the + function that caused a floating point exception. + + `i' + Instruction precision. The trap handler can determine the + exact instruction that caused a floating point exception. + + Other Alpha compilers provide the equivalent options called + `-scope_safe' and `-resumption_safe'. + +`-mieee-conformant' + This option marks the generated code as IEEE conformant. You must + not use this option unless you also specify `-mtrap-precision=i' + and either `-mfp-trap-mode=su' or `-mfp-trap-mode=sui'. Its only + effect is to emit the line `.eflag 48' in the function prologue of + the generated assembly file. Under DEC Unix, this has the effect + that IEEE-conformant math library routines will be linked in. + +`-mbuild-constants' + Normally GCC examines a 32- or 64-bit integer constant to see if + it can construct it from smaller constants in two or three + instructions. If it cannot, it will output the constant as a + literal and generate code to load it from the data segment at + runtime. + + Use this option to require GCC to construct *all* integer constants + using code, even if it takes more instructions (the maximum is + six). + + You would typically use this option to build a shared library + dynamic loader. Itself a shared library, it must relocate itself + in memory before it can find the variables and constants in its + own data segment. + +`-malpha-as' +`-mgas' + Select whether to generate code to be assembled by the + vendor-supplied assembler (`-malpha-as') or by the GNU assembler + `-mgas'. + +`-mbwx' +`-mno-bwx' +`-mcix' +`-mno-cix' +`-mmax' +`-mno-max' + Indicate whether GCC should generate code to use the optional BWX, + CIX, and MAX instruction sets. The default is to use the + instruction sets supported by the CPU type specified via `-mcpu=' + option or that of the CPU on which GCC was built if none was + specified. + +`-mcpu=CPU_TYPE' + Set the instruction set, register set, and instruction scheduling + parameters for machine type CPU_TYPE. You can specify either the + `EV' style name or the corresponding chip number. GCC supports + scheduling parameters for the EV4 and EV5 family of processors and + will choose the default values for the instruction set from the + processor you specify. If you do not specify a processor type, + GCC will default to the processor on which the compiler was built. + + Supported values for CPU_TYPE are + + `ev4' + `21064' + Schedules as an EV4 and has no instruction set extensions. + + `ev5' + `21164' + Schedules as an EV5 and has no instruction set extensions. + + `ev56' + `21164a' + Schedules as an EV5 and supports the BWX extension. + + `pca56' + `21164pc' + `21164PC' + Schedules as an EV5 and supports the BWX and MAX extensions. + + `ev6' + `21264' + Schedules as an EV5 (until Digital releases the scheduling + parameters for the EV6) and supports the BWX, CIX, and MAX + extensions. + +`-mmemory-latency=TIME' + Sets the latency the scheduler should assume for typical memory + references as seen by the application. This number is highly + dependant on the memory access patterns used by the application + and the size of the external cache on the machine. + + Valid options for TIME are + + `NUMBER' + A decimal number representing clock cycles. + + `L1' + `L2' + `L3' + `main' + The compiler contains estimates of the number of clock cycles + for "typical" EV4 & EV5 hardware for the Level 1, 2 & 3 caches + (also called Dcache, Scache, and Bcache), as well as to main + memory. Note that L3 is only valid for EV5. + + +File: gcc.info, Node: Clipper Options, Next: H8/300 Options, Prev: DEC Alpha Options, Up: Submodel Options + +Clipper Options +--------------- + + These `-m' options are defined for the Clipper implementations: + +`-mc300' + Produce code for a C300 Clipper processor. This is the default. + +`-mc400' + Produce code for a C400 Clipper processor i.e. use floating point + registers f8..f15. + + +File: gcc.info, Node: H8/300 Options, Next: SH Options, Prev: Clipper Options, Up: Submodel Options + +H8/300 Options +-------------- + + These `-m' options are defined for the H8/300 implementations: + +`-mrelax' + Shorten some address references at link time, when possible; uses + the linker option `-relax'. *Note `ld' and the H8/300: + (ld.info)H8/300, for a fuller description. + +`-mh' + Generate code for the H8/300H. + +`-ms' + Generate code for the H8/S. + +`-mint32' + Make `int' data 32 bits by default. + +`-malign-300' + On the h8/300h, use the same alignment rules as for the h8/300. + The default for the h8/300h is to align longs and floats on 4 byte + boundaries. `-malign-300' causes them to be aligned on 2 byte + boundaries. This option has no effect on the h8/300. + + +File: gcc.info, Node: SH Options, Next: System V Options, Prev: H8/300 Options, Up: Submodel Options + +SH Options +---------- + + These `-m' options are defined for the SH implementations: + +`-m1' + Generate code for the SH1. + +`-m2' + Generate code for the SH2. + +`-m3' + Generate code for the SH3. + +`-m3e' + Generate code for the SH3e. + +`-mb' + Compile code for the processor in big endian mode. + +`-ml' + Compile code for the processor in little endian mode. + +`-mdalign' + Align doubles at 64 bit boundaries. Note that this changes the + calling conventions, and thus some functions from the standard C + library will not work unless you recompile it first with -mdalign. + +`-mrelax' + Shorten some address references at link time, when possible; uses + the linker option `-relax'. + + +File: gcc.info, Node: System V Options, Next: TMS320C3x/C4x Options, Prev: SH Options, Up: Submodel Options + +Options for System V +-------------------- + + These additional options are available on System V Release 4 for +compatibility with other compilers on those systems: + +`-G' + Create a shared object. It is recommended that `-symbolic' or + `-shared' be used instead. + +`-Qy' + Identify the versions of each tool used by the compiler, in a + `.ident' assembler directive in the output. + +`-Qn' + Refrain from adding `.ident' directives to the output file (this is + the default). + +`-YP,DIRS' + Search the directories DIRS, and no others, for libraries + specified with `-l'. + +`-Ym,DIR' + Look in the directory DIR to find the M4 preprocessor. The + assembler uses this option. + + +File: gcc.info, Node: TMS320C3x/C4x Options, Next: V850 Options, Prev: System V Options, Up: Submodel Options + +TMS320C3x/C4x Options +--------------------- + + These `-m' options are defined for TMS320C3x/C4x implementations: + +`-mcpu=CPU_TYPE' + Set the instruction set, register set, and instruction scheduling + parameters for machine type CPU_TYPE. Supported values for + CPU_TYPE are `c30', `c31', `c32', `c40', and `c44'. The default + is `c40' to generate code for the TMS320C40. + +`-mbig-memory' + +`-mbig' +`-msmall-memory' +`-msmall' + Generates code for the big or small memory model. The small memory + model assumed that all data fits into one 64K word page. At + run-time the data page (DP) register must be set to point to the + 64K page containing the .bss and .data program sections. The big + memory model is the default and requires reloading of the DP + register for every direct memory access. + +`-mbk' +`-mno-bk' + Allow (disallow) allocation of general integer operands into the + block count register BK. + +`-mdb' +`-mno-db' + Enable (disable) generation of code using decrement and branch, + DBcond(D), instructions. This is enabled by default for the C4x. + To be on the safe side, this is disabled for the C3x, since the + maximum iteration count on the C3x is 2^23 + 1 (but who iterates + loops more than 2^23 times on the C3x?). Note that GCC will try + to reverse a loop so that it can utilise the decrement and branch + instruction, but will give up if there is more than one memory + reference in the loop. Thus a loop where the loop counter is + decremented can generate slightly more efficient code, in cases + where the RPTB instruction cannot be utilised. + +`-mdp-isr-reload' +`-mparanoid' + Force the DP register to be saved on entry to an interrupt service + routine (ISR), reloaded to point to the data section, and restored + on exit from the ISR. This should not be required unless someone + has violated the small memory model by modifying the DP register, + say within an object library. + +`-mmpyi' +`-mno-mpyi' + For the C3x use the 24-bit MPYI instruction for integer multiplies + instead of a library call to guarantee 32-bit results. Note that + if one of the operands is a constant, then the multiplication will + be performed using shifts and adds. If the -mmpyi option is not + specified for the C3x, then squaring operations are performed + inline instead of a library call. + +`-mfast-fix' +`-mno-fast-fix' + The C3x/C4x FIX instruction to convert a floating point value to an + integer value chooses the nearest integer less than or equal to the + floating point value rather than to the nearest integer. Thus if + the floating point number is negative, the result will be + incorrectly truncated an additional code is necessary to detect + and correct this case. This option can be used to disable + generation of the additional code required to correct the result. + +`-mrptb' +`-mno-rptb' + Enable (disable) generation of repeat block sequences using the + RPTB instruction for zero overhead looping. The RPTB construct is + only used for innermost loops that do not call functions or jump + across the loop boundaries. There is no advantage having nested + RPTB loops due to the overhead required to save and restore the + RC, RS, and RE registers. This is enabled by default with -O2. + +`-mrpts=COUNT' +`-mno-rpts' + Enable (disable) the use of the single instruction repeat + instruction RPTS. If a repeat block contains a single + instruction, and the loop count can be guaranteed to be less than + the value COUNT, GCC will emit a RPTS instruction instead of a + RPTB. If no value is specified, then a RPTS will be emitted even + if the loop count cannot be determined at compile time. Note that + the repeated instruction following RPTS does not have to be + reloaded from memory each iteration, thus freeing up the CPU buses + for oeprands. However, since interrupts are blocked by this + instruction, it is disabled by default. + +`-mloop-unsigned' +`-mno-loop-unsigned' + The maximum iteration count when using RPTS and RPTB (and DB on + the C40) is 2^31 + 1 since these instructions test if the + iteration count is negative to terminate the loop. If the + iteration count is unsigned there is a possibility than the 2^31 + + 1 maximum iteration count may be exceeded. This switch allows an + unsigned iteration count. + +`-mti' + Try to emit an assembler syntax that the TI assembler (asm30) is + happy with. This also enforces compatibility with the API + employed by the TI C3x C compiler. For example, long doubles are + passed as structures rather than in floating point registers. + +`-mregparm' +`-mmemparm' + Generate code that uses registers (stack) for passing arguments to + functions. By default, arguments are passed in registers where + possible rather than by pushing arguments on to the stack. + +`-mparallel-insns' +`-mno-parallel-insns' + Allow the generation of parallel instructions. This is enabled by + default with -O2. + +`-mparallel-mpy' +`-mno-parallel-mpy' + Allow the generation of MPY||ADD and MPY||SUB parallel + instructions, provided -mparallel-insns is also specified. These + instructions have tight register constraints which can pessimize + the code generation of large functions. + + +File: gcc.info, Node: V850 Options, Next: ARC Options, Prev: TMS320C3x/C4x Options, Up: Submodel Options + +V850 Options +------------ + + These `-m' options are defined for V850 implementations: + +`-mlong-calls' +`-mno-long-calls' + Treat all calls as being far away (near). If calls are assumed to + be far away, the compiler will always load the functions address + up into a register, and call indirect through the pointer. + +`-mno-ep' +`-mep' + Do not optimize (do optimize) basic blocks that use the same index + pointer 4 or more times to copy pointer into the `ep' register, and + use the shorter `sld' and `sst' instructions. The `-mep' option + is on by default if you optimize. + +`-mno-prolog-function' +`-mprolog-function' + Do not use (do use) external functions to save and restore + registers at the prolog and epilog of a function. The external + functions are slower, but use less code space if more than one + function saves the same number of registers. The + `-mprolog-function' option is on by default if you optimize. + +`-mspace' + Try to make the code as small as possible. At present, this just + turns on the `-mep' and `-mprolog-function' options. + +`-mtda=N' + Put static or global variables whose size is N bytes or less into + the tiny data area that register `ep' points to. The tiny data + area can hold up to 256 bytes in total (128 bytes for byte + references). + +`-msda=N' + Put static or global variables whose size is N bytes or less into + the small data area that register `gp' points to. The small data + area can hold up to 64 kilobytes. + +`-mzda=N' + Put static or global variables whose size is N bytes or less into + the first 32 kilobytes of memory. + +`-mv850' + Specify that the target processor is the V850. + +`-mbig-switch' + Generate code suitable for big switch tables. Use this option + only if the assembler/linker complain about out of range branches + within a switch table. + + +File: gcc.info, Node: ARC Options, Next: NS32K Options, Prev: V850 Options, Up: Submodel Options + +ARC Options +----------- + + These options are defined for ARC implementations: + +`-EL' + Compile code for little endian mode. This is the default. + +`-EB' + Compile code for big endian mode. + +`-mmangle-cpu' + Prepend the name of the cpu to all public symbol names. In + multiple-processor systems, there are many ARC variants with + different instruction and register set characteristics. This flag + prevents code compiled for one cpu to be linked with code compiled + for another. No facility exists for handling variants that are + "almost identical". This is an all or nothing option. + +`-mcpu=CPU' + Compile code for ARC variant CPU. Which variants are supported + depend on the configuration. All variants support `-mcpu=base', + this is the default. + +`-mtext=TEXT SECTION' +`-mdata=DATA SECTION' +`-mrodata=READONLY DATA SECTION' + Put functions, data, and readonly data in TEXT SECTION, DATA + SECTION, and READONLY DATA SECTION respectively by default. This + can be overridden with the `section' attribute. *Note Variable + Attributes::. + + +File: gcc.info, Node: NS32K Options, Prev: ARC Options, Up: Submodel Options + +NS32K Options +------------- + + These are the `-m' options defined for the 32000 series. The default +values for these options depends on which style of 32000 was selected +when the compiler was configured; the defaults for the most common +choices are given below. + +`-m32032' +`-m32032' + Generate output for a 32032. This is the default when the + compiler is configured for 32032 and 32016 based systems. + +`-m32332' +`-m32332' + Generate output for a 32332. This is the default when the + compiler is configured for 32332-based systems. + +`-m32532' +`-m32532' + Generate output for a 32532. This is the default when the + compiler is configured for 32532-based systems. + +`-m32081' + Generate output containing 32081 instructions for floating point. + This is the default for all systems. + +`-m32381' + Generate output containing 32381 instructions for floating point. + This also implies `-m32081'. The 32381 is only compatible with the + 32332 and 32532 cpus. This is the default for the pc532-netbsd + configuration. + +`-mmulti-add' + Try and generate multiply-add floating point instructions `polyF' + and `dotF'. This option is only available if the `-m32381' option + is in effect. Using these instructions requires changes to to + register allocation which generally has a negative impact on + performance. This option should only be enabled when compiling + code particularly likely to make heavy use of multiply-add + instructions. + +`-mnomulti-add' + Do not try and generate multiply-add floating point instructions + `polyF' and `dotF'. This is the default on all platforms. + +`-msoft-float' + Generate output containing library calls for floating point. + *Warning:* the requisite libraries may not be available. + +`-mnobitfield' + Do not use the bit-field instructions. On some machines it is + faster to use shifting and masking operations. This is the default + for the pc532. + +`-mbitfield' + Do use the bit-field instructions. This is the default for all + platforms except the pc532. + +`-mrtd' + Use a different function-calling convention, in which functions + that take a fixed number of arguments return pop their arguments + on return with the `ret' instruction. + + This calling convention is incompatible with the one normally used + on Unix, so you cannot use it if you need to call libraries + compiled with the Unix compiler. + + Also, you must provide function prototypes for all functions that + take variable numbers of arguments (including `printf'); otherwise + incorrect code will be generated for calls to those functions. + + In addition, seriously incorrect code will result if you call a + function with too many arguments. (Normally, extra arguments are + harmlessly ignored.) + + This option takes its name from the 680x0 `rtd' instruction. + +`-mregparam' + Use a different function-calling convention where the first two + arguments are passed in registers. + + This calling convention is incompatible with the one normally used + on Unix, so you cannot use it if you need to call libraries + compiled with the Unix compiler. + +`-mnoregparam' + Do not pass any arguments in registers. This is the default for all + targets. + +`-msb' + It is OK to use the sb as an index register which is always loaded + with zero. This is the default for the pc532-netbsd target. + +`-mnosb' + The sb register is not available for use or has not been + initialized to zero by the run time system. This is the default + for all targets except the pc532-netbsd. It is also implied + whenever `-mhimem' or `-fpic' is set. + +`-mhimem' + Many ns32000 series addressing modes use displacements of up to + 512MB. If an address is above 512MB then displacements from zero + can not be used. This option causes code to be generated which + can be loaded above 512MB. This may be useful for operating + systems or ROM code. + +`-mnohimem' + Assume code will be loaded in the first 512MB of virtual address + space. This is the default for all platforms. + + +File: gcc.info, Node: Code Gen Options, Next: Environment Variables, Prev: Submodel Options, Up: Invoking GCC + +Options for Code Generation Conventions +======================================= + + These machine-independent options control the interface conventions +used in code generation. + + Most of them have both positive and negative forms; the negative form +of `-ffoo' would be `-fno-foo'. In the table below, only one of the +forms is listed--the one which is not the default. You can figure out +the other form by either removing `no-' or adding it. + +`-fexceptions' + Enable exception handling. Generates extra code needed to propagate + exceptions. For some targets, this implies generation of frame + unwind information for all functions. This can produce significant + data size overhead, although it does not affect execution. If you + do not specify this option, it is enabled by default for languages + like C++ which normally require exception handling, and disabled + for languages like C that do not normally require it. However, + when compiling C code that needs to interoperate properly with + exception handlers written in C++, you may need to enable this + option. You may also wish to disable this option is you are + compiling older C++ programs that don't use exception handling. + +`-fpcc-struct-return' + Return "short" `struct' and `union' values in memory like longer + ones, rather than in registers. This convention is less + efficient, but it has the advantage of allowing intercallability + between GCC-compiled files and files compiled with other compilers. + + The precise convention for returning structures in memory depends + on the target configuration macros. + + Short structures and unions are those whose size and alignment + match that of some integer type. + +`-freg-struct-return' + Use the convention that `struct' and `union' values are returned + in registers when possible. This is more efficient for small + structures than `-fpcc-struct-return'. + + If you specify neither `-fpcc-struct-return' nor its contrary + `-freg-struct-return', GCC defaults to whichever convention is + standard for the target. If there is no standard convention, GCC + defaults to `-fpcc-struct-return', except on targets where GCC is + the principal compiler. In those cases, we can choose the + standard, and we chose the more efficient register return + alternative. + +`-fshort-enums' + Allocate to an `enum' type only as many bytes as it needs for the + declared range of possible values. Specifically, the `enum' type + will be equivalent to the smallest integer type which has enough + room. + +`-fshort-double' + Use the same size for `double' as for `float'. + +`-fshared-data' + Requests that the data and non-`const' variables of this + compilation be shared data rather than private data. The + distinction makes sense only on certain operating systems, where + shared data is shared between processes running the same program, + while private data exists in one copy per process. + +`-fno-common' + Allocate even uninitialized global variables in the bss section of + the object file, rather than generating them as common blocks. + This has the effect that if the same variable is declared (without + `extern') in two different compilations, you will get an error + when you link them. The only reason this might be useful is if + you wish to verify that the program will work on other systems + which always work this way. + +`-fno-ident' + Ignore the `#ident' directive. + +`-fno-gnu-linker' + Do not output global initializations (such as C++ constructors and + destructors) in the form used by the GNU linker (on systems where + the GNU linker is the standard method of handling them). Use this + option when you want to use a non-GNU linker, which also requires + using the `collect2' program to make sure the system linker + includes constructors and destructors. (`collect2' is included in + the GCC distribution.) For systems which *must* use `collect2', + the compiler driver `gcc' is configured to do this automatically. + +`-finhibit-size-directive' + Don't output a `.size' assembler directive, or anything else that + would cause trouble if the function is split in the middle, and the + two halves are placed at locations far apart in memory. This + option is used when compiling `crtstuff.c'; you should not need to + use it for anything else. + +`-fverbose-asm' + Put extra commentary information in the generated assembly code to + make it more readable. This option is generally only of use to + those who actually need to read the generated assembly code + (perhaps while debugging the compiler itself). + + `-fno-verbose-asm', the default, causes the extra information to + be omitted and is useful when comparing two assembler files. + +`-fvolatile' + Consider all memory references through pointers to be volatile. + +`-fvolatile-global' + Consider all memory references to extern and global data items to + be volatile. GCC does not consider static data items to be + volatile because of this switch. + +`-fvolatile-static' + Consider all memory references to static data to be volatile. + +`-fpic' + Generate position-independent code (PIC) suitable for use in a + shared library, if supported for the target machine. Such code + accesses all constant addresses through a global offset table + (GOT). The dynamic loader resolves the GOT entries when the + program starts (the dynamic loader is not part of GCC; it is part + of the operating system). If the GOT size for the linked + executable exceeds a machine-specific maximum size, you get an + error message from the linker indicating that `-fpic' does not + work; in that case, recompile with `-fPIC' instead. (These + maximums are 16k on the m88k, 8k on the Sparc, and 32k on the m68k + and RS/6000. The 386 has no such limit.) + + Position-independent code requires special support, and therefore + works only on certain machines. For the 386, GCC supports PIC for + System V but not for the Sun 386i. Code generated for the IBM + RS/6000 is always position-independent. + +`-fPIC' + If supported for the target machine, emit position-independent + code, suitable for dynamic linking and avoiding any limit on the + size of the global offset table. This option makes a difference + on the m68k, m88k, and the Sparc. + + Position-independent code requires special support, and therefore + works only on certain machines. + +`-ffixed-REG' + Treat the register named REG as a fixed register; generated code + should never refer to it (except perhaps as a stack pointer, frame + pointer or in some other fixed role). + + REG must be the name of a register. The register names accepted + are machine-specific and are defined in the `REGISTER_NAMES' macro + in the machine description macro file. + + This flag does not have a negative form, because it specifies a + three-way choice. + +`-fcall-used-REG' + Treat the register named REG as an allocable register that is + clobbered by function calls. It may be allocated for temporaries + or variables that do not live across a call. Functions compiled + this way will not save and restore the register REG. + + It is an error to used this flag with the frame pointer or stack + pointer. Use of this flag for other registers that have fixed + pervasive roles in the machine's execution model will produce + disastrous results. + + This flag does not have a negative form, because it specifies a + three-way choice. + +`-fcall-saved-REG' + Treat the register named REG as an allocable register saved by + functions. It may be allocated even for temporaries or variables + that live across a call. Functions compiled this way will save + and restore the register REG if they use it. + + It is an error to used this flag with the frame pointer or stack + pointer. Use of this flag for other registers that have fixed + pervasive roles in the machine's execution model will produce + disastrous results. + + A different sort of disaster will result from the use of this flag + for a register in which function values may be returned. + + This flag does not have a negative form, because it specifies a + three-way choice. + +`-fpack-struct' + Pack all structure members together without holes. Usually you + would not want to use this option, since it makes the code + suboptimal, and the offsets of structure members won't agree with + system libraries. + +`-fcheck-memory-usage' + Generate extra code to check each memory access. GCC will generate + code that is suitable for a detector of bad memory accesses such as + `Checker'. + + Normally, you should compile all, or none, of your code with this + option. + + If you do mix code compiled with and without this option, you must + ensure that all code that has side effects and that is called by + code compiled with this option is, itself, compiled with this + option. If you do not, you might get erroneous messages from the + detector. + + If you use functions from a library that have side-effects (such as + `read'), you might not be able to recompile the library and + specify this option. In that case, you can enable the + `-fprefix-function-name' option, which requests GCC to encapsulate + your code and make other functions look as if they were compiled + with `-fcheck-memory-usage'. This is done by calling "stubs", + which are provided by the detector. If you cannot find or build + stubs for every function you call, you might have to specify + `-fcheck-memory-usage' without `-fprefix-function-name'. + + If you specify this option, you can not use the `asm' or `__asm__' + keywords in functions with memory checking enabled. The compiler + cannot understand what the `asm' statement will do, and therefore + cannot generate the appropriate code, so it is rejected. However, + the function attribute `no_check_memory_usage' will disable memory + checking within a function, and `asm' statements can be put inside + such functions. Inline expansion of a non-checked function within + a checked function is permitted; the inline function's memory + accesses won't be checked, but the rest will. + + If you move your `asm' statements to non-checked inline functions, + but they do access memory, you can add calls to the support code + in your inline function, to indicate any reads, writes, or copies + being done. These calls would be similar to those done in the + stubs described above. + +`-fprefix-function-name' + Request GCC to add a prefix to the symbols generated for function + names. GCC adds a prefix to the names of functions defined as + well as functions called. Code compiled with this option and code + compiled without the option can't be linked together, unless stubs + are used. + + If you compile the following code with `-fprefix-function-name' + extern void bar (int); + void + foo (int a) + { + return bar (a + 5); + } + + GCC will compile the code as if it was written: + extern void prefix_bar (int); + void + prefix_foo (int a) + { + return prefix_bar (a + 5); + } + This option is designed to be used with `-fcheck-memory-usage'. + +`-finstrument-functions' + Generate instrumentation calls for entry and exit to functions. + Just after function entry and just before function exit, the + following profiling functions will be called with the address of + the current function and its call site. (On some platforms, + `__builtin_return_address' does not work beyond the current + function, so the call site information may not be available to the + profiling functions otherwise.) + + void __cyg_profile_func_enter (void *this_fn, void *call_site); + void __cyg_profile_func_exit (void *this_fn, void *call_site); + + The first argument is the address of the start of the current + function, which may be looked up exactly in the symbol table. + + This instrumentation is also done for functions expanded inline in + other functions. The profiling calls will indicate where, + conceptually, the inline function is entered and exited. This + means that addressable versions of such functions must be + available. If all your uses of a function are expanded inline, + this may mean an additional expansion of code size. If you use + `extern inline' in your C code, an addressable version of such + functions must be provided. (This is normally the case anyways, + but if you get lucky and the optimizer always expands the + functions inline, you might have gotten away without providing + static copies.) + + A function may be given the attribute `no_instrument_function', in + which case this instrumentation will not be done. This can be + used, for example, for the profiling functions listed above, + high-priority interrupt routines, and any functions from which the + profiling functions cannot safely be called (perhaps signal + handlers, if the profiling routines generate output or allocate + memory). + +`-fstack-check' + Generate code to verify that you do not go beyond the boundary of + the stack. You should specify this flag if you are running in an + environment with multiple threads, but only rarely need to specify + it in a single-threaded environment since stack overflow is + automatically detected on nearly all systems if there is only one + stack. + +`-fargument-alias' +`-fargument-noalias' +`-fargument-noalias-global' + Specify the possible relationships among parameters and between + parameters and global data. + + `-fargument-alias' specifies that arguments (parameters) may alias + each other and may alias global storage. `-fargument-noalias' + specifies that arguments do not alias each other, but may alias + global storage. `-fargument-noalias-global' specifies that + arguments do not alias each other and do not alias global storage. + + Each language will automatically use whatever option is required by + the language standard. You should not need to use these options + yourself. + +`-fleading-underscore' + This option and its counterpart, -fno-leading-underscore, forcibly + change the way C symbols are represented in the object file. One + use is to help link with legacy assembly code. + + Be warned that you should know what you are doing when invoking + this option, and that not all targets provide complete support for + it. + diff --git a/usr/local/nachos/info/gcc.info-7 b/usr/local/nachos/info/gcc.info-7 new file mode 100644 index 0000000..0291fd2 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-7 @@ -0,0 +1,943 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Environment Variables, Next: Running Protoize, Prev: Code Gen Options, Up: Invoking GCC + +Environment Variables Affecting GCC +=================================== + + This section describes several environment variables that affect how +GCC operates. Some of them work by specifying directories or prefixes +to use when searching for various kinds of files. Some are used to +specify other aspects of the compilation environment. + + Note that you can also specify places to search using options such as +`-B', `-I' and `-L' (*note Directory Options::.). These take +precedence over places specified using environment variables, which in +turn take precedence over those specified by the configuration of GCC. +*Note Driver::. + +`LANG' +`LC_CTYPE' +`LC_MESSAGES' +`LC_ALL' + These environment variables control the way that GCC uses + localization information that allow GCC to work with different + national conventions. GCC inspects the locale categories + `LC_CTYPE' and `LC_MESSAGES' if it has been configured to do so. + These locale categories can be set to any value supported by your + installation. A typical value is `en_UK' for English in the United + Kingdom. + + The `LC_CTYPE' environment variable specifies character + classification. GCC uses it to determine the character boundaries + in a string; this is needed for some multibyte encodings that + contain quote and escape characters that would otherwise be + interpreted as a string end or escape. + + The `LC_MESSAGES' environment variable specifies the language to + use in diagnostic messages. + + If the `LC_ALL' environment variable is set, it overrides the value + of `LC_CTYPE' and `LC_MESSAGES'; otherwise, `LC_CTYPE' and + `LC_MESSAGES' default to the value of the `LANG' environment + variable. If none of these variables are set, GCC defaults to + traditional C English behavior. + +`TMPDIR' + If `TMPDIR' is set, it specifies the directory to use for temporary + files. GCC uses temporary files to hold the output of one stage of + compilation which is to be used as input to the next stage: for + example, the output of the preprocessor, which is the input to the + compiler proper. + +`GCC_EXEC_PREFIX' + If `GCC_EXEC_PREFIX' is set, it specifies a prefix to use in the + names of the subprograms executed by the compiler. No slash is + added when this prefix is combined with the name of a subprogram, + but you can specify a prefix that ends with a slash if you wish. + + If GCC cannot find the subprogram using the specified prefix, it + tries looking in the usual places for the subprogram. + + The default value of `GCC_EXEC_PREFIX' is `PREFIX/lib/gcc-lib/' + where PREFIX is the value of `prefix' when you ran the `configure' + script. + + Other prefixes specified with `-B' take precedence over this + prefix. + + This prefix is also used for finding files such as `crt0.o' that + are used for linking. + + In addition, the prefix is used in an unusual way in finding the + directories to search for header files. For each of the standard + directories whose name normally begins with + `/usr/local/lib/gcc-lib' (more precisely, with the value of + `GCC_INCLUDE_DIR'), GCC tries replacing that beginning with the + specified prefix to produce an alternate directory name. Thus, + with `-Bfoo/', GCC will search `foo/bar' where it would normally + search `/usr/local/lib/bar'. These alternate directories are + searched first; the standard directories come next. + +`COMPILER_PATH' + The value of `COMPILER_PATH' is a colon-separated list of + directories, much like `PATH'. GCC tries the directories thus + specified when searching for subprograms, if it can't find the + subprograms using `GCC_EXEC_PREFIX'. + +`LIBRARY_PATH' + The value of `LIBRARY_PATH' is a colon-separated list of + directories, much like `PATH'. When configured as a native + compiler, GCC tries the directories thus specified when searching + for special linker files, if it can't find them using + `GCC_EXEC_PREFIX'. Linking using GCC also uses these directories + when searching for ordinary libraries for the `-l' option (but + directories specified with `-L' come first). + +`C_INCLUDE_PATH' +`CPLUS_INCLUDE_PATH' +`OBJC_INCLUDE_PATH' + These environment variables pertain to particular languages. Each + variable's value is a colon-separated list of directories, much + like `PATH'. When GCC searches for header files, it tries the + directories listed in the variable for the language you are using, + after the directories specified with `-I' but before the standard + header file directories. + +`DEPENDENCIES_OUTPUT' + If this variable is set, its value specifies how to output + dependencies for Make based on the header files processed by the + compiler. This output looks much like the output from the `-M' + option (*note Preprocessor Options::.), but it goes to a separate + file, and is in addition to the usual results of compilation. + + The value of `DEPENDENCIES_OUTPUT' can be just a file name, in + which case the Make rules are written to that file, guessing the + target name from the source file name. Or the value can have the + form `FILE TARGET', in which case the rules are written to file + FILE using TARGET as the target name. + +`LANG' + This variable is used to pass locale information to the compiler. + One way in which this information is used is to determine the + character set to be used when character literals, string literals + and comments are parsed in C and C++. When the compiler is + configured to allow multibyte characters, the following values for + `LANG' are recognized: + + `C-JIS' + Recognize JIS characters. + + `C-SJIS' + Recognize SJIS characters. + + `C-EUCJP' + Recognize EUCJP characters. + + If `LANG' is not defined, or if it has some other value, then the + compiler will use mblen and mbtowc as defined by the default + locale to recognize and translate multibyte characters. + + +File: gcc.info, Node: Running Protoize, Prev: Environment Variables, Up: Invoking GCC + +Running Protoize +================ + + The program `protoize' is an optional part of GNU C. You can use it +to add prototypes to a program, thus converting the program to ANSI C +in one respect. The companion program `unprotoize' does the reverse: +it removes argument types from any prototypes that are found. + + When you run these programs, you must specify a set of source files +as command line arguments. The conversion programs start out by +compiling these files to see what functions they define. The +information gathered about a file FOO is saved in a file named `FOO.X'. + + After scanning comes actual conversion. The specified files are all +eligible to be converted; any files they include (whether sources or +just headers) are eligible as well. + + But not all the eligible files are converted. By default, +`protoize' and `unprotoize' convert only source and header files in the +current directory. You can specify additional directories whose files +should be converted with the `-d DIRECTORY' option. You can also +specify particular files to exclude with the `-x FILE' option. A file +is converted if it is eligible, its directory name matches one of the +specified directory names, and its name within the directory has not +been excluded. + + Basic conversion with `protoize' consists of rewriting most function +definitions and function declarations to specify the types of the +arguments. The only ones not rewritten are those for varargs functions. + + `protoize' optionally inserts prototype declarations at the +beginning of the source file, to make them available for any calls that +precede the function's definition. Or it can insert prototype +declarations with block scope in the blocks where undeclared functions +are called. + + Basic conversion with `unprotoize' consists of rewriting most +function declarations to remove any argument types, and rewriting +function definitions to the old-style pre-ANSI form. + + Both conversion programs print a warning for any function +declaration or definition that they can't convert. You can suppress +these warnings with `-q'. + + The output from `protoize' or `unprotoize' replaces the original +source file. The original file is renamed to a name ending with +`.save'. If the `.save' file already exists, then the source file is +simply discarded. + + `protoize' and `unprotoize' both depend on GCC itself to scan the +program and collect information about the functions it uses. So +neither of these programs will work until GCC is installed. + + Here is a table of the options you can use with `protoize' and +`unprotoize'. Each option works with both programs unless otherwise +stated. + +`-B DIRECTORY' + Look for the file `SYSCALLS.c.X' in DIRECTORY, instead of the + usual directory (normally `/usr/local/lib'). This file contains + prototype information about standard system functions. This option + applies only to `protoize'. + +`-c COMPILATION-OPTIONS' + Use COMPILATION-OPTIONS as the options when running `gcc' to + produce the `.X' files. The special option `-aux-info' is always + passed in addition, to tell `gcc' to write a `.X' file. + + Note that the compilation options must be given as a single + argument to `protoize' or `unprotoize'. If you want to specify + several `gcc' options, you must quote the entire set of + compilation options to make them a single word in the shell. + + There are certain `gcc' arguments that you cannot use, because they + would produce the wrong kind of output. These include `-g', `-O', + `-c', `-S', and `-o' If you include these in the + COMPILATION-OPTIONS, they are ignored. + +`-C' + Rename files to end in `.C' instead of `.c'. This is convenient + if you are converting a C program to C++. This option applies + only to `protoize'. + +`-g' + Add explicit global declarations. This means inserting explicit + declarations at the beginning of each source file for each function + that is called in the file and was not declared. These + declarations precede the first function definition that contains a + call to an undeclared function. This option applies only to + `protoize'. + +`-i STRING' + Indent old-style parameter declarations with the string STRING. + This option applies only to `protoize'. + + `unprotoize' converts prototyped function definitions to old-style + function definitions, where the arguments are declared between the + argument list and the initial `{'. By default, `unprotoize' uses + five spaces as the indentation. If you want to indent with just + one space instead, use `-i " "'. + +`-k' + Keep the `.X' files. Normally, they are deleted after conversion + is finished. + +`-l' + Add explicit local declarations. `protoize' with `-l' inserts a + prototype declaration for each function in each block which calls + the function without any declaration. This option applies only to + `protoize'. + +`-n' + Make no real changes. This mode just prints information about the + conversions that would have been done without `-n'. + +`-N' + Make no `.save' files. The original files are simply deleted. + Use this option with caution. + +`-p PROGRAM' + Use the program PROGRAM as the compiler. Normally, the name `gcc' + is used. + +`-q' + Work quietly. Most warnings are suppressed. + +`-v' + Print the version number, just like `-v' for `gcc'. + + If you need special compiler options to compile one of your program's +source files, then you should generate that file's `.X' file specially, +by running `gcc' on that source file with the appropriate options and +the option `-aux-info'. Then run `protoize' on the entire set of +files. `protoize' will use the existing `.X' file because it is newer +than the source file. For example: + + gcc -Dfoo=bar file1.c -aux-info + protoize *.c + +You need to include the special files along with the rest in the +`protoize' command, even though their `.X' files already exist, because +otherwise they won't get converted. + + *Note Protoize Caveats::, for more information on how to use +`protoize' successfully. + + Note most of this information is out of date and superceded by the +EGCS install procedures. It is provided for historical reference only. + + +File: gcc.info, Node: Installation, Next: C Extensions, Prev: Invoking GCC, Up: Top + +Installing GNU CC +***************** + +* Menu: + +* Configuration Files:: Files created by running `configure'. +* Configurations:: Configurations Supported by GNU CC. +* Other Dir:: Compiling in a separate directory (not where the source is). +* Cross-Compiler:: Building and installing a cross-compiler. +* Sun Install:: See below for installation on the Sun. +* VMS Install:: See below for installation on VMS. +* Collect2:: How `collect2' works; how it finds `ld'. +* Header Dirs:: Understanding the standard header file directories. + + Here is the procedure for installing GNU CC on a GNU or Unix system. +See *Note VMS Install::, for VMS systems. In this section we assume you +compile in the same directory that contains the source files; see *Note +Other Dir::, to find out how to compile in a separate directory on Unix +systems. + + You cannot install GNU C by itself on MSDOS; it will not compile +under any MSDOS compiler except itself. You need to get the complete +compilation package DJGPP, which includes binaries as well as sources, +and includes all the necessary compilation tools and libraries. + + 1. If you have built GNU CC previously in the same directory for a + different target machine, do `make distclean' to delete all files + that might be invalid. One of the files this deletes is + `Makefile'; if `make distclean' complains that `Makefile' does not + exist, it probably means that the directory is already suitably + clean. + + 2. On a System V release 4 system, make sure `/usr/bin' precedes + `/usr/ucb' in `PATH'. The `cc' command in `/usr/ucb' uses + libraries which have bugs. + + 3. Make sure the Bison parser generator is installed. (This is + unnecessary if the Bison output files `c-parse.c' and `cexp.c' are + more recent than `c-parse.y' and `cexp.y' and you do not plan to + change the `.y' files.) + + Bison versions older than Sept 8, 1988 will produce incorrect + output for `c-parse.c'. + + 4. If you have chosen a configuration for GNU CC which requires other + GNU tools (such as GAS or the GNU linker) instead of the standard + system tools, install the required tools in the build directory + under the names `as', `ld' or whatever is appropriate. This will + enable the compiler to find the proper tools for compilation of + the program `enquire'. + + Alternatively, you can do subsequent compilation using a value of + the `PATH' environment variable such that the necessary GNU tools + come before the standard system tools. + + 5. Specify the host, build and target machine configurations. You do + this when you run the `configure' script. + + The "build" machine is the system which you are using, the "host" + machine is the system where you want to run the resulting compiler + (normally the build machine), and the "target" machine is the + system for which you want the compiler to generate code. + + If you are building a compiler to produce code for the machine it + runs on (a native compiler), you normally do not need to specify + any operands to `configure'; it will try to guess the type of + machine you are on and use that as the build, host and target + machines. So you don't need to specify a configuration when + building a native compiler unless `configure' cannot figure out + what your configuration is or guesses wrong. + + In those cases, specify the build machine's "configuration name" + with the `--host' option; the host and target will default to be + the same as the host machine. (If you are building a + cross-compiler, see *Note Cross-Compiler::.) + + Here is an example: + + ./configure --host=sparc-sun-sunos4.1 + + A configuration name may be canonical or it may be more or less + abbreviated. + + A canonical configuration name has three parts, separated by + dashes. It looks like this: `CPU-COMPANY-SYSTEM'. (The three + parts may themselves contain dashes; `configure' can figure out + which dashes serve which purpose.) For example, + `m68k-sun-sunos4.1' specifies a Sun 3. + + You can also replace parts of the configuration by nicknames or + aliases. For example, `sun3' stands for `m68k-sun', so + `sun3-sunos4.1' is another way to specify a Sun 3. You can also + use simply `sun3-sunos', since the version of SunOS is assumed by + default to be version 4. + + You can specify a version number after any of the system types, + and some of the CPU types. In most cases, the version is + irrelevant, and will be ignored. So you might as well specify the + version if you know it. + + See *Note Configurations::, for a list of supported configuration + names and notes on many of the configurations. You should check + the notes in that section before proceeding any further with the + installation of GNU CC. + + 6. When running `configure', you may also need to specify certain + additional options that describe variant hardware and software + configurations. These are `--with-gnu-as', `--with-gnu-ld', + `--with-stabs' and `--nfp'. + + `--with-gnu-as' + If you will use GNU CC with the GNU assembler (GAS), you + should declare this by using the `--with-gnu-as' option when + you run `configure'. + + Using this option does not install GAS. It only modifies the + output of GNU CC to work with GAS. Building and installing + GAS is up to you. + + Conversely, if you *do not* wish to use GAS and do not specify + `--with-gnu-as' when building GNU CC, it is up to you to make + sure that GAS is not installed. GNU CC searches for a + program named `as' in various directories; if the program it + finds is GAS, then it runs GAS. If you are not sure where + GNU CC finds the assembler it is using, try specifying `-v' + when you run it. + + The systems where it makes a difference whether you use GAS + are + `hppa1.0-ANY-ANY', `hppa1.1-ANY-ANY', `i386-ANY-sysv', + `i386-ANY-isc', + `i860-ANY-bsd', `m68k-bull-sysv', + `m68k-hp-hpux', `m68k-sony-bsd', + `m68k-altos-sysv', `m68000-hp-hpux', + `m68000-att-sysv', `ANY-lynx-lynxos', and `mips-ANY'). On + any other system, `--with-gnu-as' has no effect. + + On the systems listed above (except for the HP-PA, for ISC on + the 386, and for `mips-sgi-irix5.*'), if you use GAS, you + should also use the GNU linker (and specify `--with-gnu-ld'). + + `--with-gnu-ld' + Specify the option `--with-gnu-ld' if you plan to use the GNU + linker with GNU CC. + + This option does not cause the GNU linker to be installed; it + just modifies the behavior of GNU CC to work with the GNU + linker. + + `--with-stabs' + On MIPS based systems and on Alphas, you must specify whether + you want GNU CC to create the normal ECOFF debugging format, + or to use BSD-style stabs passed through the ECOFF symbol + table. The normal ECOFF debug format cannot fully handle + languages other than C. BSD stabs format can handle other + languages, but it only works with the GNU debugger GDB. + + Normally, GNU CC uses the ECOFF debugging format by default; + if you prefer BSD stabs, specify `--with-stabs' when you + configure GNU CC. + + No matter which default you choose when you configure GNU CC, + the user can use the `-gcoff' and `-gstabs+' options to + specify explicitly the debug format for a particular + compilation. + + `--with-stabs' is meaningful on the ISC system on the 386, + also, if `--with-gas' is used. It selects use of stabs + debugging information embedded in COFF output. This kind of + debugging information supports C++ well; ordinary COFF + debugging information does not. + + `--with-stabs' is also meaningful on 386 systems running + SVR4. It selects use of stabs debugging information embedded + in ELF output. The C++ compiler currently (2.6.0) does not + support the DWARF debugging information normally used on 386 + SVR4 platforms; stabs provide a workable alternative. This + requires gas and gdb, as the normal SVR4 tools can not + generate or interpret stabs. + + `--nfp' + On certain systems, you must specify whether the machine has + a floating point unit. These systems include + `m68k-sun-sunosN' and `m68k-isi-bsd'. On any other system, + `--nfp' currently has no effect, though perhaps there are + other systems where it could usefully make a difference. + + `--enable-haifa' + `--disable-haifa' + Use `--enable-haifa' to enable use of an experimental + instruction scheduler (from IBM Haifa). This may or may not + produce better code. Some targets on which it is known to be + a win enable it by default; use `--disable-haifa' to disable + it in these cases. `configure' will print out whether the + Haifa scheduler is enabled when it is run. + + `--enable-threads=TYPE' + Certain systems, notably Linux-based GNU systems, can't be + relied on to supply a threads facility for the Objective C + runtime and so will default to single-threaded runtime. They + may, however, have a library threads implementation + available, in which case threads can be enabled with this + option by supplying a suitable TYPE, probably `posix'. The + possibilities for TYPE are `single', `posix', `win32', + `solaris', `irix' and `mach'. + + `--enable-checking' + When you specify this option, the compiler is built to + perform checking of tree node types when referencing fields + of that node. This does not change the generated code, but + adds error checking within the compiler. This will slow down + the compiler and may only work properly if you are building + the compiler with GNU C. + + The `configure' script searches subdirectories of the source + directory for other compilers that are to be integrated into + GNU CC. The GNU compiler for C++, called G++ is in a + subdirectory named `cp'. `configure' inserts rules into + `Makefile' to build all of those compilers. + + Here we spell out what files will be set up by `configure'. + Normally you need not be concerned with these files. + + * A file named `config.h' is created that contains a + `#include' of the top-level config file for the machine + you will run the compiler on (*note Config::.). This + file is responsible for defining information about the + host machine. It includes `tm.h'. + + The top-level config file is located in the subdirectory + `config'. Its name is always `xm-SOMETHING.h'; usually + `xm-MACHINE.h', but there are some exceptions. + + If your system does not support symbolic links, you + might want to set up `config.h' to contain a `#include' + command which refers to the appropriate file. + + * A file named `tconfig.h' is created which includes the + top-level config file for your target machine. This is + used for compiling certain programs to run on that + machine. + + * A file named `tm.h' is created which includes the + machine-description macro file for your target machine. + It should be in the subdirectory `config' and its name + is often `MACHINE.h'. + + `--enable-nls' + `--disable-nls' + The `--enable-nls' option enables Native Language Support + (NLS), which lets GCC output diagnostics in languages other + than American English. No translations are available yet, so + the main users of this option now are those translating GCC's + diagnostics who want to test their work. Once translations + become available, Native Language Support will become enabled + by default. The `--disable-nls' option disables NLS. + + `--with-included-gettext' + If NLS is enabled, the GCC build procedure normally attempts + to use the host's `gettext' libraries, and falls back on + GCC's copy of the GNU `gettext' library only if the host + libraries do not suffice. The `--with-included-gettext' + option causes the build procedure to prefer its copy of GNU + `gettext'. + + `--with-catgets' + If NLS is enabled, and if the host lacks `gettext' but has the + inferior `catgets' interface, the GCC build procedure normally + ignores `catgets' and instead uses GCC's copy of the GNU + `gettext' library. The `--with-catgets' option causes the + build procedure to use the host's `catgets' in this situation. + + 7. In certain cases, you should specify certain other options when + you run `configure'. + + * The standard directory for installing GNU CC is + `/usr/local/lib'. If you want to install its files somewhere + else, specify `--prefix=DIR' when you run `configure'. Here + DIR is a directory name to use instead of `/usr/local' for + all purposes with one exception: the directory + `/usr/local/include' is searched for header files no matter + where you install the compiler. To override this name, use + the `--with-local-prefix' option below. The directory you + specify need not exist, but its parent directory must exist. + + * Specify `--with-local-prefix=DIR' if you want the compiler to + search directory `DIR/include' for locally installed header + files *instead* of `/usr/local/include'. + + You should specify `--with-local-prefix' *only* if your site + has a different convention (not `/usr/local') for where to put + site-specific files. + + The default value for `--with-local-prefix' is `/usr/local' + regardless of the value of `--prefix'. Specifying `--prefix' + has no effect on which directory GNU CC searches for local + header files. This may seem counterintuitive, but actually + it is logical. + + The purpose of `--prefix' is to specify where to *install GNU + CC*. The local header files in `/usr/local/include'--if you + put any in that directory--are not part of GNU CC. They are + part of other programs--perhaps many others. (GNU CC + installs its own header files in another directory which is + based on the `--prefix' value.) + + *Do not* specify `/usr' as the `--with-local-prefix'! The + directory you use for `--with-local-prefix' *must not* contain + any of the system's standard header files. If it did contain + them, certain programs would be miscompiled (including GNU + Emacs, on certain targets), because this would override and + nullify the header file corrections made by the `fixincludes' + script. + + Indications are that people who use this option use it based + on mistaken ideas of what it is for. People use it as if it + specified where to install part of GNU CC. Perhaps they make + this assumption because installing GNU CC creates the + directory. + + 8. Build the compiler. Just type `make LANGUAGES=c' in the compiler + directory. + + `LANGUAGES=c' specifies that only the C compiler should be + compiled. The makefile normally builds compilers for all the + supported languages; currently, C, C++ and Objective C. However, + C is the only language that is sure to work when you build with + other non-GNU C compilers. In addition, building anything but C + at this stage is a waste of time. + + In general, you can specify the languages to build by typing the + argument `LANGUAGES="LIST"', where LIST is one or more words from + the list `c', `c++', and `objective-c'. If you have any + additional GNU compilers as subdirectories of the GNU CC source + directory, you may also specify their names in this list. + + Ignore any warnings you may see about "statement not reached" in + `insn-emit.c'; they are normal. Also, warnings about "unknown + escape sequence" are normal in `genopinit.c' and perhaps some + other files. Likewise, you should ignore warnings about "constant + is so large that it is unsigned" in `insn-emit.c' and + `insn-recog.c', a warning about a comparison always being zero in + `enquire.o', and warnings about shift counts exceeding type widths + in `cexp.y'. Any other compilation errors may represent bugs in + the port to your machine or operating system, and should be + investigated and reported (*note Bugs::.). + + Some compilers fail to compile GNU CC because they have bugs or + limitations. For example, the Microsoft compiler is said to run + out of macro space. Some Ultrix compilers run out of expression + space; then you need to break up the statement where the problem + happens. + + 9. If you are building a cross-compiler, stop here. *Note + Cross-Compiler::. + + 10. Move the first-stage object files and executables into a + subdirectory with this command: + + make stage1 + + The files are moved into a subdirectory named `stage1'. Once + installation is complete, you may wish to delete these files with + `rm -r stage1'. + + 11. If you have chosen a configuration for GNU CC which requires other + GNU tools (such as GAS or the GNU linker) instead of the standard + system tools, install the required tools in the `stage1' + subdirectory under the names `as', `ld' or whatever is + appropriate. This will enable the stage 1 compiler to find the + proper tools in the following stage. + + Alternatively, you can do subsequent compilation using a value of + the `PATH' environment variable such that the necessary GNU tools + come before the standard system tools. + + 12. Recompile the compiler with itself, with this command: + + make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2" + + This is called making the stage 2 compiler. + + The command shown above builds compilers for all the supported + languages. If you don't want them all, you can specify the + languages to build by typing the argument `LANGUAGES="LIST"'. LIST + should contain one or more words from the list `c', `c++', + `objective-c', and `proto'. Separate the words with spaces. + `proto' stands for the programs `protoize' and `unprotoize'; they + are not a separate language, but you use `LANGUAGES' to enable or + disable their installation. + + If you are going to build the stage 3 compiler, then you might + want to build only the C language in stage 2. + + Once you have built the stage 2 compiler, if you are short of disk + space, you can delete the subdirectory `stage1'. + + On a 68000 or 68020 system lacking floating point hardware, unless + you have selected a `tm.h' file that expects by default that there + is no such hardware, do this instead: + + make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2 -msoft-float" + + 13. If you wish to test the compiler by compiling it with itself one + more time, install any other necessary GNU tools (such as GAS or + the GNU linker) in the `stage2' subdirectory as you did in the + `stage1' subdirectory, then do this: + + make stage2 + make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2" + + This is called making the stage 3 compiler. Aside from the `-B' + option, the compiler options should be the same as when you made + the stage 2 compiler. But the `LANGUAGES' option need not be the + same. The command shown above builds compilers for all the + supported languages; if you don't want them all, you can specify + the languages to build by typing the argument `LANGUAGES="LIST"', + as described above. + + If you do not have to install any additional GNU tools, you may + use the command + + make bootstrap LANGUAGES=LANGUAGE-LIST BOOT_CFLAGS=OPTION-LIST + + instead of making `stage1', `stage2', and performing the two + compiler builds. + + 14. Compare the latest object files with the stage 2 object files--they + ought to be identical, aside from time stamps (if any). + + On some systems, meaningful comparison of object files is + impossible; they always appear "different." This is currently + true on Solaris and some systems that use ELF object file format. + On some versions of Irix on SGI machines and DEC Unix (OSF/1) on + Alpha systems, you will not be able to compare the files without + specifying `-save-temps'; see the description of individual + systems above to see if you get comparison failures. You may have + similar problems on other systems. + + Use this command to compare the files: + + make compare + + This will mention any object files that differ between stage 2 and + stage 3. Any difference, no matter how innocuous, indicates that + the stage 2 compiler has compiled GNU CC incorrectly, and is + therefore a potentially serious bug which you should investigate + and report (*note Bugs::.). + + If your system does not put time stamps in the object files, then + this is a faster way to compare them (using the Bourne shell): + + for file in *.o; do + cmp $file stage2/$file + done + + If you have built the compiler with the `-mno-mips-tfile' option on + MIPS machines, you will not be able to compare the files. + + 15. Install the compiler driver, the compiler's passes and run-time + support with `make install'. Use the same value for `CC', + `CFLAGS' and `LANGUAGES' that you used when compiling the files + that are being installed. One reason this is necessary is that + some versions of Make have bugs and recompile files gratuitously + when you do this step. If you use the same variable values, those + files will be recompiled properly. + + For example, if you have built the stage 2 compiler, you can use + the following command: + + make install CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O" LANGUAGES="LIST" + + This copies the files `cc1', `cpp' and `libgcc.a' to files `cc1', + `cpp' and `libgcc.a' in the directory + `/usr/local/lib/gcc-lib/TARGET/VERSION', which is where the + compiler driver program looks for them. Here TARGET is the + canonicalized form of target machine type specified when you ran + `configure', and VERSION is the version number of GNU CC. This + naming scheme permits various versions and/or cross-compilers to + coexist. It also copies the executables for compilers for other + languages (e.g., `cc1plus' for C++) to the same directory. + + This also copies the driver program `xgcc' into + `/usr/local/bin/gcc', so that it appears in typical execution + search paths. It also copies `gcc.1' into `/usr/local/man/man1' + and info pages into `/usr/local/info'. + + On some systems, this command causes recompilation of some files. + This is usually due to bugs in `make'. You should either ignore + this problem, or use GNU Make. + + *Warning: there is a bug in `alloca' in the Sun library. To avoid + this bug, be sure to install the executables of GNU CC that were + compiled by GNU CC. (That is, the executables from stage 2 or 3, + not stage 1.) They use `alloca' as a built-in function and never + the one in the library.* + + (It is usually better to install GNU CC executables from stage 2 + or 3, since they usually run faster than the ones compiled with + some other compiler.) + + 16. If you're going to use C++, you need to install the C++ runtime + library. This includes all I/O functionality, special class + libraries, etc. + + The standard C++ runtime library for GNU CC is called `libstdc++'. + An obsolescent library `libg++' may also be available, but it's + necessary only for older software that hasn't been converted yet; + if you don't know whether you need `libg++' then you probably don't + need it. + + Here's one way to build and install `libstdc++' for GNU CC: + + * Build and install GNU CC, so that invoking `gcc' obtains the + GNU CC that was just built. + + * Obtain a copy of a compatible `libstdc++' distribution. For + example, the `libstdc++-2.8.0.tar.gz' distribution should be + compatible with GCC 2.8.0. GCC distributors normally + distribute `libstdc++' as well. + + * Set the `CXX' environment variable to `gcc' while running the + `libstdc++' distribution's `configure' command. Use the same + `configure' options that you used when you invoked GCC's + `configure' command. + + * Invoke `make' to build the C++ runtime. + + * Invoke `make install' to install the C++ runtime. + + To summarize, after building and installing GNU CC, invoke the + following shell commands in the topmost directory of the C++ + library distribution. For CONFIGURE-OPTIONS, use the same options + that you used to configure GNU CC. + + $ CXX=gcc ./configure CONFIGURE-OPTIONS + $ make + $ make install + + 17. GNU CC includes a runtime library for Objective-C because it is an + integral part of the language. You can find the files associated + with the library in the subdirectory `objc'. The GNU Objective-C + Runtime Library requires header files for the target's C library in + order to be compiled,and also requires the header files for the + target's thread library if you want thread support. *Note + Cross-Compilers and Header Files: Cross Headers, for discussion + about header files issues for cross-compilation. + + When you run `configure', it picks the appropriate Objective-C + thread implementation file for the target platform. In some + situations, you may wish to choose a different back-end as some + platforms support multiple thread implementations or you may wish + to disable thread support completely. You do this by specifying a + value for the OBJC_THREAD_FILE makefile variable on the command + line when you run make, for example: + + make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2" OBJC_THREAD_FILE=thr-single + + Below is a list of the currently available back-ends. + + * thr-single Disable thread support, should work for all + platforms. + + * thr-decosf1 DEC OSF/1 thread support. + + * thr-irix SGI IRIX thread support. + + * thr-mach Generic MACH thread support, known to work on + NEXTSTEP. + + * thr-os2 IBM OS/2 thread support. + + * thr-posix Generix POSIX thread support. + + * thr-pthreads PCThreads on Linux-based GNU systems. + + * thr-solaris SUN Solaris thread support. + + * thr-win32 Microsoft Win32 API thread support. + + +File: gcc.info, Node: Configuration Files, Next: Configurations, Up: Installation + +Files Created by `configure' +============================ + + Here we spell out what files will be set up by `configure'. Normally +you need not be concerned with these files. + + * A file named `config.h' is created that contains a `#include' of + the top-level config file for the machine you will run the compiler + on (*note Config::.). This file is responsible for defining + information about the host machine. It includes `tm.h'. + + The top-level config file is located in the subdirectory `config'. + Its name is always `xm-SOMETHING.h'; usually `xm-MACHINE.h', but + there are some exceptions. + + If your system does not support symbolic links, you might want to + set up `config.h' to contain a `#include' command which refers to + the appropriate file. + + * A file named `tconfig.h' is created which includes the top-level + config file for your target machine. This is used for compiling + certain programs to run on that machine. + + * A file named `tm.h' is created which includes the + machine-description macro file for your target machine. It should + be in the subdirectory `config' and its name is often `MACHINE.h'. + + * The command file `configure' also constructs the file `Makefile' + by adding some text to the template file `Makefile.in'. The + additional text comes from files in the `config' directory, named + `t-TARGET' and `x-HOST'. If these files do not exist, it means + nothing needs to be added for a given target or host. + diff --git a/usr/local/nachos/info/gcc.info-8 b/usr/local/nachos/info/gcc.info-8 new file mode 100644 index 0000000..a6d8318 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-8 @@ -0,0 +1,1112 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Configurations, Next: Other Dir, Prev: Configuration Files, Up: Installation + +Configurations Supported by GNU CC +================================== + + Here are the possible CPU types: + + 1750a, a29k, alpha, arm, cN, clipper, dsp16xx, elxsi, h8300, + hppa1.0, hppa1.1, i370, i386, i486, i586, i860, i960, m32r, + m68000, m68k, m88k, mips, mipsel, mips64, mips64el, ns32k, + powerpc, powerpcle, pyramid, romp, rs6000, sh, sparc, sparclite, + sparc64, vax, we32k. + + Here are the recognized company names. As you can see, customary +abbreviations are used rather than the longer official names. + + acorn, alliant, altos, apollo, apple, att, bull, cbm, convergent, + convex, crds, dec, dg, dolphin, elxsi, encore, harris, hitachi, + hp, ibm, intergraph, isi, mips, motorola, ncr, next, ns, omron, + plexus, sequent, sgi, sony, sun, tti, unicom, wrs. + + The company name is meaningful only to disambiguate when the rest of +the information supplied is insufficient. You can omit it, writing +just `CPU-SYSTEM', if it is not needed. For example, `vax-ultrix4.2' +is equivalent to `vax-dec-ultrix4.2'. + + Here is a list of system types: + + 386bsd, aix, acis, amigaos, aos, aout, aux, bosx, bsd, clix, coff, + ctix, cxux, dgux, dynix, ebmon, ecoff, elf, esix, freebsd, hms, + genix, gnu, linux-gnu, hiux, hpux, iris, irix, isc, luna, lynxos, + mach, minix, msdos, mvs, netbsd, newsos, nindy, ns, osf, osfrose, + ptx, riscix, riscos, rtu, sco, sim, solaris, sunos, sym, sysv, + udi, ultrix, unicos, uniplus, unos, vms, vsta, vxworks, winnt, + xenix. + +You can omit the system type; then `configure' guesses the operating +system from the CPU and company. + + You can add a version number to the system type; this may or may not +make a difference. For example, you can write `bsd4.3' or `bsd4.4' to +distinguish versions of BSD. In practice, the version number is most +needed for `sysv3' and `sysv4', which are often treated differently. + + If you specify an impossible combination such as `i860-dg-vms', then +you may get an error message from `configure', or it may ignore part of +the information and do the best it can with the rest. `configure' +always prints the canonical name for the alternative that it used. GNU +CC does not support all possible alternatives. + + Often a particular model of machine has a name. Many machine names +are recognized as aliases for CPU/company combinations. Thus, the +machine name `sun3', mentioned above, is an alias for `m68k-sun'. +Sometimes we accept a company name as a machine name, when the name is +popularly used for a particular machine. Here is a table of the known +machine names: + + 3300, 3b1, 3bN, 7300, altos3068, altos, apollo68, att-7300, + balance, convex-cN, crds, decstation-3100, decstation, delta, + encore, fx2800, gmicro, hp7NN, hp8NN, hp9k2NN, hp9k3NN, hp9k7NN, + hp9k8NN, iris4d, iris, isi68, m3230, magnum, merlin, miniframe, + mmax, news-3600, news800, news, next, pbd, pc532, pmax, powerpc, + powerpcle, ps2, risc-news, rtpc, sun2, sun386i, sun386, sun3, + sun4, symmetry, tower-32, tower. + +Remember that a machine name specifies both the cpu type and the company +name. If you want to install your own homemade configuration files, +you can use `local' as the company name to access them. If you use +configuration `CPU-local', the configuration name without the cpu prefix +is used to form the configuration file names. + + Thus, if you specify `m68k-local', configuration uses files +`m68k.md', `local.h', `m68k.c', `xm-local.h', `t-local', and `x-local', +all in the directory `config/m68k'. + + Here is a list of configurations that have special treatment or +special things you must know: + +`1750a-*-*' + MIL-STD-1750A processors. + + The MIL-STD-1750A cross configuration produces output for + `as1750', an assembler/linker available under the GNU Public + License for the 1750A. `as1750' can be obtained at + *ftp://ftp.fta-berlin.de/pub/crossgcc/1750gals/*. A similarly + licensed simulator for the 1750A is available from same address. + + You should ignore a fatal error during the building of libgcc + (libgcc is not yet implemented for the 1750A.) + + The `as1750' assembler requires the file `ms1750.inc', which is + found in the directory `config/1750a'. + + GNU CC produced the same sections as the Fairchild F9450 C + Compiler, namely: + + `Normal' + The program code section. + + `Static' + The read/write (RAM) data section. + + `Konst' + The read-only (ROM) constants section. + + `Init' + Initialization section (code to copy KREL to SREL). + + The smallest addressable unit is 16 bits (BITS_PER_UNIT is 16). + This means that type `char' is represented with a 16-bit word per + character. The 1750A's "Load/Store Upper/Lower Byte" instructions + are not used by GNU CC. + +`alpha-*-osf1' + Systems using processors that implement the DEC Alpha architecture + and are running the DEC Unix (OSF/1) operating system, for example + the DEC Alpha AXP systems.CC.) + + GNU CC writes a `.verstamp' directive to the assembler output file + unless it is built as a cross-compiler. It gets the version to + use from the system header file `/usr/include/stamp.h'. If you + install a new version of DEC Unix, you should rebuild GCC to pick + up the new version stamp. + + Note that since the Alpha is a 64-bit architecture, + cross-compilers from 32-bit machines will not generate code as + efficient as that generated when the compiler is running on a + 64-bit machine because many optimizations that depend on being + able to represent a word on the target in an integral value on the + host cannot be performed. Building cross-compilers on the Alpha + for 32-bit machines has only been tested in a few cases and may + not work properly. + + `make compare' may fail on old versions of DEC Unix unless you add + `-save-temps' to `CFLAGS'. On these systems, the name of the + assembler input file is stored in the object file, and that makes + comparison fail if it differs between the `stage1' and `stage2' + compilations. The option `-save-temps' forces a fixed name to be + used for the assembler input file, instead of a randomly chosen + name in `/tmp'. Do not add `-save-temps' unless the comparisons + fail without that option. If you add `-save-temps', you will have + to manually delete the `.i' and `.s' files after each series of + compilations. + + GNU CC now supports both the native (ECOFF) debugging format used + by DBX and GDB and an encapsulated STABS format for use only with + GDB. See the discussion of the `--with-stabs' option of + `configure' above for more information on these formats and how to + select them. + + There is a bug in DEC's assembler that produces incorrect line + numbers for ECOFF format when the `.align' directive is used. To + work around this problem, GNU CC will not emit such alignment + directives while writing ECOFF format debugging information even + if optimization is being performed. Unfortunately, this has the + very undesirable side-effect that code addresses when `-O' is + specified are different depending on whether or not `-g' is also + specified. + + To avoid this behavior, specify `-gstabs+' and use GDB instead of + DBX. DEC is now aware of this problem with the assembler and + hopes to provide a fix shortly. + +`arc-*-elf' + Argonaut ARC processor. This configuration is intended for + embedded systems. + +`arm-*-aout' + Advanced RISC Machines ARM-family processors. These are often + used in embedded applications. There are no standard Unix + configurations. This configuration corresponds to the basic + instruction sequences and will produce `a.out' format object + modules. + + You may need to make a variant of the file `arm.h' for your + particular configuration. + +`arm-*-linuxaout' + Any of the ARM family processors running the Linux-based GNU + system with the `a.out' binary format (ELF is not yet supported). + You must use version 2.8.1.0.7 or later of the GNU/Linux binutils, + which you can download from `sunsite.unc.edu:/pub/Linux/GCC' and + other mirror sites for Linux-based GNU systems. + +`arm-*-riscix' + The ARM2 or ARM3 processor running RISC iX, Acorn's port of BSD + Unix. If you are running a version of RISC iX prior to 1.2 then + you must specify the version number during configuration. Note + that the assembler shipped with RISC iX does not support stabs + debugging information; a new version of the assembler, with stabs + support included, is now available from Acorn and via ftp + `ftp.acorn.com:/pub/riscix/as+xterm.tar.Z'. To enable stabs + debugging, pass `--with-gnu-as' to configure. + + You will need to install GNU `sed' before you can run configure. + +`a29k' + AMD Am29k-family processors. These are normally used in embedded + applications. There are no standard Unix configurations. This + configuration corresponds to AMD's standard calling sequence and + binary interface and is compatible with other 29k tools. + + You may need to make a variant of the file `a29k.h' for your + particular configuration. + +`a29k-*-bsd' + AMD Am29050 used in a system running a variant of BSD Unix. + +`decstation-*' + MIPS-based DECstations can support three different personalities: + Ultrix, DEC OSF/1, and OSF/rose. (Alpha-based DECstation products + have a configuration name beginning with `alpha-dec'.) To + configure GCC for these platforms use the following configurations: + + `decstation-ultrix' + Ultrix configuration. + + `decstation-osf1' + Dec's version of OSF/1. + + `decstation-osfrose' + Open Software Foundation reference port of OSF/1 which uses + the OSF/rose object file format instead of ECOFF. Normally, + you would not select this configuration. + + The MIPS C compiler needs to be told to increase its table size + for switch statements with the `-Wf,-XNg1500' option in order to + compile `cp/parse.c'. If you use the `-O2' optimization option, + you also need to use `-Olimit 3000'. Both of these options are + automatically generated in the `Makefile' that the shell script + `configure' builds. If you override the `CC' make variable and + use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit + 3000'. + +`elxsi-elxsi-bsd' + The Elxsi's C compiler has known limitations that prevent it from + compiling GNU C. Please contact `mrs@cygnus.com' for more details. + +`dsp16xx' + A port to the AT&T DSP1610 family of processors. + +`h8300-*-*' + Hitachi H8/300 series of processors. + + The calling convention and structure layout has changed in release + 2.6. All code must be recompiled. The calling convention now + passes the first three arguments in function calls in registers. + Structures are no longer a multiple of 2 bytes. + +`hppa*-*-*' + There are several variants of the HP-PA processor which run a + variety of operating systems. GNU CC must be configured to use + the correct processor type and operating system, or GNU CC will + not function correctly. The easiest way to handle this problem is + to *not* specify a target when configuring GNU CC, the `configure' + script will try to automatically determine the right processor + type and operating system. + + `-g' does not work on HP-UX, since that system uses a peculiar + debugging format which GNU CC does not know about. However, `-g' + will work if you also use GAS and GDB in conjunction with GCC. We + highly recommend using GAS for all HP-PA configurations. + + You should be using GAS-2.6 (or later) along with GDB-4.16 (or + later). These can be retrieved from all the traditional GNU ftp + archive sites. + + On some versions of HP-UX, you will need to install GNU `sed'. + + You will need to be install GAS into a directory before `/bin', + `/usr/bin', and `/usr/ccs/bin' in your search path. You should + install GAS before you build GNU CC. + + To enable debugging, you must configure GNU CC with the + `--with-gnu-as' option before building. + +`i370-*-*' + This port is very preliminary and has many known bugs. We hope to + have a higher-quality port for this machine soon. + +`i386-*-linux-gnuoldld' + Use this configuration to generate `a.out' binaries on Linux-based + GNU systems if you do not have gas/binutils version 2.5.2 or later + installed. This is an obsolete configuration. + +`i386-*-linux-gnuaout' + Use this configuration to generate `a.out' binaries on Linux-based + GNU systems. This configuration is being superseded. You must use + gas/binutils version 2.5.2 or later. + +`i386-*-linux-gnu' + Use this configuration to generate ELF binaries on Linux-based GNU + systems. You must use gas/binutils version 2.5.2 or later. + +`i386-*-sco' + Compilation with RCC is recommended. Also, it may be a good idea + to link with GNU malloc instead of the malloc that comes with the + system. + +`i386-*-sco3.2v4' + Use this configuration for SCO release 3.2 version 4. + +`i386-*-sco3.2v5*' + Use this for the SCO OpenServer Release family including 5.0.0, + 5.0.2, 5.0.4, 5.0.5, Internet FastStart 1.0, and Internet + FastStart 1.1. + + GNU CC can generate COFF binaries if you specify `-mcoff' or ELF + binaries, the default. A full `make bootstrap' is recommended + so that an ELF compiler that builds ELF is generated. + + You must have TLS597 from `ftp://ftp.sco.com/TLS' installed for ELF + C++ binaries to work correctly on releases before 5.0.4. + + The native SCO assembler that is provided with the OS at no charge + is normally required. If, however, you must be able to use the GNU + assembler (perhaps you have complex asms) you must configure this + package `--with-gnu-as'. To do this, install (cp or symlink) + gcc/as to your copy of the GNU assembler. You must use a recent + version of GNU binutils; version 2.9.1 seems to work well. If you + select this option, you will be unable to build COFF images. + Trying to do so will result in non-obvious failures. In general, + the "-with-gnu-as" option isn't as well tested as the native + assembler. + + *NOTE:* If you are building C++, you must follow the instructions + about invoking `make bootstrap' because the native OpenServer + compiler may build a `cc1plus' that will not correctly parse many + valid C++ programs. You must do a `make bootstrap' if you are + building with the native compiler. + +`i386-*-isc' + It may be a good idea to link with GNU malloc instead of the + malloc that comes with the system. + + In ISC version 4.1, `sed' core dumps when building `deduced.h'. + Use the version of `sed' from version 4.0. + +`i386-*-esix' + It may be good idea to link with GNU malloc instead of the malloc + that comes with the system. + +`i386-ibm-aix' + You need to use GAS version 2.1 or later, and LD from GNU binutils + version 2.2 or later. + +`i386-sequent-bsd' + Go to the Berkeley universe before compiling. + +`i386-sequent-ptx1*' +`i386-sequent-ptx2*' + You must install GNU `sed' before running `configure'. + +`i386-sun-sunos4' + You may find that you need another version of GNU CC to begin + bootstrapping with, since the current version when built with the + system's own compiler seems to get an infinite loop compiling part + of `libgcc2.c'. GNU CC version 2 compiled with GNU CC (any + version) seems not to have this problem. + + See *Note Sun Install::, for information on installing GNU CC on + Sun systems. + +`i[345]86-*-winnt3.5' + This version requires a GAS that has not yet been released. Until + it is, you can get a prebuilt binary version via anonymous ftp from + `cs.washington.edu:pub/gnat' or `cs.nyu.edu:pub/gnat'. You must + also use the Microsoft header files from the Windows NT 3.5 SDK. + Find these on the CDROM in the `/mstools/h' directory dated + 9/4/94. You must use a fixed version of Microsoft linker made + especially for NT 3.5, which is also is available on the NT 3.5 + SDK CDROM. If you do not have this linker, can you also use the + linker from Visual C/C++ 1.0 or 2.0. + + Installing GNU CC for NT builds a wrapper linker, called `ld.exe', + which mimics the behaviour of Unix `ld' in the specification of + libraries (`-L' and `-l'). `ld.exe' looks for both Unix and + Microsoft named libraries. For example, if you specify `-lfoo', + `ld.exe' will look first for `libfoo.a' and then for `foo.lib'. + + You may install GNU CC for Windows NT in one of two ways, + depending on whether or not you have a Unix-like shell and various + Unix-like utilities. + + 1. If you do not have a Unix-like shell and few Unix-like + utilities, you will use a DOS style batch script called + `configure.bat'. Invoke it as `configure winnt' from an + MSDOS console window or from the program manager dialog box. + `configure.bat' assumes you have already installed and have + in your path a Unix-like `sed' program which is used to + create a working `Makefile' from `Makefile.in'. + + `Makefile' uses the Microsoft Nmake program maintenance + utility and the Visual C/C++ V8.00 compiler to build GNU CC. + You need only have the utilities `sed' and `touch' to use + this installation method, which only automatically builds the + compiler itself. You must then examine what `fixinc.winnt' + does, edit the header files by hand and build `libgcc.a' + manually. + + 2. The second type of installation assumes you are running a + Unix-like shell, have a complete suite of Unix-like utilities + in your path, and have a previous version of GNU CC already + installed, either through building it via the above + installation method or acquiring a pre-built binary. In this + case, use the `configure' script in the normal fashion. + +`i860-intel-osf1' + This is the Paragon. If you have version 1.0 of the operating + system, see *Note Installation Problems::, for special things you + need to do to compensate for peculiarities in the system. + +`*-lynx-lynxos' + LynxOS 2.2 and earlier comes with GNU CC 1.x already installed as + `/bin/gcc'. You should compile with this instead of `/bin/cc'. + You can tell GNU CC to use the GNU assembler and linker, by + specifying `--with-gnu-as --with-gnu-ld' when configuring. These + will produce COFF format object files and executables; otherwise + GNU CC will use the installed tools, which produce `a.out' format + executables. + +`m32r-*-elf' + Mitsubishi M32R processor. This configuration is intended for + embedded systems. + +`m68000-hp-bsd' + HP 9000 series 200 running BSD. Note that the C compiler that + comes with this system cannot compile GNU CC; contact + `law@cygnus.com' to get binaries of GNU CC for bootstrapping. + +`m68k-altos' + Altos 3068. You must use the GNU assembler, linker and debugger. + Also, you must fix a kernel bug. Details in the file + `README.ALTOS'. + +`m68k-apple-aux' + Apple Macintosh running A/UX. You may configure GCC to use + either the system assembler and linker or the GNU assembler and + linker. You should use the GNU configuration if you can, + especially if you also want to use GNU C++. You enabled that + configuration with + the `--with-gnu-as' and `--with-gnu-ld' + options to `configure'. + + Note the C compiler that comes with this system cannot compile GNU + CC. You can find binaries of GNU CC for bootstrapping on + `jagubox.gsfc.nasa.gov'. You will also a patched version of + `/bin/ld' there that raises some of the arbitrary limits found in + the original. + +`m68k-att-sysv' + AT&T 3b1, a.k.a. 7300 PC. Special procedures are needed to + compile GNU CC with this machine's standard C compiler, due to + bugs in that compiler. You can bootstrap it more easily with + previous versions of GNU CC if you have them. + + Installing GNU CC on the 3b1 is difficult if you do not already + have GNU CC running, due to bugs in the installed C compiler. + However, the following procedure might work. We are unable to + test it. + + 1. Comment out the `#include "config.h"' line near the start of + `cccp.c' and do `make cpp'. This makes a preliminary version + of GNU cpp. + + 2. Save the old `/lib/cpp' and copy the preliminary GNU cpp to + that file name. + + 3. Undo your change in `cccp.c', or reinstall the original + version, and do `make cpp' again. + + 4. Copy this final version of GNU cpp into `/lib/cpp'. + + 5. Replace every occurrence of `obstack_free' in the file + `tree.c' with `_obstack_free'. + + 6. Run `make' to get the first-stage GNU CC. + + 7. Reinstall the original version of `/lib/cpp'. + + 8. Now you can compile GNU CC with itself and install it in the + normal fashion. + +`m68k-bull-sysv' + Bull DPX/2 series 200 and 300 with BOS-2.00.45 up to BOS-2.01. GNU + CC works either with native assembler or GNU assembler. You can use + GNU assembler with native coff generation by providing + `--with-gnu-as' to the configure script or use GNU assembler with + dbx-in-coff encapsulation by providing `--with-gnu-as --stabs'. + For any problem with native assembler or for availability of the + DPX/2 port of GAS, contact `F.Pierresteguy@frcl.bull.fr'. + +`m68k-crds-unox' + Use `configure unos' for building on Unos. + + The Unos assembler is named `casm' instead of `as'. For some + strange reason linking `/bin/as' to `/bin/casm' changes the + behavior, and does not work. So, when installing GNU CC, you + should install the following script as `as' in the subdirectory + where the passes of GCC are installed: + + #!/bin/sh + casm $* + + The default Unos library is named `libunos.a' instead of `libc.a'. + To allow GNU CC to function, either change all references to + `-lc' in `gcc.c' to `-lunos' or link `/lib/libc.a' to + `/lib/libunos.a'. + + When compiling GNU CC with the standard compiler, to overcome bugs + in the support of `alloca', do not use `-O' when making stage 2. + Then use the stage 2 compiler with `-O' to make the stage 3 + compiler. This compiler will have the same characteristics as the + usual stage 2 compiler on other systems. Use it to make a stage 4 + compiler and compare that with stage 3 to verify proper + compilation. + + (Perhaps simply defining `ALLOCA' in `x-crds' as described in the + comments there will make the above paragraph superfluous. Please + inform us of whether this works.) + + Unos uses memory segmentation instead of demand paging, so you + will need a lot of memory. 5 Mb is barely enough if no other + tasks are running. If linking `cc1' fails, try putting the object + files into a library and linking from that library. + +`m68k-hp-hpux' + HP 9000 series 300 or 400 running HP-UX. HP-UX version 8.0 has a + bug in the assembler that prevents compilation of GNU CC. To fix + it, get patch PHCO_4484 from HP. + + In addition, if you wish to use gas `--with-gnu-as' you must use + gas version 2.1 or later, and you must use the GNU linker version + 2.1 or later. Earlier versions of gas relied upon a program which + converted the gas output into the native HP-UX format, but that + program has not been kept up to date. gdb does not understand + that native HP-UX format, so you must use gas if you wish to use + gdb. + +`m68k-sun' + Sun 3. We do not provide a configuration file to use the Sun FPA + by default, because programs that establish signal handlers for + floating point traps inherently cannot work with the FPA. + + See *Note Sun Install::, for information on installing GNU CC on + Sun systems. + +`m88k-*-svr3' + Motorola m88k running the AT&T/Unisoft/Motorola V.3 reference port. + These systems tend to use the Green Hills C, revision 1.8.5, as the + standard C compiler. There are apparently bugs in this compiler + that result in object files differences between stage 2 and stage + 3. If this happens, make the stage 4 compiler and compare it to + the stage 3 compiler. If the stage 3 and stage 4 object files are + identical, this suggests you encountered a problem with the + standard C compiler; the stage 3 and 4 compilers may be usable. + + It is best, however, to use an older version of GNU CC for + bootstrapping if you have one. + +`m88k-*-dgux' + Motorola m88k running DG/UX. To build 88open BCS native or cross + compilers on DG/UX, specify the configuration name as + `m88k-*-dguxbcs' and build in the 88open BCS software development + environment. To build ELF native or cross compilers on DG/UX, + specify `m88k-*-dgux' and build in the DG/UX ELF development + environment. You set the software development environment by + issuing `sde-target' command and specifying either `m88kbcs' or + `m88kdguxelf' as the operand. + + If you do not specify a configuration name, `configure' guesses the + configuration based on the current software development + environment. + +`m88k-tektronix-sysv3' + Tektronix XD88 running UTekV 3.2e. Do not turn on optimization + while building stage1 if you bootstrap with the buggy Green Hills + compiler. Also, The bundled LAI System V NFS is buggy so if you + build in an NFS mounted directory, start from a fresh reboot, or + avoid NFS all together. Otherwise you may have trouble getting + clean comparisons between stages. + +`mips-mips-bsd' + MIPS machines running the MIPS operating system in BSD mode. It's + possible that some old versions of the system lack the functions + `memcpy', `memcmp', and `memset'. If your system lacks these, you + must remove or undo the definition of `TARGET_MEM_FUNCTIONS' in + `mips-bsd.h'. + + The MIPS C compiler needs to be told to increase its table size + for switch statements with the `-Wf,-XNg1500' option in order to + compile `cp/parse.c'. If you use the `-O2' optimization option, + you also need to use `-Olimit 3000'. Both of these options are + automatically generated in the `Makefile' that the shell script + `configure' builds. If you override the `CC' make variable and + use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit + 3000'. + +`mips-mips-riscos*' + The MIPS C compiler needs to be told to increase its table size + for switch statements with the `-Wf,-XNg1500' option in order to + compile `cp/parse.c'. If you use the `-O2' optimization option, + you also need to use `-Olimit 3000'. Both of these options are + automatically generated in the `Makefile' that the shell script + `configure' builds. If you override the `CC' make variable and + use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit + 3000'. + + MIPS computers running RISC-OS can support four different + personalities: default, BSD 4.3, System V.3, and System V.4 (older + versions of RISC-OS don't support V.4). To configure GCC for + these platforms use the following configurations: + + `mips-mips-riscos`rev'' + Default configuration for RISC-OS, revision `rev'. + + `mips-mips-riscos`rev'bsd' + BSD 4.3 configuration for RISC-OS, revision `rev'. + + `mips-mips-riscos`rev'sysv4' + System V.4 configuration for RISC-OS, revision `rev'. + + `mips-mips-riscos`rev'sysv' + System V.3 configuration for RISC-OS, revision `rev'. + + The revision `rev' mentioned above is the revision of RISC-OS to + use. You must reconfigure GCC when going from a RISC-OS revision + 4 to RISC-OS revision 5. This has the effect of avoiding a linker + bug (see *Note Installation Problems::, for more details). + +`mips-sgi-*' + In order to compile GCC on an SGI running IRIX 4, the "c.hdr.lib" + option must be installed from the CD-ROM supplied from Silicon + Graphics. This is found on the 2nd CD in release 4.0.1. + + In order to compile GCC on an SGI running IRIX 5, the + "compiler_dev.hdr" subsystem must be installed from the IDO CD-ROM + supplied by Silicon Graphics. + + `make compare' may fail on version 5 of IRIX unless you add + `-save-temps' to `CFLAGS'. On these systems, the name of the + assembler input file is stored in the object file, and that makes + comparison fail if it differs between the `stage1' and `stage2' + compilations. The option `-save-temps' forces a fixed name to be + used for the assembler input file, instead of a randomly chosen + name in `/tmp'. Do not add `-save-temps' unless the comparisons + fail without that option. If you do you `-save-temps', you will + have to manually delete the `.i' and `.s' files after each series + of compilations. + + The MIPS C compiler needs to be told to increase its table size + for switch statements with the `-Wf,-XNg1500' option in order to + compile `cp/parse.c'. If you use the `-O2' optimization option, + you also need to use `-Olimit 3000'. Both of these options are + automatically generated in the `Makefile' that the shell script + `configure' builds. If you override the `CC' make variable and + use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit + 3000'. + + On Irix version 4.0.5F, and perhaps on some other versions as well, + there is an assembler bug that reorders instructions incorrectly. + To work around it, specify the target configuration + `mips-sgi-irix4loser'. This configuration inhibits assembler + optimization. + + In a compiler configured with target `mips-sgi-irix4', you can turn + off assembler optimization by using the `-noasmopt' option. This + compiler option passes the option `-O0' to the assembler, to + inhibit reordering. + + The `-noasmopt' option can be useful for testing whether a problem + is due to erroneous assembler reordering. Even if a problem does + not go away with `-noasmopt', it may still be due to assembler + reordering--perhaps GNU CC itself was miscompiled as a result. + + To enable debugging under Irix 5, you must use GNU as 2.5 or later, + and use the `--with-gnu-as' configure option when configuring gcc. + GNU as is distributed as part of the binutils package. + +`mips-sony-sysv' + Sony MIPS NEWS. This works in NEWSOS 5.0.1, but not in 5.0.2 + (which uses ELF instead of COFF). Support for 5.0.2 will probably + be provided soon by volunteers. In particular, the linker does + not like the code generated by GCC when shared libraries are + linked in. + +`ns32k-encore' + Encore ns32000 system. Encore systems are supported only under + BSD. + +`ns32k-*-genix' + National Semiconductor ns32000 system. Genix has bugs in `alloca' + and `malloc'; you must get the compiled versions of these from GNU + Emacs. + +`ns32k-sequent' + Go to the Berkeley universe before compiling. + +`ns32k-utek' + UTEK ns32000 system ("merlin"). The C compiler that comes with + this system cannot compile GNU CC; contact `tektronix!reed!mason' + to get binaries of GNU CC for bootstrapping. + +`romp-*-aos' +`romp-*-mach' + The only operating systems supported for the IBM RT PC are AOS and + MACH. GNU CC does not support AIX running on the RT. We + recommend you compile GNU CC with an earlier version of itself; if + you compile GNU CC with `hc', the Metaware compiler, it will work, + but you will get mismatches between the stage 2 and stage 3 + compilers in various files. These errors are minor differences in + some floating-point constants and can be safely ignored; the stage + 3 compiler is correct. + +`rs6000-*-aix' +`powerpc-*-aix' + Various early versions of each release of the IBM XLC compiler + will not bootstrap GNU CC. Symptoms include differences between + the stage2 and stage3 object files, and errors when compiling + `libgcc.a' or `enquire'. Known problematic releases include: + xlc-1.2.1.8, xlc-1.3.0.0 (distributed with AIX 3.2.5), and + xlc-1.3.0.19. Both xlc-1.2.1.28 and xlc-1.3.0.24 (PTF 432238) are + known to produce working versions of GNU CC, but most other recent + releases correctly bootstrap GNU CC. + + Release 4.3.0 of AIX and ones prior to AIX 3.2.4 include a version + of the IBM assembler which does not accept debugging directives: + assembler updates are available as PTFs. Also, if you are using + AIX 3.2.5 or greater and the GNU assembler, you must have a + version modified after October 16th, 1995 in order for the GNU C + compiler to build. See the file `README.RS6000' for more details + on any of these problems. + + GNU CC does not yet support the 64-bit PowerPC instructions. + + Objective C does not work on this architecture because it makes + assumptions that are incompatible with the calling conventions. + + AIX on the RS/6000 provides support (NLS) for environments outside + of the United States. Compilers and assemblers use NLS to support + locale-specific representations of various objects including + floating-point numbers ("." vs "," for separating decimal + fractions). There have been problems reported where the library + linked with GNU CC does not produce the same floating-point + formats that the assembler accepts. If you have this problem, set + the LANG environment variable to "C" or "En_US". + + Due to changes in the way that GNU CC invokes the binder (linker) + for AIX 4.1, you may now receive warnings of duplicate symbols + from the link step that were not reported before. The assembly + files generated by GNU CC for AIX have always included multiple + symbol definitions for certain global variable and function + declarations in the original program. The warnings should not + prevent the linker from producing a correct library or runnable + executable. + + By default, AIX 4.1 produces code that can be used on either Power + or PowerPC processors. + + You can specify a default version for the `-mcpu='CPU_TYPE switch + by using the configure option `--with-cpu-'CPU_TYPE. + +`powerpc-*-elf' +`powerpc-*-sysv4' + PowerPC system in big endian mode, running System V.4. + + You can specify a default version for the `-mcpu='CPU_TYPE switch + by using the configure option `--with-cpu-'CPU_TYPE. + +`powerpc-*-linux-gnu' + PowerPC system in big endian mode, running the Linux-based GNU + system. + + You can specify a default version for the `-mcpu='CPU_TYPE switch + by using the configure option `--with-cpu-'CPU_TYPE. + +`powerpc-*-eabiaix' + Embedded PowerPC system in big endian mode with -mcall-aix + selected as the default. + + You can specify a default version for the `-mcpu='CPU_TYPE switch + by using the configure option `--with-cpu-'CPU_TYPE. + +`powerpc-*-eabisim' + Embedded PowerPC system in big endian mode for use in running + under the PSIM simulator. + + You can specify a default version for the `-mcpu='CPU_TYPE switch + by using the configure option `--with-cpu-'CPU_TYPE. + +`powerpc-*-eabi' + Embedded PowerPC system in big endian mode. + + You can specify a default version for the `-mcpu='CPU_TYPE switch + by using the configure option `--with-cpu-'CPU_TYPE. + +`powerpcle-*-elf' +`powerpcle-*-sysv4' + PowerPC system in little endian mode, running System V.4. + + You can specify a default version for the `-mcpu='CPU_TYPE switch + by using the configure option `--with-cpu-'CPU_TYPE. + +`powerpcle-*-solaris2*' + PowerPC system in little endian mode, running Solaris 2.5.1 or + higher. + + You can specify a default version for the `-mcpu='CPU_TYPE switch + by using the configure option `--with-cpu-'CPU_TYPE. Beta + versions of the Sun 4.0 compiler do not seem to be able to build + GNU CC correctly. There are also problems with the host assembler + and linker that are fixed by using the GNU versions of these tools. + +`powerpcle-*-eabisim' + Embedded PowerPC system in little endian mode for use in running + under the PSIM simulator. + +`powerpcle-*-eabi' + Embedded PowerPC system in little endian mode. + + You can specify a default version for the `-mcpu='CPU_TYPE switch + by using the configure option `--with-cpu-'CPU_TYPE. + +`powerpcle-*-winnt' +`powerpcle-*-pe' + PowerPC system in little endian mode running Windows NT. + + You can specify a default version for the `-mcpu='CPU_TYPE switch + by using the configure option `--with-cpu-'CPU_TYPE. + +`vax-dec-ultrix' + Don't try compiling with Vax C (`vcc'). It produces incorrect code + in some cases (for example, when `alloca' is used). + + Meanwhile, compiling `cp/parse.c' with pcc does not work because of + an internal table size limitation in that compiler. To avoid this + problem, compile just the GNU C compiler first, and use it to + recompile building all the languages that you want to run. + +`sparc-sun-*' + See *Note Sun Install::, for information on installing GNU CC on + Sun systems. + +`vax-dec-vms' + See *Note VMS Install::, for details on how to install GNU CC on + VMS. + +`we32k-*-*' + These computers are also known as the 3b2, 3b5, 3b20 and other + similar names. (However, the 3b1 is actually a 68000; see *Note + Configurations::.) + + Don't use `-g' when compiling with the system's compiler. The + system's linker seems to be unable to handle such a large program + with debugging information. + + The system's compiler runs out of capacity when compiling `stmt.c' + in GNU CC. You can work around this by building `cpp' in GNU CC + first, then use that instead of the system's preprocessor with the + system's C compiler to compile `stmt.c'. Here is how: + + mv /lib/cpp /lib/cpp.att + cp cpp /lib/cpp.gnu + echo '/lib/cpp.gnu -traditional ${1+"$@"}' > /lib/cpp + chmod +x /lib/cpp + + The system's compiler produces bad code for some of the GNU CC + optimization files. So you must build the stage 2 compiler without + optimization. Then build a stage 3 compiler with optimization. + That executable should work. Here are the necessary commands: + + make LANGUAGES=c CC=stage1/xgcc CFLAGS="-Bstage1/ -g" + make stage2 + make CC=stage2/xgcc CFLAGS="-Bstage2/ -g -O" + + You may need to raise the ULIMIT setting to build a C++ compiler, + as the file `cc1plus' is larger than one megabyte. + + +File: gcc.info, Node: Other Dir, Next: Cross-Compiler, Prev: Configurations, Up: Installation + +Compilation in a Separate Directory +=================================== + + If you wish to build the object files and executables in a directory +other than the one containing the source files, here is what you must +do differently: + + 1. Make sure you have a version of Make that supports the `VPATH' + feature. (GNU Make supports it, as do Make versions on most BSD + systems.) + + 2. If you have ever run `configure' in the source directory, you must + undo the configuration. Do this by running: + + make distclean + + 3. Go to the directory in which you want to build the compiler before + running `configure': + + mkdir gcc-sun3 + cd gcc-sun3 + + On systems that do not support symbolic links, this directory must + be on the same file system as the source code directory. + + 4. Specify where to find `configure' when you run it: + + ../gcc/configure ... + + This also tells `configure' where to find the compiler sources; + `configure' takes the directory from the file name that was used to + invoke it. But if you want to be sure, you can specify the source + directory with the `--srcdir' option, like this: + + ../gcc/configure --srcdir=../gcc OTHER OPTIONS + + The directory you specify with `--srcdir' need not be the same as + the one that `configure' is found in. + + Now, you can run `make' in that directory. You need not repeat the +configuration steps shown above, when ordinary source files change. You +must, however, run `configure' again when the configuration files +change, if your system does not support symbolic links. + + +File: gcc.info, Node: Cross-Compiler, Next: Sun Install, Prev: Other Dir, Up: Installation + +Building and Installing a Cross-Compiler +======================================== + + GNU CC can function as a cross-compiler for many machines, but not +all. + + * Cross-compilers for the Mips as target using the Mips assembler + currently do not work, because the auxiliary programs + `mips-tdump.c' and `mips-tfile.c' can't be compiled on anything + but a Mips. It does work to cross compile for a Mips if you use + the GNU assembler and linker. + + * Cross-compilers between machines with different floating point + formats have not all been made to work. GNU CC now has a floating + point emulator with which these can work, but each target machine + description needs to be updated to take advantage of it. + + * Cross-compilation between machines of different word sizes is + somewhat problematic and sometimes does not work. + + Since GNU CC generates assembler code, you probably need a +cross-assembler that GNU CC can run, in order to produce object files. +If you want to link on other than the target machine, you need a +cross-linker as well. You also need header files and libraries suitable +for the target machine that you can install on the host machine. + +* Menu: + +* Steps of Cross:: Using a cross-compiler involves several steps + that may be carried out on different machines. +* Configure Cross:: Configuring a cross-compiler. +* Tools and Libraries:: Where to put the linker and assembler, and the C library. +* Cross Headers:: Finding and installing header files + for a cross-compiler. +* Cross Runtime:: Supplying arithmetic runtime routines (`libgcc1.a'). +* Build Cross:: Actually compiling the cross-compiler. + + +File: gcc.info, Node: Steps of Cross, Next: Configure Cross, Up: Cross-Compiler + +Steps of Cross-Compilation +-------------------------- + + To compile and run a program using a cross-compiler involves several +steps: + + * Run the cross-compiler on the host machine to produce assembler + files for the target machine. This requires header files for the + target machine. + + * Assemble the files produced by the cross-compiler. You can do this + either with an assembler on the target machine, or with a + cross-assembler on the host machine. + + * Link those files to make an executable. You can do this either + with a linker on the target machine, or with a cross-linker on the + host machine. Whichever machine you use, you need libraries and + certain startup files (typically `crt....o') for the target + machine. + + It is most convenient to do all of these steps on the same host +machine, since then you can do it all with a single invocation of GNU +CC. This requires a suitable cross-assembler and cross-linker. For +some targets, the GNU assembler and linker are available. + + +File: gcc.info, Node: Configure Cross, Next: Tools and Libraries, Prev: Steps of Cross, Up: Cross-Compiler + +Configuring a Cross-Compiler +---------------------------- + + To build GNU CC as a cross-compiler, you start out by running +`configure'. Use the `--target=TARGET' to specify the target type. If +`configure' was unable to correctly identify the system you are running +on, also specify the `--build=BUILD' option. For example, here is how +to configure for a cross-compiler that produces code for an HP 68030 +system running BSD on a system that `configure' can correctly identify: + + ./configure --target=m68k-hp-bsd4.3 + + +File: gcc.info, Node: Tools and Libraries, Next: Cross Headers, Prev: Configure Cross, Up: Cross-Compiler + +Tools and Libraries for a Cross-Compiler +---------------------------------------- + + If you have a cross-assembler and cross-linker available, you should +install them now. Put them in the directory `/usr/local/TARGET/bin'. +Here is a table of the tools you should put in this directory: + +`as' + This should be the cross-assembler. + +`ld' + This should be the cross-linker. + +`ar' + This should be the cross-archiver: a program which can manipulate + archive files (linker libraries) in the target machine's format. + +`ranlib' + This should be a program to construct a symbol table in an archive + file. + + The installation of GNU CC will find these programs in that +directory, and copy or link them to the proper place to for the +cross-compiler to find them when run later. + + The easiest way to provide these files is to build the Binutils +package and GAS. Configure them with the same `--host' and `--target' +options that you use for configuring GNU CC, then build and install +them. They install their executables automatically into the proper +directory. Alas, they do not support all the targets that GNU CC +supports. + + If you want to install libraries to use with the cross-compiler, +such as a standard C library, put them in the directory +`/usr/local/TARGET/lib'; installation of GNU CC copies all the files in +that subdirectory into the proper place for GNU CC to find them and +link with them. Here's an example of copying some libraries from a +target machine: + + ftp TARGET-MACHINE + lcd /usr/local/TARGET/lib + cd /lib + get libc.a + cd /usr/lib + get libg.a + get libm.a + quit + +The precise set of libraries you'll need, and their locations on the +target machine, vary depending on its operating system. + + Many targets require "start files" such as `crt0.o' and `crtn.o' +which are linked into each executable; these too should be placed in +`/usr/local/TARGET/lib'. There may be several alternatives for +`crt0.o', for use with profiling or other compilation options. Check +your target's definition of `STARTFILE_SPEC' to find out what start +files it uses. Here's an example of copying these files from a target +machine: + + ftp TARGET-MACHINE + lcd /usr/local/TARGET/lib + prompt + cd /lib + mget *crt*.o + cd /usr/lib + mget *crt*.o + quit + diff --git a/usr/local/nachos/info/gcc.info-9 b/usr/local/nachos/info/gcc.info-9 new file mode 100644 index 0000000..f989d35 --- /dev/null +++ b/usr/local/nachos/info/gcc.info-9 @@ -0,0 +1,1230 @@ +This is Info file gcc.info, produced by Makeinfo version 1.68 from the +input file ../../gcc-2.95.2/gcc/gcc.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use and the internals of the GNU compiler. + + Published by the Free Software Foundation 59 Temple Place - Suite 330 +Boston, MA 02111-1307 USA + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999 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 sections entitled "GNU General Public License" and "Funding +for Free Software" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under +the terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "GNU General Public +License" and "Funding for Free Software", and this permission notice, +may be included in translations approved by the Free Software Foundation +instead of in the original English. + + +File: gcc.info, Node: Cross Runtime, Next: Build Cross, Prev: Cross Headers, Up: Cross-Compiler + +`libgcc.a' and Cross-Compilers +------------------------------ + + Code compiled by GNU CC uses certain runtime support functions +implicitly. Some of these functions can be compiled successfully with +GNU CC itself, but a few cannot be. These problem functions are in the +source file `libgcc1.c'; the library made from them is called +`libgcc1.a'. + + When you build a native compiler, these functions are compiled with +some other compiler-the one that you use for bootstrapping GNU CC. +Presumably it knows how to open code these operations, or else knows how +to call the run-time emulation facilities that the machine comes with. +But this approach doesn't work for building a cross-compiler. The +compiler that you use for building knows about the host system, not the +target system. + + So, when you build a cross-compiler you have to supply a suitable +library `libgcc1.a' that does the job it is expected to do. + + To compile `libgcc1.c' with the cross-compiler itself does not work. +The functions in this file are supposed to implement arithmetic +operations that GNU CC does not know how to open code for your target +machine. If these functions are compiled with GNU CC itself, they will +compile into infinite recursion. + + On any given target, most of these functions are not needed. If GNU +CC can open code an arithmetic operation, it will not call these +functions to perform the operation. It is possible that on your target +machine, none of these functions is needed. If so, you can supply an +empty library as `libgcc1.a'. + + Many targets need library support only for multiplication and +division. If you are linking with a library that contains functions for +multiplication and division, you can tell GNU CC to call them directly +by defining the macros `MULSI3_LIBCALL', and the like. These macros +need to be defined in the target description macro file. For some +targets, they are defined already. This may be sufficient to avoid the +need for libgcc1.a; if so, you can supply an empty library. + + Some targets do not have floating point instructions; they need other +functions in `libgcc1.a', which do floating arithmetic. Recent +versions of GNU CC have a file which emulates floating point. With a +certain amount of work, you should be able to construct a floating +point emulator that can be used as `libgcc1.a'. Perhaps future +versions will contain code to do this automatically and conveniently. +That depends on whether someone wants to implement it. + + Some embedded targets come with all the necessary `libgcc1.a' +routines written in C or assembler. These targets build `libgcc1.a' +automatically and you do not need to do anything special for them. +Other embedded targets do not need any `libgcc1.a' routines since all +the necessary operations are supported by the hardware. + + If your target system has another C compiler, you can configure GNU +CC as a native compiler on that machine, build just `libgcc1.a' with +`make libgcc1.a' on that machine, and use the resulting file with the +cross-compiler. To do this, execute the following on the target +machine: + + cd TARGET-BUILD-DIR + ./configure --host=sparc --target=sun3 + make libgcc1.a + +And then this on the host machine: + + ftp TARGET-MACHINE + binary + cd TARGET-BUILD-DIR + get libgcc1.a + quit + + Another way to provide the functions you need in `libgcc1.a' is to +define the appropriate `perform_...' macros for those functions. If +these definitions do not use the C arithmetic operators that they are +meant to implement, you should be able to compile them with the +cross-compiler you are building. (If these definitions already exist +for your target file, then you are all set.) + + To build `libgcc1.a' using the perform macros, use +`LIBGCC1=libgcc1.a OLDCC=./xgcc' when building the compiler. +Otherwise, you should place your replacement library under the name +`libgcc1.a' in the directory in which you will build the +cross-compiler, before you run `make'. + + +File: gcc.info, Node: Cross Headers, Next: Cross Runtime, Prev: Tools and Libraries, Up: Cross-Compiler + +Cross-Compilers and Header Files +-------------------------------- + + If you are cross-compiling a standalone program or a program for an +embedded system, then you may not need any header files except the few +that are part of GNU CC (and those of your program). However, if you +intend to link your program with a standard C library such as `libc.a', +then you probably need to compile with the header files that go with +the library you use. + + The GNU C compiler does not come with these files, because (1) they +are system-specific, and (2) they belong in a C library, not in a +compiler. + + If the GNU C library supports your target machine, then you can get +the header files from there (assuming you actually use the GNU library +when you link your program). + + If your target machine comes with a C compiler, it probably comes +with suitable header files also. If you make these files accessible +from the host machine, the cross-compiler can use them also. + + Otherwise, you're on your own in finding header files to use when +cross-compiling. + + When you have found suitable header files, put them in the directory +`/usr/local/TARGET/include', before building the cross compiler. Then +installation will run fixincludes properly and install the corrected +versions of the header files where the compiler will use them. + + Provide the header files before you build the cross-compiler, because +the build stage actually runs the cross-compiler to produce parts of +`libgcc.a'. (These are the parts that *can* be compiled with GNU CC.) +Some of them need suitable header files. + + Here's an example showing how to copy the header files from a target +machine. On the target machine, do this: + + (cd /usr/include; tar cf - .) > tarfile + + Then, on the host machine, do this: + + ftp TARGET-MACHINE + lcd /usr/local/TARGET/include + get tarfile + quit + tar xf tarfile + + +File: gcc.info, Node: Build Cross, Prev: Cross Runtime, Up: Cross-Compiler + +Actually Building the Cross-Compiler +------------------------------------ + + Now you can proceed just as for compiling a single-machine compiler +through the step of building stage 1. If you have not provided some +sort of `libgcc1.a', then compilation will give up at the point where +it needs that file, printing a suitable error message. If you do +provide `libgcc1.a', then building the compiler will automatically +compile and link a test program called `libgcc1-test'; if you get +errors in the linking, it means that not all of the necessary routines +in `libgcc1.a' are available. + + You must provide the header file `float.h'. One way to do this is +to compile `enquire' and run it on your target machine. The job of +`enquire' is to run on the target machine and figure out by experiment +the nature of its floating point representation. `enquire' records its +findings in the header file `float.h'. If you can't produce this file +by running `enquire' on the target machine, then you will need to come +up with a suitable `float.h' in some other way (or else, avoid using it +in your programs). + + Do not try to build stage 2 for a cross-compiler. It doesn't work to +rebuild GNU CC as a cross-compiler using the cross-compiler, because +that would produce a program that runs on the target machine, not on the +host. For example, if you compile a 386-to-68030 cross-compiler with +itself, the result will not be right either for the 386 (because it was +compiled into 68030 code) or for the 68030 (because it was configured +for a 386 as the host). If you want to compile GNU CC into 68030 code, +whether you compile it on a 68030 or with a cross-compiler on a 386, you +must specify a 68030 as the host when you configure it. + + To install the cross-compiler, use `make install', as usual. + + +File: gcc.info, Node: Sun Install, Next: VMS Install, Prev: Cross-Compiler, Up: Installation + +Installing GNU CC on the Sun +============================ + + On Solaris, do not use the linker or other tools in `/usr/ucb' to +build GNU CC. Use `/usr/ccs/bin'. + + If the assembler reports `Error: misaligned data' when bootstrapping, +you are probably using an obsolete version of the GNU assembler. +Upgrade to the latest version of GNU `binutils', or use the Solaris +assembler. + + Make sure the environment variable `FLOAT_OPTION' is not set when +you compile `libgcc.a'. If this option were set to `f68881' when +`libgcc.a' is compiled, the resulting code would demand to be linked +with a special startup file and would not link properly without special +pains. + + There is a bug in `alloca' in certain versions of the Sun library. +To avoid this bug, install the binaries of GNU CC that were compiled by +GNU CC. They use `alloca' as a built-in function and never the one in +the library. + + Some versions of the Sun compiler crash when compiling GNU CC. The +problem is a segmentation fault in cpp. This problem seems to be due to +the bulk of data in the environment variables. You may be able to avoid +it by using the following command to compile GNU CC with Sun CC: + + make CC="TERMCAP=x OBJS=x LIBFUNCS=x STAGESTUFF=x cc" + + SunOS 4.1.3 and 4.1.3_U1 have bugs that can cause intermittent core +dumps when compiling GNU CC. A common symptom is an internal compiler +error which does not recur if you run it again. To fix the problem, +install Sun recommended patch 100726 (for SunOS 4.1.3) or 101508 (for +SunOS 4.1.3_U1), or upgrade to a later SunOS release. + + +File: gcc.info, Node: VMS Install, Next: Collect2, Prev: Sun Install, Up: Installation + +Installing GNU CC on VMS +======================== + + The VMS version of GNU CC is distributed in a backup saveset +containing both source code and precompiled binaries. + + To install the `gcc' command so you can use the compiler easily, in +the same manner as you use the VMS C compiler, you must install the VMS +CLD file for GNU CC as follows: + + 1. Define the VMS logical names `GNU_CC' and `GNU_CC_INCLUDE' to + point to the directories where the GNU CC executables + (`gcc-cpp.exe', `gcc-cc1.exe', etc.) and the C include files are + kept respectively. This should be done with the commands: + + $ assign /system /translation=concealed - + disk:[gcc.] gnu_cc + $ assign /system /translation=concealed - + disk:[gcc.include.] gnu_cc_include + + with the appropriate disk and directory names. These commands can + be placed in your system startup file so they will be executed + whenever the machine is rebooted. You may, if you choose, do this + via the `GCC_INSTALL.COM' script in the `[GCC]' directory. + + 2. Install the `GCC' command with the command line: + + $ set command /table=sys$common:[syslib]dcltables - + /output=sys$common:[syslib]dcltables gnu_cc:[000000]gcc + $ install replace sys$common:[syslib]dcltables + + 3. To install the help file, do the following: + + $ library/help sys$library:helplib.hlb gcc.hlp + + Now you can invoke the compiler with a command like `gcc /verbose + file.c', which is equivalent to the command `gcc -v -c file.c' in + Unix. + + If you wish to use GNU C++ you must first install GNU CC, and then +perform the following steps: + + 1. Define the VMS logical name `GNU_GXX_INCLUDE' to point to the + directory where the preprocessor will search for the C++ header + files. This can be done with the command: + + $ assign /system /translation=concealed - + disk:[gcc.gxx_include.] gnu_gxx_include + + with the appropriate disk and directory name. If you are going to + be using a C++ runtime library, this is where its install + procedure will install its header files. + + 2. Obtain the file `gcc-cc1plus.exe', and place this in the same + directory that `gcc-cc1.exe' is kept. + + The GNU C++ compiler can be invoked with a command like `gcc /plus + /verbose file.cc', which is equivalent to the command `g++ -v -c + file.cc' in Unix. + + We try to put corresponding binaries and sources on the VMS +distribution tape. But sometimes the binaries will be from an older +version than the sources, because we don't always have time to update +them. (Use the `/version' option to determine the version number of +the binaries and compare it with the source file `version.c' to tell +whether this is so.) In this case, you should use the binaries you get +to recompile the sources. If you must recompile, here is how: + + 1. Execute the command procedure `vmsconfig.com' to set up the files + `tm.h', `config.h', `aux-output.c', and `md.', and to create files + `tconfig.h' and `hconfig.h'. This procedure also creates several + linker option files used by `make-cc1.com' and a data file used by + `make-l2.com'. + + $ @vmsconfig.com + + 2. Setup the logical names and command tables as defined above. In + addition, define the VMS logical name `GNU_BISON' to point at the + to the directories where the Bison executable is kept. This + should be done with the command: + + $ assign /system /translation=concealed - + disk:[bison.] gnu_bison + + You may, if you choose, use the `INSTALL_BISON.COM' script in the + `[BISON]' directory. + + 3. Install the `BISON' command with the command line: + + $ set command /table=sys$common:[syslib]dcltables - + /output=sys$common:[syslib]dcltables - + gnu_bison:[000000]bison + $ install replace sys$common:[syslib]dcltables + + 4. Type `@make-gcc' to recompile everything (alternatively, submit + the file `make-gcc.com' to a batch queue). If you wish to build + the GNU C++ compiler as well as the GNU CC compiler, you must + first edit `make-gcc.com' and follow the instructions that appear + in the comments. + + 5. In order to use GCC, you need a library of functions which GCC + compiled code will call to perform certain tasks, and these + functions are defined in the file `libgcc2.c'. To compile this + you should use the command procedure `make-l2.com', which will + generate the library `libgcc2.olb'. `libgcc2.olb' should be built + using the compiler built from the same distribution that + `libgcc2.c' came from, and `make-gcc.com' will automatically do + all of this for you. + + To install the library, use the following commands: + + $ library gnu_cc:[000000]gcclib/delete=(new,eprintf) + $ library gnu_cc:[000000]gcclib/delete=L_* + $ library libgcc2/extract=*/output=libgcc2.obj + $ library gnu_cc:[000000]gcclib libgcc2.obj + + The first command simply removes old modules that will be replaced + with modules from `libgcc2' under different module names. The + modules `new' and `eprintf' may not actually be present in your + `gcclib.olb'--if the VMS librarian complains about those modules + not being present, simply ignore the message and continue on with + the next command. The second command removes the modules that + came from the previous version of the library `libgcc2.c'. + + Whenever you update the compiler on your system, you should also + update the library with the above procedure. + + 6. You may wish to build GCC in such a way that no files are written + to the directory where the source files reside. An example would + be the when the source files are on a read-only disk. In these + cases, execute the following DCL commands (substituting your + actual path names): + + $ assign dua0:[gcc.build_dir.]/translation=concealed, - + dua1:[gcc.source_dir.]/translation=concealed gcc_build + $ set default gcc_build:[000000] + + where the directory `dua1:[gcc.source_dir]' contains the source + code, and the directory `dua0:[gcc.build_dir]' is meant to contain + all of the generated object files and executables. Once you have + done this, you can proceed building GCC as described above. (Keep + in mind that `gcc_build' is a rooted logical name, and thus the + device names in each element of the search list must be an actual + physical device name rather than another rooted logical name). + + 7. *If you are building GNU CC with a previous version of GNU CC, you + also should check to see that you have the newest version of the + assembler*. In particular, GNU CC version 2 treats global constant + variables slightly differently from GNU CC version 1, and GAS + version 1.38.1 does not have the patches required to work with GCC + version 2. If you use GAS 1.38.1, then `extern const' variables + will not have the read-only bit set, and the linker will generate + warning messages about mismatched psect attributes for these + variables. These warning messages are merely a nuisance, and can + safely be ignored. + + If you are compiling with a version of GNU CC older than 1.33, + specify `/DEFINE=("inline=")' as an option in all the + compilations. This requires editing all the `gcc' commands in + `make-cc1.com'. (The older versions had problems supporting + `inline'.) Once you have a working 1.33 or newer GNU CC, you can + change this file back. + + 8. If you want to build GNU CC with the VAX C compiler, you will need + to make minor changes in `make-cccp.com' and `make-cc1.com' to + choose alternate definitions of `CC', `CFLAGS', and `LIBS'. See + comments in those files. However, you must also have a working + version of the GNU assembler (GNU as, aka GAS) as it is used as + the back-end for GNU CC to produce binary object modules and is + not included in the GNU CC sources. GAS is also needed to compile + `libgcc2' in order to build `gcclib' (see above); `make-l2.com' + expects to be able to find it operational in + `gnu_cc:[000000]gnu-as.exe'. + + To use GNU CC on VMS, you need the VMS driver programs `gcc.exe', + `gcc.com', and `gcc.cld'. They are distributed with the VMS + binaries (`gcc-vms') rather than the GNU CC sources. GAS is also + included in `gcc-vms', as is Bison. + + Once you have successfully built GNU CC with VAX C, you should use + the resulting compiler to rebuild itself. Before doing this, be + sure to restore the `CC', `CFLAGS', and `LIBS' definitions in + `make-cccp.com' and `make-cc1.com'. The second generation + compiler will be able to take advantage of many optimizations that + must be suppressed when building with other compilers. + + Under previous versions of GNU CC, the generated code would +occasionally give strange results when linked with the sharable +`VAXCRTL' library. Now this should work. + + Even with this version, however, GNU CC itself should not be linked +with the sharable `VAXCRTL'. The version of `qsort' in `VAXCRTL' has a +bug (known to be present in VMS versions V4.6 through V5.5) which +causes the compiler to fail. + + The executables are generated by `make-cc1.com' and `make-cccp.com' +use the object library version of `VAXCRTL' in order to make use of the +`qsort' routine in `gcclib.olb'. If you wish to link the compiler +executables with the shareable image version of `VAXCRTL', you should +edit the file `tm.h' (created by `vmsconfig.com') to define the macro +`QSORT_WORKAROUND'. + + `QSORT_WORKAROUND' is always defined when GNU CC is compiled with +VAX C, to avoid a problem in case `gcclib.olb' is not yet available. + + +File: gcc.info, Node: Collect2, Next: Header Dirs, Prev: VMS Install, Up: Installation + +`collect2' +========== + + GNU CC uses a utility called `collect2' on nearly all systems to +arrange to call various initialization functions at start time. + + The program `collect2' works by linking the program once and looking +through the linker output file for symbols with particular names +indicating they are constructor functions. If it finds any, it creates +a new temporary `.c' file containing a table of them, compiles it, and +links the program a second time including that file. + + The actual calls to the constructors are carried out by a subroutine +called `__main', which is called (automatically) at the beginning of +the body of `main' (provided `main' was compiled with GNU CC). Calling +`__main' is necessary, even when compiling C code, to allow linking C +and C++ object code together. (If you use `-nostdlib', you get an +unresolved reference to `__main', since it's defined in the standard +GCC library. Include `-lgcc' at the end of your compiler command line +to resolve this reference.) + + The program `collect2' is installed as `ld' in the directory where +the passes of the compiler are installed. When `collect2' needs to +find the *real* `ld', it tries the following file names: + + * `real-ld' in the directories listed in the compiler's search + directories. + + * `real-ld' in the directories listed in the environment variable + `PATH'. + + * The file specified in the `REAL_LD_FILE_NAME' configuration macro, + if specified. + + * `ld' in the compiler's search directories, except that `collect2' + will not execute itself recursively. + + * `ld' in `PATH'. + + "The compiler's search directories" means all the directories where +`gcc' searches for passes of the compiler. This includes directories +that you specify with `-B'. + + Cross-compilers search a little differently: + + * `real-ld' in the compiler's search directories. + + * `TARGET-real-ld' in `PATH'. + + * The file specified in the `REAL_LD_FILE_NAME' configuration macro, + if specified. + + * `ld' in the compiler's search directories. + + * `TARGET-ld' in `PATH'. + + `collect2' explicitly avoids running `ld' using the file name under +which `collect2' itself was invoked. In fact, it remembers up a list +of such names--in case one copy of `collect2' finds another copy (or +version) of `collect2' installed as `ld' in a second place in the +search path. + + `collect2' searches for the utilities `nm' and `strip' using the +same algorithm as above for `ld'. + + +File: gcc.info, Node: Header Dirs, Prev: Collect2, Up: Installation + +Standard Header File Directories +================================ + + `GCC_INCLUDE_DIR' means the same thing for native and cross. It is +where GNU CC stores its private include files, and also where GNU CC +stores the fixed include files. A cross compiled GNU CC runs +`fixincludes' on the header files in `$(tooldir)/include'. (If the +cross compilation header files need to be fixed, they must be installed +before GNU CC is built. If the cross compilation header files are +already suitable for ANSI C and GNU CC, nothing special need be done). + + `GPLUSPLUS_INCLUDE_DIR' means the same thing for native and cross. +It is where `g++' looks first for header files. The C++ library +installs only target independent header files in that directory. + + `LOCAL_INCLUDE_DIR' is used only for a native compiler. It is +normally `/usr/local/include'. GNU CC searches this directory so that +users can install header files in `/usr/local/include'. + + `CROSS_INCLUDE_DIR' is used only for a cross compiler. GNU CC +doesn't install anything there. + + `TOOL_INCLUDE_DIR' is used for both native and cross compilers. It +is the place for other packages to install header files that GNU CC will +use. For a cross-compiler, this is the equivalent of `/usr/include'. +When you build a cross-compiler, `fixincludes' processes any header +files in this directory. + + +File: gcc.info, Node: C Extensions, Next: C++ Extensions, Prev: Installation, Up: Top + +Extensions to the C Language Family +*********************************** + + GNU C provides several language features not found in ANSI standard +C. (The `-pedantic' option directs GNU CC to print a warning message if +any of these features is used.) To test for the availability of these +features in conditional compilation, check for a predefined macro +`__GNUC__', which is always defined under GNU CC. + + These extensions are available in C and Objective C. Most of them +are also available in C++. *Note Extensions to the C++ Language: C++ +Extensions, for extensions that apply *only* to C++. + +* Menu: + +* Statement Exprs:: Putting statements and declarations inside expressions. +* Local Labels:: Labels local to a statement-expression. +* Labels as Values:: Getting pointers to labels, and computed gotos. +* Nested Functions:: As in Algol and Pascal, lexical scoping of functions. +* Constructing Calls:: Dispatching a call to another function. +* Naming Types:: Giving a name to the type of some expression. +* Typeof:: `typeof': referring to the type of an expression. +* Lvalues:: Using `?:', `,' and casts in lvalues. +* Conditionals:: Omitting the middle operand of a `?:' expression. +* Long Long:: Double-word integers--`long long int'. +* Complex:: Data types for complex numbers. +* Hex Floats:: Hexadecimal floating-point constants. +* Zero Length:: Zero-length arrays. +* Variable Length:: Arrays whose length is computed at run time. +* Macro Varargs:: Macros with variable number of arguments. +* Subscripting:: Any array can be subscripted, even if not an lvalue. +* Pointer Arith:: Arithmetic on `void'-pointers and function pointers. +* Initializers:: Non-constant initializers. +* Constructors:: Constructor expressions give structures, unions + or arrays as values. +* Labeled Elements:: Labeling elements of initializers. +* Cast to Union:: Casting to union type from any member of the union. +* Case Ranges:: `case 1 ... 9' and such. +* Function Attributes:: Declaring that functions have no side effects, + or that they can never return. +* Function Prototypes:: Prototype declarations and old-style definitions. +* C++ Comments:: C++ comments are recognized. +* Dollar Signs:: Dollar sign is allowed in identifiers. +* Character Escapes:: `\e' stands for the character . +* Variable Attributes:: Specifying attributes of variables. +* Type Attributes:: Specifying attributes of types. +* Alignment:: Inquiring about the alignment of a type or variable. +* Inline:: Defining inline functions (as fast as macros). +* Extended Asm:: Assembler instructions with C expressions as operands. + (With them you can define "built-in" functions.) +* Asm Labels:: Specifying the assembler name to use for a C symbol. +* Explicit Reg Vars:: Defining variables residing in specified registers. +* Alternate Keywords:: `__const__', `__asm__', etc., for header files. +* Incomplete Enums:: `enum foo;', with details to follow. +* Function Names:: Printable strings which are the name of the current + function. +* Return Address:: Getting the return or frame address of a function. +* Other Builtins:: Other built-in functions. +* Deprecated Features:: Things might disappear from g++. + + +File: gcc.info, Node: Statement Exprs, Next: Local Labels, Up: C Extensions + +Statements and Declarations in Expressions +========================================== + + A compound statement enclosed in parentheses may appear as an +expression in GNU C. This allows you to use loops, switches, and local +variables within an expression. + + Recall that a compound statement is a sequence of statements +surrounded by braces; in this construct, parentheses go around the +braces. For example: + + ({ int y = foo (); int z; + if (y > 0) z = y; + else z = - y; + z; }) + +is a valid (though slightly more complex than necessary) expression for +the absolute value of `foo ()'. + + The last thing in the compound statement should be an expression +followed by a semicolon; the value of this subexpression serves as the +value of the entire construct. (If you use some other kind of statement +last within the braces, the construct has type `void', and thus +effectively no value.) + + This feature is especially useful in making macro definitions "safe" +(so that they evaluate each operand exactly once). For example, the +"maximum" function is commonly defined as a macro in standard C as +follows: + + #define max(a,b) ((a) > (b) ? (a) : (b)) + +But this definition computes either A or B twice, with bad results if +the operand has side effects. In GNU C, if you know the type of the +operands (here let's assume `int'), you can define the macro safely as +follows: + + #define maxint(a,b) \ + ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) + + Embedded statements are not allowed in constant expressions, such as +the value of an enumeration constant, the width of a bit field, or the +initial value of a static variable. + + If you don't know the type of the operand, you can still do this, +but you must use `typeof' (*note Typeof::.) or type naming (*note +Naming Types::.). + + +File: gcc.info, Node: Local Labels, Next: Labels as Values, Prev: Statement Exprs, Up: C Extensions + +Locally Declared Labels +======================= + + Each statement expression is a scope in which "local labels" can be +declared. A local label is simply an identifier; you can jump to it +with an ordinary `goto' statement, but only from within the statement +expression it belongs to. + + A local label declaration looks like this: + + __label__ LABEL; + +or + + __label__ LABEL1, LABEL2, ...; + + Local label declarations must come at the beginning of the statement +expression, right after the `({', before any ordinary declarations. + + The label declaration defines the label *name*, but does not define +the label itself. You must do this in the usual way, with `LABEL:', +within the statements of the statement expression. + + The local label feature is useful because statement expressions are +often used in macros. If the macro contains nested loops, a `goto' can +be useful for breaking out of them. However, an ordinary label whose +scope is the whole function cannot be used: if the macro can be +expanded several times in one function, the label will be multiply +defined in that function. A local label avoids this problem. For +example: + + #define SEARCH(array, target) \ + ({ \ + __label__ found; \ + typeof (target) _SEARCH_target = (target); \ + typeof (*(array)) *_SEARCH_array = (array); \ + int i, j; \ + int value; \ + for (i = 0; i < max; i++) \ + for (j = 0; j < max; j++) \ + if (_SEARCH_array[i][j] == _SEARCH_target) \ + { value = i; goto found; } \ + value = -1; \ + found: \ + value; \ + }) + + +File: gcc.info, Node: Labels as Values, Next: Nested Functions, Prev: Local Labels, Up: C Extensions + +Labels as Values +================ + + You can get the address of a label defined in the current function +(or a containing function) with the unary operator `&&'. The value has +type `void *'. This value is a constant and can be used wherever a +constant of that type is valid. For example: + + void *ptr; + ... + ptr = &&foo; + + To use these values, you need to be able to jump to one. This is +done with the computed goto statement(1), `goto *EXP;'. For example, + + goto *ptr; + +Any expression of type `void *' is allowed. + + One way of using these constants is in initializing a static array +that will serve as a jump table: + + static void *array[] = { &&foo, &&bar, &&hack }; + + Then you can select a label with indexing, like this: + + goto *array[i]; + +Note that this does not check whether the subscript is in bounds--array +indexing in C never does that. + + Such an array of label values serves a purpose much like that of the +`switch' statement. The `switch' statement is cleaner, so use that +rather than an array unless the problem does not fit a `switch' +statement very well. + + Another use of label values is in an interpreter for threaded code. +The labels within the interpreter function can be stored in the +threaded code for super-fast dispatching. + + You can use this mechanism to jump to code in a different function. +If you do that, totally unpredictable things will happen. The best way +to avoid this is to store the label address only in automatic variables +and never pass it as an argument. + + ---------- Footnotes ---------- + + (1) The analogous feature in Fortran is called an assigned goto, but +that name seems inappropriate in C, where one can do more than simply +store label addresses in label variables. + + +File: gcc.info, Node: Nested Functions, Next: Constructing Calls, Prev: Labels as Values, Up: C Extensions + +Nested Functions +================ + + A "nested function" is a function defined inside another function. +(Nested functions are not supported for GNU C++.) The nested function's +name is local to the block where it is defined. For example, here we +define a nested function named `square', and call it twice: + + foo (double a, double b) + { + double square (double z) { return z * z; } + + return square (a) + square (b); + } + + The nested function can access all the variables of the containing +function that are visible at the point of its definition. This is +called "lexical scoping". For example, here we show a nested function +which uses an inherited variable named `offset': + + bar (int *array, int offset, int size) + { + int access (int *array, int index) + { return array[index + offset]; } + int i; + ... + for (i = 0; i < size; i++) + ... access (array, i) ... + } + + Nested function definitions are permitted within functions in the +places where variable definitions are allowed; that is, in any block, +before the first statement in the block. + + It is possible to call the nested function from outside the scope of +its name by storing its address or passing the address to another +function: + + hack (int *array, int size) + { + void store (int index, int value) + { array[index] = value; } + + intermediate (store, size); + } + + Here, the function `intermediate' receives the address of `store' as +an argument. If `intermediate' calls `store', the arguments given to +`store' are used to store into `array'. But this technique works only +so long as the containing function (`hack', in this example) does not +exit. + + If you try to call the nested function through its address after the +containing function has exited, all hell will break loose. If you try +to call it after a containing scope level has exited, and if it refers +to some of the variables that are no longer in scope, you may be lucky, +but it's not wise to take the risk. If, however, the nested function +does not refer to anything that has gone out of scope, you should be +safe. + + GNU CC implements taking the address of a nested function using a +technique called "trampolines". A paper describing them is available +as `http://master.debian.org/~karlheg/Usenix88-lexic.pdf'. + + A nested function can jump to a label inherited from a containing +function, provided the label was explicitly declared in the containing +function (*note Local Labels::.). Such a jump returns instantly to the +containing function, exiting the nested function which did the `goto' +and any intermediate functions as well. Here is an example: + + bar (int *array, int offset, int size) + { + __label__ failure; + int access (int *array, int index) + { + if (index > size) + goto failure; + return array[index + offset]; + } + int i; + ... + for (i = 0; i < size; i++) + ... access (array, i) ... + ... + return 0; + + /* Control comes here from `access' + if it detects an error. */ + failure: + return -1; + } + + A nested function always has internal linkage. Declaring one with +`extern' is erroneous. If you need to declare the nested function +before its definition, use `auto' (which is otherwise meaningless for +function declarations). + + bar (int *array, int offset, int size) + { + __label__ failure; + auto int access (int *, int); + ... + int access (int *array, int index) + { + if (index > size) + goto failure; + return array[index + offset]; + } + ... + } + + +File: gcc.info, Node: Constructing Calls, Next: Naming Types, Prev: Nested Functions, Up: C Extensions + +Constructing Function Calls +=========================== + + Using the built-in functions described below, you can record the +arguments a function received, and call another function with the same +arguments, without knowing the number or types of the arguments. + + You can also record the return value of that function call, and +later return that value, without knowing what data type the function +tried to return (as long as your caller expects that data type). + +`__builtin_apply_args ()' + This built-in function returns a pointer of type `void *' to data + describing how to perform a call with the same arguments as were + passed to the current function. + + The function saves the arg pointer register, structure value + address, and all registers that might be used to pass arguments to + a function into a block of memory allocated on the stack. Then it + returns the address of that block. + +`__builtin_apply (FUNCTION, ARGUMENTS, SIZE)' + This built-in function invokes FUNCTION (type `void (*)()') with a + copy of the parameters described by ARGUMENTS (type `void *') and + SIZE (type `int'). + + The value of ARGUMENTS should be the value returned by + `__builtin_apply_args'. The argument SIZE specifies the size of + the stack argument data, in bytes. + + This function returns a pointer of type `void *' to data describing + how to return whatever value was returned by FUNCTION. The data + is saved in a block of memory allocated on the stack. + + It is not always simple to compute the proper value for SIZE. The + value is used by `__builtin_apply' to compute the amount of data + that should be pushed on the stack and copied from the incoming + argument area. + +`__builtin_return (RESULT)' + This built-in function returns the value described by RESULT from + the containing function. You should specify, for RESULT, a value + returned by `__builtin_apply'. + + +File: gcc.info, Node: Naming Types, Next: Typeof, Prev: Constructing Calls, Up: C Extensions + +Naming an Expression's Type +=========================== + + You can give a name to the type of an expression using a `typedef' +declaration with an initializer. Here is how to define NAME as a type +name for the type of EXP: + + typedef NAME = EXP; + + This is useful in conjunction with the statements-within-expressions +feature. Here is how the two together can be used to define a safe +"maximum" macro that operates on any arithmetic type: + + #define max(a,b) \ + ({typedef _ta = (a), _tb = (b); \ + _ta _a = (a); _tb _b = (b); \ + _a > _b ? _a : _b; }) + + The reason for using names that start with underscores for the local +variables is to avoid conflicts with variable names that occur within +the expressions that are substituted for `a' and `b'. Eventually we +hope to design a new form of declaration syntax that allows you to +declare variables whose scopes start only after their initializers; +this will be a more reliable way to prevent such conflicts. + + +File: gcc.info, Node: Typeof, Next: Lvalues, Prev: Naming Types, Up: C Extensions + +Referring to a Type with `typeof' +================================= + + Another way to refer to the type of an expression is with `typeof'. +The syntax of using of this keyword looks like `sizeof', but the +construct acts semantically like a type name defined with `typedef'. + + There are two ways of writing the argument to `typeof': with an +expression or with a type. Here is an example with an expression: + + typeof (x[0](1)) + +This assumes that `x' is an array of functions; the type described is +that of the values of the functions. + + Here is an example with a typename as the argument: + + typeof (int *) + +Here the type described is that of pointers to `int'. + + If you are writing a header file that must work when included in +ANSI C programs, write `__typeof__' instead of `typeof'. *Note +Alternate Keywords::. + + A `typeof'-construct can be used anywhere a typedef name could be +used. For example, you can use it in a declaration, in a cast, or +inside of `sizeof' or `typeof'. + + * This declares `y' with the type of what `x' points to. + + typeof (*x) y; + + * This declares `y' as an array of such values. + + typeof (*x) y[4]; + + * This declares `y' as an array of pointers to characters: + + typeof (typeof (char *)[4]) y; + + It is equivalent to the following traditional C declaration: + + char *y[4]; + + To see the meaning of the declaration using `typeof', and why it + might be a useful way to write, let's rewrite it with these macros: + + #define pointer(T) typeof(T *) + #define array(T, N) typeof(T [N]) + + Now the declaration can be rewritten this way: + + array (pointer (char), 4) y; + + Thus, `array (pointer (char), 4)' is the type of arrays of 4 + pointers to `char'. + + +File: gcc.info, Node: Lvalues, Next: Conditionals, Prev: Typeof, Up: C Extensions + +Generalized Lvalues +=================== + + Compound expressions, conditional expressions and casts are allowed +as lvalues provided their operands are lvalues. This means that you +can take their addresses or store values into them. + + Standard C++ allows compound expressions and conditional expressions +as lvalues, and permits casts to reference type, so use of this +extension is deprecated for C++ code. + + For example, a compound expression can be assigned, provided the last +expression in the sequence is an lvalue. These two expressions are +equivalent: + + (a, b) += 5 + a, (b += 5) + + Similarly, the address of the compound expression can be taken. +These two expressions are equivalent: + + &(a, b) + a, &b + + A conditional expression is a valid lvalue if its type is not void +and the true and false branches are both valid lvalues. For example, +these two expressions are equivalent: + + (a ? b : c) = 5 + (a ? b = 5 : (c = 5)) + + A cast is a valid lvalue if its operand is an lvalue. A simple +assignment whose left-hand side is a cast works by converting the +right-hand side first to the specified type, then to the type of the +inner left-hand side expression. After this is stored, the value is +converted back to the specified type to become the value of the +assignment. Thus, if `a' has type `char *', the following two +expressions are equivalent: + + (int)a = 5 + (int)(a = (char *)(int)5) + + An assignment-with-arithmetic operation such as `+=' applied to a +cast performs the arithmetic using the type resulting from the cast, +and then continues as in the previous case. Therefore, these two +expressions are equivalent: + + (int)a += 5 + (int)(a = (char *)(int) ((int)a + 5)) + + You cannot take the address of an lvalue cast, because the use of its +address would not work out coherently. Suppose that `&(int)f' were +permitted, where `f' has type `float'. Then the following statement +would try to store an integer bit-pattern where a floating point number +belongs: + + *&(int)f = 1; + + This is quite different from what `(int)f = 1' would do--that would +convert 1 to floating point and store it. Rather than cause this +inconsistency, we think it is better to prohibit use of `&' on a cast. + + If you really do want an `int *' pointer with the address of `f', +you can simply write `(int *)&f'. + + +File: gcc.info, Node: Conditionals, Next: Long Long, Prev: Lvalues, Up: C Extensions + +Conditionals with Omitted Operands +================================== + + The middle operand in a conditional expression may be omitted. Then +if the first operand is nonzero, its value is the value of the +conditional expression. + + Therefore, the expression + + x ? : y + +has the value of `x' if that is nonzero; otherwise, the value of `y'. + + This example is perfectly equivalent to + + x ? x : y + +In this simple case, the ability to omit the middle operand is not +especially useful. When it becomes useful is when the first operand +does, or may (if it is a macro argument), contain a side effect. Then +repeating the operand in the middle would perform the side effect +twice. Omitting the middle operand uses the value already computed +without the undesirable effects of recomputing it. + + +File: gcc.info, Node: Long Long, Next: Complex, Prev: Conditionals, Up: C Extensions + +Double-Word Integers +==================== + + GNU C supports data types for integers that are twice as long as +`int'. Simply write `long long int' for a signed integer, or `unsigned +long long int' for an unsigned integer. To make an integer constant of +type `long long int', add the suffix `LL' to the integer. To make an +integer constant of type `unsigned long long int', add the suffix `ULL' +to the integer. + + You can use these types in arithmetic like any other integer types. +Addition, subtraction, and bitwise boolean operations on these types +are open-coded on all types of machines. Multiplication is open-coded +if the machine supports fullword-to-doubleword a widening multiply +instruction. Division and shifts are open-coded only on machines that +provide special support. The operations that are not open-coded use +special library routines that come with GNU CC. + + There may be pitfalls when you use `long long' types for function +arguments, unless you declare function prototypes. If a function +expects type `int' for its argument, and you pass a value of type `long +long int', confusion will result because the caller and the subroutine +will disagree about the number of bytes for the argument. Likewise, if +the function expects `long long int' and you pass `int'. The best way +to avoid such problems is to use prototypes. + + +File: gcc.info, Node: Complex, Next: Hex Floats, Prev: Long Long, Up: C Extensions + +Complex Numbers +=============== + + GNU C supports complex data types. You can declare both complex +integer types and complex floating types, using the keyword +`__complex__'. + + For example, `__complex__ double x;' declares `x' as a variable +whose real part and imaginary part are both of type `double'. +`__complex__ short int y;' declares `y' to have real and imaginary +parts of type `short int'; this is not likely to be useful, but it +shows that the set of complex types is complete. + + To write a constant with a complex data type, use the suffix `i' or +`j' (either one; they are equivalent). For example, `2.5fi' has type +`__complex__ float' and `3i' has type `__complex__ int'. Such a +constant always has a pure imaginary value, but you can form any +complex value you like by adding one to a real constant. + + To extract the real part of a complex-valued expression EXP, write +`__real__ EXP'. Likewise, use `__imag__' to extract the imaginary part. + + The operator `~' performs complex conjugation when used on a value +with a complex type. + + GNU CC can allocate complex automatic variables in a noncontiguous +fashion; it's even possible for the real part to be in a register while +the imaginary part is on the stack (or vice-versa). None of the +supported debugging info formats has a way to represent noncontiguous +allocation like this, so GNU CC describes a noncontiguous complex +variable as if it were two separate variables of noncomplex type. If +the variable's actual name is `foo', the two fictitious variables are +named `foo$real' and `foo$imag'. You can examine and set these two +fictitious variables with your debugger. + + A future version of GDB will know how to recognize such pairs and +treat them as a single variable with a complex type. + + +File: gcc.info, Node: Hex Floats, Next: Zero Length, Prev: Complex, Up: C Extensions + +Hex Floats +========== + + GNU CC recognizes floating-point numbers written not only in the +usual decimal notation, such as `1.55e1', but also numbers such as +`0x1.fp3' written in hexadecimal format. In that format the `0x' hex +introducer and the `p' or `P' exponent field are mandatory. The +exponent is a decimal number that indicates the power of 2 by which the +significand part will be multiplied. Thus `0x1.f' is 1 15/16, `p3' +multiplies it by 8, and the value of `0x1.fp3' is the same as `1.55e1'. + + Unlike for floating-point numbers in the decimal notation the +exponent is always required in the hexadecimal notation. Otherwise the +compiler would not be able to resolve the ambiguity of, e.g., `0x1.f'. +This could mean `1.0f' or `1.9375' since `f' is also the extension for +floating-point constants of type `float'. + + +File: gcc.info, Node: Zero Length, Next: Variable Length, Prev: Hex Floats, Up: C Extensions + +Arrays of Length Zero +===================== + + Zero-length arrays are allowed in GNU C. They are very useful as +the last element of a structure which is really a header for a +variable-length object: + + struct line { + int length; + char contents[0]; + }; + + { + struct line *thisline = (struct line *) + malloc (sizeof (struct line) + this_length); + thisline->length = this_length; + } + + In standard C, you would have to give `contents' a length of 1, which +means either you waste space or complicate the argument to `malloc'. + diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/SYSCALLS.c.X b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/SYSCALLS.c.X new file mode 100644 index 0000000..795523d --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/SYSCALLS.c.X @@ -0,0 +1,1351 @@ +/* compiled from: . */ +/* SYSCALLS.c:241:OC */ extern int TLappend (/* ??? */); +/* SYSCALLS.c:242:OC */ extern int TLassign (/* ??? */); +/* SYSCALLS.c:243:OC */ extern int TLclose (/* ??? */); +/* SYSCALLS.c:244:OC */ extern int TLdelete (/* ??? */); +/* SYSCALLS.c:245:OC */ extern int TLfreeentry (/* ??? */); +/* SYSCALLS.c:246:OC */ extern ENTRY TLgetentry (/* ??? */); +/* SYSCALLS.c:247:OC */ extern unsigned char *TLgetfield (/* ??? */); +/* SYSCALLS.c:248:OC */ extern int TLopen (/* ??? */); +/* SYSCALLS.c:249:OC */ extern int TLread (/* ??? */); +/* SYSCALLS.c:250:OC */ extern int TLsearch1 (/* ??? */); +/* SYSCALLS.c:251:OC */ extern int TLsubst (/* ??? */); +/* SYSCALLS.c:252:OC */ extern int TLsync (/* ??? */); +/* SYSCALLS.c:253:OC */ extern int TLwrite (/* ??? */); +/* SYSCALLS.c:254:NC */ extern int __acancel (int, const long int *, int); +/* SYSCALLS.c:255:NC */ extern int __aread (int, int, char *, uint, ecb_t *); +/* SYSCALLS.c:256:NC */ extern void __assert (const char *, const char *, int); +/* SYSCALLS.c:257:NC */ extern int __asyncio (int, aioop_t *, int); +/* SYSCALLS.c:258:NC */ extern int __awrite (int, int, char *, uint, ecb_t *); +/* SYSCALLS.c:259:NC */ extern void __eprintf (const char *); +/* SYSCALLS.c:260:NC */ extern int __evcntl (evver_t, evcntlcmds_t, long int, long int); +/* SYSCALLS.c:261:NC */ extern int __evexit (evver_t, idtype_t, id_t, const ecb_t *); +/* SYSCALLS.c:262:NC */ extern int __evexitset (evver_t, const procset_t *, hostid_t, const ecb_t *); +/* SYSCALLS.c:263:NC */ extern int __evpoll (evver_t, evpollcmds_t, event_t *, int, const hrtime_t *); +/* SYSCALLS.c:264:NC */ extern int __evpollmore (evver_t, event_t *, int); +/* SYSCALLS.c:265:NC */ extern int __evpost (evver_t, event_t *, int, int); +/* SYSCALLS.c:266:NC */ extern int __evqcntl (evver_t, int, evqcntlcmds_t, long int); +/* SYSCALLS.c:267:NC */ extern int __evsig (evver_t, const sigset_t *, const ecb_t *, evsiginfo_t *, int); +/* SYSCALLS.c:268:NC */ extern int __evtrap (evver_t, evpollcmds_t, event_t *, int, long int, void (*) (event_t *, int, long int, evcontext_t *), const evta_t *); +/* SYSCALLS.c:269:NC */ extern int __evtrapcancel (evver_t, long int *, int); +/* SYSCALLS.c:270:NC */ extern int __filbuf (FILE *); +/* SYSCALLS.c:271:NC */ extern int __flsbuf (int, FILE *); +/* SYSCALLS.c:272:NC */ extern major_t __major (int, dev_t); +/* SYSCALLS.c:273:NC */ extern dev_t __makedev (int, major_t, minor_t); +/* SYSCALLS.c:274:NC */ extern minor_t __minor (int, dev_t); +/* SYSCALLS.c:275:OC */ extern long int __priocntl (/* ??? */); +/* SYSCALLS.c:276:OC */ extern long int __priocntlset (/* ??? */); +/* SYSCALLS.c:277:NC */ extern void _exit (int); +/* SYSCALLS.c:278:NC */ extern int _filbuf (FILE *); +/* SYSCALLS.c:279:NC */ extern int _flsbuf (unsigned int, FILE *); +/* SYSCALLS.c:280:NC */ extern int _fxstat (int, int, struct stat *); +/* SYSCALLS.c:281:OC */ extern u_long _getlong (/* ??? */); +/* SYSCALLS.c:282:OC */ extern u_short _getshort (/* ??? */); +/* SYSCALLS.c:283:NC */ extern int _getsyx (int *, int *); +/* SYSCALLS.c:284:NC */ extern int _longjmp (jmp_buf, int); +/* SYSCALLS.c:285:NC */ extern int _lxstat (int, const char *, struct stat *); +/* SYSCALLS.c:286:NC */ extern int _meta (int); +/* SYSCALLS.c:287:NC */ extern struct nd_hostservlist _netdir_getbyaddr (struct netconfig *, struct netbuf *); +/* SYSCALLS.c:288:NC */ extern struct nd_addrlist *_netdir_getbyname (struct netconfig *, struct nd_hostserv *); +/* SYSCALLS.c:289:NC */ extern int _overlay (WINDOW *, WINDOW *, int); +/* SYSCALLS.c:290:NC */ extern int _ring (int); +/* SYSCALLS.c:291:OC */ extern int _rpc_dtbsize (/* ??? */); +/* SYSCALLS.c:292:OC */ extern int _rpc_endconf (/* ??? */); +/* SYSCALLS.c:293:OC */ extern u_int _rpc_get_a_size (/* ??? */); +/* SYSCALLS.c:294:OC */ extern u_int _rpc_get_t_size (/* ??? */); +/* SYSCALLS.c:295:OC */ extern struct netconfig *_rpc_getconf (/* ??? */); +/* SYSCALLS.c:296:OC */ extern struct netconfig *_rpc_getconfip (/* ??? */); +/* SYSCALLS.c:297:OC */ extern char *_rpc_gethostname (/* ??? */); +/* SYSCALLS.c:298:OC */ extern int _rpc_setconf (/* ??? */); +/* SYSCALLS.c:299:OC */ extern void _s_aligned_copy (/* ??? */); +/* SYSCALLS.c:300:OC */ extern struct _si_user *_s_checkfd (/* ??? */); +/* SYSCALLS.c:301:OC */ extern void _s_close (/* ??? */); +/* SYSCALLS.c:302:OC */ extern int _s_do_ioctl (/* ??? */); +/* SYSCALLS.c:303:OC */ extern int _s_getfamily (/* ??? */); +/* SYSCALLS.c:304:OC */ extern int _s_getudata (/* ??? */); +/* SYSCALLS.c:305:OC */ extern int _s_is_ok (/* ??? */); +/* SYSCALLS.c:306:OC */ extern struct netconfig *_s_match (/* ??? */); +/* SYSCALLS.c:307:OC */ extern int _s_max (/* ??? */); +/* SYSCALLS.c:308:OC */ extern int _s_min (/* ??? */); +/* SYSCALLS.c:309:OC */ extern struct _si_user *_s_open (/* ??? */); +/* SYSCALLS.c:310:OC */ extern int _s_soreceive (/* ??? */); +/* SYSCALLS.c:311:OC */ extern int _s_sosend (/* ??? */); +/* SYSCALLS.c:312:OC */ extern int _s_uxpathlen (/* ??? */); +/* SYSCALLS.c:313:NC */ extern int _setecho (int); +/* SYSCALLS.c:314:NC */ extern int _setjmp (jmp_buf); +/* SYSCALLS.c:315:NC */ extern int _setnonl (int); +/* SYSCALLS.c:316:NC */ extern void _setqiflush (int); +/* SYSCALLS.c:317:NC */ extern char *_taddr2uaddr (struct netconfig *, struct netbuf *); +/* SYSCALLS.c:318:NC */ extern int _tolower (int); +/* SYSCALLS.c:319:NC */ extern int _toupper (int); +/* SYSCALLS.c:320:NC */ extern struct netbuf *_uaddr2taddr (struct netconfig *, char *); +/* SYSCALLS.c:321:OC */ extern bool _xdr_yprequest (/* ??? */); +/* SYSCALLS.c:322:OC */ extern bool _xdr_ypresponse (/* ??? */); +/* SYSCALLS.c:323:NC */ extern int _xftw (int, const char *, int (*) (const char *, const struct stat *, int), int); +/* SYSCALLS.c:324:NC */ extern int _xmknod (int, const char *, mode_t, dev_t); +/* SYSCALLS.c:325:NC */ extern int _xstat (int, const char *, struct stat *); +/* SYSCALLS.c:326:OC */ extern int _yp_dobind (/* ??? */); +/* SYSCALLS.c:327:NC */ extern long int a64l (const char *); +/* SYSCALLS.c:328:NC */ extern char *aatos (char *, struct address *, int); +/* SYSCALLS.c:329:NC */ extern void abort (void); +/* SYSCALLS.c:330:NC */ extern int abs (int); +/* SYSCALLS.c:331:NC */ extern int access (const char *, int); +/* SYSCALLS.c:332:NC */ extern int acct (const char *); +/* SYSCALLS.c:333:NC */ extern double acos (double); +/* SYSCALLS.c:334:NC */ extern float acosf (float); +/* SYSCALLS.c:335:NC */ extern double acosh (double); +/* SYSCALLS.c:336:NC */ extern int addexportent (FILE *, char *, char *); +/* SYSCALLS.c:337:NC */ extern int addseverity (int, const char *); +/* SYSCALLS.c:338:NC */ extern int adjtime (struct timeval *, struct timeval *); +/* SYSCALLS.c:339:NC */ extern int advance (const char *, const char *); +/* SYSCALLS.c:340:NC */ extern unsigned int alarm (unsigned int); +/* SYSCALLS.c:341:NC */ extern void *alloca (size_t); +/* SYSCALLS.c:342:NC */ extern int and (void); +/* SYSCALLS.c:343:NC */ extern int ascftime (char *, const char *, const struct tm *); +/* SYSCALLS.c:344:NC */ extern char *asctime (const struct tm *); +/* SYSCALLS.c:345:NC */ extern double asin (double); +/* SYSCALLS.c:346:NC */ extern float asinf (float); +/* SYSCALLS.c:347:NC */ extern double asinh (double); +/* SYSCALLS.c:348:NC */ extern struct address *astoa (char *, struct address *); +/* SYSCALLS.c:349:NC */ extern double atan (double); +/* SYSCALLS.c:350:NC */ extern double atan2 (double, double); +/* SYSCALLS.c:351:NC */ extern float atan2f (float, float); +/* SYSCALLS.c:352:NC */ extern float atanf (float); +/* SYSCALLS.c:353:NC */ extern double atanh (double); +/* SYSCALLS.c:354:NC */ extern int atexit (void (*) (void)); +/* SYSCALLS.c:355:NC */ extern double atof (const char *); +/* SYSCALLS.c:356:NC */ extern int atoi (const char *); +/* SYSCALLS.c:357:NC */ extern long int atol (const char *); +/* SYSCALLS.c:358:NC */ extern char *atos (char *, struct netbuf *, int); +/* SYSCALLS.c:359:NC */ extern void auth_destroy (AUTH *); +/* SYSCALLS.c:360:OC */ extern AUTH *authdes_create (/* ??? */); +/* SYSCALLS.c:361:NC */ extern void authdes_getcred (struct authdes_cred *, short int *, short int *, short int *, int *); +/* SYSCALLS.c:362:OC */ extern AUTH *authdes_seccreate (/* ??? */); +/* SYSCALLS.c:363:NC */ extern AUTH *authnone_create (void); +/* SYSCALLS.c:364:NC */ extern AUTH *authsys_create (char *, int, int, int, int *); +/* SYSCALLS.c:365:NC */ extern AUTH *authsys_create_default (void); +/* SYSCALLS.c:366:NC */ extern AUTH *authunix_create (char *, int, int, int, int *); +/* SYSCALLS.c:367:NC */ extern AUTH *authunix_create_default (void); +/* SYSCALLS.c:368:NC */ extern char *basename (char *); +/* SYSCALLS.c:369:NC */ extern int baudrate (void); +/* SYSCALLS.c:370:NC */ extern int bcmp (const void *, const void *, size_t); +/* SYSCALLS.c:371:NC */ extern void bcopy (const void *, void *, size_t); +/* SYSCALLS.c:372:NC */ extern int beep (void); +/* SYSCALLS.c:373:NC */ extern void (*berk_signal (int, void (*) (int, ...))) (int, ...); +/* SYSCALLS.c:374:NC */ extern char *bgets (char *, size_t, FILE *, char *); +/* SYSCALLS.c:375:NC */ extern int bottom_panel (PANEL *); +/* SYSCALLS.c:376:NC */ extern int box32 (WINDOW *, chtype, chtype); +/* SYSCALLS.c:377:NC */ extern int brk (void *); +/* SYSCALLS.c:378:NC */ extern void *bsearch (const void *, const void *, size_t, size_t, int (*) (const void *, const void *)); +/* SYSCALLS.c:379:NC */ extern size_t bufsplit (char *, size_t, char *); +/* SYSCALLS.c:380:NC */ extern void bzero (void *, size_t); +/* SYSCALLS.c:381:OC */ extern long int calchash (/* ??? */); +/* SYSCALLS.c:382:NC */ extern void *calloc (size_t, size_t); +/* SYSCALLS.c:383:NC */ extern void callrpc (char *, long unsigned int, long unsigned int, long unsigned int, xdrproc_t, char *, xdrproc_t, char *); +/* SYSCALLS.c:384:NC */ extern bool can_change_color (void); +/* SYSCALLS.c:385:NC */ extern int catclose (nl_catd); +/* SYSCALLS.c:386:NC */ extern char *catgets (nl_catd, int, int, char *); +/* SYSCALLS.c:387:NC */ extern nl_catd catopen (const char *, int); +/* SYSCALLS.c:388:NC */ extern int cbreak (void); +/* SYSCALLS.c:389:NC */ extern double cbrt (double); +/* SYSCALLS.c:390:NC */ extern double ceil (double); +/* SYSCALLS.c:391:NC */ extern float ceilf (float); +/* SYSCALLS.c:392:NC */ extern speed_t cfgetispeed (const struct termios *); +/* SYSCALLS.c:393:NC */ extern speed_t cfgetospeed (const struct termios *); +/* SYSCALLS.c:394:NC */ extern void cfree (void *); +/* SYSCALLS.c:395:NC */ extern int cfsetispeed (struct termios *, speed_t); +/* SYSCALLS.c:396:NC */ extern int cfsetospeed (struct termios *, speed_t); +/* SYSCALLS.c:397:NC */ extern int cftime (char *, char *, const time_t *); +/* SYSCALLS.c:398:NC */ extern int chdir (const char *); +/* SYSCALLS.c:399:NC */ extern int chmod (const char *, mode_t); +/* SYSCALLS.c:400:NC */ extern int chown (const char *, uid_t, gid_t); +/* SYSCALLS.c:401:NC */ extern int chroot (const char *); +/* SYSCALLS.c:402:OC */ extern void clean_GEN_rd (/* ??? */); +/* SYSCALLS.c:403:OC */ extern void cleanup (/* ??? */); +/* SYSCALLS.c:404:NC */ extern void clearerr (FILE *); +/* SYSCALLS.c:405:NC */ extern int clearok (WINDOW *, int); +/* SYSCALLS.c:406:NC */ extern enum clnt_stat clnt_broadcast (long unsigned int, long unsigned int, long unsigned int, xdrproc_t, char *, xdrproc_t, char *, resultproc_t); +/* SYSCALLS.c:407:NC */ extern enum clnt_stat clnt_call (CLIENT *, long unsigned int, xdrproc_t, char *, xdrproc_t, char *, struct timeval); +/* SYSCALLS.c:408:NC */ extern bool_t clnt_control (CLIENT *, int, char *); +/* SYSCALLS.c:409:NC */ extern CLIENT *clnt_create (char *, long unsigned int, long unsigned int, char *); +/* SYSCALLS.c:410:NC */ extern void clnt_destroy (CLIENT *); +/* SYSCALLS.c:411:NC */ extern int clnt_freeres (CLIENT *, xdrproc_t, char *); +/* SYSCALLS.c:412:NC */ extern void clnt_geterr (CLIENT *, struct rpc_err *); +/* SYSCALLS.c:413:NC */ extern void clnt_pcreateerror (char *); +/* SYSCALLS.c:414:NC */ extern void clnt_perrno (enum clnt_stat); +/* SYSCALLS.c:415:NC */ extern void clnt_perror (CLIENT *, char *); +/* SYSCALLS.c:416:NC */ extern char *clnt_spcreateerror (char *); +/* SYSCALLS.c:417:NC */ extern char *clnt_sperrno (enum clnt_stat); +/* SYSCALLS.c:418:NC */ extern char *clnt_sperror (CLIENT *, char *); +/* SYSCALLS.c:419:OC */ extern CLIENT *clnt_tli_create (/* ??? */); +/* SYSCALLS.c:420:OC */ extern CLIENT *clnt_tp_create (/* ??? */); +/* SYSCALLS.c:421:OC */ extern CLIENT *clnt_vc_create (/* ??? */); +/* SYSCALLS.c:422:NC */ extern CLIENT *clntraw_create (long unsigned int, long unsigned int); +/* SYSCALLS.c:423:NC */ extern CLIENT *clnttcp_create (struct sockaddr_in *, long unsigned int, long unsigned int, int *, unsigned int, unsigned int *); +/* SYSCALLS.c:424:NC */ extern CLIENT *clntudp_bufcreate (struct sockaddr_in *, long unsigned int, long unsigned int, struct timeval, int *, unsigned int, unsigned int); +/* SYSCALLS.c:425:NC */ extern CLIENT *clntudp_create (struct sockaddr_in *, long unsigned int, long unsigned int, struct timeval, int *); +/* SYSCALLS.c:426:NC */ extern clock_t clock (void); +/* SYSCALLS.c:427:NC */ extern int close (int); +/* SYSCALLS.c:428:NC */ extern int closedir (DIR *); +/* SYSCALLS.c:429:NC */ extern int color_content (int, short int *, short int *, short int *); +/* SYSCALLS.c:430:NC */ extern char *compile (const char *, char *, char *); +/* SYSCALLS.c:431:NC */ extern char *copylist (const char *, off_t *); +/* SYSCALLS.c:432:NC */ extern double copysign (double, double); +/* SYSCALLS.c:433:NC */ extern int copywin (WINDOW *, WINDOW *, int, int, int, int, int, int, int); +/* SYSCALLS.c:434:NC */ extern double cos (double); +/* SYSCALLS.c:435:NC */ extern float cosf (float); +/* SYSCALLS.c:436:NC */ extern double cosh (double); +/* SYSCALLS.c:437:NC */ extern float coshf (float); +/* SYSCALLS.c:438:OC */ extern struct rd_user *cr_rduser (/* ??? */); +/* SYSCALLS.c:439:NC */ extern int creat (const char *, mode_t); +/* SYSCALLS.c:440:NC */ extern int crmode (void); +/* SYSCALLS.c:441:NC */ extern char *crypt (const char *, const char *); +/* SYSCALLS.c:442:NC */ extern int crypt_close (int *); +/* SYSCALLS.c:443:NC */ extern char *ctermid (char *); +/* SYSCALLS.c:444:NC */ extern char *ctime (const time_t *); +/* SYSCALLS.c:445:NC */ extern FIELD *current_field (FORM *); +/* SYSCALLS.c:446:NC */ extern ITEM *current_item (MENU *); +/* SYSCALLS.c:447:NC */ extern int curs_set (int); +/* SYSCALLS.c:448:NC */ extern void curserr (void); +/* SYSCALLS.c:449:NC */ extern char *cuserid (char *); +/* SYSCALLS.c:450:NC */ extern int data_ahead (FORM *); +/* SYSCALLS.c:451:NC */ extern int data_behind (FORM *); +/* SYSCALLS.c:452:NC */ extern void dbmclose (void); +/* SYSCALLS.c:453:NC */ extern void dbminit (const char *); +/* SYSCALLS.c:454:NC */ extern int def_prog_mode (void); +/* SYSCALLS.c:455:NC */ extern int def_shell_mode (void); +/* SYSCALLS.c:456:OC */ extern char *defread (/* ??? */); +/* SYSCALLS.c:457:NC */ extern int del_panel (PANEL *); +/* SYSCALLS.c:458:OC */ extern void del_rduser (/* ??? */); +/* SYSCALLS.c:459:NC */ extern void delay (long int); +/* SYSCALLS.c:460:NC */ extern int delay_output (int); +/* SYSCALLS.c:461:NC */ extern void delete (datum); +/* SYSCALLS.c:462:NC */ extern void delscreen (SCREEN *); +/* SYSCALLS.c:463:NC */ extern int delterm (TERMINAL *); +/* SYSCALLS.c:464:NC */ extern int delwin (WINDOW *); +/* SYSCALLS.c:465:NC */ extern WINDOW *derwin (WINDOW *, int, int, int, int); +/* SYSCALLS.c:466:NC */ extern char *des_crypt (const char *, const char *); +/* SYSCALLS.c:467:NC */ extern void des_encrypt (char *, int); +/* SYSCALLS.c:468:NC */ extern void des_setkey (const char *); +/* SYSCALLS.c:469:OC */ extern char *devattr (/* ??? */); +/* SYSCALLS.c:470:OC */ extern int devfree (/* ??? */); +/* SYSCALLS.c:471:OC */ extern char **devreserv (/* ??? */); +/* SYSCALLS.c:472:NC */ extern int dial (CALL); +/* SYSCALLS.c:473:NC */ extern double difftime (time_t, time_t); +/* SYSCALLS.c:474:NC */ extern char *dirname (char *); +/* SYSCALLS.c:475:NC */ extern div_t div (int, int); +/* SYSCALLS.c:476:NC */ extern int dlclose (void *); +/* SYSCALLS.c:477:NC */ extern char *dlerror (void); +/* SYSCALLS.c:478:NC */ extern void *dlopen (char *, int); +/* SYSCALLS.c:479:NC */ extern void *dlsym (void *, char *); +/* SYSCALLS.c:480:NC */ extern void dma_access (u_char, u_int, u_int, u_char, u_char); +/* SYSCALLS.c:481:NC */ extern int doupdate (void); +/* SYSCALLS.c:482:NC */ extern int drainio (int); +/* SYSCALLS.c:483:NC */ extern double drand48 (void); +/* SYSCALLS.c:484:NC */ extern double drem (double, double); +/* SYSCALLS.c:485:OC */ extern int drv_getevtoken (/* ??? */); +/* SYSCALLS.c:486:OC */ extern void drv_relevtoken (/* ??? */); +/* SYSCALLS.c:487:NC */ extern int dup (int); +/* SYSCALLS.c:488:NC */ extern int dup2 (int, int); +/* SYSCALLS.c:489:NC */ extern FIELD *dup_field (FIELD *, int, int); +/* SYSCALLS.c:490:NC */ extern WINDOW *dupwin (WINDOW *); +/* SYSCALLS.c:491:NC */ extern int dynamic_field_info (FIELD *, int *, int *, int *); +/* SYSCALLS.c:492:NC */ extern int dysize (int); +/* SYSCALLS.c:493:NC */ extern int eaccess (const char *, int); +/* SYSCALLS.c:494:NC */ extern int echo (void); +/* SYSCALLS.c:495:NC */ extern char *ecvt (double, int, int *, int *); +/* SYSCALLS.c:496:NC */ extern size_t elf32_fsize (Elf_Type, size_t, unsigned int); +/* SYSCALLS.c:497:NC */ extern Elf32_Ehdr *elf32_getehdr (Elf *); +/* SYSCALLS.c:498:NC */ extern Elf32_Phdr *elf32_getphdr (Elf *); +/* SYSCALLS.c:499:NC */ extern Elf32_Shdr *elf32_getshdr (Elf_Scn *); +/* SYSCALLS.c:500:NC */ extern Elf32_Ehdr *elf32_newehdr (Elf *); +/* SYSCALLS.c:501:NC */ extern Elf32_Phdr *elf32_newphdr (Elf *, size_t); +/* SYSCALLS.c:502:NC */ extern Elf_Data *elf32_xlatetof (Elf_Data *, const Elf_Data *, unsigned int); +/* SYSCALLS.c:503:NC */ extern Elf_Data *elf32_xlatetom (Elf_Data *, const Elf_Data *, unsigned int); +/* SYSCALLS.c:504:NC */ extern Elf *elf_begin (int, Elf_Cmd, Elf *); +/* SYSCALLS.c:505:NC */ extern int elf_cntl (Elf *, Elf_Cmd); +/* SYSCALLS.c:506:NC */ extern int elf_end (Elf *); +/* SYSCALLS.c:507:NC */ extern const char *elf_errmsg (int); +/* SYSCALLS.c:508:NC */ extern int elf_errno (void); +/* SYSCALLS.c:509:NC */ extern void elf_fill (int); +/* SYSCALLS.c:510:NC */ extern unsigned int elf_flagdata (Elf_Data *, Elf_Cmd, unsigned int); +/* SYSCALLS.c:511:NC */ extern unsigned int elf_flagehdr (Elf *, Elf_Cmd, unsigned int); +/* SYSCALLS.c:512:NC */ extern unsigned int elf_flagelf (Elf *, Elf_Cmd, unsigned int); +/* SYSCALLS.c:513:NC */ extern unsigned int elf_flagphdr (Elf *, Elf_Cmd, unsigned int); +/* SYSCALLS.c:514:NC */ extern unsigned int elf_flagscn (Elf_Scn *, Elf_Cmd, unsigned int); +/* SYSCALLS.c:515:NC */ extern unsigned int elf_flagshdr (Elf_Scn *, Elf_Cmd, unsigned int); +/* SYSCALLS.c:516:NC */ extern Elf_Arhdr *elf_getarhdr (Elf *); +/* SYSCALLS.c:517:NC */ extern Elf_Arsym *elf_getarsym (Elf *, size_t *); +/* SYSCALLS.c:518:NC */ extern off_t elf_getbase (Elf *); +/* SYSCALLS.c:519:NC */ extern Elf_Data *elf_getdata (Elf_Scn *, Elf_Data *); +/* SYSCALLS.c:520:NC */ extern char *elf_getident (Elf *, size_t *); +/* SYSCALLS.c:521:NC */ extern Elf_Scn *elf_getscn (Elf *, size_t); +/* SYSCALLS.c:522:NC */ extern long unsigned int elf_hash (const char *); +/* SYSCALLS.c:523:NC */ extern Elf_Kind elf_kind (Elf *); +/* SYSCALLS.c:524:NC */ extern size_t elf_ndxscn (Elf_Scn *); +/* SYSCALLS.c:525:NC */ extern Elf_Data *elf_newdata (Elf_Scn *); +/* SYSCALLS.c:526:NC */ extern Elf_Scn *elf_newscn (Elf *); +/* SYSCALLS.c:527:NC */ extern Elf_Cmd elf_next (Elf *); +/* SYSCALLS.c:528:NC */ extern Elf_Scn *elf_nextscn (Elf *, Elf_Scn *); +/* SYSCALLS.c:529:NC */ extern size_t elf_rand (Elf *, size_t); +/* SYSCALLS.c:530:NC */ extern Elf_Data *elf_rawdata (Elf_Scn *, Elf_Data *); +/* SYSCALLS.c:531:NC */ extern char *elf_rawfile (Elf *, size_t *); +/* SYSCALLS.c:532:NC */ extern char *elf_strptr (Elf *, size_t, size_t); +/* SYSCALLS.c:533:NC */ extern off_t elf_update (Elf *, Elf_Cmd); +/* SYSCALLS.c:534:NC */ extern unsigned int elf_version (unsigned int); +/* SYSCALLS.c:535:NC */ extern void encrypt (char *, int); +/* SYSCALLS.c:536:NC */ extern void endgrent (void); +/* SYSCALLS.c:537:NC */ extern int endnetconfig (void *); +/* SYSCALLS.c:538:NC */ extern int endnetpath (void *); +/* SYSCALLS.c:539:NC */ extern void endpwent (void); +/* SYSCALLS.c:540:NC */ extern void endrpcent (void); +/* SYSCALLS.c:541:NC */ extern void endspent (void); +/* SYSCALLS.c:542:NC */ extern void endutent (void); +/* SYSCALLS.c:543:NC */ extern void endutxent (void); +/* SYSCALLS.c:544:NC */ extern int endwin (void); +/* SYSCALLS.c:545:NC */ extern double erand (short int *); +/* SYSCALLS.c:546:NC */ extern double erand48 (short unsigned int *); +/* SYSCALLS.c:547:NC */ extern char erasechar (void); +/* SYSCALLS.c:548:NC */ extern double erf (double); +/* SYSCALLS.c:549:NC */ extern double erfc (double); +/* SYSCALLS.c:550:NC */ extern int execl (const char *, const char *, ...); +/* SYSCALLS.c:551:NC */ extern int execle (const char *, const char *, ...); +/* SYSCALLS.c:552:NC */ extern int execlp (const char *, const char *, ...); +/* SYSCALLS.c:553:NC */ extern int exect (const char *, const char **, char **); +/* SYSCALLS.c:554:NC */ extern int execv (const char *, char *const *); +/* SYSCALLS.c:555:NC */ extern int execve (const char *, char *const *, char *const *); +/* SYSCALLS.c:556:NC */ extern int execvp (const char *, char *const *); +/* SYSCALLS.c:557:NC */ extern void exit (int); +/* SYSCALLS.c:558:NC */ extern double exp (double); +/* SYSCALLS.c:559:NC */ extern float expf (float); +/* SYSCALLS.c:560:NC */ extern double fabs (double); +/* SYSCALLS.c:561:NC */ extern float fabsf (float); +/* SYSCALLS.c:562:NC */ extern int fattach (int, const char *); +/* SYSCALLS.c:563:NC */ extern int fchdir (int); +/* SYSCALLS.c:564:NC */ extern int fchmod (int, mode_t); +/* SYSCALLS.c:565:NC */ extern int fchown (int, uid_t, gid_t); +/* SYSCALLS.c:566:NC */ extern int fclose (FILE *); +/* SYSCALLS.c:567:NC */ extern int fcntl (int, int, ...); +/* SYSCALLS.c:568:NC */ extern char *fcvt (double, int, int *, int *); +/* SYSCALLS.c:569:NC */ extern int fdetach (const char *); +/* SYSCALLS.c:570:NC */ extern FILE *fdopen (int, const char *); +/* SYSCALLS.c:571:NC */ extern int feof (FILE *); +/* SYSCALLS.c:572:NC */ extern int ferror (FILE *); +/* SYSCALLS.c:573:NC */ extern datum fetch (datum); +/* SYSCALLS.c:574:NC */ extern int fflush (FILE *); +/* SYSCALLS.c:575:NC */ extern int ffs (int); +/* SYSCALLS.c:576:NC */ extern int fgetc (FILE *); +/* SYSCALLS.c:577:NC */ extern struct group *fgetgrent (FILE *); +/* SYSCALLS.c:578:NC */ extern int fgetpos (FILE *, fpos_t *); +/* SYSCALLS.c:579:NC */ extern struct passwd *fgetpwent (FILE *); +/* SYSCALLS.c:580:NC */ extern char *fgets (char *, int, FILE *); +/* SYSCALLS.c:581:NC */ extern struct spwd *fgetspent (FILE *); +/* SYSCALLS.c:582:NC */ extern char *field_arg (FIELD *); +/* SYSCALLS.c:583:NC */ extern chtype field_back (FIELD *); +/* SYSCALLS.c:584:NC */ extern char *field_buffer (FIELD *, int); +/* SYSCALLS.c:585:NC */ extern int field_count (FORM *); +/* SYSCALLS.c:586:NC */ extern chtype field_fore (FIELD *); +/* SYSCALLS.c:587:NC */ extern int field_index (FIELD *); +/* SYSCALLS.c:588:NC */ extern int field_info (FIELD *, int *, int *, int *, int *, int *, int *); +/* SYSCALLS.c:589:NC */ extern PTF_void field_init (FORM *); +/* SYSCALLS.c:590:NC */ extern int field_just (FIELD *); +/* SYSCALLS.c:591:NC */ extern OPTIONS field_opts (FIELD *); +/* SYSCALLS.c:592:NC */ extern int field_opts_off (FIELD *, OPTIONS); +/* SYSCALLS.c:593:NC */ extern int field_opts_on (FIELD *, OPTIONS); +/* SYSCALLS.c:594:NC */ extern int field_pad (FIELD *); +/* SYSCALLS.c:595:NC */ extern int field_status (FIELD *); +/* SYSCALLS.c:596:NC */ extern PTF_void field_term (FORM *); +/* SYSCALLS.c:597:NC */ extern FIELDTYPE *field_type (FIELD *); +/* SYSCALLS.c:598:NC */ extern char *field_userptr (FIELD *); +/* SYSCALLS.c:599:NC */ extern int fileno (FILE *); +/* SYSCALLS.c:600:NC */ extern int filter (void); +/* SYSCALLS.c:601:NC */ extern int finite (double); +/* SYSCALLS.c:602:OC */ extern datum firsthash (/* ??? */); +/* SYSCALLS.c:603:NC */ extern datum firstkey (void); +/* SYSCALLS.c:604:NC */ extern int flash (void); +/* SYSCALLS.c:605:NC */ extern int flock (int, int); +/* SYSCALLS.c:606:NC */ extern double floor (double); +/* SYSCALLS.c:607:NC */ extern float floorf (float); +/* SYSCALLS.c:608:NC */ extern int flushinp (void); +/* SYSCALLS.c:609:NC */ extern double fmod (double, double); +/* SYSCALLS.c:610:NC */ extern float fmodf (float, float); +/* SYSCALLS.c:611:NC */ extern int fmtmsg (long int, const char *, int, const char *, const char *, const char *); +/* SYSCALLS.c:612:NC */ extern FILE *fopen (const char *, const char *); +/* SYSCALLS.c:613:NC */ extern pid_t fork (void); +/* SYSCALLS.c:614:NC */ extern int form_driver (FORM *, int); +/* SYSCALLS.c:615:NC */ extern FIELD **form_fields (FORM *); +/* SYSCALLS.c:616:NC */ extern PTF_void form_init (FORM *); +/* SYSCALLS.c:617:NC */ extern OPTIONS form_opts (FORM *); +/* SYSCALLS.c:618:NC */ extern int form_opts_off (FORM *, OPTIONS); +/* SYSCALLS.c:619:NC */ extern int form_opts_on (FORM *, OPTIONS); +/* SYSCALLS.c:620:NC */ extern int form_page (FORM *); +/* SYSCALLS.c:621:NC */ extern WINDOW *form_sub (FORM *); +/* SYSCALLS.c:622:NC */ extern PTF_void form_term (FORM *); +/* SYSCALLS.c:623:NC */ extern char *form_userptr (FORM *); +/* SYSCALLS.c:624:NC */ extern WINDOW *form_win (FORM *); +/* SYSCALLS.c:625:NC */ extern long int fpathconf (int, int); +/* SYSCALLS.c:626:NC */ extern fpclass_t fpclass (double); +/* SYSCALLS.c:627:NC */ extern int fpgetmask (void); +/* SYSCALLS.c:628:NC */ extern fp_rnd fpgetround (void); +/* SYSCALLS.c:629:NC */ extern int fpgetsticky (void); +/* SYSCALLS.c:630:NC */ extern int fprintf (FILE *, const char *, ...); +/* SYSCALLS.c:631:NC */ extern int fpsetmask (int); +/* SYSCALLS.c:632:NC */ extern fp_rnd fpsetround (fp_rnd); +/* SYSCALLS.c:633:NC */ extern int fpsetsticky (int); +/* SYSCALLS.c:634:NC */ extern int fputc (int, FILE *); +/* SYSCALLS.c:635:NC */ extern int fputs (const char *, FILE *); +/* SYSCALLS.c:636:NC */ extern size_t fread (void *, size_t, size_t, FILE *); +/* SYSCALLS.c:637:NC */ extern void free (void *); +/* SYSCALLS.c:638:NC */ extern int free_field (FIELD *); +/* SYSCALLS.c:639:NC */ extern int free_fieldtype (FIELDTYPE *); +/* SYSCALLS.c:640:NC */ extern int free_form (FORM *); +/* SYSCALLS.c:641:NC */ extern int free_item (ITEM *); +/* SYSCALLS.c:642:NC */ extern int free_menu (MENU *); +/* SYSCALLS.c:643:NC */ extern void freenetconfigent (struct netconfig *); +/* SYSCALLS.c:644:NC */ extern FILE *freopen (const char *, const char *, FILE *); +/* SYSCALLS.c:645:NC */ extern double frexp (double, int *); +/* SYSCALLS.c:646:NC */ extern int fscanf (FILE *, const char *, ...); +/* SYSCALLS.c:647:NC */ extern int fseek (FILE *, long int, int); +/* SYSCALLS.c:648:NC */ extern int fsetpos (FILE *, const fpos_t *); +/* SYSCALLS.c:649:NC */ extern int fstat (int, struct stat *); +/* SYSCALLS.c:650:NC */ extern int fstatfs (int, struct statfs *, int, int); +/* SYSCALLS.c:651:NC */ extern int fstatvfs (int, struct statvfs *); +/* SYSCALLS.c:652:NC */ extern int fsync (int); +/* SYSCALLS.c:653:NC */ extern long int ftell (FILE *); +/* SYSCALLS.c:654:NC */ extern key_t ftok (const char *, int); +/* SYSCALLS.c:655:NC */ extern int ftruncate (int, off_t); +/* SYSCALLS.c:656:NC */ extern int ftw (const char *, int (*) (const char *, const struct stat *, int), int); +/* SYSCALLS.c:657:NC */ extern size_t fwrite (const void *, size_t, size_t, FILE *); +/* SYSCALLS.c:658:NC */ extern double gamma (double); +/* SYSCALLS.c:659:NC */ extern char *gcvt (double, int, char *); +/* SYSCALLS.c:660:OC */ extern int get_error (/* ??? */); +/* SYSCALLS.c:661:NC */ extern chtype getattrs (WINDOW *); +/* SYSCALLS.c:662:NC */ extern int getbegx (WINDOW *); +/* SYSCALLS.c:663:NC */ extern int getbegy (WINDOW *); +/* SYSCALLS.c:664:NC */ extern chtype getbkgd (WINDOW *); +/* SYSCALLS.c:665:NC */ extern long unsigned int getbmap (void); +/* SYSCALLS.c:666:NC */ extern int getc (FILE *); +/* SYSCALLS.c:667:OC */ extern char *getcap (/* ??? */); +/* SYSCALLS.c:668:NC */ extern int getchar (void); +/* SYSCALLS.c:669:NC */ extern int getcontext (ucontext_t *); +/* SYSCALLS.c:670:NC */ extern int getcurx (WINDOW *); +/* SYSCALLS.c:671:NC */ extern int getcury (WINDOW *); +/* SYSCALLS.c:672:NC */ extern char *getcwd (char *, size_t); +/* SYSCALLS.c:673:NC */ extern struct tm *getdate (const char *); +/* SYSCALLS.c:674:NC */ extern int getdents (int, struct dirent *, unsigned int); +/* SYSCALLS.c:675:OC */ extern char **getdev (/* ??? */); +/* SYSCALLS.c:676:OC */ extern char **getdgrp (/* ??? */); +/* SYSCALLS.c:677:NC */ extern int getdomainname (char *, int); +/* SYSCALLS.c:678:NC */ extern int getdtablesize (void); +/* SYSCALLS.c:679:NC */ extern gid_t getegid (void); +/* SYSCALLS.c:680:NC */ extern char *getenv (const char *); +/* SYSCALLS.c:681:OC */ extern struct errhdr *geterec (/* ??? */); +/* SYSCALLS.c:682:OC */ extern struct errhdr *geteslot (/* ??? */); +/* SYSCALLS.c:683:NC */ extern uid_t geteuid (void); +/* SYSCALLS.c:684:NC */ extern gid_t getgid (void); +/* SYSCALLS.c:685:NC */ extern struct group *getgrent (void); +/* SYSCALLS.c:686:NC */ extern struct group *getgrgid (gid_t); +/* SYSCALLS.c:687:NC */ extern struct group *getgrnam (const char *); +/* SYSCALLS.c:688:NC */ extern int getgroups (int, gid_t *); +/* SYSCALLS.c:689:OC */ extern struct hostent *gethostbyaddr (/* ??? */); +/* SYSCALLS.c:690:OC */ extern struct hostent *gethostbyname (/* ??? */); +/* SYSCALLS.c:691:OC */ extern struct hostent *gethostent (/* ??? */); +/* SYSCALLS.c:695:NC */ extern long int gethostid (void); +/* SYSCALLS.c:697:NC */ extern int gethostname (char *, size_t); +/* SYSCALLS.c:698:NC */ extern int getitimer (int, struct itimerval *); +/* SYSCALLS.c:699:NC */ extern char *getlogin (void); +/* SYSCALLS.c:700:NC */ extern int getmaxx (WINDOW *); +/* SYSCALLS.c:701:NC */ extern int getmaxy (WINDOW *); +/* SYSCALLS.c:702:NC */ extern int getmntany (FILE *, struct mnttab *, struct mnttab *); +/* SYSCALLS.c:703:OC */ extern int getmntent (/* ??? */); +/* SYSCALLS.c:704:NC */ extern long unsigned int getmouse (void); +/* SYSCALLS.c:705:NC */ extern int getmsg (int, struct strbuf *, struct strbuf *, int *); +/* SYSCALLS.c:706:OC */ extern struct netent *getnetbyaddr (/* ??? */); +/* SYSCALLS.c:707:OC */ extern struct netent *getnetbyname (/* ??? */); +/* SYSCALLS.c:708:NC */ extern struct netconfig *getnetconfig (void *); +/* SYSCALLS.c:709:NC */ extern struct netconfig *getnetconfigent (char *); +/* SYSCALLS.c:710:OC */ extern struct netent *getnetent (/* ??? */); +/* SYSCALLS.c:711:NC */ extern struct netconfig *getnetpath (void *); +/* SYSCALLS.c:712:NC */ extern int getopt (int, char *const *, const char *); +/* SYSCALLS.c:713:NC */ extern int getpagesize (void); +/* SYSCALLS.c:714:NC */ extern int getparx (WINDOW *); +/* SYSCALLS.c:715:NC */ extern int getpary (WINDOW *); +/* SYSCALLS.c:716:NC */ extern char *getpass (const char *); +/* SYSCALLS.c:717:NC */ extern pid_t getpgid (pid_t); +/* SYSCALLS.c:718:NC */ extern pid_t getpgrp (void); +/* SYSCALLS.c:719:NC */ extern pid_t getpgrp2 (pid_t); +/* SYSCALLS.c:720:NC */ extern pid_t getpid (void); +/* SYSCALLS.c:721:NC */ extern int getpmsg (int, struct strbuf *, struct strbuf *, int *, int *); +/* SYSCALLS.c:722:NC */ extern pid_t getppid (void); +/* SYSCALLS.c:723:NC */ extern int getpriority (int, int); +/* SYSCALLS.c:724:OC */ extern struct protoent *getprotobyname (/* ??? */); +/* SYSCALLS.c:725:OC */ extern struct protoent *getprotobynumber (/* ??? */); +/* SYSCALLS.c:726:OC */ extern struct protoent *getprotoent (/* ??? */); +/* SYSCALLS.c:727:NC */ extern int getpw (int, char *); +/* SYSCALLS.c:728:NC */ extern struct passwd *getpwent (void); +/* SYSCALLS.c:729:NC */ extern struct passwd *getpwnam (const char *); +/* SYSCALLS.c:730:NC */ extern struct passwd *getpwuid (uid_t); +/* SYSCALLS.c:731:NC */ extern int getrlimit (int, struct rlimit *); +/* SYSCALLS.c:732:NC */ extern int getrnge (char *); +/* SYSCALLS.c:733:NC */ extern struct rpcent *getrpcbyname (const char *); +/* SYSCALLS.c:734:NC */ extern struct rpcent *getrpcbynumber (int); +/* SYSCALLS.c:735:NC */ extern struct rpcent *getrpcent (void); +/* SYSCALLS.c:736:NC */ extern int getrusage (int, struct rusage *); +/* SYSCALLS.c:737:NC */ extern char *gets (char *); +/* SYSCALLS.c:738:OC */ extern struct servent *getservbyname (/* ??? */); +/* SYSCALLS.c:739:OC */ extern struct servent *getservbyport (/* ??? */); +/* SYSCALLS.c:740:OC */ extern struct servent *getservent (/* ??? */); +/* SYSCALLS.c:741:NC */ extern pid_t getsid (pid_t); +/* SYSCALLS.c:742:NC */ extern struct spwd *getspent (void); +/* SYSCALLS.c:743:NC */ extern struct spwd *getspnam (const char *); +/* SYSCALLS.c:744:NC */ extern int getsubopt (char **, char *const *, char **); +/* SYSCALLS.c:745:NC */ extern int gettmode (void); +/* SYSCALLS.c:746:NC */ extern char *gettxt (const char *, const char *); +/* SYSCALLS.c:747:NC */ extern uid_t getuid (void); +/* SYSCALLS.c:748:NC */ extern struct utmp *getutent (void); +/* SYSCALLS.c:749:NC */ extern struct utmp *getutid (const struct utmp *); +/* SYSCALLS.c:750:NC */ extern struct utmp *getutline (const struct utmp *); +/* SYSCALLS.c:751:NC */ extern void getutmp (const struct utmpx *, struct utmp *); +/* SYSCALLS.c:752:NC */ extern void getutmpx (const struct utmp *, struct utmpx *); +/* SYSCALLS.c:753:NC */ extern struct utmpx *getutxent (void); +/* SYSCALLS.c:754:NC */ extern struct utmpx *getutxid (const struct utmpx *); +/* SYSCALLS.c:755:NC */ extern struct utmpx *getutxline (const struct utmpx *); +/* SYSCALLS.c:756:NC */ extern int getvfsany (FILE *, struct vfstab *, struct vfstab *); +/* SYSCALLS.c:757:NC */ extern int getvfsent (FILE *, struct vfstab *); +/* SYSCALLS.c:758:NC */ extern int getvfsfile (FILE *, struct vfstab *, char *); +/* SYSCALLS.c:759:NC */ extern int getvfsspec (FILE *, struct vfstab *, char *); +/* SYSCALLS.c:760:OC */ extern int getvol (/* ??? */); +/* SYSCALLS.c:761:NC */ extern int getw (FILE *); +/* SYSCALLS.c:762:NC */ extern char *getwd (char *); +/* SYSCALLS.c:763:NC */ extern void getwidth (eucwidth_t *); +/* SYSCALLS.c:764:NC */ extern WINDOW *getwin (FILE *); +/* SYSCALLS.c:765:NC */ extern int gmatch (const char *, const char *); +/* SYSCALLS.c:766:NC */ extern struct tm *gmtime (const time_t *); +/* SYSCALLS.c:767:NC */ extern int gsignal (int); +/* SYSCALLS.c:768:NC */ extern int halfdelay (int); +/* SYSCALLS.c:769:NC */ extern bool has_colors (void); +/* SYSCALLS.c:770:NC */ extern int has_ic (void); +/* SYSCALLS.c:771:NC */ extern int has_il (void); +/* SYSCALLS.c:772:OC */ extern long int hashinc (/* ??? */); +/* SYSCALLS.c:773:OC */ extern char *hasmntopt (/* ??? */); +/* SYSCALLS.c:774:NC */ extern int hcreate (size_t); +/* SYSCALLS.c:775:NC */ extern void hdestroy (void); +/* SYSCALLS.c:776:NC */ extern int hide_panel (PANEL *); +/* SYSCALLS.c:777:NC */ extern int host2netname (char *, char *, char *); +/* SYSCALLS.c:778:NC */ extern int hrtalarm (hrtcmd_t *, int); +/* SYSCALLS.c:779:NC */ extern int hrtcancel (const long int *, int); +/* SYSCALLS.c:780:NC */ extern int hrtcntl (int, int, interval_t *, hrtime_t *); +/* SYSCALLS.c:781:NC */ extern int hrtsleep (hrtcmd_t *); +/* SYSCALLS.c:782:NC */ extern ENTRY *hsearch (ENTRY, ACTION); +/* SYSCALLS.c:783:NC */ extern long unsigned int htonl (long unsigned int); +/* SYSCALLS.c:784:NC */ extern short unsigned int htons (unsigned int); +/* SYSCALLS.c:785:NC */ extern double hypot (double, double); +/* SYSCALLS.c:786:NC */ extern void idcok (WINDOW *, int); +/* SYSCALLS.c:787:NC */ extern int idlok (WINDOW *, int); +/* SYSCALLS.c:788:NC */ extern void immedok (WINDOW *, int); +/* SYSCALLS.c:789:NC */ extern char *index (const char *, int); +/* SYSCALLS.c:790:OC */ extern long unsigned int inet_addr (/* ??? */); +/* SYSCALLS.c:791:OC */ extern struct in_addr inet_makeaddr (/* ??? */); +/* SYSCALLS.c:792:OC */ extern long unsigned int inet_network (/* ??? */); +/* SYSCALLS.c:793:OC */ extern char *inet_ntoa (/* ??? */); +/* SYSCALLS.c:794:NC */ extern int init_color (int, int, int, int); +/* SYSCALLS.c:795:NC */ extern int init_pair (int, int, int); +/* SYSCALLS.c:796:NC */ extern int initgroups (const char *, gid_t); +/* SYSCALLS.c:797:OC */ extern WINDOW *initscr (/* ??? */); +/* SYSCALLS.c:798:NC */ extern WINDOW *initscr32 (void); +/* SYSCALLS.c:799:NC */ extern char *initstate (unsigned int, char *, int); +/* SYSCALLS.c:800:NC */ extern void insque (struct qelem *, struct qelem *); +/* SYSCALLS.c:801:NC */ extern int intrflush (WINDOW *, int); +/* SYSCALLS.c:802:NC */ extern int ioctl (int, int, ...); +/* SYSCALLS.c:803:NC */ extern int is_linetouched (WINDOW *, int); +/* SYSCALLS.c:804:NC */ extern int is_wintouched (WINDOW *); +/* SYSCALLS.c:805:NC */ extern int isalnum (int); +/* SYSCALLS.c:806:NC */ extern int isalpha (int); +/* SYSCALLS.c:807:NC */ extern int isascii (int); +/* SYSCALLS.c:808:NC */ extern int isatty (int); +/* SYSCALLS.c:809:NC */ extern int iscntrl (int); +/* SYSCALLS.c:810:NC */ extern int isdigit (int); +/* SYSCALLS.c:811:NC */ extern int isencrypt (const char *, size_t); +/* SYSCALLS.c:812:NC */ extern int isendwin (void); +/* SYSCALLS.c:813:NC */ extern int isgraph (int); +/* SYSCALLS.c:814:NC */ extern int isinf (double); +/* SYSCALLS.c:815:NC */ extern int islower (int); +/* SYSCALLS.c:816:NC */ extern int isnan (double); +/* SYSCALLS.c:817:NC */ extern int isnand (double); +/* SYSCALLS.c:818:NC */ extern int isnanf (float); +/* SYSCALLS.c:819:NC */ extern int isprint (int); +/* SYSCALLS.c:820:NC */ extern int ispunct (int); +/* SYSCALLS.c:821:NC */ extern int isspace (int); +/* SYSCALLS.c:822:NC */ extern int isupper (int); +/* SYSCALLS.c:823:NC */ extern int isxdigit (int); +/* SYSCALLS.c:824:NC */ extern int item_count (MENU *); +/* SYSCALLS.c:825:NC */ extern char *item_description (ITEM *); +/* SYSCALLS.c:826:NC */ extern int item_index (ITEM *); +/* SYSCALLS.c:827:NC */ extern PTF_void item_init (MENU *); +/* SYSCALLS.c:828:NC */ extern char *item_name (ITEM *); +/* SYSCALLS.c:829:NC */ extern OPTIONS item_opts (ITEM *); +/* SYSCALLS.c:830:NC */ extern int item_opts_off (ITEM *, OPTIONS); +/* SYSCALLS.c:831:NC */ extern int item_opts_on (ITEM *, OPTIONS); +/* SYSCALLS.c:832:NC */ extern PTF_void item_term (MENU *); +/* SYSCALLS.c:833:NC */ extern char *item_userptr (ITEM *); +/* SYSCALLS.c:834:NC */ extern int item_value (ITEM *); +/* SYSCALLS.c:835:NC */ extern int item_visible (ITEM *); +/* SYSCALLS.c:836:OC */ extern long int itol (/* ??? */); +/* SYSCALLS.c:837:NC */ extern double j0 (double); +/* SYSCALLS.c:838:NC */ extern double j1 (double); +/* SYSCALLS.c:839:NC */ extern double jn (int, double); +/* SYSCALLS.c:840:NC */ extern long int jrand48 (short unsigned int *); +/* SYSCALLS.c:841:NC */ extern char *keyname (int); +/* SYSCALLS.c:842:NC */ extern int keypad (WINDOW *, int); +/* SYSCALLS.c:843:NC */ extern int kill (pid_t, int); +/* SYSCALLS.c:844:NC */ extern char killchar (void); +/* SYSCALLS.c:845:NC */ extern int killpg (int, int); +/* SYSCALLS.c:846:NC */ extern void l3tol (long int *, const char *, int); +/* SYSCALLS.c:847:NC */ extern char *l64a (long int); +/* SYSCALLS.c:848:NC */ extern long int labs (long int); +/* SYSCALLS.c:849:OC */ extern dl_t ladd (/* ??? */); +/* SYSCALLS.c:850:NC */ extern int lchown (const char *, uid_t, gid_t); +/* SYSCALLS.c:851:NC */ extern int lckpwdf (void); +/* SYSCALLS.c:852:NC */ extern void lcong48 (short unsigned int *); +/* SYSCALLS.c:853:NC */ extern int ldaclose (struct ldfile *); +/* SYSCALLS.c:854:NC */ extern int ldahread (struct ldfile *, archdr *); +/* SYSCALLS.c:855:NC */ extern struct ldfile *ldaopen (const char *, struct ldfile *); +/* SYSCALLS.c:856:NC */ extern int ldclose (struct ldfile *); +/* SYSCALLS.c:857:NC */ extern double ldexp (double, int); +/* SYSCALLS.c:858:NC */ extern int ldfhread (struct ldfile *, struct filehdr *); +/* SYSCALLS.c:859:NC */ extern char *ldgetname (struct ldfile *, const struct syment *); +/* SYSCALLS.c:860:NC */ extern ldiv_t ldiv (long int, long int); +/* SYSCALLS.c:861:OC */ extern dl_t ldivide (/* ??? */); +/* SYSCALLS.c:862:NC */ extern int ldlinit (struct ldfile *, long int); +/* SYSCALLS.c:863:NC */ extern int ldlitem (struct ldfile *, unsigned int, struct lineno *); +/* SYSCALLS.c:864:NC */ extern int ldlread (struct ldfile *, long int, unsigned int, struct lineno *); +/* SYSCALLS.c:865:NC */ extern int ldlseek (struct ldfile *, unsigned int); +/* SYSCALLS.c:866:NC */ extern int ldnlseek (struct ldfile *, const char *); +/* SYSCALLS.c:867:NC */ extern int ldnrseek (struct ldfile *, const char *); +/* SYSCALLS.c:868:NC */ extern int ldnshread (struct ldfile *, const char *, struct scnhdr *); +/* SYSCALLS.c:869:NC */ extern int ldnsseek (struct ldfile *, const char *); +/* SYSCALLS.c:870:NC */ extern int ldohseek (struct ldfile *); +/* SYSCALLS.c:871:NC */ extern struct ldfile *ldopen (const char *, struct ldfile *); +/* SYSCALLS.c:872:NC */ extern int ldrseek (struct ldfile *, unsigned int); +/* SYSCALLS.c:873:NC */ extern int ldshread (struct ldfile *, unsigned int, struct scnhdr *); +/* SYSCALLS.c:874:NC */ extern int ldsseek (struct ldfile *, unsigned int); +/* SYSCALLS.c:875:NC */ extern long int ldtbindex (struct ldfile *); +/* SYSCALLS.c:876:NC */ extern int ldtbread (struct ldfile *, long int, struct syment *); +/* SYSCALLS.c:877:NC */ extern int ldtbseek (struct ldfile *); +/* SYSCALLS.c:878:NC */ extern int leaveok (WINDOW *, int); +/* SYSCALLS.c:879:OC */ extern dl_t lexp10 (/* ??? */); +/* SYSCALLS.c:880:NC */ extern void *lfind (const void *, const void *, size_t *, size_t, int (*) (const void *, const void *)); +/* SYSCALLS.c:881:NC */ extern double lgamma (double); +/* SYSCALLS.c:882:NC */ extern int link (const char *, const char *); +/* SYSCALLS.c:883:NC */ extern FIELD *link_field (FIELD *, int, int); +/* SYSCALLS.c:884:NC */ extern FIELDTYPE *link_fieldtype (FIELDTYPE *, FIELDTYPE *); +/* SYSCALLS.c:885:OC */ extern char **listdev (/* ??? */); +/* SYSCALLS.c:886:OC */ extern char **listdgrp (/* ??? */); +/* SYSCALLS.c:887:OC */ extern dl_t llog10 (/* ??? */); +/* SYSCALLS.c:888:OC */ extern dl_t lmul (/* ??? */); +/* SYSCALLS.c:889:NC */ extern struct lconv *localeconv (void); +/* SYSCALLS.c:890:NC */ extern struct tm *localtime (const time_t *); +/* SYSCALLS.c:891:NC */ extern int lock (int, int, long int); +/* SYSCALLS.c:892:NC */ extern int lockf (int, int, off_t); +/* SYSCALLS.c:893:NC */ extern double log (double); +/* SYSCALLS.c:894:NC */ extern double log10 (double); +/* SYSCALLS.c:895:NC */ extern float log10f (float); +/* SYSCALLS.c:896:NC */ extern double logb (double); +/* SYSCALLS.c:897:NC */ extern float logf (float); +/* SYSCALLS.c:898:NC */ extern char *logname (void); +/* SYSCALLS.c:899:NC */ extern void longjmp (jmp_buf, int); +/* SYSCALLS.c:900:NC */ extern char *longname (void); +/* SYSCALLS.c:901:NC */ extern long int lrand48 (void); +/* SYSCALLS.c:902:NC */ extern void *lsearch (const void *, void *, size_t *, size_t, int (*) (const void *, const void *)); +/* SYSCALLS.c:903:NC */ extern off_t lseek (int, off_t, int); +/* SYSCALLS.c:904:OC */ extern dl_t lshiftl (/* ??? */); +/* SYSCALLS.c:905:NC */ extern int lstat (const char *, struct stat *); +/* SYSCALLS.c:906:OC */ extern dl_t lsub (/* ??? */); +/* SYSCALLS.c:907:NC */ extern void ltol3 (char *, const long int *, int); +/* SYSCALLS.c:908:NC */ extern int m_addch (int); +/* SYSCALLS.c:909:NC */ extern int m_addstr (char *); +/* SYSCALLS.c:910:NC */ extern int m_clear (void); +/* SYSCALLS.c:911:NC */ extern int m_erase (void); +/* SYSCALLS.c:912:NC */ extern WINDOW *m_initscr (void); +/* SYSCALLS.c:913:NC */ extern int m_move (int, int); +/* SYSCALLS.c:914:NC */ extern SCREEN *m_newterm (char *, FILE *, FILE *); +/* SYSCALLS.c:915:NC */ extern int m_refresh (void); +/* SYSCALLS.c:916:NC */ extern int maillock (char *, int); +/* SYSCALLS.c:917:NC */ extern int mailunlock (void); +/* SYSCALLS.c:918:NC */ extern major_t major (dev_t); +/* SYSCALLS.c:919:OC */ extern datum makdatum (/* ??? */); +/* SYSCALLS.c:920:NC */ extern void makecontext (ucontext_t *, void (*) (/* ??? */), int, ...); +/* SYSCALLS.c:921:NC */ extern dev_t makedev (major_t, minor_t); +/* SYSCALLS.c:922:NC */ extern struct utmpx *makeutx (const struct utmpx *); +/* SYSCALLS.c:923:NC */ extern struct mallinfo mallinfo (void); +/* SYSCALLS.c:924:NC */ extern void *malloc (size_t); +/* SYSCALLS.c:925:NC */ extern int mallopt (int, int); +/* SYSCALLS.c:926:NC */ extern int map_button (long unsigned int); +/* SYSCALLS.c:927:NC */ extern int matherr (struct exception *); +/* SYSCALLS.c:928:NC */ extern int mbftowc (char *, wchar_t *, int (*) (/* ??? */), int *); +/* SYSCALLS.c:929:NC */ extern int mblen (const char *, size_t); +/* SYSCALLS.c:930:NC */ extern size_t mbstowcs (wchar_t *, const char *, size_t); +/* SYSCALLS.c:931:NC */ extern int mbtowc (wchar_t *, const char *, size_t); +/* SYSCALLS.c:932:NC */ extern void *memalign (size_t, size_t); +/* SYSCALLS.c:933:NC */ extern void *memccpy (void *, const void *, int, size_t); +/* SYSCALLS.c:934:NC */ extern void *memchr (const void *, int, size_t); +/* SYSCALLS.c:935:NC */ extern int memcmp (const void *, const void *, size_t); +/* SYSCALLS.c:936:NC */ extern void *memcpy (void *, const void *, size_t); +/* SYSCALLS.c:937:OC */ extern int memlock (/* ??? */); +/* SYSCALLS.c:938:OC */ extern int memlocked (/* ??? */); +/* SYSCALLS.c:939:NC */ extern void *memmove (void *, const void *, size_t); +/* SYSCALLS.c:940:NC */ extern void *memset (void *, int, size_t); +/* SYSCALLS.c:941:OC */ extern int memunlock (/* ??? */); +/* SYSCALLS.c:942:NC */ extern chtype menu_back (MENU *); +/* SYSCALLS.c:943:NC */ extern int menu_driver (MENU *, int); +/* SYSCALLS.c:944:NC */ extern chtype menu_fore (MENU *); +/* SYSCALLS.c:945:NC */ extern void menu_format (MENU *, int *, int *); +/* SYSCALLS.c:946:NC */ extern chtype menu_grey (MENU *); +/* SYSCALLS.c:947:NC */ extern PTF_void menu_init (MENU *); +/* SYSCALLS.c:948:NC */ extern ITEM **menu_items (MENU *); +/* SYSCALLS.c:949:NC */ extern char *menu_mark (MENU *); +/* SYSCALLS.c:950:NC */ extern OPTIONS menu_opts (MENU *); +/* SYSCALLS.c:951:NC */ extern int menu_opts_off (MENU *, OPTIONS); +/* SYSCALLS.c:952:NC */ extern int menu_opts_on (MENU *, OPTIONS); +/* SYSCALLS.c:953:NC */ extern int menu_pad (MENU *); +/* SYSCALLS.c:954:NC */ extern char *menu_pattern (MENU *); +/* SYSCALLS.c:955:NC */ extern WINDOW *menu_sub (MENU *); +/* SYSCALLS.c:956:NC */ extern PTF_void menu_term (MENU *); +/* SYSCALLS.c:957:NC */ extern char *menu_userptr (MENU *); +/* SYSCALLS.c:958:NC */ extern WINDOW *menu_win (MENU *); +/* SYSCALLS.c:959:NC */ extern int meta (WINDOW *, int); +/* SYSCALLS.c:960:NC */ extern void mfree (struct map *, size_t, u_long); +/* SYSCALLS.c:961:NC */ extern int mincore (caddr_t, size_t, char *); +/* SYSCALLS.c:962:NC */ extern minor_t minor (dev_t); +/* SYSCALLS.c:963:NC */ extern int mkdir (const char *, mode_t); +/* SYSCALLS.c:964:NC */ extern int mkdirp (const char *, mode_t); +/* SYSCALLS.c:965:NC */ extern int mkfifo (const char *, mode_t); +/* SYSCALLS.c:966:NC */ extern int mknod (const char *, mode_t, dev_t); +/* SYSCALLS.c:967:NC */ extern int mkstemp (char *); +/* SYSCALLS.c:968:NC */ extern char *mktemp (char *); +/* SYSCALLS.c:969:NC */ extern time_t mktime (struct tm *); +/* SYSCALLS.c:970:OC */ extern caddr_t mmap (/* ??? */); +/* SYSCALLS.c:971:NC */ extern double modf (double, double *); +/* SYSCALLS.c:972:NC */ extern float modff (float, float *); +/* SYSCALLS.c:973:NC */ extern struct utmpx *modutx (const struct utmpx *); +/* SYSCALLS.c:974:NC */ extern void monitor (int (*) (/* ??? */), int (*) (/* ??? */), WORD *, int, int); +/* SYSCALLS.c:975:NC */ extern int mount (const char *, const char *, int, ...); +/* SYSCALLS.c:976:NC */ extern int mouse_off (long int); +/* SYSCALLS.c:977:NC */ extern int mouse_on (long int); +/* SYSCALLS.c:978:NC */ extern int mouse_set (long int); +/* SYSCALLS.c:979:NC */ extern int move_field (FIELD *, int, int); +/* SYSCALLS.c:980:NC */ extern int move_panel (PANEL *, int, int); +/* SYSCALLS.c:981:OC */ extern int mprotect (/* ??? */); +/* SYSCALLS.c:982:NC */ extern long int mrand48 (void); +/* SYSCALLS.c:983:NC */ extern int msgctl (int, int, ...); +/* SYSCALLS.c:984:NC */ extern int msgget (key_t, int); +/* SYSCALLS.c:985:NC */ extern int msgrcv (int, void *, size_t, long int, int); +/* SYSCALLS.c:986:NC */ extern int msgsnd (int, const void *, size_t, int); +/* SYSCALLS.c:987:OC */ extern int munmap (/* ??? */); +/* SYSCALLS.c:988:NC */ extern int mvcur (int, int, int, int); +/* SYSCALLS.c:989:NC */ extern int mvderwin (WINDOW *, int, int); +/* SYSCALLS.c:990:NC */ extern int mvprintw (int, int, ...); +/* SYSCALLS.c:991:NC */ extern int mvscanw (int, int, ...); +/* SYSCALLS.c:992:NC */ extern int mvwin (WINDOW *, int, int); +/* SYSCALLS.c:993:NC */ extern int mvwprintw (WINDOW *, int, int, ...); +/* SYSCALLS.c:994:NC */ extern int mvwscanw (WINDOW *, int, int, ...); +/* SYSCALLS.c:995:NC */ extern int napms (int); +/* SYSCALLS.c:996:NC */ extern void netdir_free (char *, int); +/* SYSCALLS.c:997:NC */ extern int netdir_getbyaddr (struct netconfig *, struct nd_hostservlist **, struct netbuf *); +/* SYSCALLS.c:998:NC */ extern int netdir_getbyname (struct netconfig *, struct nd_hostserv *, struct nd_addrlist **); +/* SYSCALLS.c:999:NC */ extern int netdir_options (struct netconfig *, int, int, char *); +/* SYSCALLS.c:1000:NC */ extern void netdir_perror (char *); +/* SYSCALLS.c:1001:OC */ extern char *netdir_sperror (/* ??? */); +/* SYSCALLS.c:1002:NC */ extern FIELD *new_field (int, int, int, int, int, int); +/* SYSCALLS.c:1003:NC */ extern FIELDTYPE *new_fieldtype (PTF_int, PTF_int); +/* SYSCALLS.c:1004:NC */ extern FORM *new_form (FIELD **); +/* SYSCALLS.c:1005:NC */ extern ITEM *new_item (char *, char *); +/* SYSCALLS.c:1006:NC */ extern MENU *new_menu (ITEM **); +/* SYSCALLS.c:1007:NC */ extern int new_page (FIELD *); +/* SYSCALLS.c:1008:NC */ extern PANEL *new_panel (WINDOW *); +/* SYSCALLS.c:1009:NC */ extern int newkey (char *, int, int); +/* SYSCALLS.c:1010:NC */ extern WINDOW *newpad (int, int); +/* SYSCALLS.c:1011:NC */ extern SCREEN *newscreen (char *, int, int, int, FILE *, FILE *); +/* SYSCALLS.c:1012:NC */ extern SCREEN *newterm32 (char *, FILE *, FILE *); +/* SYSCALLS.c:1013:NC */ extern WINDOW *newwin (int, int, int, int); +/* SYSCALLS.c:1014:NC */ extern double nextafter (double, double); +/* SYSCALLS.c:1015:NC */ extern datum nextkey (datum); +/* SYSCALLS.c:1016:NC */ extern int nftw (const char *, int (*) (const char *, const struct stat *, int, struct FTW *), int, int); +/* SYSCALLS.c:1017:NC */ extern int nice (int); +/* SYSCALLS.c:1018:NC */ extern int nl (void); +/* SYSCALLS.c:1019:NC */ extern char *nl_langinfo (nl_item); +/* SYSCALLS.c:1020:NC */ extern int nlist (const char *, struct nlist *); +/* SYSCALLS.c:1021:NC */ extern int nocbreak (void); +/* SYSCALLS.c:1022:NC */ extern int nocrmode (void); +/* SYSCALLS.c:1023:NC */ extern int nodelay (WINDOW *, int); +/* SYSCALLS.c:1024:NC */ extern int noecho (void); +/* SYSCALLS.c:1025:NC */ extern int nonl (void); +/* SYSCALLS.c:1026:NC */ extern int noraw (void); +/* SYSCALLS.c:1027:NC */ extern int notimeout (WINDOW *, int); +/* SYSCALLS.c:1028:NC */ extern long int nrand48 (short unsigned int *); +/* SYSCALLS.c:1029:OC */ extern int ns_close (/* ??? */); +/* SYSCALLS.c:1030:OC */ extern struct nssend *ns_rcv (/* ??? */); +/* SYSCALLS.c:1031:OC */ extern int ns_send (/* ??? */); +/* SYSCALLS.c:1032:OC */ extern int ns_setup (/* ??? */); +/* SYSCALLS.c:1033:NC */ extern long unsigned int ntohl (long unsigned int); +/* SYSCALLS.c:1034:NC */ extern short unsigned int ntohs (unsigned int); +/* SYSCALLS.c:1035:NC */ extern int nuname (struct utsname *); +/* SYSCALLS.c:1036:NC */ extern int open (const char *, int, ...); +/* SYSCALLS.c:1037:NC */ extern DIR *opendir (const char *); +/* SYSCALLS.c:1038:OC */ extern int openprivwait (/* ??? */); +/* SYSCALLS.c:1039:OC */ extern int openwait (/* ??? */); +/* SYSCALLS.c:1040:NC */ extern int overlay (WINDOW *, WINDOW *); +/* SYSCALLS.c:1041:NC */ extern int overwrite (WINDOW *, WINDOW *); +/* SYSCALLS.c:1042:NC */ extern int p2close (FILE **); +/* SYSCALLS.c:1043:NC */ extern int p2open (const char *, FILE **); +/* SYSCALLS.c:1044:NC */ extern int p32echochar (WINDOW *, chtype); +/* SYSCALLS.c:1045:OC */ extern char *p_cdname (/* ??? */); +/* SYSCALLS.c:1046:OC */ extern char *p_class (/* ??? */); +/* SYSCALLS.c:1047:OC */ extern char *p_rr (/* ??? */); +/* SYSCALLS.c:1048:OC */ extern char *p_type (/* ??? */); +/* SYSCALLS.c:1049:NC */ extern int pair_content (int, short int *, short int *); +/* SYSCALLS.c:1050:NC */ extern PANEL *panel_above (PANEL *); +/* SYSCALLS.c:1051:NC */ extern PANEL *panel_below (PANEL *); +/* SYSCALLS.c:1052:NC */ extern char *panel_userptr (PANEL *); +/* SYSCALLS.c:1053:NC */ extern WINDOW *panel_window (PANEL *); +/* SYSCALLS.c:1054:NC */ extern long int pathconf (const char *, int); +/* SYSCALLS.c:1055:NC */ extern char *pathfind (const char *, const char *, const char *); +/* SYSCALLS.c:1056:NC */ extern int pause (void); +/* SYSCALLS.c:1057:NC */ extern int pclose (FILE *); +/* SYSCALLS.c:1058:NC */ extern void perror (const char *); +/* SYSCALLS.c:1059:OC */ extern struct pfdat *pfind (/* ??? */); +/* SYSCALLS.c:1060:OC */ extern int pglstlk (/* ??? */); +/* SYSCALLS.c:1061:OC */ extern int pglstunlk (/* ??? */); +/* SYSCALLS.c:1062:NC */ extern int pid_slot (proc_t *); +/* SYSCALLS.c:1063:NC */ extern int pipe (int *); +/* SYSCALLS.c:1064:NC */ extern int plock (int); +/* SYSCALLS.c:1065:OC */ extern struct pmaplist *pmap_getmaps (/* ??? */); +/* SYSCALLS.c:1066:OC */ extern u_short pmap_getport (/* ??? */); +/* SYSCALLS.c:1067:OC */ extern enum clnt_stat pmap_rmtcall (/* ??? */); +/* SYSCALLS.c:1068:OC */ extern int pmap_set (/* ??? */); +/* SYSCALLS.c:1069:OC */ extern int pmap_unset (/* ??? */); +/* SYSCALLS.c:1070:NC */ extern int pnoutrefresh (WINDOW *, int, int, int, int, int, int); +/* SYSCALLS.c:1071:NC */ extern int poll (struct pollfd *, long unsigned int, int); +/* SYSCALLS.c:1072:NC */ extern FILE *popen (const char *, const char *); +/* SYSCALLS.c:1073:NC */ extern int pos_form_cursor (FORM *); +/* SYSCALLS.c:1074:NC */ extern int pos_menu_cursor (MENU *); +/* SYSCALLS.c:1075:NC */ extern int post_form (FORM *); +/* SYSCALLS.c:1076:NC */ extern int post_menu (MENU *); +/* SYSCALLS.c:1077:NC */ extern double pow (double, double); +/* SYSCALLS.c:1078:NC */ extern float powf (float, float); +/* SYSCALLS.c:1079:NC */ extern int prefresh (WINDOW *, int, int, int, int, int, int); +/* SYSCALLS.c:1080:NC */ extern int printf (const char *, ...); +/* SYSCALLS.c:1081:NC */ extern int printw (char *, ...); +/* SYSCALLS.c:1082:OC */ extern void privsig (/* ??? */); +/* SYSCALLS.c:1083:NC */ extern void profil (short unsigned int *, size_t, int, unsigned int); +/* SYSCALLS.c:1084:NC */ extern void psiginfo (siginfo_t *, char *); +/* SYSCALLS.c:1085:NC */ extern void psignal (int, const char *); +/* SYSCALLS.c:1086:NC */ extern int ptrace (int, pid_t, int, int); +/* SYSCALLS.c:1087:NC */ extern int putc (int, FILE *); +/* SYSCALLS.c:1088:NC */ extern int putchar (int); +/* SYSCALLS.c:1089:NC */ extern int putenv (char *); +/* SYSCALLS.c:1090:NC */ extern int putmsg (int, const struct strbuf *, const struct strbuf *, int); +/* SYSCALLS.c:1091:NC */ extern int putp (char *); +/* SYSCALLS.c:1092:NC */ extern int putpmsg (int, const struct strbuf *, const struct strbuf *, int, int); +/* SYSCALLS.c:1093:NC */ extern int putpwent (const struct passwd *, FILE *); +/* SYSCALLS.c:1094:NC */ extern int puts (const char *); +/* SYSCALLS.c:1095:NC */ extern int putspent (const struct spwd *, FILE *); +/* SYSCALLS.c:1096:NC */ extern struct utmp *pututline (const struct utmp *); +/* SYSCALLS.c:1097:NC */ extern struct utmpx *pututxline (const struct utmpx *); +/* SYSCALLS.c:1098:NC */ extern int putw (int, FILE *); +/* SYSCALLS.c:1099:NC */ extern int putwin (WINDOW *, FILE *); +/* SYSCALLS.c:1100:NC */ extern void qsort (void *, size_t, size_t, int (*) (const void *, const void *)); +/* SYSCALLS.c:1101:NC */ extern int raise (int); +/* SYSCALLS.c:1102:NC */ extern int rand (void); +/* SYSCALLS.c:1103:NC */ extern long int random (void); +/* SYSCALLS.c:1104:NC */ extern int raw (void); +/* SYSCALLS.c:1105:NC */ extern int read (int, void *, size_t); +/* SYSCALLS.c:1106:NC */ extern struct dirent *readdir (DIR *); +/* SYSCALLS.c:1107:NC */ extern int readlink (const char *, char *, size_t); +/* SYSCALLS.c:1108:NC */ extern void *realloc (void *, size_t); +/* SYSCALLS.c:1109:NC */ extern char *realpath (char *, char *); +/* SYSCALLS.c:1110:NC */ extern int redrawwin (WINDOW *); +/* SYSCALLS.c:1111:NC */ extern char *regcmp (const char *, ...); +/* SYSCALLS.c:1112:NC */ extern char *regex (const char *, const char *, ...); +/* SYSCALLS.c:1113:NC */ extern double remainder (double, double); +/* SYSCALLS.c:1114:OC */ extern int remio (/* ??? */); +/* SYSCALLS.c:1115:NC */ extern int remove (const char *); +/* SYSCALLS.c:1116:NC */ extern void remque (struct qelem *); +/* SYSCALLS.c:1117:NC */ extern int rename (const char *, const char *); +/* SYSCALLS.c:1118:NC */ extern int replace_panel (PANEL *, WINDOW *); +/* SYSCALLS.c:1119:NC */ extern int request_mouse_pos (void); +/* SYSCALLS.c:1120:OC */ extern struct reservdev **reservdev (/* ??? */); +/* SYSCALLS.c:1121:NC */ extern int reset_prog_mode (void); +/* SYSCALLS.c:1122:NC */ extern int reset_shell_mode (void); +/* SYSCALLS.c:1123:NC */ extern int resetty (void); +/* SYSCALLS.c:1124:NC */ extern int restartterm (char *, int, int *); +/* SYSCALLS.c:1125:NC */ extern void rewind (FILE *); +/* SYSCALLS.c:1126:NC */ extern void rewinddir (DIR *); +/* SYSCALLS.c:1127:OC */ extern int rf_falloc (/* ??? */); +/* SYSCALLS.c:1128:NC */ extern char *rindex (const char *, int); +/* SYSCALLS.c:1129:NC */ extern double rint (double); +/* SYSCALLS.c:1130:NC */ extern int ripoffline (int, int (*) (WINDOW *, int)); +/* SYSCALLS.c:1131:NC */ extern int rmdir (const char *); +/* SYSCALLS.c:1132:NC */ extern int rmdirp (char *, char *); +/* SYSCALLS.c:1133:OC */ extern enum clnt_stat rpc_broadcast (/* ??? */); +/* SYSCALLS.c:1134:OC */ extern enum clnt_stat rpc_call (/* ??? */); +/* SYSCALLS.c:1135:OC */ extern int rpcb_getaddr (/* ??? */); +/* SYSCALLS.c:1136:OC */ extern RPCBLIST *rpcb_getmaps (/* ??? */); +/* SYSCALLS.c:1137:OC */ extern int rpcb_gettime (/* ??? */); +/* SYSCALLS.c:1138:OC */ extern enum clnt_stat rpcb_rmtcall (/* ??? */); +/* SYSCALLS.c:1139:OC */ extern int rpcb_set (/* ??? */); +/* SYSCALLS.c:1140:OC */ extern char *rpcb_taddr2uaddr (/* ??? */); +/* SYSCALLS.c:1141:OC */ extern struct netbuf *rpcb_uaddr2taddr (/* ??? */); +/* SYSCALLS.c:1142:OC */ extern int rpcb_unset (/* ??? */); +/* SYSCALLS.c:1143:OC */ extern void rpctest_service (/* ??? */); +/* SYSCALLS.c:1144:NC */ extern int run_crypt (long int, char *, unsigned int, int *); +/* SYSCALLS.c:1145:NC */ extern int run_setkey (int *, const char *); +/* SYSCALLS.c:1146:NC */ extern int savetty (void); +/* SYSCALLS.c:1147:NC */ extern void *sbrk (int); +/* SYSCALLS.c:1148:NC */ extern double scalb (double, double); +/* SYSCALLS.c:1149:NC */ extern int scale_form (FORM *, int *, int *); +/* SYSCALLS.c:1150:NC */ extern int scale_menu (MENU *, int *, int *); +/* SYSCALLS.c:1151:NC */ extern int scanf (const char *, ...); +/* SYSCALLS.c:1152:NC */ extern int scanw (char *, ...); +/* SYSCALLS.c:1153:NC */ extern int scr_dump (char *); +/* SYSCALLS.c:1154:NC */ extern int scr_init (char *); +/* SYSCALLS.c:1155:NC */ extern int scr_restore (char *); +/* SYSCALLS.c:1156:NC */ extern int scroll (WINDOW *); +/* SYSCALLS.c:1157:NC */ extern int scrollok (WINDOW *, int); +/* SYSCALLS.c:1158:NC */ extern int scrwidth (wchar_t); +/* SYSCALLS.c:1159:NC */ extern int sdfree (char *); +/* SYSCALLS.c:1160:NC */ extern char *sdget (char *, int, ...); +/* SYSCALLS.c:1161:NC */ extern short unsigned int *seed48 (short unsigned int *); +/* SYSCALLS.c:1162:NC */ extern void seekdir (DIR *, long int); +/* SYSCALLS.c:1163:NC */ extern int semctl (int, int, int, ...); +/* SYSCALLS.c:1164:NC */ extern int semget (key_t, int, int); +/* SYSCALLS.c:1165:NC */ extern int semop (int, struct sembuf *, unsigned int); +/* SYSCALLS.c:1166:NC */ extern int send (int, char *, int, int); +/* SYSCALLS.c:1167:NC */ extern int set_current_field (FORM *, FIELD *); +/* SYSCALLS.c:1168:NC */ extern int set_current_item (MENU *, ITEM *); +/* SYSCALLS.c:1169:NC */ extern int set_field_back (FIELD *, chtype); +/* SYSCALLS.c:1170:NC */ extern int set_field_buffer (FIELD *, int, char *); +/* SYSCALLS.c:1171:NC */ extern int set_field_fore (FIELD *, chtype); +/* SYSCALLS.c:1172:NC */ extern int set_field_init (FORM *, PTF_void); +/* SYSCALLS.c:1173:NC */ extern int set_field_just (FIELD *, int); +/* SYSCALLS.c:1174:NC */ extern int set_field_opts (FIELD *, OPTIONS); +/* SYSCALLS.c:1175:NC */ extern int set_field_pad (FIELD *, int); +/* SYSCALLS.c:1176:NC */ extern int set_field_status (FIELD *, int); +/* SYSCALLS.c:1177:NC */ extern int set_field_term (FORM *, PTF_void); +/* SYSCALLS.c:1178:NC */ extern int set_field_type (FIELD *, FIELDTYPE *, ...); +/* SYSCALLS.c:1179:NC */ extern int set_field_userptr (FIELD *, char *); +/* SYSCALLS.c:1180:NC */ extern int set_fieldtype_arg (FIELDTYPE *, PTF_charP, PTF_charP, PTF_void); +/* SYSCALLS.c:1181:NC */ extern int set_fieldtype_choice (FIELDTYPE *, PTF_int, PTF_int); +/* SYSCALLS.c:1182:NC */ extern int set_form_fields (FORM *, FIELD **); +/* SYSCALLS.c:1183:NC */ extern int set_form_init (FORM *, PTF_void); +/* SYSCALLS.c:1184:NC */ extern int set_form_opts (FORM *, OPTIONS); +/* SYSCALLS.c:1185:NC */ extern int set_form_page (FORM *, int); +/* SYSCALLS.c:1186:NC */ extern int set_form_sub (FORM *, WINDOW *); +/* SYSCALLS.c:1187:NC */ extern int set_form_term (FORM *, PTF_void); +/* SYSCALLS.c:1188:NC */ extern int set_form_userptr (FORM *, char *); +/* SYSCALLS.c:1189:NC */ extern int set_form_win (FORM *, WINDOW *); +/* SYSCALLS.c:1190:NC */ extern int set_item_init (MENU *, PTF_void); +/* SYSCALLS.c:1191:NC */ extern int set_item_opts (ITEM *, OPTIONS); +/* SYSCALLS.c:1192:NC */ extern int set_item_term (MENU *, PTF_void); +/* SYSCALLS.c:1193:NC */ extern int set_item_userptr (ITEM *, char *); +/* SYSCALLS.c:1194:NC */ extern int set_item_value (ITEM *, int); +/* SYSCALLS.c:1195:NC */ extern int set_max_field (FIELD *, int); +/* SYSCALLS.c:1196:NC */ extern int set_menu_back (MENU *, chtype); +/* SYSCALLS.c:1197:NC */ extern int set_menu_fore (MENU *, chtype); +/* SYSCALLS.c:1198:NC */ extern int set_menu_format (MENU *, int, int); +/* SYSCALLS.c:1199:NC */ extern int set_menu_grey (MENU *, chtype); +/* SYSCALLS.c:1200:NC */ extern int set_menu_init (MENU *, PTF_void); +/* SYSCALLS.c:1201:NC */ extern int set_menu_items (MENU *, ITEM **); +/* SYSCALLS.c:1202:NC */ extern int set_menu_mark (MENU *, char *); +/* SYSCALLS.c:1203:NC */ extern int set_menu_opts (MENU *, OPTIONS); +/* SYSCALLS.c:1204:NC */ extern int set_menu_pad (MENU *, int); +/* SYSCALLS.c:1205:NC */ extern int set_menu_pattern (MENU *, char *); +/* SYSCALLS.c:1206:NC */ extern int set_menu_sub (MENU *, WINDOW *); +/* SYSCALLS.c:1207:NC */ extern int set_menu_term (MENU *, PTF_void); +/* SYSCALLS.c:1208:NC */ extern int set_menu_userptr (MENU *, char *); +/* SYSCALLS.c:1209:NC */ extern int set_menu_win (MENU *, WINDOW *); +/* SYSCALLS.c:1210:NC */ extern int set_new_page (FIELD *, int); +/* SYSCALLS.c:1211:NC */ extern int set_panel_userptr (PANEL *, char *); +/* SYSCALLS.c:1212:NC */ extern int set_top_row (MENU *, int); +/* SYSCALLS.c:1213:NC */ extern void setbuf (FILE *, char *); +/* SYSCALLS.c:1214:NC */ extern int setcontext (ucontext_t *); +/* SYSCALLS.c:1215:NC */ extern SCREEN *setcurscreen (SCREEN *); +/* SYSCALLS.c:1216:NC */ extern TERMINAL *setcurterm (TERMINAL *); +/* SYSCALLS.c:1217:NC */ extern FILE *setexportent (void); +/* SYSCALLS.c:1218:NC */ extern int setgid (gid_t); +/* SYSCALLS.c:1219:NC */ extern void setgrent (void); +/* SYSCALLS.c:1220:NC */ extern int setgroups (int, const gid_t *); +/* SYSCALLS.c:1221:NC */ extern int sethostname (char *, int); +/* SYSCALLS.c:1222:NC */ extern int setitimer (int, struct itimerval *, struct itimerval *); +/* SYSCALLS.c:1223:NC */ extern int setjmp (jmp_buf); +/* SYSCALLS.c:1224:NC */ extern void setkey (const char *); +/* SYSCALLS.c:1225:NC */ extern char *setlocale (int, const char *); +/* SYSCALLS.c:1226:NC */ extern FILE *setmntent (char *, char *); +/* SYSCALLS.c:1227:NC */ extern void *setnetconfig (void); +/* SYSCALLS.c:1228:NC */ extern void *setnetpath (void); +/* SYSCALLS.c:1229:NC */ extern int setpgid (pid_t, pid_t); +/* SYSCALLS.c:1230:NC */ extern pid_t setpgrp (void); +/* SYSCALLS.c:1231:NC */ extern int setpgrp2 (pid_t, pid_t); +/* SYSCALLS.c:1232:NC */ extern int setpriority (int, int, int); +/* SYSCALLS.c:1233:OC */ extern int setprivwait (/* ??? */); +/* SYSCALLS.c:1234:NC */ extern void setpwent (void); +/* SYSCALLS.c:1235:NC */ extern int setregid (gid_t, gid_t); +/* SYSCALLS.c:1236:NC */ extern int setreuid (uid_t, uid_t); +/* SYSCALLS.c:1237:NC */ extern int setrlimit (int, struct rlimit *); +/* SYSCALLS.c:1238:NC */ extern int setrpcent (int); +/* SYSCALLS.c:1239:NC */ extern pid_t setsid (void); +/* SYSCALLS.c:1240:NC */ extern void setspent (void); +/* SYSCALLS.c:1241:NC */ extern char *setstate (char *); +/* SYSCALLS.c:1242:NC */ extern int setsyx (int, int); +/* SYSCALLS.c:1243:NC */ extern int setterm (char *); +/* SYSCALLS.c:1244:NC */ extern int setuid (uid_t); +/* SYSCALLS.c:1245:NC */ extern int setupterm (char *, int, int *); +/* SYSCALLS.c:1246:NC */ extern void setutent (void); +/* SYSCALLS.c:1247:NC */ extern void setutxent (void); +/* SYSCALLS.c:1248:NC */ extern int setvbuf (FILE *, char *, int, size_t); +/* SYSCALLS.c:1249:NC */ extern long int sgetl (const char *); +/* SYSCALLS.c:1250:NC */ extern void *shmat (int, void *, int); +/* SYSCALLS.c:1251:NC */ extern int shmctl (int, int, ...); +/* SYSCALLS.c:1252:NC */ extern int shmdt (void *); +/* SYSCALLS.c:1253:NC */ extern int shmget (key_t, int, int); +/* SYSCALLS.c:1254:NC */ extern int show_panel (PANEL *); +/* SYSCALLS.c:1255:NC */ extern int sigaction (int, const struct sigaction *, struct sigaction *); +/* SYSCALLS.c:1256:NC */ extern int sigaddset (sigset_t *, int); +/* SYSCALLS.c:1257:NC */ extern int sigaltstack (const stack_t *, stack_t *); +/* SYSCALLS.c:1258:NC */ extern int sigblock (int); +/* SYSCALLS.c:1259:NC */ extern int sigdelset (sigset_t *, int); +/* SYSCALLS.c:1260:NC */ extern int sigemptyset (sigset_t *); +/* SYSCALLS.c:1261:NC */ extern int sigfillset (sigset_t *); +/* SYSCALLS.c:1262:NC */ extern int sighold (int); +/* SYSCALLS.c:1263:NC */ extern int sigignore (int); +/* SYSCALLS.c:1264:NC */ extern int siginterrupt (int, int); +/* SYSCALLS.c:1265:NC */ extern int sigismember (const sigset_t *, int); +/* SYSCALLS.c:1266:NC */ extern void siglongjmp (sigjmp_buf, int); +/* SYSCALLS.c:1267:NC */ extern void (*signal (int, void (*) (int))) (int); +/* SYSCALLS.c:1268:NC */ extern int sigpause (int); +/* SYSCALLS.c:1269:NC */ extern int sigpending (sigset_t *); +/* SYSCALLS.c:1270:NC */ extern int sigprocmask (int, const sigset_t *, sigset_t *); +/* SYSCALLS.c:1271:NC */ extern int sigrelse (int); +/* SYSCALLS.c:1272:NC */ extern int sigsend (idtype_t, id_t, int); +/* SYSCALLS.c:1273:NC */ extern int sigsendset (const procset_t *, int); +/* SYSCALLS.c:1274:NC */ extern void (*sigset (int, void (*) (int))) (int); +/* SYSCALLS.c:1275:NC */ extern int sigsetjmp (sigjmp_buf, int); +/* SYSCALLS.c:1276:NC */ extern int sigsetmask (int); +/* SYSCALLS.c:1277:NC */ extern int sigsuspend (sigset_t *); +/* SYSCALLS.c:1278:NC */ extern double sin (double); +/* SYSCALLS.c:1279:NC */ extern float sinf (float); +/* SYSCALLS.c:1280:NC */ extern double sinh (double); +/* SYSCALLS.c:1281:NC */ extern float sinhf (float); +/* SYSCALLS.c:1282:NC */ extern unsigned int sleep (unsigned int); +/* SYSCALLS.c:1283:NC */ extern int slk_attroff (chtype); +/* SYSCALLS.c:1284:NC */ extern int slk_attron (chtype); +/* SYSCALLS.c:1285:NC */ extern int slk_attrset (chtype); +/* SYSCALLS.c:1286:NC */ extern int slk_clear (void); +/* SYSCALLS.c:1287:NC */ extern int slk_init (int); +/* SYSCALLS.c:1288:NC */ extern char *slk_label (int); +/* SYSCALLS.c:1289:NC */ extern int slk_noutrefresh (void); +/* SYSCALLS.c:1290:NC */ extern int slk_refresh (void); +/* SYSCALLS.c:1291:NC */ extern int slk_restore (void); +/* SYSCALLS.c:1292:NC */ extern int slk_set (int, char *, int); +/* SYSCALLS.c:1293:NC */ extern int slk_start (int, int *); +/* SYSCALLS.c:1294:NC */ extern int slk_touch (void); +/* SYSCALLS.c:1295:NC */ extern int socket (int, int, int); +/* SYSCALLS.c:1296:OC */ extern void *sprayproc_clear_1 (/* ??? */); +/* SYSCALLS.c:1297:OC */ extern spraycumul *sprayproc_get_1 (/* ??? */); +/* SYSCALLS.c:1298:OC */ extern void *sprayproc_spray_1 (/* ??? */); +/* SYSCALLS.c:1299:NC */ extern int sprintf (char *, const char *, ...); +/* SYSCALLS.c:1300:NC */ extern void sputl (long int, char *); +/* SYSCALLS.c:1301:NC */ extern double sqrt (double); +/* SYSCALLS.c:1302:NC */ extern float sqrtf (float); +/* SYSCALLS.c:1303:NC */ extern void srand (unsigned int); +/* SYSCALLS.c:1304:NC */ extern void srand48 (long int); +/* SYSCALLS.c:1305:NC */ extern void srandom (int); +/* SYSCALLS.c:1306:NC */ extern int sscanf (const char *, const char *, ...); +/* SYSCALLS.c:1307:NC */ extern int (*ssignal (int, int (*) (int))) (int); +/* SYSCALLS.c:1308:NC */ extern int start_color (void); +/* SYSCALLS.c:1309:NC */ extern int stat (const char *, struct stat *); +/* SYSCALLS.c:1310:NC */ extern int statfs (const char *, struct statfs *, int, int); +/* SYSCALLS.c:1311:NC */ extern int statvfs (const char *, struct statvfs *); +/* SYSCALLS.c:1312:NC */ extern int step (const char *, const char *); +/* SYSCALLS.c:1313:NC */ extern int stime (const time_t *); +/* SYSCALLS.c:1314:NC */ extern struct netbuf *stoa (char *, struct netbuf *); +/* SYSCALLS.c:1315:NC */ extern void store (datum, datum); +/* SYSCALLS.c:1316:NC */ extern char *strcadd (char *, const char *); +/* SYSCALLS.c:1317:NC */ extern int strcasecmp (const char *, const char *); +/* SYSCALLS.c:1318:NC */ extern char *strcat (char *, const char *); +/* SYSCALLS.c:1319:NC */ extern char *strccpy (char *, const char *); +/* SYSCALLS.c:1320:NC */ extern char *strchr (const char *, int); +/* SYSCALLS.c:1321:OC */ extern void strclearctty (/* ??? */); +/* SYSCALLS.c:1322:OC */ extern void strclearpg (/* ??? */); +/* SYSCALLS.c:1323:OC */ extern void strclearsid (/* ??? */); +/* SYSCALLS.c:1324:NC */ extern int strcmp (const char *, const char *); +/* SYSCALLS.c:1325:NC */ extern int strcoll (const char *, const char *); +/* SYSCALLS.c:1326:NC */ extern char *strcpy (char *, const char *); +/* SYSCALLS.c:1327:NC */ extern size_t strcspn (const char *, const char *); +/* SYSCALLS.c:1328:NC */ extern char *strdup (const char *); +/* SYSCALLS.c:1329:NC */ extern char *streadd (char *, const char *, const char *); +/* SYSCALLS.c:1330:NC */ extern char *strecpy (char *, const char *, const char *); +/* SYSCALLS.c:1331:NC */ extern char *strerror (int); +/* SYSCALLS.c:1332:NC */ extern int strfind (const char *, const char *); +/* SYSCALLS.c:1333:NC */ extern size_t strftime (char *, size_t, const char *, const struct tm *); +/* SYSCALLS.c:1334:NC */ extern size_t strlen (const char *); +/* SYSCALLS.c:1335:NC */ extern int strncasecmp (const char *, const char *, size_t); +/* SYSCALLS.c:1336:NC */ extern char *strncat (char *, const char *, size_t); +/* SYSCALLS.c:1337:NC */ extern int strncmp (const char *, const char *, size_t); +/* SYSCALLS.c:1338:NC */ extern char *strncpy (char *, const char *, size_t); +/* SYSCALLS.c:1339:NC */ extern char *strpbrk (const char *, const char *); +/* SYSCALLS.c:1340:NC */ extern char *strrchr (const char *, int); +/* SYSCALLS.c:1341:NC */ extern char *strrspn (const char *, const char *); +/* SYSCALLS.c:1342:NC */ extern size_t strspn (const char *, const char *); +/* SYSCALLS.c:1343:NC */ extern char *strstr (const char *, const char *); +/* SYSCALLS.c:1344:NC */ extern double strtod (const char *, char **); +/* SYSCALLS.c:1345:NC */ extern char *strtok (char *, const char *); +/* SYSCALLS.c:1346:NC */ extern long int strtol (const char *, char **, int); +/* SYSCALLS.c:1347:NC */ extern long unsigned int strtoul (const char *, char **, int); +/* SYSCALLS.c:1348:NC */ extern char *strtrns (const char *, const char *, const char *, char *); +/* SYSCALLS.c:1349:NC */ extern size_t strxfrm (char *, const char *, size_t); +/* SYSCALLS.c:1350:NC */ extern WINDOW *subpad (WINDOW *, int, int, int, int); +/* SYSCALLS.c:1351:NC */ extern WINDOW *subwin (WINDOW *, int, int, int, int); +/* SYSCALLS.c:1352:OC */ extern int svc_create (/* ??? */); +/* SYSCALLS.c:1353:OC */ extern SVCXPRT *svc_fd_create (/* ??? */); +/* SYSCALLS.c:1354:OC */ extern void svc_getreqset (/* ??? */); +/* SYSCALLS.c:1355:OC */ extern SVCXPRT *svc_raw_create (/* ??? */); +/* SYSCALLS.c:1356:OC */ extern int svc_reg (/* ??? */); +/* SYSCALLS.c:1357:OC */ extern SVCXPRT *svc_tli_create (/* ??? */); +/* SYSCALLS.c:1358:OC */ extern SVCXPRT *svc_tp_create (/* ??? */); +/* SYSCALLS.c:1359:OC */ extern void svc_unreg (/* ??? */); +/* SYSCALLS.c:1360:OC */ extern SVCXPRT *svc_vc_create (/* ??? */); +/* SYSCALLS.c:1361:OC */ extern void svcerr_systemerr (/* ??? */); +/* SYSCALLS.c:1362:OC */ extern SVCXPRT *svcfd_create (/* ??? */); +/* SYSCALLS.c:1363:OC */ extern SVCXPRT *svcraw_create (/* ??? */); +/* SYSCALLS.c:1364:OC */ extern SVCXPRT *svctcp_create (/* ??? */); +/* SYSCALLS.c:1365:OC */ extern SVCXPRT *svcudp_bufcreate (/* ??? */); +/* SYSCALLS.c:1366:OC */ extern SVCXPRT *svcudp_create (/* ??? */); +/* SYSCALLS.c:1367:NC */ extern void swab (const char *, char *, int); +/* SYSCALLS.c:1368:NC */ extern int swapcontext (ucontext_t *, ucontext_t *); +/* SYSCALLS.c:1369:NC */ extern int symlink (const char *, const char *); +/* SYSCALLS.c:1370:NC */ extern void sync (void); +/* SYSCALLS.c:1371:NC */ extern int syncok (WINDOW *, int); +/* SYSCALLS.c:1372:NC */ extern int syscall (int, ...); +/* SYSCALLS.c:1373:NC */ extern long int sysconf (int); +/* SYSCALLS.c:1374:NC */ extern int sysfs (int, ...); +/* SYSCALLS.c:1375:NC */ extern int sysinfo (int, char *, long int); +/* SYSCALLS.c:1376:NC */ extern int system (const char *); +/* SYSCALLS.c:1377:NC */ extern char *taddr2uaddr (struct netconfig *, struct netbuf *); +/* SYSCALLS.c:1378:NC */ extern double tan (double); +/* SYSCALLS.c:1379:NC */ extern float tanf (float); +/* SYSCALLS.c:1380:NC */ extern double tanh (double); +/* SYSCALLS.c:1381:NC */ extern float tanhf (float); +/* SYSCALLS.c:1382:NC */ extern int tcdrain (int); +/* SYSCALLS.c:1383:NC */ extern int tcflow (int, int); +/* SYSCALLS.c:1384:NC */ extern int tcflush (int, int); +/* SYSCALLS.c:1385:NC */ extern int tcgetattr (int, struct termios *); +/* SYSCALLS.c:1386:NC */ extern pid_t tcgetpgrp (int); +/* SYSCALLS.c:1387:NC */ extern pid_t tcgetsid (int); +/* SYSCALLS.c:1388:NC */ extern int tcsendbreak (int, int); +/* SYSCALLS.c:1389:NC */ extern int tcsetattr (int, int, const struct termios *); +/* SYSCALLS.c:1390:NC */ extern int tcsetpgrp (int, pid_t); +/* SYSCALLS.c:1391:NC */ extern void *tdelete (const void *, void **, int (*) (const void *, const void *)); +/* SYSCALLS.c:1392:NC */ extern long int telldir (DIR *); +/* SYSCALLS.c:1393:NC */ extern char *tempnam (const char *, const char *); +/* SYSCALLS.c:1394:NC */ extern chtype termattrs (void); +/* SYSCALLS.c:1395:NC */ extern void termerr (void); +/* SYSCALLS.c:1396:NC */ extern char *termname (void); +/* SYSCALLS.c:1397:NC */ extern void *tfind (const void *, void *const *, int (*) (const void *, const void *)); +/* SYSCALLS.c:1398:NC */ extern int tgetent (char *, char *); +/* SYSCALLS.c:1399:NC */ extern int tgetflag (char *); +/* SYSCALLS.c:1400:NC */ extern int tgetnum (char *); +/* SYSCALLS.c:1401:NC */ extern char *tgetstr (char *, char **); +/* SYSCALLS.c:1402:NC */ extern char *tgoto (char *, int, int); +/* SYSCALLS.c:1403:NC */ extern char *tigetstr (char *); +/* SYSCALLS.c:1404:NC */ extern time_t time (time_t *); +/* SYSCALLS.c:1405:NC */ extern clock_t times (struct tms *); +/* SYSCALLS.c:1406:NC */ extern char *timezone (int, int); +/* SYSCALLS.c:1407:NC */ extern void tinputfd (int); +/* SYSCALLS.c:1408:NC */ extern FILE *tmpfile (void); +/* SYSCALLS.c:1409:NC */ extern char *tmpnam (char *); +/* SYSCALLS.c:1410:NC */ extern int toascii (int); +/* SYSCALLS.c:1411:NC */ extern int tolower (int); +/* SYSCALLS.c:1412:NC */ extern int top_panel (PANEL *); +/* SYSCALLS.c:1413:NC */ extern int top_row (MENU *); +/* SYSCALLS.c:1414:NC */ extern int touchline (WINDOW *, int, int); +/* SYSCALLS.c:1415:NC */ extern int touchwin (WINDOW *); +/* SYSCALLS.c:1416:NC */ extern int toupper (int); +/* SYSCALLS.c:1417:OC */ extern char *tparm (/* ??? */); +/* SYSCALLS.c:1418:NC */ extern int tputs (char *, int, int (*) (char)); +/* SYSCALLS.c:1419:NC */ extern int traceoff (void); +/* SYSCALLS.c:1420:NC */ extern int traceon (void); +/* SYSCALLS.c:1421:NC */ extern int truncate (const char *, off_t); +/* SYSCALLS.c:1422:NC */ extern void *tsearch (const void *, void **, int (*) (const void *, const void *)); +/* SYSCALLS.c:1423:NC */ extern char *ttyname (int); +/* SYSCALLS.c:1424:NC */ extern int ttyslot (void); +/* SYSCALLS.c:1425:NC */ extern void twalk (void *, void (*) (void *, VISIT, int)); +/* SYSCALLS.c:1426:NC */ extern int typeahead (int); +/* SYSCALLS.c:1427:NC */ extern void tzset (void); +/* SYSCALLS.c:1428:NC */ extern struct netbuf *uaddr2taddr (struct netconfig *, char *); +/* SYSCALLS.c:1429:NC */ extern int uadmin (int, int, int); +/* SYSCALLS.c:1430:NC */ extern unsigned int ualarm (unsigned int, unsigned int); +/* SYSCALLS.c:1431:NC */ extern int ulckpwdf (void); +/* SYSCALLS.c:1432:NC */ extern long int ulimit (int, ...); +/* SYSCALLS.c:1433:NC */ extern mode_t umask (mode_t); +/* SYSCALLS.c:1434:NC */ extern int umount (const char *); +/* SYSCALLS.c:1435:NC */ extern int uname (struct utsname *); +/* SYSCALLS.c:1436:NC */ extern char *unctrl (int); +/* SYSCALLS.c:1437:NC */ extern void undial (int); +/* SYSCALLS.c:1438:NC */ extern int ungetc (int, FILE *); +/* SYSCALLS.c:1439:NC */ extern int ungetch (int); +/* SYSCALLS.c:1440:NC */ extern int unlink (const char *); +/* SYSCALLS.c:1441:NC */ extern int unordered (double, double); +/* SYSCALLS.c:1442:NC */ extern int unpost_form (FORM *); +/* SYSCALLS.c:1443:NC */ extern int unpost_menu (MENU *); +/* SYSCALLS.c:1444:OC */ extern int unremio (/* ??? */); +/* SYSCALLS.c:1445:NC */ extern int untouchwin (WINDOW *); +/* SYSCALLS.c:1446:NC */ extern void update_panels (void); +/* SYSCALLS.c:1447:NC */ extern void updwtmp (const char *, struct utmp *); +/* SYSCALLS.c:1448:NC */ extern void updwtmpx (const char *, struct utmpx *); +/* SYSCALLS.c:1449:NC */ extern void use_env (int); +/* SYSCALLS.c:1450:NC */ extern unsigned int usleep (unsigned int); +/* SYSCALLS.c:1451:NC */ extern int ustat (dev_t, struct ustat *); +/* SYSCALLS.c:1452:NC */ extern int utime (const char *, const struct utimbuf *); +/* SYSCALLS.c:1453:NC */ extern int utmpname (const char *); +/* SYSCALLS.c:1454:NC */ extern int utmpxname (const char *); +/* SYSCALLS.c:1455:NC */ extern void va_end (__gnuc_va_list); +/* SYSCALLS.c:1456:NC */ extern int vadvise (int); +/* SYSCALLS.c:1457:NC */ extern void *valloc (size_t); +/* SYSCALLS.c:1458:NC */ extern pid_t vfork (void); +/* SYSCALLS.c:1459:NC */ extern int vfprintf (FILE *, const char *, __gnuc_va_list); +/* SYSCALLS.c:1460:NC */ extern int vhangup (void); +/* SYSCALLS.c:1461:NC */ extern int vid32attr (chtype); +/* SYSCALLS.c:1462:NC */ extern int vid32puts (chtype, int (*) (char)); +/* SYSCALLS.c:1463:NC */ extern void vidupdate (chtype, chtype, int (*) (char)); +/* SYSCALLS.c:1464:OC */ extern int vn_close (/* ??? */); +/* SYSCALLS.c:1465:NC */ extern int vprintf (const char *, __gnuc_va_list); +/* SYSCALLS.c:1466:NC */ extern int vsprintf (char *, const char *, __gnuc_va_list); +/* SYSCALLS.c:1467:NC */ extern int vwprintw (WINDOW *, char *, void *); +/* SYSCALLS.c:1468:NC */ extern int vwscanw (WINDOW *, char *, void *); +/* SYSCALLS.c:1469:NC */ extern int w32addch (WINDOW *, chtype); +/* SYSCALLS.c:1470:NC */ extern int w32attroff (WINDOW *, chtype); +/* SYSCALLS.c:1471:NC */ extern int w32attron (WINDOW *, chtype); +/* SYSCALLS.c:1472:NC */ extern int w32attrset (WINDOW *, chtype); +/* SYSCALLS.c:1473:NC */ extern int w32echochar (WINDOW *, chtype); +/* SYSCALLS.c:1474:NC */ extern int w32insch (WINDOW *, chtype); +/* SYSCALLS.c:1475:NC */ extern int waddchnstr (WINDOW *, chtype *, int); +/* SYSCALLS.c:1476:NC */ extern int waddnstr (WINDOW *, char *, int); +/* SYSCALLS.c:1477:NC */ extern int waddstr (WINDOW *, char *); +/* SYSCALLS.c:1478:NC */ extern pid_t wait (int *); +/* SYSCALLS.c:1479:NC */ extern pid_t wait3 (union wait *, int, struct rusage *); +/* SYSCALLS.c:1480:NC */ extern int waitid (idtype_t, id_t, siginfo_t *, int); +/* SYSCALLS.c:1481:NC */ extern pid_t waitpid (pid_t, int *, int); +/* SYSCALLS.c:1482:OC */ extern void *wallproc_wall_1 (/* ??? */); +/* SYSCALLS.c:1483:NC */ extern int wbkgd (WINDOW *, chtype); +/* SYSCALLS.c:1484:NC */ extern void wbkgdset (WINDOW *, chtype); +/* SYSCALLS.c:1485:NC */ extern int wborder (WINDOW *, chtype, chtype, chtype, chtype, chtype, chtype, chtype, chtype); +/* SYSCALLS.c:1486:NC */ extern int wclear (WINDOW *); +/* SYSCALLS.c:1487:NC */ extern int wclrtobot (WINDOW *); +/* SYSCALLS.c:1488:NC */ extern int wclrtoeol (WINDOW *); +/* SYSCALLS.c:1489:NC */ extern size_t wcstombs (char *, const wchar_t *, size_t); +/* SYSCALLS.c:1490:NC */ extern int wctomb (char *, wchar_t); +/* SYSCALLS.c:1491:NC */ extern void wcursyncup (WINDOW *); +/* SYSCALLS.c:1492:NC */ extern int wdelch (WINDOW *); +/* SYSCALLS.c:1493:NC */ extern int wdeleteln (WINDOW *); +/* SYSCALLS.c:1494:NC */ extern int werase (WINDOW *); +/* SYSCALLS.c:1495:NC */ extern int wgetch (WINDOW *); +/* SYSCALLS.c:1496:NC */ extern int wgetnstr (WINDOW *, char *, int); +/* SYSCALLS.c:1497:NC */ extern int wgetstr (WINDOW *, char *); +/* SYSCALLS.c:1498:NC */ extern int whline (WINDOW *, chtype, int); +/* SYSCALLS.c:1499:NC */ extern chtype winch (WINDOW *); +/* SYSCALLS.c:1500:NC */ extern int winchnstr (WINDOW *, chtype *, int); +/* SYSCALLS.c:1501:NC */ extern int winchstr (WINDOW *, chtype *); +/* SYSCALLS.c:1502:NC */ extern int winnstr (WINDOW *, char *, int); +/* SYSCALLS.c:1503:NC */ extern int winsdelln (WINDOW *, int); +/* SYSCALLS.c:1504:NC */ extern int winsertln (WINDOW *); +/* SYSCALLS.c:1505:NC */ extern int winsnstr (WINDOW *, char *, int); +/* SYSCALLS.c:1506:NC */ extern int winstr (WINDOW *, char *); +/* SYSCALLS.c:1507:NC */ extern int wisprint (wchar_t); +/* SYSCALLS.c:1508:NC */ extern void wmouse_position (WINDOW *, int *, int *); +/* SYSCALLS.c:1509:NC */ extern int wmove (WINDOW *, int, int); +/* SYSCALLS.c:1510:NC */ extern int wnoutrefresh (WINDOW *); +/* SYSCALLS.c:1511:NC */ extern int wprintw (WINDOW *, ...); +/* SYSCALLS.c:1512:NC */ extern int wredrawln (WINDOW *, int, int); +/* SYSCALLS.c:1513:NC */ extern int wrefresh (WINDOW *); +/* SYSCALLS.c:1514:NC */ extern int write (int, const void *, size_t); +/* SYSCALLS.c:1515:NC */ extern int wscanw (WINDOW *, ...); +/* SYSCALLS.c:1516:NC */ extern int wscrl (WINDOW *, int); +/* SYSCALLS.c:1517:NC */ extern int wsetscrreg (WINDOW *, int, int); +/* SYSCALLS.c:1518:NC */ extern int wstandend (WINDOW *); +/* SYSCALLS.c:1519:NC */ extern int wstandout (WINDOW *); +/* SYSCALLS.c:1520:NC */ extern void wsyncdown (WINDOW *); +/* SYSCALLS.c:1521:NC */ extern void wsyncup (WINDOW *); +/* SYSCALLS.c:1522:NC */ extern void wtimeout (WINDOW *, int); +/* SYSCALLS.c:1523:NC */ extern int wtouchln (WINDOW *, int, int, int); +/* SYSCALLS.c:1524:NC */ extern int wvline (WINDOW *, chtype, int); +/* SYSCALLS.c:1525:OC */ extern bool xdr_datum (/* ??? */); +/* SYSCALLS.c:1526:OC */ extern int xdr_double (/* ??? */); +/* SYSCALLS.c:1527:OC */ extern int xdr_exports (/* ??? */); +/* SYSCALLS.c:1528:OC */ extern int xdr_fhstatus (/* ??? */); +/* SYSCALLS.c:1529:OC */ extern int xdr_float (/* ??? */); +/* SYSCALLS.c:1530:OC */ extern int xdr_keybuf (/* ??? */); +/* SYSCALLS.c:1531:OC */ extern int xdr_mountlist (/* ??? */); +/* SYSCALLS.c:1532:OC */ extern int xdr_netbuf (/* ??? */); +/* SYSCALLS.c:1533:OC */ extern int xdr_path (/* ??? */); +/* SYSCALLS.c:1534:OC */ extern int xdr_pmap (/* ??? */); +/* SYSCALLS.c:1535:OC */ extern int xdr_pmaplist (/* ??? */); +/* SYSCALLS.c:1536:OC */ extern int xdr_pointer (/* ??? */); +/* SYSCALLS.c:1537:OC */ extern int xdr_reference (/* ??? */); +/* SYSCALLS.c:1538:OC */ extern int xdr_rmtcall_args (/* ??? */); +/* SYSCALLS.c:1539:OC */ extern int xdr_rmtcallres (/* ??? */); +/* SYSCALLS.c:1540:OC */ extern int xdr_rpcb (/* ??? */); +/* SYSCALLS.c:1541:OC */ extern int xdr_rpcb_rmtcallargs (/* ??? */); +/* SYSCALLS.c:1542:OC */ extern int xdr_rpcb_rmtcallres (/* ??? */); +/* SYSCALLS.c:1543:OC */ extern int xdr_rpcblist (/* ??? */); +/* SYSCALLS.c:1544:OC */ extern int xdr_sprayarr (/* ??? */); +/* SYSCALLS.c:1545:OC */ extern int xdr_spraycumul (/* ??? */); +/* SYSCALLS.c:1546:OC */ extern int xdr_spraytimeval (/* ??? */); +/* SYSCALLS.c:1547:OC */ extern int xdr_u_char (/* ??? */); +/* SYSCALLS.c:1548:OC */ extern int xdr_utmparr (/* ??? */); +/* SYSCALLS.c:1549:OC */ extern int xdr_utmpidlearr (/* ??? */); +/* SYSCALLS.c:1550:OC */ extern int xdr_vector (/* ??? */); +/* SYSCALLS.c:1551:OC */ extern int xdr_yp_buf (/* ??? */); +/* SYSCALLS.c:1552:OC */ extern bool xdr_yp_inaddr (/* ??? */); +/* SYSCALLS.c:1553:OC */ extern bool xdr_ypall (/* ??? */); +/* SYSCALLS.c:1554:OC */ extern int xdr_ypdelete_args (/* ??? */); +/* SYSCALLS.c:1555:OC */ extern bool xdr_ypdomain_wrap_string (/* ??? */); +/* SYSCALLS.c:1556:OC */ extern bool xdr_ypmap_parms (/* ??? */); +/* SYSCALLS.c:1557:OC */ extern bool xdr_ypmap_wrap_string (/* ??? */); +/* SYSCALLS.c:1558:OC */ extern bool xdr_ypowner_wrap_string (/* ??? */); +/* SYSCALLS.c:1559:OC */ extern bool xdr_yppushresp_xfr (/* ??? */); +/* SYSCALLS.c:1560:OC */ extern bool xdr_ypreq_key (/* ??? */); +/* SYSCALLS.c:1561:OC */ extern bool xdr_ypreq_newxfr (/* ??? */); +/* SYSCALLS.c:1562:OC */ extern bool xdr_ypreq_nokey (/* ??? */); +/* SYSCALLS.c:1563:OC */ extern bool xdr_ypreq_xfr (/* ??? */); +/* SYSCALLS.c:1564:OC */ extern bool xdr_ypresp_key_val (/* ??? */); +/* SYSCALLS.c:1565:OC */ extern bool xdr_ypresp_maplist (/* ??? */); +/* SYSCALLS.c:1566:OC */ extern bool xdr_ypresp_master (/* ??? */); +/* SYSCALLS.c:1567:OC */ extern bool xdr_ypresp_order (/* ??? */); +/* SYSCALLS.c:1568:OC */ extern bool xdr_ypresp_val (/* ??? */); +/* SYSCALLS.c:1569:OC */ extern int xdr_ypupdate_args (/* ??? */); +/* SYSCALLS.c:1570:OC */ extern void xdrrec_create (/* ??? */); +/* SYSCALLS.c:1571:OC */ extern int xdrrec_endofrecord (/* ??? */); +/* SYSCALLS.c:1572:OC */ extern int xdrrec_eof (/* ??? */); +/* SYSCALLS.c:1573:OC */ extern int xdrrec_skiprecord (/* ??? */); +/* SYSCALLS.c:1574:OC */ extern void xdrstdio_create (/* ??? */); +/* SYSCALLS.c:1575:OC */ extern void xprt_register (/* ??? */); +/* SYSCALLS.c:1576:OC */ extern void xprt_unregister (/* ??? */); +/* SYSCALLS.c:1577:NC */ extern double y0 (double); +/* SYSCALLS.c:1578:NC */ extern double y1 (double); +/* SYSCALLS.c:1579:NC */ extern double yn (int, double); +/* SYSCALLS.c:1580:NC */ extern int yp_all (char *, char *, struct ypall_callback *); +/* SYSCALLS.c:1581:NC */ extern int yp_bind (const char *); +/* SYSCALLS.c:1582:NC */ extern int yp_first (char *, char *, char **, int *, char **, int *); +/* SYSCALLS.c:1583:NC */ extern int yp_get_default_domain (char **); +/* SYSCALLS.c:1584:NC */ extern int yp_master (char *, char *, char **); +/* SYSCALLS.c:1585:NC */ extern int yp_match (char *, char *, char *, int, char **, int *); +/* SYSCALLS.c:1586:NC */ extern int yp_next (char *, char *, char *, int, char **, int *, char **, int *); +/* SYSCALLS.c:1587:NC */ extern int yp_order (char *, char *, int *); +/* SYSCALLS.c:1588:NC */ extern void yp_unbind (const char *); +/* SYSCALLS.c:1589:NC */ extern char *yperr_string (int); +/* SYSCALLS.c:1590:NC */ extern int ypprot_err (unsigned int); +/* SYSCALLS.c:1591:OC */ extern u_int *ypu_change_1 (/* ??? */); +/* SYSCALLS.c:1592:OC */ extern u_int *ypu_delete_1 (/* ??? */); +/* SYSCALLS.c:1593:OC */ extern u_int *ypu_insert_1 (/* ??? */); +/* SYSCALLS.c:1594:OC */ extern u_int *ypu_store_1 (/* ??? */); diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/cc1 b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/cc1 new file mode 100755 index 0000000..d0e4b0a Binary files /dev/null and b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/cc1 differ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/collect2 b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/collect2 new file mode 100755 index 0000000..e379d89 Binary files /dev/null and b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/collect2 differ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/cpp b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/cpp new file mode 100755 index 0000000..008c8c4 Binary files /dev/null and b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/cpp differ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/README b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/README new file mode 100644 index 0000000..4b303dd --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/README @@ -0,0 +1,9 @@ +This README file is copied into the directory for GCC-only header files +when fixincludes is run by the makefile for GCC. + +Many of the files in this directory were made from the standard system +header files of this system by the shell script `fixincludes'. +They are system-specific, and will not work on any other kind of system. +They are also not part of GCC. The reason for making the files here +is to fix the places in the header files which use constructs +that are incompatible with ANSI C. diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/float.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/float.h new file mode 100644 index 0000000..7dbe4e9 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/float.h @@ -0,0 +1,96 @@ +/* float.h for target with IEEE 32 bit and 64 bit floating point formats */ +#ifndef _FLOAT_H_ +#define _FLOAT_H_ +/* Produced by enquire version 4.3, CWI, Amsterdam */ + + /* Radix of exponent representation */ +#undef FLT_RADIX +#define FLT_RADIX 2 + /* Number of base-FLT_RADIX digits in the significand of a float */ +#undef FLT_MANT_DIG +#define FLT_MANT_DIG 24 + /* Number of decimal digits of precision in a float */ +#undef FLT_DIG +#define FLT_DIG 6 + /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */ +#undef FLT_ROUNDS +#define FLT_ROUNDS 1 + /* Difference between 1.0 and the minimum float greater than 1.0 */ +#undef FLT_EPSILON +#define FLT_EPSILON 1.19209290e-07F + /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */ +#undef FLT_MIN_EXP +#define FLT_MIN_EXP (-125) + /* Minimum normalised float */ +#undef FLT_MIN +#define FLT_MIN 1.17549435e-38F + /* Minimum int x such that 10**x is a normalised float */ +#undef FLT_MIN_10_EXP +#define FLT_MIN_10_EXP (-37) + /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */ +#undef FLT_MAX_EXP +#define FLT_MAX_EXP 128 + /* Maximum float */ +#undef FLT_MAX +#define FLT_MAX 3.40282347e+38F + /* Maximum int x such that 10**x is a representable float */ +#undef FLT_MAX_10_EXP +#define FLT_MAX_10_EXP 38 + + /* Number of base-FLT_RADIX digits in the significand of a double */ +#undef DBL_MANT_DIG +#define DBL_MANT_DIG 53 + /* Number of decimal digits of precision in a double */ +#undef DBL_DIG +#define DBL_DIG 15 + /* Difference between 1.0 and the minimum double greater than 1.0 */ +#undef DBL_EPSILON +#define DBL_EPSILON 2.2204460492503131e-16 + /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */ +#undef DBL_MIN_EXP +#define DBL_MIN_EXP (-1021) + /* Minimum normalised double */ +#undef DBL_MIN +#define DBL_MIN 2.2250738585072014e-308 + /* Minimum int x such that 10**x is a normalised double */ +#undef DBL_MIN_10_EXP +#define DBL_MIN_10_EXP (-307) + /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */ +#undef DBL_MAX_EXP +#define DBL_MAX_EXP 1024 + /* Maximum double */ +#undef DBL_MAX +#define DBL_MAX 1.7976931348623157e+308 + /* Maximum int x such that 10**x is a representable double */ +#undef DBL_MAX_10_EXP +#define DBL_MAX_10_EXP 308 + + /* Number of base-FLT_RADIX digits in the significand of a long double */ +#undef LDBL_MANT_DIG +#define LDBL_MANT_DIG 53 + /* Number of decimal digits of precision in a long double */ +#undef LDBL_DIG +#define LDBL_DIG 15 + /* Difference between 1.0 and the minimum long double greater than 1.0 */ +#undef LDBL_EPSILON +#define LDBL_EPSILON 2.2204460492503131e-16L + /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */ +#undef LDBL_MIN_EXP +#define LDBL_MIN_EXP (-1021) + /* Minimum normalised long double */ +#undef LDBL_MIN +#define LDBL_MIN 2.2250738585072014e-308L + /* Minimum int x such that 10**x is a normalised long double */ +#undef LDBL_MIN_10_EXP +#define LDBL_MIN_10_EXP (-307) + /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */ +#undef LDBL_MAX_EXP +#define LDBL_MAX_EXP 1024 + /* Maximum long double */ +#undef LDBL_MAX +#define LDBL_MAX 1.7976931348623157e+308L + /* Maximum int x such that 10**x is a representable long double */ +#undef LDBL_MAX_10_EXP +#define LDBL_MAX_10_EXP 308 + +#endif /* _FLOAT_H_ */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/iso646.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/iso646.h new file mode 100644 index 0000000..77ebdd3 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/iso646.h @@ -0,0 +1,15 @@ +/* Macros for C programs written in national variants of ISO 646. */ + +#ifndef __cplusplus +#define and && +#define and_eq &= +#define bitand & +#define bitor | +#define compl ~ +#define not ! +#define not_eq != +#define or || +#define or_eq |= +#define xor ^ +#define xor_eq ^= +#endif diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/limits.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/limits.h new file mode 100644 index 0000000..559e712 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/limits.h @@ -0,0 +1,98 @@ +#ifndef _LIMITS_H___ +#ifndef _MACH_MACHLIMITS_H_ + +/* _MACH_MACHLIMITS_H_ is used on OSF/1. */ +#define _LIMITS_H___ +#define _MACH_MACHLIMITS_H_ + +/* Number of bits in a `char'. */ +#undef CHAR_BIT +#define CHAR_BIT 8 + +/* Maximum length of a multibyte character. */ +#ifndef MB_LEN_MAX +#define MB_LEN_MAX 1 +#endif + +/* Minimum and maximum values a `signed char' can hold. */ +#undef SCHAR_MIN +#define SCHAR_MIN (-128) +#undef SCHAR_MAX +#define SCHAR_MAX 127 + +/* Maximum value an `unsigned char' can hold. (Minimum is 0). */ +#undef UCHAR_MAX +#define UCHAR_MAX 255 + +/* Minimum and maximum values a `char' can hold. */ +#ifdef __CHAR_UNSIGNED__ +#undef CHAR_MIN +#define CHAR_MIN 0 +#undef CHAR_MAX +#define CHAR_MAX 255 +#else +#undef CHAR_MIN +#define CHAR_MIN (-128) +#undef CHAR_MAX +#define CHAR_MAX 127 +#endif + +/* Minimum and maximum values a `signed short int' can hold. */ +#undef SHRT_MIN +/* For the sake of 16 bit hosts, we may not use -32768 */ +#define SHRT_MIN (-32767-1) +#undef SHRT_MAX +#define SHRT_MAX 32767 + +/* Maximum value an `unsigned short int' can hold. (Minimum is 0). */ +#undef USHRT_MAX +#define USHRT_MAX 65535 + +/* Minimum and maximum values a `signed int' can hold. */ +#ifndef __INT_MAX__ +#define __INT_MAX__ 2147483647 +#endif +#undef INT_MIN +#define INT_MIN (-INT_MAX-1) +#undef INT_MAX +#define INT_MAX __INT_MAX__ + +/* Maximum value an `unsigned int' can hold. (Minimum is 0). */ +#undef UINT_MAX +#define UINT_MAX (INT_MAX * 2U + 1) + +/* Minimum and maximum values a `signed long int' can hold. + (Same as `int'). */ +#ifndef __LONG_MAX__ +#if defined (__alpha__) || defined (__sparc_v9__) || defined (__sparcv9) +#define __LONG_MAX__ 9223372036854775807L +#else +#define __LONG_MAX__ 2147483647L +#endif /* __alpha__ || sparc64 */ +#endif +#undef LONG_MIN +#define LONG_MIN (-LONG_MAX-1) +#undef LONG_MAX +#define LONG_MAX __LONG_MAX__ + +/* Maximum value an `unsigned long int' can hold. (Minimum is 0). */ +#undef ULONG_MAX +#define ULONG_MAX (LONG_MAX * 2UL + 1) + +#if defined (__GNU_LIBRARY__) ? defined (__USE_GNU) : !defined (__STRICT_ANSI__) +/* Minimum and maximum values a `signed long long int' can hold. */ +#ifndef __LONG_LONG_MAX__ +#define __LONG_LONG_MAX__ 9223372036854775807LL +#endif +#undef LONG_LONG_MIN +#define LONG_LONG_MIN (-LONG_LONG_MAX-1) +#undef LONG_LONG_MAX +#define LONG_LONG_MAX __LONG_LONG_MAX__ + +/* Maximum value an `unsigned long long int' can hold. (Minimum is 0). */ +#undef ULONG_LONG_MAX +#define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1) +#endif + +#endif /* _MACH_MACHLIMITS_H_ */ +#endif /* _LIMITS_H___ */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/proto.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/proto.h new file mode 100644 index 0000000..cc48915 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/proto.h @@ -0,0 +1,4 @@ +/* This header file is to avoid trouble with semi-ANSI header files + on the Convex in system version 8.0. */ + +#define _PROTO(list) () diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/stdarg.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/stdarg.h new file mode 100644 index 0000000..3607db1 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/stdarg.h @@ -0,0 +1,212 @@ +/* stdarg.h for GNU. + Note that the type used in va_arg is supposed to match the + actual type **after default promotions**. + Thus, va_arg (..., short) is not valid. */ + +#ifndef _STDARG_H +#ifndef _ANSI_STDARG_H_ +#ifndef __need___va_list +#define _STDARG_H +#define _ANSI_STDARG_H_ +#endif /* not __need___va_list */ +#undef __need___va_list + +#ifdef __clipper__ +#include "va-clipper.h" +#else +#ifdef __m88k__ +#include "va-m88k.h" +#else +#ifdef __i860__ +#include "va-i860.h" +#else +#ifdef __hppa__ +#include "va-pa.h" +#else +#ifdef __mips__ +#include "va-mips.h" +#else +#ifdef __sparc__ +#include "va-sparc.h" +#else +#ifdef __i960__ +#include "va-i960.h" +#else +#ifdef __alpha__ +#include "va-alpha.h" +#else +#if defined (__H8300__) || defined (__H8300H__) || defined (__H8300S__) +#include "va-h8300.h" +#else +#if defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32)) +#include "va-ppc.h" +#else +#ifdef __arc__ +#include "va-arc.h" +#else +#ifdef __M32R__ +#include "va-m32r.h" +#else +#ifdef __sh__ +#include "va-sh.h" +#else +#ifdef __mn10300__ +#include "va-mn10300.h" +#else +#ifdef __mn10200__ +#include "va-mn10200.h" +#else +#ifdef __v850__ +#include "va-v850.h" +#else +#if defined (_TMS320C4x) || defined (_TMS320C3x) +#include +#else + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +#if defined(__svr4__) || defined(_AIX) || defined(_M_UNIX) || defined(__NetBSD__) +typedef char *__gnuc_va_list; +#else +typedef void *__gnuc_va_list; +#endif +#endif + +/* Define the standard macros for the user, + if this invocation was from the user program. */ +#ifdef _STDARG_H + +/* Amount of space required in an argument list for an arg of type TYPE. + TYPE may alternatively be an expression whose type is used. */ + +#if defined(sysV68) +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (short) - 1) / sizeof (short)) * sizeof (short)) +#elif defined(_AIX) +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (long) - 1) / sizeof (long)) * sizeof (long)) +#else +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) +#endif + +#define va_start(AP, LASTARG) \ + (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) + +#undef va_end +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ +#define va_end(AP) ((void)0) + +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. */ + +#if (defined (__arm__) && ! defined (__ARMEB__)) || defined (__i386__) || defined (__i860__) || defined (__ns32000__) || defined (__vax__) +/* This is for little-endian machines; small args are padded upward. */ +#define va_arg(AP, TYPE) \ + (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ + *((TYPE *) (void *) ((char *) (AP) - __va_rounded_size (TYPE)))) +#else /* big-endian */ +/* This is for big-endian machines; small args are padded downward. */ +#define va_arg(AP, TYPE) \ + (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ + *((TYPE *) (void *) ((char *) (AP) \ + - ((sizeof (TYPE) < __va_rounded_size (char) \ + ? sizeof (TYPE) : __va_rounded_size (TYPE)))))) +#endif /* big-endian */ + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* _STDARG_H */ + +#endif /* not TMS320C3x or TMS320C4x */ +#endif /* not v850 */ +#endif /* not mn10200 */ +#endif /* not mn10300 */ +#endif /* not sh */ +#endif /* not m32r */ +#endif /* not arc */ +#endif /* not powerpc with V.4 calling sequence */ +#endif /* not h8300 */ +#endif /* not alpha */ +#endif /* not i960 */ +#endif /* not sparc */ +#endif /* not mips */ +#endif /* not hppa */ +#endif /* not i860 */ +#endif /* not m88k */ +#endif /* not clipper */ + +#ifdef _STDARG_H +/* Define va_list, if desired, from __gnuc_va_list. */ +/* We deliberately do not define va_list when called from + stdio.h, because ANSI C says that stdio.h is not supposed to define + va_list. stdio.h needs to have access to that data type, + but must not use that name. It should use the name __gnuc_va_list, + which is safe because it is reserved for the implementation. */ + +#ifdef _HIDDEN_VA_LIST /* On OSF1, this means varargs.h is "half-loaded". */ +#undef _VA_LIST +#endif + +#ifdef _BSD_VA_LIST +#undef _BSD_VA_LIST +#endif + +#if defined(__svr4__) || (defined(_SCO_DS) && !defined(__VA_LIST)) +/* SVR4.2 uses _VA_LIST for an internal alias for va_list, + so we must avoid testing it and setting it here. + SVR4 uses _VA_LIST as a flag in stdarg.h, but we should + have no conflict with that. */ +#ifndef _VA_LIST_ +#define _VA_LIST_ +#ifdef __i860__ +#ifndef _VA_LIST +#define _VA_LIST va_list +#endif +#endif /* __i860__ */ +typedef __gnuc_va_list va_list; +#ifdef _SCO_DS +#define __VA_LIST +#endif +#endif /* _VA_LIST_ */ +#else /* not __svr4__ || _SCO_DS */ + +/* The macro _VA_LIST_ is the same thing used by this file in Ultrix. + But on BSD NET2 we must not test or define or undef it. + (Note that the comments in NET 2's ansi.h + are incorrect for _VA_LIST_--see stdio.h!) */ +#if !defined (_VA_LIST_) || defined (__BSD_NET2__) || defined (____386BSD____) || defined (__bsdi__) || defined (__sequent__) || defined (__FreeBSD__) || defined(WINNT) +/* The macro _VA_LIST_DEFINED is used in Windows NT 3.5 */ +#ifndef _VA_LIST_DEFINED +/* The macro _VA_LIST is used in SCO Unix 3.2. */ +#ifndef _VA_LIST +/* The macro _VA_LIST_T_H is used in the Bull dpx2 */ +#ifndef _VA_LIST_T_H +typedef __gnuc_va_list va_list; +#endif /* not _VA_LIST_T_H */ +#endif /* not _VA_LIST */ +#endif /* not _VA_LIST_DEFINED */ +#if !(defined (__BSD_NET2__) || defined (____386BSD____) || defined (__bsdi__) || defined (__sequent__) || defined (__FreeBSD__)) +#define _VA_LIST_ +#endif +#ifndef _VA_LIST +#define _VA_LIST +#endif +#ifndef _VA_LIST_DEFINED +#define _VA_LIST_DEFINED +#endif +#ifndef _VA_LIST_T_H +#define _VA_LIST_T_H +#endif + +#endif /* not _VA_LIST_, except on certain systems */ + +#endif /* not __svr4__ */ + +#endif /* _STDARG_H */ + +#endif /* not _ANSI_STDARG_H_ */ +#endif /* not _STDARG_H */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/stdbool.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/stdbool.h new file mode 100644 index 0000000..0baf9ce --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/stdbool.h @@ -0,0 +1,20 @@ +/* stdbool.h for GNU. */ +#ifndef __STDBOOL_H__ +#define __STDBOOL_H__ 1 + +/* The type `bool' must promote to `int' or `unsigned int'. The constants + `true' and `false' must have the value 0 and 1 respectively. */ +typedef enum + { + false = 0, + true = 1 + } bool; + +/* The names `true' and `false' must also be made available as macros. */ +#define false false +#define true true + +/* Signal that all the definitions are present. */ +#define __bool_true_false_are_defined 1 + +#endif /* stdbool.h */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/stddef.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/stddef.h new file mode 100644 index 0000000..615052e --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/stddef.h @@ -0,0 +1,342 @@ +#if (!defined(_STDDEF_H) && !defined(_STDDEF_H_) && !defined(_ANSI_STDDEF_H) \ + && !defined(__STDDEF_H__)) \ + || defined(__need_wchar_t) || defined(__need_size_t) \ + || defined(__need_ptrdiff_t) || defined(__need_NULL) \ + || defined(__need_wint_t) + +/* Any one of these symbols __need_* means that GNU libc + wants us just to define one data type. So don't define + the symbols that indicate this file's entire job has been done. */ +#if (!defined(__need_wchar_t) && !defined(__need_size_t) \ + && !defined(__need_ptrdiff_t) && !defined(__need_NULL) \ + && !defined(__need_wint_t)) +#define _STDDEF_H +#define _STDDEF_H_ +/* snaroff@next.com says the NeXT needs this. */ +#define _ANSI_STDDEF_H +/* Irix 5.1 needs this. */ +#define __STDDEF_H__ +#endif + +#ifndef __sys_stdtypes_h +/* This avoids lossage on SunOS but only if stdtypes.h comes first. + There's no way to win with the other order! Sun lossage. */ + +/* On 4.3bsd-net2, make sure ansi.h is included, so we have + one less case to deal with in the following. */ +#if defined (__BSD_NET2__) || defined (____386BSD____) || defined (__FreeBSD__) || defined(__NetBSD__) +#include +#endif + +/* In 4.3bsd-net2, machine/ansi.h defines these symbols, which are + defined if the corresponding type is *not* defined. + FreeBSD-2.1 defines _MACHINE_ANSI_H_ instead of _ANSI_H_ */ +#if defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_) +#if !defined(_SIZE_T_) && !defined(_BSD_SIZE_T_) +#define _SIZE_T +#endif +#if !defined(_PTRDIFF_T_) && !defined(_BSD_PTRDIFF_T_) +#define _PTRDIFF_T +#endif +/* On BSD/386 1.1, at least, machine/ansi.h defines _BSD_WCHAR_T_ + instead of _WCHAR_T_. */ +#if !defined(_WCHAR_T_) && !defined(_BSD_WCHAR_T_) +#ifndef _BSD_WCHAR_T_ +#define _WCHAR_T +#endif +#endif +/* Undef _FOO_T_ if we are supposed to define foo_t. */ +#if defined (__need_ptrdiff_t) || defined (_STDDEF_H_) +#undef _PTRDIFF_T_ +#undef _BSD_PTRDIFF_T_ +#endif +#if defined (__need_size_t) || defined (_STDDEF_H_) +#undef _SIZE_T_ +#undef _BSD_SIZE_T_ +#endif +#if defined (__need_wchar_t) || defined (_STDDEF_H_) +#undef _WCHAR_T_ +#undef _BSD_WCHAR_T_ +#endif +#endif /* defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_) */ + +/* Sequent's header files use _PTRDIFF_T_ in some conflicting way. + Just ignore it. */ +#if defined (__sequent__) && defined (_PTRDIFF_T_) +#undef _PTRDIFF_T_ +#endif + +/* On VxWorks, may have defined macros like + _TYPE_size_t which will typedef size_t. fixincludes patched the + vxTypesBase.h so that this macro is only defined if _GCC_SIZE_T is + not defined, and so that defining this macro defines _GCC_SIZE_T. + If we find that the macros are still defined at this point, we must + invoke them so that the type is defined as expected. */ +#if defined (_TYPE_ptrdiff_t) && (defined (__need_ptrdiff_t) || defined (_STDDEF_H_)) +_TYPE_ptrdiff_t; +#undef _TYPE_ptrdiff_t +#endif +#if defined (_TYPE_size_t) && (defined (__need_size_t) || defined (_STDDEF_H_)) +_TYPE_size_t; +#undef _TYPE_size_t +#endif +#if defined (_TYPE_wchar_t) && (defined (__need_wchar_t) || defined (_STDDEF_H_)) +_TYPE_wchar_t; +#undef _TYPE_wchar_t +#endif + +/* In case nobody has defined these types, but we aren't running under + GCC 2.00, make sure that __PTRDIFF_TYPE__, __SIZE__TYPE__, and + __WCHAR_TYPE__ have reasonable values. This can happen if the + parts of GCC is compiled by an older compiler, that actually + include gstddef.h, such as collect2. */ + +/* Signed type of difference of two pointers. */ + +/* Define this type if we are doing the whole job, + or if we want this type in particular. */ +#if defined (_STDDEF_H) || defined (__need_ptrdiff_t) +#ifndef _PTRDIFF_T /* in case has defined it. */ +#ifndef _T_PTRDIFF_ +#ifndef _T_PTRDIFF +#ifndef __PTRDIFF_T +#ifndef _PTRDIFF_T_ +#ifndef _BSD_PTRDIFF_T_ +#ifndef ___int_ptrdiff_t_h +#ifndef _GCC_PTRDIFF_T +#define _PTRDIFF_T +#define _T_PTRDIFF_ +#define _T_PTRDIFF +#define __PTRDIFF_T +#define _PTRDIFF_T_ +#define _BSD_PTRDIFF_T_ +#define ___int_ptrdiff_t_h +#define _GCC_PTRDIFF_T +#ifndef __PTRDIFF_TYPE__ +#define __PTRDIFF_TYPE__ long int +#endif +typedef __PTRDIFF_TYPE__ ptrdiff_t; +#endif /* _GCC_PTRDIFF_T */ +#endif /* ___int_ptrdiff_t_h */ +#endif /* _BSD_PTRDIFF_T_ */ +#endif /* _PTRDIFF_T_ */ +#endif /* __PTRDIFF_T */ +#endif /* _T_PTRDIFF */ +#endif /* _T_PTRDIFF_ */ +#endif /* _PTRDIFF_T */ + +/* If this symbol has done its job, get rid of it. */ +#undef __need_ptrdiff_t + +#endif /* _STDDEF_H or __need_ptrdiff_t. */ + +/* Unsigned type of `sizeof' something. */ + +/* Define this type if we are doing the whole job, + or if we want this type in particular. */ +#if defined (_STDDEF_H) || defined (__need_size_t) +#ifndef __size_t__ /* BeOS */ +#ifndef _SIZE_T /* in case has defined it. */ +#ifndef _SYS_SIZE_T_H +#ifndef _T_SIZE_ +#ifndef _T_SIZE +#ifndef __SIZE_T +#ifndef _SIZE_T_ +#ifndef _BSD_SIZE_T_ +#ifndef _SIZE_T_DEFINED_ +#ifndef _SIZE_T_DEFINED +#ifndef ___int_size_t_h +#ifndef _GCC_SIZE_T +#ifndef _SIZET_ +#ifndef __size_t +#define __size_t__ /* BeOS */ +#define _SIZE_T +#define _SYS_SIZE_T_H +#define _T_SIZE_ +#define _T_SIZE +#define __SIZE_T +#define _SIZE_T_ +#define _BSD_SIZE_T_ +#define _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED +#define ___int_size_t_h +#define _GCC_SIZE_T +#define _SIZET_ +#define __size_t +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ long unsigned int +#endif +#if !(defined (__GNUG__) && defined (size_t)) +typedef __SIZE_TYPE__ size_t; +#ifdef __BEOS__ +typedef long ssize_t; +#endif /* __BEOS__ */ +#endif /* !(defined (__GNUG__) && defined (size_t)) */ +#endif /* __size_t */ +#endif /* _SIZET_ */ +#endif /* _GCC_SIZE_T */ +#endif /* ___int_size_t_h */ +#endif /* _SIZE_T_DEFINED */ +#endif /* _SIZE_T_DEFINED_ */ +#endif /* _BSD_SIZE_T_ */ +#endif /* _SIZE_T_ */ +#endif /* __SIZE_T */ +#endif /* _T_SIZE */ +#endif /* _T_SIZE_ */ +#endif /* _SYS_SIZE_T_H */ +#endif /* _SIZE_T */ +#endif /* __size_t__ */ +#undef __need_size_t +#endif /* _STDDEF_H or __need_size_t. */ + + +/* Wide character type. + Locale-writers should change this as necessary to + be big enough to hold unique values not between 0 and 127, + and not (wchar_t) -1, for each defined multibyte character. */ + +/* Define this type if we are doing the whole job, + or if we want this type in particular. */ +#if defined (_STDDEF_H) || defined (__need_wchar_t) +#ifndef __wchar_t__ /* BeOS */ +#ifndef _WCHAR_T +#ifndef _T_WCHAR_ +#ifndef _T_WCHAR +#ifndef __WCHAR_T +#ifndef _WCHAR_T_ +#ifndef _BSD_WCHAR_T_ +#ifndef _WCHAR_T_DEFINED_ +#ifndef _WCHAR_T_DEFINED +#ifndef _WCHAR_T_H +#ifndef ___int_wchar_t_h +#ifndef __INT_WCHAR_T_H +#ifndef _GCC_WCHAR_T +#define __wchar_t__ /* BeOS */ +#define _WCHAR_T +#define _T_WCHAR_ +#define _T_WCHAR +#define __WCHAR_T +#define _WCHAR_T_ +#define _BSD_WCHAR_T_ +#define _WCHAR_T_DEFINED_ +#define _WCHAR_T_DEFINED +#define _WCHAR_T_H +#define ___int_wchar_t_h +#define __INT_WCHAR_T_H +#define _GCC_WCHAR_T + +/* On BSD/386 1.1, at least, machine/ansi.h defines _BSD_WCHAR_T_ + instead of _WCHAR_T_, and _BSD_RUNE_T_ (which, unlike the other + symbols in the _FOO_T_ family, stays defined even after its + corresponding type is defined). If we define wchar_t, then we + must undef _WCHAR_T_; for BSD/386 1.1 (and perhaps others), if + we undef _WCHAR_T_, then we must also define rune_t, since + headers like runetype.h assume that if machine/ansi.h is included, + and _BSD_WCHAR_T_ is not defined, then rune_t is available. + machine/ansi.h says, "Note that _WCHAR_T_ and _RUNE_T_ must be of + the same type." */ +#ifdef _BSD_WCHAR_T_ +#undef _BSD_WCHAR_T_ +#ifdef _BSD_RUNE_T_ +#if !defined (_ANSI_SOURCE) && !defined (_POSIX_SOURCE) +typedef _BSD_RUNE_T_ rune_t; +#endif +#endif +#endif + +#ifndef __WCHAR_TYPE__ +#ifdef __BEOS__ +#define __WCHAR_TYPE__ unsigned char +#else +#define __WCHAR_TYPE__ int +#endif +#endif +#ifndef __cplusplus +typedef __WCHAR_TYPE__ wchar_t; +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif +#endif /* __wchar_t__ */ +#undef __need_wchar_t +#endif /* _STDDEF_H or __need_wchar_t. */ + +#if defined (_STDDEF_H) || defined (__need_wint_t) +#ifndef _WINT_T +#define _WINT_T + +#ifndef __WINT_TYPE__ +#define __WINT_TYPE__ unsigned int +#endif +typedef __WINT_TYPE__ wint_t; +#endif +#undef __need_wint_t +#endif + +/* In 4.3bsd-net2, leave these undefined to indicate that size_t, etc. + are already defined. */ +/* BSD/OS 3.1 requires the MACHINE_ANSI_H check here. FreeBSD 2.x apparently + does not, even though there is a check for MACHINE_ANSI_H above. */ +#if defined(_ANSI_H_) || (defined(__bsdi__) && defined(_MACHINE_ANSI_H_)) +/* The references to _GCC_PTRDIFF_T_, _GCC_SIZE_T_, and _GCC_WCHAR_T_ + are probably typos and should be removed before 2.8 is released. */ +#ifdef _GCC_PTRDIFF_T_ +#undef _PTRDIFF_T_ +#undef _BSD_PTRDIFF_T_ +#endif +#ifdef _GCC_SIZE_T_ +#undef _SIZE_T_ +#undef _BSD_SIZE_T_ +#endif +#ifdef _GCC_WCHAR_T_ +#undef _WCHAR_T_ +#undef _BSD_WCHAR_T_ +#endif +/* The following ones are the real ones. */ +#ifdef _GCC_PTRDIFF_T +#undef _PTRDIFF_T_ +#undef _BSD_PTRDIFF_T_ +#endif +#ifdef _GCC_SIZE_T +#undef _SIZE_T_ +#undef _BSD_SIZE_T_ +#endif +#ifdef _GCC_WCHAR_T +#undef _WCHAR_T_ +#undef _BSD_WCHAR_T_ +#endif +#endif /* _ANSI_H_ || ( __bsdi__ && _MACHINE_ANSI_H_ ) */ + +#endif /* __sys_stdtypes_h */ + +/* A null pointer constant. */ + +#if defined (_STDDEF_H) || defined (__need_NULL) +#undef NULL /* in case has defined it. */ +#ifdef __GNUG__ +#define NULL __null +#else /* G++ */ +#define NULL ((void *)0) +#endif /* G++ */ +#endif /* NULL not defined and or need NULL. */ +#undef __need_NULL + +#ifdef _STDDEF_H + +/* Offset of member MEMBER in a struct of type TYPE. */ + +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) + +#endif /* _STDDEF_H was defined this time */ + +#endif /* !_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__ + || __need_XXX was not defined before */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/syslimits.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/syslimits.h new file mode 100644 index 0000000..a362802 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/syslimits.h @@ -0,0 +1,8 @@ +/* syslimits.h stands for the system's own limits.h file. + If we can use it ok unmodified, then we install this text. + If fixincludes fixes it, then the fixed version is installed + instead of this text. */ + +#define _GCC_NEXT_LIMITS_H /* tell gcc's limits.h to recurse */ +#include_next +#undef _GCC_NEXT_LIMITS_H diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-alpha.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-alpha.h new file mode 100644 index 0000000..2528a71 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-alpha.h @@ -0,0 +1,128 @@ +/* GNU C varargs and stdargs support for the DEC Alpha. */ + +/* Note: We must use the name __builtin_savregs. GCC attaches special + significance to that name. In particular, regardless of where in a + function __builtin_saveregs is called, GCC moves the call up to the + very start of the function. */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST + +/* In VMS, __gnuc_va_list is simply char *; on OSF, it's a structure. */ + +#ifdef __VMS__ +typedef char *__gnuc_va_list; +#else + +typedef struct { + char *__base; /* Pointer to first integer register. */ + int __offset; /* Byte offset of args so far. */ +} __gnuc_va_list; +#endif + +#endif /* __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ + +#if !defined(__GNUC_VA_LIST_1) && (defined (_STDARG_H) || defined (_VARARGS_H)) +#define __GNUC_VA_LIST_1 + +#define _VA_LIST +#define _VA_LIST_ + +typedef __gnuc_va_list va_list; + +#if !defined(_STDARG_H) + +/* varargs support */ +#define va_alist __builtin_va_alist +#define va_dcl int __builtin_va_alist;... +#ifdef __VMS__ +#define va_start(pvar) ((pvar) = __builtin_saveregs ()) +#else +#define va_start(pvar) ((pvar) = * (__gnuc_va_list *) __builtin_saveregs ()) +#endif + +#else /* STDARG.H */ + +/* ANSI alternative. */ + +/* Call __builtin_next_arg even though we aren't using its value, so that + we can verify that firstarg is correct. */ + +#ifdef __VMS__ +#define va_start(pvar, firstarg) \ + (__builtin_next_arg (firstarg), \ + (pvar) = __builtin_saveregs ()) +#else +#define va_start(pvar, firstarg) \ + (__builtin_next_arg (firstarg), \ + (pvar) = *(__gnuc_va_list *) __builtin_saveregs ()) +#endif + +#endif /* _STDARG_H */ + +#define va_end(__va) ((void) 0) + +/* Values returned by __builtin_classify_type. */ + +enum { + __no_type_class = -1, + __void_type_class, + __integer_type_class, + __char_type_class, + __enumeral_type_class, + __boolean_type_class, + __pointer_type_class, + __reference_type_class, + __offset_type_class, + __real_type_class, + __complex_type_class, + __function_type_class, + __method_type_class, + __record_type_class, + __union_type_class, + __array_type_class, + __string_type_class, + __set_type_class, + __file_type_class, + __lang_type_class +}; + +/* Note that parameters are always aligned at least to a word boundary + (when passed) regardless of what GCC's __alignof__ operator says. */ + +/* Avoid errors if compiling GCC v2 with GCC v1. */ +#if __GNUC__ == 1 +#define __extension__ +#endif + +/* Get the size of a type in bytes, rounded up to an integral number + of words. */ + +#define __va_tsize(__type) \ + (((sizeof (__type) + __extension__ sizeof (long long) - 1) \ + / __extension__ sizeof (long long)) * __extension__ sizeof (long long)) + +#ifdef __VMS__ +#define va_arg(__va, __type) \ +(*(((__va) += __va_tsize (__type)), \ + (__type *)(void *)((__va) - __va_tsize (__type)))) + +#else + +#define va_arg(__va, __type) \ +(*(((__va).__offset += __va_tsize (__type)), \ + (__type *)(void *)((__va).__base + (__va).__offset \ + - (((__builtin_classify_type (* (__type *) 0) \ + == __real_type_class) && (__va).__offset <= (6 * 8)) \ + ? (6 * 8) + 8 : __va_tsize (__type))))) +#endif + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* __GNUC_VA_LIST_1 */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-arc.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-arc.h new file mode 100644 index 0000000..a718ad6 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-arc.h @@ -0,0 +1,111 @@ +/* stdarg/varargs support for the ARC */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef void * __gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +/* In GCC version 2, we want an ellipsis at the end of the declaration + of the argument list. GCC version 1 can't parse it. */ + +#if __GNUC__ > 1 +#define __va_ellipsis ... +#else +#define __va_ellipsis +#endif + +/* See arc_setup_incoming_varargs for reasons for the oddity in va_start. */ +#ifdef _STDARG_H +#define va_start(AP, LASTARG) \ +(AP = (__gnuc_va_list) ((int *) __builtin_next_arg (LASTARG) \ + + (__builtin_args_info (0) < 8 \ + ? (__builtin_args_info (0) & 1) \ + : 0))) +#else +#define va_alist __builtin_va_alist +#define va_dcl int __builtin_va_alist; __va_ellipsis +#define va_start(AP) \ +(AP = (__gnuc_va_list) ((int *) &__builtin_va_alist \ + + (__builtin_args_info (0) < 8 \ + ? (__builtin_args_info (0) & 1) \ + : 0))) +#endif + +#ifndef va_end +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ + +/* Values returned by __builtin_classify_type. */ + +enum __va_type_classes { + __no_type_class = -1, + __void_type_class, + __integer_type_class, + __char_type_class, + __enumeral_type_class, + __boolean_type_class, + __pointer_type_class, + __reference_type_class, + __offset_type_class, + __real_type_class, + __complex_type_class, + __function_type_class, + __method_type_class, + __record_type_class, + __union_type_class, + __array_type_class, + __string_type_class, + __set_type_class, + __file_type_class, + __lang_type_class +}; + +#endif +#define va_end(AP) ((void)0) + +/* Avoid errors if compiling GCC v2 with GCC v1. */ +#if __GNUC__ == 1 +#define __extension__ +#endif + +/* All aggregates are passed by reference. All scalar types larger than 8 + bytes are passed by reference. */ +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. + The casts to char * avoid warnings about invalid pointer arithmetic. */ + +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) + +#ifdef __big_endian__ +#define va_arg(AP,TYPE) \ +__extension__ \ +(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \ + || __va_rounded_size (TYPE) > 8) \ + ? ((AP) = (char *)(AP) + __va_rounded_size (TYPE *), \ + *(TYPE **) (void *) ((char *)(AP) - __va_rounded_size (TYPE *))) \ + : ((TYPE *) (void *) \ + (AP = (void *) ((__alignof__ (TYPE) > 4 \ + ? ((int) AP + 8 - 1) & -8 \ + : (int) AP) \ + + __va_rounded_size (TYPE))) - 1));})) +#else +#define va_arg(AP,TYPE) \ +__extension__ \ +(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \ + || __va_rounded_size (TYPE) > 8) \ + ? ((AP) = (char *)(AP) + __va_rounded_size (TYPE *), \ + *(TYPE **) (void *) ((char *)(AP) - __va_rounded_size (TYPE *))) \ + : ((AP = (void *) ((__alignof__ (TYPE) > 4 \ + ? ((int) AP + 8 - 1) & -8 \ + : (int) AP) \ + + __va_rounded_size (TYPE))), \ + (TYPE *) (void *) (AP - __va_rounded_size (TYPE))));})) +#endif + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-c4x.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-c4x.h new file mode 100644 index 0000000..c73c6d5 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-c4x.h @@ -0,0 +1,34 @@ +/* GNU C varargs support for the TMS320C[34]x */ + +/* C[34]x arguments grow in weird ways (downwards) that the standard + varargs stuff can't handle. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST + +typedef void *__gnuc_va_list; + +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +#ifdef _STDARG_H /* stdarg.h support */ + +#define va_start(AP,LASTARG) AP=(__gnuc_va_list) __builtin_next_arg (LASTARG) + +#else /* varargs.h support */ + +#define __va_ellipsis ... +#define va_alist __builtin_va_alist +#define va_dcl int __builtin_va_alist; __va_ellipsis +#define va_start(AP) AP=(__gnuc_va_list) ((int *)&__builtin_va_alist + 1) + +#endif /* _STDARG_H */ + +#define va_end(AP) ((void) 0) +#define va_arg(AP,TYPE) (AP = (__gnuc_va_list) ((char *) (AP) - sizeof(TYPE)), \ + *((TYPE *) ((char *) (AP)))) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-clipper.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-clipper.h new file mode 100644 index 0000000..213afca --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-clipper.h @@ -0,0 +1,60 @@ +/* GNU C varargs and stdargs support for Clipper. */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST + +typedef struct +{ + int __va_ap; /* pointer to stack args */ + void *__va_reg[4]; /* pointer to r0,f0,r1,f1 */ + int __va_num; /* number of args processed */ +} __gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + + +#if defined (_STDARG_H) || defined (_VARARGS_H) +typedef __gnuc_va_list va_list; +#define __va_list __gnuc_va_list /* acc compatibility */ + +#define _VA_LIST +#define _VA_LIST_ +#define _SYS_INT_STDARG_H /* acc compatibility */ + +/* Call __builtin_next_arg even though we aren't using its value, so that + we can verify that LASTARG is correct. */ +#ifdef _STDARG_H +#define va_start(AP,LASTARG) \ + (__builtin_next_arg (LASTARG), \ + (AP) = *(va_list *)__builtin_saveregs(), \ + (AP).__va_num = __builtin_args_info (0), \ + (AP).__va_ap += __builtin_args_info (1)) +#else +#define va_alist __builtin_va_alist +/* The ... causes current_function_varargs to be set in cc1. */ +#define va_dcl va_list __builtin_va_alist; ... +#define va_start(AP) \ + ((AP) = *(va_list *)__builtin_saveregs(), \ + (AP).__va_num = __builtin_args_info (0)) +#endif /* _STDARG_H */ + +/* round to alignment of `type' but keep a least integer alignment */ +#define __va_round(AP,TYPE) \ + ((AP).__va_ap = ((AP).__va_ap + __alignof__ (TYPE) - 1 ) & \ + ~(__alignof__ (TYPE) - 1), \ + ((AP).__va_ap = ((AP).__va_ap + sizeof (int) - 1) & ~(sizeof (int) - 1))) + +#define va_arg(AP, TYPE) \ + (*((AP).__va_num < 2 && __builtin_classify_type (* (TYPE *)0) < 12 \ + ? (__builtin_classify_type (* (TYPE *)0) == 8 \ + ? ((TYPE *)(AP).__va_reg[2 * (AP).__va_num++ + 1]) \ + : ((TYPE *)(AP).__va_reg[2 * (AP).__va_num++ ])) \ + : ((AP).__va_num++, __va_round (AP,TYPE), ((TYPE *)((AP).__va_ap))++))) + +#define va_end(AP) ((void) 0) + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-h8300.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-h8300.h new file mode 100644 index 0000000..9565696 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-h8300.h @@ -0,0 +1,56 @@ +/* stdarg/vararg support for the Hitachi h8/300 and h8/300h */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef void *__gnuc_va_list; +#endif + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +/* In GCC version 2, we want an ellipsis at the end of the declaration + of the argument list. GCC version 1 can't parse it. */ + +#if __GNUC__ > 1 +#define __va_ellipsis ... +#else +#define __va_ellipsis +#endif + +#ifdef __H8300__ +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) +#else +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (long) - 1) / sizeof (long)) * sizeof (long)) +#endif + +#ifdef _STDARG_H + +#define va_start(AP,LASTARG) \ + (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) + +#else /* _VARARGS_H */ + +#define va_alist __builtin_va_alist +/* The ... causes current_function_varargs to be set in cc1. */ +#define va_dcl int __builtin_va_alist; __va_ellipsis +#define va_start(AP) AP = (void *) &__builtin_va_alist + +#endif /* _VARARGS_H */ + +#define va_arg(AP, TYPE) \ + (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ + *((TYPE *) (void *) ((char *) (AP) \ + - ((sizeof (TYPE) < __va_rounded_size (int) \ + ? sizeof (TYPE) : __va_rounded_size (TYPE)))))) + +#define va_end(AP) ((void) 0) + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-i860.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-i860.h new file mode 100644 index 0000000..56d2c7f --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-i860.h @@ -0,0 +1,214 @@ +/* Note: We must use the name __builtin_savregs. GCC attaches special + significance to that name. In particular, regardless of where in a + function __builtin_saveregs is called, GCC moves the call up to the + very start of the function. */ + + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST + +typedef union { + float __freg[8]; + double __dreg[4]; +} __f_regs; + +typedef struct { +#if defined (__SVR4__) || defined (__svr4__) || defined (__alliant__) || defined (__PARAGON__) + __f_regs __float_regs; long __ireg[12]; +#else /* pre-SVR4 */ + long __ireg[12]; __f_regs __float_regs; +#endif +} __va_saved_regs; + +typedef struct { +#if defined(__SVR4__) || defined(__svr4__) || defined(__alliant__) || defined (__PARAGON__) + unsigned __ireg_used; /* How many int regs consumed 'til now? */ + unsigned __freg_used; /* How many flt regs consumed 'til now? */ + long *__reg_base; /* Address of where we stored the regs. */ + long * __mem_ptr; /* Address of memory overflow args area. */ +#else /* pre-SVR4 */ + long *__reg_base; /* Address of where we stored the regs. */ + long * __mem_ptr; /* Address of memory overflow args area. */ + unsigned __ireg_used; /* How many int regs consumed 'til now? */ + unsigned __freg_used; /* How many flt regs consumed 'til now? */ +#endif +} __gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +#if !defined(_STDARG_H) + +/* varargs support */ +#define va_alist __builtin_va_alist +#if defined (__PARAGON__) +#define va_dcl int va_alist; +#else /* __PARAGON__ */ +#define va_dcl +#endif /* __PARAGON__ */ +#define va_start(pvar) ((pvar) = * (__gnuc_va_list *) __builtin_saveregs ()) + +#else /* STDARG.H */ + +/* ANSI alternative. */ +/* Note that CUMULATIVE_ARGS elements are measured in bytes on the i860, + so we divide by 4 to get # of registers. */ +#define va_start(pvar, firstarg) \ + ((pvar) = *(__gnuc_va_list *) __builtin_saveregs (), \ + (pvar).__ireg_used = __builtin_args_info (0) / 4, \ + (pvar).__freg_used = __builtin_args_info (1) / 4, \ + (pvar).__mem_ptr = __builtin_next_arg (firstarg)) + +#endif /* _STDARG_H */ + +/* Values returned by __builtin_classify_type. */ + +#ifndef va_end +enum { + __no_type_class = -1, + __void_type_class, + __integer_type_class, + __char_type_class, + __enumeral_type_class, + __boolean_type_class, + __pointer_type_class, + __reference_type_class, + __offset_type_class, + __real_type_class, + __complex_type_class, + __function_type_class, + __method_type_class, + __record_type_class, + __union_type_class, + __array_type_class, + __string_type_class, + __set_type_class, + __file_type_class, + __lang_type_class +}; + +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ +#endif +#define va_end(__va) ((void) 0) + +#define __NUM_PARM_FREGS 8 +#define __NUM_PARM_IREGS 12 + +#define __savereg(__va) ((__va_saved_regs *) ((__va).__reg_base)) + +/* This macro works both for SVR4 and pre-SVR4 environments. */ + +/* Note that parameters are always aligned at least to a word boundary + (when passed) regardless of what GCC's __alignof__ operator says. */ + +/* Make allowances here for adding 128-bit (long double) floats someday. */ + +#if 0 /* What was this for? */ +#ifndef __GNU_VA_LIST +#define __ireg_used ireg_used +#define __freg_used freg_used +#define __mem_ptr mem_ptr +#define __reg_base reg_base +#endif +#endif /* 0 */ + +/* Avoid errors if compiling GCC v2 with GCC v1. */ +#if __GNUC__ == 1 +#define __extension__ +#endif + +#define va_arg(__va, __type) \ +__extension__ \ +(* (__type *) \ +({ \ + register void *__rv; /* result value */ \ + register unsigned __align; \ + switch (__builtin_classify_type (* (__type *) 0)) \ + { \ + case __real_type_class: \ + switch (sizeof (__type)) \ + { \ + case sizeof (float): \ + case sizeof (double): \ + if ((__va).__freg_used < __NUM_PARM_FREGS - 1) \ + { \ + if (((__va).__freg_used & 1) != 0) \ + (__va).__freg_used++; /* skip odd */ \ + __rv = &__savereg((__va))->__float_regs.__freg[(__va).__freg_used];\ + (__va).__freg_used += 2; \ + } \ + else \ + { \ + if ((((unsigned) (__va).__mem_ptr) & (sizeof(double)-1)) != 0) \ + (__va).__mem_ptr++; /* skip odd */ \ + __rv = (__va).__mem_ptr; \ + (__va).__mem_ptr += 2; \ + } \ + if (sizeof (__type) == sizeof (float)) \ + { \ + *((float *) __rv) = *((double *) __rv); \ + *(((long *) __rv) + 1) = 0xfff00001; \ + } \ + break; \ + default: \ + abort (); \ + } \ + break; \ + case __void_type_class: \ + case __integer_type_class: \ + case __char_type_class: \ + case __enumeral_type_class: \ + case __boolean_type_class: \ + case __pointer_type_class: \ + case __reference_type_class: \ + case __offset_type_class: \ + if (sizeof (__type) <= 4) \ + { \ + __rv = ((__va).__ireg_used < __NUM_PARM_IREGS \ + ? (&__savereg((__va))->__ireg[(__va).__ireg_used++]) \ + : (__va).__mem_ptr++); \ + break; \ + } \ + else if ((__va).__ireg_used + sizeof (__type) / 4 <= __NUM_PARM_IREGS) \ + { \ + __rv = &__savereg((__va))->__ireg[(__va).__ireg_used]; \ + (__va).__ireg_used += sizeof (__type) / 4; \ + break; \ + } \ + /* Fall through to fetch from memory. */ \ + case __record_type_class: \ + case __union_type_class: \ + __align = (__alignof__ (__type) < sizeof (long) \ + ? sizeof (long) \ + : __alignof__ (__type)); \ + (__va).__mem_ptr \ + = (long *) \ + ((((unsigned) (__va).__mem_ptr) + (__align-1)) & ~(__align-1)); \ + __rv = (__va).__mem_ptr; \ + (__va).__mem_ptr \ + += ((sizeof (__type) + sizeof (long) - 1) / sizeof (long)); \ + break; \ + case __complex_type_class: \ + case __function_type_class: \ + case __method_type_class: \ + case __array_type_class: \ + case __string_type_class: \ + case __set_type_class: \ + case __file_type_class: \ + case __lang_type_class: \ + case __no_type_class: \ + default: \ + abort (); \ + } \ + __rv; \ +})) + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ + diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-i960.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-i960.h new file mode 100644 index 0000000..5588d41 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-i960.h @@ -0,0 +1,79 @@ +/* GNU C varargs support for the Intel 80960. */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +/* The first element is the address of the first argument. + The second element is the number of bytes skipped past so far. */ +typedef unsigned __gnuc_va_list[2]; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +/* In GCC version 2, we want an ellipsis at the end of the declaration + of the argument list. GCC version 1 can't parse it. */ + +#if __GNUC__ > 1 +#define __va_ellipsis ... +#else +#define __va_ellipsis +#endif + +/* The stack size of the type t. */ +#define __vsiz(T) (((sizeof (T) + 3) / 4) * 4) +/* The stack alignment of the type t. */ +#define __vali(T) (__alignof__ (T) >= 4 ? __alignof__ (T) : 4) +/* The offset of the next stack argument after one of type t at offset i. */ +#define __vpad(I, T) ((((I) + __vali (T) - 1) / __vali (T)) \ + * __vali (T) + __vsiz (T)) + +/* Avoid errors if compiling GCC v2 with GCC v1. */ +#if __GNUC__ == 1 +#define __extension__ +#endif + +#ifdef _STDARG_H +/* Call __builtin_next_arg even though we aren't using its value, so that + we can verify that firstarg is correct. */ +#define va_start(AP, LASTARG) \ +__extension__ \ +({ __builtin_next_arg (LASTARG); \ + __asm__ ("st g14,%0" : "=m" (*(AP))); \ + (AP)[1] = (__builtin_args_info (0) + __builtin_args_info (1)) * 4; }) + +#else + +#define va_alist __builtin_va_alist +#define va_dcl char *__builtin_va_alist; __va_ellipsis +#define va_start(AP) \ +__extension__ \ +({ __asm__ ("st g14,%0" : "=m" (*(AP))); \ + (AP)[1] = (__builtin_args_info (0) + __builtin_args_info (1)) * 4; }) +#endif + +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. */ +#define va_arg(AP, T) \ +( \ + ( \ + ((AP)[1] <= 48 && (__vpad ((AP)[1], T) > 48 || __vsiz (T) > 16)) \ + ? ((AP)[1] = 48 + __vsiz (T)) \ + : ((AP)[1] = __vpad ((AP)[1], T)) \ + ), \ + \ + *((T *) (void *) ((char *) *(AP) + (AP)[1] - __vsiz (T))) \ +) + +#ifndef va_end +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ +#endif +#define va_end(AP) ((void) 0) + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ + diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-m32r.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-m32r.h new file mode 100644 index 0000000..4ef0ad8 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-m32r.h @@ -0,0 +1,86 @@ +/* GNU C stdarg/varargs support for the M32R */ + +/* Define __gnuc_va_list. */ +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef void *__gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +/* Common code for va_start for both varargs and stdarg. */ + +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) + +#ifdef _STDARG_H /* stdarg.h support */ + +/* Calling __builtin_next_arg gives the proper error message if LASTARG is + not indeed the last argument. */ +#define va_start(AP, LASTARG) \ + (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) + +#else /* varargs.h support */ + +#define va_alist __builtin_va_alist +/* The ... causes current_function_varargs to be set in cc1. */ +#define va_dcl int __builtin_va_alist; ... +#define va_start(AP) AP=(char *) &__builtin_va_alist + +#endif /* _STDARG_H */ + +/* Nothing needs to be done to end varargs/stdarg processing */ +#define va_end(AP) ((void) 0) + +/* Values returned by __builtin_classify_type. */ +enum __type_class +{ + __no_type_class = -1, + __void_type_class, + __integer_type_class, + __char_type_class, + __enumeral_type_class, + __boolean_type_class, + __pointer_type_class, + __reference_type_class, + __offset_type_class, + __real_type_class, + __complex_type_class, + __function_type_class, + __method_type_class, + __record_type_class, + __union_type_class, + __array_type_class, + __string_type_class, + __set_type_class, + __file_type_class, + __lang_type_class +}; + +/* Return whether a type is passed by reference. */ +#define __va_by_reference_p(TYPE) (sizeof (TYPE) > 8) + +#define va_arg(AP,TYPE) \ +__extension__ (*({ \ + register TYPE *__ptr; \ + \ + if (__va_by_reference_p (TYPE)) \ + { \ + __ptr = *(TYPE **)(void *) (AP); \ + (AP) = (__gnuc_va_list) ((char *) (AP) + sizeof (void *)); \ + } \ + else \ + { \ + __ptr = (TYPE *)(void *) \ + ((char *) (AP) + (sizeof (TYPE) < __va_rounded_size (char) \ + ? __va_rounded_size (TYPE) - sizeof (TYPE) \ + : 0)); \ + (AP) = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)); \ + } \ + \ + __ptr; \ +})) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-m88k.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-m88k.h new file mode 100644 index 0000000..0a20d84 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-m88k.h @@ -0,0 +1,87 @@ +/* GNU C varargs support for the Motorola 88100 */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST + +typedef struct +{ + int __va_arg; /* argument number */ + int *__va_stk; /* start of args passed on stack */ + int *__va_reg; /* start of args passed in regs */ +} __gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +#ifdef _STDARG_H /* stdarg.h support */ + +/* Call __builtin_next_arg even though we aren't using its value, so that + we can verify that LASTARG is correct. */ +#if __GNUC__ > 1 /* GCC 2.0 and beyond */ +#define va_start(AP,LASTARG) \ + (__builtin_next_arg (LASTARG), \ + (AP) = *(__gnuc_va_list *)__builtin_saveregs()) +#else +#define va_start(AP,LASTARG) \ + ( (AP).__va_reg = (int *) __builtin_saveregs2(0), \ + (AP).__va_stk = (int *) __builtin_argptr(), \ + (AP).__va_arg = (int) (__builtin_argsize() + 3) / 4 ) +#endif + +#else /* varargs.h support */ + +#if __GNUC__ > 1 /* GCC 2.0 and beyond */ +#define va_start(AP) ((AP) = *(__gnuc_va_list *)__builtin_saveregs()) +#else +#define va_start(AP) \ + ( (AP).__va_reg = (int *) __builtin_saveregs2(1), \ + (AP).__va_stk = (int *) __builtin_argptr(), \ + (AP).__va_arg = (int) (__builtin_argsize() - 4 + 3) / 4 ) +#endif +#define va_alist __va_1st_arg +#define va_dcl register int va_alist;... + +#endif /* _STDARG_H */ + +/* Avoid trouble between this file and _int_varargs.h under DG/UX. This file + can be included by and others and provides definitions of + __va_size and __va_reg_p and a va_list typedef. Avoid defining va_list + again with _VA_LIST. */ +#ifdef __INT_VARARGS_H +#undef __va_size +#undef __va_reg_p +#define __gnuc_va_list va_list +#define _VA_LIST +#define _VA_LIST_ +#else +/* Similarly, if this gets included first, do nothing in _int_varargs.h. */ +#define __INT_VARARGS_H +#endif + +#define __va_reg_p(TYPE) \ + (__builtin_classify_type(*(TYPE *)0) < 12 \ + ? sizeof(TYPE) <= 8 : sizeof(TYPE) == 4 && __alignof__(TYPE) == 4) + +#define __va_size(TYPE) ((sizeof(TYPE) + 3) >> 2) + +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. */ +#define va_arg(AP,TYPE) \ + ( (AP).__va_arg = (((AP).__va_arg + (1 << (__alignof__(TYPE) >> 3)) - 1) \ + & ~((1 << (__alignof__(TYPE) >> 3)) - 1)) \ + + __va_size(TYPE), \ + *((TYPE *) (void *) ((__va_reg_p(TYPE) \ + && (AP).__va_arg < 8 + __va_size(TYPE) \ + ? (AP).__va_reg : (AP).__va_stk) \ + + ((AP).__va_arg - __va_size(TYPE))))) + +#define va_end(AP) ((void)0) + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-mips.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-mips.h new file mode 100644 index 0000000..96db5b4 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-mips.h @@ -0,0 +1,277 @@ +/* ---------------------------------------- */ +/* VARARGS for MIPS/GNU CC */ +/* */ +/* */ +/* */ +/* */ +/* ---------------------------------------- */ + + +/* These macros implement varargs for GNU C--either traditional or ANSI. */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +#if defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float) + +typedef struct { + /* Pointer to FP regs. */ + char *__fp_regs; + /* Number of FP regs remaining. */ + int __fp_left; + /* Pointer to GP regs followed by stack parameters. */ + char *__gp_regs; +} __gnuc_va_list; + +#else /* ! (defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ + +typedef char * __gnuc_va_list; + +#endif /* ! (defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +#ifndef _VA_MIPS_H_ENUM +#define _VA_MIPS_H_ENUM +enum { + __no_type_class = -1, + __void_type_class, + __integer_type_class, + __char_type_class, + __enumeral_type_class, + __boolean_type_class, + __pointer_type_class, + __reference_type_class, + __offset_type_class, + __real_type_class, + __complex_type_class, + __function_type_class, + __method_type_class, + __record_type_class, + __union_type_class, + __array_type_class, + __string_type_class, + __set_type_class, + __file_type_class, + __lang_type_class +}; +#endif + +/* In GCC version 2, we want an ellipsis at the end of the declaration + of the argument list. GCC version 1 can't parse it. */ + +#if __GNUC__ > 1 +#define __va_ellipsis ... +#else +#define __va_ellipsis +#endif + +#ifdef __mips64 +#define __va_rounded_size(__TYPE) \ + (((sizeof (__TYPE) + 8 - 1) / 8) * 8) +#else +#define __va_rounded_size(__TYPE) \ + (((sizeof (__TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) +#endif + +#ifdef __mips64 +#define __va_reg_size 8 +#else +#define __va_reg_size 4 +#endif + +/* Get definitions for _MIPS_SIM_ABI64 etc. */ +#ifdef _MIPS_SIM +#include +#endif + +#ifdef _STDARG_H +#if defined (__mips_eabi) +#if ! defined (__mips_soft_float) && ! defined (__mips_single_float) +#ifdef __mips64 +#define va_start(__AP, __LASTARG) \ + (__AP.__gp_regs = ((char *) __builtin_next_arg (__LASTARG) \ + - (__builtin_args_info (2) < 8 \ + ? (8 - __builtin_args_info (2)) * __va_reg_size \ + : 0)), \ + __AP.__fp_left = 8 - __builtin_args_info (3), \ + __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * __va_reg_size) +#else /* ! defined (__mips64) */ +#define va_start(__AP, __LASTARG) \ + (__AP.__gp_regs = ((char *) __builtin_next_arg (__LASTARG) \ + - (__builtin_args_info (2) < 8 \ + ? (8 - __builtin_args_info (2)) * __va_reg_size \ + : 0)), \ + __AP.__fp_left = (8 - __builtin_args_info (3)) / 2, \ + __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * 8, \ + __AP.__fp_regs = (char *) ((int) __AP.__fp_regs & -8)) +#endif /* ! defined (__mips64) */ +#else /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float) ) */ +#define va_start(__AP, __LASTARG) \ + (__AP = ((__gnuc_va_list) __builtin_next_arg (__LASTARG) \ + - (__builtin_args_info (2) >= 8 ? 0 \ + : (8 - __builtin_args_info (2)) * __va_reg_size))) +#endif /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float) ) */ +#else /* ! defined (__mips_eabi) */ +#define va_start(__AP, __LASTARG) \ + (__AP = (__gnuc_va_list) __builtin_next_arg (__LASTARG)) +#endif /* ! (defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ +#else /* ! _STDARG_H */ +#define va_alist __builtin_va_alist +#ifdef __mips64 +/* This assumes that `long long int' is always a 64 bit type. */ +#define va_dcl long long int __builtin_va_alist; __va_ellipsis +#else +#define va_dcl int __builtin_va_alist; __va_ellipsis +#endif +#if defined (__mips_eabi) +#if ! defined (__mips_soft_float) && ! defined (__mips_single_float) +#ifdef __mips64 +#define va_start(__AP) \ + (__AP.__gp_regs = ((char *) __builtin_next_arg () \ + - (__builtin_args_info (2) < 8 \ + ? (8 - __builtin_args_info (2)) * __va_reg_size \ + : __va_reg_size)), \ + __AP.__fp_left = 8 - __builtin_args_info (3), \ + __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * __va_reg_size) +#else /* ! defined (__mips64) */ +#define va_start(__AP) \ + (__AP.__gp_regs = ((char *) __builtin_next_arg () \ + - (__builtin_args_info (2) < 8 \ + ? (8 - __builtin_args_info (2)) * __va_reg_size \ + : __va_reg_size)), \ + __AP.__fp_left = (8 - __builtin_args_info (3)) / 2, \ + __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * 8, \ + __AP.__fp_regs = (char *) ((int) __AP.__fp_regs & -8)) +#endif /* ! defined (__mips64) */ +#else /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ +#define va_start(__AP) \ + (__AP = ((__gnuc_va_list) __builtin_next_arg () \ + - (__builtin_args_info (2) >= 8 ? __va_reg_size \ + : (8 - __builtin_args_info (2)) * __va_reg_size))) +#endif /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ +/* Need alternate code for _MIPS_SIM_ABI64. */ +#elif defined(_MIPS_SIM) && (_MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32) +#define va_start(__AP) \ + (__AP = (__gnuc_va_list) __builtin_next_arg () \ + + (__builtin_args_info (2) >= 8 ? -8 : 0)) +#else +#define va_start(__AP) __AP = (char *) &__builtin_va_alist +#endif +#endif /* ! _STDARG_H */ + +#ifndef va_end +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ +#endif +#define va_end(__AP) ((void)0) + +#if defined (__mips_eabi) + +#if ! defined (__mips_soft_float) && ! defined (__mips_single_float) +#ifdef __mips64 +#define __va_next_addr(__AP, __type) \ + ((__builtin_classify_type (*(__type *) 0) == __real_type_class \ + && __AP.__fp_left > 0) \ + ? (--__AP.__fp_left, (__AP.__fp_regs += 8) - 8) \ + : (__AP.__gp_regs += __va_reg_size) - __va_reg_size) +#else +#define __va_next_addr(__AP, __type) \ + ((__builtin_classify_type (*(__type *) 0) == __real_type_class \ + && __AP.__fp_left > 0) \ + ? (--__AP.__fp_left, (__AP.__fp_regs += 8) - 8) \ + : (((__builtin_classify_type (* (__type *) 0) < __record_type_class \ + && __alignof__ (__type) > 4) \ + ? __AP.__gp_regs = (char *) (((int) __AP.__gp_regs + 8 - 1) & -8) \ + : (char *) 0), \ + (__builtin_classify_type (* (__type *) 0) >= __record_type_class \ + ? (__AP.__gp_regs += __va_reg_size) - __va_reg_size \ + : ((__AP.__gp_regs += __va_rounded_size (__type)) \ + - __va_rounded_size (__type))))) +#endif +#else /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ +#ifdef __mips64 +#define __va_next_addr(__AP, __type) \ + ((__AP += __va_reg_size) - __va_reg_size) +#else +#define __va_next_addr(__AP, __type) \ + (((__builtin_classify_type (* (__type *) 0) < __record_type_class \ + && __alignof__ (__type) > 4) \ + ? __AP = (char *) (((__PTRDIFF_TYPE__) __AP + 8 - 1) & -8) \ + : (char *) 0), \ + (__builtin_classify_type (* (__type *) 0) >= __record_type_class \ + ? (__AP += __va_reg_size) - __va_reg_size \ + : ((__AP += __va_rounded_size (__type)) \ + - __va_rounded_size (__type)))) +#endif +#endif /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */ + +#ifdef __MIPSEB__ +#define va_arg(__AP, __type) \ + ((__va_rounded_size (__type) <= __va_reg_size) \ + ? *(__type *) (void *) (__va_next_addr (__AP, __type) \ + + __va_reg_size \ + - sizeof (__type)) \ + : (__builtin_classify_type (*(__type *) 0) >= __record_type_class \ + ? **(__type **) (void *) (__va_next_addr (__AP, __type) \ + + __va_reg_size \ + - sizeof (char *)) \ + : *(__type *) (void *) __va_next_addr (__AP, __type))) +#else +#define va_arg(__AP, __type) \ + ((__va_rounded_size (__type) <= __va_reg_size) \ + ? *(__type *) (void *) __va_next_addr (__AP, __type) \ + : (__builtin_classify_type (* (__type *) 0) >= __record_type_class \ + ? **(__type **) (void *) __va_next_addr (__AP, __type) \ + : *(__type *) (void *) __va_next_addr (__AP, __type))) +#endif + +#else /* ! defined (__mips_eabi) */ + +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. */ +/* The __mips64 cases are reversed from the 32 bit cases, because the standard + 32 bit calling convention left-aligns all parameters smaller than a word, + whereas the __mips64 calling convention does not (and hence they are + right aligned). */ +#ifdef __mips64 +#ifdef __MIPSEB__ +#define va_arg(__AP, __type) \ + ((__type *) (void *) (__AP = (char *) \ + ((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) \ + + __va_rounded_size (__type))))[-1] +#else +#define va_arg(__AP, __type) \ + ((__AP = (char *) ((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) \ + + __va_rounded_size (__type))), \ + *(__type *) (void *) (__AP - __va_rounded_size (__type))) +#endif + +#else /* not __mips64 */ + +#ifdef __MIPSEB__ +/* For big-endian machines. */ +#define va_arg(__AP, __type) \ + ((__AP = (char *) ((__alignof__ (__type) > 4 \ + ? ((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8 \ + : ((__PTRDIFF_TYPE__)__AP + 4 - 1) & -4) \ + + __va_rounded_size (__type))), \ + *(__type *) (void *) (__AP - __va_rounded_size (__type))) +#else +/* For little-endian machines. */ +#define va_arg(__AP, __type) \ + ((__type *) (void *) (__AP = (char *) ((__alignof__(__type) > 4 \ + ? ((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8 \ + : ((__PTRDIFF_TYPE__)__AP + 4 - 1) & -4) \ + + __va_rounded_size(__type))))[-1] +#endif +#endif +#endif /* ! defined (__mips_eabi) */ + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-mn10200.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-mn10200.h new file mode 100644 index 0000000..b458b56 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-mn10200.h @@ -0,0 +1,37 @@ +/* CYGNUS LOCAL entire file/law */ +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef void *__gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) +#define __gnuc_va_start(AP) (AP = (__gnuc_va_list)__builtin_saveregs()) +#define __va_ellipsis ... + +#ifdef _STDARG_H +#define va_start(AP, LASTARG) \ + (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) +#else +#define va_alist __builtin_va_alist +#define va_dcl int __builtin_va_alist; __va_ellipsis +#define va_start(AP) AP=(char *) &__builtin_va_alist +#endif + +/* Now stuff common to both varargs & stdarg implementations. */ +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) +#undef va_end +void va_end (__gnuc_va_list); +#define va_end(AP) ((void)0) +#define va_arg(AP, TYPE) \ + (sizeof (TYPE) > 8 \ + ? (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (char *)),\ + **((TYPE **) (void *) ((char *) (AP) - __va_rounded_size (char *))))\ + : (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ + *((TYPE *) (void *) ((char *) (AP) - __va_rounded_size (TYPE))))) +#endif +/* END CYGNUS LOCAL */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-mn10300.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-mn10300.h new file mode 100644 index 0000000..e156ccf --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-mn10300.h @@ -0,0 +1,35 @@ +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef void *__gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) +#define __gnuc_va_start(AP) (AP = (__gnuc_va_list)__builtin_saveregs()) +#define __va_ellipsis ... + +#ifdef _STDARG_H +#define va_start(AP, LASTARG) \ + (__builtin_next_arg (LASTARG), __gnuc_va_start (AP)) +#else +#define va_alist __builtin_va_alist +#define va_dcl int __builtin_va_alist; __va_ellipsis +#define va_start(AP) AP=(char *) &__builtin_va_alist +#endif + +/* Now stuff common to both varargs & stdarg implementations. */ +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) +#undef va_end +void va_end (__gnuc_va_list); +#define va_end(AP) ((void)0) +#define va_arg(AP, TYPE) \ + (sizeof (TYPE) > 8 \ + ? (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (char *)),\ + **((TYPE **) (void *) ((char *) (AP) - __va_rounded_size (char *))))\ + : (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ + *((TYPE *) (void *) ((char *) (AP) - __va_rounded_size (TYPE))))) +#endif diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-pa.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-pa.h new file mode 100644 index 0000000..4865f6b --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-pa.h @@ -0,0 +1,52 @@ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST + +typedef void *__gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) +#if __GNUC__ > 1 +#define __va_ellipsis ... +#define __gnuc_va_start(AP) ((AP) = (va_list)__builtin_saveregs()) +#else +#define va_alist __va_a__, __va_b__, __va_c__, __va_d__ +#define __va_ellipsis +#define __gnuc_va_start(AP)\ + (AP) = (double *) &__va_a__, &__va_b__, &__va_c__, &__va_d__, \ + (AP) = (double *)((char *)(AP) + 4) +#endif /* __GNUC__ > 1 */ + +/* Call __builtin_next_arg even though we aren't using its value, so that + we can verify that LASTARG is correct. */ +#ifdef _STDARG_H +#define va_start(AP,LASTARG) \ + (__builtin_next_arg (LASTARG), __gnuc_va_start (AP)) +#else +/* The ... causes current_function_varargs to be set in cc1. */ +#define va_dcl long va_alist; __va_ellipsis +#define va_start(AP) __gnuc_va_start (AP) +#endif + +#define va_arg(AP,TYPE) \ + (*(sizeof(TYPE) > 8 ? \ + ((AP = (__gnuc_va_list) ((char *)AP - sizeof (int))), \ + (((TYPE *) (void *) (*((int *) (AP)))))) \ + :((AP = \ + (__gnuc_va_list) ((long)((char *)AP - sizeof (TYPE)) \ + & (sizeof(TYPE) > 4 ? ~0x7 : ~0x3))), \ + (((TYPE *) (void *) ((char *)AP + ((8 - sizeof(TYPE)) % 4))))))) + +#ifndef va_end +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ +#endif +#define va_end(AP) ((void)0) + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-ppc.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-ppc.h new file mode 100644 index 0000000..de299b5 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-ppc.h @@ -0,0 +1,255 @@ +/* GNU C varargs support for the PowerPC with either the V.4 or Windows NT calling sequences */ + +#ifndef _WIN32 +/* System V.4 support */ +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST + +#ifndef _SYS_VA_LIST_H +#define _SYS_VA_LIST_H /* Solaris sys/va_list.h */ + +/* Solaris decided to rename overflow_arg_area to input_arg_area, + so handle it via a macro. */ +#define __va_overflow(AP) (AP)->overflow_arg_area + +/* Note that the names in this structure are in the user's namespace, but + that the V.4 abi explicitly states that these names should be used. */ +typedef struct __va_list_tag { + unsigned char gpr; /* index into the array of 8 GPRs stored in the + register save area gpr=0 corresponds to r3, + gpr=1 to r4, etc. */ + unsigned char fpr; /* index into the array of 8 FPRs stored in the + register save area fpr=0 corresponds to f1, + fpr=1 to f2, etc. */ + char *overflow_arg_area; /* location on stack that holds the next + overflow argument */ + char *reg_save_area; /* where r3:r10 and f1:f8, if saved are stored */ +} __va_list[1], __gnuc_va_list[1]; + +#else /* _SYS_VA_LIST */ + +typedef __va_list __gnuc_va_list; +#define __va_overflow(AP) (AP)->input_arg_area + +#endif /* not _SYS_VA_LIST */ +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +/* Register save area located below the frame pointer */ +#ifndef __VA_PPC_H__ +#define __VA_PPC_H__ +typedef struct { + long __gp_save[8]; /* save area for GP registers */ + double __fp_save[8]; /* save area for FP registers */ +} __va_regsave_t; + +/* Macros to access the register save area */ +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. */ +#define __VA_FP_REGSAVE(AP,OFS,TYPE) \ + ((TYPE *) (void *) (&(((__va_regsave_t *) \ + (AP)->reg_save_area)->__fp_save[OFS]))) + +#define __VA_GP_REGSAVE(AP,OFS,TYPE) \ + ((TYPE *) (void *) (&(((__va_regsave_t *) \ + (AP)->reg_save_area)->__gp_save[OFS]))) + +/* Common code for va_start for both varargs and stdarg. We allow all + the work to be done by __builtin_saveregs. It returns a pointer to + a va_list that was constructed on the stack; we must simply copy it + to the user's variable. */ + +#define __va_start_common(AP, FAKE) \ + __builtin_memcpy ((AP), __builtin_saveregs (), sizeof(__gnuc_va_list)) + +#ifdef _STDARG_H /* stdarg.h support */ + +/* Calling __builtin_next_arg gives the proper error message if LASTARG is + not indeed the last argument. */ +#define va_start(AP,LASTARG) \ + (__builtin_next_arg (LASTARG), __va_start_common (AP, 0)) + +#else /* varargs.h support */ + +#define va_start(AP) __va_start_common (AP, 1) +#define va_alist __va_1st_arg +#define va_dcl register int va_alist; ... + +#endif /* _STDARG_H */ + +#ifdef _SOFT_FLOAT +#define __va_float_p(TYPE) 0 +#else +#define __va_float_p(TYPE) (__builtin_classify_type(*(TYPE *)0) == 8) +#endif + +#define __va_aggregate_p(TYPE) (__builtin_classify_type(*(TYPE *)0) >= 12) +#define __va_size(TYPE) ((sizeof(TYPE) + sizeof (long) - 1) / sizeof (long)) + +/* This symbol isn't defined. It is used to flag type promotion violations + at link time. We can only do this when optimizing. Use __builtin_trap + instead of abort so that we don't require a prototype for abort. + + __builtin_trap stuff is not available on the gcc-2.95 branch, so we just + avoid calling it for now. */ + +#ifdef __OPTIMIZE__ +extern void __va_arg_type_violation(void) __attribute__((__noreturn__)); +#else +#define __va_arg_type_violation() +#endif + +#define va_arg(AP,TYPE) \ +__extension__ (*({ \ + register TYPE *__ptr; \ + \ + if (__va_float_p (TYPE) && sizeof (TYPE) < 16) \ + { \ + unsigned char __fpr = (AP)->fpr; \ + if (__fpr < 8) \ + { \ + __ptr = __VA_FP_REGSAVE (AP, __fpr, TYPE); \ + (AP)->fpr = __fpr + 1; \ + } \ + else if (sizeof (TYPE) == 8) \ + { \ + unsigned long __addr = (unsigned long) (__va_overflow (AP)); \ + __ptr = (TYPE *)((__addr + 7) & -8); \ + __va_overflow (AP) = (char *)(__ptr + 1); \ + } \ + else \ + { \ + /* float is promoted to double. */ \ + __va_arg_type_violation (); \ + } \ + } \ + \ + /* Aggregates and long doubles are passed by reference. */ \ + else if (__va_aggregate_p (TYPE) || __va_float_p (TYPE)) \ + { \ + unsigned char __gpr = (AP)->gpr; \ + if (__gpr < 8) \ + { \ + __ptr = * __VA_GP_REGSAVE (AP, __gpr, TYPE *); \ + (AP)->gpr = __gpr + 1; \ + } \ + else \ + { \ + TYPE **__pptr = (TYPE **) (__va_overflow (AP)); \ + __ptr = * __pptr; \ + __va_overflow (AP) = (char *) (__pptr + 1); \ + } \ + } \ + \ + /* Only integrals remaining. */ \ + else \ + { \ + /* longlong is aligned. */ \ + if (sizeof (TYPE) == 8) \ + { \ + unsigned char __gpr = (AP)->gpr; \ + if (__gpr < 7) \ + { \ + __gpr += __gpr & 1; \ + __ptr = __VA_GP_REGSAVE (AP, __gpr, TYPE); \ + (AP)->gpr = __gpr + 2; \ + } \ + else \ + { \ + unsigned long __addr = (unsigned long) (__va_overflow (AP)); \ + __ptr = (TYPE *)((__addr + 7) & -8); \ + (AP)->gpr = 8; \ + __va_overflow (AP) = (char *)(__ptr + 1); \ + } \ + } \ + else if (sizeof (TYPE) == 4) \ + { \ + unsigned char __gpr = (AP)->gpr; \ + if (__gpr < 8) \ + { \ + __ptr = __VA_GP_REGSAVE (AP, __gpr, TYPE); \ + (AP)->gpr = __gpr + 1; \ + } \ + else \ + { \ + __ptr = (TYPE *) __va_overflow (AP); \ + __va_overflow (AP) = (char *)(__ptr + 1); \ + } \ + } \ + else \ + { \ + /* Everything else was promoted to int. */ \ + __va_arg_type_violation (); \ + } \ + } \ + __ptr; \ +})) + +#define va_end(AP) ((void)0) + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) *(dest) = *(src) + +#endif /* __VA_PPC_H__ */ +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ + + +#else +/* Windows NT */ +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef char *__gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +#define __va_start_common(AP, LASTARG, FAKE) \ + ((__builtin_saveregs ()), ((AP) = ((char *) &LASTARG) + __va_rounded_size (AP)), 0) + +#ifdef _STDARG_H /* stdarg.h support */ + +/* Calling __builtin_next_arg gives the proper error message if LASTARG is + not indeed the last argument. */ +#define va_start(AP,LASTARG) \ + (__builtin_saveregs (), \ + (AP) = __builtin_next_arg (LASTARG), \ + 0) + +#else /* varargs.h support */ + +#define va_start(AP) \ + (__builtin_saveregs (), \ + (AP) = __builtin_next_arg (__va_1st_arg) - sizeof (int), \ + 0) + +#define va_alist __va_1st_arg +#define va_dcl register int __va_1st_arg; ... + +#endif /* _STDARG_H */ + +#define __va_rounded_size(TYPE) ((sizeof (TYPE) + 3) & ~3) +#define __va_align(AP, TYPE) \ + ((((unsigned long)(AP)) + ((sizeof (TYPE) >= 8) ? 7 : 3)) \ + & ~((sizeof (TYPE) >= 8) ? 7 : 3)) + +#define va_arg(AP,TYPE) \ +( *(TYPE *)((AP = (char *) (__va_align(AP, TYPE) \ + + __va_rounded_size(TYPE))) \ + - __va_rounded_size(TYPE))) + +#define va_end(AP) ((void)0) + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ +#endif /* Windows NT */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-pyr.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-pyr.h new file mode 100644 index 0000000..5ad4ba9 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-pyr.h @@ -0,0 +1,130 @@ +/** + * + * Varargs for PYR/GNU CC + * + * WARNING -- WARNING -- DANGER + * + * The code in this file implements varargs for gcc on a pyr in + * a way that is compatible with code compiled by the Pyramid Technology + * C compiler. + * As such, it depends strongly on the Pyramid conventions for + * parameter passing.ct and independent implementation. + * These (somewhat bizarre) parameter-passing conventions are described + * in the ``OSx Operating System Porting Guide''. + * + * A quick summary is useful: + * 12 of the 48 register-windowed regs available for + * parameter passing. Parameters of a function call that are eligible + * to be passed in registers are assigned registers from TR0/PR0 onwards; + * all other arguments are passed on the stack. + * Structure and union parameters are *never* passed in registers, + * even if they are small enough to fit. They are always passed on + * the stack. + * + * Double-sized parameters cannot be passed in TR11, because + * TR12 is not used for passing parameters. If, in the absence of this + * rule, a double-sized param would have been passed in TR11, + * that parameter is passed on the stack and no parameters are + * passed in TR11. + * + * It is only known to work for passing 32-bit integer quantities + * (ie chars, shorts, ints/enums, longs), doubles, or pointers. + * Passing structures on a Pyramid via varargs is a loser. + * Passing an object larger than 8 bytes on a pyramid via varargs may + * also be a loser. + * + */ + + +/* + * pointer to next stack parameter in __va_buf[0] + * pointer to next parameter register in __va_buf[1] + * Count of registers seen at __va_buf[2] + * saved pr0..pr11 in __va_buf[3..14] + * # of calls to va_arg (debugging) at __va_buf[15] + */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST + +typedef void *__voidptr; +#if 1 + +typedef struct __va_regs { + __voidptr __stackp,__regp,__count; + __voidptr __pr0,__pr1,__pr2,__pr3,__pr4,__pr5,__pr6,__pr7,__pr8,__pr9,__pr10,__pr11; + } __va_regs; + +typedef __va_regs __va_buf; +#else + +/* __va_buf[0] = address of next arg passed on the stack + __va_buf[1] = address of next arg passed in a register + __va_buf[2] = register-# of next arg passed in a register + */ +typedef __voidptr(*__va_buf); + +#endif + +typedef __va_buf __gnuc_va_list; + +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +/* In GCC version 2, we want an ellipsis at the end of the declaration + of the argument list. GCC version 1 can't parse it. */ + +#if __GNUC__ > 1 +#define __va_ellipsis ... +#else +#define __va_ellipsis +#endif + +#define va_alist \ + __va0,__va1,__va2,__va3,__va4,__va5,__va6,__va7,__va8,__va9,__va10,__va11, \ + __builtin_va_alist + +/* The ... causes current_function_varargs to be set in cc1. */ +#define va_dcl __voidptr va_alist; __va_ellipsis + + +/* __asm ("rcsp %0" : "=r" ( _AP [0]));*/ + +#define va_start(_AP) \ + _AP = ((struct __va_regs) { \ + &(_AP.__pr0), (void*)&__builtin_va_alist, (void*)0, \ + __va0,__va1,__va2,__va3,__va4,__va5, \ + __va6,__va7,__va8,__va9,__va10,__va11}) + + +/* Avoid errors if compiling GCC v2 with GCC v1. */ +#if __GNUC__ == 1 +#define __extension__ +#endif + +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. */ +#define va_arg(_AP, _MODE) \ +__extension__ \ +(*({__voidptr *__ap = (__voidptr*)&_AP; \ + register int __size = sizeof (_MODE); \ + register int __onstack = \ + (__size > 8 || ( (int)(__ap[2]) > 11) || \ + (__size==8 && (int)(__ap[2])==11)); \ + register int* __param_addr = ((int*)((__ap) [__onstack])); \ + \ + ((void *)__ap[__onstack])+=__size; \ + if (__onstack==0 || (int)(__ap[2])==11) \ + __ap[2]+= (__size >> 2); \ + (( _MODE *) (void *) __param_addr); \ +})) + +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ +#define va_end(_X) ((void)0) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-sh.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-sh.h new file mode 100644 index 0000000..dc4e3ae --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-sh.h @@ -0,0 +1,229 @@ +/* The ! __SH3E_VARG case is similar to the default gvarargs.h . */ + +#if (defined (__SH3E__) || defined (__SH4_SINGLE__) || defined (__SH4__) || defined (__SH4_SINGLE_ONLY__)) && ! defined (__HITACHI__) +#define __SH3E_VARG +#endif + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST + +#ifdef __SH3E_VARG + +typedef long __va_greg; +typedef float __va_freg; + +typedef struct { + __va_greg * __va_next_o; /* next available register */ + __va_greg * __va_next_o_limit; /* past last available register */ + __va_freg * __va_next_fp; /* next available fp register */ + __va_freg * __va_next_fp_limit; /* last available fp register */ + __va_greg * __va_next_stack; /* next extended word on stack */ +} __gnuc_va_list; + +#else /* ! SH3E */ + +typedef void *__gnuc_va_list; + +#endif /* ! SH3E */ + +#endif /* __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +#ifdef _STDARG_H + +#ifdef __SH3E_VARG + +#define va_start(AP, LASTARG) \ +__extension__ \ + ({ \ + (AP).__va_next_fp = (__va_freg *) __builtin_saveregs (); \ + (AP).__va_next_fp_limit = ((AP).__va_next_fp + \ + (__builtin_args_info (1) < 8 ? 8 - __builtin_args_info (1) : 0)); \ + (AP).__va_next_o = (__va_greg *) (AP).__va_next_fp_limit; \ + (AP).__va_next_o_limit = ((AP).__va_next_o + \ + (__builtin_args_info (0) < 4 ? 4 - __builtin_args_info (0) : 0)); \ + (AP).__va_next_stack = (__va_greg *) __builtin_next_arg (LASTARG); \ + }) + +#else /* ! SH3E */ + +#define va_start(AP, LASTARG) \ + ((AP) = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) + +#endif /* ! SH3E */ + +#else /* _VARARGS_H */ + +#define va_alist __builtin_va_alist +#define va_dcl int __builtin_va_alist;... + +#ifdef __SH3E_VARG + +#define va_start(AP) \ +__extension__ \ + ({ \ + (AP).__va_next_fp = (__va_freg *) __builtin_saveregs (); \ + (AP).__va_next_fp_limit = ((AP).__va_next_fp + \ + (__builtin_args_info (1) < 8 ? 8 - __builtin_args_info (1) : 0)); \ + (AP).__va_next_o = (__va_greg *) (AP).__va_next_fp_limit; \ + (AP).__va_next_o_limit = ((AP).__va_next_o + \ + (__builtin_args_info (0) < 4 ? 4 - __builtin_args_info (0) : 0)); \ + (AP).__va_next_stack \ + = ((__va_greg *) __builtin_next_arg (__builtin_va_alist) \ + - (__builtin_args_info (0) >= 4 || __builtin_args_info (1) >= 8 \ + ? 1 : 0)); \ + }) + +#else /* ! SH3E */ + +#define va_start(AP) ((AP) = (char *) &__builtin_va_alist) + +#endif /* ! SH3E */ + +#endif /* _STDARG */ + +#ifndef va_end +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ + +/* Values returned by __builtin_classify_type. */ + +enum __va_type_classes { + __no_type_class = -1, + __void_type_class, + __integer_type_class, + __char_type_class, + __enumeral_type_class, + __boolean_type_class, + __pointer_type_class, + __reference_type_class, + __offset_type_class, + __real_type_class, + __complex_type_class, + __function_type_class, + __method_type_class, + __record_type_class, + __union_type_class, + __array_type_class, + __string_type_class, + __set_type_class, + __file_type_class, + __lang_type_class +}; + +#endif +#define va_end(pvar) ((void)0) + +#ifdef __LITTLE_ENDIAN__ +#define __LITTLE_ENDIAN_P 1 +#else +#define __LITTLE_ENDIAN_P 0 +#endif + +#define __SCALAR_TYPE(TYPE) \ + ((TYPE) == __integer_type_class \ + || (TYPE) == __char_type_class \ + || (TYPE) == __enumeral_type_class) + +/* RECORD_TYPE args passed using the C calling convention are + passed by invisible reference. ??? RECORD_TYPE args passed + in the stack are made to be word-aligned; for an aggregate that is + not word-aligned, we advance the pointer to the first non-reg slot. */ + + /* When this is a smaller-than-int integer, using + auto-increment in the promoted (SImode) is fastest; + however, there is no way to express that is C. Therefore, + we use an asm. + We want the MEM_IN_STRUCT_P bit set in the emitted RTL, therefore we + use unions even when it would otherwise be unnecessary. */ + +/* gcc has an extension that allows to use a casted lvalue as an lvalue, + But it doesn't work in C++ with -pedantic - even in the presence of + __extension__ . We work around this problem by using a reference type. */ +#ifdef __cplusplus +#define __VA_REF & +#else +#define __VA_REF +#endif + +#define __va_arg_sh1(AP, TYPE) __extension__ \ +({(sizeof (TYPE) == 1 \ + ? ({union {TYPE t; char c;} __t; \ + __asm("" \ + : "=r" (__t.c) \ + : "0" ((((union { int i, j; } *__VA_REF) (AP))++)->i)); \ + __t.t;}) \ + : sizeof (TYPE) == 2 \ + ? ({union {TYPE t; short s;} __t; \ + __asm("" \ + : "=r" (__t.s) \ + : "0" ((((union { int i, j; } *__VA_REF) (AP))++)->i)); \ + __t.t;}) \ + : sizeof (TYPE) >= 4 || __LITTLE_ENDIAN_P \ + ? (((union { TYPE t; int i;} *__VA_REF) (AP))++)->t \ + : ((union {TYPE t;TYPE u;}*) ((char *)++(int *__VA_REF)(AP) - sizeof (TYPE)))->t);}) + +#ifdef __SH3E_VARG + +#define __PASS_AS_FLOAT(TYPE_CLASS,SIZE) \ + (TYPE_CLASS == __real_type_class && SIZE == 4) + +#define __TARGET_SH4_P 0 + +#if defined(__SH4__) || defined(__SH4_SINGLE__) +#undef __PASS_AS_FLOAT +#define __PASS_AS_FLOAT(TYPE_CLASS,SIZE) \ + (TYPE_CLASS == __real_type_class && SIZE <= 8 \ + || TYPE_CLASS == __complex_type_class && SIZE <= 16) +#undef __TARGET_SH4_P +#define __TARGET_SH4_P 1 +#endif + +#define va_arg(pvar,TYPE) \ +__extension__ \ +({int __type = __builtin_classify_type (* (TYPE *) 0); \ + void * __result_p; \ + if (__PASS_AS_FLOAT (__type, sizeof(TYPE))) \ + { \ + if ((pvar).__va_next_fp < (pvar).__va_next_fp_limit) \ + { \ + if (((__type == __real_type_class && sizeof (TYPE) > 4)\ + || sizeof (TYPE) > 8) \ + && (((int) (pvar).__va_next_fp ^ (int) (pvar).__va_next_fp_limit)\ + & 4)) \ + (pvar).__va_next_fp++; \ + __result_p = &(pvar).__va_next_fp; \ + } \ + else \ + __result_p = &(pvar).__va_next_stack; \ + } \ + else \ + { \ + if ((pvar).__va_next_o + ((sizeof (TYPE) + 3) / 4) \ + <= (pvar).__va_next_o_limit) \ + __result_p = &(pvar).__va_next_o; \ + else \ + { \ + if (sizeof (TYPE) > 4) \ + if (! __TARGET_SH4_P) \ + (pvar).__va_next_o = (pvar).__va_next_o_limit; \ + \ + __result_p = &(pvar).__va_next_stack; \ + } \ + } \ + __va_arg_sh1(*(void **)__result_p, TYPE);}) + +#else /* ! SH3E */ + +#define va_arg(AP, TYPE) __va_arg_sh1((AP), TYPE) + +#endif /* SH3E */ + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) ((dest) = (src)) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-sparc.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-sparc.h new file mode 100644 index 0000000..73c9de1 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-sparc.h @@ -0,0 +1,165 @@ +/* This is just like the default gvarargs.h + except for differences described below. */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +#if ! defined (__svr4__) && ! defined (__linux__) && ! defined (__arch64__) +/* This has to be a char * to be compatible with Sun. + i.e., we have to pass a `va_list' to vsprintf. */ +typedef char * __gnuc_va_list; +#else +/* This has to be a void * to be compatible with Sun svr4. + i.e., we have to pass a `va_list' to vsprintf. */ +typedef void * __gnuc_va_list; +#endif +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +#ifdef _STDARG_H + +/* Call __builtin_next_arg even though we aren't using its value, so that + we can verify that LASTARG is correct. */ +#if defined (__GCC_NEW_VARARGS__) || defined (__arch64__) +#define va_start(AP, LASTARG) \ + (__builtin_next_arg (LASTARG), AP = (char *) __builtin_saveregs ()) +#else +#define va_start(AP, LASTARG) \ + (__builtin_saveregs (), AP = ((char *) __builtin_next_arg (LASTARG))) +#endif + +#else + +#define va_alist __builtin_va_alist +#define va_dcl int __builtin_va_alist;... + +#if defined (__GCC_NEW_VARARGS__) || defined (__arch64__) +#define va_start(AP) ((AP) = (char *) __builtin_saveregs ()) +#else +#define va_start(AP) \ + (__builtin_saveregs (), (AP) = ((char *) &__builtin_va_alist)) +#endif + +#endif + +#ifndef va_end +void va_end (__gnuc_va_list); /* Defined in libgcc.a */ + +/* Values returned by __builtin_classify_type. */ + +enum __va_type_classes { + __no_type_class = -1, + __void_type_class, + __integer_type_class, + __char_type_class, + __enumeral_type_class, + __boolean_type_class, + __pointer_type_class, + __reference_type_class, + __offset_type_class, + __real_type_class, + __complex_type_class, + __function_type_class, + __method_type_class, + __record_type_class, + __union_type_class, + __array_type_class, + __string_type_class, + __set_type_class, + __file_type_class, + __lang_type_class +}; + +#endif +#define va_end(pvar) ((void)0) + +/* Avoid errors if compiling GCC v2 with GCC v1. */ +#if __GNUC__ == 1 +#define __extension__ +#endif + +/* RECORD_TYPE args passed using the C calling convention are + passed by invisible reference. ??? RECORD_TYPE args passed + in the stack are made to be word-aligned; for an aggregate that is + not word-aligned, we advance the pointer to the first non-reg slot. */ + +#ifdef __arch64__ + +typedef unsigned int __ptrint __attribute__ ((__mode__ (__DI__))); + +/* ??? TODO: little endian support */ + +#define va_arg(pvar, TYPE) \ +__extension__ \ +(*({int __type = __builtin_classify_type (* (TYPE *) 0); \ + char * __result; \ + if (__type == __real_type_class) /* float? */ \ + { \ + if (__alignof__ (TYPE) == 16) \ + (pvar) = (void *) (((__ptrint) (pvar) + 15) & -16); \ + __result = (pvar); \ + (pvar) = (char *) (pvar) + sizeof (TYPE); \ + } \ + else if (__type < __record_type_class) /* integer? */ \ + { \ + (pvar) = (char *) (pvar) + 8; \ + __result = (char *) (pvar) - sizeof (TYPE); \ + } \ + else /* aggregate object */ \ + { \ + if (sizeof (TYPE) <= 8) \ + { \ + __result = (pvar); \ + (pvar) = (char *) (pvar) + 8; \ + } \ + else if (sizeof (TYPE) <= 16) \ + { \ + if (__alignof__ (TYPE) == 16) \ + (pvar) = (void *) (((__ptrint) (pvar) + 15) & -16); \ + __result = (pvar); \ + (pvar) = (char *) (pvar) + 16; \ + } \ + else \ + { \ + __result = * (void **) (pvar); \ + (pvar) = (char *) (pvar) + 8; \ + } \ + } \ + (TYPE *) __result;})) + +#else /* not __arch64__ */ + +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) + +/* We don't declare the union member `d' to have type TYPE + because that would lose in C++ if TYPE has a constructor. */ +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. + The casts to char * avoid warnings about invalid pointer arithmetic. */ +#define va_arg(pvar,TYPE) \ +__extension__ \ +(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \ + || (__builtin_classify_type (*(TYPE*) 0) == __real_type_class \ + && sizeof (TYPE) == 16)) \ + ? ((pvar) = (char *)(pvar) + __va_rounded_size (TYPE *), \ + *(TYPE **) (void *) ((char *)(pvar) - __va_rounded_size (TYPE *))) \ + : __va_rounded_size (TYPE) == 8 \ + ? ({ union {char __d[sizeof (TYPE)]; int __i[2];} __u; \ + __u.__i[0] = ((int *) (void *) (pvar))[0]; \ + __u.__i[1] = ((int *) (void *) (pvar))[1]; \ + (pvar) = (char *)(pvar) + 8; \ + (TYPE *) (void *) __u.__d; }) \ + : ((pvar) = (char *)(pvar) + __va_rounded_size (TYPE), \ + ((TYPE *) (void *) ((char *)(pvar) - __va_rounded_size (TYPE)))));})) + +#endif /* not __arch64__ */ + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-spur.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-spur.h new file mode 100644 index 0000000..7457ceb --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-spur.h @@ -0,0 +1,64 @@ +/* varargs.h for SPUR */ + +/* NB. This is NOT the definition needed for the new ANSI proposed + standard */ + + +struct __va_struct { char __regs[20]; }; + +#define va_alist __va_regs, __va_stack + +/* In GCC version 2, we want an ellipsis at the end of the declaration + of the argument list. GCC version 1 can't parse it. */ + +#if __GNUC__ > 1 +#define __va_ellipsis ... +#else +#define __va_ellipsis +#endif + +/* The ... causes current_function_varargs to be set in cc1. */ +#define va_dcl struct __va_struct __va_regs; int __va_stack; + +typedef struct { + int __pnt; + char *__regs; + char *__stack; +} va_list; + +#define va_start(pvar) \ + ((pvar).__pnt = 0, (pvar).__regs = __va_regs.__regs, \ + (pvar).__stack = (char *) &__va_stack) +#define va_end(pvar) ((void)0) + +/* Avoid errors if compiling GCC v2 with GCC v1. */ +#if __GNUC__ == 1 +#define __extension__ +#endif + +#define va_arg(pvar,type) \ +__extension__ \ + (*({ type *__va_result; \ + if ((pvar).__pnt >= 20) { \ + __va_result = ( (type *) ((pvar).__stack + (pvar).__pnt - 20)); \ + (pvar).__pnt += (sizeof(type) + 7) & ~7; \ + } \ + else if ((pvar).__pnt + sizeof(type) > 20) { \ + __va_result = (type *) (pvar).__stack; \ + (pvar).__pnt = 20 + ( (sizeof(type) + 7) & ~7); \ + } \ + else if (sizeof(type) == 8) { \ + union {double d; int i[2];} __u; \ + __u.i[0] = *(int *) ((pvar).__regs + (pvar).__pnt); \ + __u.i[1] = *(int *) ((pvar).__regs + (pvar).__pnt + 4); \ + __va_result = (type *) &__u; \ + (pvar).__pnt += 8; \ + } \ + else { \ + __va_result = (type *) ((pvar).__regs + (pvar).__pnt); \ + (pvar).__pnt += (sizeof(type) + 3) & ~3; \ + } \ + __va_result; })) + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-v850.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-v850.h new file mode 100644 index 0000000..96da6d5 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/va-v850.h @@ -0,0 +1,34 @@ +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef void *__gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined (_STDARG_H) || defined (_VARARGS_H) + +#ifdef _STDARG_H +#define va_start(AP, LASTARG) \ + (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG))) +#else +#define __va_ellipsis ... +#define va_alist __builtin_va_alist +#define va_dcl int __builtin_va_alist; __va_ellipsis +#define va_start(AP) AP=(char *) &__builtin_va_alist +#endif + +/* Now stuff common to both varargs & stdarg implementations. */ +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) +#undef va_end +void va_end (__gnuc_va_list); +#define va_end(AP) ((void)0) +#define va_arg(AP, TYPE) \ + (sizeof (TYPE) > 8 \ + ? (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (char *)),\ + **((TYPE **) (void *) ((char *) (AP) - __va_rounded_size (char *))))\ + : (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ + *((TYPE *) (void *) ((char *) (AP) - __va_rounded_size (TYPE))))) +#endif diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/varargs.h b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/varargs.h new file mode 100644 index 0000000..bb9c98a --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/include/varargs.h @@ -0,0 +1,229 @@ +/* Record that this is varargs.h; this turns off stdarg.h. */ + +#ifndef _VARARGS_H +#define _VARARGS_H + +#ifdef __sparc__ +#include "va-sparc.h" +#else +#ifdef __spur__ +#include "va-spur.h" +#else +#ifdef __mips__ +#include "va-mips.h" +#else +#ifdef __i860__ +#include "va-i860.h" +#else +#ifdef __pyr__ +#include "va-pyr.h" +#else +#ifdef __clipper__ +#include "va-clipper.h" +#else +#ifdef __m88k__ +#include "va-m88k.h" +#else +#if defined(__hppa__) || defined(hp800) +#include "va-pa.h" +#else +#ifdef __i960__ +#include "va-i960.h" +#else +#ifdef __alpha__ +#include "va-alpha.h" +#else +#if defined (__H8300__) || defined (__H8300H__) || defined (__H8300S__) +#include "va-h8300.h" +#else +#if defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32)) +#include "va-ppc.h" +#else +#ifdef __arc__ +#include "va-arc.h" +#else +#ifdef __M32R__ +#include "va-m32r.h" +#else +#ifdef __sh__ +#include "va-sh.h" +#else +#ifdef __mn10300__ +#include "va-mn10300.h" +#else +#ifdef __mn10200__ +#include "va-mn10200.h" +#else +#ifdef __v850__ +#include "va-v850.h" +#else +#if defined (_TMS320C4x) || defined (_TMS320C3x) +#include +#else + +#ifdef __NeXT__ + +/* On Next, erase any vestiges of stdarg.h. */ + +#ifdef _ANSI_STDARG_H_ +#define _VA_LIST_ +#endif +#define _ANSI_STDARG_H_ + +#undef va_alist +#undef va_dcl +#undef va_list +#undef va_start +#undef va_end +#undef __va_rounded_size +#undef va_arg +#endif /* __NeXT__ */ + +/* In GCC version 2, we want an ellipsis at the end of the declaration + of the argument list. GCC version 1 can't parse it. */ + +#if __GNUC__ > 1 +#define __va_ellipsis ... +#else +#define __va_ellipsis +#endif + +/* These macros implement traditional (non-ANSI) varargs + for GNU C. */ + +#define va_alist __builtin_va_alist +/* The ... causes current_function_varargs to be set in cc1. */ +/* ??? We don't process attributes correctly in K&R argument context. */ +typedef int __builtin_va_alist_t __attribute__((__mode__(__word__))); +#define va_dcl __builtin_va_alist_t __builtin_va_alist; __va_ellipsis + +/* Define __gnuc_va_list, just as in gstdarg.h. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +#if defined(__svr4__) || defined(_AIX) || defined(_M_UNIX) +typedef char *__gnuc_va_list; +#else +typedef void *__gnuc_va_list; +#endif +#endif + +#define va_start(AP) AP=(char *) &__builtin_va_alist + +#define va_end(AP) ((void)0) + +#if defined(sysV68) +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (short) - 1) / sizeof (short)) * sizeof (short)) +#elif defined(_AIX) +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (long) - 1) / sizeof (long)) * sizeof (long)) +#else +#define __va_rounded_size(TYPE) \ + (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) +#endif + +#if (defined (__arm__) && ! defined (__ARMEB__)) || defined (__i386__) || defined (__i860__) || defined (__ns32000__) || defined (__vax__) +/* This is for little-endian machines; small args are padded upward. */ +#define va_arg(AP, TYPE) \ + (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ + *((TYPE *) (void *) ((char *) (AP) - __va_rounded_size (TYPE)))) +#else /* big-endian */ +/* This is for big-endian machines; small args are padded downward. */ +#define va_arg(AP, TYPE) \ + (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \ + *((TYPE *) (void *) ((char *) (AP) \ + - ((sizeof (TYPE) < __va_rounded_size (char) \ + ? sizeof (TYPE) : __va_rounded_size (TYPE)))))) +#endif /* big-endian */ + +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) + +#endif /* not TMS320C3x or TMS320C4x */ +#endif /* not v850 */ +#endif /* not mn10200 */ +#endif /* not mn10300 */ +#endif /* not sh */ +#endif /* not m32r */ +#endif /* not arc */ +#endif /* not powerpc with V.4 calling sequence */ +#endif /* not h8300 */ +#endif /* not alpha */ +#endif /* not i960 */ +#endif /* not hppa */ +#endif /* not m88k */ +#endif /* not clipper */ +#endif /* not pyr */ +#endif /* not i860 */ +#endif /* not mips */ +#endif /* not spur */ +#endif /* not sparc */ +#endif /* not _VARARGS_H */ + +/* Define va_list from __gnuc_va_list. */ + +#ifdef _HIDDEN_VA_LIST /* On OSF1, this means varargs.h is "half-loaded". */ +#undef _VA_LIST +#endif + +#if defined(__svr4__) || (defined(_SCO_DS) && !defined(__VA_LIST)) +/* SVR4.2 uses _VA_LIST for an internal alias for va_list, + so we must avoid testing it and setting it here. + SVR4 uses _VA_LIST as a flag in stdarg.h, but we should + have no conflict with that. */ +#ifndef _VA_LIST_ +#define _VA_LIST_ +#ifdef __i860__ +#ifndef _VA_LIST +#define _VA_LIST va_list +#endif +#endif /* __i860__ */ +typedef __gnuc_va_list va_list; +#ifdef _SCO_DS +#define __VA_LIST +#endif +#endif /* _VA_LIST_ */ + +#else /* not __svr4__ || _SCO_DS */ + +/* The macro _VA_LIST_ is the same thing used by this file in Ultrix. + But on BSD NET2 we must not test or define or undef it. + (Note that the comments in NET 2's ansi.h + are incorrect for _VA_LIST_--see stdio.h!) */ +/* Michael Eriksson at Thu Sep 30 11:00:57 1993: + Sequent defines _VA_LIST_ in to be the type to + use for va_list (``typedef _VA_LIST_ va_list'') */ +#if !defined (_VA_LIST_) || defined (__BSD_NET2__) || defined (____386BSD____) || defined (__bsdi__) || defined (__sequent__) || defined (__FreeBSD__) || defined(WINNT) +/* The macro _VA_LIST_DEFINED is used in Windows NT 3.5 */ +#ifndef _VA_LIST_DEFINED +/* The macro _VA_LIST is used in SCO Unix 3.2. */ +#ifndef _VA_LIST +/* The macro _VA_LIST_T_H is used in the Bull dpx2 */ +#ifndef _VA_LIST_T_H +typedef __gnuc_va_list va_list; +#endif /* not _VA_LIST_T_H */ +#endif /* not _VA_LIST */ +#endif /* not _VA_LIST_DEFINED */ +#if !(defined (__BSD_NET2__) || defined (____386BSD____) || defined (__bsdi__) || defined (__sequent__) || defined (__FreeBSD__)) +#define _VA_LIST_ +#endif +#ifndef _VA_LIST +#define _VA_LIST +#endif +#ifndef _VA_LIST_DEFINED +#define _VA_LIST_DEFINED +#endif +#ifndef _VA_LIST_T_H +#define _VA_LIST_T_H +#endif + +#endif /* not _VA_LIST_, except on certain systems */ + +#endif /* not __svr4__ */ + +/* The next BSD release (if there is one) wants this symbol to be + undefined instead of _VA_LIST_. */ +#ifdef _BSD_VA_LIST +#undef _BSD_VA_LIST +#endif diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/libgcc.a b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/libgcc.a new file mode 100644 index 0000000..e00606a Binary files /dev/null and b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/libgcc.a differ diff --git a/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/specs b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/specs new file mode 100644 index 0000000..c62c061 --- /dev/null +++ b/usr/local/nachos/lib/gcc-lib/decstation-ultrix/2.95.2/specs @@ -0,0 +1,101 @@ +*asm: +%{G*} %{EB} %{EL} %{mips1} %{mips2} %{mips3} %{mips4} %{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=o32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_final: +%{mmips-as: %{!mno-mips-tfile: + mips-tfile %{v*: -v} %{K: -I %b.o~} %{!K: %{save-temps: -I %b.o~}} %{c:%W{o*}%{!o*:-o %b.o}}%{!c:-o %U.o} %{.s:%i} %{!.s:%g.s}}} + +*cpp: +%{.cc: -D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS} %{.cxx: -D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS} %{.C: -D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS} %{.m: -D__LANGUAGE_OBJECTIVE_C -D_LANGUAGE_OBJECTIVE_C -D__LANGUAGE_C -D_LANGUAGE_C} %{.S: -D__LANGUAGE_ASSEMBLY -D_LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} %{.s: -D__LANGUAGE_ASSEMBLY -D_LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} %{!.S: %{!.s: %{!.cc: %{!.cxx: %{!.C: %{!.m: -D__LANGUAGE_C -D_LANGUAGE_C %{!ansi:-DLANGUAGE_C}}}}}}} %(subtarget_cpp_size_spec) %{mips3:-U__mips -D__mips=3 -D__mips64} %{mips4:-U__mips -D__mips=4 -D__mips64} %{mgp32:-U__mips64} %{mgp64:-D__mips64} %{msingle-float:%{!msoft-float:-D__mips_single_float}} %{m4650:%{!msoft-float:-D__mips_single_float}} %{msoft-float:-D__mips_soft_float} %{mabi=eabi:-D__mips_eabi} %{mips16:%{!mno-mips16:-D__mips16}} %{EB:-UMIPSEL -U_MIPSEL -U__MIPSEL -U__MIPSEL__ -D_MIPSEB -D__MIPSEB -D__MIPSEB__ %{!ansi:-DMIPSEB}} %{EL:-UMIPSEB -U_MIPSEB -U__MIPSEB -U__MIPSEB__ -D_MIPSEL -D__MIPSEL -D__MIPSEL__ %{!ansi:-DMIPSEL}} %(long_max_spec) %(subtarget_cpp_spec) + +*cc1: +%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} %{mips1:-mfp32 -mgp32} %{mips2:-mfp32 -mgp32}%{mips3:%{!msingle-float:%{!m4650:-mfp64}} -mgp64} %{mips4:%{!msingle-float:%{!m4650:-mfp64}} -mgp64} %{mfp64:%{msingle-float:%emay not use both -mfp64 and -msingle-float}} %{mfp64:%{m4650:%emay not use both -mfp64 and -m4650}} %{mint64|mlong64|mlong32:-mexplicit-type-size }%{m4650:-mcpu=r4650} %{m3900:-mips1 -mcpu=r3900 -mfp32 -mgp32} %{G*} %{EB:-meb} %{EL:-mel} %{EB:%{EL:%emay not use both -EB and -EL}} %{pic-none: -mno-half-pic} %{pic-lib: -mhalf-pic} %{pic-extern: -mhalf-pic} %{pic-calls: -mhalf-pic} %{save-temps: } %(subtarget_cc1_spec) + +*cc1plus: + + +*endfile: + + +*link: +%{G*} %{EB} %{EL} %{mips1} %{mips2} %{mips3} %{mips4} %{bestGnum} %{shared} %{non_shared} %(linker_endian_spec) + +*lib: +%{p:-lprof1} %{pg:-lprof1} -lc + +*libgcc: +-lgcc + +*startfile: +%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}} + +*switches_need_spaces: + + +*signed_char: +%{funsigned-char:-D__CHAR_UNSIGNED__} + +*predefines: +-D__ANSI_COMPAT -DMIPSEL -DR3000 -DSYSTYPE_BSD -D_SYSTYPE_BSD -Dbsd4_2 -Dhost_mips -Dmips -Dultrix -Dunix -Asystem(unix) -Asystem(bsd) -Acpu(mips) -Amachine(mips) + +*cross_compile: +1 + +*version: +2.95.2 + +*multilib: +. ; + +*multilib_defaults: +EL mips1 + +*multilib_extra: + + +*multilib_matches: + + +*linker: +collect2 + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{.cc: -D__LANGUAGE_C -D_LANGUAGE_C} %{.cxx: -D__LANGUAGE_C -D_LANGUAGE_C} %{.C: -D__LANGUAGE_C -D_LANGUAGE_C} + +*subtarget_cpp_size_spec: +%{mlong64:%{!mips1:%{!mips2:-D__SIZE_TYPE__=long\ unsigned\ int -D__PTRDIFF_TYPE__=long\ int}}} %{!mlong64:-D__SIZE_TYPE__=unsigned\ int -D__PTRDIFF_TYPE__=int} + +*long_max_spec: +%{mlong64:-D__LONG_MAX__=9223372036854775807L} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported.} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mcpu=*} %{m4650} %{mmad:-m4650} %{m3900} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +%{g} %{g0} %{g1} %{g2} %{g3} %{ggdb:-g} %{ggdb0:-g0} %{ggdb1:-g1} %{ggdb2:-g2} %{ggdb3:-g3} %{gstabs:-g} %{gstabs0:-g0} %{gstabs1:-g1} %{gstabs2:-g2} %{gstabs3:-g3} %{gstabs+:-g} %{gstabs+0:-g0} %{gstabs+1:-g1} %{gstabs+2:-g2} %{gstabs+3:-g3} %{gcoff:-g} %{gcoff0:-g0} %{gcoff1:-g1} %{gcoff2:-g2} %{gcoff3:-g3} + +*subtarget_asm_spec: + + +*linker_endian_spec: +%{!EB:%{!meb:-EL}} + +*link_command: +%{!fsyntax-only: %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %D %o %{!nostdlib:%{!nodefaultlibs:%G %L %G}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} + }}}}}} + diff --git a/usr/local/nachos/lib/libbfd.a b/usr/local/nachos/lib/libbfd.a new file mode 100644 index 0000000..646d2bb Binary files /dev/null and b/usr/local/nachos/lib/libbfd.a differ diff --git a/usr/local/nachos/lib/libbfd.la b/usr/local/nachos/lib/libbfd.la new file mode 100644 index 0000000..c817faf --- /dev/null +++ b/usr/local/nachos/lib/libbfd.la @@ -0,0 +1,28 @@ +# libbfd.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.3.4 (1.385.2.196 1999/12/07 21:47:57) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libbfd.a' + +# Libraries that this one depends upon. +dependency_libs='' + +# Version information for libbfd. +current=0 +age=0 +revision=0 + +# Is this an already installed library? +installed=yes + +# Directory that this library needs to be installed in: +libdir='/usr/local/nachos/lib' diff --git a/usr/local/nachos/lib/libiberty.a b/usr/local/nachos/lib/libiberty.a new file mode 100644 index 0000000..753ccc0 Binary files /dev/null and b/usr/local/nachos/lib/libiberty.a differ diff --git a/usr/local/nachos/lib/libopcodes.a b/usr/local/nachos/lib/libopcodes.a new file mode 100644 index 0000000..da5be1d Binary files /dev/null and b/usr/local/nachos/lib/libopcodes.a differ diff --git a/usr/local/nachos/lib/libopcodes.la b/usr/local/nachos/lib/libopcodes.la new file mode 100644 index 0000000..6c63015 --- /dev/null +++ b/usr/local/nachos/lib/libopcodes.la @@ -0,0 +1,28 @@ +# libopcodes.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.3.4 (1.385.2.196 1999/12/07 21:47:57) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libopcodes.a' + +# Libraries that this one depends upon. +dependency_libs='' + +# Version information for libopcodes. +current=0 +age=0 +revision=0 + +# Is this an already installed library? +installed=yes + +# Directory that this library needs to be installed in: +libdir='/usr/local/nachos/lib' diff --git a/usr/local/nachos/man/man1/cccp.1 b/usr/local/nachos/man/man1/cccp.1 new file mode 100644 index 0000000..84eb19e --- /dev/null +++ b/usr/local/nachos/man/man1/cccp.1 @@ -0,0 +1,674 @@ +.\" Copyright (c) 1991, 1992, 1993 Free Software Foundation \-*-Text-*- +.\" See section COPYING for conditions for redistribution +.TH cpp 1 "30apr1993" "GNU Tools" "GNU Tools" +.SH NAME +cccp, cpp \- The GNU C-Compatible Compiler Preprocessor. +.SH SYNOPSIS +.hy 0 +.na +.TP +.B cccp +.RB "[\|" \-$ "\|]" +.RB "[\|" \-A \c +.I predicate\c +.RB [ (\c +.I value\c +.BR ) ]\|] +.RB "[\|" \-C "\|]" +.RB "[\|" \-D \c +.I name\c +.RB [ =\c +.I definition\c +\&]\|] +.RB "[\|" \-dD "\|]" +.RB "[\|" \-dM "\|]" +.RB "[\|" "\-I\ "\c +.I directory\c +\&\|] +.RB "[\|" \-H "\|]" +.RB "[\|" \-I\- "\|]" +.RB "[\|" "\-imacros\ "\c +.I file\c +\&\|] +.RB "[\|" "\-include\ "\c +.I file\c +\&\|] +.RB "[\|" "\-idirafter\ "\c +.I dir\c +\&\|] +.RB "[\|" "\-iprefix\ "\c +.I prefix\c +\&\|] +.RB "[\|" "\-iwithprefix\ "\c +.I dir\c +\&\|] +.RB "[\|" \-lang\-c "\|]" +.RB "[\|" \-lang\-c++ "\|]" +.RB "[\|" \-lang\-objc "\|]" +.RB "[\|" \-lang\-objc++ "\|]" +.RB "[\|" \-lint "\|]" +.RB "[\|" \-M\ [ \-MG "\|]]" +.RB "[\|" \-MM\ [ \-MG "\|]]" +.RB "[\|" \-MD\ \c +.I file\ \c +\&\|] +.RB "[\|" \-MMD\ \c +.I file\ \c +\&\|] +.RB "[\|" \-nostdinc "\|]" +.RB "[\|" \-nostdinc++ "\|]" +.RB "[\|" \-P "\|]" +.RB "[\|" \-pedantic "\|]" +.RB "[\|" \-pedantic\-errors "\|]" +.RB "[\|" \-traditional "\|]" +.RB "[\|" \-trigraphs "\|]" +.RB "[\|" \-U \c +.I name\c +\&\|] +.RB "[\|" \-undef "\|]" +.RB "[\|" \-Wtrigraphs "\|]" +.RB "[\|" \-Wcomment "\|]" +.RB "[\|" \-Wall "\|]" +.RB "[\|" \-Wtraditional "\|]" +.br +.RB "[\|" \c +.I infile\c +.RB | \- "\|]" +.RB "[\|" \c +.I outfile\c +.RB | \- "\|]" +.ad b +.hy 1 +.SH DESCRIPTION +The C preprocessor is a \c +.I macro processor\c +\& that is used automatically by +the C compiler to transform your program before actual compilation. It is +called a macro processor because it allows you to define \c +.I macros\c +\&, +which are brief abbreviations for longer constructs. + +The C preprocessor provides four separate facilities that you can use as +you see fit: +.TP +\(bu +Inclusion of header files. These are files of declarations that can be +substituted into your program. +.TP +\(bu +Macro expansion. You can define \c +.I macros\c +\&, which are abbreviations +for arbitrary fragments of C code, and then the C preprocessor will +replace the macros with their definitions throughout the program. +.TP +\(bu +Conditional compilation. Using special preprocessing directives, you +can include or exclude parts of the program according to various +conditions. +.TP +\(bu +Line control. If you use a program to combine or rearrange source files into +an intermediate file which is then compiled, you can use line control +to inform the compiler of where each source line originally came from. +.PP +C preprocessors vary in some details. For a full explanation of the +GNU C preprocessor, see the +.B info +file `\|\c +.B cpp.info\c +\&\|', or the manual +.I The C Preprocessor\c +\&. Both of these are built from the same documentation source file, `\|\c +.B cpp.texinfo\c +\&\|'. The GNU C +preprocessor provides a superset of the features of ANSI Standard C. + +ANSI Standard C requires the rejection of many harmless constructs commonly +used by today's C programs. Such incompatibility would be inconvenient for +users, so the GNU C preprocessor is configured to accept these constructs +by default. Strictly speaking, to get ANSI Standard C, you must use the +options `\|\c +.B \-trigraphs\c +\&\|', `\|\c +.B \-undef\c +\&\|' and `\|\c +.B \-pedantic\c +\&\|', but in +practice the consequences of having strict ANSI Standard C make it +undesirable to do this. + +Most often when you use the C preprocessor you will not have to invoke it +explicitly: the C compiler will do so automatically. However, the +preprocessor is sometimes useful individually. + +When you call the preprocessor individually, either name +(\c +.B cpp\c +\& or \c +.B cccp\c +\&) will do\(em\&they are completely synonymous. + +The C preprocessor expects two file names as arguments, \c +.I infile\c +\& and +\c +.I outfile\c +\&. The preprocessor reads \c +.I infile\c +\& together with any other +files it specifies with `\|\c +.B #include\c +\&\|'. All the output generated by the +combined input files is written in \c +.I outfile\c +\&. + +Either \c +.I infile\c +\& or \c +.I outfile\c +\& may be `\|\c +.B \-\c +\&\|', which as \c +.I infile\c +\& +means to read from standard input and as \c +.I outfile\c +\& means to write to +standard output. Also, if \c +.I outfile\c +\& or both file names are omitted, +the standard output and standard input are used for the omitted file names. +.SH OPTIONS +Here is a table of command options accepted by the C preprocessor. +These options can also be given when compiling a C program; they are +passed along automatically to the preprocessor when it is invoked by +the compiler. +.TP +.B \-P +Inhibit generation of `\|\c +.B #\c +\&\|'-lines with line-number information in +the output from the preprocessor. This might be +useful when running the preprocessor on something that is not C code +and will be sent to a program which might be confused by the +`\|\c +.B #\c +\&\|'-lines. +.TP +.B \-C +Do not discard comments: pass them through to the output file. +Comments appearing in arguments of a macro call will be copied to the +output before the expansion of the macro call. +.TP +.B \-traditional +Try to imitate the behavior of old-fashioned C, as opposed to ANSI C. +.TP +.B \-trigraphs +Process ANSI standard trigraph sequences. These are three-character +sequences, all starting with `\|\c +.B ??\c +\&\|', that are defined by ANSI C to +stand for single characters. For example, `\|\c +.B ??/\c +\&\|' stands for +`\|\c +.BR "\e" "\|'," +so `\|\c +.B '??/n'\c +\&\|' is a character constant for a newline. +Strictly speaking, the GNU C preprocessor does not support all +programs in ANSI Standard C unless `\|\c +.B \-trigraphs\c +\&\|' is used, but if +you ever notice the difference it will be with relief. + +You don't want to know any more about trigraphs. +.TP +.B \-pedantic +Issue warnings required by the ANSI C standard in certain cases such +as when text other than a comment follows `\|\c +.B #else\c +\&\|' or `\|\c +.B #endif\c +\&\|'. +.TP +.B \-pedantic\-errors +Like `\|\c +.B \-pedantic\c +\&\|', except that errors are produced rather than +warnings. +.TP +.B \-Wtrigraphs +Warn if any trigraphs are encountered (assuming they are enabled). +.TP +.B \-Wcomment +.TP +.B \-Wcomments +Warn whenever a comment-start sequence `\|\c +.B /*\c +\&\|' appears in a comment. +(Both forms have the same effect). +.TP +.B \-Wall +Requests both `\|\c +.B \-Wtrigraphs\c +\&\|' and `\|\c +.B \-Wcomment\c +\&\|' (but not +`\|\c +.B \-Wtraditional\c +\&\|'). +.TP +.B \-Wtraditional +Warn about certain constructs that behave differently in traditional and +ANSI C. +.TP +.BI "\-I " directory\c +\& +Add the directory \c +.I directory\c +\& to the end of the list of +directories to be searched for header files. +This can be used to override a system header file, substituting your +own version, since these directories are searched before the system +header file directories. If you use more than one `\|\c +.B \-I\c +\&\|' option, +the directories are scanned in left-to-right order; the standard +system directories come after. +.TP +.B \-I\- +Any directories specified with `\|\c +.B \-I\c +\&\|' options before the `\|\c +.B \-I\-\c +\&\|' +option are searched only for the case of `\|\c +.B #include "\c +.I file\c +\&"\c +\&\|'; +they are not searched for `\|\c +.B #include <\c +.I file\c +\&>\c +\&\|'. + +If additional directories are specified with `\|\c +.B \-I\c +\&\|' options after +the `\|\c +.B \-I\-\c +\&\|', these directories are searched for all `\|\c +.B #include\c +\&\|' +directives. + +In addition, the `\|\c +.B \-I\-\c +\&\|' option inhibits the use of the current +directory as the first search directory for `\|\c +.B #include "\c +.I file\c +\&"\c +\&\|'. +Therefore, the current directory is searched only if it is requested +explicitly with `\|\c +.B \-I.\c +\&\|'. Specifying both `\|\c +.B \-I\-\c +\&\|' and `\|\c +.B \-I.\c +\&\|' +allows you to control precisely which directories are searched before +the current one and which are searched after. +.TP +.B \-nostdinc +Do not search the standard system directories for header files. +Only the directories you have specified with `\|\c +.B \-I\c +\&\|' options +(and the current directory, if appropriate) are searched. +.TP +.B \-nostdinc++ +Do not search for header files in the C++ specific standard +directories, but do still search the other standard directories. +(This option is used when building libg++.) +.TP +.BI "\-D " "name"\c +\& +Predefine \c +.I name\c +\& as a macro, with definition `\|\c +.B 1\c +\&\|'. +.TP +.BI "\-D " "name" = definition +\& +Predefine \c +.I name\c +\& as a macro, with definition \c +.I definition\c +\&. +There are no restrictions on the contents of \c +.I definition\c +\&, but if +you are invoking the preprocessor from a shell or shell-like program +you may need to use the shell's quoting syntax to protect characters +such as spaces that have a meaning in the shell syntax. If you use more than +one `\|\c +.B \-D\c +\&\|' for the same +.I name\c +\&, the rightmost definition takes effect. +.TP +.BI "\-U " "name"\c +\& +Do not predefine \c +.I name\c +\&. If both `\|\c +.B \-U\c +\&\|' and `\|\c +.B \-D\c +\&\|' are +specified for one name, the `\|\c +.B \-U\c +\&\|' beats the `\|\c +.B \-D\c +\&\|' and the name +is not predefined. +.TP +.B \-undef +Do not predefine any nonstandard macros. +.TP +.BI "\-A " "name(" value ) +Assert (in the same way as the \c +.B #assert\c +\& directive) +the predicate \c +.I name\c +\& with tokenlist \c +.I value\c +\&. Remember to escape or quote the parentheses on +shell command lines. + +You can use `\|\c +.B \-A-\c +\&\|' to disable all predefined assertions; it also +undefines all predefined macros. +.TP +.B \-dM +Instead of outputting the result of preprocessing, output a list of +`\|\c +.B #define\c +\&\|' directives for all the macros defined during the +execution of the preprocessor, including predefined macros. This gives +you a way of finding out what is predefined in your version of the +preprocessor; assuming you have no file `\|\c +.B foo.h\c +\&\|', the command +.sp +.br +touch\ foo.h;\ cpp\ \-dM\ foo.h +.br +.sp +will show the values of any predefined macros. +.TP +.B \-dD +Like `\|\c +.B \-dM\c +\&\|' except in two respects: it does \c +.I not\c +\& include the +predefined macros, and it outputs \c +.I both\c +\& the `\|\c +.B #define\c +\&\|' +directives and the result of preprocessing. Both kinds of output go to +the standard output file. +.PP +.TP +.BR \-M\ [ \-MG ] +Instead of outputting the result of preprocessing, output a rule +suitable for \c +.B make\c +\& describing the dependencies of the main +source file. The preprocessor outputs one \c +.B make\c +\& rule containing +the object file name for that source file, a colon, and the names of +all the included files. If there are many included files then the +rule is split into several lines using `\|\c +.B \\\\\c +\&\|'-newline. + +`\|\c +.B \-MG\c +\&\|' says to treat missing header files as generated files and assume \c +they live in the same directory as the source file. It must be specified \c +in addition to `\|\c +.B \-M\c +\&\|'. + +This feature is used in automatic updating of makefiles. +.TP +.BR \-MM\ [ \-MG ] +Like `\|\c +.B \-M\c +\&\|' but mention only the files included with `\|\c +.B #include +"\c +.I file\c +\&"\c +\&\|'. System header files included with `\|\c +.B #include +<\c +.I file\c +\&>\c +\&\|' are omitted. +.TP +.BI \-MD\ file +Like `\|\c +.B \-M\c +\&\|' but the dependency information is written to `\|\c +.I file\c +\&\|'. This is in addition to compiling the file as +specified\(em\&`\|\c +.B \-MD\c +\&\|' does not inhibit ordinary compilation the way +`\|\c +.B \-M\c +\&\|' does. + +When invoking gcc, do not specify the `\|\c +.I file\c +\&\|' argument. Gcc will create file names made by replacing `\|\c +.B .c\c +\&\|' with `\|\c +.B .d\c +\&\|' at the end of the input file names. + +In Mach, you can use the utility \c +.B md\c +\& to merge multiple files +into a single dependency file suitable for using with the `\|\c +.B make\c +\&\|' +command. +.TP +.BI \-MMD\ file +Like `\|\c +.B \-MD\c +\&\|' except mention only user header files, not system +header files. +.TP +.B \-H +Print the name of each header file used, in addition to other normal +activities. +.TP +.BI "\-imacros " "file"\c +\& +Process \c +.I file\c +\& as input, discarding the resulting output, before +processing the regular input file. Because the output generated from +\c +.I file\c +\& is discarded, the only effect of `\|\c +.B \-imacros \c +.I file\c +\&\c +\&\|' is to +make the macros defined in \c +.I file\c +\& available for use in the main +input. The preprocessor evaluates any `\|\c +.B \-D\c +\&\|' and `\|\c +.B \-U\c +\&\|' options +on the command line before processing `\|\c +.B \-imacros \c +.I file\c +\&\|' \c +\&. +.TP +.BI "\-include " "file" +Process +.I file +as input, and include all the resulting output, +before processing the regular input file. +.TP +.BI "-idirafter " "dir"\c +\& +Add the directory \c +.I dir\c +\& to the second include path. The directories +on the second include path are searched when a header file is not found +in any of the directories in the main include path (the one that +`\|\c +.B \-I\c +\&\|' adds to). +.TP +.BI "-iprefix " "prefix"\c +\& +Specify \c +.I prefix\c +\& as the prefix for subsequent `\|\c +.B \-iwithprefix\c +\&\|' +options. +.TP +.BI "-iwithprefix " "dir"\c +\& +Add a directory to the second include path. The directory's name is +made by concatenating \c +.I prefix\c +\& and \c +.I dir\c +\&, where \c +.I prefix\c +\& +was specified previously with `\|\c +.B \-iprefix\c +\&\|'. +.TP +.B \-lang-c +.TP +.B \-lang-c++ +.TP +.B \-lang-objc +.TP +.B \-lang-objc++ +Specify the source language. `\|\c +.B \-lang-c++\c +\&\|' makes the preprocessor +handle C++ comment syntax, and includes extra default include +directories for C++, and `\|\c +.B \-lang-objc\c +\&\|' enables the Objective C +`\|\c +.B #import\c +\&\|' directive. `\|\c +.B \-lang-c\c +\&\|' explicitly turns off both of +these extensions, and `\|\c +.B \-lang-objc++\c +\&\|' enables both. + +These options are generated by the compiler driver \c +.B gcc\c +\&, but not +passed from the `\|\c +.B gcc\c +\&\|' command line. +.TP +.B \-lint +Look for commands to the program checker \c +.B lint\c +\& embedded in +comments, and emit them preceded by `\|\c +.B #pragma lint\c +\&\|'. For example, +the comment `\|\c +.B /* NOTREACHED */\c +\&\|' becomes `\|\c +.B #pragma lint +NOTREACHED\c +\&\|'. + +This option is available only when you call \c +.B cpp\c +\& directly; +\c +.B gcc\c +\& will not pass it from its command line. +.TP +.B \-$ +Forbid the use of `\|\c +.B $\c +\&\|' in identifiers. This was formerly required for strict conformance +to the C Standard before the standard was corrected. \c + +This option is available only when you call \c +.B cpp\c +\& directly; +.B gcc\c +\& will not pass it from its command line. +.SH "SEE ALSO" +.RB "`\|" Cpp "\|'" +entry in +.B info\c +\&; +.I The C Preprocessor\c +, Richard M. Stallman. +.br +.BR gcc "(" 1 ");" +.RB "`\|" Gcc "\|'" +entry in +.B info\c +\&; +.I +Using and Porting GNU CC (for version 2.0)\c +, Richard M. Stallman. +.SH COPYING +Copyright (c) 1991, 1992, 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/usr/local/nachos/man/man1/decstation-ultrix-addr2line.1 b/usr/local/nachos/man/man1/decstation-ultrix-addr2line.1 new file mode 100644 index 0000000..87ce103 --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-addr2line.1 @@ -0,0 +1,127 @@ +.\" 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/usr/local/nachos/man/man1/decstation-ultrix-ar.1 b/usr/local/nachos/man/man1/decstation-ultrix-ar.1 new file mode 100644 index 0000000..cd71a40 --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-ar.1 @@ -0,0 +1,533 @@ +.\" 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/usr/local/nachos/man/man1/decstation-ultrix-as.1 b/usr/local/nachos/man/man1/decstation-ultrix-as.1 new file mode 100644 index 0000000..5fc517c --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-as.1 @@ -0,0 +1,308 @@ +.\" Copyright (c) 1991, 1992, 1996, 1997, 1998 Free Software Foundation +.\" See section COPYING for conditions for redistribution +.TH as 1 "29 March 1996" "cygnus support" "GNU Development Tools" + +.SH NAME +GNU as \- the portable GNU assembler. + +.SH SYNOPSIS +.na +.B as +.RB "[\|" \-a "[\|" dhlns "\|]" \c +\&[\|\=\c +.I file\c +\&\|]\|] +.RB "[\|" \-D "\|]" +.RB "[\|" \-\-defsym\ SYM=VAL "\|]" +.RB "[\|" \-f "\|]" +.RB "[\|" \-\-gstabs "\|]" +.RB "[\|" \-I +.I path\c +\&\|] +.RB "[\|" \-K "\|]" +.RB "[\|" \-L "\|]" +.RB "[\|" \-M\ |\ \-\-mri "\|]" +.RB "[\|" \-o +.I objfile\c +\&\|] +.RB "[\|" \-R "\|]" +.RB "[\|" \-\-traditional\-format "\|]" +.RB "[\|" \-v "\|]" +.RB "[\|" \-w "\|]" +.RB "[\|" \-\^\- "\ |\ " \c +.I files\c +\&\|.\|.\|.\|] + +.I i960-only options: +.br +.RB "[\|" \-ACA "\||\|" \-ACA_A "\||\|" \-ACB\c +.RB "\||\|" \-ACC "\||\|" \-AKA "\||\|" \-AKB\c +.RB "\||\|" \-AKC "\||\|" \-AMC "\|]" +.RB "[\|" \-b "\|]" +.RB "[\|" \-no-relax "\|]" + +.I m680x0-only options: +.br +.RB "[\|" \-l "\|]" +.RB "[\|" \-mc68000 "\||\|" \-mc68010 "\||\|" \-mc68020 "\|]" +.ad b + +.SH DESCRIPTION +GNU \c +.B as\c +\& is really a family of assemblers. +If you use (or have used) the GNU assembler on one architecture, you +should find a fairly similar environment when you use it on another +architecture. Each version has much in common with the others, +including object file formats, most assembler directives (often called +\c +.I pseudo-ops)\c +\& and assembler syntax. + +For information on the syntax and pseudo-ops used by GNU \c +.B as\c +\&, see `\|\c +.B as\c +\|' entry in \c +.B info \c +(or the manual \c +.I +.I +Using as: The GNU Assembler\c +\&). + +\c +.B as\c +\& is primarily intended to assemble the output of the GNU C +compiler \c +.B gcc\c +\& for use by the linker \c +.B ld\c +\&. Nevertheless, +we've tried to make \c +.B as\c +\& assemble correctly everything that the native +assembler would. +This doesn't mean \c +.B as\c +\& always uses the same syntax as another +assembler for the same architecture; for example, we know of several +incompatible versions of 680x0 assembly language syntax. + +Each time you run \c +.B as\c +\& it assembles exactly one source +program. The source program is made up of one or more files. +(The standard input is also a file.) + +If \c +.B as\c +\& is given no file names it attempts to read one input file +from the \c +.B as\c +\& standard input, which is normally your terminal. You +may have to type \c +.B ctl-D\c +\& to tell \c +.B as\c +\& there is no more program +to assemble. Use `\|\c +.B \-\^\-\c +\|' if you need to explicitly name the standard input file +in your command line. + +.B as\c +\& may write warnings and error messages to the standard error +file (usually your terminal). This should not happen when \c +.B as\c +\& is +run automatically by a compiler. Warnings report an assumption made so +that \c +.B as\c +\& could keep assembling a flawed program; errors report a +grave problem that stops the assembly. + +.SH OPTIONS +.TP +.BR \-a +Turn on assembly listings. There are various suboptions. +.B d +omits debugging directives. +.B h +includes the high level source code; this is only available if the +source file can be found, and the code was compiled with +.B \-g. +.B l +includes an assembly listing. +.B n +omits forms processing. +.B s +includes a symbol listing. +.B = +.I file +sets the listing file name; this must be the last suboption. +The default suboptions are +.B hls. +.TP +.B \-D +This option is accepted only for script compatibility with calls to +other assemblers; it has no effect on \c +.B as\c +\&. +.TP +.B \-\-defsym SYM=VALUE +Define the symbol SYM to be VALUE before assembling the input file. +VALUE must be an integer constant. As in C, a leading 0x indicates a +hexadecimal value, and a leading 0 indicates an octal value. +.TP +.B \-f +``fast''--skip preprocessing (assume source is compiler output). +.TP +.BI "\-I\ " path +Add +.I path +to the search list for +.B .include +directives. +.TP +.B \-\-gstabs +Generate stabs debugging information for each assembler line. This +may help debugging assembler code, if the debugger can handle it. +.TP +.B \-K +Issue warnings when difference tables altered for long displacements. +.TP +.B \-L +Keep (in symbol table) local symbols, starting with `\|\c +.B L\c +\|' +.TP +.B \-M, \-\-mri +Assemble in MRI compatibility mode. +.TP +.BI "\-o\ " objfile +Name the object-file output from \c +.B as +.TP +.B \-R +Fold data section into text section +.TP +.B \-\-traditional\-format +Use same format as native assembler, when possible. +.TP +.B \-v +Announce \c +.B as\c +\& version +.TP +.B \-W, \-\-no-warn +Suppress warning messages. +.TP +.B \-\-fatal\-warnings +Consider warnings to be fatal. +.TP +.B \-\-warn +Just warn on warnings. +.TP +.IR "\-\^\-" "\ |\ " "files\|.\|.\|." +Source files to assemble, or standard input (\c +.BR "\-\^\-" ")" +.TP +.BI \-A var +.I +(When configured for Intel 960.) +Specify which variant of the 960 architecture is the target. +.TP +.B \-b +.I +(When configured for Intel 960.) +Add code to collect statistics about branches taken. +.TP +.B \-no-relax +.I +(When configured for Intel 960.) +Do not alter compare-and-branch instructions for long displacements; +error if necessary. +.TP +.B \-l +.I +(When configured for Motorola 68000). +.br +Shorten references to undefined symbols, to one word instead of two. +.TP +.BR "\-mc68000" "\||\|" "\-mc68010" "\||\|" "\-mc68020" +.I +(When configured for Motorola 68000). +.br +Specify what processor in the 68000 family is the target (default 68020) + +.PP +Options may be in any order, and may be +before, after, or between file names. The order of file names is +significant. + +`\|\c +.B \-\^\-\c +\|' (two hyphens) by itself names the standard input file +explicitly, as one of the files for \c +.B as\c +\& to assemble. + +Except for `\|\c +.B \-\^\-\c +\|' any command line argument that begins with a +hyphen (`\|\c +.B \-\c +\|') is an option. Each option changes the behavior of +\c +.B as\c +\&. No option changes the way another option works. An +option is a `\|\c +.B \-\c +\|' followed by one or more letters; the case of +the letter is important. All options are optional. + +The `\|\c +.B \-o\c +\|' option expects exactly one file name to follow. The file +name may either immediately follow the option's letter (compatible +with older assemblers) or it may be the next command argument (GNU +standard). + +These two command lines are equivalent: +.br +.B +as\ \ \-o\ \ my\-object\-file.o\ \ mumble.s +.br +.B +as\ \ \-omy\-object\-file.o\ \ mumble.s + +.SH "SEE ALSO" +.RB "`\|" as "\|'" +entry in +.B +info\c +\&; +.I +Using as: The GNU Assembler\c +\&; +.BR gcc "(" 1 ")," +.BR ld "(" 1 ")." + +.SH COPYING +Copyright (c) 1991, 1992 Free Software Foundation, Inc. +.PP +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. +.PP +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. +.PP +Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that this permission notice may be included in +translations approved by the Free Software Foundation instead of in +the original English. diff --git a/usr/local/nachos/man/man1/decstation-ultrix-c++filt.1 b/usr/local/nachos/man/man1/decstation-ultrix-c++filt.1 new file mode 100644 index 0000000..3132ac9 --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-c++filt.1 @@ -0,0 +1,114 @@ +.\" Copyright (c) 1991 Free Software Foundation +.\" See section COPYING for conditions for redistribution +.TH c++filt 1 "June 1993" "cygnus support" "GNU Development Tools" +.de BP +.sp +.ti \-.2i +\(** +.. + +.SH NAME +c++filt \- demangle C++ symbols + +.SH SYNOPSIS +.hy 0 +.na +.TP +.B c++filt +.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 c++filt +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 c++filt +to decipher individual symbols by specifying these symbols on the +command line. +.PP +If no +.B symbol +arguments are given, +.B 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. +.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 c++filt +and exit. + +.TP +.B \-\-version +Print the version number of +.B c++filt +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/usr/local/nachos/man/man1/decstation-ultrix-gcc.1 b/usr/local/nachos/man/man1/decstation-ultrix-gcc.1 new file mode 100644 index 0000000..74200a1 --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-gcc.1 @@ -0,0 +1,4191 @@ +.\" Copyright (c) 1991, 1992, 1993, 1994 Free Software Foundation -*-Text-*- +.\" See section COPYING for conditions for redistribution +.\" +.\" Set up \*(lq, \*(rq if -man hasn't already set it up. +.if @@\*(lq@ \{\ +. ds lq " +. if t .ds lq `` +. if !@@\(lq@ .ds lq "\(lq +.\} +.if @@\*(rq@ \{\ +. ds rq " +. if t .ds rq '' +. if !@@\(rq@ .ds rq "\(rq +.\} +.de Id +.ds Rv \\$3 +.ds Dt \\$4 +.. +.de Sp +.if n .sp +.if t .sp 0.4 +.. +.Id $Id: gcc.1,v 1.9 1998/12/16 20:55:57 law Exp $ +.TH GCC 1 "\*(Dt" "GNU Tools" "GNU Tools" +.SH NAME +gcc, g++ \- GNU project C and C++ Compiler (gcc-2.95) +.SH SYNOPSIS +.B gcc +.RI "[ " option " | " filename " ].\|.\|." +.br +.B g++ +.RI "[ " option " | " filename " ].\|.\|." +.SH WARNING +The information in this man page is an extract from the full +documentation of the GNU C compiler, and is limited to the meaning of +the options. +.PP +This man page is not kept up to date except when volunteers want to +maintain it. If you find a discrepancy between the man page and the +software, please check the Info file, which is the authoritative +documentation. +.PP +If we find that the things in this man page that are out of date cause +significant confusion or complaints, we will stop distributing the man +page. The alternative, updating the man page when we update the Info +file, is impossible because the rest of the work of maintaining GNU CC +leaves us no time for that. The GNU project regards man pages as +obsolete and should not let them take time away from other things. +.PP +For complete and current documentation, refer to the Info file `\|\c +.B gcc\c +\&\|' or the manual +.I +Using and Porting GNU CC (for version 2.0)\c +\&. Both are made from the Texinfo source file +.BR gcc.texinfo . +.SH DESCRIPTION +The C and C++ compilers are integrated. Both process input files +through one or more of four stages: preprocessing, compilation, +assembly, and linking. Source filename suffixes identify the source +language, but which name you use for the compiler governs default +assumptions: +.TP +.B gcc +assumes preprocessed (\c +.B .i\c +\&) files are C and assumes C style linking. +.TP +.B g++ +assumes preprocessed (\c +.B .i\c +\&) files are C++ and assumes C++ style linking. +.PP +Suffixes of source file names indicate the language and kind of +processing to be done: +.Sp +.nf +.ta \w'\fB.cxx\fP 'u +\&\fB.c\fP C source; preprocess, compile, assemble +\&\fB.C\fP C++ source; preprocess, compile, assemble +\&\fB.cc\fP C++ source; preprocess, compile, assemble +\&\fB.cxx\fP C++ source; preprocess, compile, assemble +\&\fB.m\fP Objective-C source; preprocess, compile, assemble +\&\fB.i\fP preprocessed C; compile, assemble +\&\fB.ii\fP preprocessed C++; compile, assemble +\&\fB.s\fP Assembler source; assemble +\&\fB.S\fP Assembler source; preprocess, assemble +\&\fB.h\fP Preprocessor file; not usually named on command line +.Sp +.fi +Files with other suffixes are passed to the linker. Common cases include: +.Sp +.nf +\&\fB.o\fP Object file +\&\fB.a\fP Archive file +.br +.fi +.Sp +Linking is always the last stage unless you use one of the +.BR \-c , +.BR \-S , +or +.B \-E +options to avoid it (or unless compilation errors stop the whole +process). For the link stage, all +.B .o +files corresponding to source files, +.B \-l +libraries, unrecognized filenames (including named +.B .o +object files and +.B .a +archives) +are passed to the linker in command-line order. +.SH OPTIONS +Options must be separate: `\|\c +.B \-dr\c +\&\|' is quite different from `\|\c +.B \-d \-r +\&\|'. +.PP +Most `\|\c +.B \-f\c +\&\|' and `\|\c +.B \-W\c +\&\|' options have two contrary forms: +.BI \-f name +and +.BI \-fno\- name\c +\& (or +.BI \-W name +and +.BI \-Wno\- name\c +\&). Only the non-default forms are shown here. +.PP +Here is a summary of all the options, grouped by type. Explanations are +in the following sections. +.hy 0 +.na +.TP +.B Overall Options +.br +\-c +\-S +\-E +.RI "\-o " file +\-pipe +\-v +.RI "\-x " language +.TP +.B Language Options +\-ansi +\-fall\-virtual +\-fcond\-mismatch +\-fdollars\-in\-identifiers +\-fenum\-int\-equiv +\-fexternal\-templates +\-fno\-asm +\-fno\-builtin +\-fhosted +\-fno\-hosted +\-ffreestanding +\-fno\-freestanding +\-fno\-strict\-prototype +\-fsigned\-bitfields +\-fsigned\-char +\-fthis\-is\-variable +\-funsigned\-bitfields +\-funsigned\-char +\-fwritable\-strings +\-traditional +\-traditional\-cpp +\-trigraphs +.TP +.B Warning Options +\-fsyntax\-only +\-pedantic +\-pedantic\-errors +\-w +\-W +\-Wall +\-Waggregate\-return +\-Wcast\-align +\-Wcast\-qual +\-Wchar\-subscript +\-Wcomment +\-Wconversion +\-Wenum\-clash +\-Werror +\-Wformat +.RI \-Wid\-clash\- len +\-Wimplicit +\-Wimplicit\-int +\-Wimplicit\-function\-declaration +\-Winline +\-Wlong\-long +\-Wmain +\-Wmissing\-prototypes +\-Wmissing\-declarations +\-Wnested\-externs +\-Wno\-import +\-Wparentheses +\-Wpointer\-arith +\-Wredundant\-decls +\-Wreturn\-type +\-Wshadow +\-Wstrict\-prototypes +\-Wswitch +\-Wtemplate\-debugging +\-Wtraditional +\-Wtrigraphs +\-Wuninitialized +\-Wunused +\-Wwrite\-strings +.TP +.B Debugging Options +\-a +.RI \-d letters +\-fpretend\-float +\-g +.RI \-g level +\-gcoff +\-gxcoff +\-gxcoff+ +\-gdwarf +\-gdwarf+ +\-gstabs +\-gstabs+ +\-ggdb +\-p +\-pg +\-save\-temps +.RI \-print\-file\-name= library +\-print\-libgcc\-file\-name +.RI \-print\-prog\-name= program +.TP +.B Optimization Options +\-fcaller\-saves +\-fcse\-follow\-jumps +\-fcse\-skip\-blocks +\-fdelayed\-branch +\-felide\-constructors +\-fexpensive\-optimizations +\-ffast\-math +\-ffloat\-store +\-fforce\-addr +\-fforce\-mem +\-finline\-functions +\-fkeep\-inline\-functions +\-fmemoize\-lookups +\-fno\-default\-inline +\-fno\-defer\-pop +\-fno\-function\-cse +\-fno\-inline +\-fno\-peephole +\-fomit\-frame\-pointer +\-frerun\-cse\-after\-loop +\-fschedule\-insns +\-fschedule\-insns2 +\-fstrength\-reduce +\-fthread\-jumps +\-funroll\-all\-loops +\-funroll\-loops +\-O +\-O2 +\-O3 +.TP +.B Preprocessor Options +.RI \-A assertion +\-C +\-dD +\-dM +\-dN +.RI \-D macro [\|= defn \|] +\-E +\-H +.RI "\-idirafter " dir +.RI "\-include " file +.RI "\-imacros " file +.RI "\-iprefix " file +.RI "\-iwithprefix " dir +\-M +\-MD +\-MM +\-MMD +\-nostdinc +\-P +.RI \-U macro +\-undef +.TP +.B Assembler Option +.RI \-Wa, option +.TP +.B Linker Options +.RI \-l library +\-nostartfiles +\-nostdlib +\-static +\-shared +\-symbolic +.RI "\-Xlinker\ " option +.RI \-Wl, option +.RI "\-u " symbol +.TP +.B Directory Options +.RI \-B prefix +.RI \-I dir +\-I\- +.RI \-L dir +.TP +.B Target Options +.RI "\-b " machine +.RI "\-V " version +.TP +.B Configuration Dependent Options +.I M680x0\ Options +.br +\-m68000 +\-m68020 +\-m68020\-40 +\-m68030 +\-m68040 +\-m68881 +\-mbitfield +\-mc68000 +\-mc68020 +\-mfpa +\-mnobitfield +\-mrtd +\-mshort +\-msoft\-float +.Sp +.I VAX Options +.br +\-mg +\-mgnu +\-munix +.Sp +.I SPARC Options +.br +\-mepilogue +\-mfpu +\-mhard\-float +\-mno\-fpu +\-mno\-epilogue +\-msoft\-float +\-msparclite +\-mv8 +\-msupersparc +\-mcypress +.Sp +.I Convex Options +.br +\-margcount +\-mc1 +\-mc2 +\-mnoargcount +.Sp +.I AMD29K Options +.br +\-m29000 +\-m29050 +\-mbw +\-mdw +\-mkernel\-registers +\-mlarge +\-mnbw +\-mnodw +\-msmall +\-mstack\-check +\-muser\-registers +.Sp +.I M88K Options +.br +\-m88000 +\-m88100 +\-m88110 +\-mbig\-pic +\-mcheck\-zero\-division +\-mhandle\-large\-shift +\-midentify\-revision +\-mno\-check\-zero\-division +\-mno\-ocs\-debug\-info +\-mno\-ocs\-frame\-position +\-mno\-optimize\-arg\-area +\-mno\-serialize\-volatile +\-mno\-underscores +\-mocs\-debug\-info +\-mocs\-frame\-position +\-moptimize\-arg\-area +\-mserialize\-volatile +.RI \-mshort\-data\- num +\-msvr3 +\-msvr4 +\-mtrap\-large\-shift +\-muse\-div\-instruction +\-mversion\-03.00 +\-mwarn\-passed\-structs +.Sp +.I RS6000 Options +.br +\-mfp\-in\-toc +\-mno\-fop\-in\-toc +.Sp +.I RT Options +.br +\-mcall\-lib\-mul +\-mfp\-arg\-in\-fpregs +\-mfp\-arg\-in\-gregs +\-mfull\-fp\-blocks +\-mhc\-struct\-return +\-min\-line\-mul +\-mminimum\-fp\-blocks +\-mnohc\-struct\-return +.Sp +.I MIPS Options +.br +\-mcpu=\fIcpu type\fP +\-mips2 +\-mips3 +\-mint64 +\-mlong64 +\-mlonglong128 +\-mmips\-as +\-mgas +\-mrnames +\-mno\-rnames +\-mgpopt +\-mno\-gpopt +\-mstats +\-mno\-stats +\-mmemcpy +\-mno\-memcpy +\-mno\-mips\-tfile +\-mmips\-tfile +\-msoft\-float +\-mhard\-float +\-mabicalls +\-mno\-abicalls +\-mhalf\-pic +\-mno\-half\-pic +\-G \fInum\fP +\-nocpp +.Sp +.I i386 Options +.br +\-m486 +\-mno\-486 +\-msoft\-float +\-mno\-fp\-ret\-in\-387 +.Sp +.I HPPA Options +.br +\-mpa\-risc\-1\-0 +\-mpa\-risc\-1\-1 +\-mkernel +\-mshared\-libs +\-mno\-shared\-libs +\-mlong\-calls +\-mdisable\-fpregs +\-mdisable\-indexing +\-mtrailing\-colon +.Sp +.I i960 Options +.br +\-m\fIcpu-type\fP +\-mnumerics +\-msoft\-float +\-mleaf\-procedures +\-mno\-leaf\-procedures +\-mtail\-call +\-mno\-tail\-call +\-mcomplex\-addr +\-mno\-complex\-addr +\-mcode\-align +\-mno\-code\-align +\-mic\-compat +\-mic2.0\-compat +\-mic3.0\-compat +\-masm\-compat +\-mintel\-asm +\-mstrict\-align +\-mno\-strict\-align +\-mold\-align +\-mno\-old\-align +.Sp +.I DEC Alpha Options +.br +\-mfp\-regs +\-mno\-fp\-regs +\-mno\-soft\-float +\-msoft\-float +.Sp +.I System V Options +.br +\-G +\-Qy +\-Qn +.RI \-YP, paths +.RI \-Ym, dir +.TP +.B Code Generation Options +.RI \-fcall\-saved\- reg +.RI \-fcall\-used\- reg +.RI \-ffixed\- reg +\-finhibit\-size\-directive +\-fnonnull\-objects +\-fno\-common +\-fno\-ident +\-fno\-gnu\-linker +\-fpcc\-struct\-return +\-fpic +\-fPIC +\-freg\-struct\-return +\-fshared\-data +\-fshort\-enums +\-fshort\-double +\-fvolatile +\-fvolatile\-global +\-fverbose\-asm +.ad b +.hy 1 +.SH OVERALL OPTIONS +.TP +.BI "\-x " "language" +Specify explicitly the +.I language\c +\& for the following input files (rather than choosing a default based +on the file name suffix) . This option applies to all following input +files until the next `\|\c +.B \-x\c +\&\|' option. Possible values of \c +.I language\c +\& are +`\|\c +.B c\c +\&\|', `\|\c +.B objective\-c\c +\&\|', `\|\c +.B c\-header\c +\&\|', `\|\c +.B c++\c +\&\|', +`\|\c +.B cpp\-output\c +\&\|', `\|\c +.B assembler\c +\&\|', and `\|\c +.B assembler\-with\-cpp\c +\&\|'. +.TP +.B \-x none +Turn off any specification of a language, so that subsequent files are +handled according to their file name suffixes (as they are if `\|\c +.B \-x\c +\&\|' +has not been used at all). +.PP +If you want only some of the four stages (preprocess, compile, +assemble, link), you can use +`\|\c +.B \-x\c +\&\|' (or filename suffixes) to tell \c +.B gcc\c +\& where to start, and +one of the options `\|\c +.B \-c\c +\&\|', `\|\c +.B \-S\c +\&\|', or `\|\c +.B \-E\c +\&\|' to say where +.B gcc\c +\& is to stop. Note that some combinations (for example, +`\|\c +.B \-x cpp\-output \-E\c +\&\|') instruct \c +.B gcc\c +\& to do nothing at all. +.TP +.B \-c +Compile or assemble the source files, but do not link. The compiler +output is an object file corresponding to each source file. +.Sp +By default, GCC makes the object file name for a source file by replacing +the suffix `\|\c +.B .c\c +\&\|', `\|\c +.B .i\c +\&\|', `\|\c +.B .s\c +\&\|', etc., with `\|\c +.B .o\c +\&\|'. Use +.B \-o\c +\& to select another name. +.Sp +GCC ignores any unrecognized input files (those that do not require +compilation or assembly) with the +.B \-c +option. +.TP +.B \-S +Stop after the stage of compilation proper; do not assemble. The output +is an assembler code file for each non-assembler input +file specified. +.Sp +By default, GCC makes the assembler file name for a source file by +replacing the suffix `\|\c +.B .c\c +\&\|', `\|\c +.B .i\c +\&\|', etc., with `\|\c +.B .s\c +\&\|'. Use +.B \-o\c +\& to select another name. +.Sp +GCC ignores any input files that don't require compilation. +.TP +.B \-E +Stop after the preprocessing stage; do not run the compiler proper. The +output is preprocessed source code, which is sent to the +standard output. +.Sp +GCC ignores input files which don't require preprocessing. +.TP +.BI "\-o " file +Place output in file \c +.I file\c +\&. This applies regardless to whatever +sort of output GCC is producing, whether it be an executable file, +an object file, an assembler file or preprocessed C code. +.Sp +Since only one output file can be specified, it does not make sense to +use `\|\c +.B \-o\c +\&\|' when compiling more than one input file, unless you are +producing an executable file as output. +.Sp +If you do not specify `\|\c +.B \-o\c +\&\|', the default is to put an executable file +in `\|\c +.B a.out\c +\&\|', the object file for `\|\c +.I source\c +.B \&.\c +.I suffix\c +\&\c +\&\|' in +`\|\c +.I source\c +.B \&.o\c +\&\|', its assembler file in `\|\c +.I source\c +.B \&.s\c +\&\|', and +all preprocessed C source on standard output. +.TP +.B \-v +Print (on standard error output) the commands executed to run the stages +of compilation. Also print the version number of the compiler driver +program and of the preprocessor and the compiler proper. +.TP +.B \-pipe +Use pipes rather than temporary files for communication between the +various stages of compilation. This fails to work on some systems where +the assembler cannot read from a pipe; but the GNU assembler has +no trouble. +.PP +.SH LANGUAGE OPTIONS +The following options control the dialect of C that the compiler +accepts: +.TP +.B \-ansi +Support all ANSI standard C programs. +.Sp +This turns off certain features of GNU C that are incompatible with +ANSI C, such as the \c +.B asm\c +\&, \c +.B inline\c +\& and \c +.B typeof +keywords, and predefined macros such as \c +.B unix\c +\& and \c +.B vax +that identify the type of system you are using. It also enables the +undesirable and rarely used ANSI trigraph feature, and disallows `\|\c +.B $\c +\&\|' as part of identifiers. +.Sp +The alternate keywords \c +.B _\|_asm_\|_\c +\&, \c +.B _\|_extension_\|_\c +\&, +.B _\|_inline_\|_\c +\& and \c +.B _\|_typeof_\|_\c +\& continue to work despite +`\|\c +.B \-ansi\c +\&\|'. You would not want to use them in an ANSI C program, of +course, but it is useful to put them in header files that might be included +in compilations done with `\|\c +.B \-ansi\c +\&\|'. Alternate predefined macros +such as \c +.B _\|_unix_\|_\c +\& and \c +.B _\|_vax_\|_\c +\& are also available, with or +without `\|\c +.B \-ansi\c +\&\|'. +.Sp +The `\|\c +.B \-ansi\c +\&\|' option does not cause non-ANSI programs to be +rejected gratuitously. For that, `\|\c +.B \-pedantic\c +\&\|' is required in +addition to `\|\c +.B \-ansi\c +\&\|'. +.Sp +The preprocessor predefines a macro \c +.B _\|_STRICT_ANSI_\|_\c +\& when you use the `\|\c +.B \-ansi\c +\&\|' +option. Some header files may notice this macro and refrain +from declaring certain functions or defining certain macros that the +ANSI standard doesn't call for; this is to avoid interfering with any +programs that might use these names for other things. +.TP +.B \-fno\-asm +Do not recognize \c +.B asm\c +\&, \c +.B inline\c +\& or \c +.B typeof\c +\& as a +keyword. These words may then be used as identifiers. You can +use \c +.B _\|_asm_\|_\c +\&, \c +.B _\|_inline_\|_\c +\& and \c +.B _\|_typeof_\|_\c +\& instead. +`\|\c +.B \-ansi\c +\&\|' implies `\|\c +.B \-fno\-asm\c +\&\|'. +.TP +.B \-fno\-builtin +Don't recognize built-in functions that do not begin with two leading +underscores. Currently, the functions affected include \c +.B _exit\c +\&, +.B abort\c +\&, \c +.B abs\c +\&, \c +.B alloca\c +\&, \c +.B cos\c +\&, \c +.B exit\c +\&, +.B fabs\c +\&, \c +.B labs\c +\&, \c +.B memcmp\c +\&, \c +.B memcpy\c +\&, \c +.B sin\c +\&, +.B sqrt\c +\&, \c +.B strcmp\c +\&, \c +.B strcpy\c +\&, and \c +.B strlen\c +\&. +.Sp +The `\|\c +.B \-ansi\c +\&\|' option prevents \c +.B alloca\c +\& and \c +.B _exit\c +\& from +being builtin functions. +.TP +.B \-fhosted +Compile for a hosted environment; this implies the `\|\c +.B \-fbuiltin\c +\&\|' option, and implies that suspicious declarations of +.B main\c +\& should be warned about. +.TP +.B \-ffreestanding +Compile for a freestanding environment; this implies the `\|\c +.B \-fno-builtin\c +\&\|' option, and implies that +.B main\c +\& has no special requirements. +.TP +.B \-fno\-strict\-prototype +Treat a function declaration with no arguments, such as `\|\c +.B int foo +();\c +\&\|', as C would treat it\(em\&as saying nothing about the number of +arguments or their types (C++ only). Normally, such a declaration in +C++ means that the function \c +.B foo\c +\& takes no arguments. +.TP +.B \-trigraphs +Support ANSI C trigraphs. The `\|\c +.B \-ansi\c +\&\|' option implies `\|\c +.B \-trigraphs\c +\&\|'. +.TP +.B \-traditional +Attempt to support some aspects of traditional C compilers. +For details, see the GNU C Manual; the duplicate list here +has been deleted so that we won't get complaints when it +is out of date. +.Sp +But one note about C++ programs only (not C). `\|\c +.B \-traditional\c +\&\|' has one additional effect for C++: assignment to +.B this +is permitted. This is the same as the effect of `\|\c +.B \-fthis\-is\-variable\c +\&\|'. +.TP +.B \-traditional\-cpp +Attempt to support some aspects of traditional C preprocessors. +This includes the items that specifically mention the preprocessor above, +but none of the other effects of `\|\c +.B \-traditional\c +\&\|'. +.TP +.B \-fdollars\-in\-identifiers +Permit the use of `\|\c +.B $\c +\&\|' in identifiers (C++ only). You can also use +`\|\c +.B \-fno\-dollars\-in\-identifiers\c +\&\|' to explicitly prohibit use of +`\|\c +.B $\c +\&\|'. (GNU C++ allows `\|\c +.B $\c +\&\|' by default on some target systems +but not others.) +.TP +.B \-fenum\-int\-equiv +Permit implicit conversion of \c +.B int\c +\& to enumeration types (C++ +only). Normally GNU C++ allows conversion of \c +.B enum\c +\& to \c +.B int\c +\&, +but not the other way around. +.TP +.B \-fexternal\-templates +Produce smaller code for template declarations, by generating only a +single copy of each template function where it is defined (C++ only). +To use this option successfully, you must also mark all files that +use templates with either `\|\c +.B #pragma implementation\c +\&\|' (the definition) or +`\|\c +.B #pragma interface\c +\&\|' (declarations). + +When your code is compiled with `\|\c +.B \-fexternal\-templates\c +\&\|', all +template instantiations are external. You must arrange for all +necessary instantiations to appear in the implementation file; you can +do this with a \c +.B typedef\c +\& that references each instantiation needed. +Conversely, when you compile using the default option +`\|\c +.B \-fno\-external\-templates\c +\&\|', all template instantiations are +explicitly internal. +.TP +.B \-fall\-virtual +Treat all possible member functions as virtual, implicitly. All +member functions (except for constructor functions and +.B new +or +.B delete +member operators) are treated as virtual functions of the class where +they appear. +.Sp +This does not mean that all calls to these member functions will be +made through the internal table of virtual functions. Under some +circumstances, the compiler can determine that a call to a given +virtual function can be made directly; in these cases the calls are +direct in any case. +.TP +.B \-fcond\-mismatch +Allow conditional expressions with mismatched types in the second and +third arguments. The value of such an expression is void. +.TP +.B \-fthis\-is\-variable +Permit assignment to \c +.B this\c +\& (C++ only). The incorporation of +user-defined free store management into C++ has made assignment to +`\|\c +.B this\c +\&\|' an anachronism. Therefore, by default it is invalid to +assign to \c +.B this\c +\& within a class member function. However, for +backwards compatibility, you can make it valid with +`\|\c +.B \-fthis-is-variable\c +\&\|'. +.TP +.B \-funsigned\-char +Let the type \c +.B char\c +\& be unsigned, like \c +.B unsigned char\c +\&. +.Sp +Each kind of machine has a default for what \c +.B char\c +\& should +be. It is either like \c +.B unsigned char\c +\& by default or like +.B signed char\c +\& by default. +.Sp +Ideally, a portable program should always use \c +.B signed char\c +\& or +.B unsigned char\c +\& when it depends on the signedness of an object. +But many programs have been written to use plain \c +.B char\c +\& and +expect it to be signed, or expect it to be unsigned, depending on the +machines they were written for. This option, and its inverse, let you +make such a program work with the opposite default. +.Sp +The type \c +.B char\c +\& is always a distinct type from each of +.B signed char\c +\& and \c +.B unsigned char\c +\&, even though its behavior +is always just like one of those two. +.TP +.B \-fsigned\-char +Let the type \c +.B char\c +\& be signed, like \c +.B signed char\c +\&. +.Sp +Note that this is equivalent to `\|\c +.B \-fno\-unsigned\-char\c +\&\|', which is +the negative form of `\|\c +.B \-funsigned\-char\c +\&\|'. Likewise, +`\|\c +.B \-fno\-signed\-char\c +\&\|' is equivalent to `\|\c +.B \-funsigned\-char\c +\&\|'. +.TP +.B \-fsigned\-bitfields +.TP +.B \-funsigned\-bitfields +.TP +.B \-fno\-signed\-bitfields +.TP +.B \-fno\-unsigned\-bitfields +These options control whether a bitfield is +signed or unsigned, when declared with no explicit `\|\c +.B signed\c +\&\|' or `\|\c +.B unsigned\c +\&\|' qualifier. By default, such a bitfield is +signed, because this is consistent: the basic integer types such as +.B int\c +\& are signed types. +.Sp +However, when you specify `\|\c +.B \-traditional\c +\&\|', bitfields are all unsigned +no matter what. +.TP +.B \-fwritable\-strings +Store string constants in the writable data segment and don't uniquize +them. This is for compatibility with old programs which assume they +can write into string constants. `\|\c +.B \-traditional\c +\&\|' also has this +effect. +.Sp +Writing into string constants is a very bad idea; \*(lqconstants\*(rq should +be constant. +.SH PREPROCESSOR OPTIONS +These options control the C preprocessor, which is run on each C source +file before actual compilation. +.PP +If you use the `\|\c +.B \-E\c +\&\|' option, GCC does nothing except preprocessing. +Some of these options make sense only together with `\|\c +.B \-E\c +\&\|' because +they cause the preprocessor output to be unsuitable for actual +compilation. +.TP +.BI "\-include " "file" +Process \c +.I file\c +\& as input before processing the regular input file. +In effect, the contents of \c +.I file\c +\& are compiled first. Any `\|\c +.B \-D\c +\&\|' +and `\|\c +.B \-U\c +\&\|' options on the command line are always processed before +`\|\c +.B \-include \c +.I file\c +\&\c +\&\|', regardless of the order in which they are +written. All the `\|\c +.B \-include\c +\&\|' and `\|\c +.B \-imacros\c +\&\|' options are +processed in the order in which they are written. +.TP +.BI "\-imacros " file +Process \c +.I file\c +\& as input, discarding the resulting output, before +processing the regular input file. Because the output generated from +.I file\c +\& is discarded, the only effect of `\|\c +.B \-imacros \c +.I file\c +\&\c +\&\|' is to +make the macros defined in \c +.I file\c +\& available for use in the main +input. The preprocessor evaluates any `\|\c +.B \-D\c +\&\|' and `\|\c +.B \-U\c +\&\|' options +on the command line before processing `\|\c +.B \-imacros\c +.I file\c +\&\|', regardless of the order in +which they are written. All the `\|\c +.B \-include\c +\&\|' and `\|\c +.B \-imacros\c +\&\|' +options are processed in the order in which they are written. +.TP +.BI "\-idirafter " "dir" +Add the directory \c +.I dir\c +\& to the second include path. The directories +on the second include path are searched when a header file is not found +in any of the directories in the main include path (the one that +`\|\c +.B \-I\c +\&\|' adds to). +.TP +.BI "\-iprefix " "prefix" +Specify \c +.I prefix\c +\& as the prefix for subsequent `\|\c +.B \-iwithprefix\c +\&\|' +options. +.TP +.BI "\-iwithprefix " "dir" +Add a directory to the second include path. The directory's name is +made by concatenating \c +.I prefix\c +\& and \c +.I dir\c +\&, where \c +.I prefix +was specified previously with `\|\c +.B \-iprefix\c +\&\|'. +.TP +.B \-nostdinc +Do not search the standard system directories for header files. Only +the directories you have specified with `\|\c +.B \-I\c +\&\|' options (and the +current directory, if appropriate) are searched. +.Sp +By using both `\|\c +.B \-nostdinc\c +\&\|' and `\|\c +.B \-I\-\c +\&\|', you can limit the include-file search file to only those +directories you specify explicitly. +.TP +.B \-nostdinc++ +Do not search for header files in the C++\-specific standard directories, +but do still search the other standard directories. +(This option is used when building `\|\c +.B libg++\c +\&\|'.) +.TP +.B \-undef +Do not predefine any nonstandard macros. (Including architecture flags). +.TP +.B \-E +Run only the C preprocessor. Preprocess all the C source files +specified and output the results to standard output or to the +specified output file. +.TP +.B \-C +Tell the preprocessor not to discard comments. Used with the +`\|\c +.B \-E\c +\&\|' option. +.TP +.B \-P +Tell the preprocessor not to generate `\|\c +.B #line\c +\&\|' commands. +Used with the `\|\c +.B \-E\c +\&\|' option. +.TP +.B \-M\ [ \-MG ] +Tell the preprocessor to output a rule suitable for \c +.B make +describing the dependencies of each object file. For each source file, +the preprocessor outputs one \c +.B make\c +\&-rule whose target is the object +file name for that source file and whose dependencies are all the files +`\|\c +.B #include\c +\&\|'d in it. This rule may be a single line or may be +continued with `\|\c +.B \e\c +\&\|'-newline if it is long. The list of rules is +printed on standard output instead of the preprocessed C program. +.Sp +`\|\c +.B \-M\c +\&\|' implies `\|\c +.B \-E\c +\&\|'. +.Sp +`\|\c +.B \-MG\c +\&\|' says to treat missing header files as generated files and assume \c +they live in the same directory as the source file. It must be specified \c +in addition to `\|\c +.B \-M\c +\&\|'. +.TP +.B \-MM\ [ \-MG ] +Like `\|\c +.B \-M\c +\&\|' but the output mentions only the user header files +included with `\|\c +.B #include "\c +.I file\c +\&"\c +\&\|'. System header files +included with `\|\c +.B #include <\c +.I file\c +\&>\c +\&\|' are omitted. +.TP +.B \-MD +Like `\|\c +.B \-M\c +\&\|' but the dependency information is written to files with +names made by replacing `\|\c +.B .o\c +\&\|' with `\|\c +.B .d\c +\&\|' at the end of the +output file names. This is in addition to compiling the file as +specified\(em\&`\|\c +.B \-MD\c +\&\|' does not inhibit ordinary compilation the way +`\|\c +.B \-M\c +\&\|' does. +.Sp +The Mach utility `\|\c +.B md\c +\&\|' can be used to merge the `\|\c +.B .d\c +\&\|' files +into a single dependency file suitable for using with the `\|\c +.B make\c +\&\|' +command. +.TP +.B \-MMD +Like `\|\c +.B \-MD\c +\&\|' except mention only user header files, not system +header files. +.TP +.B \-H +Print the name of each header file used, in addition to other normal +activities. +.TP +.BI "\-A" "question" ( answer ) +Assert the answer +.I answer +for +.I question\c +\&, in case it is tested +with a preprocessor conditional such as `\|\c +.BI "#if #" question ( answer )\c +\&\|'. `\|\c +.B \-A\-\c +\&\|' disables the standard +assertions that normally describe the target machine. +.TP +.BI "\-A" "question"\c +\&(\c +.I answer\c +\&) +Assert the answer \c +.I answer\c +\& for \c +.I question\c +\&, in case it is tested +with a preprocessor conditional such as `\|\c +.B #if +#\c +.I question\c +\&(\c +.I answer\c +\&)\c +\&\|'. `\|\c +.B \-A-\c +\&\|' disables the standard +assertions that normally describe the target machine. +.TP +.BI \-D macro +Define macro \c +.I macro\c +\& with the string `\|\c +.B 1\c +\&\|' as its definition. +.TP +.BI \-D macro = defn +Define macro \c +.I macro\c +\& as \c +.I defn\c +\&. All instances of `\|\c +.B \-D\c +\&\|' on +the command line are processed before any `\|\c +.B \-U\c +\&\|' options. +.TP +.BI \-U macro +Undefine macro \c +.I macro\c +\&. `\|\c +.B \-U\c +\&\|' options are evaluated after all `\|\c +.B \-D\c +\&\|' options, but before any `\|\c +.B \-include\c +\&\|' and `\|\c +.B \-imacros\c +\&\|' options. +.TP +.B \-dM +Tell the preprocessor to output only a list of the macro definitions +that are in effect at the end of preprocessing. Used with the `\|\c +.B \-E\c +\&\|' +option. +.TP +.B \-dD +Tell the preprocessor to pass all macro definitions into the output, in +their proper sequence in the rest of the output. +.TP +.B \-dN +Like `\|\c +.B \-dD\c +\&\|' except that the macro arguments and contents are omitted. +Only `\|\c +.B #define \c +.I name\c +\&\c +\&\|' is included in the output. +.SH ASSEMBLER OPTION +.TP +.BI "\-Wa," "option" +Pass \c +.I option\c +\& as an option to the assembler. If \c +.I option +contains commas, it is split into multiple options at the commas. +.SH LINKER OPTIONS +These options come into play when the compiler links object files into +an executable output file. They are meaningless if the compiler is +not doing a link step. +.TP +.I object-file-name +A file name that does not end in a special recognized suffix is +considered to name an object file or library. (Object files are +distinguished from libraries by the linker according to the file +contents.) If GCC does a link step, these object files are used as input +to the linker. +.TP +.BI \-l library +Use the library named \c +.I library\c +\& when linking. +.Sp +The linker searches a standard list of directories for the library, +which is actually a file named `\|\c +.B lib\c +.I library\c +\&.a\c +\&\|'. The linker +then uses this file as if it had been specified precisely by name. +.Sp +The directories searched include several standard system directories +plus any that you specify with `\|\c +.B \-L\c +\&\|'. +.Sp +Normally the files found this way are library files\(em\&archive files +whose members are object files. The linker handles an archive file by +scanning through it for members which define symbols that have so far +been referenced but not defined. However, if the linker finds an +ordinary object file rather than a library, the object file is linked +in the usual fashion. The only difference between using an `\|\c +.B \-l\c +\&\|' option and specifying a file +name is that `\|\c +.B \-l\c +\&\|' surrounds +.I library +with `\|\c +.B lib\c +\&\|' and `\|\c +.B .a\c +\&\|' and searches several directories. +.TP +.B \-lobjc +You need this special case of the +.B \-l +option in order to link an Objective C program. +.TP +.B \-nostartfiles +Do not use the standard system startup files when linking. +The standard libraries are used normally. +.TP +.B \-nostdlib +Don't use the standard system libraries and startup files when linking. +Only the files you specify will be passed to the linker. +.TP +.B \-static +On systems that support dynamic linking, this prevents linking with the shared +libraries. On other systems, this option has no effect. +.TP +.B \-shared +Produce a shared object which can then be linked with other objects to +form an executable. Only a few systems support this option. +.TP +.B \-symbolic +Bind references to global symbols when building a shared object. Warn +about any unresolved references (unless overridden by the link editor +option `\|\c +.B +\-Xlinker \-z \-Xlinker defs\c +\&\|'). Only a few systems support +this option. +.TP +.BI "\-Xlinker " "option" +Pass \c +.I option +as an option to the linker. You can use this to +supply system-specific linker options which GNU CC does not know how to +recognize. +.Sp +If you want to pass an option that takes an argument, you must use +`\|\c +.B \-Xlinker\c +\&\|' twice, once for the option and once for the argument. +For example, to pass `\|\c +.B +\-assert definitions\c +\&\|', you must write +`\|\c +.B +\-Xlinker \-assert \-Xlinker definitions\c +\&\|'. It does not work to write +`\|\c +.B +\-Xlinker "\-assert definitions"\c +\&\|', because this passes the entire +string as a single argument, which is not what the linker expects. +.TP +.BI "\-Wl," "option" +Pass \c +.I option\c +\& as an option to the linker. If \c +.I option\c +\& contains +commas, it is split into multiple options at the commas. +.TP +.BI "\-u " "symbol" +Pretend the symbol +.I symbol +is undefined, to force linking of +library modules to define it. You can use `\|\c +.B \-u\c +\&\|' multiple times with +different symbols to force loading of additional library modules. +.SH DIRECTORY OPTIONS +These options specify directories to search for header files, for +libraries and for parts of the compiler: +.TP +.BI "\-I" "dir" +Append directory \c +.I dir\c +\& to the list of directories searched for include files. +.TP +.B \-I\- +Any directories you specify with `\|\c +.B \-I\c +\&\|' options before the `\|\c +.B \-I\-\c +\&\|' +option are searched only for the case of `\|\c +.B +#include "\c +.I file\c +.B +\&"\c +\&\|'; +they are not searched for `\|\c +.B #include <\c +.I file\c +\&>\c +\&\|'. +.Sp +If additional directories are specified with `\|\c +.B \-I\c +\&\|' options after +the `\|\c +.B \-I\-\c +\&\|', these directories are searched for all `\|\c +.B #include\c +\&\|' +directives. (Ordinarily \c +.I all\c +\& `\|\c +.B \-I\c +\&\|' directories are used +this way.) +.Sp +In addition, the `\|\c +.B \-I\-\c +\&\|' option inhibits the use of the current +directory (where the current input file came from) as the first search +directory for `\|\c +.B +#include "\c +.I file\c +.B +\&"\c +\&\|'. There is no way to +override this effect of `\|\c +.B \-I\-\c +\&\|'. With `\|\c +.B \-I.\c +\&\|' you can specify +searching the directory which was current when the compiler was +invoked. That is not exactly the same as what the preprocessor does +by default, but it is often satisfactory. +.Sp +`\|\c +.B \-I\-\c +\&\|' does not inhibit the use of the standard system directories +for header files. Thus, `\|\c +.B \-I\-\c +\&\|' and `\|\c +.B \-nostdinc\c +\&\|' are +independent. +.TP +.BI "\-L" "dir" +Add directory \c +.I dir\c +\& to the list of directories to be searched +for `\|\c +.B \-l\c +\&\|'. +.TP +.BI "\-B" "prefix" +This option specifies where to find the executables, libraries and +data files of the compiler itself. +.Sp +The compiler driver program runs one or more of the subprograms +`\|\c +.B cpp\c +\&\|', `\|\c +.B cc1\c +\&\|' (or, for C++, `\|\c +.B cc1plus\c +\&\|'), `\|\c +.B as\c +\&\|' and `\|\c +.B ld\c +\&\|'. It tries +.I prefix\c +\& as a prefix for each program it tries to run, both with and +without `\|\c +.I machine\c +.B /\c +.I version\c +.B /\c +\&\|'. +.Sp +For each subprogram to be run, the compiler driver first tries the +`\|\c +.B \-B\c +\&\|' prefix, if any. If that name is not found, or if `\|\c +.B \-B\c +\&\|' +was not specified, the driver tries two standard prefixes, which are +`\|\c +.B /usr/lib/gcc/\c +\&\|' and `\|\c +.B /usr/local/lib/gcc-lib/\c +\&\|'. If neither of +those results in a file name that is found, the compiler driver +searches for the unmodified program +name, using the directories specified in your +`\|\c +.B PATH\c +\&\|' environment variable. +.Sp +The run-time support file `\|\c +.B libgcc.a\c +\&\|' is also searched for using the +`\|\c +.B \-B\c +\&\|' prefix, if needed. If it is not found there, the two +standard prefixes above are tried, and that is all. The file is left +out of the link if it is not found by those means. Most of the time, +on most machines, `\|\c +.B libgcc.a\c +\&\|' is not actually necessary. +.Sp +You can get a similar result from the environment variable +.B GCC_EXEC_PREFIX\c +\&; if it is defined, its value is used as a prefix +in the same way. If both the `\|\c +.B \-B\c +\&\|' option and the +.B GCC_EXEC_PREFIX\c +\& variable are present, the `\|\c +.B \-B\c +\&\|' option is +used first and the environment variable value second. +.SH WARNING OPTIONS +Warnings are diagnostic messages that report constructions which +are not inherently erroneous but which are risky or suggest there +may have been an error. +.Sp +These options control the amount and kinds of warnings produced by GNU +CC: +.TP +.B \-fsyntax\-only +Check the code for syntax errors, but don't emit any output. +.TP +.B \-w +Inhibit all warning messages. +.TP +.B \-Wno\-import +Inhibit warning messages about the use of +.BR #import . +.TP +.B \-pedantic +Issue all the warnings demanded by strict ANSI standard C; reject +all programs that use forbidden extensions. +.Sp +Valid ANSI standard C programs should compile properly with or without +this option (though a rare few will require `\|\c +.B \-ansi\c +\&\|'). However, +without this option, certain GNU extensions and traditional C features +are supported as well. With this option, they are rejected. There is +no reason to \c +.I use\c +\& this option; it exists only to satisfy pedants. +.Sp +`\|\c +.B \-pedantic\c +\&\|' does not cause warning messages for use of the +alternate keywords whose names begin and end with `\|\c +.B _\|_\c +\&\|'. Pedantic +warnings are also disabled in the expression that follows +.B _\|_extension_\|_\c +\&. However, only system header files should use +these escape routes; application programs should avoid them. +.TP +.B \-pedantic\-errors +Like `\|\c +.B \-pedantic\c +\&\|', except that errors are produced rather than +warnings. +.TP +.B \-W +Print extra warning messages for these events: +.TP +\ \ \ \(bu +A nonvolatile automatic variable might be changed by a call to +.B longjmp\c +\&. These warnings are possible only in +optimizing compilation. +.Sp +The compiler sees only the calls to \c +.B setjmp\c +\&. It cannot know +where \c +.B longjmp\c +\& will be called; in fact, a signal handler could +call it at any point in the code. As a result, you may get a warning +even when there is in fact no problem because \c +.B longjmp\c +\& cannot +in fact be called at the place which would cause a problem. +.TP +\ \ \ \(bu +A function can return either with or without a value. (Falling +off the end of the function body is considered returning without +a value.) For example, this function would evoke such a +warning: +.Sp +.nf +foo (a) +{ + if (a > 0) + return a; +} +.Sp +.fi +Spurious warnings can occur because GNU CC does not realize that +certain functions (including \c +.B abort\c +\& and \c +.B longjmp\c +\&) +will never return. +.TP +\ \ \ \(bu +An expression-statement or the left-hand side of a comma expression +contains no side effects. +To suppress the warning, cast the unused expression to void. +For example, an expression such as `\|\c +.B x[i,j]\c +\&\|' will cause a warning, +but `\|\c +.B x[(void)i,j]\c +\&\|' will not. +.TP +\ \ \ \(bu +An unsigned value is compared against zero with `\|\c +.B >\c +\&\|' or `\|\c +.B <=\c +\&\|'. +.PP +.TP +.B \-Wimplicit-int +Warn whenever a declaration does not specify a type. +.TP +.B \-Wimplicit-function-declaration +Warn whenever a function is used before being declared. +.TP +.B \-Wimplicit +Same as -Wimplicit-int and -Wimplicit-function-declaration. +.TP +.B \-Wmain +Warn if the +.B main +function is declared or defined with a suspicious type. +Typically, it is a function with external linkage, returning +.B int\c +\&, and +taking zero or two arguments. + +.TP +.B \-Wreturn\-type +Warn whenever a function is defined with a return-type that defaults +to \c +.B int\c +\&. Also warn about any \c +.B return\c +\& statement with no +return-value in a function whose return-type is not \c +.B void\c +\&. +.TP +.B \-Wunused +Warn whenever a local variable is unused aside from its declaration, +whenever a function is declared static but never defined, and whenever +a statement computes a result that is explicitly not used. +.TP +.B \-Wswitch +Warn whenever a \c +.B switch\c +\& statement has an index of enumeral type +and lacks a \c +.B case\c +\& for one or more of the named codes of that +enumeration. (The presence of a \c +.B default\c +\& label prevents this +warning.) \c +.B case\c +\& labels outside the enumeration range also +provoke warnings when this option is used. +.TP +.B \-Wcomment +Warn whenever a comment-start sequence `\|\c +.B /\(**\c +\&\|' appears in a comment. +.TP +.B \-Wtrigraphs +Warn if any trigraphs are encountered (assuming they are enabled). +.TP +.B \-Wformat +Check calls to \c +.B printf\c +\& and \c +.B scanf\c +\&, etc., to make sure that +the arguments supplied have types appropriate to the format string +specified. +.TP +.B \-Wchar\-subscripts +Warn if an array subscript has type +.BR char . +This is a common cause of error, as programmers often forget that this +type is signed on some machines. +.TP +.B \-Wuninitialized +An automatic variable is used without first being initialized. +.Sp +These warnings are possible only in optimizing compilation, +because they require data flow information that is computed only +when optimizing. If you don't specify `\|\c +.B \-O\c +\&\|', you simply won't +get these warnings. +.Sp +These warnings occur only for variables that are candidates for +register allocation. Therefore, they do not occur for a variable that +is declared \c +.B volatile\c +\&, or whose address is taken, or whose size +is other than 1, 2, 4 or 8 bytes. Also, they do not occur for +structures, unions or arrays, even when they are in registers. +.Sp +Note that there may be no warning about a variable that is used only +to compute a value that itself is never used, because such +computations may be deleted by data flow analysis before the warnings +are printed. +.Sp +These warnings are made optional because GNU CC is not smart +enough to see all the reasons why the code might be correct +despite appearing to have an error. Here is one example of how +this can happen: +.Sp +.nf +{ + int x; + switch (y) + { + case 1: x = 1; + break; + case 2: x = 4; + break; + case 3: x = 5; + } + foo (x); +} +.Sp +.fi +If the value of \c +.B y\c +\& is always 1, 2 or 3, then \c +.B x\c +\& is +always initialized, but GNU CC doesn't know this. Here is +another common case: +.Sp +.nf +{ + int save_y; + if (change_y) save_y = y, y = new_y; + .\|.\|. + if (change_y) y = save_y; +} +.Sp +.fi +This has no bug because \c +.B save_y\c +\& is used only if it is set. +.Sp +Some spurious warnings can be avoided if you declare as +.B volatile\c +\& all the functions you use that never return. +.TP +.B \-Wparentheses +Warn if parentheses are omitted in certain contexts. +.TP +.B \-Wtemplate\-debugging +When using templates in a C++ program, warn if debugging is not yet +fully available (C++ only). +.TP +.B \-Wall +All of the above `\|\c +.B \-W\c +\&\|' options combined. These are all the +options which pertain to usage that we recommend avoiding and that we +believe is easy to avoid, even in conjunction with macros. +.PP +The remaining `\|\c +.B \-W.\|.\|.\c +\&\|' options are not implied by `\|\c +.B \-Wall\c +\&\|' +because they warn about constructions that we consider reasonable to +use, on occasion, in clean programs. +.TP +.B \-Wtraditional +Warn about certain constructs that behave differently in traditional and +ANSI C. +.TP +\ \ \ \(bu +Macro arguments occurring within string constants in the macro body. +These would substitute the argument in traditional C, but are part of +the constant in ANSI C. +.TP +\ \ \ \(bu +A function declared external in one block and then used after the end of +the block. +.TP +\ \ \ \(bu +A \c +.B switch\c +\& statement has an operand of type \c +.B long\c +\&. +.PP +.TP +.B \-Wshadow +Warn whenever a local variable shadows another local variable. +.TP +.BI "\-Wid\-clash\-" "len" +Warn whenever two distinct identifiers match in the first \c +.I len +characters. This may help you prepare a program that will compile +with certain obsolete, brain-damaged compilers. +.TP +.B \-Wpointer\-arith +Warn about anything that depends on the \*(lqsize of\*(rq a function type or +of \c +.B void\c +\&. GNU C assigns these types a size of 1, for +convenience in calculations with \c +.B void \(**\c +\& pointers and pointers +to functions. +.TP +.B \-Wcast\-qual +Warn whenever a pointer is cast so as to remove a type qualifier from +the target type. For example, warn if a \c +.B const char \(**\c +\& is cast +to an ordinary \c +.B char \(**\c +\&. +.TP +.B \-Wcast\-align +Warn whenever a pointer is cast such that the required alignment of the +target is increased. For example, warn if a \c +.B char \(**\c +\& is cast to +an \c +.B int \(**\c +\& on machines where integers can only be accessed at +two- or four-byte boundaries. +.TP +.B \-Wwrite\-strings +Give string constants the type \c +.B const char[\c +.I length\c +.B ]\c +\& so that +copying the address of one into a non-\c +.B const\c +\& \c +.B char \(** +pointer will get a warning. These warnings will help you find at +compile time code that can try to write into a string constant, but +only if you have been very careful about using \c +.B const\c +\& in +declarations and prototypes. Otherwise, it will just be a nuisance; +this is why we did not make `\|\c +.B \-Wall\c +\&\|' request these warnings. +.TP +.B \-Wconversion +Warn if a prototype causes a type conversion that is different from what +would happen to the same argument in the absence of a prototype. This +includes conversions of fixed point to floating and vice versa, and +conversions changing the width or signedness of a fixed point argument +except when the same as the default promotion. +.TP +.B \-Waggregate\-return +Warn if any functions that return structures or unions are defined or +called. (In languages where you can return an array, this also elicits +a warning.) +.TP +.B \-Wstrict\-prototypes +Warn if a function is declared or defined without specifying the +argument types. (An old-style function definition is permitted without +a warning if preceded by a declaration which specifies the argument +types.) +.TP +.B \-Wmissing\-prototypes +Warn if a global function is defined without a previous prototype +declaration. This warning is issued even if the definition itself +provides a prototype. The aim is to detect global functions that fail +to be declared in header files. +.TP +.B \-Wmissing\-declarations +Warn if a global function is defined without a previous declaration. +Do so even if the definition itself provides a prototype. +Use this option to detect global functions that are not declared in +header files. +.TP +.B \-Wredundant-decls +Warn if anything is declared more than once in the same scope, even in +cases where multiple declaration is valid and changes nothing. +.TP +.B \-Wnested-externs +Warn if an \c +.B extern\c +\& declaration is encountered within an function. +.TP +.B \-Wenum\-clash +Warn about conversion between different enumeration types (C++ only). +.TP +.B \-Wlong-long +Warn if +.B long long \c +type is used. This is default. To inhibit +the warning messages, use flag `\|\c +.B \-Wno\-long\-long\c +\&\|'. Flags `\|\c +.B \-W\-long\-long\c +\&\|' and `\|\c +.B \-Wno\-long\-long\c +\&\|' are taken into account only when flag `\|\c +.B \-pedantic\c +\&\|' is used. +.TP +.B \-Woverloaded\-virtual +(C++ only.) +In a derived class, the definitions of virtual functions must match +the type signature of a virtual function declared in the base class. +Use this option to request warnings when a derived class declares a +function that may be an erroneous attempt to define a virtual +function: that is, warn when a function with the same name as a +virtual function in the base class, but with a type signature that +doesn't match any virtual functions from the base class. +.TP +.B \-Winline +Warn if a function can not be inlined, and either it was declared as inline, +or else the +.B \-finline\-functions +option was given. +.TP +.B \-Werror +Treat warnings as errors; abort compilation after any warning. +.SH DEBUGGING OPTIONS +GNU CC has various special options that are used for debugging +either your program or GCC: +.TP +.B \-g +Produce debugging information in the operating system's native format +(stabs, COFF, XCOFF, or DWARF). GDB can work with this debugging +information. +.Sp +On most systems that use stabs format, `\|\c +.B \-g\c +\&\|' enables use of extra +debugging information that only GDB can use; this extra information +makes debugging work better in GDB but will probably make other debuggers +crash or +refuse to read the program. If you want to control for certain whether +to generate the extra information, use `\|\c +.B \-gstabs+\c +\&\|', `\|\c +.B \-gstabs\c +\&\|', +`\|\c +.B \-gxcoff+\c +\&\|', `\|\c +.B \-gxcoff\c +\&\|', `\|\c +.B \-gdwarf+\c +\&\|', or `\|\c +.B \-gdwarf\c +\&\|' +(see below). +.Sp +Unlike most other C compilers, GNU CC allows you to use `\|\c +.B \-g\c +\&\|' with +`\|\c +.B \-O\c +\&\|'. The shortcuts taken by optimized code may occasionally +produce surprising results: some variables you declared may not exist +at all; flow of control may briefly move where you did not expect it; +some statements may not be executed because they compute constant +results or their values were already at hand; some statements may +execute in different places because they were moved out of loops. +.Sp +Nevertheless it proves possible to debug optimized output. This makes +it reasonable to use the optimizer for programs that might have bugs. +.PP +The following options are useful when GNU CC is generated with the +capability for more than one debugging format. +.TP +.B \-ggdb +Produce debugging information in the native format (if that is supported), +including GDB extensions if at all possible. +.TP +.B \-gstabs +Produce debugging information in stabs format (if that is supported), +without GDB extensions. This is the format used by DBX on most BSD +systems. +.TP +.B \-gstabs+ +Produce debugging information in stabs format (if that is supported), +using GNU extensions understood only by the GNU debugger (GDB). The +use of these extensions is likely to make other debuggers crash or +refuse to read the program. +.TP +.B \-gcoff +Produce debugging information in COFF format (if that is supported). +This is the format used by SDB on most System V systems prior to +System V Release 4. +.TP +.B \-gxcoff +Produce debugging information in XCOFF format (if that is supported). +This is the format used by the DBX debugger on IBM RS/6000 systems. +.TP +.B \-gxcoff+ +Produce debugging information in XCOFF format (if that is supported), +using GNU extensions understood only by the GNU debugger (GDB). The +use of these extensions is likely to make other debuggers crash or +refuse to read the program. +.TP +.B \-gdwarf +Produce debugging information in DWARF format (if that is supported). +This is the format used by SDB on most System V Release 4 systems. +.TP +.B \-gdwarf+ +Produce debugging information in DWARF format (if that is supported), +using GNU extensions understood only by the GNU debugger (GDB). The +use of these extensions is likely to make other debuggers crash or +refuse to read the program. +.PP +.BI "\-g" "level" +.br +.BI "\-ggdb" "level" +.br +.BI "\-gstabs" "level" +.br +.BI "\-gcoff" "level" +.BI "\-gxcoff" "level" +.TP +.BI "\-gdwarf" "level" +Request debugging information and also use \c +.I level\c +\& to specify how +much information. The default level is 2. +.Sp +Level 1 produces minimal information, enough for making backtraces in +parts of the program that you don't plan to debug. This includes +descriptions of functions and external variables, but no information +about local variables and no line numbers. +.Sp +Level 3 includes extra information, such as all the macro definitions +present in the program. Some debuggers support macro expansion when +you use `\|\c +.B \-g3\c +\&\|'. +.TP +.B \-p +Generate extra code to write profile information suitable for the +analysis program \c +.B prof\c +\&. +.TP +.B \-pg +Generate extra code to write profile information suitable for the +analysis program \c +.B gprof\c +\&. +.TP +.B \-a +Generate extra code to write profile information for basic blocks, +which will record the number of times each basic block is executed. +This data could be analyzed by a program like \c +.B tcov\c +\&. Note, +however, that the format of the data is not what \c +.B tcov\c +\& expects. +Eventually GNU \c +.B gprof\c +\& should be extended to process this data. +.TP +.B \-ax +Generate extra code to read basic block profiling parameters from +file `bb.in' and write profiling results to file `bb.out'. +`bb.in' contains a list of functions. Whenever a function on the list +is entered, profiling is turned on. When the outmost function is left, +profiling is turned off. If a function name is prefixed with `-' +the function is excluded from profiling. If a function name is not +unique it can be disambiguated by writing +`/path/filename.d:functionname'. `bb.out' will list some available +filenames. +Four function names have a special meaning: +`__bb_jumps__' will cause jump frequencies to be written to `bb.out'. +`__bb_trace__' will cause the sequence of basic blocks to be piped +into `gzip' and written to file `bbtrace.gz'. +`__bb_hidecall__' will cause call instructions to be excluded from +the trace. +`__bb_showret__' will cause return instructions to be included in +the trace. +.TP +.BI "\-d" "letters" +Says to make debugging dumps during compilation at times specified by +.I letters\c +\&. This is used for debugging the compiler. The file names +for most of the dumps are made by appending a word to the source file +name (e.g. `\|\c +.B foo.c.rtl\c +\&\|' or `\|\c +.B foo.c.jump\c +\&\|'). +.TP +.B \-dM +Dump all macro definitions, at the end of preprocessing, and write no +output. +.TP +.B \-dN +Dump all macro names, at the end of preprocessing. +.TP +.B \-dD +Dump all macro definitions, at the end of preprocessing, in addition to +normal output. +.TP +.B \-dy +Dump debugging information during parsing, to standard error. +.TP +.B \-dr +Dump after RTL generation, to `\|\c +.I file\c +.B \&.rtl\c +\&\|'. +.TP +.B \-dx +Just generate RTL for a function instead of compiling it. Usually used +with `\|\c +.B r\c +\&\|'. +.TP +.B \-dj +Dump after first jump optimization, to `\|\c +.I file\c +.B \&.jump\c +\&\|'. +.TP +.B \-ds +Dump after CSE (including the jump optimization that sometimes +follows CSE), to `\|\c +.I file\c +.B \&.cse\c +\&\|'. +.TP +.B \-dL +Dump after loop optimization, to `\|\c +.I file\c +.B \&.loop\c +\&\|'. +.TP +.B \-dt +Dump after the second CSE pass (including the jump optimization that +sometimes follows CSE), to `\|\c +.I file\c +.B \&.cse2\c +\&\|'. +.TP +.B \-df +Dump after flow analysis, to `\|\c +.I file\c +.B \&.flow\c +\&\|'. +.TP +.B \-dc +Dump after instruction combination, to `\|\c +.I file\c +.B \&.combine\c +\&\|'. +.TP +.B \-dS +Dump after the first instruction scheduling pass, to +`\|\c +.I file\c +.B \&.sched\c +\&\|'. +.TP +.B \-dl +Dump after local register allocation, to `\|\c +.I file\c +.B \&.lreg\c +\&\|'. +.TP +.B \-dg +Dump after global register allocation, to `\|\c +.I file\c +.B \&.greg\c +\&\|'. +.TP +.B \-dR +Dump after the second instruction scheduling pass, to +`\|\c +.I file\c +.B \&.sched2\c +\&\|'. +.TP +.B \-dJ +Dump after last jump optimization, to `\|\c +.I file\c +.B \&.jump2\c +\&\|'. +.TP +.B \-dd +Dump after delayed branch scheduling, to `\|\c +.I file\c +.B \&.dbr\c +\&\|'. +.TP +.B \-dk +Dump after conversion from registers to stack, to `\|\c +.I file\c +.B \&.stack\c +\&\|'. +.TP +.B \-da +Produce all the dumps listed above. +.TP +.B \-dm +Print statistics on memory usage, at the end of the run, to +standard error. +.TP +.B \-dp +Annotate the assembler output with a comment indicating which +pattern and alternative was used. +.TP +.B \-fpretend\-float +When running a cross-compiler, pretend that the target machine uses the +same floating point format as the host machine. This causes incorrect +output of the actual floating constants, but the actual instruction +sequence will probably be the same as GNU CC would make when running on +the target machine. +.TP +.B \-save\-temps +Store the usual \*(lqtemporary\*(rq intermediate files permanently; place them +in the current directory and name them based on the source file. Thus, +compiling `\|\c +.B foo.c\c +\&\|' with `\|\c +.B \-c \-save\-temps\c +\&\|' would produce files +`\|\c +.B foo.cpp\c +\&\|' and `\|\c +.B foo.s\c +\&\|', as well as `\|\c +.B foo.o\c +\&\|'. +.TP +.BI "\-print\-file\-name=" "library" +Print the full absolute name of the library file \|\c +.nh +.I library +.hy +\&\| that +would be used when linking\(em\&and do not do anything else. With this +option, GNU CC does not compile or link anything; it just prints the +file name. +.TP +.B \-print\-libgcc\-file\-name +Same as `\|\c +.B \-print\-file\-name=libgcc.a\c +\&\|'. +.TP +.BI "\-print\-prog\-name=" "program" +Like `\|\c +.B \-print\-file\-name\c +\&\|', but searches for a program such as `\|\c +cpp\c +\&\|'. +.SH OPTIMIZATION OPTIONS +These options control various sorts of optimizations: +.TP +.B \-O +.TP +.B \-O1 +Optimize. Optimizing compilation takes somewhat more time, and a lot +more memory for a large function. +.Sp +Without `\|\c +.B \-O\c +\&\|', the compiler's goal is to reduce the cost of +compilation and to make debugging produce the expected results. +Statements are independent: if you stop the program with a breakpoint +between statements, you can then assign a new value to any variable or +change the program counter to any other statement in the function and +get exactly the results you would expect from the source code. +.Sp +Without `\|\c +.B \-O\c +\&\|', only variables declared \c +.B register\c +\& are +allocated in registers. The resulting compiled code is a little worse +than produced by PCC without `\|\c +.B \-O\c +\&\|'. +.Sp +With `\|\c +.B \-O\c +\&\|', the compiler tries to reduce code size and execution +time. +.Sp +When you specify `\|\c +.B \-O\c +\&\|', the two options `\|\c +.B \-fthread\-jumps\c +\&\|' and `\|\c +.B \-fdefer\-pop\c +\&\|' are turned on. On machines that have delay slots, the `\|\c +.B \-fdelayed\-branch\c +\&\|' option is turned on. For those machines that can support debugging even +without a frame pointer, the `\|\c +.B \-fomit\-frame\-pointer\c +\&\|' option is turned on. On some machines other flags may also be turned on. +.TP +.B \-O2 +Optimize even more. Nearly all supported optimizations that do not +involve a space-speed tradeoff are performed. Loop unrolling and function +inlining are not done, for example. As compared to +.B \-O\c +\&, +this option increases both compilation time and the performance of the +generated code. +.TP +.B \-O3 +Optimize yet more. This turns on everything +.B \-O2 +does, along with also turning on +.B \-finline\-functions. +.TP +.B \-O0 +Do not optimize. +.Sp +If you use multiple +.B \-O +options, with or without level numbers, the last such option is the +one that is effective. +.PP +Options of the form `\|\c +.B \-f\c +.I flag\c +\&\c +\&\|' specify machine-independent +flags. Most flags have both positive and negative forms; the negative +form of `\|\c +.B \-ffoo\c +\&\|' would be `\|\c +.B \-fno\-foo\c +\&\|'. The following list shows +only one form\(em\&the one which is not the default. +You can figure out the other form by either removing `\|\c +.B no\-\c +\&\|' or +adding it. +.TP +.B \-ffloat\-store +Do not store floating point variables in registers. This +prevents undesirable excess precision on machines such as the +68000 where the floating registers (of the 68881) keep more +precision than a \c +.B double\c +\& is supposed to have. +.Sp +For most programs, the excess precision does only good, but a few +programs rely on the precise definition of IEEE floating point. +Use `\|\c +.B \-ffloat\-store\c +\&\|' for such programs. +.TP +.B \-fmemoize\-lookups +.TP +.B \-fsave\-memoized +Use heuristics to compile faster (C++ only). These heuristics are not +enabled by default, since they are only effective for certain input +files. Other input files compile more slowly. +.Sp +The first time the compiler must build a call to a member function (or +reference to a data member), it must (1) determine whether the class +implements member functions of that name; (2) resolve which member +function to call (which involves figuring out what sorts of type +conversions need to be made); and (3) check the visibility of the member +function to the caller. All of this adds up to slower compilation. +Normally, the second time a call is made to that member function (or +reference to that data member), it must go through the same lengthy +process again. This means that code like this +.Sp +\& cout << "This " << p << " has " << n << " legs.\en"; +.Sp +makes six passes through all three steps. By using a software cache, +a \*(lqhit\*(rq significantly reduces this cost. Unfortunately, using the +cache introduces another layer of mechanisms which must be implemented, +and so incurs its own overhead. `\|\c +.B \-fmemoize\-lookups\c +\&\|' enables +the software cache. +.Sp +Because access privileges (visibility) to members and member functions +may differ from one function context to the next, +.B g++ +may need to flush the cache. With the `\|\c +.B \-fmemoize\-lookups\c +\&\|' flag, the cache is flushed after every +function that is compiled. The `\|\c +\-fsave\-memoized\c +\&\|' flag enables the same software cache, but when the compiler +determines that the context of the last function compiled would yield +the same access privileges of the next function to compile, it +preserves the cache. +This is most helpful when defining many member functions for the same +class: with the exception of member functions which are friends of +other classes, each member function has exactly the same access +privileges as every other, and the cache need not be flushed. +.TP +.B \-fno\-default\-inline +Don't make member functions inline by default merely because they are +defined inside the class scope (C++ only). +.TP +.B \-fno\-defer\-pop +Always pop the arguments to each function call as soon as that +function returns. For machines which must pop arguments after a +function call, the compiler normally lets arguments accumulate on the +stack for several function calls and pops them all at once. +.TP +.B \-fforce\-mem +Force memory operands to be copied into registers before doing +arithmetic on them. This may produce better code by making all +memory references potential common subexpressions. When they are +not common subexpressions, instruction combination should +eliminate the separate register-load. I am interested in hearing +about the difference this makes. +.TP +.B \-fforce\-addr +Force memory address constants to be copied into registers before +doing arithmetic on them. This may produce better code just as +`\|\c +.B \-fforce\-mem\c +\&\|' may. I am interested in hearing about the +difference this makes. +.TP +.B \-fomit\-frame\-pointer +Don't keep the frame pointer in a register for functions that +don't need one. This avoids the instructions to save, set up and +restore frame pointers; it also makes an extra register available +in many functions. \c +.I It also makes debugging impossible on most machines\c +\&. +.Sp +On some machines, such as the Vax, this flag has no effect, because +the standard calling sequence automatically handles the frame pointer +and nothing is saved by pretending it doesn't exist. The +machine-description macro \c +.B FRAME_POINTER_REQUIRED\c +\& controls +whether a target machine supports this flag. +.TP +.B \-finline\-functions +Integrate all simple functions into their callers. The compiler +heuristically decides which functions are simple enough to be worth +integrating in this way. +.Sp +If all calls to a given function are integrated, and the function is +declared \c +.B static\c +\&, then GCC normally does not output the function as +assembler code in its own right. +.TP +.B \-fcaller\-saves +Enable values to be allocated in registers that will be clobbered by +function calls, by emitting extra instructions to save and restore the +registers around such calls. Such allocation is done only when it +seems to result in better code than would otherwise be produced. +.Sp +This option is enabled by default on certain machines, usually those +which have no call-preserved registers to use instead. +.TP +.B \-fkeep\-inline\-functions +Even if all calls to a given function are integrated, and the function +is declared \c +.B static\c +\&, nevertheless output a separate run-time +callable version of the function. +.TP +.B \-fno\-function\-cse +Do not put function addresses in registers; make each instruction that +calls a constant function contain the function's address explicitly. +.Sp +This option results in less efficient code, but some strange hacks +that alter the assembler output may be confused by the optimizations +performed when this option is not used. +.TP +.B \-fno\-peephole +Disable any machine-specific peephole optimizations. +.TP +.B \-ffast-math +This option allows GCC to violate some ANSI or IEEE rules/specifications +in the interest of optimizing code for speed. For example, it allows +the compiler to assume arguments to the \c +.B sqrt\c +\& function are +non-negative numbers. +.Sp +This option should never be turned on by any `\|\c +.B \-O\c +\&\|' option since +it can result in incorrect output for programs which depend on +an exact implementation of IEEE or ANSI rules/specifications for +math functions. +.PP +The following options control specific optimizations. The `\|\c +.B \-O2\c +\&\|' +option turns on all of these optimizations except `\|\c +.B \-funroll\-loops\c +\&\|' +and `\|\c +.B \-funroll\-all\-loops\c +\&\|'. +.PP +The `\|\c +.B \-O\c +\&\|' option usually turns on +the `\|\c +.B \-fthread\-jumps\c +\&\|' and `\|\c +.B \-fdelayed\-branch\c +\&\|' options, but +specific machines may change the default optimizations. +.PP +You can use the following flags in the rare cases when \*(lqfine-tuning\*(rq +of optimizations to be performed is desired. +.TP +.B \-fstrength\-reduce +Perform the optimizations of loop strength reduction and +elimination of iteration variables. +.TP +.B \-fthread\-jumps +Perform optimizations where we check to see if a jump branches to a +location where another comparison subsumed by the first is found. If +so, the first branch is redirected to either the destination of the +second branch or a point immediately following it, depending on whether +the condition is known to be true or false. +.TP +.B \-funroll\-loops +Perform the optimization of loop unrolling. This is only done for loops +whose number of iterations can be determined at compile time or run time. +.TP +.B \-funroll\-all\-loops +Perform the optimization of loop unrolling. This is done for all loops. +This usually makes programs run more slowly. +.TP +.B \-fcse\-follow\-jumps +In common subexpression elimination, scan through jump instructions +when the target of the jump is not reached by any other path. For +example, when CSE encounters an \c +.B if\c +\& statement with an +.B else\c +\& clause, CSE will follow the jump when the condition +tested is false. +.TP +.B \-fcse\-skip\-blocks +This is similar to `\|\c +.B \-fcse\-follow\-jumps\c +\&\|', but causes CSE to +follow jumps which conditionally skip over blocks. When CSE +encounters a simple \c +.B if\c +\& statement with no else clause, +`\|\c +.B \-fcse\-skip\-blocks\c +\&\|' causes CSE to follow the jump around the +body of the \c +.B if\c +\&. +.TP +.B \-frerun\-cse\-after\-loop +Re-run common subexpression elimination after loop optimizations has been +performed. +.TP +.B \-felide\-constructors +Elide constructors when this seems plausible (C++ only). With this +flag, GNU C++ initializes \c +.B y\c +\& directly from the call to \c +.B foo +without going through a temporary in the following code: +.Sp +A foo (); +A y = foo (); +.Sp +Without this option, GNU C++ first initializes \c +.B y\c +\& by calling the +appropriate constructor for type \c +.B A\c +\&; then assigns the result of +.B foo\c +\& to a temporary; and, finally, replaces the initial value of +`\|\c +.B y\c +\&\|' with the temporary. +.Sp +The default behavior (`\|\c +.B \-fno\-elide\-constructors\c +\&\|') is specified by +the draft ANSI C++ standard. If your program's constructors have side +effects, using `\|\c +.B \-felide-constructors\c +\&\|' can make your program act +differently, since some constructor calls may be omitted. +.TP +.B \-fexpensive\-optimizations +Perform a number of minor optimizations that are relatively expensive. +.TP +.B \-fdelayed\-branch +If supported for the target machine, attempt to reorder instructions +to exploit instruction slots available after delayed branch +instructions. +.TP +.B \-fschedule\-insns +If supported for the target machine, attempt to reorder instructions to +eliminate execution stalls due to required data being unavailable. This +helps machines that have slow floating point or memory load instructions +by allowing other instructions to be issued until the result of the load +or floating point instruction is required. +.TP +.B \-fschedule\-insns2 +Similar to `\|\c +.B \-fschedule\-insns\c +\&\|', but requests an additional pass of +instruction scheduling after register allocation has been done. This is +especially useful on machines with a relatively small number of +registers and where memory load instructions take more than one cycle. +.SH TARGET OPTIONS +By default, GNU CC compiles code for the same type of machine that you +are using. However, it can also be installed as a cross-compiler, to +compile for some other type of machine. In fact, several different +configurations of GNU CC, for different target machines, can be +installed side by side. Then you specify which one to use with the +`\|\c +.B \-b\c +\&\|' option. +.PP +In addition, older and newer versions of GNU CC can be installed side +by side. One of them (probably the newest) will be the default, but +you may sometimes wish to use another. +.TP +.BI "\-b " "machine" +The argument \c +.I machine\c +\& specifies the target machine for compilation. +This is useful when you have installed GNU CC as a cross-compiler. +.Sp +The value to use for \c +.I machine\c +\& is the same as was specified as the +machine type when configuring GNU CC as a cross-compiler. For +example, if a cross-compiler was configured with `\|\c +.B configure +i386v\c +\&\|', meaning to compile for an 80386 running System V, then you +would specify `\|\c +.B \-b i386v\c +\&\|' to run that cross compiler. +.Sp +When you do not specify `\|\c +.B \-b\c +\&\|', it normally means to compile for +the same type of machine that you are using. +.TP +.BI "\-V " "version" +The argument \c +.I version\c +\& specifies which version of GNU CC to run. +This is useful when multiple versions are installed. For example, +.I version\c +\& might be `\|\c +.B 2.0\c +\&\|', meaning to run GNU CC version 2.0. +.Sp +The default version, when you do not specify `\|\c +.B \-V\c +\&\|', is controlled +by the way GNU CC is installed. Normally, it will be a version that +is recommended for general use. +.SH MACHINE DEPENDENT OPTIONS +Each of the target machine types can have its own special options, +starting with `\|\c +.B \-m\c +\&\|', to choose among various hardware models or +configurations\(em\&for example, 68010 vs 68020, floating coprocessor or +none. A single installed version of the compiler can compile for any +model or configuration, according to the options specified. +.PP +Some configurations of the compiler also support additional special +options, usually for command-line compatibility with other compilers on +the same platform. +.PP +These are the `\|\c +.B \-m\c +\&\|' options defined for the 68000 series: +.TP +.B \-m68000 +.TP +.B \-mc68000 +Generate output for a 68000. This is the default when the compiler is +configured for 68000-based systems. +.TP +.B \-m68020 +.TP +.B \-mc68020 +Generate output for a 68020 (rather than a 68000). This is the +default when the compiler is configured for 68020-based systems. +.TP +.B \-m68881 +Generate output containing 68881 instructions for floating point. +This is the default for most 68020-based systems unless +.B \-nfp +was specified when the compiler was configured. +.TP +.B \-m68030 +Generate output for a 68030. This is the default when the compiler is +configured for 68030-based systems. +.TP +.B \-m68040 +Generate output for a 68040. This is the default when the compiler is +configured for 68040-based systems. +.TP +.B \-m68020\-40 +Generate output for a 68040, without using any of the new instructions. +This results in code which can run relatively efficiently on either a +68020/68881 or a 68030 or a 68040. +.TP +.B \-mfpa +Generate output containing Sun FPA instructions for floating point. +.TP +.B \-msoft\-float +Generate output containing library calls for floating point. +.I +WARNING: +the requisite libraries are not part of GNU CC. Normally the +facilities of the machine's usual C compiler are used, but this can't +be done directly in cross-compilation. You must make your own +arrangements to provide suitable library functions for cross-compilation. +.TP +.B \-mshort +Consider type \c +.B int\c +\& to be 16 bits wide, like \c +.B short int\c +\&. +.TP +.B \-mnobitfield +Do not use the bit-field instructions. `\|\c +.B \-m68000\c +\&\|' implies +`\|\c +.B \-mnobitfield\c +\&\|'. +.TP +.B \-mbitfield +Do use the bit-field instructions. `\|\c +.B \-m68020\c +\&\|' implies +`\|\c +.B \-mbitfield\c +\&\|'. This is the default if you use the unmodified +sources. +.TP +.B \-mrtd +Use a different function-calling convention, in which functions +that take a fixed number of arguments return with the \c +.B rtd +instruction, which pops their arguments while returning. This +saves one instruction in the caller since there is no need to pop +the arguments there. +.Sp +This calling convention is incompatible with the one normally +used on Unix, so you cannot use it if you need to call libraries +compiled with the Unix compiler. +.Sp +Also, you must provide function prototypes for all functions that +take variable numbers of arguments (including \c +.B printf\c +\&); +otherwise incorrect code will be generated for calls to those +functions. +.Sp +In addition, seriously incorrect code will result if you call a +function with too many arguments. (Normally, extra arguments are +harmlessly ignored.) +.Sp +The \c +.B rtd\c +\& instruction is supported by the 68010 and 68020 +processors, but not by the 68000. +.PP +These `\|\c +.B \-m\c +\&\|' options are defined for the Vax: +.TP +.B \-munix +Do not output certain jump instructions (\c +.B aobleq\c +\& and so on) +that the Unix assembler for the Vax cannot handle across long +ranges. +.TP +.B \-mgnu +Do output those jump instructions, on the assumption that you +will assemble with the GNU assembler. +.TP +.B \-mg +Output code for g-format floating point numbers instead of d-format. +.PP +These `\|\c +.B \-m\c +\&\|' switches are supported on the SPARC: +.PP +.B \-mfpu +.TP +.B \-mhard\-float +Generate output containing floating point instructions. This is the +default. +.PP +.B \-mno\-fpu +.TP +.B \-msoft\-float +Generate output containing library calls for floating point. +.I Warning: +there is no GNU floating-point library for SPARC. +Normally the facilities of the machine's usual C compiler are used, but +this cannot be done directly in cross-compilation. You must make your +own arrangements to provide suitable library functions for +cross-compilation. +.Sp +.B \-msoft\-float +changes the calling convention in the output file; +therefore, it is only useful if you compile +.I all +of a program with this option. +.PP +.B \-mno\-epilogue +.TP +.B \-mepilogue +With +.B \-mepilogue +(the default), the compiler always emits code for +function exit at the end of each function. Any function exit in +the middle of the function (such as a return statement in C) will +generate a jump to the exit code at the end of the function. +.Sp +With +.BR \-mno\-epilogue , +the compiler tries to emit exit code inline at every function exit. +.PP +.B \-mno\-v8 +.TP +.B \-mv8 +.TP +.B \-msparclite +These three options select variations on the SPARC architecture. +.Sp +By default (unless specifically configured for the Fujitsu SPARClite), +GCC generates code for the v7 variant of the SPARC architecture. +.Sp +.B \-mv8 +will give you SPARC v8 code. The only difference from v7 +code is that the compiler emits the integer multiply and integer +divide instructions which exist in SPARC v8 but not in SPARC v7. +.Sp +.B \-msparclite +will give you SPARClite code. This adds the integer +multiply, integer divide step and scan (ffs) instructions which +exist in SPARClite but not in SPARC v7. +.PP +.B \-mcypress +.TP +.B \-msupersparc +These two options select the processor for which the code is optimised. +.Sp +With +.B \-mcypress +(the default), the compiler optimises code for the Cypress CY7C602 chip, as +used in the SparcStation/SparcServer 3xx series. This is also appropriate for +the older SparcStation 1, 2, IPX etc. +.Sp +With +.B \-msupersparc +the compiler optimises code for the SuperSparc cpu, as used in the SparcStation +10, 1000 and 2000 series. This flag also enables use of the full SPARC v8 +instruction set. +.PP +These `\|\c +.B \-m\c +\&\|' options are defined for the Convex: +.TP +.B \-mc1 +Generate output for a C1. This is the default when the compiler is +configured for a C1. +.TP +.B \-mc2 +Generate output for a C2. This is the default when the compiler is +configured for a C2. +.TP +.B \-margcount +Generate code which puts an argument count in the word preceding each +argument list. Some nonportable Convex and Vax programs need this word. +(Debuggers don't, except for functions with variable-length argument +lists; this info is in the symbol table.) +.TP +.B \-mnoargcount +Omit the argument count word. This is the default if you use the +unmodified sources. +.PP +These `\|\c +.B \-m\c +\&\|' options are defined for the AMD Am29000: +.TP +.B \-mdw +Generate code that assumes the DW bit is set, i.e., that byte and +halfword operations are directly supported by the hardware. This is the +default. +.TP +.B \-mnodw +Generate code that assumes the DW bit is not set. +.TP +.B \-mbw +Generate code that assumes the system supports byte and halfword write +operations. This is the default. +.TP +.B \-mnbw +Generate code that assumes the systems does not support byte and +halfword write operations. This implies `\|\c +.B \-mnodw\c +\&\|'. +.TP +.B \-msmall +Use a small memory model that assumes that all function addresses are +either within a single 256 KB segment or at an absolute address of less +than 256K. This allows the \c +.B call\c +\& instruction to be used instead +of a \c +.B const\c +\&, \c +.B consth\c +\&, \c +.B calli\c +\& sequence. +.TP +.B \-mlarge +Do not assume that the \c +.B call\c +\& instruction can be used; this is the +default. +.TP +.B \-m29050 +Generate code for the Am29050. +.TP +.B \-m29000 +Generate code for the Am29000. This is the default. +.TP +.B \-mkernel\-registers +Generate references to registers \c +.B gr64-gr95\c +\& instead of +.B gr96-gr127\c +\&. This option can be used when compiling kernel code +that wants a set of global registers disjoint from that used by +user-mode code. +.Sp +Note that when this option is used, register names in `\|\c +.B \-f\c +\&\|' flags +must use the normal, user-mode, names. +.TP +.B \-muser\-registers +Use the normal set of global registers, \c +.B gr96-gr127\c +\&. This is the +default. +.TP +.B \-mstack\-check +Insert a call to \c +.B _\|_msp_check\c +\& after each stack adjustment. This +is often used for kernel code. +.PP +These `\|\c +.B \-m\c +\&\|' options are defined for Motorola 88K architectures: +.TP +.B \-m88000 +Generate code that works well on both the m88100 and the +m88110. +.TP +.B \-m88100 +Generate code that works best for the m88100, but that also +runs on the m88110. +.TP +.B \-m88110 +Generate code that works best for the m88110, and may not run +on the m88100. +.TP +.B \-midentify\-revision +Include an \c +.B ident\c +\& directive in the assembler output recording the +source file name, compiler name and version, timestamp, and compilation +flags used. +.TP +.B \-mno\-underscores +In assembler output, emit symbol names without adding an underscore +character at the beginning of each name. The default is to use an +underscore as prefix on each name. +.TP +.B \-mno\-check\-zero\-division +.TP +.B \-mcheck\-zero\-division +Early models of the 88K architecture had problems with division by zero; +in particular, many of them didn't trap. Use these options to avoid +including (or to include explicitly) additional code to detect division +by zero and signal an exception. All GCC configurations for the 88K use +`\|\c +.B \-mcheck\-zero\-division\c +\&\|' by default. +.TP +.B \-mocs\-debug\-info +.TP +.B \-mno\-ocs\-debug\-info +Include (or omit) additional debugging information (about +registers used in each stack frame) as specified in the 88Open Object +Compatibility Standard, \*(lqOCS\*(rq. This extra information is not needed +by GDB. The default for DG/UX, SVr4, and Delta 88 SVr3.2 is to +include this information; other 88k configurations omit this information +by default. +.TP +.B \-mocs\-frame\-position +.TP +.B \-mno\-ocs\-frame\-position +Force (or do not require) register values to be stored in a particular +place in stack frames, as specified in OCS. The DG/UX, Delta88 SVr3.2, +and BCS configurations use `\|\c +.B \-mocs\-frame\-position\c +\&\|'; other 88k +configurations have the default `\|\c +.B \-mno\-ocs\-frame\-position\c +\&\|'. +.TP +.B \-moptimize\-arg\-area +.TP +.B \-mno\-optimize\-arg\-area +Control how to store function arguments in stack frames. +`\|\c +.B \-moptimize\-arg\-area\c +\&\|' saves space, but may break some +debuggers (not GDB). `\|\c +.B \-mno\-optimize\-arg\-area\c +\&\|' conforms better to +standards. By default GCC does not optimize the argument area. +.TP +.BI "\-mshort\-data\-" "num" +.I num +Generate smaller data references by making them relative to \c +.B r0\c +\&, +which allows loading a value using a single instruction (rather than the +usual two). You control which data references are affected by +specifying \c +.I num\c +\& with this option. For example, if you specify +`\|\c +.B \-mshort\-data\-512\c +\&\|', then the data references affected are those +involving displacements of less than 512 bytes. +`\|\c +.B \-mshort\-data\-\c +.I num\c +\&\c +\&\|' is not effective for \c +.I num\c +\& greater +than 64K. +.PP +.B \-mserialize-volatile +.TP +.B \-mno-serialize-volatile +Do, or do not, generate code to guarantee sequential consistency of +volatile memory references. +.Sp +GNU CC always guarantees consistency by default, for the preferred +processor submodel. How this is done depends on the submodel. +.Sp +The m88100 processor does not reorder memory references and so always +provides sequential consistency. If you use `\|\c +.B \-m88100\c +\&\|', GNU CC does +not generate any special instructions for sequential consistency. +.Sp +The order of memory references made by the m88110 processor does not +always match the order of the instructions requesting those references. +In particular, a load instruction may execute before a preceding store +instruction. Such reordering violates sequential consistency of +volatile memory references, when there are multiple processors. When +you use `\|\c +.B \-m88000\c +\&\|' or `\|\c +.B \-m88110\c +\&\|', GNU CC generates special +instructions when appropriate, to force execution in the proper order. +.Sp +The extra code generated to guarantee consistency may affect the +performance of your application. If you know that you can safely forgo +this guarantee, you may use the option `\|\c +.B \-mno-serialize-volatile\c +\&\|'. +.Sp +If you use the `\|\c +.B \-m88100\c +\&\|' option but require sequential consistency +when running on the m88110 processor, you should use +`\|\c +.B \-mserialize-volatile\c +\&\|'. +.PP +.B \-msvr4 +.TP +.B \-msvr3 +Turn on (`\|\c +.B \-msvr4\c +\&\|') or off (`\|\c +.B \-msvr3\c +\&\|') compiler extensions +related to System V release 4 (SVr4). This controls the following: +.TP +\ \ \ \(bu +Which variant of the assembler syntax to emit (which you can select +independently using `\|\c +.B \-mversion\-03.00\c +\&\|'). +.TP +\ \ \ \(bu +`\|\c +.B \-msvr4\c +\&\|' makes the C preprocessor recognize `\|\c +.B #pragma weak\c +\&\|' +.TP +\ \ \ \(bu +`\|\c +.B \-msvr4\c +\&\|' makes GCC issue additional declaration directives used in +SVr4. +.PP +`\|\c +.B \-msvr3\c +\&\|' is the default for all m88K configurations except +the SVr4 configuration. +.TP +.B \-mtrap\-large\-shift +.TP +.B \-mhandle\-large\-shift +Include code to detect bit-shifts of more than 31 bits; respectively, +trap such shifts or emit code to handle them properly. By default GCC +makes no special provision for large bit shifts. +.TP +.B \-muse\-div\-instruction +Very early models of the 88K architecture didn't have a divide +instruction, so GCC avoids that instruction by default. Use this option +to specify that it's safe to use the divide instruction. +.TP +.B \-mversion\-03.00 +In the DG/UX configuration, there are two flavors of SVr4. This option +modifies +.B \-msvr4 +to select whether the hybrid-COFF or real-ELF +flavor is used. All other configurations ignore this option. +.TP +.B \-mwarn\-passed\-structs +Warn when a function passes a struct as an argument or result. +Structure-passing conventions have changed during the evolution of the C +language, and are often the source of portability problems. By default, +GCC issues no such warning. +.PP +These options are defined for the IBM RS6000: +.PP +.B \-mfp\-in\-toc +.TP +.B \-mno\-fp\-in\-toc +Control whether or not floating-point constants go in the Table of +Contents (TOC), a table of all global variable and function addresses. By +default GCC puts floating-point constants there; if the TOC overflows, +`\|\c +.B \-mno\-fp\-in\-toc\c +\&\|' will reduce the size of the TOC, which may avoid +the overflow. +.PP +These `\|\c +.B \-m\c +\&\|' options are defined for the IBM RT PC: +.TP +.B \-min\-line\-mul +Use an in-line code sequence for integer multiplies. This is the +default. +.TP +.B \-mcall\-lib\-mul +Call \c +.B lmul$$\c +\& for integer multiples. +.TP +.B \-mfull\-fp\-blocks +Generate full-size floating point data blocks, including the minimum +amount of scratch space recommended by IBM. This is the default. +.TP +.B \-mminimum\-fp\-blocks +Do not include extra scratch space in floating point data blocks. This +results in smaller code, but slower execution, since scratch space must +be allocated dynamically. +.TP +.B \-mfp\-arg\-in\-fpregs +Use a calling sequence incompatible with the IBM calling convention in +which floating point arguments are passed in floating point registers. +Note that \c +.B varargs.h\c +\& and \c +.B stdargs.h\c +\& will not work with +floating point operands if this option is specified. +.TP +.B \-mfp\-arg\-in\-gregs +Use the normal calling convention for floating point arguments. This is +the default. +.TP +.B \-mhc\-struct\-return +Return structures of more than one word in memory, rather than in a +register. This provides compatibility with the MetaWare HighC (hc) +compiler. Use `\|\c +.B \-fpcc\-struct\-return\c +\&\|' for compatibility with the +Portable C Compiler (pcc). +.TP +.B \-mnohc\-struct\-return +Return some structures of more than one word in registers, when +convenient. This is the default. For compatibility with the +IBM-supplied compilers, use either `\|\c +.B \-fpcc\-struct\-return\c +\&\|' or +`\|\c +.B \-mhc\-struct\-return\c +\&\|'. +.PP +These `\|\c +.B \-m\c +\&\|' options are defined for the MIPS family of computers: +.TP +.BI "\-mcpu=" "cpu-type" +Assume the defaults for the machine type +.I cpu-type +when +scheduling instructions. The default +.I cpu-type +is +.BR default , +which picks the longest cycles times for any of the machines, in order +that the code run at reasonable rates on all MIPS cpu's. Other +choices for +.I cpu-type +are +.BR r2000 , +.BR r3000 , +.BR r4000 , +and +.BR r6000 . +While picking a specific +.I cpu-type +will schedule things appropriately for that particular chip, the +compiler will not generate any code that does not meet level 1 of the +MIPS ISA (instruction set architecture) without the +.B \-mips2 +or +.B \-mips3 +switches being used. +.TP +.B \-mips2 +Issue instructions from level 2 of the MIPS ISA (branch likely, square +root instructions). The +.B \-mcpu=r4000 +or +.B \-mcpu=r6000 +switch must be used in conjunction with +.BR \-mips2 . +.TP +.B \-mips3 +Issue instructions from level 3 of the MIPS ISA (64 bit instructions). +The +.B \-mcpu=r4000 +switch must be used in conjunction with +.BR \-mips2 . +.TP +.B \-mint64 +.TP +.B \-mlong64 +.TP +.B \-mlonglong128 +These options don't work at present. +.TP +.B \-mmips\-as +Generate code for the MIPS assembler, and invoke +.B mips\-tfile +to add normal debug information. This is the default for all +platforms except for the OSF/1 reference platform, using the OSF/rose +object format. If any of the +.BR \-ggdb , +.BR \-gstabs , +or +.B \-gstabs+ +switches are used, the +.B mips\-tfile +program will encapsulate the stabs within MIPS ECOFF. +.TP +.B \-mgas +Generate code for the GNU assembler. This is the default on the OSF/1 +reference platform, using the OSF/rose object format. +.TP +.B \-mrnames +.TP +.B \-mno\-rnames +The +.B \-mrnames +switch says to output code using the MIPS software names for the +registers, instead of the hardware names (ie, +.B a0 +instead of +.BR $4 ). +The GNU assembler does not support the +.B \-mrnames +switch, and the MIPS assembler will be instructed to run the MIPS C +preprocessor over the source file. The +.B \-mno\-rnames +switch is default. +.TP +.B \-mgpopt +.TP +.B \-mno\-gpopt +The +.B \-mgpopt +switch says to write all of the data declarations before the +instructions in the text section, to all the MIPS assembler to +generate one word memory references instead of using two words for +short global or static data items. This is on by default if +optimization is selected. +.TP +.B \-mstats +.TP +.B \-mno\-stats +For each non-inline function processed, the +.B \-mstats +switch causes the compiler to emit one line to the standard error file +to print statistics about the program (number of registers saved, +stack size, etc.). +.TP +.B \-mmemcpy +.TP +.B \-mno\-memcpy +The +.B \-mmemcpy +switch makes all block moves call the appropriate string function +.RB ( memcpy +or +.BR bcopy ) +instead of possibly generating inline code. +.TP +.B \-mmips\-tfile +.TP +.B \-mno\-mips\-tfile +The +.B \-mno\-mips\-tfile +switch causes the compiler not postprocess the object file with the +.B mips\-tfile +program, after the MIPS assembler has generated it to add debug +support. If +.B mips\-tfile +is not run, then no local variables will be available to the debugger. +In addition, +.B stage2 +and +.B stage3 +objects will have the temporary file names passed to the assembler +embedded in the object file, which means the objects will not compare +the same. +.TP +.B \-msoft\-float +Generate output containing library calls for floating point. +.I +WARNING: +the requisite libraries are not part of GNU CC. Normally the +facilities of the machine's usual C compiler are used, but this can't +be done directly in cross-compilation. You must make your own +arrangements to provide suitable library functions for cross-compilation. +.TP +.B \-mhard\-float +Generate output containing floating point instructions. This is the +default if you use the unmodified sources. +.TP +.B \-mfp64 +Assume that the +.B FR +bit in the status word is on, and that there are 32 64-bit floating +point registers, instead of 32 32-bit floating point registers. You +must also specify the +.B \-mcpu=r4000 +and +.B \-mips3 +switches. +.TP +.B \-mfp32 +Assume that there are 32 32-bit floating point registers. This is the +default. +.PP +.B \-mabicalls +.TP +.B \-mno\-abicalls +Emit (or do not emit) the +.BR \&.abicalls , +.BR \&.cpload , +and +.B \&.cprestore +pseudo operations that some System V.4 ports use for position +independent code. +.TP +.B \-mhalf\-pic +.TP +.B \-mno\-half\-pic +The +.B \-mhalf\-pic +switch says to put pointers to extern references into the data section +and load them up, rather than put the references in the text section. +This option does not work at present. +.B +.BI \-G num +Put global and static items less than or equal to +.I num +bytes into the small data or bss sections instead of the normal data +or bss section. This allows the assembler to emit one word memory +reference instructions based on the global pointer +.RB ( gp +or +.BR $28 ), +instead of the normal two words used. By default, +.I num +is 8 when the MIPS assembler is used, and 0 when the GNU +assembler is used. The +.BI \-G num +switch is also passed to the assembler and linker. All modules should +be compiled with the same +.BI \-G num +value. +.TP +.B \-nocpp +Tell the MIPS assembler to not run its preprocessor over user +assembler files (with a `\|\c +.B .s\c +\&\|' suffix) when assembling them. +.PP +These `\|\c +.B \-m\c +\&\|' options are defined for the Intel 80386 family of computers: +.B \-m486 +.TP +.B \-mno\-486 +Control whether or not code is optimized for a 486 instead of an +386. Code generated for a 486 will run on a 386 and vice versa. +.TP +.B \-msoft\-float +Generate output containing library calls for floating point. +.I Warning: +the requisite libraries are not part of GNU CC. +Normally the facilities of the machine's usual C compiler are used, but +this can't be done directly in cross-compilation. You must make your +own arrangements to provide suitable library functions for +cross-compilation. +.Sp +On machines where a function returns floating point results in the 80387 +register stack, some floating point opcodes may be emitted even if +`\|\c +.B \-msoft-float\c +\&\|' is used. +.TP +.B \-mno-fp-ret-in-387 +Do not use the FPU registers for return values of functions. +.Sp +The usual calling convention has functions return values of types +.B float\c +\& and \c +.B double\c +\& in an FPU register, even if there +is no FPU. The idea is that the operating system should emulate +an FPU. +.Sp +The option `\|\c +.B \-mno-fp-ret-in-387\c +\&\|' causes such values to be returned +in ordinary CPU registers instead. +.PP +These `\|\c +.B \-m\c +\&\|' options are defined for the HPPA family of computers: +.TP +.B \-mpa-risc-1-0 +Generate code for a PA 1.0 processor. +.TP +.B \-mpa-risc-1-1 +Generate code for a PA 1.1 processor. +.TP +.B \-mkernel +Generate code which is suitable for use in kernels. Specifically, avoid +.B add\c +\& instructions in which one of the arguments is the DP register; +generate \c +.B addil\c +\& instructions instead. This avoids a rather serious +bug in the HP-UX linker. +.TP +.B \-mshared-libs +Generate code that can be linked against HP-UX shared libraries. This option +is not fully function yet, and is not on by default for any PA target. Using +this option can cause incorrect code to be generated by the compiler. +.TP +.B \-mno-shared-libs +Don't generate code that will be linked against shared libraries. This is +the default for all PA targets. +.TP +.B \-mlong-calls +Generate code which allows calls to functions greater than 256K away from +the caller when the caller and callee are in the same source file. Do +not turn this option on unless code refuses to link with \*(lqbranch out of +range errors\*('' from the linker. +.TP +.B \-mdisable-fpregs +Prevent floating point registers from being used in any manner. This is +necessary for compiling kernels which perform lazy context switching of +floating point registers. If you use this option and attempt to perform +floating point operations, the compiler will abort. +.TP +.B \-mdisable-indexing +Prevent the compiler from using indexing address modes. This avoids some +rather obscure problems when compiling MIG generated code under MACH. +.TP +.B \-mtrailing-colon +Add a colon to the end of label definitions (for ELF assemblers). +.PP +These `\|\c +.B \-m\c +\&\|' options are defined for the Intel 80960 family of computers: +.TP +.BI "\-m" "cpu-type" +Assume the defaults for the machine type +.I cpu-type +for instruction and addressing-mode availability and alignment. +The default +.I cpu-type +is +.BR kb ; +other choices are +.BR ka , +.BR mc , +.BR ca , +.BR cf , +.BR sa , +and +.BR sb . +.TP +.B \-mnumerics +.TP +.B \-msoft\-float +The +.B \-mnumerics +option indicates that the processor does support +floating-point instructions. The +.B \-msoft\-float +option indicates +that floating-point support should not be assumed. +.TP +.B \-mleaf\-procedures +.TP +.B \-mno\-leaf\-procedures +Do (or do not) attempt to alter leaf procedures to be callable with the +.I bal +instruction as well as +.IR call . +This will result in more +efficient code for explicit calls when the +.I bal +instruction can be +substituted by the assembler or linker, but less efficient code in other +cases, such as calls via function pointers, or using a linker that doesn't +support this optimization. +.TP +.B \-mtail\-call +.TP +.B \-mno\-tail\-call +Do (or do not) make additional attempts (beyond those of the +machine-independent portions of the compiler) to optimize tail-recursive +calls into branches. You may not want to do this because the detection of +cases where this is not valid is not totally complete. The default is +.BR \-mno\-tail\-call . +.TP +.B \-mcomplex\-addr +.TP +.B \-mno\-complex\-addr +Assume (or do not assume) that the use of a complex addressing mode is a +win on this implementation of the i960. Complex addressing modes may not +be worthwhile on the K-series, but they definitely are on the C-series. +The default is currently +.B \-mcomplex\-addr +for all processors except +the CB and CC. +.TP +.B \-mcode\-align +.TP +.B \-mno\-code\-align +Align code to 8-byte boundaries for faster fetching (or don't bother). +Currently turned on by default for C-series implementations only. +.TP +.B \-mic\-compat +.TP +.B \-mic2.0\-compat +.TP +.B \-mic3.0\-compat +Enable compatibility with iC960 v2.0 or v3.0. +.TP +.B \-masm\-compat +.TP +.B \-mintel\-asm +Enable compatibility with the iC960 assembler. +.TP +.B \-mstrict\-align +.TP +.B \-mno\-strict\-align +Do not permit (do permit) unaligned accesses. +.TP +.B \-mold\-align +Enable structure-alignment compatibility with Intel's gcc release version +1.3 (based on gcc 1.37). Currently this is buggy in that +.B #pragma align 1 +is always assumed as well, and cannot be turned off. +.PP +These `\|\c +.B \-m\c +\&\|' options are defined for the DEC Alpha implementations: +.TP +.B \-mno-soft-float +.TP +.B \-msoft-float +Use (do not use) the hardware floating-point instructions for +floating-point operations. When \c +.B \-msoft-float\c +\& is specified, +functions in `\|\c +.B libgcc1.c\c +\&\|' will be used to perform floating-point +operations. Unless they are replaced by routines that emulate the +floating-point operations, or compiled in such a way as to call such +emulations routines, these routines will issue floating-point +operations. If you are compiling for an Alpha without floating-point +operations, you must ensure that the library is built so as not to call +them. +.Sp +Note that Alpha implementations without floating-point operations are +required to have floating-point registers. +.TP +.B \-mfp-reg +.TP +.B \-mno-fp-regs +Generate code that uses (does not use) the floating-point register set. +.B \-mno-fp-regs\c +\& implies \c +.B \-msoft-float\c +\&. If the floating-point +register set is not used, floating point operands are passed in integer +registers as if they were integers and floating-point results are passed +in $0 instead of $f0. This is a non-standard calling sequence, so any +function with a floating-point argument or return value called by code +compiled with \c +.B \-mno-fp-regs\c +\& must also be compiled with that +option. +.Sp +A typical use of this option is building a kernel that does not use, +and hence need not save and restore, any floating-point registers. +.PP +These additional options are available on System V Release 4 for +compatibility with other compilers on those systems: +.TP +.B \-G +On SVr4 systems, \c +.B gcc\c +\& accepts the option `\|\c +.B \-G\c +\&\|' (and passes +it to the system linker), for compatibility with other compilers. +However, we suggest you use `\|\c +.B \-symbolic\c +\&\|' or `\|\c +.B \-shared\c +\&\|' as +appropriate, instead of supplying linker options on the \c +.B gcc +command line. +.TP +.B \-Qy +Identify the versions of each tool used by the compiler, in a +.B .ident\c +\& assembler directive in the output. +.TP +.B \-Qn +Refrain from adding \c +.B .ident\c +\& directives to the output file (this is +the default). +.TP +.BI "\-YP," "dirs" +Search the directories \c +.I dirs\c +\&, and no others, for libraries +specified with `\|\c +.B \-l\c +\&\|'. You can separate directory entries in +.I dirs\c +\& from one another with colons. +.TP +.BI "\-Ym," "dir" +Look in the directory \c +.I dir\c +\& to find the M4 preprocessor. +The assembler uses this option. +.SH CODE GENERATION OPTIONS +These machine-independent options control the interface conventions +used in code generation. +.PP +Most of them begin with `\|\c +\-f\c +\&\|'. These options have both positive and negative forms; the negative form +of `\|\c +.B \-ffoo\c +\&\|' would be `\|\c +.B \-fno\-foo\c +\&\|'. In the table below, only +one of the forms is listed\(em\&the one which is not the default. You +can figure out the other form by either removing `\|\c +.B no\-\c +\&\|' or adding +it. +.TP +.B \-fnonnull\-objects +Assume that objects reached through references are not null +(C++ only). +.Sp +Normally, GNU C++ makes conservative assumptions about objects reached +through references. For example, the compiler must check that \c +.B a +is not null in code like the following: +.Sp +obj &a = g (); +a.f (2); +.Sp +Checking that references of this sort have non-null values requires +extra code, however, and it is unnecessary for many programs. You can +use `\|\c +.B \-fnonnull-objects\c +\&\|' to omit the checks for null, if your +program doesn't require checking. +.TP +.B \-fpcc\-struct\-return +Use the same convention for returning \c +.B struct\c +\& and \c +.B union +values that is used by the usual C compiler on your system. This +convention is less efficient for small structures, and on many +machines it fails to be reentrant; but it has the advantage of +allowing intercallability between GCC-compiled code and PCC-compiled +code. +.TP +.B \-freg\-struct\-return +Use the convention that +.B struct +and +.B union +values are returned in registers when possible. This is more +efficient for small structures than +.BR \-fpcc\-struct\-return . +.Sp +If you specify neither +.B \-fpcc\-struct\-return +nor +.BR \-freg\-struct\-return , +GNU CC defaults to whichever convention is standard for the target. +If there is no standard convention, GNU CC defaults to +.BR \-fpcc\-struct\-return . +.TP +.B \-fshort\-enums +Allocate to an \c +.B enum\c +\& type only as many bytes as it needs for the +declared range of possible values. Specifically, the \c +.B enum\c +\& type +will be equivalent to the smallest integer type which has enough room. +.TP +.B \-fshort\-double +Use the same size for +.B double +as for +.B float +\&. +.TP +.B \-fshared\-data +Requests that the data and non-\c +.B const\c +\& variables of this +compilation be shared data rather than private data. The distinction +makes sense only on certain operating systems, where shared data is +shared between processes running the same program, while private data +exists in one copy per process. +.TP +.B \-fno\-common +Allocate even uninitialized global variables in the bss section of the +object file, rather than generating them as common blocks. This has the +effect that if the same variable is declared (without \c +.B extern\c +\&) in +two different compilations, you will get an error when you link them. +The only reason this might be useful is if you wish to verify that the +program will work on other systems which always work this way. +.TP +.B \-fno\-ident +Ignore the `\|\c +.B #ident\c +\&\|' directive. +.TP +.B \-fno\-gnu\-linker +Do not output global initializations (such as C++ constructors and +destructors) in the form used by the GNU linker (on systems where the GNU +linker is the standard method of handling them). Use this option when +you want to use a non-GNU linker, which also requires using the +.B collect2\c +\& program to make sure the system linker includes +constructors and destructors. (\c +.B collect2\c +\& is included in the GNU CC +distribution.) For systems which \c +.I must\c +\& use \c +.B collect2\c +\&, the +compiler driver \c +.B gcc\c +\& is configured to do this automatically. +.TP +.B \-finhibit-size-directive +Don't output a \c +.B .size\c +\& assembler directive, or anything else that +would cause trouble if the function is split in the middle, and the +two halves are placed at locations far apart in memory. This option is +used when compiling `\|\c +.B crtstuff.c\c +\&\|'; you should not need to use it +for anything else. +.TP +.B \-fverbose-asm +Put extra commentary information in the generated assembly code to +make it more readable. This option is generally only of use to those +who actually need to read the generated assembly code (perhaps while +debugging the compiler itself). +.TP +.B \-fvolatile +Consider all memory references through pointers to be volatile. +.TP +.B \-fvolatile\-global +Consider all memory references to extern and global data items to +be volatile. +.TP +.B \-fpic +If supported for the target machines, generate position-independent code, +suitable for use in a shared library. +.TP +.B \-fPIC +If supported for the target machine, emit position-independent code, +suitable for dynamic linking, even if branches need large displacements. +.TP +.BI "\-ffixed\-" "reg" +Treat the register named \c +.I reg\c +\& as a fixed register; generated code +should never refer to it (except perhaps as a stack pointer, frame +pointer or in some other fixed role). +.Sp +.I reg\c +\& must be the name of a register. The register names accepted +are machine-specific and are defined in the \c +.B REGISTER_NAMES +macro in the machine description macro file. +.Sp +This flag does not have a negative form, because it specifies a +three-way choice. +.TP +.BI "\-fcall\-used\-" "reg" +Treat the register named \c +.I reg\c +\& as an allocable register that is +clobbered by function calls. It may be allocated for temporaries or +variables that do not live across a call. Functions compiled this way +will not save and restore the register \c +.I reg\c +\&. +.Sp +Use of this flag for a register that has a fixed pervasive role in the +machine's execution model, such as the stack pointer or frame pointer, +will produce disastrous results. +.Sp +This flag does not have a negative form, because it specifies a +three-way choice. +.TP +.BI "\-fcall\-saved\-" "reg" +Treat the register named \c +.I reg\c +\& as an allocable register saved by +functions. It may be allocated even for temporaries or variables that +live across a call. Functions compiled this way will save and restore +the register \c +.I reg\c +\& if they use it. +.Sp +Use of this flag for a register that has a fixed pervasive role in the +machine's execution model, such as the stack pointer or frame pointer, +will produce disastrous results. +.Sp +A different sort of disaster will result from the use of this flag for +a register in which function values may be returned. +.Sp +This flag does not have a negative form, because it specifies a +three-way choice. +.SH PRAGMAS +Two `\|\c +.B #pragma\c +\&\|' directives are supported for GNU C++, to permit using the same +header file for two purposes: as a definition of interfaces to a given +object class, and as the full definition of the contents of that object class. +.TP +.B #pragma interface +(C++ only.) +Use this directive in header files that define object classes, to save +space in most of the object files that use those classes. Normally, +local copies of certain information (backup copies of inline member +functions, debugging information, and the internal tables that +implement virtual functions) must be kept in each object file that +includes class definitions. You can use this pragma to avoid such +duplication. When a header file containing `\|\c +.B #pragma interface\c +\&\|' is included in a compilation, this auxiliary information +will not be generated (unless the main input source file itself uses +`\|\c +.B #pragma implementation\c +\&\|'). Instead, the object files will contain references to be +resolved at link time. +.TP +.B #pragma implementation +.TP +\fB#pragma implementation "\fP\fIobjects\fP\fB.h"\fP +(C++ only.) +Use this pragma in a main input file, when you want full output from +included header files to be generated (and made globally visible). +The included header file, in turn, should use `\|\c +.B #pragma interface\c +\&\|'. +Backup copies of inline member functions, debugging information, and +the internal tables used to implement virtual functions are all +generated in implementation files. +.Sp +If you use `\|\c +.B #pragma implementation\c +\&\|' with no argument, it applies to an include file with the same +basename as your source file; for example, in `\|\c +.B allclass.cc\c +\&\|', `\|\c +.B #pragma implementation\c +\&\|' by itself is equivalent to `\|\c +.B +#pragma implementation "allclass.h"\c +\&\|'. Use the string argument if you want a single implementation +file to include code from multiple header files. +.Sp +There is no way to split up the contents of a single header file into +multiple implementation files. +.SH FILES +.nf +.ta \w'LIBDIR/g++\-include 'u +file.c C source file +file.h C header (preprocessor) file +file.i preprocessed C source file +file.C C++ source file +file.cc C++ source file +file.cxx C++ source file +file.m Objective-C source file +file.s assembly language file +file.o object file +a.out link edited output +\fITMPDIR\fR/cc\(** temporary files +\fILIBDIR\fR/cpp preprocessor +\fILIBDIR\fR/cc1 compiler for C +\fILIBDIR\fR/cc1plus compiler for C++ +\fILIBDIR\fR/collect linker front end needed on some machines +\fILIBDIR\fR/libgcc.a GCC subroutine library +/lib/crt[01n].o start-up routine +\fILIBDIR\fR/ccrt0 additional start-up routine for C++ +/lib/libc.a standard C library, see +.IR intro (3) +/usr/include standard directory for \fB#include\fP files +\fILIBDIR\fR/include standard gcc directory for \fB#include\fP files +\fILIBDIR\fR/g++\-include additional g++ directory for \fB#include\fP +.Sp +.fi +.I LIBDIR +is usually +.B /usr/local/lib/\c +.IR machine / version . +.br +.I TMPDIR +comes from the environment variable +.B TMPDIR +(default +.B /usr/tmp +if available, else +.B /tmp\c +\&). +.SH "SEE ALSO" +cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1). +.br +.RB "`\|" gcc "\|', `\|" cpp \|', +.RB "`\|" as "\|', `\|" ld \|', +and +.RB `\| gdb \|' +entries in +.B info\c +\&. +.br +.I +Using and Porting GNU CC (for version 2.0)\c +, Richard M. Stallman; +.I +The C Preprocessor\c +, Richard M. Stallman; +.I +Debugging with GDB: the GNU Source-Level Debugger\c +, Richard M. Stallman and Roland H. Pesch; +.I +Using as: the GNU Assembler\c +, Dean Elsner, Jay Fenlason & friends; +.I +ld: the GNU linker\c +, Steve Chamberlain and Roland Pesch. +.SH BUGS +For instructions on reporting bugs, see the GCC manual. +.SH COPYING +Copyright +.if t \(co +1991, 1992, 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. +.SH AUTHORS +See the GNU CC Manual for the contributors to GNU CC. diff --git a/usr/local/nachos/man/man1/decstation-ultrix-ld.1 b/usr/local/nachos/man/man1/decstation-ultrix-ld.1 new file mode 100644 index 0000000..58516b9 --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-ld.1 @@ -0,0 +1,1115 @@ +.\" Copyright (c) 1991, 92, 93, 94, 95, 96, 97, 98, 1999 Free Software Foundation +.\" See section COPYING for conditions for redistribution +.TH ld 1 "17 August 1992" "cygnus support" "GNU Development Tools" +.de BP +.sp +.ti \-.2i +\(** +.. + +.SH NAME +ld \- the GNU linker + +.SH SYNOPSIS +.hy 0 +.na +.TP +.B ld +.RB "[\|" \-o " +.I output\c +\&\|] \c +.I objfile\c +\&.\|.\|. +.br +.RB "[\|" \-A\c +.I architecture\c +\&\|] +.RB "[\|" "\-b\ "\c +.I input-format\c +\&\|] +.RB "[\|" \-Bstatic "\|]" +.RB "[\|" \-Bdynamic "\|]" +.RB "[\|" \-Bsymbolic "\|]" +.RB "[\|" "\-c\ "\c +.I commandfile\c +\&\|] +.RB "[\|" \-\-cref "\|]" +.RB "[\|" \-d | \-dc | \-dp\c +\|] +.br +.RB "[\|" "\-defsym\ "\c +.I symbol\c +\& = \c +.I expression\c +\&\|] +.RB "[\|" \-\-demangle "\|]" +.RB "[\|" \-\-no\-demangle "\|]" +.RB "[\|" "\-e\ "\c +.I entry\c +\&\|] +.RB "[\|" \-embedded\-relocs "\|]" +.RB "[\|" \-E "\|]" +.RB "[\|" \-export\-dynamic "\|]" +.RB "[\|" "\-f\ "\c +.I name\c +\&\|] +.RB "[\|" "\-\-auxiliary\ "\c +.I name\c +\&\|] +.RB "[\|" "\-F\ "\c +.I name\c +\&\|] +.RB "[\|" "\-\-filter\ "\c +.I name\c +\&\|] +.RB "[\|" "\-format\ "\c +.I input-format\c +\&\|] +.RB "[\|" \-g "\|]" +.RB "[\|" \-G +.I size\c +\&\|] +.RB "[\|" "\-h\ "\c +.I name\c +\&\|] +.RB "[\|" "\-soname\ "\c +.I name\c +\&\|] +.RB "[\|" \-\-help "\|]" +.RB "[\|" \-i "\|]" +.RB "[\|" \-l\c +.I ar\c +\&\|] +.RB "[\|" \-L\c +.I searchdir\c +\&\|] +.RB "[\|" \-M "\|]" +.RB "[\|" \-Map +.I mapfile\c +\&\|] +.RB "[\|" \-m +.I emulation\c +\&\|] +.RB "[\|" \-n | \-N "\|]" +.RB "[\|" \-noinhibit-exec "\|]" +.RB "[\|" \-no\-keep\-memory "\|]" +.RB "[\|" \-no\-warn\-mismatch "\|]" +.RB "[\|" \-O\c +.I level\c +\&\|] +.RB "[\|" "\-oformat\ "\c +.I output-format\c +\&\|] +.RB "[\|" "\-R\ "\c +.I filename\c +\&\|] +.RB "[\|" \-relax "\|]" +.RB "[\|" \-r | \-Ur "\|]" +.RB "[\|" "\-rpath\ "\c +.I directory\c +\&\|] +.RB "[\|" "\-rpath\-link\ "\c +.I directory\c +\&\|] +.RB "[\|" \-S "\|]" +.RB "[\|" \-s "\|]" +.RB "[\|" \-shared "\|]" +.RB "[\|" \-sort\-common "\|]" +.RB "[\|" "\-split\-by\-reloc\ "\c +.I count\c +\&\|] +.RB "[\|" \-split\-by\-file "\|]" +.RB "[\|" "\-T\ "\c +.I commandfile\c +\&\|] +.RB "[\|" "\-Ttext\ "\c +.I textorg\c +\&\|] +.RB "[\|" "\-Tdata\ "\c +.I dataorg\c +\&\|] +.RB "[\|" "\-Tbss\ "\c +.I bssorg\c +\&\|] +.RB "[\|" \-t "\|]" +.RB "[\|" "\-u\ "\c +.I sym\c +\&] +.RB "[\|" \-V "\|]" +.RB "[\|" \-v "\|]" +.RB "[\|" \-\-verbose "\|]" +.RB "[\|" \-\-version "\|]" +.RB "[\|" \-warn\-common "\|]" +.RB "[\|" \-warn\-constructors "\|]" +.RB "[\|" \-warn\-multiple\-gp "\|]" +.RB "[\|" \-warn\-once "\|]" +.RB "[\|" \-warn\-section\-align "\|]" +.RB "[\|" \-\-whole\-archive "\|]" +.RB "[\|" \-\-no\-whole\-archive "\|]" +.RB "[\|" "\-\-wrap\ "\c +.I symbol\c +\&\|] +.RB "[\|" \-X "\|]" +.RB "[\|" \-x "\|]" +.ad b +.hy 1 +.SH DESCRIPTION +\c +.B ld\c +\& combines a number of object and archive files, relocates +their data and ties up symbol references. Often the last step in +building a new compiled program to run is a call to \c +.B ld\c +\&. + +\c +.B ld\c +\& accepts Linker Command Language files +to provide explicit and total control over the linking process. +This man page does not describe the command language; see the `\|\c +.B ld\c +\|' entry in `\|\c +.B info\c +\|', or the manual +.I +ld: the GNU linker +\&, for full details on the command language and on other aspects of +the GNU linker. + +This version of \c +.B ld\c +\& uses the general purpose BFD libraries +to operate on object files. This allows \c +.B ld\c +\& to read, combine, and +write object files in many different formats\(em\&for example, COFF or +\c +.B a.out\c +\&. Different formats may be linked together to produce any +available kind of object file. You can use `\|\c +.B objdump \-i\c +\|' to get a list of formats supported on various architectures; see +.BR objdump ( 1 ). + +Aside from its flexibility, the GNU linker is more helpful than other +linkers in providing diagnostic information. Many linkers abandon +execution immediately upon encountering an error; whenever possible, +\c +.B ld\c +\& continues executing, allowing you to identify other errors +(or, in some cases, to get an output file in spite of the error). + +The GNU linker \c +.B ld\c +\& is meant to cover a broad range of situations, +and to be as compatible as possible with other linkers. As a result, +you have many choices to control its behavior through the command line, +and through environment variables. + +.SH OPTIONS +The plethora of command-line options may seem intimidating, but in +actual practice few of them are used in any particular context. +For instance, a frequent use of \c +.B ld\c +\& is to link standard Unix +object files on a standard, supported Unix system. On such a system, to +link a file \c +.B hello.o\c +\&: +.sp +.br +$\ ld\ \-o\ output\ /lib/crt0.o\ hello.o\ \-lc +.br +.sp +This tells \c +.B ld\c +\& to produce a file called \c +.B output\c +\& as the +result of linking the file \c +.B /lib/crt0.o\c +\& with \c +.B hello.o\c +\& and +the library \c +.B libc.a\c +\& which will come from the standard search +directories. + +The command-line options to \c +.B ld\c +\& may be specified in any order, and +may be repeated at will. For the most part, repeating an option with a +different argument will either have no further effect, or override prior +occurrences (those further to the left on the command line) of an +option. + +The exceptions\(em\&which may meaningfully be used more than once\(em\&are +\c +.B \-A\c +\&, \c +.B \-b\c +\& (or its synonym \c +.B \-format\c +\&), \c +.B \-defsym\c +\&, +\c +.B \-L\c +\&, \c +.B \-l\c +\&, \c +.B \-R\c +\&, and \c +.B \-u\c +\&. + +The list of object files to be linked together, shown as \c +.I objfile\c +\&, +may follow, precede, or be mixed in with command-line options; save that +an \c +.I objfile\c +\& argument may not be placed between an option flag and +its argument. + +Usually the linker is invoked with at least one object file, but other +forms of binary input files can also be specified with \c +.B \-l\c +\&, +\c +.B \-R\c +\&, and the script command language. If \c +.I no\c +\& binary input +files at all are specified, the linker does not produce any output, and +issues the message `\|\c +.B No input files\c +\|'. + +Option arguments must either follow the option letter without intervening +whitespace, or be given as separate arguments immediately following the +option that requires them. + +.TP +.BI "-A" "architecture" +In the current release of \c +.B ld\c +\&, this option is useful only for the +Intel 960 family of architectures. In that \c +.B ld\c +\& configuration, the +\c +.I architecture\c +\& argument is one of the two-letter names identifying +members of the 960 family; the option specifies the desired output +target, and warns of any incompatible instructions in the input files. +It also modifies the linker's search strategy for archive libraries, to +support the use of libraries specific to each particular +architecture, by including in the search loop names suffixed with the +string identifying the architecture. + +For example, if your \c +.B ld\c +\& command line included `\|\c +.B \-ACA\c +\|' as +well as `\|\c +.B \-ltry\c +\|', the linker would look (in its built-in search +paths, and in any paths you specify with \c +.B \-L\c +\&) for a library with +the names +.sp +.br +try +.br +libtry.a +.br +tryca +.br +libtryca.a +.br +.sp + +The first two possibilities would be considered in any event; the last +two are due to the use of `\|\c +.B \-ACA\c +\|'. + +Future releases of \c +.B ld\c +\& may support similar functionality for +other architecture families. + +You can meaningfully use \c +.B \-A\c +\& more than once on a command line, if +an architecture family allows combination of target architectures; each +use will add another pair of name variants to search for when \c +.B \-l +specifies a library. + +.TP +.BI "\-b " "input-format" +Specify the binary format for input object files that follow this option +on the command line. You don't usually need to specify this, as +\c +.B ld\c +\& is configured to expect as a default input format the most +usual format on each machine. \c +.I input-format\c +\& is a text string, the +name of a particular format supported by the BFD libraries. +\c +.B \-format \c +.I input-format\c +\&\c +\& has the same effect, as does the script command +.BR TARGET . + +You may want to use this option if you are linking files with an unusual +binary format. You can also use \c +.B \-b\c +\& to switch formats explicitly (when +linking object files of different formats), by including +\c +.B \-b \c +.I input-format\c +\&\c +\& before each group of object files in a +particular format. + +The default format is taken from the environment variable +.B GNUTARGET\c +\&. You can also define the input +format from a script, using the command \c +.B TARGET\c +\&. + +.TP +.B \-Bstatic +Do not link against shared libraries. This is only meaningful on +platforms for which shared libraries are supported. + +.TP +.B \-Bdynamic +Link against dynamic libraries. This is only meaningful on platforms +for which shared libraries are supported. This option is normally the +default on such platforms. + +.TP +.B \-Bsymbolic +When creating a shared library, bind references to global symbols to +the definition within the shared library, if any. Normally, it is +possible for a program linked against a shared library to override the +definition within the shared library. This option is only meaningful +on ELF platforms which support shared libraries. + +.TP +.BI "\-c " "commandfile" +Directs \c +.B ld\c +\& to read link commands from the file +\c +.I commandfile\c +\&. These commands will completely override \c +.B ld\c +\&'s +default link format (rather than adding to it); \c +.I commandfile\c +\& must +specify everything necessary to describe the target format. + + +You may also include a script of link commands directly in the command +line by bracketing it between `\|\c +.B {\c +\|' and `\|\c +.B }\c +\|' characters. + +.TP +.B \-\-cref +Output a cross reference table. If a linker map file is being +generated, the cross reference table is printed to the map file. +Otherwise, it is printed on the standard output. + +.TP +.B \-d +.TP +.B \-dc +.TP +.B \-dp +These three options are equivalent; multiple forms are supported for +compatibility with other linkers. Use any of them to make \c +.B ld +assign space to common symbols even if a relocatable output file is +specified (\c +.B \-r\c +\&). The script command +\c +.B FORCE_COMMON_ALLOCATION\c +\& has the same effect. + +.TP +.BI "-defsym " "symbol" "\fR = \fP" expression +Create a global symbol in the output file, containing the absolute +address given by \c +.I expression\c +\&. You may use this option as many +times as necessary to define multiple symbols in the command line. A +limited form of arithmetic is supported for the \c +.I expression\c +\& in this +context: you may give a hexadecimal constant or the name of an existing +symbol, or use \c +.B +\c +\& and \c +.B \-\c +\& to add or subtract hexadecimal +constants or symbols. If you need more elaborate expressions, consider +using the linker command language from a script. + +.TP +.B \-\-demangle +.TP +.B \-\-no\-demangle +These options control whether to demangle symbol names in error +messages and other output. When the linker is told to demangle, it +tries to present symbol names in a readable fashion: it strips leading +underscores if they are used by the object file format, and converts +C++ mangled symbol names into user readable names. The linker will +demangle by default unless the environment variable +.B COLLECT_NO_DEMANGLE +is set. These options may be used to override the default. + +.TP +.BI "-e " "entry"\c +\& +Use \c +.I entry\c +\& as the explicit symbol for beginning execution of your +program, rather than the default entry point. See the `\|\c +.B ld\c +\|' entry in `\|\c +.B info\c +\|' for a +discussion of defaults and other ways of specifying the +entry point. + +.TP +.B \-embedded\-relocs +This option is only meaningful when linking MIPS embedded PIC code, +generated by the +.B \-membedded\-pic +option to the GNU compiler and assembler. It causes the linker to +create a table which may be used at runtime to relocate any data which +was statically initialized to pointer values. See the code in +testsuite/ld-empic for details. + +.TP +.B \-E +.TP +.B \-export\-dynamic +When creating an ELF file, add all symbols to the dynamic symbol table. +Normally, the dynamic symbol table contains only symbols which are used +by a dynamic object. This option is needed for some uses of +.I dlopen. + +.TP +.BI "-f " "name" +.TP +.BI "--auxiliary " "name" +When creating an ELF shared object, set the internal DT_AUXILIARY field +to the specified name. This tells the dynamic linker that the symbol +table of the shared object should be used as an auxiliary filter on the +symbol table of the shared object +.I name. + +.TP +.BI "-F " "name" +.TP +.BI "--filter " "name" +When creating an ELF shared object, set the internal DT_FILTER field to +the specified name. This tells the dynamic linker that the symbol table +of the shared object should be used as a filter on the symbol table of +the shared object +.I name. + +.TP +.BI "\-format " "input\-format" +Synonym for \c +.B \-b\c +\& \c +.I input\-format\c +\&. + +.TP +.B \-g +Accepted, but ignored; provided for compatibility with other tools. + +.TP +.BI "\-G " "size"\c +Set the maximum size of objects to be optimized using the GP register +to +.I size +under MIPS ECOFF. Ignored for other object file formats. + +.TP +.BI "-h " "name" +.TP +.BI "-soname " "name" +When creating an ELF shared object, set the internal DT_SONAME field to +the specified name. When an executable is linked with a shared object +which has a DT_SONAME field, then when the executable is run the dynamic +linker will attempt to load the shared object specified by the DT_SONAME +field rather than the using the file name given to the linker. + +.TP +.B \-\-help +Print a summary of the command-line options on the standard output and exit. +This option and +.B \-\-version +begin with two dashes instead of one +for compatibility with other GNU programs. The other options start with +only one dash for compatibility with other linkers. + +.TP +.B \-i +Perform an incremental link (same as option \c +.B \-r\c +\&). + +.TP +.BI "\-l" "ar"\c +\& +Add an archive file \c +.I ar\c +\& to the list of files to link. This +option may be used any number of times. \c +.B ld\c +\& will search its +path-list for occurrences of \c +.B lib\c +.I ar\c +\&.a\c +\& for every \c +.I ar +specified. + +.TP +.BI "\-L" "searchdir" +This command adds path \c +.I searchdir\c +\& to the list of paths that +\c +.B ld\c +\& will search for archive libraries. You may use this option +any number of times. + +The default set of paths searched (without being specified with +\c +.B \-L\c +\&) depends on what emulation mode \c +.B ld\c +\& is using, and in +some cases also on how it was configured. The +paths can also be specified in a link script with the \c +.B SEARCH_DIR +command. + +.TP +.B \-M +Print (to the standard output file) a link map\(em\&diagnostic information +about where symbols are mapped by \c +.B ld\c +\&, and information on global +common storage allocation. + +.TP +.BI "\-Map " "mapfile"\c +Print to the file +.I mapfile +a link map\(em\&diagnostic information +about where symbols are mapped by \c +.B ld\c +\&, and information on global +common storage allocation. + +.TP +.BI "\-m " "emulation"\c +Emulate the +.I emulation +linker. You can list the available emulations with the +.I \-\-verbose +or +.I \-V +options. This option overrides the compiled-in default, which is the +system for which you configured +.BR ld . + +.TP +.B \-N +specifies readable and writable \c +.B text\c +\& and \c +.B data\c +\& sections. If +the output format supports Unix style magic numbers, the output is +marked as \c +.B OMAGIC\c +\&. + +When you use the `\|\c +.B \-N\c +\&\|' option, the linker does not page-align the +data segment. + +.TP +.B \-n +sets the text segment to be read only, and \c +.B NMAGIC\c +\& is written +if possible. + +.TP +.B \-noinhibit\-exec +Normally, the linker will not produce an output file if it encounters +errors during the link process. With this flag, you can specify that +you wish the output file retained even after non-fatal errors. + +.TP +.B \-no\-keep\-memory +The linker normally optimizes for speed over memory usage by caching +the symbol tables of input files in memory. This option tells the +linker to instead optimize for memory usage, by rereading the symbol +tables as necessary. This may be required if the linker runs out of +memory space while linking a large executable. + +.TP +.B \-no\-warn\-mismatch +Normally the linker will give an error if you try to link together +input files that are mismatched for some reason, perhaps because they +have been compiled for different processors or for different +endiannesses. This option tells the linker that it should silently +permit such possible errors. This option should only be used with +care, in cases when you have taken some special action that ensures +that the linker errors are inappropriate. + +.TP +.BI "\-o " "output" +.I output\c +\& is a name for the program produced by \c +.B ld\c +\&; if this +option is not specified, the name `\|\c +.B a.out\c +\|' is used by default. The +script command \c +.B OUTPUT\c +\& can also specify the output file name. + +.TP +.BI "\-O" "level" +Generate optimized output files. This might use significantly more +time and therefore probably should be enabled only for generating the +final binary. +\c +.I level\c +\& is supposed to be a numeric value. Any value greater than zero enables +the optimizations. + +.TP +.BI "\-oformat " "output\-format" +Specify the binary format for the output object file. +You don't usually need to specify this, as +\c +.B ld\c +\& is configured to produce as a default output format the most +usual format on each machine. \c +.I output-format\c +\& is a text string, the +name of a particular format supported by the BFD libraries. +The script command +.B OUTPUT_FORMAT +can also specify the output format, but this option overrides it. + +.TP +.BI "\-R " "filename" +Read symbol names and their addresses from \c +.I filename\c +\&, but do not +relocate it or include it in the output. This allows your output file +to refer symbolically to absolute locations of memory defined in other +programs. + +.TP +.B \-relax +An option with machine dependent effects. Currently this option is only +supported on the H8/300. + +On some platforms, use this option to perform global optimizations that +become possible when the linker resolves addressing in your program, such +as relaxing address modes and synthesizing new instructions in the +output object file. + +On platforms where this is not supported, `\|\c +.B \-relax\c +\&\|' is accepted, but has no effect. + +.TP +.B \-r +Generates relocatable output\(em\&i.e., generate an output file that can in +turn serve as input to \c +.B ld\c +\&. This is often called \c +.I partial +linking\c +\&. As a side effect, in environments that support standard Unix +magic numbers, this option also sets the output file's magic number to +\c +.B OMAGIC\c +\&. +If this option is not specified, an absolute file is produced. When +linking C++ programs, this option \c +.I will not\c +\& resolve references to +constructors; \c +.B \-Ur\c +\& is an alternative. + +This option does the same as \c +.B \-i\c +\&. + +.TP +.B \-rpath\ \fIdirectory +Add a directory to the runtime library search path. This is used when +linking an ELF executable with shared objects. All +.B \-rpath +arguments are concatenated and passed to the runtime linker, which uses +them to locate shared objects at runtime. The +.B \-rpath +option is also used when locating shared objects which are needed by +shared objects explicitly included in the link; see the description of +the +.B \-rpath\-link +option. If +.B \-rpath +is not used when linking an ELF executable, the contents of the +environment variable +.B LD_RUN_PATH +will be used if it is defined. + +The +.B \-rpath +option may also be used on SunOS. By default, on SunOS, the linker +will form a runtime search path out of all the +.B \-L +options it is given. If a +.B \-rpath +option is used, the runtime search path will be formed exclusively +using the +.B \-rpath +options, ignoring +the +.B \-L +options. This can be useful when using gcc, which adds many +.B \-L +options which may be on NFS mounted filesystems. + +.TP +.B \-rpath\-link\ \fIdirectory +When using ELF or SunOS, one shared library may require another. This +happens when an +.B ld\ \-shared +link includes a shared library as one of the input files. + +When the linker encounters such a dependency when doing a non-shared, +non-relocateable link, it will automatically try to locate the required +shared library and include it in the link, if it is not included +explicitly. In such a case, the +.B \-rpath\-link +option specifies the first set of directories to search. The +.B \-rpath\-link +option may specify a sequence of directory names either by specifying +a list of names separated by colons, or by appearing multiple times. + +If the required shared library is not found, the linker will issue a +warning and continue with the link. + +.TP +.B \-S +Omits debugger symbol information (but not all symbols) from the output file. + +.TP +.B \-s +Omits all symbol information from the output file. + +.TP +.B \-shared +Create a shared library. This is currently only supported on ELF and +SunOS platforms (on SunOS it is not required, as the linker will +automatically create a shared library when there are undefined symbols +and the +.B \-e +option is not used). + +.TP +.B \-sort\-common +Normally, when +.B ld +places the global common symbols in the appropriate output sections, +it sorts them by size. First come all the one byte symbols, then all +the two bytes, then all the four bytes, and then everything else. +This is to prevent gaps between symbols due to +alignment constraints. This option disables that sorting. + +.TP +.B \-split\-by\-reloc\ \fIcount +Trys to creates extra sections in the output file so that no single +output section in the file contains more than +.I count +relocations. +This is useful when generating huge relocatable for downloading into +certain real time kernels with the COFF object file format; since COFF +cannot represent more than 65535 relocations in a single section. +Note that this will fail to work with object file formats which do not +support arbitrary sections. The linker will not split up individual +input sections for redistribution, so if a single input section +contains more than +.I count +relocations one output section will contain that many relocations. + +.TP +.B \-split\-by\-file +Similar to +.B \-split\-by\-reloc +but creates a new output section for each input file. + +.TP +.BI "\-Tbss " "org"\c +.TP +.BI "\-Tdata " "org"\c +.TP +.BI "\-Ttext " "org"\c +Use \c +.I org\c +\& as the starting address for\(em\&respectively\(em\&the +\c +.B bss\c +\&, \c +.B data\c +\&, or the \c +.B text\c +\& segment of the output file. +\c +.I org\c +\& must be a hexadecimal integer. + +.TP +.BI "\-T " "commandfile" +Equivalent to \c +.B \-c \c +.I commandfile\c +\&\c +\&; supported for compatibility with +other tools. + +.TP +.B \-t +Prints names of input files as \c +.B ld\c +\& processes them. + +.TP +.BI "\-u " "sym" +Forces \c +.I sym\c +\& to be entered in the output file as an undefined symbol. +This may, for example, trigger linking of additional modules from +standard libraries. \c +.B \-u\c +\& may be repeated with different option +arguments to enter additional undefined symbols. + +.TP +.B \-Ur +For anything other than C++ programs, this option is equivalent to +\c +.B \-r\c +\&: it generates relocatable output\(em\&i.e., an output file that can in +turn serve as input to \c +.B ld\c +\&. When linking C++ programs, \c +.B \-Ur +.I will\c +\& resolve references to constructors, unlike \c +.B \-r\c +\&. + +.TP +.B \-\-verbose +Display the version number for \c +.B ld +and list the supported emulations. +Display which input files can and can not be opened. + +.TP +.B \-v, \-V +Display the version number for \c +.B ld\c +\&. +The +.B \-V +option also lists the supported emulations. + +.TP +.B \-\-version +Display the version number for \c +.B ld +and exit. + +.TP +.B \-warn\-common +Warn when a common symbol is combined with another common symbol or with +a symbol definition. Unix linkers allow this somewhat sloppy practice, +but linkers on some other operating systems do not. This option allows +you to find potential problems from combining global symbols. + +.TP +.B \-warn\-constructors +Warn if any global constructors are used. This is only useful for a +few object file formats. For formats like COFF or ELF, the linker can +not detect the use of global constructors. + +.TP +.B \-warn\-multiple\-gp +Warn if the output file requires multiple global-pointer values. This +option is only meaningful for certain processors, such as the Alpha. + +.TP +.B \-warn\-once +Only warn once for each undefined symbol, rather than once per module +which refers to it. + +.TP +.B \-warn\-section\-align +Warn if the address of an output section is changed because of +alignment. Typically, the alignment will be set by an input section. +The address will only be changed if it not explicitly specified; that +is, if the SECTIONS command does not specify a start address for the +section. + +.TP +.B \-\-whole\-archive +For each archive mentioned on the command line after the +.B \-\-whole\-archive +option, include every object file in the archive in the link, rather +than searching the archive for the required object files. This is +normally used to turn an archive file into a shared library, forcing +every object to be included in the resulting shared library. + +.TP +.B \-\-no\-whole\-archive +Turn off the effect of the +.B \-\-whole\-archive +option for archives which appear later on the command line. + +.TP +.BI "--wrap " "symbol" +Use a wrapper function for +.I symbol. +Any undefined reference to +.I symbol +will be resolved to +.BI "__wrap_" "symbol". +Any undefined reference to +.BI "__real_" "symbol" +will be resolved to +.I symbol. + +.TP +.B \-X +Delete all temporary local symbols. For most targets, this is all local +symbols whose names begin with `\|\c +.B L\c +\|'. + +.TP +.B \-x +Delete all local symbols. + +.PP + +.SH ENVIRONMENT +\c +You can change the behavior of +.B ld\c +\& with the environment variable \c +.B GNUTARGET\c +\&. + +\c +.B GNUTARGET\c +\& determines the input-file object format if you don't +use \c +.B \-b\c +\& (or its synonym \c +.B \-format\c +\&). Its value should be one +of the BFD names for an input format. If there is no +\c +.B GNUTARGET\c +\& in the environment, \c +.B ld\c +\& uses the natural format +of the host. If \c +.B GNUTARGET\c +\& is set to \c +.B default\c +\& then BFD attempts to discover the +input format by examining binary input files; this method often +succeeds, but there are potential ambiguities, since there is no method +of ensuring that the magic number used to flag object-file formats is +unique. However, the configuration procedure for BFD on each system +places the conventional format for that system first in the search-list, +so ambiguities are resolved in favor of convention. + +.PP + +.SH "SEE ALSO" + +.BR objdump ( 1 ) +.br +.br +.RB "`\|" ld "\|' and `\|" binutils "\|'" +entries in +.B info\c +.br +.I +ld: the GNU linker\c +, Steve Chamberlain and Roland Pesch; +.I +The GNU Binary Utilities\c +, Roland H. Pesch. + +.SH COPYING +Copyright (c) 1991, 92, 93, 94, 95, 96, 97, 1998 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/usr/local/nachos/man/man1/decstation-ultrix-nlmconv.1 b/usr/local/nachos/man/man1/decstation-ultrix-nlmconv.1 new file mode 100644 index 0000000..cbc3aed --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-nlmconv.1 @@ -0,0 +1,110 @@ +.\" 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/usr/local/nachos/man/man1/decstation-ultrix-nm.1 b/usr/local/nachos/man/man1/decstation-ultrix-nm.1 new file mode 100644 index 0000000..c2ad99e --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-nm.1 @@ -0,0 +1,230 @@ +.\" 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/usr/local/nachos/man/man1/decstation-ultrix-objcopy.1 b/usr/local/nachos/man/man1/decstation-ultrix-objcopy.1 new file mode 100644 index 0000000..80ca216 --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-objcopy.1 @@ -0,0 +1,332 @@ +.\" 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/usr/local/nachos/man/man1/decstation-ultrix-objdump.1 b/usr/local/nachos/man/man1/decstation-ultrix-objdump.1 new file mode 100644 index 0000000..ddc153e --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-objdump.1 @@ -0,0 +1,412 @@ +.\" 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/usr/local/nachos/man/man1/decstation-ultrix-ranlib.1 b/usr/local/nachos/man/man1/decstation-ultrix-ranlib.1 new file mode 100644 index 0000000..7efb5c8 --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-ranlib.1 @@ -0,0 +1,83 @@ +.\" 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/usr/local/nachos/man/man1/decstation-ultrix-size.1 b/usr/local/nachos/man/man1/decstation-ultrix-size.1 new file mode 100644 index 0000000..3b19bd2 --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-size.1 @@ -0,0 +1,161 @@ +.\" 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/usr/local/nachos/man/man1/decstation-ultrix-strings.1 b/usr/local/nachos/man/man1/decstation-ultrix-strings.1 new file mode 100644 index 0000000..4d33b79 --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-strings.1 @@ -0,0 +1,151 @@ +.\" 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/usr/local/nachos/man/man1/decstation-ultrix-strip.1 b/usr/local/nachos/man/man1/decstation-ultrix-strip.1 new file mode 100644 index 0000000..708817d --- /dev/null +++ b/usr/local/nachos/man/man1/decstation-ultrix-strip.1 @@ -0,0 +1,185 @@ +.\" 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.