main: Print the WGSL on reader/spirv error diagnostics

Just having a "error: blah" emitted without any additional context is not helpful without seeing the parsed SPIR-V as WGSL.

Change-Id: I6bf665f7fd3ce2637ec1ab020b2215f7fd5ee482
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/71603
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
This commit is contained in:
Ben Clayton 2021-12-03 16:19:53 +00:00 committed by Tint LUCI CQ
parent 3298625760
commit 2ec1393f31
1 changed files with 84 additions and 43 deletions

View File

@ -959,62 +959,103 @@ int main(int argc, const char** argv) {
std::unique_ptr<tint::Program> program; std::unique_ptr<tint::Program> program;
std::unique_ptr<tint::Source::File> source_file; std::unique_ptr<tint::Source::File> source_file;
#if TINT_BUILD_WGSL_READER
enum class InputFormat {
kUnknown,
kWgsl,
kSpirvBin,
kSpirvAsm,
};
auto input_format = InputFormat::kUnknown;
if (options.input_filename.size() > 5 && if (options.input_filename.size() > 5 &&
options.input_filename.substr(options.input_filename.size() - 5) == options.input_filename.substr(options.input_filename.size() - 5) ==
".wgsl") { ".wgsl") {
std::vector<uint8_t> data; input_format = InputFormat::kWgsl;
if (!ReadFile<uint8_t>(options.input_filename, &data)) { } else if (options.input_filename.size() > 4 &&
return 1; options.input_filename.substr(options.input_filename.size() - 4) ==
} ".spv") {
source_file = std::make_unique<tint::Source::File>( input_format = InputFormat::kSpirvBin;
options.input_filename, std::string(data.begin(), data.end())); } else if (options.input_filename.size() > 7 &&
program = std::make_unique<tint::Program>( options.input_filename.substr(options.input_filename.size() - 7) ==
tint::reader::wgsl::Parse(source_file.get())); ".spvasm") {
input_format = InputFormat::kSpirvAsm;
} }
#endif // TINT_BUILD_WGSL_READER
switch (input_format) {
case InputFormat::kUnknown: {
std::cerr << "Unknown input format" << std::endl;
return 1;
}
case InputFormat::kWgsl: {
#if TINT_BUILD_WGSL_READER
std::vector<uint8_t> data;
if (!ReadFile<uint8_t>(options.input_filename, &data)) {
return 1;
}
source_file = std::make_unique<tint::Source::File>(
options.input_filename, std::string(data.begin(), data.end()));
program = std::make_unique<tint::Program>(
tint::reader::wgsl::Parse(source_file.get()));
break;
#else
std::cerr << "Tint not built with the WGSL reader enabled" << std::endl;
return 1;
#endif // TINT_BUILD_WGSL_READER
}
case InputFormat::kSpirvBin: {
#if TINT_BUILD_SPV_READER #if TINT_BUILD_SPV_READER
// Handle SPIR-V binary input, in files ending with .spv std::vector<uint32_t> data;
if (options.input_filename.size() > 4 && if (!ReadFile<uint32_t>(options.input_filename, &data)) {
options.input_filename.substr(options.input_filename.size() - 4) == return 1;
".spv") { }
std::vector<uint32_t> data; program =
if (!ReadFile<uint32_t>(options.input_filename, &data)) { std::make_unique<tint::Program>(tint::reader::spirv::Parse(data));
break;
#else
std::cerr << "Tint not built with the SPIR-V reader enabled" << std::endl;
return 1; return 1;
}
program = std::make_unique<tint::Program>(tint::reader::spirv::Parse(data));
}
// Handle SPIR-V assembly input, in files ending with .spvasm
if (options.input_filename.size() > 7 &&
options.input_filename.substr(options.input_filename.size() - 7) ==
".spvasm") {
std::vector<char> text;
if (!ReadFile<char>(options.input_filename, &text)) {
return 1;
}
// Use Vulkan 1.1, since this is what Tint, internally, is expecting.
spvtools::SpirvTools tools(SPV_ENV_VULKAN_1_1);
tools.SetMessageConsumer([](spv_message_level_t, const char*,
const spv_position_t& pos, const char* msg) {
std::cerr << (pos.line + 1) << ":" << (pos.column + 1) << ": " << msg
<< std::endl;
});
std::vector<uint32_t> data;
if (!tools.Assemble(text.data(), text.size(), &data,
SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS)) {
return 1;
}
program = std::make_unique<tint::Program>(tint::reader::spirv::Parse(data));
}
#endif // TINT_BUILD_SPV_READER #endif // TINT_BUILD_SPV_READER
}
case InputFormat::kSpirvAsm: {
#if TINT_BUILD_SPV_READER
std::vector<char> text;
if (!ReadFile<char>(options.input_filename, &text)) {
return 1;
}
// Use Vulkan 1.1, since this is what Tint, internally, is expecting.
spvtools::SpirvTools tools(SPV_ENV_VULKAN_1_1);
tools.SetMessageConsumer([](spv_message_level_t, const char*,
const spv_position_t& pos, const char* msg) {
std::cerr << (pos.line + 1) << ":" << (pos.column + 1) << ": " << msg
<< std::endl;
});
std::vector<uint32_t> data;
if (!tools.Assemble(text.data(), text.size(), &data,
SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS)) {
return 1;
}
program =
std::make_unique<tint::Program>(tint::reader::spirv::Parse(data));
break;
#else
std::cerr << "Tint not built with the SPIR-V reader enabled" << std::endl;
return 1;
#endif // TINT_BUILD_SPV_READER
}
}
if (!program) { if (!program) {
std::cerr << "Failed to create reader for input file: " std::cerr << "Failed to parse input file: " << options.input_filename
<< options.input_filename << std::endl; << std::endl;
return 1; return 1;
} }
if (program->Diagnostics().count() > 0) { if (program->Diagnostics().count() > 0) {
if (!program->IsValid() && input_format != InputFormat::kWgsl) {
// Invalid program from a non-wgsl source. Print the WGSL, to help
// understand the diagnostics.
PrintWGSL(std::cout, *program);
}
diag_formatter.format(program->Diagnostics(), diag_printer.get()); diag_formatter.format(program->Diagnostics(), diag_printer.get());
} }