-*-Mode: outline-*-

* News for v1.1:

** coredump unwind support
** New arch: SuperH
** Improved support for PowerPC, ARM
** Lots of cleanups, perf tweaks
** pkg-config support

* News for v1.0:

** Fast unwind (rbp, rsp, rip only) on x86_64 with a fallback to 
   slow code path (Lassi Tuura)
** Improved local and remote unwinding on ARM (Ken Werner)
** Testing, stability and many fixes on x86 (Paul Pluzhnikov)
** FreeBSD port and clean separation of OS specific bits 
   (Konstantin Belousov)
** Thanks for all the bug reports, contributions and testing!

* News for v0.99:

** Greatly improved x86-64 support thanks to Arun Sharma.
** Support for PPC64 added by  Jose Flavio Aguilar Paulino.

* News for v0.98.6:

** Fix address-leak triggered by invalid byte-order.  Fixed by Andreas Schwab.
** On ia64, get_static_proc_name() no longer uses a weak reference to
   _Uelf64_get_proc_name(), since that was causing problems with archive
   libraries and no longer served any apparent purpose.  Fixed by
   Curt Wohlgemuth.

* News for v0.98.5:

** Fix a typo in the man-page of unw_create_addr_space().
** Fix an off-by-1 bug in the handling of the dynamic ALIAS directive
   for ia64.  Reported by Todd L. Miller.
** Fix a bug in libunwind-ptrace which could cause crash due to extraneous
   munmap() calls.

* News for v0.98.4:

** Fix a typo in _ReadSLEB.c which caused hangs when throwing exceptions
   from Intel ICC-compiled programs.  Reported by Tommy Hoffner.

* News for v0.98.3:

** Make it possible to link against libunwind-ia64.a only (i.e., without
   requiring libunwind.a as well).  This keeps apps which need only
   remote unwinding cleaner, since they logically have no dependency
   on libunwind.a.
** Dont link against libatomic_ops for now.  Due to a packaging bug on
   Debian, linking against this library causes libunwind.so to get
   a dependency on libatomic_ops.so, which is not at all what we want.
   Fortunately, we don't have to link against that library on x86 or
   ia64 since the library is strictly needed only for platforms with
   poor atomic operation support.  Once the libatomic_ops package is fixed,
   we can re-enable linking against libatomic_ops.

* News for v0.98.2:

** Fixed bug which caused _UPT_get_dyn_info_list_addr() to sometimes fail
   needlessly.  Found by Todd L. Miller.

** When using GCC to build libunwind on ia64, libunwind.so had an
   unresolved reference to __divdi3.  This is undesirable since it
   creates an implicit dependency on libgcc.  This problem has been
   fixed in the 0.98.2 release by explicitly linking against libgcc.a
   when building libunwind.

* News for v0.98.1:

** Fixed a bug which caused "make install" to install libunwind-common.h.in
   instead of libunwind-common.h.
** Fixed a bug in the ia64 {sig,}longjmp() which showed on
   SuSE Linux 9 because it's using a newer compiler & the EPC-based system
   call stubs.
** Fixed incorrect offsets in tests/ia64-test-nat-asm.S.
   Warning: you'll need a GNU assembler dated later than 21-Sep-2004 to
   get this file translated correctly.  With an old assembler, "make check"
   will get lots of failures when running Gia64-test-nat or Lia64-test-nat!
** Convert tests/bt into a full-blown test-case.  It's designed to
   trigger a (rarely-encountered) bug in the GNU assembler on ia64.
   The assembler has been fixed and once the libraries (libc etc)
   have been rebuilt, this test will pass.
** Added test-case tests/run-ptrace-misc which, on ia64, triggers a bug in
   current GCC (including v3.4.2) which causes bad unwind info.

* News for v0.98:

** Update libunwind to be compliant with the updated/expanded
   ia64 unwind specificiation by HJ Lu [1].  This is needed for
   GCC 3.4 compatibility.

   [1] http://www.kernel.org/pub/linux/devel/gcc/unwind/

** Initial support for x86-64 has been added courtesy of Max Asbock.
   Along with this came a bunch of DWARF2 unwinder fixes.

