1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

Contributing new disassembly.

This commit is contained in:
Mikhail Khodjaiants 2008-05-14 15:39:23 +00:00
parent d75d152ce6
commit 0864dbf857
8 changed files with 463 additions and 21 deletions

View file

@ -126,6 +126,21 @@ InstructionsDisplayMode.tooltip = Show disassembly instructions
SourceDisplayMode.label = Show Source
SourceDisplayMode.tooltip = Show source code
SteppingMode.name=Stepping Mode
SteppingMode.description=Select Stepping Mode
SteppingModeMenu.label=Stepping Mode
SteppingModeMenu.tooltip=Select Stepping Mode
ContextSteppingMode.label=Context
ContextSteppingMode.tooltip=Context Dependent Stepping
SourceSteppingMode.label=Source
SourceSteppingMode.tooltip=Source Level Stepping
InstructionSteppingMode.label=Instruction
InstructionSteppingMode.tooltip=Instruction Level Stepping
DisassemblyPreferencePage.name = Disassembly
# new disassembly (end)

View file

@ -1294,9 +1294,11 @@
<adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider"/>
<adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory"/>
<adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider"/>
<!-- Enable after 5.0
<adapter
type="org.eclipse.cdt.debug.core.disassembly.IDisassemblyContextProvider">
</adapter>
-->
<adapter
type="org.eclipse.cdt.debug.ui.disassembly.IDocumentElementContentProvider">
</adapter>
@ -1502,12 +1504,14 @@
id="org.eclipse.cdt.debug.ui.breakpointactions.ActionsPreferencePage"
category="org.eclipse.cdt.debug.ui.CDebugPreferencePage">
</page>
<!-- Enable after 5.0
<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

View file

