Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Merlin per-module pp flags #4092

Merged
merged 11 commits into from
Jan 13, 2021
Merged

Conversation

voodoos
Copy link
Collaborator

@voodoos voodoos commented Jan 11, 2021

Recent changes made merlin configuration files distinct for each module in a lib of exe. However we were not taking advantage on that for preprocessing, this PR correct that.

This should fix issues: #2596 #1212 and #3409

@rgrinberg this PR is based on #4091. I shared the "processing" work for every module using the same pp specification. However the shared Per_item data-structure does not play well with Build.With_target.t and is not easily translatable to a (key list, 'a) list) while preserving sharing. I decided to duplicate these once-processed pp flags for each module, does that seem reasonable to you ?

@voodoos voodoos added this to the 2.8 milestone Jan 11, 2021
@voodoos voodoos mentioned this pull request Jan 11, 2021
@voodoos
Copy link
Collaborator Author

voodoos commented Jan 11, 2021

The only option to keep sharing I see would be to add a function to Per_element because we need access to the array used in the implementation. The function could be something like that:

let map_with_targets { map; values } ~f =
  let open Build.With_targets.O in
  let l = Array.to_list values in
  let+ new_values = List.map l ~f |> Build.With_targets.all in
  {
    map;
    values = Array.of_list new_values
  }

@rgrinberg
Copy link
Member

rgrinberg commented Jan 11, 2021

