[Lldb-commits] [lldb] r137991 - /lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp

Johnny Chen johnny.chen at apple.com
Thu Aug 18 15:05:58 PDT 2011


Author: johnny
Date: Thu Aug 18 17:05:58 2011
New Revision: 137991

URL: http://llvm.org/viewvc/llvm-project?rev=137991&view=rev
Log:
Apply some workaround for known crashers.

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

Modified: lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp?rev=137991&r1=137990&r2=137991&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp (original)
+++ lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp Thu Aug 18 17:05:58 2011
@@ -132,6 +132,13 @@
     if (!Str.empty() && Str.back() == c)
         Str = Str.substr(0, Str.size()-1);
 }
+static inline void RStripNumber(llvm::StringRef &Str)
+{
+    while (!Str.empty() && isnumber(Str.back()))
+        Str = Str.substr(0, Str.size()-1);
+    if (!Str.empty() && Str.back() == '-')
+        Str = Str.substr(0, Str.size()-1);
+}
 // Aligns the raw disassembly (passed as 'str') with the rest of edis'ed disassembly output.
 // This is called from non-raw mode when edis of the current m_inst fails for some reason.
 static void
@@ -146,6 +153,19 @@
         PadString(s, p.second, operandColWidth);
 }
 
+static bool
+apply_workaround(const char *str)
+{
+  llvm::StringRef Str(str);
+  StripSpaces(Str);
+  if (Str.startswith("mov.w")) {
+      RStripNumber(Str);
+      if (Str.endswith("#"))
+          return true;
+  }
+  return false;
+}
+
 #define AlignPC(pc_val) (pc_val & 0xFFFFFFFC)
 void
 InstructionLLVM::Dump
@@ -212,7 +232,16 @@
     */
     /* .... when we fix the edis for arm/thumb. */
 
-    if (!raw)
+    const char *lookahead;
+    bool workaround = false;
+    if (EDGetInstString(&lookahead, m_inst)) // 0 on success
+      return;
+    else if (m_arch_type == llvm::Triple::thumb) {
+        if (apply_workaround(lookahead))
+            workaround = true;
+    }
+
+    if (!raw && !workaround)
         numTokens = EDNumTokens(m_inst);
 
     int currentOpIndex = -1;





More information about the lldb-commits mailing list