+2011-02-14 Pedro Alves <pedro@codesourcery.com>
+
+ * Makefile.in (SFILES): Add memrange.c.
+ (HFILES_NO_SRCDIR): Add memrange.h.
+ (COMMON_OBS): Add memrange.o.
+ * memrange.c: New file.
+ * memrange.h: New file.
+ * tracepoint.c: Include memrange.h.
+ (struct mem_range): Delete.
+ (mem_range_s): Delete.
+ (traceframe_available_memory): New function.
+ * tracepoint.h (traceframe_available_memory): Declare.
+
2011-02-14 Pedro Alves <pedro@codesourcery.com>
* target.h (struct traceframe_info): Forward declare.
m2-exp.y m2-lang.c m2-typeprint.c m2-valprint.c \
macrotab.c macroexp.c macrocmd.c macroscope.c main.c maint.c \
mdebugread.c memattr.c mem-break.c minsyms.c mipsread.c memory-map.c \
- mi/mi-common.c \
+ memrange.c mi/mi-common.c \
objc-exp.y objc-lang.c \
objfiles.c osabi.c observer.c osdata.c \
opencl-lang.c \
gdbserver/linux-low.h gdbserver/gdb_proc_service.h \
gdbserver/regcache.h gdbthread.h dwarf2-frame.h nbsd-nat.h dcache.h \
amd64-nat.h s390-tdep.h arm-linux-tdep.h exceptions.h macroscope.h \
-gdbarch.h bsd-uthread.h gdb_thread_db.h gdb_stat.h memory-map.h \
+gdbarch.h bsd-uthread.h gdb_thread_db.h gdb_stat.h memory-map.h memrange.h \
mdebugread.h m88k-tdep.h stabsread.h hppa-linux-offsets.h linux-fork.h \
ser-unix.h inf-ptrace.h terminal.h ui-out.h frame-base.h \
f-lang.h dwarf2loc.h value.h sparc-tdep.h defs.h target-descriptions.h \
trad-frame.o \
tramp-frame.o \
solib.o solib-target.o \
- prologue-value.o memory-map.o xml-support.o xml-syscall.o \
+ prologue-value.o memory-map.o memrange.o xml-support.o xml-syscall.o \
target-descriptions.o target-memory.o xml-tdesc.o xml-builtin.o \
inferior.o osdata.o gdb_usleep.o record.o gcore.o \
jit.o progspace.o
--- /dev/null
+/* Memory ranges
+
+ Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "defs.h"
+#include "memrange.h"
+
+int
+mem_ranges_overlap (CORE_ADDR start1, int len1,
+ CORE_ADDR start2, int len2)
+{
+ ULONGEST h, l;
+
+ l = max (start1, start2);
+ h = min (start1 + len1, start2 + len2);
+ return (l < h);
+}
+
+/* qsort comparison function, that compares mem_ranges. */
+
+static int
+compare_mem_ranges (const void *ap, const void *bp)
+{
+ const struct mem_range *r1 = ap;
+ const struct mem_range *r2 = bp;
+
+ if (r1->start > r2->start)
+ return 1;
+ else if (r1->start < r2->start)
+ return -1;
+ else
+ return 0;
+}
+
+void
+normalize_mem_ranges (VEC(mem_range_s) *ranges)
+{
+ if (!VEC_empty (mem_range_s, ranges))
+ {
+ struct mem_range *ra, *rb;
+ int a, b;
+
+ qsort (VEC_address (mem_range_s, ranges),
+ VEC_length (mem_range_s, ranges),
+ sizeof (mem_range_s),
+ compare_mem_ranges);
+
+ a = 0;
+ ra = VEC_index (mem_range_s, ranges, a);
+ for (b = 1; VEC_iterate (mem_range_s, ranges, b, rb); b++)
+ {
+ /* If mem_range B overlaps or is adjacent to mem_range A,
+ merge them. */
+ if (rb->start <= ra->start + ra->length)
+ {
+ ra->length = (rb->start + rb->length) - ra->start;
+ continue; /* next b, same a */
+ }
+ a++; /* next a */
+ ra = VEC_index (mem_range_s, ranges, a);
+
+ if (a != b)
+ *ra = *rb;
+ }
+ VEC_truncate (mem_range_s, ranges, a + 1);
+ }
+}
--- /dev/null
+/* The memory range data structure, and associated utilities.
+
+ Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef MEMRANGE_H
+#define MEMRANGE_H
+
+#include "vec.h"
+
+/* Defines a [START, START + LENGTH) memory range. */
+
+struct mem_range
+{
+ /* Lowest address in the range. */
+ CORE_ADDR start;
+
+ /* Length of the range. */
+ int length;
+};
+
+typedef struct mem_range mem_range_s;
+
+DEF_VEC_O(mem_range_s);
+
+/* Returns true if the ranges defined by [start1, start1+len1) and
+ [start2, start2+len2) overlap. */
+
+extern int mem_ranges_overlap (CORE_ADDR start1, int len1,
+ CORE_ADDR start2, int len2);
+
+/* Sort ranges by start address, then coalesce contiguous or
+ overlapping ranges. */
+
+extern void normalize_mem_ranges (VEC(mem_range_s) *memory);
+
+#endif
#include "source.h"
#include "ax.h"
#include "ax-gdb.h"
+#include "memrange.h"
/* readline include files */
#include "readline/readline.h"
typedef struct trace_state_variable tsv_s;
DEF_VEC_O(tsv_s);
-/* Defines a [START, START + LENGTH) memory range. */
-
-struct mem_range
-{
- /* Lowest address in the range. */
- CORE_ADDR start;
-
- /* Length of the range. */
- int length;
-};
-
-typedef struct mem_range mem_range_s;
-
-DEF_VEC_O(mem_range_s);
-
/* An object describing the contents of a traceframe. */
struct traceframe_info
return traceframe_info;
}
+/* Return in RESULT, the set of collected memory in the current
+ traceframe, found within the LEN bytes range starting at MEMADDR.
+ Returns true if the target supports the query, otherwise returns
+ false. */
+
+int
+traceframe_available_memory (VEC(mem_range_s) **result,
+ CORE_ADDR memaddr, ULONGEST len)
+{
+ struct traceframe_info *info = get_traceframe_info ();
+
+ if (info != NULL)
+ {
+ struct mem_range *r;
+ int i;
+
+ *result = NULL;
+
+ for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
+ if (mem_ranges_overlap (r->start, r->length, memaddr, len))
+ {
+ ULONGEST lo1, hi1, lo2, hi2;
+ struct mem_range *nr;
+
+ lo1 = memaddr;
+ hi1 = memaddr + len;
+
+ lo2 = r->start;
+ hi2 = r->start + r->length;
+
+ nr = VEC_safe_push (mem_range_s, *result, NULL);
+
+ nr->start = max (lo1, lo2);
+ nr->length = min (hi1, hi2) - nr->start;
+ }
+
+ normalize_mem_ranges (*result);
+ return 1;
+ }
+
+ return 0;
+}
+
/* module initialization */
void
_initialize_tracepoint (void)
#include "breakpoint.h"
#include "target.h"
+#include "memrange.h"
/* A trace state variable is a value managed by a target being
traced. A trace state variable (or tsv for short) can be accessed
extern struct traceframe_info *parse_traceframe_info (const char *tframe_info);
+extern int traceframe_available_memory (VEC(mem_range_s) **result,
+ CORE_ADDR memaddr, ULONGEST len);
+
#endif /* TRACEPOINT_H */