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)