[Lldb-commits] [PATCH] D40467: DWZ 04/12: Separate Offset also into FileOffset

Jan Kratochvil via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Nov 30 01:28:36 PST 2017

jankratochvil added a comment.

> Please undo all renaming from offset to file_offset.

I am preparing now a split of this patch for the renaming part + the "real" part, sorry I did not realize it is mostly about the renaming which is not worth your detailed review.

There are two different types of offsets:

| `UniqOffset` | One DIE from a `DW_TAG_partial_unit` gets two different `UniqOffset` depending from which `DW_TAG_compile_unit` it was included |
| `FileOffset` | One DIE from a `DW_TAG_partial_unit` has only one `FileOffset` - where one can read it from `get_debug_info_data()`             |

Most of LLDB works with `UniqOffset` so I kept the original `dw_offset_t offset` type+name for it. When LLDB works with `FileOffset` I call it `dw_offset_t file_offset`. I really discourage calling these two different offset types the same as it is a bug (although affecting only DWZ files) if there is missing a proper conversion function between these two types.

I found overengineered to make a separate type-safe against accidental exchange wrapper class  for the `FileOffset' but I can if you prefer that over a simple renaming of all the variables/parameters.

https://reviews.llvm.org/D40474 introduces `DWARFFileOffset` which makes it type-safe against accidental exchange with `dw_offset_t` but that type includes also `bool is_dwz` whether it is in DWZ Common File or in the main symbol file which makes it excessive for the places where currently I used `dw_offset_t file_offset` because the file itself is known there.

> The "offset" you get from a  DIE should always be the absolute .debug_info offset. No need to say file_offset.

We never talk about CU-relative offset.  I made remapping in `DWARFDebugInfoEntry`:

| `dw_offset_t GetOffset()` renamed to | `FileOffset`-kind `dw_offset_t GetFileOffset()`                       |
| new                                  | `UniqOffset`-kind `dw_offset_t GetOffset(const DWARFCompileUnit *cu)` |

Comment at: source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h:207-226
+  dw_offset_t GetFileOffset() const { return m_data->m_file_offset; }
+  dw_offset_t FileOffsetToUniqOffset(dw_offset_t file) const {
+    return ThisCUFileOffsetToUniq(file);
+  }
+  static dw_offset_t ThisCUFileOffsetToUniq_nocheck(dw_offset_t file) {
+    return file;
+  }
clayborg wrote:
> Not a fan of these names. Can't these just be something like:
> ```
> dw_offset_t GeCUtRelativeOffset(); // CU relative offset
> dw_offset_t GetOffset(); // Always absolute .debug_info offset
> ```
> ThisCUUniqToFileOffset seems a bit unclear.
What should be `dw_offset_t GeCUtRelativeOffset(); // CU relative offset`?
This patchset never deals with offsets relative to the CU start (and LLDB never uses such offsets, `DWARFCompileUnit::ExtractDIEsIfNeeded` stores their `.debug_info`-relative offsets and `DWARFFormValue::Reference()` also converts everything into `.debug_info`-relative offsets.
| `UniqOffset` -> `FileOffset` | `DWARFDebugInfo::GetCompileUnit`{,`ContainingDIEOffset`} | slow `m_compile_units` bisecting |
| `UniqOffset` -> `FileOffset` | `DWARFCompileUnit::ThisCUUniqToFileOffset` | fast but the CU must match |
| `FileOffset` -> `UniqOffset` | `DWARFCompileUnit::ThisCUFileOffsetToUniq` | fast, this functionality requires to use matching CU |
`UniqOffset` is in the most simple case without using DWZ the same as `FileOffset`.  If DWZ is used then see the mapping in Summary above.
The methods cannot be called `Get' as they convert their parameter value, they are not getters.


More information about the lldb-commits mailing list