diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp
index fa19bf3..de48772 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -63,18 +63,18 @@
 DumpTargetInfo (uint32_t target_idx, Target *target, const char *prefix_cstr, bool show_stopped_process_status, Stream &strm)
 {
     const ArchSpec &target_arch = target->GetArchitecture();
-    
+
     Module *exe_module = target->GetExecutableModulePointer();
     char exe_path[PATH_MAX];
     bool exe_valid = false;
     if (exe_module)
         exe_valid = exe_module->GetFileSpec().GetPath (exe_path, sizeof(exe_path));
-    
+
     if (!exe_valid)
         ::strcpy (exe_path, "<none>");
-    
+
     strm.Printf ("%starget #%u: %s", prefix_cstr ? prefix_cstr : "", target_idx, exe_path);
-    
+
     uint32_t properties = 0;
     if (target_arch.IsValid())
     {
@@ -84,7 +84,7 @@
     PlatformSP platform_sp (target->GetPlatform());
     if (platform_sp)
         strm.Printf ("%splatform=%s", properties++ > 0 ? ", " : " ( ", platform_sp->GetName().GetCString());
-    
+
     ProcessSP process_sp (target->GetProcessSP());
     bool show_process_status = false;
     if (process_sp)
@@ -123,7 +123,7 @@
 {
     const uint32_t num_targets = target_list.GetNumTargets();
     if (num_targets)
-    {        
+    {
         TargetSP selected_target_sp (target_list.GetSelectedTarget());
         strm.PutCString ("Current targets:\n");
         for (uint32_t i=0; i<num_targets; ++i)
@@ -167,17 +167,17 @@
     {
         CommandArgumentEntry arg;
         CommandArgumentData file_arg;
-    
+
         // Define the first (and only) variant of this arg.
             file_arg.arg_type = eArgTypeFilename;
         file_arg.arg_repetition = eArgRepeatPlain;
-        
+
         // There is only one variant this argument could be; put it into the argument entry.
         arg.push_back (file_arg);
-        
+
         // Push the data for the first argument into the m_arguments vector.
         m_arguments.push_back (arg);
-        
+
         m_option_group.Append (&m_arch_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
         m_option_group.Append (&m_platform_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
         m_option_group.Append (&m_core_file, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
@@ -210,7 +210,7 @@
     {
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
         completion_str.erase (cursor_char_position);
-        
+
         CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 
                                                              CommandCompletions::eDiskFileCompletion,
                                                              completion_str.c_str(),
@@ -248,12 +248,12 @@
             const char *file_path = command.GetArgumentAtIndex(0);
             Timer scoped_timer(__PRETTY_FUNCTION__, "(lldb) target create '%s'", file_path);
             FileSpec file_spec;
-            
+
             if (file_path)
                 file_spec.SetFile (file_path, true);
-            
+
             bool must_set_platform_path = false;
-            
+
             Debugger &debugger = m_interpreter.GetDebugger();
             PlatformSP platform_sp(debugger.GetPlatformList().GetSelectedPlatform ());
 
@@ -334,7 +334,7 @@
                         }
                     }
                 }
-                
+
                 debugger.GetTargetList().SetSelectedTarget(target_sp.get());
                 if (must_set_platform_path)
                 {
@@ -352,7 +352,7 @@
                         FileSpec core_file_dir;
                         core_file_dir.GetDirectory() = core_file.GetDirectory();
                         target_sp->GetExecutableSearchPaths ().Append (core_file_dir);
-                        
+
                         ProcessSP process_sp (target_sp->CreateProcess (m_interpreter.GetDebugger().GetListener(), NULL, &core_file));
 
                         if (process_sp)
@@ -360,7 +360,7 @@
                             // Seems wierd that we Launch a core file, but that is
                             // what we do!
                             error = process_sp->LoadCore();
-                            
+
                             if (error.Fail())
                             {
                                 result.AppendError(error.AsCString("can't find plug-in for core file"));
@@ -403,7 +403,6 @@
             result.SetStatus (eReturnStatusFailed);
         }
         return result.Succeeded();
-        
     }
 
 private:
@@ -434,12 +433,12 @@
                              0)
     {
     }
-    
+
     virtual
     ~CommandObjectTargetList ()
     {
     }
-    
+
 protected:
     virtual bool
     DoExecute (Args& args, CommandReturnObject &result)
@@ -447,7 +446,7 @@
         if (args.GetArgumentCount() == 0)
         {
             Stream &strm = result.GetOutputStream();
-            
+
             bool show_stopped_process_status = false;
             if (DumpTargetList (m_interpreter.GetDebugger().GetTargetList(), show_stopped_process_status, strm) == 0)
             {
@@ -482,12 +481,12 @@
                              0)
     {
     }
-    
+
     virtual
     ~CommandObjectTargetSelect ()
     {
     }
-    
+
 protected:
     virtual bool
     DoExecute (Args& args, CommandReturnObject &result)
@@ -562,12 +561,12 @@
         m_option_group.Append (&m_cleanup_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
         m_option_group.Finalize();
     }
-    
+
     virtual
     ~CommandObjectTargetDelete ()
     {
     }
-    
+
     Options *
     GetOptions ()
     {
@@ -600,7 +599,7 @@
                 if (success)
                 {
                     if (target_idx < num_targets)
-                    {     
+                    {
                         target_sp = target_list.GetTargetAtIndex (target_idx);
                         if (target_sp)
                         {
@@ -626,7 +625,6 @@
                     success = false;
                 }
             }
-            
         }
         else
         {
@@ -661,10 +659,10 @@
             result.GetOutputStream().Printf("%u targets deleted.\n", (uint32_t)num_targets_to_delete);
             result.SetStatus(eReturnStatusSuccessFinishResult);
         }
-        
+
         return result.Succeeded();
     }
-    
+
     OptionGroupOptions m_option_group;
     OptionGroupBoolean m_cleanup_option;
 };
@@ -701,17 +699,17 @@
     {
         CommandArgumentEntry arg;
         CommandArgumentData var_name_arg;
-        
+
         // Define the first (and only) variant of this arg.
         var_name_arg.arg_type = eArgTypeVarName;
         var_name_arg.arg_repetition = eArgRepeatPlus;
-        
+
         // There is only one variant this argument could be; put it into the argument entry.
         arg.push_back (var_name_arg);
-        
+
         // Push the data for the first argument into the m_arguments vector.
         m_arguments.push_back (arg);
-        
+
         m_option_group.Append (&m_varobj_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
         m_option_group.Append (&m_option_variable, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
         m_option_group.Append (&m_option_format, OptionGroupFormat::OPTION_GROUP_FORMAT | OptionGroupFormat::OPTION_GROUP_GDB_FMT, LLDB_OPT_SET_1);
@@ -719,7 +717,7 @@
         m_option_group.Append (&m_option_shared_libraries, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);   
         m_option_group.Finalize();
     }
-    
+
     virtual
     ~CommandObjectTargetVariable ()
     {
@@ -729,33 +727,33 @@
     DumpValueObject (Stream &s, VariableSP &var_sp, ValueObjectSP &valobj_sp, const char *root_name)
     {
         DumpValueObjectOptions options(m_varobj_options.GetAsDumpOptions());
-        
+
         switch (var_sp->GetScope())
         {
             case eValueTypeVariableGlobal:
                 if (m_option_variable.show_scope)
                     s.PutCString("GLOBAL: ");
                 break;
-                
+
             case eValueTypeVariableStatic:
                 if (m_option_variable.show_scope)
                     s.PutCString("STATIC: ");
                 break;
-                
+
             case eValueTypeVariableArgument:
                 if (m_option_variable.show_scope)
                     s.PutCString("   ARG: ");
                 break;
-                
+
             case eValueTypeVariableLocal:
                 if (m_option_variable.show_scope)
                     s.PutCString(" LOCAL: ");
                 break;
-                
+
             default:
                 break;
         }
-        
+
         if (m_option_variable.show_decl)
         {
             bool show_fullpaths = false;
@@ -763,17 +761,16 @@
             if (var_sp->DumpDeclaration(&s, show_fullpaths, show_module))
                 s.PutCString (": ");
         }
-        
+
         const Format format = m_option_format.GetFormat();
         if (format != eFormatDefault)
             options.SetFormat(format);
 
         options.SetRootValueObjectName(root_name);
-        
+
         valobj_sp->Dump(s,options);
     }
-    
-    
+
     static size_t GetVariableCallback (void *baton,
                                        const char *name,
                                        VariableList &variable_list)
@@ -788,17 +785,14 @@
         }
         return 0;
     }
-    
-
 
     Options *
     GetOptions ()
     {
         return &m_option_group;
     }
-    
+
 protected:
-    
     void
     DumpGlobalVariableList(const ExecutionContext &exe_ctx, const SymbolContext &sc, const VariableList &variable_list, Stream &s)
     {
@@ -824,14 +818,14 @@
                 s.Printf ("Global variables for %s\n",
                           sc.comp_unit->GetPath().c_str());
             }
-            
+
             for (uint32_t i=0; i<count; ++i)
             {
                 VariableSP var_sp (variable_list.GetVariableAtIndex(i));
                 if (var_sp)
                 {
                     ValueObjectSP valobj_sp (ValueObjectVariable::Create (exe_ctx.GetBestExecutionContextScope(), var_sp));
-                    
+
                     if (valobj_sp)
                         DumpValueObject (s, var_sp, valobj_sp, var_sp->GetName().GetCString());
                 }
@@ -845,7 +839,7 @@
         Target *target = m_exe_ctx.GetTargetPtr();
         const size_t argc = args.GetArgumentCount();
         Stream &s = result.GetOutputStream();
-        
+
         if (argc > 0)
         {
 
@@ -882,7 +876,7 @@
                                                                                valobj_list));
                     matches = variable_list.GetSize();
                 }
-                
+
                 if (matches == 0)
                 {
                     result.GetErrorStream().Printf ("error: can't find global variable '%s'\n", arg);
@@ -899,7 +893,7 @@
                             ValueObjectSP valobj_sp (valobj_list.GetValueObjectAtIndex(global_idx));
                             if (!valobj_sp)
                                 valobj_sp = ValueObjectVariable::Create (m_exe_ctx.GetBestExecutionContextScope(), var_sp);
-                            
+
                             if (valobj_sp)
                                 DumpValueObject (s, var_sp, valobj_sp, use_var_name ? var_sp->GetName().GetCString() : arg);
                         }
@@ -946,7 +940,7 @@
                                                           comp_unit->GetPath().c_str());
                         else
                             result.AppendErrorWithFormat ("no debug information for frame %u\n", frame->GetFrameIndex());
-                    }                        
+                    }
                     else
                         result.AppendError ("'target variable' takes one or more global variable names as arguments\n");
                     result.SetStatus (eReturnStatusFailed);
@@ -963,7 +957,7 @@
                     {
                         const FileSpec module_file(shlibs.GetFileSpecAtIndex(shlib_idx));
                         ModuleSpec module_spec (module_file);
-                        
+
                         ModuleSP module_sp (target->GetImages().FindFirstModule(module_spec));
                         if (module_sp)
                         {
@@ -993,7 +987,7 @@
                     for (size_t cu_idx=0; cu_idx<num_compile_units; ++cu_idx)
                         target->GetImages().FindCompileUnits(compile_units.GetFileSpecAtIndex(cu_idx), append, sc_list);
                 }
-                
+
                 const uint32_t num_scs = sc_list.GetSize();
                 if (num_scs > 0)
                 {
@@ -1029,10 +1023,10 @@
                                             m_cmd_name.c_str());
             m_interpreter.TruncationWarningGiven();
         }
-        
+
         return result.Succeeded();
     }
-    
+
     OptionGroupOptions m_option_group;
     OptionGroupVariable m_option_variable;
     OptionGroupFormat m_option_format;
@@ -1058,15 +1052,15 @@
         CommandArgumentEntry arg;
         CommandArgumentData old_prefix_arg;
         CommandArgumentData new_prefix_arg;
-        
+
         // Define the first variant of this arg pair.
         old_prefix_arg.arg_type = eArgTypeOldPathPrefix;
         old_prefix_arg.arg_repetition = eArgRepeatPairPlus;
-        
+
         // Define the first variant of this arg pair.
         new_prefix_arg.arg_type = eArgTypeNewPathPrefix;
         new_prefix_arg.arg_repetition = eArgRepeatPairPlus;
-        
+
         // There are two required arguments that must always occur together, i.e. an argument "pair".  Because they
         // must always occur together, they are treated as two variants of one argument rather than two independent
         // arguments.  Push them both into the first argument position for m_arguments...
@@ -1101,7 +1095,7 @@
                 {
                     const char *from = command.GetArgumentAtIndex(i);
                     const char *to = command.GetArgumentAtIndex(i+1);
-                    
+
                     if (from[0] && to[0])
                     {
                         bool last_pair = ((argc - i) == 2);
@@ -1186,7 +1180,7 @@
         CommandArgumentData index_arg;
         CommandArgumentData old_prefix_arg;
         CommandArgumentData new_prefix_arg;
-        
+
         // Define the first and only variant of this arg.
         index_arg.arg_type = eArgTypeIndex;
         index_arg.arg_repetition = eArgRepeatPlain;
@@ -1197,11 +1191,11 @@
         // Define the first variant of this arg pair.
         old_prefix_arg.arg_type = eArgTypeOldPathPrefix;
         old_prefix_arg.arg_repetition = eArgRepeatPairPlus;
-        
+
         // Define the first variant of this arg pair.
         new_prefix_arg.arg_type = eArgTypeNewPathPrefix;
         new_prefix_arg.arg_repetition = eArgRepeatPairPlus;
-        
+
         // There are two required arguments that must always occur together, i.e. an argument "pair".  Because they
         // must always occur together, they are treated as two variants of one argument rather than two independent
         // arguments.  Push them both into the same argument position for m_arguments...
@@ -1249,7 +1243,7 @@
                 {
                     const char *from = command.GetArgumentAtIndex(i);
                     const char *to = command.GetArgumentAtIndex(i+1);
-                    
+
                     if (from[0] && to[0])
                     {
                         bool last_pair = ((argc - i) == 2);
@@ -1348,14 +1342,14 @@
     {
         CommandArgumentEntry arg;
         CommandArgumentData path_arg;
-        
+
         // Define the first (and only) variant of this arg.
         path_arg.arg_type = eArgTypeDirectoryName;
         path_arg.arg_repetition = eArgRepeatPlain;
-        
+
         // There is only one variant this argument could be; put it into the argument entry.
         arg.push_back (path_arg);
-        
+
         // Push the data for the first argument into the m_arguments vector.
         m_arguments.push_back (arg);
     }
@@ -1442,7 +1436,7 @@
                                                                 false,
                                                                 eSymbolContextCompUnit,
                                                                 sc_list);
-        
+
         for (uint32_t i=0; i<num_matches; ++i)
         {
             SymbolContext sc;
@@ -1450,7 +1444,7 @@
             {
                 if (i > 0)
                     strm << "\n\n";
-                
+
                 strm << "Line table for " << *static_cast<FileSpec*> (sc.comp_unit) << " in `"
                 << module->GetFileSpec().GetFilename() << "\n";
                 LineTable *line_table = sc.comp_unit->GetLineTable();
@@ -1619,7 +1613,7 @@
             if (!module->ResolveFileAddress (addr, so_addr))
                 return false;
         }
-        
+
         ExecutionContextScope *exe_scope = interpreter.GetExecutionContext().GetBestExecutionContextScope();
         DumpAddress (exe_scope, so_addr, verbose, strm);
 //        strm.IndentMore();
@@ -1642,7 +1636,7 @@
 //        strm.IndentLess();
         return true;
     }
-    
+
     return false;
 }
 
@@ -1652,7 +1646,7 @@
     if (module)
     {
         SymbolContext sc;
-        
+
         SymbolVendor *sym_vendor = module->GetSymbolVendor ();
         if (sym_vendor)
         {
@@ -1674,8 +1668,7 @@
                 {
                     num_matches = symtab->AppendSymbolIndexesWithName (symbol_name, match_indexes);
                 }
-                
-                
+
                 if (num_matches > 0)
                 {
                     strm.Indent ();
@@ -1712,19 +1705,19 @@
     strm.IndentMore ();
     uint32_t i;
     const uint32_t num_matches = sc_list.GetSize();
-    
+
     for (i=0; i<num_matches; ++i)
     {
         SymbolContext sc;
         if (sc_list.GetContextAtIndex(i, sc))
         {
             AddressRange range;
-            
+
             sc.GetAddressRange(eSymbolContextEverything, 
                                0, 
                                true, 
                                range);
-            
+
             DumpAddress (exe_scope, range.GetBaseAddress(), verbose, strm);
         }
     }
@@ -1766,7 +1759,7 @@
                                                  append, 
                                                  sc_list);
         }
-        
+
         if (num_matches)
         {
             strm.Indent ();
@@ -1797,7 +1790,7 @@
 
         ConstString name(name_cstr);
         num_matches = module->FindTypes(sc, name, name_is_fully_qualified, max_num_matches, type_list);
-            
+
         if (num_matches)
         {
             strm.Indent ();
@@ -1842,22 +1835,22 @@
 {
     if (!sym_ctx.module_sp)
         return 0;
-    
+
     TypeList type_list;
     const uint32_t max_num_matches = UINT32_MAX;
     size_t num_matches = 1;
     bool name_is_fully_qualified = false;
-    
+
     ConstString name(name_cstr);
     num_matches = sym_ctx.module_sp->FindTypes(sym_ctx, name, name_is_fully_qualified, max_num_matches, type_list);
-    
+
     if (num_matches)
     {
         strm.Indent ();
         strm.PutCString("Best match found in ");
         DumpFullpath (strm, &sym_ctx.module_sp->GetFileSpec(), 0);
         strm.PutCString(":\n");
-        
+
         TypeSP type_sp (type_list.GetTypeAtIndex(0));
         if (type_sp)
         {
@@ -1912,7 +1905,6 @@
         }
     }
     return 0;
-    
 }
 
 
@@ -1925,7 +1917,7 @@
 // Dump specified images (by basename or fullpath)
     FileSpec module_file_spec(module_name, false);
     ModuleSpec module_spec (module_file_spec);
-    
+
     const size_t initial_size = module_list.GetSize ();
 
     if (check_global_list)
@@ -1937,7 +1929,7 @@
         for (size_t image_idx = 0; image_idx<num_modules; ++image_idx)
         {
             Module *module = Module::GetAllocatedModuleAtIndex(image_idx);
-            
+
             if (module)
             {
                 if (module->MatchesModuleSpec (module_spec))
@@ -1953,7 +1945,7 @@
         if (target)
         {
             const size_t num_matches = target->GetImages().FindModules (module_spec, module_list);
-        
+
             // Not found in our module list for our target, check the main
             // shared module list in case it is a extra file used somewhere
             // else
@@ -1968,7 +1960,7 @@
             ModuleList::FindSharedModules (module_spec,module_list);
         }
     }
-    
+
     return module_list.GetSize () - initial_size;
 }
 
@@ -1982,7 +1974,6 @@
 class CommandObjectTargetModulesModuleAutoComplete : public CommandObjectParsed
 {
 public:
-    
     CommandObjectTargetModulesModuleAutoComplete (CommandInterpreter &interpreter,
                                       const char *name,
                                       const char *help,
@@ -1991,23 +1982,23 @@
     {
         CommandArgumentEntry arg;
         CommandArgumentData file_arg;
-        
+
         // Define the first (and only) variant of this arg.
         file_arg.arg_type = eArgTypeFilename;
         file_arg.arg_repetition = eArgRepeatStar;
-        
+
         // There is only one variant this argument could be; put it into the argument entry.
         arg.push_back (file_arg);
-        
+
         // Push the data for the first argument into the m_arguments vector.
         m_arguments.push_back (arg);
     }
-    
+
     virtual
     ~CommandObjectTargetModulesModuleAutoComplete ()
     {
     }
-    
+
     virtual int
     HandleArgumentCompletion (Args &input,
                               int &cursor_index,
@@ -2021,7 +2012,7 @@
         // Arguments are the standard module completer.
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
         completion_str.erase (cursor_char_position);
-        
+
         CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
                                                              CommandCompletions::eModuleCompletion,
                                                              completion_str.c_str(),
@@ -2044,7 +2035,6 @@
 class CommandObjectTargetModulesSourceFileAutoComplete : public CommandObjectParsed
 {
 public:
-    
     CommandObjectTargetModulesSourceFileAutoComplete (CommandInterpreter &interpreter,
                                                       const char *name,
                                                       const char *help,
@@ -2054,23 +2044,23 @@
     {
         CommandArgumentEntry arg;
         CommandArgumentData source_file_arg;
-        
+
         // Define the first (and only) variant of this arg.
         source_file_arg.arg_type = eArgTypeSourceFile;
         source_file_arg.arg_repetition = eArgRepeatPlus;
-        
+
         // There is only one variant this argument could be; put it into the argument entry.
         arg.push_back (source_file_arg);
-        
+
         // Push the data for the first argument into the m_arguments vector.
         m_arguments.push_back (arg);
     }
-    
+
     virtual
     ~CommandObjectTargetModulesSourceFileAutoComplete ()
     {
     }
-    
+
     virtual int
     HandleArgumentCompletion (Args &input,
                               int &cursor_index,
@@ -2084,7 +2074,7 @@
         // Arguments are the standard source file completer.
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
         completion_str.erase (cursor_char_position);
-        
+
         CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 
                                                              CommandCompletions::eSourceFileCompletion,
                                                              completion_str.c_str(),
@@ -2112,39 +2102,38 @@
     m_options (interpreter)
     {
     }
-    
+
     virtual
     ~CommandObjectTargetModulesDumpSymtab ()
     {
     }
-    
+
     virtual Options *
     GetOptions ()
     {
         return &m_options;
     }
-    
+
     class CommandOptions : public Options
     {
     public:
-        
         CommandOptions (CommandInterpreter &interpreter) :
         Options(interpreter),
         m_sort_order (eSortOrderNone)
         {
         }
-        
+
         virtual
         ~CommandOptions ()
         {
         }
-        
+
         virtual Error
         SetOptionValue (uint32_t option_idx, const char *option_arg)
         {
             Error error;
             const int short_option = m_getopt_table[option_idx].val;
-            
+
             switch (short_option)
             {
                 case 's':
@@ -2153,33 +2142,33 @@
                                                                          eSortOrderNone,
                                                                          error);
                     break;
-                    
+
                 default:
                     error.SetErrorStringWithFormat("invalid short option character '%c'", short_option);
                     break;
-                    
+
             }
             return error;
         }
-        
+
         void
         OptionParsingStarting ()
         {
             m_sort_order = eSortOrderNone;
         }
-        
+
         const OptionDefinition*
         GetDefinitions ()
         {
             return g_option_table;
         }
-        
+
         // Options table: Required for subclasses of Options.
         static OptionDefinition g_option_table[];
-        
+
         SortOrder m_sort_order;
     };
-    
+
 protected:
     virtual bool
     DoExecute (Args& command,
@@ -2195,11 +2184,11 @@
         else
         {
             uint32_t num_dumped = 0;
-            
+
             uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
             result.GetOutputStream().SetAddressByteSize(addr_byte_size);
             result.GetErrorStream().SetAddressByteSize(addr_byte_size);
-            
+
             if (command.GetArgumentCount() == 0)
             {
                 // Dump all sections for all modules images
@@ -2258,7 +2247,7 @@
                         result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr);
                 }
             }
-            
+
             if (num_dumped > 0)
                 result.SetStatus (eReturnStatusSuccessFinishResult);
             else
@@ -2269,8 +2258,7 @@
         }
         return result.Succeeded();
     }
-    
-    
+
     CommandOptions m_options;
 };
 
@@ -2308,12 +2296,12 @@
                                       NULL)
     {
     }
-    
+
     virtual
     ~CommandObjectTargetModulesDumpSections ()
     {
     }
-    
+
 protected:
     virtual bool
     DoExecute (Args& command,
@@ -2329,11 +2317,11 @@
         else
         {
             uint32_t num_dumped = 0;
-            
+
             uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
             result.GetOutputStream().SetAddressByteSize(addr_byte_size);
             result.GetErrorStream().SetAddressByteSize(addr_byte_size);
-            
+
             if (command.GetArgumentCount() == 0)
             {
                 // Dump all sections for all modules images
@@ -2383,7 +2371,7 @@
                     }
                 }
             }
-            
+
             if (num_dumped > 0)
                 result.SetStatus (eReturnStatusSuccessFinishResult);
             else
@@ -2414,12 +2402,12 @@
                                       NULL)
     {
     }
-    
+
     virtual
     ~CommandObjectTargetModulesDumpSymfile ()
     {
     }
-    
+
 protected:
     virtual bool
     DoExecute (Args& command,
@@ -2435,11 +2423,11 @@
         else
         {
             uint32_t num_dumped = 0;
-            
+
             uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
             result.GetOutputStream().SetAddressByteSize(addr_byte_size);
             result.GetErrorStream().SetAddressByteSize(addr_byte_size);
-            
+
             if (command.GetArgumentCount() == 0)
             {
                 // Dump all sections for all modules images
@@ -2486,7 +2474,7 @@
                         result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr);
                 }
             }
-            
+
             if (num_dumped > 0)
                 result.SetStatus (eReturnStatusSuccessFinishResult);
             else
@@ -2517,12 +2505,12 @@
                                                       eFlagRequiresTarget)
     {
     }
-    
+
     virtual
     ~CommandObjectTargetModulesDumpLineTable ()
     {
     }
-    
+
 protected:
     virtual bool
     DoExecute (Args& command,
@@ -2530,11 +2518,11 @@
     {
         Target *target = m_exe_ctx.GetTargetPtr();
         uint32_t total_num_dumped = 0;
-        
+
         uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
         result.GetOutputStream().SetAddressByteSize(addr_byte_size);
         result.GetErrorStream().SetAddressByteSize(addr_byte_size);
-        
+
         if (command.GetArgumentCount() == 0)
         {
             result.AppendErrorWithFormat ("\nSyntax: %s\n", m_cmd_syntax.c_str());
@@ -2547,7 +2535,7 @@
             for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != NULL; ++arg_idx)
             {
                 FileSpec file_spec(arg_cstr, false);
-                
+
                 const ModuleList &target_modules = target->GetImages();
                 Mutex::Locker modules_locker(target_modules.GetMutex());
                 const size_t num_modules = target_modules.GetSize();
@@ -2570,7 +2558,7 @@
                 }
             }
         }
-        
+
         if (total_num_dumped > 0)
             result.SetStatus (eReturnStatusSuccessFinishResult);
         else
@@ -2592,7 +2580,6 @@
 class CommandObjectTargetModulesDump : public CommandObjectMultiword
 {
 public:
-    
     //------------------------------------------------------------------
     // Constructors and Destructors
     //------------------------------------------------------------------
@@ -2607,7 +2594,7 @@
         LoadSubCommand ("symfile",     CommandObjectSP (new CommandObjectTargetModulesDumpSymfile (interpreter)));
         LoadSubCommand ("line-table",  CommandObjectSP (new CommandObjectTargetModulesDumpLineTable (interpreter)));
     }
-    
+
     virtual
     ~CommandObjectTargetModulesDump()
     {
@@ -2629,18 +2616,18 @@
         m_option_group.Append (&m_symbol_file, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
         m_option_group.Finalize();
     }
-    
+
     virtual
     ~CommandObjectTargetModulesAdd ()
     {
     }
-        
+
     virtual Options *
     GetOptions ()
     {
         return &m_option_group;
     }
-    
+
     virtual int
     HandleArgumentCompletion (Args &input,
                               int &cursor_index,
@@ -2653,7 +2640,7 @@
     {
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
         completion_str.erase (cursor_char_position);
-        
+
         CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 
                                                              CommandCompletions::eDiskFileCompletion,
                                                              completion_str.c_str(),
@@ -2666,11 +2653,9 @@
     }
 
 protected:
-    
     OptionGroupOptions m_option_group;
     OptionGroupUUID m_uuid_option_group;
     OptionGroupFile m_symbol_file;
-    
 
     virtual bool
     DoExecute (Args& args,
@@ -2686,7 +2671,7 @@
         else
         {
             bool flush = false;
-            
+
             const size_t argc = args.GetArgumentCount();
             if (argc == 0)
             {
@@ -2803,7 +2788,7 @@
                     }
                 }
             }
-            
+
             if (flush)
             {
                 ProcessSP process = target->GetProcessSP();
@@ -2811,7 +2796,7 @@
                     process->Flush();
             }
         }
-        
+
         return result.Succeeded();
     }
 
@@ -2834,18 +2819,18 @@
         m_option_group.Append (&m_slide_option, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); 
         m_option_group.Finalize();
     }
-    
+
     virtual
     ~CommandObjectTargetModulesLoad ()
     {
     }
-    
+
     virtual Options *
     GetOptions ()
     {
         return &m_option_group;
     }
-    
+
 protected:
     virtual bool
     DoExecute (Args& args,
@@ -2868,7 +2853,7 @@
                 search_using_module_spec = true;
                 module_spec.GetFileSpec() = m_file_option.GetOptionValue().GetCurrentValue();
             }
-            
+
             if (m_uuid_option_group.GetOptionValue().OptionWasSet())
             {
                 search_using_module_spec = true;
@@ -2877,7 +2862,6 @@
 
             if (search_using_module_spec)
             {
-                
                 ModuleList matching_modules;
                 const size_t num_matches = target->GetImages().FindModules (module_spec, matching_modules);
 
@@ -2970,7 +2954,7 @@
                                         }
                                     }
                                 }
-                                
+
                                 if (changed)
                                 {
                                     target->ModulesDidLoad (matching_modules);
@@ -3009,7 +2993,7 @@
                 else
                 {
                     std::string uuid_str;
-                    
+
                     if (module_spec.GetFileSpec())
                         module_spec.GetFileSpec().GetPath (path, sizeof(path));
                     else
@@ -3049,8 +3033,8 @@
             }
         }
         return result.Succeeded();
-    }    
-    
+    }
+
     OptionGroupOptions m_option_group;
     OptionGroupUUID m_uuid_option_group;
     OptionGroupFile m_file_option;
@@ -3063,11 +3047,9 @@
 class CommandObjectTargetModulesList : public CommandObjectParsed
 {
 public:
-    
     class CommandOptions : public Options
     {
     public:
-        
         CommandOptions (CommandInterpreter &interpreter) :
             Options(interpreter),
             m_format_array(),
@@ -3075,12 +3057,12 @@
             m_module_addr (LLDB_INVALID_ADDRESS)
         {
         }
-        
+
         virtual
         ~CommandOptions ()
         {
         }
-        
+
         virtual Error
         SetOptionValue (uint32_t option_idx, const char *option_arg)
         {
@@ -3105,7 +3087,7 @@
             }
             return error;
         }
-        
+
         void
         OptionParsingStarting ()
         {
@@ -3113,24 +3095,24 @@
             m_use_global_module_list = false;
             m_module_addr = LLDB_INVALID_ADDRESS;
         }
-        
+
         const OptionDefinition*
         GetDefinitions ()
         {
             return g_option_table;
         }
-        
+
         // Options table: Required for subclasses of Options.
-        
+
         static OptionDefinition g_option_table[];
-        
+
         // Instance variables to hold the values for command options.
         typedef std::vector< std::pair<char, uint32_t> > FormatWidthCollection;
         FormatWidthCollection m_format_array;
         bool m_use_global_module_list;
         lldb::addr_t m_module_addr;
     };
-    
+
     CommandObjectTargetModulesList (CommandInterpreter &interpreter) :
         CommandObjectParsed (interpreter,
                              "target modules list",
@@ -3139,19 +3121,19 @@
         m_options (interpreter)
     {
     }
-    
+
     virtual
     ~CommandObjectTargetModulesList ()
     {
     }
-    
+
     virtual
     Options *
     GetOptions ()
     {
         return &m_options;
     }
-    
+
 protected:
     virtual bool
     DoExecute (Args& command,
@@ -3179,7 +3161,7 @@
             }
             // Dump all sections for all modules images
             Stream &strm = result.GetOutputStream();
-            
+
             if (m_options.m_module_addr != LLDB_INVALID_ADDRESS)
             {
                 if (target)
@@ -3212,7 +3194,7 @@
                 }
                 return result.Succeeded();
             }
-            
+
             size_t num_modules = 0;
             Mutex::Locker locker;      // This locker will be locked on the mutex in module_list_ptr if it is non-NULL.
                                        // Otherwise it will lock the AllocationModuleCollectionMutex when accessing
@@ -3248,10 +3230,10 @@
                         }
                     }
                 }
