Skip to content

Commit 03903f5

Browse files
committed
fixes
* properly fix memfiles * fix exit code on failed compile * type info fixes for deep copy et al * port some sink fixes from upstream
1 parent a079184 commit 03903f5

File tree

4 files changed

+72
-151
lines changed

4 files changed

+72
-151
lines changed

Nim

nlvm/llgen.nim

+69-29
Original file line numberDiff line numberDiff line change
@@ -2850,8 +2850,12 @@ proc genTypeInfoInit(
28502850
]
28512851

28522852
if isDefined(g.config, "nimSeqsV2"):
2853-
values.add(typeInfoV2)
2854-
2853+
values.add(
2854+
if typeInfoV2 == nil:
2855+
constNull(g.ptrTy)
2856+
else:
2857+
typeInfoV2
2858+
)
28552859
if isDefined(g.config, "nimTypeNames"):
28562860
var typename = typeToString(if t.typeInst != nil: t.typeInst else: t, preferName)
28572861
if typename == "ref object" and t.skipTypes(skipPtrs).sym != nil:
@@ -2864,6 +2868,7 @@ proc genTypeInfoInit(
28642868
proc genNodeInfo(g: LLGen, typ: PType): llvm.ValueRef
28652869
proc genObjectNodeInfo(g: LLGen, typ: PType, n: PNode, suffix: string): llvm.ValueRef
28662870
proc genTypeInfo(g: LLGen, typ: PType): llvm.ValueRef
2871+
proc genTypeInfoV1(g: LLGen, typ: PType, typeInfoV2: llvm.ValueRef = nil): llvm.ValueRef
28672872

28682873
proc constNimNodeNone(g: LLGen, length: int): llvm.ValueRef =
28692874
let
@@ -3003,12 +3008,16 @@ proc genObjectNodeInfoInit(
30033008
fields[i] = constNull(g.ptrTy) # ptr TNimNode
30043009

30053010
result = g.constNimNodeCase(
3006-
g.constOffsetOf(typ, tags), g.genTypeInfo(tags.typ), tags.name.s, variants, fields
3011+
g.constOffsetOf(typ, tags),
3012+
g.genTypeInfoV1(tags.typ),
3013+
tags.name.s,
3014+
variants,
3015+
fields,
30073016
)
30083017
of nkSym:
30093018
let field = n.sym
30103019
result = g.constNimNodeSlot(
3011-
g.constOffsetOf(typ, field), g.genTypeInfo(field.typ), field.name.s
3020+
g.constOffsetOf(typ, field), g.genTypeInfoV1(field.typ), field.name.s
30123021
)
30133022
else:
30143023
g.config.internalError(n.info, "genObjectNodeInfoInit")
@@ -3042,7 +3051,7 @@ proc genTupleNodeInfoInit(g: LLGen, t: PType): llvm.ValueRef =
30423051
constGEP2(g.llType(t), constNull(g.ptrTy), [g.gep0, g.constGEPIdx(i)]),
30433052
g.int64Ty,
30443053
)
3045-
fieldInit = g.constNimNodeSlot(offset, g.genTypeInfo(t.sons[i]), "Field" & $i)
3054+
fieldInit = g.constNimNodeSlot(offset, g.genTypeInfoV1(t.sons[i]), "Field" & $i)
30463055

30473056
field.setInitializer(fieldInit)
30483057
fields.add(field)
@@ -3145,7 +3154,7 @@ proc genNodeInfo(g: LLGen, typ: PType): llvm.ValueRef =
31453154

31463155
proc genTypeInfoV1Base(g: LLGen, typ: PType): llvm.ValueRef =
31473156
if typ.kind == tyArray:
3148-
g.genTypeInfo(typ[1])
3157+
g.genTypeInfoV1(typ[1])
31493158
elif typ.kind in {
31503159
tyUncheckedArray, tySequence, tyRef, tyPtr, tyRange, tySet, tyObject
31513160
} and typ.len > 0 and typ[0] != nil:
@@ -3158,7 +3167,7 @@ proc genTypeInfoV1Base(g: LLGen, typ: PType): llvm.ValueRef =
31583167
if typ.kind == tyPtr and base.kind == tyObject and incompleteType(base):
31593168
constNull(g.ptrTy)
31603169
else:
3161-
g.genTypeInfo(base)
3170+
g.genTypeInfoV1(base)
31623171
else:
31633172
constNull(g.ptrTy) # g.llMagicType("TNimType").pointerType().constNull()
31643173

@@ -3169,11 +3178,34 @@ proc genTypeInfoV1(
31693178
typ = typ.skipTypes(irrelevantForBackend + tyUserTypeClasses)
31703179
sig = hashType(typ, g.config)
31713180
if sig in g.typeInfos:
3181+
let ti = g.typeInfos[sig]
3182+
3183+
if typeInfoV2 != nil:
3184+
let init = getInitializer(ti)
3185+
if init.getAggregateElement(8).isNull() == llvm.True:
3186+
var values =
3187+
@[
3188+
init.getAggregateElement(0),
3189+
init.getAggregateElement(1),
3190+
init.getAggregateElement(2),
3191+
init.getAggregateElement(3),
3192+
init.getAggregateElement(4),
3193+
init.getAggregateElement(5),
3194+
init.getAggregateElement(6),
3195+
init.getAggregateElement(7),
3196+
init.getAggregateElement(8),
3197+
typeInfoV2,
3198+
]
3199+
3200+
if isDefined(g.config, "nimTypeNames"):
3201+
values.add init.getAggregateElement(10)
3202+
3203+
ti.setInitializer(llvm.constNamedStruct(init.typeOfX(), values))
31723204
return g.typeInfos[sig]
31733205

31743206
let name = ".typeinfo." & g.llName(typ, sig)
31753207

3176-
p("genTypeInfo", typ, g.depth + 1)
3208+
p("genTypeInfoV1", typ, g.depth + 1)
31773209

31783210
let
31793211
ntlt = g.llMagicType("TNimType")
@@ -3421,6 +3453,9 @@ proc llPassAsPtr(g: LLGen, s: PSym, retType: PType): bool =
34213453
if s.typ.sym != nil and sfForward in s.typ.sym.flags:
34223454
# forwarded objects are *always* passed by pointers for consistency!
34233455
true
3456+
elif s.typ.kind == tySink and
3457+
g.config.selectedGC notin {gcArc, gcAtomicArc, gcOrc, gcHooks}:
3458+
false
34243459
elif (optByRef in s.options) or
34253460
(getSize(g.config, pt) > g.config.target.floatSize * 3):
34263461
true # requested anyway
@@ -3562,7 +3597,7 @@ proc fieldIndexFields(
35623597

35633598
proc fieldIndex(g: LLGen, typ: PType, sym: PSym): seq[FieldPath] =
35643599
let
3565-
typ = typ.skipTypes(abstractInst)
3600+
typ = typ.skipTypes(skipPtrs)
35663601
ty = g.llType(typ)
35673602

35683603
assert typ.kind in {tyObject, tyTuple}, $typ
@@ -4015,7 +4050,7 @@ proc callIsObj(g: LLGen, v: llvm.ValueRef, typ: PType): llvm.ValueRef =
40154050

40164051
g.callCompilerProc("isObjDisplayCheck", [mtype, cmpTo, elem])
40174052
else:
4018-
let cmpTo = g.genTypeInfo(typ)
4053+
let cmpTo = g.genTypeInfoV1(typ)
40194054
g.callCompilerProc("isObj", [mtype, cmpTo])
40204055

40214056
# These are taken from cgen and take care of some of the fallout from the
@@ -4581,7 +4616,7 @@ proc genAssign(g: LLGen, typ: PType, dest, src, shallow: llvm.ValueRef) =
45814616
srcphi = g.withNotNilOrNull(seqlen, g.ptrTy):
45824617
if supportsCopyMem(elemTyp):
45834618
let srcc =
4584-
g.callCompilerProc("nimNewSeqOfCap", [g.genTypeInfo(typ), seqlen])
4619+
g.callCompilerProc("nimNewSeqOfCap", [g.genTypeInfoV1(typ), seqlen])
45854620
discard g.b.buildStore(seqlen, srcc)
45864621

45874622
let
@@ -4593,7 +4628,7 @@ proc genAssign(g: LLGen, typ: PType, dest, src, shallow: llvm.ValueRef) =
45934628
g.callMemcpy(destp, srcp, byteLen)
45944629
srcc
45954630
else:
4596-
let srcc = g.callCompilerProc("newSeq", [g.genTypeInfo(typ), seqlen])
4631+
let srcc = g.callCompilerProc("newSeq", [g.genTypeInfoV1(typ), seqlen])
45974632
if elemTyp.kind != tyEmpty:
45984633
g.withLoop(seqlen, "asgn.seq"):
45994634
let
@@ -4685,7 +4720,7 @@ proc callAssign(
46854720
if checkType and typ.kind == tyObject and not isObjLackingTypeField(typ):
46864721
let mtype = g.b.buildLoad2(g.ptrTy, src)
46874722
g.withNotNil(mtype):
4688-
discard g.callCompilerProc("chckObjAsgn", [mtype, g.genTypeInfo(typ)])
4723+
discard g.callCompilerProc("chckObjAsgn", [mtype, g.genTypeInfoV1(typ)])
46894724

46904725
if supportsCopyMem(typ): # Fast path
46914726
let size = g.constStoreSize(g.llType(typ))
@@ -6535,7 +6570,7 @@ proc rawGenNew(g: LLGen, dest: LLValue, sizeExpr: llvm.ValueRef, typ: PType) =
65356570
src = g.callCompilerProc("nimNewObj", [sizeExpr, alignExpr])
65366571
g.genRefAssign(dest, src)
65376572
else:
6538-
let ti = g.genTypeInfo(typ)
6573+
let ti = g.genTypeInfoV1(typ)
65396574
if dest.storage == OnHeap and usesWriteBarrier(g.config):
65406575
let destl = g.buildLoadValue(g.llType(refType), dest)
65416576
g.withNotNil(destl.v):
@@ -6607,7 +6642,7 @@ proc genMagicNewFinalize(g: LLGen, n: PNode) =
66076642
proc genNewSeqAux(g: LLGen, dest: LLValue, destTyp: PType, len: llvm.ValueRef) =
66086643
let
66096644
seqType = destTyp.skipTypes(abstractVarRange)
6610-
ti = g.genTypeInfo(seqType)
6645+
ti = g.genTypeInfoV1(seqType)
66116646
args = [ti, len]
66126647

66136648
if dest.storage == OnHeap and usesWriteBarrier(g.config):
@@ -6685,7 +6720,7 @@ proc genMagicNewSeqOfCap(g: LLGen, n: PNode): LLValue =
66856720
)
66866721
g.b.buildLoad2(ty, tmp)
66876722
else:
6688-
let ti = g.genTypeInfo(seqtype)
6723+
let ti = g.genTypeInfoV1(seqtype)
66896724
g.callCompilerProc("nimNewSeqOfCap", [ti, ax])
66906725

66916726
LLValue(v: v, storage: OnHeap)
@@ -7091,7 +7126,7 @@ proc genMagicEnumToStr(g: LLGen, n: PNode): LLValue =
70917126
LLValue(
70927127
v: g.callCompilerProc(
70937128
"reprEnum",
7094-
[g.buildTruncOrExt(ax, g.primitives[tyInt], typ), g.genTypeInfo(typ)],
7129+
[g.buildTruncOrExt(ax, g.primitives[tyInt], typ), g.genTypeInfoV1(typ)],
70957130
)
70967131
)
70977132

@@ -7492,7 +7527,7 @@ proc genMagicAppendSeqElem(g: LLGen, n: PNode) =
74927527
# old instance when it grows!
74937528
bx = g.genNode(n[2], g.loadAssignment(seqTyp.elemType))
74947529
a = g.b.buildLoad2(ty, ax.v)
7495-
newseq = g.callCompilerProc("incrSeqV3", [a, g.genTypeInfo(seqTyp)])
7530+
newseq = g.callCompilerProc("incrSeqV3", [a, g.genTypeInfoV1(seqTyp)])
74967531
tgt = LLValue(v: newseq, storage: OnHeap)
74977532
lenp = g.buildNimSeqLenGEP(tgt.v) # guaranteed not nil!
74987533
len = g.b.buildLoad2(g.primitives[tyInt], lenp)
@@ -7625,30 +7660,30 @@ proc genMagicRepr(g: LLGen, n: PNode): LLValue =
76257660
of tyEnum, tyOrdinal:
76267661
let ax = g.genNode(n[1], true).v
76277662
let a = g.buildTruncOrExt(ax, g.primitives[tyInt], t)
7628-
g.callCompilerProc("reprEnum", [a, g.genTypeInfo(t)])
7663+
g.callCompilerProc("reprEnum", [a, g.genTypeInfoV1(t)])
76297664
of tyString:
76307665
let ax = g.genNode(n[1], true).v
76317666
g.callCompilerProc("reprStr", [ax])
76327667
of tySet:
76337668
let ax = g.genNode(n[1], false).v
7634-
g.callCompilerProc("reprSet", [ax, g.genTypeInfo(t)])
7669+
g.callCompilerProc("reprSet", [ax, g.genTypeInfoV1(t)])
76357670
of tyOpenArray, tyVarargs:
76367671
let
76377672
ax = g.buildLoadVar(n[1].typ, g.genNode(n[1], false).v)
76387673
data = g.b.buildLoad2(g.ptrTy, g.buildOpenArrayDataGEP(ax))
76397674
len = g.b.buildLoad2(g.intTy, g.buildOpenArrayLenGEP(ax))
7640-
g.callCompilerProc("reprOpenArray", [data, len, g.genTypeInfo(t.elemType)])
7675+
g.callCompilerProc("reprOpenArray", [data, len, g.genTypeInfoV1(t.elemType)])
76417676
of tyCString, tyArray, tyUncheckedArray, tyRef, tyPtr, tyPointer, tyNil, tySequence:
76427677
let ax = g.genNode(
76437678
n[1], t.kind in {tyCString, tyRef, tyPtr, tyVar, tyPointer, tyLent, tySequence}
76447679
).v
7645-
g.callCompilerProc("reprAny", [ax, g.genTypeInfo(t)])
7680+
g.callCompilerProc("reprAny", [ax, g.genTypeInfoV1(t)])
76467681
of tyEmpty, tyVoid:
76477682
g.config.localError(n.info, "'repr' doesn't support 'void' type")
76487683
nil
76497684
else:
76507685
let ax = g.genNode(n[1], false).v
7651-
g.callCompilerProc("reprAny", [ax, g.genTypeInfo(t)])
7686+
g.callCompilerProc("reprAny", [ax, g.genTypeInfoV1(t)])
76527687
LLValue(v: v)
76537688

76547689
proc genMagicSetLengthStr(g: LLGen, n: PNode) =
@@ -7688,7 +7723,7 @@ proc genMagicSetLengthSeq(g: LLGen, n: PNode) =
76887723
ax.v
76897724
else:
76907725
g.b.buildLoad2(ty, ax.v)
7691-
x = g.callCompilerProc("setLengthSeqV2", [a, g.genTypeInfo(typ), bx])
7726+
x = g.callCompilerProc("setLengthSeqV2", [a, g.genTypeInfoV1(typ), bx])
76927727

76937728
g.genRefAssign(ax, x)
76947729

@@ -7755,7 +7790,12 @@ proc genMagicMove(g: LLGen, n: PNode, load: bool): LLValue =
77557790

77567791
g.buildStoreNull(ty, tmpx.v)
77577792
g.genObjectInit(n[1].typ, tmpx.v)
7758-
g.genAssignment(tmpx, g.maybeLoadValue(ty, ax, lx), n[1].typ, {})
7793+
let flags =
7794+
if not canMove(g, n[1]):
7795+
{needToCopy}
7796+
else:
7797+
{}
7798+
g.genAssignment(tmpx, g.maybeLoadValue(ty, ax, lx), n[1].typ, flags)
77597799
g.callReset(n[1].skipAddr.typ, ax)
77607800
g.maybeLoadValue(ty, tmpx, load)
77617801

@@ -7917,10 +7957,10 @@ proc genMagicDeepCopy(g: LLGen, n: PNode) =
79177957
case ty.kind
79187958
of tyPtr, tyRef, tyProc, tyTuple, tyObject, tyArray, tyUncheckedArray:
79197959
let bx = g.genNode(n[2], false).v
7920-
discard g.callCompilerProc("genericDeepCopy", [ax, bx, g.genTypeInfo(ty)])
7960+
discard g.callCompilerProc("genericDeepCopy", [ax, bx, g.genTypeInfoV1(ty)])
79217961
of tySequence, tyString:
79227962
let bx = g.genNode(n[2], true).v
7923-
discard g.callCompilerProc("genericSeqDeepCopy", [ax, bx, g.genTypeInfo(ty)])
7963+
discard g.callCompilerProc("genericSeqDeepCopy", [ax, bx, g.genTypeInfoV1(ty)])
79247964
of tyOpenArray, tyVarargs:
79257965
g.config.internalError(n.info, "todo")
79267966
of tySet:
@@ -8814,7 +8854,7 @@ proc genNodeBracketExpr(g: LLGen, n: PNode, load, prepareMutation: bool): LLValu
88148854
g.config.internalError(n.info, "Unhandled nodebracketexpr kind: " & $typ.kind)
88158855
LLValue()
88168856

8817-
proc genNodeDot(g: LLGen, n: PNode, load: bool): LLValue =
8857+
proc genNodeDotExpr(g: LLGen, n: PNode, load: bool): LLValue =
88188858
p("genDotExpr", n[1].sym, g.depth + 1)
88198859
let
88208860
v = g.genNode(n[0], false)
@@ -9885,7 +9925,7 @@ proc genNode(
98859925
of nkBracketExpr:
98869926
result = g.genNodeBracketExpr(n, load, prepareMutation)
98879927
of nkDotExpr:
9888-
result = g.genNodeDot(n, load)
9928+
result = g.genNodeDotExpr(n, load)
98899929
of nkCheckedFieldExpr:
98909930
result = g.genNodeCheckedField(n, load)
98919931
of nkDerefExpr, nkHiddenDeref:

nlvm/nlvm.nim

+2
Original file line numberDiff line numberDiff line change
@@ -397,3 +397,5 @@ conf.prefixDir = AbsoluteDir(tmp / "Nim")
397397
conf.searchPaths.insert(conf.prefixDir / RelativeDir"../nlvm-lib", 0)
398398

399399
handleCmdLine(cache, conf)
400+
401+
msgQuit(int8(conf.errorCounter > 0))

0 commit comments

Comments
 (0)