summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH. Peter Anvin (Intel) <hpa@zytor.com>2018-12-14 00:27:59 -0800
committerH. Peter Anvin (Intel) <hpa@zytor.com>2018-12-14 00:27:59 -0800
commitce19a52a3422332d55d8c0f601f30c2e67c14f09 (patch)
tree08cddeca1c4f25196ad4ffd73ae3abbda4b1aa15
parent374312cde4d44f8849d602cc5c9ea634798b9c50 (diff)
downloadnasm-ce19a52a3422332d55d8c0f601f30c2e67c14f09.tar.gz
Define and use offsetin() instead of offsetof()
New macro which defines the offset on an object rather than a type. This macro, as far as I know, ought to be fully portable, unlike the fallback version of offsetof(). Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
-rw-r--r--include/compiler.h7
-rw-r--r--nasmlib/strlist.c2
2 files changed, 8 insertions, 1 deletions
diff --git a/include/compiler.h b/include/compiler.h
index 4ce60ccc..7beeb8fe 100644
--- a/include/compiler.h
+++ b/include/compiler.h
@@ -180,6 +180,13 @@ typedef enum bool { false, true } bool;
# define offsetof(t,m) ((size_t)&(((t *)0)->m))
#endif
+/* This is like offsetof(), but takes an object rather than a type.
+ Ironically enough this is actually guaranteed to be portable,
+ as far as I know... */
+#ifndef offsetin
+# define offsetin(p,m) ((const char *)&((p).m) - (const char *)&(p))
+#endif
+
/* The container_of construct: if p is a pointer to member m of
container class c, then return a pointer to the container of which
*p is a member. */
diff --git a/nasmlib/strlist.c b/nasmlib/strlist.c
index 506ad50e..a0687cce 100644
--- a/nasmlib/strlist.c
+++ b/nasmlib/strlist.c
@@ -108,7 +108,7 @@ strlist_vprintf(struct strlist *list, const char *fmt, va_list ap)
if (!list)
return NULL;
- e = nasm_vaxprintf(offsetof(struct strlist_entry, str), fmt, ap);
+ e = nasm_vaxprintf(offsetin(*e, str), fmt, ap);
e->size = nasm_aprintf_size();
if (list->uniq) {