--------------------------------------------------------------------------------
                           PGCC/2 and GCC/2 change history
--------------------------------------------------------------------------------

(*) gcc 3.2.1, 6 March 2003
  - Thanks to our friends from Cygnus, I had to rewrite almost the every
    aspect of the OS/2 port. Thanks guys, it brings me a lot of fun to see
    how you break my patches trying to implement something I've implemented
    years ago (but which was available only on OS/2).
  - The GCC_ROOT, G++_ROOT and/or BINUTILS_ROOT environment variables can be
    set to point to the directory where gcc and binutils are installed (e.g.
    'set GCC_ROOT=f:/emx/'). If not set, they are derived from the pathname
    of the gcc/g++/g77 executable front-end.
  - Now you can control whenever you want static or dynamic linking with libgcc
    by using -static-libgcc and -shared-libgcc switches.
  - Fixed a little weak symbol support (#pragma weak now works even if the weak
    symbol is completely missing during link stage). Alas, it still differs
    a little between a.out and OMF variants (LINK386 won't pull in a
    weak symbol from library if the object file where the weak symbol is
    defined is not pulled in by another 'strong' symbol while GNU ld will).
  - The libgcc has been split into two parts: gcc.a and gcc_eh.a. The
    second library contains additional support for exception handling,
    but it is not linked with your application unless you're compiled
    the "main" function with the -fexceptions. If you don't use exceptions,
    and you're statically linking (not using -Zcrtdll), use the -fno-exceptions
    switch during compilation (does not matter on linking) and you will get
    your executable by around 4k smaller.
  - As a consequence, if you use exceptions from DLLs, you will have to call
    a special function called "__ehInit()" from _DLL_InitTerm at startup
    (right after __ctordtorInit) and (optionaly) "__ehTerm()" at shutdown.
    If you don't provide your own _DLL_InitTerm, and you're linking with
    -Zcrtdll you will get (gratis!) a correct _DLL_InitTerm from gcc321.a.
    To be able to fully exploit exceptions in a multi-DLL environment you
    should follow some precautions:
    - All modules should be linked with -Zcrtdll so that they share the same
      frame unwind info database (housekeeped by gcc321.dll).
    - All modules should share the same RTTI. This means you will have to
      make a DLL from stdcxx.a and link with it. In fact, I haven't tested
      it, but if you don't share RTTI, you will be able to catch only untyped
      objects (e.g. catch (...)).
  - #pragma push/pop should work now (just like on Windoze).
  - Due to numerous requests I have changed the stdcall name mangling to work
    like on Win32: to the name is appended a suffix consisting of a '@' and
    a number which represents the size in bytes of the argument list.
  - I've included a modified version of GNU Assembler (gas) configured so that
    it accepts labels containing @'s.

(*) gcc 3.0.3
  - The objc runtime library now comes in two flavours: single-threaded and
    multi-threaded.
  - The optlink attribute works now. I'm not sure what the degree of
    compatibility between gcc's optlink and VACPP's one is, though.
  - Added the _cdecl, _optlink, _stdcall predefined macros:
    "_cdecl" and "__cdecl" are aliases for "__attribute__((__cdecl__))",
    "_stdcall" and "__stdcall" are aliases for  "__attribute__((__stdcall__))",
    "_optlink" and "__optlink" are aliases for  "__attribute__((__optlink__))".
    Thus, you can now write "int _stdcall doit ()" or "void __optlink func ()".
    The macros prefixed with one underscore are disabled if -ansi switch
    is used.

(*) gcc 3.0.2
  - emxbind:
    - fixed emxbind to use hash tables instead of linear search when exporting
      DLL symbols. This allows for a huge speedup when building large DLLs from
      a.out object files.
    - exports by names without ordinals goes into resident names table rather
      than into non-resident names table. This is the behaviour of LINK386.
    - Added support (in fact, fixed a bug) for labels (e.g. variables) in the
      .bss segment.
  - The 3.0.2 gcc has been configured to use .bss segment for variables
    (previously all variables -- even uninitialized -- were generated in
    the .data segment).
  - Added a new flag to the C/C++ compilers: -malign-strings, which is present
    only in the OS/2 version of gcc. See details in OS2USAGE.
  - Multi-threaded support in libgcc has been improved. Now using fmutex
    semaphores instead of smutex; fixed a couple of bugs here and there.

(*) gcc 3.0.1
  - C++ thunks referenced from other object files works now. The only way to
    do it right now is through weak symbols (see above), but it generates
    duplicate (but working!) thunk code, which is bad. A radical solution
    to this is to change the underlying object file format to, say, ELF
    which seems to slowly become my next primary objective. It looks like
    a.out format has reached its limits. There is no way to support with it
    new features of gcc such as duplicate template code elimination,
    optimizations for exception info, -ffunction-sections and others.
  - Real weak symbol support for a.out and a working kludge for OMF formats!
  - For weak symbol support in OMF I had to use a workaround (some may
    call it a kludge), since LINK386 does not support weak symbols (it
    supports an OMF extension called WKEXT but it has a totally different
    syntax). The emxomf a.out->OMF converter has been improved in order to
    keep a list of weak symbols in a file called "./weaksyms.omf" (you can
    override it by using the GCC_WEAKSYMS environment variable).
    For more details on weak symbol support see the OS2USAGE file.
  - The former stdcpp library has been renamed into stdcxx (just for
    consistence with other ports). The weak symbols for the OMF version of
    stdcxx.lib are provided in the lib/gcc-lib/i386-pc-os2_emx/x.x.x/weaksyms.omf
    file; before compiling a project using libstdc++ with -Zomf please copy
    that file into your working directory; this is required so that emxomf
    will know which symbols in stdcpp.lib are marked as weak (and thus should
    not be presented in other object files). If you won't do it, you will get
    a lot of duplicate symbols due to template instantiation.

(*) gcc 3.0, Sunday July 29, 2001
  - The X:/emx/include doesn't have anymore to be present in C_INCLUDE_PATH
    and CPLUS_INCLUDE_PATH (but doesn't hurt). In fact, the only thing you
    really have to do now so that gcc works is to add the X:/emx/bin directory
    to PATH variable; everything other is derived from the gcc.exe file path.
  - From now on you will *have* to link C++ code (even if you don't use
    libstdc++) using g++ and not gcc. This is due to the fact that the "new"
    and "delete" operators have moved from libgcc to libstdc++. This won't add
    code overhead though, just will link a little slower (due to one extra
    library).
  - Fixed multi-threaded exceptions by rewriting the thread-specific code
    almost from scratch; now it uses DosAllocThreadLocalMemory().

(*) 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
