diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/macro/entry/DWARFMacroDefine.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/macro/entry/DWARFMacroDefine.java index 37f7d1636c..aa851938e5 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/macro/entry/DWARFMacroDefine.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/macro/entry/DWARFMacroDefine.java @@ -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); } diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/util/bin/format/dwarf/macro/DWARFMacroParsingTests.java b/Ghidra/Features/Base/src/test/java/ghidra/app/util/bin/format/dwarf/macro/DWARFMacroParsingTests.java index acfc2d3757..3975f129b3 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/app/util/bin/format/dwarf/macro/DWARFMacroParsingTests.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/app/util/bin/format/dwarf/macro/DWARFMacroParsingTests.java @@ -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()); } }