aboutsummaryrefslogtreecommitdiff
path: root/breakpoints.c
diff options
context:
space:
mode:
authorPetr Machata <pmachata@redhat.com>2013-10-16 14:46:24 +0200
committerPetr Machata <pmachata@redhat.com>2013-10-23 01:00:02 +0200
commit9f819d5747dc2b8e0f7ac54b38dc321115de6dda (patch)
tree452c7753ef06db25fa7e0fdba5b2dd620ae171da /breakpoints.c
parent8fdd09b028426f92df614d6ebe5c56d99877febf (diff)
downloadltrace-9f819d5747dc2b8e0f7ac54b38dc321115de6dda.tar.gz
Allow per-OS configuration hooks for struct breakpoint
Diffstat (limited to 'breakpoints.c')
-rw-r--r--breakpoints.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/breakpoints.c b/breakpoints.c
index 4b3cdd3..f0dd5b6 100644
--- a/breakpoints.c
+++ b/breakpoints.c
@@ -101,6 +101,25 @@ address2bpstruct(struct process *proc, arch_addr_t addr)
return found;
}
+#ifndef OS_HAVE_BREAKPOINT_DATA
+int
+os_breakpoint_init(struct process *proc, struct breakpoint *sbp)
+{
+ return 0;
+}
+
+void
+os_breakpoint_destroy(struct breakpoint *sbp)
+{
+}
+
+int
+os_breakpoint_clone(struct breakpoint *retp, struct breakpoint *sbp)
+{
+ return 0;
+}
+#endif
+
#ifndef ARCH_HAVE_BREAKPOINT_DATA
int
arch_breakpoint_init(struct process *proc, struct breakpoint *sbp)
@@ -140,7 +159,13 @@ breakpoint_init(struct breakpoint *bp, struct process *proc,
arch_addr_t addr, struct library_symbol *libsym)
{
breakpoint_init_base(bp, addr, libsym);
- return arch_breakpoint_init(proc, bp);
+ if (os_breakpoint_init(proc, bp) < 0)
+ return -1;
+ if (arch_breakpoint_init(proc, bp) < 0) {
+ os_breakpoint_destroy(bp);
+ return -1;
+ }
+ return 0;
}
void
@@ -157,6 +182,7 @@ breakpoint_destroy(struct breakpoint *bp)
if (bp == NULL)
return;
arch_breakpoint_destroy(bp);
+ os_breakpoint_destroy(bp);
}
int
@@ -172,8 +198,12 @@ breakpoint_clone(struct breakpoint *retp, struct process *new_proc,
breakpoint_init_base(retp, bp->addr, libsym);
memcpy(retp->orig_value, bp->orig_value, sizeof(bp->orig_value));
retp->enabled = bp->enabled;
- if (arch_breakpoint_clone(retp, bp) < 0)
+ if (os_breakpoint_clone(retp, bp) < 0)
return -1;
+ if (arch_breakpoint_clone(retp, bp) < 0) {
+ os_breakpoint_destroy(retp);
+ return -1;
+ }
breakpoint_set_callbacks(retp, bp->cbs);
return 0;
}