From 43bb02ca8690234105827f9ea278d71c3d5b5376 Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Wed, 9 Oct 2002 21:12:03 +0000 Subject: [PATCH] Implementing MIDisassemble parsing. --- .../cdt/debug/mi/core/output/MIAsm.java | 62 +++----------- .../mi/core/output/MIDataDisassembleInfo.java | 59 +++++++++---- .../cdt/debug/mi/core/output/MISrcAsm.java | 85 +++++++++++++++++++ 3 files changed, 139 insertions(+), 67 deletions(-) create mode 100644 debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MISrcAsm.java diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java index cc304fdee9a..d7332a0ace9 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java @@ -10,13 +10,11 @@ package org.eclipse.cdt.debug.mi.core.output; */ public class MIAsm { long address; - String func = ""; + String function = ""; long offset; - String inst = ""; - int line; - String file = ""; + String instruction = ""; - public MIAsm(MITuple tuple) { + public MIAsm (MITuple tuple) { parse(tuple); } @@ -25,7 +23,7 @@ public class MIAsm { } public String getFunction() { - return func; + return function; } public long getOffset() { @@ -33,33 +31,17 @@ public class MIAsm { } public String getInstruction() { - return inst; - } - - public int getLine() { - return line; - } - - public String getFile() { - return file; + return instruction; } public String toString() { StringBuffer buffer = new StringBuffer(); - if (file.length() > 0) { - buffer.append("line=\"").append(line); - buffer.append("file=\"" + file + "\","); - buffer.append("line_asm_insn=["); - } buffer.append('{'); buffer.append("address=\"" + Long.toHexString(address) +"\""); - buffer.append(",func-name=\"" + func + "\""); + buffer.append(",func-name=\"" + function + "\""); buffer.append(",offset=\"").append(offset).append('"'); - buffer.append(",inst=\"" + inst + "\""); + buffer.append(",inst=\"" + instruction + "\""); buffer.append('}'); - if (file.length() > 0) { - buffer.append(']'); - } return buffer.toString(); } @@ -70,48 +52,24 @@ public class MIAsm { MIValue value = results[i].getMIValue(); String str = ""; - // Recurse. - if (value instanceof MITuple) { - parse((MITuple)value); - continue; - } - - if (value != null && value instanceof MIConst) { str = ((MIConst)value).getCString(); } - if (var.equals("line_asm_insn")) { - if (value instanceof MIList) { - MIList l = (MIList)value; - MIValue[] values = l.getMIValues(); - for (int j = 0; j < values.length; j++) { - if (values[j] instanceof MITuple) { - parse((MITuple)values[j]); - } - } - } - } else if (var.equals("address")) { + if (var.equals("address")) { try { address = Long.decode(str.trim()).longValue(); } catch (NumberFormatException e) { } } else if (var.equals("func-name")) { - func = str; + function = str; } else if (var.equals("offset")) { try { offset = Long.decode(str.trim()).longValue(); } catch (NumberFormatException e) { } } else if (var.equals("inst")) { - inst = str; - } else if (var.equals("line")) { - try { - line = Integer.parseInt(str.trim()); - } catch (NumberFormatException e) { - } - } else if (var.equals("file")) { - file = str; + instruction = str; } } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java index 0953a421656..a3a41dbfa3f 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java @@ -13,30 +13,56 @@ import java.util.List; */ public class MIDataDisassembleInfo extends MIInfo { - MIAsm[] asms; + MISrcAsm[] src_asm; + MIAsm[] asm; + boolean mixed; public MIDataDisassembleInfo(MIOutput rr) { super(rr); + mixed = false; + parse(); } - public MIAsm[] getAsm() { - if (asms == null) { - parse(); - } - return asms; + public MIAsm[] getMIAsms() { + return asm; + } + + public boolean isMixed() { + return mixed; + } + + public MISrcAsm[] getMISrcAsms() { + return src_asm; } public String toString() { - MIAsm[] asms = getAsm(); StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < asms.length; i++) { - buffer.append(asms[i].toString()); + buffer.append("asm_insns=["); + + if (isMixed()) { + MISrcAsm[] array = getMISrcAsms(); + for (int i = 0; i < array.length; i++) { + if (i != 0) { + buffer.append(','); + } + buffer.append(array[i].toString()); + } + } else { + MIAsm[] array = getMIAsms(); + for (int i = 0; i < array.length; i++) { + if (i != 0) { + buffer.append(','); + } + buffer.append(array[i].toString()); + } } + buffer.append("]"); return buffer.toString(); } void parse() { - List aList = new ArrayList(); + List asmList = new ArrayList(); + List srcList = new ArrayList(); if (isDone()) { MIOutput out = getMIOutput(); MIResultRecord rr = out.getMIResultRecord(); @@ -47,16 +73,17 @@ public class MIDataDisassembleInfo extends MIInfo { if (var.equals("asm_insns")) { MIValue value = results[i].getMIValue(); if (value instanceof MIList) { - parse((MIList)value, aList); + parse((MIList)value, srcList, asmList); } } } } } - asms = (MIAsm[])aList.toArray(new MIAsm[aList.size()]); + src_asm = (MISrcAsm[])srcList.toArray(new MISrcAsm[srcList.size()]); + asm = (MIAsm[])asmList.toArray(new MIAsm[asmList.size()]); } - void parse(MIList list, List aList) { + void parse(MIList list, List srcList, List asmList) { // src and assenbly is different // Mixed mode. @@ -67,10 +94,11 @@ public class MIDataDisassembleInfo extends MIInfo { if (var.equals("src_and_asm_line")) { MIValue value = results[i].getMIValue(); if (value instanceof MITuple) { - aList.add(new MIAsm((MITuple)value)); + srcList.add(new MISrcAsm((MITuple)value)); } } } + mixed = true; } // Non Mixed with source @@ -78,9 +106,10 @@ public class MIDataDisassembleInfo extends MIInfo { if (values != null && values.length > 0) { for (int i = 0; i < values.length; i++) { if (values[i] instanceof MITuple) { - aList.add(new MIAsm((MITuple)values[i])); + asmList.add(new MIAsm((MITuple)values[i])); } } + mixed = false; } } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MISrcAsm.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MISrcAsm.java new file mode 100644 index 00000000000..12921c67892 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MISrcAsm.java @@ -0,0 +1,85 @@ +/* + * (c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ +package org.eclipse.cdt.debug.mi.core.output; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represent a GDB Tuple MI assembly response. + */ +public class MISrcAsm { + int line; + String file = ""; + MIAsm[] asm; + + public MISrcAsm(MITuple tuple) { + parse(tuple); + } + + public int getLine() { + return line; + } + + public String getFile() { + return file; + } + + public MIAsm[] getMIAsms() { + return asm; + } + + public String toString() { + StringBuffer buffer = new StringBuffer(); + buffer.append("src_and_asm_line={"); + buffer.append("line=\"").append(line).append('"'); + buffer.append(",file=\"" + file + "\","); + buffer.append("line_asm_insn=["); + for (int i = 0; i < asm.length; i++) { + if (i != 0) { + buffer.append(','); + } + buffer.append(asm[i].toString()); + } + buffer.append(']'); + buffer.append('}'); + return buffer.toString(); + } + + void parse(MITuple tuple) { + List aList = new ArrayList(); + MIResult[] results = tuple.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + MIValue value = results[i].getMIValue(); + String str = ""; + + if (value != null && value instanceof MIConst) { + str = ((MIConst)value).getCString(); + } + + if (var.equals("line_asm_insn")) { + if (value instanceof MIList) { + MIList list = (MIList)value; + MIValue[] values = list.getMIValues(); + for (int j = 0; j < values.length; j++) { + if (values[j] instanceof MITuple) { + aList.add(new MIAsm((MITuple)values[j])); + } + } + } + } if (var.equals("line")) { + try { + line = Integer.parseInt(str.trim()); + } catch (NumberFormatException e) { + } + } else if (var.equals("file")) { + file = str; + } + } + asm = (MIAsm[])aList.toArray(new MIAsm[aList.size()]); + } +}