GP-3215 removed wchar_t as a keyword and convert any wchar_t typedef to

built-in wchar_t
This commit is contained in:
emteere 2023-04-03 19:54:45 +00:00
parent c4d0c7928b
commit 8c71f9d7fa
3 changed files with 96 additions and 21 deletions

View file

@ -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__",

View file

@ -221,8 +221,15 @@ public class CParser {
}
}
// 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 :
|
<W64 : "__w64">
|
<WCHAR : "wchar_t">
|
<ENUM : "enum">
|
<AUTO : "auto">
@ -1605,8 +1609,6 @@ Declaration BuiltInTypeSpecifier(Declaration dec) : {
dec.setDataType(dt);
}
|
<WCHAR> { dec.setDataType(resolveInternal(WideCharDataType.dataType)); }
|
<SHORT> { dt = dec.getDataType();
if (dt == null) {
dt = resolveInternal(ShortDataType.dataType);

View file

@ -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();
@ -96,6 +120,59 @@ public class CParserTest extends AbstractGenericTest {
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 {