Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Tarassov2011-12-30 22:58:27 +0000
committerEugene Tarassov2011-12-30 22:58:27 +0000
commita34186e5ac90c5781fbe0ded80f8909198634a9b (patch)
tree0616b538477a7f755654d42d73203e4f7bf40df0 /tests/test-dwarf
parentcd301e71bf1d8ea69ed5b98b9787820f407152b6 (diff)
downloadorg.eclipse.tcf.agent-a34186e5ac90c5781fbe0ded80f8909198634a9b.tar.gz
org.eclipse.tcf.agent-a34186e5ac90c5781fbe0ded80f8909198634a9b.tar.xz
org.eclipse.tcf.agent-a34186e5ac90c5781fbe0ded80f8909198634a9b.zip
TCF Agent: more support for remote execution of DWRF expressions
Diffstat (limited to 'tests/test-dwarf')
-rw-r--r--tests/test-dwarf/tcf/backend/backend.c47
1 files changed, 25 insertions, 22 deletions
diff --git a/tests/test-dwarf/tcf/backend/backend.c b/tests/test-dwarf/tcf/backend/backend.c
index 6d98d28d..37cf1093 100644
--- a/tests/test-dwarf/tcf/backend/backend.c
+++ b/tests/test-dwarf/tcf/backend/backend.c
@@ -73,6 +73,8 @@ static char ** files = NULL;
static unsigned files_max = 0;
static unsigned files_cnt = 0;
+static int line_area_ok = 0;
+
extern ObjectInfo * get_symbol_object(Symbol * sym);
static RegisterDefinition * get_reg_by_dwarf_id(unsigned id) {
@@ -269,12 +271,27 @@ static void error(const char * func) {
exit(1);
}
-static void line_numbers_callback(CodeArea * area, void * args) {
+static void addr_to_line_callback(CodeArea * area, void * args) {
CodeArea * dst = (CodeArea *)args;
- if (area->start_address > pc || area->end_address <= pc) return;
+ if (area->start_address > pc || area->end_address <= pc) {
+ errno = set_errno(ERR_OTHER, "Invalid line area address");
+ error("address_to_line");
+ }
*dst = *area;
}
+static void line_to_addr_callback(CodeArea * area, void * args) {
+ CodeArea * org = (CodeArea *)args;
+ if (area->start_line > org->start_line || area->end_line <= org->start_line) {
+ errno = set_errno(ERR_OTHER, "Invalid line area line numbers");
+ error("line_to_address");
+ }
+ if (area->start_address > pc || area->end_address <= pc) return;
+ if (org->start_address == area->start_address || org->end_address == area->end_address) {
+ line_area_ok = 1;
+ }
+}
+
static void print_time(struct timespec time_start, int cnt) {
struct timespec time_now;
struct timespec time_diff;
@@ -406,9 +423,9 @@ static void loc_var_func(void * args, Symbol * sym) {
error("get_symbol_base_type");
}
}
- if (get_symbol_containing_type(type, &container) < 0) {
+ if (get_symbol_container(type, &container) < 0) {
if (type_class == TYPE_CLASS_MEMBER_PTR) {
- error("get_symbol_containing_type");
+ error("get_symbol_container");
}
}
if (get_symbol_length(type, &length) < 0) {
@@ -583,39 +600,25 @@ static void next_pc(void) {
}
}
+ line_area_ok = 0;
memset(&area, 0, sizeof(area));
- if (address_to_line(elf_ctx, pc, pc + 1, line_numbers_callback, &area) < 0) {
+ if (address_to_line(elf_ctx, pc, pc + 1, addr_to_line_callback, &area) < 0) {
error("address_to_line");
}
else if (area.start_line > 0) {
- CodeArea a;
char elf_file_name[0x1000];
if (area.start_address > pc || area.end_address <= pc) {
errno = set_errno(ERR_OTHER, "Invalid line area address");
error("address_to_line");
}
- memset(&a, 0, sizeof(a));
strlcpy(elf_file_name, area.file, sizeof(elf_file_name));
- if (line_to_address(elf_ctx, elf_file_name, area.start_line, area.start_column, line_numbers_callback, &a) < 0) {
- error("line_to_address");
- }
- if (a.start_line > area.start_line || a.end_line <= area.start_line) {
- errno = set_errno(ERR_OTHER, "Invalid line area line numbers");
+ if (line_to_address(elf_ctx, elf_file_name, area.start_line, area.start_column, line_to_addr_callback, &area) < 0) {
error("line_to_address");
}
- if (a.start_address > pc || a.end_address <= pc) {
+ if (!line_area_ok) {
errno = set_errno(ERR_OTHER, "Invalid line area address");
error("line_to_address");
}
- if (a.start_address != area.start_address || a.end_address != area.end_address) {
- if (pc < 0x1000) {
- /* Bug in GCC: lines in multiple units are mapped to same (invalid) addresses near address zero */
- }
- else {
- errno = set_errno(ERR_OTHER, "Invalid line area address");
- error("line_to_address");
- }
- }
}
lt_file = NULL;

Back to the top