** A new rountine unw_strerror() has been added courtesy of
   Thomas Hallgren.

** Including <libunwind.h> now defines 4 macros that can be used
   to determine the version number of libunwind.  Specifically,
   UNW_VERSION_MAJOR, UNW_VERSION_MINOR, UNW_VERSION, and
   UNW_VERSION_CODE are defined by the header now.

** Bug fixes
*** Fix a memory-leak in _UPT_get_dyn_info_list_addr() courtesy of Ed Connell.
*** Fix a crash in libunwind-ptrace courtesy of Mark Young.
*** Fix a bug in ia64-version of unw_init_remote() which prevented
    it from working correctly for the local address space.  Reported by
    Troy Heber.
*** Many other small and not so small fixes.

* News for v0.97:

** unw_get_proc_name() may now be called from signal-handler.

** The ptrace-helper routines are now declared in libunwind-ptrace.h.
   Applications which use ptrace-based unwinding should include
   <libunwind-ptrace.h> to get the _UPT_*() routines declared.

** libunwind has been split into a "local-only" and a "generic" versions.
   The former is optimized for local unwinding (within a process) and
   is called libunwind.so (shared version) or libunwind.a (archive
   version).  The generic version is not limited to unwinding within a
   process and is called libunwind-generic.so (shared version)
   libunwind-generic.a (archive version).  Similarly, the ptrace()
   support has been separated out into a convenience library called
   libunwind-ptrace.a.  For the most part, backwards-compatibility
   is retained.  However, when building an application which uses
   libunwind, it may be necessary to change the linker command-line
   as shown in the table below:

    Application which does: Before v0.97:  With v0.97:
    ----------------------- -------------  -----------
    local unwinding only:   -lunwind       -lunwind
    remote unwinding:       -lunwind       -lunwind-generic
    cross unwinding:        -lunwind-PLAT  -lunwind-PLAT
    ptrace-based unwinding: -lunwind       -lunwind-ptrace -lunwind-generic

   The motivation for this splitting is to keep libunwind.so as minimal
   as possible.  This library will eventually be loaded by most (if not
   all) executables and hence it is important to ensure that it can
   be loaded as quickly as possible.

** unw_getcontext() tuned on IA-64.

   The unw_getcontext() routine used to be provided by (GNU) libc
   (getcontext()).  This caused unnecessary overhead (e.g., an
   unnecessary system-call to sigprocmask()).  The new
   unw_getcontext() only does the work really needed for libunwind and
   hence performs much better.  However, this change implies that
   programs linked against libunwind v0.97 won't be
   backwards-compatible with earlier versions (there would be an
   unresolved symbol for _Uia64_getcontext()).

** Fix NaT-bit handling on IA-64.

   New test-cases have been added to test the handling of the NaT bit
   (and floating-point NaT values) and all discovered/known bugs have
   been fixed.

** Initial DWARF-based unwinder for x86.

   There is a beginning for a DWARF-based unwinder for x86.  Work for
   x86-64-support based on this DWARF unwinder is currently underway
   at IBM and it is expected that this support will be merged into the
   official tree soon.


* News for v0.96:

** _Unwind_*() routines defined by the C++ ABI are now included in
   libunwind.


* News for v0.95:

** Bigger, better, faster, or so the theory goes.


* News for v0.93:

** More bug-fixes & improved HP-UX support.


* News for v0.92:

** Bug-fix release.  IA-64 unwinder can now be built with Intel compiler (ECC).


* News for v0.91:

** Lots of documentation updates
** Some portability fixes.


* News for v0.9:

** The libunwind API is mostly feature-complete at this point (hence the
   version jump from v0.2 to v0.9).


* News for v0.2:

** Automated configuration/build with autoconf and automake.
** Added support for building libunwind as a shared library.
** Added support for remote unwinding.
** Added support for cross-building.
** Added two new routines to the API:
	- unw_is_fpreg()
	- unw_get_save_loc()
** Added multi-architecture supports (lets a single application use
   the unwind libraries for multiple target architectures; this is useful,
   e.g., useful for building a debugger that can support multiple targets
   such as x86, ia64, etc.)


* News for v0.1:

** Added support for exception handling.


* News for v0.0:

** It's a brand new package.
