Skip to content

Call site entries for declared C++ member functions not reported in debug info #161962

@jryans

Description

@jryans

When the following...

class A { public: virtual void setVal(bool v); bool validation; }; class B { public: virtual void setVal(bool v); A a; }; class B1 : public B { public: void setVal(bool v) override { a.setVal(v); } }; int main(int argc, char **argv) { B1 b; b.setVal(argc); }

...is compiled with Clang 21.1.0 at -O2, the call from B1.setVal to A.setVal becomes a tail call:

define linkonce_odr dso_local void @B1::setVal(bool)(ptr noundef nonnull align 8 dereferenceable(24) %this, i1 noundef zeroext %v) unnamed_addr #2 comdat align 2 !dbg !85 { entry: #dbg_value(ptr %this, !84, !DIExpression(), !92) #dbg_value(i1 %v, !87, !DIExpression(DW_OP_LLVM_convert, 1, DW_ATE_unsigned, DW_OP_LLVM_convert, 8, DW_ATE_unsigned, DW_OP_stack_value), !92) %a = getelementptr inbounds nuw i8, ptr %this, i64 8, !dbg !93 tail call void @A::setVal(bool)(ptr noundef nonnull align 8 dereferenceable(9) %a, i1 noundef zeroext %v), !dbg !94 ret void, !dbg !95 }
B1::setVal(bool): add rdi,0x8 jmp 9 <B1::setVal(bool)+0x9> R_X86_64_PLT32 A::setVal(bool)-0x4 

...but there is no DW_TAG_call_site DIE marking this as a tail call in debug info. If we check GCC 15.2 at -O2, it has the expected behaviour of using a tail call and also reporting the tail call via DW_TAG_call_site in DWARF.

Example available on Compiler Explorer.

Metadata

Metadata

Assignees

Labels

clang:codegenIR generation bugs: mangling, exceptions, etc.confirmedVerified by a second partydebuginfo

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions