[Lldb-commits] [PATCH] D52689: [LLDB] - Add support for DW_FORM_implicit_const.

George Rimar via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Wed Oct 10 07:08:58 PDT 2018

grimar added inline comments.

Comment at: source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.h:51
+      uint32_t idx, dw_attr_t &attr, dw_form_t &form,
+      DWARFFormValue::ValueType *val = nullptr) const {
+    m_attributes[idx].get(attr, form, val);
clayborg wrote:
> Switch to using a "DWARFFormValue *form_value_ptr" so the form value can be filled in automatically, not just the       DWARFFormValue::ValueType. See comments below where this is called.
Answered below.

Comment at: source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp:386
+static void setUnsignedOrSigned(int &dest, DWARFFormValue &val) {
+  if (val.Form() == DW_FORM_implicit_const)
clayborg wrote:
> Remove this as it won't be needed if we do the work of filling in the form value in GetAttrAndFormByIndexUnchecked
Answered below.

Comment at: source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp:439-440
     for (i = 0; i < numAttributes; ++i) {
-      abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form);
-      DWARFFormValue form_value(cu, form);
+      abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form, &val);
+      DWARFFormValue form_value(cu, form, val);
clayborg wrote:
> Maybe switch the order here and pass "form_value" to GetAttrAndFormByIndexUnchecked?:
> ```
>       DWARFFormValue form_value(cu, form);
>       abbrevDecl->GetAttrAndFormByIndexUnchecked(i, attr, form, &form_value);
> ```
> DWARFFormValue form_value(cu, form);

We can not do this because at this point `form` is not yet known.
I changed the code in a bit different way though.

Comment at: source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp:508
           if (decl_file == 0)
-            decl_file = form_value.Unsigned();
+            setUnsignedOrSigned(decl_file, form_value);
clayborg wrote:
> Revert this if we do the work inside "GetAttrAndFormByIndexUnchecked" as form_value will be correct
The problem I see here is the following:

DWARF5 spec says (2.14 Declaration Coordinates, p50):
"Any debugging information entry representing the declaration of an object,
module, subprogram or type may have DW_AT_decl_file, DW_AT_decl_line and
DW_AT_decl_column attributes, each of whose value is an **unsigned integer

But about `DW_FORM_implicit_const` it says (p207):

"The attribute form DW_FORM_implicit_const **is another special case**. For
attributes with this form, the attribute specification contains a third part, which is
a **signed LEB128 number**. The value of this number is used as the value of the
attribute, and no value is stored in the .debug_info section."

So I read `DW_FORM_implicit_const` to `value.sval` and I think we can not
use `form_value.Unsigned();` in that case because it reads from `uval`.
Writing to one union field and reading from the another is undefined behavior in C++ I believe.
Though it works with the modern compilers I think.

DWARFFormValue.h contains dead enum (it is unused)
which intention seems was about to keep the value type information.
Should we start to set and check the type of form value?

I removed the helper for now, but this UB should be addressed somehow I think?

Should we create`DWARFFormValue::GetSignedOrUnsigned` may be? It perhaps will be consistent
with `DWARFFormValue::Address`/`AsCString`which check the form type and returned value depends
on that.


More information about the lldb-commits mailing list