Commit Graph

156 Commits

Author SHA1 Message Date
Peter Smith 7f6e910745 [libunwind] Always use unwind tables in tests
For many targets setting -fno-exceptions will prevent unwinding tables from
being generated for the test programs. As libunwind depends on the tables to
unwind the stack several tests will fail.

This change always adds -funwind-tables so that even when -fno-exceptions
is set unwind tables are generated.

fixes PR33858

Differential Revision: https://reviews.llvm.org/D37484

llvm-svn: 316657
2017-10-26 12:02:03 +00:00
Martin Storsjo dd45ea16f3 Fix the context/cursor size for ARM with WMMX enabled
This was missed in SVN r274744 when the WMMX part was made optional;
when made optional, some struct fields were reordered, which caused
the total struct size to grow due to padding/alignment.

llvm-svn: 316559
2017-10-25 08:07:19 +00:00
Martin Storsjo d3abd15d8c Add missing checks for register number
Most other cases that touch savedRegisters[reg] have got this check,
but these three seemed to lack it.

Differential Revision: https://reviews.llvm.org/D39206

llvm-svn: 316415
2017-10-24 07:16:40 +00:00
Martin Storsjo ed4a317c55 Abstract rwlocks into a class, provide a SRW lock implementation for windows
This requires _WIN32_WINNT >= 0x0600.

If someone wants to spend effort on supporting earlier versions,
one can easily add another fallback implementation based on
critical sections, or try to load SRW lock functions dynamically.

This makes sure that the FDE cache is thread safe on windows.

Differential Revision: https://reviews.llvm.org/D38704

llvm-svn: 316364
2017-10-23 19:29:36 +00:00
Martin Storsjo c5115b9e65 Make HIDDEN_DIRECTIVE a function-like macro. NFCI.
This avoids a hack for making it a no-op for windows.

Also explicitly check for _WIN32 instead of assuming it.

Differential Revision: https://reviews.llvm.org/D39156

llvm-svn: 316300
2017-10-22 19:39:26 +00:00
Saleem Abdulrasool f7596ece76 GNU: do not read the FDE count if omitted
If there is no binary search table computed, the FDECount encoding is
DW_EH_PE_omit.  Do not attempt to read the FDECount in such a situation
as we will read an incorrect value.  binutils only writes out the
FDECount if the encoding is not DW_EH_PE_omit.

llvm-svn: 316224
2017-10-20 18:47:35 +00:00
Ed Maste 48652257bb libunwind: document tested FreeBSD configs and sort OS list
libunwind is known to work on FreeBSD i386, amd64 (x86_64) and arm64.
It is the unwinder provided by the base system on all of those
architectures.

While here sort the OS list.

Differential Revision:	https://reviews.llvm.org/D38900

llvm-svn: 315814
2017-10-14 17:04:04 +00:00
Martin Storsjo 210d9f43a3 Support DWARF unwinding on i386 windows
In practice, with code built with clang, there are still unresolved
issues with DW_CFA_GNU_args_size though.

Differential Revision: https://reviews.llvm.org/D38679

llvm-svn: 315498
2017-10-11 20:06:18 +00:00
Martin Storsjo b03f480c8d [docs] Mention that linux/arm64 is supported with DWARF
llvm-svn: 315497
2017-10-11 20:06:07 +00:00
Martin Storsjo 30df03b57e [docs] Mention that SjLj works on any OS on the archs where supported by the compiler
Differential Revision: https://reviews.llvm.org/D38576

llvm-svn: 315090
2017-10-06 19:14:07 +00:00
Saleem Abdulrasool 5b93ea3b9f build: use POSITION_INDEPENDENT_CODE instead of -fPIC
Rather than hardcode the flag and check if the compiler supports it, use
the CMake property to get the right flag spelling for the compiler.
This makes it generally more portable.

llvm-svn: 314834
2017-10-03 20:22:26 +00:00
Martin Storsjo 3a213316e9 Add CMake support for building for MinGW
This section is similar to what already exists in libcxx and libcxxabi.

