]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/source/Core/SearchFilter.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / source / Core / SearchFilter.cpp
1 //===-- SearchFilter.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 // C Includes
11 // C++ Includes
12 // Other libraries and framework includes
13 // Project includes
14
15 #include "lldb/lldb-private.h"
16 #include "lldb/Core/SearchFilter.h"
17 #include "lldb/Core/Module.h"
18 #include "lldb/Symbol/CompileUnit.h"
19 #include "lldb/Target/Target.h"
20
21 using namespace lldb;
22 using namespace lldb_private;
23
24 //----------------------------------------------------------------------
25 // SearchFilter constructor
26 //----------------------------------------------------------------------
27 Searcher::Searcher ()
28 {
29
30 }
31
32 Searcher::~Searcher ()
33 {
34
35 }
36
37 void
38 Searcher::GetDescription (Stream *s)
39 {
40 }
41
42 //----------------------------------------------------------------------
43 // SearchFilter constructor
44 //----------------------------------------------------------------------
45 SearchFilter::SearchFilter(const TargetSP &target_sp) :
46     m_target_sp (target_sp)
47 {
48 }
49
50 //----------------------------------------------------------------------
51 // SearchFilter copy constructor
52 //----------------------------------------------------------------------
53 SearchFilter::SearchFilter(const SearchFilter& rhs) :
54     m_target_sp (rhs.m_target_sp)
55 {
56 }
57
58 //----------------------------------------------------------------------
59 // SearchFilter assignment operator
60 //----------------------------------------------------------------------
61 const SearchFilter&
62 SearchFilter::operator=(const SearchFilter& rhs)
63 {
64     m_target_sp = rhs.m_target_sp;
65     return *this;
66 }
67
68 //----------------------------------------------------------------------
69 // Destructor
70 //----------------------------------------------------------------------
71 SearchFilter::~SearchFilter()
72 {
73 }
74
75 bool
76 SearchFilter::ModulePasses (const FileSpec &spec)
77 {
78     return true;
79 }
80
81 bool
82 SearchFilter::ModulePasses (const ModuleSP &module_sp)
83 {
84     return true;
85 }
86
87 bool
88 SearchFilter::AddressPasses (Address &address)
89 {
90     return true;
91 }
92
93 bool
94 SearchFilter::CompUnitPasses (FileSpec &fileSpec)
95 {
96     return true;
97 }
98
99 bool
100 SearchFilter::CompUnitPasses (CompileUnit &compUnit)
101 {
102     return true;
103 }
104
105 uint32_t
106 SearchFilter::GetFilterRequiredItems()
107 {
108     return (lldb::SymbolContextItem) 0;
109 }
110
111 void
112 SearchFilter::GetDescription (Stream *s)
113 {
114 }
115
116 void
117 SearchFilter::Dump (Stream *s) const
118 {
119
120 }
121
122 //----------------------------------------------------------------------
123 // UTILITY Functions to help iterate down through the elements of the
124 // SymbolContext.
125 //----------------------------------------------------------------------
126
127 void
128 SearchFilter::Search (Searcher &searcher)
129 {
130     SymbolContext empty_sc;
131
132     if (!m_target_sp)
133         return;
134     empty_sc.target_sp = m_target_sp;
135
136     if (searcher.GetDepth() == Searcher::eDepthTarget)
137         searcher.SearchCallback (*this, empty_sc, NULL, false);
138     else
139         DoModuleIteration(empty_sc, searcher);
140 }
141
142 void
143 SearchFilter::SearchInModuleList (Searcher &searcher, ModuleList &modules)
144 {
145     SymbolContext empty_sc;
146
147     if (!m_target_sp)
148         return;
149     empty_sc.target_sp = m_target_sp;
150
151     if (searcher.GetDepth() == Searcher::eDepthTarget)
152         searcher.SearchCallback (*this, empty_sc, NULL, false);
153     else
154     {
155         Mutex::Locker modules_locker(modules.GetMutex());
156         const size_t numModules = modules.GetSize();
157
158         for (size_t i = 0; i < numModules; i++)
159         {
160             ModuleSP module_sp(modules.GetModuleAtIndexUnlocked(i));
161             if (ModulePasses(module_sp))
162             {
163                 if (DoModuleIteration(module_sp, searcher) == Searcher::eCallbackReturnStop)
164                     return;
165             }
166         }
167     }
168 }
169
170
171 Searcher::CallbackReturn
172 SearchFilter::DoModuleIteration (const lldb::ModuleSP& module_sp, Searcher &searcher)
173 {
174     SymbolContext matchingContext (m_target_sp, module_sp);
175     return DoModuleIteration(matchingContext, searcher);
176 }
177
178 Searcher::CallbackReturn
179 SearchFilter::DoModuleIteration (const SymbolContext &context, Searcher &searcher)
180 {
181     if (searcher.GetDepth () >= Searcher::eDepthModule)
182     {
183         if (context.module_sp)
184         {
185             if (searcher.GetDepth () == Searcher::eDepthModule)
186             {
187                 SymbolContext matchingContext(context.module_sp.get());
188                 searcher.SearchCallback (*this, matchingContext, NULL, false);
189             }
190             else
191             {
192                 return DoCUIteration(context.module_sp, context, searcher);
193             }
194         }
195         else
196         {
197             const ModuleList &target_images = m_target_sp->GetImages();
198             Mutex::Locker modules_locker(target_images.GetMutex());
199             
200             size_t n_modules = target_images.GetSize();
201             for (size_t i = 0; i < n_modules; i++)
202             {
203                 // If this is the last level supplied, then call the callback directly,
204                 // otherwise descend.
205                 ModuleSP module_sp(target_images.GetModuleAtIndexUnlocked (i));
206                 if (!ModulePasses (module_sp))
207                     continue;
208
209                 if (searcher.GetDepth () == Searcher::eDepthModule)
210                 {
211                     SymbolContext matchingContext(m_target_sp, module_sp);
212
213                     Searcher::CallbackReturn shouldContinue = searcher.SearchCallback (*this, matchingContext, NULL, false);
214                     if (shouldContinue == Searcher::eCallbackReturnStop
215                         || shouldContinue == Searcher::eCallbackReturnPop)
216                         return shouldContinue;
217                 }
218                 else
219                 {
220                     Searcher::CallbackReturn shouldContinue = DoCUIteration(module_sp, context, searcher);
221                     if (shouldContinue == Searcher::eCallbackReturnStop)
222                         return shouldContinue;
223                     else if (shouldContinue == Searcher::eCallbackReturnPop)
224                         continue;
225                 }
226             }
227         }
228     }
229     return Searcher::eCallbackReturnContinue;
230 }
231
232 Searcher::CallbackReturn
233 SearchFilter::DoCUIteration (const ModuleSP &module_sp, const SymbolContext &context, Searcher &searcher)
234 {
235     Searcher::CallbackReturn shouldContinue;
236     if (context.comp_unit == NULL)
237     {
238         const size_t num_comp_units = module_sp->GetNumCompileUnits();
239         for (size_t i = 0; i < num_comp_units; i++)
240         {
241             CompUnitSP cu_sp (module_sp->GetCompileUnitAtIndex (i));
242             if (cu_sp)
243             {
244                 if (!CompUnitPasses (*(cu_sp.get())))
245                     continue;
246
247                 if (searcher.GetDepth () == Searcher::eDepthCompUnit)
248                 {
249                     SymbolContext matchingContext(m_target_sp, module_sp, cu_sp.get());
250
251                     shouldContinue = searcher.SearchCallback (*this, matchingContext, NULL, false);
252
253                     if (shouldContinue == Searcher::eCallbackReturnPop)
254                         return Searcher::eCallbackReturnContinue;
255                     else if (shouldContinue == Searcher::eCallbackReturnStop)
256                         return shouldContinue;
257                 }
258                 else
259                 {
260                     // FIXME Descend to block.
261                 }
262             }
263         }
264     }
265     else
266     {
267         if (CompUnitPasses(*context.comp_unit))
268         {
269             SymbolContext matchingContext (m_target_sp, module_sp, context.comp_unit);
270             return searcher.SearchCallback (*this, matchingContext, NULL, false);
271         }
272     }
273     return Searcher::eCallbackReturnContinue;
274 }
275
276 Searcher::CallbackReturn
277 SearchFilter::DoFunctionIteration (Function *function, const SymbolContext &context, Searcher &searcher)
278 {
279     // FIXME: Implement...
280     return Searcher::eCallbackReturnContinue;
281 }
282
283 //----------------------------------------------------------------------
284 //  SearchFilterForNonModuleSpecificSearches:
285 //  Selects a shared library matching a given file spec, consulting the targets "black list".
286 //----------------------------------------------------------------------
287
288     bool 
289     SearchFilterForNonModuleSpecificSearches::ModulePasses (const FileSpec &module_spec)
290     {
291         if (m_target_sp->ModuleIsExcludedForNonModuleSpecificSearches (module_spec))
292             return false;
293         else
294             return true;
295     }
296     
297     bool
298     SearchFilterForNonModuleSpecificSearches::ModulePasses (const lldb::ModuleSP &module_sp)
299     {
300         if (!module_sp)
301             return true;
302         else if (m_target_sp->ModuleIsExcludedForNonModuleSpecificSearches (module_sp))
303             return false;
304         else
305             return true;
306     }
307
308 //----------------------------------------------------------------------
309 //  SearchFilterByModule:
310 //  Selects a shared library matching a given file spec
311 //----------------------------------------------------------------------
312
313 //----------------------------------------------------------------------
314 // SearchFilterByModule constructors
315 //----------------------------------------------------------------------
316
317 SearchFilterByModule::SearchFilterByModule (const lldb::TargetSP &target_sp, const FileSpec &module) :
318     SearchFilter (target_sp),
319     m_module_spec (module)
320 {
321 }
322
323
324 //----------------------------------------------------------------------
325 // SearchFilterByModule copy constructor
326 //----------------------------------------------------------------------
327 SearchFilterByModule::SearchFilterByModule(const SearchFilterByModule& rhs) :
328     SearchFilter (rhs),
329     m_module_spec (rhs.m_module_spec)
330 {
331 }
332
333 //----------------------------------------------------------------------
334 // SearchFilterByModule assignment operator
335 //----------------------------------------------------------------------
336 const SearchFilterByModule&
337 SearchFilterByModule::operator=(const SearchFilterByModule& rhs)
338 {
339     m_target_sp = rhs.m_target_sp;
340     m_module_spec = rhs.m_module_spec;
341     return *this;
342 }
343
344 //----------------------------------------------------------------------
345 // Destructor
346 //----------------------------------------------------------------------
347 SearchFilterByModule::~SearchFilterByModule()
348 {
349 }
350
351 bool
352 SearchFilterByModule::ModulePasses (const ModuleSP &module_sp)
353 {
354     if (module_sp && FileSpec::Equal(module_sp->GetFileSpec(), m_module_spec, false))
355         return true;
356     else
357         return false;
358 }
359
360 bool
361 SearchFilterByModule::ModulePasses (const FileSpec &spec)
362 {
363     // Do a full match only if "spec" has a directory
364     const bool full_match = spec.GetDirectory();
365     return FileSpec::Equal(spec, m_module_spec, full_match);
366 }
367
368 bool
369 SearchFilterByModule::AddressPasses (Address &address)
370 {
371     // FIXME: Not yet implemented
372     return true;
373 }
374
375
376 bool
377 SearchFilterByModule::CompUnitPasses (FileSpec &fileSpec)
378 {
379     return true;
380 }
381
382 bool
383 SearchFilterByModule::CompUnitPasses (CompileUnit &compUnit)
384 {
385     return true;
386 }
387
388 void
389 SearchFilterByModule::Search (Searcher &searcher)
390 {
391     if (!m_target_sp)
392         return;
393
394     if (searcher.GetDepth() == Searcher::eDepthTarget)
395     {
396         SymbolContext empty_sc;
397         empty_sc.target_sp = m_target_sp;
398         searcher.SearchCallback (*this, empty_sc, NULL, false);
399     }
400
401     // If the module file spec is a full path, then we can just find the one
402     // filespec that passes.  Otherwise, we need to go through all modules and
403     // find the ones that match the file name.
404
405     const ModuleList &target_modules = m_target_sp->GetImages();
406     Mutex::Locker modules_locker (target_modules.GetMutex());
407     
408     const size_t num_modules = target_modules.GetSize ();
409     for (size_t i = 0; i < num_modules; i++)
410     {
411         Module* module = target_modules.GetModulePointerAtIndexUnlocked(i);
412         const bool full_match = m_module_spec.GetDirectory();
413         if (FileSpec::Equal (m_module_spec, module->GetFileSpec(), full_match))
414         {
415             SymbolContext matchingContext(m_target_sp, module->shared_from_this());
416             Searcher::CallbackReturn shouldContinue;
417
418             shouldContinue = DoModuleIteration(matchingContext, searcher);
419             if (shouldContinue == Searcher::eCallbackReturnStop)
420                 return;
421         }
422     }
423 }
424
425 void
426 SearchFilterByModule::GetDescription (Stream *s)
427 {
428     s->PutCString(", module = ");
429     if (s->GetVerbose())
430     {
431         char buffer[2048];
432         m_module_spec.GetPath(buffer, 2047);
433         s->PutCString(buffer);
434     }
435     else
436     {
437         s->PutCString(m_module_spec.GetFilename().AsCString("<unknown>"));
438     }
439 }
440
441 uint32_t
442 SearchFilterByModule::GetFilterRequiredItems()
443 {
444     return eSymbolContextModule;
445 }
446
447 void
448 SearchFilterByModule::Dump (Stream *s) const
449 {
450
451 }
452 //----------------------------------------------------------------------
453 //  SearchFilterByModuleList:
454 //  Selects a shared library matching a given file spec
455 //----------------------------------------------------------------------
456
457 //----------------------------------------------------------------------
458 // SearchFilterByModuleList constructors
459 //----------------------------------------------------------------------
460
461 SearchFilterByModuleList::SearchFilterByModuleList (const lldb::TargetSP &target_sp, const FileSpecList &module_list) :
462     SearchFilter (target_sp),
463     m_module_spec_list (module_list)
464 {
465 }
466
467
468 //----------------------------------------------------------------------
469 // SearchFilterByModuleList copy constructor
470 //----------------------------------------------------------------------
471 SearchFilterByModuleList::SearchFilterByModuleList(const SearchFilterByModuleList& rhs) :
472     SearchFilter (rhs),
473     m_module_spec_list (rhs.m_module_spec_list)
474 {
475 }
476
477 //----------------------------------------------------------------------
478 // SearchFilterByModuleList assignment operator
479 //----------------------------------------------------------------------
480 const SearchFilterByModuleList&
481 SearchFilterByModuleList::operator=(const SearchFilterByModuleList& rhs)
482 {
483     m_target_sp = rhs.m_target_sp;
484     m_module_spec_list = rhs.m_module_spec_list;
485     return *this;
486 }
487
488 //----------------------------------------------------------------------
489 // Destructor
490 //----------------------------------------------------------------------
491 SearchFilterByModuleList::~SearchFilterByModuleList()
492 {
493 }
494
495 bool
496 SearchFilterByModuleList::ModulePasses (const ModuleSP &module_sp)
497 {
498     if (m_module_spec_list.GetSize() == 0)
499         return true;
500         
501     if (module_sp && m_module_spec_list.FindFileIndex(0, module_sp->GetFileSpec(), false) != UINT32_MAX)
502         return true;
503     else
504         return false;
505 }
506
507 bool
508 SearchFilterByModuleList::ModulePasses (const FileSpec &spec)
509 {
510     if (m_module_spec_list.GetSize() == 0)
511         return true;
512         
513     if (m_module_spec_list.FindFileIndex(0, spec, true) != UINT32_MAX)
514         return true;
515     else
516         return false;
517 }
518
519 bool
520 SearchFilterByModuleList::AddressPasses (Address &address)
521 {
522     // FIXME: Not yet implemented
523     return true;
524 }
525
526
527 bool
528 SearchFilterByModuleList::CompUnitPasses (FileSpec &fileSpec)
529 {
530     return true;
531 }
532
533 bool
534 SearchFilterByModuleList::CompUnitPasses (CompileUnit &compUnit)
535 {
536     return true;
537 }
538
539 void
540 SearchFilterByModuleList::Search (Searcher &searcher)
541 {
542     if (!m_target_sp)
543         return;
544
545     if (searcher.GetDepth() == Searcher::eDepthTarget)
546     {
547         SymbolContext empty_sc;
548         empty_sc.target_sp = m_target_sp;
549         searcher.SearchCallback (*this, empty_sc, NULL, false);
550     }
551
552     // If the module file spec is a full path, then we can just find the one
553     // filespec that passes.  Otherwise, we need to go through all modules and
554     // find the ones that match the file name.
555
556     const ModuleList &target_modules = m_target_sp->GetImages();
557     Mutex::Locker modules_locker (target_modules.GetMutex());
558     
559     const size_t num_modules = target_modules.GetSize ();
560     for (size_t i = 0; i < num_modules; i++)
561     {
562         Module* module = target_modules.GetModulePointerAtIndexUnlocked(i);
563         if (m_module_spec_list.FindFileIndex(0, module->GetFileSpec(), false) != UINT32_MAX)
564         {
565             SymbolContext matchingContext(m_target_sp, module->shared_from_this());
566             Searcher::CallbackReturn shouldContinue;
567
568             shouldContinue = DoModuleIteration(matchingContext, searcher);
569             if (shouldContinue == Searcher::eCallbackReturnStop)
570                 return;
571         }
572     }
573 }
574
575 void
576 SearchFilterByModuleList::GetDescription (Stream *s)
577 {
578     size_t num_modules = m_module_spec_list.GetSize();
579     if (num_modules == 1)
580     {
581         s->Printf (", module = ");
582         if (s->GetVerbose())
583         {
584             char buffer[2048];
585             m_module_spec_list.GetFileSpecAtIndex(0).GetPath(buffer, 2047);
586             s->PutCString(buffer);
587         }
588         else
589         {
590             s->PutCString(m_module_spec_list.GetFileSpecAtIndex(0).GetFilename().AsCString("<unknown>"));
591         }
592     }
593     else
594     {
595         s->Printf (", modules(%zu) = ", num_modules);
596         for (size_t i = 0; i < num_modules; i++)
597         {
598             if (s->GetVerbose())
599             {
600                 char buffer[2048];
601                 m_module_spec_list.GetFileSpecAtIndex(i).GetPath(buffer, 2047);
602                 s->PutCString(buffer);
603             }
604             else
605             {
606                 s->PutCString(m_module_spec_list.GetFileSpecAtIndex(i).GetFilename().AsCString("<unknown>"));
607             }
608             if (i != num_modules - 1)
609                 s->PutCString (", ");
610         }
611     }
612 }
613
614 uint32_t
615 SearchFilterByModuleList::GetFilterRequiredItems()
616 {
617     return eSymbolContextModule;
618 }
619
620 void
621 SearchFilterByModuleList::Dump (Stream *s) const
622 {
623
624 }
625
626 //----------------------------------------------------------------------
627 //  SearchFilterByModuleListAndCU:
628 //  Selects a shared library matching a given file spec
629 //----------------------------------------------------------------------
630
631 //----------------------------------------------------------------------
632 // SearchFilterByModuleListAndCU constructors
633 //----------------------------------------------------------------------
634
635 SearchFilterByModuleListAndCU::SearchFilterByModuleListAndCU (const lldb::TargetSP &target_sp, 
636                                                               const FileSpecList &module_list,
637                                                               const FileSpecList &cu_list) :
638     SearchFilterByModuleList (target_sp, module_list),
639     m_cu_spec_list (cu_list)
640 {
641 }
642
643
644 //----------------------------------------------------------------------
645 // SearchFilterByModuleListAndCU copy constructor
646 //----------------------------------------------------------------------
647 SearchFilterByModuleListAndCU::SearchFilterByModuleListAndCU(const SearchFilterByModuleListAndCU& rhs) :
648     SearchFilterByModuleList (rhs),
649     m_cu_spec_list (rhs.m_cu_spec_list)
650 {
651 }
652
653 //----------------------------------------------------------------------
654 // SearchFilterByModuleListAndCU assignment operator
655 //----------------------------------------------------------------------
656 const SearchFilterByModuleListAndCU&
657 SearchFilterByModuleListAndCU::operator=(const SearchFilterByModuleListAndCU& rhs)
658 {
659     if (&rhs != this)
660     {
661         m_target_sp = rhs.m_target_sp;
662         m_module_spec_list = rhs.m_module_spec_list;
663         m_cu_spec_list = rhs.m_cu_spec_list;
664     }
665     return *this;
666 }
667
668 //----------------------------------------------------------------------
669 // Destructor
670 //----------------------------------------------------------------------
671 SearchFilterByModuleListAndCU::~SearchFilterByModuleListAndCU()
672 {
673 }
674
675 bool
676 SearchFilterByModuleListAndCU::AddressPasses (Address &address)
677 {
678     return true;
679 }
680
681
682 bool
683 SearchFilterByModuleListAndCU::CompUnitPasses (FileSpec &fileSpec)
684 {
685     return m_cu_spec_list.FindFileIndex(0, fileSpec, false) != UINT32_MAX;
686 }
687
688 bool
689 SearchFilterByModuleListAndCU::CompUnitPasses (CompileUnit &compUnit)
690 {
691     bool in_cu_list = m_cu_spec_list.FindFileIndex(0, compUnit, false) != UINT32_MAX;
692     if (in_cu_list)
693     {
694         ModuleSP module_sp(compUnit.GetModule());
695         if (module_sp)
696         {
697             bool module_passes = SearchFilterByModuleList::ModulePasses(module_sp);
698             return module_passes;
699         }
700         else
701             return true;
702     }
703     else
704         return false;
705 }
706
707 void
708 SearchFilterByModuleListAndCU::Search (Searcher &searcher)
709 {
710     if (!m_target_sp)
711         return;
712
713     if (searcher.GetDepth() == Searcher::eDepthTarget)
714     {
715         SymbolContext empty_sc;
716         empty_sc.target_sp = m_target_sp;
717         searcher.SearchCallback (*this, empty_sc, NULL, false);
718     }
719
720     // If the module file spec is a full path, then we can just find the one
721     // filespec that passes.  Otherwise, we need to go through all modules and
722     // find the ones that match the file name.
723
724     ModuleList matching_modules;
725     const ModuleList &target_images = m_target_sp->GetImages();
726     Mutex::Locker modules_locker(target_images.GetMutex());
727     
728     const size_t num_modules = target_images.GetSize ();
729     bool no_modules_in_filter = m_module_spec_list.GetSize() == 0;
730     for (size_t i = 0; i < num_modules; i++)
731     {
732         lldb::ModuleSP module_sp = target_images.GetModuleAtIndexUnlocked(i);
733         if (no_modules_in_filter || m_module_spec_list.FindFileIndex(0, module_sp->GetFileSpec(), false) != UINT32_MAX)
734         {
735             SymbolContext matchingContext(m_target_sp, module_sp);
736             Searcher::CallbackReturn shouldContinue;
737
738             if (searcher.GetDepth() == Searcher::eDepthModule)
739             {
740                 shouldContinue = DoModuleIteration(matchingContext, searcher);
741                 if (shouldContinue == Searcher::eCallbackReturnStop)
742                     return;
743             }
744             else
745             {
746                 const size_t num_cu = module_sp->GetNumCompileUnits();
747                 for (size_t cu_idx = 0; cu_idx < num_cu; cu_idx++)
748                 {
749                     CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(cu_idx);
750                     matchingContext.comp_unit = cu_sp.get();
751                     if (matchingContext.comp_unit)
752                     {
753                         if (m_cu_spec_list.FindFileIndex(0, *matchingContext.comp_unit, false) != UINT32_MAX)
754                         {
755                             shouldContinue = DoCUIteration(module_sp, matchingContext, searcher);
756                             if (shouldContinue == Searcher::eCallbackReturnStop)
757                                 return;
758                         }
759                     }
760                 }
761             }
762         }
763     }
764 }
765
766 void
767 SearchFilterByModuleListAndCU::GetDescription (Stream *s)
768 {
769     size_t num_modules = m_module_spec_list.GetSize();
770     if (num_modules == 1)
771     {
772         s->Printf (", module = ");
773         if (s->GetVerbose())
774         {
775             char buffer[2048];
776             m_module_spec_list.GetFileSpecAtIndex(0).GetPath(buffer, 2047);
777             s->PutCString(buffer);
778         }
779         else
780         {
781             s->PutCString(m_module_spec_list.GetFileSpecAtIndex(0).GetFilename().AsCString("<unknown>"));
782         }
783     }
784     else if (num_modules > 0)
785     {
786         s->Printf (", modules(%zd) = ", num_modules);
787         for (size_t i = 0; i < num_modules; i++)
788         {
789             if (s->GetVerbose())
790             {
791                 char buffer[2048];
792                 m_module_spec_list.GetFileSpecAtIndex(i).GetPath(buffer, 2047);
793                 s->PutCString(buffer);
794             }
795             else
796             {
797                 s->PutCString(m_module_spec_list.GetFileSpecAtIndex(i).GetFilename().AsCString("<unknown>"));
798             }
799             if (i != num_modules - 1)
800                 s->PutCString (", ");
801         }
802     }
803 }
804
805 uint32_t
806 SearchFilterByModuleListAndCU::GetFilterRequiredItems()
807 {
808     return eSymbolContextModule | eSymbolContextCompUnit;
809 }
810
811 void
812 SearchFilterByModuleListAndCU::Dump (Stream *s) const
813 {
814
815 }
816