From 11619169b40b554bca6f9acbb6b11c89a5d2f6cb Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Mon, 2 Mar 2020 14:22:23 -0500 Subject: [PATCH] GT-3545 - GNU Demangler - Fix Parsing Issues - Ready for Review --- .../ghidra/app/util/demangler/Demangled.java | 153 +- .../util/demangler/DemangledAddressTable.java | 2 +- .../app/util/demangler/DemangledDataType.java | 78 +- .../app/util/demangler/DemangledFunction.java | 182 +- .../demangler/DemangledFunctionIndirect.java | 56 +- .../demangler/DemangledFunctionPointer.java | 31 +- .../demangler/DemangledFunctionReference.java | 28 +- .../util/demangler/DemangledFunctionType.java | 34 - .../app/util/demangler/DemangledLambda.java | 5 +- .../app/util/demangler/DemangledObject.java | 120 +- .../app/util/demangler/DemangledString.java | 21 +- .../app/util/demangler/DemangledTemplate.java | 14 +- .../app/util/demangler/DemangledType.java | 50 +- .../app/util/demangler/DemangledUnknown.java | 22 +- .../app/util/demangler/DemangledVariable.java | 14 +- .../app/util/demangler/DemanglerUtil.java | 25 - .../app/util/demangler/ParameterReceiver.java | 37 - .../core/colorizer/ColorizingPluginTest.java | 3 +- .../gnu/DemanglerParseException.java} | 12 +- .../app/util/demangler/gnu/GnuDemangler.java | 2 +- .../demangler/gnu/GnuDemanglerParser.java | 1373 ++++------ .../demangler/GnuDemanglerParserTest.java | 595 +++-- .../util/demangler/gnu/GnuDemanglerTest.java | 5 +- .../demangler/gnu_mangled_names_macho.txt | 16 - .../app/util/demangler/libMagick.symbols.txt | 2280 ----------------- .../app/cmd/data/TypeDescriptorModel.java | 4 +- .../main/java/mdemangler/MDMangGhidra.java | 2 +- .../docking/test/AbstractDockingTest.java | 76 +- .../generic/test/AbstractGenericTest.java | 28 +- .../CodeBrowserPluginScreenShots.java | 6 +- .../screenshot/NavigationScreenShots.java | 2 +- .../util/demangler/DemangledFunctionTest.java | 14 +- .../gnu/GnuDemanglerIntegrationTest.java | 3 +- 33 files changed, 1359 insertions(+), 3934 deletions(-) delete mode 100644 Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionType.java delete mode 100644 Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/ParameterReceiver.java rename Ghidra/Features/{Base/src/main/java/ghidra/app/util/demangler/DemangledMethod.java => GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/DemanglerParseException.java} (71%) delete mode 100644 Ghidra/Features/GnuDemangler/src/test/resources/ghidra/app/util/demangler/gnu_mangled_names_macho.txt delete mode 100644 Ghidra/Features/GnuDemangler/src/test/resources/ghidra/app/util/demangler/libMagick.symbols.txt diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/Demangled.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/Demangled.java index 6a73c889eb..ff549e9f7b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/Demangled.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/Demangled.java @@ -15,29 +15,150 @@ */ package ghidra.app.util.demangler; -// TODO better name +/** + * A unifying top-level interface for all {@link DemangledObject}s and {@link DemangledType}s + * + *

