1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

Bug 489278 - [disassembly] hover does not work for registers

Change-Id: Idc547e93d1e1f4a4085ce0f1e846964780065043
This commit is contained in:
Marc Dumais 2016-03-09 07:25:56 -05:00 committed by Gerrit Code Review @ Eclipse.org
parent cb76eaa873
commit 90a56a1e7d
2 changed files with 83 additions and 3 deletions

View file

@ -779,8 +779,27 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
*/
@Override
public void findRegister(IDMContext ctx, String name, DataRequestMonitor<IRegisterDMContext> rm) {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED, "Finding a Register context not supported", null)); //$NON-NLS-1$
rm.done();
getRegisters(ctx, new ImmediateDataRequestMonitor<IRegisterDMContext[]>() {
@Override
protected void handleSuccess () {
IRegisterDMContext[] allRegs = getData();
// in all registers found, look for one with the name we seek
for (int i = 0; i < allRegs.length; i++) {
if (allRegs[i] instanceof MIRegisterDMC) {
if (name.equals(((MIRegisterDMC)allRegs[i]).getName())) {
// found it
rm.done(allRegs[i]);
return;
}
}
}
// register was not found
rm.done(new Status(IStatus.WARNING, GdbPlugin.PLUGIN_ID, INTERNAL_ERROR, "Unknown register name", null)); //$NON-NLS-1$
return;
}
});
}
/*

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2010, 2015 Wind River Systems, Inc. and others.
* Copyright (c) 2010, 2016 Wind River Systems, Inc. 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
@ -25,6 +25,7 @@ import java.text.MessageFormat;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AbstractDisassemblyBackend;
@ -55,6 +56,8 @@ import org.eclipse.cdt.dsf.debug.service.IInstruction;
import org.eclipse.cdt.dsf.debug.service.IInstructionWithRawOpcodes;
import org.eclipse.cdt.dsf.debug.service.IInstructionWithSize;
import org.eclipse.cdt.dsf.debug.service.IMixedInstruction;
import org.eclipse.cdt.dsf.debug.service.IRegisters;
import org.eclipse.cdt.dsf.debug.service.IRegisters.IRegisterDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IExitedDMEvent;
@ -1196,6 +1199,64 @@ public class DisassemblyBackendDsf extends AbstractDisassemblyBackend implements
}
@Override
public String evaluateRegister(final String potentialRegisterName) {
if (fTargetFrameContext == null) {
return null;
}
final DsfExecutor executor = DsfSession.getSession(fDsfSessionId).getExecutor();
Query<FormattedValueDMData> query = new Query<FormattedValueDMData>() {
@Override
protected void execute(final DataRequestMonitor<FormattedValueDMData> rm) {
IExecutionDMContext exeCtx = DMContexts.getAncestorOfType(fTargetFrameContext, IExecutionDMContext.class);
final IRunControl rc = getService(IRunControl.class);
if (rc == null || !rc.isSuspended(exeCtx)) {
rm.done();
return;
}
final IRegisters registersService = getService(IRegisters.class);
if (registersService == null) {
rm.done();
return;
}
// find registers for current frame context
registersService.findRegister(fTargetFrameContext, potentialRegisterName,
new DataRequestMonitor<IRegisterDMContext>(executor, rm)
{
@Override
protected void handleSuccess() {
// handle to the register we're looking-for
final IRegisterDMContext theOne = getData();
FormattedValueDMContext fmtCtx = registersService.getFormattedValueContext(theOne, IFormattedValues.HEX_FORMAT);
registersService.getFormattedExpressionValue(fmtCtx, new DataRequestMonitor<FormattedValueDMData>(executor, rm) {
@Override
protected void handleSuccess() {
rm.done(getData());
}
});
}
});
}};
executor.execute(query);
String returnValue = null;
try {
// set a query timeout, to help avoid potential deadlock
FormattedValueDMData data = query.get(500, TimeUnit.MILLISECONDS);
if (data != null) {
returnValue = data.getFormattedValue();
}
} catch (InterruptedException exc) {
} catch (ExecutionException exc) {
} catch (TimeoutException exc) {
}
return returnValue;
}
/**
* Align the opCode of an address.
*