Take #3 as an example, you can hand-write codegenDecl about __attribute__((export_name("xxx"))

before C function declaration, or here defines a exportWasm macro similar to exportc pragma:

# nim
import std/macros
from std/strutils import `%`

proc exportWasmImpl(name: string; def: NimNode): NimNode =
  def.addPragma nnkExprColonExpr.newTree(ident"codegenDecl", newLit(
      "__attribute__((export_name(\\"" & name & "\\"))) $# $#$#"
  ))
  def.addPragma ident"exportc"
  def

proc nameStr(def: NimNode): string =
  let nameNode = def.name
  nameNode.expectKind {nnkIdent, nnkSym}
  # disallow backtick here
  nameNode.strVal

macro exportWasm*(nameStrNode; def): untyped =
  var namePat = nameStrNode.strVal
  let name = if '$' in namePat: namePat % def.nameStr
  else: namePat
  exportWasmImpl(name, def)

macro exportWasm*(def): untyped =
  runnnableExamples:
    proc f*{.exportWasm: "my_nim_$1".} = discard
    proc g*: int{.exportWasm.} = 1
  exportWasmImpl(def.nameStr, def)