This class and its children have many overlapping concepts that we wish to refine at a + * future date. Below is a listing of know uses: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
MethodDescription
+ * {@link #getName()} + * + * A 'safe' name that is the {@link #getDemangledName()}, but with some characters + * changed to be valid for use within Ghidra. + *
+ * {@link #getDemangledName()} + * + * The unmodified name that was set upon this object. + *
+ * {@link #getNamespaceName()} + * + * The name of this object when it is used as a namespace name. This usually has + * parameter and template information. Further, some characters within templates and + * function signatures are replaced, such as spaces and namespace separators. + *
+ * {@link #getNamespaceString()} + * + * Similar to {@link #getNamespaceName()}, but contains all parent namespaces as well. + *
+ * {@link #getSignature()} + * + * Returns the complete string form of this object, with most known attributes. For + * functions, this will be a complete signature. + *
+ * {@link #getOriginalDemangled()} + * + * The original unmodified demangled string. + *
+ */ public interface Demangled { - public String getName(); - - /** - * Returns the namespace containing this demangled object - * @return the namespace containing this demangled object - */ - public Demangled getNamespace(); - - public void setNamespace(Demangled ns); - - public String toNamespaceString(); - - // TODO doc difference - public String toNamespaceName(); - /** * Returns the original mangled string * @return the string */ public String getMangledString(); + /** + * Sets the original mangled string + * @param mangled the mangled string + */ public void setMangledString(String mangled); + + /** + * Returns the original demangled string returned by the demangling service + * @return the original demangled string + */ + public String getOriginalDemangled(); + + /** + * Sets the original demangles string returned by the demangling service + * @param originalDemangled the original demangled string + */ + public void setOriginalDemangled(String originalDemangled); + + /** + * Returns the demangled name of this object. + * NOTE: unsupported symbol characters, like whitespace, will be converted to an underscore. + * @return name of this DemangledObject with unsupported characters converted to underscore + * @see #getDemangledName() + */ + public String getName(); + + /** + * Sets the name for this object + * @param name the name + */ + public void setName(String name); + + /** + * Returns the unmodified demangled name of this object. This name may contain whitespace + * and other characters not supported for symbol or data type creation. See {@link #getName()} + * for the same name modified for use within Ghidra. + * @return name of this DemangledObject + */ + public String getDemangledName(); + + /** + * Returns the namespace containing this demangled object + * @return the namespace containing this demangled object + */ + public Demangled getNamespace(); + + /** + * Sets the namespace of this demangled object + * @param ns the namespace + */ + public void setNamespace(Demangled ns); + + /** + * Returns a representation of this object as fully-qualified namespace. The + * value returned here may have had some special characters replaced, such as ' ' replaced + * with '_' and '::' replaced with '--'. + * @return the full namespace + */ + public String getNamespaceString(); + + /** + * Returns a this object's namespace name without the full-qualified parent path. The + * value returned here may have had some special characters replaced, such as ' ' replaced + * with '_' and '::' replaced with '--'. + * + * @return the name + */ + public String getNamespaceName(); + + /** + * Generates a complete representation of this object to include all know attributes of this + * object + * @return the signature + */ + public String getSignature(); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledAddressTable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledAddressTable.java index 19268a2ef1..c4af8d467b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledAddressTable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledAddressTable.java @@ -50,7 +50,7 @@ public class DemangledAddressTable extends DemangledObject { buffer.append(specialPrefix); buffer.append(' '); } - String namespaceStr = namespace.toNamespaceString(); + String namespaceStr = namespace.getNamespaceString(); buffer.append(namespaceStr); if (!namespaceStr.endsWith(NAMESPACE_SEPARATOR)) { buffer.append(NAMESPACE_SEPARATOR); 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 94655dbbfe..6b9d067b34 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 @@ -16,6 +16,7 @@ package ghidra.app.util.demangler; import java.util.ArrayList; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -221,7 +222,7 @@ public class DemangledDataType extends DemangledType { dt = createPlaceHolderStructure(name, getNamespace()); } } - else if (dt == null) { // TODO: Is using whatever was found OK ?? + else if (dt == null) { // I don't know what this is // If it isn't pointed to, or isn't a referent, then assume typedef. @@ -367,41 +368,43 @@ public class DemangledDataType extends DemangledType { */ static DataType findDataType(DataTypeManager dataTypeManager, Demangled namespace, String dtName) { - // TODO: Should be able to search archives somehow - ArrayList list = new ArrayList<>(); + + List list = new ArrayList<>(); dataTypeManager.findDataTypes(dtName, list); - if (!list.isEmpty()) { - //use the datatype that exists in the root category, - //otherwise just pick the first one... - DataType anyDt = null; - DataType preferredDataType = null; - for (DataType existingDT : list) { - if (existingDT instanceof BuiltIn) { - continue; // TODO: not sure if this is good - built-ins handled explicitly - // by DemangledDataType.getDataType method - } - if (namespace == null) { - if (existingDT.getCategoryPath().equals(CategoryPath.ROOT)) { - return existingDT; - } - anyDt = existingDT; - } - if (isNamespaceCategoryMatch(existingDT, namespace)) { - preferredDataType = existingDT; - } - } - if (preferredDataType != null) { - return preferredDataType; - } - return anyDt; + if (list.isEmpty()) { + return null; } - return null; + + //use the datatype that exists in the root category, + //otherwise just pick the first one... + DataType anyDt = null; + DataType preferredDataType = null; + for (DataType existingDT : list) { + if (existingDT instanceof BuiltIn) { + // not sure if this is good - built-ins handled explicitly by getDataType() + continue; + } + if (namespace == null) { + if (existingDT.getCategoryPath().equals(CategoryPath.ROOT)) { + return existingDT; + } + anyDt = existingDT; + } + if (isNamespaceCategoryMatch(existingDT, namespace)) { + preferredDataType = existingDT; + } + } + if (preferredDataType != null) { + return preferredDataType; + } + return anyDt; } private static boolean isNamespaceCategoryMatch(DataType dt, Demangled namespace) { if (namespace == null) { return true; } + Demangled ns = namespace; CategoryPath categoryPath = dt.getCategoryPath(); while (ns != null) { @@ -433,7 +436,6 @@ public class DemangledDataType extends DemangledType { StructureDataType structDT = new StructureDataType(dtName, 0); structDT.setDescription("PlaceHolder Structure"); structDT.setCategoryPath(getDemanglerCategoryPath(dtName, namespace)); - return structDT; } @@ -617,10 +619,6 @@ public class DemangledDataType extends DemangledType { boolean isPrimitiveDT = !isArray() && !isClass && !isComplex && !isEnum && !isPointer() && !isPointer64 && !isSigned && !isTemplate && !isUnion && !isCoclass && !isCointerface && !isVarArgs; -// boolean isPrimitiveDT = !isArray && !isClass && !isComplex && !isEnum && !isPointer() && -// !isPointer64 && !isSigned && !isTemplate && !isUnion && !isVarArgs; -// boolean isPrimitiveDT = !isArray && !isClass && !isComplex && !isEnum && !isPointer() && -// !isPointer64 && !isSigned && !isTemplate && !isUnion && !isVarArgs && !isVolatile; if (isPrimitiveDT) { for (String primitiveNames : PRIMITIVES) { if (getName().equals(primitiveNames)) { @@ -631,8 +629,7 @@ public class DemangledDataType extends DemangledType { return false; } - @Override - public String toSignature() { + public String getSignature() { StringBuilder buffer = new StringBuilder(); if (isUnion) { @@ -659,9 +656,6 @@ public class DemangledDataType extends DemangledType { if (isComplex) { buffer.append(COMPLEX + SPACE); } -// if (isVolatile) { -// buffer.append(VOLATILE + SPACE); -// } if (isSigned) { buffer.append(SIGNED + SPACE); } @@ -670,7 +664,7 @@ public class DemangledDataType extends DemangledType { } if (getNamespace() != null) { - buffer.append(getNamespace().toNamespaceString()); + buffer.append(getNamespace().getNamespaceString()); buffer.append(Namespace.DELIMITER); } @@ -684,7 +678,6 @@ public class DemangledDataType extends DemangledType { buffer.append(SPACE + CONST); } - // TODO: The output of volatile belongs here, not above, so I put the commented code here for now. if (isVolatile()) { buffer.append(SPACE + VOLATILE); } @@ -709,7 +702,8 @@ public class DemangledDataType extends DemangledType { buffer.append(SPACE + REF_NOTATION); } - //Order of __ptr64 and __restrict can vary--with fuzzing... but what is the natural "real symbol" order? + // the order of __ptr64 and __restrict can vary--with fuzzing... + // but what is the natural "real symbol" order? if (isPointer64) { buffer.append(SPACE + PTR64); } @@ -736,7 +730,7 @@ public class DemangledDataType extends DemangledType { @Override public String toString() { - return toSignature(); + return getSignature(); } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java index f9ab598ee9..222a8cbcb3 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java @@ -21,21 +21,23 @@ import org.apache.commons.lang3.StringUtils; import ghidra.app.cmd.disassemble.DisassembleCommand; import ghidra.app.cmd.function.*; +import ghidra.app.util.NamespaceUtils; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressSetView; import ghidra.program.model.data.*; import ghidra.program.model.lang.PrototypeModel; import ghidra.program.model.listing.*; -import ghidra.program.model.symbol.SourceType; -import ghidra.program.model.symbol.Symbol; +import ghidra.program.model.symbol.*; import ghidra.program.model.util.CodeUnitInsertionException; +import ghidra.util.Msg; +import ghidra.util.exception.AssertException; import ghidra.util.exception.InvalidInputException; import ghidra.util.task.TaskMonitor; /** * A class to represent a demangled function. */ -public class DemangledFunction extends DemangledObject implements ParameterReceiver { +public class DemangledFunction extends DemangledObject { public static final String VOLATILE = "volatile"; public static final String CONST = "const"; @@ -104,18 +106,10 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei this.isOverloadedOperator = isOverloadedOperator; } - /** - * @see ghidra.app.util.demangler.ParameterReceiver - */ - @Override public void addParameter(DemangledDataType parameter) { parameters.add(parameter); } - /** - * @see ghidra.app.util.demangler.ParameterReceiver - */ - @Override public List getParameters() { return new ArrayList<>(parameters); } @@ -198,7 +192,7 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei @Override public String getSignature(boolean format) { - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); if (!(returnType instanceof DemangledFunctionPointer)) { buffer.append(specialPrefix == null ? "" : specialPrefix + " "); @@ -214,38 +208,26 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei buffer.append("static "); } if (!isTypeCast()) { - buffer.append(returnType == null ? "" : returnType.toSignature() + " "); + buffer.append(returnType == null ? "" : returnType.getSignature() + " "); } // buffer.append(returnType == null ? "" : returnType.toSignature() + " "); } buffer.append(callingConvention == null ? "" : callingConvention + " "); if (namespace != null) { - buffer.append(namespace.toNamespaceString()); + buffer.append(namespace.getNamespaceString()); buffer.append(NAMESPACE_SEPARATOR); } buffer.append(getDemangledName()); if (isTypeCast()) { - buffer.append(returnType == null ? "" : " " + returnType.toSignature() + " "); + buffer.append(returnType == null ? "" : " " + returnType.getSignature() + " "); } if (template != null) { buffer.append(template.toTemplate()); } - if (specialMidfix != null) { - buffer.append('[').append(specialMidfix).append(']'); - } - - // check for special case of 'conversion operator' where we only want to display '()' and - // not (void) -// if (name.endsWith("()")) { -// if (name.equals("operator")) { -// buffer.append("()"); -// } -// } -// else { if (templatedConstructorType != null) { buffer.append('<').append(templatedConstructorType).append('>'); } @@ -258,7 +240,7 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei } while (paramIterator.hasNext()) { - buffer.append(paramIterator.next().toSignature()); + buffer.append(paramIterator.next().getSignature()); if (paramIterator.hasNext()) { buffer.append(','); if (format) { @@ -270,26 +252,19 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei buffer.append(')'); buffer.append(storageClass == null ? "" : " " + storageClass); -// } if (returnType instanceof DemangledFunctionPointer) { DemangledFunctionPointer funcPtr = (DemangledFunctionPointer) returnType; String partialSig = funcPtr.toSignature(buffer.toString()); - buffer = new StringBuffer(); + buffer = new StringBuilder(); buffer.append(specialPrefix == null ? "" : specialPrefix + " "); buffer.append( visibility == null || "global".equals(visibility) ? "" : visibility + " "); - //if (virtual || super.isVirtual) { if (isVirtual) { buffer.append("virtual "); } buffer.append(partialSig); } - else { - if (specialSuffix != null) { - buffer.append(specialSuffix); - } - } if (isTrailingConst()) { if (buffer.length() > 2) { @@ -332,7 +307,7 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei } @Override - public String toNamespaceName() { + public String getNamespaceName() { return getName() + getParameterString(); } @@ -341,7 +316,7 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei buffer.append('('); Iterator dditer = parameters.iterator(); while (dditer.hasNext()) { - buffer.append(dditer.next().toSignature()); + buffer.append(dditer.next().getSignature()); if (dditer.hasNext()) { buffer.append(','); } @@ -452,13 +427,13 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei for (int i = 0; i < args.size(); i++) { if (args.get(i).getLength() > pointerSize) { bookmarkManager.setBookmark(address, BookmarkType.ANALYSIS, "Demangler", - "Couldn't Apply demangled signature - probably due to datatype that is too " + + "Couldn't apply demangled signature - probably due to datatype that is too " + "large to fit in a parameter"); } } bookmarkManager.setBookmark(address, BookmarkType.ANALYSIS, "Demangler", - "Couldn't Apply demangled signature - bad parameter number match (" + args.size() + + "Couldn't apply demangled signature - bad parameter number match (" + args.size() + ") in a function in a namespace"); } @@ -488,7 +463,8 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei } } - private DataType resolveReturnType(Program program, Function func, Structure classDataType) { + private DataType resolveReturnType(Program program, Function function, + Structure classDataType) { // If something is returned as a Union, Structure, or Class return. // It appears that is passed as an additional parameter. Essentially, it accesses // the stack assuming there is reserved space. @@ -497,7 +473,7 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei } // If returnType is null check for constructor or destructor names - if (THIS_CALL.equals(func.getCallingConventionName())) { + if (THIS_CALL.equals(function.getCallingConventionName())) { String n = getName(); if (n.equals("~" + namespace.getName()) || n.equals(namespace.getName())) { // constructor && destructor @@ -507,47 +483,50 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei return null; } - private Structure maybeUpdateCallingConventionAndCreateClass(Program program, Function func) { - try { - // If the calling convention is known, should use it! - if (callingConvention != null) { - if (program.getCompilerSpec().getCallingConvention(callingConvention) == null) { - // warn that calling convention not found. Datatypes are still good, - // the real calling convention can be figured out later - // For example X64 can have __cdecl, __fastcall, __stdcall, that are accepted but ignored - program.getBookmarkManager() - .setBookmark(func.getEntryPoint(), - BookmarkType.ANALYSIS, "Demangler", - "Warning calling convention \"" + - callingConvention + "\" not defined in Compiler Spec (.cspec)"); - } - else { - func.setCallingConvention(callingConvention); - if (THIS_CALL.equals(callingConvention)) { - return createClassStructure(program, func); - } - return null; - } - } + private Structure maybeUpdateCallingConventionAndCreateClass(Program program, + Function function) { - if (isThisCall(func)) { - func.setCallingConvention(THIS_CALL); - return createClassStructure(program, func); + String convention = validateCallingConvention(program, function); + if (convention == null) { + if (!isThisCall(function)) { + return null; } -// Leave the calling convention to someone else to figure out -// else { -// String defaultConvention = getDefaultCallingConvention(program); -// if (defaultConvention != null) { -// func.setCallingConvention(defaultConvention); -// } -// } + convention = THIS_CALL; + } + + try { + function.setCallingConvention(convention); + return maybeCreateClassStructure(program, function, convention); } catch (InvalidInputException e) { - e.printStackTrace(); + Msg.error(this, "Unexpected exception setting calling convention", e); } + return null; } + private String validateCallingConvention(Program program, Function function) { + + if (callingConvention == null) { + return null; + } + + if (program.getCompilerSpec().getCallingConvention(callingConvention) == null) { + // warn that calling convention not found. Datatypes are still good, + // the real calling convention can be figured out later + // For example X64 can have __cdecl, __fastcall, __stdcall, that + // are accepted but ignored + BookmarkManager bm = program.getBookmarkManager(); + Address entry = function.getEntryPoint(); + bm.setBookmark(entry, BookmarkType.ANALYSIS, "Demangler", + "Could not apply calling convention \"" + callingConvention + + "\" not defined in Compiler Spec (.cspec)"); + return null; + } + + return callingConvention; + } + private List convertMangledToParamDef(Program program) { List args = new ArrayList<>(); @@ -661,7 +640,7 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei } // if the function name is the same name as it's namespace -// TODO: this seems too flexible - why not use equals? + // TODO: this seems too flexible - why not use equals? if (n.startsWith(namespace.getName())) { return true; } @@ -686,7 +665,7 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei return true; } - // TODO: It STILL COULD be a this call, we just don't know! + // It STILL COULD be a this call, we just don't know! // But is also could be a static member function! // The only way to really tell is compare the number of detected parameters // to the number of parameters we have, OR, to detect the calling convention @@ -707,13 +686,58 @@ public class DemangledFunction extends DemangledObject implements ParameterRecei if (ns == null) { return false; } - if (ns.getName().toLowerCase().equals(STD_NAMESPACE)) { + if (ns.getName().equalsIgnoreCase(STD_NAMESPACE)) { return true; } return false; } - static Function createFunction(Program prog, Address addr, boolean doDisassembly, + protected Structure maybeCreateClassStructure(Program program, Function function, + String convention) { + + if (!THIS_CALL.equals(convention)) { + return null; + } + + if (namespace == null) { + return null; + } + + String className = namespace.getName(); + Symbol parentSymbol = function.getSymbol().getParentSymbol(); + if (parentSymbol.getSymbolType() == SymbolType.NAMESPACE) { + try { + NamespaceUtils.convertNamespaceToClass((Namespace) parentSymbol.getObject()); + } + catch (InvalidInputException e) { + throw new AssertException(e); // unexpected condition + } + } + + // Store class structure in parent namespace + Demangled classNamespace = namespace.getNamespace(); + DataTypeManager dataTypeManager = program.getDataTypeManager(); + DataType existingType = + DemangledDataType.findDataType(dataTypeManager, classNamespace, className); + if (existingType != null && !(existingType instanceof Structure)) { + BookmarkManager bm = program.getBookmarkManager(); + Address entry = function.getEntryPoint(); + bm.setBookmark(entry, BookmarkType.ANALYSIS, "Demangler", + "Could not create class structure, data type already exists: " + existingType); + return null; + } + + Structure structure = (Structure) existingType; + if (structure == null) { + structure = DemangledDataType.createPlaceHolderStructure(className, + classNamespace); + } + structure = (Structure) dataTypeManager.resolve(structure, + DataTypeConflictHandler.DEFAULT_HANDLER); + return structure; + } + + protected Function createFunction(Program prog, Address addr, boolean doDisassembly, TaskMonitor monitor) { Listing listing = prog.getListing(); Function func = listing.getFunctionAt(addr); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionIndirect.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionIndirect.java index 140a79da35..e4810dd37e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionIndirect.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionIndirect.java @@ -27,7 +27,7 @@ import ghidra.program.model.data.*; * is still an indirect definition (not a regular function definition). The * function indirect is prevalent in the Microsoft model, if not other models. */ -public class DemangledFunctionIndirect extends DemangledDataType implements ParameterReceiver { +public class DemangledFunctionIndirect extends DemangledDataType { private static final String DEFAULT_NAME_PREFIX = "FuncDef"; private static final String NAMESPACE_DELIMITER = "::"; @@ -58,23 +58,6 @@ public class DemangledFunctionIndirect extends DemangledDataType implements Para return ID++; } -// DemangledFunctionDefinition(GenericDemangledFunctionDefinition generic) { -// super(generic); -// -// ID = generic.getID(); -// returnType = (DemangledDataType) DemangledObjectFactory.convert(generic.getReturnType()); -// callingConvention = generic.getCallingConvention(); -// isConstPointer = generic.isConstPointer(); -// -// parentName = generic.getParentName(); -// isTrailingPointer64 = generic.isTrailingPointer64(); -// -// List genericParameters = generic.getParameters(); -// for (GenericDemangledDataType parameter : genericParameters) { -// parameters.add((DemangledDataType) DemangledObjectFactory.convert(parameter)); -// } -// } - /** * Returns the return type. * @return the return type @@ -152,20 +135,17 @@ public class DemangledFunctionIndirect extends DemangledDataType implements Para } /** - * Adds a parameters to the end of the parameter list for - * this demangled function. + * Adds a parameters to the end of the parameter list for this demangled function * @param parameter the new parameter to add */ - @Override public void addParameter(DemangledDataType parameter) { parameters.add(parameter); } /** - * Returns a list of the parameters for this demangled functions. + * Returns a list of the parameters for this demangled functions * @return a list of the parameters for this demangled functions */ - @Override public List getParameters() { return new ArrayList<>(parameters); } @@ -195,13 +175,13 @@ public class DemangledFunctionIndirect extends DemangledDataType implements Para } @Override - public String toSignature() { + public String getSignature() { return toSignature(null); } public String toSignature(String name) { - StringBuffer buffer = new StringBuffer(); - StringBuffer buffer1 = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); + StringBuilder buffer1 = new StringBuilder(); String s = getConventionPointerNameString(name); if (s.contains(" ") || s.isEmpty()) { // spaces--add parens @@ -213,7 +193,7 @@ public class DemangledFunctionIndirect extends DemangledDataType implements Para buffer1.append('('); for (int i = 0; i < parameters.size(); ++i) { - buffer1.append(parameters.get(i).toSignature()); + buffer1.append(parameters.get(i).getSignature()); if (i < parameters.size() - 1) { buffer1.append(','); } @@ -222,21 +202,24 @@ public class DemangledFunctionIndirect extends DemangledDataType implements Para if (returnType instanceof DemangledFunctionPointer) { buffer.append( - ((DemangledFunctionPointer) returnType).toSignature(buffer1.toString())).append( - SPACE); + ((DemangledFunctionPointer) returnType).toSignature(buffer1.toString())) + .append( + SPACE); } else if (returnType instanceof DemangledFunctionReference) { buffer.append( - ((DemangledFunctionReference) returnType).toSignature(buffer1.toString())).append( - SPACE); + ((DemangledFunctionReference) returnType).toSignature(buffer1.toString())) + .append( + SPACE); } else if (returnType instanceof DemangledFunctionIndirect) { buffer.append( - ((DemangledFunctionIndirect) returnType).toSignature(buffer1.toString())).append( - SPACE); + ((DemangledFunctionIndirect) returnType).toSignature(buffer1.toString())) + .append( + SPACE); } else { - buffer.append(returnType.toSignature()).append(SPACE); + buffer.append(returnType.getSignature()).append(SPACE); buffer.append(buffer1); } @@ -278,7 +261,7 @@ public class DemangledFunctionIndirect extends DemangledDataType implements Para return buffer.toString(); } - private void addFunctionPointerParens(StringBuffer buffer, String s) { + private void addFunctionPointerParens(StringBuilder buffer, String s) { if (!displayFunctionPointerParens) { return; } @@ -322,9 +305,6 @@ public class DemangledFunctionIndirect extends DemangledDataType implements Para } if (name != null) { -// if (buffer.length() > 2) { -// buffer.append(SPACE); -// } if ((buffer.length() > 2) && (buffer.charAt(buffer.length() - 1) != SPACE)) { buffer.append(SPACE); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionPointer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionPointer.java index 8d8f3359df..70f7a45245 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionPointer.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionPointer.java @@ -23,7 +23,7 @@ import ghidra.program.model.data.*; /** * A class to represent a demangled function pointer. */ -public class DemangledFunctionPointer extends DemangledDataType implements ParameterReceiver { +public class DemangledFunctionPointer extends DemangledDataType { private static final String DEFAULT_NAME_PREFIX = "FuncDef"; private static final Object NAMESPACE_DELIMITER = "::"; @@ -131,11 +131,9 @@ public class DemangledFunctionPointer extends DemangledDataType implements Param } /** - * Adds a parameters to the end of the parameter list for - * this demangled function. + * Adds a parameters to the end of the parameter list for this demangled function * @param parameter the new parameter to add */ - @Override public void addParameter(DemangledDataType parameter) { parameters.add(parameter); } @@ -144,7 +142,6 @@ public class DemangledFunctionPointer extends DemangledDataType implements Param * Returns a list of the parameters for this demangled functions. * @return a list of the parameters for this demangled functions */ - @Override public List getParameters() { return new ArrayList<>(parameters); } @@ -174,7 +171,7 @@ public class DemangledFunctionPointer extends DemangledDataType implements Param } @Override - public String toSignature() { + public String getSignature() { return toSignature(null); } @@ -192,7 +189,7 @@ public class DemangledFunctionPointer extends DemangledDataType implements Param buffer1.append('('); for (int i = 0; i < parameters.size(); ++i) { - buffer1.append(parameters.get(i).toSignature()); + buffer1.append(parameters.get(i).getSignature()); if (i < parameters.size() - 1) { buffer1.append(','); } @@ -200,25 +197,19 @@ public class DemangledFunctionPointer extends DemangledDataType implements Param buffer1.append(')'); if (returnType instanceof DemangledFunctionPointer) { - buffer.append( - ((DemangledFunctionPointer) returnType).toSignature(buffer1.toString())) - .append( - SPACE); + DemangledFunctionPointer dfp = (DemangledFunctionPointer) returnType; + buffer.append(dfp.toSignature(buffer1.toString())).append(SPACE); } else if (returnType instanceof DemangledFunctionReference) { - buffer.append( - ((DemangledFunctionReference) returnType).toSignature(buffer1.toString())) - .append( - SPACE); + DemangledFunctionReference dfr = (DemangledFunctionReference) returnType; + buffer.append(dfr.toSignature(buffer1.toString())).append(SPACE); } else if (returnType instanceof DemangledFunctionIndirect) { - buffer.append( - ((DemangledFunctionIndirect) returnType).toSignature(buffer1.toString())) - .append( - SPACE); + DemangledFunctionIndirect dfi = (DemangledFunctionIndirect) returnType; + buffer.append(dfi.toSignature(buffer1.toString())).append(SPACE); } else { - buffer.append(returnType.toSignature()).append(SPACE); + buffer.append(returnType.getSignature()).append(SPACE); buffer.append(buffer1); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionReference.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionReference.java index 16d05a242c..98b43e8282 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionReference.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionReference.java @@ -23,7 +23,7 @@ import ghidra.program.model.data.*; /** * A class to represent a demangled function reference. */ -public class DemangledFunctionReference extends DemangledDataType implements ParameterReceiver { +public class DemangledFunctionReference extends DemangledDataType { private static final String DEFAULT_NAME_PREFIX = "FuncDef"; private static final Object NAMESPACE_DELIMITER = "::"; @@ -131,11 +131,9 @@ public class DemangledFunctionReference extends DemangledDataType implements Par } /** - * Adds a parameters to the end of the parameter list for - * this demangled function. + * Adds a parameters to the end of the parameter list for this demangled function * @param parameter the new parameter to add */ - @Override public void addParameter(DemangledDataType parameter) { parameters.add(parameter); } @@ -144,7 +142,6 @@ public class DemangledFunctionReference extends DemangledDataType implements Par * Returns a list of the parameters for this demangled functions. * @return a list of the parameters for this demangled functions */ - @Override public List getParameters() { return new ArrayList<>(parameters); } @@ -174,7 +171,7 @@ public class DemangledFunctionReference extends DemangledDataType implements Par } @Override - public String toSignature() { + public String getSignature() { return toSignature(null); } @@ -192,7 +189,7 @@ public class DemangledFunctionReference extends DemangledDataType implements Par buffer1.append('('); for (int i = 0; i < parameters.size(); ++i) { - buffer1.append(parameters.get(i).toSignature()); + buffer1.append(parameters.get(i).getSignature()); if (i < parameters.size() - 1) { buffer1.append(','); } @@ -201,21 +198,24 @@ public class DemangledFunctionReference extends DemangledDataType implements Par if (returnType instanceof DemangledFunctionPointer) { buffer.append( - ((DemangledFunctionPointer) returnType).toSignature(buffer1.toString())).append( - SPACE); + ((DemangledFunctionPointer) returnType).toSignature(buffer1.toString())) + .append( + SPACE); } else if (returnType instanceof DemangledFunctionReference) { buffer.append( - ((DemangledFunctionReference) returnType).toSignature(buffer1.toString())).append( - SPACE); + ((DemangledFunctionReference) returnType).toSignature(buffer1.toString())) + .append( + SPACE); } else if (returnType instanceof DemangledFunctionIndirect) { buffer.append( - ((DemangledFunctionIndirect) returnType).toSignature(buffer1.toString())).append( - SPACE); + ((DemangledFunctionIndirect) returnType).toSignature(buffer1.toString())) + .append( + SPACE); } else { - buffer.append(returnType.toSignature()).append(SPACE); + buffer.append(returnType.getSignature()).append(SPACE); buffer.append(buffer1); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionType.java deleted file mode 100644 index fbf36e3427..0000000000 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunctionType.java +++ /dev/null @@ -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; - -/** - * An extension of {@link DemangledType} that signals that the type is function and can provide - * more info, like the function signature. - */ -public class DemangledFunctionType extends DemangledType { - - private String signature; - - public DemangledFunctionType(String name, String signature) { - super(name); - this.signature = signature; - } - - public String getSignature() { - return signature; - } -} diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledLambda.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledLambda.java index 121820459f..6e59758b36 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledLambda.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledLambda.java @@ -15,6 +15,9 @@ */ package ghidra.app.util.demangler; +/** + * Represents a demangled lambda function + */ public class DemangledLambda extends DemangledFunction { public DemangledLambda(String name) { @@ -22,7 +25,7 @@ public class DemangledLambda extends DemangledFunction { } @Override - public String toNamespaceName() { + public String getNamespaceName() { return getName(); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java index f8bedf2407..b2a185bd11 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledObject.java @@ -22,11 +22,12 @@ import java.util.regex.Pattern; import ghidra.app.cmd.label.SetLabelPrimaryCmd; import ghidra.app.util.NamespaceUtils; import ghidra.program.model.address.Address; -import ghidra.program.model.data.*; -import ghidra.program.model.listing.*; +import ghidra.program.model.listing.CodeUnit; +import ghidra.program.model.listing.Program; import ghidra.program.model.symbol.*; import ghidra.util.Msg; -import ghidra.util.exception.*; +import ghidra.util.exception.DuplicateNameException; +import ghidra.util.exception.InvalidInputException; import ghidra.util.task.TaskMonitor; /** @@ -41,10 +42,8 @@ public abstract class DemangledObject implements Demangled { protected static final String EMPTY_STRING = ""; protected String mangled; // original mangled string - protected String utilDemangled; + protected String originalDemangled; protected String specialPrefix; - protected String specialMidfix; - protected String specialSuffix; protected Demangled namespace; protected String visibility;//public, protected, etc. @@ -75,23 +74,11 @@ public abstract class DemangledObject implements Demangled { // default } - /** - * Returns the unmodified demangled name of this object. - * This name may contain whitespace and other characters not - * supported for symbol or data type creation. See {@link #getName()} - * for the same name modified for use within Ghidra. - * @return name of this DemangledObject - */ + @Override public String getDemangledName() { return demangledName; } - /** - * Returns the demangled name of this object. - * NOTE: unsupported symbol characters, like whitespace, will be - * converted to an underscore. - * @return name of this DemangledObject with unsupported characters converted to underscore - */ @Override public String getName() { return name; @@ -181,6 +168,7 @@ public abstract class DemangledObject implements Demangled { * Sets the name of the demangled object * @param name the new name */ + @Override public void setName(String name) { this.demangledName = name; this.name = name; @@ -202,20 +190,14 @@ public abstract class DemangledObject implements Demangled { return mangled; } - /** - * Sets the demangled output from a supplemental utility. - * @param utilDemangled the demangled string - */ - public void setUtilDemangled(String utilDemangled) { - this.utilDemangled = utilDemangled; + @Override + public void setOriginalDemangled(String originalDemangled) { + this.originalDemangled = originalDemangled; } - /** - * Gets the demangled output from a supplemental utility. - * @return the demangled String created for this object. - */ - public String getUtilDemangled() { - return utilDemangled; + @Override + public String getOriginalDemangled() { + return originalDemangled; } @Override @@ -252,22 +234,6 @@ public abstract class DemangledObject implements Demangled { this.specialPrefix = special; } - public String getSpecialMidfix() { - return specialMidfix; - } - - public void setSpecialMidfix(String chargeType) { - this.specialMidfix = chargeType; - } - - public String getSpecialSuffix() { - return specialSuffix; - } - - public void setSpecialSuffix(String specialSuffix) { - this.specialSuffix = specialSuffix; - } - /** * Returns a complete signature for the demangled symbol. *
For example: @@ -281,12 +247,17 @@ public abstract class DemangledObject implements Demangled { */ public abstract String getSignature(boolean format); + @Override + public String getSignature() { + return getSignature(false); + } + /** * Returns a signature that contains only the name (and parameter list for functions) * @return the signature */ @Override - public String toNamespaceName() { + public String getNamespaceName() { return getSignature(false); } @@ -305,13 +276,13 @@ public abstract class DemangledObject implements Demangled { } @Override - public String toNamespaceString() { + public String getNamespaceString() { StringBuilder buffer = new StringBuilder(); if (namespace != null) { - buffer.append(namespace.toNamespaceString()); + buffer.append(namespace.getNamespaceString()); buffer.append(Namespace.DELIMITER); } - buffer.append(toNamespaceName()); + buffer.append(getNamespaceName()); return buffer.toString(); } @@ -366,8 +337,8 @@ public abstract class DemangledObject implements Demangled { } protected String generatePlateComment() { - if (utilDemangled != null) { - return utilDemangled; + if (originalDemangled != null) { + return originalDemangled; } return (signature == null) ? getSignature(true) : signature; } @@ -446,22 +417,20 @@ public abstract class DemangledObject implements Demangled { * @return list of namespace names */ private static List getNamespaceList(Demangled typeNamespace) { - ArrayList list = new ArrayList<>(); + List list = new ArrayList<>(); Demangled ns = typeNamespace; while (ns != null) { - list.add(0, ns.getName()); + list.add(0, ns.getNamespaceName()); ns = ns.getNamespace(); } return list; } - // TODO needs updating. Couldn't determine what getResigualNamespacePath was changed to. /** * Get or create the specified typeNamespace. The returned namespace may only be a partial * namespace if errors occurred. The caller should check the returned namespace and adjust - * any symbol creation accordingly. Caller should use - * getResidualNamespacePath(DemangledType, Namespace) to handle the case where - * only a partial namespace has been returned. + * any symbol creation accordingly. + * * @param program the program * @param typeNamespace demangled namespace * @param parentNamespace root namespace to be used (e.g., library, global, etc.) @@ -556,37 +525,4 @@ public abstract class DemangledObject implements Demangled { return buffy.toString(); } - protected Structure createClassStructure(Program prog, Function func) { - DataTypeManager dataTypeManager = prog.getDataTypeManager(); - - if (namespace == null) { - // unexpected - return null; - } - String structureName = namespace.getName(); - - Symbol parentSymbol = func.getSymbol().getParentSymbol(); - if (parentSymbol.getSymbolType() == SymbolType.NAMESPACE) { - try { - NamespaceUtils.convertNamespaceToClass((Namespace) parentSymbol.getObject()); - } - catch (InvalidInputException e) { - throw new AssertException(e); // unexpected condition - } - } - - // Store class structure in parent namespace - Demangled classStructureNamespace = namespace.getNamespace(); - - Structure classStructure = (Structure) DemangledDataType.findDataType(dataTypeManager, - classStructureNamespace, structureName); - if (classStructure == null) { - classStructure = DemangledDataType.createPlaceHolderStructure(structureName, - classStructureNamespace); - } - classStructure = (Structure) dataTypeManager.resolve(classStructure, - DataTypeConflictHandler.DEFAULT_HANDLER); - return classStructure; - } - } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledString.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledString.java index 3a9b55358f..ea104962fe 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledString.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledString.java @@ -48,12 +48,9 @@ public class DemangledString extends DemangledObject { public String getSignature(boolean format) { StringBuffer buffer = new StringBuffer(); if (specialPrefix != null) { - buffer.append(specialPrefix + " for "); + buffer.append(specialPrefix); } buffer.append(string); - if (specialSuffix != null) { - buffer.append(" " + specialSuffix); - } return buffer.toString(); } @@ -72,9 +69,9 @@ public class DemangledString extends DemangledObject { public boolean applyTo(Program program, Address address, DemanglerOptions options, TaskMonitor monitor) throws Exception { - String label = SymbolUtilities.replaceInvalidChars(string, false); + String label = buildStringLabel(); if (hasLabel(program, address, label)) { - return true; // Desired symbol already exists here. + return true; // This string has already been applied } if (!super.applyTo(program, address, options, monitor)) { @@ -88,24 +85,24 @@ public class DemangledString extends DemangledObject { return false; } - // TODO: should we be using length ? CreateStringCmd cmd = new CreateStringCmd(address, -1, isUnicode()); cmd.applyTo(program); - // unclear what demangled name should be used so apply - // fabricated string label which is more useful than mangled name Symbol demangledSymbol = - applyDemangledName(buildStringLabel(), address, true, false, program); + applyDemangledName(label, address, true, false, program); return (demangledSymbol != null); } private String buildStringLabel() { - // build string label consistent with dynamic label formatting + if (specialPrefix != null) { + // a 'special prefix' implies that the author wishes to apply the string exactly as-is return getName(); } + + // build string label consistent with dynamic label formatting int len = string.length(); - StringBuffer buf = new StringBuffer(len); + StringBuilder buf = new StringBuilder(len); for (int i = 0; i < len; ++i) { char c = string.charAt(i); if (StringUtilities.isDisplayable(c) && (c != ' ')) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledTemplate.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledTemplate.java index 8d7e93c35f..7d9cec77d9 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledTemplate.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledTemplate.java @@ -19,31 +19,23 @@ import java.util.ArrayList; import java.util.List; import ghidra.program.model.data.DataType; -import ghidra.util.Msg; -public class DemangledTemplate implements ParameterReceiver { +public class DemangledTemplate { private List parameters = new ArrayList(); - @Override public void addParameter(DemangledDataType parameter) { parameters.add(parameter); } - @Override public List getParameters() { return new ArrayList(parameters); } public String toTemplate() { - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); buffer.append('<'); for (int i = 0; i < parameters.size(); ++i) { - try { - buffer.append(parameters.get(i).toSignature()); - } - catch (Error e) { - Msg.error(this, "Unexpected Error: " + e.getMessage(), e); - } + buffer.append(parameters.get(i).getSignature()); if (i < parameters.size() - 1) { buffer.append(','); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledType.java index 716f7b9b89..604ecfc391 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledType.java @@ -17,7 +17,12 @@ package ghidra.app.util.demangler; import ghidra.program.model.symbol.Namespace; -// TODO maybe rename this to DemangledNamespace +/** + * Represents a demangled string. This class is really just a placeholder for demangled + * information. See {@link DemangledObject} for a class that represents software concepts that + * can be applied to a program. The {@link DemangledObject} may use instances of this class + * to compose its internal state for namespace information, return types and parameters. + */ public class DemangledType implements Demangled { private String demangledName; private String name; @@ -26,37 +31,23 @@ public class DemangledType implements Demangled { protected DemangledTemplate template; private boolean isConst; private boolean isVolatile; + private String originalDemangled; public DemangledType(String name) { setName(name); } - /** - * Returns the unmodified demangled name of this object. - * This name may contain whitespace and other characters not - * supported for symbol or data type creation. See {@link #getName()} - * for the same name modified for use within Ghidra. - * @return name of this DemangledObject - */ + @Override public String getDemangledName() { return demangledName; } - /** - * Get the name of this type. - * NOTE: unsupported symbol characters, like whitespace, will be - * converted to an underscore. - * @return name of this DemangledType suitable for namespace creation. - */ @Override public String getName() { return name; } - /** - * Sets the name of the demangled type object. - * @param name the new name - */ + @Override public void setName(String name) { demangledName = name; this.name = name; @@ -66,6 +57,16 @@ public class DemangledType implements Demangled { } } + @Override + public void setOriginalDemangled(String originalDemangled) { + this.originalDemangled = originalDemangled; + } + + @Override + public String getOriginalDemangled() { + return originalDemangled; + } + @Override public void setMangledString(String mangled) { this.mangled = mangled; @@ -113,19 +114,20 @@ public class DemangledType implements Demangled { this.template = template; } - public String toSignature() { - return toNamespaceString(); + @Override + public String getSignature() { + return getNamespaceName(); } @Override - public String toNamespaceString() { + public String getNamespaceString() { return getName(true); } private String getName(boolean includeNamespace) { StringBuilder buffer = new StringBuilder(); if (includeNamespace && namespace != null) { - buffer.append(namespace.toNamespaceString()); + buffer.append(namespace.getNamespaceString()); buffer.append(Namespace.DELIMITER); } @@ -142,12 +144,12 @@ public class DemangledType implements Demangled { } @Override - public String toNamespaceName() { + public String getNamespaceName() { return getName(false); } @Override public String toString() { - return toNamespaceString(); + return getNamespaceString(); } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledUnknown.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledUnknown.java index b7b24b499f..6d6a1fa790 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledUnknown.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledUnknown.java @@ -33,31 +33,11 @@ public class DemangledUnknown extends DemangledObject { setName(name); } -// DemangledUnknown(GenericDemangledVariable other) { -// super(other); -// } -// @Override public String getSignature(boolean format) { - return utilDemangled; + return originalDemangled; } -// @Override -// protected boolean isAlreadyDemangled(Program program, Address address) { -// return !utilDemangled.isEmpty(); -// } -// -// @Override -// public boolean applyTo(Program program, Address address, DemanglerOptions options, -// TaskMonitor monitor) throws Exception { -// -// if (isAlreadyDemangled(program, address)) { -// return true; -// } -// -// return super.applyTo(program, address, options, monitor); -// } -// @Override public String getName() { //These items likely do not have names or data types, so return the signature. diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java index 3a6b637cc9..a2daf2430d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledVariable.java @@ -79,7 +79,7 @@ public class DemangledVariable extends DemangledObject { !(datatype instanceof DemangledFunctionReference) && !(datatype instanceof DemangledFunctionIndirect)) { if (datatype != null) { - datatypeBuffer.append(datatype.toSignature()); + datatypeBuffer.append(datatype.getSignature()); spacer = SPACE; } } @@ -130,7 +130,7 @@ public class DemangledVariable extends DemangledObject { datatypeBuffer.append(spacer); spacer = EMPTY_STRING; - datatypeBuffer.append(namespace.toNamespaceString()); + datatypeBuffer.append(namespace.getNamespaceString()); if (hasName) { datatypeBuffer.append(NAMESPACE_SEPARATOR); @@ -143,9 +143,6 @@ public class DemangledVariable extends DemangledObject { datatypeBuffer.append(getName()); } - datatypeBuffer.append(specialMidfix == null ? EMPTY_STRING : specialMidfix + SPACE); - datatypeBuffer.append(specialSuffix == null ? EMPTY_STRING : SPACE + specialSuffix); - if (datatype instanceof DemangledFunctionPointer) { DemangledFunctionPointer funcPtr = (DemangledFunctionPointer) datatype; return buffer.append(funcPtr.toSignature(datatypeBuffer.toString())).toString(); @@ -165,7 +162,7 @@ public class DemangledVariable extends DemangledObject { } @Override - public String toNamespaceName() { + public String getNamespaceName() { String n = getDemangledName(); if (!StringUtils.isBlank(n)) { @@ -173,7 +170,7 @@ public class DemangledVariable extends DemangledObject { } if (datatype != null) { - return datatype.toSignature(); + return datatype.getSignature(); } return ""; // shouldn't happen } @@ -200,9 +197,6 @@ public class DemangledVariable extends DemangledObject { } Symbol demangledSymbol = applyDemangledName(address, true, true, program); - - //TODO replace existing datatype? - DataType demangledDT = getProgramDataType(program); if (address.isExternalAddress()) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemanglerUtil.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemanglerUtil.java index 57a714c50d..7517ae882f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemanglerUtil.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemanglerUtil.java @@ -101,31 +101,6 @@ public class DemanglerUtil { return ClassSearcher.getInstances(Demangler.class); } - /** - * Converts the list of names into a namespace demangled type. - * Given names = { "A", "B", "C" }, which represents "A::B::C". - * The following will be created {@literal "Namespace{A}->Namespace{B}->Namespace{C}"} - * and Namespace{C} will be returned. - * - * NOTE: the list will be empty after the call. - * @param names the names to convert - * @return the newly created type - */ - public static DemangledType convertToNamespaces(List names) { - if (names.size() == 0) { - return null; - } - int index = names.size() - 1; - DemangledType myNamespace = new DemangledType(names.get(index)); - DemangledType namespace = myNamespace; - while (--index >= 0) { - DemangledType parentNamespace = new DemangledType(names.get(index)); - namespace.setNamespace(parentNamespace); - namespace = parentNamespace; - } - return myNamespace; - } - /** * Remove superfluous function signature spaces from specified string * @param str string diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/ParameterReceiver.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/ParameterReceiver.java deleted file mode 100644 index eeebdc3fe2..0000000000 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/ParameterReceiver.java +++ /dev/null @@ -1,37 +0,0 @@ -/* ### - * IP: GHIDRA - * REVIEWED: YES - * - * 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; - -import java.util.List; - -/** - * A generic interface to represent - * object that support parameters. - */ -public interface ParameterReceiver { - /** - * Adds the specified parameter to this object. - * @param parameter the parameter to add - */ - public void addParameter(DemangledDataType parameter); - - /** - * Returns the parameters added to this object. - * @return the parameters added to this object - */ - public List getParameters(); -} diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/colorizer/ColorizingPluginTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/colorizer/ColorizingPluginTest.java index 0a140605f3..a6b0409958 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/colorizer/ColorizingPluginTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/colorizer/ColorizingPluginTest.java @@ -400,8 +400,7 @@ public class ColorizingPluginTest extends AbstractGhidraHeadedIntegrationTest { ActionContext context = getActionContext(); performAction(setColorAction, context, false); - Window chooserWindow = waitForWindow(null, ColorizingServiceProvider.COLOR_CHOOSER_TITLE, - DEFAULT_WINDOW_TIMEOUT); + Window chooserWindow = waitForWindow(ColorizingServiceProvider.COLOR_CHOOSER_TITLE); assertNotNull("Did not find Color Chooser", chooserWindow); GhidraColorChooser colorChooser = findComponent(chooserWindow, GhidraColorChooser.class); JButton okButton = findButtonByText(chooserWindow, "OK"); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledMethod.java b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/DemanglerParseException.java similarity index 71% rename from Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledMethod.java rename to Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/DemanglerParseException.java index 59f822799c..1c6c36994c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledMethod.java +++ b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/DemanglerParseException.java @@ -13,12 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ghidra.app.util.demangler; +package ghidra.app.util.demangler.gnu; -// TODO delete this -public class DemangledMethod extends DemangledFunction { +/** + * Exception to signal a problem parsing a demangled string + */ +public class DemanglerParseException extends RuntimeException { - public DemangledMethod(String name) { - super(name); + public DemanglerParseException(String message) { + super(message); } } diff --git a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java index c95886a003..2e1c9a91c7 100644 --- a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java +++ b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemangler.java @@ -209,7 +209,7 @@ public class GnuDemangler implements Demangler { return null; } - GnuDemanglerParser parser = new GnuDemanglerParser(process); + GnuDemanglerParser parser = new GnuDemanglerParser(); DemangledObject demangledObject = parser.parse(mangled, demangled); return demangledObject; } diff --git a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java index 377bee946b..2acfad6d13 100644 --- a/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java +++ b/Ghidra/Features/GnuDemangler/src/main/java/ghidra/app/util/demangler/gnu/GnuDemanglerParser.java @@ -15,18 +15,18 @@ */ package ghidra.app.util.demangler.gnu; -import java.io.IOException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import ghidra.app.util.SymbolPath; import ghidra.app.util.demangler.*; import ghidra.program.model.lang.CompilerSpec; -import ghidra.util.Msg; import ghidra.util.StringUtilities; public class GnuDemanglerParser { @@ -37,67 +37,17 @@ public class GnuDemanglerParser { private static final String TYPEINFO_NAME_FOR = "typeinfo name for "; private static final String TYPEINFO_FN_FOR = "typeinfo fn for "; private static final String TYPEINFO_FOR = "typeinfo for "; - private static final String REFERENCE_TEMPORARY_FOR = "reference temporary for "; - private static final String GUARD_VARIABLE_FOR = "guard variable for "; private static final String COVARIANT_RETURN_THUNK = "covariant return thunk"; - private static final String VIRTUAL_THUNK = "virtual thunk"; - private static final String NONVIRTUAL_THUNK = "non-virtual thunk"; + + private static final Set ADDRESS_TABLE_PREFIXES = Set.of( + CONSTRUCTION_VTABLE_FOR, + VTT_FOR, + VTABLE_FOR, + TYPEINFO_FN_FOR, + TYPEINFO_FOR); private static final String NAMESPACE_DELIMITER = "::"; - private SpecialPrefixHandler getSpecialPrefixHandler(String demangled) { - - if (demangled.startsWith(VTT_FOR)) { - return new AddressTableHandler(demangled, VTT_FOR); - } - if (demangled.startsWith(VTABLE_FOR)) { - return new AddressTableHandler(demangled, VTABLE_FOR); - } - if (demangled.startsWith(TYPEINFO_NAME_FOR)) { - return new TypeInfoNameHandler(demangled, TYPEINFO_NAME_FOR); - } - if (demangled.startsWith(TYPEINFO_FOR)) { - return new AddressTableHandler(demangled, TYPEINFO_FOR); - } - if (demangled.startsWith(TYPEINFO_FN_FOR)) { - return new AddressTableHandler(demangled, TYPEINFO_FN_FOR); - } - if (demangled.startsWith(CONSTRUCTION_VTABLE_FOR)) { - return new ConstructionVTableHandler(demangled, CONSTRUCTION_VTABLE_FOR); - } - - return null; - } - - private OperatorHandler getOperatorHandler(String demangled) { - - OperatorHandler handler = new OverloadOperatorHandler(); - if (handler.matches(demangled)) { - return handler; - } - - handler = new ConversionOperatorHandler(); - if (handler.matches(demangled)) { - return handler; - } - - handler = new NewOrDeleteOperatorHandler(); - if (handler.matches(demangled)) { - return handler; - } - - return null; - } - - /** - *

-	 * Syntax: bob(const(Rect &, bool))
-	 *
-	 * pattern: 'const' with surrounding '()' with a capture group for the contents
-	 * 
- */ - private static final Pattern CONST_FUNCTION_PATTERN = Pattern.compile("const\\((.*)\\)"); - /** *
 	 * Syntax: bob((Rect &, unsigned long))
@@ -106,9 +56,12 @@ public class GnuDemanglerParser {
 	 *          parens
 	 * note:    this pattern is used for matching the arguments string, in the above example it
 	 *          would be: (Rect &, unsigned long)
+	 *          
+	 * Also matches: bob(const(Rect &, bool))
 	 * 
*/ - private static final Pattern UNNECESSARY_PARENS_PATTERN = Pattern.compile("\\s*\\((.*)\\)\\s*"); + private static final Pattern UNNECESSARY_PARENS_PATTERN = + Pattern.compile("\\s*(const){0,1}\\((.*)\\)\\s*"); /** *
@@ -155,12 +108,12 @@ public class GnuDemanglerParser {
 	*             must be followed by more text
 	*           --the text can have multiple words, such as (unsigned long)
 	*           -optional space
-	*           -optional '-' character
+	*           -optional '-' character (a negative sign character)
 	* 			-followed by more text (with optional spaces)
 	* 
*/ private static final Pattern CAST_PATTERN = - Pattern.compile("\\((?:\\w+\\s)*\\w+(?:::\\w+)*\\)\\s*-*\\w+"); + Pattern.compile("\\((?:\\w+\\s)*\\w+(?:::\\w+)*\\)\\s*-{0,1}\\w+"); private static final String OPERATOR = "operator"; @@ -222,16 +175,23 @@ public class GnuDemanglerParser { private static final String LAMBDA = "lambda"; - // TODO docme - // {lambda(void const*, unsigned int)#1} - // grab: - // 1 - full text - // 2 - params - // 3 - trailing id + /** + * Pattern for newer C++ lambda syntax: + * + *
+	 *  {lambda(void const*, unsigned int)#1}
+	 * 
+	 *  1 - full text
+	 *  2 - params
+	 *  3 - trailing id
+	 *  
+ */ private static final Pattern LAMBDA_PATTERN = Pattern.compile(".*(\\{" + LAMBDA + "\\((.*)\\)(#\\d+)\\})"); - // TODO docme + /** + * The c 'decltype' keyword pattern + */ private static final Pattern DECLTYPE_RETURN_TYPE_PATTERN = Pattern.compile("decltype \\(.*\\)"); @@ -239,20 +199,25 @@ public class GnuDemanglerParser { // possible private static final Pattern ENDS_WITH_DIGITS_PATTERN = Pattern.compile("(.*?)\\d+"); - private static final String SPACE = " "; + /** + * Examples: + * construction vtable for + * vtable for + * typeinfo name for + * typeinfo for + * guard variable for + * covariant return thunk to + * virtual thunk to + * non-virtual thunk to + */ + private static final Pattern DESCRIPTIVE_PREFIX_PATTERN = + Pattern.compile("((.+ )+(for|to) )(.*)"); + + private static final char NULL_CHAR = '\u0000'; private static final String VAR_ARGS = "..."; - + private static final String THUNK = "thunk"; private static final String CONST_KEYWORD = " const"; - private static final String ANONYMOUS_NAMESPACE = "\\(anonymous namespace\\)"; - private static final String ANONYMOUS_NAMESPACE_FIXUP = "anonymous_namespace"; - - private GnuDemanglerNativeProcess process; - - public GnuDemanglerParser(GnuDemanglerNativeProcess process) { - this.process = process; - } - private static Pattern createOverloadedOperatorPattern() { //@formatter:off @@ -263,7 +228,7 @@ public class GnuDemanglerParser { "&", "|", ">>", "<<", "~", "^", "&&", "||", "!", "=", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", ">>=", "<<=", - "," + ",", "()" )); //@formatter:on @@ -273,122 +238,90 @@ public class GnuDemanglerParser { } - public DemangledObject parse(String mangled, String demangled) { + /** + * Parses the given demangled string and creates a {@link DemangledObject} + * + * @param mangled the original mangled text + * @param demangled the demangled text + * @return the demangled object + * @throws DemanglerParseException if there is an unexpected error parsing + */ + public DemangledObject parse(String mangled, String demangled) + throws DemanglerParseException { OperatorHandler operatorHandler = getOperatorHandler(demangled); if (operatorHandler != null) { - return operatorHandler.build(); - } - - SpecialPrefixHandler handler = getSpecialPrefixHandler(demangled); - if (handler != null) { - try { - String toParse = handler.getParent(); - DemangledObject dobj = parseParts(mangled, toParse); - DemangledObject specialPrefixDobj = handler.build(dobj); - return specialPrefixDobj; - } - catch (Exception e) { - throw new RuntimeException( - "Unexpected problem parsing " + demangled + " from mangled string: " + mangled, - e); - } - } - - try { - - DemangledObject dobj = doParse(mangled, demangled); + DemangledObject dobj = operatorHandler.build(); + dobj.setMangledString(mangled); + dobj.setOriginalDemangled(demangled); return dobj; } - catch (Exception e) { - throw new RuntimeException( - "Unexpected problem parsing " + demangled + " from mangled string: " + mangled, e); - } - } - public DemangledObject parseParts(String mangled, String demangled) throws IOException { - - DemangledObject dobj = null; - List nsParts = toNamespaceParts(demangled); - for (String part : nsParts) { - DemangledObject newDobj = doParse(mangled, part); - if (dobj != null) { - newDobj.setNamespace(dobj); - } - dobj = newDobj; + SpecialPrefixHandler handler = getSpecialPrefixHandler(mangled, demangled); + if (handler != null) { + String type = handler.getType(); + DemangledObject dobj = doParse(type); + DemangledObject specialPrefixDobj = handler.build(dobj); + specialPrefixDobj.setMangledString(mangled); + specialPrefixDobj.setOriginalDemangled(demangled); + return specialPrefixDobj; } + DemangledObject dobj = doParse(demangled); + dobj.setMangledString(mangled); + dobj.setOriginalDemangled(demangled); + return dobj; } - // TODO convert to use scanner; maybe delete scanner - private List toNamespaceParts(String s) { + private OperatorHandler getOperatorHandler(String demangled) { - List parts = new ArrayList<>(); - int nextStart = 0; - int colon = 0; - int ignoreCount = 0; // templates and parameters - int n = s.length(); - for (int i = 0; i < n; i++) { - char c = s.charAt(i); - if (c == '<' || c == '(') { - ignoreCount++; - continue; - } - - if (c == '>' || c == ')') { - ignoreCount--; - continue; - } - - if (ignoreCount != 0) { - continue; - } - - if (c == ':') { - if (++colon == 2) { - parts.add(s.substring(nextStart, i - 1)); - nextStart = i + 1; - colon = 0; - } - continue; - } - colon = 0; - - if (c == ' ') { - parts.add(s.substring(nextStart, i)); - nextStart = i + 1; - } + OperatorHandler handler = new OverloadOperatorHandler(); + if (handler.matches(demangled)) { + return handler; } - if (nextStart < n) { - parts.add(s.substring(nextStart)); + handler = new ConversionOperatorHandler(); + if (handler.matches(demangled)) { + return handler; } - return parts; + handler = new NewOrDeleteOperatorHandler(); + if (handler.matches(demangled)) { + return handler; + } + + return null; } - private DemangledObject doParse(String mangled, String demangled) throws IOException { + private SpecialPrefixHandler getSpecialPrefixHandler(String mangled, String demangled) { - // remove spaces from anonymous namespace strings - demangled = demangled.replaceAll(ANONYMOUS_NAMESPACE, ANONYMOUS_NAMESPACE_FIXUP); + Matcher matcher = DESCRIPTIVE_PREFIX_PATTERN.matcher(demangled); + if (matcher.matches()) { + String prefix = matcher.group(1); + String type = matcher.group(4); + if (prefix.contains(THUNK)) { + return new ThunkHandler(demangled, prefix, type); + } - if (mangled != null && mangled.startsWith("_ZZ")) { - return parseItemInNamespace(demangled, ""); - } - if (demangled.startsWith(GUARD_VARIABLE_FOR)) { - return parseItemInNamespace(demangled, GUARD_VARIABLE_FOR); - } - if (demangled.startsWith(REFERENCE_TEMPORARY_FOR)) { - return parseItemInNamespace(demangled, REFERENCE_TEMPORARY_FOR); + if (ADDRESS_TABLE_PREFIXES.contains(prefix)) { + return new AddressTableHandler(demangled, prefix, type); + } + + if (prefix.startsWith(TYPEINFO_NAME_FOR)) { + return new TypeInfoNameHandler(demangled, TYPEINFO_NAME_FOR); + } + + return new ItemInNamespaceHandler(demangled, prefix, type); } - if (demangled.startsWith(NONVIRTUAL_THUNK) || // _ZTh - demangled.startsWith(VIRTUAL_THUNK) || // _ZTv - demangled.startsWith(COVARIANT_RETURN_THUNK)) {// _ZTc - - return parseThunk(mangled, demangled); + if (mangled.startsWith("_ZZ")) { + return new ItemInNamespaceHandler(demangled); } + return null; + } + + private DemangledObject doParse(String demangled) { ParameterLocator paramLocator = new ParameterLocator(demangled); if (!paramLocator.hasParameters()) { @@ -397,82 +330,51 @@ public class GnuDemanglerParser { int paramStart = paramLocator.getParamStart(); int paramEnd = paramLocator.getParamEnd(); - if (paramStart + 1 == demangled.indexOf(')')) {//check for overloaded 'operator()' - int pos = paramStart - "operator".length(); - if (pos >= 0 && demangled.indexOf("operator") == pos) { - paramStart = demangled.indexOf('(', paramStart + 1); - paramEnd = demangled.lastIndexOf(')'); - } - } String parameterString = demangled.substring(paramStart + 1, paramEnd).trim(); List parameters = parseParameters(parameterString); + // 'prefix' is the text before the parameters int prefixEndPos = paramStart; - - String chargeType = null; - if (demangled.charAt(paramStart - 1) == ']') {//skip the GNU charge type... - int sqBracketStartPos = backIndexOf(demangled, paramStart - 1, '['); - // - // This case would include operator_new[] and operator_delete[] - // check to see if empty brackets exists - // - if (sqBracketStartPos != prefixEndPos - 2) { - chargeType = demangled.substring(sqBracketStartPos, paramStart); - prefixEndPos = sqBracketStartPos; - } - } - String prefix = demangled.substring(0, prefixEndPos).trim(); prefix = fixupInternalSeparators(prefix); - int nameStartPos = backIndexOf(prefix, prefix.length() - 1, ' '); - if (nameStartPos == -1) { - throw new RuntimeException(); - } - String name = prefix.substring(nameStartPos, prefix.length()).trim(); - if (chargeType != null) { - name += chargeType; - } - - DemangledFunction method = new DemangledMethod((String) null); + int nameStart = Math.max(0, prefix.lastIndexOf(' ')); + String name = prefix.substring(nameStart, prefix.length()).trim(); + DemangledFunction function = new DemangledFunction(null); String simpleName = name; LambdaName lambdaName = getLambdaName(demangled); if (lambdaName != null) { String uniqueName = lambdaName.getFullText(); String fullLambda = fixupInternalSeparators(uniqueName); simpleName = name.replace("{lambda", fullLambda); - method = new DemangledLambda(null); - method.setSignature(lambdaName.getFullText()); + function = new DemangledLambda(null); + function.setSignature(lambdaName.getFullText()); } // For GNU, we cannot leave the return type as null, because the DemangleCmd will fill in // pointer to the class to accommodate windows demangling - method.setReturnType(new DemangledDataType("undefined")); + function.setReturnType(new DemangledDataType("undefined")); for (DemangledDataType parameter : parameters) { - method.addParameter(parameter); + function.addParameter(parameter); } - setNameAndNamespace(method, simpleName); - - // TODO this should be handled somewhere else; verify it is still executed - if (method.getName().startsWith("operator")) { - char ch = method.getName().charAt("operator".length()); - if (!Character.isLetterOrDigit(ch)) { - method.setOverloadedOperator(true); - } - } + setNameAndNamespace(function, simpleName); // check for return type - if (nameStartPos > 0) { - - String returnType = prefix.substring(0, nameStartPos); - setReturnType(method, returnType); + if (nameStart > 0) { + String returnType = prefix.substring(0, nameStart); + setReturnType(function, returnType); } - return method; + + if (demangled.endsWith(CONST_KEYWORD)) { + function.setConst(true); + } + + return function; } - private void setReturnType(DemangledFunction method, String returnType) { + private void setReturnType(DemangledFunction function, String returnType) { if (DECLTYPE_RETURN_TYPE_PATTERN.matcher(returnType).matches()) { // Not sure yet if there is any information we wish to recover from this pattern. @@ -480,7 +382,7 @@ public class GnuDemanglerParser { return; } - method.setReturnType(parseDataType(returnType)); + function.setReturnType(parseDataType(returnType)); } private LambdaName getLambdaName(String name) { @@ -495,235 +397,41 @@ public class GnuDemanglerParser { return new LambdaName(fullText, params, trailing); } - private DemangledObject parseThunk(String mangled, String demangled) throws IOException { - int index = mangled.indexOf('_', 1); - if (index < 0) { - return null; - } - - if (demangled.startsWith(VIRTUAL_THUNK) || - demangled.startsWith(COVARIANT_RETURN_THUNK)) { - // skip second constant for virtual thunk - index = mangled.indexOf('_', ++index); - if (index < 0) { - return null; - } - } - - String referencedMangledName = "_Z" + mangled.substring(index + 1); - String referencedDemangledName = process.demangle(referencedMangledName); - if (referencedMangledName.equals(referencedDemangledName) || - referencedDemangledName.length() == 0) { - return null; - } - - DemangledObject refObj = parse(referencedMangledName, referencedDemangledName); - if (!(refObj instanceof DemangledFunction)) { - return null; - } - refObj.setMangledString(referencedMangledName); - refObj.setSignature(referencedDemangledName); - - // mark referenced function as a thiscall - ((DemangledFunction) refObj).setCallingConvention( - CompilerSpec.CALLING_CONVENTION_thiscall); - - // (SCR 9800) Need to add support for Covariant Return Thunks which will - // allow the return type to differ from the underlying thunked function - - DemangledThunk thunkObj = new DemangledThunk((DemangledFunction) refObj); - - if (demangled.startsWith(COVARIANT_RETURN_THUNK)) { - thunkObj.setCovariantReturnThunk(); - } - - index = demangled.indexOf(" to "); - if (index > 0) { - thunkObj.setSignaturePrefix(demangled.substring(0, index + 4)); - } - - return thunkObj; - } - - // TODO move this into handler? - private DemangledObject parseConversionOperator(Matcher matcher) { - - // this will yield: - // fullName: NS1::Foo::operator - // fullReturnType: std::string - String fullName = matcher.group(1);// group 0 is the entire match string - String fullReturnType = matcher.group(2); - - boolean isConst = false; - int index = fullReturnType.indexOf(CONST_KEYWORD); - if (index != -1) { - fullReturnType = fullReturnType.replace(CONST_KEYWORD, ""); - isConst = true; - } - - DemangledMethod method = new DemangledMethod((String) null); - DemangledDataType returnType = createDataType(fullReturnType); - if (isConst) { - returnType.setConst(); - } - method.setReturnType(returnType); - - // 'conversion operator' syntax is 'operator ()' - // assume fullName endsWith '::operator' - int operatorIndex = fullName.lastIndexOf("::operator"); - String namespace = fullName.substring(0, operatorIndex); - - String templatelessNamespace = stripOffTemplates(namespace); - setNamespace(method, templatelessNamespace); - - // shortReturnType: string - String templatelessReturnType = stripOffTemplates(fullReturnType); - SymbolPath path = new SymbolPath(templatelessReturnType); - String shortReturnTypeName = path.getName(); - - // - // The preferred name: 'operator basic_string()' - // - // Ghidra does not allow spaces in the name or extra parens. So, make a name that is - // as clear as possible in describing the construct. - // - method.setName("operator.cast.to." + shortReturnTypeName); - - method.setSignature(fullName + " " + fullReturnType); - method.setOverloadedOperator(true); - - return method; - } - - // TODO move this into handler? - private DemangledObject parseNewOrDeleteOperator(Matcher matcher) { - - String operatorText = matcher.group(1);// group 0 is the entire match string - String operatorName = matcher.group(2); - String arrayBrackets = matcher.group(3); - String parametersText = matcher.group(4); - - DemangledMethod method = new DemangledMethod((String) null); - method.setOverloadedOperator(true); - DemangledDataType returnType = new DemangledDataType("void"); - if (operatorName.startsWith("new")) { - returnType.incrementPointerLevels(); - } - - method.setReturnType(returnType); - - // 'new operator' syntax is 'operator ()', where the - // operator itself could be in a class namespace - setNameAndNamespace(method, operatorText); - - List parameters = parseParameters(parametersText); - for (DemangledDataType parameter : parameters) { - method.addParameter(parameter); - } - - // - // The preferred name: 'operator new()' - // - // Ghidra does not allow spaces in the name or extra parens. So, make a name that is - // as clear as possible in describing the construct. - // - String name = operatorName; - if (arrayBrackets != null) { - name += "[]"; - } - method.setName("operator." + name); - - method.setSignature(operatorText + " " + operatorName); - - return method; - } - - private DemangledDataType createDataType(String fullReturnType) { - DemangledDataType parsedDataType = parseDataType(fullReturnType); - return parsedDataType; - } - - // TODO can this use a scanner? private String stripOffTemplates(String string) { StringBuilder buffy = new StringBuilder(); - int templateCount = 0; + int depth = 0; for (int i = 0; i < string.length(); i++) { char c = string.charAt(i); if (c == '<') { - templateCount++; + depth++; continue; } else if (c == '>') { - templateCount--; + depth--; continue; } - if (templateCount == 0) { + if (depth == 0) { buffy.append(c); } } return buffy.toString(); } - private DemangledObject parseItemInNamespace(String demangled, - String prefix) { + private DemangledObject parseItemInNamespace(String itemText) { - String itemText = demangled.substring(prefix.length()).trim(); int pos = itemText.lastIndexOf(NAMESPACE_DELIMITER); if (pos == -1) { - throw new RuntimeException(); + throw new DemanglerParseException( + "Expected the demangled string to contain a namespace"); } String parentText = itemText.substring(0, pos); - DemangledObject parent = parse(null, parentText); - if (parent == null) { - return null; - } - - if (itemText.endsWith(CONST_KEYWORD)) { - // TODO add trim() when tests are passing - itemText = itemText.substring(0, itemText.length() - CONST_KEYWORD.length()); - parent.setConst(true); - } - + DemangledObject parent = doParse(parentText); String name = itemText.substring(pos + 2); - ParameterLocator paramLocator = new ParameterLocator(name); - if (paramLocator.hasParameters()) { - - // TODO refactor this out to a method when tests passing - int paramStart = paramLocator.getParamStart(); - int paramEnd = paramLocator.getParamEnd(); - String nameOnly = name.substring(0, paramStart); - DemangledMethod method = new DemangledMethod(nameOnly); - String parameterString = name.substring(paramStart + 1, paramEnd).trim(); - List parameters = parseParameters(parameterString); - method.setReturnType(new DemangledDataType("undefined")); - for (DemangledDataType parameter : parameters) { - method.addParameter(parameter); - } - setNamespace(parent, method); - return method; - } - - DemangledVariable variable = new DemangledVariable(name); - setNamespace(parent, variable); - return variable; - } - - private void setNamespace(DemangledObject parent, DemangledObject child) { - - DemangledType namespace = null; - if (parent instanceof DemangledFunction) { - DemangledFunction dfun = (DemangledFunction) parent; - namespace = new DemangledFunctionType(dfun.toNamespaceName(), - dfun.getSignature(false)); - } - else { - namespace = new DemangledType(parent.getName()); - } - - namespace.setNamespace(parent.getNamespace()); - child.setNamespace(namespace); + DemangledObject item = doParse(name); + item.setNamespace(parent); + return item; } /** @@ -732,61 +440,25 @@ public class GnuDemanglerParser { */ private String fixupInternalSeparators(String name) { StringBuilder buffer = new StringBuilder(); - int enclosingLevel = 0; - char last = '\u0000'; + int depth = 0; + char last = NULL_CHAR; for (int i = 0; i < name.length(); ++i) { char ch = name.charAt(i); if (ch == '<' || ch == '(') { - ++enclosingLevel; + ++depth; } - else if ((ch == '>' || ch == ')') && enclosingLevel != 0) { - --enclosingLevel; + else if ((ch == '>' || ch == ')') && depth != 0) { + --depth; } - if (enclosingLevel > 0 && ch == ' ') { - char next = (i + 1) < name.length() ? name.charAt(i + 1) : '\u0000'; + if (depth > 0 && ch == ' ') { + char next = (i + 1) < name.length() ? name.charAt(i + 1) : NULL_CHAR; if (isSurroundedByCharacters(last, next)) { // separate words with a value so they don't run together; drop the other spaces buffer.append('_'); } } - else if (enclosingLevel > 0 && ch == ':') { - buffer.append('-'); - } - else { - buffer.append(ch); - } - - last = ch; - } - return buffer.toString().trim(); - } - - /** - * Replaces all SPACES and COLONS inside the templates with UNDERSCORES and - * DASHES, respectively - */ - private String fixupTemplateSeparatorsOLD(String name) { - StringBuffer buffer = new StringBuffer(); - int templateLevel = 0; - char last = '\u0000'; - for (int i = 0; i < name.length(); ++i) { - char ch = name.charAt(i); - if (ch == '<') { - ++templateLevel; - } - else if (ch == '>' && templateLevel != 0) { - --templateLevel; - } - - if (templateLevel > 0 && ch == ' ') { - char next = (i + 1) < name.length() ? name.charAt(i + 1) : '\u0000'; - if (isSurroundedByCharacters(last, next)) { - // separate words with a value so they don't run together; drop the other spaces - buffer.append('_'); - } - } - else if (templateLevel > 0 && ch == ':') { + else if (depth > 0 && ch == ':') { buffer.append('-'); } else { @@ -799,26 +471,12 @@ public class GnuDemanglerParser { } private boolean isSurroundedByCharacters(char last, char next) { - if (last == '\u0000' || next == '\u0000') { + if (last == NULL_CHAR || next == NULL_CHAR) { return false; } return Character.isLetterOrDigit(last) && Character.isLetterOrDigit(next); } - /** - * Searches backward for the specified character - * starting at the index. - */ - private int backIndexOf(String string, int index, char ch) { - while (index >= 0) { - if (string.charAt(index) == ch) { - return index; - } - --index; - } - return 0; - } - /** * This method separates the parameters as strings. * This is more complicated then one might initially think. @@ -841,37 +499,29 @@ public class GnuDemanglerParser { // note: this matches the syntax of bob( const(param1, param2)), where for some // reason the demangled symbol has const() around the params. After research, this is seen // when demangling functions that have const at the end, such as bob(param1, param2) const; - Matcher matcher = CONST_FUNCTION_PATTERN.matcher(parameterString); + Matcher matcher = UNNECESSARY_PARENS_PATTERN.matcher(parameterString); if (matcher.matches()) { - parameterString = matcher.group(1);// group 0 is the entire string - } - else { - matcher = UNNECESSARY_PARENS_PATTERN.matcher(parameterString); - if (matcher.matches()) { - parameterString = matcher.group(1); - } + parameterString = matcher.group(2); } - if (parameterString.trim().length() == 0) { + if (StringUtils.isBlank(parameterString)) { return parameters; } - int templateLevel = 0; - int functionPointerLevel = 0; + int depth = 0; int startIndex = 0; - for (int i = 0; i < parameterString.length(); ++i) { char ch = parameterString.charAt(i); - if (ch == ',' && templateLevel == 0 && functionPointerLevel == 0) { + if (ch == ',' && depth == 0) { String ps = parameterString.substring(startIndex, i); parameters.add(ps.trim()); startIndex = i + 1; } else if (ch == '<') { - ++templateLevel; + ++depth; } else if (ch == '>') { - --templateLevel; + --depth; } else if (ch == '(') { // @@ -926,7 +576,7 @@ public class GnuDemanglerParser { private int getFunctionPointerCloseParen(String parameterString, int currentIndex) { int firstCloseParen = parameterString.indexOf(')', currentIndex); if (firstCloseParen == -1) { - throw new RuntimeException( + throw new DemanglerParseException( "Unable to find closing paren for parameter string: " + parameterString); } @@ -972,19 +622,21 @@ public class GnuDemanglerParser { return parameters; } - private DemangledDataType parseDataType(String datatype) { - DemangledDataType ddt = new DemangledDataType((String) null); - setNameAndNamespace(ddt, datatype); + private DemangledDataType parseDataType(String fullDatatype) { - int last_i = 0; + Matcher castMatcher = CAST_PATTERN.matcher(fullDatatype); + if (castMatcher.matches()) { + // special case: template parameter with a cast (just make the datatype + // be the name of the template parameter, since it will just be a display + // attribute for the templated type) + String value = castMatcher.group(0);// group 0 is the entire match + return new DemangledDataType(value); + } + + DemangledDataType ddt = createTypeInNamespace(fullDatatype); + String datatype = ddt.getDemangledName(); boolean finishedName = false; for (int i = 0; i < datatype.length(); ++i) { - - if (i < last_i) { - Msg.debug(this, "i less than " + last_i); // TODO delete me - } - last_i = i; - char ch = datatype.charAt(i); if (!finishedName && isDataTypeNameCharacter(ch)) { @@ -998,36 +650,26 @@ public class GnuDemanglerParser { ddt.setVarArgs(); } else { - - Matcher matcher = CAST_PATTERN.matcher(datatype); - if (matcher.matches()) { - // special case: template parameter with a cast (just make the datatype - // be the name of the template parameter, since it will just be a display - // attribute for the templated type) - String value = matcher.group(0);// group 0 is the entire match - return new DemangledDataType(value); - } - String name = datatype.substring(0, i).trim(); - setNameAndNamespace(ddt, name); + ddt.setName(name); } } + if (ch == ' ') { + continue; + } if (ch == '<') {//start of template int contentStart = i + 1; - int templateEnd = getTemplateEndIndex(datatype, contentStart); + // int templateEnd = getTemplateEndIndex(datatype, contentStart); + int templateEnd = findTemplateEnd(datatype, i); if (templateEnd == -1 || templateEnd > datatype.length()) { - throw new RuntimeException("Did not find ending to template"); + throw new DemanglerParseException("Did not find ending to template"); } String templateContent = datatype.substring(contentStart, templateEnd); DemangledTemplate template = parseTemplate(templateContent); ddt.setTemplate(template); i = templateEnd; - - if (i < last_i) { - Msg.debug(this, "\ttemplate end: " + i); - } } else if (ch == '(') {// start of function pointer or array ref/pointer // @@ -1038,51 +680,52 @@ public class GnuDemanglerParser { // // check for array case - Matcher matcher = ARRAY_POINTER_REFERENCE_PATTERN.matcher(datatype); - if (matcher.matches()) { - String name = matcher.group(1);// group 0 is the entire string + Matcher arrayMatcher = ARRAY_POINTER_REFERENCE_PATTERN.matcher(datatype); + if (arrayMatcher.matches()) { + Demangled namespace = ddt.getNamespace(); + String name = arrayMatcher.group(1);// group 0 is the entire string ddt = parseArrayPointerOrReference(datatype, name); - i = matcher.end(); - - if (i < last_i) { - Msg.debug(this, "\tarray matcher end: " + i); - } + ddt.setNamespace(namespace); + i = arrayMatcher.end(); } else { int startParenCount = StringUtilities.countOccurrences(datatype.substring(i), '('); boolean hasPointerParens = startParenCount == 2; if (hasPointerParens) { - ddt = parseFunctionPointer(datatype); + Demangled namespace = ddt.getNamespace(); + DemangledFunctionPointer dfp = parseFunctionPointer(datatype); int firstParenEnd = datatype.indexOf(')', i + 1); int secondParenEnd = datatype.indexOf(')', firstParenEnd + 1); if (secondParenEnd == -1) { - throw new RuntimeException( + throw new DemanglerParseException( "Did not find ending to closure: " + datatype); } - i = secondParenEnd + 1; // two sets of parens (normal case) - if (i < last_i) { - Msg.debug(this, "\tsecond paren end: " + i); - } + dfp.getReturnType().setNamespace(namespace); + ddt = dfp; + i = secondParenEnd + 1; // two sets of parens (normal case) } else { - ddt = parseFunction(datatype, i); + + // parse as a function pointer, but display as a function + Demangled namespace = ddt.getNamespace(); + DemangledFunctionPointer dfp = parseFunction(datatype, i); int firstParenEnd = datatype.indexOf(')', i + 1); if (firstParenEnd == -1) { - throw new RuntimeException( + throw new DemanglerParseException( "Did not find ending to closure: " + datatype); } - i = firstParenEnd + 1;// two sets of parens (normal case) - if (i < last_i) { - Msg.debug(this, "\tfirst paren end: " + i); - } + dfp.getReturnType().setNamespace(namespace); + ddt = dfp; + i = firstParenEnd + 1;// two sets of parens (normal case) } } } else if (ch == '*') { ddt.incrementPointerLevels(); + continue; } else if (ch == '&') { if (!ddt.isReference()) { @@ -1091,9 +734,12 @@ public class GnuDemanglerParser { else { ddt.incrementPointerLevels(); } + continue; } - else if (ch == '[') { // should we consume closing ']' + else if (ch == '[') { ddt.setArray(ddt.getArrayDimensions() + 1); + i = datatype.indexOf(']', i + 1); + continue; } String substr = datatype.substring(i); @@ -1168,39 +814,74 @@ public class GnuDemanglerParser { //@formatter:on } - // scan to last part of template - private int getTemplateEndIndex(String datatype, int start) { - int endIndex = start; - int depth = 1; - while (endIndex < datatype.length()) { - char tempCh = datatype.charAt(endIndex); - if (tempCh == '>') { - depth--; - if (depth == 0) { + /** + * Scans the given string from the given offset looking for a template and reporting the + * index of the closing template character '>' or -1 if no templates are found + * + * @param string the input string + * @param start the start position within the string + * @return the template end index; -1 if no templates found + */ + private int findTemplateEnd(String string, int start) { + + boolean found = false; + int depth = 0; + for (int i = start; i < string.length(); i++) { + switch (string.charAt(i)) { + case '<': + depth++; + found = true; + break; + case '>': + depth--; break; - } } - if (tempCh == '<') { - depth++; + + if (found && depth == 0) { + return i; } - endIndex++; } - return endIndex; + + return -1; } - private void setNameAndNamespace(DemangledDataType ddt, String name) { + // assumption: the given index is in a template + // Walk backwards to find the template start + private int findMatchingTemplateStart(String string, int templateEnd) { + + int depth = 1; + for (int i = templateEnd - 1; i >= 0; i--) { + switch (string.charAt(i)) { + case '<': + depth--; + break; + case '>': + depth++; + break; + } + + if (depth == 0) { + return i;// found our opening tag + } + } + + return -1; + } + + private DemangledDataType createTypeInNamespace(String name) { SymbolPath path = new SymbolPath(name); List names = path.asList(); DemangledType namespace = null; if (names.size() > 1) { - namespace = DemanglerUtil.convertToNamespaces(names.subList(0, names.size() - 1)); + namespace = convertToNamespaces(names.subList(0, names.size() - 1)); } String datatypeName = names.get(names.size() - 1); - + DemangledDataType ddt = new DemangledDataType(datatypeName); ddt.setName(datatypeName); ddt.setNamespace(namespace); + return ddt; } private void setNameAndNamespace(DemangledObject object, String name) { @@ -1210,7 +891,7 @@ public class GnuDemanglerParser { DemangledType namespace = null; if (names.size() > 1) { - namespace = DemanglerUtil.convertToNamespaces(names.subList(0, names.size() - 1)); + namespace = convertToNamespaces(names.subList(0, names.size() - 1)); } String objectName = names.get(names.size() - 1); @@ -1223,7 +904,7 @@ public class GnuDemanglerParser { SymbolPath path = new SymbolPath(name); List names = path.asList(); - object.setNamespace(DemanglerUtil.convertToNamespaces(names)); + object.setNamespace(convertToNamespaces(names)); } private DemangledTemplate parseTemplate(String templateStr) { @@ -1250,7 +931,7 @@ public class GnuDemanglerParser { ddt.setReference(); } else { - throw new RuntimeException("Unexpected charater inside of parens: " + type); + throw new DemanglerParseException("Unexpected charater inside of parens: " + type); } String arraySubscripts = matcher.group(4); @@ -1260,29 +941,21 @@ public class GnuDemanglerParser { return ddt; } - private DemangledDataType parseFunctionPointer(String functionPointerString) { + private DemangledFunctionPointer parseFunctionPointer(String functionString) { //unsigned long (*)(long const &) - int parenStart = functionPointerString.indexOf('('); - int parenEnd = functionPointerString.indexOf(')'); + int parenStart = functionString.indexOf('('); + int parenEnd = functionString.indexOf(')'); - String returnType = functionPointerString.substring(0, parenStart).trim(); + String returnType = functionString.substring(0, parenStart).trim(); - int paramStart = functionPointerString.indexOf('(', parenEnd + 1); - int paramEnd = functionPointerString.lastIndexOf(')'); - String parameterStr = functionPointerString.substring(paramStart + 1, paramEnd); - List parameters = parseParameters(parameterStr); - - DemangledFunctionPointer dfp = new DemangledFunctionPointer(); - dfp.setReturnType(parseDataType(returnType)); - for (DemangledDataType parameter : parameters) { - dfp.addParameter(parameter); - } - - return dfp; + int paramStart = functionString.indexOf('(', parenEnd + 1); + int paramEnd = functionString.lastIndexOf(')'); + String parameters = functionString.substring(paramStart + 1, paramEnd); + return createFunctionPointer(parameters, returnType); } - private DemangledDataType parseFunction(String functionString, int offset) { + private DemangledFunctionPointer parseFunction(String functionString, int offset) { //unsigned long (long const &) int parenStart = functionString.indexOf('(', offset); @@ -1292,16 +965,22 @@ public class GnuDemanglerParser { int paramStart = parenStart; int paramEnd = parenEnd; - String parameterStr = functionString.substring(paramStart + 1, paramEnd); - List parameters = parseParameters(parameterStr); + String parameters = functionString.substring(paramStart + 1, paramEnd); + DemangledFunctionPointer dfp = createFunctionPointer(parameters, returnType); + dfp.setDisplayFunctionPointerParens(false); + return dfp; + } + + private DemangledFunctionPointer createFunctionPointer(String paramerterString, + String returnType) { + + List parameters = parseParameters(paramerterString); DemangledFunctionPointer dfp = new DemangledFunctionPointer(); dfp.setReturnType(parseDataType(returnType)); for (DemangledDataType parameter : parameters) { dfp.addParameter(parameter); } - - dfp.setDisplayFunctionPointerParens(false); return dfp; } @@ -1315,19 +994,45 @@ public class GnuDemanglerParser { */ String nameString = fixupInternalSeparators(demangled).trim(); - boolean inNamespace = nameString.contains(NAMESPACE_DELIMITER); - if (!inNamespace) { - int nameSeparator = nameString.lastIndexOf(' '); - if (nameSeparator != -1) { - nameString = nameString.substring(0, nameSeparator); - } - } - DemangledVariable variable = new DemangledVariable((String) null); setNameAndNamespace(variable, nameString); return variable; } + /** + * Converts the list of names into a namespace demangled type. + * Given names = { "A", "B", "C" }, which represents "A::B::C". + * The following will be created {@literal "Namespace{A}->Namespace{B}->Namespace{C}"} + * and Namespace{C} will be returned. + * + *

This method will also escape spaces and namespace separators inside of templates + * (see {@link #fixupInternalSeparators(String)}). + * + * @param names the names to convert + * @return the newly created type + */ + private DemangledType convertToNamespaces(List names) { + if (names.size() == 0) { + return null; + } + int index = names.size() - 1; + String rawName = names.get(index); + String escapedName = fixupInternalSeparators(rawName); + DemangledType myNamespace = new DemangledType(escapedName); + myNamespace.setOriginalDemangled(rawName); + + DemangledType namespace = myNamespace; + while (--index >= 0) { + rawName = names.get(index); + escapedName = fixupInternalSeparators(rawName); + DemangledType parentNamespace = new DemangledType(escapedName); + myNamespace.setOriginalDemangled(rawName); + namespace.setNamespace(parentNamespace); + namespace = parentNamespace; + } + return myNamespace; + } + //================================================================================================== // Inner Classes //================================================================================================== @@ -1337,11 +1042,77 @@ public class GnuDemanglerParser { protected String demangled; protected String prefix; protected String name; - protected String parent; + protected String type; - abstract String getParent(); + abstract String getType(); abstract DemangledObject build(Demangled namespace); + + @Override + public String toString() { + ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE); + return builder + .append("name", name) + .append("prefix", prefix) + .append("type", type) + .append("demangled", demangled) + .toString(); + } + } + + private class ItemInNamespaceHandler extends SpecialPrefixHandler { + + ItemInNamespaceHandler(String demangled) { + this.demangled = demangled; + this.type = demangled; + } + + ItemInNamespaceHandler(String demangled, String prefix, String item) { + this.demangled = demangled; + this.prefix = prefix; + this.type = item; + } + + @Override + String getType() { + return type; + } + + @Override + DemangledObject build(Demangled namespace) { + DemangledObject demangledObject = parseItemInNamespace(type); + return demangledObject; + } + } + + private class ThunkHandler extends SpecialPrefixHandler { + + ThunkHandler(String demangled, String prefix, String item) { + this.demangled = demangled; + this.prefix = prefix; + this.type = item; + } + + @Override + String getType() { + return type; + } + + @Override + DemangledObject build(Demangled demangledObject) { + + DemangledFunction function = (DemangledFunction) demangledObject; + function.setSignature(type); + function.setCallingConvention(CompilerSpec.CALLING_CONVENTION_thiscall); + + DemangledThunk thunk = new DemangledThunk(function); + if (prefix.contains(COVARIANT_RETURN_THUNK)) { + thunk.setCovariantReturnThunk(); + } + + thunk.setSignaturePrefix(prefix); + return thunk; + } } private class TypeInfoNameHandler extends SpecialPrefixHandler { @@ -1352,32 +1123,42 @@ public class GnuDemanglerParser { } @Override - String getParent() { + String getType() { String classname = demangled.substring(prefix.length()).trim(); - parent = classname; - return parent; + type = classname; + return type; } @Override DemangledObject build(Demangled namespace) { DemangledString demangledString = - new DemangledString("typeinfo-name", parent, -1/*unknown length*/, false); - demangledString.setSpecialPrefix("typeinfo name"); - demangledString.setUtilDemangled(demangled); - setNamespace(demangledString, parent); + new DemangledString("typeinfo-name", type, -1/*unknown length*/, false); + demangledString.setSpecialPrefix("typeinfo name for "); + String namespaceString = fixupInternalSeparators(type); + setNamespace(demangledString, namespaceString); return demangledString; } } private class AddressTableHandler extends SpecialPrefixHandler { - AddressTableHandler(String demangled, String prefix) { + AddressTableHandler(String demangled, String prefix, String type) { this.demangled = demangled; this.prefix = prefix; + this.type = type; + + Matcher matcher = ENDS_WITH_DIGITS_PATTERN.matcher(demangled); + if (matcher.matches()) { + // ends with a number, strip it off + int oldLength = demangled.length(); + this.demangled = matcher.group(1); + int delta = oldLength - this.demangled.length(); + this.type = type.substring(0, type.length() - delta); + } } @Override - String getParent() { + String getType() { /* Samples: @@ -1393,36 +1174,19 @@ public class GnuDemanglerParser { prefix: covariant return thunk name: covariant-return */ - - // TODO can we replace the below with something simpler? int pos = prefix.trim().lastIndexOf(' '); name = prefix.substring(0, pos).replace(' ', '-'); - parent = demangled.substring(prefix.length()).trim(); - return parent; + return type; } @Override - DemangledObject build(Demangled demangledParent) { - Demangled namespace = demangledParent; + DemangledObject build(Demangled namespace) { DemangledAddressTable addressTable = new DemangledAddressTable(name, true); addressTable.setNamespace(namespace); return addressTable; } } - private class ConstructionVTableHandler extends AddressTableHandler { - - ConstructionVTableHandler(String demangled, String prefix) { - super(demangled, prefix); - - Matcher matcher = ENDS_WITH_DIGITS_PATTERN.matcher(demangled); - if (matcher.matches()) { - // ends with a number, strip it off - this.demangled = matcher.group(1); - } - } - } - private abstract class OperatorHandler { protected Matcher matcher; @@ -1457,162 +1221,30 @@ public class GnuDemanglerParser { // prefix: return_type operator operator_chars[templates] // (everything before the parameters) String operatorPrefix = matcher.group(1); - String operatorChars = matcher.group(2); + //String operatorChars = matcher.group(2); String parametersText = matcher.group(3); - String trailing = matcher.group(4); - - int index = operatorPrefix.indexOf("operator"); - - /* - TODO - TODO this is similar to the main algo that replaces template spaces before - scanning for the name space; use that - TODO - - */ + //String trailing = matcher.group(4); String returnTypeText = "undefined"; String operatorName = operatorPrefix; - GroupScanner scanner = new GroupScanner(operatorPrefix, index); - scanner.setIgnoreTemplates(true); // TODO turn on by default? - int splitSpace = scanner.previous(' '); - if (splitSpace != -1) { - returnTypeText = operatorPrefix.substring(0, splitSpace); - operatorName = operatorPrefix.substring(splitSpace + 1); - } - - DemangledDataType returnType = new DemangledDataType((String) null); + operatorPrefix = fixupInternalSeparators(operatorPrefix); returnTypeText = fixupInternalSeparators(returnTypeText); - // TODO be better at detecting attributes; find examples - if (returnTypeText.endsWith("&")) { - returnTypeText = returnTypeText.substring(0, returnTypeText.length() - 1); - returnType.setReference(); - } - setNameAndNamespace(returnType, returnTypeText); + DemangledDataType returnType = createTypeInNamespace(returnTypeText); - DemangledMethod method = new DemangledMethod((String) null); - method.setOverloadedOperator(true); - method.setReturnType(returnType); + DemangledFunction function = new DemangledFunction((String) null); + function.setOverloadedOperator(true); + function.setReturnType(returnType); operatorName = fixupInternalSeparators(operatorName); - setNameAndNamespace(method, operatorName); + setNameAndNamespace(function, operatorName); List parameters = parseParameters(parametersText); for (DemangledDataType parameter : parameters) { - method.addParameter(parameter); + function.addParameter(parameter); } - // TODO do we need to specify a custom signature? - // method.setSignature(operatorText + " " + operatorName); - - return method; - } - } - - private class GroupScanner { - - private String text; - private boolean ignoreParens; - private boolean ignoreTemplates; - - private int length; - private int index; - private int ignoreCount = 0; // templates and parameters - - GroupScanner(String text) { - this.text = text; - this.length = text.length(); - } - - GroupScanner(String text, int index) { - this.text = text; - this.length = text.length(); - this.index = index; - } - - void setIgnoreTemplates(boolean b) { - this.ignoreTemplates = b; - } - - void setIgnoreParens(boolean b) { - this.ignoreParens = b; - } - - char peek() { - return text.charAt(index); - } - - int next(char toFind) { - for (; index < length; index++) { - char c = text.charAt(index); - - if (ignoreTemplates && c == '<') { - ignoreCount++; - continue; - } - - if (ignoreParens && c == '(') { - ignoreCount++; - continue; - } - - if (ignoreTemplates && c == '>') { - ignoreCount--; - continue; - } - - if (ignoreParens && c == ')') { - ignoreCount--; - continue; - } - - if (ignoreCount != 0) { - continue; - } - - if (c == toFind) { - return index++; - } - } - - return -1; - } - - int previous(char toFind) { - for (; index >= 0; index--) { - char c = text.charAt(index); - - if (ignoreTemplates && c == '>') { - ignoreCount++; - continue; - } - - if (ignoreParens && c == ')') { - ignoreCount++; - continue; - } - - if (ignoreTemplates && c == '<') { - ignoreCount--; - continue; - } - - if (ignoreParens && c == '(') { - ignoreCount--; - continue; - } - - if (ignoreCount != 0) { - continue; - } - - if (c == toFind) { - return index--; - } - } - - return -1; + return function; } } @@ -1626,7 +1258,52 @@ public class GnuDemanglerParser { @Override DemangledObject build() { - return parseConversionOperator(matcher); + + // this will yield: + // fullName: NS1::Foo::operator + // fullReturnType: std::string + String fullName = matcher.group(1);// group 0 is the entire match string + String fullReturnType = matcher.group(2); + + boolean isConst = false; + int index = fullReturnType.indexOf(CONST_KEYWORD); + if (index != -1) { + fullReturnType = fullReturnType.replace(CONST_KEYWORD, ""); + isConst = true; + } + + DemangledFunction method = new DemangledFunction((String) null); + DemangledDataType returnType = parseDataType(fullReturnType); + if (isConst) { + returnType.setConst(); + } + method.setReturnType(returnType); + + // 'conversion operator' syntax is 'operator ()' + // assume fullName endsWith '::operator' + int operatorIndex = fullName.lastIndexOf("::operator"); + String namespace = fullName.substring(0, operatorIndex); + + String templatelessNamespace = stripOffTemplates(namespace); + setNamespace(method, templatelessNamespace); + + // shortReturnType: string + String templatelessReturnType = stripOffTemplates(fullReturnType); + SymbolPath path = new SymbolPath(templatelessReturnType); + String shortReturnTypeName = path.getName(); + + // + // The preferred name: 'operator basic_string()' + // + // Ghidra does not allow spaces in the name or extra parens. So, make a name that is + // as clear as possible in describing the construct. + // + method.setName("operator.cast.to." + shortReturnTypeName); + + method.setSignature(fullName + " " + fullReturnType); + method.setOverloadedOperator(true); + + return method; } } @@ -1640,29 +1317,69 @@ public class GnuDemanglerParser { @Override DemangledObject build() { - return parseNewOrDeleteOperator(matcher); + + String operatorText = matcher.group(1);// group 0 is the entire match string + String operatorName = matcher.group(2); + String arrayBrackets = matcher.group(3); + String parametersText = matcher.group(4); + + DemangledFunction function = new DemangledFunction((String) null); + function.setOverloadedOperator(true); + DemangledDataType returnType = new DemangledDataType("void"); + if (operatorName.startsWith("new")) { + returnType.incrementPointerLevels(); + } + + function.setReturnType(returnType); + + // 'new operator' syntax is 'operator ()', where the + // operator itself could be in a class namespace + setNameAndNamespace(function, operatorText); + + List parameters = parseParameters(parametersText); + for (DemangledDataType parameter : parameters) { + function.addParameter(parameter); + } + + // + // The preferred name: 'operator new()' + // + // Ghidra does not allow spaces in the name or extra parens. So, make a name that is + // as clear as possible in describing the construct. + // + String name = operatorName; + if (arrayBrackets != null) { + name += "[]"; + } + function.setName("operator." + name); + + function.setSignature(operatorText + " " + operatorName); + + return function; } } private class ParameterLocator { int paramStart = -1; int paramEnd = -1; + private String text; ParameterLocator(String text) { + this.text = text; paramEnd = text.lastIndexOf(')'); if (paramEnd < 0) { return; } - if (isContainedWithinNamespace(text)) { + if (isContainedWithinNamespace()) { // ignore param list associated with namespace specification paramEnd = -1; return; } paramStart = findParameterStart(text, paramEnd); - int templateEnd = findInitialTemplateEndPosition(text); + int templateEnd = findTemplateEnd(text, 0); int templateStart = -1; if (templateEnd != -1) { - templateStart = findInitialTemplateStartPosition(text, templateEnd); + templateStart = findMatchingTemplateStart(text, templateEnd); } if (paramStart > templateStart && paramStart < templateEnd) { // ignore parentheses inside of templates (they are cast operators) @@ -1671,7 +1388,17 @@ public class GnuDemanglerParser { } } - private boolean isContainedWithinNamespace(String text) { + @Override + public String toString() { + ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE); + return builder + .append("texf", text) + .append("paramStart", paramStart) + .append("paramEnd", paramEnd) + .toString(); + } + + private boolean isContainedWithinNamespace() { return (paramEnd < (text.length() - 1)) && (':' == text.charAt(paramEnd + 1)); } @@ -1687,75 +1414,24 @@ public class GnuDemanglerParser { return paramStart != -1 && paramEnd != -1; } + // walks backwards to find the start of the parameter list private int findParameterStart(String demangled, int end) { - int templateLevel = 0; - int functionPointerLevel = 0; + + int depth = 0; for (int i = end - 1; i >= 0; --i) { char ch = demangled.charAt(i); - if (ch == '(' && templateLevel == 0 && functionPointerLevel == 0) { + if (ch == '(' && depth == 0) { return i; } - else if (ch == '>') { - ++templateLevel; + else if (ch == '>' || ch == ')') { + ++depth; } - else if (ch == '<') { - --templateLevel; - } - else if (ch == ')') { - ++functionPointerLevel; - } - else if (ch == '(') { - --functionPointerLevel; + else if (ch == '<' || ch == '(') { + depth--; } } return -1; } - - private int findInitialTemplateEndPosition(String string) { - - boolean seenTemplate = false; - int templateLevel = 0; - char[] chars = string.toCharArray(); - for (int i = 0; i < chars.length; i++) { - switch (chars[i]) { - case '<': - templateLevel++; - seenTemplate = true; - break; - case '>': - templateLevel--; - break; - } - - if (seenTemplate && templateLevel == 0) { - return i; - } - } - - return -1; - } - - private int findInitialTemplateStartPosition(String string, int templateEnd) { - // note: we are moving backwards! - int templateLevel = 1; - char[] chars = string.toCharArray(); - for (int i = templateEnd - 1; i >= 0; i--) { - switch (chars[i]) { - case '<': - templateLevel--; - break; - case '>': - templateLevel++; - break; - } - - if (templateLevel == 0) { - return i;// found our opening tag - } - } - - return -1; - } } private class LambdaName { @@ -1770,21 +1446,18 @@ public class GnuDemanglerParser { this.trailing = trailing; } - String getNameWithId() { - return LAMBDA + trailing; - } - String getFullText() { return fullText; } - String getParams() { - return params; + @Override + public String toString() { + ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE); + return builder + .append("fullText", fullText) + .append("params", params) + .append("trailing", trailing) + .toString(); } - - String getTrailing() { - return trailing; - } - } } diff --git a/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java b/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java index 92ef9de8ce..05f471333a 100644 --- a/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java +++ b/Ghidra/Features/GnuDemangler/src/test/java/ghidra/app/util/demangler/GnuDemanglerParserTest.java @@ -17,7 +17,6 @@ package ghidra.app.util.demangler; import static org.junit.Assert.*; -import java.io.IOException; import java.util.List; import org.junit.Before; @@ -35,46 +34,12 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { public void setUp() throws Exception { process = GnuDemanglerNativeProcess .getDemanglerNativeProcess(GnuDemanglerOptions.GNU_DEMANGLER_V2_33_1); - parser = new GnuDemanglerParser(process); - } - - @Test - public void test() throws Exception { - long start = System.currentTimeMillis(); - - demangle("_ZTVN6Magick21DrawableTextAntialiasE"); - demangle("_ZGVZN10KDirLister11emitChangesEvE3dot");//guard variables - - demangle("_ZZ18__gthread_active_pvE20__gthread_active_ptr"); - - demangle("_ZNSt10_List_baseIN6Magick5VPathESaIS1_EE5clearEv"); - demangle("_ZTISt14unary_functionIPN9MagickLib12_DrawContextEvE"); - demangle("_ZTSSt14unary_functionIPN9MagickLib12_DrawContextEvE"); - demangle("_ZTCN4Arts17StdoutWriter_implE68_NS_11Object_skelE"); - demangle("_ZN6Magick5ImageD1Ev"); - demangle( - "_ZN6Magick19matteFloodfillImageC2ERKNS_5ColorEjiiN9MagickLib11PaintMethodE"); - demangle("_ZThn8_N14nsPrintSession6AddRefEv");// non-virtual thunk - demangle( - "_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcE14pool_allocatorIcEED0Ev");// virtual thunk - demangle("_ZTch0_h16_NK8KHotKeys13WindowTrigger4copyEPNS_10ActionDataE");// covariant return thunk - - demangle("_ZNK2cc14ScrollSnapTypeneERKS0_"); - - List list = loadTextResource(GnuDemanglerParserTest.class, "libMagick.symbols.txt"); - for (String mangled : list) { - if (mangled == null) { - break; - } - demangle(mangled); - } - - System.out.println("Elapsed Time: " + (System.currentTimeMillis() - start)); + parser = new GnuDemanglerParser(); } @Test public void testOverloadedShiftOperatorParsingBug() { - parser = new GnuDemanglerParser(null); + parser = new GnuDemanglerParser(); DemangledObject object = parser.parse(null, "std::basic_istream >& " + "std::operator>> >" + @@ -84,75 +49,44 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { } @Test - public void testParsing() throws Exception { + public void testParse_CastInTemplates() throws Exception { - DemangledObject parse = parser.parse(null, "__gthread_active_p()::__gthread_active_ptr"); - assertTrue(parse instanceof DemangledVariable); - assertName(parse, "__gthread_active_ptr", "__gthread_active_p()"); + String demangled = + "std::__default_alloc_template<(bool)1, (int)0>::allocate(unsigned)"; + DemangledObject object = parser.parse("fake", demangled); + assertType(object, DemangledFunction.class); + assertName(object, "allocate", "std", "__default_alloc_template<(bool)1,(int)0>"); - parse = parser.parse(null, "typeinfo name for Magick::Blob"); - assertTrue(parse instanceof DemangledString); - assertEquals("Magick::Blob", ((DemangledString) parse).getString()); - assertName(parse, "typeinfo-name", "Magick", "Blob"); + assertEquals( + "undefined std::__default_alloc_template<(bool)1,(int)0>::allocate(unsigned)", + object.getSignature(false)); + } - parse = parser.parse(null, "Bob::operator_new[](float, double, Bob::Fred &)"); - assertTrue(parse instanceof DemangledMethod); - assertName(parse, "operator_new[]", "Bob"); + @Test + public void testParse_CastInTemplates_WithNegativeNumber() throws Exception { - parse = parser.parse(null, - "Magick::pageImage::operator()(Magick::pageImage::Image::abc&) const"); - assertTrue(parse instanceof DemangledMethod); - assertName(parse, "operator()", "Magick", "pageImage"); + String demangled = + "A::B::C::Foo::Foo(A::B::Bar*, A::B::C::Foo*)"; + DemangledObject object = parser.parse("fake", demangled); + assertType(object, DemangledFunction.class); + assertName(object, "Foo", "A", "B", "C", "Foo"); - parse = parser.parse(null, - "std::__default_alloc_template<(bool)1, (int)0>::allocate(unsigned)"); - assertTrue(parse instanceof DemangledMethod); - assertName(parse, "allocate", "std", "__default_alloc_template<(bool)1,(int)0>"); + assertEquals( + "undefined A::B::C::Foo::Foo(A::B::Bar *,A::B::C::Foo *)", + object.getSignature(false)); + } - parse = parser.parse(null, - "XpsMap::XpsMap(unsigned long (*)(long const &), unsigned long, unsigned long, float)"); - assertTrue(parse instanceof DemangledMethod); - assertName(parse, "XpsMap", "XpsMap"); + @Test + public void testParse_MultiDimensionalArray() throws Exception { - parse = parser.parse(null, "Bar::Foo::getX(float)"); - assertTrue(parse instanceof DemangledMethod); - assertName(parse, "getX", "Bar", "Foo"); - - parse = parser.parse(null, "toChar(int)"); - assertTrue(parse instanceof DemangledMethod); - assertName(parse, "toChar"); - - parse = parser.parse(null, "toFloat(int, double, char, long, short)"); - assertTrue(parse instanceof DemangledMethod); - assertName(parse, "toFloat"); - - parse = parser.parse(null, "toFloat(int**, double**, char**, long**, short**)"); - assertTrue(parse instanceof DemangledMethod); - assertName(parse, "toFloat"); - - parse = parser.parse(null, "Foo::operator<<(int)"); - assertTrue(parse instanceof DemangledMethod); - assertName(parse, "operator<<", "Foo"); - - parse = parser.parse(null, "Foo::getX(Bob::Fred,double, Martha)"); - assertTrue(parse instanceof DemangledMethod); - - parse = parser.parse("_ZThn8_N14nsPrintSession14QueryInterfaceERK4nsIDPPv", - "non-virtual thunk [nv:-8] to nsPrintSession::QueryInterface(nsID const&, void**)"); - assertTrue(parse instanceof DemangledThunk); - assertName(parse, "QueryInterface", "nsPrintSession"); - - parse = parser.parse( - "_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcE14pool_allocatorIcEED1Ev", - "virtual thunk [v:0,-24] to std::basic_ostringstream, pool_allocator >::~basic_ostringstream [in-charge]()"); - assertTrue(parse instanceof DemangledThunk); - assertName(parse, "~basic_ostringstream", "std", - "basic_ostringstream,pool_allocator>"); - - parse = parser.parse("_ZTch0_h16_NK8KHotKeys13WindowTrigger4copyEPNS_10ActionDataE", - "covariant return thunk [nv:0] [nv:16] to KHotKeys::WindowTrigger::copy(KHotKeys::ActionData*) const"); - assertTrue(parse instanceof DemangledThunk); - assertName(parse, "copy", "KHotKeys", "WindowTrigger"); + DemangledObject object = parser.parse("fake", + "Layout::graphNew(short[][][][], char*)"); + assertType(object, DemangledFunction.class); + DemangledFunction function = (DemangledFunction) object; + List parameters = function.getParameters(); + assertEquals(2, parameters.size()); + DemangledDataType p1 = parameters.get(0); + assertEquals(4, p1.getArrayDimensions()); } @Test @@ -162,7 +96,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertEquals("undefined glob_fn9(" + "char,int,long,long long,unsigned int,unsigned long,float,double,long double,bool,void *,void * *)", @@ -179,7 +113,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledMethod); + assertType(object, DemangledFunction.class); assertName(object, "XpsMap", "XpsMap"); assertEquals( @@ -187,48 +121,60 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { "unsigned long ()(long const &),unsigned long,unsigned long,float)", object.getSignature(false)); - DemangledMethod method = (DemangledMethod) object; + DemangledFunction method = (DemangledFunction) object; List parameters = method.getParameters(); assertEquals(4, parameters.size()); - assertEquals("unsigned long ()(long const &)", parameters.get(0).toSignature()); - assertEquals("unsigned long", parameters.get(1).toSignature()); - assertEquals("unsigned long", parameters.get(2).toSignature()); - assertEquals("float", parameters.get(3).toSignature()); + assertEquals("unsigned long ()(long const &)", parameters.get(0).getSignature()); + assertEquals("unsigned long", parameters.get(1).getSignature()); + assertEquals("unsigned long", parameters.get(2).getSignature()); + assertEquals("float", parameters.get(3).getSignature()); } @Test - public void testTemplates() throws Exception { + public void testTemplates_TemplatedType() throws Exception { String mangled = "_ZNKSt8_Rb_treeI8LocationS0_St9_IdentityIS0_ESt4lessIS0_ESaIS0_EE4findERKS0_"; - String demangled = process.demangle(mangled); + assertEquals( + "std" + + "::" + + "_Rb_tree, std::less, std::allocator >" + + "::" + + "find(Location const&) const", + demangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledMethod); + assertType(object, DemangledFunction.class); assertName(object, "find", "std", "_Rb_tree,std--less,std--allocator>"); - DemangledMethod method = (DemangledMethod) object; - List parameters = method.getParameters(); + DemangledFunction function = (DemangledFunction) object; + List parameters = function.getParameters(); assertEquals(1, parameters.size()); - assertEquals("Location const &", parameters.get(0).toSignature()); + assertEquals("Location const &", parameters.get(0).getSignature()); + } - mangled = + @Test + public void testTemplates_TemplatedInsertionSort() throws Exception { + + String mangled = "_ZSt16__insertion_sortIN9__gnu_cxx17__normal_iteratorIPSt4pairImP7PcodeOpESt6vectorIS5_SaIS5_EEEEPFbRKS5_SC_EEvT_SF_T0_"; - demangled = process.demangle(mangled); - object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledMethod); + String demangled = process.demangle(mangled); + assertEquals( + "void std::__insertion_sort<__gnu_cxx::__normal_iterator*, std::vector, std::allocator > > >, bool (*)(std::pair const&, std::pair const&)>(__gnu_cxx::__normal_iterator*, std::vector, std::allocator > > >, __gnu_cxx::__normal_iterator*, std::vector, std::allocator > > >, bool (*)(std::pair const&, std::pair const&))", + demangled); + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledFunction.class); - method = (DemangledMethod) object; - parameters = method.getParameters(); + DemangledFunction function = (DemangledFunction) object; + List parameters = function.getParameters(); assertEquals( "__insertion_sort<__gnu_cxx--__normal_iterator*,std--vector,std--allocator>>>,bool(*)(std--pairconst&,std--pairconst&)>", - method.getName()); - assertEquals("std", method.getNamespace().getName()); + function.getName()); + assertEquals("std", function.getNamespace().getName()); - // TODO: in the original, it was "bool (*)...." now is "bool ()" it still comes out as a function pointer assertEquals( "__gnu_cxx::__normal_iterator *,std::vector,std::allocator>>>", parameters.get(0).toString()); @@ -239,7 +185,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { "bool ()(std::pair const &,std::pair const &)", parameters.get(2).toString()); - assertTrue(parameters.get(2) instanceof DemangledFunctionPointer); + assertType(parameters.get(2), DemangledFunctionPointer.class); DemangledFunctionPointer fptr = (DemangledFunctionPointer) parameters.get(2); @@ -254,17 +200,17 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledMethod); + assertType(object, DemangledFunction.class); assertName(object, "insert", "std", "set,std--allocator>"); - DemangledMethod method = (DemangledMethod) object; + DemangledFunction method = (DemangledFunction) object; assertEquals( "undefined std::set,std--allocator>::insert(bbnode const * &)", method.getSignature(false)); List parameters = method.getParameters(); assertEquals(1, parameters.size()); - assertEquals("bbnode const * &", parameters.get(0).toSignature()); + assertEquals("bbnode const * &", parameters.get(0).getSignature()); } @Test @@ -274,33 +220,140 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledMethod); + assertType(object, DemangledFunction.class); assertName(object, "Fred", "Bar", "Fred"); - DemangledMethod method = (DemangledMethod) object; + DemangledFunction method = (DemangledFunction) object; assertEquals("undefined Bar::Fred::Fred(int)", method.getSignature(false)); List parameters = method.getParameters(); assertEquals(1, parameters.size()); - assertEquals("int", parameters.get(0).toSignature()); + assertEquals("int", parameters.get(0).getSignature()); } @Test - public void testMethods() throws Exception { + public void testDestructor() throws Exception { + + String mangled = "_ZN6Magick5ImageD1Ev"; + String demangled = process.demangle(mangled); + assertEquals("Magick::Image::~Image()", demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledFunction.class); + assertName(object, "~Image", "Magick", "Image"); + + assertEquals("undefined Magick::Image::~Image(void)", object.getSignature(false)); + } + + @Test + public void testThunk_Virtual() throws Exception { + + String mangled = + "_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcE14pool_allocatorIcEED0Ev"; + String demangled = process.demangle(mangled); + assertEquals( + "virtual thunk to std::basic_ostringstream, pool_allocator >::~basic_ostringstream()", + demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledThunk.class); + assertName(object, "~basic_ostringstream", "std", + "basic_ostringstream,pool_allocator>"); + + assertEquals( + "virtual thunk to undefined __thiscall std::basic_ostringstream,pool_allocator>::~basic_ostringstream(void)", + object.getSignature(false)); + } + + @Test + public void testThunk_NonVirtual() throws Exception { + + String mangled = + "_ZThn8_N14nsPrintSession6AddRefEv"; + String demangled = process.demangle(mangled); + assertEquals("non-virtual thunk to nsPrintSession::AddRef()", demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledThunk.class); + assertName(object, "AddRef", "nsPrintSession"); + + assertEquals("non-virtual thunk to undefined __thiscall nsPrintSession::AddRef(void)", + object.getSignature(false)); + } + + @Test + public void testParse_Thunk_NonVirtual_WithExtraInfo() throws Exception { + + String mangled = + "_ZThn8_N14nsPrintSession14QueryInterfaceERK4nsIDPPv"; + + // this is an older format + String demangled = + "non-virtual thunk [nv:-8] to nsPrintSession::QueryInterface(nsID const&, void**)"; + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledThunk.class); + assertName(object, "QueryInterface", "nsPrintSession"); + + // for now we preserve the extra stuff between 'thunk' and 'to' in the signature + assertEquals( + "non-virtual thunk [nv:-8] to undefined __thiscall nsPrintSession::QueryInterface(nsID const &,void * *)", + object.getSignature(false)); + } + + @Test + public void testThunk_CovariantReturn() throws Exception { + + String mangled = + "_ZTch0_h16_NK8KHotKeys13WindowTrigger4copyEPNS_10ActionDataE"; + String demangled = process.demangle(mangled); + assertEquals( + "covariant return thunk to KHotKeys::WindowTrigger::copy(KHotKeys::ActionData*) const", + demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledThunk.class); + assertName(object, "copy", "KHotKeys", "WindowTrigger"); + + assertEquals( + "covariant return thunk to undefined __thiscall KHotKeys::WindowTrigger::copy(KHotKeys::ActionData *)", + object.getSignature(false)); + } + + @Test + public void testParse_Thunk_testThunk_CovariantReturn_WithExtraInfo() throws Exception { + + String mangled = + "_ZTch0_h16_NK8KHotKeys13WindowTrigger4copyEPNS_10ActionDataE"; + + // this is an older format + String demangled = + "covariant return thunk [nv:0] [nv:16] to KHotKeys::WindowTrigger::copy(KHotKeys::ActionData*) const"; + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledThunk.class); + assertName(object, "copy", "KHotKeys", "WindowTrigger"); + + // for now we preserve the extra stuff between 'thunk' and 'to' in the signature + assertEquals( + "covariant return thunk [nv:0] [nv:16] to undefined __thiscall KHotKeys::WindowTrigger::copy(KHotKeys::ActionData *)", + object.getSignature(false)); + } + + @Test + public void testMethod() throws Exception { String mangled = "_ZN3Foo7getBoolEf"; String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledMethod); + assertType(object, DemangledFunction.class); assertName(object, "getBool", "Foo"); - DemangledMethod method = (DemangledMethod) object; - assertEquals("undefined Foo::getBool(float)", method.getSignature(false)); + DemangledFunction function = (DemangledFunction) object; + assertEquals("undefined Foo::getBool(float)", function.getSignature(false)); - List parameters = method.getParameters(); + List parameters = function.getParameters(); assertEquals(1, parameters.size()); - assertEquals("float", parameters.get(0).toSignature()); + assertEquals("float", parameters.get(0).getSignature()); } @Test @@ -310,7 +363,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "toFloat"); assertEquals("undefined toFloat(int,double,char,long,short)", object.getSignature(false)); @@ -319,11 +372,11 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { List parameters = function.getParameters(); assertEquals(5, parameters.size()); - assertEquals("int", parameters.get(0).toSignature()); - assertEquals("double", parameters.get(1).toSignature()); - assertEquals("char", parameters.get(2).toSignature()); - assertEquals("long", parameters.get(3).toSignature()); - assertEquals("short", parameters.get(4).toSignature()); + assertEquals("int", parameters.get(0).getSignature()); + assertEquals("double", parameters.get(1).getSignature()); + assertEquals("char", parameters.get(2).getSignature()); + assertEquals("long", parameters.get(3).getSignature()); + assertEquals("short", parameters.get(4).getSignature()); } @Test @@ -333,7 +386,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledVariable); + assertType(object, DemangledVariable.class); assertName(object, "magickCleanUpGuard", "Magick"); assertEquals("Magick::magickCleanUpGuard", object.getSignature(false)); @@ -350,11 +403,27 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledAddressTable); + assertType(object, DemangledAddressTable.class); assertName(object, "vtable", "Magick", "DrawableTextAntialias"); assertEquals("Magick::DrawableTextAntialias::vtable", object.getSignature(false)); + } + @Test + public void testReferenceTemporaryFor() throws Exception { + + String mangled = "_ZGRZNK17KSimpleFileFilter12passesFilterEPK9KFileItemE6dotdot"; + String demangled = process.demangle(mangled); + assertEquals( + "reference temporary #0 for KSimpleFileFilter::passesFilter(KFileItem const*) const::dotdot", + demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledVariable.class); + assertName(object, "dotdot", "KSimpleFileFilter", "passesFilter(KFileItem const *)"); + + assertEquals("KSimpleFileFilter::passesFilter(KFileItem const *)::dotdot", + object.getSignature(false)); } @Test @@ -364,28 +433,94 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledAddressTable); + assertType(object, DemangledAddressTable.class); assertName(object, "typeinfo", "Arts", "FileInputStream_impl_Factory"); assertEquals("Arts::FileInputStream_impl_Factory::typeinfo", object.getSignature(false)); } @Test - public void testGuardVariables() throws Exception { + public void testTypeInfo_For() throws Exception { + String mangled = "_ZTISt14unary_functionIPN9MagickLib12_DrawContextEvE"; + String demangled = process.demangle(mangled); + assertEquals("typeinfo for std::unary_function", demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledAddressTable.class); + assertName(object, "typeinfo", "std", "unary_function"); + + assertEquals("std::unary_function::typeinfo", + object.getSignature(false)); + } + + @Test + public void testTypeInfo_NameFor() throws Exception { + String mangled = "_ZTSSt14unary_functionIPN9MagickLib12_DrawContextEvE"; + String demangled = process.demangle(mangled); + assertEquals("typeinfo name for std::unary_function", + demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledString.class); + assertName(object, "typeinfo-name", "std", "unary_function"); + + assertEquals("typeinfo name for std::unary_function", + object.getSignature(false)); + } + + @Test + public void testVtable_ConstructionVtableFor() throws Exception { + + String mangled = "_ZTCN4Arts17StdoutWriter_implE68_NS_11Object_skelE"; + String demangled = process.demangle(mangled); + assertEquals("construction vtable for Arts::Object_skel-in-Arts::StdoutWriter_impl", + demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledAddressTable.class); + assertName(object, "construction-vtable", "Arts", "Object_skel-in-Arts", + "StdoutWriter_impl"); + + assertEquals("Arts::Object_skel-in-Arts::StdoutWriter_impl::construction-vtable", + object.getSignature(false)); + } + + @Test + public void testGuardVariable_WithGuardVariableText() throws Exception { + + String mangled = "_ZGVZN10KDirLister11emitChangesEvE3dot"; + String demangled = process.demangle(mangled); + assertEquals("guard variable for KDirLister::emitChanges()::dot", demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledVariable.class); + assertName(object, "dot", "KDirLister", "emitChanges()"); + + assertEquals("KDirLister::emitChanges()::dot", object.getSignature(false)); + + DemangledVariable variable = (DemangledVariable) object; + assertEquals("dot", variable.getName()); + assertEquals("emitChanges()", variable.getNamespace().getNamespaceName()); + assertEquals("KDirLister::emitChanges()", variable.getNamespace().getNamespaceString()); + assertNull(variable.getDataType()); // no type information provided + } + + @Test + public void testGuardVariable_ThreadPointer() throws Exception { String mangled = "_ZZ18__gthread_active_pvE20__gthread_active_ptr"; String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledVariable); + assertType(object, DemangledVariable.class); assertName(object, "__gthread_active_ptr", "__gthread_active_p()"); assertEquals("__gthread_active_p()::__gthread_active_ptr", object.getSignature(false)); DemangledVariable variable = (DemangledVariable) object; assertEquals("__gthread_active_ptr", variable.getName()); - assertEquals("__gthread_active_p()", variable.getNamespace().toNamespaceName()); + assertEquals("__gthread_active_p()", variable.getNamespace().getNamespaceName()); assertNull(variable.getDataType()); // no type information provided } @@ -403,7 +538,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "CalcPortExposedRect", "LScrollerView"); assertEquals("undefined LScrollerView::CalcPortExposedRect(Rect &,bool)", @@ -427,7 +562,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "__dt", "MsoDAL", "VertFrame"); assertEquals("undefined MsoDAL::VertFrame::__dt(void)", object.getSignature(false)); @@ -443,7 +578,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledVariable); + assertType(object, DemangledVariable.class); assertName(object, "dialog", "DDDSaveOptionsCB(_WidgetRec *,void *,void *)"); assertEquals("DDDSaveOptionsCB(_WidgetRec *,void *,void *)::dialog", @@ -467,7 +602,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "GetColWidths", "CDataRenderer"); assertEquals("undefined CDataRenderer::GetColWidths(short &[])", @@ -491,7 +626,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "GetColWidths", "CDataRenderer"); assertEquals("undefined CDataRenderer::GetColWidths(short *[])", @@ -509,7 +644,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "graphNew", "Layout"); // note: the two pointers were condensed to one (I think this is correct, but not sure) @@ -526,7 +661,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = "Layout::graphNew(short (*) [41], char*)"; DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "graphNew", "Layout"); assertEquals("undefined Layout::graphNew(short *[],char *)", object.getSignature(false)); @@ -549,21 +684,21 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledMethod); + assertType(object, DemangledFunction.class); assertName(object, "_gmStage2"); assertEquals("undefined _gmStage2(SECTION_INFO *,int *,int *[],int,short const *)", object.getSignature(false)); - DemangledMethod method = (DemangledMethod) object; + DemangledFunction method = (DemangledFunction) object; List parameters = method.getParameters(); assertEquals(5, parameters.size()); - assertEquals("SECTION_INFO *", parameters.get(0).toSignature()); - assertEquals("int *", parameters.get(1).toSignature()); - assertEquals("int *[]", parameters.get(2).toSignature()); - assertEquals("int", parameters.get(3).toSignature()); - assertEquals("short const *", parameters.get(4).toSignature()); + assertEquals("SECTION_INFO *", parameters.get(0).getSignature()); + assertEquals("int *", parameters.get(1).getSignature()); + assertEquals("int *[]", parameters.get(2).getSignature()); + assertEquals("int", parameters.get(3).getSignature()); + assertEquals("short const *", parameters.get(4).getSignature()); } @Test @@ -583,7 +718,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "__ct", "CStr", "Buffer"); assertEquals("undefined CStr::Buffer::__ct(CStr &,unsigned long)", @@ -610,7 +745,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledVariable); + assertType(object, DemangledVariable.class); assertName(object, "aaa<(bbb--ccc)120,ddd>"); assertEquals("aaa<(bbb--ccc)120,ddd>", object.getSignature(false)); @@ -625,7 +760,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { demangled = process.demangle(mangled); object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "setmember", "mysequence"); assertEquals("undefined mysequence::setmember(int,int)", object.getSignature(false)); @@ -640,7 +775,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { demangled = process.demangle(mangled); object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "Image", "Magick", "Image"); assertEquals( @@ -656,18 +791,40 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledMethod); + assertType(object, DemangledFunction.class); assertName(object, "operator<", "Magick"); - DemangledMethod method = (DemangledMethod) object; + DemangledFunction method = (DemangledFunction) object; assertEquals( "undefined Magick::operator<(Magick::Coordinate const &,Magick::Coordinate const &)", method.getSignature(false)); List parameters = method.getParameters(); assertEquals(2, parameters.size()); - assertEquals("Magick::Coordinate const &", parameters.get(0).toSignature()); - assertEquals("Magick::Coordinate const &", parameters.get(1).toSignature()); + assertEquals("Magick::Coordinate const &", parameters.get(0).getSignature()); + assertEquals("Magick::Coordinate const &", parameters.get(1).getSignature()); + } + + @Test + public void testOperator_Functor() throws Exception { + + String mangled = "_ZNK6Magick9pageImageclERNS_5ImageE"; + String demangled = process.demangle(mangled); + assertEquals("Magick::pageImage::operator()(Magick::Image&) const", + demangled); + + DemangledObject object = parser.parse(mangled, demangled); + assertType(object, DemangledFunction.class); + assertName(object, "operator()", "Magick", "pageImage"); + + DemangledFunction method = (DemangledFunction) object; + assertEquals( + "undefined Magick::pageImage::operator()(Magick::Image &)", + method.getSignature(false)); + + List parameters = method.getParameters(); + assertEquals(1, parameters.size()); + assertEquals("Magick::Image &", parameters.get(0).getSignature()); } @Test @@ -683,7 +840,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { DemangledObject object = parser.parse(mangled, demangled); assertNotNull(object); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); String signature = object.getSignature(false); assertEquals( @@ -712,7 +869,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "operator.cast.to.basic_string", "Magick", "Color"); assertEquals("std::basic_string,std::allocator> " + @@ -741,7 +898,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "operator.cast.to.GCC_ApplicationInvokeIndication&", "GCC_IndicationPDU"); @@ -764,7 +921,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "operator.delete"); assertEquals("void operator.delete(void *)", object.getSignature(false)); @@ -780,7 +937,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { // DemangledObject object = parser.parse("mangled", "operator delete[](void*)"); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "operator.delete[]"); assertEquals("void operator.delete[](void *)", object.getSignature(false)); @@ -800,7 +957,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "operator.new"); assertEquals("void * operator.new(unsigned long)", object.getSignature(false)); @@ -813,7 +970,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "operator()", "Magick", "viewImage"); assertEquals("undefined Magick::viewImage::operator()(Magick::Image &)", @@ -833,10 +990,10 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); - assertName(object, "decode_charset_iconv", "anonymous_namespace"); + assertType(object, DemangledFunction.class); + assertName(object, "decode_charset_iconv", "(anonymous_namespace)"); - assertEquals("undefined anonymous_namespace::decode_charset_iconv(char const *)", + assertEquals("undefined (anonymous_namespace)::decode_charset_iconv(char const *)", object.getSignature(false)); } @@ -852,10 +1009,10 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); - assertName(object, "mystrdup", "MeCab", "anonymous_namespace"); + assertType(object, DemangledFunction.class); + assertName(object, "mystrdup", "MeCab", "(anonymous_namespace)"); - assertEquals("undefined MeCab::anonymous_namespace::mystrdup(char const *)", + assertEquals("undefined MeCab::(anonymous_namespace)::mystrdup(char const *)", object.getSignature(false)); } @@ -872,13 +1029,14 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); + assertName(object, - "__uninitialized_copy_aux", + "__uninitialized_copy_aux", "std"); assertEquals( - "MeCab::anonymous_namespace::Range * std::__uninitialized_copy_aux(MeCab::anonymous_namespace::Range *,MeCab::anonymous_namespace::Range *,MeCab::anonymous_namespace::Range *,std::__false_type)", + "MeCab::(anonymous_namespace)::Range * std::__uninitialized_copy_aux(MeCab::(anonymous_namespace)::Range *,MeCab::(anonymous_namespace)::Range *,MeCab::(anonymous_namespace)::Range *,std::__false_type)", object.getSignature(false)); } @@ -887,7 +1045,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { // // Mangled: _ZN2Dr15ClipboardHelper17FTransferGvmlDataERN3Art11TransactionERKN3Ofc13TReferringPtrINS_10DrawingE2oEEEbNS4_7TCntPtrI11IDataObjectEERNS_18IClientDataCreatorERNS4_7TVectorINS4_8TWeakPtrINS_14DrawingElementEEELj0ELj4294967295EEERNS1_6Rect64E // - // Demangled: Ofc::TSimpleTypeHelper::ToString(Art::Percentage const&, Ofc::TFixedVarStr<(int)2085>&) + // Demangled: Dr::ClipboardHelper::FTransferGvmlData(Art::Transaction&, Ofc::TReferringPtr const&, bool, Ofc::TCntPtr, Dr::IClientDataCreator&, Ofc::TVector, 0u, 4294967295u>&, Art::Rect64&) // String mangled = "_ZN2Dr15ClipboardHelper17FTransferGvmlDataERN3Art11TransactionERKN3Ofc13TReferringPtrINS_10DrawingE2oEEEbNS4_7TCntPtrI11IDataObjectEERNS_18IClientDataCreatorERNS4_7TVectorINS4_8TWeakPtrINS_14DrawingElementEEELj0ELj4294967295EEERNS1_6Rect64E"; @@ -895,7 +1053,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "FTransferGvmlData", "Dr", "ClipboardHelper"); assertEquals( @@ -903,6 +1061,25 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { object.getSignature(false)); } + @Test + public void testTemplatedParametersWithCast_OldStyleDemangle() throws Exception { + // + // This demangled string has appeared at some point in the past. It no longer looks like + // this (note the odd syntax of '<(int)2085>&)') + // + // Ofc::TSimpleTypeHelper::ToString(Art::Percentage const&, Ofc::TFixedVarStr<(int)2085>&) + // + String demangled = + "Ofc::TSimpleTypeHelper::ToString(Art::Percentage const&, Ofc::TFixedVarStr<(int)2085>&)"; + DemangledObject object = parser.parse("nomangled", demangled); + assertType(object, DemangledFunction.class); + assertName(object, "ToString", "Ofc", "TSimpleTypeHelper"); + + assertEquals( + "undefined Ofc::TSimpleTypeHelper::ToString(Art::Percentage const &,Ofc::TFixedVarStr<(int)2085> &)", + object.getSignature(false)); + } + @Test public void testTemplatedNameSpaces() throws Exception { // @@ -916,7 +1093,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue("Parsed a function", object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "perform", "Core", "AsyncFile"); DemangledFunction df = (DemangledFunction) object; @@ -949,7 +1126,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "registerKeysChangedCallback", "LogLevelMonitor"); @@ -982,7 +1159,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "set_mutate_ares_options_callback", "DnsThread"); DemangledFunction df = (DemangledFunction) object; @@ -1016,7 +1193,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "_M_insert_aux", "std", "vector,std--allocator>>"); @@ -1038,7 +1215,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { String demangled = process.demangle(mangled); DemangledObject object = parser.parse(mangled, demangled); - assertTrue(object instanceof DemangledAddressTable); + assertType(object, DemangledAddressTable.class); assertName(object, "construction-vtable", "Crypto", "Mac-in-Crypto", "HmacSha"); assertEquals("Crypto::Mac-in-Crypto::HmacSha::construction-vtable", @@ -1059,7 +1236,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { DemangledObject object = parser.parse(mangled, demangled); assertNotNull(object); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); DemangledFunction function = (DemangledFunction) object; List parameters = function.getParameters(); @@ -1083,7 +1260,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { DemangledObject object = parser.parse(mangled, demangled); assertNotNull(object); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); String signature = object.getSignature(false); assertEquals( @@ -1129,7 +1306,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { DemangledObject object = parser.parse(mangled, demangled); assertNotNull(object); - assertTrue("Expected a Demangled Function: " + object, object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); String signature = object.getSignature(false); assertEquals( @@ -1142,7 +1319,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { } @Test - public void testOperatorTODO() throws Exception { + public void testOperator_NotEquals() throws Exception { // // Mangled: _ZNK2cc14ScrollSnapTypeneERKS0_ @@ -1155,7 +1332,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { DemangledObject object = parser.parse(mangled, demangled); assertNotNull(object); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); String signature = object.getSignature(false); assertEquals("undefined cc::ScrollSnapType::operator!=(cc::ScrollSnapType const &)", @@ -1181,7 +1358,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { "_ZZN12GrGLFunctionIFPKhjEEC1IZN13skia_bindings28CreateGLES2InterfaceBindingsEPN3gpu5gles214GLES2InterfaceEPNS6_14ContextSupportEE3$_0EET_ENUlPKvjE_8__invokeESF_j", "GrGLFunction::GrGLFunction(skia_bindings::CreateGLES2InterfaceBindings(gpu::gles2::GLES2Interface*, gpu::ContextSupport*)::$_0)::{lambda(void const*, unsigned int)#1}::__invoke(void const*, unsigned int)"); assertNotNull(object); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); assertName(object, "__invoke", "GrGLFunction", @@ -1216,32 +1393,30 @@ public class GnuDemanglerParserTest extends AbstractGenericTest { DemangledObject object = parser.parse(mangled, demangled); assertNotNull(object); - assertTrue(object instanceof DemangledFunction); + assertType(object, DemangledFunction.class); - // TODO - // TODO maybe put full output in setUtilDemangled() String signature = object.getSignature(false); assertEquals("undefined wrap_360_cd(int)", signature); } + private void assertType(Demangled o, Class c) { + assertTrue("Wrong demangled type. " + + "\nExpected " + c + "; " + + "\nfound " + o.getClass(), + c.isInstance(o)); + } + private void assertName(DemangledObject demangledObj, String name, String... namespaces) { assertEquals("Unexpected demangled name", name, demangledObj.getName()); Demangled namespace = demangledObj.getNamespace(); for (int i = namespaces.length - 1; i >= 0; i--) { - String n = namespaces[i]; + String expectedName = namespaces[i]; assertNotNull("Namespace mismatch", namespace); - assertEquals(n, namespace.toNamespaceName()); + String actualName = namespace.getNamespaceName(); + assertEquals(expectedName, actualName); namespace = namespace.getNamespace(); } assertNull("Namespace mismatch", namespace); } - - private void demangle(String mangled) throws IOException { - String demangled = process.demangle(mangled); - assertNotNull(demangled); - assertNotEquals(mangled, demangled); - assertNotNull(parser.parse(mangled, demangled)); - } - } 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 32874d1ece..7c212ebe01 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 @@ -145,7 +145,7 @@ public class GnuDemanglerTest extends AbstractGenericTest { Symbol s = symbolTable.getPrimarySymbol(addr("01001000")); assertNotNull(s); - assertEquals("typeinfo_name", s.getName()); + assertEquals("typeinfo-name", s.getName()); assertEquals("AP_HAL::HAL::Callbacks", s.getParentNamespace().getName(true)); assertEquals("typeinfo name for AP_HAL::HAL::Callbacks", @@ -238,6 +238,7 @@ public class GnuDemanglerTest extends AbstractGenericTest { String demanglerName = GnuDemanglerOptions.GNU_DEMANGLER_DEFAULT; String applicationArguments = "-s MrBob"; try { + setErrorsExpected(true); GnuDemanglerNativeProcess.getDemanglerNativeProcess(demanglerName, applicationArguments); fail("Expected an exception when passing unknown arguments to the native demangler"); @@ -246,7 +247,7 @@ public class GnuDemanglerTest extends AbstractGenericTest { // expected Msg.error(this, "Test error", e); } - + setErrorsExpected(false); } private Address addr(String address) { diff --git a/Ghidra/Features/GnuDemangler/src/test/resources/ghidra/app/util/demangler/gnu_mangled_names_macho.txt b/Ghidra/Features/GnuDemangler/src/test/resources/ghidra/app/util/demangler/gnu_mangled_names_macho.txt deleted file mode 100644 index 518a929c18..0000000000 --- a/Ghidra/Features/GnuDemangler/src/test/resources/ghidra/app/util/demangler/gnu_mangled_names_macho.txt +++ /dev/null @@ -1,16 +0,0 @@ -__ZTV15_IOConfigThread # -__ZN8IOSyncer9metaClassE # -__ZN8IOSyncer10superClassE # - -__ZN12KLDBootstrapD1Ev # -__ZN12KLDBootstrapD2Ev # -__ZN12KLDBootstrapC1Ev # -__ZN12KLDBootstrapC2Ev # - -__ZL26kCharsetNameISOLatinHebrew -__ZN9__gnu_cxxL16__stl_prime_listE -__ZNSs6appendERKSs -__ZTV21MmsMessageClassHeader - -__ZL30addRecipientsFromMmsWithHeaderPKcP10MmsMessageP9CTMessage # addRecipientsFromMmsWithHeader(char const*, MmsMessage*, CTMessage*) -__ZZN13MmsPduDecoder21_decodeMessageHeadersEP10MmsMessageE15requiredHeaders diff --git a/Ghidra/Features/GnuDemangler/src/test/resources/ghidra/app/util/demangler/libMagick.symbols.txt b/Ghidra/Features/GnuDemangler/src/test/resources/ghidra/app/util/demangler/libMagick.symbols.txt deleted file mode 100644 index f3e4fa08f5..0000000000 --- a/Ghidra/Features/GnuDemangler/src/test/resources/ghidra/app/util/demangler/libMagick.symbols.txt +++ /dev/null @@ -1,2280 +0,0 @@ -_ZNSt24__default_alloc_templateILb1ELi0EE8allocateEj -_ZN6Magick5ImageC1ERKSs -_ZN6Magick5Image10monochromeEb -_ZN6Magick5Image8quantizeEb -_ZN6Magick14PathCurvetoAbsC1ERKS0_ -_Znaj -_ZN6Magick8ImageRefC1EPN9MagickLib6_ImageEPKNS_7OptionsE -_ZNK6Magick8ColorYUV1yEv -_ZN6Magick5Image8boxColorERKNS_5ColorE -_ZN6Magick7Options8fillRuleERKN9MagickLib8FillRuleE -_ZN6Magick7OptionsC1Ev -_ZN6MagickneERKNS_8GeometryES2_ -_ZN6Magick13PathLinetoAbsC1ERKS0_ -_ZN6Magick7Options4viewERKSs -_ZN6Magick5Image10matteColorERKNS_5ColorE -_ZNK6Magick7Options15backgroundColorEv -_ZN6Magick5Image6borderERKNS_8GeometryE -_ZN6Magick5ColorC2ERKS0_ -_ZN6Magick5ImageC1ERKNS_8GeometryERKNS_5ColorE -_ZN6Magick5Image5sceneEj -_ZN6Magick13PathMovetoAbsC1ERKS0_ -_ZN6Magick5Image13cycleColormapEi -_ZN6Magick5Image16floodFillTextureEjjRKS0_RKNS_5ColorE -_ZN6Magick5ImageD1Ev -_ZN6Magick5Image9fillColorERKNS_5ColorE -_ZN6Magick18ErrorResourceLimitC1ERKSs -_ZN6Magick19DrawableStrokeColorC1ERKS0_ -_ZN6Magick5Image5shaveERKNS_8GeometryE -_ZNK6Magick5Image19throwImageExceptionEv -_ZN6MagickltERKNS_10CoordinateES2_ -_ZNSt9exceptionD2Ev -_ZN6Magick5Image5matteEb -_ZN6MagickgtERKNS_5ColorES2_ -_ZN6Magick14throwExceptionERN9MagickLib14_ExceptionInfoE -_ZN6Magick12DrawableTextC1ERKS0_ -_ZN6Magick13ErrorFileOpenC1ERKSs -_ZN6Magick5Image5frameEjjii -_ZN6Magick14ErrorUndefinedC1ERKSs -_ZNSt10_List_baseIN6Magick5VPathESaIS1_EE5clearEv -_ZN6Magick5Image11strokeWidthEd -_ZN6Magick7MontageC2Ev -_ZNK6Magick7Options9fillColorEv -_ZN6Magick4BlobC1EPKvj -_ZN6Magick7Options10x11DisplayERKSs -_ZN6Magick5Image18chromaGreenPrimaryEdd -_ZNKSs4copyEPcjj -_ZN6Magick5Image4drawERKSt4listINS_8DrawableESaIS2_EE -_ZNSs4_Rep10_M_disposeERKSaIcE -_ZN6Magick9MutexLockC1Ev -_ZNSsC1ERKSs -_ZNK6Magick7Options8fillRuleEv -_ZN6Magick5Image4blurEdd -_ZN6Magick5Image13interlaceTypeEN9MagickLib13InterlaceTypeE -_ZN6Magick29PathSmoothQuadraticCurvetoAbsC1ERKS0_ -_ZNK6Magick7Options15strokeDashArrayEv -_ZN6Magick5Image9colorFuzzEd -_ZN6Magick7Options15transformOriginEdd -_ZN6Magick5Image16chromaRedPrimaryEdd -_ZN6Magick5Image18quantizeColorSpaceEN9MagickLib14ColorspaceTypeE -_ZN6Magick7Options5debugEb -_ZN6Magick8GeometryC1ERKN9MagickLib14_RectangleInfoE -_ZN6Magick12DrawablePathC1ERKS0_ -_ZNSt14__simple_allocISt10_List_nodeIN6Magick8DrawableEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS3_j -_ZN6Magick20ErrorMissingDelegateC1ERKSs -_ZN6Magick5Image15backgroundColorERKNS_5ColorE -_ZNK6Magick7Options8boxColorEv -_ZNSt4listIN6Magick10CoordinateESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZN6Magick5VPathC1ERKS0_ -_ZN6MagickgtERKNS_10CoordinateES2_ -_ZN6Magick5Image16chromaWhitePointEdd -_ZN6Magick5Image7enhanceEv -_ZN6Magick9MutexLock4lockEv -_ZN6Magick5Image16floodFillTextureERKNS_8GeometryERKS0_ -_ZNSt10_List_baseIN6Magick11PathArcArgsESaIS1_EED2Ev -_ZN6Magick8GeometryaSERKSs -_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_ -_ZN6Magick7Options6endianEN9MagickLib10EndianTypeE -_ZN6Magick23PathQuadraticCurvetoAbsC1ERKS0_ -_ZNSt14__simple_allocISt10_List_nodeIN6Magick5VPathEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS3_j -_ZN6Magick12ErrorXServerC1ERKSs -_ZN6Magick5Image7magnifyEv -_ZN6Magick17DrawableDashArray9dasharrayEPKj -_ZN6Magick29PathSmoothQuadraticCurvetoRelC1ERKS0_ -_ZNSt10_List_baseIN6Magick11PathArcArgsESaIS1_EE5clearEv -_ZN6Magick9MutexLockD1Ev -_ZN6Magick5Image9antiAliasEb -_ZN6Magick15WarningFileOpenC1ERKSs -_ZN6Magick5ImageC1ERKS0_ -_ZNK6Magick7Options5debugEv -_ZN6Magick8ImageRefC1Ev -_ZN6MagickneERKNS_5ColorES2_ -_ZN6Magick5Image6minifyEv -_ZN6Magick14WarningXServerC1ERKSs -_ZN6Magick7Options7densityERKNS_8GeometryE -_ZN6Magick5Image4cropERKNS_8GeometryE -_ZN6Magick5Image11borderColorERKNS_5ColorE -_ZN6Magick14PathCurvetoRelC1ERKS0_ -_ZN6Magick8GeometryC1EPKc -_ZN6Magick5Image11strokeColorERKNS_5ColorE -_ZNSt4listIN6Magick11PathArcArgsESaIS1_EE14_M_create_nodeERKS1_ -_ZN6Magick5Image7verboseEb -_ZN6Magick5Image8modulateEddd -_ZN6Magick5Image4fontERKSs -_ZN6Magick7BlobRefD1Ev -_ZN6Magick5ColorD1Ev -_ZNSs6assignERKSs -_ZN6Magick13MagickCleanUpC1Ev -_ZN6Magick5Image12compressTypeEN9MagickLib15CompressionTypeE -_ZN6Magick5Image11modifyImageEv -_ZN6Magick5Image7steganoERKS0_ -_ZNSt4listIN6Magick24PathQuadraticCurvetoArgsESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZNSsD1Ev -_ZN6Magick5Image14floodFillColorEjjRKNS_5ColorE -_ZN6Magick5ImageC1EPN9MagickLib6_ImageEPKNS_7OptionsE -_ZN6Magick5Image14quantizeColorsEj -_ZdlPv -_ZNK6Magick8GeometrycvN9MagickLib14_RectangleInfoEEv -_ZSt10__distanceISt14_List_iteratorIN6Magick10CoordinateERKS2_PS3_EENSt15iterator_traitsIT_E15difference_typeES8_S8_St18input_iterator_tag -_ZN6Magick5Image12medianFilterEd -_ZNK6Magick7Options6magickEv -_ZN6Magick5Image7qualityEj -_ZNSt10_List_baseIN6Magick5VPathESaIS1_EED2Ev -_ZN6Magick15DrawablePolygonC1ERKS0_ -_ZN6Magick7Options15resolutionUnitsEN9MagickLib14ResolutionTypeE -_ZNSt4listIN6Magick11PathArcArgsESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZNK6Magick5Image9signatureEb -_ZNSt10_List_baseIN6Magick24PathQuadraticCurvetoArgsESaIS1_EED2Ev -_ZNSt10_List_baseIN6Magick8DrawableESaIS1_EED2Ev -_ZN6Magick5Image6embossEdd -_ZN6Magick5Image4flopEv -_ZN6Magick19WarningCorruptImageC1ERKSs -_ZN6Magick5Image8fileNameERKSs -_ZN6Magick5Image4typeEN9MagickLib9ImageTypeE -_ZSt9terminatev -_ZN6Magick5Image8annotateERKSsRKNS_8GeometryEN9MagickLib11GravityTypeEd -_ZN6Magick5Image15renderingIntentEN9MagickLib15RenderingIntentE -_ZN6Magick5Image10x11DisplayERKSs -_ZN6Magick5Image4chopERKNS_8GeometryE -_ZN6Magick5Image9transformERKNS_8GeometryES3_ -_ZNSt4listIN6Magick15PathCurvetoArgsESaIS1_EE14_M_create_nodeERKS1_ -_ZNSs7replaceEjjPKcj -_ZN6Magick5Image10colorSpaceEN9MagickLib14ColorspaceTypeE -_ZNSt4listIN6Magick10CoordinateESaIS1_EE14_M_create_nodeERKS1_ -_ZN6Magick7Options15strokeDashArrayEPKd -_ZNK6Magick7Options7densityEv -_ZN6Magick8GeometryaSEPKc -_ZN6Magick5Image4viewERKSs -_ZNSs7reserveEj -_ZNSt4listIN6Magick5VPathESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZN6Magick5ColorC1ERKS0_ -_ZNK6Magick8GeometrycvSsEv -_ZN6Magick5Image7channelEN9MagickLib11ChannelTypeE -_ZN6Magick5Image4readERKNS_4BlobERKNS_8GeometryERKSs -_ZN6Magick5ImageC1Ev -_ZN6Magick10PathArcRelC1ERKS0_ -_ZNK6Magick7Montage17updateMontageInfoERN9MagickLib12_MontageInfoE -_ZN6Magick5Image6endianEN9MagickLib10EndianTypeE -_ZN6Magick5Image9thresholdEd -_ZN6Magick9ExceptionC2ERKS0_ -_ZN6Magick5Image9compositeERKS0_iiN9MagickLib17CompositeOperatorE -_ZN6Magick6PixelsD1Ev -_ZN6Magick5Image12replaceImageEPN9MagickLib6_ImageE -_ZN6Magick8GeometryD1Ev -_ZN6Magick7Options14transformSkewYEd -_ZNK6Magick5Image14getConstPixelsEiijj -_ZN6Magick5Image7implodeEd -_ZN6MagickltERKNS_5ImageES2_ -_ZN6MagickneERKNS_5ImageES2_ -_ZN6Magick5Image15resolutionUnitsEN9MagickLib14ResolutionTypeE -_ZN6Magick5Image14matteFloodfillERKNS_5ColorEjiiN9MagickLib11PaintMethodE -_ZN6Magick5Image6adjoinEb -_ZN6Magick5Image4readERKNS_4BlobE -_ZN6Magick5Image16gifDisposeMethodEj -_ZN6Magick9ExceptionC2ERKSs -_ZN6Magick5Image7sharpenEdd -_ZN6Magick5Image9despeckleEv -_ZN6Magick5Image5labelERKSs -_ZN6Magick19DrawablePushPatternC1ERKS0_ -_ZN6Magick11ErrorOptionC1ERKSs -_ZN6Magick5Image17quantizeTreeDepthEj -_ZN6Magick5Image11transparentERKNS_5ColorE -_ZN6Magick5Image7segmentEdd -_ZN6Magick22throwExceptionExplicitEN9MagickLib13ExceptionTypeEPKcS3_ -_ZN6Magick5Image5scaleERKNS_8GeometryE -_ZN6MagickeqERKNS_5ImageES2_ -_ZNSt4listIN6Magick8DrawableESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZN6Magick5Image7densityERKNS_8GeometryE -_ZNK6Magick7Options8tileNameEv -_ZN6Magick5Image16floodFillTextureERKNS_8GeometryERKS0_RKNS_5ColorE -_ZN6Magick5Image14quantizeDitherEb -_ZN6Magick5Image13fontPointsizeEd -_ZN6Magick9MutexLock6unlockEv -_ZN6Magick5Image12gaussianBlurEdd -_ZN6Magick8GeometryC1Ev -_ZN6Magick12DrawableBaseD2Ev -_ZNSt10_List_baseIN6Magick8DrawableESaIS1_EE5clearEv -_ZN6Magick5ColoraSEPKc -_ZN6Magick8DrawableD1Ev -_ZN6Magick5Image10filterTypeEN9MagickLib11FilterTypesE -_ZNK6Magick8DrawableclEPN9MagickLib12_DrawContextE -_ZN6Magick5Image4sizeERKNS_8GeometryE -_ZN6Magick7Options4pageERKNS_8GeometryE -_ZNK6Magick7Options13strokePatternEv -_ZN6Magick17ErrorCorruptImageC1ERKSs -_ZN6Magick5Image6stereoERKS0_ -_ZNSt10_List_baseIN6Magick15PathCurvetoArgsESaIS1_EE5clearEv -_ZNSt10_List_baseIN6Magick24PathQuadraticCurvetoArgsESaIS1_EE5clearEv -_ZN6Magick5Image8colorMapEjRKNS_5ColorE -_ZN6Magick5Image7textureERKS0_ -_ZN6Magick7BlobRefC1EPKvj -_ZN6Magick12DrawableFontC1ERKS0_ -_ZN6Magick5Image17chromaBluePrimaryEdd -_ZNSs6appendEjc -_ZN6Magick5Image4trimEv -_ZN6MagickeqERKNS_8GeometryES2_ -_ZN6Magick5ColoraSERKS0_ -_ZN6Magick5Image4flipEv -_ZNK6Magick7Options17backgroundTextureEv -_ZN6Magick5Image19animationIterationsEj -_ZN6Magick22WarningMissingDelegateC1ERKSs -_ZN6Magick5Image4waveEdd -_ZN6Magick6PixelsC1ERNS_5ImageE -_ZNK6Magick5Image6magickEv -_ZN6Magick8ImageRefD1Ev -_ZN6Magick5Image4readERKNS_4BlobERKNS_8GeometryEjRKSs -_ZNSt4listIN6Magick11PathArcArgsESaIS1_EE14_M_fill_insertESt14_List_iteratorIS1_RS1_PS1_EjRKS1_ -_ZN6Magick5Image4readERKNS_4BlobERKNS_8GeometryE -_ZN6Magick7Options6magickERKSs -_ZN6Magick5Image4readERKNS_4BlobERKNS_8GeometryEj -_ZN6Magick5Image4pageERKNS_8GeometryE -_ZN6Magick17DrawableDashArray9dasharrayEPKd -_ZN6Magick8ImageRef5imageEPN9MagickLib6_ImageE -_ZN6Magick5Image6magickERKSs -_ZdaPv -_ZN6Magick8DrawableC1ERKS0_ -_ZN6Magick7Options8tileNameERKSs -_ZN6Magick8ImageRef2idEl -_ZN6Magick5Image4readEjjRKSsN9MagickLib11StorageTypeEPKv -_ZN6Magick7Options14transformSkewXEd -_ZN6Magick20PathSmoothCurvetoAbsC1ERKS0_ -_ZN6Magick5Image9transformERKNS_8GeometryE -_ZNK6Magick5Image15getConstIndexesEv -_ZN6Magick7WarningC2ERKSs -_ZN6Magick7Options14transformResetEv -_ZN6Magick5Image6spreadEj -_ZN6Magick5Image8colorizeEjjjRKNS_5ColorE -_ZN6Magick10ErrorCacheC1ERKSs -_ZNK6Magick7Options11borderColorEv -_ZNSs6appendERKSs -_ZNK6Magick5Image10pixelColorEjj -_ZN6Magick5Image14floodFillColorEjjRKNS_5ColorES3_ -_ZN6Magick5Image8addNoiseEN9MagickLib9NoiseTypeE -_ZN6Magick8GeometryC1Ejjjjbb -_ZNSsC1EPKcRKSaIcE -_ZNSt10_List_baseIN6Magick10CoordinateESaIS1_EED2Ev -_ZNSt4listIN6Magick24PathQuadraticCurvetoArgsESaIS1_EE14_M_create_nodeERKS1_ -_ZNK6Magick7Options10x11DisplayEv -_ZN6Magick5Image8tileNameERKSs -_ZN6Magick17DrawableFillColorC1ERKS0_ -_ZNSt24__default_alloc_templateILb1ELi0EE10deallocateEPvj -_ZN6Magick5Image7commentERKSs -_ZN6Magick16DrawablePolylineC1ERKS0_ -_ZN6MagickltERKNS_5ColorES2_ -_ZN6Magick22DrawableCompositeImageC1ERKS0_ -_ZNSt10_List_baseIN6Magick15PathCurvetoArgsESaIS1_EED2Ev -_ZN6Magick7OptionsC1ERKS0_ -_ZN6Magick5Image6opaqueERKNS_5ColorES3_ -_ZN6Magick7Options10matteColorERKNS_5ColorE -_ZN6Magick5Image9classTypeEN9MagickLib9ClassTypeE -_ZN6Magick5Image9normalizeEv -_ZN6Magick5Image4readERKSs -_ZN6Magick4Blob12updateNoCopyEPvjNS0_9AllocatorE -_ZN6Magick7Options17transformRotationEd -_ZN6Magick10PathArcAbsC1ERKS0_ -_ZNK6Magick7Options11fillPatternEv -_ZN6Magick5Image8equalizeEv -_ZN6Magick23PathQuadraticCurvetoRelC1ERKS0_ -_ZN6Magick5Image8contrastEj -_ZNK6Magick5Image8fileNameEv -_ZN6Magick7Options11strokeColorERKNS_5ColorE -_ZN6Magick7Options15backgroundColorERKNS_5ColorE -_ZNK6Magick7Options8fileNameEv -_ZN6Magick11WarningBlobC1ERKSs -_ZN6Magick5Image14animationDelayEj -_ZNK6Magick5VPathclEPN9MagickLib12_DrawContextE -_ZN6Magick5Image5gammaEddd -_ZN6Magick7Options17backgroundTextureERKSs -_ZN6Magick5Image6negateEb -_ZN6Magick7Options11borderColorERKNS_5ColorE -_ZN6Magick5Image5swirlEd -_ZN6Magick5Image4zoomERKNS_8GeometryE -_ZN6Magick5Image16floodFillTextureEjjRKS0_ -_ZN6Magick13PathLinetoRelC1ERKS0_ -_ZNSsC1EPKcjRKSaIcE -_ZN6Magick5Image11reduceNoiseEd -_ZN6Magick12WarningCacheC1ERKSs -_ZNK6Magick7Options15resolutionUnitsEv -_ZN6Magick7OptionsD1Ev -_ZN6Magick5Image17backgroundTextureERKSs -_ZN6Magick20PathSmoothCurvetoRelC1ERKS0_ -_ZN6Magick5Image3mapERKS0_b -_ZN6Magick5Image6rotateEd -_ZN6Magick7Options9fillColorERKNS_5ColorE -_ZN6Magick5Image6sampleERKNS_8GeometryE -_ZN6Magick7Options11fillPatternEPKN9MagickLib6_ImageE -_ZN6Magick7Options4sizeERKNS_8GeometryE -_ZNK6Magick8ColorYUV1uEv -_ZNK6Magick5ColorcvSsEv -_ZN6Magick7Options8boxColorERKNS_5ColorE -_ZN6MagickeqERKNS_10CoordinateES2_ -_ZN6Magick5Image7opacityEj -_ZN6Magick5Image4edgeEd -_ZN6Magick22DrawableTextUnderColorC1ERKS0_ -_ZN6Magick5Image10pixelColorEjjRKNS_5ColorE -_ZNSt4listIN6Magick8DrawableESaIS1_EE14_M_create_nodeERKS1_ -_ZNK6Magick7Options4fontEv -_ZN6Magick7Options4fontERKSs -_Znwj -_ZNSt10_List_baseIN6Magick10CoordinateESaIS1_EE5clearEv -_ZN6Magick5Image5shadeEddb -_ZN6Magick5Image8oilPaintEd -_ZNSt4listIN6Magick15PathCurvetoArgsESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZN6Magick5Image10penTextureERKS0_ -_ZN6Magick5ErrorC2ERKSs -_ZNSt4listIN6Magick10CoordinateESaIS1_EE14_M_fill_insertESt14_List_iteratorIS1_RS1_PS1_EjRKS1_ -_ZN6MagickgtERKNS_8GeometryES2_ -_ZN6Magick5Image5shearEdd -_ZNK6Magick8ColorYUV1vEv -_ZN6Magick5Image8subImageEj -_ZN6Magick5Image8charcoalEdd -_ZN6Magick14DrawableBezierC1ERKS0_ -_ZN6Magick5Image5depthEj -_ZN6Magick13MagickCleanUpD1Ev -_ZN6MagickeqERKNS_5ColorES2_ -_ZN6Magick13PathMovetoRelC1ERKS0_ -_ZN6Magick5Image5raiseERKNS_8GeometryEb -_ZN6Magick5Image8solarizeEd -_ZN6MagickltERKNS_8GeometryES2_ -_ZN6MagickneERKNS_10CoordinateES2_ -_ZN6Magick6Pixels3getEiijj -_ZN6Magick9ErrorBlobC1ERKSs -_ZN6Magick7Options8fileNameERKSs -_ZN6Magick17DrawableDashArrayC1ERKS0_ -_ZN6Magick5Image4rollEjj -_ZN6Magick5ColorC1ERKN9MagickLib12_PixelPacketE -_ZN6Magick13ErrorDelegateC1ERKSs -_ZN6Magick11CloneStringEPPcRKSs -_ZN6Magick5ColoraSERKSs -_ZNK6Magick7Options11strokeColorEv -_ZNK6Magick5Image8colorMapEj -_ZNSs4_Rep10_M_destroyERKSaIcE -_ZNSt4listIN6Magick24PathQuadraticCurvetoArgsESaIS1_EE14_M_fill_insertESt14_List_iteratorIS1_RS1_PS1_EjRKS1_ -_ZN6Magick13WarningOptionC1ERKSs -_ZN6Magick7Options13strokePatternEPKN9MagickLib6_ImageE -_ZNK6Magick7Options4viewEv -_ZN6Magick5Image8subRangeEj -_ZN6Magick15WarningDelegateC1ERKSs -_ZN6Magick6Pixels4syncEv -_ZN6Magick20WarningResourceLimitC1ERKSs -_ZN6Magick7Options14transformScaleEdd -_ZN6Magick9VPathBaseD2Ev -_ZN6Magick8GeometryC1ERKS0_ -_ZN6Magick5Image7isValidEb -_ZNSt4listIN6Magick15PathCurvetoArgsESaIS1_EE14_M_fill_insertESt14_List_iteratorIS1_RS1_PS1_EjRKS1_ -_ZNK6Magick5Image7isValidEv -_ZNSs6appendEPKcj -_ZN6Magick5Image8penColorERKNS_5ColorE -_ZN6MagickgtERKNS_5ImageES2_ -_ZN6Magick4BlobC2Ev -_ZN6Magick4BlobC1Ev -_ZN6Magick4BlobC2EPKvj -_ZN6Magick4BlobC1EPKvj -_ZN6Magick4BlobC2ERKS0_ -_ZN6Magick4BlobC1ERKS0_ -_ZN6Magick4BlobD2Ev -_ZN6Magick4BlobD1Ev -_ZN6Magick4BlobD0Ev -_ZN6Magick4BlobaSERKS0_ -_ZN6Magick4Blob6base64ESs -_ZN6Magick4Blob6base64Ev -_ZN6Magick4Blob6updateEPKvj -_ZN6Magick4Blob12updateNoCopyEPvjNS0_9AllocatorE -_ZN6Magick7BlobRefC2EPKvj -_ZN6Magick7BlobRefC1EPKvj -_ZN6Magick7BlobRefD2Ev -_ZN6Magick7BlobRefD1Ev -_ZN6Magick9CoderInfoC2ERKSs -_ZN6Magick9CoderInfoC1ERKSs -_ZN6Magick9CoderInfoD2Ev -_ZN6Magick9CoderInfoD1Ev -_ZNK6Magick9CoderInfo4nameEv -_ZNK6Magick9CoderInfo11descriptionEv -_ZNK6Magick9CoderInfo10isReadableEv -_ZNK6Magick9CoderInfo10isWritableEv -_ZNK6Magick9CoderInfo12isMultiFrameEv -_ZN6Magick9CoderInfoC2EPKN9MagickLib11_MagickInfoE -_ZN6Magick9CoderInfoC1EPKN9MagickLib11_MagickInfoE -_ZN6MagickeqERKNS_5ColorES2_ -_ZN6MagickneERKNS_5ColorES2_ -_ZN6MagickgtERKNS_5ColorES2_ -_ZN6MagickltERKNS_5ColorES2_ -_ZN6MagickgeERKNS_5ColorES2_ -_ZN6MagickleERKNS_5ColorES2_ -_ZN6Magick5ColorC2ERKS0_ -_ZN6Magick5ColorC1ERKS0_ -_ZN6Magick5ColoraSERKS0_ -_ZN6Magick5ColoraSERKSs -_ZN6Magick5ColoraSEPKc -_ZNK6Magick5ColorcvSsEv -_ZN6Magick5ColorC2ERKN9MagickLib12_PixelPacketE -_ZN6Magick5ColorC1ERKN9MagickLib12_PixelPacketE -_ZN6Magick5ColoraSERKN9MagickLib12_PixelPacketE -_ZN6Magick8ColorHSLC2Eddd -_ZN6Magick8ColorHSLC1Eddd -_ZN6Magick8ColorHSLC2Ev -_ZN6Magick8ColorHSLC1Ev -_ZN6Magick8ColorHSLC2ERKNS_5ColorE -_ZN6Magick8ColorHSLC1ERKNS_5ColorE -_ZN6Magick8ColorHSLD2Ev -_ZN6Magick8ColorHSLD1Ev -_ZN6Magick8ColorHSLD0Ev -_ZN6Magick8ColorHSL3hueEd -_ZNK6Magick8ColorHSL3hueEv -_ZN6Magick8ColorHSL10saturationEd -_ZNK6Magick8ColorHSL10saturationEv -_ZN6Magick8ColorHSL10luminosityEd -_ZNK6Magick8ColorHSL10luminosityEv -_ZN6Magick8ColorHSLaSERKNS_5ColorE -_ZN6Magick9ColorGrayC2Ed -_ZN6Magick9ColorGrayC1Ed -_ZN6Magick9ColorGrayC2Ev -_ZN6Magick9ColorGrayC1Ev -_ZN6Magick9ColorGrayC2ERKNS_5ColorE -_ZN6Magick9ColorGrayC1ERKNS_5ColorE -_ZN6Magick9ColorGrayD2Ev -_ZN6Magick9ColorGrayD1Ev -_ZN6Magick9ColorGrayD0Ev -_ZN6Magick9ColorGray5shadeEd -_ZNK6Magick9ColorGray5shadeEv -_ZN6Magick9ColorGrayaSERKNS_5ColorE -_ZN6Magick9ColorMonoC2Eb -_ZN6Magick9ColorMonoC1Eb -_ZN6Magick9ColorMonoC2Ev -_ZN6Magick9ColorMonoC1Ev -_ZN6Magick9ColorMonoC2ERKNS_5ColorE -_ZN6Magick9ColorMonoC1ERKNS_5ColorE -_ZN6Magick9ColorMonoD2Ev -_ZN6Magick9ColorMonoD1Ev -_ZN6Magick9ColorMonoD0Ev -_ZN6Magick9ColorMono4monoEb -_ZNK6Magick9ColorMono4monoEv -_ZN6Magick9ColorMonoaSERKNS_5ColorE -_ZN6Magick8ColorRGBC2Eddd -_ZN6Magick8ColorRGBC1Eddd -_ZN6Magick8ColorRGBC2Ev -_ZN6Magick8ColorRGBC1Ev -_ZN6Magick8ColorRGBC2ERKNS_5ColorE -_ZN6Magick8ColorRGBC1ERKNS_5ColorE -_ZN6Magick8ColorRGBD2Ev -_ZN6Magick8ColorRGBD1Ev -_ZN6Magick8ColorRGBD0Ev -_ZN6Magick8ColorRGBaSERKNS_5ColorE -_ZN6Magick8ColorYUVC2Eddd -_ZN6Magick8ColorYUVC1Eddd -_ZN6Magick8ColorYUVC2Ev -_ZN6Magick8ColorYUVC1Ev -_ZN6Magick8ColorYUVC2ERKNS_5ColorE -_ZN6Magick8ColorYUVC1ERKNS_5ColorE -_ZN6Magick8ColorYUVD2Ev -_ZN6Magick8ColorYUVD1Ev -_ZN6Magick8ColorYUVD0Ev -_ZN6Magick8ColorYUV1uEd -_ZNK6Magick8ColorYUV1uEv -_ZN6Magick8ColorYUV1vEd -_ZNK6Magick8ColorYUV1vEv -_ZN6Magick8ColorYUV1yEd -_ZNK6Magick8ColorYUV1yEv -_ZN6Magick8ColorYUVaSERKNS_5ColorE -_ZN6Magick5ColorD1Ev -_ZN6Magick5ColorD0Ev -_ZN6MagickeqERKNS_10CoordinateES2_ -_ZN6MagickneERKNS_10CoordinateES2_ -_ZN6MagickgtERKNS_10CoordinateES2_ -_ZN6MagickltERKNS_10CoordinateES2_ -_ZN6MagickgeERKNS_10CoordinateES2_ -_ZN6MagickleERKNS_10CoordinateES2_ -_ZN6Magick12DrawableBaseD2Ev -_ZN6Magick12DrawableBaseD1Ev -_ZN6Magick12DrawableBaseD0Ev -_ZN6Magick8DrawableC2Ev -_ZN6Magick8DrawableC1Ev -_ZN6Magick8DrawableC2ERKNS_12DrawableBaseE -_ZN6Magick8DrawableC1ERKNS_12DrawableBaseE -_ZN6Magick8DrawableD2Ev -_ZN6Magick8DrawableD1Ev -_ZN6Magick8DrawableC2ERKS0_ -_ZN6Magick8DrawableC1ERKS0_ -_ZN6Magick8DrawableaSERKS0_ -_ZNK6Magick8DrawableclEPN9MagickLib12_DrawContextE -_ZN6Magick9VPathBaseD2Ev -_ZN6Magick9VPathBaseD1Ev -_ZN6Magick9VPathBaseD0Ev -_ZN6Magick5VPathC2Ev -_ZN6Magick5VPathC1Ev -_ZN6Magick5VPathC2ERKNS_9VPathBaseE -_ZN6Magick5VPathC1ERKNS_9VPathBaseE -_ZN6Magick5VPathD2Ev -_ZN6Magick5VPathD1Ev -_ZN6Magick5VPathD0Ev -_ZN6Magick5VPathC2ERKS0_ -_ZN6Magick5VPathC1ERKS0_ -_ZN6Magick5VPathaSERKS0_ -_ZNK6Magick5VPathclEPN9MagickLib12_DrawContextE -_ZN6Magick14DrawableAffineC2Edddddd -_ZN6Magick14DrawableAffineC1Edddddd -_ZN6Magick14DrawableAffineC2Ev -_ZN6Magick14DrawableAffineC1Ev -_ZN6Magick14DrawableAffineD2Ev -_ZN6Magick14DrawableAffineD1Ev -_ZN6Magick14DrawableAffineD0Ev -_ZNK6Magick14DrawableAffineclEPN9MagickLib12_DrawContextE -_ZNK6Magick14DrawableAffine4copyEv -_ZN6Magick11DrawableArcD2Ev -_ZN6Magick11DrawableArcD1Ev -_ZN6Magick11DrawableArcD0Ev -_ZNK6Magick11DrawableArcclEPN9MagickLib12_DrawContextE -_ZNK6Magick11DrawableArc4copyEv -_ZN6Magick14DrawableBezierC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick14DrawableBezierC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick14DrawableBezierC2ERKS0_ -_ZN6Magick14DrawableBezierC1ERKS0_ -_ZN6Magick14DrawableBezierD2Ev -_ZN6Magick14DrawableBezierD1Ev -_ZN6Magick14DrawableBezierD0Ev -_ZNK6Magick14DrawableBezierclEPN9MagickLib12_DrawContextE -_ZNK6Magick14DrawableBezier4copyEv -_ZN6Magick14DrawableCircleD2Ev -_ZN6Magick14DrawableCircleD1Ev -_ZN6Magick14DrawableCircleD0Ev -_ZNK6Magick14DrawableCircleclEPN9MagickLib12_DrawContextE -_ZNK6Magick14DrawableCircle4copyEv -_ZN6Magick13DrawableColorD2Ev -_ZN6Magick13DrawableColorD1Ev -_ZN6Magick13DrawableColorD0Ev -_ZNK6Magick13DrawableColorclEPN9MagickLib12_DrawContextE -_ZNK6Magick13DrawableColor4copyEv -_ZN6Magick22DrawableCompositeImageC2EddddRKSsN9MagickLib17CompositeOperatorE -_ZN6Magick22DrawableCompositeImageC1EddddRKSsN9MagickLib17CompositeOperatorE -_ZN6Magick22DrawableCompositeImageC2EddddRKNS_5ImageEN9MagickLib17CompositeOperatorE -_ZN6Magick22DrawableCompositeImageC1EddddRKNS_5ImageEN9MagickLib17CompositeOperatorE -_ZN6Magick22DrawableCompositeImageC2EddddRKSs -_ZN6Magick22DrawableCompositeImageC1EddddRKSs -_ZN6Magick22DrawableCompositeImageC2EddddRKNS_5ImageE -_ZN6Magick22DrawableCompositeImageC1EddddRKNS_5ImageE -_ZN6Magick22DrawableCompositeImageC2EddRKSs -_ZN6Magick22DrawableCompositeImageC1EddRKSs -_ZN6Magick22DrawableCompositeImageC2EddRKNS_5ImageE -_ZN6Magick22DrawableCompositeImageC1EddRKNS_5ImageE -_ZN6Magick22DrawableCompositeImageC2ERKS0_ -_ZN6Magick22DrawableCompositeImageC1ERKS0_ -_ZN6Magick22DrawableCompositeImageD2Ev -_ZN6Magick22DrawableCompositeImageD1Ev -_ZN6Magick22DrawableCompositeImageD0Ev -_ZN6Magick22DrawableCompositeImageaSERKS0_ -_ZN6Magick22DrawableCompositeImage8filenameERKSs -_ZNK6Magick22DrawableCompositeImage8filenameEv -_ZN6Magick22DrawableCompositeImage5imageERKNS_5ImageE -_ZNK6Magick22DrawableCompositeImage5imageEv -_ZN6Magick22DrawableCompositeImage6magickESs -_ZN6Magick22DrawableCompositeImage6magickEv -_ZNK6Magick22DrawableCompositeImageclEPN9MagickLib12_DrawContextE -_ZNK6Magick22DrawableCompositeImage4copyEv -_ZN6Magick15DrawableEllipseD2Ev -_ZN6Magick15DrawableEllipseD1Ev -_ZN6Magick15DrawableEllipseD0Ev -_ZNK6Magick15DrawableEllipseclEPN9MagickLib12_DrawContextE -_ZNK6Magick15DrawableEllipse4copyEv -_ZN6Magick17DrawableFillColorC2ERKNS_5ColorE -_ZN6Magick17DrawableFillColorC1ERKNS_5ColorE -_ZN6Magick17DrawableFillColorC2ERKS0_ -_ZN6Magick17DrawableFillColorC1ERKS0_ -_ZN6Magick17DrawableFillColorD2Ev -_ZN6Magick17DrawableFillColorD1Ev -_ZN6Magick17DrawableFillColorD0Ev -_ZNK6Magick17DrawableFillColorclEPN9MagickLib12_DrawContextE -_ZNK6Magick17DrawableFillColor4copyEv -_ZN6Magick16DrawableFillRuleD2Ev -_ZN6Magick16DrawableFillRuleD1Ev -_ZN6Magick16DrawableFillRuleD0Ev -_ZNK6Magick16DrawableFillRuleclEPN9MagickLib12_DrawContextE -_ZNK6Magick16DrawableFillRule4copyEv -_ZN6Magick19DrawableFillOpacityD2Ev -_ZN6Magick19DrawableFillOpacityD1Ev -_ZN6Magick19DrawableFillOpacityD0Ev -_ZNK6Magick19DrawableFillOpacityclEPN9MagickLib12_DrawContextE -_ZNK6Magick19DrawableFillOpacity4copyEv -_ZN6Magick12DrawableFontC2ERKSs -_ZN6Magick12DrawableFontC1ERKSs -_ZN6Magick12DrawableFontC2ERKSsN9MagickLib9StyleTypeEmNS3_11StretchTypeE -_ZN6Magick12DrawableFontC1ERKSsN9MagickLib9StyleTypeEmNS3_11StretchTypeE -_ZN6Magick12DrawableFontC2ERKS0_ -_ZN6Magick12DrawableFontC1ERKS0_ -_ZN6Magick12DrawableFontD2Ev -_ZN6Magick12DrawableFontD1Ev -_ZN6Magick12DrawableFontD0Ev -_ZNK6Magick12DrawableFontclEPN9MagickLib12_DrawContextE -_ZNK6Magick12DrawableFont4copyEv -_ZN6Magick15DrawableGravityD2Ev -_ZN6Magick15DrawableGravityD1Ev -_ZN6Magick15DrawableGravityD0Ev -_ZNK6Magick15DrawableGravityclEPN9MagickLib12_DrawContextE -_ZNK6Magick15DrawableGravity4copyEv -_ZN6Magick12DrawableLineD2Ev -_ZN6Magick12DrawableLineD1Ev -_ZN6Magick12DrawableLineD0Ev -_ZNK6Magick12DrawableLineclEPN9MagickLib12_DrawContextE -_ZNK6Magick12DrawableLine4copyEv -_ZN6Magick13DrawableMatteD2Ev -_ZN6Magick13DrawableMatteD1Ev -_ZN6Magick13DrawableMatteD0Ev -_ZNK6Magick13DrawableMatteclEPN9MagickLib12_DrawContextE -_ZNK6Magick13DrawableMatte4copyEv -_ZN6Magick12DrawablePathC2ERKSt4listINS_5VPathESaIS2_EE -_ZN6Magick12DrawablePathC1ERKSt4listINS_5VPathESaIS2_EE -_ZN6Magick12DrawablePathC2ERKS0_ -_ZN6Magick12DrawablePathC1ERKS0_ -_ZN6Magick12DrawablePathD2Ev -_ZN6Magick12DrawablePathD1Ev -_ZN6Magick12DrawablePathD0Ev -_ZNK6Magick12DrawablePathclEPN9MagickLib12_DrawContextE -_ZNK6Magick12DrawablePath4copyEv -_ZN6Magick13DrawablePointD2Ev -_ZN6Magick13DrawablePointD1Ev -_ZN6Magick13DrawablePointD0Ev -_ZNK6Magick13DrawablePointclEPN9MagickLib12_DrawContextE -_ZNK6Magick13DrawablePoint4copyEv -_ZN6Magick17DrawablePointSizeD2Ev -_ZN6Magick17DrawablePointSizeD1Ev -_ZN6Magick17DrawablePointSizeD0Ev -_ZNK6Magick17DrawablePointSizeclEPN9MagickLib12_DrawContextE -_ZNK6Magick17DrawablePointSize4copyEv -_ZN6Magick15DrawablePolygonC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick15DrawablePolygonC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick15DrawablePolygonC2ERKS0_ -_ZN6Magick15DrawablePolygonC1ERKS0_ -_ZN6Magick15DrawablePolygonD2Ev -_ZN6Magick15DrawablePolygonD1Ev -_ZN6Magick15DrawablePolygonD0Ev -_ZNK6Magick15DrawablePolygonclEPN9MagickLib12_DrawContextE -_ZNK6Magick15DrawablePolygon4copyEv -_ZN6Magick16DrawablePolylineC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick16DrawablePolylineC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick16DrawablePolylineC2ERKS0_ -_ZN6Magick16DrawablePolylineC1ERKS0_ -_ZN6Magick16DrawablePolylineD2Ev -_ZN6Magick16DrawablePolylineD1Ev -_ZN6Magick16DrawablePolylineD0Ev -_ZNK6Magick16DrawablePolylineclEPN9MagickLib12_DrawContextE -_ZNK6Magick16DrawablePolyline4copyEv -_ZN6Magick25DrawablePopGraphicContextD2Ev -_ZN6Magick25DrawablePopGraphicContextD1Ev -_ZN6Magick25DrawablePopGraphicContextD0Ev -_ZNK6Magick25DrawablePopGraphicContextclEPN9MagickLib12_DrawContextE -_ZNK6Magick25DrawablePopGraphicContext4copyEv -_ZN6Magick26DrawablePushGraphicContextD2Ev -_ZN6Magick26DrawablePushGraphicContextD1Ev -_ZN6Magick26DrawablePushGraphicContextD0Ev -_ZNK6Magick26DrawablePushGraphicContextclEPN9MagickLib12_DrawContextE -_ZNK6Magick26DrawablePushGraphicContext4copyEv -_ZN6Magick18DrawablePopPatternD2Ev -_ZN6Magick18DrawablePopPatternD1Ev -_ZN6Magick18DrawablePopPatternD0Ev -_ZNK6Magick18DrawablePopPatternclEPN9MagickLib12_DrawContextE -_ZNK6Magick18DrawablePopPattern4copyEv -_ZN6Magick19DrawablePushPatternC2ERKSsllll -_ZN6Magick19DrawablePushPatternC1ERKSsllll -_ZN6Magick19DrawablePushPatternC2ERKS0_ -_ZN6Magick19DrawablePushPatternC1ERKS0_ -_ZN6Magick19DrawablePushPatternD2Ev -_ZN6Magick19DrawablePushPatternD1Ev -_ZN6Magick19DrawablePushPatternD0Ev -_ZNK6Magick19DrawablePushPatternclEPN9MagickLib12_DrawContextE -_ZNK6Magick19DrawablePushPattern4copyEv -_ZN6Magick17DrawableRectangleD2Ev -_ZN6Magick17DrawableRectangleD1Ev -_ZN6Magick17DrawableRectangleD0Ev -_ZNK6Magick17DrawableRectangleclEPN9MagickLib12_DrawContextE -_ZNK6Magick17DrawableRectangle4copyEv -_ZN6Magick16DrawableRotationD2Ev -_ZN6Magick16DrawableRotationD1Ev -_ZN6Magick16DrawableRotationD0Ev -_ZNK6Magick16DrawableRotationclEPN9MagickLib12_DrawContextE -_ZNK6Magick16DrawableRotation4copyEv -_ZN6Magick22DrawableRoundRectangleD2Ev -_ZN6Magick22DrawableRoundRectangleD1Ev -_ZN6Magick22DrawableRoundRectangleD0Ev -_ZNK6Magick22DrawableRoundRectangleclEPN9MagickLib12_DrawContextE -_ZNK6Magick22DrawableRoundRectangle4copyEv -_ZN6Magick15DrawableScalingD2Ev -_ZN6Magick15DrawableScalingD1Ev -_ZN6Magick15DrawableScalingD0Ev -_ZNK6Magick15DrawableScalingclEPN9MagickLib12_DrawContextE -_ZNK6Magick15DrawableScaling4copyEv -_ZN6Magick13DrawableSkewXD2Ev -_ZN6Magick13DrawableSkewXD1Ev -_ZN6Magick13DrawableSkewXD0Ev -_ZNK6Magick13DrawableSkewXclEPN9MagickLib12_DrawContextE -_ZNK6Magick13DrawableSkewX4copyEv -_ZN6Magick13DrawableSkewYD2Ev -_ZN6Magick13DrawableSkewYD1Ev -_ZN6Magick13DrawableSkewYD0Ev -_ZNK6Magick13DrawableSkewYclEPN9MagickLib12_DrawContextE -_ZNK6Magick13DrawableSkewY4copyEv -_ZN6Magick17DrawableDashArrayC2EPKd -_ZN6Magick17DrawableDashArrayC1EPKd -_ZN6Magick17DrawableDashArrayC2EPKj -_ZN6Magick17DrawableDashArrayC1EPKj -_ZN6Magick17DrawableDashArrayC2ERKS0_ -_ZN6Magick17DrawableDashArrayC1ERKS0_ -_ZN6Magick17DrawableDashArrayD2Ev -_ZN6Magick17DrawableDashArrayD1Ev -_ZN6Magick17DrawableDashArrayD0Ev -_ZN6Magick17DrawableDashArrayaSERKS0_ -_ZNK6Magick17DrawableDashArrayclEPN9MagickLib12_DrawContextE -_ZNK6Magick17DrawableDashArray4copyEv -_ZN6Magick17DrawableDashArray9dasharrayEPKd -_ZN6Magick17DrawableDashArray9dasharrayEPKj -_ZN6Magick18DrawableDashOffsetD2Ev -_ZN6Magick18DrawableDashOffsetD1Ev -_ZN6Magick18DrawableDashOffsetD0Ev -_ZNK6Magick18DrawableDashOffsetclEPN9MagickLib12_DrawContextE -_ZNK6Magick18DrawableDashOffset4copyEv -_ZN6Magick21DrawableStrokeLineCapD2Ev -_ZN6Magick21DrawableStrokeLineCapD1Ev -_ZN6Magick21DrawableStrokeLineCapD0Ev -_ZNK6Magick21DrawableStrokeLineCapclEPN9MagickLib12_DrawContextE -_ZNK6Magick21DrawableStrokeLineCap4copyEv -_ZN6Magick22DrawableStrokeLineJoinD2Ev -_ZN6Magick22DrawableStrokeLineJoinD1Ev -_ZN6Magick22DrawableStrokeLineJoinD0Ev -_ZNK6Magick22DrawableStrokeLineJoinclEPN9MagickLib12_DrawContextE -_ZNK6Magick22DrawableStrokeLineJoin4copyEv -_ZN6Magick18DrawableMiterLimitD2Ev -_ZN6Magick18DrawableMiterLimitD1Ev -_ZN6Magick18DrawableMiterLimitD0Ev -_ZNK6Magick18DrawableMiterLimitclEPN9MagickLib12_DrawContextE -_ZNK6Magick18DrawableMiterLimit4copyEv -_ZN6Magick23DrawableStrokeAntialiasD2Ev -_ZN6Magick23DrawableStrokeAntialiasD1Ev -_ZN6Magick23DrawableStrokeAntialiasD0Ev -_ZNK6Magick23DrawableStrokeAntialiasclEPN9MagickLib12_DrawContextE -_ZNK6Magick23DrawableStrokeAntialias4copyEv -_ZN6Magick19DrawableStrokeColorC2ERKNS_5ColorE -_ZN6Magick19DrawableStrokeColorC1ERKNS_5ColorE -_ZN6Magick19DrawableStrokeColorC2ERKS0_ -_ZN6Magick19DrawableStrokeColorC1ERKS0_ -_ZN6Magick19DrawableStrokeColorD2Ev -_ZN6Magick19DrawableStrokeColorD1Ev -_ZN6Magick19DrawableStrokeColorD0Ev -_ZNK6Magick19DrawableStrokeColorclEPN9MagickLib12_DrawContextE -_ZNK6Magick19DrawableStrokeColor4copyEv -_ZN6Magick21DrawableStrokeOpacityD2Ev -_ZN6Magick21DrawableStrokeOpacityD1Ev -_ZN6Magick21DrawableStrokeOpacityD0Ev -_ZNK6Magick21DrawableStrokeOpacityclEPN9MagickLib12_DrawContextE -_ZNK6Magick21DrawableStrokeOpacity4copyEv -_ZN6Magick19DrawableStrokeWidthD2Ev -_ZN6Magick19DrawableStrokeWidthD1Ev -_ZN6Magick19DrawableStrokeWidthD0Ev -_ZNK6Magick19DrawableStrokeWidthclEPN9MagickLib12_DrawContextE -_ZNK6Magick19DrawableStrokeWidth4copyEv -_ZN6Magick12DrawableTextC2EddRKSs -_ZN6Magick12DrawableTextC1EddRKSs -_ZN6Magick12DrawableTextC2ERKS0_ -_ZN6Magick12DrawableTextC1ERKS0_ -_ZN6Magick12DrawableTextD2Ev -_ZN6Magick12DrawableTextD1Ev -_ZN6Magick12DrawableTextD0Ev -_ZNK6Magick12DrawableTextclEPN9MagickLib12_DrawContextE -_ZNK6Magick12DrawableText4copyEv -_ZN6Magick21DrawableTextAntialiasD2Ev -_ZN6Magick21DrawableTextAntialiasD1Ev -_ZN6Magick21DrawableTextAntialiasD0Ev -_ZNK6Magick21DrawableTextAntialiasclEPN9MagickLib12_DrawContextE -_ZNK6Magick21DrawableTextAntialias4copyEv -_ZN6Magick22DrawableTextDecorationD2Ev -_ZN6Magick22DrawableTextDecorationD1Ev -_ZN6Magick22DrawableTextDecorationD0Ev -_ZNK6Magick22DrawableTextDecorationclEPN9MagickLib12_DrawContextE -_ZNK6Magick22DrawableTextDecoration4copyEv -_ZN6Magick22DrawableTextUnderColorC2ERKNS_5ColorE -_ZN6Magick22DrawableTextUnderColorC1ERKNS_5ColorE -_ZN6Magick22DrawableTextUnderColorC2ERKS0_ -_ZN6Magick22DrawableTextUnderColorC1ERKS0_ -_ZN6Magick22DrawableTextUnderColorD2Ev -_ZN6Magick22DrawableTextUnderColorD1Ev -_ZN6Magick22DrawableTextUnderColorD0Ev -_ZNK6Magick22DrawableTextUnderColorclEPN9MagickLib12_DrawContextE -_ZNK6Magick22DrawableTextUnderColor4copyEv -_ZN6Magick19DrawableTranslationD2Ev -_ZN6Magick19DrawableTranslationD1Ev -_ZN6Magick19DrawableTranslationD0Ev -_ZNK6Magick19DrawableTranslationclEPN9MagickLib12_DrawContextE -_ZNK6Magick19DrawableTranslation4copyEv -_ZN6Magick15DrawableViewboxD2Ev -_ZN6Magick15DrawableViewboxD1Ev -_ZN6Magick15DrawableViewboxD0Ev -_ZNK6Magick15DrawableViewboxclEPN9MagickLib12_DrawContextE -_ZNK6Magick15DrawableViewbox4copyEv -_ZN6Magick10PathArcAbsC2ERKNS_11PathArcArgsE -_ZN6Magick10PathArcAbsC1ERKNS_11PathArcArgsE -_ZN6Magick10PathArcAbsC2ERKSt4listINS_11PathArcArgsESaIS2_EE -_ZN6Magick10PathArcAbsC1ERKSt4listINS_11PathArcArgsESaIS2_EE -_ZN6Magick10PathArcAbsC2ERKS0_ -_ZN6Magick10PathArcAbsC1ERKS0_ -_ZN6Magick10PathArcAbsD2Ev -_ZN6Magick10PathArcAbsD1Ev -_ZN6Magick10PathArcAbsD0Ev -_ZNK6Magick10PathArcAbsclEPN9MagickLib12_DrawContextE -_ZNK6Magick10PathArcAbs4copyEv -_ZN6Magick10PathArcRelC2ERKNS_11PathArcArgsE -_ZN6Magick10PathArcRelC1ERKNS_11PathArcArgsE -_ZN6Magick10PathArcRelC2ERKSt4listINS_11PathArcArgsESaIS2_EE -_ZN6Magick10PathArcRelC1ERKSt4listINS_11PathArcArgsESaIS2_EE -_ZN6Magick10PathArcRelC2ERKS0_ -_ZN6Magick10PathArcRelC1ERKS0_ -_ZN6Magick10PathArcRelD2Ev -_ZN6Magick10PathArcRelD1Ev -_ZN6Magick10PathArcRelD0Ev -_ZNK6Magick10PathArcRelclEPN9MagickLib12_DrawContextE -_ZNK6Magick10PathArcRel4copyEv -_ZN6Magick13PathClosePathD2Ev -_ZN6Magick13PathClosePathD1Ev -_ZN6Magick13PathClosePathD0Ev -_ZNK6Magick13PathClosePathclEPN9MagickLib12_DrawContextE -_ZNK6Magick13PathClosePath4copyEv -_ZN6Magick14PathCurvetoAbsC2ERKNS_15PathCurvetoArgsE -_ZN6Magick14PathCurvetoAbsC1ERKNS_15PathCurvetoArgsE -_ZN6Magick14PathCurvetoAbsC2ERKSt4listINS_15PathCurvetoArgsESaIS2_EE -_ZN6Magick14PathCurvetoAbsC1ERKSt4listINS_15PathCurvetoArgsESaIS2_EE -_ZN6Magick14PathCurvetoAbsC2ERKS0_ -_ZN6Magick14PathCurvetoAbsC1ERKS0_ -_ZN6Magick14PathCurvetoAbsD2Ev -_ZN6Magick14PathCurvetoAbsD1Ev -_ZN6Magick14PathCurvetoAbsD0Ev -_ZNK6Magick14PathCurvetoAbsclEPN9MagickLib12_DrawContextE -_ZNK6Magick14PathCurvetoAbs4copyEv -_ZN6Magick14PathCurvetoRelC2ERKNS_15PathCurvetoArgsE -_ZN6Magick14PathCurvetoRelC1ERKNS_15PathCurvetoArgsE -_ZN6Magick14PathCurvetoRelC2ERKSt4listINS_15PathCurvetoArgsESaIS2_EE -_ZN6Magick14PathCurvetoRelC1ERKSt4listINS_15PathCurvetoArgsESaIS2_EE -_ZN6Magick14PathCurvetoRelC2ERKS0_ -_ZN6Magick14PathCurvetoRelC1ERKS0_ -_ZN6Magick14PathCurvetoRelD2Ev -_ZN6Magick14PathCurvetoRelD1Ev -_ZN6Magick14PathCurvetoRelD0Ev -_ZNK6Magick14PathCurvetoRelclEPN9MagickLib12_DrawContextE -_ZNK6Magick14PathCurvetoRel4copyEv -_ZN6Magick20PathSmoothCurvetoAbsC2ERKNS_10CoordinateE -_ZN6Magick20PathSmoothCurvetoAbsC1ERKNS_10CoordinateE -_ZN6Magick20PathSmoothCurvetoAbsC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick20PathSmoothCurvetoAbsC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick20PathSmoothCurvetoAbsC2ERKS0_ -_ZN6Magick20PathSmoothCurvetoAbsC1ERKS0_ -_ZN6Magick20PathSmoothCurvetoAbsD2Ev -_ZN6Magick20PathSmoothCurvetoAbsD1Ev -_ZN6Magick20PathSmoothCurvetoAbsD0Ev -_ZNK6Magick20PathSmoothCurvetoAbsclEPN9MagickLib12_DrawContextE -_ZNK6Magick20PathSmoothCurvetoAbs4copyEv -_ZN6Magick20PathSmoothCurvetoRelC2ERKNS_10CoordinateE -_ZN6Magick20PathSmoothCurvetoRelC1ERKNS_10CoordinateE -_ZN6Magick20PathSmoothCurvetoRelC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick20PathSmoothCurvetoRelC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick20PathSmoothCurvetoRelC2ERKS0_ -_ZN6Magick20PathSmoothCurvetoRelC1ERKS0_ -_ZN6Magick20PathSmoothCurvetoRelD2Ev -_ZN6Magick20PathSmoothCurvetoRelD1Ev -_ZN6Magick20PathSmoothCurvetoRelD0Ev -_ZNK6Magick20PathSmoothCurvetoRelclEPN9MagickLib12_DrawContextE -_ZNK6Magick20PathSmoothCurvetoRel4copyEv -_ZN6Magick23PathQuadraticCurvetoAbsC2ERKNS_24PathQuadraticCurvetoArgsE -_ZN6Magick23PathQuadraticCurvetoAbsC1ERKNS_24PathQuadraticCurvetoArgsE -_ZN6Magick23PathQuadraticCurvetoAbsC2ERKSt4listINS_24PathQuadraticCurvetoArgsESaIS2_EE -_ZN6Magick23PathQuadraticCurvetoAbsC1ERKSt4listINS_24PathQuadraticCurvetoArgsESaIS2_EE -_ZN6Magick23PathQuadraticCurvetoAbsC2ERKS0_ -_ZN6Magick23PathQuadraticCurvetoAbsC1ERKS0_ -_ZN6Magick23PathQuadraticCurvetoAbsD2Ev -_ZN6Magick23PathQuadraticCurvetoAbsD1Ev -_ZN6Magick23PathQuadraticCurvetoAbsD0Ev -_ZNK6Magick23PathQuadraticCurvetoAbsclEPN9MagickLib12_DrawContextE -_ZNK6Magick23PathQuadraticCurvetoAbs4copyEv -_ZN6Magick23PathQuadraticCurvetoRelC2ERKNS_24PathQuadraticCurvetoArgsE -_ZN6Magick23PathQuadraticCurvetoRelC1ERKNS_24PathQuadraticCurvetoArgsE -_ZN6Magick23PathQuadraticCurvetoRelC2ERKSt4listINS_24PathQuadraticCurvetoArgsESaIS2_EE -_ZN6Magick23PathQuadraticCurvetoRelC1ERKSt4listINS_24PathQuadraticCurvetoArgsESaIS2_EE -_ZN6Magick23PathQuadraticCurvetoRelC2ERKS0_ -_ZN6Magick23PathQuadraticCurvetoRelC1ERKS0_ -_ZN6Magick23PathQuadraticCurvetoRelD2Ev -_ZN6Magick23PathQuadraticCurvetoRelD1Ev -_ZN6Magick23PathQuadraticCurvetoRelD0Ev -_ZNK6Magick23PathQuadraticCurvetoRelclEPN9MagickLib12_DrawContextE -_ZNK6Magick23PathQuadraticCurvetoRel4copyEv -_ZN6Magick29PathSmoothQuadraticCurvetoAbsC2ERKNS_10CoordinateE -_ZN6Magick29PathSmoothQuadraticCurvetoAbsC1ERKNS_10CoordinateE -_ZN6Magick29PathSmoothQuadraticCurvetoAbsC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick29PathSmoothQuadraticCurvetoAbsC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick29PathSmoothQuadraticCurvetoAbsC2ERKS0_ -_ZN6Magick29PathSmoothQuadraticCurvetoAbsC1ERKS0_ -_ZN6Magick29PathSmoothQuadraticCurvetoAbsD2Ev -_ZN6Magick29PathSmoothQuadraticCurvetoAbsD1Ev -_ZN6Magick29PathSmoothQuadraticCurvetoAbsD0Ev -_ZNK6Magick29PathSmoothQuadraticCurvetoAbsclEPN9MagickLib12_DrawContextE -_ZNK6Magick29PathSmoothQuadraticCurvetoAbs4copyEv -_ZN6Magick29PathSmoothQuadraticCurvetoRelC2ERKNS_10CoordinateE -_ZN6Magick29PathSmoothQuadraticCurvetoRelC1ERKNS_10CoordinateE -_ZN6Magick29PathSmoothQuadraticCurvetoRelC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick29PathSmoothQuadraticCurvetoRelC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick29PathSmoothQuadraticCurvetoRelC2ERKS0_ -_ZN6Magick29PathSmoothQuadraticCurvetoRelC1ERKS0_ -_ZN6Magick29PathSmoothQuadraticCurvetoRelD2Ev -_ZN6Magick29PathSmoothQuadraticCurvetoRelD1Ev -_ZN6Magick29PathSmoothQuadraticCurvetoRelD0Ev -_ZNK6Magick29PathSmoothQuadraticCurvetoRelclEPN9MagickLib12_DrawContextE -_ZNK6Magick29PathSmoothQuadraticCurvetoRel4copyEv -_ZN6Magick13PathLinetoAbsC2ERKNS_10CoordinateE -_ZN6Magick13PathLinetoAbsC1ERKNS_10CoordinateE -_ZN6Magick13PathLinetoAbsC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick13PathLinetoAbsC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick13PathLinetoAbsC2ERKS0_ -_ZN6Magick13PathLinetoAbsC1ERKS0_ -_ZN6Magick13PathLinetoAbsD2Ev -_ZN6Magick13PathLinetoAbsD1Ev -_ZN6Magick13PathLinetoAbsD0Ev -_ZNK6Magick13PathLinetoAbsclEPN9MagickLib12_DrawContextE -_ZNK6Magick13PathLinetoAbs4copyEv -_ZN6Magick13PathLinetoRelC2ERKNS_10CoordinateE -_ZN6Magick13PathLinetoRelC1ERKNS_10CoordinateE -_ZN6Magick13PathLinetoRelC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick13PathLinetoRelC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick13PathLinetoRelC2ERKS0_ -_ZN6Magick13PathLinetoRelC1ERKS0_ -_ZN6Magick13PathLinetoRelD2Ev -_ZN6Magick13PathLinetoRelD1Ev -_ZN6Magick13PathLinetoRelD0Ev -_ZNK6Magick13PathLinetoRelclEPN9MagickLib12_DrawContextE -_ZNK6Magick13PathLinetoRel4copyEv -_ZN6Magick23PathLinetoHorizontalAbsD2Ev -_ZN6Magick23PathLinetoHorizontalAbsD1Ev -_ZN6Magick23PathLinetoHorizontalAbsD0Ev -_ZNK6Magick23PathLinetoHorizontalAbsclEPN9MagickLib12_DrawContextE -_ZNK6Magick23PathLinetoHorizontalAbs4copyEv -_ZN6Magick23PathLinetoHorizontalRelD2Ev -_ZN6Magick23PathLinetoHorizontalRelD1Ev -_ZN6Magick23PathLinetoHorizontalRelD0Ev -_ZNK6Magick23PathLinetoHorizontalRelclEPN9MagickLib12_DrawContextE -_ZNK6Magick23PathLinetoHorizontalRel4copyEv -_ZN6Magick21PathLinetoVerticalAbsD2Ev -_ZN6Magick21PathLinetoVerticalAbsD1Ev -_ZN6Magick21PathLinetoVerticalAbsD0Ev -_ZNK6Magick21PathLinetoVerticalAbsclEPN9MagickLib12_DrawContextE -_ZNK6Magick21PathLinetoVerticalAbs4copyEv -_ZN6Magick21PathLinetoVerticalRelD2Ev -_ZN6Magick21PathLinetoVerticalRelD1Ev -_ZN6Magick21PathLinetoVerticalRelD0Ev -_ZNK6Magick21PathLinetoVerticalRelclEPN9MagickLib12_DrawContextE -_ZNK6Magick21PathLinetoVerticalRel4copyEv -_ZN6Magick13PathMovetoAbsC2ERKNS_10CoordinateE -_ZN6Magick13PathMovetoAbsC1ERKNS_10CoordinateE -_ZN6Magick13PathMovetoAbsC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick13PathMovetoAbsC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick13PathMovetoAbsC2ERKS0_ -_ZN6Magick13PathMovetoAbsC1ERKS0_ -_ZN6Magick13PathMovetoAbsD2Ev -_ZN6Magick13PathMovetoAbsD1Ev -_ZN6Magick13PathMovetoAbsD0Ev -_ZNK6Magick13PathMovetoAbsclEPN9MagickLib12_DrawContextE -_ZNK6Magick13PathMovetoAbs4copyEv -_ZN6Magick13PathMovetoRelC2ERKNS_10CoordinateE -_ZN6Magick13PathMovetoRelC1ERKNS_10CoordinateE -_ZN6Magick13PathMovetoRelC2ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick13PathMovetoRelC1ERKSt4listINS_10CoordinateESaIS2_EE -_ZN6Magick13PathMovetoRelC2ERKS0_ -_ZN6Magick13PathMovetoRelC1ERKS0_ -_ZN6Magick13PathMovetoRelD2Ev -_ZN6Magick13PathMovetoRelD1Ev -_ZN6Magick13PathMovetoRelD0Ev -_ZNK6Magick13PathMovetoRelclEPN9MagickLib12_DrawContextE -_ZNK6Magick13PathMovetoRel4copyEv -_ZNSt10_List_baseIN6Magick10CoordinateESaIS1_EE5clearEv -_ZNSt4listIN6Magick10CoordinateESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZNSt10_List_baseIN6Magick5VPathESaIS1_EE5clearEv -_ZNSt4listIN6Magick5VPathESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZNSt10_List_baseIN6Magick11PathArcArgsESaIS1_EE5clearEv -_ZNSt4listIN6Magick11PathArcArgsESaIS1_EE14_M_fill_insertESt14_List_iteratorIS1_RS1_PS1_EjRKS1_ -_ZNSt4listIN6Magick11PathArcArgsESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZNSt10_List_baseIN6Magick15PathCurvetoArgsESaIS1_EE5clearEv -_ZNSt4listIN6Magick15PathCurvetoArgsESaIS1_EE14_M_fill_insertESt14_List_iteratorIS1_RS1_PS1_EjRKS1_ -_ZNSt4listIN6Magick15PathCurvetoArgsESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZNSt4listIN6Magick10CoordinateESaIS1_EE14_M_fill_insertESt14_List_iteratorIS1_RS1_PS1_EjRKS1_ -_ZNSt10_List_baseIN6Magick24PathQuadraticCurvetoArgsESaIS1_EE5clearEv -_ZNSt4listIN6Magick24PathQuadraticCurvetoArgsESaIS1_EE14_M_fill_insertESt14_List_iteratorIS1_RS1_PS1_EjRKS1_ -_ZNSt4listIN6Magick24PathQuadraticCurvetoArgsESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZN6Magick10CoordinateD1Ev -_ZN6Magick10CoordinateD0Ev -_ZNSt10_List_baseIN6Magick10CoordinateESaIS1_EED2Ev -_ZSt10__distanceISt14_List_iteratorIN6Magick10CoordinateERKS2_PS3_EENSt15iterator_traitsIT_E15difference_typeES8_S8_St18input_iterator_tag -_ZNSt10_List_baseIN6Magick5VPathESaIS1_EED2Ev -_ZNSt14__simple_allocISt10_List_nodeIN6Magick5VPathEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS3_j -_ZNSt10_List_baseIN6Magick11PathArcArgsESaIS1_EED2Ev -_ZNSt10_List_baseIN6Magick15PathCurvetoArgsESaIS1_EED2Ev -_ZNSt10_List_baseIN6Magick24PathQuadraticCurvetoArgsESaIS1_EED2Ev -_ZNSt4listIN6Magick10CoordinateESaIS1_EE14_M_create_nodeERKS1_ -_ZNSt4listIN6Magick11PathArcArgsESaIS1_EE14_M_create_nodeERKS1_ -_ZNSt4listIN6Magick15PathCurvetoArgsESaIS1_EE14_M_create_nodeERKS1_ -_ZNSt4listIN6Magick24PathQuadraticCurvetoArgsESaIS1_EE14_M_create_nodeERKS1_ -_ZN6Magick9ExceptionC2ERKSs -_ZN6Magick9ExceptionC1ERKSs -_ZN6Magick9ExceptionC2ERKS0_ -_ZN6Magick9ExceptionC1ERKS0_ -_ZN6Magick9ExceptionaSERKS0_ -_ZNK6Magick9Exception4whatEv -_ZN6Magick7WarningC2ERKSs -_ZN6Magick7WarningC1ERKSs -_ZN6Magick16WarningUndefinedC2ERKSs -_ZN6Magick16WarningUndefinedC1ERKSs -_ZN6Magick20WarningResourceLimitC2ERKSs -_ZN6Magick20WarningResourceLimitC1ERKSs -_ZN6Magick14WarningXServerC2ERKSs -_ZN6Magick14WarningXServerC1ERKSs -_ZN6Magick13WarningOptionC2ERKSs -_ZN6Magick13WarningOptionC1ERKSs -_ZN6Magick15WarningDelegateC2ERKSs -_ZN6Magick15WarningDelegateC1ERKSs -_ZN6Magick22WarningMissingDelegateC2ERKSs -_ZN6Magick22WarningMissingDelegateC1ERKSs -_ZN6Magick19WarningCorruptImageC2ERKSs -_ZN6Magick19WarningCorruptImageC1ERKSs -_ZN6Magick15WarningFileOpenC2ERKSs -_ZN6Magick15WarningFileOpenC1ERKSs -_ZN6Magick11WarningBlobC2ERKSs -_ZN6Magick11WarningBlobC1ERKSs -_ZN6Magick12WarningCacheC2ERKSs -_ZN6Magick12WarningCacheC1ERKSs -_ZN6Magick5ErrorC2ERKSs -_ZN6Magick5ErrorC1ERKSs -_ZN6Magick14ErrorUndefinedC2ERKSs -_ZN6Magick14ErrorUndefinedC1ERKSs -_ZN6Magick18ErrorResourceLimitC2ERKSs -_ZN6Magick18ErrorResourceLimitC1ERKSs -_ZN6Magick12ErrorXServerC2ERKSs -_ZN6Magick12ErrorXServerC1ERKSs -_ZN6Magick11ErrorOptionC2ERKSs -_ZN6Magick11ErrorOptionC1ERKSs -_ZN6Magick13ErrorDelegateC2ERKSs -_ZN6Magick13ErrorDelegateC1ERKSs -_ZN6Magick20ErrorMissingDelegateC2ERKSs -_ZN6Magick20ErrorMissingDelegateC1ERKSs -_ZN6Magick17ErrorCorruptImageC2ERKSs -_ZN6Magick17ErrorCorruptImageC1ERKSs -_ZN6Magick13ErrorFileOpenC2ERKSs -_ZN6Magick13ErrorFileOpenC1ERKSs -_ZN6Magick9ErrorBlobC2ERKSs -_ZN6Magick9ErrorBlobC1ERKSs -_ZN6Magick10ErrorCacheC2ERKSs -_ZN6Magick10ErrorCacheC1ERKSs -_ZN6Magick22throwExceptionExplicitEN9MagickLib13ExceptionTypeEPKcS3_ -_ZN6Magick14throwExceptionERN9MagickLib14_ExceptionInfoE -_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_ -_ZN6Magick16WarningUndefinedD1Ev -_ZN6Magick16WarningUndefinedD0Ev -_ZN6Magick9ExceptionD1Ev -_ZN6Magick9ExceptionD0Ev -_ZN6Magick7WarningD0Ev -_ZN6Magick7WarningD1Ev -_ZN6Magick20WarningResourceLimitD0Ev -_ZN6Magick20WarningResourceLimitD1Ev -_ZN6Magick14WarningXServerD0Ev -_ZN6Magick14WarningXServerD1Ev -_ZN6Magick13WarningOptionD0Ev -_ZN6Magick13WarningOptionD1Ev -_ZN6Magick15WarningDelegateD0Ev -_ZN6Magick15WarningDelegateD1Ev -_ZN6Magick22WarningMissingDelegateD0Ev -_ZN6Magick22WarningMissingDelegateD1Ev -_ZN6Magick19WarningCorruptImageD0Ev -_ZN6Magick19WarningCorruptImageD1Ev -_ZN6Magick15WarningFileOpenD0Ev -_ZN6Magick15WarningFileOpenD1Ev -_ZN6Magick11WarningBlobD0Ev -_ZN6Magick11WarningBlobD1Ev -_ZN6Magick12WarningCacheD0Ev -_ZN6Magick12WarningCacheD1Ev -_ZN6Magick5ErrorD0Ev -_ZN6Magick5ErrorD1Ev -_ZN6Magick14ErrorUndefinedD0Ev -_ZN6Magick14ErrorUndefinedD1Ev -_ZN6Magick18ErrorResourceLimitD0Ev -_ZN6Magick18ErrorResourceLimitD1Ev -_ZN6Magick12ErrorXServerD0Ev -_ZN6Magick12ErrorXServerD1Ev -_ZN6Magick11ErrorOptionD0Ev -_ZN6Magick11ErrorOptionD1Ev -_ZN6Magick13ErrorDelegateD0Ev -_ZN6Magick13ErrorDelegateD1Ev -_ZN6Magick20ErrorMissingDelegateD0Ev -_ZN6Magick20ErrorMissingDelegateD1Ev -_ZN6Magick17ErrorCorruptImageD0Ev -_ZN6Magick17ErrorCorruptImageD1Ev -_ZN6Magick13ErrorFileOpenD0Ev -_ZN6Magick13ErrorFileOpenD1Ev -_ZN6Magick9ErrorBlobD0Ev -_ZN6Magick9ErrorBlobD1Ev -_ZN6Magick10ErrorCacheD0Ev -_ZN6Magick10ErrorCacheD1Ev -_ZN6Magick11CloneStringEPPcRKSs -_ZN6MagickeqERKNS_8GeometryES2_ -_ZN6MagickneERKNS_8GeometryES2_ -_ZN6MagickgtERKNS_8GeometryES2_ -_ZN6MagickltERKNS_8GeometryES2_ -_ZN6MagickgeERKNS_8GeometryES2_ -_ZN6MagickleERKNS_8GeometryES2_ -_ZN6Magick8GeometryC2Ejjjjbb -_ZN6Magick8GeometryC1Ejjjjbb -_ZN6Magick8GeometryC2ERKSs -_ZN6Magick8GeometryC1ERKSs -_ZN6Magick8GeometryC2EPKc -_ZN6Magick8GeometryC1EPKc -_ZN6Magick8GeometryC2ERKS0_ -_ZN6Magick8GeometryC1ERKS0_ -_ZN6Magick8GeometryC2Ev -_ZN6Magick8GeometryC1Ev -_ZN6Magick8GeometryD2Ev -_ZN6Magick8GeometryD1Ev -_ZN6Magick8GeometryaSERKS0_ -_ZN6Magick8GeometryaSERKSs -_ZN6Magick8GeometryaSEPKc -_ZNK6Magick8GeometrycvSsEv -_ZN6Magick8GeometryC2ERKN9MagickLib14_RectangleInfoE -_ZN6Magick8GeometryC1ERKN9MagickLib14_RectangleInfoE -_ZNK6Magick8GeometrycvN9MagickLib14_RectangleInfoEEv -_ZN6MagickeqERKNS_5ImageES2_ -_ZN6MagickneERKNS_5ImageES2_ -_ZN6MagickgtERKNS_5ImageES2_ -_ZN6MagickltERKNS_5ImageES2_ -_ZN6MagickgeERKNS_5ImageES2_ -_ZN6MagickleERKNS_5ImageES2_ -_ZN6Magick5ImageC2ERKSs -_ZN6Magick5ImageC1ERKSs -_ZN6Magick5ImageC2ERKNS_8GeometryERKNS_5ColorE -_ZN6Magick5ImageC1ERKNS_8GeometryERKNS_5ColorE -_ZN6Magick5ImageC2ERKNS_4BlobE -_ZN6Magick5ImageC1ERKNS_4BlobE -_ZN6Magick5ImageC2ERKNS_4BlobERKNS_8GeometryE -_ZN6Magick5ImageC1ERKNS_4BlobERKNS_8GeometryE -_ZN6Magick5ImageC2ERKNS_4BlobERKNS_8GeometryEj -_ZN6Magick5ImageC1ERKNS_4BlobERKNS_8GeometryEj -_ZN6Magick5ImageC2ERKNS_4BlobERKNS_8GeometryEjRKSs -_ZN6Magick5ImageC1ERKNS_4BlobERKNS_8GeometryEjRKSs -_ZN6Magick5ImageC2ERKNS_4BlobERKNS_8GeometryERKSs -_ZN6Magick5ImageC1ERKNS_4BlobERKNS_8GeometryERKSs -_ZN6Magick5ImageC2EjjRKSsN9MagickLib11StorageTypeEPKv -_ZN6Magick5ImageC1EjjRKSsN9MagickLib11StorageTypeEPKv -_ZN6Magick5ImageC2Ev -_ZN6Magick5ImageC1Ev -_ZN6Magick5ImageD2Ev -_ZN6Magick5ImageD1Ev -_ZN6Magick5ImageD0Ev -_ZN6Magick5Image8addNoiseEN9MagickLib9NoiseTypeE -_ZN6Magick5Image8annotateERKSsRKNS_8GeometryE -_ZN6Magick5Image8annotateERKSsRKNS_8GeometryEN9MagickLib11GravityTypeE -_ZN6Magick5Image8annotateERKSsRKNS_8GeometryEN9MagickLib11GravityTypeEd -_ZN6Magick5Image8annotateERKSsN9MagickLib11GravityTypeE -_ZN6Magick5Image4blurEdd -_ZN6Magick5Image6borderERKNS_8GeometryE -_ZN6Magick5Image7channelEN9MagickLib11ChannelTypeE -_ZN6Magick5Image8charcoalEdd -_ZN6Magick5Image4chopERKNS_8GeometryE -_ZN6Magick5Image8colorizeEjjjRKNS_5ColorE -_ZN6Magick5Image8colorizeEjRKNS_5ColorE -_ZN6Magick5Image9compositeERKS0_iiN9MagickLib17CompositeOperatorE -_ZN6Magick5Image9compositeERKS0_RKNS_8GeometryEN9MagickLib17CompositeOperatorE -_ZN6Magick5Image9compositeERKS0_N9MagickLib11GravityTypeENS3_17CompositeOperatorE -_ZN6Magick5Image8contrastEj -_ZN6Magick5Image8convolveEjPKd -_ZN6Magick5Image4cropERKNS_8GeometryE -_ZN6Magick5Image13cycleColormapEi -_ZN6Magick5Image9despeckleEv -_ZN6Magick5Image7displayEv -_ZN6Magick5Image4drawERKNS_8DrawableE -_ZN6Magick5Image4drawERKSt4listINS_8DrawableESaIS2_EE -_ZN6Magick5Image4edgeEd -_ZN6Magick5Image6embossEdd -_ZN6Magick5Image7enhanceEv -_ZN6Magick5Image8equalizeEv -_ZN6Magick5Image5eraseEv -_ZN6Magick5Image4flipEv -_ZN6Magick5Image14floodFillColorEjjRKNS_5ColorE -_ZN6Magick5Image14floodFillColorERKNS_8GeometryERKNS_5ColorE -_ZN6Magick5Image14floodFillColorEjjRKNS_5ColorES3_ -_ZN6Magick5Image14floodFillColorERKNS_8GeometryERKNS_5ColorES6_ -_ZN6Magick5Image16floodFillOpacityEjjjN9MagickLib11PaintMethodE -_ZN6Magick5Image16floodFillTextureEjjRKS0_ -_ZN6Magick5Image16floodFillTextureERKNS_8GeometryERKS0_ -_ZN6Magick5Image16floodFillTextureEjjRKS0_RKNS_5ColorE -_ZN6Magick5Image16floodFillTextureERKNS_8GeometryERKS0_RKNS_5ColorE -_ZN6Magick5Image4flopEv -_ZN6Magick5Image5frameERKNS_8GeometryE -_ZN6Magick5Image5frameEjjii -_ZN6Magick5Image5gammaEd -_ZN6Magick5Image5gammaEddd -_ZN6Magick5Image12gaussianBlurEdd -_ZN6Magick5Image7implodeEd -_ZN6Magick5Image7magnifyEv -_ZN6Magick5Image3mapERKS0_b -_ZN6Magick5Image14matteFloodfillERKNS_5ColorEjiiN9MagickLib11PaintMethodE -_ZN6Magick5Image12medianFilterEd -_ZN6Magick5Image6minifyEv -_ZN6Magick5Image8modulateEddd -_ZN6Magick5Image6negateEb -_ZN6Magick5Image9normalizeEv -_ZN6Magick5Image8oilPaintEd -_ZN6Magick5Image7opacityEj -_ZN6Magick5Image6opaqueERKNS_5ColorES3_ -_ZN6Magick5Image4pingERKSs -_ZN6Magick5Image4pingERKNS_4BlobE -_ZN6Magick5Image8quantizeEb -_ZN6Magick5Image5raiseERKNS_8GeometryEb -_ZN6Magick5Image4readERKSs -_ZN6Magick5Image4readERKNS_8GeometryERKSs -_ZN6Magick5Image4readERKNS_4BlobE -_ZN6Magick5Image4readERKNS_4BlobERKNS_8GeometryE -_ZN6Magick5Image4readERKNS_4BlobERKNS_8GeometryEj -_ZN6Magick5Image4readERKNS_4BlobERKNS_8GeometryEjRKSs -_ZN6Magick5Image4readERKNS_4BlobERKNS_8GeometryERKSs -_ZN6Magick5Image4readEjjRKSsN9MagickLib11StorageTypeEPKv -_ZN6Magick5Image11reduceNoiseEd -_ZN6Magick5Image4rollERKNS_8GeometryE -_ZN6Magick5Image4rollEjj -_ZN6Magick5Image6rotateEd -_ZN6Magick5Image6sampleERKNS_8GeometryE -_ZN6Magick5Image5scaleERKNS_8GeometryE -_ZN6Magick5Image7segmentEdd -_ZN6Magick5Image5shadeEddb -_ZN6Magick5Image7sharpenEdd -_ZN6Magick5Image5shaveERKNS_8GeometryE -_ZN6Magick5Image5shearEdd -_ZN6Magick5Image8solarizeEd -_ZN6Magick5Image6spreadEj -_ZN6Magick5Image7steganoERKS0_ -_ZN6Magick5Image6stereoERKS0_ -_ZN6Magick5Image5swirlEd -_ZN6Magick5Image7textureERKS0_ -_ZN6Magick5Image9thresholdEd -_ZN6Magick5Image9transformERKNS_8GeometryE -_ZN6Magick5Image9transformERKNS_8GeometryES3_ -_ZN6Magick5Image11transparentERKNS_5ColorE -_ZN6Magick5Image4trimEv -_ZN6Magick5Image11unsharpmaskEdddd -_ZN6Magick5Image4waveEdd -_ZN6Magick5Image5writeERKSs -_ZN6Magick5Image5writeEPNS_4BlobE -_ZN6Magick5Image5writeEPNS_4BlobERKSs -_ZN6Magick5Image5writeEPNS_4BlobERKSsj -_ZN6Magick5Image5writeEiijjRKSsN9MagickLib11StorageTypeEPv -_ZN6Magick5Image4zoomERKNS_8GeometryE -_ZN6Magick5Image6adjoinEb -_ZNK6Magick5Image6adjoinEv -_ZN6Magick5Image9antiAliasEb -_ZN6Magick5Image9antiAliasEv -_ZN6Magick5Image14animationDelayEj -_ZNK6Magick5Image14animationDelayEv -_ZN6Magick5Image19animationIterationsEj -_ZNK6Magick5Image19animationIterationsEv -_ZN6Magick5Image15backgroundColorERKNS_5ColorE -_ZNK6Magick5Image15backgroundColorEv -_ZN6Magick5Image17backgroundTextureERKSs -_ZNK6Magick5Image17backgroundTextureEv -_ZNK6Magick5Image11baseColumnsEv -_ZNK6Magick5Image12baseFilenameEv -_ZNK6Magick5Image8baseRowsEv -_ZN6Magick5Image11borderColorERKNS_5ColorE -_ZNK6Magick5Image11borderColorEv -_ZNK6Magick5Image11boundingBoxEv -_ZN6Magick5Image8boxColorERKNS_5ColorE -_ZNK6Magick5Image8boxColorEv -_ZN6Magick5Image14cacheThresholdEj -_ZN6Magick5Image17chromaBluePrimaryEdd -_ZNK6Magick5Image17chromaBluePrimaryEPdS1_ -_ZN6Magick5Image18chromaGreenPrimaryEdd -_ZNK6Magick5Image18chromaGreenPrimaryEPdS1_ -_ZN6Magick5Image16chromaRedPrimaryEdd -_ZNK6Magick5Image16chromaRedPrimaryEPdS1_ -_ZN6Magick5Image16chromaWhitePointEdd -_ZNK6Magick5Image16chromaWhitePointEPdS1_ -_ZN6Magick5Image9classTypeEN9MagickLib9ClassTypeE -_ZN6Magick5Image8clipMaskERKS0_ -_ZNK6Magick5Image8clipMaskEv -_ZN6Magick5Image9colorFuzzEd -_ZNK6Magick5Image9colorFuzzEv -_ZN6Magick5Image8colorMapEjRKNS_5ColorE -_ZNK6Magick5Image8colorMapEj -_ZN6Magick5Image10colorSpaceEN9MagickLib14ColorspaceTypeE -_ZNK6Magick5Image10colorSpaceEv -_ZN6Magick5Image7commentERKSs -_ZNK6Magick5Image7commentEv -_ZN6Magick5Image12compressTypeEN9MagickLib15CompressionTypeE -_ZNK6Magick5Image12compressTypeEv -_ZN6Magick5Image5debugEb -_ZNK6Magick5Image5debugEv -_ZN6Magick5Image7densityERKNS_8GeometryE -_ZNK6Magick5Image7densityEv -_ZN6Magick5Image5depthEj -_ZNK6Magick5Image5depthEv -_ZNK6Magick5Image9directoryEv -_ZN6Magick5Image6endianEN9MagickLib10EndianTypeE -_ZNK6Magick5Image6endianEv -_ZN6Magick5Image8fileNameERKSs -_ZNK6Magick5Image8fileNameEv -_ZNK6Magick5Image8fileSizeEv -_ZN6Magick5Image9fillColorERKNS_5ColorE -_ZNK6Magick5Image9fillColorEv -_ZN6Magick5Image8fillRuleERKN9MagickLib8FillRuleE -_ZNK6Magick5Image8fillRuleEv -_ZN6Magick5Image11fillPatternERKS0_ -_ZNK6Magick5Image11fillPatternEv -_ZN6Magick5Image10filterTypeEN9MagickLib11FilterTypesE -_ZNK6Magick5Image10filterTypeEv -_ZN6Magick5Image4fontERKSs -_ZNK6Magick5Image4fontEv -_ZN6Magick5Image13fontPointsizeEd -_ZNK6Magick5Image13fontPointsizeEv -_ZN6Magick5Image15fontTypeMetricsERKSsPNS_10TypeMetricE -_ZNK6Magick5Image6formatEv -_ZNK6Magick5Image5gammaEv -_ZNK6Magick5Image8geometryEv -_ZN6Magick5Image16gifDisposeMethodEj -_ZNK6Magick5Image16gifDisposeMethodEv -_ZN6Magick5Image15iccColorProfileERKNS_4BlobE -_ZNK6Magick5Image15iccColorProfileEv -_ZN6Magick5Image13interlaceTypeEN9MagickLib13InterlaceTypeE -_ZNK6Magick5Image13interlaceTypeEv -_ZN6Magick5Image11iptcProfileERKNS_4BlobE -_ZNK6Magick5Image11iptcProfileEv -_ZN6Magick5Image7isValidEb -_ZNK6Magick5Image7isValidEv -_ZN6Magick5Image5labelERKSs -_ZNK6Magick5Image5labelEv -_ZN6Magick5Image6magickERKSs -_ZNK6Magick5Image6magickEv -_ZN6Magick5Image5matteEb -_ZNK6Magick5Image5matteEv -_ZN6Magick5Image10matteColorERKNS_5ColorE -_ZNK6Magick5Image10matteColorEv -_ZNK6Magick5Image17meanErrorPerPixelEv -_ZN6Magick5Image10monochromeEb -_ZNK6Magick5Image10monochromeEv -_ZNK6Magick5Image15montageGeometryEv -_ZNK6Magick5Image18normalizedMaxErrorEv -_ZNK6Magick5Image19normalizedMeanErrorEv -_ZN6Magick5Image8penColorERKNS_5ColorE -_ZNK6Magick5Image8penColorEv -_ZN6Magick5Image10penTextureERKS0_ -_ZNK6Magick5Image10penTextureEv -_ZN6Magick5Image10pixelColorEjjRKNS_5ColorE -_ZNK6Magick5Image10pixelColorEjj -_ZN6Magick5Image4pageERKNS_8GeometryE -_ZNK6Magick5Image4pageEv -_ZN6Magick5Image7qualityEj -_ZNK6Magick5Image7qualityEv -_ZN6Magick5Image14quantizeColorsEj -_ZNK6Magick5Image14quantizeColorsEv -_ZN6Magick5Image18quantizeColorSpaceEN9MagickLib14ColorspaceTypeE -_ZNK6Magick5Image18quantizeColorSpaceEv -_ZN6Magick5Image14quantizeDitherEb -_ZNK6Magick5Image14quantizeDitherEv -_ZN6Magick5Image17quantizeTreeDepthEj -_ZNK6Magick5Image17quantizeTreeDepthEv -_ZN6Magick5Image15renderingIntentEN9MagickLib15RenderingIntentE -_ZNK6Magick5Image15renderingIntentEv -_ZN6Magick5Image15resolutionUnitsEN9MagickLib14ResolutionTypeE -_ZNK6Magick5Image15resolutionUnitsEv -_ZN6Magick5Image5sceneEj -_ZNK6Magick5Image5sceneEv -_ZNK6Magick5Image9signatureEb -_ZN6Magick5Image4sizeERKNS_8GeometryE -_ZNK6Magick5Image4sizeEv -_ZN6Magick5Image15strokeAntiAliasEb -_ZNK6Magick5Image15strokeAntiAliasEv -_ZN6Magick5Image11strokeColorERKNS_5ColorE -_ZNK6Magick5Image11strokeColorEv -_ZN6Magick5Image15strokeDashArrayEPKd -_ZNK6Magick5Image15strokeDashArrayEv -_ZN6Magick5Image16strokeDashOffsetEd -_ZNK6Magick5Image16strokeDashOffsetEv -_ZN6Magick5Image13strokeLineCapEN9MagickLib7LineCapE -_ZNK6Magick5Image13strokeLineCapEv -_ZN6Magick5Image14strokeLineJoinEN9MagickLib8LineJoinE -_ZNK6Magick5Image14strokeLineJoinEv -_ZN6Magick5Image16strokeMiterLimitEj -_ZNK6Magick5Image16strokeMiterLimitEv -_ZN6Magick5Image13strokePatternERKS0_ -_ZNK6Magick5Image13strokePatternEv -_ZN6Magick5Image11strokeWidthEd -_ZNK6Magick5Image11strokeWidthEv -_ZN6Magick5Image8subImageEj -_ZNK6Magick5Image8subImageEv -_ZN6Magick5Image8subRangeEj -_ZNK6Magick5Image8subRangeEv -_ZN6Magick5Image8tileNameERKSs -_ZNK6Magick5Image8tileNameEv -_ZN6Magick5Image11totalColorsEv -_ZN6Magick5Image15transformOriginEdd -_ZN6Magick5Image17transformRotationEd -_ZN6Magick5Image14transformResetEv -_ZN6Magick5Image14transformScaleEdd -_ZN6Magick5Image14transformSkewXEd -_ZN6Magick5Image14transformSkewYEd -_ZNK6Magick5Image4typeEv -_ZN6Magick5Image4typeEN9MagickLib9ImageTypeE -_ZN6Magick5Image7verboseEb -_ZNK6Magick5Image7verboseEv -_ZN6Magick5Image4viewERKSs -_ZNK6Magick5Image4viewEv -_ZN6Magick5Image10x11DisplayERKSs -_ZNK6Magick5Image10x11DisplayEv -_ZNK6Magick5Image11xResolutionEv -_ZNK6Magick5Image11yResolutionEv -_ZN6Magick5ImageC2ERKS0_ -_ZN6Magick5ImageC1ERKS0_ -_ZN6Magick5ImageaSERKS0_ -_ZNK6Magick5Image14getConstPixelsEiijj -_ZNK6Magick5Image15getConstIndexesEv -_ZNK6Magick5Image10getIndexesEv -_ZN6Magick5Image9getPixelsEiijj -_ZN6Magick5Image9setPixelsEiijj -_ZN6Magick5Image10syncPixelsEv -_ZN6Magick5Image10readPixelsEN9MagickLib11QuantumTypeEPKh -_ZN6Magick5Image11writePixelsEN9MagickLib11QuantumTypeEPh -_ZN6Magick5ImageC2EPN9MagickLib6_ImageEPKNS_7OptionsE -_ZN6Magick5ImageC1EPN9MagickLib6_ImageEPKNS_7OptionsE -_ZN6Magick5Image12replaceImageEPN9MagickLib6_ImageE -_ZN6Magick5Image11modifyImageEv -_ZNK6Magick5Image19throwImageExceptionEv -_ZN6Magick5Image10registerIdEv -_ZN6Magick5Image12unregisterIdEv -_ZN6Magick8ImageRefC2EPN9MagickLib6_ImageE -_ZN6Magick8ImageRefC1EPN9MagickLib6_ImageE -_ZN6Magick8ImageRefC2EPN9MagickLib6_ImageEPKNS_7OptionsE -_ZN6Magick8ImageRefC1EPN9MagickLib6_ImageEPKNS_7OptionsE -_ZN6Magick8ImageRefC2Ev -_ZN6Magick8ImageRefC1Ev -_ZN6Magick8ImageRefD2Ev -_ZN6Magick8ImageRefD1Ev -_ZN6Magick8ImageRef5imageEPN9MagickLib6_ImageE -_ZN6Magick8ImageRef7optionsEPNS_7OptionsE -_ZN6Magick8ImageRef2idEl -_ZN6Magick13MagickCleanUpC2Ev -_ZN6Magick13MagickCleanUpC1Ev -_ZN6Magick13MagickCleanUpD2Ev -_ZN6Magick13MagickCleanUpD1Ev -_Z41__static_initialization_and_destruction_0ii -_ZN6Magick7MontageC2Ev -_ZN6Magick7MontageC1Ev -_ZN6Magick13MontageFramedC2Ev -_ZN6Magick13MontageFramedC1Ev -_ZNK6Magick7Montage17updateMontageInfoERN9MagickLib12_MontageInfoE -_ZNK6Magick13MontageFramed17updateMontageInfoERN9MagickLib12_MontageInfoE -_ZN6Magick7MontageD1Ev -_ZN6Magick7MontageD0Ev -_ZN6Magick13MontageFramedD1Ev -_ZN6Magick13MontageFramedD0Ev -_ZN6Magick7OptionsC2Ev -_ZN6Magick7OptionsC1Ev -_ZN6Magick7OptionsC2ERKS0_ -_ZN6Magick7OptionsC1ERKS0_ -_ZN6Magick7OptionsC2EPKN9MagickLib10_ImageInfoEPKNS1_13_QuantizeInfoEPKNS1_9_DrawInfoE -_ZN6Magick7OptionsC1EPKN9MagickLib10_ImageInfoEPKNS1_13_QuantizeInfoEPKNS1_9_DrawInfoE -_ZN6Magick7OptionsD2Ev -_ZN6Magick7OptionsD1Ev -_ZN6Magick7Options15backgroundColorERKNS_5ColorE -_ZNK6Magick7Options15backgroundColorEv -_ZN6Magick7Options17backgroundTextureERKSs -_ZNK6Magick7Options17backgroundTextureEv -_ZN6Magick7Options11borderColorERKNS_5ColorE -_ZNK6Magick7Options11borderColorEv -_ZN6Magick7Options8boxColorERKNS_5ColorE -_ZNK6Magick7Options8boxColorEv -_ZN6Magick7Options5debugEb -_ZNK6Magick7Options5debugEv -_ZN6Magick7Options7densityERKNS_8GeometryE -_ZNK6Magick7Options7densityEv -_ZN6Magick7Options6endianEN9MagickLib10EndianTypeE -_ZNK6Magick7Options6endianEv -_ZN6Magick7Options8fileNameERKSs -_ZNK6Magick7Options8fileNameEv -_ZN6Magick7Options9fillColorERKNS_5ColorE -_ZNK6Magick7Options9fillColorEv -_ZN6Magick7Options11fillPatternEPKN9MagickLib6_ImageE -_ZNK6Magick7Options11fillPatternEv -_ZN6Magick7Options8fillRuleERKN9MagickLib8FillRuleE -_ZNK6Magick7Options8fillRuleEv -_ZN6Magick7Options4fontERKSs -_ZNK6Magick7Options4fontEv -_ZNK6Magick7Options6formatEv -_ZN6Magick7Options6magickERKSs -_ZNK6Magick7Options6magickEv -_ZN6Magick7Options10matteColorERKNS_5ColorE -_ZNK6Magick7Options10matteColorEv -_ZN6Magick7Options4pageERKNS_8GeometryE -_ZNK6Magick7Options4pageEv -_ZN6Magick7Options15resolutionUnitsEN9MagickLib14ResolutionTypeE -_ZNK6Magick7Options15resolutionUnitsEv -_ZN6Magick7Options4sizeERKNS_8GeometryE -_ZNK6Magick7Options4sizeEv -_ZN6Magick7Options11strokeColorERKNS_5ColorE -_ZNK6Magick7Options11strokeColorEv -_ZN6Magick7Options15strokeDashArrayEPKd -_ZNK6Magick7Options15strokeDashArrayEv -_ZN6Magick7Options13strokePatternEPKN9MagickLib6_ImageE -_ZNK6Magick7Options13strokePatternEv -_ZN6Magick7Options8tileNameERKSs -_ZNK6Magick7Options8tileNameEv -_ZN6Magick7Options15transformOriginEdd -_ZN6Magick7Options14transformResetEv -_ZN6Magick7Options17transformRotationEd -_ZN6Magick7Options14transformScaleEdd -_ZN6Magick7Options14transformSkewXEd -_ZN6Magick7Options14transformSkewYEd -_ZN6Magick7Options4viewERKSs -_ZNK6Magick7Options4viewEv -_ZN6Magick7Options10x11DisplayERKSs -_ZNK6Magick7Options10x11DisplayEv -_ZN6Magick6PixelsC2ERNS_5ImageE -_ZN6Magick6PixelsC1ERNS_5ImageE -_ZN6Magick6PixelsD2Ev -_ZN6Magick6PixelsD1Ev -_ZN6Magick6Pixels3getEiijj -_ZN6Magick6Pixels8getConstEiijj -_ZN6Magick6Pixels4syncEv -_ZN6Magick6Pixels3setEiijj -_ZN6Magick6Pixels7indexesEv -_ZN6Magick13addNoiseImageC2EN9MagickLib9NoiseTypeE -_ZN6Magick13addNoiseImageC1EN9MagickLib9NoiseTypeE -_ZNK6Magick13addNoiseImageclERNS_5ImageE -_ZN6Magick13annotateImageC2ERKSsRKNS_8GeometryE -_ZN6Magick13annotateImageC1ERKSsRKNS_8GeometryE -_ZN6Magick13annotateImageC2ERKSsRKNS_8GeometryEN9MagickLib11GravityTypeE -_ZN6Magick13annotateImageC1ERKSsRKNS_8GeometryEN9MagickLib11GravityTypeE -_ZN6Magick13annotateImageC2ERKSsRKNS_8GeometryEN9MagickLib11GravityTypeEd -_ZN6Magick13annotateImageC1ERKSsRKNS_8GeometryEN9MagickLib11GravityTypeEd -_ZN6Magick13annotateImageC2ERKSsN9MagickLib11GravityTypeE -_ZN6Magick13annotateImageC1ERKSsN9MagickLib11GravityTypeE -_ZNK6Magick13annotateImageclERNS_5ImageE -_ZN6Magick9blurImageC2Edd -_ZN6Magick9blurImageC1Edd -_ZNK6Magick9blurImageclERNS_5ImageE -_ZN6Magick11borderImageC2ERKNS_8GeometryE -_ZN6Magick11borderImageC1ERKNS_8GeometryE -_ZNK6Magick11borderImageclERNS_5ImageE -_ZN6Magick13charcoalImageC2Edd -_ZN6Magick13charcoalImageC1Edd -_ZNK6Magick13charcoalImageclERNS_5ImageE -_ZN6Magick9chopImageC2ERKNS_8GeometryE -_ZN6Magick9chopImageC1ERKNS_8GeometryE -_ZNK6Magick9chopImageclERNS_5ImageE -_ZN6Magick13colorizeImageC2EjjjRKNS_5ColorE -_ZN6Magick13colorizeImageC1EjjjRKNS_5ColorE -_ZN6Magick13colorizeImageC2EjRKNS_5ColorE -_ZN6Magick13colorizeImageC1EjRKNS_5ColorE -_ZNK6Magick13colorizeImageclERNS_5ImageE -_ZN6Magick15colorSpaceImageC2EN9MagickLib14ColorspaceTypeE -_ZN6Magick15colorSpaceImageC1EN9MagickLib14ColorspaceTypeE -_ZNK6Magick15colorSpaceImageclERNS_5ImageE -_ZN6Magick12commentImageC2ERKSs -_ZN6Magick12commentImageC1ERKSs -_ZNK6Magick12commentImageclERNS_5ImageE -_ZN6Magick14compositeImageC2ERKNS_5ImageEiiN9MagickLib17CompositeOperatorE -_ZN6Magick14compositeImageC1ERKNS_5ImageEiiN9MagickLib17CompositeOperatorE -_ZN6Magick14compositeImageC2ERKNS_5ImageERKNS_8GeometryEN9MagickLib17CompositeOperatorE -_ZN6Magick14compositeImageC1ERKNS_5ImageERKNS_8GeometryEN9MagickLib17CompositeOperatorE -_ZNK6Magick14compositeImageclERNS_5ImageE -_ZN6Magick13contrastImageC2Ej -_ZN6Magick13contrastImageC1Ej -_ZNK6Magick13contrastImageclERNS_5ImageE -_ZN6Magick9cropImageC2ERKNS_8GeometryE -_ZN6Magick9cropImageC1ERKNS_8GeometryE -_ZNK6Magick9cropImageclERNS_5ImageE -_ZN6Magick18cycleColormapImageC2Ei -_ZN6Magick18cycleColormapImageC1Ei -_ZNK6Magick18cycleColormapImageclERNS_5ImageE -_ZN6Magick14despeckleImageC2Ev -_ZN6Magick14despeckleImageC1Ev -_ZNK6Magick14despeckleImageclERNS_5ImageE -_ZN6Magick9drawImageC2ERKNS_8DrawableE -_ZN6Magick9drawImageC1ERKNS_8DrawableE -_ZN6Magick9drawImageC2ERKSt4listINS_8DrawableESaIS2_EE -_ZN6Magick9drawImageC1ERKSt4listINS_8DrawableESaIS2_EE -_ZNK6Magick9drawImageclERNS_5ImageE -_ZN6Magick9edgeImageC2Ed -_ZN6Magick9edgeImageC1Ed -_ZNK6Magick9edgeImageclERNS_5ImageE -_ZN6Magick11embossImageC2Ev -_ZN6Magick11embossImageC1Ev -_ZN6Magick11embossImageC2Edd -_ZN6Magick11embossImageC1Edd -_ZNK6Magick11embossImageclERNS_5ImageE -_ZN6Magick12enhanceImageC2Ev -_ZN6Magick12enhanceImageC1Ev -_ZNK6Magick12enhanceImageclERNS_5ImageE -_ZN6Magick13equalizeImageC2Ev -_ZN6Magick13equalizeImageC1Ev -_ZNK6Magick13equalizeImageclERNS_5ImageE -_ZN6Magick14fillColorImageC2ERKNS_5ColorE -_ZN6Magick14fillColorImageC1ERKNS_5ColorE -_ZNK6Magick14fillColorImageclERNS_5ImageE -_ZN6Magick9flipImageC2Ev -_ZN6Magick9flipImageC1Ev -_ZNK6Magick9flipImageclERNS_5ImageE -_ZN6Magick19floodFillColorImageC2EjjRKNS_5ColorE -_ZN6Magick19floodFillColorImageC1EjjRKNS_5ColorE -_ZN6Magick19floodFillColorImageC2ERKNS_8GeometryERKNS_5ColorE -_ZN6Magick19floodFillColorImageC1ERKNS_8GeometryERKNS_5ColorE -_ZN6Magick19floodFillColorImageC2EjjRKNS_5ColorES3_ -_ZN6Magick19floodFillColorImageC1EjjRKNS_5ColorES3_ -_ZN6Magick19floodFillColorImageC2ERKNS_8GeometryERKNS_5ColorES6_ -_ZN6Magick19floodFillColorImageC1ERKNS_8GeometryERKNS_5ColorES6_ -_ZNK6Magick19floodFillColorImageclERNS_5ImageE -_ZN6Magick21floodFillTextureImageC2EjjRKNS_5ImageE -_ZN6Magick21floodFillTextureImageC1EjjRKNS_5ImageE -_ZN6Magick21floodFillTextureImageC2ERKNS_8GeometryERKNS_5ImageE -_ZN6Magick21floodFillTextureImageC1ERKNS_8GeometryERKNS_5ImageE -_ZN6Magick21floodFillTextureImageC2EjjRKNS_5ImageERKNS_5ColorE -_ZN6Magick21floodFillTextureImageC1EjjRKNS_5ImageERKNS_5ColorE -_ZN6Magick21floodFillTextureImageC2ERKNS_8GeometryERKNS_5ImageERKNS_5ColorE -_ZN6Magick21floodFillTextureImageC1ERKNS_8GeometryERKNS_5ImageERKNS_5ColorE -_ZNK6Magick21floodFillTextureImageclERNS_5ImageE -_ZN6Magick9flopImageC2Ev -_ZN6Magick9flopImageC1Ev -_ZNK6Magick9flopImageclERNS_5ImageE -_ZN6Magick10frameImageC2ERKNS_8GeometryE -_ZN6Magick10frameImageC1ERKNS_8GeometryE -_ZN6Magick10frameImageC2Ejjii -_ZN6Magick10frameImageC1Ejjii -_ZNK6Magick10frameImageclERNS_5ImageE -_ZN6Magick10gammaImageC2Ed -_ZN6Magick10gammaImageC1Ed -_ZN6Magick10gammaImageC2Eddd -_ZN6Magick10gammaImageC1Eddd -_ZNK6Magick10gammaImageclERNS_5ImageE -_ZN6Magick17gaussianBlurImageC2Edd -_ZN6Magick17gaussianBlurImageC1Edd -_ZNK6Magick17gaussianBlurImageclERNS_5ImageE -_ZN6Magick12implodeImageC2Ed -_ZN6Magick12implodeImageC1Ed -_ZNK6Magick12implodeImageclERNS_5ImageE -_ZN6Magick12isValidImageC2Eb -_ZN6Magick12isValidImageC1Eb -_ZNK6Magick12isValidImageclERNS_5ImageE -_ZN6Magick10labelImageC2ERKSs -_ZN6Magick10labelImageC1ERKSs -_ZNK6Magick10labelImageclERNS_5ImageE -_ZN6Magick12channelImageC2EN9MagickLib11ChannelTypeE -_ZN6Magick12channelImageC1EN9MagickLib11ChannelTypeE -_ZNK6Magick12channelImageclERNS_5ImageE -_ZN6Magick12magnifyImageC2Ev -_ZN6Magick12magnifyImageC1Ev -_ZNK6Magick12magnifyImageclERNS_5ImageE -_ZN6Magick8mapImageC2ERKNS_5ImageEb -_ZN6Magick8mapImageC1ERKNS_5ImageEb -_ZNK6Magick8mapImageclERNS_5ImageE -_ZN6Magick19matteFloodfillImageC2ERKNS_5ColorEjiiN9MagickLib11PaintMethodE -_ZN6Magick19matteFloodfillImageC1ERKNS_5ColorEjiiN9MagickLib11PaintMethodE -_ZNK6Magick19matteFloodfillImageclERNS_5ImageE -_ZN6Magick17medianFilterImageC2Ed -_ZN6Magick17medianFilterImageC1Ed -_ZNK6Magick17medianFilterImageclERNS_5ImageE -_ZN6Magick11minifyImageC2Ev -_ZN6Magick11minifyImageC1Ev -_ZNK6Magick11minifyImageclERNS_5ImageE -_ZN6Magick13modulateImageC2Eddd -_ZN6Magick13modulateImageC1Eddd -_ZNK6Magick13modulateImageclERNS_5ImageE -_ZN6Magick11negateImageC2Eb -_ZN6Magick11negateImageC1Eb -_ZNK6Magick11negateImageclERNS_5ImageE -_ZN6Magick14normalizeImageC2Ev -_ZN6Magick14normalizeImageC1Ev -_ZNK6Magick14normalizeImageclERNS_5ImageE -_ZN6Magick13oilPaintImageC2Ed -_ZN6Magick13oilPaintImageC1Ed -_ZNK6Magick13oilPaintImageclERNS_5ImageE -_ZN6Magick12opacityImageC2Ej -_ZN6Magick12opacityImageC1Ej -_ZNK6Magick12opacityImageclERNS_5ImageE -_ZN6Magick11opaqueImageC2ERKNS_5ColorES3_ -_ZN6Magick11opaqueImageC1ERKNS_5ColorES3_ -_ZNK6Magick11opaqueImageclERNS_5ImageE -_ZN6Magick13quantizeImageC2Eb -_ZN6Magick13quantizeImageC1Eb -_ZNK6Magick13quantizeImageclERNS_5ImageE -_ZN6Magick10raiseImageC2ERKNS_8GeometryEb -_ZN6Magick10raiseImageC1ERKNS_8GeometryEb -_ZNK6Magick10raiseImageclERNS_5ImageE -_ZN6Magick16reduceNoiseImageC2Ev -_ZN6Magick16reduceNoiseImageC1Ev -_ZN6Magick16reduceNoiseImageC2Ej -_ZN6Magick16reduceNoiseImageC1Ej -_ZNK6Magick16reduceNoiseImageclERNS_5ImageE -_ZN6Magick9rollImageC2ERKNS_8GeometryE -_ZN6Magick9rollImageC1ERKNS_8GeometryE -_ZN6Magick9rollImageC2Eii -_ZN6Magick9rollImageC1Eii -_ZNK6Magick9rollImageclERNS_5ImageE -_ZN6Magick11rotateImageC2Ed -_ZN6Magick11rotateImageC1Ed -_ZNK6Magick11rotateImageclERNS_5ImageE -_ZN6Magick11sampleImageC2ERKNS_8GeometryE -_ZN6Magick11sampleImageC1ERKNS_8GeometryE -_ZNK6Magick11sampleImageclERNS_5ImageE -_ZN6Magick10scaleImageC2ERKNS_8GeometryE -_ZN6Magick10scaleImageC1ERKNS_8GeometryE -_ZNK6Magick10scaleImageclERNS_5ImageE -_ZN6Magick12segmentImageC2Edd -_ZN6Magick12segmentImageC1Edd -_ZNK6Magick12segmentImageclERNS_5ImageE -_ZN6Magick10shadeImageC2Edd -_ZN6Magick10shadeImageC1Edd -_ZNK6Magick10shadeImageclERNS_5ImageE -_ZN6Magick12sharpenImageC2Edd -_ZN6Magick12sharpenImageC1Edd -_ZNK6Magick12sharpenImageclERNS_5ImageE -_ZN6Magick10shaveImageC2ERKNS_8GeometryE -_ZN6Magick10shaveImageC1ERKNS_8GeometryE -_ZNK6Magick10shaveImageclERNS_5ImageE -_ZN6Magick10shearImageC2Edd -_ZN6Magick10shearImageC1Edd -_ZNK6Magick10shearImageclERNS_5ImageE -_ZN6Magick13solarizeImageC2Ed -_ZN6Magick13solarizeImageC1Ed -_ZNK6Magick13solarizeImageclERNS_5ImageE -_ZN6Magick11spreadImageC2Ej -_ZN6Magick11spreadImageC1Ej -_ZNK6Magick11spreadImageclERNS_5ImageE -_ZN6Magick12steganoImageC2ERKNS_5ImageE -_ZN6Magick12steganoImageC1ERKNS_5ImageE -_ZNK6Magick12steganoImageclERNS_5ImageE -_ZN6Magick11stereoImageC2ERKNS_5ImageE -_ZN6Magick11stereoImageC1ERKNS_5ImageE -_ZNK6Magick11stereoImageclERNS_5ImageE -_ZN6Magick16strokeColorImageC2ERKNS_5ColorE -_ZN6Magick16strokeColorImageC1ERKNS_5ColorE -_ZNK6Magick16strokeColorImageclERNS_5ImageE -_ZN6Magick10swirlImageC2Ed -_ZN6Magick10swirlImageC1Ed -_ZNK6Magick10swirlImageclERNS_5ImageE -_ZN6Magick12textureImageC2ERKNS_5ImageE -_ZN6Magick12textureImageC1ERKNS_5ImageE -_ZNK6Magick12textureImageclERNS_5ImageE -_ZN6Magick14thresholdImageC2Ed -_ZN6Magick14thresholdImageC1Ed -_ZNK6Magick14thresholdImageclERNS_5ImageE -_ZN6Magick14transformImageC2ERKNS_8GeometryE -_ZN6Magick14transformImageC1ERKNS_8GeometryE -_ZN6Magick14transformImageC2ERKNS_8GeometryES3_ -_ZN6Magick14transformImageC1ERKNS_8GeometryES3_ -_ZNK6Magick14transformImageclERNS_5ImageE -_ZN6Magick16transparentImageC2ERKNS_5ColorE -_ZN6Magick16transparentImageC1ERKNS_5ColorE -_ZNK6Magick16transparentImageclERNS_5ImageE -_ZN6Magick9trimImageC2Ev -_ZN6Magick9trimImageC1Ev -_ZNK6Magick9trimImageclERNS_5ImageE -_ZN6Magick9waveImageC2Edd -_ZN6Magick9waveImageC1Edd -_ZNK6Magick9waveImageclERNS_5ImageE -_ZN6Magick9zoomImageC2ERKNS_8GeometryE -_ZN6Magick9zoomImageC1ERKNS_8GeometryE -_ZNK6Magick9zoomImageclERNS_5ImageE -_ZN6Magick14antiAliasImageC2Eb -_ZN6Magick14antiAliasImageC1Eb -_ZNK6Magick14antiAliasImageclERNS_5ImageE -_ZN6Magick11adjoinImageC2Eb -_ZN6Magick11adjoinImageC1Eb -_ZNK6Magick11adjoinImageclERNS_5ImageE -_ZN6Magick19animationDelayImageC2Ej -_ZN6Magick19animationDelayImageC1Ej -_ZNK6Magick19animationDelayImageclERNS_5ImageE -_ZN6Magick24animationIterationsImageC2Ej -_ZN6Magick24animationIterationsImageC1Ej -_ZNK6Magick24animationIterationsImageclERNS_5ImageE -_ZN6Magick20backgroundColorImageC2ERKNS_5ColorE -_ZN6Magick20backgroundColorImageC1ERKNS_5ColorE -_ZNK6Magick20backgroundColorImageclERNS_5ImageE -_ZN6Magick22backgroundTextureImageC2ERKSs -_ZN6Magick22backgroundTextureImageC1ERKSs -_ZNK6Magick22backgroundTextureImageclERNS_5ImageE -_ZN6Magick16borderColorImageC2ERKNS_5ColorE -_ZN6Magick16borderColorImageC1ERKNS_5ColorE -_ZNK6Magick16borderColorImageclERNS_5ImageE -_ZN6Magick13boxColorImageC2ERKNS_5ColorE -_ZN6Magick13boxColorImageC1ERKNS_5ColorE -_ZNK6Magick13boxColorImageclERNS_5ImageE -_ZN6Magick22chromaBluePrimaryImageC2Edd -_ZN6Magick22chromaBluePrimaryImageC1Edd -_ZNK6Magick22chromaBluePrimaryImageclERNS_5ImageE -_ZN6Magick23chromaGreenPrimaryImageC2Edd -_ZN6Magick23chromaGreenPrimaryImageC1Edd -_ZNK6Magick23chromaGreenPrimaryImageclERNS_5ImageE -_ZN6Magick21chromaRedPrimaryImageC2Edd -_ZN6Magick21chromaRedPrimaryImageC1Edd -_ZNK6Magick21chromaRedPrimaryImageclERNS_5ImageE -_ZN6Magick21chromaWhitePointImageC2Edd -_ZN6Magick21chromaWhitePointImageC1Edd -_ZNK6Magick21chromaWhitePointImageclERNS_5ImageE -_ZN6Magick14colorFuzzImageC2Ed -_ZN6Magick14colorFuzzImageC1Ed -_ZNK6Magick14colorFuzzImageclERNS_5ImageE -_ZN6Magick13colorMapImageC2EjRKNS_5ColorE -_ZN6Magick13colorMapImageC1EjRKNS_5ColorE -_ZNK6Magick13colorMapImageclERNS_5ImageE -_ZN6Magick17compressTypeImageC2EN9MagickLib15CompressionTypeE -_ZN6Magick17compressTypeImageC1EN9MagickLib15CompressionTypeE -_ZNK6Magick17compressTypeImageclERNS_5ImageE -_ZN6Magick12densityImageC2ERKNS_8GeometryE -_ZN6Magick12densityImageC1ERKNS_8GeometryE -_ZNK6Magick12densityImageclERNS_5ImageE -_ZN6Magick10depthImageC2Ej -_ZN6Magick10depthImageC1Ej -_ZNK6Magick10depthImageclERNS_5ImageE -_ZN6Magick11endianImageC2EN9MagickLib10EndianTypeE -_ZN6Magick11endianImageC1EN9MagickLib10EndianTypeE -_ZNK6Magick11endianImageclERNS_5ImageE -_ZN6Magick13fileNameImageC2ERKSs -_ZN6Magick13fileNameImageC1ERKSs -_ZNK6Magick13fileNameImageclERNS_5ImageE -_ZN6Magick15filterTypeImageC2EN9MagickLib11FilterTypesE -_ZN6Magick15filterTypeImageC1EN9MagickLib11FilterTypesE -_ZNK6Magick15filterTypeImageclERNS_5ImageE -_ZN6Magick9fontImageC2ERKSs -_ZN6Magick9fontImageC1ERKSs -_ZNK6Magick9fontImageclERNS_5ImageE -_ZN6Magick18fontPointsizeImageC2Ej -_ZN6Magick18fontPointsizeImageC1Ej -_ZNK6Magick18fontPointsizeImageclERNS_5ImageE -_ZN6Magick21gifDisposeMethodImageC2Ej -_ZN6Magick21gifDisposeMethodImageC1Ej -_ZNK6Magick21gifDisposeMethodImageclERNS_5ImageE -_ZN6Magick18interlaceTypeImageC2EN9MagickLib13InterlaceTypeE -_ZN6Magick18interlaceTypeImageC1EN9MagickLib13InterlaceTypeE -_ZNK6Magick18interlaceTypeImageclERNS_5ImageE -_ZN6Magick14lineWidthImageC2Ed -_ZN6Magick14lineWidthImageC1Ed -_ZNK6Magick14lineWidthImageclERNS_5ImageE -_ZN6Magick11magickImageC2ERKSs -_ZN6Magick11magickImageC1ERKSs -_ZNK6Magick11magickImageclERNS_5ImageE -_ZN6Magick10matteImageC2Eb -_ZN6Magick10matteImageC1Eb -_ZNK6Magick10matteImageclERNS_5ImageE -_ZN6Magick15matteColorImageC2ERKNS_5ColorE -_ZN6Magick15matteColorImageC1ERKNS_5ColorE -_ZNK6Magick15matteColorImageclERNS_5ImageE -_ZN6Magick15monochromeImageC2Eb -_ZN6Magick15monochromeImageC1Eb -_ZNK6Magick15monochromeImageclERNS_5ImageE -_ZN6Magick13penColorImageC2ERKNS_5ColorE -_ZN6Magick13penColorImageC1ERKNS_5ColorE -_ZNK6Magick13penColorImageclERNS_5ImageE -_ZN6Magick15penTextureImageC2ERKNS_5ImageE -_ZN6Magick15penTextureImageC1ERKNS_5ImageE -_ZNK6Magick15penTextureImageclERNS_5ImageE -_ZN6Magick15pixelColorImageC2EjjRKNS_5ColorE -_ZN6Magick15pixelColorImageC1EjjRKNS_5ColorE -_ZNK6Magick15pixelColorImageclERNS_5ImageE -_ZN6Magick9pageImageC2ERKNS_8GeometryE -_ZN6Magick9pageImageC1ERKNS_8GeometryE -_ZNK6Magick9pageImageclERNS_5ImageE -_ZN6Magick12qualityImageC2Ej -_ZN6Magick12qualityImageC1Ej -_ZNK6Magick12qualityImageclERNS_5ImageE -_ZN6Magick19quantizeColorsImageC2Ej -_ZN6Magick19quantizeColorsImageC1Ej -_ZNK6Magick19quantizeColorsImageclERNS_5ImageE -_ZN6Magick23quantizeColorSpaceImageC2EN9MagickLib14ColorspaceTypeE -_ZN6Magick23quantizeColorSpaceImageC1EN9MagickLib14ColorspaceTypeE -_ZNK6Magick23quantizeColorSpaceImageclERNS_5ImageE -_ZN6Magick19quantizeDitherImageC2Eb -_ZN6Magick19quantizeDitherImageC1Eb -_ZNK6Magick19quantizeDitherImageclERNS_5ImageE -_ZN6Magick22quantizeTreeDepthImageC2Ej -_ZN6Magick22quantizeTreeDepthImageC1Ej -_ZNK6Magick22quantizeTreeDepthImageclERNS_5ImageE -_ZN6Magick20renderingIntentImageC2EN9MagickLib15RenderingIntentE -_ZN6Magick20renderingIntentImageC1EN9MagickLib15RenderingIntentE -_ZNK6Magick20renderingIntentImageclERNS_5ImageE -_ZN6Magick20resolutionUnitsImageC2EN9MagickLib14ResolutionTypeE -_ZN6Magick20resolutionUnitsImageC1EN9MagickLib14ResolutionTypeE -_ZNK6Magick20resolutionUnitsImageclERNS_5ImageE -_ZN6Magick10sceneImageC2Ej -_ZN6Magick10sceneImageC1Ej -_ZNK6Magick10sceneImageclERNS_5ImageE -_ZN6Magick9sizeImageC2ERKNS_8GeometryE -_ZN6Magick9sizeImageC1ERKNS_8GeometryE -_ZNK6Magick9sizeImageclERNS_5ImageE -_ZN6Magick13subImageImageC2Ej -_ZN6Magick13subImageImageC1Ej -_ZNK6Magick13subImageImageclERNS_5ImageE -_ZN6Magick13subRangeImageC2Ej -_ZN6Magick13subRangeImageC1Ej -_ZNK6Magick13subRangeImageclERNS_5ImageE -_ZN6Magick13tileNameImageC2ERKSs -_ZN6Magick13tileNameImageC1ERKSs -_ZNK6Magick13tileNameImageclERNS_5ImageE -_ZN6Magick9typeImageC2EN9MagickLib9ImageTypeE -_ZN6Magick9typeImageC1EN9MagickLib9ImageTypeE -_ZNK6Magick9typeImageclERNS_5ImageE -_ZN6Magick12verboseImageC2Eb -_ZN6Magick12verboseImageC1Eb -_ZNK6Magick12verboseImageclERNS_5ImageE -_ZN6Magick9viewImageC2ERKSs -_ZN6Magick9viewImageC1ERKSs -_ZNK6Magick9viewImageclERNS_5ImageE -_ZN6Magick15x11DisplayImageC2ERKSs -_ZN6Magick15x11DisplayImageC1ERKSs -_ZNK6Magick15x11DisplayImageclERNS_5ImageE -_ZNSt10_List_baseIN6Magick8DrawableESaIS1_EE5clearEv -_ZNSt4listIN6Magick8DrawableESaIS1_EE18_M_insert_dispatchISt14_List_iteratorIS1_RKS1_PS6_EEEvS5_IS1_RS1_PS1_ET_SD_12__false_type -_ZNSt10_List_baseIN6Magick8DrawableESaIS1_EED2Ev -_ZNSt14__simple_allocISt10_List_nodeIN6Magick8DrawableEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS3_j -_ZNSt4listIN6Magick8DrawableESaIS1_EE14_M_create_nodeERKS1_ -_ZN6Magick9MutexLockC2Ev -_ZN6Magick9MutexLockC1Ev -_ZN6Magick9MutexLockD2Ev -_ZN6Magick9MutexLockD1Ev -_ZN6Magick9MutexLock4lockEv -_ZN6Magick9MutexLock6unlockEv -_ZN6Magick10TypeMetricC2Ev -_ZN6Magick10TypeMetricC1Ev -_ZN6Magick10TypeMetricD2Ev -_ZN6Magick10TypeMetricD1Ev -_ZNK6Magick10TypeMetric6ascentEv -_ZNK6Magick10TypeMetric7descentEv -_ZNK6Magick10TypeMetric9textWidthEv -_ZNK6Magick10TypeMetric10textHeightEv -_ZNK6Magick10TypeMetric20maxHorizontalAdvanceEv -_ZTSN6Magick4BlobE -_ZTSN6Magick8ColorYUVE -_ZTSN6Magick8ColorRGBE -_ZTSN6Magick9ColorMonoE -_ZTSN6Magick9ColorGrayE -_ZTSN6Magick8ColorHSLE -_ZTSN6Magick5ColorE -_ZTSN6Magick13PathMovetoRelE -_ZTSN6Magick13PathMovetoAbsE -_ZTSN6Magick21PathLinetoVerticalRelE -_ZTSN6Magick21PathLinetoVerticalAbsE -_ZTSN6Magick23PathLinetoHorizontalRelE -_ZTSN6Magick23PathLinetoHorizontalAbsE -_ZTSN6Magick13PathLinetoRelE -_ZTSN6Magick13PathLinetoAbsE -_ZTSN6Magick29PathSmoothQuadraticCurvetoRelE -_ZTSN6Magick29PathSmoothQuadraticCurvetoAbsE -_ZTSN6Magick23PathQuadraticCurvetoRelE -_ZTSN6Magick23PathQuadraticCurvetoAbsE -_ZTSN6Magick20PathSmoothCurvetoRelE -_ZTSN6Magick20PathSmoothCurvetoAbsE -_ZTSN6Magick14PathCurvetoRelE -_ZTSN6Magick14PathCurvetoAbsE -_ZTSN6Magick13PathClosePathE -_ZTSN6Magick10PathArcRelE -_ZTSN6Magick10PathArcAbsE -_ZTSN6Magick15DrawableViewboxE -_ZTSN6Magick19DrawableTranslationE -_ZTSN6Magick22DrawableTextUnderColorE -_ZTSN6Magick22DrawableTextDecorationE -_ZTSN6Magick21DrawableTextAntialiasE -_ZTSN6Magick12DrawableTextE -_ZTSN6Magick19DrawableStrokeWidthE -_ZTSN6Magick21DrawableStrokeOpacityE -_ZTSN6Magick19DrawableStrokeColorE -_ZTSN6Magick23DrawableStrokeAntialiasE -_ZTSN6Magick18DrawableMiterLimitE -_ZTSN6Magick22DrawableStrokeLineJoinE -_ZTSN6Magick21DrawableStrokeLineCapE -_ZTSN6Magick18DrawableDashOffsetE -_ZTSN6Magick17DrawableDashArrayE -_ZTSN6Magick13DrawableSkewYE -_ZTSN6Magick13DrawableSkewXE -_ZTSN6Magick15DrawableScalingE -_ZTSN6Magick22DrawableRoundRectangleE -_ZTSN6Magick16DrawableRotationE -_ZTSN6Magick17DrawableRectangleE -_ZTSN6Magick19DrawablePushPatternE -_ZTSN6Magick18DrawablePopPatternE -_ZTSN6Magick26DrawablePushGraphicContextE -_ZTSN6Magick25DrawablePopGraphicContextE -_ZTSN6Magick16DrawablePolylineE -_ZTSN6Magick15DrawablePolygonE -_ZTSN6Magick17DrawablePointSizeE -_ZTSN6Magick13DrawablePointE -_ZTSN6Magick12DrawablePathE -_ZTSN6Magick13DrawableMatteE -_ZTSN6Magick12DrawableLineE -_ZTSN6Magick15DrawableGravityE -_ZTSN6Magick12DrawableFontE -_ZTSN6Magick19DrawableFillOpacityE -_ZTSN6Magick16DrawableFillRuleE -_ZTSN6Magick17DrawableFillColorE -_ZTSN6Magick15DrawableEllipseE -_ZTSN6Magick22DrawableCompositeImageE -_ZTSN6Magick13DrawableColorE -_ZTSN6Magick14DrawableCircleE -_ZTSN6Magick14DrawableBezierE -_ZTSN6Magick11DrawableArcE -_ZTSN6Magick14DrawableAffineE -_ZTSN6Magick5VPathE -_ZTSN6Magick9VPathBaseE -_ZTSN6Magick12DrawableBaseE -_ZTSN6Magick10CoordinateE -_ZTSSt14unary_functionIPN9MagickLib12_DrawContextEvE -_ZTSN6Magick10ErrorCacheE -_ZTSN6Magick9ErrorBlobE -_ZTSN6Magick13ErrorFileOpenE -_ZTSN6Magick17ErrorCorruptImageE -_ZTSN6Magick20ErrorMissingDelegateE -_ZTSN6Magick13ErrorDelegateE -_ZTSN6Magick11ErrorOptionE -_ZTSN6Magick12ErrorXServerE -_ZTSN6Magick18ErrorResourceLimitE -_ZTSN6Magick14ErrorUndefinedE -_ZTSN6Magick5ErrorE -_ZTSN6Magick12WarningCacheE -_ZTSN6Magick11WarningBlobE -_ZTSN6Magick15WarningFileOpenE -_ZTSN6Magick19WarningCorruptImageE -_ZTSN6Magick22WarningMissingDelegateE -_ZTSN6Magick15WarningDelegateE -_ZTSN6Magick13WarningOptionE -_ZTSN6Magick14WarningXServerE -_ZTSN6Magick20WarningResourceLimitE -_ZTSN6Magick16WarningUndefinedE -_ZTSN6Magick7WarningE -_ZTSN6Magick9ExceptionE -_ZTSN6Magick5ImageE -_ZTSN6Magick13MontageFramedE -_ZTSN6Magick7MontageE -_ZTVN6Magick4BlobE -_ZTIN6Magick4BlobE -_ZTVN6Magick8ColorYUVE -_ZTVN6Magick8ColorRGBE -_ZTVN6Magick9ColorMonoE -_ZTVN6Magick9ColorGrayE -_ZTVN6Magick8ColorHSLE -_ZTVN6Magick5ColorE -_ZTIN6Magick5ColorE -_ZTIN6Magick8ColorHSLE -_ZTIN6Magick9ColorGrayE -_ZTIN6Magick9ColorMonoE -_ZTIN6Magick8ColorRGBE -_ZTIN6Magick8ColorYUVE -_ZZ18__gthread_active_pvE20__gthread_active_ptr -_ZTVN6Magick13PathMovetoRelE -_ZTVN6Magick13PathMovetoAbsE -_ZTVN6Magick21PathLinetoVerticalRelE -_ZTVN6Magick21PathLinetoVerticalAbsE -_ZTVN6Magick23PathLinetoHorizontalRelE -_ZTVN6Magick23PathLinetoHorizontalAbsE -_ZTVN6Magick13PathLinetoRelE -_ZTVN6Magick13PathLinetoAbsE -_ZTVN6Magick29PathSmoothQuadraticCurvetoRelE -_ZTVN6Magick29PathSmoothQuadraticCurvetoAbsE -_ZTVN6Magick23PathQuadraticCurvetoRelE -_ZTVN6Magick23PathQuadraticCurvetoAbsE -_ZTVN6Magick20PathSmoothCurvetoRelE -_ZTVN6Magick20PathSmoothCurvetoAbsE -_ZTVN6Magick14PathCurvetoRelE -_ZTVN6Magick14PathCurvetoAbsE -_ZTVN6Magick13PathClosePathE -_ZTVN6Magick10PathArcRelE -_ZTVN6Magick10PathArcAbsE -_ZTVN6Magick15DrawableViewboxE -_ZTVN6Magick19DrawableTranslationE -_ZTVN6Magick22DrawableTextUnderColorE -_ZTVN6Magick22DrawableTextDecorationE -_ZTVN6Magick21DrawableTextAntialiasE -_ZTVN6Magick12DrawableTextE -_ZTVN6Magick19DrawableStrokeWidthE -_ZTVN6Magick21DrawableStrokeOpacityE -_ZTVN6Magick19DrawableStrokeColorE -_ZTVN6Magick23DrawableStrokeAntialiasE -_ZTVN6Magick18DrawableMiterLimitE -_ZTVN6Magick22DrawableStrokeLineJoinE -_ZTVN6Magick21DrawableStrokeLineCapE -_ZTVN6Magick18DrawableDashOffsetE -_ZTVN6Magick17DrawableDashArrayE -_ZTVN6Magick13DrawableSkewYE -_ZTVN6Magick13DrawableSkewXE -_ZTVN6Magick15DrawableScalingE -_ZTVN6Magick22DrawableRoundRectangleE -_ZTVN6Magick16DrawableRotationE -_ZTVN6Magick17DrawableRectangleE -_ZTVN6Magick19DrawablePushPatternE -_ZTVN6Magick18DrawablePopPatternE -_ZTVN6Magick26DrawablePushGraphicContextE -_ZTVN6Magick25DrawablePopGraphicContextE -_ZTVN6Magick16DrawablePolylineE -_ZTVN6Magick15DrawablePolygonE -_ZTVN6Magick17DrawablePointSizeE -_ZTVN6Magick13DrawablePointE -_ZTVN6Magick12DrawablePathE -_ZTVN6Magick13DrawableMatteE -_ZTVN6Magick12DrawableLineE -_ZTVN6Magick15DrawableGravityE -_ZTVN6Magick12DrawableFontE -_ZTVN6Magick19DrawableFillOpacityE -_ZTVN6Magick16DrawableFillRuleE -_ZTVN6Magick17DrawableFillColorE -_ZTVN6Magick15DrawableEllipseE -_ZTVN6Magick22DrawableCompositeImageE -_ZTVN6Magick13DrawableColorE -_ZTVN6Magick14DrawableCircleE -_ZTVN6Magick14DrawableBezierE -_ZTVN6Magick11DrawableArcE -_ZTVN6Magick14DrawableAffineE -_ZTVN6Magick5VPathE -_ZTVN6Magick9VPathBaseE -_ZTVN6Magick12DrawableBaseE -_ZTVN6Magick10CoordinateE -_ZTIN6Magick10CoordinateE -_ZTIN6Magick12DrawableBaseE -_ZTIN6Magick9VPathBaseE -_ZTIN6Magick5VPathE -_ZTIN6Magick14DrawableAffineE -_ZTIN6Magick11DrawableArcE -_ZTIN6Magick14DrawableBezierE -_ZTIN6Magick14DrawableCircleE -_ZTIN6Magick13DrawableColorE -_ZTIN6Magick22DrawableCompositeImageE -_ZTIN6Magick15DrawableEllipseE -_ZTIN6Magick17DrawableFillColorE -_ZTIN6Magick16DrawableFillRuleE -_ZTIN6Magick19DrawableFillOpacityE -_ZTIN6Magick12DrawableFontE -_ZTIN6Magick15DrawableGravityE -_ZTIN6Magick12DrawableLineE -_ZTIN6Magick13DrawableMatteE -_ZTIN6Magick12DrawablePathE -_ZTIN6Magick13DrawablePointE -_ZTIN6Magick17DrawablePointSizeE -_ZTIN6Magick15DrawablePolygonE -_ZTIN6Magick16DrawablePolylineE -_ZTIN6Magick25DrawablePopGraphicContextE -_ZTIN6Magick26DrawablePushGraphicContextE -_ZTIN6Magick18DrawablePopPatternE -_ZTIN6Magick19DrawablePushPatternE -_ZTIN6Magick17DrawableRectangleE -_ZTIN6Magick16DrawableRotationE -_ZTIN6Magick22DrawableRoundRectangleE -_ZTIN6Magick15DrawableScalingE -_ZTIN6Magick13DrawableSkewXE -_ZTIN6Magick13DrawableSkewYE -_ZTIN6Magick17DrawableDashArrayE -_ZTIN6Magick18DrawableDashOffsetE -_ZTIN6Magick21DrawableStrokeLineCapE -_ZTIN6Magick22DrawableStrokeLineJoinE -_ZTIN6Magick18DrawableMiterLimitE -_ZTIN6Magick23DrawableStrokeAntialiasE -_ZTIN6Magick19DrawableStrokeColorE -_ZTIN6Magick21DrawableStrokeOpacityE -_ZTIN6Magick19DrawableStrokeWidthE -_ZTIN6Magick12DrawableTextE -_ZTIN6Magick21DrawableTextAntialiasE -_ZTIN6Magick22DrawableTextDecorationE -_ZTIN6Magick22DrawableTextUnderColorE -_ZTIN6Magick19DrawableTranslationE -_ZTIN6Magick15DrawableViewboxE -_ZTIN6Magick10PathArcAbsE -_ZTIN6Magick10PathArcRelE -_ZTIN6Magick13PathClosePathE -_ZTIN6Magick14PathCurvetoAbsE -_ZTIN6Magick14PathCurvetoRelE -_ZTIN6Magick20PathSmoothCurvetoAbsE -_ZTIN6Magick20PathSmoothCurvetoRelE -_ZTIN6Magick23PathQuadraticCurvetoAbsE -_ZTIN6Magick23PathQuadraticCurvetoRelE -_ZTIN6Magick29PathSmoothQuadraticCurvetoAbsE -_ZTIN6Magick29PathSmoothQuadraticCurvetoRelE -_ZTIN6Magick13PathLinetoAbsE -_ZTIN6Magick13PathLinetoRelE -_ZTIN6Magick23PathLinetoHorizontalAbsE -_ZTIN6Magick23PathLinetoHorizontalRelE -_ZTIN6Magick21PathLinetoVerticalAbsE -_ZTIN6Magick21PathLinetoVerticalRelE -_ZTIN6Magick13PathMovetoAbsE -_ZTIN6Magick13PathMovetoRelE -_ZTISt14unary_functionIPN9MagickLib12_DrawContextEvE -_ZTVN6Magick10ErrorCacheE -_ZTVN6Magick9ErrorBlobE -_ZTVN6Magick13ErrorFileOpenE -_ZTVN6Magick17ErrorCorruptImageE -_ZTVN6Magick20ErrorMissingDelegateE -_ZTVN6Magick13ErrorDelegateE -_ZTVN6Magick11ErrorOptionE -_ZTVN6Magick12ErrorXServerE -_ZTVN6Magick18ErrorResourceLimitE -_ZTVN6Magick14ErrorUndefinedE -_ZTVN6Magick5ErrorE -_ZTVN6Magick12WarningCacheE -_ZTVN6Magick11WarningBlobE -_ZTVN6Magick15WarningFileOpenE -_ZTVN6Magick19WarningCorruptImageE -_ZTVN6Magick22WarningMissingDelegateE -_ZTVN6Magick15WarningDelegateE -_ZTVN6Magick13WarningOptionE -_ZTVN6Magick14WarningXServerE -_ZTVN6Magick20WarningResourceLimitE -_ZTVN6Magick16WarningUndefinedE -_ZTVN6Magick7WarningE -_ZTVN6Magick9ExceptionE -_ZTIN6Magick9ExceptionE -_ZTIN6Magick7WarningE -_ZTIN6Magick16WarningUndefinedE -_ZTIN6Magick20WarningResourceLimitE -_ZTIN6Magick14WarningXServerE -_ZTIN6Magick13WarningOptionE -_ZTIN6Magick15WarningDelegateE -_ZTIN6Magick22WarningMissingDelegateE -_ZTIN6Magick19WarningCorruptImageE -_ZTIN6Magick15WarningFileOpenE -_ZTIN6Magick11WarningBlobE -_ZTIN6Magick12WarningCacheE -_ZTIN6Magick5ErrorE -_ZTIN6Magick14ErrorUndefinedE -_ZTIN6Magick18ErrorResourceLimitE -_ZTIN6Magick12ErrorXServerE -_ZTIN6Magick11ErrorOptionE -_ZTIN6Magick13ErrorDelegateE -_ZTIN6Magick20ErrorMissingDelegateE -_ZTIN6Magick17ErrorCorruptImageE -_ZTIN6Magick13ErrorFileOpenE -_ZTIN6Magick9ErrorBlobE -_ZTIN6Magick10ErrorCacheE -_ZTVN6Magick5ImageE -_ZTIN6Magick5ImageE -_ZTVN6Magick13MontageFramedE -_ZTVN6Magick7MontageE -_ZTIN6Magick7MontageE -_ZTIN6Magick13MontageFramedE -_ZN6Magick21borderGeometryDefaultE -_ZN6Magick20frameGeometryDefaultE -_ZN6Magick20raiseGeometryDefaultE -_ZN6Magick18magickCleanUpGuardE -_ZNSt24__default_alloc_templateILb1ELi0EE8allocateEj -_Znaj -_ZNSt24__default_alloc_templateILb1ELi0EE12_S_free_listE -_ZNSt9exceptionD2Ev -_ZNSs4_Rep11_S_terminalE -_ZNKSs4copyEPcjj -_ZNSs4_Rep10_M_disposeERKSaIcE -_ZNSsC1ERKSs -_ZNSs6assignERKSs -_ZTVN10__cxxabiv120__si_class_type_infoE -_ZNSsD1Ev -_ZdlPv -_ZSt9terminatev -_ZNSs7replaceEjjPKcj -_ZTISt9exception -_ZNSs7reserveEj -_ZNSs20_S_empty_rep_storageE -_ZNSs6appendEjc -_ZTVN10__cxxabiv117__class_type_infoE -_ZdaPv -_ZNSs6appendERKSs -_ZNSsC1EPKcRKSaIcE -_ZNSt24__default_alloc_templateILb1ELi0EE22_S_node_allocator_lockE -_ZNSt24__default_alloc_templateILb1ELi0EE10deallocateEPvj -_ZNSsC1EPKcjRKSaIcE -_Znwj -_ZNSs4_Rep10_M_destroyERKSaIcE -_ZNSs6appendEPKcj diff --git a/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/TypeDescriptorModel.java b/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/TypeDescriptorModel.java index f866d0e637..075cef33ea 100644 --- a/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/TypeDescriptorModel.java +++ b/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/TypeDescriptorModel.java @@ -614,8 +614,8 @@ public class TypeDescriptorModel extends AbstractCreateDataTypeModel { return namespace; } - private boolean isNamespaceDeleted(Namespace namespace2) { - Symbol nsSymbol = namespace2.getSymbol(); + private boolean isNamespaceDeleted(Namespace other) { + Symbol nsSymbol = other.getSymbol(); if (nsSymbol == null) { return false; // global namespace. } diff --git a/Ghidra/Features/MicrosoftDmang/src/main/java/mdemangler/MDMangGhidra.java b/Ghidra/Features/MicrosoftDmang/src/main/java/mdemangler/MDMangGhidra.java index e9540e2407..149f9f7a7a 100644 --- a/Ghidra/Features/MicrosoftDmang/src/main/java/mdemangler/MDMangGhidra.java +++ b/Ghidra/Features/MicrosoftDmang/src/main/java/mdemangler/MDMangGhidra.java @@ -88,7 +88,7 @@ public class MDMangGhidra extends MDMang { if (objectResult != null) { objectResult.setMangledString(mangledArg); // Make our version of the demangled string available (could be large). - objectResult.setUtilDemangled(item.toString()); + objectResult.setOriginalDemangled(item.toString()); } return returnedItem; } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/test/AbstractDockingTest.java b/Ghidra/Framework/Docking/src/main/java/docking/test/AbstractDockingTest.java index 49983ddc2b..d8cda00fbe 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/test/AbstractDockingTest.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/test/AbstractDockingTest.java @@ -218,25 +218,9 @@ public abstract class AbstractDockingTest extends AbstractGenericTest { } public static Window waitForWindowByTitleContaining(String text) { - return waitForWindowByTitleContaining(null, text, DEFAULT_WAIT_TIMEOUT); - } - - /** - * Deprecated - * @param parentWindow - * @param text - * @param timeoutMS - * @return window - * @deprecated Instead call one of the methods that does not take a timeout - * (we are standardizing timeouts). The timeouts passed to this method will - * be ignored in favor of the standard value. - */ - @Deprecated - public static Window waitForWindowByTitleContaining(Window parentWindow, String text, - int timeoutMS) { // try at least one time - Window window = getWindowByTitleContaining(parentWindow, text); + Window window = getWindowByTitleContaining(null, text); if (window != null) { return window;// we found it...no waiting required } @@ -245,7 +229,7 @@ public abstract class AbstractDockingTest extends AbstractGenericTest { int timeout = DEFAULT_WAIT_TIMEOUT; while (totalTime <= timeout) { - window = getWindowByTitleContaining(parentWindow, text); + window = getWindowByTitleContaining(null, text); if (window != null) { return window; } @@ -257,43 +241,6 @@ public abstract class AbstractDockingTest extends AbstractGenericTest { "Timed-out waiting for window containg title '" + text + "'"); } - /** - * Waits for a window with the given name. If parentWindow is not null, then it - * will be used to find subordinate windows. If parentWindow is null, then all - * existing frames will be searched. - * - * @param parentWindow The parent of the window for which to search, or null to search all - * open frames - * @param title The title of the window for which to search - * @param timeoutMS The timeout after which this method will wait no more - * @return The window, if found, null otherwise. - * - * @deprecated Instead call one of the methods that does not take a timeout - * (we are standardizing timeouts). The timeouts passed to this method will - * be ignored in favor of the standard value. - */ - @Deprecated - public static Window waitForWindow(Window parentWindow, String title, int timeoutMS) { - - Window window = getWindowByTitle(parentWindow, title); - if (window != null) { - return window;// we found it...no waiting required - } - - int totalTime = 0; - int timeout = DEFAULT_WAIT_TIMEOUT; - while (totalTime <= timeout) { - - window = getWindowByTitle(parentWindow, title); - if (window != null) { - return window; - } - - totalTime += sleep(DEFAULT_WAIT_DELAY); - } - throw new AssertionFailedError("Timed-out waiting for window with title '" + title + "'"); - } - /** * Waits for a window with the given name. * @@ -1828,25 +1775,6 @@ public abstract class AbstractDockingTest extends AbstractGenericTest { useErrorGUI = enable; } - /** - * Signals that the client expected the System Under Test (SUT) to report errors. Use this - * when you wish to verify that errors are reported and you do not want those errors to - * fail the test. The default value for this setting is false, which means that any - * errors reported will fail the running test. - * - * @param expected true if errors are expected. - */ - public static void setErrorsExpected(boolean expected) { - if (expected) { - Msg.error(AbstractDockingTest.class, ">>>>>>>>>>>>>>>> Expected Exception"); - ConcurrentTestExceptionHandler.disable(); - } - else { - Msg.error(AbstractDockingTest.class, "<<<<<<<<<<<<<<<< End Expected Exception"); - ConcurrentTestExceptionHandler.enable(); - } - } - /** * Turns off the gui displays for errors. This does not change the "isUseErrorGUI()" value for * other tests in the TestCase. diff --git a/Ghidra/Framework/Generic/src/main/java/generic/test/AbstractGenericTest.java b/Ghidra/Framework/Generic/src/main/java/generic/test/AbstractGenericTest.java index f3de6c5da5..0f8d391b25 100644 --- a/Ghidra/Framework/Generic/src/main/java/generic/test/AbstractGenericTest.java +++ b/Ghidra/Framework/Generic/src/main/java/generic/test/AbstractGenericTest.java @@ -248,8 +248,9 @@ public abstract class AbstractGenericTest extends AbstractGTest { */ public static Set getAllWindows() { Set set = new HashSet<>(); - Frame sharedOwnerFrame = (Frame) AppContext.getAppContext().get( - new StringBuffer("SwingUtilities.sharedOwnerFrame")); + Frame sharedOwnerFrame = (Frame) AppContext.getAppContext() + .get( + new StringBuffer("SwingUtilities.sharedOwnerFrame")); if (sharedOwnerFrame != null) { set.addAll(getAllWindows(sharedOwnerFrame)); } @@ -1515,6 +1516,29 @@ public abstract class AbstractGenericTest extends AbstractGTest { UIManager.put("TextArea.font", f); } + /** + * Signals that the client expected the System Under Test (SUT) to report errors. Use this + * when you wish to verify that errors are reported and you do not want those errors to + * fail the test. The default value for this setting is false, which means that any + * errors reported will fail the running test. + * + * @param expected true if errors are expected. + */ + public static void setErrorsExpected(boolean expected) { + if (expected) { + Msg.error(AbstractGenericTest.class, ">>>>>>>>>>>>>>>> Expected Exception"); + ConcurrentTestExceptionHandler.disable(); + } + else { + Msg.error(AbstractGenericTest.class, "<<<<<<<<<<<<<<<< End Expected Exception"); + ConcurrentTestExceptionHandler.enable(); + } + } + +//================================================================================================== +// Swing Methods +//================================================================================================== + /** * Waits for the Swing thread to process any pending events. This method * also waits for any {@link SwingUpdateManager}s that have pending events diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java index 539fe6f1d7..0af2617da9 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/CodeBrowserPluginScreenShots.java @@ -15,7 +15,7 @@ */ package help.screenshot; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import java.awt.*; import java.awt.event.ActionListener; @@ -148,7 +148,7 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator { makeSelection(0x0406be1, 0x0406bf1); performAction("Create Table From Selection", "CodeBrowserPlugin", true); - Window window = waitForWindowByTitleContaining(null, "Selection Table", 2000); + Window window = waitForWindowByTitleContaining("Selection Table"); Point loc = plugin.getListingPanel().getLocationOnScreen(); Dimension size = window.getSize(); window.setBounds(loc.x + 300, loc.y + 150, size.width, 300); @@ -240,7 +240,7 @@ public class CodeBrowserPluginScreenShots extends GhidraScreenShotGenerator { JWindow popup = (JWindow) waitForWindowByName("ListingHoverProvider"); paintFix(popup); captureProvider(CodeViewerProvider.class); - + CodeViewerProvider provider = getProvider(CodeViewerProvider.class); captureProviderWithScreenShot(provider); } diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/NavigationScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/NavigationScreenShots.java index cd10649229..be00ab524c 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/NavigationScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/NavigationScreenShots.java @@ -142,7 +142,7 @@ public class NavigationScreenShots extends GhidraScreenShotGenerator { setGotoText(dialog, "LAB*"); pressOkOnDialog(); Window window = - waitForWindowByTitleContaining(null, "Search Limit Exceeded!", DEFAULT_WINDOW_TIMEOUT); + waitForWindowByTitleContaining("Search Limit Exceeded!"); assertNotNull(window); pressButtonByText(window, "OK"); waitForSwing(); diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/util/demangler/DemangledFunctionTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/util/demangler/DemangledFunctionTest.java index 7ba4755622..73f5ebba1d 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/util/demangler/DemangledFunctionTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/util/demangler/DemangledFunctionTest.java @@ -51,7 +51,7 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest program.endTransaction(txID, false); } - /** + /* * Test that the DemangledFunction will properly create a cascade of namespaces for * functions that live inside of a class that lives inside of a namespace. * This test applies a demangled name where the mangled name does NOT exist. @@ -83,7 +83,7 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest assertEquals("ATL", ns.getName(false)); } - /** + /* * Test that the DemangledFunction will properly update a thunk function * with its namespace, and ripple through to the underlying default thunked * function. The thunk 'this' parameter should utilize the Class @@ -132,7 +132,7 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest } - /** + /* * Test that the DemangledFunction will properly create a cascade of namespaces for * functions that live inside of a class that lives inside of a namespace. * This test applies a demangled name where the mangled name exists. @@ -168,7 +168,7 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest assertEquals("ATL", ns.getName(false)); } - /** + /* * Test that the DemangledFunction will properly create a cascade of namespaces for * functions that live inside of a class that lives inside of a namespace. * This test applies a demangled name where the mangled name exists with address suffix. @@ -205,7 +205,7 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest assertEquals("ATL", ns.getName(false)); } - /** + /* * Test that the DemangledFunction will properly create a cascade of namespaces for * functions that live inside of a class that lives inside of a namespace. * This test applies a demangled name where both the mangled name exists and @@ -243,7 +243,7 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest assertEquals("ATL", ns.getName(false)); } - /** + /* * Test that the DemangledFunction will properly create a cascade of namespaces for * functions that live inside of a class that lives inside of a namespace. * This test applies a demangled name where the mangled name exists on an external @@ -339,7 +339,7 @@ public class DemangledFunctionTest extends AbstractGhidraHeadlessIntegrationTest private void assertSimpleNamespaceExists(String name) { SymbolTable symbolTable = program.getSymbolTable(); Namespace ns = symbolTable.getNamespace(name, program.getGlobalNamespace()); - assertNotNull(ns); + assertNotNull("Namespace not created: " + name, ns); assertEquals(SymbolType.NAMESPACE, ns.getSymbol().getSymbolType()); } diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/util/demangler/gnu/GnuDemanglerIntegrationTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/util/demangler/gnu/GnuDemanglerIntegrationTest.java index 67de329e85..e853173d5b 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/util/demangler/gnu/GnuDemanglerIntegrationTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/util/demangler/gnu/GnuDemanglerIntegrationTest.java @@ -57,10 +57,11 @@ public class GnuDemanglerIntegrationTest extends AbstractGhidraHeadlessIntegrati String mangled = "MyFunction__11MyNamespacePQ215$ParamNamespace9paramName"; GnuDemangler demangler = new GnuDemangler(); - demangler.canDemangle(program);// this perform initialization + demangler.canDemangle(program);// this performs initialization GnuDemanglerOptions options = new GnuDemanglerOptions(); options.setDemangleOnlyKnownPatterns(false); + options = options.withDeprecatedDemangler(); DemangledObject result = demangler.demangle(mangled, options); assertNotNull(result); assertEquals("undefined MyNamespace::MyFunction($ParamNamespace::paramName *)",