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