The following small changes (apart from those in ChangeLog's) have been made
to PGCC+EMX relatively to GCC+EMX 2.7.2.1 (unordered):

o PGCC has NO bound checking.

o The symbol __OS2__ is defined if -Zomf is used.

o I've removed some of Eberhard Mattes' patches that were related to 8.3
  naming convention. FAT is ugly, besides you mostly won't have any problems
  with 8.3 names even without these patches. They were related mostly to
  GCC-developer related things, like .cse2, .flow, .combine, .sched and
  other file name extensions. If you need these files, you should use
  a normal filesystem :-)

o The -ZC++-comments switch is gone now (hopefully forever) since GCC
  always enable C++-style comments (unless -traditional or -lang-c89 is
  specified)

o The -Zexe switch now works correctly (before it worked only in couple
  with -o switch). ld and emxomfld were patched too for this. Also now
  the -Zexe option not only creates a fresh file without extension
  to keep "make" happy; the behaviour has been changed to copy a file
  called ldstub.bin that should be located in same directory where
  ld or emxomfld is into the file with same name as executable but without
  extension: this avoids two problems at once: first, many "configure"
  scripts expects after compiling a test program to obtain a *non-empty*
  file; and second, they expect the file to be runnable, otherwise C compiler
  is considered a cross-compiler. ldstub determines the name under which
  it has been launched and launches in turn the executable that has same
  name but with ".exe" appended. So, for example, if you copy ldstub.bin
  into "sh" then when you do from, say, bash:

  [c:/] ./sh

  you will launch "sh" which in turn will look for "sh.exe" (located in
  same directory as "sh" itself) and will run it.

o All compilers were compiled with -Zcrtdll, so you will need an
  installed EMX runtime to run them. Anyway, I think everybody reading
  this already have it :-)

o The -mprobe switch is retained for backward compatibility, however it
  is highly recommended that you use -mstack-arg-probe and -mno-stack-arg-probe
  instead since these options are new from mainstream GCC version, and maybe
  someday -mprobe will disappear.
  Another switch that has to do with stack probing is -f{no-}stack-check.
  These switches have same functionality as -m{no-}stack-arg-probe but uses
  inline instructions instead of alloca call, so they're faster. Here is how
  alloca(20000) is compiled with different switches:

  without any switches:

	subl $20000,%esp

  with -mstack-arg-probe:

	movl $20000,%eax
	call __alloca

  with -fstack-check options:

	movl $0,-4392(%esp)
	movl $0,-8488(%esp)
	movl $0,-12584(%esp)
	movl $0,-16680(%esp)
	movl $0,-24392(%esp)
	addl $-20000,%esp

o Now alloca() is stack-probe safe, i.e. if you`re compiling with
  -mstack-arg-probe switch, alloca() will do stack probes for you.
  However, the previous limitation still applies, i.e. if you will do
  alloca(4095) twice, this can lead to a crash. The best workaround for this
  is to not use threads with non-commited stack at all :-)

o The provided binaries of GCC will not work in DOS (with EMX or RSX extenders) since<BR>
  &gt; They were packed with LXLITE (no OS/2 2.x too)<BR>
  If you need either to run GCC in DOS (note that you still can <B><I>produce</I></B>
  executables that run in DOS), you can try to recompile it yourself.
  If you want to run it under OS/2 2.x you should unpack executables
  (<CODE>lxLite -x -r *</CODE>). If you can't do the listed above yourself,
  mail me - possibly if I'll receive enough requests, I'll do a unpacked version.
  But personally me for DOS am using DJGPP - it is better suited for DOS.

o 64-bit ([unsigned] long long) division is now FAST! :-) Its written
  in assembly now, and I`ve optimized it by hand. It looks almost ~ten
  times faster as before. Signed division is somewhat slower than unsigned, so
  if you need speed, use unsigned when possible.
  I should say that same routine, coded in plain C (take a look into libgcc2.c)
  and compiled with PGCC -O6 is only 10-20% slower (!!!). This makes me think
  this routine was the last in my life which I've assembled manually ;-)

o -mepilogue did not worked in C++ and possibly other languages which mangles
  names. Fixed.

o _set_new_handler now is called set_new_handler. However, _set_new_handler
  will work too as an alias.

o PGCC has command-line help. Try:

      gcc --help
      gcc --help=*
      gcc --help=-c
      gcc -h-m
      gcc -h13.15

  There is a new optional environment variable: CLH_TERM. If it is "mono",
  the help will use only black/white colors; if it is "-", the help won't
  use highlighting at all; if it is anything other (or is not set) the help
  text will default to colored syntax.

