blob: a5af27468f6b9fe63c87e45ee363a0340fa39ccf [file] [log] [blame]
Greg Claytonabe0fed2011-04-18 08:33:37 +00001//===-- OptionGroupPlatform.cpp ---------------------------------*- 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
Daniel Malead891f9b2012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Greg Claytonabe0fed2011-04-18 08:33:37 +000012#include "lldb/Interpreter/OptionGroupPlatform.h"
13
14// C Includes
15// C++ Includes
16// Other libraries and framework includes
17// Project includes
18#include "lldb/Interpreter/CommandInterpreter.h"
19#include "lldb/Target/Platform.h"
Johnny Chen4003f572011-09-10 00:48:33 +000020#include "lldb/Utility/Utils.h"
Greg Claytonabe0fed2011-04-18 08:33:37 +000021
22using namespace lldb;
23using namespace lldb_private;
24
25PlatformSP
Greg Claytonb170aee2012-05-08 01:45:38 +000026OptionGroupPlatform::CreatePlatformWithOptions (CommandInterpreter &interpreter,
27 const ArchSpec &arch,
28 bool make_selected,
29 Error& error,
30 ArchSpec &platform_arch) const
Greg Claytonabe0fed2011-04-18 08:33:37 +000031{
32 PlatformSP platform_sp;
Greg Claytonb1db6582012-03-20 18:34:04 +000033
Greg Claytonabe0fed2011-04-18 08:33:37 +000034 if (!m_platform_name.empty())
35 {
36 platform_sp = Platform::Create (m_platform_name.c_str(), error);
Greg Claytonb170aee2012-05-08 01:45:38 +000037 if (platform_sp)
38 {
Greg Clayton1a7f6302012-05-11 18:37:58 +000039 if (platform_arch.IsValid() && !platform_sp->IsCompatibleArchitecture(arch, &platform_arch))
Greg Claytonb170aee2012-05-08 01:45:38 +000040 {
41 error.SetErrorStringWithFormat("platform '%s' doesn't support '%s'", platform_sp->GetName(), arch.GetTriple().getTriple().c_str());
42 platform_sp.reset();
43 return platform_sp;
44 }
45 }
Greg Claytonabe0fed2011-04-18 08:33:37 +000046 }
Greg Claytonb1db6582012-03-20 18:34:04 +000047 else if (arch.IsValid())
48 {
Greg Claytonb170aee2012-05-08 01:45:38 +000049 platform_sp = Platform::Create (arch, &platform_arch, error);
Greg Claytonb1db6582012-03-20 18:34:04 +000050 }
51
52 if (platform_sp)
53 {
54 interpreter.GetDebugger().GetPlatformList().Append (platform_sp, make_selected);
55 if (m_os_version_major != UINT32_MAX)
56 {
57 platform_sp->SetOSVersion (m_os_version_major,
58 m_os_version_minor,
59 m_os_version_update);
60 }
61
62 if (m_sdk_sysroot)
63 platform_sp->SetSDKRootDirectory (m_sdk_sysroot);
64
65 if (m_sdk_build)
66 platform_sp->SetSDKBuild (m_sdk_build);
67 }
68
Greg Claytonabe0fed2011-04-18 08:33:37 +000069 return platform_sp;
70}
71
72void
73OptionGroupPlatform::OptionParsingStarting (CommandInterpreter &interpreter)
74{
75 m_platform_name.clear();
Greg Clayton604f0d32011-06-17 03:31:01 +000076 m_sdk_sysroot.Clear();
77 m_sdk_build.Clear();
Greg Claytonabe0fed2011-04-18 08:33:37 +000078 m_os_version_major = UINT32_MAX;
79 m_os_version_minor = UINT32_MAX;
80 m_os_version_update = UINT32_MAX;
81}
82
83static OptionDefinition
84g_option_table[] =
85{
Greg Clayton604f0d32011-06-17 03:31:01 +000086 { LLDB_OPT_SET_ALL, false, "platform", 'p', required_argument, NULL, 0, eArgTypePlatform, "Specify name of the platform to use for this target, creating the platform if necessary."},
87 { LLDB_OPT_SET_ALL, false, "version" , 'v', required_argument, NULL, 0, eArgTypeNone, "Specify the initial SDK version to use prior to connecting." },
88 { LLDB_OPT_SET_ALL, false, "build" , 'b', required_argument, NULL, 0, eArgTypeNone, "Specify the initial SDK build number." },
Greg Claytonec9c2d22012-11-30 19:05:35 +000089 { LLDB_OPT_SET_ALL, false, "sysroot" , 'S', required_argument, NULL, 0, eArgTypeFilename, "Specify the SDK root directory that contains a root of all remote system files." }
Greg Claytonabe0fed2011-04-18 08:33:37 +000090};
91
Greg Claytonabe0fed2011-04-18 08:33:37 +000092const OptionDefinition*
93OptionGroupPlatform::GetDefinitions ()
94{
95 if (m_include_platform_option)
96 return g_option_table;
97 return g_option_table + 1;
98}
99
100uint32_t
101OptionGroupPlatform::GetNumDefinitions ()
102{
103 if (m_include_platform_option)
Johnny Chen08af5982012-05-15 23:21:36 +0000104 return llvm::array_lengthof(g_option_table);
105 return llvm::array_lengthof(g_option_table) - 1;
Greg Claytonabe0fed2011-04-18 08:33:37 +0000106}
107
108
109Error
110OptionGroupPlatform::SetOptionValue (CommandInterpreter &interpreter,
111 uint32_t option_idx,
112 const char *option_arg)
113{
114 Error error;
115 if (!m_include_platform_option)
Greg Claytone1f50b92011-05-03 22:09:39 +0000116 ++option_idx;
Greg Claytonabe0fed2011-04-18 08:33:37 +0000117
Greg Clayton6475c422012-12-04 00:32:51 +0000118 const int short_option = g_option_table[option_idx].short_option;
Greg Claytonabe0fed2011-04-18 08:33:37 +0000119
120 switch (short_option)
121 {
122 case 'p':
123 m_platform_name.assign (option_arg);
124 break;
125
126 case 'v':
127 if (Args::StringToVersion (option_arg,
128 m_os_version_major,
129 m_os_version_minor,
130 m_os_version_update) == option_arg)
131 error.SetErrorStringWithFormat ("invalid version string '%s'", option_arg);
132 break;
133
Greg Clayton604f0d32011-06-17 03:31:01 +0000134 case 'b':
135 m_sdk_build.SetCString (option_arg);
136 break;
137
138 case 's':
139 m_sdk_sysroot.SetCString (option_arg);
140 break;
141
Greg Claytonabe0fed2011-04-18 08:33:37 +0000142 default:
Greg Clayton9c236732011-10-26 00:56:27 +0000143 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Greg Claytonabe0fed2011-04-18 08:33:37 +0000144 break;
145 }
146 return error;
147}