-                
+
                 module_list_ptr = &module_list;
             }
-            
+
             if (module_list_ptr != NULL)
             {
                 locker.Lock(module_list_ptr->GetMutex());
@@ -3259,7 +3241,7 @@
             }
 
             if (num_modules > 0)
-            {                
+            {
                 for (uint32_t image_idx = 0; image_idx<num_modules; ++image_idx)
                 {
                     ModuleSP module_sp;
@@ -3274,7 +3256,7 @@
                         module = Module::GetAllocatedModuleAtIndex(image_idx);
                         module_sp = module->shared_from_this();
                     }
-                    
+
                     const size_t indent = strm.Printf("[%3u] ", image_idx);
                     PrintModule (target, module, indent, strm);
 
@@ -3313,7 +3295,7 @@
             strm.PutCString("Null module");
             return;
         }
-        
+
         bool dump_object_name = false;
         if (m_options.m_format_array.empty())
         {
@@ -3336,25 +3318,25 @@
                 case 'A':
                     DumpModuleArchitecture (strm, module, false, width);
                     break;
-                    
+
                 case 't':
                     DumpModuleArchitecture (strm, module, true, width);
                     break;
-                    
+
                 case 'f':
                     DumpFullpath (strm, &module->GetFileSpec(), width);
                     dump_object_name = true;
                     break;
-                    
+
                 case 'd':
                     DumpDirectory (strm, &module->GetFileSpec(), width);
                     break;
-                    
+
                 case 'b':
                     DumpBasename (strm, &module->GetFileSpec(), width);
                     dump_object_name = true;
                     break;
-                
+
                 case 'h':
                 case 'o':
                     // Image header address
@@ -3442,23 +3424,23 @@
                         strm.Printf("%.*s", width, "<NONE>");
                     }
                     break;
-                    
+
                 case 'm':
                     module->GetModificationTime().Dump(&strm, width);
                     break;
 
                 case 'p':
-                    strm.Printf("%p", module);
+                    strm.Printf("%p", static_cast<void*>(module));
                     break;
 
                 case 'u':
                     DumpModuleUUID(strm, module);
                     break;
-                    
+
                 default:
                     break;
             }
