On Fri, Feb 15, 2013 at 09:54:19PM +0100, Dodji Seketeli wrote: > Hello, > > This PR uncovers an issue my latest optimization patch on Address > Sanitizer introduced. > > This is in the context of instrumenting an access to a memory region, > like in: > > void > foo (char *a, char *b, int s) > { > __builtin_memmove (a, b, s); > } > > In this case, asan has to instrument accesses to two memory regions: > [a a+s[ and [b b+s[. > > The way asan does instrument the access to e.g [a a+s[ his is that it > instruments the access to the byte pointed to by the pointer 'a', and > the access to the byte pointed to by the pointer 'a+s-1'. > > Now what happens when we want to avoid doing redundant > instrumentations like in: > > void > bar (char *a, char *b, char *c) > { > __builtin_memmove (a, b, c[b[0]]); > } > > So here, we first instrument the access to the memory of b[0] (in the > expression c[b[0]]). So in the course of instrumenting the access for > the memory region [b b+s[, we don't want to instrument the access to > the memory pointed by 'p', as that was already been instrumented for > the b[0] expression. So we just instrument the access to memory > through b+s-1. > > This is what I'd call 'partial memory region instrumentation'; it > happens in the function instrument_mem_region_access, and it was > basically corrupting the CFG because instrument_mem_region_access was > not correctly updating the statement iterator it receives in argument > so subsequent use of that iterator (to append instrumentation > statements) was leading to statements not being added to their correct > place. The compiler crash reported in this PR is due to this CFG > corruption. > > There is another underlying issue that can lead to runtime errors. > When doing partial memory region instrumentation in e.g the case of > the bar function above I was forgetting to enclose the instrumentation > statements of [a, a+s[ and [b, b+s[ into a if (len != 0) {} clause > (len being c[b[0]] here) for the cases where len is not a constant. > The patch addresses this too. > > Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk, and > approved by Jakub in the audit trail of the PR at > http://gcc.gnu.org/PR56330. I am about to commit in a short while.
On x86_64-apple-darwin12, this patch is producing a failure of... FAIL: c-c++-common/asan/no-redundant-instrumentation-7.c -O0 scan-tree-dump-times asan0 "__builtin___asan_report_load" 6 at both -m32 and -m64. The no-redundant-instrumentation-7.s from the failing -m64 test case is attached, generated with... # /sw/src/fink.build/gcc48-4.8.0-1000/darwin_objdir/gcc/testsuite/g++/../../xg++ -B/sw/src/fink.build/gcc48-4.8.0-1000/darwin_objdir/gcc/testsuite/g++/../../ /sw/src/fink.build/gcc48-4.8.0-1000/gcc-4.8-20130215/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-7.c -fsanitize=address -g -fno-diagnostics-show-caret -nostdinc++ -I/sw/src/fink.build/gcc48-4.8.0-1000/darwin_objdir/x86_64-apple-darwin12.2.0/libstdc++-v3/include/x86_64-apple-darwin12.2.0 -I/sw/src/fink.build/gcc48-4.8.0-1000/darwin_objdir/x86_64-apple-darwin12.2.0/libstdc++-v3/include -I/sw/src/fink.build/gcc48-4.8.0-1000/gcc-4.8-20130215/libstdc++-v3/libsupc++ -I/sw/src/fink.build/gcc48-4.8.0-1000/gcc-4.8-20130215/libstdc++-v3/include/backward -I/sw/src/fink.build/gcc48-4.8.0-1000/gcc-4.8-20130215/libstdc++-v3/testsuite/util -fmessage-length=0 -O0 -fdump-tree-asan0 -S -m64 -o no-redundant-instrumentation-7.s > > gcc/ > * asan.c (get_mem_refs_of_builtin_call): White space and style > cleanup. > (instrument_mem_region_access): Do not forget to always put > instrumentation of the of 'base' and 'base + len' in a "if (len != > 0) statement, even for cases where either 'base' or 'base + len' > are not instrumented -- because they have been previously > instrumented. Simplify the logic by putting all the statements > instrument 'base + len' inside a sequence, and then insert that > sequence right before the current insertion point. Then, to > instrument 'base + len', just get an iterator on that statement. > And do not forget to update the pointer to iterator the function > received as argument. > > gcc/testsuite/ > > * c-c++-common/asan/no-redundant-instrumentation-4.c: New test file. > * c-c++-common/asan/no-redundant-instrumentation-5.c: Likewise. > * c-c++-common/asan/no-redundant-instrumentation-6.c: Likewise. > * c-c++-common/asan/no-redundant-instrumentation-7.c: Likewise. > * c-c++-common/asan/no-redundant-instrumentation-8.c: Likewise. > * c-c++-common/asan/pr56330.c: Likewise. > * c-c++-common/asan/no-redundant-instrumentation-1.c (test1): > Ensure the size argument of __builtin_memcpy is a constant. > --- > gcc/asan.c | 97 > ++++++++++++---------- > .../asan/no-redundant-instrumentation-1.c | 2 +- > .../asan/no-redundant-instrumentation-4.c | 13 +++ > .../asan/no-redundant-instrumentation-5.c | 13 +++ > .../asan/no-redundant-instrumentation-6.c | 14 ++++ > .../asan/no-redundant-instrumentation-7.c | 22 +++++ > .../asan/no-redundant-instrumentation-8.c | 14 ++++ > gcc/testsuite/c-c++-common/asan/pr56330.c | 23 +++++ > 8 files changed, 153 insertions(+), 45 deletions(-) > create mode 100644 > gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-4.c > create mode 100644 > gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-5.c > create mode 100644 > gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-6.c > create mode 100644 > gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-7.c > create mode 100644 > gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-8.c > create mode 100644 gcc/testsuite/c-c++-common/asan/pr56330.c > > diff --git a/gcc/asan.c b/gcc/asan.c > index a569479..67236a9 100644 > --- a/gcc/asan.c > +++ b/gcc/asan.c > @@ -747,20 +747,17 @@ get_mem_refs_of_builtin_call (const gimple call, > > got_reference_p = true; > } > - else > - { > - if (dest) > - { > - dst->start = dest; > - dst->access_size = access_size; > - *dst_len = NULL_TREE; > - *dst_is_store = is_store; > - *dest_is_deref = true; > - got_reference_p = true; > - } > - } > + else if (dest) > + { > + dst->start = dest; > + dst->access_size = access_size; > + *dst_len = NULL_TREE; > + *dst_is_store = is_store; > + *dest_is_deref = true; > + got_reference_p = true; > + } > > - return got_reference_p; > + return got_reference_p; > } > > /* Return true iff a given gimple statement has been instrumented. > @@ -1535,8 +1532,15 @@ instrument_mem_region_access (tree base, tree len, > > /* If the beginning of the memory region has already been > instrumented, do not instrument it. */ > - if (has_mem_ref_been_instrumented (base, 1)) > - goto after_first_instrumentation; > + bool start_instrumented = has_mem_ref_been_instrumented (base, 1); > + > + /* If the end of the memory region has already been instrumented, do > + not instrument it. */ > + tree end = asan_mem_ref_get_end (base, len); > + bool end_instrumented = has_mem_ref_been_instrumented (end, 1); > + > + if (start_instrumented && end_instrumented) > + return; > > if (!is_gimple_constant (len)) > { > @@ -1562,37 +1566,39 @@ instrument_mem_region_access (tree base, tree len, > > /* The 'then block' of the 'if (len != 0) condition is where > we'll generate the asan instrumentation code now. */ > - gsi = gsi_start_bb (then_bb); > + gsi = gsi_last_bb (then_bb); > } > > - /* Instrument the beginning of the memory region to be accessed, > - and arrange for the rest of the intrumentation code to be > - inserted in the then block *after* the current gsi. */ > - build_check_stmt (location, base, &gsi, /*before_p=*/true, is_store, 1); > - > - if (then_bb) > - /* We are in the case where the length of the region is not > - constant; so instrumentation code is being generated in the > - 'then block' of the 'if (len != 0) condition. Let's arrange > - for the subsequent instrumentation statements to go in the > - 'then block'. */ > - gsi = gsi_last_bb (then_bb); > - else > - *iter = gsi; > - > - update_mem_ref_hash_table (base, 1); > + if (!start_instrumented) > + { > + /* Instrument the beginning of the memory region to be accessed, > + and arrange for the rest of the intrumentation code to be > + inserted in the then block *after* the current gsi. */ > + build_check_stmt (location, base, &gsi, /*before_p=*/true, is_store, > 1); > + > + if (then_bb) > + /* We are in the case where the length of the region is not > + constant; so instrumentation code is being generated in the > + 'then block' of the 'if (len != 0) condition. Let's arrange > + for the subsequent instrumentation statements to go in the > + 'then block'. */ > + gsi = gsi_last_bb (then_bb); > + else > + { > + *iter = gsi; > + /* Don't remember this access as instrumented, if length > + is unknown. It might be zero and not being actually > + instrumented, so we can't rely on it being instrumented. */ > + update_mem_ref_hash_table (base, 1); > + } > + } > > - after_first_instrumentation: > + if (end_instrumented) > + return; > > /* We want to instrument the access at the end of the memory region, > which is at (base + len - 1). */ > > - /* If the end of the memory region has already been instrumented, do > - not instrument it. */ > - tree end = asan_mem_ref_get_end (base, len); > - if (has_mem_ref_been_instrumented (end, 1)) > - return; > - > /* offset = len - 1; */ > len = unshare_expr (len); > tree offset; > @@ -1639,8 +1645,6 @@ instrument_mem_region_access (tree base, tree len, > base, NULL); > gimple_set_location (region_end, location); > gimple_seq_add_stmt_without_update (&seq, region_end); > - gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT); > - gsi_prev (&gsi); > > /* _2 = _1 + offset; */ > region_end = > @@ -1649,13 +1653,18 @@ instrument_mem_region_access (tree base, tree len, > gimple_assign_lhs (region_end), > offset); > gimple_set_location (region_end, location); > - gsi_insert_after (&gsi, region_end, GSI_NEW_STMT); > + gimple_seq_add_stmt_without_update (&seq, region_end); > + gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT); > > /* instrument access at _2; */ > + gsi = gsi_for_stmt (region_end); > build_check_stmt (location, gimple_assign_lhs (region_end), > &gsi, /*before_p=*/false, is_store, 1); > > - update_mem_ref_hash_table (end, 1); > + if (then_bb == NULL) > + update_mem_ref_hash_table (end, 1); > + > + *iter = gsi_for_stmt (gsi_stmt (*iter)); > } > > /* Instrument the call (to the builtin strlen function) pointed to by > @@ -1783,7 +1792,7 @@ instrument_builtin_call (gimple_stmt_iterator *iter) > } > else if (src0_len || src1_len || dest_len) > { > - if (src0.start) > + if (src0.start != NULL_TREE) > instrument_mem_region_access (src0.start, src0_len, > iter, loc, /*is_store=*/false); > if (src1.start != NULL_TREE) > diff --git a/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-1.c > b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-1.c > index cc98fdb..6cf6441 100644 > --- a/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-1.c > +++ b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-1.c > @@ -45,7 +45,7 @@ test1 () > /* There are 2 calls to __builtin___asan_report_store1 and 2 calls > to __builtin___asan_report_load1 to instrument the store to > (subset of) the memory region of tab. */ > - __builtin_memcpy (&tab[1], foo, sizeof (tab) - 1); > + __builtin_memcpy (&tab[1], foo, 3); > > /* This should not generate a __builtin___asan_report_load1 because > the reference to tab[1] has been already instrumented above. */ > diff --git a/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-4.c > b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-4.c > new file mode 100644 > index 0000000..b2e7284 > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-4.c > @@ -0,0 +1,13 @@ > +/* { dg-options "-fdump-tree-asan0" } */ > +/* { dg-do compile } */ > +/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ > + > +void > +foo (int *a, char *b, char *c) > +{ > + __builtin_memmove (c, b, a[c[0]]); > +} > + > +/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 3 > "asan0" } } */ > +/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store1" 1 > "asan0" } } */ > +/* { dg-final { cleanup-tree-dump "asan0" } } */ > diff --git a/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-5.c > b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-5.c > new file mode 100644 > index 0000000..ead3f58 > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-5.c > @@ -0,0 +1,13 @@ > +/* { dg-options "-fdump-tree-asan0" } */ > +/* { dg-do compile } */ > +/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ > + > +void > +foo (int *a, char *b, char *c) > +{ > + __builtin_memmove (c, b, a[b[0]]); > +} > + > +/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 2 > "asan0" } } */ > +/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store1" 2 > "asan0" } } */ > +/* { dg-final { cleanup-tree-dump "asan0" } } */ > diff --git a/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-6.c > b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-6.c > new file mode 100644 > index 0000000..e4691bc > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-6.c > @@ -0,0 +1,14 @@ > +/* { dg-options "-fdump-tree-asan0" } */ > +/* { dg-do compile } */ > +/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ > + > +void > +foo (int *a, char *b, char *c) > +{ > + __builtin_memmove (c, b, a[c[0]]); > + __builtin_memmove (c, b, a[b[0]]); > +} > + > +/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 5 > "asan0" } } */ > +/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store1" 2 > "asan0" } } */ > +/* { dg-final { cleanup-tree-dump "asan0" } } */ > diff --git a/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-7.c > b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-7.c > new file mode 100644 > index 0000000..aba409b > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-7.c > @@ -0,0 +1,22 @@ > +/* { dg-options "-fdump-tree-asan0" } */ > +/* { dg-do compile } */ > +/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ > + > +char e[200]; > + > +struct S > +{ > + char a[100]; > + char b[100]; > +} s; > + > +void > +foo (int *a, char *b, char *c) > +{ > + __builtin_memcmp (s.a, e, 100); > + __builtin_memcmp (s.a, e, 200); > +} > + > +/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load" 6 > "asan0" } } */ > +/* { dg-final { scan-tree-dump-not "__builtin___asan_report_store" "asan0" } > } */ > +/* { dg-final { cleanup-tree-dump "asan" } } */ > diff --git a/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-8.c > b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-8.c > new file mode 100644 > index 0000000..38ea7a2 > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-8.c > @@ -0,0 +1,14 @@ > +/* { dg-options "-fdump-tree-asan0" } */ > +/* { dg-do compile } */ > +/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */ > + > +char > +foo (int *a, char *b, char *c) > +{ > + __builtin_memmove (c, b, a[b[0]]); > + return c[0] + b[0]; > +} > + > +/* { dg-final { scan-tree-dump-times "__builtin___asan_report_load1" 3 > "asan0" } } */ > +/* { dg-final { scan-tree-dump-times "__builtin___asan_report_store1" 2 > "asan0" } } */ > +/* { dg-final { cleanup-tree-dump "asan0" } } */ > diff --git a/gcc/testsuite/c-c++-common/asan/pr56330.c > b/gcc/testsuite/c-c++-common/asan/pr56330.c > new file mode 100644 > index 0000000..18f1065 > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/asan/pr56330.c > @@ -0,0 +1,23 @@ > +/* PR sanitizer/56330 */ > +/* { dg-do compile } */ > + > +char e[200]; > + > +struct S > +{ > + char a[100]; > + char b[100]; > +} s; > + > +void > +foo (void) > +{ > + __builtin_memcmp (s.a, e, 100); > + __builtin_memcmp (s.a, e, 200); > +} > + > +void > +bar (int *a, char *b, char *c) > +{ > + __builtin_memmove (c, b, a[b[0]]); > +} > -- > Dodji
.text Ltext0: .globl _e .zerofill __DATA,__pu_bss5,_e,256,5 .globl _s .zerofill __DATA,__pu_bss5,_s,256,5 .text .globl __Z3fooPiPcS0_ __Z3fooPiPcS0_: LFB0: .file 1 "/sw/src/fink.build/gcc48-4.8.0-1000/gcc-4.8-20130215/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-7.c" .loc 1 15 0 pushq %rbp LCFI0: movq %rsp, %rbp LCFI1: movq %rdi, -8(%rbp) movq %rsi, -16(%rbp) movq %rdx, -24(%rbp) .loc 1 18 0 popq %rbp LCFI2: ret LFE0: .cstring .align 3 LC0: .ascii "s (/sw/src/fink.build/gcc48-4.8.0-1000/gcc-4.8-20130215/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-7.c)\0" .align 3 LC1: .ascii "e (/sw/src/fink.build/gcc48-4.8.0-1000/gcc-4.8-20130215/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-7.c)\0" .data .align 5 LASAN0: .quad _s .quad 200 .quad 256 .quad LC0 .quad 0 .quad _e .quad 200 .quad 256 .quad LC1 .quad 0 .text __GLOBAL__sub_D_00099_0_no_redundant_instrumentation_7.c: LFB1: .loc 1 18 0 pushq %rbp LCFI3: movq %rsp, %rbp LCFI4: .loc 1 18 0 movl $2, %esi leaq LASAN0(%rip), %rdi call ___asan_unregister_globals popq %rbp LCFI5: ret LFE1: __GLOBAL__sub_I_00099_1_no_redundant_instrumentation_7.c: LFB2: .loc 1 18 0 pushq %rbp LCFI6: movq %rsp, %rbp LCFI7: .loc 1 18 0 call ___asan_init_v1 movl $2, %esi leaq LASAN0(%rip), %rdi call ___asan_register_globals popq %rbp LCFI8: ret LFE2: .section __DWARF,__debug_frame,regular,debug Lsection__debug_frame: Lframe0: .set L$set$0,LECIE0-LSCIE0 .long L$set$0 LSCIE0: .long 0xffffffff .byte 0x1 .ascii "\0" .byte 0x1 .byte 0x78 .byte 0x10 .byte 0xc .byte 0x7 .byte 0x8 .byte 0x90 .byte 0x1 .align 3 LECIE0: LSFDE0: .set L$set$1,LEFDE0-LASFDE0 .long L$set$1 LASFDE0: .set L$set$2,Lframe0-Lsection__debug_frame .long L$set$2 .quad LFB0 .set L$set$3,LFE0-LFB0 .quad L$set$3 .byte 0x4 .set L$set$4,LCFI0-LFB0 .long L$set$4 .byte 0xe .byte 0x10 .byte 0x86 .byte 0x2 .byte 0x4 .set L$set$5,LCFI1-LCFI0 .long L$set$5 .byte 0xd .byte 0x6 .byte 0x4 .set L$set$6,LCFI2-LCFI1 .long L$set$6 .byte 0xc .byte 0x7 .byte 0x8 .align 3 LEFDE0: LSFDE2: .set L$set$7,LEFDE2-LASFDE2 .long L$set$7 LASFDE2: .set L$set$8,Lframe0-Lsection__debug_frame .long L$set$8 .quad LFB1 .set L$set$9,LFE1-LFB1 .quad L$set$9 .byte 0x4 .set L$set$10,LCFI3-LFB1 .long L$set$10 .byte 0xe .byte 0x10 .byte 0x86 .byte 0x2 .byte 0x4 .set L$set$11,LCFI4-LCFI3 .long L$set$11 .byte 0xd .byte 0x6 .byte 0x4 .set L$set$12,LCFI5-LCFI4 .long L$set$12 .byte 0xc .byte 0x7 .byte 0x8 .align 3 LEFDE2: LSFDE4: .set L$set$13,LEFDE4-LASFDE4 .long L$set$13 LASFDE4: .set L$set$14,Lframe0-Lsection__debug_frame .long L$set$14 .quad LFB2 .set L$set$15,LFE2-LFB2 .quad L$set$15 .byte 0x4 .set L$set$16,LCFI6-LFB2 .long L$set$16 .byte 0xe .byte 0x10 .byte 0x86 .byte 0x2 .byte 0x4 .set L$set$17,LCFI7-LCFI6 .long L$set$17 .byte 0xd .byte 0x6 .byte 0x4 .set L$set$18,LCFI8-LCFI7 .long L$set$18 .byte 0xc .byte 0x7 .byte 0x8 .align 3 LEFDE4: .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support EH_frame1: .set L$set$19,LECIE1-LSCIE1 .long L$set$19 LSCIE1: .long 0 .byte 0x1 .ascii "zR\0" .byte 0x1 .byte 0x78 .byte 0x10 .byte 0x1 .byte 0x10 .byte 0xc .byte 0x7 .byte 0x8 .byte 0x90 .byte 0x1 .align 3 LECIE1: LSFDE7: .set L$set$20,LEFDE7-LASFDE7 .long L$set$20 LASFDE7: .long LASFDE7-EH_frame1 .quad LFB0-. .set L$set$21,LFE0-LFB0 .quad L$set$21 .byte 0 .byte 0x4 .set L$set$22,LCFI0-LFB0 .long L$set$22 .byte 0xe .byte 0x10 .byte 0x86 .byte 0x2 .byte 0x4 .set L$set$23,LCFI1-LCFI0 .long L$set$23 .byte 0xd .byte 0x6 .byte 0x4 .set L$set$24,LCFI2-LCFI1 .long L$set$24 .byte 0xc .byte 0x7 .byte 0x8 .align 3 LEFDE7: LSFDE9: .set L$set$25,LEFDE9-LASFDE9 .long L$set$25 LASFDE9: .long LASFDE9-EH_frame1 .quad LFB1-. .set L$set$26,LFE1-LFB1 .quad L$set$26 .byte 0 .byte 0x4 .set L$set$27,LCFI3-LFB1 .long L$set$27 .byte 0xe .byte 0x10 .byte 0x86 .byte 0x2 .byte 0x4 .set L$set$28,LCFI4-LCFI3 .long L$set$28 .byte 0xd .byte 0x6 .byte 0x4 .set L$set$29,LCFI5-LCFI4 .long L$set$29 .byte 0xc .byte 0x7 .byte 0x8 .align 3 LEFDE9: LSFDE11: .set L$set$30,LEFDE11-LASFDE11 .long L$set$30 LASFDE11: .long LASFDE11-EH_frame1 .quad LFB2-. .set L$set$31,LFE2-LFB2 .quad L$set$31 .byte 0 .byte 0x4 .set L$set$32,LCFI6-LFB2 .long L$set$32 .byte 0xe .byte 0x10 .byte 0x86 .byte 0x2 .byte 0x4 .set L$set$33,LCFI7-LCFI6 .long L$set$33 .byte 0xd .byte 0x6 .byte 0x4 .set L$set$34,LCFI8-LCFI7 .long L$set$34 .byte 0xc .byte 0x7 .byte 0x8 .align 3 LEFDE11: .text Letext0: .section __DWARF,__debug_info,regular,debug Lsection__debug_info: Ldebug_info0: .long 0x302 .word 0x2 .set L$set$35,Ldebug_abbrev0-Lsection__debug_abbrev .long L$set$35 .byte 0x8 .byte 0x1 .ascii "GNU C++ 4.8.0 20130215 (experimental) -fPIC -feliminate-unused-debug-symbols -mmacosx-version-min=10.8.2 -m64 -mtune=core2 -g -O0 -fsanitize=address -fmessage-length=0\0" .byte 0x4 .ascii "/sw/src/fink.build/gcc48-4.8.0-1000/gcc-4.8-20130215/gcc/testsuite/c-c++-common/asan/no-redundant-instrumentation-7.c\0" .ascii "/sw/src/fink.build/gcc48-4.8.0-1000/darwin_objdir/gcc/testsuite/g++\0" .quad Ltext0 .quad Letext0 .set L$set$36,Ldebug_line0-Lsection__debug_line .long L$set$36 .byte 0x1 .byte 0x2 .ascii "S\0" .byte 0xc8 .byte 0x1 .byte 0x7 .long 0x1a7 .byte 0x3 .ascii "a\0" .byte 0x1 .byte 0x9 .long 0x1a7 .byte 0x2 .byte 0x23 .byte 0 .byte 0x3 .ascii "b\0" .byte 0x1 .byte 0xa .long 0x1a7 .byte 0x2 .byte 0x23 .byte 0x64 .byte 0 .byte 0x4 .long 0x1c3 .long 0x1b7 .byte 0x5 .long 0x1b7 .byte 0x63 .byte 0 .byte 0x6 .byte 0x8 .byte 0x7 .ascii "sizetype\0" .byte 0x6 .byte 0x1 .byte 0x6 .ascii "char\0" .byte 0x7 .byte 0x1 .ascii "foo\0" .byte 0x1 .byte 0xe .ascii "_Z3fooPiPcS0_\0" .quad LFB0 .quad LFE0 .set L$set$37,LLST0-Lsection__debug_loc .long L$set$37 .long 0x21e .byte 0x8 .ascii "a\0" .byte 0x1 .byte 0xe .long 0x21e .byte 0x2 .byte 0x91 .byte 0x68 .byte 0x8 .ascii "b\0" .byte 0x1 .byte 0xe .long 0x22b .byte 0x2 .byte 0x91 .byte 0x60 .byte 0x8 .ascii "c\0" .byte 0x1 .byte 0xe .long 0x22b .byte 0x2 .byte 0x91 .byte 0x58 .byte 0 .byte 0x9 .byte 0x8 .long 0x224 .byte 0x6 .byte 0x4 .byte 0x5 .ascii "int\0" .byte 0x9 .byte 0x8 .long 0x1c3 .byte 0x4 .long 0x1c3 .long 0x241 .byte 0x5 .long 0x1b7 .byte 0xc7 .byte 0 .byte 0xa .ascii "e\0" .byte 0x1 .byte 0x5 .long 0x231 .byte 0x1 .byte 0x9 .byte 0x3 .quad _e .byte 0xa .ascii "s\0" .byte 0x1 .byte 0xb .long 0x184 .byte 0x1 .byte 0x9 .byte 0x3 .quad _s .byte 0xb .ascii "_GLOBAL__sub_D_00099_0_no_redundant_instrumentation_7.c\0" .byte 0x1 .quad LFB1 .quad LFE1 .set L$set$38,LLST1-Lsection__debug_loc .long L$set$38 .byte 0xb .ascii "_GLOBAL__sub_I_00099_1_no_redundant_instrumentation_7.c\0" .byte 0x1 .quad LFB2 .quad LFE2 .set L$set$39,LLST2-Lsection__debug_loc .long L$set$39 .byte 0 .section __DWARF,__debug_abbrev,regular,debug Lsection__debug_abbrev: Ldebug_abbrev0: .byte 0x1 .byte 0x11 .byte 0x1 .byte 0x25 .byte 0x8 .byte 0x13 .byte 0xb .byte 0x3 .byte 0x8 .byte 0x1b .byte 0x8 .byte 0x11 .byte 0x1 .byte 0x12 .byte 0x1 .byte 0x10 .byte 0x6 .byte 0xb4,0x42 .byte 0xc .byte 0 .byte 0 .byte 0x2 .byte 0x13 .byte 0x1 .byte 0x3 .byte 0x8 .byte 0xb .byte 0xb .byte 0x3a .byte 0xb .byte 0x3b .byte 0xb .byte 0x1 .byte 0x13 .byte 0 .byte 0 .byte 0x3 .byte 0xd .byte 0 .byte 0x3 .byte 0x8 .byte 0x3a .byte 0xb .byte 0x3b .byte 0xb .byte 0x49 .byte 0x13 .byte 0x38 .byte 0xa .byte 0 .byte 0 .byte 0x4 .byte 0x1 .byte 0x1 .byte 0x49 .byte 0x13 .byte 0x1 .byte 0x13 .byte 0 .byte 0 .byte 0x5 .byte 0x21 .byte 0 .byte 0x49 .byte 0x13 .byte 0x2f .byte 0xb .byte 0 .byte 0 .byte 0x6 .byte 0x24 .byte 0 .byte 0xb .byte 0xb .byte 0x3e .byte 0xb .byte 0x3 .byte 0x8 .byte 0 .byte 0 .byte 0x7 .byte 0x2e .byte 0x1 .byte 0x3f .byte 0xc .byte 0x3 .byte 0x8 .byte 0x3a .byte 0xb .byte 0x3b .byte 0xb .byte 0x87,0x40 .byte 0x8 .byte 0x11 .byte 0x1 .byte 0x12 .byte 0x1 .byte 0x40 .byte 0x6 .byte 0x1 .byte 0x13 .byte 0 .byte 0 .byte 0x8 .byte 0x5 .byte 0 .byte 0x3 .byte 0x8 .byte 0x3a .byte 0xb .byte 0x3b .byte 0xb .byte 0x49 .byte 0x13 .byte 0x2 .byte 0xa .byte 0 .byte 0 .byte 0x9 .byte 0xf .byte 0 .byte 0xb .byte 0xb .byte 0x49 .byte 0x13 .byte 0 .byte 0 .byte 0xa .byte 0x34 .byte 0 .byte 0x3 .byte 0x8 .byte 0x3a .byte 0xb .byte 0x3b .byte 0xb .byte 0x49 .byte 0x13 .byte 0x3f .byte 0xc .byte 0x2 .byte 0xa .byte 0 .byte 0 .byte 0xb .byte 0x2e .byte 0 .byte 0x3 .byte 0x8 .byte 0x34 .byte 0xc .byte 0x11 .byte 0x1 .byte 0x12 .byte 0x1 .byte 0x40 .byte 0x6 .byte 0 .byte 0 .byte 0 .section __DWARF,__debug_loc,regular,debug Lsection__debug_loc: Ldebug_loc0: LLST0: .set L$set$40,LFB0-Ltext0 .quad L$set$40 .set L$set$41,LCFI0-Ltext0 .quad L$set$41 .word 0x2 .byte 0x77 .byte 0x8 .set L$set$42,LCFI0-Ltext0 .quad L$set$42 .set L$set$43,LCFI1-Ltext0 .quad L$set$43 .word 0x2 .byte 0x77 .byte 0x10 .set L$set$44,LCFI1-Ltext0 .quad L$set$44 .set L$set$45,LCFI2-Ltext0 .quad L$set$45 .word 0x2 .byte 0x76 .byte 0x10 .set L$set$46,LCFI2-Ltext0 .quad L$set$46 .set L$set$47,LFE0-Ltext0 .quad L$set$47 .word 0x2 .byte 0x77 .byte 0x8 .quad 0 .quad 0 LLST1: .set L$set$48,LFB1-Ltext0 .quad L$set$48 .set L$set$49,LCFI3-Ltext0 .quad L$set$49 .word 0x2 .byte 0x77 .byte 0x8 .set L$set$50,LCFI3-Ltext0 .quad L$set$50 .set L$set$51,LCFI4-Ltext0 .quad L$set$51 .word 0x2 .byte 0x77 .byte 0x10 .set L$set$52,LCFI4-Ltext0 .quad L$set$52 .set L$set$53,LCFI5-Ltext0 .quad L$set$53 .word 0x2 .byte 0x76 .byte 0x10 .set L$set$54,LCFI5-Ltext0 .quad L$set$54 .set L$set$55,LFE1-Ltext0 .quad L$set$55 .word 0x2 .byte 0x77 .byte 0x8 .quad 0 .quad 0 LLST2: .set L$set$56,LFB2-Ltext0 .quad L$set$56 .set L$set$57,LCFI6-Ltext0 .quad L$set$57 .word 0x2 .byte 0x77 .byte 0x8 .set L$set$58,LCFI6-Ltext0 .quad L$set$58 .set L$set$59,LCFI7-Ltext0 .quad L$set$59 .word 0x2 .byte 0x77 .byte 0x10 .set L$set$60,LCFI7-Ltext0 .quad L$set$60 .set L$set$61,LCFI8-Ltext0 .quad L$set$61 .word 0x2 .byte 0x76 .byte 0x10 .set L$set$62,LCFI8-Ltext0 .quad L$set$62 .set L$set$63,LFE2-Ltext0 .quad L$set$63 .word 0x2 .byte 0x77 .byte 0x8 .quad 0 .quad 0 .section __DWARF,__debug_pubnames,regular,debug Lsection__debug_pubnames: .long 0x9a .word 0x2 .set L$set$64,Ldebug_info0-Lsection__debug_info .long L$set$64 .long 0x306 .long 0x1cb .ascii "foo\0" .long 0x241 .ascii "e\0" .long 0x255 .ascii "s\0" .long 0x269 .ascii "_GLOBAL__sub_D_00099_0_no_redundant_instrumentation_7.c\0" .long 0x2b7 .ascii "_GLOBAL__sub_I_00099_1_no_redundant_instrumentation_7.c\0" .long 0 .section __DWARF,__debug_pubtypes,regular,debug Lsection__debug_pubtypes: .long 0x32 .word 0x2 .set L$set$65,Ldebug_info0-Lsection__debug_info .long L$set$65 .long 0x306 .long 0x1b7 .ascii "sizetype\0" .long 0x1c3 .ascii "char\0" .long 0x184 .ascii "S\0" .long 0x224 .ascii "int\0" .long 0 .section __DWARF,__debug_aranges,regular,debug Lsection__debug_aranges: .long 0x2c .word 0x2 .set L$set$66,Ldebug_info0-Lsection__debug_info .long L$set$66 .byte 0x8 .byte 0 .word 0 .word 0 .quad Ltext0 .set L$set$67,Letext0-Ltext0 .quad L$set$67 .quad 0 .quad 0 .section __DWARF,__debug_line,regular,debug Lsection__debug_line: Ldebug_line0: .section __DWARF,__debug_str,regular,debug Lsection__debug_str: .mod_init_func .align 3 .quad __GLOBAL__sub_I_00099_1_no_redundant_instrumentation_7.c .mod_term_func .align 3 .quad __GLOBAL__sub_D_00099_0_no_redundant_instrumentation_7.c .constructor .destructor .align 1 .subsections_via_symbols