Files
ark_js_runtime/ecmascript/compiler/pass.h
T
ding d8f0399789 Control whether to print compiler logs through JSRuntime Options
Add option log-compiled-methods to print the compiler(both stub and aot) in units of methods.

Add class CompilerLog.

Refactor some compiler logs.

Unie the log invoked way(COMPILER_LOG or COMPILER_OPTIONAL_LOG).

Signed-off-by: ding <dingding5@huawei.com>
Change-Id: I43ce61d0ba9d453713ab3e6349d07f6d9cde3e5e
2022-04-14 16:14:34 +08:00

115 lines
3.0 KiB
C++

/*
* Copyright (c) 2021 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ECMASCRIPT_COMPILER_PASS_H
#define ECMASCRIPT_COMPILER_PASS_H
#include "bytecode_circuit_builder.h"
#include "common_stubs.h"
#include "llvm_codegen.h"
#include "scheduler.h"
#include "slowpath_lowering.h"
#include "verifier.h"
namespace panda::ecmascript::kungfu {
class PassData {
public:
explicit PassData(Circuit* circuit) : circuit_(circuit) {}
virtual ~PassData() = default;
const ControlFlowGraph &GetScheduleResult() const
{
return cfg_;
}
void SetScheduleResult(const ControlFlowGraph &result)
{
cfg_ = result;
}
virtual Circuit* GetCircuit() const
{
return circuit_;
}
private:
Circuit* circuit_;
ControlFlowGraph cfg_;
};
template<typename T1>
class PassRunner {
public:
explicit PassRunner(T1* data, bool enableLog = false)
: data_(data), enableLog_(enableLog) {}
virtual ~PassRunner() = default;
template<typename T2, typename... Args>
bool RunPass(Args... args)
{
T2 pass;
return pass.Run(data_, enableLog_, std::forward<Args>(args)...);
}
private:
T1* data_;
bool enableLog_ {false};
};
class SlowPathLoweringPass {
public:
bool Run(PassData* data, bool enableLog, BytecodeCircuitBuilder *builder, CompilationConfig *cmpCfg)
{
SlowPathLowering lowering(builder, data->GetCircuit(), cmpCfg, enableLog);
lowering.CallRuntimeLowering();
return true;
}
};
class VerifierPass {
public:
bool Run(PassData* data, bool enableLog)
{
Verifier::Run(data->GetCircuit(), enableLog);
return true;
}
};
class SchedulingPass {
public:
bool Run(PassData* data, bool enableLog)
{
data->SetScheduleResult(Scheduler::Run(data->GetCircuit(), enableLog));
return true;
}
};
class LLVMIRGenPass {
public:
void CreateCodeGen(LLVMModule *module, bool enableLog)
{
llvmImpl_ = std::make_unique<LLVMIRGeneratorImpl>(module, enableLog);
}
bool Run(PassData *data, bool enableLog, LLVMModule *module, const JSMethod *method)
{
CreateCodeGen(module, enableLog);
CodeGenerator codegen(llvmImpl_);
codegen.Run(data->GetCircuit(), data->GetScheduleResult(), module->GetCompilationConfig(), method);
return true;
}
private:
std::unique_ptr<CodeGeneratorImpl> llvmImpl_ {nullptr};
};
} // namespace panda::ecmascript::kungfu
#endif