• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ECMASCRIPT_COMPILER_CIRCUIT_H
17 #define ECMASCRIPT_COMPILER_CIRCUIT_H
18 
19 #include <algorithm>
20 #include <iostream>
21 #include <map>
22 #include <unordered_map>
23 #include <vector>
24 
25 #include "ecmascript/compiler/gate.h"
26 #include "ecmascript/frames.h"
27 #include "libpandabase/macros.h"
28 #include "securec.h"
29 
30 namespace panda::ecmascript::kungfu {
31 const size_t INITIAL_SPACE = 1U << 0U;  // this should be tuned
32 const size_t MAX_SPACE = 1U << 24U;     // this should be tuned
33 const size_t SCALE_RATE = 1U << 1U;     // this should be tuned
34 
35 class Circuit {  // note: calling NewGate could make all saved Gate* invalid
36 public:
37     Circuit();
38     ~Circuit();
39     Circuit(Circuit const &circuit) = default;
40     Circuit &operator=(Circuit const &circuit) = default;
41     Circuit(Circuit &&circuit) = default;
42     Circuit &operator=(Circuit &&circuit) = default;
43     // NOLINTNEXTLINE(modernize-avoid-c-arrays)
44     GateRef NewGate(OpCode op, MachineType bitValue, BitField bitfield, size_t numIns, const GateRef inList[],
45                     GateType type, MarkCode mark = MarkCode::NO_MARK);
46     GateRef NewGate(OpCode op, MachineType bitValue, BitField bitfield, const std::vector<GateRef> &inList,
47                     GateType type, MarkCode mark = MarkCode::NO_MARK);
48     GateRef NewGate(OpCode op, BitField bitfield, size_t numIns, const GateRef inList[], GateType type,
49                     MarkCode mark = MarkCode::NO_MARK);
50     GateRef NewGate(OpCode op, BitField bitfield, const std::vector<GateRef> &inList, GateType type,
51                     MarkCode mark = MarkCode::NO_MARK);
52     void PrintAllGates() const;
53     void PrintAllGates(BytecodeCircuitBuilder &builder) const;
54     [[nodiscard]] std::vector<GateRef> GetAllGates() const;
55     [[nodiscard]] static GateRef GetCircuitRoot(OpCode opcode);
56     void AdvanceTime() const;
57     void ResetAllGateTimeStamps() const;
58     [[nodiscard]] static GateRef NullGate();
59     [[nodiscard]] bool IsLoopHead(GateRef gate) const;
60     [[nodiscard]] bool IsSelector(GateRef gate) const;
61     [[nodiscard]] bool IsControlCase(GateRef gate) const;
62     [[nodiscard]] GateRef GetIn(GateRef gate, size_t idx) const;
63     [[nodiscard]] bool IsInGateNull(GateRef gate, size_t idx) const;
64     [[nodiscard]] bool IsFirstOutNull(GateRef gate) const;
65     [[nodiscard]] std::vector<GateRef> GetInVector(GateRef gate) const;
66     [[nodiscard]] std::vector<GateRef> GetOutVector(GateRef gate) const;
67     void NewIn(GateRef gate, size_t idx, GateRef in);
68     void ModifyIn(GateRef gate, size_t idx, GateRef in);
69     void DeleteIn(GateRef gate, size_t idx);
70     void DeleteGate(GateRef gate);
71     [[nodiscard]] GateId GetId(GateRef gate) const;
72     [[nodiscard]] BitField GetBitField(GateRef gate) const;
73     void Print(GateRef gate) const;
74     void SetOpCode(GateRef gate, OpCode opcode);
75     void SetGateType(GateRef gate, GateType type);
76     void SetMachineType(GateRef gate, MachineType machineType);
77     [[nodiscard]] OpCode GetOpCode(GateRef gate) const;
78     [[nodiscard]] TimeStamp GetTime() const;
79     [[nodiscard]] MarkCode GetMark(GateRef gate) const;
80     [[nodiscard]] GateType GetGateType(GateRef gate) const;
81     [[nodiscard]] MachineType GetMachineType(GateRef gate) const;
82     void SetMark(GateRef gate, MarkCode mark) const;
83     [[nodiscard]] bool Verify(GateRef gate) const;
84     [[nodiscard]] Gate *LoadGatePtr(GateRef shift);
85     [[nodiscard]] const Gate *LoadGatePtrConst(GateRef shift) const;
86     [[nodiscard]] GateRef SaveGatePtr(const Gate *gate) const;
87     [[nodiscard]] std::vector<uint8_t> GetDataSection() const;
88     void SetDataSection(const std::vector<uint8_t> &data);
89     [[nodiscard]] size_t GetCircuitDataSize() const;
90     [[nodiscard]] const void *GetSpaceDataStartPtrConst() const;
91     [[nodiscard]] const void *GetSpaceDataEndPtrConst() const;
92     [[nodiscard]] const uint8_t *GetDataPtrConst(size_t offset) const;
93     [[nodiscard]] uint8_t *GetDataPtr(size_t offset);
94     [[nodiscard]] size_t GetSpaceDataSize() const;
95     void SetSpaceDataSize(size_t sz);
96     panda::ecmascript::FrameType GetFrameType() const;
97     void SetFrameType(panda::ecmascript::FrameType type);
98 
99 private:
100     uint8_t *AllocateSpace(size_t gateSize);
101     Gate *AllocateGateSpace(size_t numIns);
102 
103 private:
104     std::vector<uint8_t> space_ {};
105     size_t circuitSize_;
106     size_t gateCount_;
107     TimeStamp time_;
108     std::vector<uint8_t> dataSection_ {};
109     panda::ecmascript::FrameType frameType_ {panda::ecmascript::FrameType::OPTIMIZED_FRAME};
110 };
111 }  // namespace panda::ecmascript::kungfu
112 
113 #endif  // ECMASCRIPT_COMPILER_CIRCUIT_H
114