1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-03-28 14:56:28 +01:00

Update tests for GDB >= 12 for change in formatted values

From GDB news:

print
  Printing of floating-point values with base-modifying formats like
  /x has been changed to display the underlying bytes of the value in
  the desired base.  This was GDB's documented behavior, but was never
  implemented correctly.

This commit updates the tests to accomodate GDB's change.

Fixes #210
This commit is contained in:
Jonah Graham 2022-05-02 21:02:14 -04:00
parent 0d60cb3fdc
commit a3fe42d7af
4 changed files with 140 additions and 45 deletions

View file

@ -33,7 +33,8 @@ jlevel="${default_jlevel}"
# Supported versions
# Note starting in GDB 9.x the .x is the patch release, so for example we have 9.2 in this list, but not 9.1.
default_versions="12.1 11.2 10.2 9.2 8.3.1 8.2.1 8.1.1 8.0.1 7.12.1 7.11.1 7.10.1 7.9.1 7.8.2 7.7.1 7.6.2 7.5.1 7.4.1 7.3.1 7.2 7.1 7.0.1 6.8 6.7.1 6.6"
old_version="9.2 8.3.1 8.2.1 8.1.1 8.0.1 7.12.1 7.11.1 7.10.1 7.9.1 7.8.2 7.7.1 7.6.2 7.5.1 7.4.1 7.3.1 7.2 7.1 7.0.1 6.8 6.7.1 6.6"
default_versions="16.1 15.2 14.2 13.2 12.1 11.2 10.2"
# Is set to "echo" if we are doing a dry-run.
dryrun=""
@ -65,6 +66,8 @@ function help_and_exit() {
echo ""
echo "Supported versions:"
echo " ${default_versions}"
echo "Older versions:"
echo " ${old_version}"
echo ""
echo "Examples:"
echo " Build versions 7.7.1 and 7.8.2:"
@ -89,6 +92,7 @@ function echo_header() {
# $1: version number
function check_supported() {
local supported_pattern="@(${default_versions// /|})"
local old_pattern="@(${old_version// /|})"
local version="$1"
shopt -s extglob
@ -96,6 +100,9 @@ function check_supported() {
${supported_pattern})
# Supported, do nothing.
;;
${old_pattern})
# Supported, do nothing.
;;
*)
echo "Error: version ${version} is not supported by this script."
echo ""

View file

@ -40,9 +40,17 @@ public class ITestConstants {
// From GDB 9 the number scheme changed to MAJOR.PATCH so 9.2 is a patch for 9.1 release
public static final String SUFFIX_GDB_9 = "9";
public static final String SUFFIX_GDB_10 = "10";
public static final String SUFFIX_GDB_11 = "11";
public static final String SUFFIX_GDB_12 = "12";
public static final String SUFFIX_GDB_13 = "13";
public static final String SUFFIX_GDB_14 = "14";
public static final String SUFFIX_GDB_15 = "15";
public static final String SUFFIX_GDB_16 = "16";
public static String[] ALL_SUPPORTED_VERSIONS = new String[] {
// add new versions here
ITestConstants.SUFFIX_GDB_16, ITestConstants.SUFFIX_GDB_15, ITestConstants.SUFFIX_GDB_14,
ITestConstants.SUFFIX_GDB_13, ITestConstants.SUFFIX_GDB_12, ITestConstants.SUFFIX_GDB_11,
ITestConstants.SUFFIX_GDB_10, ITestConstants.SUFFIX_GDB_9, ITestConstants.SUFFIX_GDB_8_3,
ITestConstants.SUFFIX_GDB_8_2, ITestConstants.SUFFIX_GDB_8_1, ITestConstants.SUFFIX_GDB_8_0, };

View file

@ -207,11 +207,11 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
tests.put("-100.0 / 3.0", new String[] { "0xffffffffffffffdf", "01777777777777777777737",
"1111111111111111111111111111111111111111111111111111111111011111", "-33", "-33.3333", "-33.3333" });
tests.put("-100.0 / -3.0", new String[] { "0x21", "041", "100001", "33", "33.3333", "33.3333" });
executeExpressionSubTests(tests, false, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
executeExpressionSubTests(tests, false, true, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
tests.clear();
tests.put("100.0 / 0.5", new String[] { "0xc8", "0310", "11001000", "200", "200", "200" });
executeExpressionSubTests(tests, true, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
executeExpressionSubTests(tests, true, true, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
}
@ -225,61 +225,68 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
MIStoppedEvent stoppedEvent = runToTag("testLocals_init");
// Create a map of expressions to expected values.
Map<String, String[]> testsFloat1 = new HashMap<>();
Map<String, String[]> tests1 = new HashMap<>();
tests1.put("lIntVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
tests1.put("lDoubleVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345.123449999999",
"12345.123449999999" });
testsFloat1.put("lDoubleVar", new String[] { "0x3039", "030071", "11000000111001", "12345",
"12345.123449999999", "12345.123449999999" });
tests1.put("lCharVar", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
tests1.put("lBoolVar", new String[] { "0x0", "0", "0", "0", "false", "false" });
tests1.put("lIntArray[1]", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
tests1.put("lDoubleArray[1]", new String[] { "0x3039", "030071", "11000000111001", "12345",
testsFloat1.put("lDoubleArray[1]", new String[] { "0x3039", "030071", "11000000111001", "12345",
"12345.123449999999", "12345.123449999999" });
tests1.put("lCharArray[1]", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
tests1.put("lBoolArray[1]", new String[] { "0x0", "0", "0", "0", "false", "false" });
tests1.put("*lIntPtr", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
tests1.put("*lDoublePtr", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345.123449999999",
"12345.123449999999" });
testsFloat1.put("*lDoublePtr", new String[] { "0x3039", "030071", "11000000111001", "12345",
"12345.123449999999", "12345.123449999999" });
tests1.put("*lCharPtr", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
tests1.put("*lBoolPtr", new String[] { "0x0", "0", "0", "0", "false", "false" });
tests1.put("lIntPtr2", new String[] { "0x1", "01", "1", "1", "0x1", "0x1" });
tests1.put("lDoublePtr2", new String[] { "0x2345", "021505", "10001101000101", "9029", "0x2345", "0x2345" });
testsFloat1.put("lDoublePtr2",
new String[] { "0x2345", "021505", "10001101000101", "9029", "0x2345", "0x2345" });
// GDB says a char* is out of bounds, but not the other pointers???
// tests1.put("CharPtr2", new String[] { "0x1234", "011064",
// "1001000110100", "4660", "0x1234" });
tests1.put("lBoolPtr2", new String[] { "0x123ABCDE", "02216536336", "10010001110101011110011011110",
"305839326", "0x123ABCDE", "0x123ABCDE" });
executeExpressionSubTests(tests1, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
executeExpressionSubTests(testsFloat1, true, true, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
executeExpressionSubTests(tests1, true, false, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
// Step into the method and stop until all new local variables are
// initialized
stoppedEvent = runToTag("locals2_init");
// Create a map of expressions to expected values.
Map<String, String[]> testsFloat2 = new HashMap<>();
Map<String, String[]> tests2 = new HashMap<>();
tests2.put("lIntVar", new String[] { "0x1a85", "015205", "1101010000101", "6789", "6789", "6789" });
tests2.put("lDoubleArray[1]", new String[] { "0x1a85", "015205", "1101010000101", "6789", "6789.6788999999999",
"6789.6788999999999" });
testsFloat2.put("lDoubleArray[1]", new String[] { "0x1a85", "015205", "1101010000101", "6789",
"6789.6788999999999", "6789.6788999999999" });
tests2.put("lCharVar", new String[] { "0x69", "0151", "1101001", "105", "105 'i'", "105 'i'" });
tests2.put("*lCharPtr", new String[] { "0x69", "0151", "1101001", "105", "105 'i'", "105 'i'" });
tests2.put("lBoolPtr2", new String[] { "0xABCDE123", "025363360443", "10101011110011011110000100100011",
"2882396451", "0xABCDE123", "0xABCDE123" });
// check variables at current stack frame
executeExpressionSubTests(tests2, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
executeExpressionSubTests(testsFloat2, true, true, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
executeExpressionSubTests(tests2, true, false, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
// check previous stack frame
executeExpressionSubTests(tests1, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1));
executeExpressionSubTests(testsFloat1, true, true, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1));
executeExpressionSubTests(tests1, true, false, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 1));
// Now return from the method and check that we see the
// original variables. We must use the right context to restore the right stack frame
stoppedEvent = SyncUtil.step(stoppedEvent.getDMContext(), StepType.STEP_RETURN);
executeExpressionSubTests(tests1, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
executeExpressionSubTests(testsFloat1, true, true, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
executeExpressionSubTests(tests1, true, false, SyncUtil.getStackFrame(stoppedEvent.getDMContext(), 0));
}
/**
@ -1353,20 +1360,42 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
// Global variables
tests.put("gIntVar", new String[] { "0x21F", "01037", "1000011111", "543", "543", "543" });
tests.put("gDoubleVar",
new String[] { "0x21F", "01037", "1000011111", "543", "543.54300000000001", "543.54300000000001" });
if (isGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_12)) {
tests.put("gDoubleVar",
new String[] { "0x4080fc5810624dd3", "0402007705402030446723",
"100000010000000111111000101100000010000011000100100110111010011", "4647992270608551379",
"543.54300000000001", "543.54300000000001" });
} else {
tests.put("gDoubleVar",
new String[] { "0x21F", "01037", "1000011111", "543", "543.54300000000001", "543.54300000000001" });
}
tests.put("gCharVar", new String[] { "0x67", "0147", "1100111", "103", "103 'g'", "103 'g'" });
tests.put("gBoolVar", new String[] { "0x0", "0", "0", "0", "false", "false" });
tests.put("gIntArray[1]", new String[] { "0x28E", "01216", "1010001110", "654", "654", "654" });
tests.put("gDoubleArray[1]",
new String[] { "0x28E", "01216", "1010001110", "654", "654.32100000000003", "654.32100000000003" });
if (isGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_12)) {
tests.put("gDoubleArray[1]",
new String[] { "0x408472916872b021", "0402043451055034530041",
"100000010000100011100101001000101101000011100101011000000100001", "4648966684201365537",
"654.32100000000003", "654.32100000000003" });
} else {
tests.put("gDoubleArray[1]",
new String[] { "0x28E", "01216", "1010001110", "654", "654.32100000000003", "654.32100000000003" });
}
tests.put("gCharArray[1]", new String[] { "0x64", "0144", "1100100", "100", "100 'd'", "100 'd'" });
tests.put("gBoolArray[1]", new String[] { "0x0", "0", "0", "0", "false", "false" });
tests.put("*gIntPtr", new String[] { "0x21F", "01037", "1000011111", "543", "543", "543" });
tests.put("*gDoublePtr",
new String[] { "0x21F", "01037", "1000011111", "543", "543.54300000000001", "543.54300000000001" });
if (isGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_12)) {
tests.put("*gDoublePtr",
new String[] { "0x4080fc5810624dd3", "0402007705402030446723",
"100000010000000111111000101100000010000011000100100110111010011", "4647992270608551379",
"543.54300000000001", "543.54300000000001" });
} else {
tests.put("*gDoublePtr",
new String[] { "0x21F", "01037", "1000011111", "543", "543.54300000000001", "543.54300000000001" });
}
tests.put("*gCharPtr", new String[] { "0x67", "0147", "1100111", "103", "103 'g'", "103 'g'" });
tests.put("*gBoolPtr", new String[] { "0x0", "0", "0", "0", "false", "false" });
@ -2092,11 +2121,17 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
if (!isSuccess()) {
wait.waitFinished(getStatus());
} else {
if (getData().getFormattedValue().equals("0x1")) {
String expected;
if (isGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_12)) {
expected = "0x3fffd70a3d70a3d7";
} else {
expected = "0x1";
}
if (getData().getFormattedValue().equals(expected)) {
wait.waitFinished();
} else {
wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
"Failed evaluating a, expected 0x1 but got "
"Failed evaluating a, expected " + expected + " but got "
+ getData().getFormattedValue(),
null));
}
@ -2189,7 +2224,13 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
} else {
// check that we have the proper value
// This will cache the value 1 in the natural format cache
final String valueStr = "1";
final String valueNaturalStr = "1";
final String valueDecimalStr;
if (isGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_12)) {
valueDecimalStr = "4607182418800017408";
} else {
valueDecimalStr = "1";
}
globalExpressionCtx1 = getData()[0];
wait.increment();
@ -2201,13 +2242,13 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
protected void handleCompleted() {
if (!isSuccess()) {
wait.waitFinished(getStatus());
} else if (getData().getFormattedValue().equals(valueStr)) {
} else if (getData().getFormattedValue().equals(valueNaturalStr)) {
wait.waitFinished();
} else {
wait.waitFinished(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID,
"Failed evaluating " + globalExpressionCtx1.getExpression()
+ ", got " + getData().getFormattedValue()
+ " instead of " + valueStr,
+ " instead of " + valueNaturalStr,
null));
}
}
@ -2224,7 +2265,7 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
if (!isSuccess()) {
wait.waitFinished(getStatus());
} else {
if (getData().getFormattedValue().equals(valueStr)) {
if (getData().getFormattedValue().equals(valueDecimalStr)) {
wait.waitFinished();
} else {
wait.waitFinished(new Status(IStatus.ERROR,
@ -2232,7 +2273,7 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
"Failed evaluating "
+ globalExpressionCtx1.getExpression()
+ ", got " + getData().getFormattedValue()
+ " instead of " + valueStr,
+ " instead of " + valueDecimalStr,
null));
}
}
@ -2783,9 +2824,20 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
* will be. When this param is false, then we consider it a match
* if, e.g., the gdb expression resolves to "1.23456789", but the
* caller only supplied "1.2345".
* @param isFloat
* on GDB >= 12, when expected values are floating point the
* value that is printed is the underlying bytes
* From GDB news:
*
* print
* Printing of floating-point values with base-modifying formats like
* /x has been changed to display the underlying bytes of the value in
* the desired base. This was GDB's documented behavior, but was never
* implemented correctly.
*
*/
private void executeExpressionSubTests(final Map<String, String[]> tests, final boolean exact, IDMContext dmc)
throws Throwable {
private void executeExpressionSubTests(final Map<String, String[]> tests, final boolean exact,
final boolean isFloat, IDMContext dmc) throws Throwable {
// Now evaluate each of the above expressions and compare the actual
// value against
@ -2872,7 +2924,14 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
expectedValue.length());
}
if (actualValue.equalsIgnoreCase(expectedValue)) {
if (isFloat && isGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_12)
&& !formatId.equals(IFormattedValues.NATURAL_FORMAT)
&& !formatId.equals(MIExpressions.DETAILS_FORMAT)) {
// there is little value in ensuring that GDB formatted
// a number correctly in this case, so mark this as
// passed
wait.waitFinished();
} else if (actualValue.equalsIgnoreCase(expectedValue)) {
wait.waitFinished();
} else {
String errorMsg = "Failed to correctly evalutate '"
@ -2896,7 +2955,7 @@ public class MIExpressionsTest extends BaseParametrizedTestCase {
}
private void executeExpressionSubTests(final Map<String, String[]> tests, IDMContext dmc) throws Throwable {
executeExpressionSubTests(tests, true, dmc);
executeExpressionSubTests(tests, true, false, dmc);
}
private boolean addressesEqual(IExpressionDMAddress addrToTest, String addrStr, int size) {

View file

@ -347,11 +347,11 @@ public class PostMortemCoreTest extends BaseParametrizedTestCase {
tests.put("-100.0 / 3.0", new String[] { "0xffffffffffffffdf", "01777777777777777777737",
"1111111111111111111111111111111111111111111111111111111111011111", "-33", "-33.3333", "-33.3333" });
tests.put("-100.0 / -3.0", new String[] { "0x21", "041", "100001", "33", "33.3333", "33.3333" });
executeExpressionSubTests(tests, false, SyncUtil.getStackFrame(SyncUtil.getExecutionContext(0), 0));
executeExpressionSubTests(tests, false, true, SyncUtil.getStackFrame(SyncUtil.getExecutionContext(0), 0));
tests.clear();
tests.put("100.0 / 0.5", new String[] { "0xc8", "0310", "11001000", "200", "200", "200" });
executeExpressionSubTests(tests, true, SyncUtil.getStackFrame(SyncUtil.getExecutionContext(0), 0));
executeExpressionSubTests(tests, true, true, SyncUtil.getStackFrame(SyncUtil.getExecutionContext(0), 0));
}
@ -364,35 +364,38 @@ public class PostMortemCoreTest extends BaseParametrizedTestCase {
doLaunch();
// Create a map of expressions to expected values.
Map<String, String[]> testsFloat1 = new HashMap<>();
Map<String, String[]> tests1 = new HashMap<>();
tests1.put("lIntVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
tests1.put("lDoubleVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345.123449999999",
"12345.123449999999" });
testsFloat1.put("lDoubleVar", new String[] { "0x3039", "030071", "11000000111001", "12345",
"12345.123449999999", "12345.123449999999" });
tests1.put("lCharVar", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
tests1.put("lBoolVar", new String[] { "0x0", "0", "0", "0", "false", "false" });
tests1.put("lIntArray[1]", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
tests1.put("lDoubleArray[1]", new String[] { "0x3039", "030071", "11000000111001", "12345",
testsFloat1.put("lDoubleArray[1]", new String[] { "0x3039", "030071", "11000000111001", "12345",
"12345.123449999999", "12345.123449999999" });
tests1.put("lCharArray[1]", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
tests1.put("lBoolArray[1]", new String[] { "0x0", "0", "0", "0", "false", "false" });
tests1.put("*lIntPtr", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345", "12345" });
tests1.put("*lDoublePtr", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345.123449999999",
"12345.123449999999" });
testsFloat1.put("*lDoublePtr", new String[] { "0x3039", "030071", "11000000111001", "12345",
"12345.123449999999", "12345.123449999999" });
tests1.put("*lCharPtr", new String[] { "0x6d", "0155", "1101101", "109", "109 'm'", "109 'm'" });
tests1.put("*lBoolPtr", new String[] { "0x0", "0", "0", "0", "false", "false" });
tests1.put("lIntPtr2", new String[] { "0x1", "01", "1", "1", "0x1", "0x1" });
tests1.put("lDoublePtr2", new String[] { "0x2345", "021505", "10001101000101", "9029", "0x2345", "0x2345" });
testsFloat1.put("lDoublePtr2",
new String[] { "0x2345", "021505", "10001101000101", "9029", "0x2345", "0x2345" });
// GDB says a char* is out of bounds, but not the other pointers???
// tests1.put("CharPtr2", new String[] { "0x1234", "011064",
// "1001000110100", "4660", "0x1234" });
tests1.put("lBoolPtr2", new String[] { "0x123ABCDE", "02216536336", "10010001110101011110011011110",
"305839326", "0x123ABCDE", "0x123ABCDE" });
executeExpressionSubTests(tests1, SyncUtil.getStackFrame(SyncUtil.getExecutionContext(0), 0));
executeExpressionSubTests(testsFloat1, true, true, SyncUtil.getStackFrame(SyncUtil.getExecutionContext(0), 0));
executeExpressionSubTests(tests1, true, false, SyncUtil.getStackFrame(SyncUtil.getExecutionContext(0), 0));
}
@Test
@ -503,9 +506,20 @@ public class PostMortemCoreTest extends BaseParametrizedTestCase {
* will be. When this param is false, then we consider it a match
* if, e.g., the gdb expression resolves to "1.23456789", but the
* caller only supplied "1.2345".
* @param isFloat
* on GDB >= 12, when expected values are floating point the
* value that is printed is the underlying bytes
* From GDB news:
*
* print
* Printing of floating-point values with base-modifying formats like
* /x has been changed to display the underlying bytes of the value in
* the desired base. This was GDB's documented behavior, but was never
* implemented correctly.
*
*/
private void executeExpressionSubTests(final Map<String, String[]> tests, final boolean exact, IDMContext dmc)
throws Throwable {
private void executeExpressionSubTests(final Map<String, String[]> tests, final boolean exact,
final boolean isFloat, IDMContext dmc) throws Throwable {
// Now evaluate each of the above expressions and compare the actual
// value against
@ -593,7 +607,14 @@ public class PostMortemCoreTest extends BaseParametrizedTestCase {
expectedValue.length());
}
if (actualValue.equalsIgnoreCase(expectedValue)) {
if (isFloat && isGdbVersionAtLeast(ITestConstants.SUFFIX_GDB_12)
&& !formatId.equals(IFormattedValues.NATURAL_FORMAT)
&& !formatId.equals(MIExpressions.DETAILS_FORMAT)) {
// there is little value in ensuring that GDB formatted
// a number correctly in this case, so mark this as
// passed
wait.waitFinished();
} else if (actualValue.equalsIgnoreCase(expectedValue)) {
wait.waitFinished();
} else {
String errorMsg = "Failed to correctly evalutate '"
@ -615,6 +636,6 @@ public class PostMortemCoreTest extends BaseParametrizedTestCase {
}
private void executeExpressionSubTests(final Map<String, String[]> tests, IDMContext dmc) throws Throwable {
executeExpressionSubTests(tests, true, dmc);
executeExpressionSubTests(tests, true, false, dmc);
}
}