diff options
| author | Enrico Granata <egranata@apple.com> | 2014-08-11 19:16:35 +0000 |
|---|---|---|
| committer | Enrico Granata <egranata@apple.com> | 2014-08-11 19:16:35 +0000 |
| commit | 4ec130dcab557a1c04a93c63de2c35206aa476ef (patch) | |
| tree | 8deffb13ae1958d770651eda26f6754273577c9a /lldb | |
| parent | 55b3254ea29d68641aacc1f44b6af61b0e032d6c (diff) | |
| download | bcm5719-llvm-4ec130dcab557a1c04a93c63de2c35206aa476ef.tar.gz bcm5719-llvm-4ec130dcab557a1c04a93c63de2c35206aa476ef.zip | |
Patch to enable LLDB to extract value bytes from DWARF block forms and udata/sdata forms. By Greg Clayton
llvm-svn: 215379
Diffstat (limited to 'lldb')
| -rw-r--r-- | lldb/include/lldb/Expression/DWARFExpression.h | 11 | ||||
| -rw-r--r-- | lldb/source/Expression/DWARFExpression.cpp | 33 | ||||
| -rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 24 |
3 files changed, 63 insertions, 5 deletions
diff --git a/lldb/include/lldb/Expression/DWARFExpression.h b/lldb/include/lldb/Expression/DWARFExpression.h index 24aa0dc750f..9ddecc053e0 100644 --- a/lldb/include/lldb/Expression/DWARFExpression.h +++ b/lldb/include/lldb/Expression/DWARFExpression.h @@ -222,6 +222,17 @@ public: lldb::offset_t data_offset, lldb::offset_t data_length); + void + CopyOpcodeData (const void *data, + lldb::offset_t data_length, + lldb::ByteOrder byte_order, + uint8_t addr_byte_size); + + void + CopyOpcodeData (uint64_t const_value, + lldb::offset_t const_value_byte_size, + uint8_t addr_byte_size); + //------------------------------------------------------------------ /// Tells the expression that it refers to a location list. diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index 7f87635cb55..17dac7588e9 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -282,6 +282,33 @@ DWARFExpression::CopyOpcodeData (lldb::ModuleSP module_sp, const DataExtractor& } void +DWARFExpression::CopyOpcodeData (const void *data, + lldb::offset_t data_length, + ByteOrder byte_order, + uint8_t addr_byte_size) +{ + if (data && data_length) + { + m_data.SetData(DataBufferSP(new DataBufferHeap(data, data_length))); + m_data.SetByteOrder(byte_order); + m_data.SetAddressByteSize(addr_byte_size); + } +} + +void +DWARFExpression::CopyOpcodeData (uint64_t const_value, + lldb::offset_t const_value_byte_size, + uint8_t addr_byte_size) +{ + if (const_value_byte_size) + { + m_data.SetData(DataBufferSP(new DataBufferHeap(&const_value, const_value_byte_size))); + m_data.SetByteOrder(endian::InlHostByteOrder()); + m_data.SetAddressByteSize(addr_byte_size); + } +} + +void DWARFExpression::SetOpcodeData (lldb::ModuleSP module_sp, const DataExtractor& data, lldb::offset_t data_offset, lldb::offset_t data_length) { m_module_wp = module_sp; @@ -1307,7 +1334,7 @@ DWARFExpression::Evaluate ClangExpressionVariableList *expr_locals, ClangExpressionDeclMap *decl_map, RegisterContext *reg_ctx, - lldb::ModuleSP opcode_ctx, + lldb::ModuleSP module_sp, const DataExtractor& opcodes, const lldb::offset_t opcodes_offset, const lldb::offset_t opcodes_length, @@ -2882,7 +2909,7 @@ DWARFExpression::Evaluate return false; } - if (!exe_ctx || !opcode_ctx) + if (!exe_ctx || !module_sp) { if (error_ptr) error_ptr->SetErrorString("No context to evaluate TLS within."); @@ -2898,7 +2925,7 @@ DWARFExpression::Evaluate } // Lookup the TLS block address for this thread and module. - addr_t tls_addr = thread->GetThreadLocalData (opcode_ctx); + addr_t tls_addr = thread->GetThreadLocalData (module_sp); if (tls_addr == LLDB_INVALID_ADDRESS) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index ec125a3b57f..1991143b1f6 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -7333,6 +7333,7 @@ SymbolFileDWARF::ParseVariableDIE bool is_artificial = false; bool location_is_const_value_data = false; bool has_explicit_location = false; + DWARFFormValue const_value; //AccessType accessibility = eAccessNone; for (i=0; i<num_attributes; ++i) @@ -7371,7 +7372,21 @@ SymbolFileDWARF::ParseVariableDIE const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); uint32_t data_offset = attributes.DIEOffsetAtIndex(i); uint32_t data_length = fixed_form_sizes[form_value.Form()]; - location.CopyOpcodeData(module, debug_info_data, data_offset, data_length); + if (data_length == 0) + { + const uint8_t *data_pointer = form_value.BlockData(); + if (data_pointer) + { + data_length = form_value.Unsigned(); + } + else if (DWARFFormValue::IsDataForm(form_value.Form())) + { + // we need to get the byte size of the type later after we create the variable + const_value = form_value; + } + } + else + location.CopyOpcodeData(module, debug_info_data, data_offset, data_length); } else { @@ -7583,10 +7598,15 @@ SymbolFileDWARF::ParseVariableDIE if (symbol_context_scope) { + SymbolFileTypeSP type_sp(new SymbolFileType(*this, type_uid)); + + if (const_value.Form() && type_sp && type_sp->GetType()) + location.CopyOpcodeData(const_value.Unsigned(), type_sp->GetType()->GetByteSize(), dwarf_cu->GetAddressByteSize()); + var_sp.reset (new Variable (MakeUserID(die->GetOffset()), name, mangled, - SymbolFileTypeSP (new SymbolFileType(*this, type_uid)), + type_sp, scope, symbol_context_scope, &decl, |

