Added the ability to restrict breakpoints by function name, function regexp, selector
etc to specific source files.
Added SB API's to specify these source files & also more than one module.
Added an "exact" option to CompileUnit's FindLineEntry API.


git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@140362 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Breakpoint/BreakpointResolverFileRegex.cpp b/source/Breakpoint/BreakpointResolverFileRegex.cpp
index 238c370..e4b596a 100644
--- a/source/Breakpoint/BreakpointResolverFileRegex.cpp
+++ b/source/Breakpoint/BreakpointResolverFileRegex.cpp
@@ -29,11 +29,9 @@
 BreakpointResolverFileRegex::BreakpointResolverFileRegex
 (
     Breakpoint *bkpt,
-    const FileSpec &file_spec,
     RegularExpression &regex
 ) :
     BreakpointResolver (bkpt, BreakpointResolver::FileLineResolver),
-    m_file_spec (file_spec),
     m_regex (regex)
 {
 }
@@ -60,62 +58,58 @@
 
     CompileUnit *cu = context.comp_unit;
     FileSpec cu_file_spec = *(static_cast<FileSpec *>(cu));
-    if (cu_file_spec == m_file_spec
-        || (!m_file_spec.GetDirectory() && cu_file_spec.GetFilename() == m_file_spec.GetFilename()))
+    std::vector<uint32_t> line_matches;
+    context.target_sp->GetSourceManager().FindLinesMatchingRegex(cu_file_spec, m_regex, 1, UINT32_MAX, line_matches); 
+    uint32_t num_matches = line_matches.size();
+    for (int i = 0; i < num_matches; i++)
     {
-        std::vector<uint32_t> line_matches;
-        context.target_sp->GetSourceManager().FindLinesMatchingRegex(cu_file_spec, m_regex, 1, UINT32_MAX, line_matches); 
-        uint32_t num_matches = line_matches.size();
-        for (int i = 0; i < num_matches; i++)
+        uint32_t start_idx = 0;
+        bool exact = false;
+        while (1)
         {
-            uint32_t start_idx = 0;
-            while (1)
-            {
-                LineEntry line_entry;
+            LineEntry line_entry;
+        
+            // Cycle through all the line entries that might match this one:
+            start_idx = cu->FindLineEntry (start_idx, line_matches[i], NULL, exact, &line_entry);
+            if (start_idx == UINT32_MAX)
+                break;
+            exact = true;
+            start_idx++;
             
-                // Cycle through all the line entries that might match this one:
-                start_idx = cu->FindLineEntry (start_idx, line_matches[i], NULL, &line_entry);
-                if (start_idx == UINT32_MAX)
-                    break;
-                start_idx++;
-                
-                Address line_start = line_entry.range.GetBaseAddress();
-                if (line_start.IsValid())
+            Address line_start = line_entry.range.GetBaseAddress();
+            if (line_start.IsValid())
+            {
+                if (filter.AddressPasses(line_start))
                 {
-                    if (filter.AddressPasses(line_start))
+                    BreakpointLocationSP bp_loc_sp (m_breakpoint->AddLocation(line_start));
+                    if (log && bp_loc_sp && !m_breakpoint->IsInternal())
                     {
-                        BreakpointLocationSP bp_loc_sp (m_breakpoint->AddLocation(line_start));
-                        if (log && bp_loc_sp && !m_breakpoint->IsInternal())
-                        {
-                            StreamString s;
-                            bp_loc_sp->GetDescription (&s, lldb::eDescriptionLevelVerbose);
-                            log->Printf ("Added location: %s\n", s.GetData());
-                        }
-                    }
-                    else if (log)
-                    {
-                        log->Printf ("Breakpoint at file address 0x%llx for %s:%d didn't pass filter.\n",
-                                     line_start.GetFileAddress(),
-                                     m_file_spec.GetFilename().AsCString("<Unknown>"),
-                                     line_matches[i]);
+                        StreamString s;
+                        bp_loc_sp->GetDescription (&s, lldb::eDescriptionLevelVerbose);
+                        log->Printf ("Added location: %s\n", s.GetData());
                     }
                 }
-                else
+                else if (log)
                 {
-                    if (log)
-                        log->Printf ("error: Unable to set breakpoint at file address 0x%llx for %s:%d\n",
-                                     line_start.GetFileAddress(),
-                                     m_file_spec.GetFilename().AsCString("<Unknown>"),
-                                     line_matches[i]);
+                    log->Printf ("Breakpoint at file address 0x%llx for %s:%d didn't pass filter.\n",
+                                 line_start.GetFileAddress(),
+                                 cu_file_spec.GetFilename().AsCString("<Unknown>"),
+                                 line_matches[i]);
                 }
-
             }
+            else
+            {
+                if (log)
+                    log->Printf ("error: Unable to set breakpoint at file address 0x%llx for %s:%d\n",
+                                 line_start.GetFileAddress(),
+                                 cu_file_spec.GetFilename().AsCString("<Unknown>"),
+                                 line_matches[i]);
+            }
+
         }
-        assert (m_breakpoint != NULL);
-        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
-        
-        
     }
+    assert (m_breakpoint != NULL);        
+
     return Searcher::eCallbackReturnContinue;
 }
 
@@ -128,7 +122,7 @@
 void
 BreakpointResolverFileRegex::GetDescription (Stream *s)
 {
-    s->Printf ("file ='%s', regular expression = \"%s\"", m_file_spec.GetFilename().AsCString(), m_regex.GetText());
+    s->Printf ("source regex = \"%s\"", m_regex.GetText());
 }
 
 void