1. Apr 21, 2019
    • Lang Hames's avatar
      [JITLink] Use memset instead of bzero. · b3910958
      Lang Hames authored
      llvm-svn: 358822
      b3910958
    • Lang Hames's avatar
      [JITLink] Silence a narrowing conversion warning. · 3211b447
      Lang Hames authored
      llvm-svn: 358821
      3211b447
    • Lang Hames's avatar
      [JITLink] Update BuildingAJIT tutorials to account for API changes in r358818. · f7c5e6c0
      Lang Hames authored
      DynamicLibrarySearchGenerator::GetForCurrentProcess now takes a char (the global
      prefix) rather than a DataLayout reference.
      
      llvm-svn: 358820
      f7c5e6c0
    • Lang Hames's avatar
      [JITLink] Fix a missing header and bad prototype. · 68b0b8c1
      Lang Hames authored
      llvm-svn: 358819
      68b0b8c1
    • Lang Hames's avatar
      Initial implementation of JITLink - A replacement for RuntimeDyld. · 11c8dfa5
      Lang Hames authored
      Summary:
      
      JITLink is a jit-linker that performs the same high-level task as RuntimeDyld:
      it parses relocatable object files and makes their contents runnable in a target
      process.
      
      JITLink aims to improve on RuntimeDyld in several ways:
      
      (1) A clear design intended to maximize code-sharing while minimizing coupling.
      
      RuntimeDyld has been developed in an ad-hoc fashion for a number of years and
      this had led to intermingling of code for multiple architectures (e.g. in
      RuntimeDyldELF::processRelocationRef) in a way that makes the code more
      difficult to read, reason about, extend. JITLink is designed to isolate
      format and architecture specific code, while still sharing generic code.
      
      (2) Support for native code models.
      
      RuntimeDyld required the use of large code models (where calls to external
      functions are made indirectly via registers) for many of platforms due to its
      restrictive model for stub generation (one "stub" per symbol). JITLink allows
      arbitrary mutation of the atom graph, allowing both GOT and PLT atoms to be
      added naturally.
      
      (3) Native support for asynchronous linking.
      
      JITLink uses asynchronous calls for symbol resolution and finalization: these
      callbacks are passed a continuation function that they must call to complete the
      linker's work. This allows for cleaner interoperation with the new concurrent
      ORC JIT APIs, while still being easily implementable in synchronous style if
      asynchrony is not needed.
      
      To maximise sharing, the design has a hierarchy of common code:
      
      (1) Generic atom-graph data structure and algorithms (e.g. dead stripping and
       |  memory allocation) that are intended to be shared by all architectures.
       |
       + -- (2) Shared per-format code that utilizes (1), e.g. Generic MachO to
             |  atom-graph parsing.
             |
             + -- (3) Architecture specific code that uses (1) and (2). E.g.
                      JITLinkerMachO_x86_64, which adds x86-64 specific relocation
                      support to (2) to build and patch up the atom graph.
      
      To support asynchronous symbol resolution and finalization, the callbacks for
      these operations take continuations as arguments:
      
        using JITLinkAsyncLookupContinuation =
            std::function<void(Expected<AsyncLookupResult> LR)>;
      
        using JITLinkAsyncLookupFunction =
            std::function<void(const DenseSet<StringRef> &Symbols,
                               JITLinkAsyncLookupContinuation LookupContinuation)>;
      
        using FinalizeContinuation = std::function<void(Error)>;
      
        virtual void finalizeAsync(FinalizeContinuation OnFinalize);
      
      In addition to its headline features, JITLink also makes other improvements:
      
        - Dead stripping support: symbols that are not used (e.g. redundant ODR
          definitions) are discarded, and take up no memory in the target process
          (In contrast, RuntimeDyld supported pointer equality for weak definitions,
          but the redundant definitions stayed resident in memory).
      
        - Improved exception handling support. JITLink provides a much more extensive
          eh-frame parser than RuntimeDyld, and is able to correctly fix up many
          eh-frame sections that RuntimeDyld currently (silently) fails on.
      
        - More extensive validation and error handling throughout.
      
      This initial patch supports linking MachO/x86-64 only. Work on support for
      other architectures and formats will happen in-tree.
      
      Differential Revision: https://reviews.llvm.org/D58704
      
      llvm-svn: 358818
      11c8dfa5
  2. Apr 20, 2019