1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
https://inbox.sourceware.org/elfutils-devel/20260316144817.1722419-1-serhei@serhei.io/
From: Serhei Makarov <serhei@serhei.io>
To: elfutils-devel@sourceware.org
Cc: Serhei Makarov <serhei@serhei.io>
Subject: [PATCH v3] libdwfl/linux-pid-attach.c PR33974: __libdwfl_set_initial_registers_thread on non-Linux
Date: Mon, 16 Mar 2026 10:48:17 -0400
Message-ID: <20260316144817.1722419-1-serhei@serhei.io>
X-Mailer: git-send-email 2.52.0
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,JMQ_SPF_NEUTRAL,RCVD_IN_DNSWL_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_PASS,SPF_PASS,TXREP,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6
X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org
List-Id: <elfutils-devel.sourceware.org>
libdwfl_stacktrace uses __libdwfl_set_initial_registers_thread but it
is wrapped by #ifdef __linux__, causing build errors on non-Linux
platforms.
* linux-pid-attach.c (__libdwfl_set_initial_registers_thread):
Remove from inside the '#ifdef __linux__'.
* dwfl_frame_regs.c (__libdwfl_set_initial_registers_thread):
Move here.
---
libdwfl/dwfl_frame_regs.c | 27 +++++++++++++++++++++++++++
libdwfl/linux-pid-attach.c | 25 -------------------------
2 files changed, 27 insertions(+), 25 deletions(-)
diff --git a/libdwfl/dwfl_frame_regs.c b/libdwfl/dwfl_frame_regs.c
index 572ac676..99de3c22 100644
--- a/libdwfl/dwfl_frame_regs.c
+++ b/libdwfl/dwfl_frame_regs.c
@@ -77,3 +77,30 @@ dwfl_frame_reg (Dwfl_Frame *state, unsigned regno, Dwarf_Word *val)
return res;
}
INTDEF(dwfl_frame_reg)
+
+/* Implement the ebl_set_initial_registers_tid setfunc callback. */
+
+bool
+/* Not internal_function, since that allows calling-convention changes
+ e.g. on i386, and stable ABI is needed to use this as an
+ ebl_tid_registers_t * callback in linux-pid-attach.c and
+ libdwfl_stacktrace. */
+__libdwfl_set_initial_registers_thread (int firstreg, unsigned nregs,
+ const Dwarf_Word *regs, void *arg)
+{
+ Dwfl_Thread *thread = (Dwfl_Thread *) arg;
+ if (firstreg == -1)
+ {
+ assert (nregs == 1);
+ INTUSE(dwfl_thread_state_register_pc) (thread, *regs);
+ return true;
+ }
+ else if (firstreg == -2)
+ {
+ assert (nregs == 1);
+ INTUSE(dwfl_thread_state_registers) (thread, firstreg, nregs, regs);
+ return true;
+ }
+ assert (nregs > 0);
+ return INTUSE(dwfl_thread_state_registers) (thread, firstreg, nregs, regs);
+}
diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c
index a6e4e41a..9472b041 100644
--- a/libdwfl/linux-pid-attach.c
+++ b/libdwfl/linux-pid-attach.c
@@ -302,31 +302,6 @@ pid_getthread (Dwfl *dwfl __attribute__ ((unused)), pid_t tid,
return true;
}
-/* Implement the ebl_set_initial_registers_tid setfunc callback. */
-
-bool
-/* XXX No internal_function annotation,
- as this function gets passed as ebl_tid_registers_t *. */
-__libdwfl_set_initial_registers_thread (int firstreg, unsigned nregs,
- const Dwarf_Word *regs, void *arg)
-{
- Dwfl_Thread *thread = (Dwfl_Thread *) arg;
- if (firstreg == -1)
- {
- assert (nregs == 1);
- INTUSE(dwfl_thread_state_register_pc) (thread, *regs);
- return true;
- }
- else if (firstreg == -2)
- {
- assert (nregs == 1);
- INTUSE(dwfl_thread_state_registers) (thread, firstreg, nregs, regs);
- return true;
- }
- assert (nregs > 0);
- return INTUSE(dwfl_thread_state_registers) (thread, firstreg, nregs, regs);
-}
-
static bool
pid_set_initial_registers (Dwfl_Thread *thread, void *thread_arg)
{
--
2.52.0
|