@ -14,7 +14,6 @@ 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.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.preference.IPreferenceStore;
/**
@ -36,7 +35,8 @@ public class CDebugUIPreferenceInitializer extends AbstractPreferenceInitializer
public void initializeDefaultPreferences() {
IPreferenceStore pstore = CDebugUIPlugin.getDefault().getPreferenceStore();
CDebugPreferencePage.initDefaults( pstore );
pstore.setDefault( ICDebugPreferenceConstants.PREF_OPEN_DISASSEMBLY_MODE, MessageDialogWithToggle.PROMPT );
pstore.setDefault( ICDebugPreferenceConstants.PREF_DISASM_OPEN_NO_SOURCE_INFO, true );
pstore.setDefault( ICDebugPreferenceConstants.PREF_DISASM_OPEN_SOURCE_NOT_FOUND, false );
pstore.setDefault( ICDebugPreferenceConstants.PREF_DISASM_SHOW_INSTRUCTIONS, true );
pstore.setDefault( ICDebugPreferenceConstants.PREF_DISASM_SHOW_SOURCE, true );
}

View file

@ -0,0 +1,104 @@
/*******************************************************************************
* 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.disassembly.commands;
import java.util.Map;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.ICDebugConstants;
import org.eclipse.cdt.debug.core.model.ISteppingModeTarget;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.menus.UIElement;
/**
* org.eclipse.cdt.debug.internal.ui.disassembly.commands.SetSteppingModeHandler:
* //TODO Add description.
*/
public class SetSteppingModeHandler extends AbstractHandler implements IElementUpdater {
private static final String ID_PARAMETER_MODE = "com.arm.eclipse.rvd.ui.command.steppingMode.parameterMode"; //$NON-NLS-1$
private String fCurrentValue = null;
public SetSteppingModeHandler() {
super();
fCurrentValue = CDebugCorePlugin.getDefault().getPluginPreferences().getString( ICDebugConstants.PREF_STEP_MODE );
}
/* (non-Javadoc)
* @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
*/
public Object execute( ExecutionEvent event ) throws ExecutionException {
String param = event.getParameter( ID_PARAMETER_MODE );
if ( param == null || param.equals( fCurrentValue ) )
return null;
fCurrentValue = param;
CDebugCorePlugin.getDefault().getPluginPreferences().setValue( ICDebugConstants.PREF_STEP_MODE, fCurrentValue );
IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked( event );
ICommandService service = (ICommandService)window.getService( ICommandService.class );
service.refreshElements( event.getCommand().getId(), null );
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.commands.IElementUpdater#updateElement(org.eclipse.ui.menus.UIElement, java.util.Map)
*/
@SuppressWarnings("unchecked")
public void updateElement( UIElement element, Map parameters ) {
String param = (String)parameters.get( ID_PARAMETER_MODE );
if ( param != null ) {
element.setChecked( ( fCurrentValue != null && fCurrentValue.equals( param ) ) );
}
}
/* (non-Javadoc)
* @see org.eclipse.core.commands.AbstractHandler#isEnabled()
*/
@Override
public boolean isEnabled() {
IWorkbenchWindow window = CDebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
return ( window != null && getSteppingModeTarget( window ) != null );
}
/* (non-Javadoc)
* @see org.eclipse.core.commands.AbstractHandler#isHandled()
*/
@Override
public boolean isHandled() {
IWorkbenchWindow window = CDebugUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
return ( window != null && getSteppingModeTarget( window ) != null );
}
private ISteppingModeTarget getSteppingModeTarget( IWorkbenchWindow window ) {
ISelection selection = DebugUITools.getDebugContextManager().getContextService( window ).getActiveContext();
if ( selection instanceof IStructuredSelection ) {
Object element = ((IStructuredSelection)selection).getFirstElement();
if ( element instanceof IAdaptable )
return (ISteppingModeTarget)((IAdaptable)element).getAdapter( ISteppingModeTarget.class );
}
return null;
}
}

View file

@ -23,6 +23,7 @@ import org.eclipse.cdt.debug.core.model.IDisassemblyLine;
import org.eclipse.cdt.debug.core.model.IModuleRetrieval;
import org.eclipse.cdt.debug.internal.core.CDisassemblyContextProvider;
import org.eclipse.cdt.debug.internal.core.model.DisassemblyRetrieval;
import org.eclipse.cdt.debug.internal.ui.sourcelookup.SourceDisplayAdapter;
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.ui.disassembly.IDocumentElementAnnotationProvider;
@ -33,6 +34,7 @@ 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.IElementMementoProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
public class CDebugElementAdapterFactory implements IAdapterFactory {
@ -51,6 +53,7 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
private static IDocumentElementLabelProvider fgDisassemblyLabelProvider = new DisassemblyElementLabelProvider();
private static IDocumentElementAnnotationProvider fgDisassemblyAnnotationProvider = new DisassemblyElementAnnotationProvider();
private static IElementToggleBreakpointAdapter fgDisassemblyToggleBreakpointAdapter = new DisassemblyToggleBreakpointAdapter();
private static ISourceDisplay fgSourceDisplayAdapter = new SourceDisplayAdapter();
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
@ -128,6 +131,11 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
return fgDisassemblyToggleBreakpointAdapter;
}
}
if ( adapterType.equals( ISourceDisplay.class ) ) {
if ( adaptableObject instanceof ICStackFrame ) {
return fgSourceDisplayAdapter;
}
}
return null;
}
@ -144,6 +152,7 @@ public class CDebugElementAdapterFactory implements IAdapterFactory {
IDocumentElementLabelProvider.class,
IDocumentElementAnnotationProvider.class,
IElementToggleBreakpointAdapter.class,
ISourceDisplay.class,
};
}
}

View file

