OLD | NEW |
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
2 // All Rights Reserved. | 2 // All Rights Reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
6 // are met: | 6 // are met: |
7 // | 7 // |
8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
10 // | 10 // |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 } | 310 } |
311 | 311 |
312 // setup buffer pointers | 312 // setup buffer pointers |
313 ASSERT(buffer_ != NULL); | 313 ASSERT(buffer_ != NULL); |
314 pc_ = buffer_; | 314 pc_ = buffer_; |
315 reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); | 315 reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); |
316 | 316 |
317 last_pc_ = NULL; | 317 last_pc_ = NULL; |
318 last_bound_pos_ = 0; | 318 last_bound_pos_ = 0; |
319 last_position_ = kNoPosition; | 319 last_position_ = kNoPosition; |
320 last_position_is_statement_ = false; | 320 last_statement_position_ = kNoPosition; |
321 } | 321 } |
322 | 322 |
323 | 323 |
324 Assembler::~Assembler() { | 324 Assembler::~Assembler() { |
325 if (own_buffer_) { | 325 if (own_buffer_) { |
326 if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { | 326 if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { |
327 spare_buffer_ = buffer_; | 327 spare_buffer_ = buffer_; |
328 } else { | 328 } else { |
329 DeleteArray(buffer_); | 329 DeleteArray(buffer_); |
330 } | 330 } |
(...skipping 968 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1299 | 1299 |
1300 void Assembler::call(const Operand& adr) { | 1300 void Assembler::call(const Operand& adr) { |
1301 EnsureSpace ensure_space(this); | 1301 EnsureSpace ensure_space(this); |
1302 last_pc_ = pc_; | 1302 last_pc_ = pc_; |
1303 EMIT(0xFF); | 1303 EMIT(0xFF); |
1304 emit_operand(edx, adr); | 1304 emit_operand(edx, adr); |
1305 } | 1305 } |
1306 | 1306 |
1307 | 1307 |
1308 void Assembler::call(Handle<Code> code, RelocMode rmode) { | 1308 void Assembler::call(Handle<Code> code, RelocMode rmode) { |
| 1309 WriteRecordedPositions(); |
1309 EnsureSpace ensure_space(this); | 1310 EnsureSpace ensure_space(this); |
1310 last_pc_ = pc_; | 1311 last_pc_ = pc_; |
1311 ASSERT(is_code_target(rmode)); | 1312 ASSERT(is_code_target(rmode)); |
1312 EMIT(0xE8); | 1313 EMIT(0xE8); |
1313 emit(reinterpret_cast<intptr_t>(code.location()), rmode); | 1314 emit(reinterpret_cast<intptr_t>(code.location()), rmode); |
1314 } | 1315 } |
1315 | 1316 |
1316 | 1317 |
1317 void Assembler::jmp(Label* L) { | 1318 void Assembler::jmp(Label* L) { |
1318 EnsureSpace ensure_space(this); | 1319 EnsureSpace ensure_space(this); |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1837 EMIT(0xC0 | dst.code() << 3 | src.code()); | 1838 EMIT(0xC0 | dst.code() << 3 | src.code()); |
1838 } | 1839 } |
1839 | 1840 |
1840 | 1841 |
1841 void Assembler::Print() { | 1842 void Assembler::Print() { |
1842 Disassembler::Decode(stdout, buffer_, pc_); | 1843 Disassembler::Decode(stdout, buffer_, pc_); |
1843 } | 1844 } |
1844 | 1845 |
1845 | 1846 |
1846 void Assembler::RecordJSReturn() { | 1847 void Assembler::RecordJSReturn() { |
| 1848 WriteRecordedPositions(); |
1847 EnsureSpace ensure_space(this); | 1849 EnsureSpace ensure_space(this); |
1848 RecordRelocInfo(js_return); | 1850 RecordRelocInfo(js_return); |
1849 } | 1851 } |
1850 | 1852 |
1851 | 1853 |
1852 void Assembler::RecordComment(const char* msg) { | 1854 void Assembler::RecordComment(const char* msg) { |
1853 if (FLAG_debug_code) { | 1855 if (FLAG_debug_code) { |
1854 EnsureSpace ensure_space(this); | 1856 EnsureSpace ensure_space(this); |
1855 RecordRelocInfo(comment, reinterpret_cast<intptr_t>(msg)); | 1857 RecordRelocInfo(comment, reinterpret_cast<intptr_t>(msg)); |
1856 } | 1858 } |
1857 } | 1859 } |
1858 | 1860 |
1859 | 1861 |
1860 void Assembler::RecordPosition(int pos) { | 1862 void Assembler::RecordPosition(int pos) { |
1861 if (pos == kNoPosition) return; | 1863 if (pos == kNoPosition) return; |
1862 ASSERT(position >= 0); | 1864 ASSERT(pos >= 0); |
1863 if (pos == last_position_) return; | |
1864 EnsureSpace ensure_space(this); | |
1865 RecordRelocInfo(position, pos); | |
1866 last_position_ = pos; | 1865 last_position_ = pos; |
1867 last_position_is_statement_ = false; | |
1868 } | 1866 } |
1869 | 1867 |
1870 | 1868 |
1871 void Assembler::RecordStatementPosition(int pos) { | 1869 void Assembler::RecordStatementPosition(int pos) { |
1872 if (pos == kNoPosition) return; | 1870 if (pos == kNoPosition) return; |
1873 ASSERT(position >= 0); | 1871 ASSERT(pos >= 0); |
1874 if (pos == last_position_) return; | 1872 last_statement_position_ = pos; |
1875 EnsureSpace ensure_space(this); | 1873 } |
1876 RecordRelocInfo(statement_position, pos); | 1874 |
1877 last_position_ = pos; | 1875 |
1878 last_position_is_statement_ = true; | 1876 void Assembler::WriteRecordedPositions() { |
| 1877 if (last_statement_position_ != kNoPosition) { |
| 1878 EnsureSpace ensure_space(this); |
| 1879 RecordRelocInfo(statement_position, last_statement_position_); |
| 1880 } |
| 1881 if ((last_position_ != kNoPosition) && |
| 1882 (last_position_ != last_statement_position_)) { |
| 1883 EnsureSpace ensure_space(this); |
| 1884 RecordRelocInfo(position, last_position_); |
| 1885 } |
| 1886 last_statement_position_ = kNoPosition; |
| 1887 last_position_ = kNoPosition; |
1879 } | 1888 } |
1880 | 1889 |
1881 | 1890 |
1882 void Assembler::GrowBuffer() { | 1891 void Assembler::GrowBuffer() { |
1883 ASSERT(overflow()); // should not call this otherwise | 1892 ASSERT(overflow()); // should not call this otherwise |
1884 if (!own_buffer_) FATAL("external code buffer is too small"); | 1893 if (!own_buffer_) FATAL("external code buffer is too small"); |
1885 | 1894 |
1886 // compute new buffer size | 1895 // compute new buffer size |
1887 CodeDesc desc; // the new buffer | 1896 CodeDesc desc; // the new buffer |
1888 if (buffer_size_ < 4*KB) { | 1897 if (buffer_size_ < 4*KB) { |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2010 !Serializer::enabled() && | 2019 !Serializer::enabled() && |
2011 !FLAG_debug_code) { | 2020 !FLAG_debug_code) { |
2012 return; | 2021 return; |
2013 } | 2022 } |
2014 RelocInfo rinfo(pc_, rmode, data); | 2023 RelocInfo rinfo(pc_, rmode, data); |
2015 reloc_info_writer.Write(&rinfo); | 2024 reloc_info_writer.Write(&rinfo); |
2016 } | 2025 } |
2017 | 2026 |
2018 | 2027 |
2019 } } // namespace v8::internal | 2028 } } // namespace v8::internal |
OLD | NEW |