( 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

Reply via email to