diff options
Diffstat (limited to 'deps/v8/src/diagnostics/x64/eh-frame-x64.cc')
-rw-r--r-- | deps/v8/src/diagnostics/x64/eh-frame-x64.cc | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/deps/v8/src/diagnostics/x64/eh-frame-x64.cc b/deps/v8/src/diagnostics/x64/eh-frame-x64.cc new file mode 100644 index 0000000000..f8c5447126 --- /dev/null +++ b/deps/v8/src/diagnostics/x64/eh-frame-x64.cc @@ -0,0 +1,64 @@ +// 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 |