Differential Revision: https://reviews.llvm.org/D38380

llvm-svn: 314716
2017-10-02 20:46:37 +00:00
Martin Storsjo cbb415128e Fix building on macOS after SVN r314492
That commit incorrectly expanded the assumption that defined(__APPLE__)
implies SjLj exception handling, which only is true within ARM
code sections.

llvm-svn: 314695
2017-10-02 18:14:06 +00:00
Martin Storsjo 59a5004984 SjLj: Fix building after SVN r314632
The code moved from Unwind_AppleExtras.cpp to Unwind-sjlj.c needed
a few minor modifications to build as C instead of C++.

llvm-svn: 314635
2017-10-01 20:22:40 +00:00
Saleem Abdulrasool 9ebbda838f SjLj: make the SjLj implementation more portable
This moves the definition of the internal helpers
`__Unwind_SjLj_GetTopOfFunctionStack` and
`__Unwind_SjLj_SetTopOfFunctionStack` into `Unwind-sjlj.c`.  These are
not extra functions specific to Apple, but rather are internal
implementation details of SjLj support in the LLVM libunwind
implementation.

This allows us to remove the internal header unwind_ext.h, as these
functions are not meant to be used as SPI either.  Because they are
static, they will be given implicit hidden visibility, but due to the
simplicity should get fully inlined into the actual use.

Use the C11 standard static TLS annotation (`_Thread_local`) if
possible, otherwise, use the Windows specific `__declspec(thread)` when
targeting Windows or the GNU `__thread` extension.  In theory, it should
be possible for this implementation to use a `pthread_setspecific` and
`pthread_getspecific` on platforms with pthreads or `SetFlsValue` and
`GetFlsValue` on Windows for non-static TLS.  However, static TLS tends
to be significantly faster, so we really should prefer that over the
dynamic TLS approach.  On Apple environments, when not building for the
loader (dyld), use the pre-allocated TLS slot in the loader rather than
the local static TLS variable.

Note that the un-threaded support of libunwind is still present as
before, however, it is unsafe to use in a threaded environment as the
cleanup stack may be mutated incorrectly due to lack of locking across
threads.  In the static TLS model, the lock is unneeded as each thread
of execution retains its own copy of the cleanup stack.

Take the opportunity to clean up the comment block, removing the iOS
specific note as the SjLj implementation can be used outside of the
context of iOS.  Convert the rest of the explanation to a doxygen style
comment block.

llvm-svn: 314632
2017-10-01 20:06:48 +00:00
Martin Storsjo c2ec6ce65c Skip building x86 parts of UnwindRegisters*.S when targeting SjLj
This extends SVN r314197 from the arm parts to the whole file.

Differential Revision: https://reviews.llvm.org/D38381

llvm-svn: 314492
2017-09-29 06:09:09 +00:00
Martin Storsjo b51c49aa52 Skip building unused parts when targeting SJLJ
When SJLJ exceptions are used, those functions aren't used.

This fixes build failures on ARM with SJLJ enabled (e.g. on armv7/iOS)
when built using the CMake project files.

Differential Revision: https://reviews.llvm.org/D38249

llvm-svn: 314197
2017-09-26 08:07:26 +00:00
Martin Storsjo 3b6ea6a4e2 Correct data types in the _Unwind_FunctionContext struct
This makes it match the definition used within llvm and in libgcc,
we previously got the wrong layout in 64 bit environments.

Differential Revision: https://reviews.llvm.org/D38247

llvm-svn: 314196
2017-09-26 08:07:17 +00:00
John Baldwin d51d38f6f9 [libunwind] Partially revert r297174 to fix build on at least FreeBSD.
The changes in r297174 moved the #include of <link.h> on FreeBSD (and
probably other systems) inside of the open 'libunwind' namespace
causing various system-provided types such as pid_t to be declared in
this namespace rather than the global namespace.  Fix this by moving
the relevant declarations before the 'libunwind' namespace is opened,
but still using the cleaned up declarations from r297174.

