5#ifndef V8_DIAGNOSTICS_EH_FRAME_H_
6#define V8_DIAGNOSTICS_EH_FRAME_H_
27 kRestoreExtended = 0x06,
30 kDefCfaRegister = 0x0d,
32 kOffsetExtendedSf = 0x11,
43 static const int kLocationTag = 1;
44 static const int kLocationMask = 0x3f;
45 static const int kLocationMaskSize = 6;
47 static const int kSavedRegisterTag = 2;
48 static const int kSavedRegisterMask = 0x3f;
49 static const int kSavedRegisterMaskSize = 6;
51 static const int kFollowInitialRuleTag = 3;
52 static const int kFollowInitialRuleMask = 0x3f;
53 static const int kFollowInitialRuleMaskSize = 6;
55 static const int kProcedureAddressOffsetInFde = 2 *
kInt32Size;
56 static const int kProcedureSizeOffsetInFde = 3 *
kInt32Size;
58 static const int kInitialStateOffsetInCie = 19;
59 static const int kEhFrameTerminatorSize = 4;
65 static const int kFdeVersionSize = 1;
66 static const int kFdeEncodingSpecifiersSize = 3;
68 static const int kEhFrameHdrVersion = 1;
69 static const int kEhFrameHdrSize = 20;
83 static void WriteEmptyEhFrame(std::ostream& stream);
95 void SetBaseAddressRegister(
Register base_register);
96 void SetBaseAddressOffset(
int base_offset);
98 SetBaseAddressOffset(base_offset_ + base_delta);
100 void SetBaseAddressRegisterAndOffset(
Register base_register,
int base_offset);
105 RecordRegisterSavedToStack(RegisterToDwarfCode(name),
offset);
110 void RecordRegisterSavedToStack(
int dwarf_register_code,
int offset);
113 void RecordRegisterNotModified(
Register name);
114 void RecordRegisterNotModified(
int dwarf_register_code);
117 void RecordRegisterFollowsInitialRule(
Register name);
118 void RecordRegisterFollowsInitialRule(
int dwarf_register_code);
120 void Finish(
int code_size);
136 static const uint32_t kInt32Placeholder = 0xdeadc0de;
138 void WriteSLeb128(int32_t value);
139 void WriteULeb128(uint32_t value);
141 void WriteByte(uint8_t value) { eh_frame_buffer_.push_back(value); }
143 WriteByte(
static_cast<uint8_t
>(opcode));
146 eh_frame_buffer_.insert(eh_frame_buffer_.end(),
start,
start + size);
149 WriteBytes(
reinterpret_cast<const uint8_t*
>(&value),
sizeof(value));
152 WriteBytes(
reinterpret_cast<const uint8_t*
>(&value),
sizeof(value));
156 base::ReadUnalignedValue<uint32_t>(
157 reinterpret_cast<Address
>(eh_frame_buffer_.data()) + base_offset),
160 base::WriteUnalignedValue<uint32_t>(
161 reinterpret_cast<Address
>(eh_frame_buffer_.data()) + base_offset,
172 void WriteFdeHeader();
176 void WriteEhFrameHdr(
int code_size);
179 void WritePaddingToAlignedSize(
int unpadded_size);
182 return fde_offset() + EhFrameConstants::kProcedureAddressOffsetInFde;
186 return fde_offset() + EhFrameConstants::kProcedureSizeOffsetInFde;
190 return static_cast<int>(eh_frame_buffer_.size());
197 static int RegisterToDwarfCode(
Register name);
200 void WriteInitialStateInCie();
203 void WriteReturnAddressRegisterCode();
223 base::ReadUnalignedValue<uint32_t>(
reinterpret_cast<Address
>(next_)) +
230 Skip(kDirectivesOffsetInFde);
246 uint32_t GetNextULeb128();
247 int32_t GetNextSLeb128();
251 return next_ ==
end_;
256 return static_cast<int>(next_ -
start_);
262 return reinterpret_cast<const void*
>(next_);
266 static const int kDirectivesOffsetInFde = 4 *
kInt32Size + 1;
268 static uint32_t DecodeULeb128(
const uint8_t* encoded,
int* encoded_size);
269 static int32_t DecodeSLeb128(
const uint8_t* encoded,
int* encoded_size);
271 template <
typename T>
275 result = base::ReadUnalignedValue<T>(
reinterpret_cast<Address
>(next_));
285#ifdef ENABLE_DISASSEMBLER
287class EhFrameDisassembler final {
289 EhFrameDisassembler(
const uint8_t*
start,
const uint8_t*
end)
293 EhFrameDisassembler(
const EhFrameDisassembler&) =
delete;
294 EhFrameDisassembler& operator=(
const EhFrameDisassembler&) =
delete;
296 void DisassembleToStream(std::ostream& stream);
299 static void DumpDwarfDirectives(std::ostream& stream,
const uint8_t*
start,
302 static const char* DwarfRegisterCodeToString(
int code);
static const int kDataAlignmentFactor
static const int kCodeAlignmentFactor
void SkipToFdeDirectives()
EhFrameIterator(const uint8_t *start, const uint8_t *end)
const void * current_address() const
EhFrameConstants::DwarfOpcodes GetNextOpcode()
int GetCurrentOffset() const
int GetProcedureAddressOffset() const
void WriteBytes(const uint8_t *start, int size)
void WriteOpcode(EhFrameConstants::DwarfOpcodes opcode)
void IncreaseBaseAddressOffset(int base_delta)
void WriteByte(uint8_t value)
EhFrameWriter(const EhFrameWriter &)=delete
void PatchInt32(int base_offset, uint32_t value)
void WriteInt16(uint16_t value)
ZoneVector< uint8_t > eh_frame_buffer_
int GetProcedureSizeOffset() const
int eh_frame_offset() const
InternalState writer_state_
void RecordRegisterSavedToStack(Register name, int offset)
EhFrameWriter & operator=(const EhFrameWriter &)=delete
Register base_register() const
int last_pc_offset() const
void WriteInt32(uint32_t value)
const v8::base::TimeTicks end_
ZoneVector< RpoNumber > & result
int WriteBytes(const char *filename, const uint8_t *bytes, int size, bool verbose)
#define NON_EXPORTED_BASE(code)
#define DCHECK_LE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE