aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro F. Giffuni <pfg@FreeBSD.org>2013-11-25 18:28:34 +0000
committerPedro F. Giffuni <pfg@FreeBSD.org>2013-11-25 18:28:34 +0000
commit05b21c9adf4d7f1b7b616a703b98e4df42633c9f (patch)
treece3fb96eed1d56c5957613c145b3e6d30ab8f6ce
parent74c5118c7b50494087423c9f3f6e17264f0e4dbb (diff)
downloadsrc-05b21c9adf4d7f1b7b616a703b98e4df42633c9f.tar.gz
src-05b21c9adf4d7f1b7b616a703b98e4df42633c9f.zip
tcpdump Bring change from upstream.
commit 772d6fbcf592209aa1ab1b61714e8ae72a5b1698 Author: Dmitrij Tejblum <tejblum@yandex-team.ru> Date: Sun Jun 2 13:48:44 2013 +0400 Convert some versions of EXTRACT_{16,32,64}BITS() to inline functions. It removes the vast majority of strict-aliasing warnings from GCC.
Notes
Notes: svn path=/vendor/tcpdump/dist/; revision=258571
-rw-r--r--extract.h53
1 files changed, 39 insertions, 14 deletions
diff --git a/extract.h b/extract.h
index bab63f205d77..60ecd680363a 100644
--- a/extract.h
+++ b/extract.h
@@ -51,13 +51,25 @@ typedef struct {
u_int32_t val;
} __attribute__((packed)) unaligned_u_int32_t;
-#define EXTRACT_16BITS(p) \
- ((u_int16_t)ntohs(((const unaligned_u_int16_t *)(p))->val))
-#define EXTRACT_32BITS(p) \
- ((u_int32_t)ntohl(((const unaligned_u_int32_t *)(p))->val))
-#define EXTRACT_64BITS(p) \
- ((u_int64_t)(((u_int64_t)ntohl(((const unaligned_u_int32_t *)(p) + 0)->val)) << 32 | \
- ((u_int64_t)ntohl(((const unaligned_u_int32_t *)(p) + 1)->val)) << 0))
+static inline u_int16_t
+EXTRACT_16BITS(const void *p)
+{
+ return ((u_int16_t)ntohs(((const unaligned_u_int16_t *)(p))->val));
+}
+
+static inline u_int32_t
+EXTRACT_32BITS(const void *p)
+{
+ return ((u_int32_t)ntohl(((const unaligned_u_int32_t *)(p))->val));
+}
+
+static inline u_int64_t
+EXTRACT_64BITS(const void *p)
+{
+ return ((u_int64_t)(((u_int64_t)ntohl(((const unaligned_u_int32_t *)(p) + 0)->val)) << 32 | \
+ ((u_int64_t)ntohl(((const unaligned_u_int32_t *)(p) + 1)->val)) << 0));
+
+}
#else /* HAVE___ATTRIBUTE__ */
/*
@@ -88,13 +100,26 @@ typedef struct {
* The processor natively handles unaligned loads, so we can just
* cast the pointer and fetch through it.
*/
-#define EXTRACT_16BITS(p) \
- ((u_int16_t)ntohs(*(const u_int16_t *)(p)))
-#define EXTRACT_32BITS(p) \
- ((u_int32_t)ntohl(*(const u_int32_t *)(p)))
-#define EXTRACT_64BITS(p) \
- ((u_int64_t)(((u_int64_t)ntohl(*((const u_int32_t *)(p) + 0))) << 32 | \
- ((u_int64_t)ntohl(*((const u_int32_t *)(p) + 1))) << 0))
+static inline u_int16_t
+EXTRACT_16BITS(const void *p)
+{
+ return ((u_int16_t)ntohs(*(const u_int16_t *)(p)));
+}
+
+static inline u_int32_t
+EXTRACT_32BITS(const void *p)
+{
+ return ((u_int32_t)ntohl(*(const u_int32_t *)(p)));
+}
+
+static inline u_int64_t
+EXTRACT_64BITS(const void *p)
+{
+ return ((u_int64_t)(((u_int64_t)ntohl(*((const u_int32_t *)(p) + 0))) << 32 | \
+ ((u_int64_t)ntohl(*((const u_int32_t *)(p) + 1))) << 0));
+
+}
+
#endif /* LBL_ALIGN */
#define EXTRACT_24BITS(p) \