| Issue |
53163
|
| Summary |
[DWARF][DebugInfo] Missing variables due to clang setting type size to zero
|
| Labels |
debuginfo
|
| Assignees |
|
| Reporter |
OCHyams
|
clang built with 968be05b8fdc1d23c055cc4963230a89efbc5967 (2022-01-12)
Target: x86_64-unknown-linux-gnu
Clang sometimes emits DW_TAG_base_type DIEs with the attribute DW_AT_byte_size set to 0. This is observable when enabling DWARFv5 in the following reproducer. Look at the DIE for DW_ATE_unsigned_1 (0x00000023) which is used in the location _expression_ for `b` (0x0000004e) as part of a conversion (DW_OP_convert).
```
$ cat ex.cpp
__attribute__((optnone))
void ext(bool) {}
__attribute__((noinline))
void fun(bool b) {
ext(b);
}
int main() {
fun(true);
return 0;
}
$ clang -c -O2 -gdwarf-5 ex.cpp -o ex.o
$ llvm-dwarfdump test.o
0x00000023: DW_TAG_base_type
DW_AT_name ("DW_ATE_unsigned_1")
DW_AT_encoding (DW_ATE_unsigned)
DW_AT_byte_size (0x00)
0x00000027: DW_TAG_base_type
DW_AT_name ("DW_ATE_unsigned_8")
DW_AT_encoding (DW_ATE_unsigned)
DW_AT_byte_size (0x01)
<snip>
0x00000042: DW_TAG_subprogram
DW_AT_low_pc (0x00000000004004b0)
DW_AT_high_pc (0x00000000004004b5)
DW_AT_frame_base (DW_OP_reg7 RSP)
DW_AT_call_all_calls (true)
DW_AT_linkage_name ("_Z3funb")
DW_AT_name ("fun")
DW_AT_decl_file ("/home/och/dev/bugs/scratch/ex.cpp")
DW_AT_decl_line (4)
DW_AT_external (true)
0x0000004e: DW_TAG_formal_parameter
DW_AT_location (DW_OP_breg5 RDI+0, DW_OP_constu 0xffffffff, DW_OP_and, DW_OP_convert (0x00000023) "DW_ATE_unsigned_1", DW_OP_convert (0x00000027) "DW_ATE_unsigned_8", DW_OP_stack_value)
DW_AT_name ("b")
DW_AT_decl_file ("/home/och/dev/bugs/scratch/ex.cpp")
DW_AT_decl_line (4)
DW_AT_type (0x0000009a "bool")
```
lldb says the variable is unavailable and helpfully reports "Unsupported type size in DW_OP_convert":
```
__attribute__((optnone))
void ext(bool) {}
__attribute__((noinline))
void fun(bool b) {
ext(b);
}
int main() {
fun(true);
return 0;
}
$ clang -O2 -gdwarf-5 ex.cpp -o ex
$ lldb ex
~/dev/bugs/scratch$ lldb ex
(lldb) target create "ex"
Current executable set to '/home/och/dev/bugs/scratch/ex' (x86_64).
(lldb) b fun
Breakpoint 1: where = ex`fun(bool) at ex.cpp:5:3, address = 0x00000000004004b0
(lldb) run
Process 6295 launched: '/home/och/dev/bugs/scratch/ex' (x86_64)
Process 6295 stopped
* thread #1, name = 'ex', stop reason = breakpoint 1.1
frame #0: 0x00000000004004b0 ex`fun(b=<unavailable>) at ex.cpp:5:3
2 void ext(bool) {}
3 __attribute__((noinline))
4 void fun(bool b) {
-> 5 ext(b);
6 }
7 int main() {
8 fun(true);
(lldb) p b
error: Couldn't materialize: couldn't get the value of variable b: Unsupported type size in DW_OP_convert
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs