From 08807d5afd29a5dba40d31cd28a78af64e4fae15 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 16 Feb 2011 12:59:05 +0000 Subject: [PATCH] 2011-02-16 Pedro Alves Jan Kratochvil gdb/ * tracepoint.c (memrange_sortmerge): Fix list A's end calculation. 2011-02-16 Pedro Alves gdb/testsuite/ * collection.c (globalarr2): New global. (main): Initialize it before collecting, and and clear it afterwards. * collection.exp (gdb_collect_globals_test): Test collecting overlapping memory ranges. --- gdb/ChangeLog | 6 ++++++ gdb/testsuite/ChangeLog | 8 ++++++++ gdb/testsuite/gdb.trace/collection.c | 6 ++++++ gdb/testsuite/gdb.trace/collection.exp | 24 +++++++++++++++++++++++- gdb/tracepoint.c | 3 ++- 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2ba8ef09cef..6b92f5d6cf9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2011-02-16 Pedro Alves + Jan Kratochvil + + gdb/ + * tracepoint.c (memrange_sortmerge): Fix list A's end calculation. + 2011-02-16 Pedro Alves Jan Kratochvil diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8f79acd8058..ecec2291fcf 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-02-16 Pedro Alves + + * collection.c (globalarr2): New global. + (main): Initialize it before collecting, and and clear it + afterwards. + * collection.exp (gdb_collect_globals_test): Test collecting + overlapping memory ranges. + 2011-02-15 Michael Snyder * gdb.base/default.exp: Add tests for thread commands. diff --git a/gdb/testsuite/gdb.trace/collection.c b/gdb/testsuite/gdb.trace/collection.c index 4a58170be1a..422b737cc8a 100644 --- a/gdb/testsuite/gdb.trace/collection.c +++ b/gdb/testsuite/gdb.trace/collection.c @@ -26,6 +26,7 @@ double globald; test_struct globalstruct; test_struct *globalp; int globalarr[16]; +int globalarr2[4]; struct global_pieces { unsigned int a; @@ -237,6 +238,9 @@ main (argc, argv, envp) for (i = 0; i < 15; i++) globalarr[i] = i; + for (i = 0; i < 4; i++) + globalarr2[i] = i; + mystruct.memberc = 101; mystruct.memberi = 102; mystruct.memberf = 103.3; @@ -283,6 +287,8 @@ main (argc, argv, envp) globalp = 0; for (i = 0; i < 15; i++) globalarr[i] = 0; + for (i = 0; i < 4; i++) + globalarr2[i] = 0; end (); return 0; diff --git a/gdb/testsuite/gdb.trace/collection.exp b/gdb/testsuite/gdb.trace/collection.exp index 4e0a30d4902..c966f2f129d 100644 --- a/gdb/testsuite/gdb.trace/collection.exp +++ b/gdb/testsuite/gdb.trace/collection.exp @@ -457,13 +457,29 @@ proc gdb_collect_globals_test { } { } } + # Use use this to test collecting overlapping memory ranges + # (making use of UNOP_MEMVAL, as objects don't usually overlap + # other objects). Note that globalarr2 should not be collected in + # any other way so that a regression test below can be effective. + + set globalarr2_addr "" + set test "get address of globalarr2" + gdb_test_multiple "p /x &globalarr2" $test { + -re " = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" { + set globalarr2_addr $expect_out(1,string) + pass $test + } + } + gdb_test "trace $testline" \ "Tracepoint \[0-9\]+ at .*" \ "collect globals: set tracepoint" gdb_trace_setactions "collect globals: define actions" \ "" \ "collect globalc, globali, globalf, globald" "^$" \ - "collect globalstruct, globalp, globalarr" "^$" + "collect globalstruct, globalp, globalarr" "^$" \ + "collect \{int \[4\]\}$globalarr2_addr" "^$" \ + "collect \{int \[2\]\}$globalarr2_addr" "^$" # Begin the test. run_trace_experiment "globals" globals_test_func @@ -508,6 +524,12 @@ proc gdb_collect_globals_test { } { "\\$\[0-9\]+ = 3$cr" \ "collect globals: collected global array element #3" + # Check that we didn't mess up sort&merging memory ranges to + # collect. + gdb_test "print globalarr2" \ + "\\$\[0-9\]+ = \\{0, 1, 2, 3\\}$cr" \ + "collect globals: collected global array 2" + gdb_test "tfind none" \ "#0 end .*" \ "collect globals: cease trace debugging" diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 4389f12048d..2d675ce118b 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -846,7 +846,8 @@ memrange_sortmerge (struct collection_list *memranges) if (memranges->list[a].type == memranges->list[b].type && memranges->list[b].start <= memranges->list[a].end) { - memranges->list[a].end = memranges->list[b].end; + if (memranges->list[b].end > memranges->list[a].end) + memranges->list[a].end = memranges->list[b].end; continue; /* next b, same a */ } a++; /* next a */ -- 2.30.2