1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 06:32:10 +02:00

Bug 328168 - Disassembly view does not align address enter new address manually

This commit is contained in:
Patrick Chuong 2010-12-21 16:53:48 +00:00
parent 9551d8a724
commit 581d1af49f
2 changed files with 175 additions and 93 deletions

View file

@ -10,6 +10,7 @@
* Freescale Semiconductor - refactoring
* Patrick Chuong (Texas Instruments) - Bug 323279
* Patrick Chuong (Texas Instruments) - Bug fix (329682)
* Patrick Chuong (Texas Instruments) - Bug 328168
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.internal.ui.disassembly;
@ -36,6 +37,7 @@ import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IDisassembly;
import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext;
import org.eclipse.cdt.dsf.debug.service.IDisassembly2;
import org.eclipse.cdt.dsf.debug.service.IExpressions;
import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMAddress;
import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
@ -478,7 +480,7 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
/* (non-Javadoc)
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.IDisassemblyBackend#retrieveDisassembly(java.math.BigInteger, java.math.BigInteger, java.lang.String, int, int, boolean, boolean, boolean, int)
*/
public void retrieveDisassembly(final BigInteger startAddress, BigInteger endAddress, final String file, final int lineNumber, final int lines, boolean mixed, final boolean showSymbols, final boolean showDisassembly, final int linesHint) {
public void retrieveDisassembly(final BigInteger startAddress, BigInteger endAddress, final String file, final int lineNumber, final int lines, final boolean mixed, final boolean showSymbols, final boolean showDisassembly, final int linesHint) {
// make sure address range is no less than 32 bytes
// this is an attempt to get better a response from the backend (bug 302505)
final BigInteger finalEndAddress= startAddress.add(BigInteger.valueOf(32)).max(endAddress);
@ -491,6 +493,15 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
final DsfExecutor executor= session.getExecutor();
final IDisassemblyDMContext context= DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
// align the start address first (bug 328168)
executor.execute(new Runnable() {
public void run() {
alignOpCodeAddress(startAddress, new DataRequestMonitor<BigInteger>(executor, null) {
@Override
public void handleCompleted() {
final BigInteger finalStartAddress = getData();
if (mixed) {
final DataRequestMonitor<IMixedInstruction[]> disassemblyRequest= new DataRequestMonitor<IMixedInstruction[]>(executor, null) {
@Override
@ -499,9 +510,9 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
if (!isCanceled() && data != null) {
fCallback.asyncExec(new Runnable() {
public void run() {
if (!insertDisassembly(startAddress, finalEndAddress, data, showSymbols, showDisassembly)) {
if (!insertDisassembly(finalStartAddress, finalEndAddress, data, showSymbols, showDisassembly)) {
// retry in non-mixed mode
fCallback.retrieveDisassembly(startAddress, finalEndAddress, linesHint, false, true);
fCallback.retrieveDisassembly(finalStartAddress, finalEndAddress, linesHint, false, true);
}
}});
} else {
@ -510,7 +521,7 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
if( file != null ) {
fCallback.asyncExec(new Runnable() {
public void run() {
fCallback.retrieveDisassembly(startAddress, finalEndAddress, linesHint, true, true);
fCallback.retrieveDisassembly(finalStartAddress, finalEndAddress, linesHint, true, true);
}});
}
else {
@ -518,7 +529,7 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
public void run() {
fCallback.doScrollLocked(new Runnable() {
public void run() {
fCallback.insertError(startAddress, status.getMessage());
fCallback.insertError(finalStartAddress, status.getMessage());
}
});
}});
@ -548,7 +559,7 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
disassemblyRequest.done();
return;
}
disassembly.getMixedInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
disassembly.getMixedInstructions(context, finalStartAddress, finalEndAddress, disassemblyRequest);
}});
}
} else {
@ -558,10 +569,10 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
if (!isCanceled() && getData() != null) {
fCallback.asyncExec(new Runnable() {
public void run() {
if (!insertDisassembly(startAddress, finalEndAddress, getData(), showSymbols, showDisassembly)) {
if (!insertDisassembly(finalStartAddress, finalEndAddress, getData(), showSymbols, showDisassembly)) {
fCallback.doScrollLocked(new Runnable() {
public void run() {
fCallback.insertError(startAddress, DisassemblyMessages.DisassemblyBackendDsf_error_UnableToRetrieveData);
fCallback.insertError(finalStartAddress, DisassemblyMessages.DisassemblyBackendDsf_error_UnableToRetrieveData);
}
});
}
@ -573,7 +584,7 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
public void run() {
fCallback.doScrollLocked(new Runnable() {
public void run() {
fCallback.insertError(startAddress, status.getMessage());
fCallback.insertError(finalStartAddress, status.getMessage());
}
});
}});
@ -590,10 +601,14 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
disassemblyRequest.done();
return;
}
disassembly.getInstructions(context, startAddress, finalEndAddress, disassemblyRequest);
disassembly.getInstructions(context, finalStartAddress, finalEndAddress, disassemblyRequest);
}});
}
}
});
}
});
}
private boolean insertDisassembly(BigInteger startAddress, BigInteger endAddress, IInstruction[] instructions, boolean showSymbols, boolean showDisassembly) {
if (!fCallback.hasViewer() || fDsfSessionId == null || fTargetContext == null) {
@ -1090,4 +1105,34 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
return null;
}
/**
* Align the opCode of an address.
*
* @param addr the address
* @param rm the data request monitor
*/
void alignOpCodeAddress(final BigInteger addr, final DataRequestMonitor<BigInteger> rm) {
IDisassembly2 disassembly = getService(IDisassembly2.class);
if (disassembly == null) {
rm.setData(addr);
rm.done();
return;
}
final DsfExecutor executor= DsfSession.getSession(fDsfSessionId).getExecutor();
final IDisassemblyDMContext context = DMContexts.getAncestorOfType(fTargetContext, IDisassemblyDMContext.class);
disassembly.alignOpCodeAddress(context, addr, new DataRequestMonitor<BigInteger>(executor, rm) {
@Override
protected void handleFailure() {
rm.setData(addr);
rm.done();
}
@Override
protected void handleSuccess() {
rm.setData(getData());
rm.done();
}
});
}
}

View file

@ -0,0 +1,37 @@
/*****************************************************************
* Copyright (c) 2010 Texas Instruments 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:
* Patrick Chuong (Texas Instruments) - Bug 328168
*****************************************************************/
package org.eclipse.cdt.dsf.debug.service;
import java.math.BigInteger;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
/**
* This interface extends the disassembly service with support for
* address alignment extension request.
*
* @since 2.2
*/
public interface IDisassembly2 extends IDisassembly {
/**
* Aligns the given opCode address. This method will be call for each
* disassembly request, the service should try to resolve
* the given address and align it to a valid opCode address.
*
* @param context context of the disassembly code
* @param address the address to align
* @param drm aligned address
*/
void alignOpCodeAddress(
IDisassemblyDMContext context,
BigInteger address,
DataRequestMonitor<BigInteger> drm);
}