diff options
Diffstat (limited to 'agent/tcf/services/symbols_mux.c')
-rw-r--r-- | agent/tcf/services/symbols_mux.c | 201 |
1 files changed, 98 insertions, 103 deletions
diff --git a/agent/tcf/services/symbols_mux.c b/agent/tcf/services/symbols_mux.c index c67e015c..8a4b7ee0 100644 --- a/agent/tcf/services/symbols_mux.c +++ b/agent/tcf/services/symbols_mux.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012, 2013 Wind River Systems, Inc. and others. + * Copyright (c) 2012, 2014 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. @@ -14,13 +14,17 @@ *******************************************************************************/ /* - * Symbols Muliplexer - Provides a symbol multiplexer to support several + * Symbols Muliplexer - Provides a multiplexer to support several * file format in the same TCF agent and in the same debug session. + * + * The multiplexer delegates actual search for symbols info to info readers + * that are registed with add_symbols_reader(). */ #include <tcf/config.h> -#if ENABLE_SymbolsMux && SERVICE_Symbols +#if SERVICE_Symbols && ENABLE_SymbolsMux + #include <assert.h> #include <stdio.h> #include <tcf/services/symbols.h> @@ -36,10 +40,11 @@ static unsigned max_reader_cnt = 0; static Context * find_symbol_ctx = NULL; static Symbol ** find_symbol_list = NULL; -static int get_sym_addr(Context * ctx, int frame, ContextAddress addr, - ContextAddress * sym_addr) { - if (frame == STACK_NO_FRAME) *sym_addr = addr; - else if (frame == STACK_TOP_FRAME) { +static int get_sym_addr(Context * ctx, int frame, ContextAddress addr, ContextAddress * sym_addr) { + if (frame == STACK_NO_FRAME) { + *sym_addr = addr; + } + else if (is_top_frame(ctx, frame)) { if (!ctx->stopped) { errno = ERR_IS_RUNNING; return -1; @@ -56,7 +61,7 @@ static int get_sym_addr(Context * ctx, int frame, ContextAddress addr, if (get_frame_info(ctx, frame, &info) < 0) return -1; if (read_reg_value(info, get_PC_definition(ctx), &ip) < 0) return -1; if (!info->is_top_frame && ip > 0) ip--; - *sym_addr = (ContextAddress) ip; + *sym_addr = (ContextAddress)ip; } return 0; } @@ -70,7 +75,7 @@ static int get_symbol_reader(Context * ctx, int frame, ContextAddress addr, Symb *sym_reader = readers[0]; return 0; } - if (get_sym_addr(ctx, frame, addr, &sym_addr) == -1) return -1; + if (get_sym_addr(ctx, frame, addr, &sym_addr) < 0) return -1; for (i = 0; i < reader_cnt; i++) { if (readers[i]->reader_is_valid(ctx, sym_addr)) { *sym_reader = readers[i]; @@ -80,24 +85,28 @@ static int get_symbol_reader(Context * ctx, int frame, ContextAddress addr, Symb return 0; } -int find_symbol_by_name(Context * ctx, int frame, ContextAddress ip, const char * name, - Symbol ** res) { +int find_symbol_by_name(Context * ctx, int frame, ContextAddress ip, const char * name, Symbol ** res) { unsigned i; find_symbol_ctx = NULL; for (i = 0; i < reader_cnt; i++) find_symbol_list[i] = NULL; for (i = 0; i < reader_cnt; i++) { - Symbol * sym; + Symbol * sym = NULL; if (readers[i]->find_symbol_by_name(ctx, frame, ip, name, &sym) == 0) { - find_symbol_list[i] = sym; assert(sym != NULL); + find_symbol_list[i] = sym; if (find_symbol_ctx == NULL) { + if (readers[i]->find_next_symbol(&find_symbol_list[i]) < 0) { + find_symbol_list[i] = NULL; + } find_symbol_ctx = ctx; *res = sym; } } - else if (errno != ERR_SYM_NOT_FOUND) return -1; + else if (get_error_code(errno) != ERR_SYM_NOT_FOUND) { + return -1; + } } if (find_symbol_ctx != NULL) return 0; errno = ERR_SYM_NOT_FOUND; @@ -107,23 +116,28 @@ int find_symbol_by_name(Context * ctx, int frame, ContextAddress ip, const char int find_symbol_in_scope(Context * ctx, int frame, ContextAddress ip, Symbol * scope, const char * name, Symbol ** res) { unsigned i; - SymbolReader * reader; - for (i = 0; i < reader_cnt; i++) find_symbol_list[i] = NULL; find_symbol_ctx = NULL; + for (i = 0; i < reader_cnt; i++) find_symbol_list[i] = NULL; - if (get_symbol_reader(ctx, frame,ip,&reader) == -1) return -1; - if (reader != NULL) { + for (i = 0; i < reader_cnt; i++) { Symbol * sym = NULL; - if (reader->find_symbol_in_scope(ctx, frame, ip, scope, name, &sym) == 0) { - find_symbol_list[reader->reader_index] = sym; - *res = sym; - find_symbol_ctx = ctx; - assert (sym != NULL); - return 0; + if (readers[i]->find_symbol_in_scope(ctx, frame, ip, scope, name, &sym) == 0) { + assert(sym != NULL); + find_symbol_list[i] = sym; + if (find_symbol_ctx == NULL) { + if (readers[i]->find_next_symbol(&find_symbol_list[i]) < 0) { + find_symbol_list[i] = NULL; + } + find_symbol_ctx = ctx; + *res = sym; + } + } + else if (get_error_code(errno) != ERR_SYM_NOT_FOUND) { + return -1; } - else return -1; } + if (find_symbol_ctx != NULL) return 0; errno = ERR_SYM_NOT_FOUND; return -1; } @@ -132,20 +146,18 @@ int find_symbol_by_addr(Context * ctx, int frame, ContextAddress addr, Symbol ** unsigned i; SymbolReader * reader; - for (i = 0; i < reader_cnt; i++) find_symbol_list[i] = NULL; find_symbol_ctx = NULL; + for (i = 0; i < reader_cnt; i++) find_symbol_list[i] = NULL; - if (get_symbol_reader(ctx, frame, addr, &reader) == -1) return -1; + if (get_symbol_reader(ctx, frame, addr, &reader) < 0) return -1; if (reader != NULL) { - Symbol * sym; - if (reader->find_symbol_by_addr(ctx, frame, addr, &sym) == 0) { - find_symbol_list[reader->reader_index] = sym; - *res = sym; - assert (sym != NULL); - find_symbol_ctx = ctx; - return 0; + i = reader->reader_index; + if (reader->find_symbol_by_addr(ctx, frame, addr, res) < 0) return -1; + if (readers[i]->find_next_symbol(&find_symbol_list[i]) < 0) { + find_symbol_list[i] = NULL; } - else return -1; + find_symbol_ctx = ctx; + return 0; } errno = ERR_SYM_NOT_FOUND; return -1; @@ -160,15 +172,11 @@ int find_next_symbol(Symbol ** sym) { } for (i = 0; i < reader_cnt; i++) { if (find_symbol_list[i] != NULL) { - if (find_symbol_list[i] != *sym) { - *sym = find_symbol_list[i]; - return 0; - } - find_symbol_list[i] = NULL; - if (readers[i]->find_next_symbol(sym) == 0) { - find_symbol_list[i] = *sym; - return 0; + *sym = find_symbol_list[i]; + if (readers[i]->find_next_symbol(&find_symbol_list[i]) < 0) { + find_symbol_list[i] = NULL; } + return 0; } } errno = ERR_SYM_NOT_FOUND; @@ -177,7 +185,7 @@ int find_next_symbol(Symbol ** sym) { int enumerate_symbols(Context * ctx, int frame, EnumerateSymbolsCallBack * call_back, void * args) { SymbolReader * reader = NULL; - if (get_symbol_reader(ctx, frame, 0, &reader) == -1) return 0; + if (get_symbol_reader(ctx, frame, 0, &reader) < 0) return 0; if (reader) return reader->enumerate_symbols(ctx, frame, call_back, args); return 0; } @@ -212,146 +220,127 @@ int id2symbol(const char * id, Symbol ** res) { ContextAddress is_plt_section(Context * ctx, ContextAddress addr) { SymbolReader * reader = NULL; - if (get_symbol_reader(ctx, STACK_NO_FRAME, addr, &reader) == -1) return 0; + if (get_symbol_reader(ctx, STACK_NO_FRAME, addr, &reader) < 0) return 0; if (reader) return reader->is_plt_section(ctx, addr); return 0; } -int get_stack_tracing_info(Context * ctx, ContextAddress rt_addr, StackTracingInfo ** info) { +int get_stack_tracing_info(Context * ctx, ContextAddress addr, StackTracingInfo ** info) { SymbolReader * reader = NULL; *info = NULL; - if (get_symbol_reader(ctx, STACK_NO_FRAME, rt_addr, &reader) == -1) return 0; - if (reader) return reader->get_stack_tracing_info(ctx, rt_addr, info); + if (get_symbol_reader(ctx, STACK_NO_FRAME, addr, &reader) < 0) return 0; + if (reader) return reader->get_stack_tracing_info(ctx, addr, info); return 0; } const char * get_symbol_file_name(Context * ctx, MemoryRegion * module) { unsigned i; - const char * name; + if (module == NULL) { + errno = 0; + return NULL; + } for (i = 0; i < reader_cnt; i++) { - name = readers[i]->get_symbol_file_name(ctx, module); - if (name != NULL) { - if (module == NULL) return name; - if (name != module->file_name) return name; - } + const char * name = readers[i]->get_symbol_file_name(ctx, module); + if (name != NULL) return name; } - if (module == NULL) return NULL; - else return module->file_name; + errno = 0; + return NULL; } int get_symbol_class(const Symbol * sym, int * sym_class) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_class(sym, sym_class); } int get_symbol_type(const Symbol * sym, Symbol ** type) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_type(sym, type); } int get_symbol_type_class(const Symbol * sym, int * type_class) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_type_class(sym, type_class); } int get_symbol_update_policy(const Symbol * sym, char ** id, int * policy) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_update_policy(sym, id, policy); } int get_symbol_name(const Symbol * sym, char ** name) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_name(sym, name); } int get_symbol_size(const Symbol * sym, ContextAddress * size) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_size(sym, size); } int get_symbol_base_type(const Symbol * sym, Symbol ** base_type) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_base_type(sym, base_type); } int get_symbol_index_type(const Symbol * sym, Symbol ** index_type) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_index_type(sym, index_type); } int get_symbol_container(const Symbol * sym, Symbol ** container) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_container(sym, container); } int get_symbol_length(const Symbol * sym, ContextAddress * length) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_length(sym, length); } int get_symbol_lower_bound(const Symbol * sym, int64_t * value) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_lower_bound(sym, value); - } int get_symbol_children(const Symbol * sym, Symbol *** children, int * count) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_children(sym, children, count); } int get_array_symbol(const Symbol * sym, ContextAddress length, Symbol ** ptr) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_array_symbol(sym, length, ptr); } int get_location_info(const Symbol * sym, LocationInfo ** res) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_location_info(sym, res); } int get_symbol_flags(const Symbol * sym, SYM_FLAGS * flags) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_flags(sym, flags); } int get_symbol_frame(const Symbol * sym, Context ** ctx, int * frame) { - SymbolReader * reader = *(SymbolReader **) sym; - assert(reader != NULL); + SymbolReader * reader = *(SymbolReader **)sym; return reader->get_symbol_frame(sym, ctx, frame); } -int get_funccall_info(const Symbol * func, const Symbol ** args, unsigned args_cnt, - FunctionCallInfo ** res) { - SymbolReader * reader = *(SymbolReader **) func; - assert(reader != NULL); +int get_funccall_info(const Symbol * func, const Symbol ** args, unsigned args_cnt, FunctionCallInfo ** res) { + SymbolReader * reader = *(SymbolReader **)func; return reader->get_funccall_info(func, args, args_cnt, res); } -int get_context_isa(Context * ctx, ContextAddress ip, const char ** isa, +int get_context_isa(Context * ctx, ContextAddress addr, const char ** isa, ContextAddress * range_addr, ContextAddress * range_size) { SymbolReader * reader = NULL; *isa = NULL; - *range_addr = ip; + *range_addr = addr; *range_size = 1; - if (get_symbol_reader(ctx, STACK_NO_FRAME, ip, &reader) == -1) return 0; - if (reader != NULL) return reader->get_context_isa(ctx, ip, isa, range_addr, range_size); + if (get_symbol_reader(ctx, STACK_NO_FRAME, addr, &reader) < 0) return 0; + if (reader != NULL) return reader->get_context_isa(ctx, addr, isa, range_addr, range_size); return 0; } @@ -359,27 +348,33 @@ int add_symbols_reader(SymbolReader * reader) { unsigned i; if (reader_cnt >= max_reader_cnt) { max_reader_cnt += 2; - readers = (SymbolReader **)loc_realloc(readers, max_reader_cnt * sizeof(reader)); - find_symbol_list = (Symbol **) loc_realloc(find_symbol_list, max_reader_cnt * sizeof(Symbol *)); + readers = (SymbolReader **)loc_realloc(readers, max_reader_cnt * sizeof(SymbolReader *)); + find_symbol_list = (Symbol **)loc_realloc(find_symbol_list, max_reader_cnt * sizeof(Symbol *)); } - readers[reader_cnt] = reader; reader->reader_index = reader_cnt; - reader_cnt++; + readers[reader_cnt++] = reader; for (i = 0; i < reader_cnt; i++) find_symbol_list[i] = NULL; find_symbol_ctx = NULL; return 0; } +extern void elf_reader_ini_symbols_lib(void); +extern void win32_reader_ini_symbols_lib(void); +extern void proxy_reader_ini_symbols_lib(void); + void ini_symbols_lib(void) { /* * We keep this to limit the impact of changes. In the ideal world, those * initialization routines should be called from the agent initialization code. */ +#if ENABLE_ELF + elf_reader_ini_symbols_lib(); +#endif #if ENABLE_PE win32_reader_ini_symbols_lib(); #endif -#if ENABLE_ELF - elf_reader_ini_symbols_lib(); +#if ENABLE_SymbolsProxy + proxy_reader_ini_symbols_lib(); #endif } #endif /* Enable_SymbolsMux && SERVICE_Symbols */ |