Changeset 222871 in webkit for trunk/Source/JavaScriptCore/assembler
- Timestamp:
- Oct 4, 2017, 1:00:01 PM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore/assembler
- Files:
-
- 1 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/assembler/MacroAssembler.cpp
r222009 r222871 39 39 static void stdFunctionCallback(Probe::Context& context) 40 40 { 41 auto func = static_cast<const std::function<void(Probe::Context&)>*>(context.arg);41 auto func = context.arg<const std::function<void(Probe::Context&)>*>(); 42 42 (*func)(context); 43 43 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerPrinter.cpp
r222009 r222871 176 176 { 177 177 auto& out = WTF::dataFile(); 178 PrintRecordList& list = * reinterpret_cast<PrintRecordList*>(probeContext.arg);178 PrintRecordList& list = *probeContext.arg<PrintRecordList*>(); 179 179 for (size_t i = 0; i < list.size(); i++) { 180 180 auto& record = list[i]; -
trunk/Source/JavaScriptCore/assembler/ProbeContext.cpp
r220960 r222871 53 53 54 54 if (context.hasWritesToFlush()) { 55 context.stack().setNewStackPointer(state->cpu.sp()); 56 state->cpu.sp() = std::min(context.stack().lowWatermark(), state->cpu.sp()); 55 context.stack().setSavedStackPointer(state->cpu.sp()); 56 void* lowWatermark = context.stack().lowWatermark(state->cpu.sp()); 57 state->cpu.sp() = std::min(lowWatermark, state->cpu.sp()); 57 58 58 59 state->initializeStackFunction = flushDirtyStackPages; … … 65 66 std::unique_ptr<Stack> stack(reinterpret_cast<Probe::Stack*>(state->initializeStackArg)); 66 67 stack->flushWrites(); 67 state->cpu.sp() = stack-> newStackPointer();68 state->cpu.sp() = stack->savedStackPointer(); 68 69 } 69 70 -
trunk/Source/JavaScriptCore/assembler/ProbeContext.h
r222058 r222871 192 192 193 193 Context(State* state) 194 : m_state(state) 195 , arg(state->arg) 196 , cpu(state->cpu) 194 : cpu(state->cpu) 195 , m_state(state) 197 196 { } 197 198 template<typename T> 199 T arg() { return reinterpret_cast<T>(m_state->arg); } 198 200 199 201 uintptr_t& gpr(RegisterID id) { return cpu.gpr(id); } … … 225 227 Stack* releaseStack() { return new Stack(WTFMove(m_stack)); } 226 228 229 CPUState& cpu; 230 227 231 private: 228 232 State* m_state; 229 public:230 void* arg;231 CPUState& cpu;232 233 private:234 233 Stack m_stack; 235 234 -
trunk/Source/JavaScriptCore/assembler/ProbeStack.cpp
r222058 r222871 35 35 namespace Probe { 36 36 37 static void* const maxLowWatermark = reinterpret_cast<void*>(std::numeric_limits<uintptr_t>::max()); 38 37 39 #if ASAN_ENABLED 38 40 // FIXME: we should consider using the copy function for both ASan and non-ASan builds. … … 50 52 } 51 53 #else 52 #define copyStackPage(dst, src, size) std::memcpy(dst, src, size) ;54 #define copyStackPage(dst, src, size) std::memcpy(dst, src, size) 53 55 #endif 54 56 … … 85 87 } 86 88 89 void* Page::lowWatermarkFromVisitingDirtyChunks() 90 { 91 uint64_t dirtyBits = m_dirtyBits; 92 size_t offset = 0; 93 while (dirtyBits) { 94 if (dirtyBits & 1) 95 return reinterpret_cast<uint8_t*>(m_baseLogicalAddress) + offset; 96 dirtyBits = dirtyBits >> 1; 97 offset += s_chunkSize; 98 } 99 return maxLowWatermark; 100 } 101 87 102 Stack::Stack(Stack&& other) 88 : m_newStackPointer(other.m_newStackPointer) 89 , m_lowWatermark(other.m_lowWatermark) 90 , m_stackBounds(WTFMove(other.m_stackBounds)) 103 : m_stackBounds(WTFMove(other.m_stackBounds)) 91 104 , m_pages(WTFMove(other.m_pages)) 92 105 { 106 m_savedStackPointer = other.m_savedStackPointer; 93 107 #if !ASSERT_DISABLED 94 108 other.m_isValid = false; … … 129 143 } 130 144 145 void* Stack::lowWatermarkFromVisitingDirtyPages() 146 { 147 void* low = maxLowWatermark; 148 for (auto it = m_pages.begin(); it != m_pages.end(); ++it) { 149 Page& page = *it->value; 150 if (!page.hasWritesToFlush() || low < page.baseAddress()) 151 continue; 152 low = std::min(low, page.lowWatermarkFromVisitingDirtyChunks()); 153 } 154 return low; 155 } 156 131 157 } // namespace Probe 132 158 } // namespace JSC -
trunk/Source/JavaScriptCore/assembler/ProbeStack.h
r222058 r222871 96 96 } 97 97 98 void* lowWatermarkFromVisitingDirtyChunks(); 99 98 100 private: 99 101 uint64_t dirtyBitFor(void* logicalAddress) … … 147 149 public: 148 150 Stack() 149 : m_lowWatermark(reinterpret_cast<void*>(-1)) 150 , m_stackBounds(Thread::current().stack()) 151 : m_stackBounds(Thread::current().stack()) 151 152 { } 152 153 Stack(Stack&& other); 153 154 154 void* lowWatermark() 155 { 156 // We use the chunkAddress for the low watermark because we'll be doing write backs 157 // to the stack in increments of chunks. Hence, we'll treat the lowest address of 158 // the chunk as the low watermark of any given set address. 159 return Page::chunkAddressFor(m_lowWatermark); 155 void* lowWatermarkFromVisitingDirtyPages(); 156 void* lowWatermark(void* stackPointer) 157 { 158 ASSERT(Page::chunkAddressFor(stackPointer) == lowWatermarkFromVisitingDirtyPages()); 159 return Page::chunkAddressFor(stackPointer); 160 160 } 161 161 … … 177 177 Page* page = pageFor(address); 178 178 page->set<T>(address, value); 179 180 if (address < m_lowWatermark)181 m_lowWatermark = address;182 179 } 183 180 … … 190 187 JS_EXPORT_PRIVATE Page* ensurePageFor(void* address); 191 188 192 void* newStackPointer() const { return m_newStackPointer; };193 void set NewStackPointer(void* sp) { m_newStackPointer = sp; };189 void* savedStackPointer() const { return m_savedStackPointer; } 190 void setSavedStackPointer(void* sp) { m_savedStackPointer = sp; } 194 191 195 192 bool hasWritesToFlush(); … … 208 205 } 209 206 210 void* m_newStackPointer { nullptr }; 211 void* m_lowWatermark; 207 void* m_savedStackPointer { nullptr }; 212 208 213 209 // A cache of the last accessed page details for quick access.
Note:
See TracChangeset
for help on using the changeset viewer.