I am happy to look at any DWARF expressions you have and help figure out where the change needs to go or how the expression need to be fixed.
Greg > On Oct 11, 2018, at 12:32 PM, Davide Italiano <dccitali...@gmail.com> wrote: > > On Thu, Oct 11, 2018 at 11:16 AM Greg Clayton <clayb...@gmail.com > <mailto:clayb...@gmail.com>> wrote: >> >> The issue is DW_OP_deref dereferences a pointer and pushes it onto the >> stack. The code currently, for a load address that is on top of the stack >> does: >> >> Value::ValueType value_type = stack.back().GetValueType(); >> switch (value_type) { >> case Value::eValueTypeLoadAddress: >> if (exe_ctx) { >> if (process) { >> lldb::addr_t pointer_addr = >> stack.back().GetScalar().ULongLong(LLDB_INVALID_ADDRESS); >> Status error; >> lldb::addr_t pointer_value = >> process->ReadPointerFromMemory(pointer_addr, error); >> if (pointer_value != LLDB_INVALID_ADDRESS) { >> stack.back().GetScalar() = pointer_value; >> stack.back().ClearContext(); >> } else { >> return false; >> } >> >> Here we just use "stack.back()" to access the item at the top of the >> expression value stack. The top value has a Value::ValueType of >> Value::eValueTypeLoadAddress. We don't reset this value to be >> Value::eValueTypeScalar, but we probably should and that will probably fix >> this issue. >> >> DWARF5 finally added the ability to track what each value means on the >> expression stack. Prior to DWARF 5, we had no idea what each entry on the >> expression value stack was (file address, load address >> (Value::eValueTypeLoadAddress), plain value (Value::eValueTypeScalar). We >> have tracked this info for a while now, but the DWARF5 spec is much more >> specific on how things should be treated. From the spec: >> >> DW_OP_deref >> >> The DW_OP_deref operation pops the top stack entry and treats it as an >> address. The popped value must have an integral type. The value retrieved >> from that address is pushed, and has the generic type. The size of the data >> retrieved from the dereferenced address is the size of an address on the >> target machine. >> >> No the "The value retrieved from that address is pushed, and has the generic >> type." statement. In LLDB this means the value's ValueType should be set to >> Value::eValueTypeScalar. >> >> So try modifying the code with >> stack.back().SetValueType(Value::eValueTypeScalar) after the >> stack.back().ClearContext(): >> >> if (pointer_value != LLDB_INVALID_ADDRESS) { >> stack.back().GetScalar() = pointer_value; >> stack.back().ClearContext(); >> stack.back().SetValueType(Value::eValueTypeScalar); >> } else { >> return false; >> } >> >> That might fix things. >> >> The way the expression ends up right now we end up with an expression stack >> saying that the value is a load address which means we must read the value >> from memory in order to find it. This would be the right thing to do if your >> location expression was: >> >> 0x000000da: TAG_variable [9] >> AT_location( fbreg -16 ) >> AT_name( "x" ) >> AT_decl_file(...) >> AT_decl_line( 4 ) >> AT_type( {0x00000204} ( $sxD ) ) >> >> Note I removed the "deref" from the location expression. In this case the >> variable would need to be read from memory. If the value was to be in a >> register, then the location would be: >> >> 0x000000da: TAG_variable [9] >> AT_location( reg16 ) >> AT_name( "x" ) >> AT_decl_file(...) >> AT_decl_line( 4 ) >> AT_type( {0x00000204} ( $sxD ) ) >> >> Then the value would be in register 16 itself (not dereferenced). >> >> Hope this all makes sense. If you have any questions let me know. >> > > Thanks. I tend to agree this is the right thing to do, but it happens > to break many tests in the debugger. > > Failing Tests (26): > > lldb-Suite :: functionalities/unwind/sigtramp/TestSigtrampUnwind.py > lldb-Suite :: lang/c/blocks/TestBlocks.py > lldb-Suite :: lang/swift/address_of/TestSwiftAddressOf.py > lldb-Suite :: > lang/swift/expression/class_constrained_protocol/TestClassConstrainedProtocol.py > lldb-Suite :: > lang/swift/expression/exclusivity_suppression/TestExclusivitySuppression.py > lldb-Suite :: > lang/swift/expression/optional_amibiguity/TestOptionalAmbiguity.py > lldb-Suite :: lang/swift/expression/scopes/TestExpressionScopes.py > lldb-Suite :: lang/swift/expression/weak_self/TestWeakSelf.py > lldb-Suite :: > lang/swift/foundation_value_types/data/TestSwiftFoundationTypeData.py > lldb-Suite :: > lang/swift/foundation_value_types/date/TestSwiftFoundationTypeDate.py > lldb-Suite :: > lang/swift/foundation_value_types/indexpath/TestSwiftFoundationTypeIndexPath.py > lldb-Suite :: > lang/swift/foundation_value_types/measurement/TestSwiftFoundationTypeMeasurement.py > lldb-Suite :: > lang/swift/foundation_value_types/notification/TestSwiftFoundationTypeNotification.py > lldb-Suite :: > lang/swift/foundation_value_types/url/TestSwiftFoundationTypeURL.py > lldb-Suite :: > lang/swift/foundation_value_types/uuid/TestSwiftFoundationTypeUUID.py > lldb-Suite :: lang/swift/generic_tuple/TestSwiftGenericTuple.py > lldb-Suite :: lang/swift/po/sys_types/TestSwiftPOSysTypes.py > lldb-Suite :: lang/swift/resilience/TestResilience.py > lldb-Suite :: > lang/swift/variables/generic_struct_debug_info/generic_flatmap/TestSwiftGenericStructDebugInfoGenericFlatMap.py > lldb-Suite :: lang/swift/variables/inout/TestInOutVariables.py > lldb-Suite :: lang/swift/variables/protocol/TestSwiftProtocolTypes.py > lldb-Suite :: > lang/swift/variables/uninitialized/TestSwiftUninitializedVariable.py > lldb-Suite :: types/TestFloatTypes.py > lldb-Suite :: types/TestFloatTypesExpr.py > lldb-Suite :: types/TestIntegerTypes.py > lldb-Suite :: types/TestIntegerTypesExpr.py > > Expected Passes : 1488 > Unsupported Tests : 27 > Unexpected Failures: 26 > > My guess here is that there are even more hacks to work around this > ambiguity of interpretation. The good thing is that many of the > failure are in the swift support, so I can probably navigate through > them relatively quickly. I'll analyze them one by one and maybe > consult you in case there's something that doesn't make se use here. > (There are several C/C++ failure here, but I'll think about those > later) :) > > -- > Davide
_______________________________________________ lldb-dev mailing list lldb-dev@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev