From 7b802376f769bb54286ca73cf1eb0675f41f3bfb Mon Sep 17 00:00:00 2001 From: "Keith W. Campbell" Date: Mon, 17 Sep 2018 21:31:03 -0400 Subject: [PATCH] Support 128-bit register values in javacore files Signed-off-by: Keith W. Campbell --- .../platform/PlatformSectionParser.java | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/jcl/src/openj9.dtfj/share/classes/com/ibm/dtfj/javacore/parser/j9/section/platform/PlatformSectionParser.java b/jcl/src/openj9.dtfj/share/classes/com/ibm/dtfj/javacore/parser/j9/section/platform/PlatformSectionParser.java index d77e10d9022..8c6b21640be 100644 --- a/jcl/src/openj9.dtfj/share/classes/com/ibm/dtfj/javacore/parser/j9/section/platform/PlatformSectionParser.java +++ b/jcl/src/openj9.dtfj/share/classes/com/ibm/dtfj/javacore/parser/j9/section/platform/PlatformSectionParser.java @@ -22,6 +22,7 @@ *******************************************************************************/ package com.ibm.dtfj.javacore.parser.j9.section.platform; +import java.math.BigInteger; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.LinkedHashMap; @@ -173,23 +174,29 @@ private void moduleInfo() throws ParserException { * @throws ParserException */ private void registerInfo() throws ParserException { - IAttributeValueMap results; - // T_1XHREGISTERS line if present indicates registers if (processTagLineOptional(T_1XHREGISTERS) != null) { - Map m = new LinkedHashMap(); - while((results = processTagLineOptional(T_2XHREGISTER)) != null) { + Map m = new LinkedHashMap<>(); + IAttributeValueMap results; + while ((results = processTagLineOptional(T_2XHREGISTER)) != null) { String name = results.getTokenValue(PL_REGISTER_NAME); - String val = results.getTokenValue(PL_REGISTER_VALUE); - Number n; - if (val == null) { - n = null; - } else if (val.startsWith("0x") && val.length() <= 2+4) { - n = Short.valueOf((short)results.getIntValue(PL_REGISTER_VALUE)); - } else if (val.startsWith("0x") && val.length() <= 2+8) { - n = Integer.valueOf((int)results.getLongValue(PL_REGISTER_VALUE)); - } else { - n = Long.valueOf(results.getLongValue(PL_REGISTER_VALUE)); + String value = results.getTokenValue(PL_REGISTER_VALUE); + Number n = null; + if (value != null) { + // normally there's no '0x' prefix, but remove it if present + String digits = value.regionMatches(true, 0, "0x", 0, 2) ? value.substring(2) : value; + // register values are always in hex + BigInteger bigN = new BigInteger(digits, 16); + int bits = bigN.bitLength(); + if (bits <= 16) { + n = Short.valueOf((short) bigN.intValue()); + } else if (bits <= 32) { + n = Integer.valueOf(bigN.intValue()); + } else if (bits <= 64) { + n = Long.valueOf(bigN.longValue()); + } else { + n = bigN; + } } m.put(name, n); }