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

Unified Diff: src/objects.h

Issue 2197183002: [debugger] use handler table on unoptimized code for exception prediction. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: address comments and rebase Created 4 years, 4 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/isolate.cc ('k') | src/objects.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index a9c2439e61bbf077ad484031025d9fff7d03369e..24d41913dd8f33ecc8e6c498088cf9ee5bf36d18 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -4448,6 +4448,82 @@ class NormalizedMapCache: public FixedArray {
void set(int index, Object* value);
};
+// HandlerTable is a fixed array containing entries for exception handlers in
+// the code object it is associated with. The tables comes in two flavors:
+// 1) Based on ranges: Used for unoptimized code. Contains one entry per
+// exception handler and a range representing the try-block covered by that
+// handler. Layout looks as follows:
+// [ range-start , range-end , handler-offset , handler-data ]
+// 2) Based on return addresses: Used for turbofanned code. Contains one entry
+// per call-site that could throw an exception. Layout looks as follows:
+// [ return-address-offset , handler-offset ]
+class HandlerTable : public FixedArray {
+ public:
+ // Conservative prediction whether a given handler will locally catch an
+ // exception or cause a re-throw to outside the code boundary. Since this is
+ // undecidable it is merely an approximation (e.g. useful for debugger).
+ enum CatchPrediction {
+ UNCAUGHT, // the handler will (likely) rethrow the exception.
+ CAUGHT, // the exception will be caught by the handler.
+ PROMISE // the exception will be caught and cause a promise rejection.
+ };
+
+ // Getters for handler table based on ranges.
+ inline int GetRangeStart(int index) const;
+ inline int GetRangeEnd(int index) const;
+ inline int GetRangeHandler(int index) const;
+ inline int GetRangeData(int index) const;
+
+ // Setters for handler table based on ranges.
+ inline void SetRangeStart(int index, int value);
+ inline void SetRangeEnd(int index, int value);
+ inline void SetRangeHandler(int index, int offset, CatchPrediction pred);
+ inline void SetRangeData(int index, int value);
+
+ // Setters for handler table based on return addresses.
+ inline void SetReturnOffset(int index, int value);
+ inline void SetReturnHandler(int index, int offset, CatchPrediction pred);
+
+ // Lookup handler in a table based on ranges.
+ int LookupRange(int pc_offset, int* data, CatchPrediction* prediction);
+
+ // Lookup handler in a table based on return addresses.
+ int LookupReturn(int pc_offset);
+
+ // Returns the conservative catch predication.
+ inline CatchPrediction GetRangePrediction(int index) const;
+
+ // Returns the number of entries in the table.
+ inline int NumberOfRangeEntries() const;
+
+ // Returns the required length of the underlying fixed array.
+ static int LengthForRange(int entries) { return entries * kRangeEntrySize; }
+ static int LengthForReturn(int entries) { return entries * kReturnEntrySize; }
+
+ DECLARE_CAST(HandlerTable)
+
+#ifdef ENABLE_DISASSEMBLER
+ void HandlerTableRangePrint(std::ostream& os); // NOLINT
+ void HandlerTableReturnPrint(std::ostream& os); // NOLINT
+#endif
+
+ private:
+ // Layout description for handler table based on ranges.
+ static const int kRangeStartIndex = 0;
+ static const int kRangeEndIndex = 1;
+ static const int kRangeHandlerIndex = 2;
+ static const int kRangeDataIndex = 3;
+ static const int kRangeEntrySize = 4;
+
+ // Layout description for handler table based on return addresses.
+ static const int kReturnOffsetIndex = 0;
+ static const int kReturnHandlerIndex = 1;
+ static const int kReturnEntrySize = 2;
+
+ // Encoding of the {handler} field.
+ class HandlerPredictionField : public BitField<CatchPrediction, 0, 2> {};
+ class HandlerOffsetField : public BitField<int, 2, 30> {};
+};
// ByteArray represents fixed sized byte arrays. Used for the relocation info
// that is attached to code objects.
@@ -4571,6 +4647,9 @@ class BytecodeArray : public FixedArrayBase {
void CopyBytecodesTo(BytecodeArray* to);
+ int LookupRangeInHandlerTable(int code_offset, int* data,
+ HandlerTable::CatchPrediction* prediction);
+
// Layout description.
static const int kConstantPoolOffset = FixedArrayBase::kHeaderSize;
static const int kHandlerTableOffset = kConstantPoolOffset + kPointerSize;
@@ -4878,83 +4957,6 @@ class LiteralsArray : public FixedArray {
};
-// HandlerTable is a fixed array containing entries for exception handlers in
-// the code object it is associated with. The tables comes in two flavors:
-// 1) Based on ranges: Used for unoptimized code. Contains one entry per
-// exception handler and a range representing the try-block covered by that
-// handler. Layout looks as follows:
-// [ range-start , range-end , handler-offset , handler-data ]
-// 2) Based on return addresses: Used for turbofanned code. Contains one entry
-// per call-site that could throw an exception. Layout looks as follows:
-// [ return-address-offset , handler-offset ]
-class HandlerTable : public FixedArray {
- public:
- // Conservative prediction whether a given handler will locally catch an
- // exception or cause a re-throw to outside the code boundary. Since this is
- // undecidable it is merely an approximation (e.g. useful for debugger).
- enum CatchPrediction {
- UNCAUGHT, // the handler will (likely) rethrow the exception.
- CAUGHT, // the exception will be caught by the handler.
- PROMISE // the exception will be caught and cause a promise rejection.
- };
-
- // Getters for handler table based on ranges.
- inline int GetRangeStart(int index) const;
- inline int GetRangeEnd(int index) const;
- inline int GetRangeHandler(int index) const;
- inline int GetRangeData(int index) const;
-
- // Setters for handler table based on ranges.
- inline void SetRangeStart(int index, int value);
- inline void SetRangeEnd(int index, int value);
- inline void SetRangeHandler(int index, int offset, CatchPrediction pred);
- inline void SetRangeData(int index, int value);
-
- // Setters for handler table based on return addresses.
- inline void SetReturnOffset(int index, int value);
- inline void SetReturnHandler(int index, int offset, CatchPrediction pred);
-
- // Lookup handler in a table based on ranges.
- int LookupRange(int pc_offset, int* data, CatchPrediction* prediction);
-
- // Lookup handler in a table based on return addresses.
- int LookupReturn(int pc_offset, CatchPrediction* prediction);
-
- // Returns the conservative catch predication.
- inline CatchPrediction GetRangePrediction(int index) const;
-
- // Returns the number of entries in the table.
- inline int NumberOfRangeEntries() const;
-
- // Returns the required length of the underlying fixed array.
- static int LengthForRange(int entries) { return entries * kRangeEntrySize; }
- static int LengthForReturn(int entries) { return entries * kReturnEntrySize; }
-
- DECLARE_CAST(HandlerTable)
-
-#ifdef ENABLE_DISASSEMBLER
- void HandlerTableRangePrint(std::ostream& os); // NOLINT
- void HandlerTableReturnPrint(std::ostream& os); // NOLINT
-#endif
-
- private:
- // Layout description for handler table based on ranges.
- static const int kRangeStartIndex = 0;
- static const int kRangeEndIndex = 1;
- static const int kRangeHandlerIndex = 2;
- static const int kRangeDataIndex = 3;
- static const int kRangeEntrySize = 4;
-
- // Layout description for handler table based on return addresses.
- static const int kReturnOffsetIndex = 0;
- static const int kReturnHandlerIndex = 1;
- static const int kReturnEntrySize = 2;
-
- // Encoding of the {handler} field.
- class HandlerPredictionField : public BitField<CatchPrediction, 0, 2> {};
- class HandlerOffsetField : public BitField<int, 2, 30> {};
-};
-
class TemplateList : public FixedArray {
public:
static Handle<TemplateList> New(Isolate* isolate, int size);
@@ -5341,6 +5343,9 @@ class Code: public HeapObject {
BailoutId TranslatePcOffsetToAstId(uint32_t pc_offset);
uint32_t TranslateAstIdToPcOffset(BailoutId ast_id);
+ int LookupRangeInHandlerTable(int code_offset, int* data,
+ HandlerTable::CatchPrediction* prediction);
+
#define DECLARE_CODE_AGE_ENUM(X) k##X##CodeAge,
enum Age {
kToBeExecutedOnceCodeAge = -3,
@@ -5554,6 +5559,10 @@ class AbstractCode : public HeapObject {
// Return the source position table.
inline ByteArray* source_position_table();
+ // Return the exception handler table.
+ inline int LookupRangeInHandlerTable(
+ int code_offset, int* data, HandlerTable::CatchPrediction* prediction);
+
// Returns the size of instructions and the metadata.
inline int SizeIncludingMetadata();
« no previous file with comments | « src/isolate.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698