From d08bba579da7df36c51d987c04085628d81cb92f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20M=20G=C3=B3mez?= Date: Tue, 13 Feb 2024 07:08:46 +0000 Subject: [PATCH] [Backport 1.6] Itanium mangling scheme #23301 (#23302) --- compiler/ccgtypes.nim | 94 +++++++++++++-- compiler/ccgutils.nim | 6 +- compiler/cgendata.nim | 1 + tests/codegen/titaniummangle.nim | 192 +++++++++++++++++++++++++++++++ 4 files changed, 285 insertions(+), 8 deletions(-) create mode 100644 tests/codegen/titaniummangle.nim diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index ed6988d592..c9cc44dbce 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -35,14 +35,94 @@ proc mangleField(m: BModule; name: PIdent): string = if isKeyword(name): result.add "_0" + +proc encodeName*(name: string): string = + result = mangle(name) + result = $result.len & result + +proc makeUnique(m: BModule; s: PSym, name: string = ""): Rope = + let str = if name == "": s.name.s else: name + result.add str + result.add "__" + result.add m.g.graph.ifaces[s.itemId.module].uniqueName + result.add "_u" + result.add $s.itemId.item + +proc encodeSym*(m: BModule; s: PSym; makeUnique: bool = false): string = + #Module::Type + var name = s.name.s + if makeUnique: + name = $makeUnique(m, s, name) + "N" & encodeName(s.owner.name.s) & encodeName(name) & "E" + +proc elementType*(n: PType): PType {.inline.} = n.sons[^1] + +proc encodeType*(m: BModule; t: PType): string = + result = "" + var kindName = ($t.kind)[2..^1] + kindName[0] = toLower($kindName[0])[0] + case t.kind + of tyObject, tyEnum, tyDistinct, tyUserTypeClass, tyGenericParam: + result = encodeSym(m, t.sym) + of tyGenericInst, tyUserTypeClassInst, tyGenericBody: + result = encodeName(t[0].sym.name.s) + result.add "I" + for i in 1.. 1: #we dont care about the return param + for i in 1..