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