aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-error.c
diff options
context:
space:
mode:
Diffstat (limited to 'libctf/ctf-error.c')
-rw-r--r--libctf/ctf-error.c99
1 files changed, 41 insertions, 58 deletions
diff --git a/libctf/ctf-error.c b/libctf/ctf-error.c
index c457aa0..84d14d5 100644
--- a/libctf/ctf-error.c
+++ b/libctf/ctf-error.c
@@ -18,71 +18,54 @@
<http://www.gnu.org/licenses/>. */
#include <ctf-impl.h>
+#include <stddef.h>
-static const char *const _ctf_errlist[] = {
- "File is not in CTF or ELF format", /* ECTF_FMT */
- "BFD error", /* ECTF_BFDERR */
- "File uses more recent CTF version than libctf", /* ECTF_CTFVERS */
- "Ambiguous BFD target", /* ECTF_BFD_AMBIGUOUS */
- "Symbol table uses invalid entry size", /* ECTF_SYMTAB */
- "Symbol table data buffer is not valid", /* ECTF_SYMBAD */
- "String table data buffer is not valid", /* ECTF_STRBAD */
- "File data structure corruption detected", /* ECTF_CORRUPT */
- "File does not contain CTF data", /* ECTF_NOCTFDATA */
- "Buffer does not contain CTF data", /* ECTF_NOCTFBUF */
- "Symbol table information is not available", /* ECTF_NOSYMTAB */
- "Type information is in parent and unavailable", /* ECTF_NOPARENT */
- "Cannot import types with different data model", /* ECTF_DMODEL */
- "File added to link too late", /* ECTF_LINKADDEDLATE */
- "Failed to allocate (de)compression buffer", /* ECTF_ZALLOC */
- "Failed to decompress CTF data", /* ECTF_DECOMPRESS */
- "External string table is not available", /* ECTF_STRTAB */
- "String name offset is corrupt", /* ECTF_BADNAME */
- "Invalid type identifier", /* ECTF_BADID */
- "Type is not a struct or union", /* ECTF_NOTSOU */
- "Type is not an enum", /* ECTF_NOTENUM */
- "Type is not a struct, union, or enum", /* ECTF_NOTSUE */
- "Type is not an integer, float, or enum", /* ECTF_NOTINTFP */
- "Type is not an array", /* ECTF_NOTARRAY */
- "Type does not reference another type", /* ECTF_NOTREF */
- "Input buffer is too small for type name", /* ECTF_NAMELEN */
- "No type information available for that name", /* ECTF_NOTYPE */
- "Syntax error in type name", /* ECTF_SYNTAX */
- "Symbol table entry or type is not a function", /* ECTF_NOTFUNC */
- "No function information available for symbol", /* ECTF_NOFUNCDAT */
- "Symbol table entry is not a data object", /* ECTF_NOTDATA */
- "No type information available for symbol", /* ECTF_NOTYPEDAT */
- "No label information available for that name", /* ECTF_NOLABEL */
- "File does not contain any labels", /* ECTF_NOLABELDATA */
- "Feature not supported", /* ECTF_NOTSUP */
- "Invalid enum element name", /* ECTF_NOENUMNAM */
- "Invalid member name", /* ECTF_NOMEMBNAM */
- "CTF container is read-only", /* ECTF_RDONLY */
- "Limit on number of dynamic type members reached", /* ECTF_DTFULL */
- "Limit on number of dynamic types reached", /* ECTF_FULL */
- "Duplicate member or variable name", /* ECTF_DUPLICATE */
- "Conflicting type is already defined", /* ECTF_CONFLICT */
- "Attempt to roll back past a ctf_update", /* ECTF_OVERROLLBACK */
- "Failed to compress CTF data", /* ECTF_COMPRESS */
- "Failed to create CTF archive", /* ECTF_ARCREATE */
- "Name not found in CTF archive", /* ECTF_ARNNAME */
- "Overflow of type bitness or offset in slice", /* ECTF_SLICEOVERFLOW */
- "Unknown section number in dump", /* ECTF_DUMPSECTUNKNOWN */
- "Section changed in middle of dump", /* ECTF_DUMPSECTCHANGED */
- "Feature not yet implemented", /* ECTF_NOTYET */
- "Internal error in link", /* ECTF_INTERNAL */
- "Type not representable in CTF" /* ECTF_NONREPRESENTABLE */
-};
-
-static const int _ctf_nerr = sizeof (_ctf_errlist) / sizeof (_ctf_errlist[0]);
+/* This construct is due to Bruno Haible: much thanks. */
+
+/* Give each structure member a unique name. The name does not matter, so we
+ use the line number in ctf-error.h to uniquify them. */
+
+#define ERRSTRFIELD(line) ERRSTRFIELD1 (line)
+#define ERRSTRFIELD1(line) ctf_errstr##line
+
+/* The error message strings, each in a unique structure member precisely big
+ enough for that error, plus a str member to access them all as a string
+ table. */
+
+static const union _ctf_errlist_t
+{
+ __extension__ struct
+ {
+#define _CTF_STR(n, s) char ERRSTRFIELD (__LINE__) [sizeof (s)];
+#include "ctf-error.h"
+#undef _CTF_STR
+ };
+ char str[1];
+} _ctf_errlist =
+ {
+ {
+#define _CTF_STR(n, s) s,
+#include "ctf-error.h"
+#undef _CTF_STR
+ }
+ };
+
+/* Offsets to each member in the string table, computed using offsetof. */
+
+static const unsigned int _ctf_erridx[] =
+ {
+#define _CTF_STR(n, s) [n - ECTF_BASE] = offsetof (union _ctf_errlist_t, ERRSTRFIELD (__LINE__)),
+#include "ctf-error.h"
+#undef _CTF_STR
+ };
const char *
ctf_errmsg (int error)
{
const char *str;
- if (error >= ECTF_BASE && (error - ECTF_BASE) < _ctf_nerr)
- str = _ctf_errlist[error - ECTF_BASE];
+ if (error >= ECTF_BASE && (error - ECTF_BASE) < ECTF_NERR)
+ str = _ctf_errlist.str + _ctf_erridx[error - ECTF_BASE];
else
str = ctf_strerror (error);