diff options
author | Tong Shen <endlessroad@google.com> | 2014-07-30 09:31:22 -0700 |
---|---|---|
committer | Tong Shen <endlessroad@google.com> | 2014-07-30 20:19:26 +0000 |
commit | 35e1e6ad4b50f1adbe9f93fe467766f042491896 (patch) | |
tree | 054e8fe1140fc1144ececa8ad8beda18be9566a2 /compiler/oat_writer.cc | |
parent | 01a0ebb6b96c32879dcad99d515fc0cd8de2a266 (diff) | |
download | art-35e1e6ad4b50f1adbe9f93fe467766f042491896.zip art-35e1e6ad4b50f1adbe9f93fe467766f042491896.tar.gz art-35e1e6ad4b50f1adbe9f93fe467766f042491896.tar.bz2 |
1. Fix CFI for quick compiled code in x86 & x86_64;
2. Emit CFI in .eh_frame instead of .debug_frame.
With CFI, we can correctly unwind past quick generated code.
Now gdb should unwind to main() for both x86 & x86_64 host-side ART.
Note that it does not work with relocation yet.
Testing:
1. art/test/run-test --host --gdb [--64] --no-relocate 005
2. In gdb, run 'b art_quick_invoke_stub', then 'r', then 'c' a few times
3. In gdb, run 'bt'. You should see stack frames down to main()
Change-Id: I5350d4097dc3d360a60cb17c94f1d02b99bc58bb
Diffstat (limited to 'compiler/oat_writer.cc')
-rw-r--r-- | compiler/oat_writer.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/compiler/oat_writer.cc b/compiler/oat_writer.cc index 22f36f4..9da59ab 100644 --- a/compiler/oat_writer.cc +++ b/compiler/oat_writer.cc @@ -410,8 +410,16 @@ class OatWriter::InitCodeMethodVisitor : public OatDexMethodVisitor { int cur_offset = cfi_info->size(); cfi_info->insert(cfi_info->end(), fde->begin(), fde->end()); + // Set the 'CIE_pointer' field to cur_offset+4. + uint32_t CIE_pointer = cur_offset + 4; + uint32_t offset_to_update = cur_offset + sizeof(uint32_t); + (*cfi_info)[offset_to_update+0] = CIE_pointer; + (*cfi_info)[offset_to_update+1] = CIE_pointer >> 8; + (*cfi_info)[offset_to_update+2] = CIE_pointer >> 16; + (*cfi_info)[offset_to_update+3] = CIE_pointer >> 24; + // Set the 'initial_location' field to address the start of the method. - uint32_t offset_to_update = cur_offset + 2*sizeof(uint32_t); + offset_to_update = cur_offset + 2*sizeof(uint32_t); (*cfi_info)[offset_to_update+0] = quick_code_start; (*cfi_info)[offset_to_update+1] = quick_code_start >> 8; (*cfi_info)[offset_to_update+2] = quick_code_start >> 16; |