From: Nick Alcock Date: Thu, 24 Apr 2025 13:20:28 +0000 (+0100) Subject: libctf, include: debuggability improvements X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7bcd444b9c9c5e68cd18472d1f4d924144546026;p=thirdparty%2Fbinutils-gdb.git libctf, include: debuggability improvements When --enable-libctf-hash-debugging is on, make ctf_set_errno and ctf_set_typed_errno into real functions, not inlines, so you can drop breakpoints on them. Since we are breaking API, also move ECTF_NEXT_END to the start of the _CTF_ERRORS array, so you can check for real (non-ECTF_NEXT_END) errors in breakpooints on those functions by checking for err > 1000. --- diff --git a/include/ctf-api.h b/include/ctf-api.h index 2554c275460..5ca8e76231f 100644 --- a/include/ctf-api.h +++ b/include/ctf-api.h @@ -183,7 +183,8 @@ typedef struct ctf_snapshot_id and _CTF_ITEM to expand as you like, then mention the macro name. See the enum after this for an example. */ #define _CTF_ERRORS \ - _CTF_FIRST (ECTF_FMT, "File is not in CTF or ELF format.") \ + _CTF_FIRST (ECTF_NEXT_END, "End of iteration.") \ + _CTF_ITEM (ECTF_FMT, "File is not in CTF or ELF format.") \ _CTF_ITEM (ECTF_BFDERR, "BFD error.") \ _CTF_ITEM (ECTF_CTFVERS, "CTF dict version is too new for libctf.") \ _CTF_ITEM (ECTF_BFD_AMBIGUOUS, "Ambiguous BFD target.") \ @@ -233,7 +234,6 @@ typedef struct ctf_snapshot_id _CTF_ITEM (ECTF_NOTYET, "Feature not yet implemented.") \ _CTF_ITEM (ECTF_INTERNAL, "Internal error: assertion failure.") \ _CTF_ITEM (ECTF_NONREPRESENTABLE, "Type not representable in CTF.") \ - _CTF_ITEM (ECTF_NEXT_END, "End of iteration.") \ _CTF_ITEM (ECTF_NEXT_WRONGFUN, "Wrong iteration function called.") \ _CTF_ITEM (ECTF_NEXT_WRONGFP, "Iteration entity changed in mid-iterate.") \ _CTF_ITEM (ECTF_FLAGS, "CTF header contains flags unknown to libctf.") \ diff --git a/libctf/ctf-api.c b/libctf/ctf-api.c index 479dcf6a350..60a53f25fd0 100644 --- a/libctf/ctf-api.c +++ b/libctf/ctf-api.c @@ -67,6 +67,26 @@ ctf_set_open_errno (int *errp, int error) return NULL; } +/* See ctf-inlines.h. */ + +#ifdef ENABLE_LIBCTF_HASH_DEBUGGING +int +ctf_set_errno (ctf_dict_t *fp, int err) +{ + fp->ctf_errno = err; + /* Don't rely on CTF_ERR here as it will not properly sign extend on 64-bit + Windows ABI. */ + return -1; +} + +ctf_id_t +ctf_set_typed_errno (ctf_dict_t *fp, int err) +{ + fp->ctf_errno = err; + return CTF_ERR; +} +#endif + /* Get and set CTF dict-wide flags. We are fairly strict about returning errors here, to make it easier to determine programmatically which flags are valid. */ diff --git a/libctf/ctf-inlines.h b/libctf/ctf-inlines.h index bf4b61e5cea..5963fb3d687 100644 --- a/libctf/ctf-inlines.h +++ b/libctf/ctf-inlines.h @@ -90,6 +90,10 @@ ctf_assert_internal (ctf_dict_t *fp, const char *file, size_t line, return expr; } +/* Un-inline these functions if debugging, so you can drop breakpoints on the + setting of any error anywhere by the library. */ + +#ifndef ENABLE_LIBCTF_HASH_DEBUGGING static inline int ctf_set_errno (ctf_dict_t *fp, int err) { @@ -105,7 +109,10 @@ ctf_set_typed_errno (ctf_dict_t *fp, int err) fp->ctf_errno = err; return CTF_ERR; } - +#else +extern int ctf_set_errno (ctf_dict_t *fp, int err); +extern ctf_id_t ctf_set_typed_errno (ctf_dict_t *fp, int err); +#endif #ifdef __cplusplus }