-            
+
         }
         if (dump_object_name)
         {
@@ -3468,7 +3450,7 @@
         }
         strm.EOL();
     }
-        
+
     CommandOptions m_options;
 };
 
@@ -3589,7 +3571,7 @@
         std::string     m_str;          // Holds name lookup
         lldb::addr_t    m_addr;         // Holds the address to lookup
     };
-    
+
     CommandObjectTargetModulesShowUnwind (CommandInterpreter &interpreter) :
         CommandObjectParsed (interpreter,
                              "target modules show-unwind",
@@ -3602,12 +3584,12 @@
         m_options (interpreter)
     {
     }
-    
+
     virtual
     ~CommandObjectTargetModulesShowUnwind ()
     {
     }
-    
+
     virtual
     Options *
     GetOptions ()
@@ -3650,7 +3632,7 @@
         }
 
         SymbolContextList sc_list;
-        
+
         if (m_options.m_type == eLookupTypeFunctionOrSymbol)
         {
             ConstString function_name (m_options.m_str.c_str());
@@ -3771,7 +3753,6 @@
 class CommandObjectTargetModulesLookup : public CommandObjectParsed
 {
 public:
-    
     enum
     {
         eLookupTypeInvalid = -1,
@@ -3783,29 +3764,28 @@
         eLookupTypeType,
         kNumLookupTypes
     };
-    
+
     class CommandOptions : public Options
     {
     public:
-        
         CommandOptions (CommandInterpreter &interpreter) :
         Options(interpreter)
         {
             OptionParsingStarting();
         }
-        
+
         virtual
         ~CommandOptions ()
         {
         }
-        
+
         virtual Error
         SetOptionValue (uint32_t option_idx, const char *option_arg)
         {
             Error error;
-            
+
             const int short_option = m_getopt_table[option_idx].val;
-            
+
             switch (short_option)
             {
                 case 'a':
@@ -3815,27 +3795,27 @@
                         m_addr = Args::StringToAddress(&exe_ctx, option_arg, LLDB_INVALID_ADDRESS, &error);
                     }
                     break;
-                    
+
                 case 'o':
                     m_offset = Args::StringToUInt64(option_arg, LLDB_INVALID_ADDRESS);
                     if (m_offset == LLDB_INVALID_ADDRESS)
                         error.SetErrorStringWithFormat ("invalid offset string '%s'", option_arg);
                     break;
-                    
+
                 case 's':
                     m_str = option_arg;
                     m_type = eLookupTypeSymbol;
                     break;
-                    
+
                 case 'f':
                     m_file.SetFile (option_arg, false);
                     m_type = eLookupTypeFileLine;
                     break;
-                    
+
                 case 'i':
                     m_include_inlines = false;
                     break;
-                    
+
                 case 'l':
                     m_line_number = Args::StringToUInt32(option_arg, UINT32_MAX);
                     if (m_line_number == UINT32_MAX)
@@ -3844,12 +3824,12 @@
                         error.SetErrorString ("zero is an invalid line number");
                     m_type = eLookupTypeFileLine;
                     break;
-                    
+
                 case 'F':
                     m_str = option_arg;
                     m_type = eLookupTypeFunction;
                     break;
-                
+
                 case 'n':
                     m_str = option_arg;
                     m_type = eLookupTypeFunctionOrSymbol;
@@ -3859,23 +3839,23 @@
                     m_str = option_arg;
                     m_type = eLookupTypeType;
                     break;
-                    
+
                 case 'v':
                     m_verbose = 1;
                     break;
-                
+
                 case 'A':
                     m_print_all = true;
                     break;
-                    
+
                 case 'r':
                     m_use_regex = true;
                     break;
             }
-            
+
             return error;
         }
-        
+
         void
         OptionParsingStarting ()
         {
@@ -3890,15 +3870,15 @@
             m_verbose = false;
             m_print_all = false;
         }
-        
+
         const OptionDefinition*
         GetDefinitions ()
         {
             return g_option_table;
         }
-        
+
         // Options table: Required for subclasses of Options.
-        
+
         static OptionDefinition g_option_table[];
         int             m_type;         // Should be a eLookupTypeXXX enum after parsing options
         std::string     m_str;          // Holds name lookup
@@ -3910,9 +3890,8 @@
         bool            m_include_inlines;// Check for inline entries when looking up by file/line.
         bool            m_verbose;      // Enable verbose lookup info
         bool            m_print_all;    // Print all matches, even in cases where there's a best match.
-        
     };
-    
+
     CommandObjectTargetModulesLookup (CommandInterpreter &interpreter) :
         CommandObjectParsed (interpreter,
                              "target modules lookup",
@@ -3923,29 +3902,29 @@
     {
         CommandArgumentEntry arg;
         CommandArgumentData file_arg;
-        
+
         // Define the first (and only) variant of this arg.
         file_arg.arg_type = eArgTypeFilename;
         file_arg.arg_repetition = eArgRepeatStar;
-        
+
         // There is only one variant this argument could be; put it into the argument entry.
         arg.push_back (file_arg);
-        
+
         // Push the data for the first argument into the m_arguments vector.
         m_arguments.push_back (arg);
     }
-    
+
     virtual
     ~CommandObjectTargetModulesLookup ()
     {
     }
-    
+
     virtual Options *
     GetOptions ()
     {
         return &m_options;
     }
-    
+
     bool
     LookupHere (CommandInterpreter &interpreter, CommandReturnObject &result, bool &syntax_error)
     {
@@ -3961,17 +3940,17 @@
             case eLookupTypeType:
                 break;
         }
-        
+
         StackFrameSP frame = m_exe_ctx.GetFrameSP();
-        
+
         if (!frame)
             return false;
-        
+
         const SymbolContext &sym_ctx(frame->GetSymbolContext(eSymbolContextModule));
-        
+
         if (!sym_ctx.module_sp)
             return false;
-             
+
         switch (m_options.m_type)
         {
         default:
@@ -3991,10 +3970,10 @@
             }
             break;
         }
-        
+
         return true;
     }
