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