Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index 2b3ba1b222b933819c3f76dbc81e9da459f620dc..3cbee1eb87d2efc266b84c162791c7f4bf91b95e 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -5129,7 +5129,8 @@ class Code: public HeapObject { |
// Returns the address right after the last instruction. |
inline byte* instruction_end(); |
- // Returns the size of the instructions, padding, and relocation information. |
+ // Returns the size of the instructions, padding, relocation and unwinding |
+ // information. |
inline int body_size(); |
// Returns the size of code and its metadata. This includes the size of code |
@@ -5139,6 +5140,49 @@ class Code: public HeapObject { |
// Returns the address of the first relocation info (read backwards!). |
inline byte* relocation_start(); |
+ // [has_unwinding_info]: Whether this code object has unwinding information. |
+ // If it doesn't, unwinding_information_start() will point to invalid data. |
+ // |
+ // The body of all code objects has the following layout. |
+ // |
+ // +--------------------------+ <-- instruction_start() |
+ // | instructions | |
+ // | ... | |
+ // +--------------------------+ |
+ // | relocation info | |
+ // | ... | |
+ // +--------------------------+ <-- instruction_end() |
+ // |
+ // If has_unwinding_info() is false, instruction_end() points to the first |
+ // memory location after the end of the code object. Otherwise, the body |
+ // continues as follows: |
+ // |
+ // +--------------------------+ |
+ // | padding to the next | |
+ // | 8-byte aligned address | |
+ // +--------------------------+ <-- instruction_end() |
+ // | [unwinding_info_size] | |
+ // | as uint64_t | |
+ // +--------------------------+ <-- unwinding_info_start() |
+ // | unwinding info | |
+ // | ... | |
+ // +--------------------------+ <-- unwinding_info_end() |
+ // |
+ // and unwinding_info_end() points to the first memory location after the end |
+ // of the code object. |
+ // |
+ DECL_BOOLEAN_ACCESSORS(has_unwinding_info) |
+ |
+ // [unwinding_info_size]: Size of the unwinding information. |
+ inline int unwinding_info_size() const; |
+ inline void set_unwinding_info_size(int value); |
+ |
+ // Returns the address of the unwinding information, if any. |
+ inline byte* unwinding_info_start(); |
+ |
+ // Returns the address right after the end of the unwinding information. |
+ inline byte* unwinding_info_end(); |
+ |
// Code entry point. |
inline byte* entry(); |
@@ -5269,6 +5313,8 @@ class Code: public HeapObject { |
static const int kHeaderSize = |
(kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask; |
+ inline int GetUnwindingInfoSizeOffset() const; |
+ |
class BodyDescriptor; |
// Byte offsets within kKindSpecificFlags1Offset. |
@@ -5287,9 +5333,11 @@ class Code: public HeapObject { |
: public BitField<CacheHolderFlag, ICStateField::kNext, 2> {}; |
class KindField : public BitField<Kind, CacheHolderField::kNext, 5> {}; |
STATIC_ASSERT(NUMBER_OF_KINDS <= KindField::kMax); |
- class ExtraICStateField : public BitField<ExtraICState, KindField::kNext, |
- PlatformSmiTagging::kSmiValueSize - |
- KindField::kNext + 1> {}; |
+ class HasUnwindingInfoField : public BitField<bool, KindField::kNext, 1> {}; |
+ class ExtraICStateField |
+ : public BitField<ExtraICState, HasUnwindingInfoField::kNext, |
+ PlatformSmiTagging::kSmiValueSize - |
+ HasUnwindingInfoField::kNext + 1> {}; |
// KindSpecificFlags1 layout (STUB, BUILTIN and OPTIMIZED_FUNCTION) |
static const int kStackSlotsFirstBit = 0; |