diff --git a/Ghidra/Features/Base/ghidra_scripts/CreateDefaultGDTArchivesScript.java b/Ghidra/Features/Base/ghidra_scripts/CreateDefaultGDTArchivesScript.java index fe48e7c568..d84e1341c5 100644 --- a/Ghidra/Features/Base/ghidra_scripts/CreateDefaultGDTArchivesScript.java +++ b/Ghidra/Features/Base/ghidra_scripts/CreateDefaultGDTArchivesScript.java @@ -297,7 +297,6 @@ public class CreateDefaultGDTArchivesScript extends GhidraScript { "-DSTRSAFE_LIB", "-DSTRSAFE_LIB_IMPL", "-DLPSKBINFO=LPARAM", - "-D_WCHAR_T_DEFINED", "-DCONST=const", "-D_CRT_SECURE_NO_WARNINGS", "-D_CRT_NONSTDC_NO_DEPRECATE", @@ -517,7 +516,6 @@ public class CreateDefaultGDTArchivesScript extends GhidraScript { "-DSTRSAFE_LIB", "-DSTRSAFE_LIB_IMPL", "-DLPSKBINFO=LPARAM", - "-D_WCHAR_T_DEFINED", "-DCONST=const", "-D_CRT_SECURE_NO_WARNINGS", "-D_CRT_NONSTDC_NO_DEPRECATE", @@ -776,7 +774,6 @@ public class CreateDefaultGDTArchivesScript extends GhidraScript { "-D__builtin_va_list=void *", "-D__DO_NOT_DEFINE_COMPILE", "-D_Complex", - "-D_WCHAR_T", "-D__NO_STRING_INLINES", "-D__signed__", "-D__extension__=", @@ -1027,7 +1024,6 @@ public class CreateDefaultGDTArchivesScript extends GhidraScript { "-D__builtin_va_list=void *", "-D__DO_NOT_DEFINE_COMPILE", "-D_Complex", - "-D_WCHAR_T", "-D__NO_STRING_INLINES", "-D__NO_LONG_DOUBLE_MATH", "-D__signed__", diff --git a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj index 2aea289b8d..320fa0e0b9 100644 --- a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj +++ b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj @@ -221,8 +221,15 @@ public class CParser { } } - dt = new TypedefDataType(getCurrentCategoryPath(), type, dt, dtMgr); - dt = addDef(types, type, dt); + // TODO: for builtin-Types, override with the built-in + // wchar_t, etc... + if (type.equals("wchar_t")) { + dt = WideCharDataType.dataType; + } else { + dt = new TypedefDataType(getCurrentCategoryPath(), type, dt, dtMgr); + } + dt = addDef(types, type, dt); + return dt; } @@ -257,12 +264,11 @@ public class CParser { } // check the BuiltinTypeManager - // Don't check, left in in case basic types like uint64_t are in builtins - // BuiltInDataTypeManager builtInMgr = BuiltInDataTypeManager.getDataTypeManager(); - // DataType bdt = findDataType(builtInMgr, type); - // if (bdt != null) { - // return bdt; - // } + BuiltInDataTypeManager builtInMgr = BuiltInDataTypeManager.getDataTypeManager(); + DataType bdt = findDataType(builtInMgr, type); + if (bdt != null) { + return bdt; + } possiblyUndefinedType = type; return null; @@ -1177,8 +1183,6 @@ TOKEN : | | - - | | @@ -1605,8 +1609,6 @@ Declaration BuiltInTypeSpecifier(Declaration dec) : { dec.setDataType(dt); } | - { dec.setDataType(resolveInternal(WideCharDataType.dataType)); } - | { dt = dec.getDataType(); if (dt == null) { dt = resolveInternal(ShortDataType.dataType); diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java b/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java index 2ecc411491..3c9f2bd335 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/CParserTest.java @@ -15,22 +15,46 @@ */ package ghidra.app.util.cparser; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; -import java.io.File; import java.io.InputStream; import java.util.ArrayList; import org.junit.Assert; import org.junit.Test; -import generic.test.AbstractGenericTest; import ghidra.app.util.cparser.C.CParser; import ghidra.app.util.cparser.C.ParseException; -import ghidra.program.model.data.*; +import ghidra.program.model.data.Array; +import ghidra.program.model.data.BuiltInDataType; +import ghidra.program.model.data.CategoryPath; +import ghidra.program.model.data.CharDataType; +import ghidra.program.model.data.DataType; +import ghidra.program.model.data.DataTypeComponent; +import ghidra.program.model.data.DataTypeConflictHandler; +import ghidra.program.model.data.DataTypeManager; import ghidra.program.model.data.Enum; +import ghidra.program.model.data.FunctionDefinition; +import ghidra.program.model.data.GenericCallingConvention; +import ghidra.program.model.data.LongLongDataType; +import ghidra.program.model.data.ParameterDefinition; +import ghidra.program.model.data.Pointer; +import ghidra.program.model.data.ShortDataType; +import ghidra.program.model.data.StandAloneDataTypeManager; +import ghidra.program.model.data.Structure; +import ghidra.program.model.data.StructureDataType; +import ghidra.program.model.data.TypeDef; +import ghidra.program.model.data.TypedefDataType; +import ghidra.program.model.data.UnsignedLongDataType; +import ghidra.program.model.data.UnsignedLongLongDataType; +import ghidra.program.model.data.UnsignedShortDataType; +import ghidra.program.model.data.WideCharDataType; +import ghidra.test.AbstractGhidraHeadlessIntegrationTest; -public class CParserTest extends AbstractGenericTest { +public class CParserTest extends AbstractGhidraHeadlessIntegrationTest { public CParserTest() { super(); @@ -95,6 +119,59 @@ public class CParserTest extends AbstractGenericTest { assertTrue(pdt32.getName().equals("uint64_t")); assertEquals(8, pdt32.getLength()); } + + @Test + public void testWcharT() throws Exception { + + DataType dt; + Structure sdt; + DataTypeComponent comp; + + CParser parser; + + parser = new CParser(); + dt = parser.parse("typedef int wchar_t;"); + + assertTrue(dt instanceof WideCharDataType); + + parser = new CParser(); + dt = parser.parse("struct mystruct {" + + " wchar_t defined_wchar_t;" + + "};"); + + sdt = (Structure) dt; + comp = sdt.getComponent(0); + assertTrue(comp.getDataType() instanceof WideCharDataType); + + parser = new CParser(); + dt = parser.parse("typedef int wchar_t;" + + "struct mystruct {" + + " wchar_t defined_wchar_t;" + + "};"); + + sdt = (Structure) dt; + comp = sdt.getComponent(0); + assertTrue(comp.getDataType() instanceof WideCharDataType); + + + parser = new CParser(); + dt = parser.parse("typedef short wchar_t;" + + " typedef wchar_t foo;"); + + assertTrue(dt != null); + assertTrue(dt instanceof TypeDef); + assertTrue(dt.getName().equals("foo")); + assertEquals(2, dt.getLength()); + assertTrue(((TypeDef) dt).getBaseDataType() instanceof BuiltInDataType); + + parser = new CParser(); + DataType pdt32 = parser.parse("typedef wchar_t foo;"); + assertTrue(dt != null); + assertTrue(dt instanceof TypeDef); + assertTrue(dt.getName().equals("foo")); + assertEquals(2, dt.getLength()); + assertTrue(((TypeDef) dt).getBaseDataType() instanceof BuiltInDataType); + } @Test public void testParseDataType_NoSubArchive() throws Exception {