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; }