Skip to content

More precise typing of the C-- and Mach intermediate languages#115

Closed
xavierleroy wants to merge 5 commits intotrunkfrom
cmm-mach-types
Closed

More precise typing of the C-- and Mach intermediate languages#115
xavierleroy wants to merge 5 commits intotrunkfrom
cmm-mach-types

Conversation

@xavierleroy
Copy link
Contributor

This branch makes register typing at the C-- and Mach level more precise.

Benefits:

  • Safeguard against incorrect optimizations that break the GC interface.
  • Possibly smaller sets of roots communicated to the GC.
  • More opportunities for common subexpression elimination across allocation points.

What the branch does:

C-- variables and Mach registers are given types, which are currently one of:

Float a unboxed floating-point number
Int an integer or a pointer outside the heap
Addr anything else

The branch splits the Addr type into two types, Val for well-formed Caml values, Addr for derived pointers into the heap. In other words:

  • Val denotes a valid OCaml value: either a pointer to the beginning of a heap block, an infix pointer if it is preceded by the correct infix header, or a 2n+1 encoded integer.
  • Int is for integers (not necessarily 2n+1 encoded) and for pointers outside the heap.
  • Addr denotes pointers that are neither Val nor Int, i.e. pointers into the heap that point in the middle of a heap block. Such derived pointers are produced by e.g. array indexing.
  • Float is for unboxed floating-point numbers.

Concerning how variables and registers are tracked by the GC:

  • Variables of type Val are GC roots. If they are pointers, the GC will not deallocate the addressed heap block, and will update the variable if the heap block moves.
  • Variables of type Int or Float are ignored by the GC. The GC does not change their values.
  • Variables of type Addr must never be live across an allocation point or function call. (Compiler internal error.) They cannot be given as roots to the GC because they don't point after a well-formed block header of the kind that the GC needs. However, the GC may move the block pointed into, invalidating the value of the Addr variable.

To infer types more precisely, the branch splits the Word quantity (type memory_chunk) into Word_val (well-formed OCaml values, type Val) and Word_int (integer but not heap pointer, type Int). Values of type Addr are never stored into / loaded from main memory, hence there is no Word_addr quantity.

The Cmm language now has no less than three integer addition operators:

  • Caddi produces an integer or out-of-heap pointer (type Int)
  • Cadda produces a derived pointer into the heap (type Addr)
  • Caddv produces a pointer into the heap that is a well-formed Caml value (type Val)

The Csuba operator is unused, so I removed it.

The Cmmgen pass is updated to use Word_int/Word_val and Caddi/Cadda/Caddv appropriately. As a side benefit, some temporary values that point outside the heap (e.g. bigarray payloads) and that used to have type Addr now have the more precise type Int, telling the GC it does not have to track them.

