Compare commits
No commits in common. "c8s" and "c10s" have entirely different histories.
10
.gitignore
vendored
10
.gitignore
vendored
@ -1,2 +1,8 @@
|
||||
SOURCES/ocaml-4.07.0.tar.xz
|
||||
/ocaml-4.07.0.tar.xz
|
||||
/.build*.log
|
||||
/clog
|
||||
/ocaml-*.tar.bz2
|
||||
/ocaml-*.tar.gz
|
||||
/ocaml-*.tar.xz
|
||||
/ocaml-*-refman.pdf
|
||||
/4.11.0.tar.gz
|
||||
/4.13.1.tar.gz
|
||||
|
@ -0,0 +1,90 @@
|
||||
From 5538fa66e94fad3d2b4f110d23bef3b4d2d6342c Mon Sep 17 00:00:00 2001
|
||||
From: Florian Angeletti <florian.angeletti@inria.fr>
|
||||
Date: Mon, 13 May 2024 11:39:37 +0200
|
||||
Subject: [PATCH 1/7] Changes: synchronisation and consistency with trunk
|
||||
|
||||
---
|
||||
Changes | 25 ++++++++++++++-----------
|
||||
1 file changed, 14 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 208d5e8697..1af198ba77 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -140,9 +140,6 @@ OCaml 5.2.0
|
||||
(Guillaume Munch-Maccagnoni, bug reports and suggestion by Mark
|
||||
Shinwell, review by Nick Barnes and Stephen Dolan)
|
||||
|
||||
-- #12876: Port ThreadSanitizer support to Linux on POWER
|
||||
- (Miod Vallat, review by Tim McGilchrist)
|
||||
-
|
||||
- #12408: `Domain.spawn` no longer leaks its functional argument for
|
||||
the whole duration of the children domain lifetime.
|
||||
(Guillaume Munch-Maccagnoni, review by Gabriel Scherer)
|
||||
@@ -156,8 +153,10 @@ OCaml 5.2.0
|
||||
review by Damien Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Luc
|
||||
Maranget, Guillaume Munch-Maccagnoni, Gabriel Scherer)
|
||||
|
||||
-- #11911, #12381: Restore statmemprof functionality in part
|
||||
- (API changes in Gc.Memprof). (Nick Barnes)
|
||||
+- #11911, #12381: Restore statmemprof functionality in part, with
|
||||
+ some API changes in Gc.Memprof.
|
||||
+ (Nick Barnes, review by Jacques-Henri Jourdan
|
||||
+ and Guillaume Munch-Maccagnoni).
|
||||
|
||||
- #12430: Simplify dynamic bytecode loading in Meta.reify_bytecode
|
||||
(Stephen Dolan, review by Sébastien Hinderer, Vincent Laviron and Xavier
|
||||
@@ -216,9 +215,10 @@ OCaml 5.2.0
|
||||
Ojeda Bar)
|
||||
|
||||
- #11911, #12382, #12383: Restore statmemprof functionality in part
|
||||
- (backtrace buffers, per-thread and per-domain data structures).
|
||||
- (Nick Barnes, review by Gabriel Scherer, Fabrice Buoro, Sadiq
|
||||
- Jaffer, and Guillaume Munch-Maccagnoni).
|
||||
+ (backtrace buffers, per-thread and per-domain data structures,
|
||||
+ GC/allocation interface). (Nick Barnes, review by Gabriel Scherer,
|
||||
+ Fabrice Buoro, Sadiq Jaffer, Guillaume Munch-Maccagnoni, and
|
||||
+ Jacques-Henri Jourdan).
|
||||
|
||||
- #12735: Store both ends of the stack chain in continuations
|
||||
(Leo White, review by Miod Vallat and KC Sivaramakrishnan)
|
||||
@@ -248,6 +248,9 @@ OCaml 5.2.0
|
||||
Hari Hara Naveen S, reviewed by Fabrice Buoro, Gabriel Scherer and
|
||||
Miod Vallat)
|
||||
|
||||
+- #12876: Port ThreadSanitizer support to Linux on POWER
|
||||
+ (Miod Vallat, review by Tim McGilchrist)
|
||||
+
|
||||
- #12886: Reinitialize IO mutexes after fork
|
||||
(Max Slater, review by Guillaume Munch-Maccagnoni and Xavier Leroy)
|
||||
|
||||
@@ -990,7 +993,7 @@ OCaml 5.1.0 (14 September 2023)
|
||||
`Seq.find_mapi`, `Seq.find_index`, `Array.find_mapi`, `Array.find_index`,
|
||||
`Float.Array.find_opt`, `Float.Array.find_index`, `Float.Array.find_map`,
|
||||
`Float.Array.find_mapi`.
|
||||
- (Sima Kinsart, review by Daniel Bünzli and Nicolás Ojeda Bär)
|
||||
+ (Tima Kinsart, review by Daniel Bünzli and Nicolás Ojeda Bär)
|
||||
|
||||
- #11410: Add Set.to_list, Map.to_list, Map.of_list,
|
||||
`Map.add_to_list: key -> 'a -> 'a list t -> 'a list t`.
|
||||
@@ -1771,7 +1774,7 @@ Some of those changes will benefit all OCaml packages.
|
||||
|
||||
- #11846: Mark rbx as destroyed at C call for Win64 (mingw-w64 and Cygwin64).
|
||||
Reserve the shadow store for the ABI in the c_stack_link struct instead of
|
||||
- explictly when calling C functions. This simultaneously reduces the number of
|
||||
+ explicitly when calling C functions. This simultaneously reduces the number of
|
||||
stack pointer manipulations and also fixes a bug when calling noalloc
|
||||
functions where the shadow store was not being reserved.
|
||||
(David Allsopp, report by Vesa Karvonen, review by Xavier Leroy and
|
||||
@@ -2791,7 +2794,7 @@ OCaml 4.14.0 (28 March 2022)
|
||||
- #8516: Change representation of class signatures
|
||||
(Leo White, review by Thomas Refis)
|
||||
|
||||
-- #9444: -dtypedtree, print more explictly extra nodes in pattern ast.
|
||||
+- #9444: -dtypedtree, print more explicitly extra nodes in pattern ast.
|
||||
(Frédéric Bour, review by Gabriel Scherer)
|
||||
|
||||
- #10337: Normalize type_expr nodes on access
|
||||
--
|
||||
2.44.0
|
||||
|
@ -1,27 +0,0 @@
|
||||
From 8ddacdf1283fe3d7054f51a4b764bc6b44d7a342 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 24 Jun 2014 10:00:15 +0100
|
||||
Subject: [PATCH 1/8] Don't add rpaths to libraries.
|
||||
|
||||
---
|
||||
tools/Makefile | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/tools/Makefile b/tools/Makefile
|
||||
index 78d2a1068..fbec019ed 100644
|
||||
--- a/tools/Makefile
|
||||
+++ b/tools/Makefile
|
||||
@@ -157,8 +157,8 @@ $(call byte_and_opt,ocamlmklib,ocamlmklibconfig.cmo config.cmo misc.cmo \
|
||||
ocamlmklibconfig.ml: ../config/Makefile Makefile
|
||||
(echo 'let bindir = "$(BINDIR)"'; \
|
||||
echo 'let supports_shared_libraries = $(SUPPORTS_SHARED_LIBRARIES)';\
|
||||
- echo 'let default_rpath = "$(RPATH)"'; \
|
||||
- echo 'let mksharedlibrpath = "$(MKSHAREDLIBRPATH)"'; \
|
||||
+ echo 'let default_rpath = ""'; \
|
||||
+ echo 'let mksharedlibrpath = ""'; \
|
||||
echo 'let toolpref = "$(TOOLPREF)"'; \
|
||||
sed -n -e 's/^#ml //p' ../config/Makefile) \
|
||||
> ocamlmklibconfig.ml
|
||||
--
|
||||
2.17.1
|
||||
|
515
0002-Changes-copy-editing.patch
Normal file
515
0002-Changes-copy-editing.patch
Normal file
@ -0,0 +1,515 @@
|
||||
From 7a20c9322f827923baa6a9907998f670463ce447 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Angeletti <florian.angeletti@inria.fr>
|
||||
Date: Mon, 13 May 2024 14:28:08 +0200
|
||||
Subject: [PATCH 2/7] Changes copy-editing
|
||||
|
||||
---
|
||||
Changes | 398 ++++++++++++++++++++++++++++----------------------------
|
||||
1 file changed, 201 insertions(+), 197 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 1af198ba77..75842fc216 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -1,5 +1,5 @@
|
||||
-OCaml 5.2.0
|
||||
-------------
|
||||
+OCaml 5.2.0 (13 May 2024)
|
||||
+-------------------------
|
||||
|
||||
(Changes that can break existing programs are marked with a "*")
|
||||
|
||||
@@ -12,60 +12,6 @@ OCaml 5.2.0
|
||||
- #12667: extend the latter to POWER 64 bits, big-endian, ELFv2 ABI
|
||||
(A. Wilcox, review by Xavier Leroy)
|
||||
|
||||
-### Language features:
|
||||
-
|
||||
-- #12295, #12568: Give `while true' a polymorphic type, similarly to
|
||||
- `assert false'
|
||||
- (Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer,
|
||||
- suggestion by Rodolphe Lepigre and John Whitington)
|
||||
-
|
||||
-- #12315: Use type annotations from arguments in let rec
|
||||
- (Stephen Dolan, review by Gabriel Scherer)
|
||||
-
|
||||
-- #11252, RFC 27: Support raw identifier syntax \#foo
|
||||
- (Stephen Dolan, review by David Allsopp, Gabriel Scherer and Olivier Nicole)
|
||||
-
|
||||
-- #12044: Add local module open syntax for types.
|
||||
- ```
|
||||
- module A = struct
|
||||
- type t = int
|
||||
- type r = unit
|
||||
- type s = string
|
||||
- end
|
||||
-
|
||||
- type example = A.(t * r * s)
|
||||
- ```
|
||||
- (Alistair O'Brien, review by Gabriel Scherer, Nicolás Ojeda Bär
|
||||
- and Florian Angeletti)
|
||||
-
|
||||
-- #12456: Document the incompatibility between effects on the one
|
||||
- hand, and `caml_callback` and asynchronous callbacks (signal
|
||||
- handlers, finalisers, memprof callbacks...) on the other hand.
|
||||
- (Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan)
|
||||
-
|
||||
-- #12375: allow use of [@untagged] for all immediate types like char, bool,
|
||||
- and variant with only constant constructors.
|
||||
- (Christophe Raffalli, review by Gabriel Scherer)
|
||||
-
|
||||
-* #12502: the compiler now normalizes the newline sequence \r\n to
|
||||
- a single \n character during lexing, to guarantee that the semantics
|
||||
- of newlines in string literals is not modified by Windows tools
|
||||
- transforming \n into \r\n in source files.
|
||||
- Warning 29 [eol-in-string] is not emitted anymore, as the normalization
|
||||
- gives a more robust semantics to newlines in string literals.
|
||||
- (Gabriel Scherer and Damien Doligez, review by Daniel Bünzli, David
|
||||
- Allsopp, Andreas Rossberg, Xavier Leroy, report by Andreas Rossberg)
|
||||
-
|
||||
-- #13130: minor fixes to pprintast for raw identifiers and local module open
|
||||
- syntax for types.
|
||||
- (Chet Murthy, review by Gabriel Scherer)
|
||||
-
|
||||
-### Type system:
|
||||
-
|
||||
-- #12313, #11799: Do not re-build as-pattern type when a ground type annotation
|
||||
- is given. This allows to work around problems with GADTs in as-patterns.
|
||||
- (Jacques Garrigue, report by Leo White, review by Gabriel Scherer)
|
||||
-
|
||||
### Runtime system:
|
||||
|
||||
- #12193: Re-introduce GC compaction for shared pools
|
||||
@@ -76,6 +22,12 @@ OCaml 5.2.0
|
||||
David Allsopp, Miod Vallat, Artem Pianykh, Stephen Dolan, Mark Shinwell
|
||||
and KC Sivaramakrishnan)
|
||||
|
||||
+- #12114: Add ThreadSanitizer support
|
||||
+ (Fabrice Buoro and Olivier Nicole, based on an initial work by Anmol Sahoo,
|
||||
+ review by Damien Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Luc
|
||||
+ Maranget, Guillaume Munch-Maccagnoni, Gabriel Scherer)
|
||||
+
|
||||
+
|
||||
- #12850: Update Gc.quick_stat data at the end of major cycles and compaction
|
||||
This PR adds an additional caml_collect_gc_stats_sample_stw to the major heap
|
||||
cycling stw. This means that Gc.quick_stat now actually reflects the state of
|
||||
@@ -148,11 +100,6 @@ OCaml 5.2.0
|
||||
arise at specific locations during domain creation and shutdown.
|
||||
(Guillaume Munch-Maccagnoni, review by Gabriel Scherer)
|
||||
|
||||
-- #12114: Add ThreadSanitizer support
|
||||
- (Fabrice Buoro and Olivier Nicole, based on an initial work by Anmol Sahoo,
|
||||
- review by Damien Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Luc
|
||||
- Maranget, Guillaume Munch-Maccagnoni, Gabriel Scherer)
|
||||
-
|
||||
- #11911, #12381: Restore statmemprof functionality in part, with
|
||||
some API changes in Gc.Memprof.
|
||||
(Nick Barnes, review by Jacques-Henri Jourdan
|
||||
@@ -264,34 +211,48 @@ OCaml 5.2.0
|
||||
(Olivier Nicole, suggested by Stephen Dolan, review by Gabriel Scherer,
|
||||
Miod Vallat and Damien Doligez)
|
||||
|
||||
-### Code generation and optimizations:
|
||||
+### Language features:
|
||||
|
||||
-- #11239: on x86-64 and RISC-V, reduce alignment of OCaml stacks from 16 to 8.
|
||||
- This reduces stack usage. It's only C stacks that require 16-alignment.
|
||||
- (Xavier Leroy, review by Gabriel Scherer and Stephen Dolan)
|
||||
+- #12295, #12568: Give `while true' a polymorphic type, similarly to
|
||||
+ `assert false'
|
||||
+ (Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer,
|
||||
+ suggestion by Rodolphe Lepigre and John Whitington)
|
||||
|
||||
-- #12311: on POWER, 32-bit FP numbers stored in memory (e.g. in bigarrays)
|
||||
- were not correctly rounded sometimes.
|
||||
- (Xavier Leroy, review by Anil Madhavapeddy and Tim McGilchrist)
|
||||
+- #12044: Add local module open syntax for types.
|
||||
+ ```
|
||||
+ module A = struct
|
||||
+ type t = int
|
||||
+ type r = unit
|
||||
+ type s = string
|
||||
+ end
|
||||
|
||||
-- #12551, #12608, #12782, #12596: Overhaul of recursive value compilation.
|
||||
- Non-function recursive bindings are now forbidden from Lambda onwards,
|
||||
- and compiled using a new Value_rec_compiler module.
|
||||
- (Vincent Laviron and Lunia Ayanides, review by Gabriel Scherer,
|
||||
- Stefan Muenzel and Nathanaëlle Courant)
|
||||
+ type example = A.(t * r * s)
|
||||
+ ```
|
||||
+ (Alistair O'Brien, review by Gabriel Scherer, Nicolás Ojeda Bär
|
||||
+ and Florian Angeletti)
|
||||
|
||||
-- #1809, #12181: rewrite `compare x y op 0` to `x op y` when values are integers
|
||||
- (Xavier Clerc, Stefan Muenzel, review by Gabriel Scherer and Vincent Laviron)
|
||||
+- #11252, RFC 27: Support raw identifier syntax \#foo
|
||||
+ (Stephen Dolan, review by David Allsopp, Gabriel Scherer and Olivier Nicole)
|
||||
|
||||
-- #12825: disable common subexpression elimination for atomic loads... again.
|
||||
- (Gabriel Scherer, review by KC Sivaramakrishnan, Xavier Leroy
|
||||
- and Vincent Laviron, report by Vesa Karvonen)
|
||||
+
|
||||
+- #12315: Use type annotations from arguments in let rec
|
||||
+ (Stephen Dolan, review by Gabriel Scherer)
|
||||
+
|
||||
+- #12375: allow use of [@untagged] for all immediate types like char, bool,
|
||||
+ and variant with only constant constructors.
|
||||
+ (Christophe Raffalli, review by Gabriel Scherer)
|
||||
+
|
||||
+* #12502: the compiler now normalizes the newline sequence \r\n to
|
||||
+ a single \n character during lexing, to guarantee that the semantics
|
||||
+ of newlines in string literals is not modified by Windows tools
|
||||
+ transforming \n into \r\n in source files.
|
||||
+ Warning 29 [eol-in-string] is not emitted anymore, as the normalization
|
||||
+ gives a more robust semantics to newlines in string literals.
|
||||
+ (Gabriel Scherer and Damien Doligez, review by Daniel Bünzli, David
|
||||
+ Allsopp, Andreas Rossberg, Xavier Leroy, report by Andreas Rossberg)
|
||||
|
||||
### Standard library:
|
||||
|
||||
-- #12716: Add `Format.pp_print_nothing` function.
|
||||
- (Léo Andrès, review by Gabriel Scherer and Nicolás Ojeda Bär)
|
||||
-
|
||||
- #11563: Add the Dynarray module to the stdlib. Dynamic arrays are
|
||||
arrays whose length can be changed by adding or removing elements at
|
||||
the end, similar to 'vectors' in C++ or Rust.
|
||||
@@ -299,6 +260,10 @@ OCaml 5.2.0
|
||||
Daniel Bünzli, Guillaume Munch-Maccagnoni, Clément Allain,
|
||||
Damien Doligez, Wiktor Kuchta and Pieter Goetschalckx)
|
||||
|
||||
+
|
||||
+- #12716: Add `Format.pp_print_nothing` function.
|
||||
+ (Léo Andrès, review by Gabriel Scherer and Nicolás Ojeda Bär)
|
||||
+
|
||||
* #6732, #12423: Make Buffer.add_substitute surjective and fix its
|
||||
documentation.
|
||||
(Damien Doligez, review by Antonin Décimo)
|
||||
@@ -380,6 +345,35 @@ OCaml 5.2.0
|
||||
C API.
|
||||
(David Allsopp, review by Nicolás Ojeda Bär and Xavier Leroy)
|
||||
|
||||
+### Type system:
|
||||
+
|
||||
+- #12313, #11799: Do not re-build as-pattern type when a ground type annotation
|
||||
+ is given. This allows to work around problems with GADTs in as-patterns.
|
||||
+ (Jacques Garrigue, report by Leo White, review by Gabriel Scherer)
|
||||
+
|
||||
+### Code generation and optimizations:
|
||||
+
|
||||
+- #11239: on x86-64 and RISC-V, reduce alignment of OCaml stacks from 16 to 8.
|
||||
+ This reduces stack usage. It's only C stacks that require 16-alignment.
|
||||
+ (Xavier Leroy, review by Gabriel Scherer and Stephen Dolan)
|
||||
+
|
||||
+- #12311: on POWER, 32-bit FP numbers stored in memory (e.g. in bigarrays)
|
||||
+ were not correctly rounded sometimes.
|
||||
+ (Xavier Leroy, review by Anil Madhavapeddy and Tim McGilchrist)
|
||||
+
|
||||
+- #12551, #12608, #12782, #12596: Overhaul of recursive value compilation.
|
||||
+ Non-function recursive bindings are now forbidden from Lambda onwards,
|
||||
+ and compiled using a new Value_rec_compiler module.
|
||||
+ (Vincent Laviron and Lunia Ayanides, review by Gabriel Scherer,
|
||||
+ Stefan Muenzel and Nathanaëlle Courant)
|
||||
+
|
||||
+- #1809, #12181: rewrite `compare x y op 0` to `x op y` when values are integers
|
||||
+ (Xavier Clerc, Stefan Muenzel, review by Gabriel Scherer and Vincent Laviron)
|
||||
+
|
||||
+- #12825: disable common subexpression elimination for atomic loads... again.
|
||||
+ (Gabriel Scherer, review by KC Sivaramakrishnan, Xavier Leroy
|
||||
+ and Vincent Laviron, report by Vesa Karvonen)
|
||||
+
|
||||
### Other libraries:
|
||||
|
||||
- #12213: Dynlink library, improve legibility of error messages
|
||||
@@ -390,98 +384,14 @@ OCaml 5.2.0
|
||||
instead of `value`.
|
||||
(Xavier Leroy, review by David Allsopp)
|
||||
|
||||
-### Tools:
|
||||
-
|
||||
-- #12340: testsuite: collect known issues with current -short-paths
|
||||
- implementation for existential types
|
||||
- (Florian Angeletti, Samuel Hym, review by Florian Angeletti and Thomas Refis)
|
||||
-
|
||||
-- #12147: ocamllex: Allow carriage returns at the end of line directives.
|
||||
- (SeungCheol Jung, review by Nicolás Ojeda Bär)
|
||||
-
|
||||
-- #12260: Fix invalid_argument on some external or module aliases in ocamlnat
|
||||
- (Fabian Hemmer, review by Vincent Laviron)
|
||||
-
|
||||
-- #12185: New script language for ocamltest.
|
||||
- (Damien Doligez with Florian Angeletti, Sébastien Hinderer, Gabriel Scherer,
|
||||
- review by Sébastien Hinderer and Gabriel Scherer)
|
||||
-
|
||||
-- #12371: ocamltest: fix recursive expansion of variables.
|
||||
- (Antonin Décimo, Damien Doligez, review by Sébastien Hinderer,
|
||||
- Damien Doligez, Gabriel Scherer, and Xavier Leroy)
|
||||
-
|
||||
-* #12497, #12613: Make ocamlc/ocamlopt fail with an error when no
|
||||
- input files are specified to build an executable.
|
||||
- (Antonin Décimo, review by Sébastien Hinderer)
|
||||
-
|
||||
-- #12576: ocamldep: various refactors.
|
||||
- (Antonin Décimo, review by Florian Angeletti, Gabriel Scherer, and Léo Andrès)
|
||||
-
|
||||
-- #12615: ocamldoc: get rid of the odoc_literate and odoc_todo generators.
|
||||
- (Sébaistien Hinderer, review by Gabriel Scherer and Florian Angeletti)
|
||||
-
|
||||
-- #12624: Use $XDG_CONFIG_DIRS in addition to $XDG_CONFIG_HOME when searching
|
||||
- for init.ml and use this to extend init.ml support to the toplevel when
|
||||
- running on Windows.
|
||||
- (David Allsopp, report by Jonah Beckford, review by Nicolás Ojeda Bär and
|
||||
- Antonin Décimo)
|
||||
-
|
||||
-- #12688: Setting the env variable `NO_COLOR` with an empty value no longer
|
||||
- has effects. Previously, setting `NO_COLOR` with any value, including
|
||||
- the empty value, would disable colors (unless `OCAML_COLOR` is also set).
|
||||
- After this change, the user must set `NO_COLOR` with an non-empty value
|
||||
- to disable colors. This reflects a specification clarification/change
|
||||
- from the upstream website at https://no-color.org.
|
||||
- (Favonia, review by Gabriel Scherer)
|
||||
-
|
||||
-- #12744: ocamltest: run tests in recursive subdirs more eagerly
|
||||
- (Nick Roberts, review by Nicolás Ojeda Bär)
|
||||
-
|
||||
-- #12901, 12908: ocamllex: add overflow checks to prevent generating incorrect
|
||||
- lexers; use unsigned numbers in the table encoding when possible.
|
||||
- (Vincent Laviron, report by Edwin Török, review by Xavier Leroy)
|
||||
-
|
||||
-### Manual and documentation:
|
||||
-
|
||||
-- #12338: clarification of the documentation of process related function in
|
||||
- the unix module regarding the first element of args and shell's pid.
|
||||
- (Christophe Raffalli, review by Florian Angeletti)
|
||||
-
|
||||
-- #12473: Document in runtime/memory.c our current understanding of
|
||||
- accesses to the OCaml heap from the C runtime code -- the problem
|
||||
- of hybrid programs mixing two memory models.
|
||||
- (Gabriel Scherer and Guillaume Munch-Maccagnoni, review by Olivier
|
||||
- Nicole and Xavier Leroy)
|
||||
-
|
||||
-- #12694: Document in runtime/tsan.c the TSan instrumentation choices and the
|
||||
- consequences with regard to the memory model.
|
||||
- (Olivier Nicole, review by Miod Vallat, Gabriel Scherer, Guillaume
|
||||
- Munch-Maccagnoni and Fabrice Buoro)
|
||||
-
|
||||
-- #12802: Add manual chapter about ThreadSanitizer support
|
||||
- (Olivier Nicole, review by Miod Vallat, Sebastien Hinderer, Fabrice Buoro,
|
||||
- Gabriel Scherer and KC Sivaramakrishnan)
|
||||
-
|
||||
-- #12819: Clarify which runtime interactions are allowed in custom ops
|
||||
- (Basile Clément, review by Guillaume Munch-Maccagnoni and Xavier Leroy)
|
||||
-
|
||||
-- #12840: manual: update runtime tracing chapter for custom events (ex #12335)
|
||||
- (Lucas Pluvinage, Sadiq Jaffer and Olivier Nicole, review by Gabriel Scherer,
|
||||
- David Allsopp, Tim McGilchrist and Thomas Leonard)
|
||||
-
|
||||
-- #13066, update OCAMLRUNPARAM documentation for the stack size parameter l
|
||||
- (Florian Angeletti, review by Nicolás Ojeda Bär, Tim McGilchrist, and
|
||||
- Miod Vallat)
|
||||
-
|
||||
-- #13078: update Format tutorial on structural boxes to mention alignment
|
||||
- questions.
|
||||
- (Edwin Török, review by Florian Angeletti)
|
||||
-
|
||||
-- #13092: document the existence of the `[@@poll error]` built-in attribute
|
||||
- (Florian Angeletti, review by Gabriel Scherer)
|
||||
-
|
||||
### Compiler user-interface and warnings:
|
||||
|
||||
+- #11989, #12246, RFC 31: New flag, -H, to allow for transitive dependencies
|
||||
+ without including them in the initial environment.
|
||||
+ (Chris Casinghino, François Bobot, and Gabriel Scherer, review by Leo White
|
||||
+ and Stefan Muenzel, RFC by François Bobot)
|
||||
+
|
||||
+
|
||||
* #10613, #12405: Simplify the values used for the system variable (`system:` in
|
||||
`ocamlopt -config` or the `Config.system` constant). In particular, s390x and
|
||||
ppc64 now report "linux" instead of "elf"; all variants of 32-bit ARM on Linux
|
||||
@@ -493,11 +403,6 @@ OCaml 5.2.0
|
||||
(David Allsopp, request by Kate Deplaix, review by Sébastien Hinderer and
|
||||
Xavier Leroy)
|
||||
|
||||
-- #11989, #12246, RFC 31: New flag, -H, to allow for transitive dependencies
|
||||
- without including them in the initial environment.
|
||||
- (Chris Casinghino, François Bobot, and Gabriel Scherer, review by Leo White
|
||||
- and Stefan Muenzel, RFC by François Bobot)
|
||||
-
|
||||
- #12247: configure: --disable-ocamldebug can now be used instead
|
||||
of --disable-debugger (which remains available for compatibility)
|
||||
(Gabriel Scherer, review by Damien Doligez and Sébastien Hinderer)
|
||||
@@ -546,9 +451,125 @@ OCaml 5.2.0
|
||||
|
||||
* #12942: Fix an line ordering in some module inclusion error messages
|
||||
(Nick Roberts, review by Florian Angeletti, report by Carl Eastlund)
|
||||
+### Manual and documentation:
|
||||
+
|
||||
+- #12338: clarification of the documentation of process related function in
|
||||
+ the unix module regarding the first element of args and shell's pid.
|
||||
+ (Christophe Raffalli, review by Florian Angeletti)
|
||||
+
|
||||
+- #12473: Document in runtime/memory.c our current understanding of
|
||||
+ accesses to the OCaml heap from the C runtime code -- the problem
|
||||
+ of hybrid programs mixing two memory models.
|
||||
+ (Gabriel Scherer and Guillaume Munch-Maccagnoni, review by Olivier
|
||||
+ Nicole and Xavier Leroy)
|
||||
+
|
||||
+- #12456: Document the incompatibility between effects on the one
|
||||
+ hand, and `caml_callback` and asynchronous callbacks (signal
|
||||
+ handlers, finalisers, memprof callbacks...) on the other hand.
|
||||
+ (Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan)
|
||||
+
|
||||
+- #12694: Document in runtime/tsan.c the TSan instrumentation choices and the
|
||||
+ consequences with regard to the memory model.
|
||||
+ (Olivier Nicole, review by Miod Vallat, Gabriel Scherer, Guillaume
|
||||
+ Munch-Maccagnoni and Fabrice Buoro)
|
||||
+
|
||||
+- #12802: Add manual chapter about ThreadSanitizer support
|
||||
+ (Olivier Nicole, review by Miod Vallat, Sebastien Hinderer, Fabrice Buoro,
|
||||
+ Gabriel Scherer and KC Sivaramakrishnan)
|
||||
+
|
||||
+- #12819: Clarify which runtime interactions are allowed in custom ops
|
||||
+ (Basile Clément, review by Guillaume Munch-Maccagnoni and Xavier Leroy)
|
||||
+
|
||||
+- #12840: manual: update runtime tracing chapter for custom events (ex #12335)
|
||||
+ (Lucas Pluvinage, Sadiq Jaffer and Olivier Nicole, review by Gabriel Scherer,
|
||||
+ David Allsopp, Tim McGilchrist and Thomas Leonard)
|
||||
+
|
||||
+- #13066, update OCAMLRUNPARAM documentation for the stack size parameter l
|
||||
+ (Florian Angeletti, review by Nicolás Ojeda Bär, Tim McGilchrist, and
|
||||
+ Miod Vallat)
|
||||
+
|
||||
+- #13078: update Format tutorial on structural boxes to mention alignment
|
||||
+ questions.
|
||||
+ (Edwin Török, review by Florian Angeletti)
|
||||
+
|
||||
+- #13092: document the existence of the `[@@poll error]` built-in attribute
|
||||
+ (Florian Angeletti, review by Gabriel Scherer)
|
||||
+
|
||||
+### Tools:
|
||||
+
|
||||
+- #12340: testsuite: collect known issues with current -short-paths
|
||||
+ implementation for existential types
|
||||
+ (Florian Angeletti, Samuel Hym, review by Florian Angeletti and Thomas Refis)
|
||||
+
|
||||
+- #12147: ocamllex: Allow carriage returns at the end of line directives.
|
||||
+ (SeungCheol Jung, review by Nicolás Ojeda Bär)
|
||||
+
|
||||
+- #12260: Fix invalid_argument on some external or module aliases in ocamlnat
|
||||
+ (Fabian Hemmer, review by Vincent Laviron)
|
||||
+
|
||||
+- #12185: New script language for ocamltest.
|
||||
+ (Damien Doligez with Florian Angeletti, Sébastien Hinderer, Gabriel Scherer,
|
||||
+ review by Sébastien Hinderer and Gabriel Scherer)
|
||||
+
|
||||
+- #12371: ocamltest: fix recursive expansion of variables.
|
||||
+ (Antonin Décimo, Damien Doligez, review by Sébastien Hinderer,
|
||||
+ Damien Doligez, Gabriel Scherer, and Xavier Leroy)
|
||||
+
|
||||
+* #12497, #12613: Make ocamlc/ocamlopt fail with an error when no
|
||||
+ input files are specified to build an executable.
|
||||
+ (Antonin Décimo, review by Sébastien Hinderer)
|
||||
+
|
||||
+- #12576: ocamldep: various refactors.
|
||||
+ (Antonin Décimo, review by Florian Angeletti, Gabriel Scherer, and Léo Andrès)
|
||||
+
|
||||
+- #12615: ocamldoc: get rid of the odoc_literate and odoc_todo generators.
|
||||
+ (Sébaistien Hinderer, review by Gabriel Scherer and Florian Angeletti)
|
||||
+
|
||||
+- #12624: Use $XDG_CONFIG_DIRS in addition to $XDG_CONFIG_HOME when searching
|
||||
+ for init.ml and use this to extend init.ml support to the toplevel when
|
||||
+ running on Windows.
|
||||
+ (David Allsopp, report by Jonah Beckford, review by Nicolás Ojeda Bär and
|
||||
+ Antonin Décimo)
|
||||
+
|
||||
+- #12688: Setting the env variable `NO_COLOR` with an empty value no longer
|
||||
+ has effects. Previously, setting `NO_COLOR` with any value, including
|
||||
+ the empty value, would disable colors (unless `OCAML_COLOR` is also set).
|
||||
+ After this change, the user must set `NO_COLOR` with an non-empty value
|
||||
+ to disable colors. This reflects a specification clarification/change
|
||||
+ from the upstream website at https://no-color.org.
|
||||
+ (Favonia, review by Gabriel Scherer)
|
||||
+
|
||||
+- #12744: ocamltest: run tests in recursive subdirs more eagerly
|
||||
+ (Nick Roberts, review by Nicolás Ojeda Bär)
|
||||
+
|
||||
+- #12901, 12908: ocamllex: add overflow checks to prevent generating incorrect
|
||||
+ lexers; use unsigned numbers in the table encoding when possible.
|
||||
+ (Vincent Laviron, report by Edwin Török, review by Xavier Leroy)
|
||||
|
||||
### Internal/compiler-libs changes:
|
||||
|
||||
+- #12508 : Add compiler-side support for project-wide occurrences in Merlin, by
|
||||
+ generating index tables of all identifier occurrences. This extra data in .cmt
|
||||
+ files is only added when the new flag -bin-annot-occurrences is passed.
|
||||
+ (Ulysse Gérard, Nathanaëlle Courant, suggestions by Gabriel Scherer and Thomas
|
||||
+ Refis, review by Florian Angeletti, Gabriel Scherer and Thomas Refis)
|
||||
+
|
||||
+- #12236, #12386, #12391, #12496, #12673: Use syntax as sole determiner of arity
|
||||
+ This changes function arity to be based solely on the source program's
|
||||
+ parsetree. Previously, the heuristic for arity had more subtle heuristics
|
||||
+ that involved type information about patterns. Function arity is important
|
||||
+ because it determines when a pattern match's effects run and is an input
|
||||
+ into the fast path for function application.
|
||||
+
|
||||
+ This change affects tooling: it changes the function constructs in parsetree
|
||||
+ and typedtree.
|
||||
+
|
||||
+ See https://github.com/ocaml/RFCs/pull/32 for the original RFC.
|
||||
+
|
||||
+ (Nick Roberts; review by Richard Eisenberg, Leo White, and Gabriel Scherer;
|
||||
+ RFC by Stephen Dolan)
|
||||
+
|
||||
+
|
||||
- #12639: parsing: Attach a location to the RHS of Ptyp_alias
|
||||
and improve the 'alias type mismatch' error message.
|
||||
(Jules Aguillon, review by Florian Angeletti)
|
||||
@@ -583,21 +604,6 @@ OCaml 5.2.0
|
||||
in Typecore in favor of local mutable state.
|
||||
(Nick Roberts, review by Takafumi Saikawa)
|
||||
|
||||
-- #12236, #12386, #12391, #12496, #12673: Use syntax as sole determiner of arity
|
||||
- This changes function arity to be based solely on the source program's
|
||||
- parsetree. Previously, the heuristic for arity had more subtle heuristics
|
||||
- that involved type information about patterns. Function arity is important
|
||||
- because it determines when a pattern match's effects run and is an input
|
||||
- into the fast path for function application.
|
||||
-
|
||||
- This change affects tooling: it changes the function constructs in parsetree
|
||||
- and typedtree.
|
||||
-
|
||||
- See https://github.com/ocaml/RFCs/pull/32 for the original RFC.
|
||||
-
|
||||
- (Nick Roberts; review by Richard Eisenberg, Leo White, and Gabriel Scherer;
|
||||
- RFC by Stephen Dolan)
|
||||
-
|
||||
- #12542: Minor bugfix to #12236: restore dropped call to `instance`
|
||||
(Nick Roberts, review by Jacques Garrigue)
|
||||
|
||||
@@ -650,12 +656,6 @@ OCaml 5.2.0
|
||||
- #12764: Move all installable headers in `caml/` sub-directories.
|
||||
(Antonin Décimo, review by Gabriel Scherer and David Allsopp)
|
||||
|
||||
-- #12508 : Add compiler-side support for project-wide occurrences in Merlin, by
|
||||
- generating index tables of all identifier occurrences. This extra data in .cmt
|
||||
- files is only added when the new flag -bin-annot-occurrences is passed.
|
||||
- (Ulysse Gérard, Nathanaëlle Courant, suggestions by Gabriel Scherer and Thomas
|
||||
- Refis, review by Florian Angeletti, Gabriel Scherer and Thomas Refis)
|
||||
-
|
||||
- #12914: Slightly change the s390x assembly dialect in order to build with
|
||||
Clang's integrated assembler.
|
||||
(Miod Vallat, review by Gabriel Scherer)
|
||||
@@ -888,6 +888,10 @@ OCaml 5.2.0
|
||||
- #13094: Fix undefined behavior of left-shifting a negative number.
|
||||
(Antonin Décimo, review by Miod Vallat and Nicolás Ojeda Bär)
|
||||
|
||||
+- #13130: minor fixes to pprintast for raw identifiers and local module open
|
||||
+ syntax for types.
|
||||
+ (Chet Murthy, review by Gabriel Scherer)
|
||||
+
|
||||
OCaml 5.1.1 (8 December 2023)
|
||||
----------------------------
|
||||
|
||||
--
|
||||
2.44.0
|
||||
|
@ -1,240 +0,0 @@
|
||||
From 118057a71576cb39d71633bf80a37815bf4ff932 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 29 May 2012 20:40:36 +0100
|
||||
Subject: [PATCH 2/8] ocamlbyteinfo, ocamlplugininfo: Useful utilities from
|
||||
Debian, sent upstream.
|
||||
|
||||
See:
|
||||
http://git.debian.org/?p=pkg-ocaml-maint/packages/ocaml.git;a=tree;f=debian/ocamlbyteinfo;hb=HEAD
|
||||
---
|
||||
ocamlbyteinfo.ml | 101 +++++++++++++++++++++++++++++++++++++++++
|
||||
ocamlplugininfo.ml | 109 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 210 insertions(+)
|
||||
create mode 100644 ocamlbyteinfo.ml
|
||||
create mode 100644 ocamlplugininfo.ml
|
||||
|
||||
diff --git a/ocamlbyteinfo.ml b/ocamlbyteinfo.ml
|
||||
new file mode 100644
|
||||
index 000000000..0a537e4d5
|
||||
--- /dev/null
|
||||
+++ b/ocamlbyteinfo.ml
|
||||
@@ -0,0 +1,101 @@
|
||||
+(***********************************************************************)
|
||||
+(* *)
|
||||
+(* Objective Caml *)
|
||||
+(* *)
|
||||
+(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *)
|
||||
+(* *)
|
||||
+(* Copyright 2009 Institut National de Recherche en Informatique et *)
|
||||
+(* en Automatique. All rights reserved. This file is distributed *)
|
||||
+(* under the terms of the GNU Library General Public License, with *)
|
||||
+(* the special exception on linking described in file ../../LICENSE. *)
|
||||
+(* *)
|
||||
+(***********************************************************************)
|
||||
+
|
||||
+(* $Id$ *)
|
||||
+
|
||||
+(* Dumps a bytecode binary file *)
|
||||
+
|
||||
+open Sys
|
||||
+open Dynlinkaux
|
||||
+
|
||||
+let input_stringlist ic len =
|
||||
+ let get_string_list sect len =
|
||||
+ let rec fold s e acc =
|
||||
+ if e != len then
|
||||
+ if sect.[e] = '\000' then
|
||||
+ fold (e+1) (e+1) (String.sub sect s (e-s) :: acc)
|
||||
+ else fold s (e+1) acc
|
||||
+ else acc
|
||||
+ in fold 0 0 []
|
||||
+ in
|
||||
+ let sect = Bytes.create len in
|
||||
+ let _ = really_input ic sect 0 len in
|
||||
+ get_string_list (Bytes.to_string sect) len
|
||||
+
|
||||
+let print = Printf.printf
|
||||
+let perr s =
|
||||
+ Printf.eprintf "%s\n" s;
|
||||
+ exit(1)
|
||||
+let p_title title = print "%s:\n" title
|
||||
+
|
||||
+let p_section title format pdata = function
|
||||
+ | [] -> ()
|
||||
+ | l ->
|
||||
+ p_title title;
|
||||
+ List.iter
|
||||
+ (fun (name, data) -> print format (pdata data) name)
|
||||
+ l
|
||||
+
|
||||
+let p_list title format = function
|
||||
+ | [] -> ()
|
||||
+ | l ->
|
||||
+ p_title title;
|
||||
+ List.iter
|
||||
+ (fun name -> print format name)
|
||||
+ l
|
||||
+
|
||||
+let _ =
|
||||
+ try
|
||||
+ let input_name = Sys.argv.(1) in
|
||||
+ let ic = open_in_bin input_name in
|
||||
+ Bytesections.read_toc ic;
|
||||
+ List.iter
|
||||
+ (fun section ->
|
||||
+ try
|
||||
+ let len = Bytesections.seek_section ic section in
|
||||
+ if len > 0 then match section with
|
||||
+ | "CRCS" ->
|
||||
+ p_section
|
||||
+ "Imported Units"
|
||||
+ "\t%s\t%s\n"
|
||||
+ Digest.to_hex
|
||||
+ (input_value ic : (string * Digest.t) list)
|
||||
+ | "DLLS" ->
|
||||
+ p_list
|
||||
+ "Used Dlls" "\t%s\n"
|
||||
+ (input_stringlist ic len)
|
||||
+ | "DLPT" ->
|
||||
+ p_list
|
||||
+ "Additional Dll paths"
|
||||
+ "\t%s\n"
|
||||
+ (input_stringlist ic len)
|
||||
+ | "PRIM" ->
|
||||
+ let prims = (input_stringlist ic len) in
|
||||
+ print "Uses unsafe features: ";
|
||||
+ begin match prims with
|
||||
+ [] -> print "no\n"
|
||||
+ | l -> print "YES\n";
|
||||
+ p_list "Primitives declared in this module"
|
||||
+ "\t%s\n"
|
||||
+ l
|
||||
+ end
|
||||
+ | _ -> ()
|
||||
+ with Not_found | Failure _ | Invalid_argument _ -> ()
|
||||
+ )
|
||||
+ ["CRCS"; "DLLS"; "DLPT"; "PRIM"];
|
||||
+ close_in ic
|
||||
+ with
|
||||
+ | Sys_error msg ->
|
||||
+ perr msg
|
||||
+ | Invalid_argument("index out of bounds") ->
|
||||
+ perr (Printf.sprintf "Usage: %s filename" Sys.argv.(0))
|
||||
diff --git a/ocamlplugininfo.ml b/ocamlplugininfo.ml
|
||||
new file mode 100644
|
||||
index 000000000..e28800f31
|
||||
--- /dev/null
|
||||
+++ b/ocamlplugininfo.ml
|
||||
@@ -0,0 +1,109 @@
|
||||
+(***********************************************************************)
|
||||
+(* *)
|
||||
+(* Objective Caml *)
|
||||
+(* *)
|
||||
+(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *)
|
||||
+(* *)
|
||||
+(* Copyright 2009 Institut National de Recherche en Informatique et *)
|
||||
+(* en Automatique. All rights reserved. This file is distributed *)
|
||||
+(* under the terms of the GNU Library General Public License, with *)
|
||||
+(* the special exception on linking described in file ../../LICENSE. *)
|
||||
+(* *)
|
||||
+(***********************************************************************)
|
||||
+
|
||||
+(* $Id$ *)
|
||||
+
|
||||
+(* Dumps a .cmxs file *)
|
||||
+
|
||||
+open Natdynlink
|
||||
+open Format
|
||||
+
|
||||
+let file =
|
||||
+ try
|
||||
+ Sys.argv.(1)
|
||||
+ with _ -> begin
|
||||
+ Printf.eprintf "Usage: %s file.cmxs\n" Sys.argv.(0);
|
||||
+ exit(1)
|
||||
+ end
|
||||
+
|
||||
+exception Abnormal_exit
|
||||
+
|
||||
+let error s e =
|
||||
+ let eprint = Printf.eprintf in
|
||||
+ let print_exc s = function
|
||||
+ | End_of_file ->
|
||||
+ eprint "%s: %s\n" s file
|
||||
+ | Abnormal_exit ->
|
||||
+ eprint "%s\n" s
|
||||
+ | e -> eprint "%s\n" (Printexc.to_string e)
|
||||
+ in
|
||||
+ print_exc s e;
|
||||
+ exit(1)
|
||||
+
|
||||
+let read_in command =
|
||||
+ let cmd = Printf.sprintf command file in
|
||||
+ let ic = Unix.open_process_in cmd in
|
||||
+ try
|
||||
+ let line = input_line ic in
|
||||
+ begin match (Unix.close_process_in ic) with
|
||||
+ | Unix.WEXITED 0 -> Str.split (Str.regexp "[ ]+") line
|
||||
+ | Unix.WEXITED _ | Unix.WSIGNALED _ | Unix.WSTOPPED _ ->
|
||||
+ error
|
||||
+ (Printf.sprintf
|
||||
+ "Command \"%s\" exited abnormally"
|
||||
+ cmd
|
||||
+ )
|
||||
+ Abnormal_exit
|
||||
+ end
|
||||
+ with e -> error "File is empty" e
|
||||
+
|
||||
+let get_offset adr_off adr_sec =
|
||||
+ try
|
||||
+ let adr = List.nth adr_off 4 in
|
||||
+ let off = List.nth adr_off 5 in
|
||||
+ let sec = List.hd adr_sec in
|
||||
+
|
||||
+ let (!) x = Int64.of_string ("0x" ^ x) in
|
||||
+ let (+) = Int64.add in
|
||||
+ let (-) = Int64.sub in
|
||||
+
|
||||
+ Int64.to_int (!off + !sec - !adr)
|
||||
+
|
||||
+ with Failure _ | Invalid_argument _ ->
|
||||
+ error
|
||||
+ "Command output doesn't have the expected format"
|
||||
+ Abnormal_exit
|
||||
+
|
||||
+let print_infos name crc defines cmi cmx =
|
||||
+ let print_name_crc (name, crc) =
|
||||
+ printf "@ %s (%s)" name (Digest.to_hex crc)
|
||||
+ in
|
||||
+ let pr_imports ppf imps = List.iter print_name_crc imps in
|
||||
+ printf "Name: %s@." name;
|
||||
+ printf "CRC of implementation: %s@." (Digest.to_hex crc);
|
||||
+ printf "@[<hov 2>Globals defined:";
|
||||
+ List.iter (fun s -> printf "@ %s" s) defines;
|
||||
+ printf "@]@.";
|
||||
+ printf "@[<v 2>Interfaces imported:%a@]@." pr_imports cmi;
|
||||
+ printf "@[<v 2>Implementations imported:%a@]@." pr_imports cmx
|
||||
+
|
||||
+let _ =
|
||||
+ let adr_off = read_in "objdump -h %s | grep ' .data '" in
|
||||
+ let adr_sec = read_in "objdump -T %s | grep ' caml_plugin_header$'" in
|
||||
+
|
||||
+ let ic = open_in file in
|
||||
+ let _ = seek_in ic (get_offset adr_off adr_sec) in
|
||||
+ let header = (input_value ic : Natdynlink.dynheader) in
|
||||
+ if header.magic <> Natdynlink.dyn_magic_number then
|
||||
+ raise(Error(Natdynlink.Not_a_bytecode_file file))
|
||||
+ else begin
|
||||
+ List.iter
|
||||
+ (fun ui ->
|
||||
+ print_infos
|
||||
+ ui.name
|
||||
+ ui.crc
|
||||
+ ui.defines
|
||||
+ ui.imports_cmi
|
||||
+ ui.imports_cmx)
|
||||
+ header.units
|
||||
+ end
|
||||
--
|
||||
2.17.1
|
||||
|
25
0003-Don-t-add-rpaths-to-libraries.patch
Normal file
25
0003-Don-t-add-rpaths-to-libraries.patch
Normal file
@ -0,0 +1,25 @@
|
||||
From 507a1382cb82160c2a6cfc0ea5bcb3e33ece7307 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 24 Jun 2014 10:00:15 +0100
|
||||
Subject: [PATCH 3/7] Don't add rpaths to libraries.
|
||||
|
||||
---
|
||||
configure.ac | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 0c9d63859a..48aa9f0a29 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -1221,8 +1221,6 @@ AS_IF([test x"$enable_shared" != "xno"],
|
||||
[[*-*-openbsd7.[3-9]|*-*-openbsd[89].*]],
|
||||
[mkdll_flags="${mkdll_flags} -Wl,--no-execute-only"])
|
||||
oc_ldflags="$oc_ldflags -Wl,-E"
|
||||
- rpath="-Wl,-rpath,"
|
||||
- mksharedlibrpath="-Wl,-rpath,"
|
||||
natdynlinkopts="-Wl,-E"
|
||||
supports_shared_libraries=true],
|
||||
[mkdll='shared-libs-not-available'])
|
||||
--
|
||||
2.44.0
|
||||
|
@ -1,27 +0,0 @@
|
||||
From 8ddd2fb4909bf6ed1a3506723126432da8fcf0c4 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 29 May 2012 20:44:18 +0100
|
||||
Subject: [PATCH 3/8] configure: Allow user defined C compiler flags.
|
||||
|
||||
---
|
||||
configure | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/configure b/configure
|
||||
index 1316b3c1e..53f45f85b 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -2050,6 +2050,10 @@ if $flat_float_array; then
|
||||
echo "#define FLAT_FLOAT_ARRAY" >> m.h
|
||||
fi
|
||||
|
||||
+# Allow user defined C Compiler flags
|
||||
+bytecccompopts="$bytecccompopts $CFLAGS"
|
||||
+nativecccompopts="$nativecccompopts $CFLAGS"
|
||||
+
|
||||
# Finish generated files
|
||||
|
||||
cclibs="$cclibs $mathlib"
|
||||
--
|
||||
2.17.1
|
||||
|
File diff suppressed because it is too large
Load Diff
45
0004-configure-Allow-user-defined-C-compiler-flags.patch
Normal file
45
0004-configure-Allow-user-defined-C-compiler-flags.patch
Normal file
@ -0,0 +1,45 @@
|
||||
From edd903fc73b98eb784b307a47110985967cb1d09 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 29 May 2012 20:44:18 +0100
|
||||
Subject: [PATCH 4/7] configure: Allow user defined C compiler flags.
|
||||
|
||||
---
|
||||
configure.ac | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 48aa9f0a29..fc29c88f50 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -869,6 +869,10 @@ AS_CASE([$ocaml_cc_vendor],
|
||||
internal_cflags="$cc_warnings"],
|
||||
[common_cflags="-O"])
|
||||
|
||||
+# Allow CFLAGS and LDFLAGS to be added.
|
||||
+common_cflags="$common_cflags $CFLAGS"
|
||||
+cclibs="$cclibs $LDFLAGS"
|
||||
+
|
||||
# Enable SSE2 on x86 mingw to avoid using 80-bit registers.
|
||||
AS_CASE([$host],
|
||||
[i686-*-mingw32*],
|
||||
@@ -2648,7 +2652,7 @@ AC_CONFIG_COMMANDS_PRE([
|
||||
[mkexedebugflag="${mkexe_ldflags_prefix}${mkexedebugflag}"])
|
||||
mkdll_ldflags=""
|
||||
AS_IF([test -n "${LDFLAGS}"],
|
||||
- [for flag in ${LDFLAGS}; do
|
||||
+ [for flag in "${LDFLAGS}"; do
|
||||
mkdll_ldflags="${mkdll_ldflags} ${mkexe_ldflags_prefix}${flag}"
|
||||
done
|
||||
mkdll_ldflags_exp="$mkdll_ldflags"])
|
||||
@@ -2674,7 +2678,7 @@ ${mkdll_ldflags}"
|
||||
],[
|
||||
mkdll_ldflags='$(OC_DLL_LDFLAGS) $(LDFLAGS)'
|
||||
mkdll_ldflags_exp="${oc_dll_ldflags}"
|
||||
- AS_IF([test -n ${LDFLAGS}],
|
||||
+ AS_IF([test -n "${LDFLAGS}"],
|
||||
[mkdll_ldflags_exp="$mkdll_ldflags_exp $LDFLAGS"])
|
||||
mkexe_ldflags="\$(OC_LDFLAGS) \$(LDFLAGS)"
|
||||
mkexe_ldflags_exp="${oc_ldflags} ${LDFLAGS}"
|
||||
--
|
||||
2.44.0
|
||||
|
@ -1,717 +0,0 @@
|
||||
From 2e4038b6b8073f55012613f18cb19a4c99e8219d Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Ojeda Bar <n.oje.bar@gmail.com>
|
||||
Date: Fri, 1 Dec 2017 14:39:46 +0100
|
||||
Subject: [PATCH 5/8] Copyright, untabify
|
||||
|
||||
---
|
||||
asmrun/riscv.S | 608 ++++++++++++++++++++++++-------------------------
|
||||
1 file changed, 304 insertions(+), 304 deletions(-)
|
||||
|
||||
diff --git a/asmrun/riscv.S b/asmrun/riscv.S
|
||||
index a82048efc..88d7ab924 100644
|
||||
--- a/asmrun/riscv.S
|
||||
+++ b/asmrun/riscv.S
|
||||
@@ -4,7 +4,7 @@
|
||||
/* */
|
||||
/* Nicolas Ojeda Bar <n.oje.bar@gmail.com> */
|
||||
/* */
|
||||
-/* Copyright 1996 Institut National de Recherche en Informatique et */
|
||||
+/* Copyright 2017 Institut National de Recherche en Informatique et */
|
||||
/* en Automatique. All rights reserved. This file is distributed */
|
||||
/* under the terms of the GNU Library General Public License, with */
|
||||
/* the special exception on linking described in file ../LICENSE. */
|
||||
@@ -37,388 +37,388 @@
|
||||
.option nopic
|
||||
#endif
|
||||
|
||||
- .section .text
|
||||
+ .section .text
|
||||
/* Invoke the garbage collector. */
|
||||
|
||||
- .globl caml_system__code_begin
|
||||
+ .globl caml_system__code_begin
|
||||
caml_system__code_begin:
|
||||
|
||||
- .align 2
|
||||
- .globl caml_call_gc
|
||||
- .type caml_call_gc, @function
|
||||
+ .align 2
|
||||
+ .globl caml_call_gc
|
||||
+ .type caml_call_gc, @function
|
||||
caml_call_gc:
|
||||
/* Record return address */
|
||||
- store ra, caml_last_return_address, TMP0
|
||||
+ store ra, caml_last_return_address, TMP0
|
||||
/* Record lowest stack address */
|
||||
- mv TMP1, sp
|
||||
- store sp, caml_bottom_of_stack, TMP0
|
||||
+ mv TMP1, sp
|
||||
+ store sp, caml_bottom_of_stack, TMP0
|
||||
.Lcaml_call_gc:
|
||||
- /* Set up stack space, saving return address */
|
||||
+ /* Set up stack space, saving return address */
|
||||
/* (1 reg for RA, 1 reg for FP, 21 allocatable int regs, 20 caller-save float regs) * 8 */
|
||||
/* + 1 for alignment */
|
||||
- addi sp, sp, -0x160
|
||||
- mv s0, sp
|
||||
- store ra, 0x8(sp)
|
||||
- store s0, 0x0(sp)
|
||||
+ addi sp, sp, -0x160
|
||||
+ mv s0, sp
|
||||
+ store ra, 0x8(sp)
|
||||
+ store s0, 0x0(sp)
|
||||
/* Save allocatable integer registers on the stack,
|
||||
in the order given in proc.ml */
|
||||
- store a0, 0x10(sp)
|
||||
- store a1, 0x18(sp)
|
||||
- store a2, 0x20(sp)
|
||||
- store a3, 0x28(sp)
|
||||
- store a4, 0x30(sp)
|
||||
- store a5, 0x38(sp)
|
||||
- store a6, 0x40(sp)
|
||||
- store a7, 0x48(sp)
|
||||
- store s2, 0x50(sp)
|
||||
- store s3, 0x58(sp)
|
||||
- store s4, 0x60(sp)
|
||||
- store s5, 0x68(sp)
|
||||
- store s6, 0x70(sp)
|
||||
- store s7, 0x78(sp)
|
||||
- store s8, 0x80(sp)
|
||||
- store s9, 0x88(sp)
|
||||
- store t2, 0x90(sp)
|
||||
- store t3, 0x98(sp)
|
||||
- store t4, 0xa0(sp)
|
||||
- store t5, 0xa8(sp)
|
||||
- store t6, 0xb0(sp)
|
||||
+ store a0, 0x10(sp)
|
||||
+ store a1, 0x18(sp)
|
||||
+ store a2, 0x20(sp)
|
||||
+ store a3, 0x28(sp)
|
||||
+ store a4, 0x30(sp)
|
||||
+ store a5, 0x38(sp)
|
||||
+ store a6, 0x40(sp)
|
||||
+ store a7, 0x48(sp)
|
||||
+ store s2, 0x50(sp)
|
||||
+ store s3, 0x58(sp)
|
||||
+ store s4, 0x60(sp)
|
||||
+ store s5, 0x68(sp)
|
||||
+ store s6, 0x70(sp)
|
||||
+ store s7, 0x78(sp)
|
||||
+ store s8, 0x80(sp)
|
||||
+ store s9, 0x88(sp)
|
||||
+ store t2, 0x90(sp)
|
||||
+ store t3, 0x98(sp)
|
||||
+ store t4, 0xa0(sp)
|
||||
+ store t5, 0xa8(sp)
|
||||
+ store t6, 0xb0(sp)
|
||||
/* Save caller-save floating-point registers on the stack
|
||||
(callee-saves are preserved by caml_garbage_collection) */
|
||||
- fsd ft0, 0xb8(sp)
|
||||
- fsd ft1, 0xc0(sp)
|
||||
- fsd ft2, 0xc8(sp)
|
||||
- fsd ft3, 0xd0(sp)
|
||||
- fsd ft4, 0xd8(sp)
|
||||
- fsd ft5, 0xe0(sp)
|
||||
- fsd ft6, 0xe8(sp)
|
||||
- fsd ft7, 0xf0(sp)
|
||||
- fsd fa0, 0xf8(sp)
|
||||
- fsd fa1, 0x100(sp)
|
||||
- fsd fa2, 0x108(sp)
|
||||
- fsd fa3, 0x110(sp)
|
||||
- fsd fa4, 0x118(sp)
|
||||
- fsd fa5, 0x120(sp)
|
||||
- fsd fa6, 0x128(sp)
|
||||
- fsd fa7, 0x130(sp)
|
||||
- fsd ft8, 0x138(sp)
|
||||
- fsd ft9, 0x140(sp)
|
||||
- fsd ft9, 0x148(sp)
|
||||
- fsd ft10, 0x150(sp)
|
||||
- fsd ft11, 0x158(sp)
|
||||
+ fsd ft0, 0xb8(sp)
|
||||
+ fsd ft1, 0xc0(sp)
|
||||
+ fsd ft2, 0xc8(sp)
|
||||
+ fsd ft3, 0xd0(sp)
|
||||
+ fsd ft4, 0xd8(sp)
|
||||
+ fsd ft5, 0xe0(sp)
|
||||
+ fsd ft6, 0xe8(sp)
|
||||
+ fsd ft7, 0xf0(sp)
|
||||
+ fsd fa0, 0xf8(sp)
|
||||
+ fsd fa1, 0x100(sp)
|
||||
+ fsd fa2, 0x108(sp)
|
||||
+ fsd fa3, 0x110(sp)
|
||||
+ fsd fa4, 0x118(sp)
|
||||
+ fsd fa5, 0x120(sp)
|
||||
+ fsd fa6, 0x128(sp)
|
||||
+ fsd fa7, 0x130(sp)
|
||||
+ fsd ft8, 0x138(sp)
|
||||
+ fsd ft9, 0x140(sp)
|
||||
+ fsd ft9, 0x148(sp)
|
||||
+ fsd ft10, 0x150(sp)
|
||||
+ fsd ft11, 0x158(sp)
|
||||
/* Store pointer to saved integer registers in caml_gc_regs */
|
||||
- addi TMP1, sp, 16
|
||||
- store TMP1, caml_gc_regs, TMP0
|
||||
+ addi TMP1, sp, 16
|
||||
+ store TMP1, caml_gc_regs, TMP0
|
||||
/* Save current allocation pointer for debugging purposes */
|
||||
- store ALLOC_PTR, caml_young_ptr, TMP0
|
||||
+ store ALLOC_PTR, caml_young_ptr, TMP0
|
||||
/* Save trap pointer in case an exception is raised during GC */
|
||||
- store TRAP_PTR, caml_exception_pointer, TMP0
|
||||
+ store TRAP_PTR, caml_exception_pointer, TMP0
|
||||
/* Call the garbage collector */
|
||||
- call caml_garbage_collection
|
||||
+ call caml_garbage_collection
|
||||
/* Restore registers */
|
||||
- load a0, 0x10(sp)
|
||||
- load a1, 0x18(sp)
|
||||
- load a2, 0x20(sp)
|
||||
- load a3, 0x28(sp)
|
||||
- load a4, 0x30(sp)
|
||||
- load a5, 0x38(sp)
|
||||
- load a6, 0x40(sp)
|
||||
- load a7, 0x48(sp)
|
||||
- load s2, 0x50(sp)
|
||||
- load s3, 0x58(sp)
|
||||
- load s4, 0x60(sp)
|
||||
- load s5, 0x68(sp)
|
||||
- load s6, 0x70(sp)
|
||||
- load s7, 0x78(sp)
|
||||
- load s8, 0x80(sp)
|
||||
- load s9, 0x88(sp)
|
||||
- load t2, 0x90(sp)
|
||||
- load t3, 0x98(sp)
|
||||
- load t4, 0xa0(sp)
|
||||
- load t5, 0xa8(sp)
|
||||
- load t6, 0xb0(sp)
|
||||
- fld ft0, 0xb8(sp)
|
||||
- fld ft1, 0xc0(sp)
|
||||
- fld ft2, 0xc8(sp)
|
||||
- fld ft3, 0xd0(sp)
|
||||
- fld ft4, 0xd8(sp)
|
||||
- fld ft5, 0xe0(sp)
|
||||
- fld ft6, 0xe8(sp)
|
||||
- fld ft7, 0xf0(sp)
|
||||
- fld fa0, 0xf8(sp)
|
||||
- fld fa1, 0x100(sp)
|
||||
- fld fa2, 0x108(sp)
|
||||
- fld fa3, 0x110(sp)
|
||||
- fld fa4, 0x118(sp)
|
||||
- fld fa5, 0x120(sp)
|
||||
- fld fa6, 0x128(sp)
|
||||
- fld fa7, 0x130(sp)
|
||||
- fld ft8, 0x138(sp)
|
||||
- fld ft9, 0x140(sp)
|
||||
- fld ft9, 0x148(sp)
|
||||
- fld ft10, 0x150(sp)
|
||||
- fld ft11, 0x158(sp)
|
||||
+ load a0, 0x10(sp)
|
||||
+ load a1, 0x18(sp)
|
||||
+ load a2, 0x20(sp)
|
||||
+ load a3, 0x28(sp)
|
||||
+ load a4, 0x30(sp)
|
||||
+ load a5, 0x38(sp)
|
||||
+ load a6, 0x40(sp)
|
||||
+ load a7, 0x48(sp)
|
||||
+ load s2, 0x50(sp)
|
||||
+ load s3, 0x58(sp)
|
||||
+ load s4, 0x60(sp)
|
||||
+ load s5, 0x68(sp)
|
||||
+ load s6, 0x70(sp)
|
||||
+ load s7, 0x78(sp)
|
||||
+ load s8, 0x80(sp)
|
||||
+ load s9, 0x88(sp)
|
||||
+ load t2, 0x90(sp)
|
||||
+ load t3, 0x98(sp)
|
||||
+ load t4, 0xa0(sp)
|
||||
+ load t5, 0xa8(sp)
|
||||
+ load t6, 0xb0(sp)
|
||||
+ fld ft0, 0xb8(sp)
|
||||
+ fld ft1, 0xc0(sp)
|
||||
+ fld ft2, 0xc8(sp)
|
||||
+ fld ft3, 0xd0(sp)
|
||||
+ fld ft4, 0xd8(sp)
|
||||
+ fld ft5, 0xe0(sp)
|
||||
+ fld ft6, 0xe8(sp)
|
||||
+ fld ft7, 0xf0(sp)
|
||||
+ fld fa0, 0xf8(sp)
|
||||
+ fld fa1, 0x100(sp)
|
||||
+ fld fa2, 0x108(sp)
|
||||
+ fld fa3, 0x110(sp)
|
||||
+ fld fa4, 0x118(sp)
|
||||
+ fld fa5, 0x120(sp)
|
||||
+ fld fa6, 0x128(sp)
|
||||
+ fld fa7, 0x130(sp)
|
||||
+ fld ft8, 0x138(sp)
|
||||
+ fld ft9, 0x140(sp)
|
||||
+ fld ft9, 0x148(sp)
|
||||
+ fld ft10, 0x150(sp)
|
||||
+ fld ft11, 0x158(sp)
|
||||
/* Reload new allocation pointer and allocation limit */
|
||||
- load ALLOC_PTR, caml_young_ptr
|
||||
- load ALLOC_LIMIT, caml_young_limit
|
||||
+ load ALLOC_PTR, caml_young_ptr
|
||||
+ load ALLOC_LIMIT, caml_young_limit
|
||||
/* Free stack space and return to caller */
|
||||
- load ra, 0x8(sp)
|
||||
- load s0, 0x0(sp)
|
||||
- addi sp, sp, 0x160
|
||||
+ load ra, 0x8(sp)
|
||||
+ load s0, 0x0(sp)
|
||||
+ addi sp, sp, 0x160
|
||||
ret
|
||||
- .size caml_call_gc, .-caml_call_gc
|
||||
+ .size caml_call_gc, .-caml_call_gc
|
||||
|
||||
/* Call a C function from OCaml */
|
||||
/* Function to call is in ARG */
|
||||
|
||||
- .align 2
|
||||
- .globl caml_c_call
|
||||
- .type caml_c_call, @function
|
||||
+ .align 2
|
||||
+ .globl caml_c_call
|
||||
+ .type caml_c_call, @function
|
||||
caml_c_call:
|
||||
/* Preserve return address in callee-save register s2 */
|
||||
- mv s2, ra
|
||||
+ mv s2, ra
|
||||
/* Record lowest stack address and return address */
|
||||
- store ra, caml_last_return_address, TMP0
|
||||
- store sp, caml_bottom_of_stack, TMP0
|
||||
+ store ra, caml_last_return_address, TMP0
|
||||
+ store sp, caml_bottom_of_stack, TMP0
|
||||
/* Make the exception handler alloc ptr available to the C code */
|
||||
- store ALLOC_PTR, caml_young_ptr, TMP0
|
||||
- store TRAP_PTR, caml_exception_pointer, TMP0
|
||||
+ store ALLOC_PTR, caml_young_ptr, TMP0
|
||||
+ store TRAP_PTR, caml_exception_pointer, TMP0
|
||||
/* Call the function */
|
||||
- jalr ARG
|
||||
+ jalr ARG
|
||||
/* Reload alloc ptr and alloc limit */
|
||||
- load ALLOC_PTR, caml_young_ptr
|
||||
- load TRAP_PTR, caml_exception_pointer
|
||||
+ load ALLOC_PTR, caml_young_ptr
|
||||
+ load TRAP_PTR, caml_exception_pointer
|
||||
/* Return */
|
||||
- jr s2
|
||||
- .size caml_c_call, .-caml_c_call
|
||||
+ jr s2
|
||||
+ .size caml_c_call, .-caml_c_call
|
||||
|
||||
/* Raise an exception from OCaml */
|
||||
- .align 2
|
||||
- .globl caml_raise_exn
|
||||
- .type caml_raise_exn, @function
|
||||
+ .align 2
|
||||
+ .globl caml_raise_exn
|
||||
+ .type caml_raise_exn, @function
|
||||
caml_raise_exn:
|
||||
/* Test if backtrace is active */
|
||||
- load TMP1, caml_backtrace_active
|
||||
- bnez TMP1, 2f
|
||||
+ load TMP1, caml_backtrace_active
|
||||
+ bnez TMP1, 2f
|
||||
1: /* Cut stack at current trap handler */
|
||||
- mv sp, TRAP_PTR
|
||||
+ mv sp, TRAP_PTR
|
||||
/* Pop previous handler and jump to it */
|
||||
- load TMP1, 8(sp)
|
||||
- load TRAP_PTR, 0(sp)
|
||||
- addi sp, sp, 16
|
||||
- jr TMP1
|
||||
+ load TMP1, 8(sp)
|
||||
+ load TRAP_PTR, 0(sp)
|
||||
+ addi sp, sp, 16
|
||||
+ jr TMP1
|
||||
2: /* Preserve exception bucket in callee-save register s2 */
|
||||
- mv s2, a0
|
||||
+ mv s2, a0
|
||||
/* Stash the backtrace */
|
||||
- mv a1, ra
|
||||
- mv a2, sp
|
||||
- mv a3, TRAP_PTR
|
||||
- call caml_stash_backtrace
|
||||
+ mv a1, ra
|
||||
+ mv a2, sp
|
||||
+ mv a3, TRAP_PTR
|
||||
+ call caml_stash_backtrace
|
||||
/* Restore exception bucket and raise */
|
||||
- mv a0, s2
|
||||
- j 1b
|
||||
- .size caml_raise_exn, .-caml_raise_exn
|
||||
+ mv a0, s2
|
||||
+ j 1b
|
||||
+ .size caml_raise_exn, .-caml_raise_exn
|
||||
|
||||
- .globl caml_reraise_exn
|
||||
- .type caml_reraise_exn, @function
|
||||
+ .globl caml_reraise_exn
|
||||
+ .type caml_reraise_exn, @function
|
||||
|
||||
/* Raise an exception from C */
|
||||
|
||||
- .align 2
|
||||
- .globl caml_raise_exception
|
||||
- .type caml_raise_exception, @function
|
||||
+ .align 2
|
||||
+ .globl caml_raise_exception
|
||||
+ .type caml_raise_exception, @function
|
||||
caml_raise_exception:
|
||||
- load TRAP_PTR, caml_exception_pointer
|
||||
- load ALLOC_PTR, caml_young_ptr
|
||||
- load ALLOC_LIMIT, caml_young_limit
|
||||
- load TMP1, caml_backtrace_active
|
||||
- bnez TMP1, 2f
|
||||
+ load TRAP_PTR, caml_exception_pointer
|
||||
+ load ALLOC_PTR, caml_young_ptr
|
||||
+ load ALLOC_LIMIT, caml_young_limit
|
||||
+ load TMP1, caml_backtrace_active
|
||||
+ bnez TMP1, 2f
|
||||
1: /* Cut stack at current trap handler */
|
||||
- mv sp, TRAP_PTR
|
||||
- load TMP1, 8(sp)
|
||||
- load TRAP_PTR, 0(sp)
|
||||
- addi sp, sp, 16
|
||||
- jr TMP1
|
||||
+ mv sp, TRAP_PTR
|
||||
+ load TMP1, 8(sp)
|
||||
+ load TRAP_PTR, 0(sp)
|
||||
+ addi sp, sp, 16
|
||||
+ jr TMP1
|
||||
2: /* Preserve exception bucket in callee-save register s2 */
|
||||
- mv s2, a0
|
||||
- load a1, caml_last_return_address
|
||||
- load a2, caml_bottom_of_stack
|
||||
- mv a3, TRAP_PTR
|
||||
- call caml_stash_backtrace
|
||||
- mv a0, s2
|
||||
- j 1b
|
||||
- .size caml_raise_exception, .-caml_raise_exception
|
||||
+ mv s2, a0
|
||||
+ load a1, caml_last_return_address
|
||||
+ load a2, caml_bottom_of_stack
|
||||
+ mv a3, TRAP_PTR
|
||||
+ call caml_stash_backtrace
|
||||
+ mv a0, s2
|
||||
+ j 1b
|
||||
+ .size caml_raise_exception, .-caml_raise_exception
|
||||
|
||||
/* Start the OCaml program */
|
||||
|
||||
- .align 2
|
||||
- .globl caml_start_program
|
||||
- .type caml_start_program, @function
|
||||
+ .align 2
|
||||
+ .globl caml_start_program
|
||||
+ .type caml_start_program, @function
|
||||
caml_start_program:
|
||||
|
||||
- la ARG, caml_program
|
||||
+ la ARG, caml_program
|
||||
/* Code shared with caml_callback* */
|
||||
/* Address of OCaml code to call is in ARG */
|
||||
/* Arguments to the OCaml code are in a0 ... a7 */
|
||||
.Ljump_to_caml:
|
||||
- /* Set up stack frame and save callee-save registers */
|
||||
- addi sp, sp, -0xd0
|
||||
- store ra, 0xc0(sp)
|
||||
- store s0, 0x0(sp)
|
||||
- store s1, 0x8(sp)
|
||||
- store s2, 0x10(sp)
|
||||
- store s3, 0x18(sp)
|
||||
- store s4, 0x20(sp)
|
||||
- store s5, 0x28(sp)
|
||||
- store s6, 0x30(sp)
|
||||
- store s7, 0x38(sp)
|
||||
- store s8, 0x40(sp)
|
||||
- store s9, 0x48(sp)
|
||||
- store s10, 0x50(sp)
|
||||
- store s11, 0x58(sp)
|
||||
- fsd fs0, 0x60(sp)
|
||||
- fsd fs1, 0x68(sp)
|
||||
- fsd fs2, 0x70(sp)
|
||||
- fsd fs3, 0x78(sp)
|
||||
- fsd fs4, 0x80(sp)
|
||||
- fsd fs5, 0x88(sp)
|
||||
- fsd fs6, 0x90(sp)
|
||||
- fsd fs7, 0x98(sp)
|
||||
- fsd fs8, 0xa0(sp)
|
||||
- fsd fs9, 0xa8(sp)
|
||||
- fsd fs10, 0xb0(sp)
|
||||
- fsd fs11, 0xb8(sp)
|
||||
- addi sp, sp, -32
|
||||
+ /* Set up stack frame and save callee-save registers */
|
||||
+ addi sp, sp, -0xd0
|
||||
+ store ra, 0xc0(sp)
|
||||
+ store s0, 0x0(sp)
|
||||
+ store s1, 0x8(sp)
|
||||
+ store s2, 0x10(sp)
|
||||
+ store s3, 0x18(sp)
|
||||
+ store s4, 0x20(sp)
|
||||
+ store s5, 0x28(sp)
|
||||
+ store s6, 0x30(sp)
|
||||
+ store s7, 0x38(sp)
|
||||
+ store s8, 0x40(sp)
|
||||
+ store s9, 0x48(sp)
|
||||
+ store s10, 0x50(sp)
|
||||
+ store s11, 0x58(sp)
|
||||
+ fsd fs0, 0x60(sp)
|
||||
+ fsd fs1, 0x68(sp)
|
||||
+ fsd fs2, 0x70(sp)
|
||||
+ fsd fs3, 0x78(sp)
|
||||
+ fsd fs4, 0x80(sp)
|
||||
+ fsd fs5, 0x88(sp)
|
||||
+ fsd fs6, 0x90(sp)
|
||||
+ fsd fs7, 0x98(sp)
|
||||
+ fsd fs8, 0xa0(sp)
|
||||
+ fsd fs9, 0xa8(sp)
|
||||
+ fsd fs10, 0xb0(sp)
|
||||
+ fsd fs11, 0xb8(sp)
|
||||
+ addi sp, sp, -32
|
||||
/* Setup a callback link on the stack */
|
||||
- load TMP1, caml_bottom_of_stack
|
||||
- store TMP1, 0(sp)
|
||||
- load TMP1, caml_last_return_address
|
||||
- store TMP1, 8(sp)
|
||||
- load TMP1, caml_gc_regs
|
||||
- store TMP1, 16(sp)
|
||||
- /* set up a trap frame */
|
||||
- addi sp, sp, -16
|
||||
- load TMP1, caml_exception_pointer
|
||||
- store TMP1, 0(sp)
|
||||
- lla TMP0, .Ltrap_handler
|
||||
- store TMP0, 8(sp)
|
||||
- mv TRAP_PTR, sp
|
||||
- load ALLOC_PTR, caml_young_ptr
|
||||
- load ALLOC_LIMIT, caml_young_limit
|
||||
- store x0, caml_last_return_address, TMP0
|
||||
- jalr ARG
|
||||
-.Lcaml_retaddr: /* pop trap frame, restoring caml_exception_pointer */
|
||||
- load TMP1, 0(sp)
|
||||
- store TMP1, caml_exception_pointer, TMP0
|
||||
- addi sp, sp, 16
|
||||
-.Lreturn_result: /* pop callback link, restoring global variables */
|
||||
- load TMP1, 0(sp)
|
||||
- store TMP1, caml_bottom_of_stack, TMP0
|
||||
- load TMP1, 8(sp)
|
||||
- store TMP1, caml_last_return_address, TMP0
|
||||
- load TMP1, 16(sp)
|
||||
- store TMP1, caml_gc_regs, TMP0
|
||||
- addi sp, sp, 32
|
||||
- /* Update allocation pointer */
|
||||
- store ALLOC_PTR, caml_young_ptr, TMP0
|
||||
- /* reload callee-save registers and return */
|
||||
- load ra, 0xc0(sp)
|
||||
- load s0, 0x0(sp)
|
||||
- load s1, 0x8(sp)
|
||||
- load s2, 0x10(sp)
|
||||
- load s3, 0x18(sp)
|
||||
- load s4, 0x20(sp)
|
||||
- load s5, 0x28(sp)
|
||||
- load s6, 0x30(sp)
|
||||
- load s7, 0x38(sp)
|
||||
- load s8, 0x40(sp)
|
||||
- load s9, 0x48(sp)
|
||||
- load s10, 0x50(sp)
|
||||
- load s11, 0x58(sp)
|
||||
- fld fs0, 0x60(sp)
|
||||
- fld fs1, 0x68(sp)
|
||||
- fld fs2, 0x70(sp)
|
||||
- fld fs3, 0x78(sp)
|
||||
- fld fs4, 0x80(sp)
|
||||
- fld fs5, 0x88(sp)
|
||||
- fld fs6, 0x90(sp)
|
||||
- fld fs7, 0x98(sp)
|
||||
- fld fs8, 0xa0(sp)
|
||||
- fld fs9, 0xa8(sp)
|
||||
- fld fs10, 0xb0(sp)
|
||||
- fld fs11, 0xb8(sp)
|
||||
- addi sp, sp, 0xd0
|
||||
- ret
|
||||
+ load TMP1, caml_bottom_of_stack
|
||||
+ store TMP1, 0(sp)
|
||||
+ load TMP1, caml_last_return_address
|
||||
+ store TMP1, 8(sp)
|
||||
+ load TMP1, caml_gc_regs
|
||||
+ store TMP1, 16(sp)
|
||||
+ /* set up a trap frame */
|
||||
+ addi sp, sp, -16
|
||||
+ load TMP1, caml_exception_pointer
|
||||
+ store TMP1, 0(sp)
|
||||
+ lla TMP0, .Ltrap_handler
|
||||
+ store TMP0, 8(sp)
|
||||
+ mv TRAP_PTR, sp
|
||||
+ load ALLOC_PTR, caml_young_ptr
|
||||
+ load ALLOC_LIMIT, caml_young_limit
|
||||
+ store x0, caml_last_return_address, TMP0
|
||||
+ jalr ARG
|
||||
+.Lcaml_retaddr: /* pop trap frame, restoring caml_exception_pointer */
|
||||
+ load TMP1, 0(sp)
|
||||
+ store TMP1, caml_exception_pointer, TMP0
|
||||
+ addi sp, sp, 16
|
||||
+.Lreturn_result: /* pop callback link, restoring global variables */
|
||||
+ load TMP1, 0(sp)
|
||||
+ store TMP1, caml_bottom_of_stack, TMP0
|
||||
+ load TMP1, 8(sp)
|
||||
+ store TMP1, caml_last_return_address, TMP0
|
||||
+ load TMP1, 16(sp)
|
||||
+ store TMP1, caml_gc_regs, TMP0
|
||||
+ addi sp, sp, 32
|
||||
+ /* Update allocation pointer */
|
||||
+ store ALLOC_PTR, caml_young_ptr, TMP0
|
||||
+ /* reload callee-save registers and return */
|
||||
+ load ra, 0xc0(sp)
|
||||
+ load s0, 0x0(sp)
|
||||
+ load s1, 0x8(sp)
|
||||
+ load s2, 0x10(sp)
|
||||
+ load s3, 0x18(sp)
|
||||
+ load s4, 0x20(sp)
|
||||
+ load s5, 0x28(sp)
|
||||
+ load s6, 0x30(sp)
|
||||
+ load s7, 0x38(sp)
|
||||
+ load s8, 0x40(sp)
|
||||
+ load s9, 0x48(sp)
|
||||
+ load s10, 0x50(sp)
|
||||
+ load s11, 0x58(sp)
|
||||
+ fld fs0, 0x60(sp)
|
||||
+ fld fs1, 0x68(sp)
|
||||
+ fld fs2, 0x70(sp)
|
||||
+ fld fs3, 0x78(sp)
|
||||
+ fld fs4, 0x80(sp)
|
||||
+ fld fs5, 0x88(sp)
|
||||
+ fld fs6, 0x90(sp)
|
||||
+ fld fs7, 0x98(sp)
|
||||
+ fld fs8, 0xa0(sp)
|
||||
+ fld fs9, 0xa8(sp)
|
||||
+ fld fs10, 0xb0(sp)
|
||||
+ fld fs11, 0xb8(sp)
|
||||
+ addi sp, sp, 0xd0
|
||||
+ ret
|
||||
.Ltrap_handler:
|
||||
- store TRAP_PTR, caml_exception_pointer, TMP0
|
||||
- ori a0, a0, 2
|
||||
- j .Lreturn_result
|
||||
- .size caml_start_program, .-caml_start_program
|
||||
+ store TRAP_PTR, caml_exception_pointer, TMP0
|
||||
+ ori a0, a0, 2
|
||||
+ j .Lreturn_result
|
||||
+ .size caml_start_program, .-caml_start_program
|
||||
|
||||
/* Callback from C to OCaml */
|
||||
|
||||
- .align 2
|
||||
- .globl caml_callback_exn
|
||||
- .type caml_callback_exn, @function
|
||||
+ .align 2
|
||||
+ .globl caml_callback_exn
|
||||
+ .type caml_callback_exn, @function
|
||||
caml_callback_exn:
|
||||
/* Initial shuffling of arguments (a0 = closure, a1 = first arg) */
|
||||
- mv TMP1, a0
|
||||
- mv a0, a1 /* a0 = first arg */
|
||||
- mv a1, TMP1 /* a1 = closure environment */
|
||||
- load ARG, 0(TMP1) /* code pointer */
|
||||
- j .Ljump_to_caml
|
||||
- .size caml_callback_exn, .-caml_callback_exn
|
||||
+ mv TMP1, a0
|
||||
+ mv a0, a1 /* a0 = first arg */
|
||||
+ mv a1, TMP1 /* a1 = closure environment */
|
||||
+ load ARG, 0(TMP1) /* code pointer */
|
||||
+ j .Ljump_to_caml
|
||||
+ .size caml_callback_exn, .-caml_callback_exn
|
||||
|
||||
- .align 2
|
||||
- .globl caml_callback2_exn
|
||||
- .type caml_callback2_exn, @function
|
||||
+ .align 2
|
||||
+ .globl caml_callback2_exn
|
||||
+ .type caml_callback2_exn, @function
|
||||
caml_callback2_exn:
|
||||
/* Initial shuffling of arguments (a0 = closure, a1 = arg1, a2 = arg2) */
|
||||
- mv TMP1, a0
|
||||
- mv a0, a1
|
||||
- mv a1, a2
|
||||
- mv a2, TMP1
|
||||
- la ARG, caml_apply2
|
||||
- j .Ljump_to_caml
|
||||
- .size caml_callback2_exn, .-caml_callback2_exn
|
||||
+ mv TMP1, a0
|
||||
+ mv a0, a1
|
||||
+ mv a1, a2
|
||||
+ mv a2, TMP1
|
||||
+ la ARG, caml_apply2
|
||||
+ j .Ljump_to_caml
|
||||
+ .size caml_callback2_exn, .-caml_callback2_exn
|
||||
|
||||
- .align 2
|
||||
- .globl caml_callback3_exn
|
||||
- .type caml_callback3_exn, @function
|
||||
+ .align 2
|
||||
+ .globl caml_callback3_exn
|
||||
+ .type caml_callback3_exn, @function
|
||||
caml_callback3_exn:
|
||||
/* Initial shuffling of argumnets */
|
||||
/* (a0 = closure, a1 = arg1, a2 = arg2, a3 = arg3) */
|
||||
- mv TMP1, a0
|
||||
- mv a0, a1
|
||||
- mv a1, a2
|
||||
- mv a2, a3
|
||||
- mv a3, TMP1
|
||||
- la ARG, caml_apply3
|
||||
- j .Ljump_to_caml
|
||||
- .size caml_callback3_exn, .-caml_callback3_exn
|
||||
+ mv TMP1, a0
|
||||
+ mv a0, a1
|
||||
+ mv a1, a2
|
||||
+ mv a2, a3
|
||||
+ mv a3, TMP1
|
||||
+ la ARG, caml_apply3
|
||||
+ j .Ljump_to_caml
|
||||
+ .size caml_callback3_exn, .-caml_callback3_exn
|
||||
|
||||
- .align 2
|
||||
- .globl caml_ml_array_bound_error
|
||||
- .type caml_ml_array_bound_error, @function
|
||||
+ .align 2
|
||||
+ .globl caml_ml_array_bound_error
|
||||
+ .type caml_ml_array_bound_error, @function
|
||||
caml_ml_array_bound_error:
|
||||
/* Load address of [caml_array_bound_error] in ARG */
|
||||
- la ARG, caml_array_bound_error
|
||||
+ la ARG, caml_array_bound_error
|
||||
/* Call that function */
|
||||
- j caml_c_call
|
||||
+ j caml_c_call
|
||||
|
||||
- .globl caml_system__code_end
|
||||
+ .globl caml_system__code_end
|
||||
caml_system__code_end:
|
||||
|
||||
/* GC roots for callback */
|
||||
|
||||
- .section .data
|
||||
- .align 3
|
||||
- .globl caml_system__frametable
|
||||
- .type caml_system__frametable, @object
|
||||
+ .section .data
|
||||
+ .align 3
|
||||
+ .globl caml_system__frametable
|
||||
+ .type caml_system__frametable, @object
|
||||
caml_system__frametable:
|
||||
- .quad 1 /* one descriptor */
|
||||
- .quad .Lcaml_retaddr /* return address into callback */
|
||||
- .short -1 /* negative frame size => use callback link */
|
||||
- .short 0 /* no roots */
|
||||
- .align 3
|
||||
- .size caml_system__frametable, .-caml_system__frametable
|
||||
+ .quad 1 /* one descriptor */
|
||||
+ .quad .Lcaml_retaddr /* return address into callback */
|
||||
+ .short -1 /* negative frame size => use callback link */
|
||||
+ .short 0 /* no roots */
|
||||
+ .align 3
|
||||
+ .size caml_system__frametable, .-caml_system__frametable
|
||||
--
|
||||
2.17.1
|
||||
|
114
0005-flambda-Improve-transitive-closure-in-invariant_para.patch
Normal file
114
0005-flambda-Improve-transitive-closure-in-invariant_para.patch
Normal file
@ -0,0 +1,114 @@
|
||||
From acdc441ff1acb5390467e649bc9a9bfddd7df774 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Thu, 9 May 2024 10:03:23 +0200
|
||||
Subject: [PATCH 5/7] flambda: Improve transitive closure in
|
||||
invariant_params_in_recursion (#13150)
|
||||
|
||||
The old implementation did not really exploit the sparseness of the
|
||||
graph because it used newly discovered edges in later iterations.
|
||||
The new implementation processes each original relation only once
|
||||
per starting node, and does not re-process newly discovered relations.
|
||||
|
||||
(cherry picked from commit 787b4fbb5aaf3728de54ca240ba9ca0bf56ace60)
|
||||
---
|
||||
Changes | 5 ++
|
||||
middle_end/flambda/invariant_params.ml | 66 ++++++++++----------------
|
||||
2 files changed, 31 insertions(+), 40 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 75842fc216..d26512067d 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -1,6 +1,11 @@
|
||||
OCaml 5.2.0 (13 May 2024)
|
||||
-------------------------
|
||||
|
||||
+- #13150: improve a transitive-closure computation algorithm in the flambda
|
||||
+ middle-end to avoid a compilation time blowup on Menhir-generated code
|
||||
+ (Florian Weimer, review by Gabriel Scherer and Pierre Chambart,
|
||||
+ report by Richard Jones)
|
||||
+
|
||||
(Changes that can break existing programs are marked with a "*")
|
||||
|
||||
### Restored and new backends:
|
||||
diff --git a/middle_end/flambda/invariant_params.ml b/middle_end/flambda/invariant_params.ml
|
||||
index 414d39310a..dba63970fd 100644
|
||||
--- a/middle_end/flambda/invariant_params.ml
|
||||
+++ b/middle_end/flambda/invariant_params.ml
|
||||
@@ -65,47 +65,33 @@ let implies relation from to_ =
|
||||
relation
|
||||
|
||||
let transitive_closure state =
|
||||
- let union s1 s2 =
|
||||
- match s1, s2 with
|
||||
- | Top, _ | _, Top -> Top
|
||||
- | Implication s1, Implication s2 ->
|
||||
- Implication (Variable.Pair.Set.union s1 s2)
|
||||
+ (* Depth-first search for all implications for one argument.
|
||||
+ Arguments are moved from candidate to frontier, assuming
|
||||
+ they are newly added to the result. *)
|
||||
+ let rec loop candidate frontier result =
|
||||
+ match (candidate, frontier) with
|
||||
+ | ([], []) -> Implication result
|
||||
+ | ([], frontier::fs) ->
|
||||
+ (* Obtain fresh candidate for the frontier argument. *)
|
||||
+ (match Variable.Pair.Map.find frontier state with
|
||||
+ | exception Not_found -> loop [] fs result
|
||||
+ | Top -> Top
|
||||
+ | Implication candidate ->
|
||||
+ loop (Variable.Pair.Set.elements candidate) fs result)
|
||||
+ | (candidate::cs, frontier) ->
|
||||
+ let result' = Variable.Pair.Set.add candidate result in
|
||||
+ if result' != result then
|
||||
+ (* Result change means candidate becomes part of frontier. *)
|
||||
+ loop cs (candidate :: frontier) result'
|
||||
+ else
|
||||
+ loop cs frontier result
|
||||
in
|
||||
- let equal s1 s2 =
|
||||
- match s1, s2 with
|
||||
- | Top, Implication _ | Implication _, Top -> false
|
||||
- | Top, Top -> true
|
||||
- | Implication s1, Implication s2 -> Variable.Pair.Set.equal s1 s2
|
||||
- in
|
||||
- let update arg state =
|
||||
- let original_set =
|
||||
- try Variable.Pair.Map.find arg state with
|
||||
- | Not_found -> Implication Variable.Pair.Set.empty
|
||||
- in
|
||||
- match original_set with
|
||||
- | Top -> state
|
||||
- | Implication arguments ->
|
||||
- let set =
|
||||
- Variable.Pair.Set.fold
|
||||
- (fun orig acc->
|
||||
- let set =
|
||||
- try Variable.Pair.Map.find orig state with
|
||||
- | Not_found -> Implication Variable.Pair.Set.empty in
|
||||
- union set acc)
|
||||
- arguments original_set
|
||||
- in
|
||||
- Variable.Pair.Map.add arg set state
|
||||
- in
|
||||
- let once state =
|
||||
- Variable.Pair.Map.fold (fun arg _ state -> update arg state) state state
|
||||
- in
|
||||
- let rec fp state =
|
||||
- let state' = once state in
|
||||
- if Variable.Pair.Map.equal equal state state'
|
||||
- then state
|
||||
- else fp state'
|
||||
- in
|
||||
- fp state
|
||||
+ Variable.Pair.Map.map
|
||||
+ (fun set ->
|
||||
+ match set with
|
||||
+ | Top -> Top
|
||||
+ | Implication set -> loop [] (Variable.Pair.Set.elements set) set)
|
||||
+ state
|
||||
|
||||
(* CR-soon pchambart: to move to Flambda_utils and document
|
||||
mshinwell: I think this calculation is basically the same as
|
||||
--
|
||||
2.44.0
|
||||
|
165
0006-Reload-exception-pointer-register-in-caml_c_call.patch
Normal file
165
0006-Reload-exception-pointer-register-in-caml_c_call.patch
Normal file
@ -0,0 +1,165 @@
|
||||
From 8637cac022907501c3c0d941e07e436b70c9d4ac Mon Sep 17 00:00:00 2001
|
||||
From: Miod Vallat <118974489+dustanddreams@users.noreply.github.com>
|
||||
Date: Thu, 30 May 2024 09:57:41 +0000
|
||||
Subject: [PATCH 6/7] Reload exception pointer register in caml_c_call*
|
||||
|
||||
The invoked code may end up causing caml_try_realloc_stack() to be invoked,
|
||||
which in turn may replace the stack TRAP_PTR points to, leading to
|
||||
either crashes with the debug runtime (thanks to the old stack contents
|
||||
being overwritten) or all kinds of memory or control flow corruption otherwise.
|
||||
|
||||
Added test for stack reallocation in callback followed by exception raising.
|
||||
|
||||
(cherry picked from commit 6964d3a90f84402ed6066fb1821679435e063067)
|
||||
(cherry picked from commit 1e8a91d305f1fa4668444fb1cce97952dbc39810)
|
||||
---
|
||||
Changes | 9 +++++++++
|
||||
runtime/arm64.S | 6 ++++--
|
||||
runtime/power.S | 6 ++++--
|
||||
runtime/riscv.S | 6 ++++--
|
||||
runtime/s390x.S | 5 +++--
|
||||
testsuite/tests/callback/test1.ml | 5 +++++
|
||||
6 files changed, 29 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index d26512067d..53bb5369b9 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -1,3 +1,12 @@
|
||||
+OCaml 5.2 maintenance version
|
||||
+-----------------------------
|
||||
+
|
||||
+- #13207: Be sure to reload the register caching the exception handler in
|
||||
+ caml_c_call and caml_c_call_stack_args, as its value may have been changed
|
||||
+ if the OCaml stack is expanded during a callback.
|
||||
+ (Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and
|
||||
+ Xavier Leroy)
|
||||
+
|
||||
OCaml 5.2.0 (13 May 2024)
|
||||
-------------------------
|
||||
|
||||
diff --git a/runtime/arm64.S b/runtime/arm64.S
|
||||
index e71f25ebba..6c6495a0a8 100644
|
||||
--- a/runtime/arm64.S
|
||||
+++ b/runtime/arm64.S
|
||||
@@ -569,8 +569,9 @@ FUNCTION(caml_c_call)
|
||||
str TRAP_PTR, Caml_state(exn_handler)
|
||||
/* Call the function */
|
||||
blr ADDITIONAL_ARG
|
||||
- /* Reload alloc ptr */
|
||||
+ /* Reload new allocation pointer & exn handler */
|
||||
ldr ALLOC_PTR, Caml_state(young_ptr)
|
||||
+ ldr TRAP_PTR, Caml_state(exn_handler)
|
||||
/* Load ocaml stack */
|
||||
SWITCH_C_TO_OCAML
|
||||
#if defined(WITH_THREAD_SANITIZER)
|
||||
@@ -625,8 +626,9 @@ FUNCTION(caml_c_call_stack_args)
|
||||
blr ADDITIONAL_ARG
|
||||
/* Restore stack */
|
||||
mov sp, x19
|
||||
- /* Reload alloc ptr */
|
||||
+ /* Reload new allocation pointer & exn handler */
|
||||
ldr ALLOC_PTR, Caml_state(young_ptr)
|
||||
+ ldr TRAP_PTR, Caml_state(exn_handler)
|
||||
/* Switch from C to OCaml */
|
||||
SWITCH_C_TO_OCAML
|
||||
/* Return */
|
||||
diff --git a/runtime/power.S b/runtime/power.S
|
||||
index bfb37fa989..257678100e 100644
|
||||
--- a/runtime/power.S
|
||||
+++ b/runtime/power.S
|
||||
@@ -445,8 +445,9 @@ FUNCTION caml_c_call
|
||||
mr 2, C_CALL_TOC /* restore current TOC */
|
||||
/* Restore return address (in register C_CALL_RET_ADDR, preserved by C) */
|
||||
mtlr C_CALL_RET_ADDR
|
||||
- /* Reload allocation pointer*/
|
||||
+ /* Reload new allocation pointer and exception pointer */
|
||||
ld ALLOC_PTR, Caml_state(young_ptr)
|
||||
+ ld TRAP_PTR, Caml_state(exn_handler)
|
||||
#if defined(WITH_THREAD_SANITIZER)
|
||||
TSAN_SETUP_C_CALL 16
|
||||
/* Save return value registers. Since the called function could be anything,
|
||||
@@ -497,8 +498,9 @@ FUNCTION caml_c_call_stack_args
|
||||
add SP, SP, STACK_ARG_BYTES
|
||||
/* Restore return address (in register C_CALL_RET_ADDR, preserved by C) */
|
||||
mtlr C_CALL_RET_ADDR
|
||||
- /* Reload allocation pointer*/
|
||||
+ /* Reload new allocation pointer and exception pointer */
|
||||
ld ALLOC_PTR, Caml_state(young_ptr)
|
||||
+ ld TRAP_PTR, Caml_state(exn_handler)
|
||||
/* Switch from C to OCaml */
|
||||
SWITCH_C_TO_OCAML
|
||||
/* Return to caller */
|
||||
diff --git a/runtime/riscv.S b/runtime/riscv.S
|
||||
index a2eca7a315..8934db0bb3 100644
|
||||
--- a/runtime/riscv.S
|
||||
+++ b/runtime/riscv.S
|
||||
@@ -516,8 +516,9 @@ L(caml_c_call):
|
||||
sd TRAP_PTR, Caml_state(exn_handler)
|
||||
/* Call the function */
|
||||
jalr ADDITIONAL_ARG
|
||||
- /* Reload alloc ptr */
|
||||
+ /* Reload new allocation pointer & exn handler */
|
||||
ld ALLOC_PTR, Caml_state(young_ptr)
|
||||
+ ld TRAP_PTR, Caml_state(exn_handler)
|
||||
/* Load ocaml stack */
|
||||
SWITCH_C_TO_OCAML
|
||||
#if defined(WITH_THREAD_SANITIZER)
|
||||
@@ -575,8 +576,9 @@ FUNCTION(caml_c_call_stack_args)
|
||||
jalr ADDITIONAL_ARG
|
||||
/* Restore stack */
|
||||
mv sp, s2
|
||||
- /* Reload alloc ptr */
|
||||
+ /* Reload new allocation pointer & exn handler */
|
||||
ld ALLOC_PTR, Caml_state(young_ptr)
|
||||
+ ld TRAP_PTR, Caml_state(exn_handler)
|
||||
/* Switch from C to OCaml */
|
||||
SWITCH_C_TO_OCAML
|
||||
/* Return */
|
||||
diff --git a/runtime/s390x.S b/runtime/s390x.S
|
||||
index b59822ce57..113831a376 100644
|
||||
--- a/runtime/s390x.S
|
||||
+++ b/runtime/s390x.S
|
||||
@@ -515,7 +515,7 @@ LBL(caml_c_call):
|
||||
#endif
|
||||
basr %r14, ADDITIONAL_ARG
|
||||
CLEANUP_AFTER_C_CALL
|
||||
- /* Reload alloc ptr */
|
||||
+ /* Reload new allocation pointer & exn handler */
|
||||
lg ALLOC_PTR, Caml_state(young_ptr)
|
||||
lg TRAP_PTR, Caml_state(exn_handler)
|
||||
/* Load ocaml stack and restore global variables */
|
||||
@@ -584,8 +584,9 @@ LBL(106):
|
||||
CLEANUP_AFTER_C_CALL
|
||||
/* Restore stack */
|
||||
lgr %r15, %r12
|
||||
- /* Reload alloc ptr */
|
||||
+ /* Reload new allocation pointer & exn handler */
|
||||
lg ALLOC_PTR, Caml_state(young_ptr)
|
||||
+ lg TRAP_PTR, Caml_state(exn_handler)
|
||||
/* Switch from C to OCaml */
|
||||
SWITCH_C_TO_OCAML
|
||||
/* Return */
|
||||
diff --git a/testsuite/tests/callback/test1.ml b/testsuite/tests/callback/test1.ml
|
||||
index c39be0c586..f6ad4356cf 100644
|
||||
--- a/testsuite/tests/callback/test1.ml
|
||||
+++ b/testsuite/tests/callback/test1.ml
|
||||
@@ -11,6 +11,9 @@ external mycallback3 : ('a -> 'b -> 'c -> 'd) -> 'a -> 'b -> 'c -> 'd
|
||||
external mycallback4 :
|
||||
('a -> 'b -> 'c -> 'd -> 'e) -> 'a -> 'b -> 'c -> 'd -> 'e = "mycallback4"
|
||||
|
||||
+let rec growstack n =
|
||||
+ if n <= 0 then 0 else 1 + growstack (n - 1)
|
||||
+
|
||||
let rec tak (x, y, z as _tuple) =
|
||||
if x > y then tak(tak (x-1, y, z), tak (y-1, z, x), tak (z-1, x, y))
|
||||
else z
|
||||
@@ -46,3 +49,5 @@ let _ =
|
||||
print_int(trapexit ()); print_newline();
|
||||
print_string(tripwire mypushroot); print_newline();
|
||||
print_string(tripwire mycamlparam); print_newline();
|
||||
+ begin try ignore (mycallback1 growstack 1_000); raise Exit
|
||||
+ with Exit -> () end
|
||||
--
|
||||
2.44.0
|
||||
|
@ -1,25 +0,0 @@
|
||||
From 207fbbc2616ee44e048dd5bb133e52f252cd1caf Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Ojeda Bar <n.oje.bar@gmail.com>
|
||||
Date: Sat, 2 Dec 2017 10:44:41 +0100
|
||||
Subject: [PATCH 6/8] fix caml_c_call: reload caml_young_limit
|
||||
|
||||
---
|
||||
asmrun/riscv.S | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/asmrun/riscv.S b/asmrun/riscv.S
|
||||
index 88d7ab924..121f8ba71 100644
|
||||
--- a/asmrun/riscv.S
|
||||
+++ b/asmrun/riscv.S
|
||||
@@ -187,7 +187,7 @@ caml_c_call:
|
||||
jalr ARG
|
||||
/* Reload alloc ptr and alloc limit */
|
||||
load ALLOC_PTR, caml_young_ptr
|
||||
- load TRAP_PTR, caml_exception_pointer
|
||||
+ load ALLOC_LIMIT, caml_young_limit
|
||||
/* Return */
|
||||
jr s2
|
||||
.size caml_c_call, .-caml_c_call
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,67 +0,0 @@
|
||||
From a89427d52a20633be40056fe008b7eeec5ded7dd Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Nicol=C3=A1s=20Ojeda=20B=C3=A4r?= <n.oje.bar@gmail.com>
|
||||
Date: Tue, 15 May 2018 07:17:06 +0000
|
||||
Subject: [PATCH 7/8] Adapt to 4.07
|
||||
|
||||
---
|
||||
asmcomp/riscv/emit.mlp | 28 +++++++++++++++++-----------
|
||||
asmcomp/riscv/selection.ml | 2 +-
|
||||
2 files changed, 18 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp
|
||||
index 51165d0f1..718dca080 100644
|
||||
--- a/asmcomp/riscv/emit.mlp
|
||||
+++ b/asmcomp/riscv/emit.mlp
|
||||
@@ -461,19 +461,25 @@ let emit_instr i =
|
||||
` {emit_string name} {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_label lbl}\n`
|
||||
| Iinttest_imm _ ->
|
||||
fatal_error "Emit.emit_instr (Iinttest_imm _)"
|
||||
- | Ifloattest(cmp, neg) ->
|
||||
- let neg = match cmp with
|
||||
- | Ceq -> ` feq.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; neg
|
||||
- | Cne -> ` feq.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; not neg
|
||||
- | Clt -> ` flt.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; neg
|
||||
- | Cgt -> ` flt.d {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n`; neg
|
||||
- | Cle -> ` fle.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; neg
|
||||
- | Cge -> ` fle.d {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n`; neg
|
||||
- in
|
||||
- if neg then
|
||||
+ | Ifloattest cmp ->
|
||||
+ begin match cmp with
|
||||
+ | CFeq | CFneq ->
|
||||
+ ` feq.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`
|
||||
+ | CFlt | CFnlt ->
|
||||
+ ` flt.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`
|
||||
+ | CFgt | CFngt ->
|
||||
+ ` flt.d {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n`
|
||||
+ | CFle | CFnle ->
|
||||
+ ` fle.d {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`
|
||||
+ | CFge | CFnge ->
|
||||
+ ` fle.d {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n`
|
||||
+ end;
|
||||
+ begin match cmp with
|
||||
+ | CFneq | CFnlt | CFngt | CFnle | CFnge ->
|
||||
` beqz {emit_reg reg_tmp1}, {emit_label lbl}\n`
|
||||
- else
|
||||
+ | CFeq | CFlt | CFgt | CFle | CFge ->
|
||||
` bnez {emit_reg reg_tmp1}, {emit_label lbl}\n`
|
||||
+ end
|
||||
| Ioddtest ->
|
||||
` andi {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, 1\n`;
|
||||
` bnez {emit_reg reg_tmp1}, {emit_label lbl}\n`
|
||||
diff --git a/asmcomp/riscv/selection.ml b/asmcomp/riscv/selection.ml
|
||||
index 092ca88aa..1f0af6abc 100644
|
||||
--- a/asmcomp/riscv/selection.ml
|
||||
+++ b/asmcomp/riscv/selection.ml
|
||||
@@ -61,7 +61,7 @@ method! select_condition = function
|
||||
| Cop(Ccmpa cmp, args, _) ->
|
||||
(Iinttest(Iunsigned cmp), Ctuple args)
|
||||
| Cop(Ccmpf cmp, args, _) ->
|
||||
- (Ifloattest(cmp, false), Ctuple args)
|
||||
+ (Ifloattest cmp, Ctuple args)
|
||||
| Cop(Cand, [arg; Cconst_int 1], _) ->
|
||||
(Ioddtest, arg)
|
||||
| arg ->
|
||||
--
|
||||
2.17.1
|
||||
|
178
0007-Compute-more-accurate-instruction-sizes-for-branch-r.patch
Normal file
178
0007-Compute-more-accurate-instruction-sizes-for-branch-r.patch
Normal file
@ -0,0 +1,178 @@
|
||||
From 4eb80b13779125fcd76a445ab0004ca064fab634 Mon Sep 17 00:00:00 2001
|
||||
From: Miod Vallat <miod@tarides.com>
|
||||
Date: Fri, 7 Jun 2024 06:19:45 +0000
|
||||
Subject: [PATCH 7/7] Compute more accurate instruction sizes for branch
|
||||
relaxation.
|
||||
|
||||
(cherry picked from commit 114ddae2d4c85391a4f939dc6623424ae35a07aa)
|
||||
---
|
||||
Changes | 4 ++
|
||||
asmcomp/power/emit.mlp | 87 ++++++++++++++++++++++++------------------
|
||||
2 files changed, 53 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/Changes b/Changes
|
||||
index 53bb5369b9..1a81509247 100644
|
||||
--- a/Changes
|
||||
+++ b/Changes
|
||||
@@ -7,6 +7,10 @@ OCaml 5.2 maintenance version
|
||||
(Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and
|
||||
Xavier Leroy)
|
||||
|
||||
+- #13221: Compute more accurate instruction sizes for branch relocation on
|
||||
+ POWER.
|
||||
+ (Miod Vallat, review by Gabriel Scherer)
|
||||
+
|
||||
OCaml 5.2.0 (13 May 2024)
|
||||
-------------------------
|
||||
|
||||
diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp
|
||||
index 47f5419a92..fdf22996fa 100644
|
||||
--- a/asmcomp/power/emit.mlp
|
||||
+++ b/asmcomp/power/emit.mlp
|
||||
@@ -177,6 +177,28 @@ let emit_tocload emit_dest dest entry =
|
||||
|
||||
(* Output a load or store operation *)
|
||||
|
||||
+let load_mnemonic = function
|
||||
+ | Byte_unsigned -> "lbz"
|
||||
+ | Byte_signed -> "lbz"
|
||||
+ | Sixteen_unsigned -> "lhz"
|
||||
+ | Sixteen_signed -> "lha"
|
||||
+ | Thirtytwo_unsigned -> "lwz"
|
||||
+ | Thirtytwo_signed -> "lwa"
|
||||
+ | Word_int | Word_val -> "ld"
|
||||
+ | Single -> "lfs"
|
||||
+ | Double -> "lfd"
|
||||
+
|
||||
+let store_mnemonic = function
|
||||
+ | Byte_unsigned | Byte_signed -> "stb"
|
||||
+ | Sixteen_unsigned | Sixteen_signed -> "sth"
|
||||
+ | Thirtytwo_unsigned | Thirtytwo_signed -> "stw"
|
||||
+ | Word_int | Word_val -> "std"
|
||||
+ | Single -> "stfs"
|
||||
+ | Double -> "stfd"
|
||||
+
|
||||
+let store_needs_lwsync chunk assignment =
|
||||
+ assignment && (chunk = Word_int || chunk = Word_val)
|
||||
+
|
||||
let valid_offset instr ofs =
|
||||
ofs land 3 = 0 || (instr <> "ld" && instr <> "std" && instr <> "lwa")
|
||||
|
||||
@@ -383,11 +405,17 @@ module BR = Branch_relaxation.Make (struct
|
||||
|
||||
let tocload_size = 2
|
||||
|
||||
- let load_store_size = function
|
||||
+ let load_store_size instr = function
|
||||
| Ibased(_s, d) ->
|
||||
- let (_lo, hi) = low_high_s d in
|
||||
- tocload_size + (if hi = 0 then 1 else 2)
|
||||
- | Iindexed ofs -> if is_immediate ofs then 1 else 3
|
||||
+ let (lo, hi) = low_high_s d in
|
||||
+ tocload_size +
|
||||
+ (if hi <> 0 then 1 else 0) +
|
||||
+ (if valid_offset instr lo then 1 else 2)
|
||||
+ | Iindexed ofs ->
|
||||
+ if is_immediate ofs && valid_offset instr ofs then 1 else begin
|
||||
+ let (lo, _hi) = low_high_u ofs in
|
||||
+ if lo <> 0 then 3 else 2
|
||||
+ end
|
||||
| Iindexed2 -> 1
|
||||
|
||||
let instr_size f = function
|
||||
@@ -415,16 +443,16 @@ module BR = Branch_relaxation.Make (struct
|
||||
else if alloc then tocload_size + 2
|
||||
else 5
|
||||
| Lop(Istackoffset _) -> 1
|
||||
- | Lop(Iload {memory_chunk; addressing_mode; _ }) ->
|
||||
- if memory_chunk = Byte_signed
|
||||
- then load_store_size addressing_mode + 1
|
||||
- else load_store_size addressing_mode
|
||||
+ | Lop(Iload {memory_chunk; addressing_mode; is_atomic }) ->
|
||||
+ let loadinstr = load_mnemonic memory_chunk in
|
||||
+ (if is_atomic then 4 else 0) +
|
||||
+ (if memory_chunk = Byte_signed then 1 else 0) +
|
||||
+ load_store_size loadinstr addressing_mode
|
||||
| Lop(Istore(chunk, addr, assignment)) ->
|
||||
- (match chunk with
|
||||
- | Single -> 1
|
||||
- | Word_int | Word_val when assignment -> 1
|
||||
- | _ -> 0)
|
||||
- + load_store_size addr
|
||||
+ let storeinstr = store_mnemonic chunk in
|
||||
+ (if chunk = Single then 1 else 0) +
|
||||
+ (if store_needs_lwsync chunk assignment then 1 else 0) +
|
||||
+ load_store_size storeinstr addr
|
||||
| Lop(Ialloc _) -> 5
|
||||
| Lop(Ispecific(Ialloc_far _)) -> 6
|
||||
| Lop(Ipoll { return_label = Some(_) }) -> 5
|
||||
@@ -442,12 +470,12 @@ module BR = Branch_relaxation.Make (struct
|
||||
| Lop(Ispecific(Icheckbound_imm_far _)) -> 3
|
||||
| Lop(Iintop_imm _) -> 1
|
||||
| Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1
|
||||
- | Lop(Ifloatofint) -> 9
|
||||
- | Lop(Iintoffloat) -> 4
|
||||
+ | Lop(Ifloatofint) -> 3
|
||||
+ | Lop(Iintoffloat) -> 3
|
||||
| Lop(Iopaque) -> 0
|
||||
| Lop(Ispecific _) -> 1
|
||||
- | Lop (Idls_get) -> 1
|
||||
- | Lop (Ireturn_addr) -> 1
|
||||
+ | Lop(Idls_get) -> 1
|
||||
+ | Lop(Ireturn_addr) -> 1
|
||||
| Lreloadretaddr -> 2
|
||||
| Lreturn -> 2
|
||||
| Llabel _ -> 0
|
||||
@@ -457,7 +485,7 @@ module BR = Branch_relaxation.Make (struct
|
||||
1 + (if lbl0 = None then 0 else 1)
|
||||
+ (if lbl1 = None then 0 else 1)
|
||||
+ (if lbl2 = None then 0 else 1)
|
||||
- | Lswitch _ -> 5 + tocload_size
|
||||
+ | Lswitch _ -> 7 + tocload_size
|
||||
| Lentertrap -> 1
|
||||
| Ladjust_trap_depth _ -> 0
|
||||
| Lpushtrap _ -> 4 + tocload_size
|
||||
@@ -705,17 +733,7 @@ let emit_instr env i =
|
||||
` addi 1, 1, {emit_int (-n)}\n`;
|
||||
adjust_stack_offset env n
|
||||
| Lop(Iload { memory_chunk; addressing_mode; is_atomic }) ->
|
||||
- let loadinstr =
|
||||
- match memory_chunk with
|
||||
- | Byte_unsigned -> "lbz"
|
||||
- | Byte_signed -> "lbz"
|
||||
- | Sixteen_unsigned -> "lhz"
|
||||
- | Sixteen_signed -> "lha"
|
||||
- | Thirtytwo_unsigned -> "lwz"
|
||||
- | Thirtytwo_signed -> "lwa"
|
||||
- | Word_int | Word_val -> "ld"
|
||||
- | Single -> "lfs"
|
||||
- | Double -> "lfd" in
|
||||
+ let loadinstr = load_mnemonic memory_chunk in
|
||||
if is_atomic then
|
||||
` sync\n`;
|
||||
emit_load_store loadinstr addressing_mode i.arg 0 i.res.(0);
|
||||
@@ -731,19 +749,12 @@ let emit_instr env i =
|
||||
` frsp {emit_reg tmp}, {emit_reg i.arg.(0)}\n`;
|
||||
emit_load_store "stfs" addr i.arg 1 tmp
|
||||
| Lop(Istore(chunk, addr, assignment)) ->
|
||||
- let storeinstr =
|
||||
- match chunk with
|
||||
- | Byte_unsigned | Byte_signed -> "stb"
|
||||
- | Sixteen_unsigned | Sixteen_signed -> "sth"
|
||||
- | Thirtytwo_unsigned | Thirtytwo_signed -> "stw"
|
||||
- | Word_int | Word_val -> "std"
|
||||
- | Single -> assert false
|
||||
- | Double -> "stfd" in
|
||||
+ let storeinstr = store_mnemonic chunk in
|
||||
(* Non-initializing stores need a memory barrier to follow the
|
||||
Multicore OCaml memory model. Stores of size other than
|
||||
Word_int and Word_val do not follow the memory model and therefore
|
||||
do not need a barrier *)
|
||||
- if assignment && (chunk = Word_int || chunk = Word_val) then
|
||||
+ if store_needs_lwsync chunk assignment then
|
||||
` lwsync\n`;
|
||||
emit_load_store storeinstr addr i.arg 1 i.arg.(0)
|
||||
| Lop(Ialloc { bytes; dbginfo }) ->
|
||||
--
|
||||
2.44.0
|
||||
|
@ -1,40 +0,0 @@
|
||||
From af276d83f41cb9eb9f1e50a75a9be205c9b2fee6 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Tue, 5 Jun 2018 19:48:08 +0000
|
||||
Subject: [PATCH 8/8] riscv: Emit debug info.
|
||||
|
||||
---
|
||||
asmcomp/riscv/emit.mlp | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp
|
||||
index 718dca080..e42ee9770 100644
|
||||
--- a/asmcomp/riscv/emit.mlp
|
||||
+++ b/asmcomp/riscv/emit.mlp
|
||||
@@ -261,6 +261,7 @@ let tailrec_entry_point = ref 0
|
||||
(* Output the assembly code for an instruction *)
|
||||
|
||||
let emit_instr i =
|
||||
+ emit_debug_info i.dbg;
|
||||
match i.desc with
|
||||
Lend -> ()
|
||||
| Lop(Imove | Ispill | Ireload) ->
|
||||
@@ -560,6 +561,7 @@ let fundecl fundecl =
|
||||
emit_stack_adjustment (-n);
|
||||
if !contains_calls then store_ra n;
|
||||
`{emit_label !tailrec_entry_point}:\n`;
|
||||
+ emit_debug_info fundecl.fun_dbg;
|
||||
emit_all fundecl.fun_body;
|
||||
List.iter emit_call_gc !call_gc_sites;
|
||||
List.iter emit_call_bound_error !bound_error_sites;
|
||||
@@ -619,6 +621,7 @@ let data l =
|
||||
|
||||
let begin_assembly() =
|
||||
` .file \"\"\n`; (* PR#7073 *)
|
||||
+ reset_debug_info ();
|
||||
(* Emit the beginning of the segments *)
|
||||
let lbl_begin = Compilenv.make_symbol (Some "data_begin") in
|
||||
` {emit_string data_space}\n`;
|
||||
--
|
||||
2.17.1
|
||||
|
2
gating.yaml
Normal file → Executable file
2
gating.yaml
Normal file → Executable file
@ -1,6 +1,6 @@
|
||||
--- !Policy
|
||||
product_versions:
|
||||
- rhel-8
|
||||
- rhel-*
|
||||
decision_context: osci_compose_gate
|
||||
rules:
|
||||
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}
|
||||
|
69
macros.ocaml-rpm
Normal file
69
macros.ocaml-rpm
Normal file
@ -0,0 +1,69 @@
|
||||
# Make %files lists from an installed tree of files.
|
||||
# Options:
|
||||
# -s: separate packaging; every subdirectory of %%{ocamldir}, except stublibs,
|
||||
# is placed in its own package. This option requires the existence of opam
|
||||
# *.install files in the build tree.
|
||||
# -n: suppress creation of a devel subpackage.
|
||||
%ocaml_files(sn) %{python3} /usr/lib/rpm/redhat/ocaml_files.py %{-s} %{-n} %{buildroot} %{ocamldir}
|
||||
|
||||
# Internal macro holding the common parts of ocaml_install and dune_install
|
||||
%ocaml_install_common(sn) %{expand:
|
||||
rm -rf %{buildroot}%{_prefix}/doc
|
||||
mlis=$(find %{buildroot}%{_libdir}/ocaml -name '*.mli')
|
||||
rm -f ${mlis//.mli/.ml}
|
||||
%ocaml_files %{-s} %{-n}}
|
||||
|
||||
# Install files listed in opam *.install files.
|
||||
# Options:
|
||||
# -s: separate packaging; every subdirectory of %%{ocamldir}, except stublibs,
|
||||
# is placed in its own package.
|
||||
# -n: suppress creation of a devel subpackage.
|
||||
%ocaml_install(sn) %{expand:
|
||||
%{python3} /usr/lib/rpm/redhat/ocaml_files.py -i %{-s} %{-n} %{buildroot} %{ocamldir}
|
||||
%ocaml_install_common %{-s} %{-n}}
|
||||
|
||||
# Add smp_mflags to arguments if no -j release option is given.
|
||||
# Add --release to arguments if no -p or --release option is given.
|
||||
# Add --verbose to arguments if it is not given.
|
||||
%dune_add_flags(-) %{lua:
|
||||
has_j = false
|
||||
has_p = false
|
||||
has_v = false
|
||||
for _, flag in pairs(arg) do
|
||||
if flag:find("^-j") then
|
||||
has_j = true
|
||||
elseif flag:find("^-p") or flag:find("^--release)") then
|
||||
has_p = true
|
||||
elseif flag:find("^--verbose") then
|
||||
has_v = true
|
||||
end
|
||||
end
|
||||
if not has_j then
|
||||
table.insert(arg, 1, rpm.expand("%{?_smp_mflags}"))
|
||||
end
|
||||
if not has_p then
|
||||
table.insert(arg, 1, "--release")
|
||||
end
|
||||
if not has_v then
|
||||
table.insert(arg, 1, "--verbose")
|
||||
end
|
||||
print(table.concat(arg, " "))
|
||||
}
|
||||
|
||||
# Build with dune
|
||||
%dune_build(-) dune build %{dune_add_flags %*}
|
||||
|
||||
# Run tests with dune
|
||||
%dune_check(-) dune runtest %{dune_add_flags %*}
|
||||
|
||||
# Install with dune
|
||||
# Options:
|
||||
# -s: separate packaging; every subdirectory of %%{ocamldir}, except stublibs,
|
||||
# is placed in its own package.
|
||||
# -n: suppress creation of a devel subpackage.
|
||||
%dune_install(sn) %{expand:
|
||||
dune install --destdir=%{buildroot} %{dune_add_flags %*}
|
||||
if [ -d _build/default/_doc/_html ]; then
|
||||
find _build/default/_doc/_html -name .dune-keep -delete
|
||||
fi
|
||||
%ocaml_install_common %{-s} %{-n}}
|
613
ocaml.spec
613
ocaml.spec
@ -1,3 +1,13 @@
|
||||
# Don't add -Wl,-dT,<build dir>
|
||||
%undefine _package_note_flags
|
||||
|
||||
# OCaml 5.1 broke building with LTO. A file prims.c is generated with
|
||||
# primitive function declarations, all with "void" for their parameter
|
||||
# list. This does not match the real definitions, leading to lots of
|
||||
# -Wlto-type-mismatch warnings. These change the output of the tests,
|
||||
# leading to many failed tests. This is still a problem in 5.2.
|
||||
%global _lto_cflags %{nil}
|
||||
|
||||
# OCaml has a bytecode backend that works on anything with a C
|
||||
# compiler, and a native code backend available on a subset of
|
||||
# architectures. A further subset of architectures support native
|
||||
@ -15,27 +25,37 @@
|
||||
%global natdynlink 0
|
||||
%endif
|
||||
|
||||
# i686 support was dropped in OCaml 5 / Fedora 39.
|
||||
ExcludeArch: %{ix86}
|
||||
|
||||
# These are all the architectures that the tests run on. The tests
|
||||
# take a long time to run, so don't run them on slow machines.
|
||||
%global test_arches aarch64 %{power64} x86_64
|
||||
%global test_arches aarch64 %{power64} riscv64 s390x x86_64
|
||||
# These are the architectures for which the tests must pass otherwise
|
||||
# the build will fail.
|
||||
%global test_arches_required aarch64 x86_64
|
||||
#global test_arches_required aarch64 ppc64le x86_64
|
||||
%global test_arches_required NONE
|
||||
|
||||
# Architectures where parallel builds fail.
|
||||
#%global no_parallel_build_arches aarch64
|
||||
#global no_parallel_build_arches aarch64
|
||||
|
||||
#global rcver +git
|
||||
%global rcver %{nil}
|
||||
|
||||
Name: ocaml
|
||||
Version: 4.07.0
|
||||
Release: 3%{?dist}
|
||||
Version: 5.2.0
|
||||
Release: 4%{?dist}
|
||||
|
||||
Summary: OCaml compiler and programming environment
|
||||
|
||||
License: QPL and (LGPLv2+ with exceptions)
|
||||
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception
|
||||
|
||||
URL: http://www.ocaml.org
|
||||
URL: https://www.ocaml.org
|
||||
VCS: https://github.com/ocaml/ocaml
|
||||
|
||||
Source0: http://caml.inria.fr/pub/distrib/ocaml-4.07/ocaml-%{version}.tar.xz
|
||||
Source0: %{vcs}/archive/%{version}%{rcver}/%{name}-%{version}%{rcver}.tar.gz
|
||||
Source1: macros.ocaml-rpm
|
||||
Source2: ocaml_files.py
|
||||
|
||||
# IMPORTANT NOTE:
|
||||
#
|
||||
@ -46,61 +66,77 @@ Source0: http://caml.inria.fr/pub/distrib/ocaml-4.07/ocaml-%{version}.tar
|
||||
#
|
||||
# https://pagure.io/fedora-ocaml
|
||||
#
|
||||
# Current branch: fedora-29-4.07.0
|
||||
# Current branch: fedora-41-5.2.0
|
||||
#
|
||||
# ALTERNATIVELY add a patch to the end of the list (leaving the
|
||||
# existing patches unchanged) adding a comment to note that it should
|
||||
# be incorporated into the git repo at a later time.
|
||||
#
|
||||
|
||||
# Fedora-specific downstream patches.
|
||||
Patch0001: 0001-Don-t-add-rpaths-to-libraries.patch
|
||||
Patch0002: 0002-ocamlbyteinfo-ocamlplugininfo-Useful-utilities-from-.patch
|
||||
Patch0003: 0003-configure-Allow-user-defined-C-compiler-flags.patch
|
||||
# Upstream after 5.2.0:
|
||||
Patch: 0001-Changes-synchronisation-and-consistency-with-trunk.patch
|
||||
Patch: 0002-Changes-copy-editing.patch
|
||||
|
||||
# Out of tree patch for RISC-V support.
|
||||
# https://github.com/nojb/riscv-ocaml
|
||||
Patch0004: 0004-Add-RISC-V-backend.patch
|
||||
Patch0005: 0005-Copyright-untabify.patch
|
||||
Patch0006: 0006-fix-caml_c_call-reload-caml_young_limit.patch
|
||||
Patch0007: 0007-Adapt-to-4.07.patch
|
||||
# Fedora-specific patches
|
||||
Patch: 0003-Don-t-add-rpaths-to-libraries.patch
|
||||
Patch: 0004-configure-Allow-user-defined-C-compiler-flags.patch
|
||||
|
||||
# RISC-V patch to add debuginfo (DWARF) generation.
|
||||
# Sent upstream 2018-06-05.
|
||||
Patch0008: 0008-riscv-Emit-debug-info.patch
|
||||
# Improve performance of flambda optimizer in some cases. Required to
|
||||
# compiler blow-up in coccinelle package. Upstream, but not included
|
||||
# in 5.2 branch.
|
||||
# https://github.com/ocaml/ocaml/pull/13150
|
||||
Patch: 0005-flambda-Improve-transitive-closure-in-invariant_para.patch
|
||||
|
||||
# Upstream after 5.2.0:
|
||||
Patch: 0006-Reload-exception-pointer-register-in-caml_c_call.patch
|
||||
|
||||
# Fix for ppc64le code generation issue found after 5.2.0 was released.
|
||||
# https://github.com/ocaml/ocaml/issues/13220
|
||||
# https://github.com/ocaml/ocaml/commit/114ddae2d4c85391a4f939dc6623424ae35a07aa
|
||||
Patch: 0007-Compute-more-accurate-instruction-sizes-for-branch-r.patch
|
||||
|
||||
BuildRequires: make
|
||||
BuildRequires: git
|
||||
BuildRequires: gcc
|
||||
BuildRequires: binutils-devel
|
||||
BuildRequires: ncurses-devel
|
||||
BuildRequires: gdbm-devel
|
||||
BuildRequires: emacs
|
||||
BuildRequires: autoconf
|
||||
BuildRequires: gawk
|
||||
BuildRequires: hardlink
|
||||
BuildRequires: perl-interpreter
|
||||
BuildRequires: util-linux
|
||||
BuildRequires: libICE-devel
|
||||
BuildRequires: libSM-devel
|
||||
BuildRequires: libX11-devel
|
||||
BuildRequires: libXaw-devel
|
||||
BuildRequires: libXext-devel
|
||||
BuildRequires: libXft-devel
|
||||
BuildRequires: libXmu-devel
|
||||
BuildRequires: libXrender-devel
|
||||
BuildRequires: libXt-devel
|
||||
BuildRequires: chrpath
|
||||
BuildRequires: /usr/bin/annocheck
|
||||
BuildRequires: pkgconfig(libzstd)
|
||||
|
||||
# Documentation requirements
|
||||
BuildRequires: asciidoc
|
||||
BuildRequires: python3-pygments
|
||||
|
||||
# ocamlopt runs gcc to link binaries. Because Fedora includes
|
||||
# hardening flags automatically, redhat-rpm-config is also required.
|
||||
# Compressed marshaling requires libzstd-devel.
|
||||
Requires: gcc
|
||||
Requires: redhat-rpm-config
|
||||
Requires: libzstd-devel%{?_isa}
|
||||
|
||||
# Because we pass -c flag to ocaml-find-requires (to avoid circular
|
||||
# dependencies) we also have to explicitly depend on the right version
|
||||
# of ocaml-runtime.
|
||||
Requires: ocaml-runtime = %{version}-%{release}
|
||||
Requires: ocaml-runtime%{?_isa} = %{version}-%{release}
|
||||
|
||||
# Bundles an MD5 implementation in byterun/md5.{c,h}
|
||||
# Force ocaml-srpm-macros to be at the latest version, both for builds
|
||||
# and installs, since OCaml 5.2 has a different set of native code
|
||||
# generators than previous versions.
|
||||
BuildRequires: ocaml-srpm-macros >= 10
|
||||
Requires: ocaml-srpm-macros >= 10
|
||||
|
||||
# Bundles an MD5 implementation in runtime/caml/md5.h and runtime/md5.c
|
||||
Provides: bundled(md5-plumb)
|
||||
|
||||
Provides: ocaml(compiler) = %{version}
|
||||
|
||||
%if %{native_compiler}
|
||||
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte'
|
||||
%else
|
||||
%global __ocaml_requires_opts -c -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte' -i Backend_intf -i Inlining_decision_intf -i Simplify_boxed_integer_ops_intf
|
||||
%endif
|
||||
%global __ocaml_provides_opts -f '%{buildroot}%{_bindir}/ocamlrun %{buildroot}%{_bindir}/ocamlobjinfo.byte'
|
||||
|
||||
|
||||
@ -115,6 +151,10 @@ and a comprehensive library.
|
||||
|
||||
|
||||
%package runtime
|
||||
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
|
||||
# LicenseRef-Fedora-Public-Domain: the MD5 implementation in runtime/caml/md5.h
|
||||
# and runtime/md5.c
|
||||
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND LicenseRef-Fedora-Public-Domain
|
||||
Summary: OCaml runtime environment
|
||||
Requires: util-linux
|
||||
Provides: ocaml(runtime) = %{version}
|
||||
@ -129,44 +169,28 @@ bytecode.
|
||||
|
||||
%package source
|
||||
Summary: Source code for OCaml libraries
|
||||
Requires: ocaml = %{version}-%{release}
|
||||
Requires: ocaml%{?_isa} = %{version}-%{release}
|
||||
|
||||
%description source
|
||||
Source code for OCaml libraries.
|
||||
|
||||
|
||||
%package x11
|
||||
Summary: X11 support for OCaml
|
||||
Requires: ocaml-runtime = %{version}-%{release}
|
||||
Requires: libX11-devel
|
||||
|
||||
%description x11
|
||||
X11 support for OCaml.
|
||||
|
||||
|
||||
%package ocamldoc
|
||||
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
|
||||
# LicenseRef-Fedora-Public-Domain: ocamldoc/ocamldoc.sty
|
||||
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND LicenseRef-Fedora-Public-Domain
|
||||
Summary: Documentation generator for OCaml
|
||||
Requires: ocaml = %{version}-%{release}
|
||||
Provides: ocamldoc
|
||||
Requires: ocaml%{?_isa} = %{version}-%{release}
|
||||
Provides: ocamldoc = %{version}
|
||||
|
||||
%description ocamldoc
|
||||
Documentation generator for OCaml.
|
||||
|
||||
|
||||
%package emacs
|
||||
Summary: Emacs mode for OCaml
|
||||
Requires: ocaml = %{version}-%{release}
|
||||
Requires: emacs(bin)
|
||||
|
||||
%description emacs
|
||||
Emacs mode for OCaml.
|
||||
|
||||
|
||||
%package docs
|
||||
Summary: Documentation for OCaml
|
||||
BuildArch: noarch
|
||||
Requires: ocaml = %{version}-%{release}
|
||||
Requires(post): /sbin/install-info
|
||||
Requires(preun): /sbin/install-info
|
||||
|
||||
|
||||
%description docs
|
||||
@ -178,7 +202,7 @@ This package contains man pages.
|
||||
|
||||
%package compiler-libs
|
||||
Summary: Compiler libraries for OCaml
|
||||
Requires: ocaml = %{version}-%{release}
|
||||
Requires: ocaml%{?_isa} = %{version}-%{release}
|
||||
|
||||
|
||||
%description compiler-libs
|
||||
@ -191,152 +215,177 @@ Note that this exposes internal details of the OCaml compiler which
|
||||
may not be portable between versions.
|
||||
|
||||
|
||||
%package rpm-macros
|
||||
# LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception: the project as a whole
|
||||
# BSD-3-Clause: ocaml_files.py
|
||||
License: LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception AND BSD-3-Clause
|
||||
Summary: RPM macros for building OCaml packages
|
||||
BuildArch: noarch
|
||||
Requires: ocaml = %{version}-%{release}
|
||||
Requires: python3
|
||||
|
||||
|
||||
%description rpm-macros
|
||||
This package contains macros that are useful for building OCaml RPMs.
|
||||
|
||||
|
||||
%prep
|
||||
%setup -q -T -b 0 -n %{name}-%{version}
|
||||
%autopatch -p1
|
||||
%autosetup -S git -n %{name}-%{version}%{rcver}
|
||||
# Patches touch configure.ac, so rebuild it:
|
||||
autoconf --force
|
||||
|
||||
|
||||
%build
|
||||
%ifnarch %{no_parallel_build_arches}
|
||||
make="make %{?_smp_mflags}"
|
||||
make="%make_build"
|
||||
%else
|
||||
unset MAKEFLAGS
|
||||
make=make
|
||||
%endif
|
||||
|
||||
CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" \
|
||||
# Set ocamlmklib default flags to include Fedora linker flags
|
||||
sed -i '/ld_opts/s|\[\]|["%{build_ldflags}"]|' tools/ocamlmklib.ml
|
||||
|
||||
# Expose a dependency on the math library
|
||||
sed -i '/^EXTRACAMLFLAGS=/aLINKOPTS=-cclib -lm' otherlibs/unix/Makefile
|
||||
|
||||
# Don't use %%configure macro because it sets --build, --host which
|
||||
# breaks some incorrect assumptions made by OCaml's configure.ac
|
||||
#
|
||||
# See also:
|
||||
# https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/2O4HBOK6PTQZAFAVIRDVMZGG2PYB2QHM/
|
||||
# https://github.com/ocaml/ocaml/issues/8647
|
||||
#
|
||||
# We set --libdir to the unusual directory because we want OCaml to
|
||||
# install its libraries and other files into a subdirectory.
|
||||
#
|
||||
# OC_CFLAGS/OC_LDFLAGS control what flags OCaml passes to the linker
|
||||
# when doing final linking of OCaml binaries. Setting these is
|
||||
# necessary to ensure that generated binaries have Fedora hardening
|
||||
# features.
|
||||
./configure \
|
||||
-bindir %{_bindir} \
|
||||
-libdir %{_libdir}/ocaml \
|
||||
-x11lib %{_libdir} \
|
||||
-x11include %{_includedir} \
|
||||
-mandir %{_mandir}/man1 \
|
||||
-no-curses
|
||||
--prefix=%{_prefix} \
|
||||
--sysconfdir=%{_sysconfdir} \
|
||||
--mandir=%{_mandir} \
|
||||
--libdir=%{_libdir}/ocaml \
|
||||
--enable-flambda \
|
||||
%if %{native_compiler}
|
||||
--enable-native-compiler \
|
||||
--enable-native-toplevel \
|
||||
%else
|
||||
--disable-native-compiler \
|
||||
--disable-native-toplevel \
|
||||
%endif
|
||||
%ifarch x86_64
|
||||
%if 0%{?_include_frame_pointers}
|
||||
--enable-frame-pointers \
|
||||
%endif
|
||||
%endif
|
||||
%ifarch %{test_arches}
|
||||
--enable-ocamltest \
|
||||
%else
|
||||
--disable-ocamltest \
|
||||
%endif
|
||||
OC_CFLAGS='%{build_cflags}' \
|
||||
OC_LDFLAGS='%{build_ldflags}' \
|
||||
%{nil}
|
||||
$make world
|
||||
%if %{native_compiler}
|
||||
$make opt
|
||||
$make opt.opt
|
||||
%endif
|
||||
make -C emacs ocamltags
|
||||
|
||||
# Currently these tools are supplied by Debian, but are expected
|
||||
# to go upstream at some point.
|
||||
includes="-nostdlib -I stdlib -I utils -I parsing -I typing -I bytecomp -I asmcomp -I driver -I otherlibs/unix -I otherlibs/str -I otherlibs/dynlink"
|
||||
boot/ocamlrun ./ocamlc $includes dynlinkaux.cmo ocamlbyteinfo.ml -o ocamlbyteinfo
|
||||
# ocamlplugininfo doesn't compile because it needs 'dynheader' (type
|
||||
# decl) and I have no idea where that comes from
|
||||
#cp otherlibs/dynlink/natdynlink.ml .
|
||||
#boot/ocamlrun ./ocamlopt $includes unix.cmxa str.cmxa natdynlink.ml ocamlplugininfo.ml -o ocamlplugininfo
|
||||
# Build the README and fix up references to other doc files
|
||||
asciidoc -d book README.adoc
|
||||
for fil in CONTRIBUTING.md HACKING.adoc INSTALL.adoc README.win32.adoc; do
|
||||
sed -e "s,\"$fil\",\"https://github.com/ocaml/ocaml/blob/trunk/$fil\"," \
|
||||
-i README.html
|
||||
done
|
||||
|
||||
|
||||
%check
|
||||
%ifarch %{test_arches}
|
||||
cd testsuite
|
||||
%ifarch %{ocaml_native_compiler}
|
||||
# For information only, compile a binary and dump the annocheck data
|
||||
# from it. Useful so we know if hardening is being enabled, but don't
|
||||
# fail because not every hardening feature can be enabled here.
|
||||
echo 'print_endline "hello, world"' > hello.ml
|
||||
./ocamlopt.opt -verbose -I stdlib hello.ml -o hello ||:
|
||||
annocheck -v hello ||:
|
||||
%endif
|
||||
|
||||
%ifarch %{test_arches}
|
||||
%ifarch %{test_arches_required}
|
||||
make -j1 all
|
||||
make -j1 tests
|
||||
%else
|
||||
make -j1 all ||:
|
||||
make -j1 tests ||:
|
||||
%endif
|
||||
%endif
|
||||
|
||||
|
||||
%install
|
||||
make install \
|
||||
BINDIR=$RPM_BUILD_ROOT%{_bindir} \
|
||||
LIBDIR=$RPM_BUILD_ROOT%{_libdir}/ocaml \
|
||||
MANDIR=$RPM_BUILD_ROOT%{_mandir}
|
||||
%make_install
|
||||
perl -pi -e "s|^$RPM_BUILD_ROOT||" $RPM_BUILD_ROOT%{_libdir}/ocaml/ld.conf
|
||||
|
||||
(
|
||||
# install emacs files
|
||||
cd emacs;
|
||||
make install \
|
||||
BINDIR=$RPM_BUILD_ROOT%{_bindir} \
|
||||
EMACSDIR=$RPM_BUILD_ROOT%{_datadir}/emacs/site-lisp
|
||||
make install-ocamltags BINDIR=$RPM_BUILD_ROOT%{_bindir}
|
||||
)
|
||||
|
||||
echo %{version} > $RPM_BUILD_ROOT%{_libdir}/ocaml/fedora-ocaml-release
|
||||
|
||||
# Remove rpaths from stublibs .so files.
|
||||
chrpath --delete $RPM_BUILD_ROOT%{_libdir}/ocaml/stublibs/*.so
|
||||
# Remove the installed documentation. We will install it using %%doc
|
||||
rm -rf $RPM_BUILD_ROOT%{_docdir}/ocaml
|
||||
|
||||
install -m 0755 ocamlbyteinfo $RPM_BUILD_ROOT%{_bindir}
|
||||
#install -m 0755 ocamlplugininfo $RPM_BUILD_ROOT%{_bindir}
|
||||
mkdir -p $RPM_BUILD_ROOT%{rpmmacrodir}
|
||||
install -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{rpmmacrodir}/macros.ocaml-rpm
|
||||
|
||||
find $RPM_BUILD_ROOT -name .ignore -delete
|
||||
mkdir -p $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
|
||||
install -m 0644 %{SOURCE2} $RPM_BUILD_ROOT%{_rpmconfigdir}/redhat
|
||||
|
||||
# Remove .cmt and .cmti files, for now. We could package them later.
|
||||
# See also: http://www.ocamlpro.com/blog/2012/08/20/ocamlpro-and-4.00.0.html
|
||||
find $RPM_BUILD_ROOT \( -name '*.cmt' -o -name '*.cmti' \) -a -delete
|
||||
# Link, rather than copy, identical binaries
|
||||
hardlink -t $RPM_BUILD_ROOT%{_libdir}/ocaml/stublibs
|
||||
|
||||
|
||||
%files
|
||||
%doc LICENSE
|
||||
%license LICENSE
|
||||
%{_bindir}/ocaml
|
||||
|
||||
%{_bindir}/ocamlbyteinfo
|
||||
%{_bindir}/ocamlcmt
|
||||
%{_bindir}/ocamlcp
|
||||
%{_bindir}/ocamldebug
|
||||
%{_bindir}/ocaml-instr-graph
|
||||
%{_bindir}/ocaml-instr-report
|
||||
#%{_bindir}/ocamlplugininfo
|
||||
%{_bindir}/ocamlmklib
|
||||
%{_bindir}/ocamlmktop
|
||||
%{_bindir}/ocamlprof
|
||||
%{_bindir}/ocamlyacc
|
||||
|
||||
# symlink to either .byte or .opt version
|
||||
%{_bindir}/ocamlc
|
||||
%{_bindir}/ocamlcp
|
||||
%{_bindir}/ocamldep
|
||||
%{_bindir}/ocamllex
|
||||
%{_bindir}/ocamlmklib
|
||||
%{_bindir}/ocamlmktop
|
||||
%{_bindir}/ocamlobjinfo
|
||||
%{_bindir}/ocamloptp
|
||||
%{_bindir}/ocamlprof
|
||||
|
||||
# bytecode versions
|
||||
%{_bindir}/ocamlc.byte
|
||||
%{_bindir}/ocamlcp.byte
|
||||
%{_bindir}/ocamldep.byte
|
||||
%{_bindir}/ocamllex.byte
|
||||
%{_bindir}/ocamlmklib.byte
|
||||
%{_bindir}/ocamlmktop.byte
|
||||
%{_bindir}/ocamlobjinfo.byte
|
||||
%{_bindir}/ocamloptp.byte
|
||||
%{_bindir}/ocamlprof.byte
|
||||
|
||||
%if %{native_compiler}
|
||||
# native code versions
|
||||
%{_bindir}/ocamlc.opt
|
||||
%{_bindir}/ocamlcp.opt
|
||||
%{_bindir}/ocamldep.opt
|
||||
%{_bindir}/ocamllex.opt
|
||||
%{_bindir}/ocamlmklib.opt
|
||||
%{_bindir}/ocamlmktop.opt
|
||||
%{_bindir}/ocamlobjinfo.opt
|
||||
%{_bindir}/ocamloptp.opt
|
||||
%{_bindir}/ocamlprof.opt
|
||||
%endif
|
||||
|
||||
%if %{native_compiler}
|
||||
%{_bindir}/ocamlnat
|
||||
%{_bindir}/ocamlopt
|
||||
%{_bindir}/ocamlopt.byte
|
||||
%{_bindir}/ocamlopt.opt
|
||||
%{_bindir}/ocamloptp
|
||||
%endif
|
||||
|
||||
#%{_libdir}/ocaml/addlabels
|
||||
#%{_libdir}/ocaml/scrapelabels
|
||||
%{_libdir}/ocaml/camlheader
|
||||
%{_libdir}/ocaml/camlheader_ur
|
||||
%{_libdir}/ocaml/expunge
|
||||
%{_libdir}/ocaml/extract_crc
|
||||
%{_libdir}/ocaml/ld.conf
|
||||
%{_libdir}/ocaml/Makefile.config
|
||||
|
||||
%{_libdir}/ocaml/*.a
|
||||
%if %{natdynlink}
|
||||
%{_libdir}/ocaml/*.cmxs
|
||||
%endif
|
||||
%if %{native_compiler}
|
||||
%{_libdir}/ocaml/*.cmxa
|
||||
%{_libdir}/ocaml/*.cmx
|
||||
@ -344,55 +393,72 @@ find $RPM_BUILD_ROOT \( -name '*.cmt' -o -name '*.cmti' \) -a -delete
|
||||
%{_libdir}/ocaml/libasmrun_shared.so
|
||||
%endif
|
||||
%{_libdir}/ocaml/*.mli
|
||||
%{_libdir}/ocaml/sys.ml.in
|
||||
%{_libdir}/ocaml/libcamlrun_shared.so
|
||||
%{_libdir}/ocaml/objinfo_helper
|
||||
%{_libdir}/ocaml/vmthreads/*.mli
|
||||
%{_libdir}/ocaml/vmthreads/*.a
|
||||
|
||||
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.mli
|
||||
%if %{native_compiler}
|
||||
%{_libdir}/ocaml/threads/*.a
|
||||
%{_libdir}/ocaml/threads/*.cmxa
|
||||
%{_libdir}/ocaml/threads/*.cmx
|
||||
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.a
|
||||
%{_libdir}/ocaml/{dynlink,runtime_events,str,threads,unix}/*.cmxa
|
||||
%{_libdir}/ocaml/{dynlink,profiling,runtime_events,str,threads,unix}/*.cmx
|
||||
%{_libdir}/ocaml/profiling/*.o
|
||||
%endif
|
||||
%if %{natdynlink}
|
||||
%{_libdir}/ocaml/{runtime_events,str,unix}/*.cmxs
|
||||
%endif
|
||||
|
||||
# headers
|
||||
%{_libdir}/ocaml/caml
|
||||
%exclude %{_libdir}/ocaml/graphicsX11.mli
|
||||
|
||||
|
||||
%files runtime
|
||||
%doc README.adoc LICENSE Changes
|
||||
%doc README.html Changes
|
||||
%license LICENSE
|
||||
%{_bindir}/ocamlrun
|
||||
%{_bindir}/ocamlrund
|
||||
%{_bindir}/ocamlruni
|
||||
%dir %{_libdir}/ocaml
|
||||
%{_libdir}/ocaml/VERSION
|
||||
%{_libdir}/ocaml/*.cmo
|
||||
%{_libdir}/ocaml/*.cmi
|
||||
%{_libdir}/ocaml/*.cma
|
||||
%{_libdir}/ocaml/stublibs
|
||||
%{_libdir}/ocaml/target_camlheaderd
|
||||
%{_libdir}/ocaml/target_camlheaderi
|
||||
%dir %{_libdir}/ocaml/vmthreads
|
||||
%{_libdir}/ocaml/vmthreads/*.cmi
|
||||
%{_libdir}/ocaml/vmthreads/*.cma
|
||||
%dir %{_libdir}/ocaml/dynlink
|
||||
%{_libdir}/ocaml/dynlink/META
|
||||
%{_libdir}/ocaml/dynlink/*.cmi
|
||||
%{_libdir}/ocaml/dynlink/*.cma
|
||||
%dir %{_libdir}/ocaml/profiling
|
||||
%{_libdir}/ocaml/profiling/*.cmo
|
||||
%{_libdir}/ocaml/profiling/*.cmi
|
||||
%dir %{_libdir}/ocaml/runtime_events
|
||||
%{_libdir}/ocaml/runtime_events/META
|
||||
%{_libdir}/ocaml/runtime_events/*.cmi
|
||||
%{_libdir}/ocaml/runtime_events/*.cma
|
||||
%{_libdir}/ocaml/runtime-launch-info
|
||||
%{_libdir}/ocaml/stdlib
|
||||
%dir %{_libdir}/ocaml/str
|
||||
%{_libdir}/ocaml/str/META
|
||||
%{_libdir}/ocaml/str/*.cmi
|
||||
%{_libdir}/ocaml/str/*.cma
|
||||
%dir %{_libdir}/ocaml/threads
|
||||
%{_libdir}/ocaml/threads/META
|
||||
%{_libdir}/ocaml/threads/*.cmi
|
||||
%{_libdir}/ocaml/threads/*.cma
|
||||
%dir %{_libdir}/ocaml/unix
|
||||
%{_libdir}/ocaml/unix/META
|
||||
%{_libdir}/ocaml/unix/*.cmi
|
||||
%{_libdir}/ocaml/unix/*.cma
|
||||
%{_libdir}/ocaml/fedora-ocaml-release
|
||||
%exclude %{_libdir}/ocaml/graphicsX11.cmi
|
||||
|
||||
|
||||
%files source
|
||||
%doc LICENSE
|
||||
%license LICENSE
|
||||
%{_libdir}/ocaml/*.ml
|
||||
|
||||
|
||||
%files x11
|
||||
%doc LICENSE
|
||||
%{_libdir}/ocaml/graphicsX11.cmi
|
||||
%{_libdir}/ocaml/graphicsX11.mli
|
||||
%{_libdir}/ocaml/*.cmt*
|
||||
%{_libdir}/ocaml/*/*.cmt*
|
||||
|
||||
|
||||
%files ocamldoc
|
||||
%doc LICENSE
|
||||
%license LICENSE
|
||||
%doc ocamldoc/Changes.txt
|
||||
%{_bindir}/ocamldoc*
|
||||
%{_libdir}/ocaml/ocamldoc
|
||||
@ -403,30 +469,221 @@ find $RPM_BUILD_ROOT \( -name '*.cmt' -o -name '*.cmti' \) -a -delete
|
||||
%{_mandir}/man3/*
|
||||
|
||||
|
||||
%files emacs
|
||||
%doc emacs/README
|
||||
%{_datadir}/emacs/site-lisp/*
|
||||
%{_bindir}/ocamltags
|
||||
|
||||
|
||||
%files compiler-libs
|
||||
%doc LICENSE
|
||||
%dir %{_libdir}/ocaml/compiler-libs
|
||||
%{_libdir}/ocaml/compiler-libs/*.mli
|
||||
%{_libdir}/ocaml/compiler-libs/*.cmi
|
||||
%{_libdir}/ocaml/compiler-libs/*.cmo
|
||||
%{_libdir}/ocaml/compiler-libs/*.cma
|
||||
%if %{native_compiler}
|
||||
%{_libdir}/ocaml/compiler-libs/*.a
|
||||
%{_libdir}/ocaml/compiler-libs/*.cmxa
|
||||
%{_libdir}/ocaml/compiler-libs/*.cmx
|
||||
%{_libdir}/ocaml/compiler-libs/*.o
|
||||
%endif
|
||||
%license LICENSE
|
||||
%{_libdir}/ocaml/compiler-libs
|
||||
|
||||
|
||||
%files rpm-macros
|
||||
%{rpmmacrodir}/macros.ocaml-rpm
|
||||
%{_rpmconfigdir}/redhat/ocaml_files.py
|
||||
|
||||
|
||||
%changelog
|
||||
* Tue Jul 31 2018 Richard W.M. Jones <rjones@redhat.com> - 4.07.0-3
|
||||
- Disable unreliable tests on ppc64le.
|
||||
* Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 5.2.0-4
|
||||
- Bump release for October 2024 mass rebuild:
|
||||
Resolves: RHEL-64018
|
||||
|
||||
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 5.2.0-3
|
||||
- Bump release for June 2024 mass rebuild
|
||||
|
||||
* Wed Jun 19 2024 Richard W.M. Jones <rjones@redhat.com> - 5.2.0-2
|
||||
- Add fix for ppc64le code generation issue found after 5.2.0 was released
|
||||
|
||||
* Thu May 23 2024 Jerry James <loganjerry@gmail.com> - 5.2.0-1
|
||||
- New upstream version 5.2.0 (RHBZ#2269805)
|
||||
- Drop upstreamed frame pointer and s390x patches
|
||||
|
||||
* Thu Jan 25 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.1-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.1-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Mon Dec 18 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.1-2
|
||||
- Add s390x code generation fix
|
||||
https://github.com/ocaml/ocaml/issues/12829
|
||||
|
||||
* Mon Dec 11 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.1-1
|
||||
- New upstream version 5.1.1 (RHBZ#2239227)
|
||||
|
||||
* Tue Nov 14 2023 Yaakov Selkowitz <yselkowi@redhat.com> - 5.1.0-5
|
||||
- Drop unused BR parallel
|
||||
|
||||
* Fri Oct 06 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-4
|
||||
- Use BR ocaml-srpm-macros to force latest to be built against
|
||||
|
||||
* Thu Oct 05 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-3
|
||||
- Rebuild against updated ocaml-srpm-macros
|
||||
|
||||
* Thu Oct 5 2023 Richard W.M. Jones <rjones@redhat.com> - 5.1.0-2
|
||||
- Add upstream patch added after 5.1.0
|
||||
|
||||
* Wed Oct 4 2023 Jerry James <loganjerry@gmail.com> - 5.1.0-1
|
||||
- Version 5.1.0
|
||||
- Add LicenseRef-Fedora-Public-Domain to the runtime License field
|
||||
- New ocaml-rpm-macros subpackage
|
||||
- Depend on libzstd-devel for compressed marshaling
|
||||
- Disable LTO
|
||||
|
||||
* Thu Jul 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 5.0.0-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
|
||||
|
||||
* Wed Jul 12 2023 Richard W.M. Jones <rjones@redhat.com> - 5.0.0-3
|
||||
- Force ocaml-srpm-macros to be the latest version.
|
||||
|
||||
* Wed Jun 14 2023 Jerry James <loganjerry@gmail.com> - 5.0.0-2
|
||||
- Version 5.0.0
|
||||
- Convert License tag to SPDX
|
||||
- Ship HTML documentation instead of asciidoc source
|
||||
- Set ocamlmklib default flags to the Fedora linker flags
|
||||
- Enable frame pointers on x86_64
|
||||
|
||||
* Mon Jan 23 2023 Richard W.M. Jones <rjones@redhat.com> - 4.14.0-5
|
||||
- Rebuild OCaml packages for F38
|
||||
|
||||
* Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 4.14.0-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
|
||||
|
||||
* Mon Sep 5 2022 Richard W.M. Jones <rjones@redhat.com> - 4.14.0-3
|
||||
- Include more upstream patches from 4.14 branch
|
||||
|
||||
* Fri Jul 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 4.14.0-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||
|
||||
* Sat Jun 18 2022 Richard W.M. Jones <rjones@redhat.com> - 4.14.0-1
|
||||
- New upstream version 4.14.0
|
||||
|
||||
* Thu Jun 9 2022 Jerry James <loganjerry@gmail.com> - 4.13.1-4
|
||||
- Fix the Source0 URL
|
||||
- chrpath is no longer needed
|
||||
- Use the %%license macro
|
||||
- Build the test binaries so the tests will run
|
||||
|
||||
* Fri Feb 04 2022 Richard W.M. Jones <rjones@redhat.com> - 4.13.1-4
|
||||
- Rebuild 4.13.1 to remove package notes
|
||||
|
||||
* Wed Jan 26 2022 Richard W.M. Jones <rjones@redhat.com> - 4.13.1-3
|
||||
- Disable package note misfeature
|
||||
- Remove duplicate flags from mkexe
|
||||
|
||||
* Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 4.13.1-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||
|
||||
* Mon Oct 04 2021 Richard W.M. Jones <rjones@redhat.com> - 4.13.1-1
|
||||
- New upstream version 4.13.1
|
||||
|
||||
* Thu Jul 22 2021 Fedora Release Engineering <releng@fedoraproject.org> - 4.12.0-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||
|
||||
* Wed Jun 23 2021 Richard W.M. Jones <rjones@redhat.com> - 4.12.0-2
|
||||
- Move to final version of upstream patch for non-constant SIGSTKSZ
|
||||
|
||||
* Sun Feb 28 2021 Richard W.M. Jones <rjones@redhat.com> - 4.12.0-1
|
||||
- OCaml 4.12.0 release (RHBZ#1893381).
|
||||
- Workaround for glibc non-constant SIGSTKSZ
|
||||
(https://github.com/ocaml/ocaml/issues/10250)
|
||||
- Package *.cmt and *.cmti files.
|
||||
- Remove objinfo_helper since it is no longer built.
|
||||
|
||||
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 4.11.1-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||
|
||||
* Tue Sep 01 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.1-1
|
||||
- OCaml 4.11.1 release (RHBZ#1870368#c26).
|
||||
|
||||
* Fri Aug 21 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.0-1
|
||||
- OCaml 4.11.0 release (RHBZ#1870368).
|
||||
|
||||
* Tue Aug 04 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.0-0.9.dev2
|
||||
- Bump and rebuild to fix DWARF versioning issues.
|
||||
- Enable LTO again.
|
||||
|
||||
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 4.11.0-0.7.dev2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||
|
||||
* Tue Jul 14 2020 Tom Stellard <tstellar@redhat.com> - 4.11.0-0.6.dev2
|
||||
- Use make macros
|
||||
- https://fedoraproject.org/wiki/Changes/UseMakeBuildInstallMacro
|
||||
|
||||
* Wed Jul 01 2020 Jeff Law <law@redhat.com> - 4.11.0-0.5.dev2.fc33
|
||||
- Disable LTO
|
||||
|
||||
* Mon May 04 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.0-0.4.dev2.fc33
|
||||
- Move to OCaml 4.11.0+dev2-2020-04-22.
|
||||
- Backport upstream RISC-V backend from 4.12 + fixes.
|
||||
- Enable tests on riscv64.
|
||||
- Disable ocaml-instr-* tools on riscv64.
|
||||
|
||||
* Tue Apr 21 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.0-0.3.pre.fc33
|
||||
- Add fixes for various issues found in the previous build.
|
||||
|
||||
* Fri Apr 17 2020 Richard W.M. Jones <rjones@redhat.com> - 4.11.0-0.2.pre.fc33
|
||||
- Move to OCaml 4.11.0 pre-release with support for RISC-V.
|
||||
|
||||
* Sat Apr 11 2020 Richard W.M. Jones <rjones@redhat.com> - 4.10.0-4.fc33
|
||||
- Fix RISC-V backend.
|
||||
|
||||
* Thu Apr 02 2020 Richard W.M. Jones <rjones@redhat.com> - 4.10.0-3.fc33
|
||||
- Update all OCaml dependencies for RPM 4.16.
|
||||
|
||||
* Thu Feb 27 2020 Richard W.M. Jones <rjones@redhat.com> - 4.10.0-2.fc33
|
||||
- Add dist tag.
|
||||
|
||||
* Tue Feb 25 2020 Richard W.M. Jones <rjones@redhat.com> - 4.10.0-1
|
||||
- OCaml 4.10.0 final.
|
||||
|
||||
* Wed Jan 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 4.10.0-0.beta1.0.1
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||
|
||||
* Sat Jan 18 2020 Richard W.M. Jones <rjones@redhat.com> - 4.10.0-0.beta1
|
||||
- OCaml 4.10.0+beta1.
|
||||
|
||||
* Tue Jan 07 2020 Richard W.M. Jones <rjones@redhat.com> - 4.09.0-13
|
||||
- Bump release and rebuild.
|
||||
|
||||
* Tue Jan 07 2020 Richard W.M. Jones <rjones@redhat.com> - 4.09.0-4
|
||||
- OCaml 4.09.0 for riscv64
|
||||
|
||||
* Tue Dec 10 2019 Richard W.M. Jones <rjones@redhat.com> - 4.09.0-3
|
||||
- Require redhat-rpm-config to get hardening flags when linking.
|
||||
|
||||
* Thu Dec 05 2019 Richard W.M. Jones <rjones@redhat.com> - 4.09.0-2
|
||||
- OCaml 4.09.0 final.
|
||||
- Use autosetup, remove old setup line.
|
||||
- Remove ocamloptp binaries.
|
||||
- Rename target_camlheader[di] -> camlheader[di] files.
|
||||
- Remove vmthreads - old threading library which is no longer built.
|
||||
- Remove x11 subpackage which is obsolete.
|
||||
- Further fixes to CFLAGS and annobin.
|
||||
|
||||
* Fri Aug 16 2019 Richard W.M. Jones <rjones@redhat.com> - 4.08.1-1
|
||||
- OCaml 4.08.1 final.
|
||||
|
||||
* Tue Jul 30 2019 Richard W.M. Jones <rjones@redhat.com> - 4.08.1-0.rc2.1
|
||||
- OCaml 4.08.1+rc2.
|
||||
- Include fix for miscompilation of off_t on 32 bit architectures.
|
||||
|
||||
* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 4.08.0-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||
|
||||
* Thu Jun 27 2019 Richard W.M. Jones <rjones@redhat.com> - 4.08.0-1
|
||||
- OCaml 4.08.0 (RHBZ#1673688).
|
||||
|
||||
* Fri Apr 26 2019 Richard W.M. Jones <rjones@redhat.com> - 4.08.0-0.beta3.1
|
||||
- OCaml 4.08.0 beta 3 (RHBZ#1673688).
|
||||
- emacs subpackage has been dropped (from upstream):
|
||||
https://github.com/ocaml/ocaml/pull/2078#issuecomment-443322613
|
||||
https://github.com/Chris00/caml-mode
|
||||
- Remove ocamlbyteinfo and ocamlpluginfo, neither can be compiled.
|
||||
- Disable tests on all architectures, temporarily hopefully.
|
||||
- Package threads/*.mli files.
|
||||
|
||||
* Fri Feb 01 2019 Fedora Release Engineering <releng@fedoraproject.org> - 4.07.0-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
|
||||
|
||||
* Fri Aug 17 2018 Richard W.M. Jones <rjones@redhat.com> - 4.07.0-3
|
||||
- Bootstrap from previously build Fedora compiler by default.
|
||||
|
||||
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.07.0-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
|
||||
|
451
ocaml_files.py
Normal file
451
ocaml_files.py
Normal file
@ -0,0 +1,451 @@
|
||||
# Copyright 2022-3, Jerry James
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# 3. Neither the name of Red Hat nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import shutil
|
||||
import string
|
||||
import sys
|
||||
from collections.abc import Iterable, Iterator
|
||||
from enum import Enum, auto
|
||||
from typing import Callable, final
|
||||
|
||||
# Version of this script
|
||||
version=2
|
||||
|
||||
#
|
||||
# BUILDROOT CATEGORIZATION
|
||||
#
|
||||
|
||||
# Directories to ignore when generating %dir entries
|
||||
root_dirs: set[str] = {
|
||||
'/',
|
||||
'/etc',
|
||||
'/usr',
|
||||
'/usr/bin',
|
||||
'/usr/lib',
|
||||
'/usr/lib/ocaml',
|
||||
'/usr/lib/ocaml/caml',
|
||||
'/usr/lib/ocaml/stublibs',
|
||||
'/usr/lib/ocaml/threads',
|
||||
'/usr/lib64',
|
||||
'/usr/lib64/ocaml',
|
||||
'/usr/lib64/ocaml/caml',
|
||||
'/usr/lib64/ocaml/stublibs',
|
||||
'/usr/lib64/ocaml/threads',
|
||||
'/usr/libexec',
|
||||
'/usr/sbin',
|
||||
'/usr/share',
|
||||
'/usr/share/doc'
|
||||
}
|
||||
|
||||
def find_buildroot_toplevel(buildroot: str) -> list[str]:
|
||||
"""Find toplevel files and directories in the buildroot.
|
||||
|
||||
:param str buildroot: path to the buildroot
|
||||
:return: a list of toplevel files and directories in the buildroot
|
||||
"""
|
||||
bfiles: list[str] = []
|
||||
for path, dirs, files in os.walk(buildroot):
|
||||
for i in range(len(dirs) - 1, -1, -1):
|
||||
d = os.path.join(path, dirs[i])[len(buildroot):]
|
||||
if d not in root_dirs and not d.startswith('/usr/share/man'):
|
||||
bfiles.append(d)
|
||||
del dirs[i]
|
||||
for f in files:
|
||||
realfile = os.path.join(path, f)[len(buildroot):]
|
||||
if realfile.startswith('/usr/share/man'):
|
||||
bfiles.append(realfile + '*')
|
||||
else:
|
||||
bfiles.append(realfile)
|
||||
return bfiles
|
||||
|
||||
# File suffixes that go into a devel subpackage
|
||||
dev_suffixes: set[str] = {
|
||||
'a', 'cmo', 'cmt', 'cmti', 'cmx', 'cmxa', 'h', 'idl', 'ml', 'mli', 'o'
|
||||
}
|
||||
|
||||
def is_devel_file(filname: str) -> bool:
|
||||
"""Determine whether a file belongs to a devel subpackage.
|
||||
|
||||
:param str filname: the filename to check
|
||||
:return: True if the file belongs to a devel subpackage, else False
|
||||
"""
|
||||
return (filname == 'dune-package' or filname == 'opam' or
|
||||
(os.path.splitext(filname)[1][1:] in dev_suffixes
|
||||
and not filname.endswith('_top_init.ml')))
|
||||
|
||||
def find_buildroot_all(buildroot: str, devel: bool, add_star: bool) -> list[set[str]]:
|
||||
"""Find all files and directories in the buildroot and optionally
|
||||
categorize them as 'main' or 'devel'.
|
||||
|
||||
:param Namespace args: parsed command line arguments
|
||||
:param bool devel: True to split into 'main' and 'devel', False otherwise
|
||||
:param bool add_star: True to add a star to man page filenames
|
||||
:return: a list of files and directories, in this order: main files,
|
||||
main directories, devel files, and devel directories
|
||||
"""
|
||||
bfiles: list[set[str]] = [set(), set(), set()]
|
||||
bdirs: set[str] = set()
|
||||
for path, dirs, files in os.walk(buildroot):
|
||||
for d in dirs:
|
||||
realdir = os.path.join(path, d)[len(buildroot):]
|
||||
if realdir not in root_dirs and not realdir.startswith('/usr/share/man'):
|
||||
bdirs.add(realdir)
|
||||
for f in files:
|
||||
realfile = os.path.join(path, f)[len(buildroot):]
|
||||
if devel and is_devel_file(os.path.basename(realfile)):
|
||||
bfiles[2].add(realfile)
|
||||
else:
|
||||
if add_star and realfile.startswith('/usr/share/man'):
|
||||
bfiles[0].add(realfile + '*')
|
||||
else:
|
||||
bfiles[0].add(realfile)
|
||||
parentdir = os.path.dirname(realfile)
|
||||
if parentdir in bdirs:
|
||||
bfiles[1].add(parentdir)
|
||||
bdirs.remove(parentdir)
|
||||
# Catch intermediate directories, as in ocaml-mtime
|
||||
parentdir = os.path.dirname(parentdir)
|
||||
if parentdir in bdirs:
|
||||
bfiles[1].add(parentdir)
|
||||
bdirs.remove(parentdir)
|
||||
bfiles.append(bdirs)
|
||||
return bfiles
|
||||
|
||||
#
|
||||
# INSTALL FILE LEXER AND PARSER
|
||||
#
|
||||
|
||||
class TokenType(Enum):
|
||||
"""The types of tokens that can appear in an opam *.install file."""
|
||||
ERROR = auto()
|
||||
COLON = auto()
|
||||
LBRACE = auto()
|
||||
RBRACE = auto()
|
||||
LBRACK = auto()
|
||||
RBRACK = auto()
|
||||
STRING = auto()
|
||||
FIELD = auto()
|
||||
|
||||
@final
|
||||
class InstallFileLexer(Iterator[tuple[TokenType, str]]):
|
||||
"""Convert an opam *.install file into a sequence of tokens."""
|
||||
__slots__ = ['index', 'text']
|
||||
|
||||
def __init__(self, filname: str) -> None:
|
||||
"""Create an opam *.install file lexer.
|
||||
|
||||
:param str filname: the name of the file to read from
|
||||
"""
|
||||
self.index = 0
|
||||
with open(filname, 'r') as f:
|
||||
# Limit reads to 4 MB in case this file is bogus.
|
||||
# Most install files are under 4K.
|
||||
self.text = f.read(4194304)
|
||||
|
||||
def skip_whitespace(self) -> None:
|
||||
"""Skip over whitespace in the input."""
|
||||
while self.index < len(self.text) and \
|
||||
(self.text[self.index] == '#' or
|
||||
self.text[self.index] in string.whitespace):
|
||||
if self.text[self.index] == '#':
|
||||
while (self.index < len(self.text) and
|
||||
self.text[self.index] != '\n' and
|
||||
self.text[self.index] != '\r'):
|
||||
self.index += 1
|
||||
else:
|
||||
self.index += 1
|
||||
|
||||
def __next__(self) -> tuple[TokenType, str]:
|
||||
"""Get the next token from the opam *.install file.
|
||||
|
||||
:return: a pair containing the type and text of the next token
|
||||
"""
|
||||
self.skip_whitespace()
|
||||
if self.index < len(self.text):
|
||||
ch = self.text[self.index]
|
||||
if ch == ':':
|
||||
self.index += 1
|
||||
return (TokenType.COLON, ch)
|
||||
if ch == '{':
|
||||
self.index += 1
|
||||
return (TokenType.LBRACE, ch)
|
||||
if ch == '}':
|
||||
self.index += 1
|
||||
return (TokenType.RBRACE, ch)
|
||||
if ch == '[':
|
||||
self.index += 1
|
||||
return (TokenType.LBRACK, ch)
|
||||
if ch == ']':
|
||||
self.index += 1
|
||||
return (TokenType.RBRACK, ch)
|
||||
if ch == '"':
|
||||
start = self.index + 1
|
||||
end = start
|
||||
while end < len(self.text) and self.text[end] != '"':
|
||||
end += 2 if self.text[end] == '\\' else 1
|
||||
self.index = end + 1
|
||||
return (TokenType.STRING, self.text[start:end])
|
||||
if ch in string.ascii_letters:
|
||||
start = self.index
|
||||
end = start + 1
|
||||
while (end < len(self.text) and
|
||||
(self.text[end] == '_' or
|
||||
self.text[end] in string.ascii_letters)):
|
||||
end += 1
|
||||
self.index = end
|
||||
return (TokenType.FIELD, self.text[start:end])
|
||||
return (TokenType.ERROR, ch)
|
||||
else:
|
||||
raise StopIteration
|
||||
|
||||
@final
|
||||
class InstallFileParser(Iterable[tuple[str, bool, str, str]]):
|
||||
"""Parse opam *.install files."""
|
||||
|
||||
__slots__ = ['pkgname', 'lexer', 'libdir']
|
||||
|
||||
def __init__(self, filname: str, libdir: str) -> None:
|
||||
"""Initialize an OCaml .install file parser.
|
||||
|
||||
:param str filname: name of the .install file to parse
|
||||
:param str libdir: the OCaml library directory
|
||||
"""
|
||||
self.pkgname = os.path.splitext(os.path.basename(filname))[0]
|
||||
self.lexer = InstallFileLexer(filname)
|
||||
self.libdir = libdir
|
||||
|
||||
def __iter__(self) -> Iterator[tuple[str, bool, str, str]]:
|
||||
"""Parse a .install file.
|
||||
If there are any parse errors, we assume this file is not really an
|
||||
opam .install file and abandon the parse.
|
||||
"""
|
||||
# Map opam installer names to directories
|
||||
opammap: dict[str, str] = {
|
||||
'lib': os.path.join(self.libdir, self.pkgname),
|
||||
'lib_root': self.libdir,
|
||||
'libexec': os.path.join(self.libdir, self.pkgname),
|
||||
'libexec_root': self.libdir,
|
||||
'bin': '/usr/bin',
|
||||
'sbin': '/usr/sbin',
|
||||
'toplevel': os.path.join(self.libdir, 'toplevel'),
|
||||
'share': os.path.join('/usr/share', self.pkgname),
|
||||
'share_root': '/usr/share',
|
||||
'etc': os.path.join('/etc', self.pkgname),
|
||||
'doc': os.path.join('/usr/doc', self.pkgname),
|
||||
'stublibs': os.path.join(self.libdir, 'stublibs'),
|
||||
'man': '/usr/share/man'
|
||||
}
|
||||
|
||||
# Parse the file
|
||||
try:
|
||||
toktyp, token = next(self.lexer)
|
||||
while toktyp == TokenType.FIELD:
|
||||
libname = token
|
||||
toktyp, token = next(self.lexer)
|
||||
if toktyp != TokenType.COLON:
|
||||
return
|
||||
|
||||
toktyp, token = next(self.lexer)
|
||||
if toktyp != TokenType.LBRACK:
|
||||
return
|
||||
|
||||
directory = opammap.get(libname)
|
||||
if not directory:
|
||||
return
|
||||
|
||||
toktyp, token = next(self.lexer)
|
||||
while toktyp == TokenType.STRING:
|
||||
source = token
|
||||
optional = source[0] == '?'
|
||||
if optional:
|
||||
source = source[1:]
|
||||
nexttp, nexttk = next(self.lexer)
|
||||
if nexttp == TokenType.LBRACE:
|
||||
nexttp, nexttk = next(self.lexer)
|
||||
if nexttp == TokenType.STRING:
|
||||
filname = os.path.join(directory, nexttk)
|
||||
bracetp, bractk = next(self.lexer)
|
||||
if bracetp != TokenType.RBRACE:
|
||||
return
|
||||
nexttp, nexttk = next(self.lexer)
|
||||
else:
|
||||
return
|
||||
elif libname == 'man':
|
||||
index = token.rfind('.')
|
||||
if index < 0:
|
||||
return
|
||||
mandir = os.path.join(directory, 'man' + token[index+1:])
|
||||
filname = os.path.join(mandir, os.path.basename(token))
|
||||
else:
|
||||
filname = os.path.join(directory, os.path.basename(token))
|
||||
toktyp, token = nexttp, nexttk
|
||||
yield (self.pkgname, optional, source, filname)
|
||||
|
||||
if toktyp != TokenType.RBRACK:
|
||||
return
|
||||
toktyp, token = next(self.lexer)
|
||||
except StopIteration:
|
||||
return
|
||||
|
||||
def install_files(buildroot: str, libdir: str) -> None:
|
||||
"""Install the files listed in opam .install files in the buildroot.
|
||||
|
||||
For some projects, there are install files in both the project root
|
||||
directory and somewhere under "_build", so be careful not to parse the same
|
||||
install file twice.
|
||||
|
||||
:param str buildroot: path to the buildroot
|
||||
:param str libdir: the OCaml library directory
|
||||
"""
|
||||
install_files = set()
|
||||
for path, dirs, files in os.walk('.'):
|
||||
for f in files:
|
||||
if f.endswith('.install') and f not in install_files:
|
||||
install_files.add(f)
|
||||
parser = InstallFileParser(os.path.join(path, f), libdir)
|
||||
for _, optional, source, filname in parser:
|
||||
if not optional or os.path.exists(source):
|
||||
installpath = os.path.join(buildroot, filname[1:])
|
||||
os.makedirs(os.path.dirname(installpath), exist_ok=True)
|
||||
shutil.copy2(source, installpath)
|
||||
|
||||
def get_package_map(buildroot: str, libdir: str, devel: bool) -> dict[str, set[str]]:
|
||||
"""Create a map from package names to installed files from the opam .install
|
||||
files in the buildroot.
|
||||
|
||||
For some projects, there are install files in both the project root
|
||||
directory and somewhere under "_build", so be careful not to parse the same
|
||||
install file twice."""
|
||||
|
||||
pmap: dict[str, set[str]] = dict()
|
||||
install_files = set()
|
||||
|
||||
def add_pkg(pkgname: str, filname: str) -> None:
|
||||
"""Add a mapping from a package name to a filename.
|
||||
|
||||
:param str pkgname: the package that acts as the map key
|
||||
:param str filname: the filename to add to the package set
|
||||
"""
|
||||
if pkgname not in pmap:
|
||||
pmap[pkgname] = set()
|
||||
pmap[pkgname].add(filname)
|
||||
|
||||
installed = find_buildroot_all(buildroot, devel, False)
|
||||
for path, dirs, files in os.walk('.'):
|
||||
for f in files:
|
||||
if f.endswith('.install') and f not in install_files:
|
||||
install_files.add(f)
|
||||
parser = InstallFileParser(os.path.join(path, f), libdir)
|
||||
for pkgname, _, _, filname in parser:
|
||||
if filname in installed[0]:
|
||||
if filname.startswith('/usr/share/man'):
|
||||
add_pkg(pkgname, filname + '*')
|
||||
else:
|
||||
add_pkg(pkgname, filname)
|
||||
dirname = os.path.dirname(filname)
|
||||
if dirname in installed[1]:
|
||||
add_pkg(pkgname, '%dir ' + dirname)
|
||||
installed[1].remove(dirname)
|
||||
elif filname in installed[2]:
|
||||
if filname.startswith('/usr/share/man'):
|
||||
add_pkg(pkgname + '-devel', filname + '*')
|
||||
else:
|
||||
add_pkg(pkgname + '-devel', filname)
|
||||
dirname = os.path.dirname(filname)
|
||||
if dirname in installed[3]:
|
||||
add_pkg(pkgname + '-devel', '%dir ' + dirname)
|
||||
installed[3].remove(dirname)
|
||||
return pmap
|
||||
|
||||
#
|
||||
# MAIN INTERFACE
|
||||
#
|
||||
|
||||
def ocaml_files(no_devel: bool, separate: bool, install: bool, buildroot: str,
|
||||
libdir: str) -> None:
|
||||
"""Generate %files lists from an installed buildroot.
|
||||
|
||||
:param bool no_devel: False to split files into a main package and a devel
|
||||
package
|
||||
:param bool separate: True to place each OCaml module in an RPM package
|
||||
:param bool install: True to install files, False to generate %files
|
||||
:param str buildroot: the installed buildroot
|
||||
:param str libdir: the OCaml library directory
|
||||
"""
|
||||
if install:
|
||||
install_files(buildroot, libdir)
|
||||
elif separate:
|
||||
pkgmap = get_package_map(buildroot, libdir, not no_devel)
|
||||
for pkg in pkgmap:
|
||||
with open('.ofiles-' + pkg, 'w') as f:
|
||||
for entry in pkgmap[pkg]:
|
||||
f.write(entry + '\n')
|
||||
elif no_devel:
|
||||
with open('.ofiles', 'w') as f:
|
||||
for entry in find_buildroot_toplevel(buildroot):
|
||||
f.write(entry + '\n')
|
||||
else:
|
||||
files = find_buildroot_all(buildroot, True, True)
|
||||
with open('.ofiles', 'w') as f:
|
||||
for entry in files[0]:
|
||||
f.write(entry + '\n')
|
||||
for entry in files[1]:
|
||||
f.write('%dir ' + entry + '\n')
|
||||
with open('.ofiles-devel', 'w') as f:
|
||||
for entry in files[2]:
|
||||
f.write(entry + '\n')
|
||||
for entry in files[3]:
|
||||
f.write('%dir ' + entry + '\n')
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Support for building OCaml RPM packages')
|
||||
parser.add_argument('-i', '--install',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='install files instead of generating %files')
|
||||
parser.add_argument('-n', '--no-devel',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='suppress creation of a devel subpackage')
|
||||
parser.add_argument('-s', '--separate',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help='separate packaging. Each OCaml module is in a distinct RPM package. All modules are in a single RPM package by default.')
|
||||
parser.add_argument('-v', '--version',
|
||||
action='version',
|
||||
version=f'%(prog)s {str(version)}')
|
||||
parser.add_argument('buildroot', help='RPM build root')
|
||||
parser.add_argument('libdir', help='OCaml library directory')
|
||||
args = parser.parse_args()
|
||||
ocaml_files(args.no_devel,
|
||||
args.separate,
|
||||
args.install,
|
||||
args.buildroot,
|
||||
args.libdir)
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (ocaml-4.07.0.tar.xz) = 1c27c2c81919af6b51824fb69f203ebca009ab093af0dffb0dbe66d08ba980525ee14e9426edf142c527315144602ac9ef6e36d2266714b5f7ccc7c063e75ac8
|
||||
SHA512 (ocaml-5.2.0.tar.gz) = 78115690186c13c1f2480e4812a9fe34cce2c28bf8a89d5c9810bca0391f930cecd9cee2b53daca8a32da1815628b33be68f3948f1ad03fa50b72b14e3ea84f2
|
||||
|
10
tests/basic-test.sh
Executable file
10
tests/basic-test.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash -
|
||||
set -e
|
||||
set -x
|
||||
|
||||
# Compile a trivial program and run it.
|
||||
echo 'print_endline "hello, world"' > hello.ml
|
||||
ocamlc.opt hello.ml -o hello
|
||||
./hello
|
||||
ocamlopt.opt hello.ml -o hello
|
||||
./hello
|
11
tests/tests.yml
Executable file
11
tests/tests.yml
Executable file
@ -0,0 +1,11 @@
|
||||
- hosts: localhost
|
||||
roles:
|
||||
- role: standard-test-basic
|
||||
tags:
|
||||
- classic
|
||||
required_packages:
|
||||
- ocaml
|
||||
tests:
|
||||
- simple:
|
||||
dir: .
|
||||
run: ./basic-test.sh
|
Loading…
Reference in New Issue
Block a user