14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_COMPILER_LOG_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_COMPILER_LOG_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include <algorithm>
204514f5e3Sopenharmony_ci#include <cstdint>
214514f5e3Sopenharmony_ci#include <iostream>
224514f5e3Sopenharmony_ci#include <map>
234514f5e3Sopenharmony_ci#include <set>
244514f5e3Sopenharmony_ci#include <sstream>
254514f5e3Sopenharmony_ci#include <string>
264514f5e3Sopenharmony_ci#include <vector>
274514f5e3Sopenharmony_ci#include <iomanip>
284514f5e3Sopenharmony_ci#include "ecmascript/log_wrapper.h"
294514f5e3Sopenharmony_ci#include "ecmascript/mem/clock_scope.h"
304514f5e3Sopenharmony_ci#include "ecmascript/mem/c_string.h"
314514f5e3Sopenharmony_ci#include "ecmascript/compiler/argument_accessor.h"
324514f5e3Sopenharmony_ci
334514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu {
344514f5e3Sopenharmony_ciclass AotMethodLogList;
354514f5e3Sopenharmony_ciclass MethodLogList;
364514f5e3Sopenharmony_ci
374514f5e3Sopenharmony_ciclass CompilerLog {
384514f5e3Sopenharmony_cipublic:
394514f5e3Sopenharmony_ci    explicit CompilerLog(const std::string &logOpt);
404514f5e3Sopenharmony_ci    CompilerLog() = default;
414514f5e3Sopenharmony_ci    ~CompilerLog() = default;
424514f5e3Sopenharmony_ci
434514f5e3Sopenharmony_ci    bool AllMethod() const
444514f5e3Sopenharmony_ci    {
454514f5e3Sopenharmony_ci        return allMethod_;
464514f5e3Sopenharmony_ci    }
474514f5e3Sopenharmony_ci
484514f5e3Sopenharmony_ci    bool CertainMethod() const
494514f5e3Sopenharmony_ci    {
504514f5e3Sopenharmony_ci        return cerMethod_;
514514f5e3Sopenharmony_ci    }
524514f5e3Sopenharmony_ci
534514f5e3Sopenharmony_ci    bool NoneMethod() const
544514f5e3Sopenharmony_ci    {
554514f5e3Sopenharmony_ci        return noneMethod_;
564514f5e3Sopenharmony_ci    }
574514f5e3Sopenharmony_ci
584514f5e3Sopenharmony_ci    bool OutputCIR() const
594514f5e3Sopenharmony_ci    {
604514f5e3Sopenharmony_ci        return outputCIR_;
614514f5e3Sopenharmony_ci    }
624514f5e3Sopenharmony_ci
634514f5e3Sopenharmony_ci    bool OutputLLIR() const
644514f5e3Sopenharmony_ci    {
654514f5e3Sopenharmony_ci        return outputLLIR_;
664514f5e3Sopenharmony_ci    }
674514f5e3Sopenharmony_ci
684514f5e3Sopenharmony_ci    bool OutputASM() const
694514f5e3Sopenharmony_ci    {
704514f5e3Sopenharmony_ci        return outputASM_;
714514f5e3Sopenharmony_ci    }
724514f5e3Sopenharmony_ci
734514f5e3Sopenharmony_ci    bool OutputType() const
744514f5e3Sopenharmony_ci    {
754514f5e3Sopenharmony_ci        return outputType_;
764514f5e3Sopenharmony_ci    }
774514f5e3Sopenharmony_ci
784514f5e3Sopenharmony_ci    bool GetEnableCompilerLogTime() const
794514f5e3Sopenharmony_ci    {
804514f5e3Sopenharmony_ci        return compilerLogTime_;
814514f5e3Sopenharmony_ci    }
824514f5e3Sopenharmony_ci
834514f5e3Sopenharmony_ci    void SetEnableCompilerLogTime(bool compilerLogTime)
844514f5e3Sopenharmony_ci    {
854514f5e3Sopenharmony_ci        compilerLogTime_ = compilerLogTime;
864514f5e3Sopenharmony_ci    }
874514f5e3Sopenharmony_ci
884514f5e3Sopenharmony_ci    bool GetEnableMethodLog() const
894514f5e3Sopenharmony_ci    {
904514f5e3Sopenharmony_ci        return enableMethodLog_;
914514f5e3Sopenharmony_ci    }
924514f5e3Sopenharmony_ci
934514f5e3Sopenharmony_ci    void SetEnableMethodLog(bool enableMethodLog)
944514f5e3Sopenharmony_ci    {
954514f5e3Sopenharmony_ci        enableMethodLog_ = enableMethodLog;
964514f5e3Sopenharmony_ci    }
974514f5e3Sopenharmony_ci
984514f5e3Sopenharmony_ci    bool EnableMethodCIRLog() const
994514f5e3Sopenharmony_ci    {
1004514f5e3Sopenharmony_ci        return GetEnableMethodLog() && OutputCIR();
1014514f5e3Sopenharmony_ci    }
1024514f5e3Sopenharmony_ci
1034514f5e3Sopenharmony_ci    bool EnableMethodASMLog() const
1044514f5e3Sopenharmony_ci    {
1054514f5e3Sopenharmony_ci        return GetEnableMethodLog() && OutputASM();
1064514f5e3Sopenharmony_ci    }
1074514f5e3Sopenharmony_ci
1084514f5e3Sopenharmony_ci    void SetMethodLog(const std::string &fileName, const std::string &methodName, AotMethodLogList *logList);
1094514f5e3Sopenharmony_ci    void SetStubLog(const std::string &stubName, MethodLogList *logList);
1104514f5e3Sopenharmony_ci    void AddCompiledMethod(const std::string& name, const CString& recordName);
1114514f5e3Sopenharmony_ci    void RemoveCompiledMethod(const std::string& name, const CString& recordName);
1124514f5e3Sopenharmony_ci    void Print() const;
1134514f5e3Sopenharmony_ci    void AddMethodTime(const std::string& name, uint32_t id, double time);
1144514f5e3Sopenharmony_ci    void AddPassTime(const std::string& name, double time);
1154514f5e3Sopenharmony_ci    int GetIndex();
1164514f5e3Sopenharmony_ci    void SetPGOMismatchResult(uint32_t &totalMethodCount, uint32_t &mismatchMethodCount,
1174514f5e3Sopenharmony_ci                              std::set<std::pair<std::string, CString>> &mismatchMethodSet);
1184514f5e3Sopenharmony_ci
1194514f5e3Sopenharmony_ci    std::map<std::string, int> nameIndex_;
1204514f5e3Sopenharmony_ci
1214514f5e3Sopenharmony_ciprivate:
1224514f5e3Sopenharmony_ci    static constexpr int RECORD_LENS = 64;
1234514f5e3Sopenharmony_ci    static constexpr int PASS_LENS = 32;
1244514f5e3Sopenharmony_ci    static constexpr int METHOD_LENS = 16;
1254514f5e3Sopenharmony_ci    static constexpr int OFFSET_LENS = 8;
1264514f5e3Sopenharmony_ci    static constexpr int PERCENT_LENS = 4;
1274514f5e3Sopenharmony_ci    static constexpr int TIME_LENS = 8;
1284514f5e3Sopenharmony_ci    static constexpr int MILLION_TIME = 1000;
1294514f5e3Sopenharmony_ci    static constexpr int HUNDRED_TIME = 100;
1304514f5e3Sopenharmony_ci
1314514f5e3Sopenharmony_ci    void PrintPassTime() const;
1324514f5e3Sopenharmony_ci    void PrintMethodTime() const;
1334514f5e3Sopenharmony_ci    void PrintTime() const;
1344514f5e3Sopenharmony_ci    void PrintCompiledMethod() const;
1354514f5e3Sopenharmony_ci    void PrintPGOMismatchedMethod() const;
1364514f5e3Sopenharmony_ci
1374514f5e3Sopenharmony_ci    int idx_ {0};
1384514f5e3Sopenharmony_ci    bool allMethod_ {false};
1394514f5e3Sopenharmony_ci    bool cerMethod_ {false};
1404514f5e3Sopenharmony_ci    bool noneMethod_ {false};
1414514f5e3Sopenharmony_ci    bool outputCIR_ {false};
1424514f5e3Sopenharmony_ci    bool outputLLIR_ {false};
1434514f5e3Sopenharmony_ci    bool outputASM_ {false};
1444514f5e3Sopenharmony_ci    bool outputType_ {false};
1454514f5e3Sopenharmony_ci    bool compilerLogTime_ {true};
1464514f5e3Sopenharmony_ci    bool enableMethodLog_ {false};
1474514f5e3Sopenharmony_ci    std::map<std::string, double> timePassMap_ {};
1484514f5e3Sopenharmony_ci    std::map<std::pair<uint32_t, std::string>, double> timeMethodMap_ {};
1494514f5e3Sopenharmony_ci    std::set<std::pair<std::string, CString>> compiledMethodSet_ {};
1504514f5e3Sopenharmony_ci    uint32_t totalPGOMethodCount_ {0};
1514514f5e3Sopenharmony_ci    uint32_t mismatchPGOMethodCount_ {0};
1524514f5e3Sopenharmony_ci    std::set<std::pair<std::string, CString>> mismatchPGOMethodSet_ {};
1534514f5e3Sopenharmony_ci};
1544514f5e3Sopenharmony_ci
1554514f5e3Sopenharmony_ciclass MethodLogList {
1564514f5e3Sopenharmony_cipublic:
1574514f5e3Sopenharmony_ci    explicit MethodLogList(const std::string &logMethods) : methods_(logMethods) {}
1584514f5e3Sopenharmony_ci    ~MethodLogList() = default;
1594514f5e3Sopenharmony_ci    bool IncludesMethod(const std::string &methodName) const;
1604514f5e3Sopenharmony_ciprivate:
1614514f5e3Sopenharmony_ci    std::string methods_ {};
1624514f5e3Sopenharmony_ci};
1634514f5e3Sopenharmony_ci
1644514f5e3Sopenharmony_ciclass AotMethodLogList : public MethodLogList {
1654514f5e3Sopenharmony_cipublic:
1664514f5e3Sopenharmony_ci    static const char fileSplitSign = ':';
1674514f5e3Sopenharmony_ci    static const char methodSplitSign = ',';
1684514f5e3Sopenharmony_ci
1694514f5e3Sopenharmony_ci    explicit AotMethodLogList(const std::string &logMethods) : MethodLogList(logMethods)
1704514f5e3Sopenharmony_ci    {
1714514f5e3Sopenharmony_ci        ParseFileMethodsName(logMethods);
1724514f5e3Sopenharmony_ci    }
1734514f5e3Sopenharmony_ci    ~AotMethodLogList() = default;
1744514f5e3Sopenharmony_ci
1754514f5e3Sopenharmony_ci    bool IncludesMethod(const std::string &fileName, const std::string &methodName) const;
1764514f5e3Sopenharmony_ci
1774514f5e3Sopenharmony_ciprivate:
1784514f5e3Sopenharmony_ci    std::vector<std::string> spiltString(const std::string &str, const char ch);
1794514f5e3Sopenharmony_ci    void ParseFileMethodsName(const std::string &logMethods);
1804514f5e3Sopenharmony_ci    std::map<std::string, std::vector<std::string>> fileMethods_ {};
1814514f5e3Sopenharmony_ci};
1824514f5e3Sopenharmony_ci
1834514f5e3Sopenharmony_ciclass TimeScope : public ClockScope {
1844514f5e3Sopenharmony_cipublic:
1854514f5e3Sopenharmony_ci    TimeScope(std::string name, std::string methodName, uint32_t methodOffset, CompilerLog* log);
1864514f5e3Sopenharmony_ci    TimeScope(std::string name, CompilerLog* log);
1874514f5e3Sopenharmony_ci    ~TimeScope();
1884514f5e3Sopenharmony_ci
1894514f5e3Sopenharmony_ciprivate:
1904514f5e3Sopenharmony_ci    static constexpr int PASS_LENS = 32;
1914514f5e3Sopenharmony_ci    static constexpr int METHOD_LENS = 16;
1924514f5e3Sopenharmony_ci    static constexpr int OFFSET_LENS = 8;
1934514f5e3Sopenharmony_ci    static constexpr int TIME_LENS = 8;
1944514f5e3Sopenharmony_ci    static constexpr int MILLION_TIME = 1000;
1954514f5e3Sopenharmony_ci
1964514f5e3Sopenharmony_ci    std::string name_ {""};
1974514f5e3Sopenharmony_ci    double startTime_ {0};
1984514f5e3Sopenharmony_ci    double timeUsed_ {0};
1994514f5e3Sopenharmony_ci    std::string methodName_ {""};
2004514f5e3Sopenharmony_ci    uint32_t methodOffset_ {0};
2014514f5e3Sopenharmony_ci    CompilerLog *log_ {nullptr};
2024514f5e3Sopenharmony_ci
2034514f5e3Sopenharmony_ci    const std::string GetShortName(const std::string& methodName);
2044514f5e3Sopenharmony_ci};
2054514f5e3Sopenharmony_ci
2064514f5e3Sopenharmony_ciclass PGOTypeLogList {
2074514f5e3Sopenharmony_cipublic:
2084514f5e3Sopenharmony_ci    explicit PGOTypeLogList(Circuit *circuit) : acc_(circuit) {}
2094514f5e3Sopenharmony_ci    ~PGOTypeLogList() = default;
2104514f5e3Sopenharmony_ci    void CollectGateTypeLogInfo(GateRef gate, bool isBinOp);
2114514f5e3Sopenharmony_ci    void PrintPGOTypeLog();
2124514f5e3Sopenharmony_ciprivate:
2134514f5e3Sopenharmony_ci    GateAccessor acc_;
2144514f5e3Sopenharmony_ci    std::string log_ {};
2154514f5e3Sopenharmony_ci};
2164514f5e3Sopenharmony_ci}  // namespace panda::ecmascript::kungfu
2174514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_COMPILER_LOG_H
218