-    
+
     bool
     LookupInModule (CommandInterpreter &interpreter, Module *module, CommandReturnObject &result, bool &syntax_error)
     {
@@ -4016,7 +3995,7 @@
                     }
                 }
                 break;
-                
+
             case eLookupTypeSymbol:
                 if (!m_options.m_str.empty())
                 {
@@ -4032,11 +4011,10 @@
                     }
                 }
                 break;
-                
+
             case eLookupTypeFileLine:
                 if (m_options.m_file)
                 {
-                    
                     if (LookupFileAndLineInModule (m_interpreter,
                                                    result.GetOutputStream(),
                                                    module,
@@ -4069,8 +4047,7 @@
                     }
                 }
                 break;
-                
-                
+
             case eLookupTypeType:
                 if (!m_options.m_str.empty())
                 {
@@ -4085,17 +4062,17 @@
                     }
                 }
                 break;
-                
+
             default:
                 m_options.GenerateOptionUsage (result.GetErrorStream(), this);
                 syntax_error = true;
                 break;
         }
-        
+
         result.SetStatus (eReturnStatusFailed);
         return false;
     }
-    
+
 protected:
     virtual bool
     DoExecute (Args& command,
@@ -4117,11 +4094,11 @@
             result.GetOutputStream().SetAddressByteSize(addr_byte_size);
             result.GetErrorStream().SetAddressByteSize(addr_byte_size);
             // Dump all sections for all modules images
-            
+
             if (command.GetArgumentCount() == 0)
             {
                 ModuleSP current_module;
-                
+
                 // Where it is possible to look in the current symbol context
                 // first, try that.  If this search was successful and --all
                 // was not passed, don't print anything else.
@@ -4135,9 +4112,9 @@
                         return result.Succeeded();
                     }
                 }
