1 //===-- TargetList.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 liblldb_TargetList_h_ 11 #define liblldb_TargetList_h_ 12 13 // C Includes 14 // C++ Includes 15 // Other libraries and framework includes 16 // Project includes 17 #include "lldb/Core/Broadcaster.h" 18 #include "lldb/Host/Mutex.h" 19 #include "lldb/Target/Target.h" 20 21 namespace lldb_private { 22 23 class TargetList : public Broadcaster 24 { 25 private: 26 friend class Debugger; 27 28 //------------------------------------------------------------------ 29 /// Constructor 30 /// 31 /// The constructor for the target list is private. Clients can 32 /// get ahold of of the one and only target list through the 33 /// lldb_private::Debugger::GetSharedInstance().GetTargetList(). 34 /// 35 /// @see static TargetList& lldb_private::Debugger::GetTargetList(). 36 //------------------------------------------------------------------ 37 TargetList(Debugger &debugger); 38 39 public: 40 41 //------------------------------------------------------------------ 42 /// Broadcaster event bits definitions. 43 //------------------------------------------------------------------ 44 enum 45 { 46 eBroadcastBitInterrupt = (1 << 0) 47 }; 48 49 50 // These two functions fill out the Broadcaster interface: 51 52 static ConstString &GetStaticBroadcasterClass (); 53 54 virtual ConstString &GetBroadcasterClass() const 55 { 56 return GetStaticBroadcasterClass(); 57 } 58 59 virtual ~TargetList(); 60 61 //------------------------------------------------------------------ 62 /// Create a new Target. 63 /// 64 /// Clients must use this function to create a Target. This allows 65 /// a global list of targets to be maintained in a central location 66 /// so signal handlers and other global functions can use it to 67 /// locate an appropriate target to deliver asynchronous information 68 /// to. 69 /// 70 /// @param[in] debugger 71 /// The debugger to associate this target with 72 /// 73 /// @param[in] file_spec 74 /// The main executable file for a debug target. This value 75 /// can be NULL and the file can be set later using: 76 /// Target::SetExecutableModule (ModuleSP&) 77 /// 78 /// @param[in] triple_cstr 79 /// A target triple string to be used for the target. This can 80 /// be NULL if the triple is not known or when attaching to a 81 /// process. 82 /// 83 /// @param[in] get_dependent_modules 84 /// Track down the dependent modules for an executable and 85 /// load those into the module list. 86 /// 87 /// @param[in] platform_options 88 /// A pointer to the platform options to use when creating this 89 /// target. If this value is NULL, then the currently selected 90 /// platform will be used. 91 /// 92 /// @param[out] target_sp 93 /// A shared pointer to a target that will be filled in if 94 /// this call is successful. 95 /// 96 /// @return 97 /// An error object that indicates success or failure 98 //------------------------------------------------------------------ 99 Error 100 CreateTarget (Debugger &debugger, 101 const char *user_exe_path, 102 const char *triple_cstr, 103 bool get_dependent_modules, 104 const OptionGroupPlatform *platform_options, 105 lldb::TargetSP &target_sp); 106 107 //------------------------------------------------------------------ 108 /// Create a new Target. 109 /// 110 /// Same as the function above, but used when you already know the 111 /// platform you will be using 112 //------------------------------------------------------------------ 113 Error 114 CreateTarget (Debugger &debugger, 115 const char *user_exe_path, 116 const ArchSpec& arch, 117 bool get_dependent_modules, 118 lldb::PlatformSP &platform_sp, 119 lldb::TargetSP &target_sp); 120 121 //------------------------------------------------------------------ 122 /// Delete a Target object from the list. 123 /// 124 /// When clients are done with the Target objets, this function 125 /// should be called to release the memory associated with a target 126 /// object. 127 /// 128 /// @param[in] target_sp 129 /// The shared pointer to a target. 130 /// 131 /// @return 132 /// Returns \b true if the target was successfully removed from 133 /// from this target list, \b false otherwise. The client will 134 /// be left with the last remaining shared pointer to the target 135 /// in \a target_sp which can then be properly released. 136 //------------------------------------------------------------------ 137 bool 138 DeleteTarget (lldb::TargetSP &target_sp); 139 140 int 141 GetNumTargets () const; 142 143 lldb::TargetSP 144 GetTargetAtIndex (uint32_t index) const; 145 146 uint32_t 147 GetIndexOfTarget (lldb::TargetSP target_sp) const; 148 149 //------------------------------------------------------------------ 150 /// Find the target that contains has an executable whose path 151 /// matches \a exe_file_spec, and whose architecture matches 152 /// \a arch_ptr if arch_ptr is not NULL. 153 /// 154 /// @param[in] exe_file_spec 155 /// A file spec containing a basename, or a full path (directory 156 /// and basename). If \a exe_file_spec contains only a filename 157 /// (empty GetDirectory() value) then matching will be done 158 /// solely based on the filenames and directories won't be 159 /// compared. If \a exe_file_spec contains a filename and a 160 /// directory, then both must match. 161 /// 162 /// @param[in] exe_arch_ptr 163 /// If not NULL then the architecture also needs to match, else 164 /// the architectures will be compared. 165 /// 166 /// @return 167 /// A shared pointer to a target object. The returned shared 168 /// pointer will contain NULL if no target objects have a 169 /// executable whose full or partial path matches 170 /// with a matching process ID. 171 //------------------------------------------------------------------ 172 lldb::TargetSP 173 FindTargetWithExecutableAndArchitecture (const FileSpec &exe_file_spec, 174 const ArchSpec *exe_arch_ptr = NULL) const; 175 176 //------------------------------------------------------------------ 177 /// Find the target that contains a process with process ID \a 178 /// pid. 179 /// 180 /// @param[in] pid 181 /// The process ID to search our target list for. 182 /// 183 /// @return 184 /// A shared pointer to a target object. The returned shared 185 /// pointer will contain NULL if no target objects own a process 186 /// with a matching process ID. 187 //------------------------------------------------------------------ 188 lldb::TargetSP 189 FindTargetWithProcessID (lldb::pid_t pid) const; 190 191 lldb::TargetSP 192 FindTargetWithProcess (lldb_private::Process *process) const; 193 194 lldb::TargetSP 195 GetTargetSP (Target *target) const; 196 197 //------------------------------------------------------------------ 198 /// Send an async interrupt to one or all processes. 199 /// 200 /// Find the target that contains the process with process ID \a 201 /// pid and send a LLDB_EVENT_ASYNC_INTERRUPT event to the process's 202 /// event queue. 203 /// 204 /// @param[in] pid 205 /// The process ID to search our target list for, if \a pid is 206 /// LLDB_INVALID_PROCESS_ID, then the interrupt will be sent to 207 /// all processes. 208 /// 209 /// @return 210 /// The number of async interrupts sent. 211 //------------------------------------------------------------------ 212 uint32_t 213 SendAsyncInterrupt (lldb::pid_t pid = LLDB_INVALID_PROCESS_ID); 214 215 uint32_t 216 SignalIfRunning (lldb::pid_t pid, int signo); 217 218 uint32_t 219 SetSelectedTarget (Target *target); 220 221 lldb::TargetSP 222 GetSelectedTarget (); 223 224 225 protected: 226 typedef std::vector<lldb::TargetSP> collection; 227 //------------------------------------------------------------------ 228 // Member variables. 229 //------------------------------------------------------------------ 230 collection m_target_list; 231 mutable Mutex m_target_list_mutex; 232 uint32_t m_selected_target_idx; 233 private: 234 DISALLOW_COPY_AND_ASSIGN (TargetList); 235 }; 236 237 } // namespace lldb_private 238 239 #endif // liblldb_TargetList_h_ 240