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:
parent
9551d8a724
commit
581d1af49f
2 changed files with 175 additions and 93 deletions
|
@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
Loading…
Add table
Reference in a new issue