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