[llvm-dev] ORC JIT Weekly #14 -- Removable code

Machiel van Hooren via llvm-dev llvm-dev at lists.llvm.org
Mon May 4 07:06:03 PDT 2020


Hi Lang,

Nice work!
Once JITLink eventually replaces RuntimeDyld, will that enable more 
granular code removal?

Regards,

Machiel


On 04-May-20 09:30, Lang Hames via llvm-dev wrote:
> Hi All,
>
> A preliminary version of removable code support has been posted for 
> review in https://reviews.llvm.org/D79312. This patch removes all uses 
> of VModuleKeys (except for Legacy layers) and takes a 
> whole-JITDylib-at-a-time approach to removal. Removing whole JITDylibs 
> requires more work from clients (compared to per-module removal): 
> Modules to be removed must be placed into throw-away JITDylibs and 
> re-exports used to make symbol definitions visible at the intended 
> locations. On the other hand restricting removal to whole JITDylibs 
> can help to avoid subtle dependence bugs: existing object formats and 
> linker rules are already designed to make independently loading and 
> unloading libraries relatively safe, whereas there is no precedent for 
> unloading individual modules from within a library at runtime.
>
> As an example of how unloading individual modules can lead to subtle 
> dependence bugs consider the following REPL for a simple language 
> (Kaleidoscope from https://llvm.org/docs/tutorial/). In this example 
> the REPL values will all be of floating point type, functions will be 
> compiled lazily, and anonymous expressions will be removed immediately 
> after running them. Under these assumptions, how does the REPL respond 
> to the following input?
>
> repl> def foo(x) x * 2.0;
> repl> foo(2.0) + 1.0;
> // output #1 here
> // anonymous expression #1 removed here
> repl> foo(3.0);
> // output #2 here
> // anonymous expression #2 removed here
>
> We expect the result to be:
>
> output #1: 5.0
> output #2: 6.0
>
> And on Linux and Darwin it will be. On Windows however, the output is 
> likely* to be:
>
> output #1: 5.0
> output #2: segfault
>
> (*The exact output will depend on the target options used).
>
> The problem is that when compiling to COFF (the Windows relocatable 
> object file format) floating point constants may be stored in named 
> COMDAT entries (See e.g. https://llvm.org/PR40074). Only one copy of a 
> constant value is emitted, and other modules will be linked to refer 
> to that copy. In our example, because of lazy compilation, the first 
> copy of the constant 2.0 that the JIT linker will encounter is the one 
> used in anonymous expression #1. The body of foo will link against 
> this copy and  be left with a dangling reference when anonymous 
> expression #1 is deleted. Attempting to re-run the foo function in 
> anonymous expression #2 will then crash.
>
> The COFF format and linker rules already ensure that dynamic libraries 
> each get their own copies of their floating point constants, so by 
> following the existing rules and only allowing per-JITDylib removal 
> this case becomes safe.
>
> There's plenty more to talk about here, but it's getting late so I'll 
> leave it here for tonight. Questions and comments on this approach and 
> the initial patch are very welcome, especially from people who have 
> use-cases for removing code. Barring any major objections I'm hoping 
> that we can have this feature in-tree in the next week or so.
>
> -- Lang.
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200504/09648b88/attachment.html>


More information about the llvm-dev mailing list