o Libgcc has been put in a separate DLL. I did this since libgcc changes
  often - with each new major gcc release, sometimes even in minor releases.
  To avoid conflicts with future/previous libgcc versions, libgcc will have
  a name consisting of 'gcc' and gcc's internal version number without dots.
  For example, gcc version 2.90.27 will have its runtime in gcc29027.dll.
  Do not forget to include this dll with your programs compiled with -Zcrtdll
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  If you want to use -Zcrtdll and not depend on gcc29027.dll (par example) you
  should link with libgcc by using -lgcc (or -lgpp for C++ programs with
  exceptions).

o PGCC has multithreaded support for exceptions. GCC has not.

o PGCC has multithreaded libstdc++. GCC has not.

Known bugs and limitations:

o emxomf now traps (sometimes?) when compiling with -g (debug) switch.
  This is due to new format of debugging info (DWARF2). I do not know
  how to fix this. Use A.OUT format (no -Zomf) for debugging and pmgdb.

  Solution: This happens because pgcc uses new stabs format (-gstabs+)
  while emxomf understands only the standard stabs debugging info.
  I've partialy fixed this by adding a tiny command-line preprocessor to gcc.
  It scans argv[] and looks for both -Zomf and -g# where # is a number. If it
  finds one, it replaces -g# by -gstabs#. This doesn't always help, however.

o f77 compiler does not incorporate the changes made for the `main' ported
  version for OS/2. I do not know whenever there are other changes other than
  those needed `just to make it work'. Fortran compiler compiles though and
  compiled programs works - thats all users need, I think.

o pgcc/c++ complains on superfluous "__asm__ __volatile__ (...)" operators.
  For example (taken from /emx/include/386/builtin.h):

    static __inline__ void __enable (void)
    {
      __asm__ __volatile__ ("sti");
    }

  Solution: remove __volatile__'s from enable() and disable() functions in
  include/386/builtin.h; they're not needed since no registers are changed
  inside __asm__ so there is no need to declare it __volatile__:
  a better solution for EM would be to declare in __asm__ instead
  of volatile the list of registers that gets changed).

--------------------------------------------------------------------------------
                             PGCC/2 change history
--------------------------------------------------------------------------------

(*) pgcc-2.95.3, Sunday January 2, 2000
  - EGCS and GCC teams are back together. Thats good.
  - Well, 'gcc -v' calls itself 'pgcc-2.95.2' but it is pgcc-2.95.3
    indeed. Marc forgot to change version number before releasing 2.95.3.
  - Changed directory structure to be as much Unix-like as possible.
    FAT support is dropped altogether. Most version-specific files are
    stored under /emx/lib/gcc-lib/i386-pc-os2_emx/pgcc-2.95.2/.
    This allows for multiple installed compiler versions.
  - Fixed bug with libstdc++ not correctly displaying floating-point
    numbers (cout << 1.234F). Well, not my fault anyway. I didn't changed
    anything in libstdc++.

(*) pgcc-1.1.3 for OS/2
  - Upgraded to egcs 1.1.2/pgcc 1.1.3
  - Multithreaded exceptions! LIBGCC is now canned in two separate versions:
    multithreaded and single-threaded (and goes from now on into lib/st and
    lib/mt directories). Also there is a separate LIBGCC (called gpp.a) for
    C++ with exception handling enabled (this has a small overhead even on
    programs that do not use exceptions, see <A HREF="#Tips">tips</A> section
    below).
  - Applied patch from Marc Leeuwen that fixes incorrect output (program
    crashes) on following testcase:

#define LUARRAYROWS 101L
#define LUARRAYCOLS 101L

static void build_problem (double a[][LUARRAYCOLS], int n,
  double b[LUARRAYROWS])
{
  long i, j, k, k1;

  for (i = 0; i < 8 * n; i++)
  {
    k = 1;
    k1 = 2;
    for (j = 0; j < n; j++)
      a[k][j] += 1;
  }

  return;
}

    Thanks to Vadim Yegorov for pointing this bug to me.
  - Applied patch that fixes internal compiler error when using alias
    typedefs on classes. Here is a testcase:

class A
{
public:
};

class B
{
public:
};

class C : public A, public B
{
public:
  int zz;
};

typedef C ccc;
int a = int (&((ccc *)0)->zz);

    Note that because of above two patches the compiler is not quite
    "version 1.1.3", it is rather "version 1.1.3 plus two patches".
    Don't forget to mention this whenever this could matter.
  - I've recompiled all non-compiler files to not use libgcc runtime DLL
    anymore. This will remove the need to download new binutils if you
    don't want to keep old gcc runtime DLL anymore. The only DLLs required
    are those included with emx.

(*) pgcc-1.1.1 for OS/2 release 2
  - Ported almost all binutils 2.9.1 instead of just GAS.
  - Added libopcodes.a and libbfd.a into binutils distribution -
    both in static and dynamic form.
  - Recompiled all executables to use only pgcc 1.1.1 runtime DLL.
    Previous release contained several executables that requires runtime
    DLL from pgcc 1.0.2.
  - Added dllar.cmd to base distribution - someone could find it useful.
    It is similar to "ar" except that it creates .dll instead of .a libraries.
    Also it can be used to convert .a archives into .dll.
  - Added book on gprof into docs archive.
  - Moved all .h files from include.new/gnu into include.new.
  - Changed naming convention for archives. Now [libname].a is an import
    library (i.e. for dynamically linking in a .dll) and [libname]_s.a is
    the static library.

(*) pgcc-1.1.1
  - Upgraded to pgcc 1.1.1
  - Upgraded to emx 0.9d: PGCC will not work anymore with emx 0.9c.
  - Now command-line help works without termcap; this is better since it
    achieves consistent results across different termcap files (the one that
    comes with emx works not too well with CLH). The CLH_TERM variable
    can be assigned three different values: "-" for non-colored output,
    "mono" for monochrome output and anything other (or unset) for colored
    output.
  - Exceptions will work from now ONLY if you will link with g++ and ONLY
    if you did not used -fno-exceptions during linking. Otherwise a different
    version of libgcc is used that has smaller size overhead (~10K) by the
    cost of exception handling.

(*) pgcc-1.0.2 release 2 - minor bugfixes
  - Re-compiled ld.exe and emxomfld.exe to not use gcc290.dll from pgcc-1.0.0
  - Changed front-end to pre-define __OS2__ symbol when using -Zomf
  - Fixed an inconsistency between ld and emxomfld: ld used ldstub.bin when
    run with -Zexe while emxomfld searched for ldstub.bin. Now the "launcher"
    stub is always called ldstub.bin.
  - minor bug in emxfix.cmd: lib/st and lib/mt already exists, so there is
    no need to create them.
  - New libraries: gpp*.a (which have almost the same functionality as their
    gcc*.a counterparts). I was forced to split g++ runtime from gcc runtime
    since g++ when used with frame-unwind exceptions required a slightly longer
    initialization sequence which pulls a lot of unused code into executables,
    even for plain C and F77 not speaking of C++ code without exceptions.
    So I suggest now linking with gcc even C++ code without exceptions -
    this will produce slightly smaller executables (5-10K).
  - Fixed the bug with creating a ".exe" file when feeding only linker
    files to frontent (ex: gcc -s a.o b.o c.o will produce ".exe").
    Now it takes the basename of first object file and appends .exe or .dll.

(*) pgcc-1.0.2
  - Upgraded to egcs-1.0.2.
  - Ooops! Due to a bug in my makefiles, libgcc previously used C versions
    of some functions instead of optimized versions I wrote in
    config/i386/emx-libgcc1.asm. 64-bit division should be slightly faster
    now.
  - Renamed dynamically-loaded libgcc from gcc290.dll to gcc29027.dll.
    This happened because libgcc in pgcc-1.0.2 has been changed, to
    avoid conflicts with previous versions of gcc*.dll.
  - Added include/cpp/new, include/cpp/exception, include/cpp/typeinfo files.
    I don't really know what they are for :-) I don't use libstdc++.
  - Included GNU -liberty library into base PGCC/2 binary distribution.
    The files added were:
     - libiberty.h - mostly interface for string functions in libiberty
     - objalloc.h  - obstack management
     - obstack.h   - same
     - getopt.h    - GNU getopt (getopt_long included too).
                     Replaces EMX's getopt.h
     - demangle.h  - C++/Java name demangling functions
     - fnmatch.h   - Wildcard filename match function
                     Replaces EMX's fnmatch.h
     - ansidecl.h  - auxiliary file
     - iberty.a    - static library
     - ibertydll.a - import library
     - iberty.dll  - dynamic library

    To link against static version of GNU -liberty library use:

     gcc [...] -liberty

    To link against dynamic version of GNU -liberty library use:

     gcc [...] -libertydll

    iberty.dll should be on your LIBPATH (and distributed with your
    programs, if used). Distribution policy is contained in file COPYING.

(*) pgcc-1.0 release 2
  - multi-threaded and single-threaded libstdc++ library!
  - fixed a bug with _IO_flockfile and _IO_funlockfile in libstdc++
  - fixed a number of minor bugs in supplied header files
    - removed limits.h - emx's is good enough
    - removed float.h - emx's is good enough
    - removed sysinclude.h which is garbage
    - removed proto.h which is garbage
    - fixed a definition conflict with emx headers in
      varargs.h and stdarg.h
  - changed behaviour of command-line help. Now by default "gcc -h"
    will list a digest of most used GCC options. To see the full help
    index use gcc -h* or gcc --help=*

(*) pgcc-1.0 release 1
  This was the first release of pgcc-1.0 for OS/2
