home *** CD-ROM | disk | FTP | other *** search
- First the legal stuff:
-
- This archive contains two independant parts, one consists of the binaries
- for the GNU C compiler V2.1, those files are all in the `gcc20' tree, and
- are subject to the license specified in the COPYING file.
-
- The other part consists of new versions for my shared C library and the
- link level counterparts. Those files are subject to the COPYING.LIB file.
-
- You can get the full distribution for gcc2.1 for example from
- prep.ai.mit.edu, the source for the library is available for example from
- amiga.physik.unizh.ch.
-
- -----------------------------------------------------------------------------
-
- A special note to the library: I'm currently changing the library sources
- to finally adapt more closely to the BSD-net2 distribution. As a goal, this
- library should then also support networking, starting with AF_UNIX sockets
- and pipes implemented ala socketpair(). The library that is included in libs/
- is a mixture between old and new code, I can therefore not distribute any
- sources until the library has been changed completely. The reason I'm
- including this version is that I'd like to get feedback whether the new
- way to deal with packets that this library uses causes problems on some
- Amigas. So if you find this library to cause problems (crashes, other weird
- things), *AND THE PREVIOUS VERSION WORKED*, please tell me, I'd very much
- like to get rid of such problems before the next version is released.
-
- You might notice that the startup code changed, this is to allow full
- implementation of execve() and friends, thus to actually pass an argument
- vector instead of a commandline to started programs. vfork() is there
- as well as wait4() and friends. You may try your luck on those new
- functions, but keep in mind that *they are not supported* at the moment.
- There are problems with vfork() that I'll fix in the next release, but I'll
- have to include support for process groups to do it `right', currently you
- cannot ^C break any children spawned with vfork() with the keyboard, BREAK
- works though. An other problem exists with pipe(): if you break a reader,
- the pipe might hang and you're not able to kill the writer. This will be
- fixed by using sockets and sending the apropriate SIGPIPE to the writer
- (the problem is permanent under 1.3, the 2.0 pipe is lots smarter, but not
- yet perfect ;-)).
-
- To repeat the important information: the functions are there, but unless
- you know what you do, don't use them, not all problems are solved in this
- library release!
-
- -----------------------------------------------------------------------------
-
-
- INSTALLATION
-
- This distribution only contains the compilers and changed parts of my C
- library. If you don't have a C library yet, you'll have to get one to be
- able to compile C programs. You can either get my library (get
- ixemlib9203.lha but use *THIS* ixemul.library in libs/ !!) or use another C
- library you might already have. If you're not using my library, here's
- what you have to do in short form:
- o create a directory, assign GCC: to it
- o create a directory called gcc:lib, here go your crt0.o and libc.a files
- o create a directory called gcc:include, that's where your headers go
- The ixemlib9203.lha archive contains a Readme that explains this setup
- in greater detail).
-
- The distribution contains 3 directories:
- gcc20 - this contains stuff for gcc
- gcc - this contains updates for the gcc: tree if you use my library
- libs - this contains ixemul.library, which is used by gcc, and
- which you have to copy to your LIBS: directory. This library
- overrides all previous versions, please replace any older
- copy!
-
- To install gcc, you just have to assign GCC20: to gcc20/, ie. the directory
- tree called gcc20/ that you created by unpacking this archive.
-
- Then add gcc20:bin to your PATH, and you're finished installing gcc, it can
- then be used like `gcc hello-world.c'.
-
- *Be sure to use a large enough STACK setting! I'm using a STACK 250000 myself,
- *and this worked even for the weirdest programs. You *will* crash the machine
- *or get the weirdest errors if you use the Commodore default of 4k !!!!
-
- The stuff in gcc/ should be copied to the apropriate place in your gcc:
- tree, it gives you a newer startup code (that now passes DOSBase and
- SysBase to your programs), and a newer libc.a (see the comments at the
- begin as well for comments to this version of the library).
-
- Repeating myself, copy libs/ixemul.library to LIBS: !
-
- Read the original manuals as well: read the info* file in the info
- directory. NOTE: the info files are not complete! I didn't include any
- files that describe compiler interna, as they are not of interest to the
- majority of users that don't plan to change gcc itself. If you want the
- complete manual, get the whole distribution from (for example)
- prep.ai.mit.edu! Second remark for 2.1: the provided info files are from
- gcc2, since only interna changed, this is still a valid manual.
-
- As a side effect of ixemul.library now converting paths like `/usr/include'
- into `usr:include', you get requesters like `Please insert volume usr:'.
- You can get rid of them by assigning a dummy directory to them. (You
- could as well build a **IX tree, and place your stuff there). Candidats
- for dummy-assigns are:
-
- tmp: usr: etc: lib: local: dev:
-
- As long as you don't want them to represent something useful, just make
- sure the assigns exist, and you won't be nerved by those requesters.
-
-
- HOW TO CALL THE C++ COMPILER
-
- The Unix copy of gcc comes with a shell script, that emulates `gpp' in
- its behavior to even call the C++ compiler on `*.c' files. Either call
- your C++ files `*.cc' (the preferred solution), or call the C++ compiler
- explicitly by using the `-x c++' switch to the compiler. The Unix `c++'
- script includes `-lg++' by default, you have to do this explicitly when
- calling gcc directly.
-
- If you have AREXX installed in your system, you might as well use the
- two AREXX commands provided by Loren J. Rittle (thanks Loren !), they
- are in the rexx/ directory. Read them, they include instructions.
-
-
-
- COEXISTANCE OF GCC 2.1 with GCC 1.40 & G++ 1.40
-
- If you want to use the older compiler as well, all you have to do is to
- rename gcc20:bin/gcc to gcc20:bin/gcc2, then you can use `gcc' and `gpp' as
- usual to refer to the 1.40 compilers, and `gcc2' to refer to gcc2.1. You
- might as well update some programs of 1.40:
- copy gcc20:lib/gcc-lib/amiga/2.1/as local:gcc-as
- copy gcc20:lib/gcc-lib/amiga/2.1/ld local:gcc-ld
- Don't copy cpp over though, cpp depends on the compiler version !
-
- If you're using g++-1.40 and the C++ compiler of gcc-2.1 concurrently, you'll
- probably only want to keep one copy of C++ header files. G++ 1.40 expects to
- find them under
- LOCAL:g++-include
- but gcc-2.0 looks for them in
- GCC20:lib/g++-include
- To fix this, you can either make a symbolic link to where you keep your
- C++ headers, or you can use the following directory tree:
- GCC20: -> <the base directory of your gcc20 tree>
- LOCAL: -> GCC20:lib
- /gcc-cpp }
- /gcc-cc1 }
- /gcc-cc1plus } these are the 1.40 compilers
- /gcc-as }
- /gcc-ld }
- /g++-include C++ headers for both, 1.40 and 2.1
-
- /gcc-lib/amiga/2.1
- /specs 2.1 command template
- /cpp }
- /cc1 }
- /cc1plus} these are the 2.1 compilers
- /cc1obj }
- /as }
- /ld }
-
- I'd recommend you switch to gcc 2, as I won't support the 1 release any
- longer. With the new resident capability (see below) of gcc 2, less memory
- is needed to fire up release 2 compilers.
-
-
- DISK LAYOUT DIFFERENCES TO GCC 2.0
-
- There are several differences. One you probably just noticed, the directory
- structure changed again (sorry), mainly because gcc20: really stands for
- the **IX /usr/local directory, and people wanted to have gcc specific stuff
- not just in /usr/local/gcc, but in /usr/local/gcc-lib. Another difference:
- The compilers are now in the target dependant directory (amiga/2.1), not
- in the base directory (I might have done that wrong in 2.0 myself..).
- So if you used 2.0, make sure to rename the gcc20:lib/gcc into
- gcc20:lib/gcc-lib, and to delete the compilers in the gcc20:lib/gcc
- directory.
-
-
-
- AMIGA SPECIFIC CHANGES, NEW FOR 2.1
-
- The most important change in 2.1 is that gcc finally can generate base
- relative code (which means, that it addresses the data/bss segment by
- indirection on A4). Based on base relative code, it is as well possible to
- generate `pure' programs, ie. programs you can set the PURE bit on with
- the PROTECT command, and then make them resident with the RESIDENT command.
-
- Here's a short explanation for the new switches to gcc:
-
- Option Explanation
-
- -fbaserel generate base relative code (needed by cc1 and (!) ld)
- -resident generate base relative code, and link it in a way so
- that it is `pure' (see above). -resident does the same as
- -fbaserel in cc1, but does additional work in ld.
- -msmall-code generate 16bit BSRs instead of 32bit JSRs. This option
- is only needed by as.
-
- You may mix -msmall-code object files with normal object files. You
- may as well mix base relative code with non base relative code, provided
- that you specify -fbaserel to the linker. Don't (!) specify -resident
- in this case, since code which was not compiled base relative is not
- per se residentable with -resident!
-
- *************************************************************************
- All executables in this distribution are new compiled with -resident, and
- are therefore RESIDENTable.
- Please don't use REZ anymore on them, REZ doesn't recognise that they're
- pure, and you'll lose the memory gains you get with RESIDENT.
- *************************************************************************
-
- With the addition of these features, new libraries were needed as well.
- Besides the `old' libraries (libc.a, libgcc.a, crt0.o), you get new base
- relative libraries (libbc.a, libbgcc.a, bcrt0.o), and a new startup
- file (rcrt0.o) used to startup pure executables.
-
- Here comes a technical implementation section (indented after `t').
- Skip if you're not interested in those details.
-
- t All the new support for base relative runtime support is in 2 new functions
- t in ixemul.library. Here's a short explanation on what they do:
- t
- t void ix_resident (int num_par, int a4, int databss_size, long *relocs);
- t
- t This is the heart of the new functions. ix_resident() can be called
- t in different ways, depending on the level of support you need/want.
- t
- t ix_resident (2, __a4_init);
- t
- t In this case, you get a plain base relative startup, the base
- t register (a4) is set to the value provided by the linker (the __a4_init
- t symbol).
- t
- t ix_resident (4, __a4_init, databss_size, relocs);
- t
- t In this case, you provide enough information to ix_resident, so that
- t the data/bss segment can be relocated each time you call ix_resident().
- t This way, each fresh copy of the process gets a unique databss segment,
- t which makes the program pure. Please look at the bcrt0.c file to see
- t how to implement resident programs based on ix_resident() support.
-
-
- The second function provided is:
-
- void ix_geta4 (void);
-
- This function (re)loads the base register.
-
- t Note: this functions works even for resident programs! Take care though,
- t that you don't refer to the base register calling this function, as would
- t happen if you just used the function as is (the glue functions use the
- t `ixemulbase' to jump into the library, and this variable is addressed using
- t a4 !). Use the direct calling method instead (see the README file for
- t ixemul.library). A future version of gcc will include support for setting
- t up the base register with a language extension (something like the SAS
- t __saveds attribute), until then, you're at your own. Generally this
- t doesn't matter though, as you only need to (re)load the base register by
- t hand, if you start your own processes, and want them to use your globals as
- t well.
-
-
-
- SOME FREQUENTLY ASKED QUESTIONS
-
- Q: `I keep getting requesters saying, that mathieeesingbas.library couldn't
- be opened. Does gcc not work under 1.3??'
- A: Gcc *does* work under 1.3, but it needs the single precision math libraries
- to implement the C `float' data type. The mathieeesingbas.library is built
- into ROM under Kick 2.04, but is needed as a file in LIBS: under Kick 1.3.
- You have to ask your local Commodore support for this library, or if you're
- lucky, you can get it from an (illegally.., not by myself!) posted article on
- comp.sys.amiga.programmers. If you didn't capture that article, perhaps
- somebody else had, but DON'T ASK ME! I won't send you neither the libraries
- nor the article in question!
-
- Q: `I don't get any .o files, even though the assembler seems to be called
- correctly.'
- A: This problem should have vanished in the mean time. It resulted from using
- a bogous copy of the assembler. Use the one provided in this release, and
- the problem should go away.
-
- Q: `Program <xy> that uses ixemul.library requests the LOCAL: drive, which
- I don't have?!'
- A: ixemul.library searches LOCAL: for a timezone database. All you have to do
- is assign LOCAL: to some existing directory, and the functions will be able
- to determine that no such database exists. If you have gcc-1.40 installed,
- you won't have this problem, as LOCAL: is used to find the compiler passes.
-
- Q: `I keep getting a bus error using program <xy>, what's wrong?'
- A: Tell me which program generated that error. This is most certainly a program
- that contains 68020 code and which you tried to run on a 68000 machine.
- As long as the program is not specifically marked as `68020 only', this is
- to be considered a bug!
- Note that `bus error' can mean both, a m68k bus error exception or a m68k
- address error exception. The signal model uses only one signal for both.
- This error might as well fit into the next question, read on!
-
- Q: `My machine always crashes when I try to use gcc, or I get weird error
- messages like "bus error" or "illegal instruction". Sometimes I can
- successfully compile, but the machine crashes soon afterwards, when I
- execute programs that normally don't crash.'
- A: Did you set your STACK high enough? The Commodore default of 4k is WAYS too
- low for GNU programs, I have my STACK at 250000, you might try lower
- values, but I'd recommend not going below 100k !
-
- Q: `I did "gcc -lg++ test.cc" and kept getting errors at link time'
- A: Supply the libraries AFTER the source/object files.
- Thus do `gcc test.cc -lg++' in this example. Don't forget to terminate
- the command with a space, or AmigaDOS will swallow your last `+'.
-
- Q: `Now that we have gcc release 2, can I remove my release 1 compilers?'
- A: Depends on what you're programming in mostly. If you're only interested in
- the C compiler, you can remove the 1.40 gcc, no problem. If you're a C++
- programmer though, I'd suggest (if you have the disk space) you keep your
- 1.40 g++, since the language definition changed slightly from 1.40 to
- 2.0, and the 2.0 C++ compiler seems buggier than the 1.40 one. The 2.0
- C-compiler could demonstrate reliability by recompiling itself, the C++
- didn't have a comparable chance. Use the 2.0 C++ compiler though! The C++
- language implemented by gcc2.0 is richer than the 1.40 one, templates are
- supported, ANSI exceptions, etc. By keeping the 1.40 compiler you just keep
- the option of reverting to 1.40 in cases where you're not sure whether your
- program or the compiler is buggy.
- 2.1 note: please use 2.1 and report bugs to GNU! 2.1 should have all known
- 2.0 bugs fixed, and C++ should be quite stable by now.
-
- Q: `Although I don't define "alloca" to be "__builtin_alloca", gcc2 uses its
- builtin function for it, what can I do?'
- A: Use the `-fno-builtin' switch.
-
-
-
- EXAMPLE CONFIGURATION
-
- Since getting gcc up and running seems to be harder than I thought (it does
- have some crap in it that can only be expained historically..), I provide you
- with my own setups, perhaps are examples more helpful than explanations...
-
- s:user-startup
- --------------
- ...
- STACK 250000
- ASSIGN gcc: dh4:mylibc
- ASSIGN gcc20: dh4:gcc20-stuff
-
- ; dummies
- ASSIGN tmp: t:
- ASSIGN usr: dh6:usr
- ASSIGN lib: gcc:lib
- ASSIGN etc: local:
-
- RESIDENT gcc20:lib/gcc-lib/amiga/2.1/cpp
- RESIDENT gcc20:lib/gcc-lib/amiga/2.1/cc1
- ;I don't have those resident, because I use them too seldom
- ;RESIDENT gcc20:lib/gcc-lib/amiga/2.1/cc1plus
- ;RESIDENT gcc20:lib/gcc-lib/amiga/2.1/cc1obj
- RESIDENT gcc20:lib/gcc-lib/amiga/2.1/as
- RESIDENT gcc20:lib/gcc-lib/amiga/2.1/ld
- RESIDENT c:gcc2
-
- dh4:mylibc/
- ----------
- contains (among other stuff):
- dh4:mylibc/include my header files
- dh4:mylibc/lib the libraries and startup files
-
- dh4:gcc20-stuff/
- ---------------
- contains (among other stuff):
- dh4:gcc20-stuff/bin:
- gcc
-
- dh4:gcc20-stuff/info:
- gcc-manual.lha
-
- dh4:gcc20-stuff/lib:
- g++-include gcc-lib
-
- dh4:gcc20-stuff/lib/gcc-lib:
- amiga
-
- dh4:gcc20-stuff/lib/gcc-lib/amiga:
- 2.1
-
- dh4:gcc20-stuff/lib/gcc-lib/amiga/2.1:
- SYSCALLS.c.X as cc1 cc1obj cc1plus
- cpp ld libbgcc.a libg++.a libgcc.a specs
-
-
-
- FINALLY...
-
- Good luck with this really great compiler. I'd like to thank all the wonderful
- guys that made this compiler what it is today, thank you! For the contributors
- to gcc, read the GNU CC manual!
-
-
- -Markus Wild
-
- You can reach me as:
-
- <wild@nessie.cs.id.ethz.ch> or as <wild@amiga.physik.unizh.ch>
-