// RUN: iree-compile %s -iree-hal-target-backends=vmvx | custom-module-run - example.main | FileCheck %s

module @example {
  //===--------------------------------------------------------------------===//
  // Imports
  //===--------------------------------------------------------------------===//
  // External function declarations for the methods implemented in the custom
  // module C++ file. Note that they are prefixed with the `custom.` module
  // name.

  // Creates a new string with a copy of the given string data.
  // No NUL terminator is required.
  func.func private @custom.string.create(!util.buffer) -> !custom.string

  // Returns the length of the string in characters.
  func.func private @custom.string.length(!custom.string) -> index attributes {
    // Explicitly force the returned type to be i64 regardless of whether the
    // VM is in 32 or 64 bit mode and what conversion would make index.
    vm.signature = (!vm.ref<!custom.string>) -> i64
  }

  // Prints the contents of the string to stdout.
  func.func private @custom.string.print(!custom.string)

  // Prints the contents of the string only in debug mode and otherwise prints
  // "optimized".
  func.func private @custom.string.dprint(!custom.string) attributes {
    // Indicates the import is optional and if not present the specified
    // fallback method will be called instead.
    vm.fallback = @custom_string_dprint
  }
  func.func private @custom_string_dprint(%ignored: !custom.string) {
    // Called when the import is not available at runtime (in this case when the
    // runtime is compiled in release mode). This is a silly example but makes
    // it easier to test.
    %data = util.buffer.constant : !util.buffer = "optimized"
    %str = call @custom.string.create(%data) : (!util.buffer) -> !custom.string
    call @custom.string.print(%str) : (!custom.string) -> ()
    return
  }

  //===--------------------------------------------------------------------===//
  // Sample methods
  //===--------------------------------------------------------------------===//
  // Note that there can be any number of publicly-exported methods; this simple
  // sample just has one to keep things simple.

  // CHECK-LABEL: INVOKE BEGIN example.main
  func.func @main() {
    // Create string from a byte buffer encoding the characters.
    %hello_data = util.buffer.constant : !util.buffer = "hello"
    // CHECK-NEXT: CREATE hello
    %hello_str = call @custom.string.create(%hello_data) : (!util.buffer) -> !custom.string

    // Print the string to stdout.
    // CHECK-NEXT: PRINT hello
    call @custom.string.print(%hello_str) : (!custom.string) -> ()

    // Query the length of the string.
    // We don't do anything with it here but just demonstrate how index works.
    // CHECK-NEXT: LENGTH hello = 5
    %strlen = call @custom.string.length(%hello_str) : (!custom.string) -> index
    util.do_not_optimize(%strlen) : index

    // Print "debug" if the runtime is compiled in debug mode and otherwise
    // prints "optimized".
    // CHECK: PRINT {{debug|optimized}}
    %debug_data = util.buffer.constant : !util.buffer = "debug"
    %debug_str = call @custom.string.create(%debug_data) : (!util.buffer) -> !custom.string
    call @custom.string.dprint(%debug_str) : (!custom.string) -> ()

    return
  }
  // CHECK-NEXT: INVOKE END
}
