[libcxxabi] r228903 - unwind: move exported APIs out of header

Logan Chien tzuhsiang.chien at gmail.com
Sat Mar 14 08:43:09 PDT 2015


Hi Saleem,

Similar change has been committed and reverted (see r219629 and r226818.)

This change WILL BREAK the libc++abi + libgcc build.  With this change, the
libc++abi shared library will come with undefined references to
_Unwind_{Get,Set}{IP,GR}, which are not available in libgcc.

AFAICT, these functions are not a part of public interface of ARM EHABI.
The only documented public interface is _Unwind_VRS_Get/_Unwind_VRS_Set.
Even though, most existing implementations, including the unwind.h shipped
with gcc and clang, define these inline functions.  But none of them will
lead to an external reference to _Unwind_{Get,Set}{IP,GR}.

Would you mind to revert this change?  Or, is there any other situation,
which requires this change, that I haven't considered?  Thanks.

Sincerely,
Logan


On Thu, Feb 12, 2015 at 12:25 PM, Saleem Abdulrasool <compnerd at compnerd.org>
wrote:

> Author: compnerd
> Date: Wed Feb 11 22:25:03 2015
> New Revision: 228903
>
> URL: http://llvm.org/viewvc/llvm-project?rev=228903&view=rev
> Log:
> unwind: move exported APIs out of header
>
> Ideally, we would do something like inline __declspec(dllexport) to ensure
> that
> the symbol was inlined within libunwind as well as emitted into the final
> DSO.
> This simply moves the definition out of the header to ensure that the
> *public*
> interfaces are defined and exported into the final DSO.
>
> This change also has "gratuitous" code movement so that the EHABI and
> generic
> implementations are co-located making it easier to find them.
>
> The movement from the header has one minor change introduced into the code:
> additional tracing to mirror the behaviour of the non-EHABI interfaces.
>
> Modified:
>     libcxxabi/trunk/include/unwind.h
>     libcxxabi/trunk/src/Unwind/UnwindLevel1.c
>
> Modified: libcxxabi/trunk/include/unwind.h
> URL:
> http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/include/unwind.h?rev=228903&r1=228902&r2=228903&view=diff
>
> ==============================================================================
> --- libcxxabi/trunk/include/unwind.h (original)
> +++ libcxxabi/trunk/include/unwind.h Wed Feb 11 22:25:03 2015
> @@ -202,37 +202,13 @@ extern _Unwind_VRS_Result
>  _Unwind_VRS_Pop(_Unwind_Context *context, _Unwind_VRS_RegClass regclass,
>                  uint32_t discriminator,
>                  _Unwind_VRS_DataRepresentation representation);
> +#endif
>
> -static inline uintptr_t _Unwind_GetGR(struct _Unwind_Context* context,
> -                                      int index) {
> -  uintptr_t value = 0;
> -  _Unwind_VRS_Get(context, _UVRSC_CORE, (uint32_t)index, _UVRSD_UINT32,
> &value);
> -  return value;
> -}
> -
> -static inline void _Unwind_SetGR(struct _Unwind_Context* context, int
> index,
> -                                 uintptr_t new_value) {
> -  _Unwind_VRS_Set(context, _UVRSC_CORE, (uint32_t)index,
> -                  _UVRSD_UINT32, &new_value);
> -}
> -
> -static inline uintptr_t _Unwind_GetIP(struct _Unwind_Context* context) {
> -  // remove the thumb-bit before returning
> -  return (_Unwind_GetGR(context, 15) & (~(uintptr_t)0x1));
> -}
> -
> -static inline void _Unwind_SetIP(struct _Unwind_Context* context,
> -                                 uintptr_t new_value) {
> -  uintptr_t thumb_bit = _Unwind_GetGR(context, 15) & ((uintptr_t)0x1);
> -  _Unwind_SetGR(context, 15, new_value | thumb_bit);
> -}
> -#else
>  extern uintptr_t _Unwind_GetGR(struct _Unwind_Context *context, int
> index);
>  extern void _Unwind_SetGR(struct _Unwind_Context *context, int index,
>                            uintptr_t new_value);
>  extern uintptr_t _Unwind_GetIP(struct _Unwind_Context *context);
>  extern void _Unwind_SetIP(struct _Unwind_Context *, uintptr_t new_value);
> -#endif
>
>  extern uintptr_t _Unwind_GetRegionStart(struct _Unwind_Context *context);
>  extern uintptr_t
>
> Modified: libcxxabi/trunk/src/Unwind/UnwindLevel1.c
> URL:
> http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/Unwind/UnwindLevel1.c?rev=228903&r1=228902&r2=228903&view=diff
>
> ==============================================================================
> --- libcxxabi/trunk/src/Unwind/UnwindLevel1.c (original)
> +++ libcxxabi/trunk/src/Unwind/UnwindLevel1.c Wed Feb 11 22:25:03 2015
> @@ -422,10 +422,73 @@ _Unwind_GetLanguageSpecificData(struct _
>  }
>
>
> +/// Called by personality handler during phase 2 to find the start of the
> +/// function.
> +_LIBUNWIND_EXPORT uintptr_t
> +_Unwind_GetRegionStart(struct _Unwind_Context *context) {
> +  unw_cursor_t *cursor = (unw_cursor_t *)context;
> +  unw_proc_info_t frameInfo;
> +  uintptr_t result = 0;
> +  if (unw_get_proc_info(cursor, &frameInfo) == UNW_ESUCCESS)
> +    result = (uintptr_t)frameInfo.start_ip;
> +  _LIBUNWIND_TRACE_API("_Unwind_GetRegionStart(context=%p) => 0x%"
> PRIxPTR "\n",
> +                       (void *)context, result);
> +  return result;
> +}
> +
> +
> +/// Called by personality handler during phase 2 if a foreign exception
> +// is caught.
> +_LIBUNWIND_EXPORT void
> +_Unwind_DeleteException(_Unwind_Exception *exception_object) {
> +  _LIBUNWIND_TRACE_API("_Unwind_DeleteException(ex_obj=%p)\n",
> +                       (void *)exception_object);
> +  if (exception_object->exception_cleanup != NULL)
> +    (*exception_object->exception_cleanup)(_URC_FOREIGN_EXCEPTION_CAUGHT,
> +                                           exception_object);
> +}
> +
> +#endif // _LIBUNWIND_BUILD_ZERO_COST_APIS && !LIBCXXABI_ARM_EHABI
> +
> +#if LIBCXXABI_ARM_EHABI
> +
> +_LIBUNWIND_EXPORT uintptr_t
> +_Unwind_GetGR(struct _Unwind_Context *context, int index) {
> +  uintptr_t value = 0;
> +  _Unwind_VRS_Get(context, _UVRSC_CORE, (uint32_t)index, _UVRSD_UINT32,
> &value);
> +  _LIBUNWIND_TRACE_API("_Unwind_GetGR(context=%p, reg=%d) => 0x%" PRIx64
> "\n",
> +                       (void *)context, index, (uint64_t)value);
> +  return value;
> +}
> +
> +_LIBUNWIND_EXPORT void _Unwind_SetGR(struct _Unwind_Context *context, int
> index,
> +                                     uintptr_t value) {
> +  _LIBUNWIND_TRACE_API("_Unwind_SetGR(context=%p, reg=%d,
> value=0x%0"PRIx64")\n",
> +                       (void *)context, index, (uint64_t)value);
> +  _Unwind_VRS_Set(context, _UVRSC_CORE, (uint32_t)index, _UVRSD_UINT32,
> &value);
> +}
> +
> +_LIBUNWIND_EXPORT uintptr_t _Unwind_GetIP(struct _Unwind_Context
> *context) {
> +  // remove the thumb-bit before returning
> +  uintptr_t value = _Unwind_GetGR(context, 15) & (~(uintptr_t)0x1);
> +  _LIBUNWIND_TRACE_API("_Unwind_GetIP(context=%p) => 0x%" PRIx64 "\n",
> +                       (void *)context, (uint64_t)value);
> +  return value;
> +}
> +
> +_LIBUNWIND_EXPORT void _Unwind_SetIP(struct _Unwind_Context *context,
> +                                     uintptr_t value) {
> +  _LIBUNWIND_TRACE_API("_Unwind_SetIP(context=%p, value=0x%0" PRIx64
> ")\n",
> +                       (void *)context, (uint64_t)value);
> +  uintptr_t thumb_bit = _Unwind_GetGR(context, 15) & ((uintptr_t)0x1);
> +  _Unwind_SetGR(context, 15, value | thumb_bit);
> +}
> +
> +#else
>
>  /// Called by personality handler during phase 2 to get register values.
> -_LIBUNWIND_EXPORT uintptr_t _Unwind_GetGR(struct _Unwind_Context *context,
> -                                          int index) {
> +_LIBUNWIND_EXPORT uintptr_t
> +_Unwind_GetGR(struct _Unwind_Context *context, int index) {
>    unw_cursor_t *cursor = (unw_cursor_t *)context;
>    unw_word_t result;
>    unw_get_reg(cursor, index, &result);
> @@ -434,20 +497,16 @@ _LIBUNWIND_EXPORT uintptr_t _Unwind_GetG
>    return (uintptr_t)result;
>  }
>
> -
> -
>  /// Called by personality handler during phase 2 to alter register values.
>  _LIBUNWIND_EXPORT void _Unwind_SetGR(struct _Unwind_Context *context, int
> index,
> -                                     uintptr_t new_value) {
> +                                     uintptr_t value) {
>    _LIBUNWIND_TRACE_API("_Unwind_SetGR(context=%p, reg=%d, value=0x%0"
> PRIx64
>                         ")\n",
> -                       (void *)context, index, (uint64_t)new_value);
> +                       (void *)context, index, (uint64_t)value);
>    unw_cursor_t *cursor = (unw_cursor_t *)context;
> -  unw_set_reg(cursor, index, new_value);
> +  unw_set_reg(cursor, index, value);
>  }
>
> -
> -
>  /// Called by personality handler during phase 2 to get instruction
> pointer.
>  _LIBUNWIND_EXPORT uintptr_t _Unwind_GetIP(struct _Unwind_Context
> *context) {
>    unw_cursor_t *cursor = (unw_cursor_t *)context;
> @@ -458,44 +517,16 @@ _LIBUNWIND_EXPORT uintptr_t _Unwind_GetI
>    return (uintptr_t)result;
>  }
>
> -
> -
>  /// Called by personality handler during phase 2 to alter instruction
> pointer,
>  /// such as setting where the landing pad is, so _Unwind_Resume() will
>  /// start executing in the landing pad.
>  _LIBUNWIND_EXPORT void _Unwind_SetIP(struct _Unwind_Context *context,
> -                                     uintptr_t new_value) {
> +                                     uintptr_t value) {
>    _LIBUNWIND_TRACE_API("_Unwind_SetIP(context=%p, value=0x%0" PRIx64
> ")\n",
> -                       (void *)context, (uint64_t)new_value);
> +                       (void *)context, (uint64_t)value);
>    unw_cursor_t *cursor = (unw_cursor_t *)context;
> -  unw_set_reg(cursor, UNW_REG_IP, new_value);
> +  unw_set_reg(cursor, UNW_REG_IP, value);
>  }
>
> +#endif
>
> -/// Called by personality handler during phase 2 to find the start of the
> -/// function.
> -_LIBUNWIND_EXPORT uintptr_t
> -_Unwind_GetRegionStart(struct _Unwind_Context *context) {
> -  unw_cursor_t *cursor = (unw_cursor_t *)context;
> -  unw_proc_info_t frameInfo;
> -  uintptr_t result = 0;
> -  if (unw_get_proc_info(cursor, &frameInfo) == UNW_ESUCCESS)
> -    result = (uintptr_t)frameInfo.start_ip;
> -  _LIBUNWIND_TRACE_API("_Unwind_GetRegionStart(context=%p) => 0x%"
> PRIxPTR "\n",
> -                       (void *)context, result);
> -  return result;
> -}
> -
> -
> -/// Called by personality handler during phase 2 if a foreign exception
> -// is caught.
> -_LIBUNWIND_EXPORT void
> -_Unwind_DeleteException(_Unwind_Exception *exception_object) {
> -  _LIBUNWIND_TRACE_API("_Unwind_DeleteException(ex_obj=%p)\n",
> -                       (void *)exception_object);
> -  if (exception_object->exception_cleanup != NULL)
> -    (*exception_object->exception_cleanup)(_URC_FOREIGN_EXCEPTION_CAUGHT,
> -                                           exception_object);
> -}
> -
> -#endif // _LIBUNWIND_BUILD_ZERO_COST_APIS && !LIBCXXABI_ARM_EHABI
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150314/c06e83e3/attachment.html>


More information about the cfe-commits mailing list