mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 09:49:23 +02:00
Merge remote-tracking branch 'origin/patch'
This commit is contained in:
commit
d8f61fc7b2
7 changed files with 75 additions and 27 deletions
|
@ -199,5 +199,6 @@ public class DebuggerLocationLabel extends JLabel {
|
||||||
public void updateLabel() {
|
public void updateLabel() {
|
||||||
String label = computeLocationString();
|
String label = computeLocationString();
|
||||||
setText(label);
|
setText(label);
|
||||||
|
setToolTipText(label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,8 +17,8 @@ package ghidra.app.plugin.core.debug.gui.listing;
|
||||||
|
|
||||||
import static ghidra.app.plugin.core.debug.gui.DebuggerResources.ICON_REGISTER_MARKER;
|
import static ghidra.app.plugin.core.debug.gui.DebuggerResources.ICON_REGISTER_MARKER;
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.lang.invoke.MethodHandles;
|
import java.lang.invoke.MethodHandles;
|
||||||
|
@ -26,8 +26,8 @@ import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import javax.swing.Box;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
|
||||||
import javax.swing.event.ChangeEvent;
|
import javax.swing.event.ChangeEvent;
|
||||||
import javax.swing.event.ChangeListener;
|
import javax.swing.event.ChangeListener;
|
||||||
|
|
||||||
|
@ -210,6 +210,7 @@ public class DebuggerListingProvider extends CodeViewerProvider {
|
||||||
protected void specChanged(LocationTrackingSpec spec) {
|
protected void specChanged(LocationTrackingSpec spec) {
|
||||||
updateTitle();
|
updateTitle();
|
||||||
trackingLabel.setText("");
|
trackingLabel.setText("");
|
||||||
|
trackingLabel.setToolTipText("");
|
||||||
trackingLabel.setForeground(Colors.FOREGROUND);
|
trackingLabel.setForeground(Colors.FOREGROUND);
|
||||||
trackingSpecChangeListeners.fire.locationTrackingSpecChanged(spec);
|
trackingSpecChangeListeners.fire.locationTrackingSpecChanged(spec);
|
||||||
}
|
}
|
||||||
|
@ -335,9 +336,11 @@ public class DebuggerListingProvider extends CodeViewerProvider {
|
||||||
|
|
||||||
addDisplayListener(readsMemTrait.getDisplayListener());
|
addDisplayListener(readsMemTrait.getDisplayListener());
|
||||||
|
|
||||||
JPanel northPanel = new JPanel(new BorderLayout());
|
Box northPanel = Box.createHorizontalBox();
|
||||||
northPanel.add(locationLabel, BorderLayout.WEST);
|
northPanel.add(locationLabel);
|
||||||
northPanel.add(trackingLabel, BorderLayout.EAST);
|
locationLabel.setMinimumSize(new Dimension(0, 0));
|
||||||
|
northPanel.add(Box.createGlue());
|
||||||
|
northPanel.add(trackingLabel);
|
||||||
this.setNorthComponent(northPanel);
|
this.setNorthComponent(northPanel);
|
||||||
if (isConnected) {
|
if (isConnected) {
|
||||||
setTitle(DebuggerResources.TITLE_PROVIDER_LISTING);
|
setTitle(DebuggerResources.TITLE_PROVIDER_LISTING);
|
||||||
|
@ -1066,7 +1069,9 @@ public class DebuggerListingProvider extends CodeViewerProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void goToAndUpdateTrackingLabel(TraceProgramView curView, ProgramLocation loc) {
|
protected void goToAndUpdateTrackingLabel(TraceProgramView curView, ProgramLocation loc) {
|
||||||
trackingLabel.setText(trackingTrait.computeLabelText());
|
String labelText = trackingTrait.computeLabelText();
|
||||||
|
trackingLabel.setText(labelText);
|
||||||
|
trackingLabel.setToolTipText(labelText);
|
||||||
if (goTo(curView, loc)) {
|
if (goTo(curView, loc)) {
|
||||||
trackingLabel.setForeground(Colors.FOREGROUND);
|
trackingLabel.setForeground(Colors.FOREGROUND);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,14 +16,14 @@
|
||||||
package ghidra.app.plugin.core.debug.gui.memory;
|
package ghidra.app.plugin.core.debug.gui.memory;
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.Dimension;
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.lang.invoke.MethodHandles;
|
import java.lang.invoke.MethodHandles;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import javax.swing.JLabel;
|
import javax.swing.*;
|
||||||
import javax.swing.JPanel;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
@ -133,6 +133,7 @@ public class DebuggerMemoryBytesProvider extends ProgramByteViewerComponentProvi
|
||||||
protected void specChanged(LocationTrackingSpec spec) {
|
protected void specChanged(LocationTrackingSpec spec) {
|
||||||
updateTitle();
|
updateTitle();
|
||||||
trackingLabel.setText("");
|
trackingLabel.setText("");
|
||||||
|
trackingLabel.setToolTipText("");
|
||||||
trackingLabel.setForeground(Colors.FOREGROUND);
|
trackingLabel.setForeground(Colors.FOREGROUND);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -206,9 +207,11 @@ public class DebuggerMemoryBytesProvider extends ProgramByteViewerComponentProvi
|
||||||
createActions();
|
createActions();
|
||||||
addDisplayListener(readsMemTrait.getDisplayListener());
|
addDisplayListener(readsMemTrait.getDisplayListener());
|
||||||
|
|
||||||
JPanel northPanel = new JPanel(new BorderLayout());
|
Box northPanel = Box.createHorizontalBox();
|
||||||
northPanel.add(locationLabel, BorderLayout.WEST);
|
northPanel.add(locationLabel);
|
||||||
northPanel.add(trackingLabel, BorderLayout.EAST);
|
locationLabel.setMinimumSize(new Dimension(0, 0));
|
||||||
|
northPanel.add(Box.createGlue());
|
||||||
|
northPanel.add(trackingLabel);
|
||||||
decorationComponent.add(northPanel, BorderLayout.NORTH);
|
decorationComponent.add(northPanel, BorderLayout.NORTH);
|
||||||
|
|
||||||
goToTrait.goToCoordinates(current);
|
goToTrait.goToCoordinates(current);
|
||||||
|
@ -479,7 +482,9 @@ public class DebuggerMemoryBytesProvider extends ProgramByteViewerComponentProvi
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void goToAndUpdateTrackingLabel(TraceProgramView curView, ProgramLocation loc) {
|
protected void goToAndUpdateTrackingLabel(TraceProgramView curView, ProgramLocation loc) {
|
||||||
trackingLabel.setText(trackingTrait.computeLabelText());
|
String labelText = trackingTrait.computeLabelText();
|
||||||
|
trackingLabel.setText(labelText);
|
||||||
|
trackingLabel.setToolTipText(labelText);
|
||||||
if (goTo(curView, loc)) {
|
if (goTo(curView, loc)) {
|
||||||
trackingLabel.setForeground(Colors.FOREGROUND);
|
trackingLabel.setForeground(Colors.FOREGROUND);
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,12 +112,16 @@ class EnumDB extends DataTypeDB implements Enum {
|
||||||
long minValue = valueMap.firstKey();
|
long minValue = valueMap.firstKey();
|
||||||
long maxValue = valueMap.lastKey();
|
long maxValue = valueMap.lastKey();
|
||||||
|
|
||||||
|
if (maxValue > getMaxPossibleValue(length, true)) {
|
||||||
|
if (minValue < 0) {
|
||||||
|
return INVALID;
|
||||||
|
}
|
||||||
|
return UNSIGNED;
|
||||||
|
}
|
||||||
|
|
||||||
if (minValue < 0) {
|
if (minValue < 0) {
|
||||||
return SIGNED;
|
return SIGNED;
|
||||||
}
|
}
|
||||||
if (maxValue > getMaxPossibleValue(length, true)) {
|
|
||||||
return UNSIGNED;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NONE; // we have no negatives and no large unsigned values
|
return NONE; // we have no negatives and no large unsigned values
|
||||||
}
|
}
|
||||||
|
@ -874,6 +878,19 @@ class EnumDB extends DataTypeDB implements Enum {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EnumSignedState getSignedState() {
|
||||||
|
lock.acquire();
|
||||||
|
try {
|
||||||
|
checkIsValid();
|
||||||
|
initializeIfNeeded();
|
||||||
|
return signedState;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
lock.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMinimumPossibleLength() {
|
public int getMinimumPossibleLength() {
|
||||||
lock.acquire();
|
lock.acquire();
|
||||||
|
|
|
@ -18,13 +18,14 @@ package ghidra.program.database.data;
|
||||||
/**
|
/**
|
||||||
* Keeps track of the signed state of an enum datatype. Enum are fundamentally either signed or
|
* Keeps track of the signed state of an enum datatype. Enum are fundamentally either signed or
|
||||||
* unsigned, but sometimes you can't tell based on the values they contain. Once a negative value
|
* unsigned, but sometimes you can't tell based on the values they contain. Once a negative value
|
||||||
* is added, then the enum becomes locked as signed, preventing high unsigned values from being
|
* is added, then the enum becomes locked as signed, preventing high unsigned values (those values
|
||||||
* added. Once a high value unsigned value is added, then it becomes locked as unsigned value. If
|
* that are too big for signed value of the enum size) from being added. Once a high value unsigned
|
||||||
* neither a negative value or high unsigned value has been added, then the enum is not locked as
|
* value is added, then it becomes locked as unsigned value. If neither a negative value or high
|
||||||
* either signed or unsigned.
|
* unsigned value has been added, then the enum is not locked as either signed or unsigned.
|
||||||
*/
|
*/
|
||||||
public enum EnumSignedState {
|
public enum EnumSignedState {
|
||||||
SIGNED, // Enum contains at least 1 negative value, preventing high unsigned values
|
SIGNED, // Enum contains at least 1 negative value, preventing high unsigned values
|
||||||
UNSIGNED, // Enum contains at least 1 high unsigned value, preventing negative values
|
UNSIGNED, // Enum contains at least 1 high unsigned value, preventing negative values
|
||||||
NONE // Enum contains neither a negative or a high unsigned value, so can go either way
|
NONE, // Enum contains neither a negative or a high unsigned value, so can go either way
|
||||||
|
INVALID // Enum contains both negative and high unsigned values; can happen with old types
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import java.math.BigInteger;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
import ghidra.docking.settings.Settings;
|
import ghidra.docking.settings.Settings;
|
||||||
|
import ghidra.program.database.data.EnumSignedState;
|
||||||
|
|
||||||
public interface Enum extends DataType {
|
public interface Enum extends DataType {
|
||||||
|
|
||||||
|
@ -133,6 +134,12 @@ public interface Enum extends DataType {
|
||||||
*/
|
*/
|
||||||
public boolean isSigned();
|
public boolean isSigned();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the signed state.
|
||||||
|
* @return the signed state.
|
||||||
|
*/
|
||||||
|
public EnumSignedState getSignedState();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the maximum value that this enum can represent based on its size and signedness.
|
* Returns the maximum value that this enum can represent based on its size and signedness.
|
||||||
* @return the maximum value that this enum can represent based on its size and signedness.
|
* @return the maximum value that this enum can represent based on its size and signedness.
|
||||||
|
|
|
@ -148,6 +148,11 @@ public class EnumDataType extends GenericDataType implements Enum {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(String valueName, long value, String comment) {
|
public void add(String valueName, long value, String comment) {
|
||||||
|
doAdd(valueName, value, comment);
|
||||||
|
signedState = computeSignedness();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doAdd(String valueName, long value, String comment) {
|
||||||
bitGroups = null;
|
bitGroups = null;
|
||||||
checkValue(value);
|
checkValue(value);
|
||||||
if (nameMap.containsKey(valueName)) {
|
if (nameMap.containsKey(valueName)) {
|
||||||
|
@ -161,8 +166,6 @@ public class EnumDataType extends GenericDataType implements Enum {
|
||||||
if (!StringUtils.isBlank(comment)) {
|
if (!StringUtils.isBlank(comment)) {
|
||||||
commentMap.put(valueName, comment);
|
commentMap.put(valueName, comment);
|
||||||
}
|
}
|
||||||
signedState = computeSignedness();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private EnumSignedState computeSignedness() {
|
private EnumSignedState computeSignedness() {
|
||||||
|
@ -172,12 +175,16 @@ public class EnumDataType extends GenericDataType implements Enum {
|
||||||
long minValue = valueMap.firstKey();
|
long minValue = valueMap.firstKey();
|
||||||
long maxValue = valueMap.lastKey();
|
long maxValue = valueMap.lastKey();
|
||||||
|
|
||||||
|
if (maxValue > getMaxPossibleValue(length, true)) {
|
||||||
|
if (minValue < 0) {
|
||||||
|
return INVALID;
|
||||||
|
}
|
||||||
|
return UNSIGNED;
|
||||||
|
}
|
||||||
|
|
||||||
if (minValue < 0) {
|
if (minValue < 0) {
|
||||||
return SIGNED;
|
return SIGNED;
|
||||||
}
|
}
|
||||||
if (maxValue > getMaxPossibleValue(length, true)) {
|
|
||||||
return UNSIGNED;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NONE; // we have no negatives and no large unsigned values
|
return NONE; // we have no negatives and no large unsigned values
|
||||||
}
|
}
|
||||||
|
@ -277,6 +284,11 @@ public class EnumDataType extends GenericDataType implements Enum {
|
||||||
return signedState == SIGNED;
|
return signedState == SIGNED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EnumSignedState getSignedState() {
|
||||||
|
return signedState;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getMinPossibleValue() {
|
public long getMinPossibleValue() {
|
||||||
return getMinPossibleValue(length, signedState != UNSIGNED);
|
return getMinPossibleValue(length, signedState != UNSIGNED);
|
||||||
|
@ -503,10 +515,10 @@ public class EnumDataType extends GenericDataType implements Enum {
|
||||||
commentMap = new HashMap<>();
|
commentMap = new HashMap<>();
|
||||||
setLength(enumm.getLength());
|
setLength(enumm.getLength());
|
||||||
String[] names = enumm.getNames();
|
String[] names = enumm.getNames();
|
||||||
|
signedState = enumm.getSignedState();
|
||||||
for (String valueName : names) {
|
for (String valueName : names) {
|
||||||
add(valueName, enumm.getValue(valueName), enumm.getComment(valueName));
|
doAdd(valueName, enumm.getValue(valueName), enumm.getComment(valueName));
|
||||||
}
|
}
|
||||||
computeSignedness();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue