[Lldb-commits] [lldb] de8793b - [lldb/DWARF] Add support for type units in dwp files
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Fri Feb 21 07:01:25 PST 2020
Author: Pavel Labath
Date: 2020-02-21T16:01:17+01:00
New Revision: de8793b9184ece0d24f46bc2d86711092848f938
URL: https://github.com/llvm/llvm-project/commit/de8793b9184ece0d24f46bc2d86711092848f938
DIFF: https://github.com/llvm/llvm-project/commit/de8793b9184ece0d24f46bc2d86711092848f938.diff
LOG: [lldb/DWARF] Add support for type units in dwp files
all that was needed was to teach lldb's DWARF context about the
debug_tu_index section.
Added:
lldb/test/Shell/SymbolFile/DWARF/dwp-debug-types.s
Modified:
lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.h
Removed:
################################################################################
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.cpp
index 79601e3bad0d..37e28a09f3c4 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.cpp
@@ -45,6 +45,11 @@ const DWARFDataExtractor &DWARFContext::getOrLoadCuIndexData() {
m_data_debug_cu_index);
}
+const DWARFDataExtractor &DWARFContext::getOrLoadTuIndexData() {
+ return LoadOrGetSection(llvm::None, eSectionTypeDWARFDebugTuIndex,
+ m_data_debug_tu_index);
+}
+
const DWARFDataExtractor &DWARFContext::getOrLoadAbbrevData() {
return LoadOrGetSection(eSectionTypeDWARFDebugAbbrev,
eSectionTypeDWARFDebugAbbrevDwo, m_data_debug_abbrev);
@@ -134,6 +139,7 @@ llvm::DWARFContext &DWARFContext::GetAsLLVM() {
AddSection("debug_line_str", getOrLoadLineStrData());
AddSection("debug_cu_index", getOrLoadCuIndexData());
+ AddSection("debug_tu_index", getOrLoadTuIndexData());
m_llvm_context = llvm::DWARFContext::create(section_map, addr_size);
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.h
index 8de5e9c8a5fb..92161a21d167 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFContext.h
@@ -42,6 +42,7 @@ class DWARFContext {
SectionData m_data_debug_rnglists;
SectionData m_data_debug_str;
SectionData m_data_debug_str_offsets;
+ SectionData m_data_debug_tu_index;
SectionData m_data_debug_types;
const DWARFDataExtractor &
@@ -50,6 +51,7 @@ class DWARFContext {
SectionData &data);
const DWARFDataExtractor &getOrLoadCuIndexData();
+ const DWARFDataExtractor &getOrLoadTuIndexData();
public:
explicit DWARFContext(SectionList *main_section_list,
diff --git a/lldb/test/Shell/SymbolFile/DWARF/dwp-debug-types.s b/lldb/test/Shell/SymbolFile/DWARF/dwp-debug-types.s
new file mode 100644
index 000000000000..fd009381b452
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/DWARF/dwp-debug-types.s
@@ -0,0 +1,211 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc --filetype=obj --triple x86_64-pc-linux %s -o %t --defsym MAIN=0
+# RUN: llvm-mc --filetype=obj --triple x86_64-pc-linux %s -o %t.dwp --defsym DWP=0
+# RUN: %lldb %t -o "type lookup ENUM0" -o "target variable A" -b | FileCheck %s
+
+# CHECK-LABEL: type lookup ENUM0
+# CHECK-NEXT: enum ENUM0 {
+# CHECK-NEXT: case0
+# CHECK-NEXT: }
+
+# CHECK-LABEL: target variable A
+# CHECK: (ENUM0) A = case0
+# CHECK: (ENUM1) A = case0
+
+.ifdef MAIN
+ .section .debug_abbrev,"", at progbits
+ .byte 1 # Abbreviation Code
+ .byte 17 # DW_TAG_compile_unit
+ .byte 0 # DW_CHILDREN_no
+ .ascii "\260B" # DW_AT_GNU_dwo_name
+ .byte 8 # DW_FORM_string
+ .ascii "\261B" # DW_AT_GNU_dwo_id
+ .byte 7 # DW_FORM_data8
+ .ascii "\263B" # DW_AT_GNU_addr_base
+ .byte 23 # DW_FORM_sec_offset
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 0 # EOM(3)
+
+.irpc I,01
+ .data
+A\I:
+ .long 0
+
+ .section .debug_info,"", at progbits
+.Lcu_begin\I:
+ .long .Ldebug_info_end\I-.Ldebug_info_start\I # Length of Unit
+.Ldebug_info_start\I:
+ .short 4 # DWARF version number
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 8 # Address Size (in bytes)
+ .byte 1 # Abbrev [1] DW_TAG_compile_unit
+ .asciz "A.dwo" # DW_AT_GNU_dwo_name
+ .quad \I # DW_AT_GNU_dwo_id
+ .long .debug_addr # DW_AT_GNU_addr_base
+.Ldebug_info_end\I:
+
+ .section .debug_addr,"", at progbits
+ .quad A\I
+
+.endr
+.endif
+
+.ifdef DWP
+.irpc I,01
+ .section .debug_abbrev.dwo,"e", at progbits
+.Labbrev\I:
+ .byte \I*10+1 # Abbreviation Code
+ .byte 17 # DW_TAG_compile_unit
+ .byte 1 # DW_CHILDREN_yes
+ .byte 37 # DW_AT_producer
+ .byte 8 # DW_FORM_string
+ .byte 3 # DW_AT_name
+ .byte 8 # DW_FORM_string
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte \I*10+2 # Abbreviation Code
+ .byte 52 # DW_TAG_variable
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .byte 8 # DW_FORM_string
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 2 # DW_AT_location
+ .byte 24 # DW_FORM_exprloc
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte \I*10+3 # Abbreviation Code
+ .byte 4 # DW_TAG_enumeration_type
+ .byte 0 # DW_CHILDREN_no
+ .byte 60 # DW_AT_declaration
+ .byte 25 # DW_FORM_flag_present
+ .byte 105 # DW_AT_signature
+ .byte 32 # DW_FORM_ref_sig8
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte \I*10+4 # Abbreviation Code
+ .byte 4 # DW_TAG_enumeration_type
+ .byte 1 # DW_CHILDREN_yes
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 3 # DW_AT_name
+ .byte 8 # DW_FORM_string
+ .byte 11 # DW_AT_byte_size
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte \I*10+5 # Abbreviation Code
+ .byte 40 # DW_TAG_enumerator
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .byte 8 # DW_FORM_string
+ .byte 28 # DW_AT_const_value
+ .byte 15 # DW_FORM_udata
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte \I*10+6 # Abbreviation Code
+ .byte 36 # DW_TAG_base_type
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .byte 8 # DW_FORM_string
+ .byte 62 # DW_AT_encoding
+ .byte 11 # DW_FORM_data1
+ .byte 11 # DW_AT_byte_size
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte \I*10+7 # Abbreviation Code
+ .byte 65 # DW_TAG_type_unit
+ .byte 1 # DW_CHILDREN_yes
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 0 # EOM(3)
+.Labbrev_end\I:
+
+ .section .debug_info.dwo,"e", at progbits
+.Lcu_begin\I:
+ .long .Ldebug_info_end\I-.Ldebug_info_start\I # Length of Unit
+.Ldebug_info_start\I:
+ .short 4 # DWARF version number
+ .long 0 # Offset Into Abbrev. Section
+ .byte 8 # Address Size (in bytes)
+ .byte \I*10+1 # Abbrev DW_TAG_compile_unit
+ .asciz "Hand-written DWARF" # DW_AT_producer
+ .byte '0'+\I, '.', 'c', 0 # DW_AT_name
+ .byte \I*10+2 # Abbrev DW_TAG_variable
+ .asciz "A" # DW_AT_name
+ .long .Lenum_ref\I-.Lcu_begin\I# DW_AT_type
+ .byte 2 # DW_AT_location
+ .byte 0xfb # DW_OP_GNU_addr_index
+ .byte \I
+
+.Lenum_ref\I:
+ .byte \I*10+3 # Abbrev DW_TAG_enumeration_type
+ .quad \I # DW_AT_signature
+
+ .byte 0 # End Of Children Mark
+.Ldebug_info_end\I:
+
+ .section .debug_types.dwo,"e", at progbits
+.Ltu_begin\I:
+ .long .Ltype_info_end\I-.Ltype_info_start\I # Length of Unit
+.Ltype_info_start\I:
+ .short 4 # DWARF version number
+ .long 0 # Offset Into Abbrev. Section
+ .byte 8 # Address Size (in bytes)
+ .quad \I # Type Signature
+ .long .Lenum\I-.Ltu_begin\I # Type DIE Offset
+ .byte \I*10+7 # Abbrev DW_TAG_type_unit
+
+.Lenum\I:
+ .byte \I*10+4 # Abbrev DW_TAG_enumeration_type
+ .long .Lint\I-.Ltu_begin\I # DW_AT_type
+ .byte 'E', 'N', 'U', 'M', '0'+\I, 0# DW_AT_name
+ .byte 4 # DW_AT_byte_size
+
+ .byte \I*10+5 # Abbrev DW_TAG_enumerator
+ .asciz "case0" # DW_AT_name
+ .byte 0 # DW_AT_const_value
+ .byte 0 # End Of Children Mark
+
+.Lint\I:
+ .byte \I*10+6 # Abbrev DW_TAG_base_type
+ .asciz "int" # DW_AT_name
+ .byte 7 # DW_AT_encoding
+ .byte 4 # DW_AT_byte_size
+
+ .byte 0 # End Of Children Mark
+.Ltype_info_end\I:
+.endr
+
+.macro index dw_sect, section, contrib, contrib_end
+ .short 2 # DWARF version number
+ .short 0 # Reserved
+ .long 2 # Section count
+ .long 2 # Unit count
+ .long 4 # Slot count
+
+ .quad 0, 1, 0, 0 # Hash table
+ .long 1, 2, 0, 0 # Index table
+
+ .long \dw_sect
+ .long 3 # DW_SECT_ABBREV
+
+.irpc I,01
+ .long \contrib\I-\section
+ .long .Labbrev\I-.debug_abbrev.dwo
+.endr
+.irpc I,01
+ .long \contrib_end\I-\contrib\I
+ .long .Labbrev_end\I-.Labbrev\I
+.endr
+.endmacro
+
+ .section .debug_cu_index,"e", at progbits
+ index 1, .debug_info.dwo, .Lcu_begin, .Ldebug_info_end
+
+ .section .debug_tu_index,"e", at progbits
+ index 2, .debug_types.dwo, .Ltu_begin, .Ltype_info_end
+.endif
More information about the lldb-commits
mailing list