[Lldb-commits] [lldb] 7cea22c - [lldb][NFC] Remove code duplication in InitOSO
Felipe de Azevedo Piovezan via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 6 05:20:51 PDT 2023
Author: Felipe de Azevedo Piovezan
Date: 2023-07-06T08:20:31-04:00
New Revision: 7cea22c0be95834317c920c21839cdd4c80fbdd8
URL: https://github.com/llvm/llvm-project/commit/7cea22c0be95834317c920c21839cdd4c80fbdd8
DIFF: https://github.com/llvm/llvm-project/commit/7cea22c0be95834317c920c21839cdd4c80fbdd8.diff
LOG: [lldb][NFC] Remove code duplication in InitOSO
Two identical loops were iterating over different ranges, leading to code
duplication. We replace this by a loop over the concatenation of the ranges.
We also use early returns to avoid deeply nested code and explicitly check for a
condition mentioned in comments.
Differential Revision: https://reviews.llvm.org/D154505
Added:
Modified:
lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
Removed:
################################################################################
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
index 131933777bf31c..bb66fbadfb6429 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -32,6 +32,7 @@
#include "lldb/Symbol/SymbolVendor.h"
#include "lldb/Symbol/TypeMap.h"
#include "lldb/Symbol/VariableList.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/ScopedPrinter.h"
#include "lldb/Target/StackFrame.h"
@@ -286,112 +287,105 @@ void SymbolFileDWARFDebugMap::InitOSO() {
// we return the abilities of the first N_OSO's DWARF.
Symtab *symtab = m_objfile_sp->GetSymtab();
- if (symtab) {
- Log *log = GetLog(DWARFLog::DebugMap);
-
- std::vector<uint32_t> oso_indexes;
- // When a mach-o symbol is encoded, the n_type field is encoded in bits
- // 23:16, and the n_desc field is encoded in bits 15:0.
- //
- // To find all N_OSO entries that are part of the DWARF + debug map we find
- // only object file symbols with the flags value as follows: bits 23:16 ==
- // 0x66 (N_OSO) bits 15: 0 == 0x0001 (specifies this is a debug map object
- // file)
- const uint32_t k_oso_symbol_flags_value = 0x660001u;
-
- const uint32_t oso_index_count =
- symtab->AppendSymbolIndexesWithTypeAndFlagsValue(
- eSymbolTypeObjectFile, k_oso_symbol_flags_value, oso_indexes);
-
- if (oso_index_count > 0) {
- symtab->AppendSymbolIndexesWithType(eSymbolTypeCode, Symtab::eDebugYes,
- Symtab::eVisibilityAny,
- m_func_indexes);
- symtab->AppendSymbolIndexesWithType(eSymbolTypeData, Symtab::eDebugYes,
- Symtab::eVisibilityAny,
- m_glob_indexes);
-
- symtab->SortSymbolIndexesByValue(m_func_indexes, true);
- symtab->SortSymbolIndexesByValue(m_glob_indexes, true);
-
- for (uint32_t sym_idx : m_func_indexes) {
- const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
- lldb::addr_t file_addr = symbol->GetAddressRef().GetFileAddress();
- lldb::addr_t byte_size = symbol->GetByteSize();
- DebugMap::Entry debug_map_entry(
- file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
- m_debug_map.Append(debug_map_entry);
- }
- for (uint32_t sym_idx : m_glob_indexes) {
- const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
- lldb::addr_t file_addr = symbol->GetAddressRef().GetFileAddress();
- lldb::addr_t byte_size = symbol->GetByteSize();
- DebugMap::Entry debug_map_entry(
- file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
- m_debug_map.Append(debug_map_entry);
- }
- m_debug_map.Sort();
-
- m_compile_unit_infos.resize(oso_index_count);
-
- for (uint32_t i = 0; i < oso_index_count; ++i) {
- const uint32_t so_idx = oso_indexes[i] - 1;
- const uint32_t oso_idx = oso_indexes[i];
- const Symbol *so_symbol = symtab->SymbolAtIndex(so_idx);
- const Symbol *oso_symbol = symtab->SymbolAtIndex(oso_idx);
- if (so_symbol && oso_symbol &&
- so_symbol->GetType() == eSymbolTypeSourceFile &&
- oso_symbol->GetType() == eSymbolTypeObjectFile) {
- m_compile_unit_infos[i].so_file.SetFile(
- so_symbol->GetName().AsCString(), FileSpec::Style::native);
- m_compile_unit_infos[i].oso_path = oso_symbol->GetName();
- m_compile_unit_infos[i].oso_mod_time =
- llvm::sys::toTimePoint(oso_symbol->GetIntegerValue(0));
- uint32_t sibling_idx = so_symbol->GetSiblingIndex();
- // The sibling index can't be less that or equal to the current index
- // "i"
- if (sibling_idx == UINT32_MAX) {
- m_objfile_sp->GetModule()->ReportError(
- "N_SO in symbol with UID {0} has invalid sibling in debug "
- "map, "
- "please file a bug and attach the binary listed in this error",
- so_symbol->GetID());
- } else {
- const Symbol *last_symbol = symtab->SymbolAtIndex(sibling_idx - 1);
- m_compile_unit_infos[i].first_symbol_index = so_idx;
- m_compile_unit_infos[i].last_symbol_index = sibling_idx - 1;
- m_compile_unit_infos[i].first_symbol_id = so_symbol->GetID();
- m_compile_unit_infos[i].last_symbol_id = last_symbol->GetID();
-
- LLDB_LOGF(log, "Initialized OSO 0x%8.8x: file=%s", i,
- oso_symbol->GetName().GetCString());
- }
- } else {
- if (oso_symbol == nullptr)
- m_objfile_sp->GetModule()->ReportError(
- "N_OSO symbol[{0}] can't be found, please file a bug and "
- "attach "
- "the binary listed in this error",
- oso_idx);
- else if (so_symbol == nullptr)
- m_objfile_sp->GetModule()->ReportError(
- "N_SO not found for N_OSO symbol[{0}], please file a bug and "
- "attach the binary listed in this error",
- oso_idx);
- else if (so_symbol->GetType() != eSymbolTypeSourceFile)
- m_objfile_sp->GetModule()->ReportError(
- "N_SO has incorrect symbol type ({0}) for N_OSO "
- "symbol[{1}], "
- "please file a bug and attach the binary listed in this error",
- so_symbol->GetType(), oso_idx);
- else if (oso_symbol->GetType() != eSymbolTypeSourceFile)
- m_objfile_sp->GetModule()->ReportError(
- "N_OSO has incorrect symbol type ({0}) for N_OSO "
- "symbol[{1}], "
- "please file a bug and attach the binary listed in this error",
- oso_symbol->GetType(), oso_idx);
- }
+ if (!symtab)
+ return;
+
+ Log *log = GetLog(DWARFLog::DebugMap);
+
+ std::vector<uint32_t> oso_indexes;
+ // When a mach-o symbol is encoded, the n_type field is encoded in bits
+ // 23:16, and the n_desc field is encoded in bits 15:0.
+ //
+ // To find all N_OSO entries that are part of the DWARF + debug map we find
+ // only object file symbols with the flags value as follows: bits 23:16 ==
+ // 0x66 (N_OSO) bits 15: 0 == 0x0001 (specifies this is a debug map object
+ // file)
+ const uint32_t k_oso_symbol_flags_value = 0x660001u;
+
+ const uint32_t oso_index_count =
+ symtab->AppendSymbolIndexesWithTypeAndFlagsValue(
+ eSymbolTypeObjectFile, k_oso_symbol_flags_value, oso_indexes);
+
+ if (oso_index_count == 0)
+ return;
+
+ symtab->AppendSymbolIndexesWithType(eSymbolTypeCode, Symtab::eDebugYes,
+ Symtab::eVisibilityAny, m_func_indexes);
+ symtab->AppendSymbolIndexesWithType(eSymbolTypeData, Symtab::eDebugYes,
+ Symtab::eVisibilityAny, m_glob_indexes);
+
+ symtab->SortSymbolIndexesByValue(m_func_indexes, true);
+ symtab->SortSymbolIndexesByValue(m_glob_indexes, true);
+
+ for (uint32_t sym_idx :
+ llvm::concat<uint32_t>(m_func_indexes, m_glob_indexes)) {
+ const Symbol *symbol = symtab->SymbolAtIndex(sym_idx);
+ lldb::addr_t file_addr = symbol->GetAddressRef().GetFileAddress();
+ lldb::addr_t byte_size = symbol->GetByteSize();
+ DebugMap::Entry debug_map_entry(file_addr, byte_size,
+ OSOEntry(sym_idx, LLDB_INVALID_ADDRESS));
+ m_debug_map.Append(debug_map_entry);
+ }
+ m_debug_map.Sort();
+
+ m_compile_unit_infos.resize(oso_index_count);
+
+ for (uint32_t i = 0; i < oso_index_count; ++i) {
+ const uint32_t so_idx = oso_indexes[i] - 1;
+ const uint32_t oso_idx = oso_indexes[i];
+ const Symbol *so_symbol = symtab->SymbolAtIndex(so_idx);
+ const Symbol *oso_symbol = symtab->SymbolAtIndex(oso_idx);
+ if (so_symbol && oso_symbol &&
+ so_symbol->GetType() == eSymbolTypeSourceFile &&
+ oso_symbol->GetType() == eSymbolTypeObjectFile) {
+ m_compile_unit_infos[i].so_file.SetFile(so_symbol->GetName().AsCString(),
+ FileSpec::Style::native);
+ m_compile_unit_infos[i].oso_path = oso_symbol->GetName();
+ m_compile_unit_infos[i].oso_mod_time =
+ llvm::sys::toTimePoint(oso_symbol->GetIntegerValue(0));
+ uint32_t sibling_idx = so_symbol->GetSiblingIndex();
+ // The sibling index can't be less that or equal to the current index
+ // "i"
+ if (sibling_idx <= i || sibling_idx == UINT32_MAX) {
+ m_objfile_sp->GetModule()->ReportError(
+ "N_SO in symbol with UID {0} has invalid sibling in debug "
+ "map, "
+ "please file a bug and attach the binary listed in this error",
+ so_symbol->GetID());
+ } else {
+ const Symbol *last_symbol = symtab->SymbolAtIndex(sibling_idx - 1);
+ m_compile_unit_infos[i].first_symbol_index = so_idx;
+ m_compile_unit_infos[i].last_symbol_index = sibling_idx - 1;
+ m_compile_unit_infos[i].first_symbol_id = so_symbol->GetID();
+ m_compile_unit_infos[i].last_symbol_id = last_symbol->GetID();
+
+ LLDB_LOGF(log, "Initialized OSO 0x%8.8x: file=%s", i,
+ oso_symbol->GetName().GetCString());
}
+ } else {
+ if (oso_symbol == nullptr)
+ m_objfile_sp->GetModule()->ReportError(
+ "N_OSO symbol[{0}] can't be found, please file a bug and "
+ "attach "
+ "the binary listed in this error",
+ oso_idx);
+ else if (so_symbol == nullptr)
+ m_objfile_sp->GetModule()->ReportError(
+ "N_SO not found for N_OSO symbol[{0}], please file a bug and "
+ "attach the binary listed in this error",
+ oso_idx);
+ else if (so_symbol->GetType() != eSymbolTypeSourceFile)
+ m_objfile_sp->GetModule()->ReportError(
+ "N_SO has incorrect symbol type ({0}) for N_OSO "
+ "symbol[{1}], "
+ "please file a bug and attach the binary listed in this error",
+ so_symbol->GetType(), oso_idx);
+ else if (oso_symbol->GetType() != eSymbolTypeSourceFile)
+ m_objfile_sp->GetModule()->ReportError(
+ "N_OSO has incorrect symbol type ({0}) for N_OSO "
+ "symbol[{1}], "
+ "please file a bug and attach the binary listed in this error",
+ oso_symbol->GetType(), oso_idx);
}
}
}
More information about the lldb-commits
mailing list