On 9/29/22 12:33 PM, Arnaldo Carvalho de Melo wrote:
Em Thu, Sep 29, 2022 at 09:42:53AM -0300, Arnaldo Carvalho de Melo escreveu:
Em Wed, Sep 28, 2022 at 08:25:51AM -0700, Nathan Chancellor escreveu:
On Wed, Sep 28, 2022 at 10:42:53AM -0300, Arnaldo Carvalho de Melo wrote:
Can you please provide the vmlinux file where this takes place?
Sure thing, it is compressed to save some bandwidth while downloading:
https://1drv.ms/u/s!AsQNYeB-IEbqnnzsULjM1pXmOlI5?e=qHKjuW
So, fixed the case reported, DW_TAG_label outside a DW_TAG_lexblock, on
asm DW_TAG_compile_unit DWARF containers, now I noticed that pahole
suports encoding BTF_KIND_TAG (18) but not _decoding_ those, so off I go
to work on it on btf_loader.c, looking at what btf_encoder.c does.
Good that you got me this vmlinux built by clang 15 :-)
Now we can BTF encode a vmlinux (-J) using all the CPUs in the system
(-j), and then we end up with a kernel with BTF_KIND_TAG that can't be
properly grokked by pahole when loading from BTF:
⬢[acme@toolbox pahole]$ pahole -j -J vmlinux-pahole-warnings
⬢[acme@toolbox pahole]$ pahole -F btf vmlinux-pahole-warnings > pahole-pretty-printed-from-btf
BTF: idx: 277, Unknown kind 18
BTF: idx: 281, Unknown kind 18
BTF: idx: 331, Unknown kind 18
BTF: idx: 689, Unknown kind 18
BTF: idx: 692, Unknown kind 18
For instance:
⬢[acme@toolbox pahole]$ pahole -C __sifields -F btf vmlinux-pahole-warnings
BTF: idx: 277, Unknown kind 18
BTF: idx: 281, Unknown kind 18
BTF: idx: 331, Unknown kind 18
BTF: idx: 689, Unknown kind 18
<BIG SNIP>
BTF: idx: 128403, Unknown kind 18
BTF: idx: 128409, Unknown kind 18
union __sifields {
struct {
__kernel_pid_t _pid; /* 0 4 */
__kernel_uid32_t _uid; /* 4 4 */
} _kill; /* 0 8 */
struct {
__kernel_timer_t _tid; /* 0 4 */
int _overrun; /* 4 4 */
sigval_t _sigval; /* 8 8 */
int _sys_private; /* 16 4 */
} _timer; /* 0 24 */
struct {
__kernel_pid_t _pid; /* 0 4 */
__kernel_uid32_t _uid; /* 4 4 */
sigval_t _sigval; /* 8 8 */
} _rt; /* 0 16 */
struct {
__kernel_pid_t _pid; /* 0 4 */
__kernel_uid32_t _uid; /* 4 4 */
int _status; /* 8 4 */
/* XXX 4 bytes hole, try to pack */
__kernel_clock_t _utime; /* 16 8 */
__kernel_clock_t _stime; /* 24 8 */
} _sigchld; /* 0 32 */
struct {
<ERROR > _addr; /* 0 8 */
So this shares a type with several other fields/variables/whatever and
then:
[ cb57] member abbrev: 6
name (strx2) "sival_ptr"
type (ref4) [ cb62]
decl_file (data1) siginfo.h (153)
decl_line (data1) 10
data_member_location (data1) 0
[ cb62] pointer_type abbrev: 80
[ cb63] lo_user+0x1f80 abbrev: 51
name (strx1) "btf_type_tag"
const_value (strx1) "user"
This is with eu-readelf from elfutils, binutils readelf gets confused,
unsure about the equivalent for llvm, lets see:
llvm-dwarfdump gets:
0x0000cb57: DW_TAG_member
DW_AT_name ("sival_ptr")
DW_AT_type (0x0000cb62 "void *")
DW_AT_decl_file ("/home/nathan/cbl/src/linux/./include/uapi/asm-generic/siginfo.h")
DW_AT_decl_line (10)
DW_AT_data_member_location (0x00)
looks saner, a void pointer, probably with an attribute of btf_type_tag
(DW_TAG_llvm-something, IIRC):
0x0000cb62: DW_TAG_pointer_type
0x0000cb63: DW_TAG_LLVM_annotation
DW_AT_name ("btf_type_tag")
DW_AT_const_value ("user")
0x0000cb66: NULL
None of these tools seem to be grokking this nicely, Yonghong?
Sorry for late reply. I missed this email.
Yes, btf_type_tag is only supported with llvm. gcc/gnu-tools does not
support it yet. There is an effort in gcc community to support this.
https://gcc.gnu.org/pipermail/gcc-patches/2022-July/598038.html
but the progress has been slow recently.
⬢[acme@toolbox pahole]$ llvm-dwarfdump --version
LLVM (http://llvm.org/ ):
LLVM version 14.0.0git
Optimized build.
Default target: x86_64-unknown-linux-gnu
Host CPU: znver3
⬢[acme@toolbox pahole]$ cat /etc/fedora-release
Fedora release 36 (Thirty Six)
⬢[acme@toolbox pahole]$
I.e. sival_ptr is a:
typedef union sigval {
int sival_int;
void __user *sival_ptr;
} sigval_t;
So I would expect that sival_ptr pointed to a void * with an
intermediate DW_TAG_LLVM_annotation? What is the semantics? How all
these tools need to grok this?
- Arnaldo