[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdesdk/kcachegrind/libviews
From:       Josef Weidendorfer <josef.weidendorfer () gmx ! de>
Date:       2011-10-31 21:24:55
Message-ID: 20111031212455.0B042AC88A () svn ! kde ! org
[Download RAW message or body]

SVN commit 1261928 by weidendo:

Fix objdump output parser on ARM

For regular ARM code, objdump groups machine code into
groups a 4 bytes (8 hex digits), and thumb machine code
into groups of 2 byte.

 M  +24 -6     instrview.cpp  


--- trunk/KDE/kdesdk/kcachegrind/libviews/instrview.cpp #1261927:1261928
@@ -61,6 +61,11 @@
     return addr;
 }
 
+static bool isHexDigit(char c)
+{
+    return (c >='0' && c <='9') || (c >='a' && c <='f');
+}
+
 /**
  * Parses a line from objdump assembly output, returning false for
  * a line without an assembly instruction. Otherwise, it sets the
@@ -84,16 +89,29 @@
     pos++;
     while(buf[pos]==' ' || buf[pos]=='\t') pos++;
 
-    // check for hex code, pattern "xx "* (with "x" being a lower case hex digit)
+    // check for hex code, patterns "xx "* / "xxxx "* / "xxxxxxxx"
+    // (with "x" being a lower case hex digit)
     start = pos;
     while(1) {
-	if (! ((buf[pos]>='0' && buf[pos]<='9') ||
-	       (buf[pos]>='a' && buf[pos]<='f')) ) break;
-	if (! ((buf[pos+1]>='0' && buf[pos+1]<='9') ||
-	       (buf[pos+1]>='a' && buf[pos+1]<='f')) ) break;
-	if (buf[pos+2] != ' ') break;
+        if (! isHexDigit(buf[pos])) break;
+        if (! isHexDigit(buf[pos+1])) break;
+        if (buf[pos+2] == ' ') {
 	pos += 3;
+            continue;
     }
+        if (! isHexDigit(buf[pos+2])) break;
+        if (! isHexDigit(buf[pos+3])) break;
+        if (buf[pos+4] == ' ') {
+            pos += 5;
+            continue;
+        }
+        if (! isHexDigit(buf[pos+4])) break;
+        if (! isHexDigit(buf[pos+5])) break;
+        if (! isHexDigit(buf[pos+6])) break;
+        if (! isHexDigit(buf[pos+7])) break;
+        if (buf[pos+8] != ' ') break;
+        pos += 9;
+    }
     if (pos <= start) return false;
     code = QString::fromAscii(buf + start, pos - start - 1);
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic