79 lines
2.5 KiB
Diff
79 lines
2.5 KiB
Diff
commit 05eb6742c169226ae09f1737aa8b9dc1dc12adb5
|
||
Author: Mark Wielaard <mark@klomp.org>
|
||
Date: Tue Nov 29 18:50:58 2022 +0100
|
||
|
||
Handle DWARF5 DW_OP_implicit_pointer and DW_OP_entry_value
|
||
|
||
These are the same as the GNU extensions for older DWARF,
|
||
DW_OP_GNU_implicit_pointer and DW_GNU_entry_value.
|
||
|
||
diff --git a/loc2stap.cxx b/loc2stap.cxx
|
||
index efc78cc57..53316a480 100644
|
||
--- a/loc2stap.cxx
|
||
+++ b/loc2stap.cxx
|
||
@@ -23,6 +23,11 @@
|
||
#define DW_OP_GNU_entry_value 0xf3
|
||
#endif
|
||
|
||
+#if ! _ELFUTILS_PREREQ(0, 171)
|
||
+#define DW_OP_entry_value 0xa3
|
||
+#define DW_OP_implicit_pointer 0xa0
|
||
+#endif
|
||
+
|
||
#define N_(x) x
|
||
|
||
|
||
@@ -372,7 +377,7 @@ location_context::translate (const Dwarf_Op *expr, const size_t len,
|
||
DIE ("operations follow DW_OP_implicit_value");
|
||
|
||
if (implicit_pointer != NULL)
|
||
- DIE ("operations follow DW_OP_GNU_implicit_pointer");
|
||
+ DIE ("operations follow DW_OP implicit_pointer");
|
||
}
|
||
|
||
switch (expr[i].atom)
|
||
@@ -662,6 +667,7 @@ location_context::translate (const Dwarf_Op *expr, const size_t len,
|
||
|
||
#if _ELFUTILS_PREREQ (0, 149)
|
||
case DW_OP_GNU_implicit_pointer:
|
||
+ case DW_OP_implicit_pointer:
|
||
implicit_pointer = &expr[i];
|
||
/* Fake top of stack: implicit_pointer being set marks it. */
|
||
PUSH(NULL);
|
||
@@ -684,10 +690,11 @@ location_context::translate (const Dwarf_Op *expr, const size_t len,
|
||
break;
|
||
|
||
case DW_OP_GNU_entry_value:
|
||
+ case DW_OP_entry_value:
|
||
{
|
||
expression *result = handle_GNU_entry_value (expr[i]);
|
||
if (result == NULL)
|
||
- DIE("DW_OP_GNU_entry_value unable to resolve value");
|
||
+ DIE("DW_OP entry_value unable to resolve value");
|
||
PUSH(result);
|
||
}
|
||
break;
|
||
@@ -1248,7 +1255,8 @@ location_context::location_relative (const Dwarf_Op *expr, size_t len,
|
||
break;
|
||
|
||
case DW_OP_GNU_entry_value:
|
||
- DIE ("unhandled DW_OP_GNU_entry_value");
|
||
+ case DW_OP_entry_value:
|
||
+ DIE ("unhandled DW_OP entry_value");
|
||
break;
|
||
|
||
default:
|
||
diff --git a/testsuite/systemtap.base/dw_entry_value.exp b/testsuite/systemtap.base/dw_entry_value.exp
|
||
index 7339fc5fa..b728fa7ff 100644
|
||
--- a/testsuite/systemtap.base/dw_entry_value.exp
|
||
+++ b/testsuite/systemtap.base/dw_entry_value.exp
|
||
@@ -10,7 +10,7 @@ if { $res != "" } {
|
||
pass "$test: compiled $test.c"
|
||
}
|
||
|
||
-if { ![catch { exec eu-readelf -w $test | grep GNU_entry_value }] } {
|
||
+if { ![catch { exec eu-readelf -w $test | grep entry_value: }] } {
|
||
stap_run $test no_load $all_pass_string $srcdir/$subdir/$test.stp -c ./${test} -w
|
||
} else {
|
||
untested "$test: no DW_OP_GNU_entry_value found"
|