GP-3535: Swift fixes/improvements

This commit is contained in:
Ryan Kurtz 2024-02-28 14:43:49 -05:00
parent 21f1a63f51
commit 306fccdae5
57 changed files with 273 additions and 375 deletions

View file

@ -46,7 +46,7 @@ public class DemangledLabel extends DemangledObject {
@Override @Override
public String getSignature(boolean format) { public String getSignature(boolean format) {
return originalDemangled; return getName();
} }
} }

View file

@ -27,7 +27,7 @@ public class SwiftDemanglerScript extends GhidraScript {
@Override @Override
protected void run() throws Exception { protected void run() throws Exception {
SwiftDemangler demangler = new SwiftDemangler(); SwiftDemangler demangler = new SwiftDemangler(currentProgram);
SwiftDemanglerOptions options = new SwiftDemanglerOptions(); SwiftDemanglerOptions options = new SwiftDemanglerOptions();
if (!demangler.canDemangle(currentProgram)) { if (!demangler.canDemangle(currentProgram)) {
println("Not a Swift program"); println("Not a Swift program");

View file

@ -23,8 +23,11 @@ import ghidra.app.util.demangler.swift.*;
import ghidra.app.util.importer.MessageLog; import ghidra.app.util.importer.MessageLog;
import ghidra.framework.options.OptionType; import ghidra.framework.options.OptionType;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;
import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.util.HelpLocation; import ghidra.util.HelpLocation;
import ghidra.util.exception.CancelledException;
import ghidra.util.task.TaskMonitor;
/** /**
* An analyzer to demangle Swift mangled symbols * An analyzer to demangle Swift mangled symbols
@ -70,14 +73,22 @@ public class SwiftDemanglerAnalyzer extends AbstractDemanglerAnalyzer {
} }
@Override @Override
protected DemangledObject doDemangle(String mangled, DemanglerOptions options, MessageLog log) public boolean added(Program program, AddressSetView set, TaskMonitor monitor, MessageLog log)
throws DemangledException { throws CancelledException {
return demangler.demangle(mangled, options); try {
demangler.initialize(program);
}
catch (IOException e) {
log.appendMsg(e.getMessage());
return false;
}
return super.added(program, set, monitor, log);
} }
@Override @Override
public void analysisEnded(Program program) { protected DemangledObject doDemangle(String mangled, DemanglerOptions options, MessageLog log)
demangler.clearCache(); throws DemangledException {
return demangler.demangle(mangled, options);
} }
@Override @Override

View file

@ -20,6 +20,7 @@ import java.util.Stack;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftNativeDemangler.SwiftNativeDemangledOutput; import ghidra.app.util.demangler.swift.SwiftNativeDemangler.SwiftNativeDemangledOutput;
import ghidra.app.util.demangler.swift.nodes.SwiftNode; import ghidra.app.util.demangler.swift.nodes.SwiftNode;
import ghidra.app.util.demangler.swift.nodes.SwiftNode.NodeProperties; import ghidra.app.util.demangler.swift.nodes.SwiftNode.NodeProperties;
@ -78,11 +79,17 @@ public class SwiftDemangledTree {
* *
* @param nativeDemangler The Swift native demangler * @param nativeDemangler The Swift native demangler
* @param mangled The mangled string * @param mangled The mangled string
* @throws IOException If there was an IO-related error * @throws DemangledException If there was an issue demangling
*/ */
public SwiftDemangledTree(SwiftNativeDemangler nativeDemangler, String mangled) public SwiftDemangledTree(SwiftNativeDemangler nativeDemangler, String mangled)
throws IOException { throws DemangledException {
SwiftNativeDemangledOutput demangledOutput = nativeDemangler.demangle(mangled); SwiftNativeDemangledOutput demangledOutput;
try {
demangledOutput = nativeDemangler.demangle(mangled);
}
catch (IOException e) {
throw new DemangledException(e);
}
demangledString = demangledOutput.demangled(); demangledString = demangledOutput.demangled();
Stack<SwiftNode> stack = new Stack<>(); Stack<SwiftNode> stack = new Stack<>();
for (String line : demangledOutput.tree()) { for (String line : demangledOutput.tree()) {

View file

@ -33,16 +33,38 @@ import ghidra.util.task.TaskMonitor;
*/ */
public class SwiftDemangler implements Demangler { public class SwiftDemangler implements Demangler {
private Program program; private Map<String, SwiftNode> cache;
private SwiftTypeMetadata typeMetadata; private SwiftTypeMetadata typeMetadata;
private SwiftNativeDemangler nativeDemangler; private SwiftNativeDemangler nativeDemangler;
private SwiftDemanglerOptions options;
private Map<String, SwiftNode> cache; /**
private DemangledException initException; * Creates a new {@link SwiftDemangler} that is not associated with any {@link Program}.
* Call {@link #initialize(Program)} to associate it with a program, which will enable access
* to the Swift type metadata.
*/
public SwiftDemangler() {
super();
try {
initialize(null);
}
catch (IOException e) {
// should not happen when initializing with null
}
}
/**
* Creates a new {@link SwiftDemangler} that is associated with the given {@link Program}
*
* @param program The {@link Program} to demangle
* @throws IOException if there was a problem parsing the Swift type metadata
*/
public SwiftDemangler(Program program) throws IOException {
super();
initialize(program);
}
@Override @Override
public boolean canDemangle(Program p) { public boolean canDemangle(Program program) {
this.program = p;
return SwiftUtils.isSwift(program); return SwiftUtils.isSwift(program);
} }
@ -57,97 +79,25 @@ public class SwiftDemangler implements Demangler {
return demangle(mangled); return demangle(mangled);
} }
/** public void initialize(Program program) throws IOException {
* Initializes class variables cache = new HashMap<>();
* nativeDemangler = null;
* @param opt The options
* @throws DemangledException If there was an issue with initialization
*/
private void init(DemanglerOptions opt) throws DemangledException {
if (initException != null) {
throw initException;
}
if (program != null && typeMetadata == null) {
try { try {
if (program != null) {
program.setPreferredRootNamespaceCategoryPath( program.setPreferredRootNamespaceCategoryPath(
SwiftDataTypeUtils.SWIFT_CATEGORY.getPath()); SwiftDataTypeUtils.SWIFT_CATEGORY.getPath());
typeMetadata = new SwiftTypeMetadata(program, TaskMonitor.DUMMY, new MessageLog()); typeMetadata = new SwiftTypeMetadata(program, TaskMonitor.DUMMY, new MessageLog());
} }
}
catch (CancelledException e) { catch (CancelledException e) {
return; return;
} }
catch (IOException e) {
initException = new DemangledException(e);
throw initException;
}
}
if (opt != null) {
options = getSwiftDemanglerOptions(opt);
}
if (nativeDemangler == null) {
try {
nativeDemangler = new SwiftNativeDemangler(options.getSwiftDir());
}
catch (IOException e) {
throw new DemangledException(e);
}
}
if (cache == null) {
cache = new HashMap<>();
}
}
/**
* Demangles the given mangled string
*
* @param mangled The mangled string
* @param originalDemangled The demangled string produced by the native Swift demangler
* @param meta The {@link SwiftTypeMetadata}, or null if unavailable
* @return The {@link Demangled} object, or null if the mangled string is not a supported Swift
* symbol
* @throws DemangledException if a problem occurred
*/
public Demangled demangle(String mangled, String originalDemangled, SwiftTypeMetadata meta)
throws DemangledException {
if (!isSwiftMangledSymbol(mangled)) {
return null;
}
try {
SwiftNode root;
if (cache.containsKey(mangled)) {
root = cache.get(mangled);
}
else {
SwiftDemangledTree tree = new SwiftDemangledTree(nativeDemangler, mangled);
root = tree.getRoot();
}
cache.put(mangled, root);
if (root == null) {
return null;
}
Demangled demangled = root.demangle(this, meta);
if (root.walkAndTest(node -> node.childWasSkipped())) {
demangled.setName(options.getIncompletePrefix() + demangled.getName());
}
return demangled;
}
catch (IOException e) {
throw new DemangledException(e);
}
} }
@Override @Override
public DemangledObject demangle(String mangled, DemanglerOptions opt) public DemangledObject demangle(String mangled, DemanglerOptions op) throws DemangledException {
throws DemangledException { SwiftDemanglerOptions options = getSwiftDemanglerOptions(op);
Demangled demangled = getDemangled(mangled, options);
init(opt);
Demangled demangled = demangle(mangled, null, typeMetadata);
if (demangled instanceof DemangledFunction func) { if (demangled instanceof DemangledFunction func) {
return func; return func;
} }
@ -162,12 +112,44 @@ public class SwiftDemangler implements Demangler {
} }
/** /**
* Clears the cache * Get a new {@link Demangled} by demangling the given mangled string
*
* @param mangled The mangled string
* @param op The options (could be null)
* @return A new {@link Demangled}
* @throws DemangledException if there was an issue demangling
*/ */
public void clearCache() { public Demangled getDemangled(String mangled, SwiftDemanglerOptions op)
if (cache != null) { throws DemangledException {
cache.clear(); if (!isSwiftMangledSymbol(mangled)) {
return null;
} }
SwiftDemanglerOptions options = getSwiftDemanglerOptions(op);
setSwiftNativeDemangler(options);
SwiftNode root = cache.containsKey(mangled) ? cache.get(mangled)
: new SwiftDemangledTree(nativeDemangler, mangled).getRoot();
cache.put(mangled, root);
if (root == null) {
return null;
}
Demangled demangled = root.demangle(this);
if (root.walkAndTest(node -> node.childWasSkipped())) {
demangled.setName(options.getIncompletePrefix() + demangled.getName());
}
return demangled;
}
/**
* Gets the {@link SwiftTypeMetadata}
*
* @return The {@link SwiftTypeMetadata}, or null if it is not available
*/
public SwiftTypeMetadata getTypeMetadata() {
return typeMetadata;
} }
/** /**
@ -195,4 +177,21 @@ public class SwiftDemangler implements Demangler {
} }
return (SwiftDemanglerOptions) opt; return (SwiftDemanglerOptions) opt;
} }
/**
* Ensures that this demangler has access to a {@link SwiftNativeDemangler}
*
* @param options The options
* @throws DemangledException if there was a problem getting the {@link SwiftNativeDemangler}
*/
private void setSwiftNativeDemangler(SwiftDemanglerOptions options) throws DemangledException {
if (nativeDemangler == null) {
try {
nativeDemangler = new SwiftNativeDemangler(options.getSwiftDir());
}
catch (IOException e) {
throw new DemangledException(e);
}
}
}
} }

View file

@ -32,7 +32,7 @@ public class SwiftArray extends DemangledDataType {
*/ */
public SwiftArray(String mangled, String originalDemangled) { public SwiftArray(String mangled, String originalDemangled) {
super(mangled, originalDemangled, "Array"); super(mangled, originalDemangled, "Array");
setNamespace(SwiftDataTypeUtils.SWIFT_NAMESPACE); setNamespace(SwiftDataTypeUtils.getSwiftNamespace());
setBoundType( setBoundType(
new DemangledDataType(mangled, originalDemangled, DemangledDataType.UNDEFINED)); new DemangledDataType(mangled, originalDemangled, DemangledDataType.UNDEFINED));
setArray(1); setArray(1);

View file

@ -31,8 +31,9 @@ public class SwiftCharacter extends DemangledStructure {
*/ */
public SwiftCharacter(String mangled, String originalDemangled) { public SwiftCharacter(String mangled, String originalDemangled) {
super(mangled, originalDemangled, "Character", super(mangled, originalDemangled, "Character",
SwiftDataTypeUtils.getCategoryPath(SwiftDataTypeUtils.SWIFT_NAMESPACE).getPath(), true); SwiftDataTypeUtils.getCategoryPath(SwiftDataTypeUtils.getSwiftNamespace()).getPath(),
setNamespace(SwiftDataTypeUtils.SWIFT_NAMESPACE); true);
setNamespace(SwiftDataTypeUtils.getSwiftNamespace());
DemangledDataType stringDt = new DemangledDataType(mangled, null, DemangledDataType.CHAR); DemangledDataType stringDt = new DemangledDataType(mangled, null, DemangledDataType.CHAR);
stringDt.incrementPointerLevels(); stringDt.incrementPointerLevels();

View file

@ -30,11 +30,6 @@ public class SwiftDataTypeUtils {
*/ */
public static final CategoryPath SWIFT_CATEGORY = new CategoryPath("/Demangler"); public static final CategoryPath SWIFT_CATEGORY = new CategoryPath("/Demangler");
/**
* A {@link Demangled} to represent the standard Swift namespace
*/
public static final Demangled SWIFT_NAMESPACE = new DemangledUnknown("", null, "Swift");
/** /**
* Checks to see if the given namespace is the standard Swift namespace * Checks to see if the given namespace is the standard Swift namespace
* *
@ -42,7 +37,16 @@ public class SwiftDataTypeUtils {
* @return True if the given namespace is the standard Swift namespace; otherwise, false * @return True if the given namespace is the standard Swift namespace; otherwise, false
*/ */
public static boolean isSwiftNamespace(Demangled namespace) { public static boolean isSwiftNamespace(Demangled namespace) {
return namespace != null && namespace.getName().equals(SWIFT_NAMESPACE.getName()); return namespace != null && namespace.getName().equals("Swift");
}
/**
* Gets a {@link Demangled} to represent the standard Swift namespace
*
* @return A {@link Demangled} to represent the standard Swift namespace
*/
public static Demangled getSwiftNamespace() {
return new DemangledUnknown("", "Swift", "Swift");
} }
/** /**

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.datatypes; package ghidra.app.util.demangler.swift.datatypes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -31,13 +30,11 @@ public class SwiftEnum extends DemangledStructure {
* @param originalDemangled The natively demangled string * @param originalDemangled The natively demangled string
* @param name The enum name * @param name The enum name
* @param namespace The enum namespace (could be null) * @param namespace The enum namespace (could be null)
* @param typeMetadata The {@link SwiftTypeMetadata}, or null if it is not known
* @param demangler A {@link SwiftDemangler} * @param demangler A {@link SwiftDemangler}
* @throws DemangledException if a problem occurred * @throws DemangledException if a problem occurred
*/ */
public SwiftEnum(String mangled, String originalDemangled, String name, public SwiftEnum(String mangled, String originalDemangled, String name, Demangled namespace,
Demangled namespace, SwiftTypeMetadata typeMetadata, SwiftDemangler demangler) SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
super(mangled, originalDemangled, name, super(mangled, originalDemangled, name,
SwiftDataTypeUtils.getCategoryPath(namespace).getPath(), true); SwiftDataTypeUtils.getCategoryPath(namespace).getPath(), true);
setNamespace(namespace); setNamespace(namespace);

View file

@ -31,8 +31,9 @@ public class SwiftString extends DemangledStructure {
*/ */
public SwiftString(String mangled, String originalDemangled) { public SwiftString(String mangled, String originalDemangled) {
super(mangled, originalDemangled, "String", super(mangled, originalDemangled, "String",
SwiftDataTypeUtils.getCategoryPath(SwiftDataTypeUtils.SWIFT_NAMESPACE).getPath(), true); SwiftDataTypeUtils.getCategoryPath(SwiftDataTypeUtils.getSwiftNamespace()).getPath(),
setNamespace(SwiftDataTypeUtils.SWIFT_NAMESPACE); true);
setNamespace(SwiftDataTypeUtils.getSwiftNamespace());
DemangledDataType stringDt = new DemangledDataType(mangled, null, DemangledDataType.CHAR); DemangledDataType stringDt = new DemangledDataType(mangled, null, DemangledDataType.CHAR);
stringDt.incrementPointerLevels(); stringDt.incrementPointerLevels();

View file

@ -32,18 +32,17 @@ public class SwiftStructure extends DemangledStructure {
* @param originalDemangled The natively demangled string * @param originalDemangled The natively demangled string
* @param name The structure name * @param name The structure name
* @param namespace The structure namespace (could be null) * @param namespace The structure namespace (could be null)
* @param typeMetadata The {@link SwiftTypeMetadata}, or null if it is not known
* @param demangler A {@link SwiftDemangler} * @param demangler A {@link SwiftDemangler}
* @throws DemangledException if a problem occurred * @throws DemangledException if a problem occurred
*/ */
public SwiftStructure(String mangled, String originalDemangled, String name, public SwiftStructure(String mangled, String originalDemangled, String name,
Demangled namespace, SwiftTypeMetadata typeMetadata, SwiftDemangler demangler) Demangled namespace, SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
super(mangled, originalDemangled, name, super(mangled, originalDemangled, name,
SwiftDataTypeUtils.getCategoryPath(namespace).getPath(), true); SwiftDataTypeUtils.getCategoryPath(namespace).getPath(), true);
setNamespace(namespace); setNamespace(namespace);
// Try to add structure fields from the type metadata // Try to add structure fields from the type metadata
SwiftTypeMetadata typeMetadata = demangler.getTypeMetadata();
if (typeMetadata != null) { if (typeMetadata != null) {
TargetTypeContextDescriptor typeDescriptor = TargetTypeContextDescriptor typeDescriptor =
typeMetadata.getTargetTypeContextDescriptors().get(name); typeMetadata.getTargetTypeContextDescriptors().get(name);
@ -53,8 +52,7 @@ public class SwiftStructure extends DemangledStructure {
if (fieldDescriptor != null) { if (fieldDescriptor != null) {
for (FieldRecord fieldRecord : fieldDescriptor.getFieldRecords()) { for (FieldRecord fieldRecord : fieldDescriptor.getFieldRecords()) {
String mangledType = "_T" + fieldRecord.getMangledTypeName(); String mangledType = "_T" + fieldRecord.getMangledTypeName();
Demangled demangled = Demangled demangled = demangler.getDemangled(mangledType, null);
demangler.demangle(mangledType, originalDemangled, typeMetadata);
if (demangled instanceof DemangledDataType ddt) { if (demangled instanceof DemangledDataType ddt) {
addField(fieldRecord.getFieldName(), fieldRecord.getDescription(), ddt); addField(fieldRecord.getFieldName(), fieldRecord.getDescription(), ddt);
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.datatypes; package ghidra.app.util.demangler.swift.datatypes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -30,14 +29,12 @@ public class SwiftTuple extends SwiftStructure {
* @param mangled The mangled string * @param mangled The mangled string
* @param originalDemangled The natively demangled string * @param originalDemangled The natively demangled string
* @param list The elements of the tuple * @param list The elements of the tuple
* @param typeMetadata The {@link SwiftTypeMetadata}, or null if it is not known
* @param demangler A {@link SwiftDemangler} * @param demangler A {@link SwiftDemangler}
* @throws DemangledException if a problem occurred * @throws DemangledException if a problem occurred
*/ */
public SwiftTuple(String mangled, String originalDemangled, DemangledList list, public SwiftTuple(String mangled, String originalDemangled, DemangledList list,
SwiftTypeMetadata typeMetadata, SwiftDemangler demangler) throws DemangledException { SwiftDemangler demangler) throws DemangledException {
super(mangled, originalDemangled, "tuple%d".formatted(list.size()), null, typeMetadata, super(mangled, originalDemangled, "tuple%d".formatted(list.size()), null, demangler);
demangler);
int i = 0; int i = 0;
for (Demangled element : list) { for (Demangled element : list) {

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
@ -29,8 +28,7 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftAllocatorNode extends SwiftNode { public class SwiftAllocatorNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
Demangled type = null; Demangled type = null;
@ -39,12 +37,12 @@ public class SwiftAllocatorNode extends SwiftNode {
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Class: case Class:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
name = "__allocating_init"; name = "__allocating_init";
callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall; callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall;
break; break;
case Extension: case Extension:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
if (child.hasChild(SwiftDemangledNodeKind.Class)) { if (child.hasChild(SwiftDemangledNodeKind.Class)) {
name = "__allocating_init"; name = "__allocating_init";
callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall; callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall;
@ -60,14 +58,14 @@ public class SwiftAllocatorNode extends SwiftNode {
case Enum: case Enum:
case Protocol: case Protocol:
case Structure: case Structure:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
name = "init"; name = "init";
break; break;
case Type: case Type:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
case LabelList: case LabelList:
labelList = child.demangle(demangler, typeMetadata); labelList = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -17,7 +17,6 @@ package ghidra.app.util.demangler.swift.nodes;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -29,17 +28,16 @@ import ghidra.app.util.demangler.swift.datatypes.SwiftArray;
public class SwiftBoundGenericStructureNode extends SwiftNode { public class SwiftBoundGenericStructureNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled type = null; Demangled type = null;
Demangled typeList = null; Demangled typeList = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Type: case Type:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
case TypeList: case TypeList:
typeList = child.demangle(demangler, typeMetadata); typeList = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,9 +15,7 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledDataType;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -27,7 +25,7 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftBuiltinTypeNameNode extends SwiftNode { public class SwiftBuiltinTypeNameNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) { public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
String orig = getText(); String orig = getText();
String name = switch (orig) { String name = switch (orig) {
case "Builtin.Int1": case "Builtin.Int1":

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -26,8 +25,7 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftClassNode extends SwiftNode { public class SwiftClassNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
Demangled privateDeclNamespace = null; Demangled privateDeclNamespace = null;
@ -37,14 +35,15 @@ public class SwiftClassNode extends SwiftNode {
name = child.getText(); name = child.getText();
break; break;
case PrivateDeclName: case PrivateDeclName:
Demangled temp = child.demangle(demangler, typeMetadata); Demangled temp = child.demangle(demangler);
name = temp.getName(); name = temp.getName();
privateDeclNamespace = temp.getNamespace(); privateDeclNamespace = temp.getNamespace();
break; break;
case Class: case Class:
case Enum:
case Module: case Module:
case Structure: case Structure:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -28,8 +27,7 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftConstructorNode extends SwiftNode { public class SwiftConstructorNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
Demangled type = null; Demangled type = null;
@ -37,14 +35,14 @@ public class SwiftConstructorNode extends SwiftNode {
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Class: case Class:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
name = "init"; name = "init";
break; break;
case Type: case Type:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
case LabelList: case LabelList:
labelList = child.demangle(demangler, typeMetadata); labelList = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
@ -29,14 +28,13 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftDeallocatorNode extends SwiftNode { public class SwiftDeallocatorNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Class: case Class:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
name = "__deallocating_init"; name = "__deallocating_init";
break; break;
default: default:

View file

@ -15,9 +15,7 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledDataType;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -27,7 +25,7 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftDependentGenericParamTypeNode extends SwiftNode { public class SwiftDependentGenericParamTypeNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) { public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
// We don't really support this yet // We don't really support this yet
return new DemangledDataType(properties.mangled(), properties.originalDemangled(), return new DemangledDataType(properties.mangled(), properties.originalDemangled(),
DemangledDataType.UNDEFINED); DemangledDataType.UNDEFINED);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
@ -27,13 +26,12 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftDependentGenericTypeNode extends SwiftNode { public class SwiftDependentGenericTypeNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled type = null; Demangled type = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Type: case Type:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -28,14 +27,13 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftDestructorNode extends SwiftNode { public class SwiftDestructorNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Class: case Class:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
name = "deinit"; name = "deinit";
break; break;
default: default:

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
@ -28,8 +27,7 @@ import ghidra.app.util.demangler.swift.datatypes.SwiftEnum;
public class SwiftEnumNode extends SwiftNode { public class SwiftEnumNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
Demangled privateDeclNamespace = null; Demangled privateDeclNamespace = null;
@ -39,15 +37,16 @@ public class SwiftEnumNode extends SwiftNode {
name = child.getText(); name = child.getText();
break; break;
case PrivateDeclName: case PrivateDeclName:
Demangled temp = child.demangle(demangler, typeMetadata); Demangled temp = child.demangle(demangler);
name = temp.getName(); name = temp.getName();
privateDeclNamespace = temp.getNamespace(); privateDeclNamespace = temp.getNamespace();
break; break;
case Class: case Class:
case Enum:
case Extension: case Extension:
case Module: case Module:
case Structure: case Structure:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);
@ -58,6 +57,6 @@ public class SwiftEnumNode extends SwiftNode {
return getUnknown(); return getUnknown();
} }
return new SwiftEnum(properties.mangled(), properties.originalDemangled(), name, return new SwiftEnum(properties.mangled(), properties.originalDemangled(), name,
SwiftNode.join(namespace, privateDeclNamespace), typeMetadata, demangler); SwiftNode.join(namespace, privateDeclNamespace), demangler);
} }
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
@ -27,21 +26,20 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftExtensionNode extends SwiftNode { public class SwiftExtensionNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled namespace = null; Demangled namespace = null;
Demangled type = null; Demangled type = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Module: case Module:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
namespace.setName("(extension_" + namespace.getName() + ")"); namespace.setName("(extension_" + namespace.getName() + ")");
break; break;
case Class: case Class:
case Enum: case Enum:
case Protocol: case Protocol:
case Structure: case Structure:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -28,8 +27,7 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftFunctionNode extends SwiftNode { public class SwiftFunctionNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
Demangled type = null; Demangled type = null;
@ -44,7 +42,7 @@ public class SwiftFunctionNode extends SwiftNode {
name = child.getText() + " infix"; name = child.getText() + " infix";
break; break;
case LocalDeclName: case LocalDeclName:
name = child.demangle(demangler, typeMetadata).getName(); name = child.demangle(demangler).getName();
break; break;
case Class: case Class:
callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall; callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall;
@ -55,13 +53,13 @@ public class SwiftFunctionNode extends SwiftNode {
case Module: case Module:
case Protocol: case Protocol:
case Structure: case Structure:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
break; break;
case Type: case Type:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
case LabelList: case LabelList:
labelList = child.demangle(demangler, typeMetadata); labelList = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -28,17 +27,16 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftFunctionTypeNode extends SwiftNode { public class SwiftFunctionTypeNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled argumentTuple = null; Demangled argumentTuple = null;
Demangled returnType = null; Demangled returnType = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case ArgumentTuple: case ArgumentTuple:
argumentTuple = child.demangle(demangler, typeMetadata); argumentTuple = child.demangle(demangler);
break; break;
case ReturnType: case ReturnType:
returnType = child.demangle(demangler, typeMetadata); returnType = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);
@ -63,12 +61,12 @@ public class SwiftFunctionTypeNode extends SwiftNode {
SwiftNode struct = functionAncestor.getChild(SwiftDemangledNodeKind.Structure); SwiftNode struct = functionAncestor.getChild(SwiftDemangledNodeKind.Structure);
SwiftNode enumm = functionAncestor.getChild(SwiftDemangledNodeKind.Enum); SwiftNode enumm = functionAncestor.getChild(SwiftDemangledNodeKind.Enum);
if (struct != null) { if (struct != null) {
if (struct.demangle(demangler, typeMetadata) instanceof DemangledDataType type) { if (struct.demangle(demangler) instanceof DemangledDataType type) {
function.addParameter(new DemangledParameter(type)); function.addParameter(new DemangledParameter(type));
} }
} }
else if (enumm != null) { else if (enumm != null) {
if (enumm.demangle(demangler, typeMetadata) instanceof DemangledDataType type) { if (enumm.demangle(demangler) instanceof DemangledDataType type) {
function.addParameter(new DemangledParameter(type)); function.addParameter(new DemangledParameter(type));
// Enums are currently represented as single field structures, but in reality, // Enums are currently represented as single field structures, but in reality,
// there could be more fields. Add a varargs parameter so these other fields // there could be more fields. Add a varargs parameter so these other fields
@ -94,7 +92,7 @@ public class SwiftFunctionTypeNode extends SwiftNode {
} }
else { else {
SwiftTuple tuple = new SwiftTuple(properties.mangled(), SwiftTuple tuple = new SwiftTuple(properties.mangled(),
properties.originalDemangled(), list, typeMetadata, demangler); properties.originalDemangled(), list, demangler);
function.setReturnType(tuple); function.setReturnType(tuple);
} }
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -29,18 +28,17 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftGetterNode extends SwiftNode { public class SwiftGetterNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled demangled = null; Demangled demangled = null;
String name = "get_"; String name = "get_";
String callingConvention = CompilerSpec.CALLING_CONVENTION_default; String callingConvention = CompilerSpec.CALLING_CONVENTION_default;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Subscript: case Subscript:
demangled = child.demangle(demangler, typeMetadata); demangled = child.demangle(demangler);
break; break;
case Variable: case Variable:
demangled = child.demangle(demangler, typeMetadata); demangled = child.demangle(demangler);
if (child.hasChild(SwiftDemangledNodeKind.Class)) { if (child.hasChild(SwiftDemangledNodeKind.Class)) {
callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall; callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall;
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
@ -29,8 +28,7 @@ import ghidra.program.model.data.DataUtilities;
public class SwiftGlobalNode extends SwiftNode { public class SwiftGlobalNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled demangled = null; Demangled demangled = null;
Demangled suffix = null; Demangled suffix = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
@ -40,10 +38,10 @@ public class SwiftGlobalNode extends SwiftNode {
case ObjCAttribute: case ObjCAttribute:
continue; continue;
case Suffix: case Suffix:
suffix = child.demangle(demangler, typeMetadata); suffix = child.demangle(demangler);
break; break;
default: default:
demangled = child.demangle(demangler, typeMetadata); demangled = child.demangle(demangler);
break; break;
} }
} }

View file

@ -18,7 +18,6 @@ package ghidra.app.util.demangler.swift.nodes;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -29,13 +28,12 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftGlobalVariableOnceDeclListNode extends SwiftNode { public class SwiftGlobalVariableOnceDeclListNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
List<Demangled> elements = new ArrayList<>(); List<Demangled> elements = new ArrayList<>();
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Identifier: case Identifier:
elements.add(child.demangle(demangler, typeMetadata)); elements.add(child.demangle(demangler));
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -28,20 +27,19 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftGlobalVariableOnceFunctionNode extends SwiftNode { public class SwiftGlobalVariableOnceFunctionNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled namespace = null; Demangled namespace = null;
DemangledList names = null; DemangledList names = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case GlobalVariableOnceDeclList: case GlobalVariableOnceDeclList:
Demangled demangled = child.demangle(demangler, typeMetadata); Demangled demangled = child.demangle(demangler);
if (demangled instanceof DemangledList list) { if (demangled instanceof DemangledList list) {
names = list; names = list;
} }
break; break;
case Structure: case Structure:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -26,9 +25,8 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftInOutNode extends SwiftNode { public class SwiftInOutNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException { Demangled demangled = demangleFirstChild(demangler);
Demangled demangled = demangleFirstChild(demangler, typeMetadata);
if (demangled instanceof DemangledDataType type) { if (demangled instanceof DemangledDataType type) {
type.incrementPointerLevels(); type.incrementPointerLevels();
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
@ -29,14 +28,13 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftInitializerNode extends SwiftNode { public class SwiftInitializerNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Variable: case Variable:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
name = "init"; name = "init";
break; break;
default: default:

View file

@ -18,7 +18,6 @@ package ghidra.app.util.demangler.swift.nodes;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -29,13 +28,12 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftLabelListNode extends SwiftNode { public class SwiftLabelListNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
List<Demangled> elements = new ArrayList<>(); List<Demangled> elements = new ArrayList<>();
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Identifier: case Identifier:
elements.add(child.demangle(demangler, typeMetadata)); elements.add(child.demangle(demangler));
break; break;
case FirstElementMarker: case FirstElementMarker:
elements.add(new DemangledUnknown(properties.mangled(), elements.add(new DemangledUnknown(properties.mangled(),

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
@ -29,14 +28,13 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftLazyProtocolWitnessTableAccessorNode extends SwiftNode { public class SwiftLazyProtocolWitnessTableAccessorNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Type: case Type:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
name = "lazy_protocol_witness_table_accessor"; name = "lazy_protocol_witness_table_accessor";
break; break;
default: default:

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -26,8 +25,7 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftLocalDeclNameNode extends SwiftNode { public class SwiftLocalDeclNameNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Long number = null; Long number = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -29,18 +28,17 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftModifyAccessorNode extends SwiftNode { public class SwiftModifyAccessorNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled demangled = null; Demangled demangled = null;
String name = "modify_"; String name = "modify_";
String callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall; String callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Subscript: case Subscript:
demangled = child.demangle(demangler, typeMetadata); demangled = child.demangle(demangler);
break; break;
case Variable: case Variable:
demangled = child.demangle(demangler, typeMetadata); demangled = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -19,7 +19,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -113,7 +112,7 @@ public abstract class SwiftNode {
case Tuple -> new SwiftTupleNode(); case Tuple -> new SwiftTupleNode();
case TupleElement -> new SwiftTupleElementNode(); case TupleElement -> new SwiftTupleElementNode();
case TupleElementName -> new SwiftGenericTextNode(); case TupleElementName -> new SwiftGenericTextNode();
case Type -> new SwiftTypeNode(); case Type -> new SwiftGenericPassthroughNode();
case TypeAlias -> new SwiftTypeAliasNode(); case TypeAlias -> new SwiftTypeAliasNode();
case TypeList -> new SwiftTypeListNode(); case TypeList -> new SwiftTypeListNode();
case TypeMetadataAccessFunction -> new SwiftTypeMetadataAccessFunctionNode(); case TypeMetadataAccessFunction -> new SwiftTypeMetadataAccessFunctionNode();
@ -129,11 +128,10 @@ public abstract class SwiftNode {
* Demangles this {@link SwiftNode} * Demangles this {@link SwiftNode}
* *
* @param demangler The {@link SwiftDemangler} * @param demangler The {@link SwiftDemangler}
* @param typeMetadata The {@link SwiftTypeMetadata}, or null if it is not known
* @return The demangled {@link SwiftNode} * @return The demangled {@link SwiftNode}
* @throws DemangledException if a problem occurred * @throws DemangledException if a problem occurred
*/ */
public abstract Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public abstract Demangled demangle(SwiftDemangler demangler)
throws DemangledException; throws DemangledException;
/** /**
@ -354,17 +352,16 @@ public abstract class SwiftNode {
* Demangles the first child {@link SwiftNode}, if it exists * Demangles the first child {@link SwiftNode}, if it exists
* *
* @param demangler The {@link SwiftDemangler} * @param demangler The {@link SwiftDemangler}
* @param typeMetadata The {@link SwiftTypeMetadata}, or null if it is not known
* @return The demangled first child {@link SwiftNode} * @return The demangled first child {@link SwiftNode}
* @throws DemangledException if there are no children or another problem occurred * @throws DemangledException if there are no children or another problem occurred
*/ */
protected Demangled demangleFirstChild(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) protected Demangled demangleFirstChild(SwiftDemangler demangler)
throws DemangledException { throws DemangledException {
Demangled first = null; Demangled first = null;
for (int i = 0; i < children.size(); i++) { for (int i = 0; i < children.size(); i++) {
SwiftNode child = children.get(i); SwiftNode child = children.get(i);
if (i == 0) { if (i == 0) {
first = child.demangle(demangler, typeMetadata); first = child.demangle(demangler);
} }
else { else {
child.skip(child); child.skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -28,13 +27,12 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftOutlinedConsumeNode extends SwiftNode { public class SwiftOutlinedConsumeNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled type = null; Demangled type = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Type: case Type:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -28,13 +27,12 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftOutlinedCopyNode extends SwiftNode { public class SwiftOutlinedCopyNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled type = null; Demangled type = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Type: case Type:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -26,15 +25,14 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftPrivateDeclNameNode extends SwiftNode { public class SwiftPrivateDeclNameNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Identifier: case Identifier:
if (namespace == null) { if (namespace == null) {
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
} }
else { else {
name = child.getText(); name = child.getText();

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -26,22 +25,21 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftProtocolConformanceNode extends SwiftNode { public class SwiftProtocolConformanceNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException { Demangled type = null;
Demangled type1 = null; Demangled protocol = null;
Demangled type2 = null;
Demangled namespace = null; Demangled namespace = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Module: case Module:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
break; break;
case Type: case Type:
if (type1 == null) { if (child.hasChild(SwiftDemangledNodeKind.Protocol)) {
type1 = child.demangle(demangler, typeMetadata); protocol = child.demangle(demangler);
} }
else { else {
type2 = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
} }
break; break;
default: default:
@ -49,11 +47,12 @@ public class SwiftProtocolConformanceNode extends SwiftNode {
break; break;
} }
} }
if (type1 == null && type2 == null) { if (type == null || protocol == null) {
return getUnknown(); return getUnknown();
} }
DemangledUnknown demangled = new DemangledUnknown(properties.mangled(), DemangledUnknown demangled =
properties.originalDemangled(), SwiftNode.join(type2, type1).getNamespaceString()); new DemangledUnknown(properties.mangled(), properties.originalDemangled(),
type.getNamespaceString() + "->" + protocol.getNamespaceString());
demangled.setNamespace(namespace); demangled.setNamespace(namespace);
return demangled; return demangled;
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -26,8 +25,7 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftProtocolNode extends SwiftNode { public class SwiftProtocolNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
@ -36,7 +34,7 @@ public class SwiftProtocolNode extends SwiftNode {
name = child.getText(); name = child.getText();
break; break;
case Module: case Module:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -29,18 +28,17 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftSetterNode extends SwiftNode { public class SwiftSetterNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled demangled = null; Demangled demangled = null;
String name = "set_"; String name = "set_";
String callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall; String callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Subscript: case Subscript:
demangled = child.demangle(demangler, typeMetadata); demangled = child.demangle(demangler);
break; break;
case Variable: case Variable:
demangled = child.demangle(demangler, typeMetadata); demangled = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -27,8 +26,7 @@ import ghidra.app.util.demangler.swift.datatypes.*;
public class SwiftStructureNode extends SwiftNode { public class SwiftStructureNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
Demangled privateDeclNamespace = null; Demangled privateDeclNamespace = null;
@ -38,14 +36,15 @@ public class SwiftStructureNode extends SwiftNode {
name = child.getText(); name = child.getText();
break; break;
case PrivateDeclName: case PrivateDeclName:
Demangled temp = child.demangle(demangler, typeMetadata); Demangled temp = child.demangle(demangler);
name = temp.getName(); name = temp.getName();
privateDeclNamespace = temp.getNamespace(); privateDeclNamespace = temp.getNamespace();
break; break;
case Class: case Class:
case Enum:
case Module: case Module:
case Structure: case Structure:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);
@ -85,7 +84,7 @@ public class SwiftStructureNode extends SwiftNode {
} }
SwiftStructure struct = new SwiftStructure(mangled, orig, name, SwiftStructure struct = new SwiftStructure(mangled, orig, name,
SwiftNode.join(namespace, privateDeclNamespace), typeMetadata, demangler); SwiftNode.join(namespace, privateDeclNamespace), demangler);
// The structure has no fields, which behaves poorly in the decompiler. Give it one // The structure has no fields, which behaves poorly in the decompiler. Give it one
// undefined* field instead. // undefined* field instead.

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -28,8 +27,7 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftSubscriptNode extends SwiftNode { public class SwiftSubscriptNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
Demangled type = null; Demangled type = null;
@ -41,14 +39,14 @@ public class SwiftSubscriptNode extends SwiftNode {
callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall; callingConvention = CompilerSpec.CALLING_CONVENTION_thiscall;
// Fall through // Fall through
case Structure: case Structure:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
name = "subscript"; name = "subscript";
break; break;
case LabelList: case LabelList:
labelList = child.demangle(demangler, typeMetadata); labelList = child.demangle(demangler);
break; break;
case Type: case Type:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -26,8 +25,7 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftTupleElementNode extends SwiftNode { public class SwiftTupleElementNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
Demangled type = null; Demangled type = null;
String name = null; String name = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
@ -36,7 +34,7 @@ public class SwiftTupleElementNode extends SwiftNode {
name = child.getText(); name = child.getText();
break; break;
case Type: case Type:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -18,7 +18,6 @@ package ghidra.app.util.demangler.swift.nodes;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -29,13 +28,12 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftTupleNode extends SwiftNode { public class SwiftTupleNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
List<Demangled> elements = new ArrayList<>(); List<Demangled> elements = new ArrayList<>();
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case TupleElement: case TupleElement:
elements.add(child.demangle(demangler, typeMetadata)); elements.add(child.demangle(demangler));
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -26,8 +25,7 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftTypeAliasNode extends SwiftNode { public class SwiftTypeAliasNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
@ -36,7 +34,7 @@ public class SwiftTypeAliasNode extends SwiftNode {
name = child.getText(); name = child.getText();
break; break;
case Module: case Module:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -18,7 +18,6 @@ package ghidra.app.util.demangler.swift.nodes;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -29,13 +28,12 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftTypeListNode extends SwiftNode { public class SwiftTypeListNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
List<Demangled> elements = new ArrayList<>(); List<Demangled> elements = new ArrayList<>();
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Type: case Type:
elements.add(child.demangle(demangler, typeMetadata)); elements.add(child.demangle(demangler));
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -28,14 +27,13 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftTypeMetadataAccessFunctionNode extends SwiftNode { public class SwiftTypeMetadataAccessFunctionNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Type: case Type:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
name = "typeMetadataAccessor"; name = "typeMetadataAccessor";
break; break;
default: default:

View file

@ -1,34 +0,0 @@
/* ###
* IP: GHIDRA
*
* 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.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler;
/**
* A {@link SwiftDemangledNodeKind#Type} {@link SwiftNode}
*/
public class SwiftTypeNode extends SwiftNode {
@Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata)
throws DemangledException {
return demangleFirstChild(demangler, typeMetadata);
}
}

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
@ -29,14 +28,13 @@ import ghidra.program.model.lang.CompilerSpec;
public class SwiftUnsafeMutableAddressorNode extends SwiftNode { public class SwiftUnsafeMutableAddressorNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
for (SwiftNode child : getChildren()) { for (SwiftNode child : getChildren()) {
switch (child.getKind()) { switch (child.getKind()) {
case Variable: case Variable:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
name = "unsafeMutableAddressor"; name = "unsafeMutableAddressor";
break; break;
default: default:

View file

@ -15,8 +15,8 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -40,7 +40,7 @@ public class SwiftUnsupportedNode extends SwiftNode {
} }
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) { public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
skip(this); skip(this);
return getUnknown(); return getUnknown();
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes; package ghidra.app.util.demangler.swift.nodes;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind; import ghidra.app.util.demangler.swift.SwiftDemangledNodeKind;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -26,8 +25,7 @@ import ghidra.app.util.demangler.swift.SwiftDemangler;
public class SwiftVariableNode extends SwiftNode { public class SwiftVariableNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException {
String name = null; String name = null;
Demangled namespace = null; Demangled namespace = null;
Demangled privateDeclNamespace = null; Demangled privateDeclNamespace = null;
@ -38,7 +36,7 @@ public class SwiftVariableNode extends SwiftNode {
name = child.getText(); name = child.getText();
break; break;
case PrivateDeclName: case PrivateDeclName:
Demangled temp = child.demangle(demangler, typeMetadata); Demangled temp = child.demangle(demangler);
name = temp.getName(); name = temp.getName();
privateDeclNamespace = temp.getNamespace(); privateDeclNamespace = temp.getNamespace();
break; break;
@ -48,10 +46,10 @@ public class SwiftVariableNode extends SwiftNode {
case Module: case Module:
case Protocol: case Protocol:
case Structure: case Structure:
namespace = child.demangle(demangler, typeMetadata); namespace = child.demangle(demangler);
break; break;
case Type: case Type:
type = child.demangle(demangler, typeMetadata); type = child.demangle(demangler);
break; break;
default: default:
skip(child); skip(child);

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes.generic; package ghidra.app.util.demangler.swift.nodes.generic;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.*; import ghidra.app.util.demangler.*;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
import ghidra.app.util.demangler.swift.nodes.SwiftNode; import ghidra.app.util.demangler.swift.nodes.SwiftNode;
@ -26,9 +25,8 @@ import ghidra.app.util.demangler.swift.nodes.SwiftNode;
public class SwiftGenericDescriptorNode extends SwiftNode { public class SwiftGenericDescriptorNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException { Demangled demangled = demangleFirstChild(demangler);
Demangled demangled = demangleFirstChild(demangler, typeMetadata);
return new DemangledLabel(properties.mangled(), properties.originalDemangled(), return new DemangledLabel(properties.mangled(), properties.originalDemangled(),
demangled.getNamespaceString()); demangled.getNamespaceString());
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes.generic; package ghidra.app.util.demangler.swift.nodes.generic;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledLabel; import ghidra.app.util.demangler.DemangledLabel;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -27,8 +26,7 @@ import ghidra.app.util.demangler.swift.nodes.SwiftNode;
public class SwiftGenericIndexNode extends SwiftNode { public class SwiftGenericIndexNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) { public Demangled demangle(SwiftDemangler demangler) {
return new DemangledLabel(properties.mangled(), properties.originalDemangled(), return new DemangledLabel(properties.mangled(), properties.originalDemangled(), getIndex());
getIndex());
} }
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes.generic; package ghidra.app.util.demangler.swift.nodes.generic;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledException;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -27,8 +26,7 @@ import ghidra.app.util.demangler.swift.nodes.SwiftNode;
public class SwiftGenericPassthroughNode extends SwiftNode { public class SwiftGenericPassthroughNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) public Demangled demangle(SwiftDemangler demangler) throws DemangledException {
throws DemangledException { return demangleFirstChild(demangler);
return demangleFirstChild(demangler, typeMetadata);
} }
} }

View file

@ -15,7 +15,6 @@
*/ */
package ghidra.app.util.demangler.swift.nodes.generic; package ghidra.app.util.demangler.swift.nodes.generic;
import ghidra.app.util.bin.format.swift.SwiftTypeMetadata;
import ghidra.app.util.demangler.Demangled; import ghidra.app.util.demangler.Demangled;
import ghidra.app.util.demangler.DemangledLabel; import ghidra.app.util.demangler.DemangledLabel;
import ghidra.app.util.demangler.swift.SwiftDemangler; import ghidra.app.util.demangler.swift.SwiftDemangler;
@ -27,8 +26,7 @@ import ghidra.app.util.demangler.swift.nodes.SwiftNode;
public class SwiftGenericTextNode extends SwiftNode { public class SwiftGenericTextNode extends SwiftNode {
@Override @Override
public Demangled demangle(SwiftDemangler demangler, SwiftTypeMetadata typeMetadata) { public Demangled demangle(SwiftDemangler demangler) {
return new DemangledLabel(properties.mangled(), properties.originalDemangled(), return new DemangledLabel(properties.mangled(), properties.originalDemangled(), getText());
getText());
} }
} }