-                
+
                 // Dump all sections for all other modules
-                
+
                 const ModuleList &target_modules = target->GetImages();
                 Mutex::Locker modules_locker(target_modules.GetMutex());
                 const size_t num_modules = target_modules.GetSize();
@@ -4146,7 +4123,7 @@
                     for (i = 0; i<num_modules && syntax_error == false; ++i)
                     {
                         Module *module_pointer = target_modules.GetModulePointerAtIndexUnlocked(i);
-                        
+
                         if (module_pointer != current_module.get() &&
                             LookupInModule (m_interpreter, target_modules.GetModulePointerAtIndexUnlocked(i), result, syntax_error))
                         {
@@ -4189,7 +4166,7 @@
                         result.AppendWarningWithFormat("Unable to find an image that matches '%s'.\n", arg_cstr);
                 }
             }
-            
+
             if (num_successful_lookups > 0)
                 result.SetStatus (eReturnStatusSuccessFinishResult);
             else
@@ -4197,7 +4174,7 @@
         }
         return result.Succeeded();
     }
-    
+
     CommandOptions m_options;
 };
 
@@ -4232,7 +4209,6 @@
 class CommandObjectTargetModulesImageSearchPaths : public CommandObjectMultiword
 {
 public:
-    
     CommandObjectTargetModulesImageSearchPaths (CommandInterpreter &interpreter) :
     CommandObjectMultiword (interpreter, 
                             "target modules search-paths",
@@ -4245,7 +4221,7 @@
         LoadSubCommand ("list",    CommandObjectSP (new CommandObjectTargetModulesSearchPathsList (interpreter)));
         LoadSubCommand ("query",   CommandObjectSP (new CommandObjectTargetModulesSearchPathsQuery (interpreter)));
     }
-    
+
     ~CommandObjectTargetModulesImageSearchPaths()
     {
     }
@@ -4284,7 +4260,7 @@
     ~CommandObjectTargetModules()
     {
     }
-    
+
 private:
     //------------------------------------------------------------------
     // For CommandObjectTargetModules only
@@ -4312,12 +4288,12 @@
         m_option_group.Append (&m_current_frame_option, LLDB_OPT_SET_2, LLDB_OPT_SET_2);
         m_option_group.Finalize();
     }
