summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Moore <dougm@rice.edu>2017-08-06 15:35:43 -0500
committerDave Watson <davejwatson@fb.com>2017-08-07 09:05:17 -0700
commite360c3ddbd1fa182b6e5f7bf22a7b9836a9c1cd4 (patch)
tree85a3c89458432fd3f28cbf76beffa8adf9d8bfe2
parent93f319466f3de6eb2dcd1e322d57ffe7cb71dcc3 (diff)
downloadlibunwind-e360c3ddbd1fa182b6e5f7bf22a7b9836a9c1cd4.tar.gz
For architectures that initialize the dwarf ip cache, but do not
update when the ip register is set, add those updates.
-rw-r--r--src/aarch64/Gregs.c4
-rw-r--r--src/arm/Gregs.c4
-rw-r--r--src/mips/Gregs.c2
-rw-r--r--src/sh/Gregs.c4
-rw-r--r--src/tilegx/Gregs.c6
5 files changed, 16 insertions, 4 deletions
diff --git a/src/aarch64/Gregs.c b/src/aarch64/Gregs.c
index 6288275b..3e014769 100644
--- a/src/aarch64/Gregs.c
+++ b/src/aarch64/Gregs.c
@@ -55,6 +55,9 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
loc = c->dwarf.loc[reg];
break;
+ case UNW_AARCH64_PC:
+ if (write)
+ c->dwarf.ip = *valp; /* update the IP cache */
case UNW_AARCH64_X4:
case UNW_AARCH64_X5:
case UNW_AARCH64_X6:
@@ -82,7 +85,6 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
case UNW_AARCH64_X28:
case UNW_AARCH64_X29:
case UNW_AARCH64_X30:
- case UNW_AARCH64_PC:
case UNW_AARCH64_PSTATE:
loc = c->dwarf.loc[reg];
break;
diff --git a/src/arm/Gregs.c b/src/arm/Gregs.c
index 688771f3..0d52f0b2 100644
--- a/src/arm/Gregs.c
+++ b/src/arm/Gregs.c
@@ -32,6 +32,9 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
switch (reg)
{
+ case UNW_ARM_R15:
+ if (write)
+ c->dwarf.ip = *valp; /* update the IP cache */
case UNW_ARM_R0:
case UNW_ARM_R1:
case UNW_ARM_R2:
@@ -46,7 +49,6 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
case UNW_ARM_R11:
case UNW_ARM_R12:
case UNW_ARM_R14:
- case UNW_ARM_R15:
loc = c->dwarf.loc[reg - UNW_ARM_R0];
break;
diff --git a/src/mips/Gregs.c b/src/mips/Gregs.c
index 26977767..95194022 100644
--- a/src/mips/Gregs.c
+++ b/src/mips/Gregs.c
@@ -70,6 +70,8 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
break;
case UNW_MIPS_PC:
+ if (write)
+ c->dwarf.ip = *valp; /* update the IP cache */
loc = c->dwarf.loc[reg];
break;
diff --git a/src/sh/Gregs.c b/src/sh/Gregs.c
index fb4ca740..7d8e8e93 100644
--- a/src/sh/Gregs.c
+++ b/src/sh/Gregs.c
@@ -33,6 +33,9 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
switch (reg)
{
+ case UNW_SH_PC:
+ if (write)
+ c->dwarf.ip = *valp; /* update the IP cache */
case UNW_SH_R0:
case UNW_SH_R1:
case UNW_SH_R2:
@@ -48,7 +51,6 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
case UNW_SH_R12:
case UNW_SH_R13:
case UNW_SH_R14:
- case UNW_SH_PC:
case UNW_SH_PR:
loc = c->dwarf.loc[reg];
break;
diff --git a/src/tilegx/Gregs.c b/src/tilegx/Gregs.c
index 53e7bf4c..57c61256 100644
--- a/src/tilegx/Gregs.c
+++ b/src/tilegx/Gregs.c
@@ -52,7 +52,11 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
}
if (write)
- return dwarf_put (&c->dwarf, loc, *valp);
+ {
+ if (reg == UNW_TILEGX_PC)
+ c->dwarf.ip = *valp; /* update the IP cache */
+ return dwarf_put (&c->dwarf, loc, *valp);
+ }
else
return dwarf_get (&c->dwarf, loc, valp);
}