[Lldb-commits] [lldb] r226889 - Two fixes for compact unwind decoding for frameless large-stack-size

Jason Molenda jmolenda at apple.com
Thu Jan 22 17:02:32 PST 2015


Author: jmolenda
Date: Thu Jan 22 19:02:32 2015
New Revision: 226889

URL: http://llvm.org/viewvc/llvm-project?rev=226889&view=rev
Log:
Two fixes for compact unwind decoding for frameless large-stack-size
i386/x86_64 functions.  The stack size was being multiplied by the
pointer size incorrectly.  The register permutation placeholders
(UNWIND_X86_REG_NONE) were decrementing the stack offset of the
saved registers when it should not have been.

<rdar://problem/19570035> 

Modified:
    lldb/trunk/source/Symbol/CompactUnwindInfo.cpp
    lldb/trunk/tools/compact-unwind/compact-unwind-dumper.c

Modified: lldb/trunk/source/Symbol/CompactUnwindInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/CompactUnwindInfo.cpp?rev=226889&r1=226888&r2=226889&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/CompactUnwindInfo.cpp (original)
+++ lldb/trunk/source/Symbol/CompactUnwindInfo.cpp Thu Jan 22 19:02:32 2015
@@ -809,8 +809,16 @@ CompactUnwindInfo::CreateUnwindPlan_x86_
                 }
             }
 
+            if (mode == UNWIND_X86_64_MODE_STACK_IND)
+            {
+                row->SetCFAOffset (stack_size);
+            }
+            else
+            {
+                row->SetCFAOffset (stack_size * wordsize);
+            }
+
             row->SetCFARegister (x86_64_eh_regnum::rsp);
-            row->SetCFAOffset (stack_size * wordsize);
             row->SetOffset (0);
             row->SetRegisterLocationToAtCFAPlusOffset (x86_64_eh_regnum::rip, wordsize * -1, true);
             row->SetRegisterLocationToIsCFAPlusOffset (x86_64_eh_regnum::rsp, 0, true);
@@ -919,10 +927,10 @@ CompactUnwindInfo::CreateUnwindPlan_x86_
                         case UNWIND_X86_64_REG_R14:
                         case UNWIND_X86_64_REG_R15:
                         case UNWIND_X86_64_REG_RBP:
-                             row->SetRegisterLocationToAtCFAPlusOffset (translate_to_eh_frame_regnum_x86_64 (registers[i]), wordsize * -saved_registers_offset, true);
+                            row->SetRegisterLocationToAtCFAPlusOffset (translate_to_eh_frame_regnum_x86_64 (registers[i]), wordsize * -saved_registers_offset, true);
+                            saved_registers_offset++;
                         break;
                     }
-                    saved_registers_offset++;
                 }
             }
             unwind_plan.AppendRow (row);
@@ -1047,9 +1055,11 @@ CompactUnwindInfo::CreateUnwindPlan_i386
             if (mode == UNWIND_X86_MODE_STACK_IND && function_info.valid_range_offset_start != 0)
             {
                 uint32_t stack_adjust = EXTRACT_BITS (function_info.encoding, UNWIND_X86_FRAMELESS_STACK_ADJUST);
+printf("JSMDEBUG got stack_adjust %d from encoding 0x%x\n", stack_adjust, function_info.encoding);
 
                 // offset into the function instructions; 0 == beginning of first instruction
                 uint32_t offset_to_subl_insn = EXTRACT_BITS (function_info.encoding, UNWIND_X86_FRAMELESS_STACK_SIZE);
+printf("JSMDEBUG got offset to sub instruction %d\n", offset_to_subl_insn);
 
                 SectionList *sl = m_objfile.GetSectionList ();
                 if (sl)
@@ -1084,7 +1094,16 @@ CompactUnwindInfo::CreateUnwindPlan_i386
             }
 
             row->SetCFARegister (i386_eh_regnum::esp);
-            row->SetCFAOffset (stack_size * wordsize);
+
+            if (mode == UNWIND_X86_MODE_STACK_IND)
+            {
+                row->SetCFAOffset (stack_size);
+            }
+            else
+            {
+                row->SetCFAOffset (stack_size * wordsize);
+            }
+
             row->SetOffset (0);
             row->SetRegisterLocationToAtCFAPlusOffset (i386_eh_regnum::eip, wordsize * -1, true);
             row->SetRegisterLocationToIsCFAPlusOffset (i386_eh_regnum::esp, 0, true);
@@ -1193,10 +1212,10 @@ CompactUnwindInfo::CreateUnwindPlan_i386
                         case UNWIND_X86_REG_EDI:
                         case UNWIND_X86_REG_ESI:
                         case UNWIND_X86_REG_EBP:
-                             row->SetRegisterLocationToAtCFAPlusOffset (translate_to_eh_frame_regnum_i386 (registers[i]), wordsize * -saved_registers_offset, true);
+                            row->SetRegisterLocationToAtCFAPlusOffset (translate_to_eh_frame_regnum_i386 (registers[i]), wordsize * -saved_registers_offset, true);
+                            saved_registers_offset++;
                         break;
                     }
-                    saved_registers_offset++;
                 }
             }
 

