diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledDataType.java index 0cc409fc72..d6f907aa0e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledDataType.java @@ -95,8 +95,8 @@ public class DemangledDataType extends DemangledType { private static final String UNSIGNED_LONG = "unsigned long"; public final static String[] PRIMITIVES = - { VOID, BOOL, CHAR, WCHAR_T, WCHAR16, WCHAR32, CHAR8_T, SHORT, INT, INT0_T, LONG, LONG_LONG, - FLOAT, FLOAT2, DOUBLE, INT128, FLOAT128, LONG_DOUBLE, }; + { VOID, BOOL, CHAR, WCHAR_T, WCHAR16, WCHAR32, CHAR8_T, SHORT, INT, INT0_T, LONG, + LONG_LONG, FLOAT, FLOAT2, DOUBLE, INT128, FLOAT128, LONG_DOUBLE, }; private int arrayDimensions = 0; private boolean isClass; @@ -200,10 +200,10 @@ public class DemangledDataType extends DemangledType { else if (dt == null) { // I don't know what this is - // If it isn't pointed to, or isn't a referent, then assume undefined typedef. + // If it isn't pointed to, or isn't a referent, then assume typedef. if (!(isReference() || isPointer())) { // Unknown type dt = new TypedefDataType(getDemanglerCategoryPath(getNamespace()), name, - DataType.DEFAULT); + new DWordDataType()); } else { // try creating empty structures for unknown types instead. diff --git a/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/gnu/GnuDemanglerTest.java b/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/gnu/GnuDemanglerTest.java index 0a7747fffe..9fd5aceee8 100644 --- a/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/gnu/GnuDemanglerTest.java +++ b/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/gnu/GnuDemanglerTest.java @@ -26,7 +26,6 @@ import generic.test.AbstractGenericTest; import ghidra.app.util.demangler.*; import ghidra.program.database.ProgramDB; import ghidra.program.model.address.Address; -import ghidra.program.model.data.DataType; import ghidra.program.model.data.TerminatedStringDataType; import ghidra.program.model.listing.CodeUnit; import ghidra.program.model.listing.Data; @@ -129,60 +128,6 @@ public class GnuDemanglerTest extends AbstractGenericTest { fullSignature); } - @Test - public void testUseStandardReplacements2() throws Exception { - - // - // Mangled: _ZN7Greeter5greetENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE - // - // Demangled: undefined Greeter::greet(std::__cxx11::basic_string,std::allocator>) - // - // Replaced: undefined Greeter::greet(std::string) - // - String mangled = "_ZN7Greeter5greetENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE"; - - GnuDemangler demangler = new GnuDemangler(); - demangler.canDemangle(program);// this perform initialization - - GnuDemanglerOptions options = new GnuDemanglerOptions(); - options.setUseStandardReplacements(true); - DemangledFunction dobj = (DemangledFunction) demangler.demangle(mangled, options); - assertNotNull(dobj); - - String signature = dobj.getSignature(); - assertEquals("undefined Greeter::greet(std::string)", signature); - - DemangledParameter demangledParameter = dobj.getParameters().get(0); - DemangledDataType type = demangledParameter.getType(); - DataType dt = type.getDataType(program.getDataTypeManager()); - assertTrue(dt.isNotYetDefined()); - //@formatter:off - assertEquals("/Demangler/std/string\n" + - "pack(disabled)\n" + - "Structure string {\n" + - "}\n" + - "Length: 0 Alignment: 1\n", dt.toString()); - //@formatter:on - - // - // Now disable demangled string replacement - // - options.setUseStandardReplacements(false); - dobj = (DemangledFunction) demangler.demangle(mangled, options); - assertNotNull(dobj); - - String fullSignature = dobj.getSignature(); - assertEquals( - "undefined Greeter::greet(std::__cxx11::basic_string,std::allocator>)", - fullSignature); - - demangledParameter = dobj.getParameters().get(0); - type = demangledParameter.getType(); - dt = type.getDataType(program.getDataTypeManager()); - assertEquals("typedef basic_string undefined", dt.toString()); - - } - @Test public void testDemangleOnlyKnownPatterns_True() throws Exception { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/function/FunctionDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/function/FunctionDB.java index 50a6ff780c..ace0699cd5 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/function/FunctionDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/function/FunctionDB.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -2470,6 +2470,16 @@ public class FunctionDB extends DatabaseObject implements Function { return thunkedFunction.getSignatureSource(); } + // Force DEFAULT source if any param has unassigned storage + if (!getReturn().isValid()) { + return SourceType.DEFAULT; + } + for (Parameter param : getParameters()) { + if (!param.isValid()) { + return SourceType.DEFAULT; + } + } + return getStoredSignatureSource(); } finally { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/ParamListStandard.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/ParamListStandard.java index 247c59523c..f03b5b74ad 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/ParamListStandard.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/ParamListStandard.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -23,7 +23,8 @@ import java.util.ArrayList; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressSpace; -import ghidra.program.model.data.*; +import ghidra.program.model.data.DataType; +import ghidra.program.model.data.DataTypeManager; import ghidra.program.model.lang.protorules.*; import ghidra.program.model.listing.Program; import ghidra.program.model.listing.VariableStorage; @@ -132,12 +133,6 @@ public class ParamListStandard implements ParamList { if (dt.isZeroLength()) { return AssignAction.NO_ASSIGNMENT; } - if (dt == DataType.DEFAULT) { - return AssignAction.NO_ASSIGNMENT; - } - if (dt instanceof TypeDef td && td.getBaseDataType() == DataType.DEFAULT) { - return AssignAction.NO_ASSIGNMENT; - } for (ModelRule modelRule : modelRules) { int responseCode = modelRule.assignAddress(dt, proto, pos, dtManager, status, res); if (responseCode != AssignAction.FAIL) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/LocalSymbolMap.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/LocalSymbolMap.java index 9209d212d1..c4179411f2 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/LocalSymbolMap.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/LocalSymbolMap.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -210,12 +210,11 @@ public class LocalSymbolMap { pcaddr = pcaddr.subtractWrap(1); List paramList = new ArrayList<>(); - boolean internalInvalid = false; for (int i = 0; i < p.length; ++i) { Parameter var = p[i]; if (!var.isValid()) { - internalInvalid = true; - break; + // TODO: exclude parameters which don't have valid storage ?? + continue; } DataType dt = var.getDataType(); String name = var.getName(); @@ -244,12 +243,6 @@ public class LocalSymbolMap { paramSymbol.setNameLock(namelock); paramSymbol.setTypeLock(lock); } - if (internalInvalid) { - // Can only send down a partial prototype. Let decompiler try to recover the whole. - for (HighSymbol paramSymbol : paramList) { - paramSymbol.setTypeLock(false); - } - } paramSymbols = new HighSymbol[paramList.size()]; paramList.toArray(paramSymbols); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java index 93e7ee86e8..02cb399d35 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java @@ -1153,7 +1153,10 @@ public class PcodeDataTypeManager { private void generateCoreTypes() { voidDt = new VoidDataType(progDataTypes); coreBuiltin = new HashMap(); - TypeMap type = new TypeMap(displayLanguage, VoidDataType.dataType, "void", false, false, + TypeMap type = new TypeMap(DataType.DEFAULT, "undefined", "unknown", false, false, + DEFAULT_DECOMPILER_ID); + coreBuiltin.put(type.id, type); + type = new TypeMap(displayLanguage, VoidDataType.dataType, "void", false, false, builtInDataTypes); coreBuiltin.put(type.id, type);