mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-23 09:45:53 +08:00
Merge remote-tracking branch 'origin/GP-5959_James_improve_dwarf_macro_string_parsing'
This commit is contained in:
+3
-3
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+64
-3
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user