[Lldb-commits] [lldb] r151953 - /lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp

Sean Callanan scallanan at apple.com
Fri Mar 2 15:22:53 PST 2012


Author: spyffe
Date: Fri Mar  2 17:22:53 2012
New Revision: 151953

URL: http://llvm.org/viewvc/llvm-project?rev=151953&view=rev
Log:
Added a function to the disassembler that checks
(from the mnemonic) whether an instruction is a
branch.  This function's result is exposed through
DoesBranch().

Modified:
    lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp

Modified: lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp?rev=151953&r1=151952&r2=151953&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp (original)
+++ lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp Fri Mar  2 17:22:53 2012
@@ -37,7 +37,8 @@
         m_disasm(disasm),
         m_is_valid(false),
         m_no_comments(true),
-        m_comment_stream()
+        m_comment_stream(),
+        m_does_branch(eLazyBoolCalculate)
     {
     }
     
@@ -147,7 +148,7 @@
     virtual bool
     DoesBranch () const
     {
-        return false;
+        return m_does_branch == eLazyBoolYes;
     }
     
     virtual size_t
@@ -251,6 +252,90 @@
         }
     }
     
+    bool StringRepresentsBranch (const char *data, size_t size)
+    {
+        const char *cursor = data;
+
+        bool inWhitespace = true;
+
+        while (inWhitespace && cursor < data + size)
+        {
+            switch (*cursor)
+            {
+            default:
+                inWhitespace = false;
+                break;
+            case ' ':
+                break;
+            case '\t':
+                break;
+            }
+            
+            if (inWhitespace)
+                ++cursor;
+        }
+        
+        if (cursor >= data + size)
+            return false;
+        
+        llvm::Triple::ArchType arch = m_disasm.GetArchitecture().GetMachine();
+        
+        switch (arch)
+        {
+        default:
+            return false;
+        case llvm::Triple::x86:
+        case llvm::Triple::x86_64:
+            switch (cursor[0])
+            {
+            default:
+                return false;
+            case 'j':
+                return true;
+            case 'c':
+                if (cursor[1] == 'a' &&
+                    cursor[2] == 'l' &&
+                    cursor[3] == 'l')
+                    return true;
+                else
+                    return false;
+            }
+        case llvm::Triple::arm:
+        case llvm::Triple::thumb:
+            switch (cursor[0])
+            {
+            default:
+                return false;
+            case 'b':
+                {
+                    switch (cursor[1])
+                    {
+                    default:
+                        return false;
+                    case 'l':
+                    case 'x':
+                    case ' ':
+                    case '\t':
+                        return true;
+                    }
+                    return false;
+                }
+            case 'c':
+                {
+                    switch (cursor[1])
+                    {
+                    default:
+                        return false;
+                    case 'b':
+                        return true;
+                    }
+                }
+            }
+        }
+        
+        return false;
+    }
+    
     template <bool Reparse> bool Parse (const lldb_private::Address &address, 
                                         lldb_private::AddressClass addr_class,
                                         const DataExtractor &extractor,
@@ -279,6 +364,10 @@
                                                    out_string.data(), 
                                                    out_string.size());
         
+        if (m_does_branch == eLazyBoolCalculate)
+            m_does_branch = (StringRepresentsBranch (out_string.data(), out_string.size()) ?
+                             eLazyBoolYes : eLazyBoolNo);
+        
         m_comment_stream.Flush();
         m_no_comments = false;
         
@@ -331,6 +420,7 @@
     
     bool                    m_no_comments;
     StreamString            m_comment_stream;
+    LazyBool                m_does_branch;
     
     static bool             s_regex_compiled;
     static ::regex_t        s_regex;





More information about the lldb-commits mailing list