From dbdf6e122c266df40c775844ef659fde5f5f1a4a Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Fri, 11 Sep 2015 11:56:09 -0400 Subject: [PATCH] Add option to change assembly syntax format in the dis tool. --- tools/dis/dis.cpp | 67 +++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/tools/dis/dis.cpp b/tools/dis/dis.cpp index 486a79cf..01ffbb66 100644 --- a/tools/dis/dis.cpp +++ b/tools/dis/dis.cpp @@ -27,15 +27,19 @@ #include #include +#include #include void print_usage(char *argv0) { printf( "Dissassemble a *.sv file into a *.svasm text file.\n\n" "USAGE: %s [options] \n\n" - " -o Set the output filename\n" - " -p Print dissassembly to stdout, this\n" - " overrides file output\n", + " --assembly-format=[assignment|canonical]\n" + " set decoded assembly syntax format\n" + " (default: assignment)\n" + " -o set the output filename\n" + " -p print dissassembly to stdout, this\n" + " overrides file output\n", argv0); } @@ -49,26 +53,42 @@ int main(int argc, char **argv) { const char *inFile = nullptr; const char *outFile = nullptr; + const char *assembly_format_prefix = "--assembly-format="; + spv_assembly_syntax_format_t format = SPV_ASSEMBLY_SYNTAX_FORMAT_DEFAULT; + for (int argi = 1; argi < argc; ++argi) { if ('-' == argv[argi][0]) { - switch (argv[argi][1]) { - case 'o': { - if (!outFile && argi + 1 < argc) { - outFile = argv[++argi]; - } else { - print_usage(argv[0]); - return 1; - } - } break; - case 'p': { - options |= SPV_BINARY_TO_TEXT_OPTION_PRINT; -#ifdef SPV_COLOR_TERMINAL - options |= SPV_BINARY_TO_TEXT_OPTION_COLOR; -#endif - } break; - default: + if (!strncmp(assembly_format_prefix, argv[argi], + strlen(assembly_format_prefix))) { + const char *parameter = argv[argi] + strlen(assembly_format_prefix); + if (!strcmp("canonical", parameter)) { + format = SPV_ASSEMBLY_SYNTAX_FORMAT_CANONICAL; + } else if (!strcmp("assignment", parameter)) { + format = SPV_ASSEMBLY_SYNTAX_FORMAT_ASSIGNMENT; + } else { print_usage(argv[0]); return 1; + } + } else { + switch (argv[argi][1]) { + case 'o': { + if (!outFile && argi + 1 < argc) { + outFile = argv[++argi]; + } else { + print_usage(argv[0]); + return 1; + } + } break; + case 'p': { + options |= SPV_BINARY_TO_TEXT_OPTION_PRINT; +#ifdef SPV_COLOR_TERMINAL + options |= SPV_BINARY_TO_TEXT_OPTION_COLOR; +#endif + } break; + default: + print_usage(argv[0]); + return 1; + } } } else { if (!inFile) { @@ -124,16 +144,17 @@ int main(int argc, char **argv) { spv_text text; spv_text *textOrNull = printOptionOn ? nullptr : &text; spv_diagnostic diagnostic = nullptr; - error = - spvBinaryToText(contents.data(), contents.size(), options, opcodeTable, - operandTable, extInstTable, textOrNull, &diagnostic); + error = spvBinaryToTextWithFormat(contents.data(), contents.size(), options, + opcodeTable, operandTable, extInstTable, + format, textOrNull, &diagnostic); spvCheck(error, spvDiagnosticPrint(diagnostic); spvDiagnosticDestroy(diagnostic); return error); // Output the result. if (!printOptionOn) { if (FILE *fp = fopen(outFile, "w")) { - size_t written = fwrite(text->str, sizeof(char), (size_t)text->length, fp); + size_t written = + fwrite(text->str, sizeof(char), (size_t)text->length, fp); if (text->length != written) { spvTextDestroy(text); fprintf(stderr, "error: could not write to file '%s'\n", outFile);