Hi Jack,
> > On darwin15, the proposed patch is insufficient to restore the bootstrap
> > (after running genfixes in the fixincludes directory) unless I also apply
> > the previously proposed change...
>
> no wonder: it's only been tested on darwin16. Care to explain what
> error you're seeing?
>
> The failure that I see on darwin15 using your proposed patches and executing
> genfixes in fixincludes before the build is...
the actual errors are ...
> In file included from
> ../../../../gcc-7-20161113/libsanitizer/sanitizer_common/sanitizer_mac.cc:39:0:
> /sw/src/fink.build/gcc7-7.0.0-1/darwin_objdir/gcc/include-fixed/os/trace.h:56:47:
> error: attributes are not allowed on a function-definition
> _os_trace_verify_printf(const char *msg, ...) __attribute__((format(printf,
> 1, 2)))
> ^~~~~~~~~~~~~
I've added a new fix to just remove that attribute. One could try and
add a declaration with the attribute if need be, but I've avoid that
trouble for now.
> /sw/src/fink.build/gcc7-7.0.0-1/darwin_objdir/gcc/include-fixed/os/trace.h:715:109:
> error: ‘os_trace_payload_t’ has not been declared
> _os_trace_with_buffer(void *dso, const char *message, uint8_t type, const void
> *buffer, size_t buffer_size, os_trace_payload_ payload);
> ^~~~~~~~~~~~~~~~~
This one isn't caught so far because 10.11 has
__OSX_AVAILABLE(10.10) __IOS_AVAILABLE(8.0) __WATCHOS_AVAILABLE(1.0)
__TVOS_AVAILABLE(9.0)
instead of
__API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0))
I've updated the corresponding fix to deal with this variation and
augmented the testcase accordingly.
Hopefully the new patch works for you.
Rainer
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University
# HG changeset patch
# Parent c9e06f02a0d86f769e4c4720ddfc0938c76bcb20
Fix macOS 10.12 <AvailabilityInternal.h> and <os/trace.h> (PR sanitizer/78267)
diff --git a/fixincludes/inclhack.def b/fixincludes/inclhack.def
--- a/fixincludes/inclhack.def
+++ b/fixincludes/inclhack.def
@@ -1338,6 +1338,32 @@ fix = {
};
/*
+ * macOS 10.12 <AvailabilityInternal.h> uses __attribute__((availability))
+ * unconditionally.
+ */
+fix = {
+ hackname = darwin_availabilityinternal;
+ mach = "*-*-darwin*";
+ files = AvailabilityInternal.h;
+ select = "#define[ \t]+(__API_[ADU]\\([^)]*\\)).*";
+ c_fix = format;
+ c_fix_arg = <<- _EOFix_
+ #if defined(__has_attribute)
+ #if __has_attribute(availability)
+ %0
+ #else
+ #define %1
+ #endif
+ #else
+ #define %1
+ #endif
+ _EOFix_;
+
+ test_text = "#define __API_A(x) __attribute__((availability(__API_AVAILABLE_PLATFORM_##x)))\n"
+ "#define __API_D(msg,x) __attribute__((availability(__API_DEPRECATED_PLATFORM_##x,message=msg)))";
+};
+
+/*
* For the AAB_darwin7_9_long_double_funcs fix to be useful,
* you have to not use "" includes.
*/
@@ -1410,6 +1436,62 @@ fix = {
};
/*
+ * Mac OS X 10.11 <os/trace.h> uses attribute on function definition.
+ */
+fix = {
+ hackname = darwin_os_trace_1;
+ mach = "*-*-darwin*";
+ files = os/trace.h;
+ select = "^(_os_trace_verify_printf.*) (__attribute__.*)";
+ c_fix = format;
+ c_fix_arg = "%1";
+ test_text = "_os_trace_verify_printf(const char *msg, ...) __attribute__((format(printf, 1, 2)))";
+};
+
+/*
+ * Mac OS X 10.1[012] <os/trace.h> os_trace_payload_t typedef uses Blocks
+ * extension without guard.
+ */
+fix = {
+ hackname = darwin_os_trace_2;
+ mach = "*-*-darwin*";
+ files = os/trace.h;
+ select = "typedef.*\\^os_trace_payload_t.*";
+ c_fix = format;
+ c_fix_arg = "#if __BLOCKS__\n%0\n#endif";
+ test_text = "typedef void (^os_trace_payload_t)(xpc_object_t xdict);";
+};
+
+/*
+ * In Mac OS X 10.1[012] <os/trace.h>, need to guard users of
+ * os_trace_payload_t typedef, too.
+ */
+fix = {
+ hackname = darwin_os_trace_3;
+ mach = "*-*-darwin*";
+ files = os/trace.h;
+ select = <<- _EOSelect_
+ __(API|OSX)_.*
+ OS_EXPORT.*
+ .*
+ _os_trace.*os_trace_payload_t payload);
+ _EOSelect_;
+ c_fix = format;
+ c_fix_arg = "#if __BLOCKS__\n%0\n#endif";
+ test_text = <<- _EOText_
+ __API_AVAILABLE(macosx(10.10), ios(8.0), watchos(2.0), tvos(8.0))
+ OS_EXPORT OS_NOTHROW OS_NOT_TAIL_CALLED
+ void
+ _os_trace_with_buffer(void *dso, const char *message, uint8_t type, const void *buffer, size_t buffer_size, os_trace_payload_t payload);
+
+ __OSX_AVAILABLE_STARTING(__MAC_10_12, __IPHONE_10_0)
+ OS_EXPORT OS_NOTHROW
+ void
+ _os_trace_internal(void *dso, uint8_t type, const char *format, const uint8_t *buf, size_t buf_size, os_trace_payload_t payload);
+ _EOText_;
+};
+
+/*
* __private_extern__ doesn't exist in FSF GCC. Even if it did,
* why would you ever put it in a system header file?
*/
@@ -2638,7 +2720,6 @@ fix = {
c-fix-arg = "# define UINT_%164_MAX __UINT64_MAX__";
test-text = "# define UINT_FAST64_MAX ULLONG_MAX\n"
"# define UINT_LEAST64_MAX ULLONG_MAX\n";
- _EOFix_;
};
/*
diff --git a/fixincludes/tests/base/AvailabilityInternal.h b/fixincludes/tests/base/AvailabilityInternal.h
new file mode 100644
--- /dev/null
+++ b/fixincludes/tests/base/AvailabilityInternal.h
@@ -0,0 +1,31 @@
+/* DO NOT EDIT THIS FILE.
+
+ It has been auto-edited by fixincludes from:
+
+ "fixinc/tests/inc/AvailabilityInternal.h"
+
+ This had to be done to correct non-standard usages in the
+ original, manufacturer supplied header file. */
+
+
+
+#if defined( DARWIN_AVAILABILITYINTERNAL_CHECK )
+#if defined(__has_attribute)
+ #if __has_attribute(availability)
+#define __API_A(x) __attribute__((availability(__API_AVAILABLE_PLATFORM_##x)))
+ #else
+ #define __API_A(x)
+ #endif
+#else
+ #define __API_A(x)
+#endif
+#if defined(__has_attribute)
+ #if __has_attribute(availability)
+#define __API_D(msg,x) __attribute__((availability(__API_DEPRECATED_PLATFORM_##x,message=msg)))
+ #else
+ #define __API_D(msg,x)
+ #endif
+#else
+ #define __API_D(msg,x)
+#endif
+#endif /* DARWIN_AVAILABILITYINTERNAL_CHECK */
diff --git a/fixincludes/tests/base/os/trace.h b/fixincludes/tests/base/os/trace.h
new file mode 100644
--- /dev/null
+++ b/fixincludes/tests/base/os/trace.h
@@ -0,0 +1,38 @@
+/* DO NOT EDIT THIS FILE.
+
+ It has been auto-edited by fixincludes from:
+
+ "fixinc/tests/inc/os/trace.h"
+
+ This had to be done to correct non-standard usages in the
+ original, manufacturer supplied header file. */
+
+
+
+#if defined( DARWIN_OS_TRACE_1_CHECK )
+_os_trace_verify_printf(const char *msg, ...)
+#endif /* DARWIN_OS_TRACE_1_CHECK */
+
+
+#if defined( DARWIN_OS_TRACE_2_CHECK )
+#if __BLOCKS__
+typedef void (^os_trace_payload_t)(xpc_object_t xdict);
+#endif
+#endif /* DARWIN_OS_TRACE_2_CHECK */
+
+
+#if defined( DARWIN_OS_TRACE_3_CHECK )
+#if __BLOCKS__
+__API_AVAILABLE(macosx(10.10), ios(8.0), watchos(2.0), tvos(8.0))
+OS_EXPORT OS_NOTHROW OS_NOT_TAIL_CALLED
+void
+_os_trace_with_buffer(void *dso, const char *message, uint8_t type, const void *buffer, size_t buffer_size, os_trace_payload_t payload);
+#endif
+
+#if __BLOCKS__
+__OSX_AVAILABLE_STARTING(__MAC_10_12, __IPHONE_10_0)
+OS_EXPORT OS_NOTHROW
+void
+_os_trace_internal(void *dso, uint8_t type, const char *format, const uint8_t *buf, size_t buf_size, os_trace_payload_t payload);
+#endif
+#endif /* DARWIN_OS_TRACE_3_CHECK */