-    
+
     virtual
     ~CommandObjectTargetSymbolsAdd ()
     {
     }
-    
+
     virtual int
     HandleArgumentCompletion (Args &input,
                               int &cursor_index,
@@ -4330,7 +4306,7 @@
     {
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
         completion_str.erase (cursor_char_position);
-        
+
         CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 
                                                              CommandCompletions::eDiskFileCompletion,
                                                              completion_str.c_str(),
@@ -4341,16 +4317,14 @@
                                                              matches);
         return matches.GetSize();
     }
-    
+
     virtual Options *
     GetOptions ()
     {
         return &m_option_group;
     }
-    
 
 protected:
-    
     bool
     AddModuleSymbols (Target *target,
                       ModuleSpec &module_spec,
@@ -4362,7 +4336,7 @@
         {
             char symfile_path[PATH_MAX];
             symbol_fspec.GetPath (symfile_path, sizeof(symfile_path));
-            
+
             if (!module_spec.GetUUID().IsValid())
             {
                 if (!module_spec.GetFileSpec() && !module_spec.GetPlatformFileSpec())
@@ -4373,7 +4347,7 @@
             // current target, so we need to find that module in the
             // target
             ModuleList matching_module_list;
-            
+
             size_t num_matches = 0;
             // First extract all module specs from the symbol file
             lldb_private::ModuleSpecList symfile_module_specs;
@@ -4394,7 +4368,7 @@
                         num_matches = target->GetImages().FindModules (symfile_uuid_module_spec, matching_module_list);
                     }
                 }
-                
+
                 if (num_matches == 0)
                 {
                     // No matches yet, iterate through the module specs to find a UUID value that
@@ -4410,7 +4384,7 @@
                                 ModuleSpec symfile_uuid_module_spec;
                                 symfile_uuid_module_spec.GetUUID() = symfile_module_spec.GetUUID();
                                 num_matches = target->GetImages().FindModules (symfile_uuid_module_spec, matching_module_list);
-                            }                            
+                            }
                         }
                     }
                 }