I shared the "processing" work for every module using the same pp specification. However the shared Per_item data-structure does not play well with Build.With_target.t and is not easily translatable to a (key list, 'a) list)

That is a problem for all of our containers. They require this projection and injection to lists to go from 'a Build.t container to 'a container Build.t.

I decided to duplicate these once-processed pp flags for each module, does that seem reasonable to you ?

Sadly, I don't think this is good enough.

The only option to keep sharing I see would be to add a function to Per_element because we need access to the array used in the implementation. The function could be something like that:

That sounds much better to me.

By the way, we should maintain the Per_item representation when marshalling. We don't want to write bloated marshalled files unnecessarily, the reader could do the lookup inside the Per_item for the module of interest just as easily

@voodoos voodoos force-pushed the merlin-per-module-pp branch from 487c2cf to f51644a Compare January 12, 2021 08:59
@voodoos voodoos requested a review from rgrinberg January 12, 2021 09:00
@voodoos
Copy link
Collaborator Author

voodoos commented Jan 12, 2021

@rgrinberg : should be better like this. Sharing is preserved until the marshaled config is read and pp'ed by the merlin-server.

However the debug printing is duplicating again because the data-structure used in Per_item does not allow for the easy recovery of all members of a same equivalence class. But this is only for the debug print anyway.

@Khady
Copy link
Contributor

Khady commented Jan 12, 2021

A fresh profile with this PR would be helpful.

src/dune_rules/merlin.ml Outdated Show resolved Hide resolved
src/dune_rules/merlin.ml Outdated Show resolved Hide resolved
src/dune_rules/merlin.ml Outdated Show resolved Hide resolved
Copy link
Member

@rgrinberg rgrinberg left a comment

Choose a reason for hiding this comment

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

Looks good apart from some minor things.

@rgrinberg
Copy link
Member

rgrinberg commented Jan 12, 2021

Thanks @Khady . Could you also give a perf report of the last commit here.

I can confirm that all merlin related allocation is now absent from the trace. Apart from the things I mentioned earlier, I don't have any ideas on what else we can optimize. Perhaps @aalekseyev will find something though.

@voodoos voodoos force-pushed the merlin-per-module-pp branch from 0aa2d50 to 7b4809a Compare January 13, 2021 10:14
@aalekseyev
Copy link
Collaborator

In the profile I couldn't see any obvious single thing to work on.
A lot of it seems to be overhead of Fiber and Memo, though. For example add_dep_from_caller seems to account for ~15% of all allocations, which is not what I would expect.

@rgrinberg
Copy link
Member

@voodoos Ready to merge!

Actually this PR also fixes a bug along the way: directories with mix preprocessors specifications are now handled correctly. You should mention that in the CHANGES along with the appropriate bug numbers for it.

@voodoos voodoos linked an issue Jan 13, 2021 that may be closed by this pull request
rgrinberg and others added 11 commits January 13, 2021 16:18
Signed-off-by: Rudi Grinberg <me@rgrinberg.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
Do not do the same work for every module in a library

Signed-off-by: Rudi Grinberg <me@rgrinberg.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
Signed-off-by: Rudi Grinberg <me@rgrinberg.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
Signed-off-by: Rudi Grinberg <me@rgrinberg.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
Signed-off-by: Rudi Grinberg <me@rgrinberg.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
Signed-off-by: Ulysse Gérard <thevoodoos@gmail.com>
@voodoos voodoos force-pushed the merlin-per-module-pp branch from 7b4809a to af5ca02 Compare January 13, 2021 15:20
@voodoos voodoos merged commit 606b493 into ocaml:master Jan 13, 2021
rgrinberg added a commit to rgrinberg/opam-repository that referenced this pull request Jan 13, 2021
…ne-action-plugin, dune-private-libs and dune-glob (2.8.0)

CHANGES:

- `dune rules` accepts aliases and other non-path rules (ocaml/dune#4063, @mrmr1993)

- Action `(diff reference test_result)` now accept `reference` to be absent and
  in that case consider that the reference is empty. Then running `dune promote`
  will create the reference file. (ocaml/dune#3795, @bobot)

- Ignore special files (BLK, CHR, FIFO, SOCKET), (ocaml/dune#3570, fixes ocaml/dune#3124, ocaml/dune#3546,
  @ejgallego)

- Experimental: Simplify loading of additional files (data or code) at runtime
  in programs by introducing specific installation sites. In particular it allow
  to define plugins to be installed in these sites. (ocaml/dune#3104, ocaml/dune#3794, fixes ocaml/dune#1185,
  @bobot)

- Move all temporary files created by dune to run actions to a single directory
  and make sure that actions executed by dune also use this directory by setting
  `TMPDIR` (or `TEMP` on Windows). (ocaml/dune#3691, fixes ocaml/dune#3422, @rgrinberg)

- Fix bootstrap script with custom configuration. (ocaml/dune#3757, fixes ocaml/dune#3774, @marsam)

- Add the `executable` field to `inline_tests` to customize the compilation
  flags of the test runner executable (ocaml/dune#3747, fixes ocaml/dune#3679, @lubegasimon)

- Add `(enabled_if ...)` to `(copy_files ...)` (ocaml/dune#3756, @nojb)

- Make sure Dune cleans up the status line before exiting (ocaml/dune#3767,
  fixes ocaml/dune#3737, @alan-j-hu)

- Add `{gitlab,bitbucket}` as options for defining project sources with `source`
  stanza `(source (<host> user/repo))` in the `dune-project` file.  (ocaml/dune#3813,
  @rgrinberg)

- Fix generation of `META` and `dune-package` files when some targets (byte,
  native, dynlink) are disabled. Previously, dune would generate all archives
  for regardless of settings. (ocaml/dune#3829, ocaml/dune#4041, @rgrinberg)

- Do not run ocamldep to for single module executables & libraries. The
  dependency graph for such artifacts is trivial (ocaml/dune#3847, @rgrinberg)

- Fix cram tests inside vendored directories not being interpreted correctly.
  (ocaml/dune#3860, fixes ocaml/dune#3843, @rgrinberg)

- Add `package` field to private libraries. This allows such libraries to be
  installed and to be usable by other public libraries in the same project
  (ocaml/dune#3655, fixes ocaml/dune#1017, @rgrinberg)

- Fix the `%{make}` variable on Windows by only checking for a `gmake` binary
  on UNIX-like systems as a unrelated `gmake` binary might exist on Windows.
  (ocaml/dune#3853, @kit-ty-kate)

- Fix `$ dune install` modifying the build directory. This made the build
  directory unusable when `$ sudo dune install` modified permissions. (fix
  ocaml/dune#3857, @rgrinberg)

- Fix handling of aliases given on the command line (using the `@` and `@@`
  syntax) so as to correctly handle relative paths. (ocaml/dune#3874, fixes ocaml/dune#3850, @nojb)

- Allow link time code generation to be used in preprocessing executable. This
  makes it possible to use the build info module inside the preprocessor.
  (ocaml/dune#3848, fix ocaml/dune#3848, @rgrinberg)

- Correctly call `git ls-tree` so unicode files are not quoted, this fixes
  problems with `dune subst` in the presence of unicode files. Fixes ocaml/dune#3219
  (ocaml/dune#3879, @ejgallego)

- `dune subst` now accepts common command-line arguments such as
  `--debug-backtraces` (ocaml/dune#3878, @ejgallego)

- `dune describe` now also includes information about executables in addition to
  that of libraries. (ocaml/dune#3892, ocaml/dune#3895, @nojb)

- instrumentation backends can now receive arguments via `(instrumentation
  (backend <name> <args>))`. (ocaml/dune#3906, ocaml/dune#3932, @nojb)

- Tweak auto-formatting of `dune` files to improve readability. (ocaml/dune#3928, @nojb)

- Add a switch argument to opam when context is not default. (ocaml/dune#3951, @tmattio)

- Avoid pager when running `$ git diff` (ocaml/dune#3912, @AltGr)

- Add `(root_module ..)` field to libraries & executables. This makes it
  possible to use library dependencies shadowed by local modules (ocaml/dune#3825,
  @rgrinberg)

- Allow `(formatting ...)` field in `(env ...)` stanza to set per-directory
  formatting specification. (ocaml/dune#3942, @nojb)

- [coq] In `coq.theory`, `:standard` for the `flags` field now uses the
  flags set in `env` profile flags (ocaml/dune#3931 , @ejgallego @rgrinberg)

- [coq] Add `-q` flag to `:standard` `coqc` flags , fixes ocaml/dune#3924, (ocaml/dune#3931 , @ejgallego)

- Add support for Coq's native compute compilation mode (@ejgallego, ocaml/dune#3210)

- Add a `SUFFIX` directive in `.merlin` files for each dialect with no
  preprocessing, to let merlin know of additional file extensions (ocaml/dune#3977,
  @vouillon)

- Stop promoting `.merlin` files. Write per-stanza Merlin configurations in
  binary form. Add a new subcommand `dune ocaml-merlin` that Merlin can use to
  query the configuration files. The `allow_approximate_merlin` option is now
  useless and deprecated. Dune now conflicts with `merlin < 3.4.0` and
  `ocaml-lsp-server < 1.3.0` (ocaml/dune#3554, @voodoos)

- Configurator: fix a bug introduced in 2.6.0 where the configurator V1 API
  doesn't work at all when used outside of dune. (ocaml/dune#4046, @aalekseyev)

- Fix `libexec` and `libexec-private` variables. In cross-compilation settings,
  they now point to the file in the host context. (ocaml/dune#4058, fixes ocaml/dune#4057,
  @TheLortex)

- When running `$ dune subst`, use project metadata as a fallback when package
  metadata is missing. We also generate a warning when `(name ..)` is missing in
  `dune-project` files to avoid failures in production builds.

- Remove support for passing `-nodynlink` for executables. It was bypassed in
  most cases and not correct in other cases in particular on arm32.
  (ocaml/dune#4085, fixes ocaml/dune#4069, fixes ocaml/dune#2527, @emillon)

- Generate archive rules compatible with 4.12. Dune longer attempt to generate
  an archive file if it's unnecessary (ocaml/dune#3973, fixes ocaml/dune#3766, @rgrinberg)

- Fix generated Merlin configurations when multiple preprocessors are defined
  for different modules in the same folder. (ocaml/dune#4092, fixes ocaml/dune#2596, ocaml/dune#1212 and
  ocaml/dune#3409, @voodoos)

- Add the option `use_standard_c_and_cxx_flags` to `dune-project` that 1.
  disables the unconditional use of the `ocamlc_cflags` and `ocamlc_cppflags`
  from `ocamlc -config` in C compiler calls, these flags will be present in the
  `:standard` set instead; and 2. enables the detection of the C compiler family
  and populates the `:standard` set of flags with common default values when
  building CXX stubs. (ocaml/dune#3875, ocaml/dune#3802, fix ocaml/dune#3718 and ocaml/dune#3528, @voodoos)
@Khady
Copy link
Contributor

Khady commented Jan 14, 2021

Could you also give a perf report of the last commit here.

Here it is perf.zip

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

incorrect .merlin containing -open Dune__exe
4 participants