@ -36,23 +36,27 @@ public class DisassemblyPreferencePage extends FieldEditorPreferencePage impleme
*/
@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 ) );
*/
Group group = ControlFactory.createGroup( getFieldEditorParent(), "Display settings", 1 );
Group group = ControlFactory.createGroup( getFieldEditorParent(), "Open disassembly options", 1 );
Composite spacer = ControlFactory.createComposite( group, 1 );
FieldEditor edit = new BooleanFieldEditor(
ICDebugPreferenceConstants.PREF_DISASM_OPEN_NO_SOURCE_INFO,
"Source information is not available",
spacer );
edit.fillIntoGrid( spacer, 2 );
addField( edit );
edit = new BooleanFieldEditor(
ICDebugPreferenceConstants.PREF_DISASM_OPEN_SOURCE_NOT_FOUND,
"Source file not found",
spacer );
edit.fillIntoGrid( spacer, 2 );
addField( edit );
group = ControlFactory.createGroup( getFieldEditorParent(), "Display settings", 1 );
spacer = ControlFactory.createComposite( group, 1 );
edit = new BooleanFieldEditor(
ICDebugPreferenceConstants.PREF_DISASM_SHOW_INSTRUCTIONS,
"Show instructions",
spacer );

View file

@ -27,21 +27,32 @@ public interface ICDebugPreferenceConstants {
public static final String PREF_SHOW_FULL_PATHS = ICDebugUIConstants.PLUGIN_ID + ".cDebug.show_full_paths"; //$NON-NLS-1$
/**
* Boolean preference controlling whether primitive types types display hexidecimal values.
* Boolean preference controlling whether primitive types display hexadecimal values.
*/
public static final String PREF_SHOW_HEX_VALUES = ICDebugUIConstants.PLUGIN_ID + ".cDebug.showHexValues"; //$NON-NLS-1$
/**
* Boolean preference controlling whether primitive types types display char values.
* Boolean preference controlling whether primitive types display char values.
*/
public static final String PREF_SHOW_CHAR_VALUES = ICDebugUIConstants.PLUGIN_ID + ".cDebug.showCharValues"; //$NON-NLS-1$
/**
* Boolean preference controlling whether the disassembly instructions is to be shown in the disassembly window.
*/
public static final String PREF_DISASM_SHOW_INSTRUCTIONS = ICDebugUIConstants.PLUGIN_ID + ".disassembly.showInstructions"; //$NON-NLS-1$
/**
* Boolean preference controlling whether the source lines is to be shown in the disassembly window.
*/
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
* Boolean preference controlling whether the disassembly editor is be activated if the source information is not available.
*/
public static final String PREF_OPEN_DISASSEMBLY_MODE = ICDebugUIConstants.PLUGIN_ID + ".openDisassemblyMode"; //$NON-NLS-1$
public static final String PREF_DISASM_OPEN_NO_SOURCE_INFO = ICDebugUIConstants.PLUGIN_ID + ".disassembly.openNoSourceInfo"; //$NON-NLS-1$
/**
* Boolean preference controlling whether the disassembly editor is be activated if the source file can't be found.
*/
public static final String PREF_DISASM_OPEN_SOURCE_NOT_FOUND = ICDebugUIConstants.PLUGIN_ID + ".disassembly.openSourceNotFound"; //$NON-NLS-1$
}

View file

@ -0,0 +1,295 @@
/*******************************************************************************
* 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.sourcelookup;
import org.eclipse.cdt.debug.core.model.ICStackFrame;
import org.eclipse.cdt.debug.internal.ui.disassembly.editor.DisassemblyEditorManager;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IRegisterGroup;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.progress.UIJob;
public class SourceDisplayAdapter implements ISourceDisplay {
class DelegatingStackFrame implements IStackFrame {
private ICStackFrame fDelegate;
DelegatingStackFrame( ICStackFrame delegate ) {
super();
fDelegate = delegate;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getCharEnd()
*/
public int getCharEnd() throws DebugException {
return fDelegate.getCharEnd();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getCharStart()
*/
public int getCharStart() throws DebugException {
return fDelegate.getCharStart();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getLineNumber()
*/
public int getLineNumber() throws DebugException {
return fDelegate.getLineNumber();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getName()
*/
public String getName() throws DebugException {
return fDelegate.getName();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getRegisterGroups()
*/
public IRegisterGroup[] getRegisterGroups() throws DebugException {
return fDelegate.getRegisterGroups();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getThread()
*/
public IThread getThread() {
return fDelegate.getThread();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#getVariables()
*/
public IVariable[] getVariables() throws DebugException {
return fDelegate.getVariables();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#hasRegisterGroups()
*/
public boolean hasRegisterGroups() throws DebugException {
return fDelegate.hasRegisterGroups();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStackFrame#hasVariables()
*/
public boolean hasVariables() throws DebugException {
return fDelegate.hasVariables();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
*/
public IDebugTarget getDebugTarget() {
return fDelegate.getDebugTarget();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
*/
public ILaunch getLaunch() {
return fDelegate.getLaunch();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
*/
public String getModelIdentifier() {
return fDelegate.getModelIdentifier();
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
@SuppressWarnings("unchecked")
public Object getAdapter( Class adapter ) {
if ( ICStackFrame.class.equals( adapter ) )
return fDelegate;
return fDelegate.getAdapter( adapter );
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepInto()
*/
public boolean canStepInto() {
return fDelegate.canStepInto();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepOver()
*/
public boolean canStepOver() {
return fDelegate.canStepOver();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#canStepReturn()
*/
public boolean canStepReturn() {
return fDelegate.canStepReturn();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#isStepping()
*/
public boolean isStepping() {
return fDelegate.isStepping();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepInto()
*/
public void stepInto() throws DebugException {
fDelegate.stepInto();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepOver()
*/
public void stepOver() throws DebugException {
fDelegate.stepOver();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IStep#stepReturn()
*/
public void stepReturn() throws DebugException {
fDelegate.stepReturn();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#canResume()
*/
public boolean canResume() {
return fDelegate.canResume();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
*/
public boolean canSuspend() {
return fDelegate.canSuspend();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
*/
public boolean isSuspended() {
return fDelegate.isSuspended();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#resume()
*/
public void resume() throws DebugException {
fDelegate.resume();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ISuspendResume#suspend()
*/
public void suspend() throws DebugException {
fDelegate.suspend();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#canTerminate()
*/
public boolean canTerminate() {
return fDelegate.canTerminate();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#isTerminated()
*/
public boolean isTerminated() {
return fDelegate.isTerminated();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.ITerminate#terminate()
*/
public void terminate() throws DebugException {
fDelegate.terminate();
}
}
/* (non-Javadoc)
* @see org.eclipse.debug.ui.sourcelookup.ISourceDisplay#displaySource(java.lang.Object, org.eclipse.ui.IWorkbenchPage, boolean)
*/
public void displaySource( Object element, IWorkbenchPage page, boolean forceSourceLookup ) {
if ( element instanceof ICStackFrame ) {
ICStackFrame frame = (ICStackFrame)element;
if ( isDisplayDisassembly( frame, page ) ) {
displayDisassembly( page, frame );
}
else {
DelegatingStackFrame delegatingFrame = new DelegatingStackFrame( (ICStackFrame)element );
ISourceDisplay sd = (ISourceDisplay)Platform.getAdapterManager().getAdapter( delegatingFrame, ISourceDisplay.class );
if ( sd != null )
sd.displaySource( element, page, forceSourceLookup );
}
}
}
private boolean isDisplayDisassembly( ICStackFrame frame, IWorkbenchPage page ) {
// always go to the disassembly window if it is already open
IEditorPart editor = getDisassemblyEditorManager().findEditor( page, frame );
return ( editor != null );
}
protected DisassemblyEditorManager getDisassemblyEditorManager() {
return CDebugUIPlugin.getDefault().getDisassemblyEditorManager();
}
private void displayDisassembly( final IWorkbenchPage page, final Object debugContext ) {
Job uijob = new UIJob( "Display Disassembly Job" ) { //$NON-NLS-1$
/* (non-Javadoc)
* @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public IStatus runInUIThread( IProgressMonitor monitor ) {
try {
getDisassemblyEditorManager().openEditor( page, debugContext );
}
catch( DebugException e ) {
return e.getStatus();
}
return Status.OK_STATUS;
}
};
uijob.setSystem( true );
uijob.schedule();
}
}