Merge remote-tracking branch 'origin/GP-5959_James_improve_dwarf_macro_string_parsing'

This commit is contained in:
Ryan Kurtz
2025-08-29 13:24:38 -04:00
2 changed files with 67 additions and 6 deletions
@@ -34,7 +34,7 @@ public class DWARFMacroDefine extends DWARFMacroInfoEntry {
//@formatter:off
private static final Pattern PARSEMACROREGEX = Pattern.compile(
"([^( ]+)" + // "NAME" group=1
"|([^( ]+) ([^ ()]+)" + // "NAME VALUE" group=2,3
"|([^( ]+) (.+)" + // "NAME VALUE" group=2,3
"|([^( ]+)\\(([^)]+)\\) (.*)"); // "NAME(arg, arg) BODY" group=4,5,6
//@formatter:on
@@ -77,7 +77,7 @@ public class DWARFMacroDefine extends DWARFMacroInfoEntry {
if (m.group(2) != null) {
return new MacroInfo(macroString, m.group(2), List.of(), false, m.group(3));
}
if (m.group(4) != null) {
if (m.group(5) != null) {
return new MacroInfo(macroString, m.group(4), Arrays.asList(m.group(5).split(",")),
true, m.group(6));
}
@@ -90,7 +90,7 @@ public class DWARFMacroDefine extends DWARFMacroInfoEntry {
operandValues[1] = new DWARFStringAttribute(defineString, operandDef(1));
}
public DWARFMacroDefine(DWARFMacroInfoEntry other){
public DWARFMacroDefine(DWARFMacroInfoEntry other) {
super(other);
}
@@ -46,8 +46,9 @@ public class DWARFMacroParsingTests extends DWARFTestBase {
MacroInfo macroInfo = entry.getMacroInfo();
assertEquals(1, entry.getLineNumber());
assertFalse(macroInfo.isFunctionLike());
assertEquals("TEST", macroInfo.symbolName());
assertTrue(macroInfo.parameters().isEmpty());
assertEquals(macroInfo.definition(), StringUtils.EMPTY);
assertEquals(StringUtils.EMPTY, macroInfo.definition());
}
@Test
@@ -56,21 +57,81 @@ public class DWARFMacroParsingTests extends DWARFTestBase {
MacroInfo macroInfo = entry.getMacroInfo();
assertEquals(2, entry.getLineNumber());
assertFalse(macroInfo.isFunctionLike());
assertEquals("TEST", macroInfo.symbolName());
assertTrue(macroInfo.parameters().isEmpty());
assertEquals("0x4", macroInfo.definition());
}
@Test
public void testObjectListMacroExpression() throws IOException {
DWARFMacroDefine entry = new DWARFMacroDefine(2, "ONE_PLUS_TWO 1 + 2", header);
MacroInfo macroInfo = entry.getMacroInfo();
assertEquals(2, entry.getLineNumber());
assertFalse(macroInfo.isFunctionLike());
assertEquals("ONE_PLUS_TWO", macroInfo.symbolName());
assertTrue(macroInfo.parameters().isEmpty());
assertEquals("1 + 2", macroInfo.definition());
}
@Test
public void testObjectListMacroExpressionParens1() throws IOException {
DWARFMacroDefine entry = new DWARFMacroDefine(2, "ONE_PLUS_TWO (1) + (2)", header);
MacroInfo macroInfo = entry.getMacroInfo();
assertEquals(2, entry.getLineNumber());
assertFalse(macroInfo.isFunctionLike());
assertEquals("ONE_PLUS_TWO", macroInfo.symbolName());
assertTrue(macroInfo.parameters().isEmpty());
assertEquals("(1) + (2)", macroInfo.definition());
}
@Test
public void testObjectListMacroExpressionParens2() throws IOException {
DWARFMacroDefine entry = new DWARFMacroDefine(2, "ONE_PLUS_TWO ((1) + (2))", header);
MacroInfo macroInfo = entry.getMacroInfo();
assertEquals(2, entry.getLineNumber());
assertFalse(macroInfo.isFunctionLike());
assertEquals("ONE_PLUS_TWO", macroInfo.symbolName());
assertTrue(macroInfo.parameters().isEmpty());
assertEquals("((1) + (2))", macroInfo.definition());
}
@Test
public void testFunctionLikeMacro() throws IOException {
DWARFMacroDefine entry = new DWARFMacroDefine(3, "SUM(A,B) (A+B)", header);
DWARFMacroDefine entry = new DWARFMacroDefine(3, "SUM(A,B) A + B", header);
MacroInfo macroInfo = entry.getMacroInfo();
assertEquals(3, entry.getLineNumber());
assertTrue(macroInfo.isFunctionLike());
assertEquals("SUM", macroInfo.symbolName());
assertEquals(2, macroInfo.parameters().size());
assertEquals("A", macroInfo.parameters().get(0));
assertEquals("B", macroInfo.parameters().get(1));
assertEquals("(A+B)", macroInfo.definition());
assertEquals("A + B", macroInfo.definition());
}
@Test
public void testFunctionLikeMacroParens1() throws IOException {
DWARFMacroDefine entry = new DWARFMacroDefine(3, "SUM(A,B) (A) + (B)", header);
MacroInfo macroInfo = entry.getMacroInfo();
assertEquals(3, entry.getLineNumber());
assertTrue(macroInfo.isFunctionLike());
assertEquals("SUM", macroInfo.symbolName());
assertEquals(2, macroInfo.parameters().size());
assertEquals("A", macroInfo.parameters().get(0));
assertEquals("B", macroInfo.parameters().get(1));
assertEquals("(A) + (B)", macroInfo.definition());
}
@Test
public void testFunctionLikeMacroParens2() throws IOException {
DWARFMacroDefine entry = new DWARFMacroDefine(3, "SUM(A,B) ((A) + (B))", header);
MacroInfo macroInfo = entry.getMacroInfo();
assertEquals(3, entry.getLineNumber());
assertTrue(macroInfo.isFunctionLike());
assertEquals("SUM", macroInfo.symbolName());
assertEquals(2, macroInfo.parameters().size());
assertEquals("A", macroInfo.parameters().get(0));
assertEquals("B", macroInfo.parameters().get(1));
assertEquals("((A) + (B))", macroInfo.definition());
}
}