diff options
author | Eugene Tarassov | 2013-03-19 21:27:22 +0000 |
---|---|---|
committer | Eugene Tarassov | 2013-03-19 21:27:22 +0000 |
commit | 1133aced110de1677181e09d2cf31079d82fc394 (patch) | |
tree | 7bbe20c7f2426b77917c191dcefd5bad7d4241ea /agent | |
parent | 6f5bd82b98d630bf0caa70e8d0ba8e3d5f78b97d (diff) | |
download | org.eclipse.tcf.agent-1133aced110de1677181e09d2cf31079d82fc394.tar.gz org.eclipse.tcf.agent-1133aced110de1677181e09d2cf31079d82fc394.tar.xz org.eclipse.tcf.agent-1133aced110de1677181e09d2cf31079d82fc394.zip |
TCF Agent: added more default stack tracing rules for ARM and MicroBlaze
Diffstat (limited to 'agent')
-rw-r--r-- | agent/tcf/main/cmdline.c | 4 | ||||
-rw-r--r-- | agent/tcf/services/dwarfframe.c | 33 |
2 files changed, 28 insertions, 9 deletions
diff --git a/agent/tcf/main/cmdline.c b/agent/tcf/main/cmdline.c index e77dcb14..b3aaf427 100644 --- a/agent/tcf/main/cmdline.c +++ b/agent/tcf/main/cmdline.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2012 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2013 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. @@ -302,7 +302,7 @@ static void redirect_cb(Channel * c, void * client_data, int error) { fflush(0); - /* The cmd_done() is done by channel_connected() in the case the + /* The cmd_done() is done by channel_connected() in the case the * redirection succeed. */ } diff --git a/agent/tcf/services/dwarfframe.c b/agent/tcf/services/dwarfframe.c index 986a591b..1631aaf6 100644 --- a/agent/tcf/services/dwarfframe.c +++ b/agent/tcf/services/dwarfframe.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2012 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2013 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. @@ -180,7 +180,7 @@ static RegisterRules * get_reg(StackFrameRegisters * regs, int reg) { } else if (n == rules.return_address_register) { regs->regs[n].rule = RULE_REGISTER; - regs->regs[n].offset = 108; + regs->regs[n].offset = 108; /* LR */ } break; case EM_ARM: @@ -193,12 +193,15 @@ static RegisterRules * get_reg(StackFrameRegisters * regs, int reg) { } else if (n == rules.return_address_register) { regs->regs[n].rule = RULE_REGISTER; - regs->regs[n].offset = rules.return_address_register; + regs->regs[n].offset = 14; /* LR */ } break; case EM_MICROBLAZE: min_reg_cnt = 32; - if (n >= 19 && n <= 31) { /* Must be saved across function calls. Callee-save */ + if (n == 0) { /* Always same - reads as zero */ + regs->regs[n].rule = RULE_SAME_VALUE; + } + else if (n >= 19 && n <= 31) { /* Must be saved across function calls. Callee-save */ regs->regs[n].rule = RULE_SAME_VALUE; } else if (n == 2) { /* Read-only small data area anchor */ @@ -212,7 +215,7 @@ static RegisterRules * get_reg(StackFrameRegisters * regs, int reg) { } else if (n == rules.return_address_register) { regs->regs[n].rule = RULE_REGISTER; - regs->regs[n].offset = rules.return_address_register; + regs->regs[n].offset = 15; /* R15 is used for func return address */ } break; } @@ -786,6 +789,12 @@ static void generate_register_commands(RegisterRules * reg, RegisterDefinition * str_exception(ERR_INV_DWARF, "Invalid .debug_frame"); break; } + if (rules.reg_id_scope.machine == EM_MICROBLAZE && + dst_reg_def != NULL && dst_reg_def->dwarf_id == 32 && + rules.return_address_register == 15) { + add_command(SFT_CMD_NUMBER)->args.num = 8; + add_command(SFT_CMD_ADD); + } if (dwarf_stack_trace_regs_cnt >= trace_regs_max) { int i; trace_regs_max += 16; @@ -807,7 +816,6 @@ static void generate_commands(void) { generate_register_commands(reg, get_PC_definition(rules.ctx), reg_def); } for (i = 0; i < frame_regs.regs_cnt; i++) { - if (i == rules.return_address_register) continue; reg = get_reg(&frame_regs, i); if (reg->rule == 0) continue; reg_def = get_reg_by_id(rules.ctx, i, &rules.reg_id_scope); @@ -898,7 +906,18 @@ static void generate_plt_section_commands(Context * ctx, ELF_File * file, U8_T o rules.return_address_register = 108; /* LR */ frame_regs.cfa_rule = RULE_OFFSET; frame_regs.cfa_register = 1; /* R1 */ - frame_regs.cfa_offset = 0; + generate_commands(); + break; + case EM_ARM: + rules.return_address_register = 14; /* LR */ + frame_regs.cfa_rule = RULE_OFFSET; + frame_regs.cfa_register = 13; /* SP */ + generate_commands(); + break; + case EM_MICROBLAZE: + rules.return_address_register = 15; /* R15 */ + frame_regs.cfa_rule = RULE_OFFSET; + frame_regs.cfa_register = 1; /* R1 */ generate_commands(); break; } |