// 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/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, kPointerSize);
|
// x64 rip (r16) has no Register instance associated.
|
RecordRegisterSavedToStack(kRipDwarfCode, -kPointerSize);
|
}
|
|
// 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
|