Reviewed By: ed, compnerd

Differential Revision: https://reviews.llvm.org/D38108

llvm-svn: 313920
2017-09-21 21:28:48 +00:00
Martin Storsjo dbf17cf048 Fix a typo in the documentation. NFC.
llvm-svn: 313470
2017-09-16 20:52:05 +00:00
Alex Lorenz 341317fda4 Revert r312240
The buildbots have shown that -Wstrict-prototypes behaves differently in GCC
and Clang so we should keep it disabled until Clang follows GCC's behaviour

llvm-svn: 312246
2017-08-31 15:51:23 +00:00
Alex Lorenz fbac1ae062 Build LLVM with -Wstrict-prototypes enabled
Clang 5 supports -Wstrict-prototypes. We should use it to catch any C
declarations that declare a non-prototype function.

rdar://33705313

Differential Revision: https://reviews.llvm.org/D36669

llvm-svn: 312240
2017-08-31 13:23:24 +00:00
Saleem Abdulrasool f8774f1d73 ARM: explicitly specify the 8-byte alignment
It seems that GCC interprets `__attribute__((__aligned__))` as 8-byte
alignment on ARM, but clang does not.  Explicitly specify the
double-word alignment value to ensure that the structure is properly
aligned.

llvm-svn: 311574
2017-08-23 16:50:27 +00:00
Saleem Abdulrasool 5b389f1cf7 unwind: explicitly align `_Unwind_Control_Block`
The C++ ABI requires that the exception object is double-word aligned.
The alignment attribute was applied to the `_Unwind_Exception` type
which is used on non-EHABI targets.  On EHABI, the exception object type
is `_Unwind_Control_Block`.  Apply the explicit maximal alignment on the
type to ensure that the allocation has the correct alignment.

Resolves PR33858!

llvm-svn: 311562
2017-08-23 15:33:45 +00:00
Petr Hosek 7ec1a56baf [CMake] Allow overriding lib dir suffix independently from LLVM
This matches the options already supported by libc++ and libc++abi.

Differential Revision: https://reviews.llvm.org/D36383

llvm-svn: 310327
2017-08-08 00:37:59 +00:00
Jonathan Roelofs 2cfff07a42 Partial fix for PR33858
https://reviews.llvm.org/D35848

llvm-svn: 309147
2017-07-26 18:13:57 +00:00
Momchil Velikov 81806c5d4d [libunwind] Handle .ARM.exidx tables without sentinel last entry
UnwindCursor<A, R>::getInfoFromEHABISection assumes the last
entry in the index table never corresponds to a real function.
Indeed, GNU ld always inserts an EXIDX_CANTUNWIND entry,
containing the end of the .text section. However, the EHABI specification
(http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf)
does not seem to contain text that requires the presence of a sentinel entry.
In that sense the libunwind implementation isn't compliant with the specification.

This patch makes getInfoFromEHABISection examine the last entry in the index
table if upper_bound returns the end iterator.

Fixes https://bugs.llvm.org/show_bug.cgi?id=31091

Differential revision: https://reviews.llvm.org/D35265

llvm-svn: 308871
2017-07-24 09:19:32 +00:00
Hans Wennborg 050b2cd1df Bump docs version to 6.0
llvm-svn: 308465
2017-07-19 13:49:39 +00:00
Petr Hosek 4158131512 [CMake] Set library dir to be LLVM's intermediate output dir
This matches the behavior of libc++abi and libc++ and ensures that
we get a working toolchain when building libunwind as part of LLVM.

Differential Revision: https://reviews.llvm.org/D34375

llvm-svn: 308380
2017-07-18 21:30:18 +00:00
Petr Hosek 8bb0f6ec88 [libunwind][CMake] Add install path variable to allow overriding the destination
This is going to be used by the runtime build in the multi-target
setup to allow using different install prefix for each target.

Differential Revision: https://reviews.llvm.org/D33760

