llvm-project/lldb
Aleksandr Urakov 4538ed3b85 [x86] Fix issues with a realigned stack in MSVC compiled applications
Summary:
This patch fixes issues with a stack realignment.

MSVC maintains two frame pointers (`ebx` and `ebp`) for a realigned stack - one
is used for access to function parameters, while another is used for access to
locals. To support this the patch:
- adds an alternative frame pointer (`ebx`);
- considers stack realignment instructions (e.g. `and esp, -32`);
- along with CFA (Canonical Frame Address) which point to the position next to
  the saved return address (or to the first parameter on the stack) introduces
  AFA (Aligned Frame Address) which points to the position of the stack pointer
  right after realignment. AFA is used for access to registers saved after the
  realignment (see the test);

Here is an example of the code with the realignment:
```
struct __declspec(align(256)) OverAligned {
  char c;
};

void foo(int foo_arg) {
  OverAligned oa_foo = { 1 };
  auto aaa_foo = 1234;
}

void bar(int bar_arg) {
  OverAligned oa_bar = { 2 };
  auto aaa_bar = 5678;
  foo(1111);
}

int main() {
  bar(2222);
  return 0;
}
```
and here is the `bar` disassembly:
```
push    ebx
mov     ebx, esp
sub     esp, 8
and     esp, -100h
add     esp, 4
push    ebp
mov     ebp, [ebx+4]
mov     [esp+4], ebp
mov     ebp, esp
sub     esp, 200h
mov     byte ptr [ebp-200h], 2
mov     dword ptr [ebp-4], 5678
push    1111            ; foo_arg
call    j_?foo@@YAXH@Z  ; foo(int)
add     esp, 4
mov     esp, ebp
pop     ebp
mov     esp, ebx
pop     ebx
retn
```

Reviewers: labath, zturner, jasonmolenda, stella.stamenova

Reviewed By: jasonmolenda

Subscribers: abidh, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D53435

llvm-svn: 345577
2018-10-30 10:07:08 +00:00
..
cmake [cmake] Add option to skip building lldb-server 2018-08-23 18:05:45 +00:00
docs Enable AUTOBRIEF in doxygen configuration. 2018-05-02 16:55:16 +00:00
examples Fixes for GDB remote packet disassembler: 2018-09-27 17:55:36 +00:00
include/lldb [x86] Fix issues with a realigned stack in MSVC compiled applications 2018-10-30 10:07:08 +00:00
lit [lldb-mi] Implement -gdb-set breakpoint pending on/off 2018-10-30 03:10:41 +00:00
lldb.xcodeproj [lldb] Remove enableThreadSanitizer from shared Xcode schemes 2018-10-24 15:59:31 +00:00
lldb.xcworkspace Fix a typo in the gtest build target for Debug configuration. 2018-04-10 17:49:56 +00:00
packages/Python/lldbsuite [DataFormatters] Adding formatters for libc++ std::u16string and std::u32string 2018-10-26 17:00:48 +00:00
resources Fix up Info.plist when building LLDB.framework with CMake 2018-06-19 02:59:30 +00:00
scripts [API] Extend the `SBThreadPlan` interface 2018-10-25 08:27:42 +00:00
source [x86] Fix issues with a realigned stack in MSVC compiled applications 2018-10-30 10:07:08 +00:00
test Allow use of self.filecheck in LLDB tests (c.f self.expect) 2018-09-18 19:31:47 +00:00
third_party/Python/module *** This commit represents a complete reformatting of the LLDB source code 2016-09-06 20:57:50 +00:00
tools [lldb-mi] Implement -gdb-set breakpoint pending on/off 2018-10-30 03:10:41 +00:00
unittests [x86] Fix issues with a realigned stack in MSVC compiled applications 2018-10-30 10:07:08 +00:00
utils Fix typos. 2018-10-04 22:33:39 +00:00
www Fix typos. 2018-10-04 22:33:39 +00:00
.arcconfig
.clang-format
.gitignore [dotest] Remove crashinfo hook 2018-01-10 10:18:47 +00:00
CMakeLists.txt Allow use of self.filecheck in LLDB tests (c.f self.expect) 2018-09-18 19:31:47 +00:00
CODE_OWNERS.txt Fix/unify the spelling of Objective-C. 2018-06-13 16:21:24 +00:00
INSTALL.txt Changed builld-llvm.py to use .json files 2017-02-23 02:21:34 +00:00
LICENSE.TXT
use_lldb_suite_root.py *** This commit represents a complete reformatting of the LLDB source code 2016-09-06 20:57:50 +00:00