Welcome to the main channel on the development of MoarVM, a virtual machine for NQP and Rakudo (moarvm.org). This channel is being logged for historical purposes.
Set by lizmat on 24 May 2021.
00:00 squashable6 left, linkable6 left, evalable6 left, Kaiepi left, gfldex left, rypervenche left, samcv left, japhb left, nine left, nine joined, linkable6 joined, evalable6 joined, squashable6 joined, rypervenche joined, Kaiepi joined, rypervenche left, rypervenche joined 00:02 samcv joined 00:04 reportable6 left 00:05 gfldex joined, japhb joined
[Coke] are we still using appveyor? 01:12
github.com/MoarVM/MoarVM/issues/697 01:13
Nicholas: you're our porter person, right? Is Illumos still a thing or is it dead? github.com/MoarVM/MoarVM/issues/306 01:17
02:05 reportable6 joined 02:23 squashable6 left 02:25 squashable6 joined 03:37 squashable6 left 03:40 squashable6 joined 06:02 reportable6 left 07:02 coverable6 left, nativecallable6 left, unicodable6 left, statisfiable6 left, notable6 left, sourceable6 left, evalable6 left, greppable6 left, quotable6 left, tellable6 left, benchable6 left, bisectable6 left, squashable6 left, releasable6 left, committable6 left, shareable6 left, bloatable6 left, linkable6 left, bloatable6 joined 07:04 benchable6 joined, tellable6 joined, sourceable6 joined 07:05 notable6 joined, committable6 joined, releasable6 joined
nine [Coke]: no it's all Azure Pipelines 07:17
08:03 unicodable6 joined
nine [Coke]++ # cleaning our issue queue 08:15
MasterDuke hm. looks like our expmod behavior isn't exactly the same as python's pow 08:18
m: say expmod(41, -1, 1) 08:25
camelia Error in mp_exptmod: Value out of range
in block <unit> at <tmp> line 1
MasterDuke both python's pow and Perl's Math::BigInt->bmodpow give 0
hm, but that error is coming directly from libtommath 08:27
nine m: say expmod(38, -1, 97) 08:30
camelia 23
nine Looks like at least in Python pow(41, -1, 1) results in undefined behaviour as the docs say "If mod is present and exp is negative, base must be relatively prime to mod." 08:31
MasterDuke but that gives 0, where other combinations throw `ValueError: base is not invertible for the given modulus` 08:33
m: say expmod(42, -1, 7) # like this 08:34
camelia Error in mp_exptmod: Value out of range
in block <unit> at <tmp> line 1
MasterDuke Math::BigInt give Nan for ^^^
i'm building the jvm backend right now to see what it gives for github.com/Raku/roast/blob/master/....t#L25-L36 08:36
nine WolframAlpha agrees that the result is 0 08:37
MasterDuke after the jvm builds i can switch to my gmp branch and see what it says
r: say expmod(42, -1, 1) 08:44
camelia Error in mp_exptmod: Value out of range
in block <unit> at <tmp> line 1
Can't open perl script "/home/camelia/rakudo-j-inst/bin/eval-client.pl": No such file or directory
MasterDuke right, that's why i built it locally. well, jvm backend gives 0
moarvm backend gives 0 with gmp 08:48
nine One more reason to switch to gmp :) 08:50
MasterDuke yeah. only that last windows 64bit vs 32bit bug to figure out... 08:52
it's annoying that you can't todo a test that throws 09:00
09:03 statisfiable6 joined, greppable6 joined
MasterDuke huh. why doesn't `#?rakudo.moar todo 'libtommath incorrectly errors and causes a throw instead of giving 0'; lives-ok { die if 42.expmod(-1,1) != 0 }, '42, -1, 1';` report at the end as a passing todo when i run with the gmp branch? 09:24
nine So far I've totally failed at reproducing a failure in t/spec/S12-methods/lastcall.t
dogbert17 hmm, that sounds like the bug I reported a few days ago 09:55
10:03 linkable6 joined, squashable6 joined
dogbert17 retries, the bug is still there but does not trigger as often as before 10:03
10:04 bisectable6 joined 10:05 nativecallable6 joined, shareable6 joined
nine I've also tried reroducing the failures in t/05-messages/10-warnings.t that CI showed in the new-special-return PR. Haven't managed to either. Though a normal run ended in a segfault. Sadly, systemd-coredump segfaulted as well trying to process that coredump :( 10:30
MasterDuke so the problem with github.com/MoarVM/MoarVM/issues/1223 is that at the point of the segv github.com/MoarVM/MoarVM/blob/mast...ame.c#L286 , env_size and work_size are 480080 and 480096 10:31
but the MVMCallsStackFrame was just created by MVM_callstack_allocate_frame, which takes MVMuint16s github.com/MoarVM/MoarVM/blob/mast...#L161-L162 10:33
nine Yeah, when reading about 60K variables, I figured it was some 16 bit issue
Thanks for confirming!
MasterDuke because an MVMFrame only has MVMuint16 allocd_work and allocd_env 10:34
but i don't know what the right fix is 10:35
nine Throwing an error, maybe in bytecode verification 10:36
MasterDuke we don't want to allow 60k variables? fwiw, perl runs that script in 2s 10:37
nine We definitely cannot have more than 2^16 registers, that's a fundamental limit of the bytecode format. 10:40
We probably could with a lot of effort support more than 2^16 lexicals. But we'd still have to make sure that we don't lower too many of them to locals. That sounds quite fragile to me 10:42
MasterDuke well, right now we don't support up to 2^16 lexicals. the script only has 60k 10:43
nine does it work with 40k? 10:44
I.e. is it a signedness issue as well?
MasterDuke nope, segv 10:46
after ~40s 10:47
same place 10:49
nine And 30k works? 10:50
MasterDuke segv 10:51
same place 10:52
nine What the? Does it work with 3 variables? :D
MasterDuke same segv with 20k 10:53
`malloc(): invalid size (unsorted)` with 16k 10:54
MVM_malloc -> MVM_string_latin1_decode -> MVM_cu_obtain_string -> MVM_cu_string -> MVM_interp_run 10:55
don't know why size is invalid, it's 7 10:56
f 7 10:58
different segv at 10k 11:02
11:04 evalable6 joined
MasterDuke 8k succeeds 11:04
lizmat
.oO( who would ever need more than 8K )
11:06
nine Oh, of course! allocd_work and allocd_env are sizes in bytes. So 8K locals * 8 bytes per register is quite close to 2^16 11:09
MasterDuke 3 different segvs. where's the best place to at least put some check and throw for now? 11:14
in deserialize_frames? keep a running count of something and throw if it gets too big? 11:17
Geth MoarVM/fix_segfault_on_many_lexicals: de4d2d4492 | (Stefan Seifert)++ | 6 files
Fix segfaults when a frame has more than 8192 locals

The bytecode format supports 2^16 locals in a frame. However the allocator used 16 bit numbers for sizes, i.e. bytes. Since a register is 8 bytes large, we could only allocate enough space for 2^13 registers. Fix by using 32 bit numbers for size calculations.
11:19
nine With this the 60k example succeeds. Going over 2^16 ends in "Annotation segment overflows end of stream" 11:21
MasterDuke that's nicer 11:22
what is the spesh_nodelay stuff?
nine Oh, that's unrelated. Good thing I pushed into a branch 11:23
When trying to reproduce those other bugs I thought that we could make nodelay configurable to get speshed versions between no information and really good statistics and provoke issues that way 11:24
Didn't help though. But it still could be useful
MasterDuke ah, yeah 11:26
Geth MoarVM/fix_segfault_on_many_lexicals: cadafe8ef2 | (Stefan Seifert)++ | 4 files
Fix segfaults when a frame has more than 8192 locals

The bytecode format supports 2^16 locals in a frame. However the allocator used 16 bit numbers for sizes, i.e. bytes. Since a register is 8 bytes large, we could only allocate enough space for 2^13 registers. Fix by using 32 bit numbers for size calculations.
nine Having reviewed the new allocation code really made ^^^ quite easy 11:27
11:27 nebuchadnezzar left
Geth MoarVM/fix_segfault_on_many_lexicals: 24392a32c2 | (Stefan Seifert)++ | 4 files
Fix segfaults when a frame has more than 8192 locals

The bytecode format supports 2^16 locals in a frame. However the allocator used 16 bit numbers for sizes, i.e. bytes. Since a register is 8 bytes large, we could only allocate enough space for 2^13 registers. Fix by using 32 bit numbers for size calculations.
Fixes GH #1223
11:32
MoarVM: niner++ created pull request #1588:
Fix segfaults when a frame has more than 8192 locals
dogbert17 nine++, you're on a roll 11:35
as far as the lastcall issue is concerned I have set: #define MVM_NURSERY_SIZE (20 * 1024) 11:39
12:03 coverable6 joined
nine not a single failure so far 12:30
Geth MoarVM/dispatcher-replace-arg-syscall: ed0c8ec068 | (Timo Paulssen)++ | 5 files
create MVM_callsite_replace_positional and use it
dogbert17 are you running: while MVM_SPESH_NODELAY=1 MVM_SPESH_BLOCKING=1 ./rakudo-m -Ilib --ll-exception t/spec/S12-methods/lastcall.t; do :; done 12:31
nine Yes, except for --ll-exception 12:32
dogbert17 bizarre, perhaps I have messed something up in my installation 12:33
Geth MoarVM/dispatcher-replace-arg-syscall: 68b8f429f4 | (Timo Paulssen)++ | src/disp/program.c
initialize vector to known size, MasterDuke17++
12:38
timo jnthnwrthngtn: as nine pointed out yesterday, we'll want to see if the MVM_callsite_* ops should all attempt an intern at the end of their operation, as their documentation comments suggest 12:40
dogbert17 k 4 - lastcall meant nextsame failed, no deferal happened
Can only use manipulate a capture known in this dispatch
in method doit at t/spec/S12-methods/lastcall.t line 39
in block <unit> at t/spec/S12-methods/lastcall.t line 46
timo with --ll-exception you'll also see the line of the dispatcher program where it happens 12:41
dogbert17 timo: all the data I have can be found here, github.com/MoarVM/MoarVM/issues/1580 12:42
timo can you tell me what's at gen/moar/BOOTSTRAP/v6c.nqp:5248 ? is it just the -> $capture { line? 12:44
dogbert17 5247 # us to handle `callwith`). 12:46
5248 -> $capture {
5249 # We put a sentinel value into the resume state in the case that we have
timo well, that's weird 12:47
getting the entire tree of captures could be potentially interesting here 12:48
but it should look trivial
the one track argument call that i can see in that block is the one that is called directly on $capture 12:50
MVM_dump_bytecode(tc) can give a tiny bit of insight 12:51
12:54 CaCode joined 13:02 quotable6 joined 13:03 reportable6 joined
[Coke] I am very surprised to find that some random bug I tickled last night that was in the queue for ages is now fixed. :) 13:06
nine++ MasterDuke++
Geth MoarVM: 24392a32c2 | (Stefan Seifert)++ | 4 files
Fix segfaults when a frame has more than 8192 locals

The bytecode format supports 2^16 locals in a frame. However the allocator used 16 bit numbers for sizes, i.e. bytes. Since a register is 8 bytes large, we could only allocate enough space for 2^13 registers. Fix by using 32 bit numbers for size calculations.
Fixes GH #1223
13:25
MoarVM: cbed18a68c | niner++ (committed using GitHub Web editor) | 4 files
Merge pull request #1588 from MoarVM/fix_segfault_on_many_lexicals

Fix segfaults when a frame has more than 8192 locals
MasterDuke [Coke]++ for testing old issues
13:26 linkable6 left 13:28 linkable6 joined
MasterDuke interesting, it looks like passing todo's in subtests aren't reported 13:31
14:05 CaCode left
nine MasterDuke: weird-errors is a good place for that test :) 14:09
MasterDuke heh, yeah, i wanted one that was marked slow and it also seemed appropriate 14:10
[Coke] :) 14:22
dogbert17 timo: do you want me to dump the bytecode from the breakpoint line, i.e. src/disp/program.c:677 14:27
MasterDuke huh. i did a perf record of that 60k variables script and the most expensive function was MVMHash_gc_mark 14:29
dogbert17 timo: gist.github.com/dogbert17/f81c6141...83ed2c1414 14:30
15:16 evalable6 left, linkable6 left, evalable6 joined 15:17 linkable6 joined 15:45 [Coke] left 15:50 [Coke] joined
timo the bytecode does show that it's literally passing the value of the first passed argument in that syscall 16:07
oh, whats in that variable? could it be NULL for some reason? 16:08
i think the syscall mechanism checks for that tho
18:02 reportable6 left 19:04 reportable6 joined 19:49 [Coke] left 20:13 [Coke] joined 20:55 rypervenche left 22:05 rypervenche joined 23:42 dogbert17 left 23:44 dogbert17 joined