llvm-svn: 307606
2017-07-11 01:12:09 +00:00
Jonathan Roelofs 6e50d93afc Add a test harness
Mostly cargo-culted from libcxxabi, since the unwinder was forked from there in
the first place. There may still be cruft that's only applicable to libcxxabi,
but that can be addressed in-tree.

https://reviews.llvm.org/D35038

llvm-svn: 307266
2017-07-06 15:20:12 +00:00
Nico Weber 205519b97e [libunwind] Add _LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS
It's useful to be able to disable visibility annotations entirely; for
example, if we're building libunwind static to include in another library,
and we don't want any libunwind functions getting exported out of that
library.

https://reviews.llvm.org/D34637
Patch from Thomas Anderson <thomasanderson@chromium.org>!

llvm-svn: 306442
2017-06-27 18:37:06 +00:00
Marshall Clow 04ff3b15fa Change -1LL to -1ULL to silence a gcc warning about left shifting a negative value. Fixes https://bugs.llvm.org/show_bug.cgi?id=33358
llvm-svn: 305924
2017-06-21 16:02:53 +00:00
Manoj Gupta 2cbfd2506a [libunwind] Fix executable stack directive on Linux.
Summary:
Disable executable stack on Linux. Also remove redundant Android check
as it is covered by Android.

Reviewers: phosek, compnerd, rs, rmaprath, EricWF, krytarowski

Reviewed By: krytarowski

Subscribers: srhines, llvm-commits, krytarowski

Differential Revision: https://reviews.llvm.org/D33217

llvm-svn: 303206
2017-05-16 20:18:57 +00:00
Petr Hosek 9ad496b2c8 [CMake][libunwind] Fix the -target and -gcc-toolchain flag handling
CMake has the problem with the single dash variant because of the
space, so use the double dash with equal sign version. The compile
flag handling had a typo which caused these flag not to be properly
include. We also don't have to pass the target triple when checking
for compiler-rt since that flag is already included in compile flags
now.

Differential Revision: https://reviews.llvm.org/D32071

llvm-svn: 300419
2017-04-16 06:08:44 +00:00
Petr Hosek 57d49236cc Reland "[CMake][libunwind] Use -nodefaultlibs for CMake checks"
This is a reland of commit r299796.

Turned out that we need gcc_s or compiler-rt on ARM when checking
the support for -funwind-tables which creates a dependency on
__aeabi_unwind_cpp_pr0 symbol that's provided by the compiler
runtime.

Differential Revision: https://reviews.llvm.org/D31858

llvm-svn: 300020
2017-04-12 02:28:07 +00:00
Petr Hosek df82d93562 Revert "[CMake][libunwind] Use -nodefaultlibs for CMake checks"
This reverts commit r299796.

llvm-svn: 299798
2017-04-07 20:24:22 +00:00
Petr Hosek 3dc83e5e31 [CMake][libunwind] Use -nodefaultlibs for CMake checks
Since libunwind is built with -nodefaultlibs, we should be using this
option even for CMake checks to avoid any inconsistency and also to
avoid dependency on a working C++ standard library just for the setting
up the build itself. The implementation is largely similar to the one
used by libc++.

Differential Revision: https://reviews.llvm.org/D31640

llvm-svn: 299796
2017-04-07 20:10:29 +00:00
Ivan Krasin d44b262337 Fix unused typedef. Follow up to r299575.
llvm-svn: 299666
2017-04-06 17:35:35 +00:00
Saleem Abdulrasool 5c18b4406e AddressSpace: fix DWARF based unwinding handling on Android
It is possible that there are no program headers in the module.  Do not
attempt to dereference nullptr as a program header.

llvm-svn: 299591
2017-04-05 21:29:38 +00:00
Saleem Abdulrasool 9ac2cc7812 Fix invalid memory access on android x86
On certain versions of android x86, the main module `app_process` is not
built as PIE.  When accessing the PT_GNU_EH_FRAME_HDR in such a
scenario, the `dlpi_addr` is 0, but the virtual address is not
relocated.  Manually rebase the address to avoid an invalid memory
access.

