Jakub, Your patch seems to do what it should:
% ../gcc-inst/bin/g++ -gdwarf-2 -fsanitize=address -static-libasan ../gcc/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c && ./a.out ... Address 0x7fffb8ec95ca is located in stack of thread T0 at offset 42 in frame #0 0x44bd73 in main ../gcc/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c:13 But now when I run the tests I get this: FAIL: c-c++-common/asan/clone-test-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none (test for excess errors) FAIL: c-c++-common/asan/clone-test-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects (test for excess errors) FAIL: c-c++-common/asan/memcmp-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none (test for excess errors) FAIL: c-c++-common/asan/memcmp-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects (test for excess errors) FAIL: c-c++-common/asan/stack-overflow-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none (test for excess errors) FAIL: c-c++-common/asan/stack-overflow-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects (test for excess errors) FAIL: c-c++-common/asan/swapcontext-test-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none (test for excess errors) FAIL: c-c++-common/asan/swapcontext-test-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects (test for excess errors) FAIL: g++.dg/asan/deep-thread-stack-1.C -O2 -flto -fno-use-linker-plugin -flto-partition=none (test for excess errors) FAIL: g++.dg/asan/deep-thread-stack-1.C -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects (test for excess errors) W/o your change they pass. Could you please remind me how to debug this (i.e. how to run the exact test commands manually)? Thanks! --kcc On Tue, Oct 29, 2013 at 6:49 AM, Konstantin Serebryany <konstantin.s.serebry...@gmail.com> wrote: > Thanks! > (At this time I will be slow with response due to travel) > > --kcc > > > On Tue, Oct 29, 2013 at 5:13 AM, Jakub Jelinek <ja...@redhat.com> wrote: >> >> > On Wed, Oct 2, 2013 at 12:51 PM, Konstantin Serebryany >> > > 2013-10-XX Kostya Serebryany <k...@google.com> >> > > >> > > * g++.dg/asan/asan_test.cc: Update the test >> > > to match the fresh asan run-time. >> > > * c-c++-common/asan/stack-overflow-1.c: Ditto. >> > > >> > > =========== gcc/ChangeLog >> > > >> > > 2013-10-XX Kostya Serebryany <k...@google.com> >> > > >> > > * asan.c: Update to match the changed asan API. >> > > (asan_emit_stack_protection): update the string stored in the >> > > stack red zone to match new API. Store the PC of the current >> > > function in the red zone. >> > > (asan_global_struct): update the __asan_global definition to >> > > match >> > > the new API. >> > > (asan_add_global): Ditto. >> > > * sanitizer.def: rename __asan_init_v1 to __asan_init_v3 >> >> The "Update to match the changed asan API." should either be >> dropped, or come on a line before the * asan.c >> (asan_emit_stack_protection): >> line. All descriptions should start with capital letters, end with ., two >> spaces after . if followed by another sentence. >> >> Besides that, here is (completely untested) attempt to give you >> the pc of the first instruction of the function and two minor changes >> (pp_string (something, "") is useless and in two spots I've noticed >> you didn't add space before ( in function call). >> >> Finally, if the new libasan is ABI incompatible with the old one, which >> seems it is, then libsanitizer/asan/libtool-version (and perhaps also >> libsanitizer/tsan/libtool-version, haven't looked if that one is ABI >> compatible or not) needs to be bumped (to 1:0:0 ?). >> >> --- gcc/asan.c.jj 2013-10-29 11:58:30.000000000 +0100 >> +++ gcc/asan.c 2013-10-29 13:04:07.709667677 +0100 >> @@ -921,6 +921,15 @@ asan_clear_shadow (rtx shadow_mem, HOST_ >> add_int_reg_note (jump, REG_BR_PROB, REG_BR_PROB_BASE * 80 / 100); >> } >> >> +void >> +asan_function_start (void) >> +{ >> + section *fnsec = function_section (current_function_decl); >> + switch_to_section (fnsec); >> + ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LASANPC", >> + current_function_funcdef_no); >> +} >> + >> /* Insert code to protect stack vars. The prologue sequence should be >> emitted >> directly, epilogue sequence returned. BASE is the register holding >> the >> stack base, against which OFFSETS array offsets are relative to, >> OFFSETS >> @@ -936,12 +945,13 @@ asan_emit_stack_protection (rtx base, HO >> int length) >> { >> rtx shadow_base, shadow_mem, ret, mem; >> + char buf[30]; >> unsigned char shadow_bytes[4]; >> HOST_WIDE_INT base_offset = offsets[length - 1], offset, prev_offset; >> HOST_WIDE_INT last_offset, last_size; >> int l; >> unsigned char cur_shadow_byte = ASAN_STACK_MAGIC_LEFT; >> - tree str_cst; >> + tree str_cst, decl; >> >> if (shadow_ptr_types[0] == NULL_TREE) >> asan_init_shadow_ptr_types (); >> @@ -949,7 +959,6 @@ asan_emit_stack_protection (rtx base, HO >> /* First of all, prepare the description string. */ >> pretty_printer asan_pp; >> >> - pp_string (&asan_pp, ""); >> pp_decimal_int (&asan_pp, length / 2 - 1); >> pp_space (&asan_pp); >> for (l = length - 2; l; l -= 2) >> @@ -980,7 +989,17 @@ asan_emit_stack_protection (rtx base, HO >> mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode)); >> emit_move_insn (mem, expand_normal (str_cst)); >> mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode)); >> - emit_move_insn (mem, expand_normal (str_cst)); // FIXME: should be >> cur_pc. >> + ASM_GENERATE_INTERNAL_LABEL (buf, "LASANPC", >> current_function_funcdef_no); >> + decl = build_decl (DECL_SOURCE_LOCATION (current_function_decl), >> + VAR_DECL, get_identifier (buf), char_type_node); >> + TREE_ADDRESSABLE (decl) = 1; >> + TREE_READONLY (decl) = 1; >> + DECL_ARTIFICIAL (decl) = 1; >> + DECL_IGNORED_P (decl) = 1; >> + TREE_STATIC (decl) = 1; >> + TREE_PUBLIC (decl) = 0; >> + TREE_USED (decl) = 1; >> + emit_move_insn (mem, expand_normal (build_fold_addr_expr (decl))); >> shadow_base = expand_binop (Pmode, lshr_optab, base, >> GEN_INT (ASAN_SHADOW_SHIFT), >> NULL_RTX, 1, OPTAB_DIRECT); >> @@ -1979,8 +1998,8 @@ asan_add_global (tree decl, tree type, v >> pp_string (&asan_pp, "<unknown>"); >> str_cst = asan_pp_string (&asan_pp); >> >> - pp_string(&module_name_pp, main_input_filename); >> - module_name_cst = asan_pp_string(&module_name_pp); >> + pp_string (&module_name_pp, main_input_filename); >> + module_name_cst = asan_pp_string (&module_name_pp); >> >> if (asan_needs_local_alias (decl)) >> { >> --- gcc/asan.h.jj 2013-01-11 09:02:50.000000000 +0100 >> +++ gcc/asan.h 2013-10-29 12:37:54.190798947 +0100 >> @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. >> #ifndef TREE_ASAN >> #define TREE_ASAN >> >> +extern void asan_function_start (void); >> extern void asan_finish_file (void); >> extern rtx asan_emit_stack_protection (rtx, HOST_WIDE_INT *, tree *, >> int); >> extern bool asan_protect_global (tree); >> --- gcc/final.c.jj 2013-10-23 14:43:12.000000000 +0200 >> +++ gcc/final.c 2013-10-29 12:49:33.609176613 +0100 >> @@ -78,6 +78,7 @@ along with GCC; see the file COPYING3. >> #include "cfgloop.h" >> #include "params.h" >> #include "tree-pretty-print.h" /* for dump_function_header */ >> +#include "asan.h" >> >> #ifdef XCOFF_DEBUGGING_INFO >> #include "xcoffout.h" /* Needed for external data >> @@ -1738,6 +1739,9 @@ final_start_function (rtx first, FILE *f >> >> high_block_linenum = high_function_linenum = last_linenum; >> >> + if (flag_sanitize & SANITIZE_ADDRESS) >> + asan_function_start (); >> + >> if (!DECL_IGNORED_P (current_function_decl)) >> debug_hooks->begin_prologue (last_linenum, last_filename); >> >> >> >> Jakub > >