xen/ubsan: Support for -fsanitise=builtin
authorAndrew Cooper <andrew.cooper3@citrix.com>
Sun, 12 May 2019 13:17:08 +0000 (14:17 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 27 Jun 2019 18:04:03 +0000 (19:04 +0100)
This fixes the UBSAN build for GCC 8 and later.  The sanitiser checks for
passing 0 to the ctz()/clz() builtins.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
xen/common/ubsan/ubsan.c
xen/common/ubsan/ubsan.h

index 50a4e14facc80605e82a146d9a7a7f7fbed3d58c..0fddacabda6ac4ab9f5ccba795e70f8dd544ebe1 100644 (file)
@@ -518,3 +518,26 @@ void __ubsan_handle_pointer_overflow(struct pointer_overflow_data *data,
 
        ubsan_epilogue(&flags);
 }
+
+void __ubsan_handle_invalid_builtin(struct invalid_builtin_data *data)
+{
+       unsigned long flags;
+       const char *fn = NULL;
+
+       if (suppress_report(&data->location))
+               return;
+
+       ubsan_prologue(&data->location, &flags);
+
+       switch (data->kind) {
+       case kind_ctz: fn = "ctz"; break;
+       case kind_clz: fn = "clz"; break;
+       }
+
+       if (fn)
+               pr_err("passing zero to %s(), which is not a valid argument\n", fn);
+       else
+               pr_err("Unknown kind %u\n", data->kind);
+
+       ubsan_epilogue(&flags);
+}
index 2710cd423ee405c38769518636ea926f54ef836f..a3159040fefbdf7ba3d6bc794c8ee172a8ab83aa 100644 (file)
@@ -84,6 +84,15 @@ struct pointer_overflow_data {
        struct source_location location;
 };
 
+struct invalid_builtin_data {
+       struct source_location location;
+       unsigned char kind;
+};
+enum {
+       kind_ctz,
+       kind_clz,
+};
+
 #if defined(CONFIG_ARCH_SUPPORTS_INT128) && defined(__SIZEOF_INT128__)
 typedef __int128 s_max;
 typedef unsigned __int128 u_max;