Bug 512340 - object2symbol doesn't handle TAG_label, which cause fail to the getting function which defined in assemble file
Fixed symbols server use case
diff --git a/agent/tcf/services/symbols_elf.c b/agent/tcf/services/symbols_elf.c
index f73434d..e520f5a 100644
--- a/agent/tcf/services/symbols_elf.c
+++ b/agent/tcf/services/symbols_elf.c
@@ -2123,16 +2123,16 @@
tmp_app_hex('.', ref_id);
}
}
- if (tbl_index) {
- tmp_app_hex('-', tbl_index);
- }
+ if (sym->has_address) tmp_app_hex('$', sym->address);
+ if (sym->assembly_function) tmp_app_hex('#', sym->size);
+ if (tbl_index) tmp_app_hex('-', tbl_index);
if (frame != STACK_TOP_FRAME) {
assert(frame + 3 >= 0);
tmp_app_hex('+', frame + 3);
}
- tmp_app_hex('.', sym->index);
- tmp_app_hex('.', sym->dimension);
- tmp_app_hex('.', sym->cardinal);
+ if (sym->index) tmp_app_hex('=', sym->index);
+ if (sym->dimension) tmp_app_hex('!', sym->dimension);
+ if (sym->cardinal) tmp_app_hex('/', sym->cardinal);
tmp_app_str('.', sym->ctx->id);
}
tmp_buf[tmp_len++] = 0;
@@ -2218,6 +2218,16 @@
p++;
ref = obj;
}
+ if (*p == '$') {
+ p++;
+ sym->has_address = 1;
+ sym->address = (ContextAddress)read_hex(&p);
+ }
+ if (*p == '#') {
+ p++;
+ sym->assembly_function = 1;
+ sym->size = (ContextAddress)read_hex(&p);
+ }
if (*p == '-') {
p++;
tbl_index = (unsigned)read_hex(&p);
@@ -2226,13 +2236,22 @@
p++;
sym->frame = (int)read_hex(&p) - 3;
}
- if (*p == '.') p++;
- sym->index = (unsigned)read_hex(&p);
- if (*p == '.') p++;
- sym->dimension = (unsigned)read_hex(&p);
- if (*p == '.') p++;
- sym->cardinal = (unsigned)read_hex(&p);
- if (*p == '.') p++;
+ if (*p == '=') {
+ p++;
+ sym->index = (unsigned)read_hex(&p);
+ }
+ if (*p == '!') {
+ p++;
+ sym->dimension = (unsigned)read_hex(&p);
+ }
+ if (*p == '/') {
+ p++;
+ sym->cardinal = (unsigned)read_hex(&p);
+ }
+ if (*p++ != '.') {
+ errno = ERR_INV_CONTEXT;
+ return -1;
+ }
sym->ctx = id2ctx(p);
if (sym->ctx == NULL) {
errno = ERR_INV_CONTEXT;
diff --git a/tests/test-dwarf/tcf/backend/backend.c b/tests/test-dwarf/tcf/backend/backend.c
index f0d6900..20b6a8f 100644
--- a/tests/test-dwarf/tcf/backend/backend.c
+++ b/tests/test-dwarf/tcf/backend/backend.c
@@ -805,6 +805,9 @@
RegisterDefinition * reg = NULL;
ContextAddress addr = 0;
ContextAddress size = 0;
+ ContextAddress addr_proxy = 0;
+ ContextAddress size_proxy = 0;
+ Symbol * sym_proxy = NULL;
int addr_ok = 0;
int size_ok = 0;
SYM_FLAGS flags = 0;
@@ -829,6 +832,13 @@
Symbol * sym_container = NULL;
int out_of_body = 0;
+ if (id2symbol(symbol2id(sym), &sym_proxy) < 0) {
+ error_sym("id2symbol", sym);
+ }
+ if (symcmp(sym, sym_proxy) != 0) {
+ errno = ERR_OTHER;
+ error("Invalid result of id2symbol()");
+ }
if (get_symbol_class(sym, &symbol_class) < 0) {
error_sym("get_symbol_class", sym);
}
@@ -1061,6 +1071,22 @@
}
size_ok = 0;
}
+ if (get_symbol_address(sym_proxy, &addr_proxy) < 0) {
+ if (addr_ok) error_sym("get_symbol_address", sym_proxy);
+ }
+ else {
+ errno = ERR_OTHER;
+ if (!addr_ok) error_sym("get_symbol_address", sym_proxy);
+ if (addr != addr_proxy) error_sym("get_symbol_address", sym_proxy);
+ }
+ if (get_symbol_size(sym_proxy, &size_proxy) < 0) {
+ if (size_ok) error_sym("get_symbol_size", sym_proxy);
+ }
+ else {
+ errno = ERR_OTHER;
+ if (!size_ok) error_sym("get_symbol_size", sym_proxy);
+ if (size != size_proxy) error_sym("get_symbol_size", sym_proxy);
+ }
if (cpp_ref) {
Symbol * base_type = NULL;
ref_size_ok = 1;