[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