[Lldb-commits] [lldb] r176922 - DoesBranch needs to compute the instruction if it isn't already done.

Jim Ingham jingham at apple.com
Tue Mar 12 18:55:16 PDT 2013


Author: jingham
Date: Tue Mar 12 20:55:16 2013
New Revision: 176922

URL: http://llvm.org/viewvc/llvm-project?rev=176922&view=rev
Log:
DoesBranch needs to compute the instruction if it isn't already done.
Handle the "alternate_isa" correctly.

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

Modified: lldb/trunk/include/lldb/Core/Disassembler.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Disassembler.h?rev=176922&r1=176921&r2=176922&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Disassembler.h (original)
+++ lldb/trunk/include/lldb/Core/Disassembler.h Tue Mar 12 20:55:16 2013
@@ -85,7 +85,7 @@ public:
           const ExecutionContext* exe_ctx);
     
     virtual bool
-    DoesBranch () const = 0;
+    DoesBranch () = 0;
 
     virtual size_t
     Decode (const Disassembler &disassembler, 
@@ -206,7 +206,7 @@ public:
      ~PseudoInstruction ();
      
     virtual bool
-    DoesBranch () const;
+    DoesBranch ();
 
     virtual void
     CalculateMnemonicOperandsAndComment (const ExecutionContext* exe_ctx)

Modified: lldb/trunk/source/Core/Disassembler.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Disassembler.cpp?rev=176922&r1=176921&r2=176922&view=diff
==============================================================================
--- lldb/trunk/source/Core/Disassembler.cpp (original)
+++ lldb/trunk/source/Core/Disassembler.cpp Tue Mar 12 20:55:16 2013
@@ -1190,7 +1190,7 @@ PseudoInstruction::~PseudoInstruction ()
 }
      
 bool
-PseudoInstruction::DoesBranch () const
+PseudoInstruction::DoesBranch ()
 {
     // This is NOT a valid question for a pseudo instruction.
     return false;

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=176922&r1=176921&r2=176922&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp (original)
+++ lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp Tue Mar 12 20:55:16 2013
@@ -73,11 +73,61 @@ public:
     }
         
     virtual bool
-    DoesBranch () const
+    DoesBranch ()
     {
+        if (m_does_branch == eLazyBoolCalculate)
+        {
+            m_disasm.Lock(this, NULL);
+            DataExtractor data;
+            if (m_opcode.GetData(data))
+            {
+                bool is_alternate_isa;
+                lldb::addr_t pc = m_address.GetFileAddress();
+
+                DisassemblerLLVMC::LLVMCDisassembler *mc_disasm_ptr = GetDisasmToUse (is_alternate_isa);
+                uint8_t *opcode_data = const_cast<uint8_t *>(data.PeekData (0, 1));
+                const size_t opcode_data_len = data.GetByteSize();
+                llvm::MCInst inst;
+                size_t inst_size = mc_disasm_ptr->GetMCInst(opcode_data,
+                                                            opcode_data_len,
+                                                            pc,
+                                                            inst);
+                // Be conservative, if we didn't understand the instruction, say it might branch...
+                if (inst_size == 0)
+                    m_does_branch = eLazyBoolYes;
+                else
+                {
+                    bool can_branch = mc_disasm_ptr->CanBranch(inst);
+                    if (can_branch)
+                        m_does_branch = eLazyBoolYes;
+                    else
+                        m_does_branch = eLazyBoolNo;
+                }
+            }
+            m_disasm.Unlock();
+        }
         return m_does_branch == eLazyBoolYes;
     }
     
+    DisassemblerLLVMC::LLVMCDisassembler *
+    GetDisasmToUse (bool &is_alternate_isa)
+    {
+        DisassemblerLLVMC::LLVMCDisassembler *mc_disasm_ptr = m_disasm.m_disasm_ap.get();
+        
+        is_alternate_isa = false;
+        if (m_disasm.m_alternate_disasm_ap.get() != NULL)
+        {
+            const AddressClass address_class = GetAddressClass ();
+        
+            if (address_class == eAddressClassCodeAlternateISA)
+            {
+                mc_disasm_ptr = m_disasm.m_alternate_disasm_ap.get();
+                is_alternate_isa = true;
+            }
+        }
+         return mc_disasm_ptr;
+    }
+    
     virtual size_t
     Decode (const lldb_private::Disassembler &disassembler,
             const lldb_private::DataExtractor &data,
@@ -126,9 +176,9 @@ public:
         }
         if (!got_op)
         {
-            DisassemblerLLVMC::LLVMCDisassembler *mc_disasm_ptr = m_disasm.m_disasm_ap.get();
+            bool is_alternate_isa = false;
+            DisassemblerLLVMC::LLVMCDisassembler *mc_disasm_ptr = GetDisasmToUse (is_alternate_isa);
             
-            bool is_altnernate_isa = false;
             if (m_disasm.m_alternate_disasm_ap.get() != NULL)
             {
                 const AddressClass address_class = GetAddressClass ();
@@ -136,14 +186,14 @@ public:
                 if (address_class == eAddressClassCodeAlternateISA)
                 {
                     mc_disasm_ptr = m_disasm.m_alternate_disasm_ap.get();
-                    is_altnernate_isa = true;
+                    is_alternate_isa = true;
                 }
             }
             
             const llvm::Triple::ArchType machine = arch.GetMachine();
             if (machine == llvm::Triple::arm || machine == llvm::Triple::thumb)
             {
-                if (machine == llvm::Triple::thumb || is_altnernate_isa)
+                if (machine == llvm::Triple::thumb || is_alternate_isa)
                 {
                     uint32_t thumb_opcode = data.GetU16(&data_offset);
                     if ((thumb_opcode & 0xe000) != 0xe000 || ((thumb_opcode & 0x1800u) == 0))





More information about the lldb-commits mailing list