@@ -11,6 +11,10 @@ target triple = "x86_64--linux"
1111@main.sliceDstUntaint.buf = internal global [2 x i8 ] zeroinitializer
1212@main.sliceSrcTaint.buf = internal global [2 x i8 ] c "cd"
1313@main.sliceDstTaint.buf = internal global [2 x i8 ] zeroinitializer
14+ @main.sliceSrcExternal1.buf = external global [2 x i8 ]
15+ @main.sliceDstExternal1.buf = internal global [2 x i8 ] zeroinitializer
16+ @main.sliceSrcExternal2.buf = internal global [2 x i8 ] zeroinitializer
17+ @main.sliceDstExternal2.buf = external global [2 x i8 ]
1418
1519declare i64 @runtime.sliceCopy (ptr %dst , ptr %src , i64 %dstLen , i64 %srcLen , i64 %elemSize ) unnamed_addr
1620
@@ -58,6 +62,14 @@ entry:
5862 %sliceDstTaint.val = load i8 , ptr getelementptr inbounds (i8 , ptr @main.sliceDstTaint.buf , i32 0 )
5963 call void @runtime.printuint8 (i8 %sliceDstTaint.val )
6064
65+ ; print(sliceDstExternal1[0])
66+ %sliceDstExternal1.val = load i8 , ptr getelementptr inbounds (i8 , ptr @main.sliceDstExternal1.buf , i32 0 )
67+ call void @runtime.printuint8 (i8 %sliceDstExternal1.val )
68+
69+ ; print(sliceDstExternal2[0])
70+ %sliceDstExternal2.val = load i8 , ptr getelementptr inbounds (i8 , ptr @main.sliceDstExternal2.buf , i32 0 )
71+ call void @runtime.printuint8 (i8 %sliceDstExternal2.val )
72+
6173 ret void
6274}
6375
@@ -102,5 +114,11 @@ entry:
102114 call void @use (ptr @main.sliceSrcTaint.buf )
103115 %copy.n4 = call i64 @runtime.sliceCopy (ptr @main.sliceDstTaint.buf , ptr @main.sliceSrcTaint.buf , i64 2 , i64 2 , i64 1 )
104116
117+ ; Test that copying from or into external buffers works correctly.
118+ ; These copy operations must be done at runtime.
119+ ; https://github.com/tinygo-org/tinygo/issues/4895
120+ %copy.n5 = call i64 @runtime.sliceCopy (ptr @main.sliceDstExternal1.buf , ptr @main.sliceSrcExternal1.buf , i64 2 , i64 2 , i64 1 )
121+ %copy.n6 = call i64 @runtime.sliceCopy (ptr @main.sliceDstExternal2.buf , ptr @main.sliceSrcExternal2.buf , i64 2 , i64 2 , i64 1 )
122+
105123 ret void
106124}
0 commit comments