]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/tools/lldb/include/lldb/Target/Platform.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / tools / lldb / include / lldb / Target / Platform.h
1 //===-- Platform.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_Platform_h_
11 #define liblldb_Platform_h_
12
13 // C Includes
14 // C++ Includes
15 #include <map>
16 #include <string>
17 #include <vector>
18
19 // Other libraries and framework includes
20 // Project includes
21 #include "lldb/lldb-public.h"
22 #include "lldb/Core/ArchSpec.h"
23 #include "lldb/Core/ConstString.h"
24 #include "lldb/Core/PluginInterface.h"
25 #include "lldb/Interpreter/Options.h"
26 #include "lldb/Host/Mutex.h"
27
28 namespace lldb_private {
29
30     //----------------------------------------------------------------------
31     /// @class Platform Platform.h "lldb/Target/Platform.h"
32     /// @brief A plug-in interface definition class for debug platform that
33     /// includes many platform abilities such as:
34     ///     @li getting platform information such as supported architectures,
35     ///         supported binary file formats and more
36     ///     @li launching new processes
37     ///     @li attaching to existing processes
38     ///     @li download/upload files
39     ///     @li execute shell commands
40     ///     @li listing and getting info for existing processes
41     ///     @li attaching and possibly debugging the platform's kernel
42     //----------------------------------------------------------------------
43     class Platform :
44         public PluginInterface
45     {
46     public:
47
48         //------------------------------------------------------------------
49         /// Get the native host platform plug-in. 
50         ///
51         /// There should only be one of these for each host that LLDB runs
52         /// upon that should be statically compiled in and registered using
53         /// preprocessor macros or other similar build mechanisms in a 
54         /// PlatformSubclass::Initialize() function.
55         ///
56         /// This platform will be used as the default platform when launching
57         /// or attaching to processes unless another platform is specified.
58         //------------------------------------------------------------------
59         static lldb::PlatformSP
60         GetDefaultPlatform ();
61
62         static lldb::PlatformSP
63         GetPlatformForArchitecture (const ArchSpec &arch,
64                                     ArchSpec *platform_arch_ptr);
65
66         static const char *
67         GetHostPlatformName ();
68
69         static void
70         SetDefaultPlatform (const lldb::PlatformSP &platform_sp);
71
72         static lldb::PlatformSP
73         Create (const char *platform_name, Error &error);
74
75         static lldb::PlatformSP
76         Create (const ArchSpec &arch, ArchSpec *platform_arch_ptr, Error &error);
77         
78         static uint32_t
79         GetNumConnectedRemotePlatforms ();
80         
81         static lldb::PlatformSP
82         GetConnectedRemotePlatformAtIndex (uint32_t idx);
83
84         //------------------------------------------------------------------
85         /// Default Constructor
86         //------------------------------------------------------------------
87         Platform (bool is_host_platform);
88
89         //------------------------------------------------------------------
90         /// Destructor.
91         ///
92         /// The destructor is virtual since this class is designed to be
93         /// inherited from by the plug-in instance.
94         //------------------------------------------------------------------
95         virtual
96         ~Platform();
97
98         //------------------------------------------------------------------
99         /// Find a platform plugin for a given process.
100         ///
101         /// Scans the installed Platform plug-ins and tries to find
102         /// an instance that can be used for \a process
103         ///
104         /// @param[in] process
105         ///     The process for which to try and locate a platform
106         ///     plug-in instance.
107         ///
108         /// @param[in] plugin_name
109         ///     An optional name of a specific platform plug-in that
110         ///     should be used. If NULL, pick the best plug-in.
111         //------------------------------------------------------------------
112         static Platform*
113         FindPlugin (Process *process, const ConstString &plugin_name);
114
115         //------------------------------------------------------------------
116         /// Set the target's executable based off of the existing 
117         /// architecture information in \a target given a path to an 
118         /// executable \a exe_file.
119         ///
120         /// Each platform knows the architectures that it supports and can
121         /// select the correct architecture slice within \a exe_file by 
122         /// inspecting the architecture in \a target. If the target had an
123         /// architecture specified, then in can try and obey that request
124         /// and optionally fail if the architecture doesn't match up.
125         /// If no architecture is specified, the platform should select the
126         /// default architecture from \a exe_file. Any application bundles
127         /// or executable wrappers can also be inspected for the actual
128         /// application binary within the bundle that should be used.
129         ///
130         /// @return
131         ///     Returns \b true if this Platform plug-in was able to find
132         ///     a suitable executable, \b false otherwise.
133         //------------------------------------------------------------------
134         virtual Error
135         ResolveExecutable (const FileSpec &exe_file,
136                            const ArchSpec &arch,
137                            lldb::ModuleSP &module_sp,
138                            const FileSpecList *module_search_paths_ptr);
139
140         
141         //------------------------------------------------------------------
142         /// Find a symbol file given a symbol file module specification.
143         ///
144         /// Each platform might have tricks to find symbol files for an
145         /// executable given information in a symbol file ModuleSpec. Some
146         /// platforms might also support symbol files that are bundles and
147         /// know how to extract the right symbol file given a bundle.
148         ///
149         /// @param[in] target
150         ///     The target in which we are trying to resolve the symbol file.
151         ///     The target has a list of modules that we might be able to
152         ///     use in order to help find the right symbol file. If the
153         ///     "m_file" or "m_platform_file" entries in the \a sym_spec
154         ///     are filled in, then we might be able to locate a module in
155         ///     the target, extract its UUID and locate a symbol file.
156         ///     If just the "m_uuid" is specified, then we might be able
157         ///     to find the module in the target that matches that UUID
158         ///     and pair the symbol file along with it. If just "m_symbol_file"
159         ///     is specified, we can use a variety of tricks to locate the
160         ///     symbols in an SDK, PDK, or other development kit location.
161         ///
162         /// @param[in] sym_spec
163         ///     A module spec that describes some information about the
164         ///     symbol file we are trying to resolve. The ModuleSpec might
165         ///     contain the following:
166         ///     m_file - A full or partial path to an executable from the
167         ///              target (might be empty).
168         ///     m_platform_file - Another executable hint that contains
169         ///                       the path to the file as known on the
170         ///                       local/remote platform.
171         ///     m_symbol_file - A full or partial path to a symbol file
172         ///                     or symbol bundle that should be used when
173         ///                     trying to resolve the symbol file.
174         ///     m_arch - The architecture we are looking for when resolving
175         ///              the symbol file.
176         ///     m_uuid - The UUID of the executable and symbol file. This
177         ///              can often be used to match up an exectuable with
178         ///              a symbol file, or resolve an symbol file in a
179         ///              symbol file bundle.
180         ///
181         /// @param[out] sym_file
182         ///     The resolved symbol file spec if the returned error
183         ///     indicates succes.
184         ///
185         /// @return
186         ///     Returns an error that describes success or failure.
187         //------------------------------------------------------------------
188         virtual Error
189         ResolveSymbolFile (Target &target,
190                            const ModuleSpec &sym_spec,
191                            FileSpec &sym_file);
192
193         //------------------------------------------------------------------
194         /// Resolves the FileSpec to a (possibly) remote path. Remote
195         /// platforms must override this to resolve to a path on the remote
196         /// side.
197         //------------------------------------------------------------------
198         virtual bool
199         ResolveRemotePath (const FileSpec &platform_path,
200                            FileSpec &resolved_platform_path);
201
202         bool
203         GetOSVersion (uint32_t &major, 
204                       uint32_t &minor, 
205                       uint32_t &update);
206            
207         bool
208         SetOSVersion (uint32_t major, 
209                       uint32_t minor, 
210                       uint32_t update);
211
212         bool
213         GetOSBuildString (std::string &s);
214         
215         bool
216         GetOSKernelDescription (std::string &s);
217
218         // Returns the the name of the platform
219         ConstString
220         GetName ();
221
222         virtual const char *
223         GetHostname ();
224
225         virtual const char *
226         GetDescription () = 0;
227
228         //------------------------------------------------------------------
229         /// Report the current status for this platform. 
230         ///
231         /// The returned string usually involves returning the OS version
232         /// (if available), and any SDK directory that might be being used
233         /// for local file caching, and if connected a quick blurb about
234         /// what this platform is connected to.
235         //------------------------------------------------------------------        
236         virtual void
237         GetStatus (Stream &strm);
238
239         //------------------------------------------------------------------
240         // Subclasses must be able to fetch the current OS version
241         //
242         // Remote classes must be connected for this to succeed. Local 
243         // subclasses don't need to override this function as it will just
244         // call the Host::GetOSVersion().
245         //------------------------------------------------------------------
246         virtual bool
247         GetRemoteOSVersion ()
248         {
249             return false;
250         }
251
252         virtual bool
253         GetRemoteOSBuildString (std::string &s)
254         {
255             s.clear();
256             return false;
257         }
258         
259         virtual bool
260         GetRemoteOSKernelDescription (std::string &s)
261         {
262             s.clear();
263             return false;
264         }
265
266         // Remote Platform subclasses need to override this function
267         virtual ArchSpec
268         GetRemoteSystemArchitecture ()
269         {
270             return ArchSpec(); // Return an invalid architecture
271         }
272         
273         virtual ConstString
274         GetRemoteWorkingDirectory()
275         {
276             return m_working_dir;
277         }
278         
279         virtual bool
280         SetRemoteWorkingDirectory(const ConstString &path);
281
282         virtual const char *
283         GetUserName (uint32_t uid);
284
285         virtual const char *
286         GetGroupName (uint32_t gid);
287
288         //------------------------------------------------------------------
289         /// Locate a file for a platform.
290         ///
291         /// The default implementation of this function will return the same
292         /// file patch in \a local_file as was in \a platform_file.
293         ///
294         /// @param[in] platform_file
295         ///     The platform file path to locate and cache locally.
296         ///
297         /// @param[in] uuid_ptr
298         ///     If we know the exact UUID of the file we are looking for, it
299         ///     can be specified. If it is not specified, we might now know
300         ///     the exact file. The UUID is usually some sort of MD5 checksum
301         ///     for the file and is sometimes known by dynamic linkers/loaders.
302         ///     If the UUID is known, it is best to supply it to platform
303         ///     file queries to ensure we are finding the correct file, not
304         ///     just a file at the correct path.
305         ///
306         /// @param[out] local_file
307         ///     A locally cached version of the platform file. For platforms
308         ///     that describe the current host computer, this will just be
309         ///     the same file. For remote platforms, this file might come from
310         ///     and SDK directory, or might need to be sync'ed over to the
311         ///     current machine for efficient debugging access.
312         ///
313         /// @return
314         ///     An error object.
315         //------------------------------------------------------------------
316         virtual Error
317         GetFileWithUUID (const FileSpec &platform_file, 
318                          const UUID *uuid_ptr,
319                          FileSpec &local_file);
320
321         //----------------------------------------------------------------------
322         // Locate the scripting resource given a module specification.
323         //
324         // Locating the file should happen only on the local computer or using
325         // the current computers global settings.
326         //----------------------------------------------------------------------
327         virtual FileSpecList
328         LocateExecutableScriptingResources (Target *target,
329                                             Module &module);
330         
331         virtual Error
332         GetSharedModule (const ModuleSpec &module_spec, 
333                          lldb::ModuleSP &module_sp,
334                          const FileSpecList *module_search_paths_ptr,
335                          lldb::ModuleSP *old_module_sp_ptr,
336                          bool *did_create_ptr);
337
338         virtual Error
339         ConnectRemote (Args& args);
340
341         virtual Error
342         DisconnectRemote ();
343
344         //------------------------------------------------------------------
345         /// Get the platform's supported architectures in the order in which
346         /// they should be searched.
347         ///
348         /// @param[in] idx
349         ///     A zero based architecture index
350         ///
351         /// @param[out] arch
352         ///     A copy of the archgitecture at index if the return value is
353         ///     \b true.
354         ///
355         /// @return
356         ///     \b true if \a arch was filled in and is valid, \b false 
357         ///     otherwise.
358         //------------------------------------------------------------------
359         virtual bool
360         GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) = 0;
361
362         virtual size_t
363         GetSoftwareBreakpointTrapOpcode (Target &target,
364                                          BreakpointSite *bp_site) = 0;
365
366         //------------------------------------------------------------------
367         /// Launch a new process on a platform, not necessarily for 
368         /// debugging, it could be just for running the process.
369         //------------------------------------------------------------------
370         virtual Error
371         LaunchProcess (ProcessLaunchInfo &launch_info);
372
373         //------------------------------------------------------------------
374         /// Lets a platform answer if it is compatible with a given
375         /// architecture and the target triple contained within.
376         //------------------------------------------------------------------
377         virtual bool
378         IsCompatibleArchitecture (const ArchSpec &arch,
379                                   bool exact_arch_match,
380                                   ArchSpec *compatible_arch_ptr);
381
382         //------------------------------------------------------------------
383         /// Not all platforms will support debugging a process by spawning
384         /// somehow halted for a debugger (specified using the 
385         /// "eLaunchFlagDebug" launch flag) and then attaching. If your 
386         /// platform doesn't support this, override this function and return
387         /// false.
388         //------------------------------------------------------------------
389         virtual bool
390         CanDebugProcess ()
391         {
392             return true; 
393         }
394
395         //------------------------------------------------------------------
396         /// Subclasses do not need to implement this function as it uses
397         /// the Platform::LaunchProcess() followed by Platform::Attach ().
398         /// Remote platforms will want to subclass this function in order
399         /// to be able to intercept STDIO and possibly launch a separate
400         /// process that will debug the debuggee.
401         //------------------------------------------------------------------
402         virtual lldb::ProcessSP
403         DebugProcess (ProcessLaunchInfo &launch_info,
404                       Debugger &debugger,
405                       Target *target,       // Can be NULL, if NULL create a new target, else use existing one
406                       Listener &listener,
407                       Error &error);
408
409         //------------------------------------------------------------------
410         /// Attach to an existing process using a process ID.
411         ///
412         /// Each platform subclass needs to implement this function and 
413         /// attempt to attach to the process with the process ID of \a pid.
414         /// The platform subclass should return an appropriate ProcessSP 
415         /// subclass that is attached to the process, or an empty shared 
416         /// pointer with an appriopriate error.
417         ///
418         /// @param[in] pid
419         ///     The process ID that we should attempt to attach to.
420         ///
421         /// @return
422         ///     An appropriate ProcessSP containing a valid shared pointer
423         ///     to the default Process subclass for the platform that is 
424         ///     attached to the process, or an empty shared pointer with an
425         ///     appriopriate error fill into the \a error object.
426         //------------------------------------------------------------------
427         virtual lldb::ProcessSP
428         Attach (ProcessAttachInfo &attach_info,
429                 Debugger &debugger,
430                 Target *target,       // Can be NULL, if NULL create a new target, else use existing one
431                 Listener &listener,
432                 Error &error) = 0;
433
434         //------------------------------------------------------------------
435         /// Attach to an existing process by process name.
436         ///
437         /// This function is not meant to be overridden by Process
438         /// subclasses. It will first call
439         /// Process::WillAttach (const char *) and if that returns \b
440         /// true, Process::DoAttach (const char *) will be called to
441         /// actually do the attach. If DoAttach returns \b true, then
442         /// Process::DidAttach() will be called.
443         ///
444         /// @param[in] process_name
445         ///     A process name to match against the current process list.
446         ///
447         /// @return
448         ///     Returns \a pid if attaching was successful, or
449         ///     LLDB_INVALID_PROCESS_ID if attaching fails.
450         //------------------------------------------------------------------
451 //        virtual lldb::ProcessSP
452 //        Attach (const char *process_name, 
453 //                bool wait_for_launch, 
454 //                Error &error) = 0;
455         
456         //------------------------------------------------------------------
457         // The base class Platform will take care of the host platform.
458         // Subclasses will need to fill in the remote case.
459         //------------------------------------------------------------------
460         virtual uint32_t
461         FindProcesses (const ProcessInstanceInfoMatch &match_info,
462                        ProcessInstanceInfoList &proc_infos);
463
464         virtual bool
465         GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &proc_info);
466         
467         //------------------------------------------------------------------
468         // Set a breakpoint on all functions that can end up creating a thread
469         // for this platform. This is needed when running expressions and
470         // also for process control.
471         //------------------------------------------------------------------
472         virtual lldb::BreakpointSP
473         SetThreadCreationBreakpoint (Target &target);
474         
475         //------------------------------------------------------------------
476         // Given a target, find the local SDK directory if one exists on the
477         // current host.
478         //------------------------------------------------------------------
479         virtual lldb_private::ConstString
480         GetSDKDirectory (lldb_private::Target &target)
481         {
482             return lldb_private::ConstString();
483         }
484
485         const std::string &
486         GetRemoteURL () const
487         {
488             return m_remote_url;
489         }
490
491         bool
492         IsHost () const
493         {
494             return m_is_host;    // Is this the default host platform?
495         }
496
497         bool
498         IsRemote () const
499         {
500             return !m_is_host;
501         }
502         
503         virtual bool
504         IsConnected () const
505         {
506             // Remote subclasses should override this function
507             return IsHost();
508         }
509         
510         const ArchSpec &
511         GetSystemArchitecture();
512
513         void
514         SetSystemArchitecture (const ArchSpec &arch)
515         {
516             m_system_arch = arch;
517             if (IsHost())
518                 m_os_version_set_while_connected = m_system_arch.IsValid();
519         }
520
521         // Used for column widths
522         size_t
523         GetMaxUserIDNameLength() const
524         {
525             return m_max_uid_name_len;
526         }
527         // Used for column widths
528         size_t
529         GetMaxGroupIDNameLength() const
530         {
531             return m_max_gid_name_len;
532         }
533         
534         const ConstString &
535         GetSDKRootDirectory () const
536         {
537             return m_sdk_sysroot;
538         }
539
540         void
541         SetSDKRootDirectory (const ConstString &dir)
542         {
543             m_sdk_sysroot = dir;
544         }
545
546         const ConstString &
547         GetSDKBuild () const
548         {
549             return m_sdk_build;
550         }
551         
552         void
553         SetSDKBuild (const ConstString &sdk_build)
554         {
555             m_sdk_build = sdk_build;
556         }    
557
558         ConstString
559         GetWorkingDirectory ();
560         
561         bool
562         SetWorkingDirectory (const ConstString &path);
563         
564         // There may be modules that we don't want to find by default for operations like "setting breakpoint by name".
565         // The platform will return "true" from this call if the passed in module happens to be one of these.
566         
567         virtual bool
568         ModuleIsExcludedForNonModuleSpecificSearches (Target &target, const lldb::ModuleSP &module_sp)
569         {
570             return false;
571         }
572         
573         virtual Error
574         MakeDirectory (const char *path, uint32_t permissions);
575         
576         virtual Error
577         GetFilePermissions (const char *path, uint32_t &file_permissions);
578
579         virtual Error
580         SetFilePermissions (const char *path, uint32_t file_permissions);
581
582         virtual lldb::user_id_t
583         OpenFile (const FileSpec& file_spec,
584                   uint32_t flags,
585                   uint32_t mode,
586                   Error &error)
587         {
588             return UINT64_MAX;
589         }
590         
591         virtual bool
592         CloseFile (lldb::user_id_t fd,
593                    Error &error)
594         {
595             return false;
596         }
597         
598         virtual lldb::user_id_t
599         GetFileSize (const FileSpec& file_spec)
600         {
601             return UINT64_MAX;
602         }
603
604         virtual uint64_t
605         ReadFile (lldb::user_id_t fd,
606                   uint64_t offset,
607                   void *dst,
608                   uint64_t dst_len,
609                   Error &error)
610         {
611             error.SetErrorStringWithFormat ("Platform::ReadFile() is not supported in the %s platform", GetName().GetCString());
612             return -1;
613         }
614         
615         virtual uint64_t
616         WriteFile (lldb::user_id_t fd,
617                    uint64_t offset,
618                    const void* src,
619                    uint64_t src_len,
620                    Error &error)
621         {
622             error.SetErrorStringWithFormat ("Platform::ReadFile() is not supported in the %s platform", GetName().GetCString());
623             return -1;
624         }
625         
626         virtual Error
627         GetFile (const FileSpec& source,
628                  const FileSpec& destination);
629         
630         virtual Error
631         PutFile (const FileSpec& source,
632                  const FileSpec& destination,
633                  uint32_t uid = UINT32_MAX,
634                  uint32_t gid = UINT32_MAX);
635
636         virtual Error
637         CreateSymlink (const char *src, // The name of the link is in src
638                        const char *dst);// The symlink points to dst
639
640         //----------------------------------------------------------------------
641         /// Install a file or directory to the remote system.
642         ///
643         /// Install is similar to Platform::PutFile(), but it differs in that if
644         /// an application/framework/shared library is installed on a remote
645         /// platform and the remote platform requires something to be done to
646         /// register the application/framework/shared library, then this extra
647         /// registration can be done.
648         ///
649         /// @param[in] src
650         ///     The source file/directory to install on the remote system.
651         ///
652         /// @param[in] dst
653         ///     The destination file/directory where \a src will be installed.
654         ///     If \a dst has no filename specified, then its filename will
655         ///     be set from \a src. It \a dst has no directory specified, it
656         ///     will use the platform working directory. If \a dst has a
657         ///     directory specified, but the directory path is relative, the
658         ///     platform working directory will be prepended to the relative
659         ///     directory.
660         ///
661         /// @return
662         ///     An error object that describes anything that went wrong.
663         //----------------------------------------------------------------------
664         virtual Error
665         Install (const FileSpec& src, const FileSpec& dst);
666
667         virtual size_t
668         GetEnvironment (StringList &environment);
669         
670         virtual bool
671         GetFileExists (const lldb_private::FileSpec& file_spec);
672         
673         virtual Error
674         Unlink (const char *path);
675
676         virtual bool
677         GetSupportsRSync ()
678         {
679             return m_supports_rsync;
680         }
681         
682         virtual void
683         SetSupportsRSync(bool flag)
684         {
685             m_supports_rsync = flag;
686         }
687         
688         virtual const char*
689         GetRSyncOpts ()
690         {
691             return m_rsync_opts.c_str();
692         }
693         
694         virtual void
695         SetRSyncOpts (const char* opts)
696         {
697             m_rsync_opts.assign(opts);
698         }
699         
700         virtual const char*
701         GetRSyncPrefix ()
702         {
703             return m_rsync_prefix.c_str();
704         }
705         
706         virtual void
707         SetRSyncPrefix (const char* prefix)
708         {
709             m_rsync_prefix.assign(prefix);
710         }
711         
712         virtual bool
713         GetSupportsSSH ()
714         {
715             return m_supports_ssh;
716         }
717         
718         virtual void
719         SetSupportsSSH(bool flag)
720         {
721             m_supports_ssh = flag;
722         }
723         
724         virtual const char*
725         GetSSHOpts ()
726         {
727             return m_ssh_opts.c_str();
728         }
729         
730         virtual void
731         SetSSHOpts (const char* opts)
732         {
733             m_ssh_opts.assign(opts);
734         }
735         
736         virtual bool
737         GetIgnoresRemoteHostname ()
738         {
739             return m_ignores_remote_hostname;
740         }
741         
742         virtual void
743         SetIgnoresRemoteHostname(bool flag)
744         {
745             m_ignores_remote_hostname = flag;
746         }
747         
748         virtual lldb_private::OptionGroupOptions *
749         GetConnectionOptions (CommandInterpreter& interpreter)
750         {
751             return NULL;
752         }
753         
754         virtual lldb_private::Error
755         RunShellCommand (const char *command,           // Shouldn't be NULL
756                          const char *working_dir,       // Pass NULL to use the current working directory
757                          int *status_ptr,               // Pass NULL if you don't want the process exit status
758                          int *signo_ptr,                // Pass NULL if you don't want the signal that caused the process to exit
759                          std::string *command_output,   // Pass NULL if you don't want the command output
760                          uint32_t timeout_sec);         // Timeout in seconds to wait for shell program to finish
761         
762         virtual void
763         SetLocalCacheDirectory (const char* local);
764         
765         virtual const char*
766         GetLocalCacheDirectory ();
767         
768         virtual std::string
769         GetPlatformSpecificConnectionInformation()
770         {
771             return "";
772         }
773         
774         virtual bool
775         CalculateMD5 (const FileSpec& file_spec,
776                       uint64_t &low,
777                       uint64_t &high);
778         
779         virtual int32_t
780         GetResumeCountForLaunchInfo (ProcessLaunchInfo &launch_info)
781         {
782             return 1;
783         }
784
785         //------------------------------------------------------------------
786         /// Locate a queue name given a thread's qaddr
787         ///
788         /// On a system using libdispatch ("Grand Central Dispatch") style
789         /// queues, a thread may be associated with a GCD queue or not,
790         /// and a queue may be associated with multiple threads.
791         /// The process/thread must provide a way to find the "dispatch_qaddr" 
792         /// for each thread, and from that dispatch_qaddr this Platform method
793         /// will locate the queue name and provide that.
794         ///
795         /// @param[in] process
796         ///     A process is required for reading memory.
797         ///
798         /// @param[in] dispatch_qaddr
799         ///     The dispatch_qaddr for this thread.
800         ///
801         /// @return
802         ///     The name of the queue, if there is one.  An empty string
803         ///     means that this thread is not associated with a dispatch 
804         ///     queue.
805         //------------------------------------------------------------------
806         virtual std::string
807         GetQueueNameForThreadQAddress (Process *process, lldb::addr_t dispatch_qaddr)
808         {
809             return "";
810         }
811
812         //------------------------------------------------------------------
813         /// Locate a queue ID given a thread's qaddr
814         ///
815         /// On a system using libdispatch ("Grand Central Dispatch") style
816         /// queues, a thread may be associated with a GCD queue or not,
817         /// and a queue may be associated with multiple threads.
818         /// The process/thread must provide a way to find the "dispatch_qaddr" 
819         /// for each thread, and from that dispatch_qaddr this Platform method
820         /// will locate the queue ID and provide that.
821         ///
822         /// @param[in] process
823         ///     A process is required for reading memory.
824         ///
825         /// @param[in] dispatch_qaddr
826         ///     The dispatch_qaddr for this thread.
827         ///
828         /// @return
829         ///     The queue_id for this thread, if this thread is associated
830         ///     with a dispatch queue.  Else LLDB_INVALID_QUEUE_ID is returned.
831         //------------------------------------------------------------------
832         virtual lldb::queue_id_t
833         GetQueueIDForThreadQAddress (Process *process, lldb::addr_t dispatch_qaddr)
834         {
835             return LLDB_INVALID_QUEUE_ID;
836         }
837
838         //------------------------------------------------------------------
839         /// Provide a list of trap handler function names for this platform
840         ///
841         /// The unwinder needs to treat trap handlers specially -- the stack
842         /// frame may not be aligned correctly for a trap handler (the kernel
843         /// often won't perturb the stack pointer, or won't re-align it properly,
844         /// in the process of calling the handler) and the frame above the handler
845         /// needs to be treated by the unwinder's "frame 0" rules instead of its
846         /// "middle of the stack frame" rules.
847         /// 
848         /// In a user process debugging scenario, the list of trap handlers is
849         /// typically just "_sigtramp".
850         ///
851         /// The Platform base class provides the m_trap_handlers ivar but it does
852         /// not populate it.  Subclasses should add the names of the asynchronous
853         /// signal handler routines as needed.  For most Unix platforms, add _sigtramp.
854         ///
855         /// @return
856         ///     A list of symbol names.  The list may be empty.
857         //------------------------------------------------------------------
858         virtual const std::vector<ConstString> &
859         GetTrapHandlerSymbolNames ();
860
861     protected:
862         bool m_is_host;
863         // Set to true when we are able to actually set the OS version while 
864         // being connected. For remote platforms, we might set the version ahead
865         // of time before we actually connect and this version might change when
866         // we actually connect to a remote platform. For the host platform this
867         // will be set to the once we call Host::GetOSVersion().
868         bool m_os_version_set_while_connected;
869         bool m_system_arch_set_while_connected;
870         ConstString m_sdk_sysroot; // the root location of where the SDK files are all located
871         ConstString m_sdk_build;
872         ConstString m_working_dir; // The working directory which is used when installing modules that have no install path set
873         std::string m_remote_url;
874         std::string m_name;
875         uint32_t m_major_os_version;
876         uint32_t m_minor_os_version;
877         uint32_t m_update_os_version;
878         ArchSpec m_system_arch; // The architecture of the kernel or the remote platform
879         typedef std::map<uint32_t, ConstString> IDToNameMap;
880         Mutex m_uid_map_mutex;
881         Mutex m_gid_map_mutex;
882         IDToNameMap m_uid_map;
883         IDToNameMap m_gid_map;
884         size_t m_max_uid_name_len;
885         size_t m_max_gid_name_len;
886         bool m_supports_rsync;
887         std::string m_rsync_opts;
888         std::string m_rsync_prefix;
889         bool m_supports_ssh;
890         std::string m_ssh_opts;
891         bool m_ignores_remote_hostname;
892         std::string m_local_cache_directory;
893         std::vector<ConstString> m_trap_handlers;
894         bool m_calculated_trap_handlers;
895
896         //------------------------------------------------------------------
897         /// Ask the Platform subclass to fill in the list of trap handler names
898         ///
899         /// For most Unix user process environments, this will be a single
900         /// function name, _sigtramp.  More specialized environments may have
901         /// additional handler names.  The unwinder code needs to know when a
902         /// trap handler is on the stack because the unwind rules for the frame
903         /// that caused the trap are different.
904         ///
905         /// The base class Platform ivar m_trap_handlers should be updated by
906         /// the Platform subclass when this method is called.  If there are no
907         /// predefined trap handlers, this method may be a no-op.
908         //------------------------------------------------------------------
909         virtual void
910         CalculateTrapHandlerSymbolNames () = 0;
911
912         const char *
913         GetCachedUserName (uint32_t uid)
914         {
915             Mutex::Locker locker (m_uid_map_mutex);
916             IDToNameMap::iterator pos = m_uid_map.find (uid);
917             if (pos != m_uid_map.end())
918             {
919                 // return the empty string if our string is NULL
920                 // so we can tell when things were in the negative
921                 // cached (didn't find a valid user name, don't keep
922                 // trying)
923                 return pos->second.AsCString("");
924             }
925             return NULL;
926         }
927
928         const char *
929         SetCachedUserName (uint32_t uid, const char *name, size_t name_len)
930         {
931             Mutex::Locker locker (m_uid_map_mutex);
932             ConstString const_name (name);
933             m_uid_map[uid] = const_name;
934             if (m_max_uid_name_len < name_len)
935                 m_max_uid_name_len = name_len;
936             // Const strings lives forever in our const string pool, so we can return the const char *
937             return const_name.GetCString(); 
938         }
939
940         void
941         SetUserNameNotFound (uint32_t uid)
942         {
943             Mutex::Locker locker (m_uid_map_mutex);
944             m_uid_map[uid] = ConstString();
945         }
946         
947
948         void
949         ClearCachedUserNames ()
950         {
951             Mutex::Locker locker (m_uid_map_mutex);
952             m_uid_map.clear();
953         }
954     
955         const char *
956         GetCachedGroupName (uint32_t gid)
957         {
958             Mutex::Locker locker (m_gid_map_mutex);
959             IDToNameMap::iterator pos = m_gid_map.find (gid);
960             if (pos != m_gid_map.end())
961             {
962                 // return the empty string if our string is NULL
963                 // so we can tell when things were in the negative
964                 // cached (didn't find a valid group name, don't keep
965                 // trying)
966                 return pos->second.AsCString("");
967             }
968             return NULL;
969         }
970
971         const char *
972         SetCachedGroupName (uint32_t gid, const char *name, size_t name_len)
973         {
974             Mutex::Locker locker (m_gid_map_mutex);
975             ConstString const_name (name);
976             m_gid_map[gid] = const_name;
977             if (m_max_gid_name_len < name_len)
978                 m_max_gid_name_len = name_len;
979             // Const strings lives forever in our const string pool, so we can return the const char *
980             return const_name.GetCString(); 
981         }
982
983         void
984         SetGroupNameNotFound (uint32_t gid)
985         {
986             Mutex::Locker locker (m_gid_map_mutex);
987             m_gid_map[gid] = ConstString();
988         }
989
990         void
991         ClearCachedGroupNames ()
992         {
993             Mutex::Locker locker (m_gid_map_mutex);
994             m_gid_map.clear();
995         }
996
997     private:
998         DISALLOW_COPY_AND_ASSIGN (Platform);
999     };
1000
1001     
1002     class PlatformList
1003     {
1004     public:
1005         PlatformList() :
1006             m_mutex (Mutex::eMutexTypeRecursive),
1007             m_platforms (),
1008             m_selected_platform_sp()
1009         {
1010         }
1011         
1012         ~PlatformList()
1013         {
1014         }
1015         
1016         void
1017         Append (const lldb::PlatformSP &platform_sp, bool set_selected)
1018         {
1019             Mutex::Locker locker (m_mutex);
1020             m_platforms.push_back (platform_sp);
1021             if (set_selected)
1022                 m_selected_platform_sp = m_platforms.back();
1023         }
1024
1025         size_t
1026         GetSize()
1027         {
1028             Mutex::Locker locker (m_mutex);
1029             return m_platforms.size();
1030         }
1031
1032         lldb::PlatformSP
1033         GetAtIndex (uint32_t idx)
1034         {
1035             lldb::PlatformSP platform_sp;
1036             {
1037                 Mutex::Locker locker (m_mutex);
1038                 if (idx < m_platforms.size())
1039                     platform_sp = m_platforms[idx];
1040             }
1041             return platform_sp;
1042         }
1043
1044         //------------------------------------------------------------------
1045         /// Select the active platform.
1046         ///
1047         /// In order to debug remotely, other platform's can be remotely
1048         /// connected to and set as the selected platform for any subsequent
1049         /// debugging. This allows connection to remote targets and allows
1050         /// the ability to discover process info, launch and attach to remote
1051         /// processes.
1052         //------------------------------------------------------------------
1053         lldb::PlatformSP
1054         GetSelectedPlatform ()
1055         {
1056             Mutex::Locker locker (m_mutex);
1057             if (!m_selected_platform_sp && !m_platforms.empty())
1058                 m_selected_platform_sp = m_platforms.front();
1059             
1060             return m_selected_platform_sp;
1061         }
1062
1063         void
1064         SetSelectedPlatform (const lldb::PlatformSP &platform_sp)
1065         {
1066             if (platform_sp)
1067             {
1068                 Mutex::Locker locker (m_mutex);
1069                 const size_t num_platforms = m_platforms.size();
1070                 for (size_t idx=0; idx<num_platforms; ++idx)
1071                 {
1072                     if (m_platforms[idx].get() == platform_sp.get())
1073                     {
1074                         m_selected_platform_sp = m_platforms[idx];
1075                         return;
1076                     }
1077                 }
1078                 m_platforms.push_back (platform_sp);
1079                 m_selected_platform_sp = m_platforms.back();
1080             }
1081         }
1082
1083     protected:
1084         typedef std::vector<lldb::PlatformSP> collection;
1085         mutable Mutex m_mutex;
1086         collection m_platforms;
1087         lldb::PlatformSP m_selected_platform_sp;
1088
1089     private:
1090         DISALLOW_COPY_AND_ASSIGN (PlatformList);
1091     };
1092     
1093     class OptionGroupPlatformRSync : public lldb_private::OptionGroup
1094     {
1095     public:
1096         OptionGroupPlatformRSync ();
1097         
1098         virtual
1099         ~OptionGroupPlatformRSync ();
1100         
1101         virtual lldb_private::Error
1102         SetOptionValue (CommandInterpreter &interpreter,
1103                         uint32_t option_idx,
1104                         const char *option_value);
1105         
1106         void
1107         OptionParsingStarting (CommandInterpreter &interpreter);
1108         
1109         const lldb_private::OptionDefinition*
1110         GetDefinitions ();
1111         
1112         virtual uint32_t
1113         GetNumDefinitions ();
1114         
1115         // Options table: Required for subclasses of Options.
1116         
1117         static lldb_private::OptionDefinition g_option_table[];
1118         
1119         // Instance variables to hold the values for command options.
1120         
1121         bool m_rsync;
1122         std::string m_rsync_opts;
1123         std::string m_rsync_prefix;
1124         bool m_ignores_remote_hostname;
1125     private:
1126         DISALLOW_COPY_AND_ASSIGN(OptionGroupPlatformRSync);
1127     };
1128     
1129     class OptionGroupPlatformSSH : public lldb_private::OptionGroup
1130     {
1131     public:
1132         OptionGroupPlatformSSH ();
1133         
1134         virtual
1135         ~OptionGroupPlatformSSH ();
1136         
1137         virtual lldb_private::Error
1138         SetOptionValue (CommandInterpreter &interpreter,
1139                         uint32_t option_idx,
1140                         const char *option_value);
1141         
1142         void
1143         OptionParsingStarting (CommandInterpreter &interpreter);
1144         
1145         virtual uint32_t
1146         GetNumDefinitions ();
1147         
1148         const lldb_private::OptionDefinition*
1149         GetDefinitions ();
1150         
1151         // Options table: Required for subclasses of Options.
1152         
1153         static lldb_private::OptionDefinition g_option_table[];
1154         
1155         // Instance variables to hold the values for command options.
1156         
1157         bool m_ssh;
1158         std::string m_ssh_opts;
1159
1160     private:
1161
1162         DISALLOW_COPY_AND_ASSIGN(OptionGroupPlatformSSH);
1163     };
1164     
1165     class OptionGroupPlatformCaching : public lldb_private::OptionGroup
1166     {
1167     public:
1168         OptionGroupPlatformCaching ();
1169         
1170         virtual
1171         ~OptionGroupPlatformCaching ();
1172         
1173         virtual lldb_private::Error
1174         SetOptionValue (CommandInterpreter &interpreter,
1175                         uint32_t option_idx,
1176                         const char *option_value);
1177         
1178         void
1179         OptionParsingStarting (CommandInterpreter &interpreter);
1180         
1181         virtual uint32_t
1182         GetNumDefinitions ();
1183         
1184         const lldb_private::OptionDefinition*
1185         GetDefinitions ();
1186         
1187         // Options table: Required for subclasses of Options.
1188         
1189         static lldb_private::OptionDefinition g_option_table[];
1190         
1191         // Instance variables to hold the values for command options.
1192         
1193         std::string m_cache_dir;
1194     private:
1195         DISALLOW_COPY_AND_ASSIGN(OptionGroupPlatformCaching);
1196     };
1197     
1198 } // namespace lldb_private
1199
1200 #endif  // liblldb_Platform_h_