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.
This commit is contained in:
Nick Alcock
2025-04-24 14:20:28 +01:00
parent 2ef9554023
commit 7bcd444b9c
3 changed files with 30 additions and 3 deletions

View File

@@ -183,7 +183,8 @@ typedef struct ctf_snapshot_id
and _CTF_ITEM to expand as you like, then mention the macro name. and _CTF_ITEM to expand as you like, then mention the macro name.
See the enum after this for an example. */ See the enum after this for an example. */
#define _CTF_ERRORS \ #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_BFDERR, "BFD error.") \
_CTF_ITEM (ECTF_CTFVERS, "CTF dict version is too new for libctf.") \ _CTF_ITEM (ECTF_CTFVERS, "CTF dict version is too new for libctf.") \
_CTF_ITEM (ECTF_BFD_AMBIGUOUS, "Ambiguous BFD target.") \ _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_NOTYET, "Feature not yet implemented.") \
_CTF_ITEM (ECTF_INTERNAL, "Internal error: assertion failure.") \ _CTF_ITEM (ECTF_INTERNAL, "Internal error: assertion failure.") \
_CTF_ITEM (ECTF_NONREPRESENTABLE, "Type not representable in CTF.") \ _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_WRONGFUN, "Wrong iteration function called.") \
_CTF_ITEM (ECTF_NEXT_WRONGFP, "Iteration entity changed in mid-iterate.") \ _CTF_ITEM (ECTF_NEXT_WRONGFP, "Iteration entity changed in mid-iterate.") \
_CTF_ITEM (ECTF_FLAGS, "CTF header contains flags unknown to libctf.") \ _CTF_ITEM (ECTF_FLAGS, "CTF header contains flags unknown to libctf.") \

View File

@@ -67,6 +67,26 @@ ctf_set_open_errno (int *errp, int error)
return NULL; 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 /* 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 errors here, to make it easier to determine programmatically which flags are
valid. */ valid. */

View File

@@ -90,6 +90,10 @@ ctf_assert_internal (ctf_dict_t *fp, const char *file, size_t line,
return expr; 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 static inline int
ctf_set_errno (ctf_dict_t *fp, int err) 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; fp->ctf_errno = err;
return CTF_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 #ifdef __cplusplus
} }