[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-debug-dev] PATCH: View variables in binary format
|
This patch implements support for viewing variables (or registers) in
binary format. CVariableFormat already had a BINARY tag, but it was
unused. I tested this patch by using the Cygwin debugger from Eclipse.
There are three patch files attached: for cdt.core, cdt.debug.core, and
cdt.debug.ui.
--
Mark Mitchell
CodeSourcery
mark@xxxxxxxxxxxxxxxx
(650) 331-3385 x713
Index: src/org/eclipse/cdt/core/IAddress.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/IAddress.java,v
retrieving revision 1.4
diff -u -r1.4 IAddress.java
--- src/org/eclipse/cdt/core/IAddress.java 27 Jun 2005 03:46:47 -0000 1.4
+++ src/org/eclipse/cdt/core/IAddress.java 14 Apr 2006 23:59:01 -0000
@@ -103,6 +103,16 @@
*/
String toHexAddressString();
+
+ /**
+ * Converts address to the hex representation with '0b' prefix and
+ * with all leading zeros. The length of returned string should be
+ * the same for all addresses of given class. I.e. 34 for 32-bit
+ * addresses and 66 for 64-bit addresses
+ * @return
+ */
+ String toBinaryAddressString();
+
/**
* Returns amount of symbols in hex representation. Is identical to
* toHexAddressString().length(). It is present for perfomance purpose.
Index: utils/org/eclipse/cdt/utils/Addr32.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr32.java,v
retrieving revision 1.4
diff -u -r1.4 Addr32.java
--- utils/org/eclipse/cdt/utils/Addr32.java 27 Jun 2005 03:46:47 -0000 1.4
+++ utils/org/eclipse/cdt/utils/Addr32.java 14 Apr 2006 23:59:01 -0000
@@ -26,6 +26,8 @@
private static final int BYTES_NUM = 4;
private static final int DIGITS_NUM = BYTES_NUM * 2;
private static final int CHARS_NUM = DIGITS_NUM + 2;
+ private static final int BINARY_DIGITS_NUM = BYTES_NUM * 8;
+ private static final int BINARY_CHARS_NUM = BINARY_DIGITS_NUM + 2;
private final long address;
@@ -131,6 +133,18 @@
return sb.toString();
}
+ public String toBinaryAddressString() {
+ String addressString = Long.toString(address, 2);
+ StringBuffer sb = new StringBuffer(BINARY_CHARS_NUM);
+ int count = BINARY_DIGITS_NUM - addressString.length();
+ sb.append("0b"); //$NON-NLS-1$
+ for (int i = 0; i < count; ++i) {
+ sb.append('0');
+ }
+ sb.append(addressString);
+ return sb.toString();
+ }
+
public int getCharsNum() {
return CHARS_NUM;
}
Index: utils/org/eclipse/cdt/utils/Addr64.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Addr64.java,v
retrieving revision 1.4
diff -u -r1.4 Addr64.java
--- utils/org/eclipse/cdt/utils/Addr64.java 27 Jun 2005 03:46:47 -0000 1.4
+++ utils/org/eclipse/cdt/utils/Addr64.java 14 Apr 2006 23:59:01 -0000
@@ -24,6 +24,8 @@
private static final int BYTES_NUM = 8;
private static final int DIGITS_NUM = BYTES_NUM * 2;
private static final int CHARS_NUM = DIGITS_NUM + 2;
+ private static final int BINARY_DIGITS_NUM = BYTES_NUM * 8;
+ private static final int BINARY_CHARS_NUM = BINARY_DIGITS_NUM + 2;
private final BigInteger address;
@@ -126,6 +128,18 @@
return sb.toString();
}
+ public String toBinaryAddressString() {
+ String addressString = address.toString(2);
+ StringBuffer sb = new StringBuffer(BINARY_CHARS_NUM);
+ int count = BINARY_DIGITS_NUM - addressString.length();
+ sb.append("0b"); //$NON-NLS-1$
+ for (int i = 0; i < count; ++i) {
+ sb.append('0');
+ }
+ sb.append(addressString);
+ return sb.toString();
+ }
+
public int getCharsNum() {
return CHARS_NUM;
}
Index: src/org/eclipse/cdt/debug/internal/core/model/CValue.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CValue.java,v
retrieving revision 1.60
diff -u -r1.60 CValue.java
--- src/org/eclipse/cdt/debug/internal/core/model/CValue.java 29 Jul 2005 02:12:02 -0000 1.60
+++ src/org/eclipse/cdt/debug/internal/core/model/CValue.java 14 Apr 2006 23:59:55 -0000
@@ -239,6 +239,12 @@
sb.append( (stringValue.length() > 2) ? stringValue.substring( stringValue.length() - 2 ) : stringValue );
return sb.toString();
}
+ else if ( CVariableFormat.BINARY.equals( format ) ) {
+ StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$
+ String stringValue = (isUnsigned()) ? Integer.toBinaryString( value.shortValue() ) : Integer.toBinaryString( (byte)value.byteValue() );
+ sb.append( (stringValue.length() > 8) ? stringValue.substring( stringValue.length() - 8 ) : stringValue );
+ return sb.toString();
+ }
return null;
}
@@ -253,6 +259,12 @@
sb.append( (stringValue.length() > 4) ? stringValue.substring( stringValue.length() - 4 ) : stringValue );
return sb.toString();
}
+ else if ( CVariableFormat.BINARY.equals( format ) ) {
+ StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$
+ String stringValue = Integer.toBinaryString( (isUnsigned()) ? value.intValue() : value.shortValue() );
+ sb.append( (stringValue.length() > 16) ? stringValue.substring( stringValue.length() - 16 ) : stringValue );
+ return sb.toString();
+ }
return null;
}
@@ -267,6 +279,12 @@
sb.append( (stringValue.length() > 8) ? stringValue.substring( stringValue.length() - 8 ) : stringValue );
return sb.toString();
}
+ else if ( CVariableFormat.BINARY.equals( format ) ) {
+ StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$
+ String stringValue = (isUnsigned()) ? Long.toBinaryString( value.longValue() ) : Integer.toBinaryString( value.intValue() );
+ sb.append( (stringValue.length() > 32) ? stringValue.substring( stringValue.length() - 32 ) : stringValue );
+ return sb.toString();
+ }
return null;
}
@@ -290,6 +308,16 @@
sb.append( Long.toHexString( value.longValue() ) );
return sb.toString();
}
+ else if ( CVariableFormat.BINARY.equals( format ) ) {
+ StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$
+ if ( isUnsigned() ) {
+ BigInteger bigValue = new BigInteger( value.getValueString() );
+ sb.append( bigValue.toString( 2 ) );
+ }
+ else
+ sb.append( Long.toBinaryString( value.longValue() ) );
+ return sb.toString();
+ }
}
catch( NumberFormatException e ) {
}
@@ -316,6 +344,16 @@
sb.append( Long.toHexString( value.longValue() ) );
return sb.toString();
}
+ else if ( CVariableFormat.BINARY.equals( format ) ) {
+ StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$
+ if ( isUnsigned() ) {
+ BigInteger bigValue = new BigInteger( value.getValueString() );
+ sb.append( bigValue.toString( 2 ) );
+ }
+ else
+ sb.append( Long.toBinaryString( value.longValue() ) );
+ return sb.toString();
+ }
}
catch( NumberFormatException e ) {
}
@@ -341,6 +379,12 @@
sb.append( (stringValue.length() > 8) ? stringValue.substring( stringValue.length() - 8 ) : stringValue );
return sb.toString();
}
+ else if ( CVariableFormat.BINARY.equals( format ) ) {
+ StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$
+ String stringValue = Long.toBinaryString( longValue );
+ sb.append( (stringValue.length() > 32) ? stringValue.substring( stringValue.length() - 32 ) : stringValue );
+ return sb.toString();
+ }
return null;
}
@@ -363,6 +407,12 @@
sb.append( (stringValue.length() > 16) ? stringValue.substring( stringValue.length() - 16 ) : stringValue );
return sb.toString();
}
+ else if ( CVariableFormat.BINARY.equals( format ) ) {
+ StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$
+ String stringValue = Long.toHexString( longValue );
+ sb.append( (stringValue.length() > 64) ? stringValue.substring( stringValue.length() - 64 ) : stringValue );
+ return sb.toString();
+ }
return null;
}
@@ -380,6 +430,8 @@
return address.toHexAddressString();
if ( CVariableFormat.DECIMAL.equals( format ) )
return address.toString();
+ if ( CVariableFormat.BINARY.equals( format ) )
+ return address.toBinaryAddressString();
return null;
}
@@ -397,6 +449,12 @@
sb.append( (stringValue.length() > 4) ? stringValue.substring( stringValue.length() - 4 ) : stringValue );
return sb.toString();
}
+ else if ( CVariableFormat.BINARY.equals( format ) ) {
+ StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$
+ String stringValue = Integer.toBinaryString( (isUnsigned()) ? value.intValue() : value.shortValue() );
+ sb.append( (stringValue.length() > 16) ? stringValue.substring( stringValue.length() - 16 ) : stringValue );
+ return sb.toString();
+ }
}
if ( size == 4 ) {
CVariableFormat format = getParentVariable().getFormat();
@@ -409,6 +467,12 @@
sb.append( (stringValue.length() > 8) ? stringValue.substring( stringValue.length() - 8 ) : stringValue );
return sb.toString();
}
+ else if ( CVariableFormat.BINARY.equals( format ) ) {
+ StringBuffer sb = new StringBuffer( "0b" ); //$NON-NLS-1$
+ String stringValue = (isUnsigned()) ? Long.toBinaryString( value.longValue() ) : Integer.toHexString( value.intValue() );
+ sb.append( (stringValue.length() > 32) ? stringValue.substring( stringValue.length() - 32 ) : stringValue );
+ return sb.toString();
+ }
}
}
return value.getValueString();
Index: plugin.properties
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-debug/org.eclipse.cdt.debug.ui/plugin.properties,v
retrieving revision 1.86
diff -u -r1.86 plugin.properties
--- plugin.properties 23 Jun 2005 16:00:55 -0000 1.86
+++ plugin.properties 15 Apr 2006 00:00:07 -0000
@@ -59,6 +59,7 @@
HexVariableFormatAction.label=Hexadecimal
DecVariableFormatAction.label=Decimal
NaturalVariableFormatAction.label=Natural
+BinaryVariableFormatAction.label=Binary
CDebugActionGroup.name=C/C++ Debug
Index: plugin.xml
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-debug/org.eclipse.cdt.debug.ui/plugin.xml,v
retrieving revision 1.158.2.3
diff -u -r1.158.2.3 plugin.xml
--- plugin.xml 30 Jan 2006 15:06:14 -0000 1.158.2.3
+++ plugin.xml 15 Apr 2006 00:00:08 -0000
@@ -411,6 +411,13 @@
enablesFor="1"
id="org.eclipse.cdt.debug.internal.ui.actions.NaturalVariableFormatActionDelegate">
</action>
+ <action
+ class="org.eclipse.cdt.debug.internal.ui.actions.BinaryVariableFormatActionDelegate"
+ enablesFor="1"
+ helpContextId="binary_variable_format_action_context"
+ id="org.eclipse.cdt.debug.internal.ui.actions.BinaryVariableFormatActionDelegate"
+ label="%BinaryVariableFormatAction.label"
+ menubarPath="org.eclipse.cdt.debug.ui.CVariableFormatMenu/formatGroup"/>
</objectContribution>
<objectContribution
objectClass="org.eclipse.cdt.debug.core.model.ICSignal"
Index: src/org/eclipse/cdt/debug/internal/ui/actions/BinaryVariableFormatActionDelegate.java
===================================================================
RCS file: src/org/eclipse/cdt/debug/internal/ui/actions/BinaryVariableFormatActionDelegate.java
diff -N src/org/eclipse/cdt/debug/internal/ui/actions/BinaryVariableFormatActionDelegate.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/debug/internal/ui/actions/BinaryVariableFormatActionDelegate.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 QNX Software Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * QNX Software Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.debug.internal.ui.actions;
+
+import org.eclipse.cdt.debug.core.model.CVariableFormat;
+
+/**
+ * The delegate of the "Binary Format" action.
+ */
+public class BinaryVariableFormatActionDelegate extends VariableFormatActionDelegate {
+
+ /**
+ * Constructor for BinaryVariableFormatActionDelegate.
+ */
+ public BinaryVariableFormatActionDelegate() {
+ super( CVariableFormat.BINARY );
+ }
+}