mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-09-02 21:23:37 +02:00
Contributing new disassembly.
This commit is contained in:
parent
b3256c51da
commit
5b528871c9
20 changed files with 960 additions and 21 deletions
|
@ -0,0 +1,19 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 ARM Limited 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:
|
||||||
|
* ARM Limited - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.core.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an instruction in disassembly.
|
||||||
|
*/
|
||||||
|
public interface IDisassemblyInstruction extends IAsmInstruction, IDisassemblyLine {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 ARM Limited 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:
|
||||||
|
* ARM Limited - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.core.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* org.eclipse.cdt.debug.core.model.IDisassemblyLine:
|
||||||
|
* //TODO Add description.
|
||||||
|
*/
|
||||||
|
public interface IDisassemblyLine {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 ARM Limited 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:
|
||||||
|
* ARM Limited - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.core.model;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a source line in disassembly.
|
||||||
|
*/
|
||||||
|
public interface IDisassemblySourceLine extends IAsmSourceLine, IDisassemblyLine {
|
||||||
|
|
||||||
|
public File getFile();
|
||||||
|
}
|
|
@ -12,6 +12,9 @@
|
||||||
package org.eclipse.cdt.debug.internal.core;
|
package org.eclipse.cdt.debug.internal.core;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.disassembly.IDisassemblyContextProvider;
|
import org.eclipse.cdt.debug.core.disassembly.IDisassemblyContextProvider;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICDebugElement;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
|
||||||
|
import org.eclipse.debug.core.model.IDebugTarget;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* org.eclipse.cdt.debug.internal.core.CDisassemblyContextProvider:
|
* org.eclipse.cdt.debug.internal.core.CDisassemblyContextProvider:
|
||||||
|
@ -23,14 +26,10 @@ public class CDisassemblyContextProvider implements IDisassemblyContextProvider
|
||||||
* @see org.eclipse.cdt.debug.core.disassembly.IDisassemblyContextProvider#getDisassemblyContext(java.lang.Object)
|
* @see org.eclipse.cdt.debug.core.disassembly.IDisassemblyContextProvider#getDisassemblyContext(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
public Object getDisassemblyContext( Object element ) {
|
public Object getDisassemblyContext( Object element ) {
|
||||||
// if ( element instanceof ICDebugElement ) {
|
if ( element instanceof ICDebugElement ) {
|
||||||
// IDebugTarget target = ((ICDebugElement)element).getDebugTarget();
|
IDebugTarget target = ((ICDebugElement)element).getDebugTarget();
|
||||||
// try {
|
return ((CDebugTarget)target).getDisassemblyRetrieval();
|
||||||
// return ((ICDebugTarget)target).getDisassembly();
|
}
|
||||||
// }
|
|
||||||
// catch( DebugException e ) {
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,10 +170,15 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
*/
|
*/
|
||||||
private ICDITargetConfiguration fConfig;
|
private ICDITargetConfiguration fConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The disassembly manager for this target.
|
* The disassembly manager for this target.
|
||||||
*/
|
*/
|
||||||
private Disassembly fDisassembly;
|
private Disassembly fDisassembly;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The new disassembly manager for this target.
|
||||||
|
*/
|
||||||
|
private DisassemblyRetrieval fDisassemblyRetrieval;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The module manager for this target.
|
* The module manager for this target.
|
||||||
|
@ -1556,9 +1561,13 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.debug.core.model.ICDebugTarget#getDisassembly()
|
* @see org.eclipse.cdt.debug.core.model.ICDebugTarget#getDisassembly()
|
||||||
*/
|
*/
|
||||||
public IDisassembly getDisassembly() throws DebugException {
|
public IDisassembly getDisassembly() throws DebugException {
|
||||||
return fDisassembly;
|
return fDisassembly;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DisassemblyRetrieval getDisassemblyRetrieval() {
|
||||||
|
return fDisassemblyRetrieval;
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.debug.core.model.ICDebugTarget#getSignals()
|
* @see org.eclipse.cdt.debug.core.model.ICDebugTarget#getSignals()
|
||||||
|
@ -1584,12 +1593,16 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv
|
||||||
|
|
||||||
private void createDisassembly() {
|
private void createDisassembly() {
|
||||||
this.fDisassembly = new Disassembly( this );
|
this.fDisassembly = new Disassembly( this );
|
||||||
|
this.fDisassemblyRetrieval = new DisassemblyRetrieval( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void disposeDisassembly() {
|
private void disposeDisassembly() {
|
||||||
if ( fDisassembly != null )
|
if ( fDisassembly != null )
|
||||||
fDisassembly.dispose();
|
fDisassembly.dispose();
|
||||||
fDisassembly = null;
|
fDisassembly = null;
|
||||||
|
if ( fDisassemblyRetrieval != null )
|
||||||
|
fDisassemblyRetrieval.dispose();
|
||||||
|
fDisassemblyRetrieval = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|
|
@ -122,6 +122,7 @@ public class Disassembly extends CDebugElement implements IDisassembly, ICDIEven
|
||||||
|
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
getCDISession().getEventManager().removeEventListener( this );
|
getCDISession().getEventManager().removeEventListener( this );
|
||||||
|
CDebugCorePlugin.getDefault().getDisassemblyContextService().unregister( this );
|
||||||
for ( int i = 0; i < fBlocks.length; ++i )
|
for ( int i = 0; i < fBlocks.length; ++i )
|
||||||
if ( fBlocks[i] != null ) {
|
if ( fBlocks[i] != null ) {
|
||||||
fBlocks[i].dispose();
|
fBlocks[i].dispose();
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 ARM Limited 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:
|
||||||
|
* ARM Limited - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.internal.core.model;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.IAddress;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIInstruction;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassemblyInstruction;
|
||||||
|
|
||||||
|
public class DisassemblyInstruction extends CDebugElement implements IDisassemblyInstruction {
|
||||||
|
|
||||||
|
private BigInteger fBaseElement;
|
||||||
|
private ICDIInstruction fCDIInstruction;
|
||||||
|
private IAddress fAddress;
|
||||||
|
|
||||||
|
public DisassemblyInstruction( CDebugTarget target, BigInteger baseElement, ICDIInstruction instruction ) {
|
||||||
|
super( target );
|
||||||
|
fBaseElement = baseElement;
|
||||||
|
fCDIInstruction = instruction;
|
||||||
|
fAddress = target.getAddressFactory().createAddress( fCDIInstruction.getAdress() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.IAsmInstruction#getAdress()
|
||||||
|
*/
|
||||||
|
public IAddress getAdress() {
|
||||||
|
return fAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.IAsmInstruction#getArguments()
|
||||||
|
*/
|
||||||
|
public String getArguments() {
|
||||||
|
return fCDIInstruction.getArgs();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.IAsmInstruction#getFunctionName()
|
||||||
|
*/
|
||||||
|
public String getFunctionName() {
|
||||||
|
return fCDIInstruction.getFuntionName();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.IAsmInstruction#getInstructionText()
|
||||||
|
*/
|
||||||
|
public String getInstructionText() {
|
||||||
|
return fCDIInstruction.getInstruction();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.IAsmInstruction#getOffset()
|
||||||
|
*/
|
||||||
|
public long getOffset() {
|
||||||
|
return fCDIInstruction.getOffset();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.IAsmInstruction#getOpcode()
|
||||||
|
*/
|
||||||
|
public String getOpcode() {
|
||||||
|
return fCDIInstruction.getOpcode();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Object#equals(java.lang.Object)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean equals( Object obj ) {
|
||||||
|
if ( obj == this )
|
||||||
|
return true;
|
||||||
|
if ( !(obj instanceof IDisassemblyInstruction) )
|
||||||
|
return false;
|
||||||
|
IDisassemblyInstruction instr = (IDisassemblyInstruction)obj;
|
||||||
|
if ( !instr.getAdress().equals( getAdress() ) )
|
||||||
|
return false;
|
||||||
|
if ( instr.getOffset() != getOffset() )
|
||||||
|
return false;
|
||||||
|
if ( instr.getFunctionName().compareTo( getFunctionName() ) != 0 )
|
||||||
|
return false;
|
||||||
|
if ( instr.getOpcode().compareTo( getOpcode() ) != 0 )
|
||||||
|
return false;
|
||||||
|
if ( instr.getArguments().compareTo( getArguments() ) != 0 )
|
||||||
|
return false;
|
||||||
|
if ( instr.getInstructionText().compareTo( getInstructionText() ) != 0 )
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,254 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 ARM Limited 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:
|
||||||
|
* ARM Limited - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.internal.core.model;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.IAddressFactory;
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIInstruction;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIMixedInstruction;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassemblyInstruction;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassemblyLine;
|
||||||
|
import org.eclipse.core.runtime.Assert;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
|
||||||
|
public class DisassemblyRetrieval extends CDebugElement implements ICDIEventListener {
|
||||||
|
|
||||||
|
public static final int FLAGS_SHOW_INSTRUCTIONS = 0x1;
|
||||||
|
public static final int FLAGS_SHOW_SOURCE = 0x2;
|
||||||
|
|
||||||
|
private Object fInput = null;
|
||||||
|
private BigInteger fBaseElement = null;
|
||||||
|
private int fCurrentOffset = 0;
|
||||||
|
private int fFlags = 0;
|
||||||
|
private IDisassemblyLine[] fLines;
|
||||||
|
|
||||||
|
public DisassemblyRetrieval( CDebugTarget target ) {
|
||||||
|
super( target );
|
||||||
|
fLines = new IDisassemblyLine[0];
|
||||||
|
CDebugCorePlugin.getDefault().getDisassemblyContextService().register( this );
|
||||||
|
getCDISession().getEventManager().addEventListener( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dispose() {
|
||||||
|
getCDISession().getEventManager().removeEventListener( this );
|
||||||
|
CDebugCorePlugin.getDefault().getDisassemblyContextService().unregister( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener#handleDebugEvents(org.eclipse.cdt.debug.core.cdi.event.ICDIEvent[])
|
||||||
|
*/
|
||||||
|
public void handleDebugEvents( ICDIEvent[] event ) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getInput() {
|
||||||
|
return fInput;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger getBaseElement() {
|
||||||
|
return fBaseElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCurrentOffset() {
|
||||||
|
return fCurrentOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IDisassemblyLine[] getLines() {
|
||||||
|
return fLines;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void changeBase( Object input, int offset, int flags ) throws DebugException {
|
||||||
|
if ( input instanceof ICStackFrame ) {
|
||||||
|
fInput = input;
|
||||||
|
ICStackFrame frame = (ICStackFrame)input;
|
||||||
|
BigInteger address = frame.getAddress().getValue();
|
||||||
|
if ( !containsAddress( address, fLines ) ) {
|
||||||
|
fCurrentOffset = 0;
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
else if ( flags != fFlags ) {
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fCurrentOffset += getDistance( fBaseElement, address );
|
||||||
|
}
|
||||||
|
fBaseElement = address;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void retrieveDisassembly( Object input, Object base, int offset, int lineCount, boolean reveal, int flags ) throws DebugException {
|
||||||
|
boolean showInstructions = ( (flags & FLAGS_SHOW_INSTRUCTIONS) != 0 );
|
||||||
|
boolean showSource = ( (flags & FLAGS_SHOW_SOURCE) != 0 );
|
||||||
|
List<IDisassemblyLine> lines = new ArrayList<IDisassemblyLine>( lineCount );
|
||||||
|
BigInteger startAddress = getCurrentStartAddress();
|
||||||
|
BigInteger address = null;
|
||||||
|
if ( startAddress != null ) {
|
||||||
|
if ( getCurrentOffset() > offset ) {
|
||||||
|
address = startAddress.subtract( BigInteger.valueOf( getMinInstructionSize() * (getCurrentOffset() - offset) ) );
|
||||||
|
}
|
||||||
|
else if ( getCurrentOffset() < offset ) {
|
||||||
|
IDisassemblyInstruction next = getNextInstruction( startAddress, fLines );
|
||||||
|
if ( next != null )
|
||||||
|
address = next.getAdress().getValue();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
address = startAddress;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( address == null )
|
||||||
|
address = fBaseElement;
|
||||||
|
lines.addAll( Arrays.asList( disassembleDown( address, lineCount, showSource ) ) );
|
||||||
|
fLines = lines.toArray( new IDisassemblyLine[lines.size()] );
|
||||||
|
fCurrentOffset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean containsAddress( BigInteger address, IDisassemblyLine[] lines ) {
|
||||||
|
return ( getIndexForAddress( address, lines ) >= 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
fLines = new IDisassemblyLine[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getDistance( BigInteger address1, BigInteger address2 ) {
|
||||||
|
int index1 = getIndexForAddress( address1, fLines );
|
||||||
|
Assert.isTrue( index1 >=0 );
|
||||||
|
int index2 = getIndexForAddress( address2, fLines );
|
||||||
|
Assert.isTrue( index2 >=0 );
|
||||||
|
return index2 - index1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getIndexForAddress( BigInteger address, IDisassemblyLine[] lines ) {
|
||||||
|
for ( int i = 0; i < lines.length; ++i ) {
|
||||||
|
if ( lines[i] instanceof IDisassemblyInstruction &&
|
||||||
|
address.compareTo( ((IDisassemblyInstruction)lines[i]).getAdress().getValue() ) == 0 )
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BigInteger getCurrentStartAddress() {
|
||||||
|
for ( IDisassemblyLine l : fLines ) {
|
||||||
|
if ( l instanceof IDisassemblyInstruction )
|
||||||
|
return ((IDisassemblyInstruction)l).getAdress().getValue();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDisassemblyLine[] disassembleDown( BigInteger address, int lineCount, boolean mixed ) throws DebugException {
|
||||||
|
BigInteger endAddress = address.add( BigInteger.valueOf( lineCount * getMaxInstructionSize() ) );
|
||||||
|
if ( endAddress.compareTo( getGlobalEndAddress() ) > 0 )
|
||||||
|
endAddress = getGlobalEndAddress();
|
||||||
|
IDisassemblyLine[] lines = disassemble( address, endAddress, mixed );
|
||||||
|
int size = Math.min( lineCount, lines.length );
|
||||||
|
IDisassemblyLine[] result = new IDisassemblyLine[size];
|
||||||
|
int start = getIndexForAddress( address, lines );
|
||||||
|
if ( start != -1 ) {
|
||||||
|
System.arraycopy( lines, start, result, 0, size );
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDisassemblyLine[] disassemble( BigInteger startAddress, BigInteger endAddress, boolean mixed ) throws DebugException {
|
||||||
|
List<IDisassemblyLine> list = new ArrayList<IDisassemblyLine>();
|
||||||
|
ICDITarget cdiTarget = (ICDITarget)getDebugTarget().getAdapter( ICDITarget.class );
|
||||||
|
try {
|
||||||
|
ICDIMixedInstruction[] mixedInstructions = null;
|
||||||
|
ICDIInstruction[] asmInstructions = null;
|
||||||
|
if ( mixed ) {
|
||||||
|
mixedInstructions = cdiTarget.getMixedInstructions( startAddress, endAddress );
|
||||||
|
if ( mixedInstructions.length == 0
|
||||||
|
|| mixedInstructions.length == 1
|
||||||
|
&& mixedInstructions[0].getInstructions().length == 0 ) {
|
||||||
|
mixedInstructions = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( mixedInstructions == null ) {
|
||||||
|
asmInstructions = cdiTarget.getInstructions( startAddress, endAddress );
|
||||||
|
}
|
||||||
|
if ( mixedInstructions != null ) {
|
||||||
|
for ( ICDIMixedInstruction mi : mixedInstructions ) {
|
||||||
|
list.add( new DisassemblySourceLine( (CDebugTarget)getDebugTarget(), fBaseElement, mi ) );
|
||||||
|
ICDIInstruction[] instructions = mi.getInstructions();
|
||||||
|
for ( ICDIInstruction i : instructions ) {
|
||||||
|
list.add( new DisassemblyInstruction( (CDebugTarget)getDebugTarget(), fBaseElement, i ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( asmInstructions != null ) {
|
||||||
|
for ( ICDIInstruction i : asmInstructions ) {
|
||||||
|
list.add( new DisassemblyInstruction( (CDebugTarget)getDebugTarget(), fBaseElement, i ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( CDIException exc ) {
|
||||||
|
throw new DebugException( new Status( IStatus.ERROR, "dummy", exc.getDetailMessage(), exc ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
return list.toArray( new IDisassemblyLine[list.size()] );
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getMaxInstructionSize() {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getMinInstructionSize() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDisassemblyInstruction getNextInstruction( BigInteger address, IDisassemblyLine[] lines ) {
|
||||||
|
int index = getIndexForAddress( address, lines );
|
||||||
|
if ( index == -1 || index == lines.length - 1 )
|
||||||
|
return null;
|
||||||
|
for ( int i = index + 1; i < lines.length; ++i ) {
|
||||||
|
if ( lines[i] instanceof IDisassemblyInstruction )
|
||||||
|
return (IDisassemblyInstruction)lines[i];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDisassemblyInstruction getPreviousInstruction( BigInteger baseAddress ) throws DebugException {
|
||||||
|
BigInteger endAddress = baseAddress.add( BigInteger.valueOf( 1 ) );
|
||||||
|
BigInteger startAddress = baseAddress;
|
||||||
|
IDisassemblyLine[] lines = new IDisassemblyLine[0];
|
||||||
|
int index = -1;
|
||||||
|
while( index == -1 && startAddress.compareTo( getGlobalStartAddress() ) > 0 ) {
|
||||||
|
startAddress = startAddress.subtract( BigInteger.valueOf( 1 ) );
|
||||||
|
lines = disassemble( startAddress, endAddress, false );
|
||||||
|
index = getIndexForAddress( baseAddress, lines );
|
||||||
|
}
|
||||||
|
return ( index > 0 ) ? (IDisassemblyInstruction)lines[index - 1] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BigInteger getGlobalStartAddress() {
|
||||||
|
return getAddressFactory().getZero().getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BigInteger getGlobalEndAddress() {
|
||||||
|
return getAddressFactory().getMax().getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private IAddressFactory getAddressFactory() {
|
||||||
|
return ((CDebugTarget)getDebugTarget()).getAddressFactory();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 ARM Limited 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:
|
||||||
|
* ARM Limited - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.internal.core.model;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIMixedInstruction;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IAsmInstruction;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassemblySourceLine;
|
||||||
|
|
||||||
|
public class DisassemblySourceLine extends CDebugElement implements IDisassemblySourceLine {
|
||||||
|
|
||||||
|
private BigInteger fBaseElement;
|
||||||
|
private ICDIMixedInstruction fCDIMixedInstruction;
|
||||||
|
|
||||||
|
public DisassemblySourceLine( CDebugTarget target, BigInteger baseElement, ICDIMixedInstruction mixedInstruction ) {
|
||||||
|
super( target );
|
||||||
|
fBaseElement = baseElement;
|
||||||
|
fCDIMixedInstruction = mixedInstruction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.IDisassemblySourceLine#getFile()
|
||||||
|
*/
|
||||||
|
public File getFile() {
|
||||||
|
String name = fCDIMixedInstruction.getFileName();
|
||||||
|
if ( name != null && name.length() > 0 ) {
|
||||||
|
return new File( name );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.IAsmSourceLine#getInstructions()
|
||||||
|
*/
|
||||||
|
public IAsmInstruction[] getInstructions() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.model.IAsmSourceLine#getLineNumber()
|
||||||
|
*/
|
||||||
|
public int getLineNumber() {
|
||||||
|
return fCDIMixedInstruction.getLineNumber();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger getBaseAddress() {
|
||||||
|
return fBaseElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Object#toString()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return fCDIMixedInstruction.getFileName() + ' ' + getLineNumber();
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Before Width: | Height: | Size: 83 B After Width: | Height: | Size: 105 B |
Binary file not shown.
Before Width: | Height: | Size: 82 B After Width: | Height: | Size: 138 B |
|
@ -123,6 +123,8 @@ InstructionsDisplayMode.label = Show Instructions
|
||||||
InstructionsDisplayMode.tooltip = Show disassembly instructions
|
InstructionsDisplayMode.tooltip = Show disassembly instructions
|
||||||
SourceDisplayMode.label = Show Source
|
SourceDisplayMode.label = Show Source
|
||||||
SourceDisplayMode.tooltip = Show source code
|
SourceDisplayMode.tooltip = Show source code
|
||||||
|
|
||||||
|
DisassemblyPreferencePage.name = Disassembly
|
||||||
# new disassembly (end)
|
# new disassembly (end)
|
||||||
|
|
||||||
DebugTextHover.label=Debugger
|
DebugTextHover.label=Debugger
|
||||||
|
|
|
@ -1156,7 +1156,7 @@
|
||||||
verticalRulerPreferenceValue="true">
|
verticalRulerPreferenceValue="true">
|
||||||
</specification>
|
</specification>
|
||||||
<specification
|
<specification
|
||||||
colorPreferenceValue="217,255,226"
|
colorPreferenceValue="198,219,174"
|
||||||
annotationType="org.eclipse.cdt.debug.ui.currentDisassemblyIP"
|
annotationType="org.eclipse.cdt.debug.ui.currentDisassemblyIP"
|
||||||
verticalRulerPreferenceValue="true"
|
verticalRulerPreferenceValue="true"
|
||||||
colorPreferenceKey="currentDisassemblyIPColor"
|
colorPreferenceKey="currentDisassemblyIPColor"
|
||||||
|
@ -1172,7 +1172,7 @@
|
||||||
overviewRulerPreferenceKey="currentDisassemblyIPOverviewRuler">
|
overviewRulerPreferenceKey="currentDisassemblyIPOverviewRuler">
|
||||||
</specification>
|
</specification>
|
||||||
<specification
|
<specification
|
||||||
colorPreferenceValue="217,255,226"
|
colorPreferenceValue="219,235,204"
|
||||||
annotationType="org.eclipse.cdt.debug.ui.secondaryDisassemblyIP"
|
annotationType="org.eclipse.cdt.debug.ui.secondaryDisassemblyIP"
|
||||||
verticalRulerPreferenceValue="true"
|
verticalRulerPreferenceValue="true"
|
||||||
colorPreferenceKey="secondaryDisassemblyIPColor"
|
colorPreferenceKey="secondaryDisassemblyIPColor"
|
||||||
|
@ -1277,6 +1277,9 @@
|
||||||
<adapter
|
<adapter
|
||||||
type="org.eclipse.cdt.debug.core.disassembly.IDisassemblyContextProvider">
|
type="org.eclipse.cdt.debug.core.disassembly.IDisassemblyContextProvider">
|
||||||
</adapter>
|
</adapter>
|
||||||
|
<adapter
|
||||||
|
type="org.eclipse.cdt.debug.ui.disassembly.IDocumentElementContentProvider">
|
||||||
|
</adapter>
|
||||||
</factory>
|
</factory>
|
||||||
<factory
|
<factory
|
||||||
adaptableType="org.eclipse.cdt.debug.core.model.ICModule"
|
adaptableType="org.eclipse.cdt.debug.core.model.ICModule"
|
||||||
|
@ -1342,6 +1345,16 @@
|
||||||
type="org.eclipse.jface.viewers.ILabelDecorator">
|
type="org.eclipse.jface.viewers.ILabelDecorator">
|
||||||
</adapter>
|
</adapter>
|
||||||
</factory>
|
</factory>
|
||||||
|
<factory
|
||||||
|
adaptableType="org.eclipse.cdt.debug.core.model.IDisassemblyLine"
|
||||||
|
class="org.eclipse.cdt.debug.internal.ui.elements.adapters.CDebugElementAdapterFactory">
|
||||||
|
<adapter
|
||||||
|
type="org.eclipse.cdt.debug.ui.disassembly.IDocumentElementLabelProvider">
|
||||||
|
</adapter>
|
||||||
|
<adapter
|
||||||
|
type="org.eclipse.cdt.debug.ui.disassembly.IDocumentElementAnnotationProvider">
|
||||||
|
</adapter>
|
||||||
|
</factory>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.ui.themes">
|
point="org.eclipse.ui.themes">
|
||||||
|
@ -1459,6 +1472,12 @@
|
||||||
id="org.eclipse.cdt.debug.ui.breakpointactions.ActionsPreferencePage"
|
id="org.eclipse.cdt.debug.ui.breakpointactions.ActionsPreferencePage"
|
||||||
category="org.eclipse.cdt.debug.ui.CDebugPreferencePage">
|
category="org.eclipse.cdt.debug.ui.CDebugPreferencePage">
|
||||||
</page>
|
</page>
|
||||||
|
<page
|
||||||
|
category="org.eclipse.debug.ui.DebugPreferencePage"
|
||||||
|
class="org.eclipse.cdt.debug.internal.ui.preferences.DisassemblyPreferencePage"
|
||||||
|
id="org.eclipse.cdt.debug.ui.disassemblyPreferencePge"
|
||||||
|
name="%DisassemblyPreferencePage.name">
|
||||||
|
</page>
|
||||||
</extension>
|
</extension>
|
||||||
|
|
||||||
<extension
|
<extension
|
||||||
|
|
|
@ -11,8 +11,10 @@
|
||||||
package org.eclipse.cdt.debug.internal.ui;
|
package org.eclipse.cdt.debug.internal.ui;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.internal.ui.preferences.CDebugPreferencePage;
|
import org.eclipse.cdt.debug.internal.ui.preferences.CDebugPreferencePage;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.preferences.ICDebugPreferenceConstants;
|
||||||
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
||||||
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
|
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
|
||||||
import org.eclipse.jface.preference.IPreferenceStore;
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -30,8 +32,12 @@ public class CDebugUIPreferenceInitializer extends AbstractPreferenceInitializer
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
|
* @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
|
||||||
*/
|
*/
|
||||||
public void initializeDefaultPreferences() {
|
@Override
|
||||||
|
public void initializeDefaultPreferences() {
|
||||||
IPreferenceStore pstore = CDebugUIPlugin.getDefault().getPreferenceStore();
|
IPreferenceStore pstore = CDebugUIPlugin.getDefault().getPreferenceStore();
|
||||||
CDebugPreferencePage.initDefaults( pstore );
|
CDebugPreferencePage.initDefaults( pstore );
|
||||||
|
pstore.setDefault( ICDebugPreferenceConstants.PREF_OPEN_DISASSEMBLY_MODE, MessageDialogWithToggle.PROMPT );
|
||||||
|
pstore.setDefault( ICDebugPreferenceConstants.PREF_DISASM_SHOW_INSTRUCTIONS, true );
|
||||||
|
pstore.setDefault( ICDebugPreferenceConstants.PREF_DISASM_SHOW_SOURCE, false );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,10 +19,14 @@ import org.eclipse.cdt.debug.core.model.ICDebugTarget;
|
||||||
import org.eclipse.cdt.debug.core.model.ICModule;
|
import org.eclipse.cdt.debug.core.model.ICModule;
|
||||||
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
||||||
import org.eclipse.cdt.debug.core.model.ICThread;
|
import org.eclipse.cdt.debug.core.model.ICThread;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassemblyLine;
|
||||||
import org.eclipse.cdt.debug.core.model.IModuleRetrieval;
|
import org.eclipse.cdt.debug.core.model.IModuleRetrieval;
|
||||||
import org.eclipse.cdt.debug.internal.core.CDisassemblyContextProvider;
|
import org.eclipse.cdt.debug.internal.core.CDisassemblyContextProvider;
|
||||||
import org.eclipse.cdt.debug.internal.ui.views.modules.ModuleContentProvider;
|
import org.eclipse.cdt.debug.internal.ui.views.modules.ModuleContentProvider;
|
||||||
import org.eclipse.cdt.debug.internal.ui.views.modules.ModuleMementoProvider;
|
import org.eclipse.cdt.debug.internal.ui.views.modules.ModuleMementoProvider;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementAnnotationProvider;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementContentProvider;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementLabelProvider;
|
||||||
import org.eclipse.core.runtime.IAdapterFactory;
|
import org.eclipse.core.runtime.IAdapterFactory;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider;
|
||||||
|
@ -41,6 +45,9 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
|
||||||
private static IElementMementoProvider fgModuleMementoProvider = new ModuleMementoProvider();
|
private static IElementMementoProvider fgModuleMementoProvider = new ModuleMementoProvider();
|
||||||
|
|
||||||
private static IDisassemblyContextProvider fgDisassemblyContextProvider = new CDisassemblyContextProvider();
|
private static IDisassemblyContextProvider fgDisassemblyContextProvider = new CDisassemblyContextProvider();
|
||||||
|
private static IDocumentElementContentProvider fgDisassemblyContentProvider = new DisassemblyElementContentProvider();
|
||||||
|
private static IDocumentElementLabelProvider fgDisassemblyLabelProvider = new DisassemblyElementLabelProvider();
|
||||||
|
private static IDocumentElementAnnotationProvider fgDisassemblyAnnotationProvider = new DisassemblyElementAnnotationProvider();
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
|
* @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
|
||||||
|
@ -97,6 +104,21 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
|
||||||
return fgDisassemblyContextProvider;
|
return fgDisassemblyContextProvider;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ( adapterType.equals( IDocumentElementContentProvider.class ) ) {
|
||||||
|
if ( adaptableObject instanceof ICStackFrame ) {
|
||||||
|
return fgDisassemblyContentProvider;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( adapterType.equals( IDocumentElementLabelProvider.class ) ) {
|
||||||
|
if ( adaptableObject instanceof IDisassemblyLine ) {
|
||||||
|
return fgDisassemblyLabelProvider;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( adapterType.equals( IDocumentElementAnnotationProvider.class ) ) {
|
||||||
|
if ( adaptableObject instanceof IDisassemblyLine ) {
|
||||||
|
return fgDisassemblyAnnotationProvider;
|
||||||
|
}
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,6 +131,9 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
|
||||||
IModelProxyFactory.class,
|
IModelProxyFactory.class,
|
||||||
IElementMementoProvider.class,
|
IElementMementoProvider.class,
|
||||||
IDisassemblyContextProvider.class,
|
IDisassemblyContextProvider.class,
|
||||||
|
IDocumentElementContentProvider.class,
|
||||||
|
IDocumentElementLabelProvider.class,
|
||||||
|
IDocumentElementAnnotationProvider.class,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,120 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 ARM Limited 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:
|
||||||
|
* ARM Limited - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.elements.adapters;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
|
||||||
|
import org.eclipse.cdt.debug.core.model.ICStackFrame;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassemblyInstruction;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.CBreakpointManager;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.model.DisassemblyRetrieval;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyInstructionPointerAnnotation;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementAnnotationProvider;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementAnnotationUpdate;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.jobs.Job;
|
||||||
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.debug.core.model.IBreakpoint;
|
||||||
|
import org.eclipse.debug.core.model.IThread;
|
||||||
|
import org.eclipse.ui.texteditor.MarkerAnnotation;
|
||||||
|
|
||||||
|
public class DisassemblyElementAnnotationProvider implements IDocumentElementAnnotationProvider {
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see com.arm.eclipse.rvd.ui.disassembly.IDocumentElementAnnotationProvider#update(com.arm.eclipse.rvd.ui.disassembly.IDocumentElementAnnotationUpdate[])
|
||||||
|
*/
|
||||||
|
public void update( final IDocumentElementAnnotationUpdate[] updates ) {
|
||||||
|
Job job = new Job( "Annotations update" ) { //$NON-NLS-1$
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected IStatus run( IProgressMonitor monitor ) {
|
||||||
|
for( int i = 0; i < updates.length; i++ ) {
|
||||||
|
IDocumentElementAnnotationUpdate update = updates[i];
|
||||||
|
if ( !update.isCanceled() ) {
|
||||||
|
retrieveAnnotations( update );
|
||||||
|
}
|
||||||
|
update.done();
|
||||||
|
}
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
job.setSystem( true );
|
||||||
|
job.schedule();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void retrieveAnnotations( IDocumentElementAnnotationUpdate update ) {
|
||||||
|
retrieveInstructionPointers( update );
|
||||||
|
retrieveBreakpoints( update );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void retrieveInstructionPointers( IDocumentElementAnnotationUpdate update ) {
|
||||||
|
Object root = update.getRootElement();
|
||||||
|
if ( root instanceof DisassemblyRetrieval ) {
|
||||||
|
DisassemblyRetrieval retrieval = (DisassemblyRetrieval)root;
|
||||||
|
Object input = retrieval.getInput();
|
||||||
|
if ( input instanceof ICStackFrame ) {
|
||||||
|
Object element = update.getElement();
|
||||||
|
if ( element instanceof IDisassemblyInstruction ) {
|
||||||
|
BigInteger address = ((IDisassemblyInstruction)element).getAdress().getValue();
|
||||||
|
ICStackFrame frame = (ICStackFrame)input;
|
||||||
|
BigInteger frameAddress = frame.getAddress().getValue();
|
||||||
|
if ( address.equals( frameAddress ) ) {
|
||||||
|
IThread thread = frame.getThread();
|
||||||
|
boolean topFrame;
|
||||||
|
try {
|
||||||
|
topFrame = ( frame == thread.getTopStackFrame() );
|
||||||
|
update.addAnnotation( new DisassemblyInstructionPointerAnnotation( frame, topFrame ) );
|
||||||
|
}
|
||||||
|
catch( DebugException e ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void retrieveBreakpoints( IDocumentElementAnnotationUpdate update ) {
|
||||||
|
IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints( CDebugCorePlugin.getUniqueIdentifier() );
|
||||||
|
for ( IBreakpoint b : breakpoints ) {
|
||||||
|
if ( b instanceof ICLineBreakpoint ) {
|
||||||
|
try {
|
||||||
|
Object root = update.getRootElement();
|
||||||
|
if ( root instanceof DisassemblyRetrieval ) {
|
||||||
|
Object element = update.getElement();
|
||||||
|
if ( element instanceof IDisassemblyInstruction ) {
|
||||||
|
IDisassemblyInstruction instruction = (IDisassemblyInstruction)element;
|
||||||
|
BigInteger address = ((CDebugTarget)((DisassemblyRetrieval)root).getDebugTarget()).getBreakpointAddress( (ICLineBreakpoint)b ).getValue();
|
||||||
|
BigInteger instrAddress = instruction.getAdress().getValue();
|
||||||
|
if ( address != null && instrAddress != null && instrAddress.compareTo( address ) == 0 ) {
|
||||||
|
update.addAnnotation( new MarkerAnnotation( b.getMarker() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( CoreException e ) {
|
||||||
|
}
|
||||||
|
catch( NumberFormatException e ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,124 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 ARM Limited 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:
|
||||||
|
* ARM Limited - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.elements.adapters;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassemblyLine;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.model.DisassemblyRetrieval;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.disassembly.editor.DisassemblyEditorPresentation;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentBaseChangeUpdate;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementContentProvider;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementContentUpdate;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentPresentation;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.jobs.Job;
|
||||||
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
|
||||||
|
public class DisassemblyElementContentProvider implements IDocumentElementContentProvider {
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.ui.disassembly.IDocumentElementContentProvider#updateContent(org.eclipse.cdt.debug.ui.disassembly.IDocumentElementContentUpdate)
|
||||||
|
*/
|
||||||
|
public void updateContent( final IDocumentElementContentUpdate update ) {
|
||||||
|
Job job = new Job( "Source content update" ) { //$NON-NLS-1$
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected IStatus run( IProgressMonitor monitor ) {
|
||||||
|
if ( !update.isCanceled() ) {
|
||||||
|
retrieveDisassembly( update );
|
||||||
|
}
|
||||||
|
update.done();
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
job.setSystem( true );
|
||||||
|
job.schedule();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.ui.disassembly.IDocumentElementContentProvider#updateInput(org.eclipse.cdt.debug.ui.disassembly.IDocumentBaseChangeUpdate)
|
||||||
|
*/
|
||||||
|
public void updateInput( final IDocumentBaseChangeUpdate update ) {
|
||||||
|
Job job = new Job( "Input update" ) { //$NON-NLS-1$
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected IStatus run( IProgressMonitor monitor ) {
|
||||||
|
if ( !update.isCanceled() ) {
|
||||||
|
changeBaseElement( update );
|
||||||
|
}
|
||||||
|
update.done();
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
job.setSystem( true );
|
||||||
|
job.schedule();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void changeBaseElement( IDocumentBaseChangeUpdate update ) {
|
||||||
|
Object root = update.getRootElement();
|
||||||
|
if ( root instanceof DisassemblyRetrieval ) {
|
||||||
|
DisassemblyRetrieval retrieval = (DisassemblyRetrieval)root;
|
||||||
|
try {
|
||||||
|
retrieval.changeBase( update.getElement(), update.getOriginalOffset(), getPresentationFlags( (IDocumentPresentation)update.getPresentationContext() ) );
|
||||||
|
update.setBaseElement( retrieval.getBaseElement() );
|
||||||
|
update.setOffset( retrieval.getCurrentOffset() );
|
||||||
|
}
|
||||||
|
catch( DebugException e ) {
|
||||||
|
update.setStatus( e.getStatus() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void retrieveDisassembly( IDocumentElementContentUpdate update ) {
|
||||||
|
Object root = update.getRootElement();
|
||||||
|
if ( root instanceof DisassemblyRetrieval ) {
|
||||||
|
DisassemblyRetrieval retrieval = (DisassemblyRetrieval)root;
|
||||||
|
try {
|
||||||
|
retrieval.retrieveDisassembly(
|
||||||
|
update.getElement(),
|
||||||
|
update.getBaseElement(),
|
||||||
|
update.getOriginalOffset(),
|
||||||
|
update.getRequestedLineCount(),
|
||||||
|
update.reveal(),
|
||||||
|
getPresentationFlags( (IDocumentPresentation)update.getPresentationContext() ) );
|
||||||
|
IDisassemblyLine[] lines = retrieval.getLines();
|
||||||
|
update.setOffset( retrieval.getCurrentOffset() );
|
||||||
|
update.setLineCount( lines.length );
|
||||||
|
for( int i = 0; i < lines.length; ++i ) {
|
||||||
|
update.addElement( i, lines[i] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( DebugException e ) {
|
||||||
|
update.setStatus( e.getStatus() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getPresentationFlags( IDocumentPresentation presentation ) {
|
||||||
|
int flags = 0;
|
||||||
|
if ( presentation instanceof DisassemblyEditorPresentation ) {
|
||||||
|
DisassemblyEditorPresentation dep = (DisassemblyEditorPresentation)presentation;
|
||||||
|
if ( dep.showIntstructions() )
|
||||||
|
flags |= DisassemblyRetrieval.FLAGS_SHOW_INSTRUCTIONS;
|
||||||
|
if ( dep.showSource() )
|
||||||
|
flags |= DisassemblyRetrieval.FLAGS_SHOW_SOURCE;
|
||||||
|
}
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 ARM Limited 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:
|
||||||
|
* ARM Limited - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.elements.adapters;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.CDebugUtils;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassemblyInstruction;
|
||||||
|
import org.eclipse.cdt.debug.core.model.IDisassemblySourceLine;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.disassembly.editor.DisassemblyEditorPresentation;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementLabelProvider;
|
||||||
|
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementLabelUpdate;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.jobs.Job;
|
||||||
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* org.eclipse.cdt.debug.internal.ui.elements.adapters.DisassemblyElementLabelProvider:
|
||||||
|
* //TODO Add description.
|
||||||
|
*/
|
||||||
|
public class DisassemblyElementLabelProvider implements IDocumentElementLabelProvider {
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.ui.disassembly.IDocumentElementLabelProvider#update(org.eclipse.cdt.debug.ui.disassembly.IDocumentElementLabelUpdate[])
|
||||||
|
*/
|
||||||
|
public void update( final IDocumentElementLabelUpdate[] updates ) {
|
||||||
|
Job job = new Job( "Label update" ) { //$NON-NLS-1$
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected IStatus run( IProgressMonitor monitor ) {
|
||||||
|
for( int i = 0; i < updates.length; i++ ) {
|
||||||
|
IDocumentElementLabelUpdate update = updates[i];
|
||||||
|
if ( !update.isCanceled() ) {
|
||||||
|
retrieveLabel( update );
|
||||||
|
}
|
||||||
|
update.done();
|
||||||
|
}
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
job.setSystem( true );
|
||||||
|
job.schedule();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void retrieveLabel( IDocumentElementLabelUpdate update ) {
|
||||||
|
IPresentationContext context = update.getPresentationContext();
|
||||||
|
if ( context instanceof DisassemblyEditorPresentation ) {
|
||||||
|
DisassemblyEditorPresentation presentation = (DisassemblyEditorPresentation)context;
|
||||||
|
Object element = update.getElement();
|
||||||
|
if ( element instanceof IDisassemblyInstruction ) {
|
||||||
|
IDisassemblyInstruction instruction = (IDisassemblyInstruction)element;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if ( presentation.showAddresses() ) {
|
||||||
|
BigInteger address = instruction.getAdress().getValue();
|
||||||
|
sb.append( "0x" ); //$NON-NLS-1$
|
||||||
|
sb.append( CDebugUtils.prependString( Long.toHexString( address.longValue() ), 8, '0' ) );
|
||||||
|
sb.append( '\t' );
|
||||||
|
}
|
||||||
|
sb.append( instruction.getInstructionText() );
|
||||||
|
update.setLabel( DisassemblyEditorPresentation.ATTR_LINE_LABEL, sb.toString() );
|
||||||
|
}
|
||||||
|
else if ( element instanceof IDisassemblySourceLine ) {
|
||||||
|
IDisassemblySourceLine line = (IDisassemblySourceLine)element;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if ( presentation.showLineNumbers() ) {
|
||||||
|
sb.append( line.getLineNumber() );
|
||||||
|
sb.append( '\t' );
|
||||||
|
}
|
||||||
|
sb.append( line.getFile().getAbsolutePath() );
|
||||||
|
update.setLabel( DisassemblyEditorPresentation.ATTR_LINE_LABEL, sb.toString() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 ARM Limited 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:
|
||||||
|
* ARM Limited - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.preferences;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
|
||||||
|
import org.eclipse.jface.preference.FieldEditorPreferencePage;
|
||||||
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
|
import org.eclipse.jface.preference.RadioGroupFieldEditor;
|
||||||
|
import org.eclipse.ui.IWorkbench;
|
||||||
|
import org.eclipse.ui.IWorkbenchPreferencePage;
|
||||||
|
|
||||||
|
public class DisassemblyPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
|
||||||
|
|
||||||
|
public DisassemblyPreferencePage() {
|
||||||
|
super( GRID );
|
||||||
|
IPreferenceStore store = CDebugUIPlugin.getDefault().getPreferenceStore();
|
||||||
|
setPreferenceStore( store );
|
||||||
|
setDescription( "Disassembly Settings" );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void createFieldEditors() {
|
||||||
|
|
||||||
|
addField( new RadioGroupFieldEditor(
|
||||||
|
ICDebugPreferenceConstants.PREF_OPEN_DISASSEMBLY_MODE,
|
||||||
|
"Open disassembly if source is not available",
|
||||||
|
3,
|
||||||
|
new String[][] {
|
||||||
|
{ "Always", MessageDialogWithToggle.ALWAYS },
|
||||||
|
{ "Never", MessageDialogWithToggle.NEVER },
|
||||||
|
{ "Prompt", MessageDialogWithToggle.PROMPT },
|
||||||
|
},
|
||||||
|
getFieldEditorParent(),
|
||||||
|
true ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
|
||||||
|
*/
|
||||||
|
public void init( IWorkbench workbench ) {
|
||||||
|
}
|
||||||
|
}
|
|
@ -39,4 +39,9 @@ public interface ICDebugPreferenceConstants {
|
||||||
public static final String PREF_DISASM_SHOW_INSTRUCTIONS = ICDebugUIConstants.PLUGIN_ID + ".disassembly.showInstructions"; //$NON-NLS-1$
|
public static final String PREF_DISASM_SHOW_INSTRUCTIONS = ICDebugUIConstants.PLUGIN_ID + ".disassembly.showInstructions"; //$NON-NLS-1$
|
||||||
|
|
||||||
public static final String PREF_DISASM_SHOW_SOURCE = ICDebugUIConstants.PLUGIN_ID + ".disassembly.showSource"; //$NON-NLS-1$
|
public static final String PREF_DISASM_SHOW_SOURCE = ICDebugUIConstants.PLUGIN_ID + ".disassembly.showSource"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies the conditions under which the disassembly editor will be activated
|
||||||
|
*/
|
||||||
|
public static final String PREF_OPEN_DISASSEMBLY_MODE = ICDebugUIConstants.PLUGIN_ID + ".openDisassemblyMode"; //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue