source: webkit/trunk/Source/JavaScriptCore/jit/JITCodeMap.h

Last change on this file was 277963, checked in by [email protected], 4 years ago

Unreviewed, revert r276610 because it causes a 1% PLT regression.

Source/JavaScriptCore:

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::visitChildren):
(JSC::CodeBlock::JITData::size const): Deleted.

  • bytecode/CodeBlock.h:
  • jit/JITCodeMap.h:

(JSC::JITCodeMap::memorySize const): Deleted.

Source/WTF:

  • wtf/Bag.h:
File size: 3.7 KB
Line 
1/*
2 * Copyright (C) 2018 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#if ENABLE(JIT)
29
30#include "CodeLocation.h"
31#include <wtf/StdLibExtras.h>
32#include <wtf/Vector.h>
33
34namespace JSC {
35
36class JITCodeMap {
37public:
38 static_assert(std::is_trivially_destructible_v<BytecodeIndex>);
39 static_assert(std::is_trivially_destructible_v<CodeLocationLabel<JSEntryPtrTag>>);
40 static_assert(alignof(CodeLocationLabel<JSEntryPtrTag>) >= alignof(BytecodeIndex), "Putting CodeLocationLabel vector first since we can avoid alignment consideration of BytecodeIndex vector");
41 JITCodeMap() = default;
42 JITCodeMap(Vector<BytecodeIndex>&& indexes, Vector<CodeLocationLabel<JSEntryPtrTag>>&& codeLocations)
43 : m_size(indexes.size())
44 {
45 ASSERT(indexes.size() == codeLocations.size());
46 m_pointer = MallocPtr<uint8_t>::malloc(sizeof(CodeLocationLabel<JSEntryPtrTag>) * m_size + sizeof(BytecodeIndex) * m_size);
47 std::copy(codeLocations.begin(), codeLocations.end(), this->codeLocations());
48 std::copy(indexes.begin(), indexes.end(), this->indexes());
49 }
50
51 CodeLocationLabel<JSEntryPtrTag> find(BytecodeIndex bytecodeIndex) const
52 {
53 auto* index = binarySearch<BytecodeIndex, BytecodeIndex>(indexes(), m_size, bytecodeIndex, [] (BytecodeIndex* index) { return *index; });
54 if (!index)
55 return CodeLocationLabel<JSEntryPtrTag>();
56 return codeLocations()[index - indexes()];
57 }
58
59 explicit operator bool() const { return m_size; }
60
61private:
62 CodeLocationLabel<JSEntryPtrTag>* codeLocations() const
63 {
64 return bitwise_cast<CodeLocationLabel<JSEntryPtrTag>*>(m_pointer.get());
65 }
66
67 BytecodeIndex* indexes() const
68 {
69 return bitwise_cast<BytecodeIndex*>(m_pointer.get() + sizeof(CodeLocationLabel<JSEntryPtrTag>) * m_size);
70 }
71
72 MallocPtr<uint8_t> m_pointer;
73 unsigned m_size { 0 };
74};
75
76class JITCodeMapBuilder {
77 WTF_MAKE_NONCOPYABLE(JITCodeMapBuilder);
78public:
79 JITCodeMapBuilder() = default;
80 void append(BytecodeIndex bytecodeIndex, CodeLocationLabel<JSEntryPtrTag> codeLocation)
81 {
82 m_indexes.append(bytecodeIndex);
83 m_codeLocations.append(codeLocation);
84 }
85
86 JITCodeMap finalize()
87 {
88 return JITCodeMap(WTFMove(m_indexes), WTFMove(m_codeLocations));
89 }
90
91private:
92 Vector<BytecodeIndex> m_indexes;
93 Vector<CodeLocationLabel<JSEntryPtrTag>> m_codeLocations;
94};
95
96} // namespace JSC
97
98#endif // ENABLE(JIT)
Note: See TracBrowser for help on using the repository browser.