@@ -4419,23 +4393,22 @@
             // Just try to match up the file by basename if we have no matches at this point
             if (num_matches == 0)
                 num_matches = target->GetImages().FindModules (module_spec, matching_module_list);
-    
+
             while (num_matches == 0)
             {
                 ConstString filename_no_extension(module_spec.GetFileSpec().GetFileNameStrippingExtension());
                 // Empty string returned, lets bail
                 if (!filename_no_extension)
                     break;
-                
+
                 // Check if there was no extension to strip and the basename is the same
                 if (filename_no_extension == module_spec.GetFileSpec().GetFilename())
                     break;
-                
+
                 // Replace basename with one less extension
                 module_spec.GetFileSpec().GetFilename() = filename_no_extension;
-                
+
                 num_matches = target->GetImages().FindModules (module_spec, matching_module_list);
-                
             }
 
             if (num_matches > 1)
@@ -4445,21 +4418,21 @@
             else if (num_matches == 1)
             {
                 ModuleSP module_sp (matching_module_list.GetModuleAtIndex(0));
-                
+
                 // The module has not yet created its symbol vendor, we can just
                 // give the existing target module the symfile path to use for
                 // when it decides to create it!
                 module_sp->SetSymbolFileFileSpec (symbol_fspec);
-                
+
                 SymbolVendor *symbol_vendor = module_sp->GetSymbolVendor(true, &result.GetErrorStream());
                 if (symbol_vendor)
                 {
                     SymbolFile *symbol_file = symbol_vendor->GetSymbolFile();
-                    
+
                     if (symbol_file)
                     {
                         ObjectFile *object_file = symbol_file->GetObjectFile();
-                        
+
                         if (object_file && object_file->GetFileSpec() == symbol_fspec)
                         {
                             // Provide feedback that the symfile has been successfully added.
@@ -4467,13 +4440,13 @@
                             result.AppendMessageWithFormat("symbol file '%s' has been added to '%s'\n",
                                                            symfile_path,
                                                            module_fs.GetPath().c_str());
-                            
+
                             // Let clients know something changed in the module
                             // if it is currently loaded
                             ModuleList module_list;
                             module_list.Append (module_sp);
                             target->SymbolsDidLoad (module_list);
-                            
+
                             // Make sure we load any scripting resources that may be embedded
                             // in the debug info files in case the platform supports that.
                             Error error;
@@ -4679,7 +4652,7 @@
                             if (platform_sp->ResolveSymbolFile(*target, module_spec, symfile_spec).Success())
                                 module_spec.GetSymbolFileSpec() = symfile_spec;
                         }
-                        
+
                         ArchSpec arch;
                         bool symfile_exists = module_spec.GetSymbolFileSpec().Exists();
 
@@ -4715,13 +4688,11 @@
         }
         return result.Succeeded();
     }
-    
+
     OptionGroupOptions m_option_group;
     OptionGroupUUID m_uuid_option_group;
     OptionGroupFile m_file_option;
     OptionGroupBoolean m_current_frame_option;
-
-    
 };
 
 
