// Copyright 2019 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include <stdio.h>

#include "iree/base/api.h"
#include "iree/base/internal/file_io.h"
#include "iree/schemas/bytecode_module_def_json_printer.h"
#include "iree/vm/bytecode_module.h"

// Today we just print to JSON. We could do something more useful (size
// analysis, etc), but JSON should be enough.
//
// We could also move all of this into iree-compile (mlir -> vmfb -> json),
// though having a tiny little tool not reliant on LLVM is nice (can run this
// on a device).
int main(int argc, char** argv) {
  if (argc < 2) {
    fprintf(stderr, "Syntax: iree-dump-module module.vmfb > module.json\n");
    return 1;
  }

  iree_file_contents_t* file_contents = NULL;
  IREE_CHECK_OK(iree_file_read_contents(argv[1], iree_allocator_system(),
                                        &file_contents));

  iree_const_byte_span_t flatbuffer_contents = iree_const_byte_span_empty();
  IREE_CHECK_OK(iree_vm_bytecode_module_parse_header(
      file_contents->const_buffer, &flatbuffer_contents,
      /*out_rodata_offset=*/NULL));

  // Print direct to stdout.
  flatcc_json_printer_t printer;
  flatcc_json_printer_init(&printer, /*fp=*/NULL);
  flatcc_json_printer_set_skip_default(&printer, true);
  bytecode_module_def_print_json(&printer,
                                 (const char*)flatbuffer_contents.data,
                                 flatbuffer_contents.data_length);
  flatcc_json_printer_clear(&printer);

  iree_file_contents_free(file_contents);

  return 0;
}
