saves/loads PSym guard, bitsize and alignment

This commit is contained in:
demotomohiro
2025-10-28 14:40:05 +09:00
parent 5eeede3a43
commit 51eccea910
4 changed files with 48 additions and 23 deletions

View File

@@ -89,30 +89,18 @@ proc fromNifSymDef(c: var DecodeContext; n: var Cursor): PSym =
let itemId = pool.integers[n.intId].int32
incExpect n, Ident
let ident = c.graph.cache.getIdent(pool.strings[n.litId])
incExpect n, {Ident, DotToken}
let flags = if n.kind == Ident: pool.strings[n.litId].parseSymFlags else: {}
incExpect n, IntLit
let disamb = pool.integers[n.intId].int32
incExpect n, ParLe
let kind = parseSymKind(pool.tags[n.tagId])
# TODO: add kind specific data
inc n
skipParRi n
expect n, {Ident, DotToken}
let flags = if n.kind == Ident: pool.strings[n.litId].parseSymFlags else: {}
inc n
var position = if kind == skModule:
c.fromNifModuleId(n)[0].int
else:
expect n, IntLit
let p = pool.integers[n.intId]
inc n
p
expect n, IntLit
let disamb = pool.integers[n.intId].int32
inc n
result = PSym(itemId: ItemId(module: itemIdModule.int32, item: itemId),
kind: kind,
name: ident,
flags: flags,
position: position,
disamb: disamb)
# PNode, PSym or PType type fields in PSym can have cycles.
@@ -122,6 +110,25 @@ proc fromNifSymDef(c: var DecodeContext; n: var Cursor): PSym =
assert nifItemId notin c.symbols
c.symbols[nifItemId] = result
case kind
of skLet, skVar, skField, skForVar:
result.guard = c.fromNifSymbol n
expect n, IntLit
result.bitsize = pool.integers[n.intId]
incExpect n, IntLit
result.alignment = pool.integers[n.intId]
inc n
else:
discard
skipParRi n
result.position = if kind == skModule:
c.fromNifModuleId(n)[0].int
else:
expect n, IntLit
let p = pool.integers[n.intId]
inc n
p
result.typ = c.fromNifType n
result.setOwner(c.fromNifSymbol n)

View File

@@ -52,15 +52,20 @@ proc toNifDef(c: var EncodeContext; sym: PSym) =
c.toNifModuleId sym.itemId.module
c.dest.addIntLit sym.itemId.item
c.dest.addIdent sym.name.s
c.dest.buildTree sym.kind.toNifTag:
# TODO: add kind specific data
discard
c.dest.writeFlags sym.flags
c.dest.addIntLit sym.disamb
c.dest.buildTree sym.kind.toNifTag:
case sym.kind
of skLet, skVar, skField, skForVar:
c.toNif sym.guard
c.dest.addIntLit sym.bitsize
c.dest.addIntLit sym.alignment
else:
discard
if sym.kind == skModule:
c.toNifModuleId sym.position
else:
c.dest.addIntLit sym.position
c.dest.addIntLit sym.disamb
c.toNif sym.typ
c.toNif sym.owner
c.dest.addIdent toNifTag(sym.loc.k)

View File

@@ -149,7 +149,20 @@ proc eql(x, y: PSym; c: var EqlContext): bool =
debug(y.owner)
result = false
else:
result = true
if x.kind in {skLet, skVar, skField, skForVar}:
if not eql(x.guard, y.guard, c):
echo "symbol guard mismatch"
result = false
elif x.bitsize != y.bitsize:
echo "symbol bitsize mismatch: ", x.bitsize, "/", y.bitsize
result = false
elif x.alignment != y.alignment:
echo "symbol alignment mismatch: ", x.alignment, "/", y.alignment
result = false
else:
result = true
else:
result = true
discard c.symStack.pop
proc eql(x, y: PType; c: var EqlContext): bool =

View File

@@ -1,3 +1,3 @@
#var exportcTest {.exportc.}: int
var exportcTest {.exportc.}: int
var importcTest {.importc.}: int
#var y* {.importc, header: "test.h".}: int
var y* {.importc, header: "test.h".}: int