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

Saleem Abdulrasool compnerd at compnerd.org
Mon Mar 16 19:34:01 PDT 2015


On Sat, Mar 14, 2015 at 8:43 AM, Logan Chien <tzuhsiang.chien at gmail.com>
wrote:

> 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}.
>

They aren't part of the EHABI, but are part of the Unwind (public)
interfaces.  I do think that they need to be made available, even if in an
alternate form.  Why would libc++abi have undefined references, it it
doesn't use the functions?


> 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
>>
>
>


-- 
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150316/41466bc0/attachment.html>


More information about the cfe-commits mailing list