clayborg requested changes to this revision. clayborg added inline comments. This revision now requires changes to proceed.
================ Comment at: include/lldb/Expression/DWARFExpression.h:307 const lldb::RegisterKind reg_set, const Value *initial_value_ptr, + const Value *object_address_ptr, ---------------- Do we need "initial_value_ptr" anymore? We should be able to remove it and just use the "stack" argument you added below. Probably best to just turn this value into: ``` std::vector<Value> &stack ``` And remove the "std::vector<Value> &stack" below. ================ Comment at: source/Expression/DWARFExpression.cpp:2695 + case DW_OP_call2: { + dw_offset_t die_ref_offset = opcodes.GetU16(&offset); + const DWARFDIE ref_die = dwarf_cu->GetDIE(die_ref_offset); ---------------- die_ref_offset us a CU relative offset. You must add "dwarf_cu->GetOffset()" to this to get the correct absolute DIE offset: ``` dw_offset_t die_ref_offset = opcodes.GetU16(&offset) + dwarf_cu->GetOffset(); ``` Your example will work for the first compile unit and fail for any subsequent ones since the first CU is at offset zero. ================ Comment at: source/Expression/DWARFExpression.cpp:2703-2723 + DWARFAttributes attributes; + const size_t num_attrib = ref_die.GetAttributes(attributes); + if (num_attrib == 0) + break; + + const uint32_t attr_index = attributes.FindAttributeIndex(DW_AT_location); + if (attr_index == UINT32_MAX) ---------------- Make these lines into a function of DWARFExpression and call it for call2 and call4: ``` ... DWARFExpression::EvaluateCall(DWARFDie Die, ....) ``` ================ Comment at: source/Expression/DWARFExpression.cpp:2746 + case DW_OP_call4: { + dw_offset_t die_ref_offset = opcodes.GetU32(&offset); + const DWARFDIE ref_die = dwarf_cu->GetDIE(die_ref_offset); ---------------- add CU offset like in call2 case. ================ Comment at: source/Expression/DWARFExpression.cpp:2754-2774 + DWARFAttributes attributes; + const size_t num_attrib = ref_die.GetAttributes(attributes); + if (num_attrib == 0) + break; + + const uint32_t attr_index = attributes.FindAttributeIndex(DW_AT_location); + if (attr_index == UINT32_MAX) ---------------- call new DWARFExpression::EvaluateCall() function you created as noted in above inlined comment. Repository: rLLDB LLDB CHANGES SINCE LAST ACTION https://reviews.llvm.org/D61587/new/ https://reviews.llvm.org/D61587 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits