1ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 2a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Redistribution and use in source and binary forms, with or without 3a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// modification, are permitted provided that the following conditions are 4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// met: 5a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// 6a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// * Redistributions of source code must retain the above copyright 7a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// notice, this list of conditions and the following disclaimer. 8a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// * Redistributions in binary form must reproduce the above 9a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// copyright notice, this list of conditions and the following 10a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// disclaimer in the documentation and/or other materials provided 11a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// with the distribution. 12a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// * Neither the name of Google Inc. nor the names of its 13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// contributors may be used to endorse or promote products derived 14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// from this software without specific prior written permission. 15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// 16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 28a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 29a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "cctest.h" 30a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "assembler.h" 31a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 32a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 { 33a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal { 34a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 35a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgstatic void WriteRinfo(RelocInfoWriter* writer, 36a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org byte* pc, RelocInfo::Mode mode, intptr_t data) { 37c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com RelocInfo rinfo(pc, mode, data, NULL); 38a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org writer->Write(&rinfo); 39a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 40a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 42a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Tests that writing both types of positions and then reading either 43a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// or both works as expected. 44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgTEST(Positions) { 45ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const int code_size = 10 * KB; 46ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int relocation_info_size = 10 * KB; 47ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const int buffer_size = code_size + relocation_info_size; 4883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org SmartArrayPointer<byte> buffer(new byte[buffer_size]); 49a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 50ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org byte* pc = *buffer; 51ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org byte* buffer_end = *buffer + buffer_size; 52ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 53ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org RelocInfoWriter writer(buffer_end, pc); 54ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org byte* relocation_info_end = buffer_end - relocation_info_size; 55a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0, pos = 0; i < 100; i++, pc += i, pos += i) { 56a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocInfo::Mode mode = (i % 2 == 0) ? 57a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocInfo::STATEMENT_POSITION : RelocInfo::POSITION; 58a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org WriteRinfo(&writer, pc, mode, pos); 59ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK(writer.pos() - RelocInfoWriter::kMaxSize >= relocation_info_end); 60a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 61a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 62ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org relocation_info_size = static_cast<int>(buffer_end - writer.pos()); 63ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CodeDesc desc = { *buffer, buffer_size, code_size, 64ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org relocation_info_size, NULL }; 65ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 66a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Read only (non-statement) positions. 67a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org { 68a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocIterator it(desc, RelocInfo::ModeMask(RelocInfo::POSITION)); 69ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pc = *buffer; 70a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0, pos = 0; i < 100; i++, pc += i, pos += i) { 71a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocInfo::Mode mode = (i % 2 == 0) ? 72a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocInfo::STATEMENT_POSITION : RelocInfo::POSITION; 73a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (mode == RelocInfo::POSITION) { 74a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(pc, it.rinfo()->pc()); 75a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(mode, it.rinfo()->rmode()); 76a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(pos, static_cast<int>(it.rinfo()->data())); 77a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org it.next(); 78a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 79a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 80a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK(it.done()); 81a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 82a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 83a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Read only statement positions. 84a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org { 85a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocIterator it(desc, RelocInfo::ModeMask(RelocInfo::STATEMENT_POSITION)); 86ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pc = *buffer; 87a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0, pos = 0; i < 100; i++, pc += i, pos += i) { 88a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocInfo::Mode mode = (i % 2 == 0) ? 89a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocInfo::STATEMENT_POSITION : RelocInfo::POSITION; 90a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (mode == RelocInfo::STATEMENT_POSITION) { 91a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(pc, it.rinfo()->pc()); 92a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(mode, it.rinfo()->rmode()); 93a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(pos, static_cast<int>(it.rinfo()->data())); 94a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org it.next(); 95a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 96a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 97a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK(it.done()); 98a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 99a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 100a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Read both types of positions. 101a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org { 102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocIterator it(desc, RelocInfo::kPositionMask); 103ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pc = *buffer; 104a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0, pos = 0; i < 100; i++, pc += i, pos += i) { 105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocInfo::Mode mode = (i % 2 == 0) ? 106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RelocInfo::STATEMENT_POSITION : RelocInfo::POSITION; 107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(pc, it.rinfo()->pc()); 108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(mode, it.rinfo()->rmode()); 109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(pos, static_cast<int>(it.rinfo()->data())); 110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org it.next(); 111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 112a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK(it.done()); 113a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 115a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 116a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} } // namespace v8::internal 117