[xen master] ubsan: add clang 5.0 support

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[xen master] ubsan: add clang 5.0 support

patchbot
commit 4e3fb2fb47d6403f8411727eefe2b885c6ad514e
Author:     Roger Pau Monné <[hidden email]>
AuthorDate: Fri Oct 20 09:30:13 2017 +0200
Commit:     Jan Beulich <[hidden email]>
CommitDate: Fri Oct 20 09:30:13 2017 +0200

    ubsan: add clang 5.0 support
   
    clang 5.0 changed the layout of the type_mismatch_data structure and
    introduced __ubsan_handle_type_mismatch_v1 and
    __ubsan_handle_pointer_overflow.
   
    This commit adds support for the new structure layout, adds the
    missing handlers and the new types for type_check_kinds.
   
    Signed-off-by: Roger Pau Monné <[hidden email]>
    [jb: unconditionally emit always the same message in
         __ubsan_handle_pointer_overflow()]
    Acked-by: Jan Beulich <[hidden email]>
    Acked-by: Wei Liu <[hidden email]>
    Release-acked-by: Julien Grall <[hidden email]>
---
 xen/common/ubsan/ubsan.c | 42 +++++++++++++++++++++++++++++++++++++++++-
 xen/common/ubsan/ubsan.h | 11 +++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/xen/common/ubsan/ubsan.c b/xen/common/ubsan/ubsan.c
index fbe5685..fddd6be 100644
--- a/xen/common/ubsan/ubsan.c
+++ b/xen/common/ubsan/ubsan.c
@@ -33,7 +33,10 @@ const char *type_check_kinds[] = {
  "member call on",
  "constructor call on",
  "downcast of",
- "downcast of"
+ "downcast of",
+ "upcast of",
+ "cast to virtual base of",
+ "_Nonnull binding to",
 };
 
 #define REPORTED_BIT 31
@@ -333,6 +336,26 @@ void __ubsan_handle_type_mismatch(struct type_mismatch_data *data,
 }
 EXPORT_SYMBOL(__ubsan_handle_type_mismatch);
 
+void __ubsan_handle_type_mismatch_v1(struct type_mismatch_data_v1 *data,
+ unsigned long ptr)
+{
+ struct type_mismatch_data d = {
+ .location = data->location,
+ .type = data->type,
+ .alignment = 1ul << data->log_alignment,
+ .type_check_kind = data->type_check_kind,
+ };
+
+ /*
+ * NB: do the check with data->location, d->location is just a local
+ * copy and the modifications will be lost.
+ */
+ if (suppress_report(&data->location))
+ return;
+
+ __ubsan_handle_type_mismatch(&d, ptr);
+}
+
 void __ubsan_handle_nonnull_arg(struct nonnull_arg_data *data)
 {
  unsigned long flags;
@@ -478,3 +501,20 @@ void __ubsan_handle_load_invalid_value(struct invalid_value_data *data,
  ubsan_epilogue(&flags);
 }
 EXPORT_SYMBOL(__ubsan_handle_load_invalid_value);
+
+void __ubsan_handle_pointer_overflow(struct pointer_overflow_data *data,
+ unsigned long base, unsigned long result)
+{
+ unsigned long flags;
+
+ if (suppress_report(&data->location))
+ return;
+
+ ubsan_prologue(&data->location, &flags);
+
+ pr_err("pointer operation %s %p to %p\n",
+       base > result ? "underflowed" : "overflowed",
+       _p(base), _p(result));
+
+ ubsan_epilogue(&flags);
+}
diff --git a/xen/common/ubsan/ubsan.h b/xen/common/ubsan/ubsan.h
index b2d18d4..2710cd4 100644
--- a/xen/common/ubsan/ubsan.h
+++ b/xen/common/ubsan/ubsan.h
@@ -36,6 +36,13 @@ struct type_mismatch_data {
  unsigned char type_check_kind;
 };
 
+struct type_mismatch_data_v1 {
+ struct source_location location;
+ struct type_descriptor *type;
+ unsigned char log_alignment;
+ unsigned char type_check_kind;
+};
+
 struct nonnull_arg_data {
  struct source_location location;
  struct source_location attr_location;
@@ -73,6 +80,10 @@ struct invalid_value_data {
  struct type_descriptor *type;
 };
 
+struct pointer_overflow_data {
+ struct source_location location;
+};
+
 #if defined(CONFIG_ARCH_SUPPORTS_INT128) && defined(__SIZEOF_INT128__)
 typedef __int128 s_max;
 typedef unsigned __int128 u_max;
--
generated by git-patchbot for /home/xen/git/xen.git#master


_______________________________________________
Xen-changelog mailing list
[hidden email]
https://lists.xenproject.org/xen-changelog