[Lldb-commits] [PATCH] D131335: WIP: [lldb] abi_tag support 3/3 - Use mangle tree API to determine approximate mangled matches
Michael Buch via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Fri Aug 12 05:31:07 PDT 2022
Michael137 added a comment.
So one of the problems with constructing a more accurate AST is that we don't have enough information in DWARF to construct a unspecialised FunctionProtoType, i.e., `FunctionProtoType 0x1282fe870 'bool (T)'` as opposed to the current `FunctionProtoType 0x1282fe870 '_Bool (struct A::B)' cdecl`.
This was also noted in https://reviews.llvm.org/D61044
> creating the correct templated signature is just impossible. DWARF contains the template parameter, but not their mapping to the actual function signature. In the above example I know that foo has been parametrized by the type ‘int’ (and that T was the template argument name), but I don’t know whether the return type or the first argument were templated or plain ints…
E.g., here is an example DWARF entry for a template function:
0x000001f8: DW_TAG_subprogram
DW_AT_low_pc (0x0000000100003f00)
DW_AT_high_pc (0x0000000100003f18)
DW_AT_APPLE_omit_frame_ptr (true)
DW_AT_frame_base (DW_OP_reg31 WSP)
DW_AT_linkage_name ("_ZN1A10multiParamINS_1BEiEEbT_T0_S1_")
DW_AT_name ("multiParam<A::B, int>")
DW_AT_decl_file ("adl.cpp")
DW_AT_decl_line (34)
DW_AT_type (0x000000000000007d "bool")
DW_AT_external (true)
0x00000215: DW_TAG_formal_parameter
DW_AT_location (DW_OP_fbreg +15)
DW_AT_name ("p1")
DW_AT_decl_file ("adl.cpp")
DW_AT_decl_line (34)
DW_AT_type (0x0000000000000089 "A::B")
0x00000223: DW_TAG_formal_parameter
DW_AT_location (DW_OP_fbreg +8)
DW_AT_name ("p2")
DW_AT_decl_file ("adl.cpp")
DW_AT_decl_line (34)
DW_AT_type (0x0000000000000317 "int")
0x00000231: DW_TAG_formal_parameter
DW_AT_location (DW_OP_fbreg +14)
DW_AT_name ("p3")
DW_AT_decl_file ("adl.cpp")
DW_AT_decl_line (34)
DW_AT_type (0x0000000000000089 "A::B")
0x0000023f: DW_TAG_template_type_parameter
DW_AT_type (0x0000000000000089 "A::B")
DW_AT_name ("First")
0x00000248: DW_TAG_template_type_parameter
DW_AT_type (0x0000000000000317 "int")
DW_AT_name ("Second")
Just from this we wouldn't be able to reconstruct the function prototype (which we need to create a more accurate `FunctionTemplateDecl`). Mainly we don't know whether the formal parameters are of a template parameter type or a concrete type. Maybe someone has an idea of how to get the function prototype through other means at the point where we need to create the `FunctionTemplateDecl`, but I didn't manage to yet.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D131335/new/
https://reviews.llvm.org/D131335
More information about the lldb-commits
mailing list