@@ -4744,13 +4715,13 @@
                             "target symbols <sub-command> ...")
     {
         LoadSubCommand ("add", CommandObjectSP (new CommandObjectTargetSymbolsAdd (interpreter)));
-        
+
     }
     virtual
     ~CommandObjectTargetSymbols()
     {
     }
-    
+
 private:
     //------------------------------------------------------------------
     // For CommandObjectTargetModules only
@@ -4785,9 +4756,9 @@
             m_one_liner()
         {
         }
-        
+
         ~CommandOptions () {}
-        
+
         const OptionDefinition*
         GetDefinitions ()
         {
@@ -4807,7 +4778,7 @@
                     m_class_name = option_arg;
                     m_sym_ctx_specified = true;
                 break;
-                
+
                 case 'e':
                     m_line_end = Args::StringToUInt32 (option_arg, UINT_MAX, 0, &success);
                     if (!success)
@@ -4817,7 +4788,7 @@
                     }
                     m_sym_ctx_specified = true;
                 break;
-                
+
                 case 'l':
                     m_line_start = Args::StringToUInt32 (option_arg, 0, 0, &success);
                     if (!success)
@@ -4827,17 +4798,17 @@
                     }
                     m_sym_ctx_specified = true;
                 break;
-                    
+
                 case 'i':
                     m_no_inlines = true;
                 break;
-                
+
                 case 'n':
                     m_function_name = option_arg;
                     m_func_name_type_mask |= eFunctionNameTypeAuto;
                     m_sym_ctx_specified = true;
                 break;
-                
+
                 case 'f':
                     m_file_name = option_arg;
                     m_sym_ctx_specified = true;
@@ -4895,7 +4866,7 @@
             m_thread_index = UINT32_MAX;
             m_thread_name.clear();
             m_queue_name.clear();
-            
+
             m_no_inlines = false;
             m_sym_ctx_specified = false;
             m_thread_specified = false;
@@ -4904,9 +4875,9 @@
             m_one_liner.clear();
         }
 
-        
+
         static OptionDefinition g_option_table[];
-        
+
         std::string m_class_name;
         std::string m_function_name;
         uint32_t    m_line_start;
@@ -4947,7 +4918,6 @@
     }
 
 protected:
-    
     virtual void
     IOHandlerActivated (IOHandler &io_handler)
     {
@@ -4958,8 +4928,7 @@
             output_sp->Flush();
         }
     }
-    
-    
+
     virtual void
     IOHandlerInputComplete (IOHandler &io_handler, std::string &line)
     {
@@ -4991,12 +4960,12 @@
         }
         io_handler.SetIsDone(true);
     }
-    
+
     bool
     DoExecute (Args& command, CommandReturnObject &result)
     {
         m_stop_hook_sp.reset();
-        
+
         Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target)
         {
@@ -5007,63 +4976,63 @@
             if (m_options.m_sym_ctx_specified)
             {
                 specifier_ap.reset(new SymbolContextSpecifier(m_interpreter.GetDebugger().GetSelectedTarget()));
-                
+
                 if (!m_options.m_module_name.empty())
                 {
                     specifier_ap->AddSpecification (m_options.m_module_name.c_str(), SymbolContextSpecifier::eModuleSpecified);
                 }
-                
+
                 if (!m_options.m_class_name.empty())
                 {
                     specifier_ap->AddSpecification (m_options.m_class_name.c_str(), SymbolContextSpecifier::eClassOrNamespaceSpecified);
                 }
-                
+
                 if (!m_options.m_file_name.empty())
                 {
                     specifier_ap->AddSpecification (m_options.m_file_name.c_str(), SymbolContextSpecifier::eFileSpecified);
                 }
-                
+
                 if (m_options.m_line_start != 0)
                 {
                     specifier_ap->AddLineSpecification (m_options.m_line_start, SymbolContextSpecifier::eLineStartSpecified);
                 }
-                
+
                 if (m_options.m_line_end != UINT_MAX)
                 {
                     specifier_ap->AddLineSpecification (m_options.m_line_end, SymbolContextSpecifier::eLineEndSpecified);
                 }
-                
+
                 if (!m_options.m_function_name.empty())
                 {
                     specifier_ap->AddSpecification (m_options.m_function_name.c_str(), SymbolContextSpecifier::eFunctionSpecified);
                 }
             }
-            
+
             if (specifier_ap.get())
                 new_hook_sp->SetSpecifier (specifier_ap.release());
 
             // Next see if any of the thread options have been entered:
-            
+
             if (m_options.m_thread_specified)
             {
                 ThreadSpec *thread_spec = new ThreadSpec();
-                
+
                 if (m_options.m_thread_id != LLDB_INVALID_THREAD_ID)
                 {
                     thread_spec->SetTID (m_options.m_thread_id);
                 }
-                
+
                 if (m_options.m_thread_index != UINT32_MAX)
                     thread_spec->SetIndex (m_options.m_thread_index);
-                
+
                 if (!m_options.m_thread_name.empty())
                     thread_spec->SetName (m_options.m_thread_name.c_str());
-                
+
                 if (!m_options.m_queue_name.empty())
                     thread_spec->SetQueueName (m_options.m_queue_name.c_str());
-                    
+
                 new_hook_sp->SetThreadSpecifier (thread_spec);
-            
+
             }
             if (m_options.m_use_one_liner)
             {
@@ -5087,7 +5056,7 @@
             result.AppendError ("invalid target\n");
             result.SetStatus (eReturnStatusFailed);
         }
-        
+
         return result.Succeeded();
     }
 private:
@@ -5194,7 +5163,7 @@
             result.AppendError ("invalid target\n");
             result.SetStatus (eReturnStatusFailed);
         }
-        
+
         return result.Succeeded();
     }
 };
@@ -5231,7 +5200,7 @@
             // FIXME: see if we can use the breakpoint id style parser?
             size_t num_args = command.GetArgumentCount();
             bool success;
-            
+
             if (num_args == 0)
             {
                 target->SetAllStopHooksActiveState (m_enable);
@@ -5302,7 +5271,7 @@
             result.SetStatus (eReturnStatusFailed);
             return result.Succeeded();
         }
-        
+
         size_t num_hooks = target->GetNumStopHooks ();
         if (num_hooks == 0)
         {
@@ -5372,7 +5341,7 @@
                             "A set of commands for operating on debugger targets.",
                             "target <subcommand> [<subcommand-options>]")
 {
-    
+
     LoadSubCommand ("create",    CommandObjectSP (new CommandObjectTargetCreate (interpreter)));
     LoadSubCommand ("delete",    CommandObjectSP (new CommandObjectTargetDelete (interpreter)));
     LoadSubCommand ("list",      CommandObjectSP (new CommandObjectTargetList   (interpreter)));
