1/*
2 * Copyright (C) 2012-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// This is guarded by ENABLE_DFG_JIT only because it uses some value profiles
29// that are currently only used if the DFG is enabled (i.e. they are not
30// available in the profile-only configuration). Hopefully someday all of
31// these #if's will disappear...
32#if ENABLE(DFG_JIT)
33
34#include "BytecodeIndex.h"
35#include "GPRInfo.h"
36
37namespace JSC {
38
39class UnaryArithProfile;
40class BinaryArithProfile;
41class CCallHelpers;
42class CodeBlock;
43class LazyOperandValueProfileKey;
44struct ValueProfile;
45
46class MethodOfGettingAValueProfile {
47public:
48 MethodOfGettingAValueProfile()
49 : m_kind(None)
50 {
51 }
52
53 MethodOfGettingAValueProfile(ValueProfile* profile)
54 {
55 if (profile) {
56 m_kind = Ready;
57 u.profile = profile;
58 } else
59 m_kind = None;
60 }
61
62 MethodOfGettingAValueProfile(UnaryArithProfile* profile)
63 {
64 if (profile) {
65 m_kind = UnaryArithProfileReady;
66 u.unaryArithProfile = profile;
67 } else
68 m_kind = None;
69 }
70
71 MethodOfGettingAValueProfile(BinaryArithProfile* profile)
72 {
73 if (profile) {
74 m_kind = BinaryArithProfileReady;
75 u.binaryArithProfile = profile;
76 } else
77 m_kind = None;
78 }
79
80 static MethodOfGettingAValueProfile fromLazyOperand(
81 CodeBlock*, const LazyOperandValueProfileKey&);
82
83 explicit operator bool() const { return m_kind != None; }
84
85 void emitReportValue(CCallHelpers&, JSValueRegs) const;
86 void reportValue(JSValue);
87
88private:
89 enum Kind {
90 None,
91 Ready,
92 UnaryArithProfileReady,
93 BinaryArithProfileReady,
94 LazyOperand
95 };
96
97 Kind m_kind;
98 union Data {
99 Data()
100 : profile(nullptr)
101 { }
102
103 ValueProfile* profile;
104 UnaryArithProfile* unaryArithProfile;
105 BinaryArithProfile* binaryArithProfile;
106 struct {
107 CodeBlock* codeBlock;
108 BytecodeIndex bytecodeOffset;
109 int operand;
110 } lazyOperand;
111 } u;
112};
113
114} // namespace JSC
115
116#endif // ENABLE(DFG_JIT)
117