Created attachment 55111 [details] Contains GCC & clang dwarfdump output as well as simple source code. The DWARF spec, states in paragraph 2.14 "Declaration Coordinates" (version 5, https://dwarfstd.org/doc/DWARF5.pdf) that: "The value of the DW_AT_decl_column attribute represents the source column number at which the first character of the identifier of the declared object appears. The value 0 indicates that no column has been specified." Below is an example of contrived C++ code: auto b = setfoo().setbar().setbaz(); gcc emits column meta data at these positions (represented by _): auto b = setfoo_().setbar_().setbaz_(); Whereas for instance clang emits it properly, according to spec: auto b = _setfoo()._setbar()._setbaz(); So for the following code: " const auto res1 = b.set_foo (10).set_bar (20).set_baz (30).finalize ([] (auto v) { return v * 2; });" The following line number program is emitted (the line number is 66 and set_foo begins on column position 23) Address Line Column File ISA Discriminator Flags ------------------ ------ ------ ------ --- ------------- ------------- 0x0000000000401150 66 31 1 0 0 is_stmt 0x0000000000401161 66 44 1 0 0 is_stmt 0x000000000040116e 66 57 1 0 0 is_stmt 0x000000000040117b 66 71 1 0 0 is_stmt 0x000000000040126c 66 72 1 0 0 is_stmt 0x0000000000401277 66 97 1 0 0 is_stmt 0x000000000040127c 66 100 1 0 0 is_stmt Where as clang emits: 0x000000000040114b 66 23 1 0 0 is_stmt 0x000000000040115e 66 36 1 0 0 0x0000000000401171 66 49 1 0 0 0x0000000000401179 66 62 1 0 0 0x0000000000401430 66 0 1 0 0 is_stmt 0x000000000040143b 66 93 1 0 0 is_stmt prologue_end 0x000000000040143e 66 95 1 0 0 0x0000000000401441 66 86 1 0 0 It's also questionable if GCC emits the correct meta data with respect to statements, but I guess that's a different issue.
This is slightly off-topic, but still relevant to this discussion. In the attachment, we can see this line " const auto res3 = b.set_foo (next_v ()).set_bar (next_v ()).set_baz (next_v ()).finalize ([] (auto v) { return v * 3; });" -- GCC -- Address Line Column File ISA Discriminator Flags ------------------ ------ ------ ------ --- ------------- ------------- 0x00000000004011ee 68 31 1 0 0 is_stmt 0x0000000000401206 68 51 1 0 0 is_stmt 0x0000000000401218 68 71 1 0 0 is_stmt 0x0000000000401227 68 92 1 0 0 is_stmt 0x00000000004012ee 68 93 1 0 0 is_stmt 0x00000000004012f9 68 118 1 0 0 is_stmt 0x0000000000401302 68 121 1 0 0 is_stmt where as clang outputs: Address Line Column File ISA Discriminator Flags ------------------ ------ ------ ------ --- ------------- ------------- 0x00000000004011fd 68 32 1 0 0 is_stmt 0x000000000040120b 68 23 1 0 0 0x0000000000401217 68 52 1 0 0 0x0000000000401225 68 43 1 0 0 0x0000000000401231 68 72 1 0 0 0x000000000040123f 68 63 1 0 0 0x0000000000401247 68 83 1 0 0 0x0000000000401450 68 0 1 0 0 is_stmt 0x000000000040145b 68 116 1 0 0 is_stmt prologue_end 0x000000000040145f 68 107 1 0 0 0x0000000000401461 68 107 1 0 0 end_sequence As we can see, clang outputs information to the actual column meta data for calls at parameter sites whereas GCC does not. Providing these positions in source code opens up for "ergonomics-features", particularly in GDB as GDB can more easily determine sites of interest to step to, set breakpoints at, etc.