Skip to content

Commit

Permalink
[LLDB] - Implement the support for the .debug_loclists section.
Browse files Browse the repository at this point in the history
This implements the support for .debug_loclists section, which is
DWARF 5 version of .debug_loc.

Currently, clang is able to emit it with the use of D53365.

Differential revision: https://reviews.llvm.org/D53436

llvm-svn: 345016
  • Loading branch information
George Rimar committed Oct 23, 2018
1 parent 816e57b commit e4dee26
Show file tree
Hide file tree
Showing 13 changed files with 55 additions and 4 deletions.
1 change: 1 addition & 0 deletions lldb/include/lldb/Expression/DWARFExpression.h
Expand Up @@ -41,6 +41,7 @@ class DWARFExpression {
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).
};

//------------------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions lldb/include/lldb/lldb-enumerations.h
Expand Up @@ -676,6 +676,7 @@ enum SectionType {
eSectionTypeOther,
eSectionTypeDWARFDebugLineStr, // DWARF v5 .debug_line_str
eSectionTypeDWARFDebugRngLists, // DWARF v5 .debug_rnglists
eSectionTypeDWARFDebugLocLists, // DWARF v5 .debug_loclists
};

FLAGS_ENUM(EmulateInstructionOptions){
Expand Down
2 changes: 2 additions & 0 deletions lldb/source/Core/Section.cpp
Expand Up @@ -77,6 +77,8 @@ const char *Section::GetTypeAsCString() const {
return "dwarf-line-str";
case eSectionTypeDWARFDebugLoc:
return "dwarf-loc";
case eSectionTypeDWARFDebugLocLists:
return "dwarf-loclists";
case eSectionTypeDWARFDebugMacInfo:
return "dwarf-macinfo";
case eSectionTypeDWARFDebugMacro:
Expand Down
12 changes: 12 additions & 0 deletions lldb/source/Expression/DWARFExpression.cpp
Expand Up @@ -3037,6 +3037,7 @@ bool DWARFExpression::AddressRangeForLocationListEntry(
high_pc = debug_loc_data.GetAddress(offset_ptr);
return true;
case SplitDwarfLocationList:
case LocLists:
switch (debug_loc_data.GetU8(offset_ptr)) {
case DW_LLE_end_of_list:
return false;
Expand All @@ -3054,8 +3055,19 @@ bool DWARFExpression::AddressRangeForLocationListEntry(
high_pc = low_pc + length;
return true;
}
case DW_LLE_start_length: {
low_pc = debug_loc_data.GetAddress(offset_ptr);
high_pc = low_pc + debug_loc_data.GetULEB128(offset_ptr);
return true;
}
case DW_LLE_start_end: {
low_pc = debug_loc_data.GetAddress(offset_ptr);
high_pc = debug_loc_data.GetAddress(offset_ptr);
return true;
}
default:
// Not supported entry type
lldbassert(false && "Not supported location list type");
return false;
}
}
Expand Down
3 changes: 3 additions & 0 deletions lldb/source/Expression/IRExecutionUnit.cpp
Expand Up @@ -553,6 +553,8 @@ lldb::SectionType IRExecutionUnit::GetSectionTypeFromSectionName(
sect_type = lldb::eSectionTypeDWARFDebugLine;
else if (dwarf_name.equals("loc"))
sect_type = lldb::eSectionTypeDWARFDebugLoc;
else if (dwarf_name.equals("loclists"))
sect_type = lldb::eSectionTypeDWARFDebugLocLists;
break;

case 'm':
Expand Down Expand Up @@ -1088,6 +1090,7 @@ bool IRExecutionUnit::CommitOneAllocation(lldb::ProcessSP &process_sp,
case lldb::eSectionTypeDWARFDebugInfo:
case lldb::eSectionTypeDWARFDebugLine:
case lldb::eSectionTypeDWARFDebugLoc:
case lldb::eSectionTypeDWARFDebugLocLists:
case lldb::eSectionTypeDWARFDebugMacInfo:
case lldb::eSectionTypeDWARFDebugPubNames:
case lldb::eSectionTypeDWARFDebugPubTypes:
Expand Down
6 changes: 6 additions & 0 deletions lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
Expand Up @@ -1790,6 +1790,7 @@ void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
static ConstString g_sect_name_dwarf_debug_line(".debug_line");
static ConstString g_sect_name_dwarf_debug_line_str(".debug_line_str");
static ConstString g_sect_name_dwarf_debug_loc(".debug_loc");
static ConstString g_sect_name_dwarf_debug_loclists(".debug_loclists");
static ConstString g_sect_name_dwarf_debug_macinfo(".debug_macinfo");
static ConstString g_sect_name_dwarf_debug_macro(".debug_macro");
static ConstString g_sect_name_dwarf_debug_names(".debug_names");
Expand All @@ -1807,6 +1808,7 @@ void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
static ConstString g_sect_name_dwarf_debug_line_str_dwo(".debug_line_str.dwo");
static ConstString g_sect_name_dwarf_debug_macro_dwo(".debug_macro.dwo");
static ConstString g_sect_name_dwarf_debug_loc_dwo(".debug_loc.dwo");
static ConstString g_sect_name_dwarf_debug_loclists_dwo(".debug_loclists.dwo");
static ConstString g_sect_name_dwarf_debug_str_dwo(".debug_str.dwo");
static ConstString g_sect_name_dwarf_debug_str_offsets_dwo(
".debug_str_offsets.dwo");
Expand Down Expand Up @@ -1868,6 +1870,8 @@ void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
sect_type = eSectionTypeDWARFDebugLineStr;
else if (name == g_sect_name_dwarf_debug_loc)
sect_type = eSectionTypeDWARFDebugLoc;
else if (name == g_sect_name_dwarf_debug_loclists)
sect_type = eSectionTypeDWARFDebugLocLists;
else if (name == g_sect_name_dwarf_debug_macinfo)
sect_type = eSectionTypeDWARFDebugMacInfo;
else if (name == g_sect_name_dwarf_debug_macro)
Expand Down Expand Up @@ -1900,6 +1904,8 @@ void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
sect_type = eSectionTypeDWARFDebugMacro;
else if (name == g_sect_name_dwarf_debug_loc_dwo)
sect_type = eSectionTypeDWARFDebugLoc;
else if (name == g_sect_name_dwarf_debug_loclists_dwo)
sect_type = eSectionTypeDWARFDebugLocLists;
else if (name == g_sect_name_dwarf_debug_str_dwo)
sect_type = eSectionTypeDWARFDebugStr;
else if (name == g_sect_name_dwarf_debug_str_offsets_dwo)
Expand Down
4 changes: 4 additions & 0 deletions lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
Expand Up @@ -1199,6 +1199,7 @@ AddressClass ObjectFileMachO::GetAddressClass(lldb::addr_t file_addr) {
case eSectionTypeDWARFDebugLine:
case eSectionTypeDWARFDebugLineStr:
case eSectionTypeDWARFDebugLoc:
case eSectionTypeDWARFDebugLocLists:
case eSectionTypeDWARFDebugMacInfo:
case eSectionTypeDWARFDebugMacro:
case eSectionTypeDWARFDebugNames:
Expand Down Expand Up @@ -1457,6 +1458,7 @@ static lldb::SectionType GetSectionType(uint32_t flags,
static ConstString g_sect_name_dwarf_debug_info("__debug_info");
static ConstString g_sect_name_dwarf_debug_line("__debug_line");
static ConstString g_sect_name_dwarf_debug_loc("__debug_loc");
static ConstString g_sect_name_dwarf_debug_loclists("__debug_loclists");
static ConstString g_sect_name_dwarf_debug_macinfo("__debug_macinfo");
static ConstString g_sect_name_dwarf_debug_names("__debug_names");
static ConstString g_sect_name_dwarf_debug_pubnames("__debug_pubnames");
Expand Down Expand Up @@ -1486,6 +1488,8 @@ static lldb::SectionType GetSectionType(uint32_t flags,
return eSectionTypeDWARFDebugLine;
if (section_name == g_sect_name_dwarf_debug_loc)
return eSectionTypeDWARFDebugLoc;
if (section_name == g_sect_name_dwarf_debug_loclists)
return eSectionTypeDWARFDebugLocLists;
if (section_name == g_sect_name_dwarf_debug_macinfo)
return eSectionTypeDWARFDebugMacInfo;
if (section_name == g_sect_name_dwarf_debug_names)
Expand Down
3 changes: 3 additions & 0 deletions lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
Expand Up @@ -691,6 +691,7 @@ void ObjectFilePECOFF::CreateSections(SectionList &unified_section_list) {
static ConstString g_sect_name_dwarf_debug_info(".debug_info");
static ConstString g_sect_name_dwarf_debug_line(".debug_line");
static ConstString g_sect_name_dwarf_debug_loc(".debug_loc");
static ConstString g_sect_name_dwarf_debug_loclists(".debug_loclists");
static ConstString g_sect_name_dwarf_debug_macinfo(".debug_macinfo");
static ConstString g_sect_name_dwarf_debug_names(".debug_names");
static ConstString g_sect_name_dwarf_debug_pubnames(".debug_pubnames");
Expand Down Expand Up @@ -736,6 +737,8 @@ void ObjectFilePECOFF::CreateSections(SectionList &unified_section_list) {
section_type = eSectionTypeDWARFDebugLine;
else if (const_sect_name == g_sect_name_dwarf_debug_loc)
section_type = eSectionTypeDWARFDebugLoc;
else if (const_sect_name == g_sect_name_dwarf_debug_loclists)
section_type = eSectionTypeDWARFDebugLocLists;
else if (const_sect_name == g_sect_name_dwarf_debug_macinfo)
section_type = eSectionTypeDWARFDebugMacInfo;
else if (const_sect_name == g_sect_name_dwarf_debug_names)
Expand Down
4 changes: 2 additions & 2 deletions lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
Expand Up @@ -531,7 +531,7 @@ bool DWARFDebugInfoEntry::GetDIENamesAndRanges(
block_length);
} else {
const DWARFDataExtractor &debug_loc_data =
dwarf2Data->get_debug_loc_data();
dwarf2Data->DebugLocData();
const dw_offset_t debug_loc_offset = form_value.Unsigned();

size_t loc_list_length = DWARFExpression::LocationListSize(
Expand Down Expand Up @@ -726,7 +726,7 @@ void DWARFDebugInfoEntry::DumpAttribute(
uint64_t debug_loc_offset = form_value.Unsigned();
if (dwarf2Data) {
DWARFExpression::PrintDWARFLocationList(
s, cu, dwarf2Data->get_debug_loc_data(), debug_loc_offset);
s, cu, dwarf2Data->DebugLocData(), debug_loc_offset);
}
}
} break;
Expand Down
16 changes: 15 additions & 1 deletion lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
Expand Up @@ -654,10 +654,22 @@ const DWARFDataExtractor &SymbolFileDWARF::get_debug_macro_data() {
return GetCachedSectionData(eSectionTypeDWARFDebugMacro, m_data_debug_macro);
}

const DWARFDataExtractor &SymbolFileDWARF::DebugLocData() {
const DWARFDataExtractor &debugLocData = get_debug_loc_data();
if (debugLocData.GetByteSize() > 0)
return debugLocData;
return get_debug_loclists_data();
}

const DWARFDataExtractor &SymbolFileDWARF::get_debug_loc_data() {
return GetCachedSectionData(eSectionTypeDWARFDebugLoc, m_data_debug_loc);
}

const DWARFDataExtractor &SymbolFileDWARF::get_debug_loclists_data() {
return GetCachedSectionData(eSectionTypeDWARFDebugLocLists,
m_data_debug_loclists);
}

const DWARFDataExtractor &SymbolFileDWARF::get_debug_ranges_data() {
return GetCachedSectionData(eSectionTypeDWARFDebugRanges,
m_data_debug_ranges);
Expand Down Expand Up @@ -3346,7 +3358,7 @@ VariableSP SymbolFileDWARF::ParseVariableDIE(const SymbolContext &sc,
uint32_t block_length = form_value.Unsigned();
location.CopyOpcodeData(module, data, block_offset, block_length);
} else {
const DWARFDataExtractor &debug_loc_data = get_debug_loc_data();
const DWARFDataExtractor &debug_loc_data = DebugLocData();
const dw_offset_t debug_loc_offset = form_value.Unsigned();

size_t loc_list_length = DWARFExpression::LocationListSize(
Expand Down Expand Up @@ -3860,6 +3872,8 @@ SymbolFileDWARFDebugMap *SymbolFileDWARF::GetDebugMapSymfile() {

DWARFExpression::LocationListFormat
SymbolFileDWARF::GetLocationListFormat() const {
if (m_data_debug_loclists.m_data.GetByteSize() > 0)
return DWARFExpression::LocLists;
return DWARFExpression::RegularLocationList;
}

Expand Down
4 changes: 4 additions & 0 deletions lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
Expand Up @@ -246,6 +246,7 @@ class SymbolFileDWARF : public lldb_private::SymbolFile,
const lldb_private::DWARFDataExtractor &get_debug_line_str_data();
const lldb_private::DWARFDataExtractor &get_debug_macro_data();
const lldb_private::DWARFDataExtractor &get_debug_loc_data();
const lldb_private::DWARFDataExtractor &get_debug_loclists_data();
const lldb_private::DWARFDataExtractor &get_debug_ranges_data();
const lldb_private::DWARFDataExtractor &get_debug_rnglists_data();
const lldb_private::DWARFDataExtractor &get_debug_str_data();
Expand All @@ -269,6 +270,8 @@ class SymbolFileDWARF : public lldb_private::SymbolFile,

const DWARFDebugRanges *DebugRanges() const;

const lldb_private::DWARFDataExtractor &DebugLocData();

static bool SupportedVersion(uint16_t version);

DWARFDIE
Expand Down Expand Up @@ -477,6 +480,7 @@ class SymbolFileDWARF : public lldb_private::SymbolFile,
DWARFDataSegment m_data_debug_line_str;
DWARFDataSegment m_data_debug_macro;
DWARFDataSegment m_data_debug_loc;
DWARFDataSegment m_data_debug_loclists;
DWARFDataSegment m_data_debug_ranges;
DWARFDataSegment m_data_debug_rnglists;
DWARFDataSegment m_data_debug_str;
Expand Down
Expand Up @@ -30,7 +30,7 @@ lldbSectTypeToLlvmSectionKind(lldb::SectionType type) {
case lldb::eSectionTypeDWARFDebugLine:
return llvm::DW_SECT_LINE;
case lldb::eSectionTypeDWARFDebugLoc:
return llvm::DW_SECT_LOC;
return llvm::DW_SECT_LOC;
case lldb::eSectionTypeDWARFDebugStrOffsets:
return llvm::DW_SECT_STR_OFFSETS;
// case lldb::eSectionTypeDWARFDebugMacinfo:
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Symbol/ObjectFile.cpp
Expand Up @@ -352,6 +352,7 @@ AddressClass ObjectFile::GetAddressClass(addr_t file_addr) {
case eSectionTypeDWARFDebugLine:
case eSectionTypeDWARFDebugLineStr:
case eSectionTypeDWARFDebugLoc:
case eSectionTypeDWARFDebugLocLists:
case eSectionTypeDWARFDebugMacInfo:
case eSectionTypeDWARFDebugMacro:
case eSectionTypeDWARFDebugNames:
Expand Down

0 comments on commit e4dee26

Please sign in to comment.