grimar created this revision.
grimar added reviewers: LLDB, clayborg.
Herald added subscribers: JDevlieghere, aprantl.

Currently, we always parse the `length` field of DW_LLE_startx_length entry as 
U32.
That is correct for pre-standard definition:

https://gcc.gnu.org/wiki/DebugFission - "A start/length entry contains one 
unsigned LEB128 number
and a 4-byte unsigned value (as would be represented by the form code 
DW_FORM_const4u). The first
number is an index into the .debug_addr section that selects the beginning 
offset, and the second
number is the length of the range. ")

But DWARF v5 says: "This is a form of bounded location description that has two 
unsigned ULEB operands.
The first value is an address index (into the .debug_addr section) that 
indicates the beginning of the address
range over which the location is valid. The second value is the length of the 
range."

Fortunately, we can easily handle the difference. No test case because it seems 
impossible to test
until we will be ready to use DWARF v5 in tests that need to run the 
executables.


https://reviews.llvm.org/D53646

Files:
  include/lldb/Expression/DWARFExpression.h
  source/Expression/DWARFExpression.cpp


Index: source/Expression/DWARFExpression.cpp
===================================================================
--- source/Expression/DWARFExpression.cpp
+++ source/Expression/DWARFExpression.cpp
@@ -3029,7 +3029,9 @@
   if (!debug_loc_data.ValidOffset(*offset_ptr))
     return false;
 
-  switch (dwarf_cu->GetSymbolFileDWARF()->GetLocationListFormat()) {
+  DWARFExpression::LocationListFormat format =
+      dwarf_cu->GetSymbolFileDWARF()->GetLocationListFormat();
+  switch (format) {
   case NonLocationList:
     return false;
   case RegularLocationList:
@@ -3051,7 +3053,9 @@
     case DW_LLE_startx_length: {
       uint64_t index = debug_loc_data.GetULEB128(offset_ptr);
       low_pc = ReadAddressFromDebugAddrSection(dwarf_cu, index);
-      uint32_t length = debug_loc_data.GetU32(offset_ptr);
+      uint64_t length = (format == LocLists)
+                            ? debug_loc_data.GetULEB128(offset_ptr)
+                            : debug_loc_data.GetU32(offset_ptr);
       high_pc = low_pc + length;
       return true;
     }
Index: include/lldb/Expression/DWARFExpression.h
===================================================================
--- include/lldb/Expression/DWARFExpression.h
+++ include/lldb/Expression/DWARFExpression.h
@@ -40,8 +40,10 @@
   enum LocationListFormat : uint8_t {
     NonLocationList,     // Not a location list
     RegularLocationList, // Location list format used in non-split dwarf files
-    SplitDwarfLocationList, // Location list format used in split dwarf files
-    LocLists,               // Location list format used in DWARF v5 
(.debug_loclists).
+    SplitDwarfLocationList, // Location list format used in pre-DWARF v5 split
+                            // dwarf files (.debug_loc.dwo)
+    LocLists,               // Location list format used in DWARF v5
+                            // (.debug_loclists/.debug_loclists.dwo).
   };
 
   //------------------------------------------------------------------
@@ -153,7 +155,7 @@
   lldb::addr_t GetLocation_DW_OP_addr(uint32_t op_addr_idx, bool &error) const;
 
   bool Update_DW_OP_addr(lldb::addr_t file_addr);
-  
+
   void SetModule(const lldb::ModuleSP &module) { m_module_wp = module; }
 
   bool ContainsThreadLocalStorage() const;


Index: source/Expression/DWARFExpression.cpp
===================================================================
--- source/Expression/DWARFExpression.cpp
+++ source/Expression/DWARFExpression.cpp
@@ -3029,7 +3029,9 @@
   if (!debug_loc_data.ValidOffset(*offset_ptr))
     return false;
 
-  switch (dwarf_cu->GetSymbolFileDWARF()->GetLocationListFormat()) {
+  DWARFExpression::LocationListFormat format =
+      dwarf_cu->GetSymbolFileDWARF()->GetLocationListFormat();
+  switch (format) {
   case NonLocationList:
     return false;
   case RegularLocationList:
@@ -3051,7 +3053,9 @@
     case DW_LLE_startx_length: {
       uint64_t index = debug_loc_data.GetULEB128(offset_ptr);
       low_pc = ReadAddressFromDebugAddrSection(dwarf_cu, index);
-      uint32_t length = debug_loc_data.GetU32(offset_ptr);
+      uint64_t length = (format == LocLists)
+                            ? debug_loc_data.GetULEB128(offset_ptr)
+                            : debug_loc_data.GetU32(offset_ptr);
       high_pc = low_pc + length;
       return true;
     }
Index: include/lldb/Expression/DWARFExpression.h
===================================================================
--- include/lldb/Expression/DWARFExpression.h
+++ include/lldb/Expression/DWARFExpression.h
@@ -40,8 +40,10 @@
   enum LocationListFormat : uint8_t {
     NonLocationList,     // Not a location list
     RegularLocationList, // Location list format used in non-split dwarf files
-    SplitDwarfLocationList, // Location list format used in split dwarf files
-    LocLists,               // Location list format used in DWARF v5 (.debug_loclists).
+    SplitDwarfLocationList, // Location list format used in pre-DWARF v5 split
+                            // dwarf files (.debug_loc.dwo)
+    LocLists,               // Location list format used in DWARF v5
+                            // (.debug_loclists/.debug_loclists.dwo).
   };
 
   //------------------------------------------------------------------
@@ -153,7 +155,7 @@
   lldb::addr_t GetLocation_DW_OP_addr(uint32_t op_addr_idx, bool &error) const;
 
   bool Update_DW_OP_addr(lldb::addr_t file_addr);
-  
+
   void SetModule(const lldb::ModuleSP &module) { m_module_wp = module; }
 
   bool ContainsThreadLocalStorage() const;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
  • [Lldb-commits] [PATCH] D5364... George Rimar via Phabricator via lldb-commits

Reply via email to