diff options
author | Eugene Tarassov | 2012-09-26 17:33:40 +0000 |
---|---|---|
committer | Eugene Tarassov | 2012-09-26 17:33:40 +0000 |
commit | 5141e38e556c2319dd3bb0f4b7f8e53dd3e23f83 (patch) | |
tree | daa277cd27a81174b688477ac654237e4a06ecdd /agent | |
parent | 0ff654a7ddcd1c1c0e69b31c604efb4f913b3399 (diff) | |
download | org.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.c | 12 | ||||
-rw-r--r-- | agent/tcf/services/symbols.h | 1 | ||||
-rw-r--r-- | agent/tcf/services/symbols_elf.c | 24 |
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))) { |