Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/agent
diff options
context:
space:
mode:
authorEugene Tarassov2012-09-26 17:33:40 +0000
committerEugene Tarassov2012-09-26 17:33:40 +0000
commit5141e38e556c2319dd3bb0f4b7f8e53dd3e23f83 (patch)
treedaa277cd27a81174b688477ac654237e4a06ecdd /agent
parent0ff654a7ddcd1c1c0e69b31c604efb4f913b3399 (diff)
downloadorg.eclipse.tcf.agent-5141e38e556c2319dd3bb0f4b7f8e53dd3e23f83.tar.gz
org.eclipse.tcf.agent-5141e38e556c2319dd3bb0f4b7f8e53dd3e23f83.tar.xz
org.eclipse.tcf.agent-5141e38e556c2319dd3bb0f4b7f8e53dd3e23f83.zip
Bug 390304 - C++ members are not localized in their respective classes
Diffstat (limited to 'agent')
-rw-r--r--agent/tcf/services/expressions.c12
-rw-r--r--agent/tcf/services/symbols.h1
-rw-r--r--agent/tcf/services/symbols_elf.c24
3 files changed, 26 insertions, 11 deletions
diff --git a/agent/tcf/services/expressions.c b/agent/tcf/services/expressions.c
index 8e587056..b2354cbf 100644
--- a/agent/tcf/services/expressions.c
+++ b/agent/tcf/services/expressions.c
@@ -83,6 +83,8 @@
#define MODE_TYPE 1
#define MODE_SKIP 2
+#define SYM_FLAG_TYPE 0xf0000000
+
static char * text = NULL;
static int text_pos = 0;
static int text_len = 0;
@@ -809,6 +811,7 @@ static SYM_FLAGS get_all_symbol_flags(Symbol * sym) {
all_flags |= sym_flags;
if (get_symbol_class(sym, &sym_class) < 0) error(errno, "Cannot get symbol class");
if (sym_class != SYM_CLASS_TYPE) break;
+ all_flags |= SYM_FLAG_TYPE;
if (get_symbol_type(sym, &nxt) < 0) error(errno, "Cannot get symbol type");
if (nxt == sym) break;
sym = nxt;
@@ -866,7 +869,7 @@ static int identifier(int mode, Value * scope, char * name, SYM_FLAGS flags, Val
}
else {
if (flags) {
- const SYM_FLAGS flag_mask = SYM_FLAG_CONST_TYPE | SYM_FLAG_VOLATILE_TYPE |
+ const SYM_FLAGS flag_mask = SYM_FLAG_TYPE | SYM_FLAG_CONST_TYPE | SYM_FLAG_VOLATILE_TYPE |
SYM_FLAG_STRUCT_TYPE | SYM_FLAG_CLASS_TYPE | SYM_FLAG_UNION_TYPE | SYM_FLAG_ENUM_TYPE;
Symbol * nxt = NULL;
SYM_FLAGS sym_flags = (get_all_symbol_flags(sym) ^ flags) & flag_mask;
@@ -1086,7 +1089,7 @@ static int type_name(int mode, Symbol ** type) {
}
while (cnt > 0);
}
- sym_class = identifier(mode, NULL, name, sym_flags, &v);
+ sym_class = identifier(mode, NULL, name, sym_flags | SYM_FLAG_TYPE, &v);
}
#if ENABLE_Symbols
else if (text_sy == SY_ID) {
@@ -1107,13 +1110,14 @@ static int type_name(int mode, Symbol ** type) {
if (text_sy == SY_SCOPE) {
Value scope = v;
next_sy();
- sym_class = qualified_name(mode, &scope, sym_flags, &v);
+ sym_class = qualified_name(mode, &scope, sym_flags | SYM_FLAG_TYPE, &v);
}
if (sym_class != SYM_CLASS_TYPE) {
if (sym_flags) error(ERR_INV_EXPRESSION, "Type '%s' not found", name);
return 0;
}
expr_len = type_expression(mode, expr_buf);
+ if (text_sy != ')') return 0;
if (mode != MODE_SKIP) {
int i;
for (i = 0; i < expr_len; i++) {
@@ -1657,7 +1661,7 @@ static void op_sizeof(int mode, Value * v) {
if (p) next_sy();
pos = sy_pos;
- if (type_name(mode, &type)) {
+ if (p && type_name(mode, &type)) {
if (mode != MODE_SKIP) {
ContextAddress type_size = 0;
#if ENABLE_Symbols
diff --git a/agent/tcf/services/symbols.h b/agent/tcf/services/symbols.h
index ff2ccb3a..67c96083 100644
--- a/agent/tcf/services/symbols.h
+++ b/agent/tcf/services/symbols.h
@@ -79,6 +79,7 @@ typedef uint32_t SYM_FLAGS;
#define SYM_FLAG_ENUM_TYPE 0x0400000
#define SYM_FLAG_STRUCT_TYPE 0x0800000
#define SYM_FLAG_STRING_TYPE 0x1000000
+#define SYM_FLAG_INHERITANCE 0x2000000
/* Symbol properties update policies */
#define UPDATE_ON_MEMORY_MAP_CHANGES 0
diff --git a/agent/tcf/services/symbols_elf.c b/agent/tcf/services/symbols_elf.c
index 68b5107b..232d6fe2 100644
--- a/agent/tcf/services/symbols_elf.c
+++ b/agent/tcf/services/symbols_elf.c
@@ -671,9 +671,11 @@ static void find_in_object_tree(ObjectInfo * parent, ContextAddress rt_offs, Con
while (this_list != NULL) {
Symbol * s = this_list;
this_list = this_list->next;
- s->ctx = sym_ctx;
- s->frame = sym_frame;
- s->var = sym_this;
+ if (s->obj->mTag != TAG_subprogram) {
+ s->ctx = sym_ctx;
+ s->frame = sym_frame;
+ s->var = sym_this;
+ }
s->next = NULL;
add_to_find_symbol_buf(NULL, s);
}
@@ -764,7 +766,6 @@ static void find_by_name_in_sym_table(ELF_File * file, const char * name, int gl
unpack_elf_symbol_info(tbl, n, &sym_info);
if (cmp_symbol_names(name, sym_info.name) == 0 && (!globals || sym_info.bind == STB_GLOBAL || sym_info.bind == STB_WEAK)) {
ContextAddress addr = 0;
- int found_dwarf = 0;
if (sym_info.section_index != SHN_ABS && syminfo2address(prs, &sym_info, &addr) == 0) {
UnitAddressRange * range = elf_find_unit(sym_ctx, addr, addr, NULL);
if (range != NULL) {
@@ -779,7 +780,6 @@ static void find_by_name_in_sym_table(ELF_File * file, const char * name, int gl
case TAG_variable:
if (cmp_symbol_names(obj->mName, name) == 0) {
add_to_find_symbol_buf(obj, NULL);
- found_dwarf = 1;
}
break;
}
@@ -788,7 +788,7 @@ static void find_by_name_in_sym_table(ELF_File * file, const char * name, int gl
}
}
}
- if (!found_dwarf) {
+ {
Symbol * sym = alloc_symbol();
sym->frame = STACK_NO_FRAME;
sym->ctx = prs;
@@ -1695,7 +1695,14 @@ static int map_to_sym_table(ObjectInfo * obj, Symbol ** sym) {
}
}
}
- if (find_symbol_list != NULL) *sym = find_symbol_list;
+ while (find_symbol_list != NULL) {
+ Symbol * s = find_symbol_list;
+ find_symbol_list = find_symbol_list->next;
+ if (s->obj != obj) {
+ *sym = s;
+ break;
+ }
+ }
clear_trap(&trap);
}
find_symbol_list = list;
@@ -2994,6 +3001,9 @@ int get_symbol_flags(const Symbol * sym, SYM_FLAGS * flags) {
if (v == DW_END_little) *flags |= SYM_FLAG_LITTLE_ENDIAN;
}
break;
+ case TAG_inheritance:
+ *flags |= SYM_FLAG_INHERITANCE;
+ break;
}
}
if (obj != NULL && sym->sym_class == SYM_CLASS_TYPE && !(*flags & (SYM_FLAG_BIG_ENDIAN|SYM_FLAG_LITTLE_ENDIAN))) {

Back to the top