Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(488)

Unified Diff: src/eh-frame.h

Issue 2023503002: Reland Implement .eh_frame writer and disassembler. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@eh-frame-base
Patch Set: if => ifdef Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/crankshaft/lithium.cc ('k') | src/eh-frame.cc » ('j') | src/eh-frame.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/eh-frame.h
diff --git a/src/eh-frame.h b/src/eh-frame.h
index 75781acb502ee8f420e93b240e7515e6e9f7348d..201469c9acd5760a1045840fd09e4388ad864240 100644
--- a/src/eh-frame.h
+++ b/src/eh-frame.h
@@ -5,19 +5,122 @@
#ifndef V8_EH_FRAME_H_
#define V8_EH_FRAME_H_
-#include <cstdint>
+#include "src/list.h"
+#include "src/macro-assembler.h"
namespace v8 {
namespace internal {
-class Code;
+struct CodeDesc;
+
+class EhFrameWriter {
+ public:
+ static const int kCIESize;
+
+ EhFrameWriter();
+
+ void AdvanceLocation(int pc_offset);
+
+ // <base address> = <base register> + <base offset>
rmcilroy 2016/06/30 15:23:11 What is the base address? Please explain how it re
Stefano Sanfilippo 2016/07/04 18:21:15 Done.
+ void DefineBaseAddressRegister(Register base_register);
+ void DefineBaseAddressOffset(int base_offset);
+ void IncreaseBaseAddressOffset(int base_delta) {
+ DefineBaseAddressOffset(base_offset_ + base_delta);
+ }
+ void DefineBaseAddressRegisterOffset(Register base_register, int base_offset);
rmcilroy 2016/06/30 15:23:11 DefineBaseAddressRegisterAndOffset
Stefano Sanfilippo 2016/07/04 18:21:14 Done.
+
+ // Offset relative to <base address>
+ void SaveRegisterToStack(Register name, int offset);
+ void SaveRegisterToStack(Register name) {
+ SaveRegisterToStack(name, base_offset_);
+ }
+ void RegisterIsValid(Register name);
+
+ void Finish(int code_size);
+
+ // Remember to call Finish() before GetEhFrame()!
rmcilroy 2016/06/30 15:23:11 Make it clear that the EhWriter must outlive the C
Stefano Sanfilippo 2016/07/04 18:21:14 Done.
+ void GetEhFrame(CodeDesc* desc);
+
+ int last_pc_offset() const { return last_pc_offset_; }
+ Register base_register() const { return base_register_; }
+ int base_offset() const { return base_offset_; }
+
+#ifdef ENABLE_DISASSEMBLER
+ static void DisassembleToStream(std::ostream& stream, // NOLINT
+ const byte* start, const byte* end);
+#endif
+
+ protected:
+ void WriteByte(byte value) { eh_frame_buffer_.Add(value); }
+
+ void WriteBytes(const byte* value, int size) {
+ eh_frame_buffer_.AddAll(Vector<byte>(const_cast<byte*>(value), size));
+ }
+
+ void WriteInt16(uint16_t value) {
+ eh_frame_buffer_.AddAll(
+ Vector<byte>(reinterpret_cast<byte*>(&value), sizeof(value)));
+ }
+
+ void WriteInt32(uint32_t value) {
+ eh_frame_buffer_.AddAll(
+ Vector<byte>(reinterpret_cast<byte*>(&value), sizeof(value)));
+ }
+
+ void WriteULEB128(uint32_t value);
+
+ void PatchInt32(int base_offset, uint32_t value) {
+ DCHECK_EQ(ReadUnalignedUInt32(eh_frame_buffer_.begin() + base_offset),
+ kInt32Placeholder);
+ MemCopy(eh_frame_buffer_.begin() + base_offset, &value, sizeof(value));
+ }
+
+ void WriteFDEHeader();
+
+ int eh_frame_offset() const { return eh_frame_buffer_.length(); }
+
+ private:
+ static const byte kNop = 0x00;
+ static const byte kAdvanceLoc1 = 0x02;
+ static const byte kAdvanceLoc2 = 0x03;
+ static const byte kAdvanceLoc4 = 0x04;
+ static const byte kSameValue = 0x08;
+ static const byte kDefCFA = 0x0c;
+ static const byte kDefCFARegister = 0x0d;
+ static const byte kDefCFAOffset = 0x0e;
rmcilroy 2016/06/30 15:23:11 This could be enums (enum class DwarfOpcode: byte)
Stefano Sanfilippo 2016/07/04 18:21:15 Done.
+ static const uint32_t kInt32Placeholder = 0xdeadc0de;
rmcilroy 2016/06/30 15:23:11 newlines between groups
Stefano Sanfilippo 2016/07/04 18:21:14 Done.
+ static const int kEhFrameTerminatorSize = 4;
+ static const int kLocationTag = 1;
+ static const int kSavedRegisterTag = 2;
rmcilroy 2016/06/30 15:23:11 this should be 1 << 1 to make it clear its a bit f
Stefano Sanfilippo 2016/07/04 18:21:15 It's not a bit field, the 2 MSBs are used as opcod
+ static const int kLocationMask = 0x3f;
+ static const int kLocationMaskSize = 6;
+ static const int kSavedRegisterMask = 0x3f;
+ static const int kSavedRegisterMaskSize = 6;
rmcilroy 2016/06/30 15:23:11 group tags with masks
Stefano Sanfilippo 2016/07/04 18:21:14 Done.
+ static const int kFDEOffset;
+ static const int kProcedureAddressOffset;
+ static const int kProcedureSizeOffset;
+#ifdef ENABLE_DISASSEMBLER
+ static const int kFDEDirectivesOffset;
+
+ static void DumpDWARFDirectives(std::ostream& stream, // NOLINT
+ const byte* begin, const byte* end);
+#endif
+
+ int last_pc_offset_;
+#if DEBUG
+ bool eh_frame_finalised_;
rmcilroy 2016/06/30 15:23:11 no need to make this debug only, setting a bool is
Stefano Sanfilippo 2016/07/04 18:21:14 Fine, done.
+#endif
+ Register base_register_;
+ int base_offset_;
+ List<byte> eh_frame_buffer_;
rmcilroy 2016/06/30 15:23:11 Why list and not vector?
Stefano Sanfilippo 2016/07/04 18:21:14 I assumed V8 APIs took priority, replaced with std
+};
class EhFrameHdr final {
public:
static const int kRecordSize = 20;
- static const int kCIESize;
- explicit EhFrameHdr(Code* code);
+ static EhFrameHdr MakeDummy();
rmcilroy 2016/06/30 15:23:11 below constructor. Also, how about Empty instead o
Stefano Sanfilippo 2016/07/04 18:21:14 Moved. *Empty* is fine for me, renamed.
+ EhFrameHdr(int code_size, int eh_frame_size);
int32_t offset_to_eh_frame() const { return offset_to_eh_frame_; }
uint32_t lut_entries_number() const { return lut_entries_number_; }
@@ -25,6 +128,16 @@ class EhFrameHdr final {
int32_t offset_to_fde() const { return offset_to_fde_; }
private:
+ static const byte kPcRel = 0x10;
+ static const byte kDataRel = 0x30;
+ static const byte kUData4 = 0x03;
+ static const byte kSData4 = 0x0b;
+ static const int kEhFrameHdrVersion = 1;
+ static const int kFDEVersionSize = 1;
+ static const int kFDEEncodingSpecifiersSize = 3;
+
+ EhFrameHdr() {}
+
uint8_t version_;
uint8_t eh_frame_ptr_encoding_;
uint8_t lut_size_encoding_;
« no previous file with comments | « src/crankshaft/lithium.cc ('k') | src/eh-frame.cc » ('j') | src/eh-frame.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698