Hi Jason,
The function sext() for sign extending APInt values requires the new bit
width to be greater than the current bit width. That is the reason I was
just creating a new APInt instead of using sext function in cases where
we need to promote to a type which has same bit width. I will do the
same for promoting e_ulong type to s_longlong type to avoid the llvm
assertion in sext() function.
I will submit a patch for the same.
Thanks and Regards,
Sagar
On Monday 10 August 2015 01:17 PM, Jason Molenda wrote:
( Resending with correct lldb-commits email address Cc:'ed )
Hi Sagar, I noticed this weekend that given an input program like
int foo (int in) { return in + 5;}
int main (int argc, char**argv) { return foo(argc); }
if I put a breakpoint on foo() on an x86 system (compiled with clang, on a
mac), I get an llvm assert when I backtrace:
(lldb) bt
Assertion failed: (width > BitWidth && "Invalid APInt SignExtend request"),
function sext, file /Users/jason/work/lldb/llvm/lib/Support/APInt.cpp, line 956.
The assert is being hit here -
4 0x000109cbe401 LLDB`__assert_rtn + 129 Signals.inc:517
5 0x000109c39dc8 LLDB`llvm::APInt::sext + 120 APInt.cpp:956
6 0x00010a36687d LLDB`lldb_private::Scalar::Promote + 11725
Scalar.cpp:1166
7 0x00010a36c073 LLDB`PromoteToMaxType + 307 Scalar.cpp:63
8 0x00010a36bd6d LLDB`lldb_private::Scalar::operator+= + 77
Scalar.cpp:2361
9 0x00010a46db4f LLDB`lldb_private::DWARFExpression::Evaluate +
38703 DWARFExpression.cpp:2564
10 0x00010a464399 LLDB`lldb_private::DWARFExpression::Evaluate +
1785 DWARFExpression.cpp:1325
11 0x00010a3fa9e5
LLDB`lldb_private::ValueObjectVariable::UpdateValue + 965
ValueObjectVariable.cpp:166
12 0x00010a3c4ceb
LLDB`lldb_private::ValueObject::UpdateValueIfNeeded + 1483 ValueObject.cpp:236
13 0x00010a3ce0ba
LLDB`lldb_private::ValueObject::GetValueAsCString + 42 ValueObject.cpp:1430
14 0x00010a379edf LLDB`lldb_private::FormatEntity::Format + 18991
FormatEntity.cpp:1800
15 0x00010a375b31 LLDB`lldb_private::FormatEntity::Format + 1665
FormatEntity.cpp:1228
16 0x00010a375b31 LLDB`lldb_private::FormatEntity::Format + 1665
FormatEntity.cpp:1228
17 0x00010a375767 LLDB`lldb_private::FormatEntity::Format + 695
FormatEntity.cpp:1204
18 0x00010aa1bc9b
LLDB`lldb_private::StackFrame::DumpUsingSettingsFormat + 523
StackFrame.cpp:1379
19 0x00010aa1d036 LLDB`lldb_private::StackFrame::GetStatus + 102
StackFrame.cpp:1475
20 0x00010aa25ecd LLDB`lldb_private::StackFrameList::GetStatus +
3037 StackFrameList.cpp:936
The DWARF expression for 'argc' is
0x0000005c: TAG_subprogram [2] *
AT_low_pc( 0x0000000100000f70 )
AT_high_pc( 0x0000000100000fa0 )
AT_frame_base( rbp )
AT_name( "main" )
0x0000007b: TAG_formal_parameter [3]
AT_location( fbreg -8 )
We create a Scalar object to represent the frame base value, lldb type s_ulong,
APInt BitWidth 64, in DWARFExpression::Evaluate():
2561 if (frame->GetFrameBaseValue(value, error_ptr))
2562 {
2563 int64_t fbreg_offset =
opcodes.GetSLEB128(&offset);
-> 2564 value += fbreg_offset;
So we're adding a e_slonglong (64-bit signed value, -8) to an e_ulong (64-bit
unsigned, 0x00007fff5fbffb10).
We end up in Scalar::Promote, trying to promote the 64-bit e_ulong APInt to a
64-bit e_slonglong APInt:
1152 case e_ulong:
1153 switch (type)
1154 {
1164 case e_slonglong:
1165 {
-> 1166 m_integer = m_integer.sext(sizeof(slonglong_t) *
8);
1167 success = true;
1168 break;
and APInt::sext() asserts because the unsigned and the signed types have the
same bit width.
NB if I stop in main() itself, Frame::GetFrameBaseValue() happens to return a
Scalar frame base value of e_ulonglong (still 64-bits) for the frame base
value. This means that Scalar::Promote instead creates a new APInt object
instead of trying to sign extend:
1225 case e_ulonglong:
1226 {
-> 1227 m_integer = llvm::APInt(sizeof(ulonglong_t) * 8,
*(const uint64_t *)m_integer.getRawData(), false);
and it works as expected. For whatever reason, when we retrieve the frame base
value higher up on the stack, we are getting an e_ulong (64-bits) which is when
we have problems.
J
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits