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