• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- RemoteTarget.h - LLVM Remote process JIT execution ----------------===//
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 // Definition of the RemoteTarget class which executes JITed code in a
11 // separate address range from where it was built.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef REMOTEPROCESS_H
16 #define REMOTEPROCESS_H
17 
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/Support/DataTypes.h"
21 #include "llvm/Support/Memory.h"
22 #include <stdlib.h>
23 #include <string>
24 
25 namespace llvm {
26 
27 class RemoteTarget {
28   std::string ErrorMsg;
29   bool IsRunning;
30 
31   SmallVector<sys::MemoryBlock, 16> Allocations;
32 
33 public:
getErrorMsg()34   StringRef getErrorMsg() const { return ErrorMsg; }
35 
36   /// Allocate space in the remote target address space.
37   ///
38   /// @param      Size      Amount of space, in bytes, to allocate.
39   /// @param      Alignment Required minimum alignment for allocated space.
40   /// @param[out] Address   Remote address of the allocated memory.
41   ///
42   /// @returns False on success. On failure, ErrorMsg is updated with
43   ///          descriptive text of the encountered error.
44   bool allocateSpace(size_t Size, unsigned Alignment, uint64_t &Address);
45 
46   /// Load data into the target address space.
47   ///
48   /// @param      Address   Destination address in the target process.
49   /// @param      Data      Source address in the host process.
50   /// @param      Size      Number of bytes to copy.
51   ///
52   /// @returns False on success. On failure, ErrorMsg is updated with
53   ///          descriptive text of the encountered error.
54   bool loadData(uint64_t Address, const void *Data, size_t Size);
55 
56   /// Load code into the target address space and prepare it for execution.
57   ///
58   /// @param      Address   Destination address in the target process.
59   /// @param      Data      Source address in the host process.
60   /// @param      Size      Number of bytes to copy.
61   ///
62   /// @returns False on success. On failure, ErrorMsg is updated with
63   ///          descriptive text of the encountered error.
64   bool loadCode(uint64_t Address, const void *Data, size_t Size);
65 
66   /// Execute code in the target process. The called function is required
67   /// to be of signature int "(*)(void)".
68   ///
69   /// @param      Address   Address of the loaded function in the target
70   ///                       process.
71   /// @param[out] RetVal    The integer return value of the called function.
72   ///
73   /// @returns False on success. On failure, ErrorMsg is updated with
74   ///          descriptive text of the encountered error.
75   bool executeCode(uint64_t Address, int &RetVal);
76 
77   /// Minimum alignment for memory permissions. Used to seperate code and
78   /// data regions to make sure data doesn't get marked as code or vice
79   /// versa.
80   ///
81   /// @returns Page alignment return value. Default of 4k.
getPageAlignment()82   unsigned getPageAlignment() { return 4096; }
83 
84   /// Start the remote process.
85   void create();
86 
87   /// Terminate the remote process.
88   void stop();
89 
RemoteTarget()90   RemoteTarget() : ErrorMsg(""), IsRunning(false) {}
~RemoteTarget()91   ~RemoteTarget() { if (IsRunning) stop(); }
92 
93 private:
94   // Main processing function for the remote target process. Command messages
95   // are received on file descriptor CmdFD and responses come back on OutFD.
96   static void doRemoteTargeting(int CmdFD, int OutFD);
97 };
98 
99 } // end namespace llvm
100 
101 #endif
102