#include "spirv-tools/linter.hpp"
#include "source/lint/lints.h"
#include "source/opt/build_module.h"
#include "source/opt/ir_context.h"
#include "spirv-tools/libspirv.h"
#include "spirv-tools/libspirv.hpp"
namespace spvtools {
struct Linter::Impl {
explicit Impl(spv_target_env env) : target_env(env) {
message_consumer = [](spv_message_level_t , const char* ,
const spv_position_t& ,
const char* ) {};
}
spv_target_env target_env;
MessageConsumer message_consumer;
};
Linter::Linter(spv_target_env env) : impl_(new Impl(env)) {}
Linter::~Linter() {}
void Linter::SetMessageConsumer(MessageConsumer consumer) {
impl_->message_consumer = std::move(consumer);
}
const MessageConsumer& Linter::Consumer() const {
return impl_->message_consumer;
}
bool Linter::Run(const uint32_t* binary, size_t binary_size) {
std::unique_ptr<opt::IRContext> context =
BuildModule(SPV_ENV_VULKAN_1_2, Consumer(), binary, binary_size);
if (context == nullptr) return false;
bool result = true;
result &= lint::lints::CheckDivergentDerivatives(context.get());
return result;
}
}