Hi,

The following patch adds support for instrumentation of globals for
Linux kernel (-fsanitize=kernel-address). Kernel only supports
constructors with default priority, but the rest works fine.

OK for trunk?


https://codereview.appspot.com/176570043

Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog (revision 218280)
+++ gcc/ChangeLog (working copy)
@@ -1,3 +1,8 @@
+2014-12-02  Dmitry Vyukov  <dvyu...@google.com>
+
+ * asan.c: (asan_finish_file): Use default priority for constructors
+ in kernel mode.
+
 2014-12-02  Ulrich Weigand  <ulrich.weig...@de.ibm.com>

  PR target/64115
Index: gcc/asan.c
===================================================================
--- gcc/asan.c (revision 218280)
+++ gcc/asan.c (working copy)
@@ -1348,7 +1348,9 @@
  the var that is selected by the linker will have
  padding or not.  */
       || DECL_ONE_ONLY (decl)
-      /* Similarly for common vars.  People can use -fno-common.  */
+      /* Similarly for common vars.  People can use -fno-common.
+ Note: Linux kernel is built with -fno-common, so we do instrument
+ globals there even if it is C.  */
       || (DECL_COMMON (decl) && TREE_PUBLIC (decl))
       /* Don't protect if using user section, often vars placed
  into user section from multiple TUs are then assumed
@@ -2440,6 +2442,7 @@
 {
   varpool_node *vnode;
   unsigned HOST_WIDE_INT gcount = 0;
+  int priority;

   if (shadow_ptr_types[0] == NULL_TREE)
     asan_init_shadow_ptr_types ();
@@ -2448,6 +2451,13 @@
      nor after .LASAN* array.  */
   flag_sanitize &= ~SANITIZE_ADDRESS;

+  /* For user-space we want asan constructors to run first.
+     Linux kernel does not support priorities other than default, and the only
+     other user of constructors is coverage. So we run with the default
+     priority.  */
+  priority = flag_sanitize & SANITIZE_USER_ADDRESS ?
+      MAX_RESERVED_INIT_PRIORITY - 1 : DEFAULT_INIT_PRIORITY;
+
   if (flag_sanitize & SANITIZE_USER_ADDRESS)
     {
       tree fn = builtin_decl_implicit (BUILT_IN_ASAN_INIT);
@@ -2503,12 +2513,10 @@
  build_fold_addr_expr (var),
  gcount_tree),
  &dtor_statements);
-      cgraph_build_static_cdtor ('D', dtor_statements,
- MAX_RESERVED_INIT_PRIORITY - 1);
+      cgraph_build_static_cdtor ('D', dtor_statements, priority);
     }
   if (asan_ctor_statements)
-    cgraph_build_static_cdtor ('I', asan_ctor_statements,
-       MAX_RESERVED_INIT_PRIORITY - 1);
+    cgraph_build_static_cdtor ('I', asan_ctor_statements, priority);
   flag_sanitize |= SANITIZE_ADDRESS;
 }

Reply via email to