| Issue |
161962
|
| Summary |
Tail calls between C++ member functions not reported in debug info
|
| Labels |
debuginfo
|
| Assignees |
|
| Reporter |
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](https://godbolt.org/z/YYj7b1qvG) on Compiler Explorer.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs