Index: src/assembler.h |
=================================================================== |
--- src/assembler.h (revision 352) |
+++ src/assembler.h (working copy) |
@@ -130,101 +130,7 @@ |
// ----------------------------------------------------------------------------- |
// Relocation information |
-// The constant kNoPosition is used with the collecting of source positions |
-// in the relocation information. Two types of source positions are collected |
-// "position" (RelocMode position) and "statement position" (RelocMode |
-// statement_position). The "position" is collected at places in the source |
-// code which are of interest when making stack traces to pin-point the source |
-// location of a stack frame as close as possible. The "statement position" is |
-// collected at the beginning at each statement, and is used to indicate |
-// possible break locations. kNoPosition is used to indicate an |
-// invalid/uninitialized position value. |
-static const int kNoPosition = -1; |
- |
-enum RelocMode { |
- // Please note the order is important (see is_code_target, is_gc_reloc_mode). |
- js_construct_call, // code target that is an exit JavaScript frame stub. |
- exit_js_frame, // code target that is an exit JavaScript frame stub. |
- code_target_context, // code target used for contextual loads. |
- code_target, // code target which is not any of the above. |
- embedded_object, |
- embedded_string, |
- |
- // Everything after runtime_entry (inclusive) is not GC'ed. |
- runtime_entry, |
- js_return, // Marks start of the ExitJSFrame code. |
- comment, |
- position, // See comment for kNoPosition above. |
- statement_position, // See comment for kNoPosition above. |
- external_reference, // The address of an external C++ function. |
- internal_reference, // An address inside the same function. |
- |
- // add more as needed |
- // Pseudo-types |
- reloc_mode_count, // must be no greater than 14 - see RelocInfoWriter |
- no_reloc, // never recorded |
- last_code_enum = code_target, |
- last_gced_enum = embedded_string |
-}; |
- |
- |
-inline int RelocMask(RelocMode mode) { |
- return 1 << mode; |
-} |
- |
- |
-inline bool is_js_construct_call(RelocMode mode) { |
- return mode == js_construct_call; |
-} |
- |
- |
-inline bool is_exit_js_frame(RelocMode mode) { |
- return mode == exit_js_frame; |
-} |
- |
- |
-inline bool is_code_target(RelocMode mode) { |
- return mode <= last_code_enum; |
-} |
- |
- |
-// Is the relocation mode affected by GC? |
-inline bool is_gc_reloc_mode(RelocMode mode) { |
- return mode <= last_gced_enum; |
-} |
- |
- |
-inline bool is_js_return(RelocMode mode) { |
- return mode == js_return; |
-} |
- |
- |
-inline bool is_comment(RelocMode mode) { |
- return mode == comment; |
-} |
- |
- |
-inline bool is_position(RelocMode mode) { |
- return mode == position || mode == statement_position; |
-} |
- |
- |
-inline bool is_statement_position(RelocMode mode) { |
- return mode == statement_position; |
-} |
- |
- |
-inline bool is_external_reference(RelocMode mode) { |
- return mode == external_reference; |
-} |
- |
- |
-inline bool is_internal_reference(RelocMode mode) { |
- return mode == internal_reference; |
-} |
- |
- |
// Relocation information consists of the address (pc) of the datum |
// to which the relocation information applies, the relocation mode |
// (rmode), and an optional data field. The relocation mode may be |
@@ -234,22 +140,89 @@ |
class RelocInfo BASE_EMBEDDED { |
public: |
+ // The constant kNoPosition is used with the collecting of source positions |
+ // in the relocation information. Two types of source positions are collected |
+ // "position" (RelocMode position) and "statement position" (RelocMode |
+ // statement_position). The "position" is collected at places in the source |
+ // code which are of interest when making stack traces to pin-point the source |
+ // location of a stack frame as close as possible. The "statement position" is |
+ // collected at the beginning at each statement, and is used to indicate |
+ // possible break locations. kNoPosition is used to indicate an |
+ // invalid/uninitialized position value. |
+ static const int kNoPosition = -1; |
+ |
+ enum Mode { |
+ // Please note the order is important (see IsCodeTarget, IsGCRelocMode). |
+ CONSTRUCT_CALL, // code target that is a call to a JavaScript constructor. |
+ CODE_TARGET_CONTEXT, // code target used for contextual loads. |
+ CODE_TARGET, // code target which is not any of the above. |
+ EMBEDDED_OBJECT, |
+ EMBEDDED_STRING, |
+ |
+ // Everything after runtime_entry (inclusive) is not GC'ed. |
+ RUNTIME_ENTRY, |
+ JS_RETURN, // Marks start of the ExitJSFrame code. |
+ COMMENT, |
+ POSITION, // See comment for kNoPosition above. |
+ STATEMENT_POSITION, // See comment for kNoPosition above. |
+ EXTERNAL_REFERENCE, // The address of an external C++ function. |
+ INTERNAL_REFERENCE, // An address inside the same function. |
+ |
+ // add more as needed |
+ // Pseudo-types |
+ NUMBER_OF_MODES, // must be no greater than 14 - see RelocInfoWriter |
+ NONE, // never recorded |
+ LAST_CODE_ENUM = CODE_TARGET, |
+ LAST_GCED_ENUM = EMBEDDED_STRING |
+ }; |
+ |
+ |
RelocInfo() {} |
- RelocInfo(byte* pc, RelocMode rmode, intptr_t data) |
+ RelocInfo(byte* pc, Mode rmode, intptr_t data) |
: pc_(pc), rmode_(rmode), data_(data) { |
} |
+ static inline bool IsConstructCall(Mode mode) { |
+ return mode == CONSTRUCT_CALL; |
+ } |
+ static inline bool IsCodeTarget(Mode mode) { |
+ return mode <= LAST_CODE_ENUM; |
+ } |
+ // Is the relocation mode affected by GC? |
+ static inline bool IsGCRelocMode(Mode mode) { |
+ return mode <= LAST_GCED_ENUM; |
+ } |
+ static inline bool IsJSReturn(Mode mode) { |
+ return mode == JS_RETURN; |
+ } |
+ static inline bool IsComment(Mode mode) { |
+ return mode == COMMENT; |
+ } |
+ static inline bool IsPosition(Mode mode) { |
+ return mode == POSITION || mode == STATEMENT_POSITION; |
+ } |
+ static inline bool IsStatementPosition(Mode mode) { |
+ return mode == STATEMENT_POSITION; |
+ } |
+ static inline bool IsExternalReference(Mode mode) { |
+ return mode == EXTERNAL_REFERENCE; |
+ } |
+ static inline bool IsInternalReference(Mode mode) { |
+ return mode == INTERNAL_REFERENCE; |
+ } |
+ static inline int ModeMask(Mode mode) { return 1 << mode; } |
+ |
// Accessors |
byte* pc() const { return pc_; } |
void set_pc(byte* pc) { pc_ = pc; } |
- RelocMode rmode() const { return rmode_; } |
+ Mode rmode() const { return rmode_; } |
intptr_t data() const { return data_; } |
// Apply a relocation by delta bytes |
INLINE(void apply(int delta)); |
// Read/modify the code target in the branch/call instruction this relocation |
- // applies to; can only be called if this->is_code_target(rmode_) |
+ // applies to; can only be called if IsCodeTarget(rmode_) |
INLINE(Address target_address()); |
INLINE(void set_target_address(Address target)); |
INLINE(Object* target_object()); |
@@ -278,7 +251,7 @@ |
#ifdef ENABLE_DISASSEMBLER |
// Printing |
- static const char* RelocModeName(RelocMode rmode); |
+ static const char* RelocModeName(Mode rmode); |
void Print(); |
#endif // ENABLE_DISASSEMBLER |
#ifdef DEBUG |
@@ -286,9 +259,9 @@ |
void Verify(); |
#endif |
- static const int kCodeTargetMask = (1 << (last_code_enum + 1)) - 1; |
- static const int kPositionMask = 1 << position | 1 << statement_position; |
- static const int kDebugMask = kPositionMask | 1 << comment; |
+ static const int kCodeTargetMask = (1 << (LAST_CODE_ENUM + 1)) - 1; |
+ static const int kPositionMask = 1 << POSITION | 1 << STATEMENT_POSITION; |
+ static const int kDebugMask = kPositionMask | 1 << COMMENT; |
static const int kApplyMask; // Modes affected by apply. Depends on arch. |
private: |
@@ -297,7 +270,7 @@ |
// referencing the constant pool entry (except when rmode_ == |
// comment). |
byte* pc_; |
- RelocMode rmode_; |
+ Mode rmode_; |
intptr_t data_; |
friend class RelocIterator; |
}; |
@@ -383,11 +356,11 @@ |
int GetPositionTypeTag(); |
void ReadTaggedData(); |
- static RelocMode DebugInfoModeFromTag(int tag); |
+ static RelocInfo::Mode DebugInfoModeFromTag(int tag); |
// If the given mode is wanted, set it in rinfo_ and return true. |
// Else return false. Used for efficiently skipping unwanted modes. |
- bool SetMode(RelocMode mode) { |
+ bool SetMode(RelocInfo::Mode mode) { |
return (mode_mask_ & 1 << mode) ? (rinfo_.rmode_ = mode, true) : false; |
} |