@@ -20,7 +20,12 @@ int main(int argc,const char *argv[]) {return 0;}
# Replace various glibc headers with our own versions that have embedded sparse annotations.
execute_process(COMMAND "${BUILDLIB}/gen-sparse.py"
"--out" "${BUILD_INCLUDE}/"
- "--src" "${CMAKE_SOURCE_DIR}/")
+ "--src" "${CMAKE_SOURCE_DIR}/"
+ RESULT_VARIABLE retcode)
+ if(NOT "${retcode}" STREQUAL "0")
+ message(FATAL_ERROR "glibc header file patching for sparse failed. Review include/*.rej and fix the rejects, then do "
+ "${BUILDLIB}/gen-sparse.py -out ${BUILD_INCLUDE}/ --src ${CMAKE_SOURCE_DIR}/ --save")
+ endif()
endif()
# Enable endian analysis in sparse
@@ -35,7 +35,7 @@ def get_buildlib_patches(dfn):
bn = 0;
res.append((bn,os.path.join(d,I)));
- res.sort();
+ res.sort(reverse=True);
ret = collections.defaultdict(list);
for _,I in res:
@@ -79,7 +79,10 @@ def replace_header(fn):
pfn,os.path.join(args.INCLUDE,fn)):
return;
tries = tries + 1;
- raise ValueError("Unable to apply any patch to %r, tries %u"%(fn,tries));
+
+ print "Unable to apply any patch to %r, tries %u"%(fn,tries);
+ global failed;
+ failed = True;
def save(fn,outdir):
"""Diff the header file in our include directory against the system header and
@@ -124,6 +127,10 @@ if args.save:
for I in headers:
save(I,outdir);
else:
+ failed = False;
patches = get_buildlib_patches(os.path.join(args.SRC,"buildlib","sparse-include"));
for I in headers:
replace_header(I);
+
+ if failed:
+ raise ValueError("Patch applications failed");
deleted file mode 100644
@@ -1,57 +0,0 @@
---- /usr/include/endian.h 2016-11-16 15:43:37.000000000 -0700
-+++ build-sparse/include/endian.h 2017-03-15 12:43:28.732376898 -0600
-@@ -59,38 +59,23 @@
- /* Conversion interfaces. */
- # include <bits/byteswap.h>
-
--# if __BYTE_ORDER == __LITTLE_ENDIAN
--# define htobe16(x) __bswap_16 (x)
--# define htole16(x) (x)
--# define be16toh(x) __bswap_16 (x)
--# define le16toh(x) (x)
-+// Simple vesion for sparse with annotations
-+# include <util/compiler.h>
-
--# define htobe32(x) __bswap_32 (x)
--# define htole32(x) (x)
--# define be32toh(x) __bswap_32 (x)
--# define le32toh(x) (x)
-+# define htobe16(x) ((__force __be16)__bswap_16 (x))
-+# define htole16(x) ((__force __le16)__bswap_16 (x))
-+# define be16toh(x) ((uint16_t)__bswap_16 ((__force uint16_t)(__be16)(x)))
-+# define le16toh(x) ((uint16_t)__bswap_16 ((__force uint16_t)(__le16)(x)))
-+
-+# define htobe32(x) ((__force __be32)__bswap_32 (x))
-+# define htole32(x) ((__force __le32)__bswap_32 (x))
-+# define be32toh(x) ((uint32_t)__bswap_32 ((__force uint32_t)(__be32)(x)))
-+# define le32toh(x) ((uint32_t)__bswap_32 ((__force uint32_t)(__le32)(x)))
-+
-+# define htobe64(x) ((__force __be64)__bswap_64 (x))
-+# define htole64(x) ((__force __le64)__bswap_64 (x))
-+# define be64toh(x) ((uint64_t)__bswap_64 ((__force uint64_t)(__be64)(x)))
-+# define le64toh(x) ((uint64_t)__bswap_64 ((__force uint64_t)(__le64)(x)))
-
--# define htobe64(x) __bswap_64 (x)
--# define htole64(x) (x)
--# define be64toh(x) __bswap_64 (x)
--# define le64toh(x) (x)
--
--# else
--# define htobe16(x) (x)
--# define htole16(x) __bswap_16 (x)
--# define be16toh(x) (x)
--# define le16toh(x) __bswap_16 (x)
--
--# define htobe32(x) (x)
--# define htole32(x) __bswap_32 (x)
--# define be32toh(x) (x)
--# define le32toh(x) __bswap_32 (x)
--
--# define htobe64(x) (x)
--# define htole64(x) __bswap_64 (x)
--# define be64toh(x) (x)
--# define le64toh(x) __bswap_64 (x)
--# endif
- #endif
--
- #endif /* endian.h */
deleted file mode 100644
@@ -1,11 +0,0 @@
---- /usr/include/pthread.h 2016-11-16 15:43:59.000000000 -0700
-+++ build-sparse/include/pthread.h 2017-03-15 12:43:28.736376893 -0600
-@@ -84,7 +84,7 @@
-
- #ifdef __PTHREAD_MUTEX_HAVE_PREV
- # define PTHREAD_MUTEX_INITIALIZER \
-- { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } }
-+ { { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { } } }
- # ifdef __USE_GNU
- # define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
- { { 0, 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, __PTHREAD_SPINS, { 0, 0 } } }
new file mode 100644
@@ -0,0 +1,121 @@
+--- /usr/include/netinet/in.h 2017-03-09 00:51:29.000000000 +0000
++++ build-tumbleweed/include/netinet/in.h 2017-03-21 18:13:51.951339197 +0000
+@@ -22,12 +22,12 @@
+ #include <stdint.h>
+ #include <sys/socket.h>
+ #include <bits/types.h>
+-
++#include <linux/types.h>
+
+ __BEGIN_DECLS
+
+ /* Internet address. */
+-typedef uint32_t in_addr_t;
++typedef __be32 in_addr_t;
+ struct in_addr
+ {
+ in_addr_t s_addr;
+@@ -116,7 +116,7 @@
+ #endif /* !__USE_KERNEL_IPV6_DEFS */
+
+ /* Type to represent a port. */
+-typedef uint16_t in_port_t;
++typedef __be16 in_port_t;
+
+ /* Standard well-known ports. */
+ enum
+@@ -175,36 +175,36 @@
+ #define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET)
+ #define IN_CLASSB_MAX 65536
+
+-#define IN_CLASSC(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
++#define IN_CLASSC(a) ((((uint32_t)(a)) & 0xe0000000) == 0xc0000000)
+ #define IN_CLASSC_NET 0xffffff00
+ #define IN_CLASSC_NSHIFT 8
+ #define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET)
+
+-#define IN_CLASSD(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)
++#define IN_CLASSD(a) ((((uint32_t)(a)) & 0xf0000000) == 0xe0000000)
+ #define IN_MULTICAST(a) IN_CLASSD(a)
+
+-#define IN_EXPERIMENTAL(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
+-#define IN_BADCLASS(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)
++#define IN_EXPERIMENTAL(a) ((((uint32_t)(a)) & 0xe0000000) == 0xe0000000)
++#define IN_BADCLASS(a) ((((uint32_t)(a)) & 0xf0000000) == 0xf0000000)
+
+ /* Address to accept any incoming messages. */
+-#define INADDR_ANY ((in_addr_t) 0x00000000)
++#define INADDR_ANY ((uint32_t) 0x00000000)
+ /* Address to send to all hosts. */
+-#define INADDR_BROADCAST ((in_addr_t) 0xffffffff)
++#define INADDR_BROADCAST ((uint32_t) 0xffffffff)
+ /* Address indicating an error return. */
+-#define INADDR_NONE ((in_addr_t) 0xffffffff)
++#define INADDR_NONE ((uint32_t) 0xffffffff)
+
+ /* Network number for local host loopback. */
+ #define IN_LOOPBACKNET 127
+ /* Address to loopback in software to local host. */
+ #ifndef INADDR_LOOPBACK
+-# define INADDR_LOOPBACK ((in_addr_t) 0x7f000001) /* Inet 127.0.0.1. */
++# define INADDR_LOOPBACK ((uint32_t) 0x7f000001) /* Inet 127.0.0.1. */
+ #endif
+
+ /* Defines for Multicast INADDR. */
+-#define INADDR_UNSPEC_GROUP ((in_addr_t) 0xe0000000) /* 224.0.0.0 */
+-#define INADDR_ALLHOSTS_GROUP ((in_addr_t) 0xe0000001) /* 224.0.0.1 */
+-#define INADDR_ALLRTRS_GROUP ((in_addr_t) 0xe0000002) /* 224.0.0.2 */
+-#define INADDR_MAX_LOCAL_GROUP ((in_addr_t) 0xe00000ff) /* 224.0.0.255 */
++#define INADDR_UNSPEC_GROUP ((uint32_t) 0xe0000000) /* 224.0.0.0 */
++#define INADDR_ALLHOSTS_GROUP ((uint32_t) 0xe0000001) /* 224.0.0.1 */
++#define INADDR_ALLRTRS_GROUP ((uint32_t) 0xe0000002) /* 224.0.0.2 */
++#define INADDR_MAX_LOCAL_GROUP ((uint32_t) 0xe00000ff) /* 224.0.0.255 */
+
+ #if !__USE_KERNEL_IPV6_DEFS
+ /* IPv6 address */
+@@ -213,8 +213,8 @@
+ union
+ {
+ uint8_t __u6_addr8[16];
+- uint16_t __u6_addr16[8];
+- uint32_t __u6_addr32[4];
++ __be16 __u6_addr16[8];
++ __be32 __u6_addr32[4];
+ } __in6_u;
+ #define s6_addr __in6_u.__u6_addr8
+ #ifdef __USE_MISC
+@@ -253,7 +253,7 @@
+ {
+ __SOCKADDR_COMMON (sin6_);
+ in_port_t sin6_port; /* Transport layer port # */
+- uint32_t sin6_flowinfo; /* IPv6 flow information */
++ __be32 sin6_flowinfo; /* IPv6 flow information */
+ struct in6_addr sin6_addr; /* IPv6 address */
+ uint32_t sin6_scope_id; /* IPv6 scope-id */
+ };
+@@ -371,12 +371,12 @@
+ this was a short-sighted decision since on different systems the types
+ may have different representations but the values are always the same. */
+
+-extern uint32_t ntohl (uint32_t __netlong) __THROW __attribute__ ((__const__));
+-extern uint16_t ntohs (uint16_t __netshort)
++extern uint32_t ntohl (__be32 __netlong) __THROW __attribute__ ((__const__));
++extern uint16_t ntohs (__be16 __netshort)
+ __THROW __attribute__ ((__const__));
+-extern uint32_t htonl (uint32_t __hostlong)
++extern __be32 htonl (uint32_t __hostlong)
+ __THROW __attribute__ ((__const__));
+-extern uint16_t htons (uint16_t __hostshort)
++extern __be16 htons (uint16_t __hostshort)
+ __THROW __attribute__ ((__const__));
+
+ #include <endian.h>
+@@ -385,7 +385,7 @@
+ #include <bits/byteswap.h>
+ #include <bits/uintn-identity.h>
+
+-#ifdef __OPTIMIZE__
++#ifdef __disabled_OPTIMIZE__
+ /* We can optimize calls to the conversion functions. Either nothing has
+ to be done or we are using directly the byte-swapping functions which
+ often can be inlined. */
new file mode 100644
@@ -0,0 +1,43 @@
+/* COPYRIGHT (c) 2017 Obsidian Research Corporation. See COPYING file */
+
+#ifndef _SPARSE_ENDIAN_H_
+#define _SPARSE_ENDIAN_H_
+
+#include_next <endian.h>
+
+#include <util/compiler.h>
+
+#undef htobe16
+#undef htole16
+#undef be16toh
+#undef le16toh
+
+#undef htobe32
+#undef htole32
+#undef be32toh
+#undef le32toh
+
+#undef htobe64
+#undef htole64
+#undef be64toh
+#undef le64toh
+
+/* These do not actually work, but this trivially ensures that sparse sees all
+ * the types. */
+
+#define htobe16(x) ((__force __be16)__bswap_16 (x))
+#define htole16(x) ((__force __le16)__bswap_16 (x))
+#define be16toh(x) ((uint16_t)__bswap_16 ((__force uint16_t)(__be16)(x)))
+#define le16toh(x) ((uint16_t)__bswap_16 ((__force uint16_t)(__le16)(x)))
+
+#define htobe32(x) ((__force __be32)__bswap_32 (x))
+#define htole32(x) ((__force __le32)__bswap_32 (x))
+#define be32toh(x) ((uint32_t)__bswap_32 ((__force uint32_t)(__be32)(x)))
+#define le32toh(x) ((uint32_t)__bswap_32 ((__force uint32_t)(__le32)(x)))
+
+#define htobe64(x) ((__force __be64)__bswap_64 (x))
+#define htole64(x) ((__force __le64)__bswap_64 (x))
+#define be64toh(x) ((uint64_t)__bswap_64 ((__force uint64_t)(__be64)(x)))
+#define le64toh(x) ((uint64_t)__bswap_64 ((__force uint64_t)(__le64)(x)))
+
+#endif
new file mode 100644
@@ -0,0 +1,12 @@
+/* COPYRIGHT (c) 2017 Obsidian Research Corporation. See COPYING file */
+
+#ifndef _SPARSE_PTHREAD_H_
+#define _SPARSE_PTHREAD_H_
+
+#include_next <pthread.h>
+
+/* Sparse complains that the glibc version of this has 0 instead of NULL */
+#undef PTHREAD_MUTEX_INITIALIZER
+#define PTHREAD_MUTEX_INITIALIZER {}
+
+#endif