Improve springbok bytecode and c module compilation

Improve springbok bytecode and c module compilation by taking advantage
of the latest upstream IREE improvements.

Merge springbok_bytecode_module and springbok_c_module into springbok_static_module and make it simpler.

Rename util to util_static for further vmvx expansion.

Change-Id: Ia81fb43f3bdab64372e0d9010211bddb39cce2b7
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 74835f8..d44e160 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -81,8 +81,7 @@
 set(IREE_ROOT_DIR "${IREE_SOURCE_DIR}" CACHE PATH "IREE Root directory")
 include(springbok_ops)
 
-include(springbok_bytecode_module)
-include(springbok_c_module)
+include(springbok_static_module)
 include(springbok_modules)
 include(iree_model_input)
 include(springbok_test)
diff --git a/cmake/springbok_bytecode_module.cmake b/cmake/springbok_bytecode_module.cmake
deleted file mode 100644
index 87ffc12..0000000
--- a/cmake/springbok_bytecode_module.cmake
+++ /dev/null
@@ -1,159 +0,0 @@
-include(CMakeParseArguments)
-
-# springbok_bytecode_module()
-#
-# A wrapper for the iree_bytecode_module to apply common iree-compile flags
-# Parameters:
-# NAME: Name of target.
-# SRC: Source file to compile into a bytecode module. Support relative path.
-# FLAGS: Flags to pass to the translation tool (list of strings).
-# C_IDENTIFIER: Identifier to use for generate c embed code.
-#     If omitted then no C embed code will be generated.
-# RVV_OFF: Indicate RVV is OFF (default: ON)
-#
-# Examples:
-# springbok_bytecode_module(
-#   NAME
-#     daredevel_bytecode_module_static
-#   SRC
-#     "daredevil_quant.tflite"
-#   C_IDENTIFIER
-#     "daredevil_bytecode_module_static"
-#   FLAGS
-#     "-iree-input-type=tosa"
-# )
-#
-# springbok_bytecode_module(
-#   NAME
-#     simple_float_mul_bytecode_module_static
-#   SRC
-#     "simple_float_mul.mlir"
-#   C_IDENTIFIER
-#     "simple_float_mul_bytecode_module_static"
-#   FLAGS
-#     "-iree-input-type=mhlo"
-#   RVV_OFF
-#   PUBLIC
-# )
-#
-function(springbok_bytecode_module)
-  cmake_parse_arguments(
-    _RULE
-    "PUBLIC;RVV_OFF"
-    "NAME;SRC;C_IDENTIFIER"
-    "FLAGS"
-    ${ARGN}
-  )
-
-  set(_MLIR_SRC "${_RULE_SRC}")
-  string(FIND "${_RULE_SRC}" ".tflite" _IS_TFLITE REVERSE)
-  if(${_IS_TFLITE} GREATER 0)
-    iree_get_executable_path(IREE_IMPORT_TFLITE_TOOL "iree-import-tflite")
-    set(_MLIR_SRC "${CMAKE_CURRENT_BINARY_DIR}/${_RULE_NAME}.mlir")
-    get_filename_component(_SRC_PATH "${_RULE_SRC}" REALPATH)
-    set(_ARGS "${_SRC_PATH}")
-    list(APPEND _ARGS "-o")
-    list(APPEND _ARGS "${_RULE_NAME}.mlir")
-    # Only add the custom_command here. The output is passed to
-    # iree_bytecode_module as the source.
-    add_custom_command(
-      OUTPUT
-        "${_RULE_NAME}.mlir"
-      COMMAND
-        ${IREE_IMPORT_TFLITE_TOOL}
-        ${_ARGS}
-      DEPENDS
-        ${IREE_IMPORT_TFLITE_TOOL}
-    )
-  endif()
-
-  get_filename_component(_MLIR_SRC "${_MLIR_SRC}" REALPATH)
-  iree_get_executable_path(_TRANSLATE_TOOL_EXECUTABLE "iree-compile")
-  iree_get_executable_path(_LINKER_TOOL_EXECUTABLE "lld")
-
-  # Replace dependencies passed by ::name with iree::package::name
-  iree_package_ns(_PACKAGE_NS)
-  list(TRANSFORM _RULE_DEPS REPLACE "^::" "${_PACKAGE_NS}::")
-
-  # Prefix the library with the package name, so we get: iree_package_name.
-  iree_package_name(_PACKAGE_NAME)
-
-  set(_LIB_NAME "${_PACKAGE_NAME}_${_RULE_NAME}")
-  set(_O_FILE_NAME ${_RULE_NAME}.o)
-  set(_H_FILE_NAME ${_RULE_NAME}.h)
-  set(_VMFB_FILE_NAME ${_RULE_NAME}.vmfb)
-
-  set(_CPU_FEATURES "+m,+f,+zvl512b,+zve32x")
-  if (${_RULE_RVV_OFF})
-    set(_CPU_FEATURES "+m,+f")
-  endif()
-
-  ## Example with VM C module.
-  # Setup args for iree-compile.
-  set(_TRANSLATE_ARGS ${_RULE_FLAGS})
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-debug-symbols=false")
-  list(APPEND _TRANSLATE_ARGS "-iree-vm-bytecode-module-strip-source-map=true")
-  list(APPEND _TRANSLATE_ARGS "-iree-vm-emit-polyglot-zip=false")
-  list(APPEND _TRANSLATE_ARGS "-iree-hal-target-backends=llvm-cpu")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-target-triple=riscv32-pc-linux-elf")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-target-cpu=generic-rv32")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-target-cpu-features=${_CPU_FEATURES}")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-target-abi=ilp32")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-link-embedded=false")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-link-static")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-system-linker-path=\"${_LINKER_TOOL_EXECUTABLE}\"")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-static-library-output-path=${_O_FILE_NAME}")
-  list(APPEND _TRANSLATE_ARGS "${_MLIR_SRC}")
-  list(APPEND _TRANSLATE_ARGS "-o")
-  list(APPEND _TRANSLATE_ARGS "${_VMFB_FILE_NAME}")
-
-  # Custom command for iree-compile to generate static library and C module.
-  add_custom_command(
-    OUTPUT
-      ${_H_FILE_NAME}
-      ${_O_FILE_NAME}
-      ${_VMFB_FILE_NAME}
-    COMMAND ${_TRANSLATE_TOOL_EXECUTABLE} ${_TRANSLATE_ARGS}
-    DEPENDS ${_TRANSLATE_TOOL_EXECUTABLE} ${_MLIR_SRC} ${_LINKER_TOOL_EXECUTABLE}
-  )
-
-  add_library(${_LIB_NAME}
-    STATIC
-    ${_O_FILE_NAME}
-  )
-
-  SET_TARGET_PROPERTIES(
-    ${_LIB_NAME}
-    PROPERTIES
-    LINKER_LANGUAGE C
-  )
-
-  # Alias the iree_package_name library to iree::package::name.
-  # This lets us more clearly map to Bazel and makes it possible to
-  # disambiguate the underscores in paths vs. the separators.
-  add_library(${_PACKAGE_NS}::${_RULE_NAME} ALIAS ${_LIB_NAME})
-  iree_package_dir(_PACKAGE_DIR)
-  if(${_RULE_NAME} STREQUAL ${_PACKAGE_DIR})
-    add_library(${_PACKAGE_NS} ALIAS ${_LIB_NAME})
-  endif()
-
-  set(_RULE_C_NAME "${_RULE_NAME}_c")
-  set(_H_FILE_NAME ${_RULE_C_NAME}.h)
-  set(_C_FILE_NAME ${_RULE_C_NAME}.c)
-
-  # Generate the embed data with the bytecode module
-  iree_c_embed_data(
-    NAME
-      "${_RULE_C_NAME}"
-    IDENTIFIER
-      "${_RULE_C_IDENTIFIER}"
-    GENERATED_SRCS
-      "${_VMFB_FILE_NAME}"
-    C_FILE_OUTPUT
-      "${_C_FILE_NAME}"
-    H_FILE_OUTPUT
-      "${_H_FILE_NAME}"
-    FLATTEN
-    PUBLIC
-  )
-endfunction()
diff --git a/cmake/springbok_c_module.cmake b/cmake/springbok_c_module.cmake
deleted file mode 100644
index bb9a53a..0000000
--- a/cmake/springbok_c_module.cmake
+++ /dev/null
@@ -1,153 +0,0 @@
-include(CMakeParseArguments)
-
-# springbok_c_module()
-#
-# A wrapper for the iree c module to apply common iree-compile flags
-# Parameters:
-# NAME: Name of target.
-# SRC: Source file to compile into an emitC module. Support relative path.
-# FLAGS: Flags to pass to the translation tool (list of strings).
-# C_IDENTIFIER: Identifier to use for generate c embed code.
-#     If omitted then no C embed code will be generated.
-# RVV_OFF: Indicate RVV is OFF (default: ON)
-#
-# Examples:
-# springbok_c_module(
-#   NAME
-#     dare_devel_c_module_emitc_static
-#   SRC
-#     "daredevil_quant.tflite"
-#   FLAGS
-#     "-iree-input-type=tosa"
-# )
-#
-# springbok_c_module(
-#   NAME
-#     simple_float_mul_c_module_emitc_static
-#   SRC
-#     "simple_float_mul.mlir"
-#   FLAGS
-#     "-iree-input-type=mhlo"
-#   RVV_OFF
-#   PUBLIC
-# )
-#
-function(springbok_c_module)
-  cmake_parse_arguments(
-    _RULE
-    "PUBLIC;RVV_OFF"
-    "NAME;SRC"
-    "FLAGS"
-    ${ARGN}
-  )
-
-  set(_MLIR_SRC "${_RULE_SRC}")
-  string(FIND "${_RULE_SRC}" ".tflite" _IS_TFLITE REVERSE)
-  if(${_IS_TFLITE} GREATER 0)
-    iree_get_executable_path(IREE_IMPORT_TFLITE_TOOL "iree-import-tflite")
-    set(_MLIR_SRC "${CMAKE_CURRENT_BINARY_DIR}/${_RULE_NAME}.mlir")
-    get_filename_component(_SRC_PATH "${_RULE_SRC}" REALPATH)
-    set(_ARGS "${_SRC_PATH}")
-    list(APPEND _ARGS "-o")
-    list(APPEND _ARGS "${_RULE_NAME}.mlir")
-    # Only add the custom_command here. The output is passed to
-    # iree_bytecode_module as the source.
-    add_custom_command(
-      OUTPUT
-        "${_RULE_NAME}.mlir"
-      COMMAND
-        ${IREE_IMPORT_TFLITE_TOOL}
-        ${_ARGS}
-      DEPENDS
-        ${IREE_IMPORT_TFLITE_TOOL}
-    )
-  endif()
-
-  get_filename_component(_MLIR_SRC "${_MLIR_SRC}" REALPATH)
-  iree_get_executable_path(_TRANSLATE_TOOL_EXECUTABLE "iree-compile")
-  iree_get_executable_path(_LINKER_TOOL_EXECUTABLE "lld")
-
-  # Replace dependencies passed by ::name with iree::package::name
-  iree_package_ns(_PACKAGE_NS)
-  list(TRANSFORM _RULE_DEPS REPLACE "^::" "${_PACKAGE_NS}::")
-
-  # Prefix the library with the package name, so we get: iree_package_name.
-  iree_package_name(_PACKAGE_NAME)
-
-  set(_RULE_C_NAME "${_RULE_NAME}_c")
-  set(_LIB_NAME "${_PACKAGE_NAME}_${_RULE_C_NAME}")
-  set(_O_FILE_NAME ${_RULE_C_NAME}.o)
-  set(_H_FILE_NAME ${_RULE_C_NAME}.h)
-  set(_RULE_EMITC_NAME "${_RULE_NAME}_emitc")
-  set(_EMITC_LIB_NAME "${_PACKAGE_NAME}_${_RULE_EMITC_NAME}")
-  set(_EMITC_FILE_NAME ${_RULE_EMITC_NAME}.h)
-
-  set(_CPU_FEATURES "+m,+f,+zvl512b,+zve32x")
-  if (${_RULE_RVV_OFF})
-    set(_CPU_FEATURES "+m,+f")
-  endif()
-
-  ## Example with VM C module.
-  # Setup args for iree-compile.
-  set(_TRANSLATE_ARGS ${_RULE_FLAGS})
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-debug-symbols=false")
-  list(APPEND _TRANSLATE_ARGS "-iree-mlir-to-vm-c-module")
-  list(APPEND _TRANSLATE_ARGS "-iree-hal-target-backends=llvm-cpu")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-target-triple=riscv32-pc-linux-elf")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-target-cpu=generic-rv32")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-target-cpu-features=${_CPU_FEATURES}")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-target-abi=ilp32")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-link-embedded=false")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-link-static")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-system-linker-path=\"${_LINKER_TOOL_EXECUTABLE}\"")
-  list(APPEND _TRANSLATE_ARGS "-iree-llvm-static-library-output-path=${_O_FILE_NAME}")
-  list(APPEND _TRANSLATE_ARGS "${_MLIR_SRC}")
-  list(APPEND _TRANSLATE_ARGS "-o")
-  list(APPEND _TRANSLATE_ARGS "${_EMITC_FILE_NAME}")
-
-  # Custom command for iree-compile to generate static library and C module.
-  add_custom_command(
-    OUTPUT
-      ${_H_FILE_NAME}
-      ${_O_FILE_NAME}
-      ${_EMITC_FILE_NAME}
-    COMMAND ${_TRANSLATE_TOOL_EXECUTABLE} ${_TRANSLATE_ARGS}
-    DEPENDS ${_TRANSLATE_TOOL_EXECUTABLE} ${_MLIR_SRC} ${_LINKER_TOOL_EXECUTABLE}
-  )
-
-  add_library(${_LIB_NAME}
-    STATIC
-    ${_O_FILE_NAME}
-  )
-
-  SET_TARGET_PROPERTIES(
-    ${_LIB_NAME}
-    PROPERTIES
-      LINKER_LANGUAGE C
-  )
-
-  add_library(${_EMITC_LIB_NAME}
-    STATIC
-    ${_EMITC_FILE_NAME}
-  )
-  target_compile_definitions(${_EMITC_LIB_NAME} PUBLIC EMITC_IMPLEMENTATION)
-
-  SET_TARGET_PROPERTIES(
-    ${_EMITC_LIB_NAME}
-    PROPERTIES
-      LINKER_LANGUAGE C
-  )
-
-  # Alias the iree_package_name library to iree::package::name.
-  # This lets us more clearly map to Bazel and makes it possible to
-  # disambiguate the underscores in paths vs. the separators.
-  add_library(${_PACKAGE_NS}::${_RULE_C_NAME} ALIAS ${_LIB_NAME})
-  add_library(${_PACKAGE_NS}::${_RULE_EMITC_NAME} ALIAS ${_EMITC_LIB_NAME})
-  iree_package_dir(_PACKAGE_DIR)
-  if(${_RULE_C_NAME} STREQUAL ${_PACKAGE_DIR})
-    add_library(${_PACKAGE_NS} ALIAS ${_LIB_NAME})
-  endif()
-  if(${_RULE_EMITC_NAME} STREQUAL ${_PACKAGE_DIR})
-    add_library(${_PACKAGE_NS} ALIAS ${_EMITC_LIB_NAME})
-  endif()
-endfunction()
diff --git a/cmake/springbok_modules.cmake b/cmake/springbok_modules.cmake
index d83be9e..1bb68ec 100644
--- a/cmake/springbok_modules.cmake
+++ b/cmake/springbok_modules.cmake
@@ -50,7 +50,7 @@
     set(_RVV_OFF_ARG "RVV_OFF")
   endif()
 
