From 82b74d3cb69055a4f2a25e827e31da35ae19e650 Mon Sep 17 00:00:00 2001 From: Alvaro Sanchez-Leon Date: Mon, 22 Feb 2016 19:24:33 +0100 Subject: [PATCH] Bug 489398 - Support memory spaces in IExpressionDMAdress When an address is resolved from an expression, the resulting address may carry a memory space provided by the backend to associate this address to a particular memory space. The current interface for the memory space service (e.g. IMemorySpaces2) can be used to parse the memory space contained in the expression. This update adds: 1) A new API method to resolve the memory space of an IExpressionDMAddress instance 2) The use of the memory space service to attempt to resolve the memory space. Note: if there is no memory space service, the memory space defaults to an empty string, which does not affect the default behaviour i.e. when memory spaces are not used. Change-Id: Idfe5669b26f84ee4e3e78f96f229ced75e6ec5c3 --- .../cdt/dsf/mi/service/MIExpressions.java | 52 +++++++++++++++++-- .../.settings/.api_filters | 11 ++++ dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF | 2 +- dsf/org.eclipse.cdt.dsf/pom.xml | 2 +- .../cdt/dsf/debug/service/IExpressions.java | 8 +++ 5 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 dsf/org.eclipse.cdt.dsf/.settings/.api_filters diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java index 050f810a1e1..25b5d9a921f 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java @@ -39,6 +39,8 @@ import org.eclipse.cdt.dsf.debug.service.IExpressions3; import org.eclipse.cdt.dsf.debug.service.IFormattedValues; import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryChangedEvent; import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext; +import org.eclipse.cdt.dsf.debug.service.IMemorySpaces; +import org.eclipse.cdt.dsf.debug.service.IMemorySpaces.DecodeResult; import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerSuspendedDMEvent; import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext; @@ -74,6 +76,7 @@ import org.eclipse.cdt.dsf.service.DsfServicesTracker; import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.cdt.utils.Addr32; import org.eclipse.cdt.utils.Addr64; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.osgi.framework.BundleContext; @@ -597,6 +600,7 @@ public class MIExpressions extends AbstractDsfService implements IMIExpressions, protected static class ExpressionDMAddress implements IExpressionDMAddress { IAddress fAddr; int fSize; + String fMemSpace = ""; //$NON-NLS-1$ public ExpressionDMAddress(IAddress addr, int size) { fAddr = addr; @@ -615,17 +619,34 @@ public class MIExpressions extends AbstractDsfService implements IMIExpressions, } } + /** + * @since 5.0 + */ + public ExpressionDMAddress(String addrStr, int size, String memSpace) { + this(addrStr, size); + fMemSpace = memSpace; + } + @Override public IAddress getAddress() { return fAddr; } @Override public int getSize() { return fSize; } + + /** + * @since 5.0 + */ + @Override + public String getMemorySpaceID() { + return fMemSpace; + } @Override public boolean equals(Object other) { if (other instanceof ExpressionDMAddress) { ExpressionDMAddress otherAddr = (ExpressionDMAddress) other; - return (fSize == otherAddr.getSize()) && - (fAddr == null ? otherAddr.getAddress() == null : fAddr.equals(otherAddr.getAddress())); + boolean sameAddr = fAddr == null ? otherAddr.getAddress() == null : fAddr.equals(otherAddr.getAddress()); + boolean sameMemSpace = fMemSpace == null ? otherAddr.getMemorySpaceID() == null : fMemSpace.equals(otherAddr.getMemorySpaceID()); + return (fSize == otherAddr.getSize()) && sameAddr && sameMemSpace; } return false; } @@ -951,6 +972,7 @@ public class MIExpressions extends AbstractDsfService implements IMIExpressions, * In this case, some errors should not be reported. */ private boolean fTraceVisualization; + private IMemorySpaces fMemorySpaceService; public MIExpressions(DsfSession session) { super(session); @@ -1013,6 +1035,8 @@ public class MIExpressions extends AbstractDsfService implements IMIExpressions, fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory(); + fMemorySpaceService = getServicesTracker().getService(IMemorySpaces.class); + requestMonitor.done(); } @@ -1222,7 +1246,7 @@ public class MIExpressions extends AbstractDsfService implements IMIExpressions, */ @Override public void getExpressionAddressData( - IExpressionDMContext dmc, + final IExpressionDMContext dmc, final DataRequestMonitor rm) { if (dmc instanceof MIExpressionDMC) { @@ -1256,7 +1280,25 @@ public class MIExpressions extends AbstractDsfService implements IMIExpressions, @Override protected void handleSuccess() { String tmpAddrStr = getData().getValue(); - + + DecodeResult memSpaceParsed = null; + if (fMemorySpaceService != null) { + try { + memSpaceParsed = fMemorySpaceService + .decodeAddress(tmpAddrStr); + } catch (CoreException e1) { + // No memory space id found + } + } + + String tMemSpace = ""; //$NON-NLS-1$ + if (memSpaceParsed != null) { + tmpAddrStr = memSpaceParsed.getExpression(); + tMemSpace = memSpaceParsed.getMemorySpaceId(); + } + + final String memSpaceId = tMemSpace; + // Deal with addresses of contents of a char* which is in // the form of "0x12345678 \"This is a string\"" int split = tmpAddrStr.indexOf(' '); @@ -1270,7 +1312,7 @@ public class MIExpressions extends AbstractDsfService implements IMIExpressions, protected void handleSuccess() { try { int size = Integer.parseInt(getData().getValue()); - rm.setData(new ExpressionDMAddress(addrStr, size)); + rm.setData(new ExpressionDMAddress(addrStr, size, memSpaceId)); } catch (NumberFormatException e) { rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_HANDLE, "Unexpected size format from backend: " + getData().getValue(), null)); //$NON-NLS-1$ diff --git a/dsf/org.eclipse.cdt.dsf/.settings/.api_filters b/dsf/org.eclipse.cdt.dsf/.settings/.api_filters new file mode 100644 index 00000000000..346ffc91488 --- /dev/null +++ b/dsf/org.eclipse.cdt.dsf/.settings/.api_filters @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF b/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF index 209784be28d..9b98557f9b7 100644 --- a/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF +++ b/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-SymbolicName: org.eclipse.cdt.dsf;singleton:=true -Bundle-Version: 2.6.0.qualifier +Bundle-Version: 2.7.0.qualifier Bundle-Activator: org.eclipse.cdt.dsf.internal.DsfPlugin Bundle-Localization: plugin Require-Bundle: org.eclipse.core.runtime, diff --git a/dsf/org.eclipse.cdt.dsf/pom.xml b/dsf/org.eclipse.cdt.dsf/pom.xml index c0d531f35bf..296ade40834 100644 --- a/dsf/org.eclipse.cdt.dsf/pom.xml +++ b/dsf/org.eclipse.cdt.dsf/pom.xml @@ -11,7 +11,7 @@ ../../pom.xml - 2.6.0-SNAPSHOT + 2.7.0-SNAPSHOT org.eclipse.cdt.dsf eclipse-plugin diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/service/IExpressions.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/service/IExpressions.java index 4f146995e6c..cbe316d3a60 100644 --- a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/service/IExpressions.java +++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/service/IExpressions.java @@ -98,6 +98,14 @@ public interface IExpressions extends IFormattedValues { * Returns the size of the address. */ int getSize(); + + /** + * @return The memory space + * @since 2.7 + */ + default String getMemorySpaceID() { + return ""; + } } /**