Modified: lldb/trunk/tools/compact-unwind/compact-unwind-dumper.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/compact-unwind/compact-unwind-dumper.c?rev=226889&r1=226888&r2=226889&view=diff
==============================================================================
--- lldb/trunk/tools/compact-unwind/compact-unwind-dumper.c (original)
+++ lldb/trunk/tools/compact-unwind/compact-unwind-dumper.c Thu Jan 22 19:02:32 2015
@@ -495,7 +495,14 @@ print_encoding_x86_64 (struct baton bato
                 printf ("large stack ");
             }
             
-            printf ("frameless function: stack size %d, register count %d ", stack_size * 8, register_count);
+            if (mode == UNWIND_X86_64_MODE_STACK_IND)
+            {
+                printf ("frameless function: stack size %d, register count %d ", stack_size * 8, register_count);
+            }
+            else
+            {
+                printf ("frameless function: stack size %d, register count %d ", stack_size, register_count);
+            }
 
             if (register_count == 0)
             {
@@ -591,7 +598,14 @@ print_encoding_x86_64 (struct baton bato
                 }
 
 
-                printf (" CFA is rsp+%d ", stack_size * 8);
+                if (mode == UNWIND_X86_64_MODE_STACK_IND)
+                {
+                    printf (" CFA is rsp+%d ", stack_size);
+                }
+                else
+                {
+                    printf (" CFA is rsp+%d ", stack_size * 8);
+                }
 
                 uint32_t saved_registers_offset = 1;
                 printf (" rip=[CFA-%d]", saved_registers_offset * 8);
@@ -605,24 +619,29 @@ print_encoding_x86_64 (struct baton bato
                             break;
                         case UNWIND_X86_64_REG_RBX:
                             printf (" rbx=[CFA-%d]", saved_registers_offset * 8);
+                            saved_registers_offset++;
                             break;
                         case UNWIND_X86_64_REG_R12:
                             printf (" r12=[CFA-%d]", saved_registers_offset * 8);
+                            saved_registers_offset++;
                             break;
                         case UNWIND_X86_64_REG_R13:
                             printf (" r13=[CFA-%d]", saved_registers_offset * 8);
+                            saved_registers_offset++;
                             break;
                         case UNWIND_X86_64_REG_R14:
                             printf (" r14=[CFA-%d]", saved_registers_offset * 8);
+                            saved_registers_offset++;
                             break;
                         case UNWIND_X86_64_REG_R15:
                             printf (" r15=[CFA-%d]", saved_registers_offset * 8);
+                            saved_registers_offset++;
                             break;
                         case UNWIND_X86_64_REG_RBP:
                             printf (" rbp=[CFA-%d]", saved_registers_offset * 8);
+                            saved_registers_offset++;
                             break;
                     }
-                    saved_registers_offset++;
                 }
 
             }
@@ -712,7 +731,14 @@ print_encoding_i386 (struct baton baton,
                 printf ("large stack ");
             }
             
-            printf ("frameless function: stack size %d, register count %d ", stack_size * 4, register_count);
+            if (mode == UNWIND_X86_MODE_STACK_IND)
+            {
+                printf ("frameless function: stack size %d, register count %d ", stack_size, register_count);
+            }
+            else
+            {
+                printf ("frameless function: stack size %d, register count %d ", stack_size * 4, register_count);
+            }
 
             if (register_count == 0)
             {
@@ -808,7 +834,14 @@ print_encoding_i386 (struct baton baton,
                 }
 
 
-                printf (" CFA is esp+%d ", stack_size * 4);
+                if (mode == UNWIND_X86_MODE_STACK_IND)
+                {
+                    printf (" CFA is esp+%d ", stack_size);
+                }
+                else
+                {
+                    printf (" CFA is esp+%d ", stack_size * 4);
+                }
 
                 uint32_t saved_registers_offset = 1;
                 printf (" eip=[CFA-%d]", saved_registers_offset * 4);
@@ -822,24 +855,29 @@ print_encoding_i386 (struct baton baton,
                             break;
                         case UNWIND_X86_REG_EBX:
                             printf (" ebx=[CFA-%d]", saved_registers_offset * 4);
+                            saved_registers_offset++;
                             break;
                         case UNWIND_X86_REG_ECX:
                             printf (" ecx=[CFA-%d]", saved_registers_offset * 4);
+                            saved_registers_offset++;
                             break;
                         case UNWIND_X86_REG_EDX:
                             printf (" edx=[CFA-%d]", saved_registers_offset * 4);
+                            saved_registers_offset++;
                             break;
                         case UNWIND_X86_REG_EDI:
                             printf (" edi=[CFA-%d]", saved_registers_offset * 4);
+                            saved_registers_offset++;
                             break;
                         case UNWIND_X86_REG_ESI:
                             printf (" esi=[CFA-%d]", saved_registers_offset * 4);
+                            saved_registers_offset++;
                             break;
                         case UNWIND_X86_REG_EBP:
                             printf (" ebp=[CFA-%d]", saved_registers_offset * 4);
+                            saved_registers_offset++;
                             break;
                     }
-                    saved_registers_offset++;
                 }
 
             }





More information about the lldb-commits mailing list