Chromium Code Reviews| Index: src/eh-frame.h |
| diff --git a/src/eh-frame.h b/src/eh-frame.h |
| index 75781acb502ee8f420e93b240e7515e6e9f7348d..800b008943be1d0c1f08d01968469617f5c43876 100644 |
| --- a/src/eh-frame.h |
| +++ b/src/eh-frame.h |
| @@ -5,17 +5,76 @@ |
| #ifndef V8_EH_FRAME_H_ |
| #define V8_EH_FRAME_H_ |
| -#include <cstdint> |
| +#include "src/list.h" |
| namespace v8 { |
| namespace internal { |
| class Code; |
| +struct CodeDesc; |
| + |
| +class EhFrameWriter { |
| + public: |
| + static const int kCIESize; |
| + |
| + EhFrameWriter(); |
| + |
| + void AdvanceLocation(int pc_offset); |
| + void DefineCFARegister(int code); |
|
rmcilroy
2016/06/28 10:37:33
Could you use Register instead of "int code"? (and
Stefano Sanfilippo
2016/06/29 15:16:21
Yes, done. I added a RegisterToDwarfCode function
|
| + void DefineCFAOffset(int cfa_offset); |
| + void IncreaseCFAOffset(int cfa_delta) { |
| + DefineCFAOffset(cfa_offset_ + cfa_delta); |
| + } |
| + void DefineCFARegisterOffset(int code, int cfa_offset); |
| + void SaveRegisterToStack(int code, int offset); |
| + void SaveRegisterToStack(int code) { SaveRegisterToStack(code, cfa_offset_); } |
| + void RegisterHasInitialValue(int code); |
| + |
| + void Finish(int code_size); |
| + void GetEhFrame(CodeDesc* desc); |
| + |
| + int last_pc_offset() const { return last_pc_offset_; } |
| + int cfa_register() const { return cfa_register_; } |
| + int cfa_offset() const { return cfa_offset_; } |
| + |
| + static void DisassembleToStream(std::ostream& stream, // NOLINT |
| + const byte* start, const byte* end); |
| + |
| + protected: |
| + void WriteByte(byte value) { unwinding_info_.Add(value); } |
| + |
| + void WriteBytes(const byte* value, int size) { |
| + unwinding_info_.AddAll(Vector<byte>(const_cast<byte*>(value), size)); |
| + } |
| + |
| + void WriteInt16(uint16_t value) { |
| + unwinding_info_.AddAll( |
| + Vector<byte>(reinterpret_cast<byte*>(&value), sizeof(value))); |
| + } |
| + |
| + void WriteInt32(uint32_t value) { |
| + unwinding_info_.AddAll( |
| + Vector<byte>(reinterpret_cast<byte*>(&value), sizeof(value))); |
| + } |
| + |
| + void WriteULEB128(uint32_t value); |
| + |
| + void PatchInt32(int base_offset, uint32_t value) { |
| + MemCopy(unwinding_info_.begin() + base_offset, &value, sizeof(value)); |
| + } |
| + |
| + private: |
| + void WriteFDEHeader(); |
| + |
| + int last_pc_offset_; |
| + int cfa_register_; |
| + int cfa_offset_; |
| + List<byte> unwinding_info_; |
| +}; |
| class EhFrameHdr final { |
| public: |
| static const int kRecordSize = 20; |
| - static const int kCIESize; |
| explicit EhFrameHdr(Code* code); |