Changeset 44514 in webkit for trunk/JavaScriptCore/assembler/MacroAssemblerCodeRef.h
- Timestamp:
- Jun 8, 2009, 6:40:59 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/assembler/MacroAssemblerCodeRef.h
r44455 r44514 36 36 #if ENABLE(ASSEMBLER) 37 37 38 // ASSERT_VALID_CODE_POINTER checks that ptr is a non-null pointer, and that it is a valid 39 // instruction address on the platform (for example, check any alignment requirements). 40 #if PLATFORM(ARM_V7) 41 // ARM/thumb instructions must be 16-bit aligned, but all code pointers to be loaded 42 // into the processor are decorated with the bottom bit set, indicating that this is 43 // thumb code (as oposed to 32-bit traditional ARM). The first test checks for both 44 // decorated and undectorated null, and the second test ensures that the pointer is 45 // decorated. 46 #define ASSERT_VALID_CODE_POINTER(ptr) \ 47 ASSERT(reinterpret_cast<intptr_t>(ptr) & ~1); \ 48 ASSERT(reinterpret_cast<intptr_t>(ptr) & 1) 49 #else 50 #define ASSERT_VALID_CODE_POINTER(ptr) \ 51 ASSERT(ptr) 52 #endif 53 38 54 namespace JSC { 39 55 … … 53 69 : m_value(reinterpret_cast<void*>(value)) 54 70 { 55 ASSERT (m_value);71 ASSERT_VALID_CODE_POINTER(m_value); 56 72 } 57 73 … … 80 96 : m_value(value) 81 97 { 82 ASSERT (m_value);98 ASSERT_VALID_CODE_POINTER(m_value); 83 99 } 84 100 … … 100 116 101 117 explicit MacroAssemblerCodePtr(void* value) 118 #if PLATFORM(ARM_V7) 119 // Decorate the pointer as a thumb code pointer. 120 : m_value(reinterpret_cast<char*>(value) + 1) 121 #else 102 122 : m_value(value) 123 #endif 103 124 { 104 ASSERT (m_value);125 ASSERT_VALID_CODE_POINTER(m_value); 105 126 } 106 127 … … 108 129 : m_value(ra.value()) 109 130 { 110 ASSERT (m_value);131 ASSERT_VALID_CODE_POINTER(m_value); 111 132 } 112 133 113 134 void* executableAddress() const { return m_value; } 114 void* dataLocation() const { ASSERT(m_value); return m_value; } 135 #if PLATFORM(ARM_V7) 136 // To use this pointer as a data address remove the decoration. 137 void* dataLocation() const { ASSERT_VALID_CODE_POINTER(m_value); return reinterpret_cast<char*>(m_value) - 1; } 138 #else 139 void* dataLocation() const { ASSERT_VALID_CODE_POINTER(m_value); return m_value; } 140 #endif 115 141 116 142 private:
Note:
See TracChangeset
for help on using the changeset viewer.