selftests/bpf: fix btf_dump/btf_dump due to recent clang change
...
[ Upstream commit 4050764cbaa25760aab40857f723393c07898474 ]
Latest llvm-project upstream had a change of behavior
related to qualifiers on function return type ([1]).
This caused selftests btf_dump/btf_dump failure.
The following example shows what changed.
$ cat t.c
typedef const char * const (* const (* const fn_ptr_arr2_t[5])())(char * (*)(int));
struct t {
int a;
fn_ptr_arr2_t l;
};
int foo(struct t *arg) {
return arg->a;
}
Compiled with latest upstream llvm15,
$ clang -O2 -g -target bpf -S -emit-llvm t.c
The related generated debuginfo IR looks like:
!16 = !DIDerivedType(tag: DW_TAG_typedef, name: "fn_ptr_arr2_t", file: !1 , line: 1, baseType: !17 )
!17 = !DICompositeType(tag: DW_TAG_array_type, baseType: !18 , size: 320, elements: !32 )
!18 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !19 )
!19 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !20 , size: 64)
!20 = !DISubroutineType(types: !21 )
!21 = !{!22, null}
!22 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !23 , size: 64)
!23 = !DISubroutineType(types: !24 )
!24 = !{!25, !28}
!25 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !26 , size: 64)
!26 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !27 )
!27 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
You can see two intermediate const qualifier to pointer are dropped in debuginfo IR.
With llvm14, we have following debuginfo IR:
!16 = !DIDerivedType(tag: DW_TAG_typedef, name: "fn_ptr_arr2_t", file: !1 , line: 1, baseType: !17 )
!17 = !DICompositeType(tag: DW_TAG_array_type, baseType: !18 , size: 320, elements: !34 )
!18 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !19 )
!19 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !20 , size: 64)
!20 = !DISubroutineType(types: !21 )
!21 = !{!22, null}
!22 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !23 )
!23 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !24 , size: 64)
!24 = !DISubroutineType(types: !25 )
!25 = !{!26, !30}
!26 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !27 )
!27 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !28 , size: 64)
!28 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !29 )
!29 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
All const qualifiers are preserved.
To adapt the selftest to both old and new llvm, this patch removed
the intermediate const qualifier in const-to-ptr types, to make the
test succeed again.
[1] https://reviews.llvm.org/D125919
Reported-by: Mykola Lysenko <mykolal@fb.com>
Signed-off-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/r/20220523152044.3905809-1-yhs@fb.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>