Skip to content

Commit 8fed387

Browse files
[libunwind] Add unw_strerror function
Co-authored-by: Randy Eckenrode <randy@largeandhighquality.com>
1 parent d91e5c3 commit 8fed387

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

libunwind/include/libunwind.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ extern int unw_get_fpreg(unw_cursor_t *, unw_regnum_t, unw_fpreg_t *) LIBUNWIND_
114114
extern int unw_set_reg(unw_cursor_t *, unw_regnum_t, unw_word_t) LIBUNWIND_AVAIL;
115115
extern int unw_set_fpreg(unw_cursor_t *, unw_regnum_t, unw_fpreg_t) LIBUNWIND_AVAIL;
116116
extern int unw_resume(unw_cursor_t *) LIBUNWIND_AVAIL;
117+
extern const char *unw_strerror(int) LIBUNWIND_AVAIL;
117118

118119
#ifdef __arm__
119120
/* Save VFP registers in FSTMX format (instead of FSTMD). */

libunwind/src/libunwind.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,40 @@ _LIBUNWIND_HIDDEN int __unw_is_signal_frame(unw_cursor_t *cursor) {
260260
}
261261
_LIBUNWIND_WEAK_ALIAS(__unw_is_signal_frame, unw_is_signal_frame)
262262

263+
_LIBUNWIND_HIDDEN const char *__unw_strerror(int error_code) {
264+
switch (error_code) {
265+
case UNW_ESUCCESS:
266+
return "no error";
267+
case UNW_EUNSPEC:
268+
return "unspecified (general) error";
269+
case UNW_ENOMEM:
270+
return "out of memory";
271+
case UNW_EBADREG:
272+
return "bad register number";
273+
case UNW_EREADONLYREG:
274+
return "attempt to write read-only register";
275+
case UNW_ESTOPUNWIND:
276+
return "stop unwinding";
277+
case UNW_EINVALIDIP:
278+
return "invalid IP";
279+
case UNW_EBADFRAME:
280+
return "bad frame";
281+
case UNW_EINVAL:
282+
return "unsupported operation or bad value";
283+
case UNW_EBADVERSION:
284+
return "unwind info has unsupported version";
285+
case UNW_ENOINFO:
286+
return "no unwind info found";
287+
#if defined(_LIBUNWIND_TARGET_AARCH64) && !defined(_LIBUNWIND_IS_NATIVE_ONLY)
288+
case UNW_ECROSSRASIGNING:
289+
return "cross unwind with return address signing";
290+
#endif
291+
default:
292+
return "unknown error occurred";
293+
}
294+
}
295+
_LIBUNWIND_WEAK_ALIAS(__unw_strerror, unw_strerror)
296+
263297
#ifdef _AIX
264298
_LIBUNWIND_EXPORT uintptr_t __unw_get_data_rel_base(unw_cursor_t *cursor) {
265299
_LIBUNWIND_TRACE_API("unw_get_data_rel_base(cursor=%p)",

libunwind/src/libunwind_ext.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ extern int __unw_get_fpreg(unw_cursor_t *, unw_regnum_t, unw_fpreg_t *);
3131
extern int __unw_set_reg(unw_cursor_t *, unw_regnum_t, unw_word_t);
3232
extern int __unw_set_fpreg(unw_cursor_t *, unw_regnum_t, unw_fpreg_t);
3333
extern int __unw_resume(unw_cursor_t *);
34+
extern const char *__unw_strerror(int);
3435

3536
#ifdef __arm__
3637
/* Save VFP registers in FSTMX format (instead of FSTMD). */

0 commit comments

Comments
 (0)