@effekt-lang/effekt 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/effekt +0 -0
- package/libraries/common/buffer.effekt +3 -3
- package/libraries/common/bytearray.effekt +64 -1
- package/libraries/common/effekt.effekt +45 -10
- package/libraries/common/heap.effekt +103 -0
- package/libraries/common/io/filesystem.effekt +49 -66
- package/libraries/common/io/network.effekt +8 -5
- package/libraries/common/json.effekt +30 -22
- package/libraries/common/map.effekt +992 -0
- package/libraries/common/regex.effekt +64 -0
- package/libraries/common/resizable_array.effekt +235 -0
- package/libraries/common/set.effekt +234 -0
- package/libraries/common/stream.effekt +47 -2
- package/libraries/common/string.effekt +7 -0
- package/libraries/common/stringbuffer.effekt +65 -0
- package/libraries/common/union_find.effekt +113 -0
- package/libraries/llvm/bytearray.c +36 -7
- package/libraries/llvm/forward-declare-c.ll +2 -0
- package/libraries/llvm/io.c +17 -43
- package/libraries/llvm/main.c +2 -1
- package/libraries/llvm/panic.c +20 -0
- package/libraries/llvm/rts.ll +141 -142
- package/licenses/eclipse public license, version 2.0 - epl-2.0.html +4 -4
- package/licenses/mit license - mit-license.html +82 -18
- package/licenses/the bsd license - bsd-license.html +81 -17
- package/licenses/the mit license - mit.html +81 -17
- package/package.json +1 -1
- package/libraries/chez/common/text/regex.effekt +0 -31
- package/libraries/js/text/regex.effekt +0 -33
- package/libraries/llvm/hole.c +0 -11
package/libraries/llvm/rts.ll
CHANGED
|
@@ -55,9 +55,6 @@
|
|
|
55
55
|
%ReturnAddress = type ptr
|
|
56
56
|
%FrameHeader = type { %ReturnAddress, %Sharer, %Eraser }
|
|
57
57
|
|
|
58
|
-
; Pointers for a heap allocated stack
|
|
59
|
-
%Memory = type { %StackPointer, %Base, %Limit }
|
|
60
|
-
|
|
61
58
|
; Unique address for each handler.
|
|
62
59
|
%Prompt = type ptr
|
|
63
60
|
|
|
@@ -74,7 +71,7 @@
|
|
|
74
71
|
; This is used for two purposes:
|
|
75
72
|
; - a refied first-class list of stacks (cyclic linked-list)
|
|
76
73
|
; - as part of an intrusive linked-list of stacks (meta stack)
|
|
77
|
-
%StackValue = type { %ReferenceCount, %
|
|
74
|
+
%StackValue = type { %ReferenceCount, %StackPointer, %Limit, %Prompt, %Stack }
|
|
78
75
|
|
|
79
76
|
|
|
80
77
|
|
|
@@ -146,7 +143,7 @@ define ccc %Neg @unbox(%Pos %input) {
|
|
|
146
143
|
; Prompts
|
|
147
144
|
|
|
148
145
|
define private %Prompt @currentPrompt(%Stack %stack) {
|
|
149
|
-
%prompt_pointer = getelementptr %StackValue,
|
|
146
|
+
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
|
|
150
147
|
%prompt = load %Prompt, ptr %prompt_pointer
|
|
151
148
|
ret %Prompt %prompt
|
|
152
149
|
}
|
|
@@ -256,21 +253,16 @@ define private ptr @getVarPointer(%Reference %reference, %Stack %stack) {
|
|
|
256
253
|
%offset = extractvalue %Reference %reference, 1
|
|
257
254
|
|
|
258
255
|
%targetStack = call %Stack @getStack(%Prompt %prompt)
|
|
259
|
-
%
|
|
260
|
-
%base = load %Base, ptr %base_pointer
|
|
261
|
-
%varPointer = getelementptr i8, %Base %base, i64 %offset
|
|
256
|
+
%varPointer = getelementptr i8, %Base %targetStack, i64 %offset
|
|
262
257
|
ret ptr %varPointer
|
|
263
258
|
}
|
|
264
259
|
|
|
265
260
|
define private %Reference @newReference(%Stack %stack) alwaysinline {
|
|
266
|
-
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
267
|
-
%base_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1, i32 1
|
|
268
|
-
|
|
261
|
+
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
269
262
|
%stackPointer = load %StackPointer, ptr %stackPointer_pointer
|
|
270
|
-
%base = load %StackPointer, ptr %base_pointer
|
|
271
263
|
|
|
272
264
|
%intStack = ptrtoint %StackPointer %stackPointer to i64
|
|
273
|
-
%intBase = ptrtoint %
|
|
265
|
+
%intBase = ptrtoint %Stack %stack to i64
|
|
274
266
|
|
|
275
267
|
%offset = sub i64 %intStack, %intBase
|
|
276
268
|
|
|
@@ -284,48 +276,62 @@ define private %Reference @newReference(%Stack %stack) alwaysinline {
|
|
|
284
276
|
|
|
285
277
|
; Stack management
|
|
286
278
|
|
|
287
|
-
define private %
|
|
288
|
-
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
289
|
-
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32
|
|
279
|
+
define private %Stack @checkLimit(%Stack %stack, i64 %n) alwaysinline {
|
|
280
|
+
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
281
|
+
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
|
|
290
282
|
|
|
291
283
|
%currentStackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !2
|
|
292
284
|
%limit = load %Limit, ptr %limit_pointer, !alias.scope !2
|
|
293
285
|
%nextStackPointer = getelementptr i8, %StackPointer %currentStackPointer, i64 %n
|
|
294
286
|
%isInside = icmp ule %StackPointer %nextStackPointer, %limit
|
|
295
|
-
br i1 %isInside, label %
|
|
287
|
+
br i1 %isInside, label %done, label %realloc
|
|
296
288
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
ret %StackPointer %currentStackPointer
|
|
289
|
+
done:
|
|
290
|
+
ret %Stack %stack
|
|
300
291
|
|
|
301
292
|
realloc:
|
|
302
|
-
%base_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1, i32 1
|
|
303
|
-
%base = load %Base, ptr %base_pointer, !alias.scope !2
|
|
304
|
-
|
|
305
293
|
%intStackPointer = ptrtoint %StackPointer %currentStackPointer to i64
|
|
306
|
-
%intBase = ptrtoint %
|
|
294
|
+
%intBase = ptrtoint %Stack %stack to i64
|
|
307
295
|
|
|
308
296
|
%size = sub i64 %intStackPointer, %intBase
|
|
309
297
|
%nextSize = add i64 %size, %n
|
|
310
298
|
%newSize = call i64 @nextPowerOfTwo(i64 %nextSize)
|
|
311
299
|
|
|
312
|
-
%
|
|
313
|
-
%newLimit = getelementptr i8, %Base %
|
|
314
|
-
%newStackPointer = getelementptr i8, %Base %
|
|
315
|
-
%newNextStackPointer = getelementptr i8, %StackPointer %newStackPointer, i64 %n
|
|
300
|
+
%newStack = call ptr @realloc(ptr %stack, i64 %newSize)
|
|
301
|
+
%newLimit = getelementptr i8, %Base %newStack, i64 %newSize
|
|
302
|
+
%newStackPointer = getelementptr i8, %Base %newStack, i64 %size
|
|
316
303
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
store %Limit %newLimit, ptr %limit_pointer, !alias.scope !2
|
|
304
|
+
%newStackPointer_pointer = getelementptr %StackValue, %Stack %newStack, i64 0, i32 1
|
|
305
|
+
%newLimit_pointer = getelementptr %StackValue, %Stack %newStack, i64 0, i32 2
|
|
320
306
|
|
|
321
|
-
|
|
307
|
+
store %StackPointer %newStackPointer, ptr %newStackPointer_pointer, !alias.scope !2
|
|
308
|
+
store %Limit %newLimit, ptr %newLimit_pointer, !alias.scope !2
|
|
309
|
+
|
|
310
|
+
%prompt_pointer = getelementptr %StackValue, %Stack %newStack, i64 0, i32 3
|
|
311
|
+
%prompt = load %Prompt, ptr %prompt_pointer
|
|
312
|
+
%promptStack = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
|
|
313
|
+
store %Stack %newStack, ptr %promptStack
|
|
314
|
+
|
|
315
|
+
ret %Stack %newStack
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
define private %StackPointer @stackAllocate(%Stack %stack, i64 %n) alwaysinline {
|
|
319
|
+
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
320
|
+
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
|
|
321
|
+
|
|
322
|
+
%currentStackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !2
|
|
323
|
+
%limit = load %Limit, ptr %limit_pointer, !alias.scope !2
|
|
324
|
+
%nextStackPointer = getelementptr i8, %StackPointer %currentStackPointer, i64 %n
|
|
325
|
+
|
|
326
|
+
store %StackPointer %nextStackPointer, ptr %stackPointer_pointer, !alias.scope !2
|
|
327
|
+
ret %StackPointer %currentStackPointer
|
|
322
328
|
}
|
|
323
329
|
|
|
324
330
|
define private %StackPointer @stackDeallocate(%Stack %stack, i64 %n) {
|
|
325
|
-
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
331
|
+
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
326
332
|
%stackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !2
|
|
327
333
|
|
|
328
|
-
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32
|
|
334
|
+
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
|
|
329
335
|
%limit = load %Limit, ptr %limit_pointer, !alias.scope !2
|
|
330
336
|
%isInside = icmp ule %StackPointer %stackPointer, %limit
|
|
331
337
|
call void @llvm.assume(i1 %isInside)
|
|
@@ -345,11 +351,11 @@ define private i64 @nextPowerOfTwo(i64 %x) {
|
|
|
345
351
|
}
|
|
346
352
|
|
|
347
353
|
define private void @assumeFrameHeaderWasPopped(%Stack %stack) alwaysinline {
|
|
348
|
-
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
354
|
+
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
349
355
|
%stackPointer = load %StackPointer, ptr %stackPointer_pointer, !alias.scope !2
|
|
350
356
|
%oldStackPointer = getelementptr %FrameHeader, %StackPointer %stackPointer, i64 1
|
|
351
357
|
|
|
352
|
-
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32
|
|
358
|
+
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
|
|
353
359
|
%limit = load %Limit, ptr %limit_pointer, !alias.scope !2
|
|
354
360
|
%isInside = icmp ule %StackPointer %oldStackPointer, %limit
|
|
355
361
|
call void @llvm.assume(i1 %isInside)
|
|
@@ -358,42 +364,30 @@ define private void @assumeFrameHeaderWasPopped(%Stack %stack) alwaysinline {
|
|
|
358
364
|
|
|
359
365
|
; Meta-stack management
|
|
360
366
|
|
|
361
|
-
define private %Memory @newMemory() {
|
|
362
|
-
%size = shl i64 1, 6
|
|
363
|
-
%stackPointer = call %StackPointer @malloc(i64 %size)
|
|
364
|
-
%limit = getelementptr i8, ptr %stackPointer, i64 %size
|
|
365
|
-
|
|
366
|
-
%memory.0 = insertvalue %Memory undef, %StackPointer %stackPointer, 0
|
|
367
|
-
%memory.1 = insertvalue %Memory %memory.0, %Base %stackPointer, 1
|
|
368
|
-
%memory.2 = insertvalue %Memory %memory.1, %Limit %limit, 2
|
|
369
|
-
|
|
370
|
-
ret %Memory %memory.2
|
|
371
|
-
}
|
|
372
|
-
|
|
373
367
|
define private %Stack @reset(%Stack %oldStack) {
|
|
374
368
|
|
|
375
369
|
%prompt = call %Prompt @freshPrompt()
|
|
376
370
|
|
|
377
|
-
%size =
|
|
371
|
+
%size = shl i64 1, 7
|
|
378
372
|
%stack = call ptr @malloc(i64 %size)
|
|
373
|
+
%stackPointer = getelementptr %StackValue, %Stack %stack, i64 1
|
|
374
|
+
%limit = getelementptr i8, ptr %stack, i64 %size
|
|
379
375
|
|
|
376
|
+
%stack.0 = insertvalue %StackValue zeroinitializer, %StackPointer %stackPointer, 1
|
|
377
|
+
%stack.1 = insertvalue %StackValue %stack.0, %Limit %limit, 2
|
|
378
|
+
%stack.2 = insertvalue %StackValue %stack.1, %Prompt %prompt, 3
|
|
379
|
+
%stack.3 = insertvalue %StackValue %stack.2, %Stack %oldStack, 4
|
|
380
380
|
|
|
381
|
-
%
|
|
381
|
+
store %StackValue %stack.3, %Stack %stack
|
|
382
382
|
|
|
383
|
-
%
|
|
384
|
-
|
|
385
|
-
%stack.2 = insertvalue %StackValue %stack.1, %Stack %oldStack, 3
|
|
386
|
-
|
|
387
|
-
store %StackValue %stack.2, %Stack %stack
|
|
388
|
-
|
|
389
|
-
%stack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
|
|
390
|
-
store %Stack %stack, ptr %stack_pointer
|
|
383
|
+
%promptStack = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
|
|
384
|
+
store %Stack %stack, ptr %promptStack
|
|
391
385
|
|
|
392
386
|
ret %Stack %stack
|
|
393
387
|
}
|
|
394
388
|
|
|
395
|
-
define private void @
|
|
396
|
-
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32
|
|
389
|
+
define private void @revalidate(%Stack %stack) {
|
|
390
|
+
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
|
|
397
391
|
%prompt = load %Prompt, ptr %prompt_pointer
|
|
398
392
|
%stack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
|
|
399
393
|
%promptStack = load %Stack, ptr %stack_pointer
|
|
@@ -408,26 +402,36 @@ continue:
|
|
|
408
402
|
br i1 %isOccupied, label %displace, label %update
|
|
409
403
|
|
|
410
404
|
displace:
|
|
411
|
-
call void @
|
|
405
|
+
call void @invalidate(%Stack %promptStack, %Stack %promptStack)
|
|
412
406
|
br label %update
|
|
413
407
|
|
|
414
408
|
update:
|
|
415
409
|
store %Stack %stack, ptr %stack_pointer
|
|
416
410
|
|
|
417
|
-
%next_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32
|
|
411
|
+
%next_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 4
|
|
418
412
|
%next = load %Stack, ptr %next_pointer
|
|
419
|
-
tail call void @
|
|
413
|
+
tail call void @revalidate(%Stack %next)
|
|
420
414
|
ret void
|
|
421
415
|
}
|
|
422
416
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
%
|
|
417
|
+
; This panics if we invalidate the meta stack
|
|
418
|
+
define private void @invalidate(%Stack %stack, %Stack %end) {
|
|
419
|
+
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
|
|
420
|
+
%next_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 4
|
|
426
421
|
%prompt = load %Prompt, ptr %prompt_pointer
|
|
427
422
|
%stack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
|
|
428
423
|
store %Stack null, ptr %stack_pointer
|
|
429
424
|
|
|
430
425
|
%next = load %Stack, ptr %next_pointer
|
|
426
|
+
|
|
427
|
+
%isNull = icmp eq %Stack %next, null
|
|
428
|
+
br i1 %isNull, label %error, label %check
|
|
429
|
+
|
|
430
|
+
error:
|
|
431
|
+
call void @duplicated_prompt()
|
|
432
|
+
ret void
|
|
433
|
+
|
|
434
|
+
check:
|
|
431
435
|
%isEnd = icmp eq %Stack %next, %end
|
|
432
436
|
br i1 %isEnd, label %done, label %continue
|
|
433
437
|
|
|
@@ -435,15 +439,15 @@ done:
|
|
|
435
439
|
ret void
|
|
436
440
|
|
|
437
441
|
continue:
|
|
438
|
-
tail call void @
|
|
442
|
+
tail call void @invalidate(%Stack %next, %Stack %end)
|
|
439
443
|
ret void
|
|
440
444
|
}
|
|
441
445
|
|
|
442
446
|
define private %Stack @resume(%Resumption %resumption, %Stack %oldStack) {
|
|
443
447
|
%uniqueResumption = call %Resumption @uniqueStack(%Resumption %resumption)
|
|
444
|
-
%rest_pointer = getelementptr %StackValue, %Resumption %uniqueResumption, i64 0, i32
|
|
448
|
+
%rest_pointer = getelementptr %StackValue, %Resumption %uniqueResumption, i64 0, i32 4
|
|
445
449
|
%start = load %Stack, ptr %rest_pointer
|
|
446
|
-
call void @
|
|
450
|
+
call void @revalidate(%Stack %start)
|
|
447
451
|
|
|
448
452
|
store %Stack %oldStack, ptr %rest_pointer
|
|
449
453
|
|
|
@@ -453,7 +457,7 @@ define private %Stack @resume(%Resumption %resumption, %Stack %oldStack) {
|
|
|
453
457
|
define private {%Resumption, %Stack} @shift(%Stack %stack, %Prompt %prompt) {
|
|
454
458
|
%resumpion_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
|
|
455
459
|
%resumption = load %Stack, ptr %resumpion_pointer
|
|
456
|
-
%next_pointer = getelementptr %StackValue, %Stack %resumption, i64 0, i32
|
|
460
|
+
%next_pointer = getelementptr %StackValue, %Stack %resumption, i64 0, i32 4
|
|
457
461
|
%next = load %Stack, ptr %next_pointer
|
|
458
462
|
|
|
459
463
|
store %Stack %stack, ptr %next_pointer
|
|
@@ -463,12 +467,6 @@ define private {%Resumption, %Stack} @shift(%Stack %stack, %Prompt %prompt) {
|
|
|
463
467
|
ret {%Resumption, %Stack} %result
|
|
464
468
|
}
|
|
465
469
|
|
|
466
|
-
define private void @eraseMemory(%Memory %memory) {
|
|
467
|
-
%stackPointer = extractvalue %Memory %memory, 0
|
|
468
|
-
call void @free(%StackPointer %stackPointer)
|
|
469
|
-
ret void
|
|
470
|
-
}
|
|
471
|
-
|
|
472
470
|
define private void @erasePrompt(%Prompt %prompt) alwaysinline {
|
|
473
471
|
%referenceCount_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 0
|
|
474
472
|
%referenceCount = load %ReferenceCount, ptr %referenceCount_pointer
|
|
@@ -493,18 +491,15 @@ define private void @sharePrompt(%Prompt %prompt) alwaysinline {
|
|
|
493
491
|
}
|
|
494
492
|
|
|
495
493
|
define private %Stack @underflowStack(%Stack %stack) {
|
|
496
|
-
%
|
|
497
|
-
%
|
|
498
|
-
%stackRest = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
|
|
494
|
+
%stackPrompt = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
|
|
495
|
+
%stackRest = getelementptr %StackValue, %Stack %stack, i64 0, i32 4
|
|
499
496
|
|
|
500
|
-
%memory = load %Memory, ptr %stackMemory
|
|
501
497
|
%prompt = load %Prompt, ptr %stackPrompt
|
|
502
498
|
%rest = load %Stack, ptr %stackRest
|
|
503
499
|
|
|
504
500
|
%promptStack_pointer = getelementptr %PromptValue, %Prompt %prompt, i64 0, i32 1
|
|
505
501
|
store %Stack null, ptr %promptStack_pointer
|
|
506
502
|
|
|
507
|
-
call void @eraseMemory(%Memory %memory)
|
|
508
503
|
call void @erasePrompt(%Prompt %prompt)
|
|
509
504
|
call void @free(%Stack %stack)
|
|
510
505
|
|
|
@@ -515,31 +510,41 @@ define private void @nop(%Stack %stack) {
|
|
|
515
510
|
ret void
|
|
516
511
|
}
|
|
517
512
|
|
|
518
|
-
define private %
|
|
519
|
-
%
|
|
520
|
-
%
|
|
521
|
-
|
|
513
|
+
define private %Stack @copyStack(%Stack %stack) alwaysinline {
|
|
514
|
+
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
515
|
+
%limit_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 2
|
|
516
|
+
|
|
517
|
+
%stackPointer = load %StackPointer, ptr %stackPointer_pointer
|
|
518
|
+
%limit = load %Limit, ptr %limit_pointer
|
|
522
519
|
|
|
523
520
|
%intStackPointer = ptrtoint %StackPointer %stackPointer to i64
|
|
524
|
-
%intBase = ptrtoint %
|
|
521
|
+
%intBase = ptrtoint %Stack %stack to i64
|
|
525
522
|
%intLimit = ptrtoint %Limit %limit to i64
|
|
526
523
|
%used = sub i64 %intStackPointer, %intBase
|
|
527
524
|
%size = sub i64 %intLimit, %intBase
|
|
528
525
|
|
|
529
|
-
%
|
|
530
|
-
%
|
|
531
|
-
%
|
|
532
|
-
%intNewLimit = add i64 %intNewBase, %size
|
|
533
|
-
%newStackPointer = inttoptr i64 %intNewStackPointer to %StackPointer
|
|
534
|
-
%newLimit = inttoptr i64 %intNewLimit to %Limit
|
|
526
|
+
%newStack = call ptr @malloc(i64 %size)
|
|
527
|
+
%newStackPointer = getelementptr i8, %Stack %newStack, i64 %used
|
|
528
|
+
%newLimit = getelementptr i8, %Stack %newStack, i64 %size
|
|
535
529
|
|
|
536
|
-
call void @memcpy(ptr %
|
|
530
|
+
call void @memcpy(ptr %newStack, ptr %stack, i64 %used)
|
|
537
531
|
|
|
538
|
-
%
|
|
539
|
-
%
|
|
540
|
-
%memory.2 = insertvalue %Memory %memory.1, %Limit %newLimit, 2
|
|
532
|
+
%newStackPointer_pointer = getelementptr %StackValue, %Stack %newStack, i64 0, i32 1
|
|
533
|
+
%newLimit_pointer = getelementptr %StackValue, %Stack %newStack, i64 0, i32 2
|
|
541
534
|
|
|
542
|
-
|
|
535
|
+
store %StackPointer %newStackPointer, ptr %newStackPointer_pointer
|
|
536
|
+
store %Limit %newLimit, ptr %newLimit_pointer
|
|
537
|
+
|
|
538
|
+
call void @shareFrames(%StackPointer %newStackPointer)
|
|
539
|
+
|
|
540
|
+
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
|
|
541
|
+
%prompt = load %Prompt, ptr %prompt_pointer
|
|
542
|
+
call void @sharePrompt(%Prompt %prompt)
|
|
543
|
+
|
|
544
|
+
%referenceCount_pointer = getelementptr %StackValue, %Stack %newStack, i64 0, i32 0
|
|
545
|
+
store i64 0, ptr %referenceCount_pointer
|
|
546
|
+
|
|
547
|
+
ret %Stack %newStack
|
|
543
548
|
}
|
|
544
549
|
|
|
545
550
|
|
|
@@ -556,53 +561,37 @@ done:
|
|
|
556
561
|
copy:
|
|
557
562
|
%newOldReferenceCount = sub %ReferenceCount %referenceCount, 1
|
|
558
563
|
store %ReferenceCount %newOldReferenceCount, ptr %referenceCount_pointer
|
|
559
|
-
%stack_pointer = getelementptr %StackValue, %Resumption %resumption, i64 0, i32 3
|
|
560
|
-
%stack = load %Stack, ptr %stack_pointer
|
|
561
|
-
|
|
562
|
-
%size = ptrtoint ptr getelementptr (%StackValue, ptr null, i64 1) to i64
|
|
563
|
-
%newHead = call ptr @malloc(i64 %size)
|
|
564
564
|
|
|
565
|
-
|
|
565
|
+
%firstCopy = call %Stack @copyStack(%Stack %resumption)
|
|
566
566
|
|
|
567
|
-
|
|
568
|
-
%
|
|
569
|
-
%newStack = phi %Stack [%newHead, %copy], [%nextNew, %next]
|
|
567
|
+
%stack_pointer = getelementptr %StackValue, %Resumption %resumption, i64 0, i32 4
|
|
568
|
+
%stack = load %Stack, ptr %stack_pointer
|
|
570
569
|
|
|
571
|
-
|
|
572
|
-
%stackPrompt = getelementptr %StackValue, %Stack %old, i64 0, i32 2
|
|
573
|
-
%stackRest = getelementptr %StackValue, %Stack %old, i64 0, i32 3
|
|
570
|
+
br label %check
|
|
574
571
|
|
|
575
|
-
|
|
576
|
-
%
|
|
577
|
-
%
|
|
572
|
+
check:
|
|
573
|
+
%current = phi %Stack [%stack, %copy], [%next, %loop]
|
|
574
|
+
%previousCopy = phi %Stack [%firstCopy, %copy], [%newCopy, %loop]
|
|
578
575
|
|
|
579
|
-
%
|
|
580
|
-
%newStackMemory = getelementptr %StackValue, %Stack %newStack, i64 0, i32 1
|
|
581
|
-
%newStackPrompt = getelementptr %StackValue, %Stack %newStack, i64 0, i32 2
|
|
582
|
-
%newStackRest = getelementptr %StackValue, %Stack %newStack, i64 0, i32 3
|
|
576
|
+
%rest_pointer = getelementptr %StackValue, %Stack %previousCopy, i64 0, i32 4
|
|
583
577
|
|
|
584
|
-
%
|
|
578
|
+
%isEnd = icmp eq %Stack %current, %resumption
|
|
579
|
+
br i1 %isEnd, label %stop, label %loop
|
|
585
580
|
|
|
586
|
-
|
|
587
|
-
call void @shareFrames(%StackPointer %newStackPointer)
|
|
581
|
+
loop:
|
|
588
582
|
|
|
589
|
-
call
|
|
583
|
+
%newCopy = call %Stack @copyStack(%Stack %current)
|
|
590
584
|
|
|
591
|
-
store %
|
|
592
|
-
store %Memory %newMemory, ptr %newStackMemory
|
|
593
|
-
store %Prompt %prompt, ptr %newStackPrompt
|
|
585
|
+
store %Stack %newCopy, ptr %rest_pointer
|
|
594
586
|
|
|
595
|
-
%
|
|
596
|
-
|
|
587
|
+
%next_pointer = getelementptr %StackValue, %Stack %current, i64 0, i32 4
|
|
588
|
+
%next = load %Stack, ptr %next_pointer
|
|
597
589
|
|
|
598
|
-
|
|
599
|
-
%nextNew = call ptr @malloc(i64 %size)
|
|
600
|
-
store %Stack %nextNew, ptr %newStackRest
|
|
601
|
-
br label %loop
|
|
590
|
+
br label %check
|
|
602
591
|
|
|
603
592
|
stop:
|
|
604
|
-
store %Stack %
|
|
605
|
-
ret %Stack %
|
|
593
|
+
store %Stack %firstCopy, ptr %rest_pointer
|
|
594
|
+
ret %Stack %firstCopy
|
|
606
595
|
}
|
|
607
596
|
|
|
608
597
|
define void @shareResumption(%Resumption %resumption) alwaysinline {
|
|
@@ -624,7 +613,7 @@ define void @eraseResumption(%Resumption %resumption) alwaysinline {
|
|
|
624
613
|
ret void
|
|
625
614
|
|
|
626
615
|
free:
|
|
627
|
-
%stack_pointer = getelementptr %StackValue, %Resumption %resumption, i64 0, i32
|
|
616
|
+
%stack_pointer = getelementptr %StackValue, %Resumption %resumption, i64 0, i32 4
|
|
628
617
|
%stack = load %Stack, ptr %stack_pointer
|
|
629
618
|
store %Stack null, ptr %stack_pointer
|
|
630
619
|
call void @eraseStack(%Stack %stack)
|
|
@@ -632,9 +621,9 @@ define void @eraseResumption(%Resumption %resumption) alwaysinline {
|
|
|
632
621
|
}
|
|
633
622
|
|
|
634
623
|
define void @eraseStack(%Stack %stack) alwaysinline {
|
|
635
|
-
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
636
|
-
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32
|
|
637
|
-
%rest_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32
|
|
624
|
+
%stackPointer_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
625
|
+
%prompt_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 3
|
|
626
|
+
%rest_pointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 4
|
|
638
627
|
|
|
639
628
|
%stackPointer = load %StackPointer, ptr %stackPointer_pointer
|
|
640
629
|
%prompt = load %Stack, ptr %prompt_pointer
|
|
@@ -650,7 +639,6 @@ clearPrompt:
|
|
|
650
639
|
br label %free
|
|
651
640
|
|
|
652
641
|
free:
|
|
653
|
-
call void @free(%Stack %stack)
|
|
654
642
|
call void @eraseFrames(%StackPointer %stackPointer)
|
|
655
643
|
call void @erasePrompt(%Prompt %prompt)
|
|
656
644
|
|
|
@@ -681,12 +669,23 @@ define private void @eraseFrames(%StackPointer %stackPointer) alwaysinline {
|
|
|
681
669
|
ret void
|
|
682
670
|
}
|
|
683
671
|
|
|
672
|
+
define private void @freeStack(%StackPointer %stackPointer) alwaysinline {
|
|
673
|
+
%base = getelementptr %StackValue, %StackPointer %stackPointer, i64 -1
|
|
674
|
+
call void @free(%Base %base)
|
|
675
|
+
ret void
|
|
676
|
+
}
|
|
677
|
+
|
|
684
678
|
; RTS initialization
|
|
685
679
|
|
|
686
680
|
define private tailcc void @topLevel(%Pos %val, %Stack %stack) {
|
|
687
681
|
%rest = call %Stack @underflowStack(%Stack %stack)
|
|
688
682
|
; rest holds global variables
|
|
689
|
-
call void @
|
|
683
|
+
call void @resume_Pos(%Stack %rest, %Pos %val)
|
|
684
|
+
ret void
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
define private tailcc void @globalsReturn(%Pos %val, %Stack %stack) {
|
|
688
|
+
%rest = call %Stack @underflowStack(%Stack %stack)
|
|
690
689
|
ret void
|
|
691
690
|
}
|
|
692
691
|
|
|
@@ -705,16 +704,16 @@ define private void @topLevelEraser(%Environment %environment) {
|
|
|
705
704
|
define private %Stack @withEmptyStack() {
|
|
706
705
|
%globals = call %Stack @reset(%Stack null)
|
|
707
706
|
|
|
708
|
-
%globalsStackPointer_pointer = getelementptr %StackValue, %Stack %globals, i64 0, i32 1
|
|
707
|
+
%globalsStackPointer_pointer = getelementptr %StackValue, %Stack %globals, i64 0, i32 1
|
|
709
708
|
%globalsStackPointer = load %StackPointer, ptr %globalsStackPointer_pointer
|
|
710
709
|
|
|
711
710
|
%returnAddressPointer.0 = getelementptr %FrameHeader, %StackPointer %globalsStackPointer, i64 0, i32 0
|
|
712
711
|
%sharerPointer.0 = getelementptr %FrameHeader, %StackPointer %globalsStackPointer, i64 0, i32 1
|
|
713
712
|
%eraserPointer.0 = getelementptr %FrameHeader, %StackPointer %globalsStackPointer, i64 0, i32 2
|
|
714
713
|
|
|
715
|
-
store ptr @
|
|
716
|
-
store ptr @
|
|
717
|
-
store ptr @
|
|
714
|
+
store ptr @globalsReturn, ptr %returnAddressPointer.0
|
|
715
|
+
store ptr @topLevelSharer, ptr %sharerPointer.0
|
|
716
|
+
store ptr @topLevelEraser, ptr %eraserPointer.0
|
|
718
717
|
|
|
719
718
|
%globalsStackPointer_2 = getelementptr %FrameHeader, %StackPointer %globalsStackPointer, i64 1
|
|
720
719
|
store %StackPointer %globalsStackPointer_2, ptr %globalsStackPointer_pointer
|
|
@@ -724,7 +723,7 @@ define private %Stack @withEmptyStack() {
|
|
|
724
723
|
%globalStack = getelementptr %PromptValue, %Prompt @global, i64 0, i32 1
|
|
725
724
|
store %Stack %stack, ptr %globalStack
|
|
726
725
|
|
|
727
|
-
%stackStackPointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
726
|
+
%stackStackPointer = getelementptr %StackValue, %Stack %stack, i64 0, i32 1
|
|
728
727
|
%stackPointer = load %StackPointer, ptr %stackStackPointer
|
|
729
728
|
|
|
730
729
|
%returnAddressPointer = getelementptr %FrameHeader, %StackPointer %stackPointer, i64 0, i32 0
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!doctype html><html lang=en><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>Eclipse Public License 2.0 (EPL) | The Eclipse Foundation</title><meta property="og:title" content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=twitter:title content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta property="og:description" content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=twitter:description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=author content="Wayne Beaton"><link href=/favicon.ico rel=icon type=image/x-icon><meta property="og:image" content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:image content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:card content="summary"><meta name=twitter:site content="@eclipsefdn"><meta name=twitter:creator content="@eclipsefdn"><meta property="og:url" content="https://www.eclipse.org/legal/epl-2.0/"><meta property="og:type" content="website"><meta property="og:site_name" content="Eclipse Foundation"><meta name=keywords content="epl,epl-2.0,legal,foundation,eclipse,eclipse public license,license,licenses"><meta name=generator content="Hugo 0.110.0"><link rel=canonical href=https://www.eclipse.org/legal/epl-2.0/><link rel=alternate href=/legal/epl-2.0/index.xml type=application/rss+xml title><link rel=stylesheet href="/public/css/styles.css?v=
|
|
1
|
+
<!doctype html><html lang=en><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>Eclipse Public License 2.0 (EPL) | The Eclipse Foundation</title><meta property="og:title" content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=twitter:title content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta property="og:description" content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=twitter:description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=author content="Wayne Beaton"><link href=/favicon.ico rel=icon type=image/x-icon><meta property="og:image" content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:image content="https://www.eclipse.org/images/logos/eclipse-foundation-400x400.png"><meta name=twitter:card content="summary"><meta name=twitter:site content="@eclipsefdn"><meta name=twitter:creator content="@eclipsefdn"><meta property="og:url" content="https://www.eclipse.org/legal/epl-2.0/"><meta property="og:type" content="website"><meta property="og:site_name" content="Eclipse Foundation"><meta name=keywords content="epl,epl-2.0,legal,foundation,eclipse,eclipse public license,license,licenses"><meta name=generator content="Hugo 0.110.0"><link rel=canonical href=https://www.eclipse.org/legal/epl-2.0/><link rel=alternate href=/legal/epl-2.0/index.xml type=application/rss+xml title><link rel=stylesheet href="/public/css/styles.css?v=1739128573"><script>(function(e,t,n,s,o){e[s]=e[s]||[],e[s].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var a=t.getElementsByTagName(n)[0],i=t.createElement(n),r=s!="dataLayer"?"&l="+s:"";i.async=!0,i.src="https://www.googletagmanager.com/gtm.js?id="+o+r,a.parentNode.insertBefore(i,a)})(window,document,"script","dataLayer","GTM-5WLCZXC")</script><script>var tableClasses="table"</script><link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel=stylesheet type=text/css></head><body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5WLCZXC" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript><a class=sr-only href=#content>Skip to main content</a><header class="header-wrapper header-wrapper" id=header><div class=header-toolbar><div class=container><div class=header-toolbar-row><div class="toolbar-btn toolbar-search-btn dropdown"><button class=dropdown-toggle id=toolbar-search type=button data-toggle=dropdown tabindex=0 aria-label=Search>
|
|
2
2
|
<i class="fa fa-search fa-lg" aria-role=none></i></button><div class="toolbar-search-bar-wrapper dropdown-menu dropdown-menu-right" aria-labelledby=toolbar-search><form action=https://www.eclipse.org/home/search method=get><div class=search-bar><input class=search-bar-input name=q placeholder=Search>
|
|
3
3
|
<button>
|
|
4
4
|
<i class="fa fa-search" type=submit></i></button></div></form></div></div><div class="toolbar-btn toolbar-user-menu-btn dropdown"><button class=dropdown-toggle id=toolbar-user-menu type=button data-toggle=dropdown tabindex=0 aria-label="User Menu">
|
|
@@ -55,7 +55,7 @@ open source software collaboration and innovation.</p></div><div class=mega-menu
|
|
|
55
55
|
<i class="fa-brands fa-youtube fa-stack-1x fa-inverse" aria-hidden=true></i>
|
|
56
56
|
<span class=sr-only>Youtube account</span></span></a></li><li><a class=link-unstyled href=https://www.linkedin.com/company/eclipse-foundation title="Linkedin account"><span class=fa-stack><i class="fa-solid fa-circle fa-stack-2x" aria-hidden=true></i>
|
|
57
57
|
<i class="fa-brands fa-linkedin-in fa-stack-1x fa-inverse" aria-hidden=true></i>
|
|
58
|
-
<span class=sr-only>Linkedin account</span></span></a></li></ul></div></div><div class="footer-sections row equal-height-md font-bold"><div class=col-md-15><div class=row><section id=footer-eclipse-foundation class="footer-section col-sm-8"><div class=menu-heading>Eclipse Foundation</div><ul class=nav><li><a href=https://www.eclipse.org/org/>About</a></li><li><a href=https://projects.eclipse.org/>Projects</a></li><li><a href=https://www.eclipse.org/collaborations/>Collaborations</a></li><li><a href=https://www.eclipse.org/membership/>Membership</a></li><li><a href=https://www.eclipse.org/sponsor/>Sponsor</a></li></ul></section><section id=footer-legal class="footer-section col-sm-8"><div class=menu-heading>Legal</div><ul class=nav><li><a href=https://www.eclipse.org/legal/privacy/>Privacy Policy</a></li><li><a href=https://www.eclipse.org/legal/terms-of-use/>Terms of Use</a></li><li><a href=https://www.eclipse.org/legal/compliance/>Compliance</a></li><li><a href=https://www.eclipse.org/org/documents/Community_Code_of_Conduct.php>Code of Conduct</a></li><li><a href=https://www.eclipse.org/legal/>Legal Resources</a></li><li><a class=toolbar-manage-cookies href=# onclick=event.preventDefault()>Manage Cookies</a></li></ul></section><section id=footer-more class="footer-section col-sm-8"><div class=menu-heading>More</div><ul class=nav><li><a href=https://www.eclipse.org/security/>Report a Vulnerability</a></li><li><a href=https://status.eclipse.org/>Service Status</a></li><li><a href=https://www.eclipse.org/org/foundation/contact.php>Contact Us</a></li><li><a href=https://www.eclipse.org/projects/support/>Support</a></li></ul></section></div></div><div id=footer-end class="footer-section col-md-8 col-md-offset-1 col-sm-24"><div class=footer-end-newsletter><form id=mc-embedded-subscribe-form action=https://
|
|
59
|
-
<
|
|
60
|
-
<
|
|
58
|
+
<span class=sr-only>Linkedin account</span></span></a></li></ul></div></div><div class="footer-sections row equal-height-md font-bold"><div class=col-md-15><div class=row><section id=footer-eclipse-foundation class="footer-section col-sm-8"><div class=menu-heading>Eclipse Foundation</div><ul class=nav><li><a href=https://www.eclipse.org/org/>About</a></li><li><a href=https://projects.eclipse.org/>Projects</a></li><li><a href=https://www.eclipse.org/collaborations/>Collaborations</a></li><li><a href=https://www.eclipse.org/membership/>Membership</a></li><li><a href=https://www.eclipse.org/sponsor/>Sponsor</a></li></ul></section><section id=footer-legal class="footer-section col-sm-8"><div class=menu-heading>Legal</div><ul class=nav><li><a href=https://www.eclipse.org/legal/privacy/>Privacy Policy</a></li><li><a href=https://www.eclipse.org/legal/terms-of-use/>Terms of Use</a></li><li><a href=https://www.eclipse.org/legal/compliance/>Compliance</a></li><li><a href=https://www.eclipse.org/org/documents/Community_Code_of_Conduct.php>Code of Conduct</a></li><li><a href=https://www.eclipse.org/legal/>Legal Resources</a></li><li><a class=toolbar-manage-cookies href=# onclick=event.preventDefault()>Manage Cookies</a></li></ul></section><section id=footer-more class="footer-section col-sm-8"><div class=menu-heading>More</div><ul class=nav><li><a href=https://www.eclipse.org/security/>Report a Vulnerability</a></li><li><a href=https://status.eclipse.org/>Service Status</a></li><li><a href=https://www.eclipse.org/org/foundation/contact.php>Contact Us</a></li><li><a href=https://www.eclipse.org/projects/support/>Support</a></li></ul></section></div></div><div id=footer-end class="footer-section col-md-8 col-md-offset-1 col-sm-24"><div class=footer-end-newsletter><form id=mc-embedded-subscribe-form action="https://eclipse.us6.list-manage.com/subscribe/post?u=eaf9e1f06f194eadc66788a85&id=e7538485cd&f_id=00f9c2e1f0" method=post novalidate target=_blank><label class=footer-end-newsletter-label for=email>Subscribe to our Newsletter</label><div class=footer-end-newsletter-input-wrapper><input class=footer-end-newsletter-input type=email id=email name=EMAIL autocomplete=email placeholder="Enter your email address">
|
|
59
|
+
<button class="footer-end-newsletter-submit btn btn-link" id=mc-embedded-subscribe type=submit name=subscribe>
|
|
60
|
+
<i class="fa fa-solid fa-envelope fa-lg" aria-hidden=true></i></button></div></form></div></div></div><div class="col-sm-24 margin-top-20"><div class=row><div id=copyright class=col-md-16><p id=copyright-text>Copyright © Eclipse Foundation AISBL. All Rights Reserved.</p></div></div></div><a href=# class=scrollup>Back to the top</a></div></footer><div id=footer-js><script src="/public/js/main.js?v1.0?v=1739128573"></script>
|
|
61
61
|
<script>(function(){})(jQuery,document)</script></div></body></html>
|