| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/diagnostics/eh-frame.h" |
| #include "src/zone/zone-containers.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| static const int kRaxDwarfCode = 0; |
| static const int kRbpDwarfCode = 6; |
| static const int kRspDwarfCode = 7; |
| static const int kRipDwarfCode = 16; |
| |
| const int EhFrameConstants::kCodeAlignmentFactor = 1; |
| const int EhFrameConstants::kDataAlignmentFactor = -8; |
| |
| void EhFrameWriter::WriteReturnAddressRegisterCode() { |
| WriteULeb128(kRipDwarfCode); |
| } |
| |
| void EhFrameWriter::WriteInitialStateInCie() { |
| SetBaseAddressRegisterAndOffset(rsp, kSystemPointerSize); |
| // x64 rip (r16) has no Register instance associated. |
| RecordRegisterSavedToStack(kRipDwarfCode, -kSystemPointerSize); |
| } |
| |
| // static |
| int EhFrameWriter::RegisterToDwarfCode(Register name) { |
| switch (name.code()) { |
| case kRegCode_rbp: |
| return kRbpDwarfCode; |
| case kRegCode_rsp: |
| return kRspDwarfCode; |
| case kRegCode_rax: |
| return kRaxDwarfCode; |
| default: |
| UNIMPLEMENTED(); |
| return -1; |
| } |
| } |
| |
| #ifdef ENABLE_DISASSEMBLER |
| |
| // static |
| const char* EhFrameDisassembler::DwarfRegisterCodeToString(int code) { |
| switch (code) { |
| case kRbpDwarfCode: |
| return "rbp"; |
| case kRspDwarfCode: |
| return "rsp"; |
| case kRipDwarfCode: |
| return "rip"; |
| default: |
| UNIMPLEMENTED(); |
| return nullptr; |
| } |
| } |
| |
| #endif |
| |
| } // namespace internal |
| } // namespace v8 |