Home | History | Annotate | Download | only in Interpreter
      1 //===-- 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 
     10 #include "lldb/lldb-python.h"
     11 
     12 #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"
     20 #include "lldb/Utility/Utils.h"
     21 
     22 using namespace lldb;
     23 using namespace lldb_private;
     24 
     25 PlatformSP
     26 OptionGroupPlatform::CreatePlatformWithOptions (CommandInterpreter &interpreter,
     27                                                 const ArchSpec &arch,
     28                                                 bool make_selected,
     29                                                 Error& error,
     30                                                 ArchSpec &platform_arch) const
     31 {
     32     PlatformSP platform_sp;
     33 
     34     if (!m_platform_name.empty())
     35     {
     36         platform_sp = Platform::Create (m_platform_name.c_str(), error);
     37         if (platform_sp)
     38         {
     39             if (platform_arch.IsValid() && !platform_sp->IsCompatibleArchitecture(arch, false, &platform_arch))
     40             {
     41                 error.SetErrorStringWithFormat ("platform '%s' doesn't support '%s'",
     42                                                 platform_sp->GetName().GetCString(),
     43                                                 arch.GetTriple().getTriple().c_str());
     44                 platform_sp.reset();
     45                 return platform_sp;
     46             }
     47         }
     48     }
     49     else if (arch.IsValid())
     50     {
     51         platform_sp = Platform::Create (arch, &platform_arch, error);
     52     }
     53 
     54     if (platform_sp)
     55     {
     56         interpreter.GetDebugger().GetPlatformList().Append (platform_sp, make_selected);
     57         if (m_os_version_major != UINT32_MAX)
     58         {
     59             platform_sp->SetOSVersion (m_os_version_major,
     60                                        m_os_version_minor,
     61                                        m_os_version_update);
     62         }
     63 
     64         if (m_sdk_sysroot)
     65             platform_sp->SetSDKRootDirectory (m_sdk_sysroot);
     66 
     67         if (m_sdk_build)
     68             platform_sp->SetSDKBuild (m_sdk_build);
     69     }
     70 
     71     return platform_sp;
     72 }
     73 
     74 void
     75 OptionGroupPlatform::OptionParsingStarting (CommandInterpreter &interpreter)
     76 {
     77     m_platform_name.clear();
     78     m_sdk_sysroot.Clear();
     79     m_sdk_build.Clear();
     80     m_os_version_major = UINT32_MAX;
     81     m_os_version_minor = UINT32_MAX;
     82     m_os_version_update = UINT32_MAX;
     83 }
     84 
     85 static OptionDefinition
     86 g_option_table[] =
     87 {
     88     { 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."},
     89     { LLDB_OPT_SET_ALL, false, "version" , 'v', required_argument, NULL, 0, eArgTypeNone, "Specify the initial SDK version to use prior to connecting." },
     90     { LLDB_OPT_SET_ALL, false, "build"   , 'b', required_argument, NULL, 0, eArgTypeNone, "Specify the initial SDK build number." },
     91     { 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." }
     92 };
     93 
     94 const OptionDefinition*
     95 OptionGroupPlatform::GetDefinitions ()
     96 {
     97     if (m_include_platform_option)
     98         return g_option_table;
     99     return g_option_table + 1;
    100 }
    101 
    102 uint32_t
    103 OptionGroupPlatform::GetNumDefinitions ()
    104 {
    105     if (m_include_platform_option)
    106         return llvm::array_lengthof(g_option_table);
    107     return llvm::array_lengthof(g_option_table) - 1;
    108 }
    109 
    110 
    111 Error
    112 OptionGroupPlatform::SetOptionValue (CommandInterpreter &interpreter,
    113                                      uint32_t option_idx,
    114                                      const char *option_arg)
    115 {
    116     Error error;
    117     if (!m_include_platform_option)
    118         ++option_idx;
    119 
    120     const int short_option = g_option_table[option_idx].short_option;
    121 
    122     switch (short_option)
    123     {
    124         case 'p':
    125             m_platform_name.assign (option_arg);
    126             break;
    127 
    128         case 'v':
    129             if (Args::StringToVersion (option_arg,
    130                                        m_os_version_major,
    131                                        m_os_version_minor,
    132                                        m_os_version_update) == option_arg)
    133                 error.SetErrorStringWithFormat ("invalid version string '%s'", option_arg);
    134             break;
    135 
    136         case 'b':
    137             m_sdk_build.SetCString (option_arg);
    138             break;
    139 
    140         case 'S':
    141             m_sdk_sysroot.SetCString (option_arg);
    142             break;
    143 
    144         default:
    145             error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
    146             break;
    147     }
    148     return error;
    149 }
    150