-  springbok_bytecode_module(
+  springbok_static_module(
     NAME
       "${_RULE_NAME}_bytecode_module_static"
     SRC
@@ -60,10 +60,9 @@
     FLAGS
       "${_RULE_FLAGS}"
     "${_RVV_OFF_ARG}"
-    PUBLIC
   )
 
-  springbok_c_module(
+  springbok_static_module(
     NAME
       "${_RULE_NAME}_c_module_static"
     SRC
@@ -71,7 +70,7 @@
     FLAGS
       "${_RULE_FLAGS}"
     "${_RVV_OFF_ARG}"
-    PUBLIC
+    EMITC
   )
 
 endfunction()
diff --git a/cmake/springbok_static_module.cmake b/cmake/springbok_static_module.cmake
new file mode 100644
index 0000000..52ca1d6
--- /dev/null
+++ b/cmake/springbok_static_module.cmake
@@ -0,0 +1,146 @@
+include(CMakeParseArguments)
+
+# springbok_static_module()
+#
+# A modified version of iree_static_linker_test to apply common iree-compile flags
+# Parameters:
+# NAME: Name of target.
+# SRC: Source file to compile into a bytecode module. Support relative path.
+# C_IDENTIFIER: Identifier to use for generate c embed code.
+# FLAGS: Flags to pass to the translation tool (list of strings).
+# RVV_OFF: Indicate RVV is OFF (default: ON)
+# EMITC: Uses EmitC to output C code instead of VM bytecode.
+#
+# Examples:
+# springbok_static_module(
+#   NAME
+#     daredevel_bytecode_module_static
+#   SRC
+#     "daredevil_quant.tflite"
+#   C_IDENTIFIER
+#     "daredevil_bytecode_module_static"
+#   FLAGS
+#     "-iree-input-type=tosa"
+# )
+#
+# springbok_static_module(
+#   NAME
+#     simple_float_mul_c_module_static
+#   SRC
+#     "simple_float_mul.mlir"
+#   C_IDENTIFIER
+#     "simple_float_mul"
+#   FLAGS
+#     "-iree-input-type=mhlo"
+#   RVV_OFF
+#   EMITC
+# )
+#
+function(springbok_static_module)
+  cmake_parse_arguments(
+    _RULE
+    "RVV_OFF;EMITC"
+    "NAME;SRC;C_IDENTIFIER"
+    "FLAGS"
+    ${ARGN}
+  )
+
+  set(_MLIR_SRC "${_RULE_SRC}")
+  string(FIND "${_RULE_SRC}" ".tflite" _IS_TFLITE REVERSE)
+  if(${_IS_TFLITE} GREATER 0)
+    iree_get_executable_path(IREE_IMPORT_TFLITE_TOOL "iree-import-tflite")
+    set(_MLIR_SRC "${CMAKE_CURRENT_BINARY_DIR}/${_RULE_NAME}.mlir")
+    get_filename_component(_SRC_PATH "${_RULE_SRC}" REALPATH)
+    set(_ARGS "${_SRC_PATH}")
+    list(APPEND _ARGS "-o")
+    list(APPEND _ARGS "${_RULE_NAME}.mlir")
+    # Only add the custom_command here. The output is passed to
+    # iree_bytecode_module as the source.
+    add_custom_command(
+      OUTPUT
+        "${_RULE_NAME}.mlir"
+      COMMAND
+        ${IREE_IMPORT_TFLITE_TOOL}
+        ${_ARGS}
+      DEPENDS
+        ${IREE_IMPORT_TFLITE_TOOL}
+    )
+  endif()
+
+  iree_get_executable_path(_COMPILER_TOOL "iree-compile")
+  iree_package_name(_PACKAGE_NAME)
+  iree_package_ns(_PACKAGE_NS)
+
+  set(_CPU_FEATURES "+m,+f,+zvl512b,+zve32x")
+  if (${_RULE_RVV_OFF})
+    set(_CPU_FEATURES "+m,+f")
+  endif()
+
+  # Set common iree-compile flags
+  set(_COMPILER_ARGS ${_RULE_FLAGS})
+  list(APPEND _COMPILER_ARGS "--iree-hal-target-backends=llvm-cpu")
+  list(APPEND _COMPILER_ARGS "-iree-llvm-debug-symbols=false")
+  list(APPEND _COMPILER_ARGS "-iree-vm-bytecode-module-strip-source-map=true")
+  list(APPEND _COMPILER_ARGS "-iree-vm-emit-polyglot-zip=false")
+  list(APPEND _COMPILER_ARGS "-iree-llvm-target-triple=riscv32-pc-linux-elf")
+  list(APPEND _COMPILER_ARGS "-iree-llvm-target-cpu=generic-rv32")
+  list(APPEND _COMPILER_ARGS "-iree-llvm-target-cpu-features=${_CPU_FEATURES}")
+  list(APPEND _COMPILER_ARGS "-iree-llvm-target-abi=ilp32")
+  list(APPEND _COMPILER_ARGS "-iree-llvm-link-embedded=false")
+
+  if(_RULE_EMITC)
+    set(_O_FILE_NAME "${_RULE_NAME}_c.o")
+    set(_H_FILE_NAME "${_RULE_NAME}_emitc.h")
+    set(_MODULE_NAME "${_RULE_NAME}_emitc")
+    iree_c_module(
+      NAME
+        ${_MODULE_NAME}
+      SRC
+        "${_MLIR_SRC}"
+      FLAGS
+        ${_COMPILER_ARGS}
+      H_FILE_OUTPUT
+        "${_H_FILE_NAME}"
+      STATIC_LIB_PATH
+        "${_O_FILE_NAME}"
+      NO_RUNTIME
+    )
+  else()  # bytecode module path
+    # Generate the embed data with the bytecode module.
+    set(_O_FILE_NAME "${_RULE_NAME}.o")
+    set(_H_FILE_NAME "${_RULE_NAME}.h")
+    set(_MODULE_NAME "${_RULE_NAME}")
+    if(NOT _RULE_C_IDENTIFIER)
+      set(_RULE_C_IDENTIFIER "${_PACKAGE_NAME}_${_RULE_NAME}")
+    endif()
+
+    iree_bytecode_module(
+      NAME
+        ${_MODULE_NAME}
+      SRC
+        "${_MLIR_SRC}"
+      FLAGS
+        ${_COMPILER_ARGS}
+      STATIC_LIB_PATH
+        "${_O_FILE_NAME}"
+      C_IDENTIFIER
+        "${_RULE_C_IDENTIFIER}"
+      PUBLIC
+    )
+  endif(_RULE_EMITC)
+
+  set(_NAME "${_RULE_NAME}_lib")
+  set(_LIB_NAME "${_PACKAGE_NAME}_${_NAME}")
+  add_library(${_LIB_NAME}
+    STATIC
+    ${_O_FILE_NAME}
+  )
+  SET_TARGET_PROPERTIES(
+    ${_LIB_NAME}
+    PROPERTIES
+    LINKER_LANGUAGE C
+  )
+
+  # Set alias for this static library to be used later in the function.
+  add_library(${_PACKAGE_NS}::${_NAME} ALIAS ${_LIB_NAME})
+endfunction()
diff --git a/model_util/CMakeLists.txt b/model_util/CMakeLists.txt
index 40c7118..ce3cae0 100644
--- a/model_util/CMakeLists.txt
+++ b/model_util/CMakeLists.txt
@@ -1,17 +1,15 @@
 iree_cc_library(
   NAME
-    util
+    util_base
   HDRS
     "util.h"
   SRCS
     "util.c"
   DEPS
     ::alloc
-    device::device_static_loader
     iree::base
     iree::hal
     iree::hal::local
-    iree::hal::local::loaders::static_library_loader
     iree::hal::drivers::local_sync::sync_driver
     iree::modules::hal
     iree::vm
@@ -20,6 +18,15 @@
 
 iree_cc_library(
   NAME
+    util_static
+  DEPS
+    ::util_base
+    device::device_static_loader
+    iree::hal::local::loaders::static_library_loader
+)
+
+iree_cc_library(
+  NAME
     alloc
   HDRS
     "alloc.h"
diff --git a/samples/microbenchmarks/CMakeLists.txt b/samples/microbenchmarks/CMakeLists.txt
index df7230b..ee7135a 100644
--- a/samples/microbenchmarks/CMakeLists.txt
+++ b/samples/microbenchmarks/CMakeLists.txt
@@ -4,7 +4,7 @@
 # https://github.com/llvm/llvm-project/blob/0eeab8b/llvm/lib/Target/RISCV/RISCVSubtarget.cpp#L30-L51
 # -------------------------------------------------------------------------------
 
-springbok_c_module(
+springbok_static_module(
   NAME
     conv1x1_test
   SRC
@@ -13,6 +13,7 @@
     "-iree-input-type=tosa"
     "-riscv-v-vector-bits-min=512"
     "-riscv-v-fixed-length-vector-lmul-max=8"
+  EMITC
   PUBLIC
 )
 
@@ -22,9 +23,9 @@
   SRCS
     "conv1x1_test.c"
   DEPS
-    ::conv1x1_test_c
     ::conv1x1_test_emitc
-    model_util::util
+    ::conv1x1_test_lib
+    model_util::util_static
   LINKOPTS
     "LINKER:--defsym=__stack_size__=64k"
   COPTS
diff --git a/samples/simple_vec_mul/CMakeLists.txt b/samples/simple_vec_mul/CMakeLists.txt
index c521d7f..6f46eca 100644
--- a/samples/simple_vec_mul/CMakeLists.txt
+++ b/samples/simple_vec_mul/CMakeLists.txt
@@ -50,10 +50,10 @@
   SRCS
     "float_vec.c"
   DEPS
-    ::simple_float_mul_bytecode_module_static
     ::simple_float_mul_bytecode_module_static_c
+    ::simple_float_mul_bytecode_module_static_lib
     iree::vm::bytecode_module
-    model_util::util
+    model_util::util_static
   LINKOPTS
     "LINKER:--defsym=__stack_size__=20k"
 )
@@ -64,9 +64,9 @@
   SRCS
     "float_vec.c"
   DEPS
-    ::simple_float_mul_c_module_static_c
     ::simple_float_mul_c_module_static_emitc
-    model_util::util
+    ::simple_float_mul_c_module_static_lib
+    model_util::util_static
   LINKOPTS
     "LINKER:--defsym=__stack_size__=20k"
   COPTS
@@ -79,10 +79,10 @@
   SRCS
     "int_vec.c"
   DEPS
-    ::simple_int_mul_bytecode_module_static
     ::simple_int_mul_bytecode_module_static_c
+    ::simple_int_mul_bytecode_module_static_lib
     iree::vm::bytecode_module
-    model_util::util
+    model_util::util_static
   LINKOPTS
     "LINKER:--defsym=__stack_size__=20k"
 )
@@ -93,9 +93,9 @@
   SRCS
     "int_vec.c"
   DEPS
-    ::simple_int_mul_c_module_static_c
     ::simple_int_mul_c_module_static_emitc
-    model_util::util
+    ::simple_int_mul_c_module_static_lib
+    model_util::util_static
   LINKOPTS
     "LINKER:--defsym=__stack_size__=20k"
   COPTS