Home | History | Annotate | Download | only in Expression
      1 //===-- IRExecutionUnit.h ---------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef lldb_IRExecutionUnit_h_
     11 #define lldb_IRExecutionUnit_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 #include <atomic>
     16 #include <string>
     17 #include <vector>
     18 #include <map>
     19 
     20 // Other libraries and framework includes
     21 #include "llvm/IR/Module.h"
     22 
     23 // Project includes
     24 #include "lldb/lldb-forward.h"
     25 #include "lldb/lldb-private.h"
     26 #include "lldb/Core/ClangForward.h"
     27 #include "lldb/Core/DataBufferHeap.h"
     28 #include "llvm/ExecutionEngine/JITMemoryManager.h"
     29 #include "lldb/Expression/ClangExpression.h"
     30 #include "lldb/Expression/ClangExpressionParser.h"
     31 #include "lldb/Expression/IRMemoryMap.h"
     32 #include "lldb/Host/Mutex.h"
     33 
     34 namespace llvm {
     35 
     36 class Module;
     37 class ExecutionEngine;
     38 
     39 }
     40 
     41 namespace lldb_private {
     42 
     43 class Error;
     44 
     45 //----------------------------------------------------------------------
     46 /// @class IRExecutionUnit IRExecutionUnit.h "lldb/Expression/IRExecutionUnit.h"
     47 /// @brief Contains the IR and, optionally, JIT-compiled code for a module.
     48 ///
     49 /// This class encapsulates the compiled version of an expression, in IR
     50 /// form (for interpretation purposes) and in raw machine code form (for
     51 /// execution in the target).
     52 ///
     53 /// This object wraps an IR module that comes from the expression parser,
     54 /// and knows how to use the JIT to make it into executable code.  It can
     55 /// then be used as input to the IR interpreter, or the address of the
     56 /// executable code can be passed to a thread plan to run in the target.
     57 ///
     58 /// This class creates a subclass of LLVM's JITMemoryManager, because that is
     59 /// how the JIT emits code.  Because LLDB needs to move JIT-compiled code
     60 /// into the target process, the IRExecutionUnit knows how to copy the
     61 /// emitted code into the target process.
     62 //----------------------------------------------------------------------
     63 class IRExecutionUnit : public IRMemoryMap
     64 {
     65 public:
     66     //------------------------------------------------------------------
     67     /// Constructor
     68     //------------------------------------------------------------------
     69     IRExecutionUnit (std::unique_ptr<llvm::LLVMContext> &context_ap,
     70                      std::unique_ptr<llvm::Module> &module_ap,
     71                      ConstString &name,
     72                      const lldb::TargetSP &target_sp,
     73                      std::vector<std::string> &cpu_features);
     74 
     75     //------------------------------------------------------------------
     76     /// Destructor
     77     //------------------------------------------------------------------
     78     ~IRExecutionUnit();
     79 
     80     llvm::Module *GetModule()
     81     {
     82         return m_module;
     83     }
     84 
     85     llvm::Function *GetFunction()
     86     {
     87         if (m_module)
     88             return m_module->getFunction (m_name.AsCString());
     89         else
     90             return NULL;
     91     }
     92 
     93     void GetRunnableInfo(Error &error,
     94                          lldb::addr_t &func_addr,
     95                          lldb::addr_t &func_end);
     96 
     97     //------------------------------------------------------------------
     98     /// Accessors for IRForTarget and other clients that may want binary
     99     /// data placed on their behalf.  The binary data is owned by the
    100     /// IRExecutionUnit unless the client explicitly chooses to free it.
    101     //------------------------------------------------------------------
    102 
    103     lldb::addr_t WriteNow(const uint8_t *bytes,
    104                           size_t size,
    105                           Error &error);
    106 
    107     void FreeNow(lldb::addr_t allocation);
    108 
    109 private:
    110     //------------------------------------------------------------------
    111     /// Look up the object in m_address_map that contains a given address,
    112     /// find where it was copied to, and return the remote address at the
    113     /// same offset into the copied entity
    114     ///
    115     /// @param[in] local_address
    116     ///     The address in the debugger.
    117     ///
    118     /// @return
    119     ///     The address in the target process.
    120     //------------------------------------------------------------------
    121     lldb::addr_t
    122     GetRemoteAddressForLocal (lldb::addr_t local_address);
    123 
    124     //------------------------------------------------------------------
    125     /// Look up the object in m_address_map that contains a given address,
    126     /// find where it was copied to, and return its address range in the
    127     /// target process
    128     ///
    129     /// @param[in] local_address
    130     ///     The address in the debugger.
    131     ///
    132     /// @return
    133     ///     The range of the containing object in the target process.
    134     //------------------------------------------------------------------
    135     typedef std::pair <lldb::addr_t, uintptr_t> AddrRange;
    136     AddrRange
    137     GetRemoteRangeForLocal (lldb::addr_t local_address);
    138 
    139     //------------------------------------------------------------------
    140     /// Commit all allocations to the process and record where they were stored.
    141     ///
    142     /// @param[in] process
    143     ///     The process to allocate memory in.
    144     ///
    145     /// @return
    146     ///     True <=> all allocations were performed successfully.
    147     ///     This method will attempt to free allocated memory if the
    148     ///     operation fails.
    149     //------------------------------------------------------------------
    150     bool
    151     CommitAllocations (lldb::ProcessSP &process_sp);
    152 
    153     //------------------------------------------------------------------
    154     /// Report all committed allocations to the execution engine.
    155     ///
    156     /// @param[in] engine
    157     ///     The execution engine to notify.
    158     //------------------------------------------------------------------
    159     void
    160     ReportAllocations (llvm::ExecutionEngine &engine);
    161 
    162     //------------------------------------------------------------------
    163     /// Write the contents of all allocations to the process.
    164     ///
    165     /// @param[in] local_address
    166     ///     The process containing the allocations.
    167     ///
    168     /// @return
    169     ///     True <=> all allocations were performed successfully.
    170     //------------------------------------------------------------------
    171     bool
    172     WriteData (lldb::ProcessSP &process_sp);
    173 
    174     Error
    175     DisassembleFunction (Stream &stream,
    176                          lldb::ProcessSP &process_sp);
    177 
    178     class MemoryManager : public llvm::JITMemoryManager
    179     {
    180     public:
    181         MemoryManager (IRExecutionUnit &parent);
    182 
    183         //------------------------------------------------------------------
    184         /// Passthrough interface stub
    185         //------------------------------------------------------------------
    186         virtual void setMemoryWritable ();
    187 
    188         //------------------------------------------------------------------
    189         /// Passthrough interface stub
    190         //------------------------------------------------------------------
    191         virtual void setMemoryExecutable ();
    192 
    193         //------------------------------------------------------------------
    194         /// Passthrough interface stub
    195         //------------------------------------------------------------------
    196         virtual void setPoisonMemory (bool poison)
    197         {
    198             m_default_mm_ap->setPoisonMemory (poison);
    199         }
    200 
    201         //------------------------------------------------------------------
    202         /// Passthrough interface stub
    203         //------------------------------------------------------------------
    204         virtual void AllocateGOT()
    205         {
    206             m_default_mm_ap->AllocateGOT();
    207         }
    208 
    209         //------------------------------------------------------------------
    210         /// Passthrough interface stub
    211         //------------------------------------------------------------------
    212         virtual uint8_t *getGOTBase() const
    213         {
    214             return m_default_mm_ap->getGOTBase();
    215         }
    216 
    217         //------------------------------------------------------------------
    218         /// Passthrough interface stub
    219         //------------------------------------------------------------------
    220         virtual uint8_t *startFunctionBody(const llvm::Function *F,
    221                                            uintptr_t &ActualSize);
    222 
    223         //------------------------------------------------------------------
    224         /// Allocate room for a dyld stub for a lazy-referenced function,
    225         /// and add it to the m_stubs map
    226         ///
    227         /// @param[in] F
    228         ///     The function being referenced.
    229         ///
    230         /// @param[in] StubSize
    231         ///     The size of the stub.
    232         ///
    233         /// @param[in] Alignment
    234         ///     The required alignment of the stub.
    235         ///
    236         /// @return
    237         ///     Allocated space for the stub.
    238         //------------------------------------------------------------------
    239         virtual uint8_t *allocateStub(const llvm::GlobalValue* F,
    240                                       unsigned StubSize,
    241                                       unsigned Alignment);
    242 
    243         //------------------------------------------------------------------
    244         /// Complete the body of a function, and add it to the m_functions map
    245         ///
    246         /// @param[in] F
    247         ///     The function being completed.
    248         ///
    249         /// @param[in] FunctionStart
    250         ///     The first instruction of the function.
    251         ///
    252         /// @param[in] FunctionEnd
    253         ///     The last byte of the last instruction of the function.
    254         //------------------------------------------------------------------
    255         virtual void endFunctionBody(const llvm::Function *F,
    256                                      uint8_t *FunctionStart,
    257                                      uint8_t *FunctionEnd);
    258         //------------------------------------------------------------------
    259         /// Allocate space for an unspecified purpose, and add it to the
    260         /// m_spaceBlocks map
    261         ///
    262         /// @param[in] Size
    263         ///     The size of the area.
    264         ///
    265         /// @param[in] Alignment
    266         ///     The required alignment of the area.
    267         ///
    268         /// @return
    269         ///     Allocated space.
    270         //------------------------------------------------------------------
    271         virtual uint8_t *allocateSpace(intptr_t Size, unsigned Alignment);
    272 
    273         //------------------------------------------------------------------
    274         /// Allocate space for executable code, and add it to the
    275         /// m_spaceBlocks map
    276         ///
    277         /// @param[in] Size
    278         ///     The size of the area.
    279         ///
    280         /// @param[in] Alignment
    281         ///     The required alignment of the area.
    282         ///
    283         /// @param[in] SectionID
    284         ///     A unique identifier for the section.
    285         ///
    286         /// @return
    287         ///     Allocated space.
    288         //------------------------------------------------------------------
    289         virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
    290                                              unsigned SectionID);
    291 
    292         //------------------------------------------------------------------
    293         /// Allocate space for data, and add it to the m_spaceBlocks map
    294         ///
    295         /// @param[in] Size
    296         ///     The size of the area.
    297         ///
    298         /// @param[in] Alignment
    299         ///     The required alignment of the area.
    300         ///
    301         /// @param[in] SectionID
    302         ///     A unique identifier for the section.
    303         ///
    304         /// @param[in] IsReadOnly
    305         ///     Flag indicating the section is read-only.
    306         ///
    307         /// @return
    308         ///     Allocated space.
    309         //------------------------------------------------------------------
    310         virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
    311                                              unsigned SectionID, bool IsReadOnly);
    312 
    313         //------------------------------------------------------------------
    314         /// Allocate space for a global variable, and add it to the
    315         /// m_spaceBlocks map
    316         ///
    317         /// @param[in] Size
    318         ///     The size of the variable.
    319         ///
    320         /// @param[in] Alignment
    321         ///     The required alignment of the variable.
    322         ///
    323         /// @return
    324         ///     Allocated space for the global.
    325         //------------------------------------------------------------------
    326         virtual uint8_t *allocateGlobal(uintptr_t Size,
    327                                         unsigned Alignment);
    328 
    329         //------------------------------------------------------------------
    330         /// Called when object loading is complete and section page
    331         /// permissions can be applied. Currently unimplemented for LLDB.
    332         ///
    333         /// @param[out] ErrMsg
    334         ///     The error that prevented the page protection from succeeding.
    335         ///
    336         /// @return
    337         ///     True in case of failure, false in case of success.
    338         //------------------------------------------------------------------
    339         virtual bool finalizeMemory(std::string *ErrMsg) {
    340             // TODO: Ensure that the instruction cache is flushed because
    341             // relocations are updated by dy-load.  See:
    342             //   sys::Memory::InvalidateInstructionCache
    343             //   llvm::SectionMemoryManager
    344             return false;
    345         }
    346 
    347         //------------------------------------------------------------------
    348         /// Passthrough interface stub
    349         //------------------------------------------------------------------
    350         virtual void deallocateFunctionBody(void *Body);
    351 
    352         //------------------------------------------------------------------
    353         /// Passthrough interface stub
    354         //------------------------------------------------------------------
    355         virtual size_t GetDefaultCodeSlabSize() {
    356             return m_default_mm_ap->GetDefaultCodeSlabSize();
    357         }
    358 
    359         //------------------------------------------------------------------
    360         /// Passthrough interface stub
    361         //------------------------------------------------------------------
    362         virtual size_t GetDefaultDataSlabSize() {
    363             return m_default_mm_ap->GetDefaultDataSlabSize();
    364         }
    365 
    366         virtual size_t GetDefaultStubSlabSize() {
    367             return m_default_mm_ap->GetDefaultStubSlabSize();
    368         }
    369 
    370         //------------------------------------------------------------------
    371         /// Passthrough interface stub
    372         //------------------------------------------------------------------
    373         virtual unsigned GetNumCodeSlabs() {
    374             return m_default_mm_ap->GetNumCodeSlabs();
    375         }
    376 
    377         //------------------------------------------------------------------
    378         /// Passthrough interface stub
    379         //------------------------------------------------------------------
    380         virtual unsigned GetNumDataSlabs() {
    381             return m_default_mm_ap->GetNumDataSlabs();
    382         }
    383 
    384         //------------------------------------------------------------------
    385         /// Passthrough interface stub
    386         //------------------------------------------------------------------
    387         virtual unsigned GetNumStubSlabs() {
    388             return m_default_mm_ap->GetNumStubSlabs();
    389         }
    390 
    391         //------------------------------------------------------------------
    392         /// Passthrough interface stub
    393         //------------------------------------------------------------------
    394         virtual void *getPointerToNamedFunction(const std::string &Name,
    395                                                 bool AbortOnFailure = true) {
    396             return m_default_mm_ap->getPointerToNamedFunction(Name, AbortOnFailure);
    397         }
    398     private:
    399         std::unique_ptr<JITMemoryManager>    m_default_mm_ap;    ///< The memory allocator to use in actually creating space.  All calls are passed through to it.
    400         IRExecutionUnit                    &m_parent;           ///< The execution unit this is a proxy for.
    401     };
    402 
    403     //----------------------------------------------------------------------
    404     /// @class JittedFunction IRExecutionUnit.h "lldb/Expression/IRExecutionUnit.h"
    405     /// @brief Encapsulates a single function that has been generated by the JIT.
    406     ///
    407     /// Functions that have been generated by the JIT are first resident in the
    408     /// local process, and then placed in the target process.  JittedFunction
    409     /// represents a function possibly resident in both.
    410     //----------------------------------------------------------------------
    411     struct JittedFunction {
    412         std::string m_name;             ///< The function's name
    413         lldb::addr_t m_local_addr;      ///< The address of the function in LLDB's memory
    414         lldb::addr_t m_remote_addr;     ///< The address of the function in the target's memory
    415 
    416         //------------------------------------------------------------------
    417         /// Constructor
    418         ///
    419         /// Initializes class variabes.
    420         ///
    421         /// @param[in] name
    422         ///     The name of the function.
    423         ///
    424         /// @param[in] local_addr
    425         ///     The address of the function in LLDB, or LLDB_INVALID_ADDRESS if
    426         ///     it is not present in LLDB's memory.
    427         ///
    428         /// @param[in] remote_addr
    429         ///     The address of the function in the target, or LLDB_INVALID_ADDRESS
    430         ///     if it is not present in the target's memory.
    431         //------------------------------------------------------------------
    432         JittedFunction (const char *name,
    433                         lldb::addr_t local_addr = LLDB_INVALID_ADDRESS,
    434                         lldb::addr_t remote_addr = LLDB_INVALID_ADDRESS) :
    435             m_name (name),
    436             m_local_addr (local_addr),
    437             m_remote_addr (remote_addr)
    438         {
    439         }
    440     };
    441 
    442     static const unsigned eSectionIDInvalid = (unsigned)-1;
    443 
    444     //----------------------------------------------------------------------
    445     /// @class AllocationRecord IRExecutionUnit.h "lldb/Expression/IRExecutionUnit.h"
    446     /// @brief Enacpsulates a single allocation request made by the JIT.
    447     ///
    448     /// Allocations made by the JIT are first queued up and then applied in
    449     /// bulk to the underlying process.
    450     //----------------------------------------------------------------------
    451     struct AllocationRecord {
    452         lldb::addr_t    m_process_address;
    453         uintptr_t       m_host_address;
    454         uint32_t        m_permissions;
    455         size_t          m_size;
    456         unsigned        m_alignment;
    457         unsigned        m_section_id;
    458 
    459         AllocationRecord (uintptr_t host_address,
    460                           uint32_t permissions,
    461                           size_t size,
    462                           unsigned alignment,
    463                           unsigned section_id = eSectionIDInvalid) :
    464             m_process_address(LLDB_INVALID_ADDRESS),
    465             m_host_address(host_address),
    466             m_permissions(permissions),
    467             m_size(size),
    468             m_alignment(alignment),
    469             m_section_id(section_id)
    470         {
    471         }
    472 
    473         void dump (Log *log);
    474     };
    475 
    476     typedef std::vector<AllocationRecord>   RecordVector;
    477     RecordVector                            m_records;
    478 
    479     std::unique_ptr<llvm::LLVMContext>       m_context_ap;
    480     std::unique_ptr<llvm::ExecutionEngine>   m_execution_engine_ap;
    481     std::unique_ptr<llvm::Module>            m_module_ap;            ///< Holder for the module until it's been handed off
    482     llvm::Module                           *m_module;               ///< Owned by the execution engine
    483     std::vector<std::string>                m_cpu_features;
    484     llvm::SmallVector<JittedFunction, 1>    m_jitted_functions;     ///< A vector of all functions that have been JITted into machine code
    485     const ConstString                       m_name;
    486 
    487     std::atomic<bool>                       m_did_jit;
    488 
    489     lldb::addr_t                            m_function_load_addr;
    490     lldb::addr_t                            m_function_end_load_addr;
    491 };
    492 
    493 } // namespace lldb_private
    494 
    495 #endif  // lldb_IRExecutionUnit_h_
    496