[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