llvm-svn: 299575
2017-04-05 18:33:23 +00:00
Jonathan Roelofs 978da1f4f6 Try to trigger the new docs builder. NFC
llvm-svn: 299381
2017-04-03 19:23:11 +00:00
Ranjeet Singh 5808011bd9 [libunwind] Clean up macro usage.
Convention in libunwind is to use !defined(FOOT) not !FOO.

Differential Revision: https://reviews.llvm.org/D31078

llvm-svn: 299225
2017-03-31 15:28:06 +00:00
Jonathan Roelofs af9d03aafa [libunwind] Add sphinx docs
https://reviews.llvm.org/D31375

llvm-svn: 298922
2017-03-28 15:21:43 +00:00
Saleem Abdulrasool 01cf8d3348 DarwinParser: include limits
In debug mode, we have assertions that the values do not exceed the
limits of the type holding them.  In order to account for the type being
derived from the AddressSpace and thus a typedef, we use
`std::numeric_limits`.  Include the appropriate header.

Thanks to Marshal Clow for pointing out the missing include!

llvm-svn: 297744
2017-03-14 15:17:55 +00:00
Ed Schouten e2de03fd7d Fix up the places where AddressSpace.hpp is included.
The AddressSpace.hpp header declares two classes: LocalAddressSpace and
RemoteAddressSpace. These classes are only used in a very small number
of source files, but passed in as template arguments to many other
classes.

Let's go ahead and only include AddressSpace.hpp in source files where
at least one of these two classes is mentioned. This gets rid of a
cyclic header dependency that was already present, but only caused
breakage on macOS until recently.

Reported by:	Marshall Clow

llvm-svn: 297364
2017-03-09 08:04:07 +00:00
Saleem Abdulrasool e3baf13f8e DARWF: silence some warnings about conversions
Add a check for an overflow and explicitly cast the value.  We would
have silently overflowed previously.

llvm-svn: 297291
2017-03-08 16:03:27 +00:00
Ed Schouten 124472ce6f Tidy up the way we include EHHeaderParser.hpp.
Other source files in the source tree tend to include this header file
unconditionally. It also parses perfectly fine on ARM EHABI systems.

llvm-svn: 297175
2017-03-07 18:21:51 +00:00
Ed Schouten 3e29e7415e Improve readability and correctness of the OS specific libunwind bits.
All of the access to __exidx_*, dl_iterate_phdr(), etc. is specific to
the findUnwindSections() function. Right now all of the includes and
declarations related to them are scattered throughout the source file.
For example, for <link.h>, we have a full list of operating systems
guarding the #include, even though the code that uses dl_iterate_phdr()
miraculously doesn't use the same list.

Change the code so that findUnwindSections() is preceded by a block of
#ifdefs that share the same structure as the function itself. First
comes all of the macOS specific bits, followed by bare-metal ARM,
followed by ELF EHABI + DWARF.

This actually allows us to build a copy of libunwind without any
specific ifdefs for NetBSD, CloudABI, etc. It likely also unbreaks the
build of libunwind on FreeBSD/armv6, though I can't confirm.

Reviewed by:	compnerd
Differential Revision:	https://reviews.llvm.org/D30696

llvm-svn: 297174
2017-03-07 18:15:52 +00:00
Ed Schouten 4dd1292c3e Let arm_section_length store the number of bytes.
Exception section data that we extract for DWARF gets stored as the
offset and the number of bytes. For ARM exception info, we seem to
deviate from this by storing the number of entries. Attempt to make this
more consistent.

By storing the number of bytes, we can get rid of the EHTEntry structure
declared in AddressSpace.hpp. In UnwindCursor.hpp we already have
another structure declared for the same purpose.

Reviewed by:	Keith Walker
Differential Revision:	https://reviews.llvm.org/D30681

llvm-svn: 297149
2017-03-07 15:21:57 +00:00