b72ba9b929439ac5f12d1585f6033ef2b59d5a49
[WebKit-https.git] / Source / JavaScriptCore / yarr / YarrJIT.h
1 /*
2  * Copyright (C) 2009-2017 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(YARR_JIT)
29
30 #include "MacroAssemblerCodeRef.h"
31 #include "MatchResult.h"
32 #include "Yarr.h"
33 #include "YarrPattern.h"
34
35 #if CPU(X86) && !COMPILER(MSVC)
36 #define YARR_CALL __attribute__ ((regparm (3)))
37 #else
38 #define YARR_CALL
39 #endif
40
41 namespace JSC {
42
43 class VM;
44 class ExecutablePool;
45
46 namespace Yarr {
47
48 class YarrCodeBlock {
49 #if CPU(X86_64) || CPU(ARM64)
50     typedef MatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
51     typedef MatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
52     typedef MatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length) YARR_CALL;
53     typedef MatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length) YARR_CALL;
54 #else
55     typedef EncodedMatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
56     typedef EncodedMatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
57     typedef EncodedMatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length) YARR_CALL;
58     typedef EncodedMatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length) YARR_CALL;
59 #endif
60
61 public:
62     YarrCodeBlock()
63         : m_needFallBack(false)
64     {
65     }
66
67     ~YarrCodeBlock()
68     {
69     }
70
71     void setFallBack(bool fallback) { m_needFallBack = fallback; }
72     bool isFallBack() { return m_needFallBack; }
73
74     bool has8BitCode() { return m_ref8.size(); }
75     bool has16BitCode() { return m_ref16.size(); }
76     void set8BitCode(MacroAssemblerCodeRef ref) { m_ref8 = ref; }
77     void set16BitCode(MacroAssemblerCodeRef ref) { m_ref16 = ref; }
78
79     bool has8BitCodeMatchOnly() { return m_matchOnly8.size(); }
80     bool has16BitCodeMatchOnly() { return m_matchOnly16.size(); }
81     void set8BitCodeMatchOnly(MacroAssemblerCodeRef matchOnly) { m_matchOnly8 = matchOnly; }
82     void set16BitCodeMatchOnly(MacroAssemblerCodeRef matchOnly) { m_matchOnly16 = matchOnly; }
83
84     MatchResult execute(const LChar* input, unsigned start, unsigned length, int* output)
85     {
86         ASSERT(has8BitCode());
87         return MatchResult(reinterpret_cast<YarrJITCode8>(m_ref8.code().executableAddress())(input, start, length, output));
88     }
89
90     MatchResult execute(const UChar* input, unsigned start, unsigned length, int* output)
91     {
92         ASSERT(has16BitCode());
93         return MatchResult(reinterpret_cast<YarrJITCode16>(m_ref16.code().executableAddress())(input, start, length, output));
94     }
95
96     MatchResult execute(const LChar* input, unsigned start, unsigned length)
97     {
98         ASSERT(has8BitCodeMatchOnly());
99         return MatchResult(reinterpret_cast<YarrJITCodeMatchOnly8>(m_matchOnly8.code().executableAddress())(input, start, length));
100     }
101
102     MatchResult execute(const UChar* input, unsigned start, unsigned length)
103     {
104         ASSERT(has16BitCodeMatchOnly());
105         return MatchResult(reinterpret_cast<YarrJITCodeMatchOnly16>(m_matchOnly16.code().executableAddress())(input, start, length));
106     }
107
108 #if ENABLE(REGEXP_TRACING)
109     void *get8BitMatchOnlyAddr()
110     {
111         if (!has8BitCodeMatchOnly())
112             return 0;
113
114         return m_matchOnly8.code().executableAddress();
115     }
116
117     void *get16BitMatchOnlyAddr()
118     {
119         if (!has16BitCodeMatchOnly())
120             return 0;
121
122         return m_matchOnly16.code().executableAddress();
123     }
124
125     void *get8BitMatchAddr()
126     {
127         if (!has8BitCode())
128             return 0;
129
130         return m_ref8.code().executableAddress();
131     }
132
133     void *get16BitMatchAddr()
134     {
135         if (!has16BitCode())
136             return 0;
137
138         return m_ref16.code().executableAddress();
139     }
140 #endif
141
142     size_t size() const
143     {
144         return m_ref8.size() + m_ref16.size() + m_matchOnly8.size() + m_matchOnly16.size();
145     }
146
147     void clear()
148     {
149         m_ref8 = MacroAssemblerCodeRef();
150         m_ref16 = MacroAssemblerCodeRef();
151         m_matchOnly8 = MacroAssemblerCodeRef();
152         m_matchOnly16 = MacroAssemblerCodeRef();
153         m_needFallBack = false;
154     }
155
156 private:
157     MacroAssemblerCodeRef m_ref8;
158     MacroAssemblerCodeRef m_ref16;
159     MacroAssemblerCodeRef m_matchOnly8;
160     MacroAssemblerCodeRef m_matchOnly16;
161     bool m_needFallBack;
162 };
163
164 enum YarrJITCompileMode {
165     MatchOnly,
166     IncludeSubpatterns
167 };
168 void jitCompile(YarrPattern&, YarrCharSize, VM*, YarrCodeBlock& jitObject, YarrJITCompileMode = IncludeSubpatterns);
169
170 } } // namespace JSC::Yarr
171
172 #endif