GNUstep Objective-C Runtime 2.0
===============================

This the second major release of the GNUstep Objective-C runtime (a.k.a.
libobjc2).  This runtime was designed to support the features of modern
dialects of Objective-C for use with GNUstep and other Objective-C programs.

This release introduces a new Objective-C ABI, which is designed to be forward
compatible with future changes and removes a large number of hacks that were
required for compatibility with the prior ABI that included features introduced
in the 1980s.  Highlights include:

- The linker now removes duplicate selectors within a library.

- The linker will remove duplicate protocol definitions within a library.

- Protocols and classes are now always accessed via an indirection layer, so
  they can be extended by future versions of the ABI without breaking
  compatibility.

- Categories can include property metadata and both categories.

- Constant strings are now emitted with a richer structure, which provides
  faster hashing and better unicode support.

- Instance variable metadata includes size and alignment, allowing better object
  layout and more accurate introspection.  Instance variable metadata now
  includes more accurate information about ARC ownership semantics.

- Method metadata now includes extended type information, allowing bridged
  languages to understand the class that methods expect and not just the fact
  that they take an object.  This was previously an obstacle to supporting
  JavaScriptCore's Objective-C bridge with GNUstep.

In addition to the new ABI, there are several improvements on Windows:

- The runtime now uses SEH-based exception handling on Windows.  This
  interoperates with C++ exceptions in libraries compiled with MSVC or
  MSVC-compatible compilers.

- All of the assembly code paths now fully support i386 and x64 Windows.

- Object allocations on 32-bit Windows now use `_aligned_malloc` to guarantee
  sufficient alignment for AVX vectors in instance variables.

- The runtime now uses fibre-local storage and critical sections on Windows,
  improving performance in multithreaded workloads on Windows.

- Public runtime functions are now marked dllexport, so the runtime can be built
  as objc.dll on Windows.

**WARNING**: The new ABI is currently incompatible with incremental linking on
Windows, so projects built with Microsoft's linker must disable incremental
linking.

Note: Microsoft's WinObjC project contains a friendly fork of this library that
includes a work around for the incremental linking issue.  If you wish to use
incremental linking on Windows, please use that version.  A subsequent version
of clang and link.exe should include a fix that will make it possible to use
this version with incremental linking.

The runtime will now use the new ABI's data structures internally and will
automatically upgrade on-disk structures from old ABIs when used with the old
ABI.  As a result, memory usage will be higher when using the old ABI and users
who are unable to recompile their code may prefer to stick with the 1.9.x
release series.  Mixing libraries compiled with the old and new ABIs is not
supported and will abort at run time.

The new ABI provides better run-time introspection metadata and smaller
binaries.  When used with the new ABI, this version of the runtime will consume
less memory than the previous release.

You may obtain the code for this release from git and use the 2.0 branch:

https://github.com/gnustep/libobjc2.git

Alternatively, a tarball is available from:

https://github.com/gnustep/libobjc2/archive/v2.0.zip
https://github.com/gnustep/libobjc2/archive/v2.0.tar.gz

The runtime library is responsible for implementing the core features of the
object model, as well as exposing introspection features to the user.  The
GNUstep runtime implements a superset of Apple's Objective-C Runtime APIs.

If you come across any problems, please file them in the issue tracker:

https://github.com/gnustep/libobjc2/issues