The CSE pass is updated to prevent factorization of subexpressions of type Addr across allocation points (this breaks the GC, see PR#6484), but to keep factoring subexpressions of other types across allocation points. This should result in better CSE of e.g. array check bounds.

The Emit pass is updated with the new cmmtypes and memory_chunks, plus a check that no register of type Addr is live across allocation points.

- Register type "Addr" is split into
    . "Val" (well-formed OCaml values, appropriate as GC roots)
    . "Addr" (derived pointers within the heap, must not survive a GC)
- memory_chunk "Word" is split into
    . "Word_val" (OCaml value)
    . "Word_int" (native-sized integer, not a pointer into the heap)

Cmmgen was updated to use Word_val or Word_int as appropriate.

Application #1: fail at compile-time if a derived pointer within the heap
survives a GC point (cf. PR#6484).

Application #2: CSE can do a better job across allocation points
(keep factoring expressions of type Int, Val, Float, but not Addr).


git-svn-id: http://caml.inria.fr/svn/ocaml/branches/cmm-mach-types@15568 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
@chambart
Copy link
Contributor

chambart commented Nov 7, 2014

I've currently checked cmmgen and I'm globaly quite confident that (Word -> Word_int / Word_val) changes are corrects. I don't know enough of objects layout so I'm not certain for that part.

But there is a case for which I doubt: reading bigarrays should probably not be factorized across allocations: some ocaml code could run and change the content or even the size of a bigarray.

for instance in that function:

let f () =
  for i = 0 to Array1.dim a - 1 do
    let x = a.{i} in
    if x = 1
    then
      let _ = (1,i) in
      a.{i} <- a.{i} + 2
  done

The read of a.{i}, and the out-of-bound check is factorized across the allocation.
-dlinear:

camlBa_dim_across_alloc__f_1396:
  i/30[%rbx] := 1
  I/31[%rax] := "camlBa_dim_across_alloc"
  V/32[%rax] := val[I/31[%rax]]
  I/33[%rax] := int[V/32[%rax] + 40]
  bound/34[%rdi] := I/33[%rax]  * 2 + -1
  if i/30[%rbx] >s bound/34[%rdi] goto L100
  L101:
  I/35[%rax] := "camlBa_dim_across_alloc"
  ba/36[%rax] := val[I/35[%rax]]
  idx/37[%rsi] := i/30[%rbx]
  idx/37[%rsi] := idx/37[%rsi] >>s 1
  I/38[%rdx] := int[ba/36[%rax] + 40]
  I/38[%rdx] check > idx/37[%rsi]
  I/39[%rdx] := int[ba/36[%rax] + 8]
  I/40[%rcx] := int[I/39[%rdx] + idx/37[%rsi] * 8]
  I/41[%rcx] := I/41[%rcx] << 1
  x/42[%rcx] := x/42[%rcx] | 1
  if x/42[%rcx] !=s 3 goto L102
  {i/30[%rbx] bound/34[%rdi] idx/37[%rsi] I/39[%rdx] x/42[%rcx]}
  match/43[%rax] := alloc 24
  [match/43[%rax] + -8] := 2048 (init)
  [match/43[%rax]] := 3 (init)
  val[match/43[%rax] + 8] := i/30[%rbx] (init)
  I/57[%rcx] := I/57[%rcx] + 4
  I/58[%rcx] := I/58[%rcx] >>s 1
  val[I/48[%rdx] + idx/46[%rsi] * 8] := I/58[%rcx] (assign)
  L102:
  i/59[%rax] := i/30[%rbx]
  I/60[%rbx] := I/60[%rbx] + 2
  if i/59[%rax] !=s bound/34[%rdi] goto L101
  L100:
  V/61[%rax] := 1
  reload retaddr
  return R/0[%rax]

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be worth checking that arg2 is effectively of the expected type. That would catch early some kinds of bugs quite complicated to track.

@xavierleroy
Copy link
Contributor Author

Pierre (Chambart) is right that allocation can run arbitrary Caml code (signal handler, finalizer, context switch), hence CSE must not factor reads from mutable data structures across allocation points. For bigarrays, the sizes and pointer to payload are actually immutable and would be safe to factor out, but the contents are of course mutable and must not be factored. Since C-- and Mach do not distinguish (yet!) immutable/mutable memory reads, it means that CSE must forget all equations involving memory reads, just like for memory stores. I'll update the branch.

@chambart
Copy link
Contributor

chambart commented Nov 7, 2014

I've seen libraries that allocates data outside of the OCaml heap that have some kind of explicit deallocation implemented by setting the bigarray pointer to NULL and the size to 0.

If this pattern is forbidden it should be explicitly documented.

@dbuenzli
Copy link
Contributor

dbuenzli commented Nov 7, 2014

Le vendredi, 7 novembre 2014 à 14:28, Pierre Chambart a écrit :

I've seen libraries that allocates data outside of the OCaml heap that have some kind of explicit deallocation implemented by setting the bigarray pointer to NULL and the size to 0.
If this pattern is forbidden it should be explicitly documented.

FWIW I remember having done this in unpublished bindings to OpenGL gl{Map,Unmap}Buffer functions which allows to map GPU memory. I would do exactly what you described on glUnmapBuffer so that if the programmer would try to access the buffer after unmapping an index out of bound would be raised rather than lead to abrubt program terminatino. But this code is unused and the published tgls bindings using ctypes don't do that (they expect the client not to do wrong thing).

Best,

Daniel

@alainfrisch
Copy link
Contributor

If this pattern is forbidden it should be explicitly documented.

I can only confirm that I consider this an important property, since it could allow lifting bound checks (and some indirection) out of loops, or removing some of them as in:

   a.{i} <- f a.{i}

@gasche
Copy link
Member

gasche commented Jul 26, 2015

During the last developer meeting it was decided that the patch is mergeable. @xavierleroy , will you merge it yourself?

A change on trunk in cmmgen was causing problems: the use of array_indexing
in bigarray_indexing was constructing derived pointers of Addr type
instead of the correct Int type.  (Because bigarray inner pointers
are outside the heap, and because they are live across allocations.)
Added an optional argument to array_indexing to specify expected
pointer type, and adapted bigarray_indexing to use it with type Int.


git-svn-id: http://caml.inria.fr/svn/ocaml/branches/cmm-mach-types@16268 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
@xavierleroy
Copy link
Contributor Author

Updated this branch to the current trunk. There was a problem in Cmmgen.bigarray_indexing. I'll let Travis re-do the testing before final merge.

@xavierleroy
Copy link
Contributor Author

Travis is happy. Merged in trunk (r16269), will be part of 4.03. Closing this PR.

@xavierleroy xavierleroy deleted the cmm-mach-types branch October 27, 2015 13:38
chambart pushed a commit to chambart/ocaml-1 that referenced this pull request Aug 4, 2021
* Extend conditions to include flambda2.

* Make `[@unrolled]` flambda2-compatible.

* Add CR to enable test for flambda2 compilers.
stedolan pushed a commit to stedolan/ocaml that referenced this pull request Oct 5, 2021
* Extend conditions to include flambda2.

* Make `[@unrolled]` flambda2-compatible.

* Add CR to enable test for flambda2 compilers.
stedolan pushed a commit to stedolan/ocaml that referenced this pull request Dec 13, 2021
* Extend conditions to include flambda2.

* Make `[@unrolled]` flambda2-compatible.

* Add CR to enable test for flambda2 compilers.
chambart pushed a commit to chambart/ocaml-1 that referenced this pull request Feb 1, 2022
23a7f73 flambda-backend: Fix some Debuginfo.t scopes in the frontend (ocaml#248)
33a04a6 flambda-backend: Attempt to shrink the heap before calling the assembler (ocaml#429)
8a36a16 flambda-backend: Fix to allow stage 2 builds in Flambda 2 -Oclassic mode (ocaml#442)
d828db6 flambda-backend: Rename -no-extensions flag to -disable-all-extensions (ocaml#425)
68c39d5 flambda-backend: Fix mistake with extension records (ocaml#423)
423f312 flambda-backend: Refactor -extension and -standard flags (ocaml#398)
585e023 flambda-backend: Improved simplification of array operations (ocaml#384)
faec6b1 flambda-backend: Typos (ocaml#407)
8914940 flambda-backend: Ensure allocations are initialised, even dead ones (ocaml#405)
6b58001 flambda-backend: Move compiler flag -dcfg out of ocaml/ subdirectory (ocaml#400)
4fd57cf flambda-backend: Use ghost loc for extension to avoid expressions with overlapping locations (ocaml#399)
8d993c5 flambda-backend: Let's fix instead of reverting flambda_backend_args (ocaml#396)
d29b133 flambda-backend: Revert "Move flambda-backend specific flags out of ocaml/ subdirectory (ocaml#382)" (ocaml#395)
d0cda93 flambda-backend: Revert ocaml#373 (ocaml#393)
1c6eee1 flambda-backend: Fix "make check_all_arches" in ocaml/ subdirectory (ocaml#388)
a7960dd flambda-backend: Move flambda-backend specific flags out of ocaml/ subdirectory (ocaml#382)
bf7b1a8 flambda-backend: List and Array Comprehensions (ocaml#147)
f2547de flambda-backend: Compile more stdlib files with -O3 (ocaml#380)
3620c58 flambda-backend: Four small inliner fixes (ocaml#379)
2d165d2 flambda-backend: Regenerate ocaml/configure
3838b56 flambda-backend: Bump Menhir to version 20210419 (ocaml#362)
43c14d6 flambda-backend: Re-enable -flambda2-join-points (ocaml#374)
5cd2520 flambda-backend: Disable inlining of recursive functions by default (ocaml#372)
e98b277 flambda-backend: Import ocaml#10736 (stack limit increases) (ocaml#373)
82c8086 flambda-backend: Use hooks for type tree and parse tree (ocaml#363)
33bbc93 flambda-backend: Fix parsecmm.mly in ocaml subdirectory (ocaml#357)
9650034 flambda-backend: Right-to-left evaluation of arguments of String.get and friends (ocaml#354)
f7d3775 flambda-backend: Revert "Magic numbers" (ocaml#360)
0bd2fa6 flambda-backend: Add [@inline ready] attribute and remove [@inline hint] (not [@inlined hint]) (ocaml#351)
cee74af flambda-backend: Ensure that functions are evaluated after their arguments (ocaml#353)
954be59 flambda-backend: Bootstrap
dd5c299 flambda-backend: Change prefix of all magic numbers to avoid clashes with upstream.
c2b1355 flambda-backend: Fix wrong shift generation in Cmm_helpers (ocaml#347)
739243b flambda-backend: Add flambda_oclassic attribute (ocaml#348)
dc9b7fd flambda-backend: Only speculate during inlining if argument types have useful information (ocaml#343)
aa190ec flambda-backend: Backport fix from PR#10719 (ocaml#342)
c53a574 flambda-backend: Reduce max inlining depths at -O2 and -O3 (ocaml#334)
a2493dc flambda-backend: Tweak error messages in Compenv.
1c7b580 flambda-backend: Change Name_abstraction to use a parameterized type (ocaml#326)
07e0918 flambda-backend: Save cfg to file (ocaml#257)
9427a8d flambda-backend: Make inlining parameters more aggressive (ocaml#332)
fe0610f flambda-backend: Do not cache young_limit in a processor register (upstream PR 9876) (ocaml#315)
56f28b8 flambda-backend: Fix an overflow bug in major GC work computation (ocaml#310)
8e43a49 flambda-backend: Cmm invariants (port upstream PR 1400) (ocaml#258)
e901f16 flambda-backend: Add attributes effects and coeffects (#18)
aaa1cdb flambda-backend: Expose Flambda 2 flags via OCAMLPARAM (ocaml#304)
62db54f flambda-backend: Fix freshening substitutions
57231d2 flambda-backend: Evaluate signature substitutions lazily (upstream PR 10599) (ocaml#280)
a1a07de flambda-backend: Keep Sys.opaque_identity in Cmm and Mach (port upstream PR 9412) (ocaml#238)
faaf149 flambda-backend: Rename Un_cps -> To_cmm (ocaml#261)
ecb0201 flambda-backend: Add "-dcfg" flag to ocamlopt (ocaml#254)
32ec58a flambda-backend: Bypass Simplify (ocaml#162)
bd4ce4a flambda-backend: Revert "Semaphore without probes: dummy notes (ocaml#142)" (ocaml#242)
c98530f flambda-backend: Semaphore without probes: dummy notes (ocaml#142)
c9b6a04 flambda-backend: Remove hack for .depend from runtime/dune  (ocaml#170)
6e5d4cf flambda-backend: Build and install Semaphore (ocaml#183)
924eb60 flambda-backend: Special constructor for %sys_argv primitive (ocaml#166)
2ac6334 flambda-backend: Build ocamldoc (ocaml#157)
c6f7267 flambda-backend: Add -mbranches-within-32B to major_gc.c compilation (where supported)
a99fdee flambda-backend: Merge pull request ocaml#10195 from stedolan/mark-prefetching
bd72dcb flambda-backend: Prefetching optimisations for sweeping (ocaml#9934)
27fed7e flambda-backend: Add missing index param for Obj.field (ocaml#145)
cd48b2f flambda-backend: Fix camlinternalOO at -O3 with Flambda 2 (ocaml#132)
9d85430 flambda-backend: Fix testsuite execution (ocaml#125)
ac964ca flambda-backend: Comment out `[@inlined]` annotation. (ocaml#136)
ad4afce flambda-backend: Fix magic numbers (test suite) (ocaml#135)
9b033c7 flambda-backend: Disable the comparison of bytecode programs (`ocamltest`) (ocaml#128)
e650abd flambda-backend: Import flambda2 changes (`Asmpackager`) (ocaml#127)
14dcc38 flambda-backend: Fix error with Record_unboxed (bug in block kind patch) (ocaml#119)
2d35761 flambda-backend: Resurrect [@inline never] annotations in camlinternalMod (ocaml#121)
f5985ad flambda-backend: Magic numbers for cmx and cmxa files (ocaml#118)
0e8b9f0 flambda-backend: Extend conditions to include flambda2 (ocaml#115)
99870c8 flambda-backend: Fix Translobj assertions for Flambda 2 (ocaml#112)
5106317 flambda-backend: Minor fix for "lazy" compilation in Matching with Flambda 2 (ocaml#110)
dba922b flambda-backend: Oclassic/O2/O3 etc (ocaml#104)
f88af3e flambda-backend: Wire in the remaining Flambda 2 flags (ocaml#103)
678d647 flambda-backend: Wire in the Flambda 2 inlining flags (ocaml#100)
1a8febb flambda-backend: Formatting of help text for some Flambda 2 options (ocaml#101)
9ae1c7a flambda-backend: First set of command-line flags for Flambda 2 (ocaml#98)
bc0bc5e flambda-backend: Add config variables flambda_backend, flambda2 and probes (ocaml#99)
efb8304 flambda-backend: Build our own ocamlobjinfo from tools/objinfo/ at the root (ocaml#95)
d2cfaca flambda-backend: Add mutability annotations to Pfield etc. (ocaml#88)
5532555 flambda-backend: Lambda block kinds (ocaml#86)
0c597ba flambda-backend: Revert VERSION, etc. back to 4.12.0 (mostly reverts 822d0a0 from upstream 4.12) (ocaml#93)
037c3d0 flambda-backend: Float blocks
7a9d190 flambda-backend: Allow --enable-middle-end=flambda2 etc (ocaml#89)
9057474 flambda-backend: Root scanning fixes for Flambda 2 (ocaml#87)
08e02a3 flambda-backend: Ensure that Lifthenelse has a boolean-valued condition (ocaml#63)
77214b7 flambda-backend: Obj changes for Flambda 2 (ocaml#71)
ecfdd72 flambda-backend: Cherry-pick 9432cfdadb043a191b414a2caece3e4f9bbc68b7 (ocaml#84)
d1a4396 flambda-backend: Add a `returns` field to `Cmm.Cextcall` (ocaml#74)
575dff5 flambda-backend: CMM traps (ocaml#72)
8a87272 flambda-backend: Remove Obj.set_tag and Obj.truncate (ocaml#73)
d9017ae flambda-backend: Merge pull request ocaml#80 from mshinwell/fb-backport-pr10205
3a4824e flambda-backend: Backport PR#10205 from upstream: Avoid overwriting closures while initialising recursive modules
f31890e flambda-backend: Install missing headers of ocaml/runtime/caml (ocaml#77)
83516f8 flambda-backend: Apply node created for probe should not be annotated as tailcall (ocaml#76)
bc430cb flambda-backend: Add Clflags.is_flambda2 (ocaml#62)
ed87247 flambda-backend: Preallocation of blocks in Translmod for value let rec w/ flambda2 (ocaml#59)
a4b04d5 flambda-backend: inline never on Gc.create_alarm (ocaml#56)
cef0bb6 flambda-backend: Config.flambda2 (ocaml#58)
ff0e4f7 flambda-backend: Pun labelled arguments with type constraint in function applications (ocaml#53)
d72c5fb flambda-backend: Remove Cmm.memory_chunk.Double_u (ocaml#42)
9d34d99 flambda-backend: Install missing artifacts
10146f2 flambda-backend: Add ocamlcfg (ocaml#34)
819d38a flambda-backend: Use OC_CFLAGS, OC_CPPFLAGS, and SHAREDLIB_CFLAGS for foreign libs (#30)
f98b564 flambda-backend: Pass -function-sections iff supported. (#29)
e0eef5e flambda-backend: Bootstrap (#11 part 2)
17374b4 flambda-backend: Add [@@Builtin] attribute to Primitives (#11 part 1)
85127ad flambda-backend: Add builtin, effects and coeffects fields to Cextcall (#12)
b670bcf flambda-backend: Replace tuple with record in Cextcall (#10)
db451b5 flambda-backend: Speedups in Asmlink (#8)
2fe489d flambda-backend: Cherry-pick upstream PR#10184 from upstream, dynlink invariant removal (rev 3dc3cd7 upstream)
d364bfa flambda-backend: Local patch against upstream: enable function sections in the Dune build
886b800 flambda-backend: Local patch against upstream: remove Raw_spacetime_lib (does not build with -m32)
1a7db7c flambda-backend: Local patch against upstream: make dune ignore ocamldoc/ directory
e411dd3 flambda-backend: Local patch against upstream: remove ocaml/testsuite/tests/tool-caml-tex/
1016d03 flambda-backend: Local patch against upstream: remove ocaml/dune-project and ocaml/ocaml-variants.opam
93785e3 flambda-backend: To upstream: export-dynamic for otherlibs/dynlink/ via the natdynlinkops files (still needs .gitignore + way of generating these files)
63db8c1 flambda-backend: To upstream: stop using -O3 in otherlibs/Makefile.otherlibs.common
eb2f1ed flambda-backend: To upstream: stop using -O3 for dynlink/
6682f8d flambda-backend: To upstream: use flambda_o3 attribute instead of -O3 in the Makefile for systhreads/
de197df flambda-backend: To upstream: renamed ocamltest_unix.xxx files for dune
bf3773d flambda-backend: To upstream: dune build fixes (depends on previous to-upstream patches)
6fbc80e flambda-backend: To upstream: refactor otherlibs/dynlink/, removing byte/ and native/
71a03ef flambda-backend: To upstream: fix to Ocaml_modifiers in ocamltest
686d6e3 flambda-backend: To upstream: fix dependency problem with Instruct
c311155 flambda-backend: To upstream: remove threadUnix
52e6e78 flambda-backend: To upstream: stabilise filenames used in backtraces: stdlib/, otherlibs/systhreads/, toplevel/toploop.ml
7d08e0e flambda-backend: To upstream: use flambda_o3 attribute in stdlib
403b82e flambda-backend: To upstream: flambda_o3 attribute support (includes bootstrap)
65032b1 flambda-backend: To upstream: use nolabels attribute instead of -nolabels for otherlibs/unix/
f533fad flambda-backend: To upstream: remove Compflags, add attributes, etc.
49fc1b5 flambda-backend: To upstream: Add attributes and bootstrap compiler
a4b9e0d flambda-backend: Already upstreamed: stdlib capitalisation patch
4c1c259 flambda-backend: ocaml#9748 from xclerc/share-ev_defname (cherry-pick 3e937fc)
00027c4 flambda-backend: permanent/default-to-best-fit (cherry-pick 64240fd)
2561dd9 flambda-backend: permanent/reraise-by-default (cherry-pick 50e9490)
c0aa4f4 flambda-backend: permanent/gc-tuning (cherry-pick e9d6d2f)

git-subtree-dir: ocaml
git-subtree-split: 23a7f73
stedolan pushed a commit to stedolan/ocaml that referenced this pull request Mar 21, 2023
c703f5f Incorporate upstream comments into type-variable refactor (ocaml#121)
362ba23 Constrain curry modes to increase along applications (ocaml#108)
b1f0cf9 Simplify the extension handling (ocaml#114)
4fd53a1 Remove pat_mode from typedtree (ocaml#105)
cf6fcbc Handle attributes on lambdas with locally abstract types (ocaml#120)
5fa80fe Don't track attributes inside attributes for warning 53 (ocaml#115)
8a69777 Handle unclosed `[: ... :]` patterns (via `Generic_array` machinery) (ocaml#117)
b0737f4 Add promote-one Makefile target (ocaml#118)
c6ad684 Refactoring and fixes around module lookup (ocaml#107)
b0a6495 Add documentation for global constructor arguments (ocaml#69)
dd79aec Print `nlocal` in the `-d(raw)lambda` output (ocaml#112)
8035026 Fix `nlocal` in the generated Lambda for list comprehensions (ocaml#113)
afbcdf0 Immutable arrays (ocaml#47)
bfe1490 fix several issues when removing exp_mode (ocaml#110)
8f46060 Better error message for under-applied functions (ocaml#74)
27331d8 Consistently use Lmutvar or Lvar in comprehensions (ocaml#111)
01e965b Skip failing test for now
0131357 Fix test case to use comprehensions_experimental
22a7368 Temporarily disable list comprehensions tests due to locals bug
e08377d Make `comprehensions` into `comprehensions_experimental` for now (ocaml#109)
947cf89 List and array comprehensions (ocaml#46)
bd9e051 remove exp_mode from typedtree (ocaml#100)
a9268d2 Fix misplaced attribute warning when using external parser (and some cleanup) (ocaml#101)
2b33f24 Refactor toplevel local escape check (ocaml#104)
ed2aec6 Comment functions exported from TyVarEnv.
87838ba Move new variable creation into TyVarEnv.
a3f60ab Encapsulate functions that work with tyvars
43d83a6 Prevent possibility of forgetting to re-widen
2f3dd34 Encapsulate context when narrowing type env't
d78ff6d Make immediate64 things mode cross (ocaml#97)
aa25ab9 Fix version number (ocaml#94)
d01ffa0 Fix .depend file (ocaml#93)
942f2ab Bootstrap (ocaml#92)
05f7e38 Check Menhir version (ocaml#91)
1569b58 Move the CI jobs from 4.12 to 4.14. (ocaml#90)

git-subtree-dir: ocaml
git-subtree-split: c703f5f
EmileTrotignon pushed a commit to EmileTrotignon/ocaml that referenced this pull request Jan 12, 2024
EmileTrotignon pushed a commit to EmileTrotignon/ocaml that referenced this pull request Jan 12, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants