1 //===-- SearchFilter.h ------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef liblldb_SearchFilter_h_ 11 #define liblldb_SearchFilter_h_ 12 13 // C Includes 14 // C++ Includes 15 // Other libraries and framework includes 16 // Project includes 17 #include "lldb/lldb-private.h" 18 #include "lldb/Core/FileSpecList.h" 19 20 namespace lldb_private { 21 22 //---------------------------------------------------------------------- 23 /// @class Searcher SearchFilter.h "lldb/Core/SearchFilter.h" 24 /// @brief Class that is driven by the SearchFilter to search the 25 /// SymbolContext space of the target program. 26 //---------------------------------------------------------------------- 27 28 //---------------------------------------------------------------------- 29 /// General Outline: 30 /// Provides the callback and search depth for the SearchFilter search. 31 //---------------------------------------------------------------------- 32 33 class Searcher 34 { 35 public: 36 typedef enum { 37 eCallbackReturnStop = 0, // Stop the iteration 38 eCallbackReturnContinue, // Continue the iteration 39 eCallbackReturnPop // Pop one level up and continue iterating 40 } CallbackReturn; 41 42 typedef enum { 43 eDepthTarget, 44 eDepthModule, 45 eDepthCompUnit, 46 eDepthFunction, 47 eDepthBlock, 48 eDepthAddress 49 } Depth; 50 51 Searcher (); 52 53 virtual ~Searcher (); 54 55 virtual CallbackReturn 56 SearchCallback (SearchFilter &filter, 57 SymbolContext &context, 58 Address *addr, 59 bool complete) = 0; 60 61 virtual Depth 62 GetDepth () = 0; 63 64 //------------------------------------------------------------------ 65 /// Prints a canonical description for the searcher to the stream \a s. 66 /// 67 /// @param[in] s 68 /// Stream to which the output is copied. 69 //------------------------------------------------------------------ 70 virtual void 71 GetDescription(Stream *s); 72 }; 73 74 //---------------------------------------------------------------------- 75 /// @class SearchFilter SearchFilter.h "lldb/Core/SearchFilter.h" 76 /// @brief Class descends through the SymbolContext space of the target, 77 /// applying a filter at each stage till it reaches the depth specified by 78 /// the GetDepth method of the searcher, and calls its callback at that point. 79 //---------------------------------------------------------------------- 80 81 //---------------------------------------------------------------------- 82 /// General Outline: 83 /// Provides the callback and search depth for the SearchFilter search. 84 /// 85 /// The search is done by cooperation between the search filter and the searcher. 86 /// The search filter does the heavy work of recursing through the SymbolContext 87 /// space of the target program's symbol space. The Searcher specifies the depth 88 /// at which it wants its callback to be invoked. Note that since the resolution 89 /// of the Searcher may be greater than that of the SearchFilter, before the 90 /// Searcher qualifies an address it should pass it to "AddressPasses." 91 /// The default implementation is "Everything Passes." 92 //---------------------------------------------------------------------- 93 94 class SearchFilter 95 { 96 public: 97 98 //------------------------------------------------------------------ 99 /// The basic constructor takes a Target, which gives the space to search. 100 /// 101 /// @param[in] target 102 /// The Target that provides the module list to search. 103 //------------------------------------------------------------------ 104 SearchFilter (const lldb::TargetSP &target_sp); 105 106 SearchFilter (const SearchFilter& rhs); 107 108 virtual 109 ~SearchFilter (); 110 111 const SearchFilter& 112 operator=(const SearchFilter& rhs); 113 114 //------------------------------------------------------------------ 115 /// Call this method with a file spec to see if that spec passes the filter. 116 /// 117 /// @param[in] spec 118 /// The file spec to check against the filter. 119 /// @return 120 /// \b true if \a spec passes, and \b false otherwise. 121 //------------------------------------------------------------------ 122 virtual bool 123 ModulePasses (const FileSpec &spec); 124 125 //------------------------------------------------------------------ 126 /// Call this method with a Module to see if that module passes the filter. 127 /// 128 /// @param[in] module 129 /// The Module to check against the filter. 130 /// 131 /// @return 132 /// \b true if \a module passes, and \b false otherwise. 133 //------------------------------------------------------------------ 134 virtual bool 135 ModulePasses (const lldb::ModuleSP &module_sp); 136 137 //------------------------------------------------------------------ 138 /// Call this method with a Address to see if \a address passes the filter. 139 /// 140 /// @param[in] addr 141 /// The address to check against the filter. 142 /// 143 /// @return 144 /// \b true if \a address passes, and \b false otherwise. 145 //------------------------------------------------------------------ 146 virtual bool 147 AddressPasses (Address &addr); 148 149 //------------------------------------------------------------------ 150 /// Call this method with a FileSpec to see if \a file spec passes the filter 151 /// as the name of a compilation unit. 152 /// 153 /// @param[in] fileSpec 154 /// The file spec to check against the filter. 155 /// 156 /// @return 157 /// \b true if \a file spec passes, and \b false otherwise. 158 //------------------------------------------------------------------ 159 virtual bool 160 CompUnitPasses (FileSpec &fileSpec); 161 162 //------------------------------------------------------------------ 163 /// Call this method with a CompileUnit to see if \a comp unit passes the filter. 164 /// 165 /// @param[in] compUnit 166 /// The CompileUnit to check against the filter. 167 /// 168 /// @return 169 /// \b true if \a Comp Unit passes, and \b false otherwise. 170 //------------------------------------------------------------------ 171 virtual bool 172 CompUnitPasses (CompileUnit &compUnit); 173 174 //------------------------------------------------------------------ 175 /// Call this method to do the search using the Searcher. 176 /// 177 /// @param[in] searcher 178 /// The searcher to drive with this search. 179 /// 180 //------------------------------------------------------------------ 181 virtual void 182 Search (Searcher &searcher); 183 184 //------------------------------------------------------------------ 185 /// Call this method to do the search using the Searcher in the module list 186 /// \a modules. 187 /// 188 /// @param[in] searcher 189 /// The searcher to drive with this search. 190 /// 191 /// @param[in] modules 192 /// The module list within which to restrict the search. 193 /// 194 //------------------------------------------------------------------ 195 virtual void 196 SearchInModuleList (Searcher &searcher, ModuleList &modules); 197 198 //------------------------------------------------------------------ 199 /// This determines which items are REQUIRED for the filter to pass. 200 /// For instance, if you are filtering by Compilation Unit, obviously 201 /// symbols that have no compilation unit can't pass So return eSymbolContextCU 202 /// and search callbacks can then short cut the search to avoid looking at 203 /// things that obviously won't pass. 204 /// 205 /// @return 206 /// The required elements for the search, which is an or'ed together 207 /// set of lldb:SearchContextItem enum's. 208 /// 209 //------------------------------------------------------------------ 210 virtual uint32_t 211 GetFilterRequiredItems (); 212 213 //------------------------------------------------------------------ 214 /// Prints a canonical description for the search filter to the stream \a s. 215 /// 216 /// @param[in] s 217 /// Stream to which the output is copied. 218 //------------------------------------------------------------------ 219 virtual void 220 GetDescription(Stream *s); 221 222 //------------------------------------------------------------------ 223 /// Standard "Dump" method. At present it does nothing. 224 //------------------------------------------------------------------ 225 virtual void 226 Dump (Stream *s) const; 227 228 protected: 229 230 // These are utility functions to assist with the search iteration. They are used by the 231 // default Search method. 232 233 Searcher::CallbackReturn 234 DoModuleIteration (const SymbolContext &context, 235 Searcher &searcher); 236 237 Searcher::CallbackReturn 238 DoModuleIteration (const lldb::ModuleSP& module_sp, 239 Searcher &searcher); 240 241 Searcher::CallbackReturn 242 DoCUIteration (const lldb::ModuleSP& module_sp, 243 const SymbolContext &context, 244 Searcher &searcher); 245 246 Searcher::CallbackReturn 247 DoFunctionIteration (Function *function, 248 const SymbolContext &context, 249 Searcher &searcher); 250 251 lldb::TargetSP m_target_sp; // Every filter has to be associated with a target for 252 // now since you need a starting place for the search. 253 }; 254 255 //---------------------------------------------------------------------- 256 /// @class SearchFilterForNonModuleSpecificSearches SearchFilter.h "lldb/Core/SearchFilter.h" 257 /// @brief This is a SearchFilter that searches through all modules. It also consults the Target::ModuleIsExcludedForNonModuleSpecificSearches. 258 //---------------------------------------------------------------------- 259 class SearchFilterForNonModuleSpecificSearches : 260 public SearchFilter 261 { 262 public: SearchFilterForNonModuleSpecificSearches(const lldb::TargetSP & targetSP)263 SearchFilterForNonModuleSpecificSearches (const lldb::TargetSP &targetSP) : SearchFilter(targetSP) {} ~SearchFilterForNonModuleSpecificSearches()264 ~SearchFilterForNonModuleSpecificSearches () {} 265 266 virtual bool 267 ModulePasses (const FileSpec &module_spec); 268 269 virtual bool 270 ModulePasses (const lldb::ModuleSP &module_sp); 271 }; 272 273 //---------------------------------------------------------------------- 274 /// @class SearchFilterByModule SearchFilter.h "lldb/Core/SearchFilter.h" 275 /// @brief This is a SearchFilter that restricts the search to a given module. 276 //---------------------------------------------------------------------- 277 278 class SearchFilterByModule : 279 public SearchFilter 280 { 281 public: 282 283 //------------------------------------------------------------------ 284 /// The basic constructor takes a Target, which gives the space to search, 285 /// and the module to restrict the search to. 286 /// 287 /// @param[in] target 288 /// The Target that provides the module list to search. 289 /// 290 /// @param[in] module 291 /// The Module that limits the search. 292 //------------------------------------------------------------------ 293 SearchFilterByModule (const lldb::TargetSP &targetSP, 294 const FileSpec &module); 295 296 SearchFilterByModule (const SearchFilterByModule& rhs); 297 298 virtual 299 ~SearchFilterByModule (); 300 301 const SearchFilterByModule& 302 operator=(const SearchFilterByModule& rhs); 303 304 virtual bool 305 ModulePasses (const lldb::ModuleSP &module_sp); 306 307 virtual bool 308 ModulePasses (const FileSpec &spec); 309 310 virtual bool 311 AddressPasses (Address &address); 312 313 virtual bool 314 CompUnitPasses (FileSpec &fileSpec); 315 316 virtual bool 317 CompUnitPasses (CompileUnit &compUnit); 318 319 virtual void 320 GetDescription(Stream *s); 321 322 virtual uint32_t 323 GetFilterRequiredItems (); 324 325 virtual void 326 Dump (Stream *s) const; 327 328 virtual void 329 Search (Searcher &searcher); 330 331 private: 332 FileSpec m_module_spec; 333 }; 334 335 class SearchFilterByModuleList : 336 public SearchFilter 337 { 338 public: 339 340 //------------------------------------------------------------------ 341 /// The basic constructor takes a Target, which gives the space to search, 342 /// and the module list to restrict the search to. 343 /// 344 /// @param[in] target 345 /// The Target that provides the module list to search. 346 /// 347 /// @param[in] module 348 /// The Module that limits the search. 349 //------------------------------------------------------------------ 350 SearchFilterByModuleList (const lldb::TargetSP &targetSP, 351 const FileSpecList &module_list); 352 353 SearchFilterByModuleList (const SearchFilterByModuleList& rhs); 354 355 virtual 356 ~SearchFilterByModuleList (); 357 358 const SearchFilterByModuleList& 359 operator=(const SearchFilterByModuleList& rhs); 360 361 virtual bool 362 ModulePasses (const lldb::ModuleSP &module_sp); 363 364 virtual bool 365 ModulePasses (const FileSpec &spec); 366 367 virtual bool 368 AddressPasses (Address &address); 369 370 virtual bool 371 CompUnitPasses (FileSpec &fileSpec); 372 373 virtual bool 374 CompUnitPasses (CompileUnit &compUnit); 375 376 virtual void 377 GetDescription(Stream *s); 378 379 virtual uint32_t 380 GetFilterRequiredItems (); 381 382 virtual void 383 Dump (Stream *s) const; 384 385 virtual void 386 Search (Searcher &searcher); 387 388 private: 389 FileSpecList m_module_spec_list; 390 }; 391 392 class SearchFilterByModuleListAndCU : 393 public SearchFilterByModuleList 394 { 395 public: 396 397 //------------------------------------------------------------------ 398 /// The basic constructor takes a Target, which gives the space to search, 399 /// and the module list to restrict the search to. 400 /// 401 /// @param[in] target 402 /// The Target that provides the module list to search. 403 /// 404 /// @param[in] module 405 /// The Module that limits the search. 406 //------------------------------------------------------------------ 407 SearchFilterByModuleListAndCU (const lldb::TargetSP &targetSP, 408 const FileSpecList &module_list, 409 const FileSpecList &cu_list); 410 411 SearchFilterByModuleListAndCU (const SearchFilterByModuleListAndCU& rhs); 412 413 virtual 414 ~SearchFilterByModuleListAndCU (); 415 416 const SearchFilterByModuleListAndCU& 417 operator=(const SearchFilterByModuleListAndCU& rhs); 418 419 virtual bool 420 AddressPasses (Address &address); 421 422 virtual bool 423 CompUnitPasses (FileSpec &fileSpec); 424 425 virtual bool 426 CompUnitPasses (CompileUnit &compUnit); 427 428 virtual void 429 GetDescription(Stream *s); 430 431 virtual uint32_t 432 GetFilterRequiredItems (); 433 434 virtual void 435 Dump (Stream *s) const; 436 437 virtual void 438 Search (Searcher &searcher); 439 440 private: 441 FileSpecList m_module_spec_list; 442 FileSpecList m_cu_spec_list; 443 }; 444 445 } // namespace lldb_private 446 447 #endif // liblldb_SearchFilter_h_ 448