1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Defs for interface to demanglers. 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2003, 2004, 2005, 2007 Free Software Foundation, Inc. 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is free software; you can redistribute it and/or 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown modify it under the terms of the GNU Library General Public License 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown as published by the Free Software Foundation; either version 2, or 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (at your option) any later version. 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown In addition to the permissions in the GNU Library General Public 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License, the Free Software Foundation gives you unlimited 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown permission to link the compiled version of this file into 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown combinations with other programs, and to distribute those 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown combinations without any restriction coming from the use of this 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown file. (The Library Public License restrictions do apply in other 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown respects; for example, they cover modification of the file, and 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown distribution when not linked into a combined executable.) 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is distributed in the hope that it will be useful, but 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown WITHOUT ANY WARRANTY; without even the implied warranty of 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Library General Public License for more details. 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You should have received a copy of the GNU Library General Public 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License along with this program; if not, write to the Free Software 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 02110-1301, USA. */ 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined (DEMANGLE_H) 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DEMANGLE_H 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0 /* in valgrind */ 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libiberty.h" 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ! in valgrind */ 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __cplusplus 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern "C" { 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* __cplusplus */ 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Options passed to cplus_demangle (in 2nd parameter). */ 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_NO_OPTS 0 /* For readability... */ 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_PARAMS (1 << 0) /* Include function args */ 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_JAVA (1 << 2) /* Demangle as Java rather than C++. */ 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_VERBOSE (1 << 3) /* Include implementation details. */ 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_TYPES (1 << 4) /* Also try to demangle type encodings. */ 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_RET_POSTFIX (1 << 5) /* Print function return types (when 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown present) after function signature */ 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_AUTO (1 << 8) 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_GNU (1 << 9) 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_LUCID (1 << 10) 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_ARM (1 << 11) 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_HP (1 << 12) /* For the HP aCC compiler; 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown same as ARM except for 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown template arguments, etc. */ 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_EDG (1 << 13) 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_GNU_V3 (1 << 14) 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_GNAT (1 << 15) 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* If none of these are set, use 'current_demangling_style' as the default. */ 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DMGL_STYLE_MASK (DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG|DMGL_GNU_V3|DMGL_JAVA|DMGL_GNAT) 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Enumeration of possible demangling styles. 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Lucid and ARM styles are still kept logically distinct, even though 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown they now both behave identically. The resulting style is actual the 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union of both. I.E. either style recognizes both "__pt__" and "__rf__" 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for operator "->", even though the first is lucid style and the second 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is ARM style. (FIXME?) */ 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern enum demangling_styles 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown no_demangling = -1, 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unknown_demangling = 0, 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown auto_demangling = DMGL_AUTO, 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnu_demangling = DMGL_GNU, 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown lucid_demangling = DMGL_LUCID, 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown arm_demangling = DMGL_ARM, 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown hp_demangling = DMGL_HP, 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown edg_demangling = DMGL_EDG, 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnu_v3_demangling = DMGL_GNU_V3, 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown java_demangling = DMGL_JAVA, 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnat_demangling = DMGL_GNAT 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} current_demangling_style; 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Define string names for the various demangling styles. */ 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define NO_DEMANGLING_STYLE_STRING "none" 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define AUTO_DEMANGLING_STYLE_STRING "auto" 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GNU_DEMANGLING_STYLE_STRING "gnu" 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LUCID_DEMANGLING_STYLE_STRING "lucid" 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ARM_DEMANGLING_STYLE_STRING "arm" 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define HP_DEMANGLING_STYLE_STRING "hp" 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EDG_DEMANGLING_STYLE_STRING "edg" 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GNU_V3_DEMANGLING_STYLE_STRING "gnu-v3" 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define JAVA_DEMANGLING_STYLE_STRING "java" 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GNAT_DEMANGLING_STYLE_STRING "gnat" 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Some macros to test what demangling style is active. */ 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CURRENT_DEMANGLING_STYLE current_demangling_style 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define AUTO_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_AUTO) 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GNU_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU) 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LUCID_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_LUCID) 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define ARM_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_ARM) 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define HP_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_HP) 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define EDG_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_EDG) 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GNU_V3_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU_V3) 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define JAVA_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_JAVA) 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GNAT_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNAT) 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Provide information about the available demangle styles. This code is 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pulled from gdb into libiberty because it is useful to binutils also. */ 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern const struct demangler_engine 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *const demangling_style_name; 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const enum demangling_styles demangling_style; 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *const demangling_style_doc; 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} libiberty_demanglers[]; 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern char * 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownML_(cplus_demangle) (const char *mangled, int options); 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_opname (const char *opname, char *result, int options); 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern const char * 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_mangle_opname (const char *opname, int options); 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Note: This sets global state. FIXME if you care about multi-threading. */ 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownset_cplus_marker_for_demangling (int ch); 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern enum demangling_styles 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_set_style (enum demangling_styles style); 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern enum demangling_styles 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_name_to_style (const char *name); 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Callback typedef for allocation-less demangler interfaces. */ 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef void (*demangle_callbackref) (const char *, size_t, void *); 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* V3 ABI demangling entry points, defined in cp-demangle.c. Callback 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown variants return non-zero on success, zero on error. char* variants 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return a string allocated by malloc on success, NULL on error. */ 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_v3_callback (const char *mangled, int options, 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown demangle_callbackref callback, void *opaque); 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern char* 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_v3 (const char *mangled, int options); 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownjava_demangle_v3_callback (const char *mangled, 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown demangle_callbackref callback, void *opaque); 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern char* 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownjava_demangle_v3 (const char *mangled); 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownenum gnu_v3_ctor_kinds { 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnu_v3_complete_object_ctor = 1, 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnu_v3_base_object_ctor, 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnu_v3_complete_object_allocating_ctor 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Return non-zero iff NAME is the mangled form of a constructor name 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown in the G++ V3 ABI demangling style. Specifically, return an `enum 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnu_v3_ctor_kinds' value indicating what kind of constructor 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown it is. */ 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern enum gnu_v3_ctor_kinds 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is_gnu_v3_mangled_ctor (const char *name); 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownenum gnu_v3_dtor_kinds { 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnu_v3_deleting_dtor = 1, 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnu_v3_complete_object_dtor, 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnu_v3_base_object_dtor 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Return non-zero iff NAME is the mangled form of a destructor name 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown in the G++ V3 ABI demangling style. Specifically, return an `enum 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown gnu_v3_dtor_kinds' value, indicating what kind of destructor 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown it is. */ 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern enum gnu_v3_dtor_kinds 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is_gnu_v3_mangled_dtor (const char *name); 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The V3 demangler works in two passes. The first pass builds a tree 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown representation of the mangled name, and the second pass turns the 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tree representation into a demangled string. Here we define an 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown interface to permit a caller to build their own tree 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown representation, which they can pass to the demangler to get a 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown demangled string. This can be used to canonicalize user input into 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown something which the demangler might output. It could also be used 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown by other demanglers in the future. */ 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* These are the component types which may be found in the tree. Many 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown component types have one or two subtrees, referred to as left and 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown right (a component type with only one subtree puts it in the left 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown subtree). */ 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownenum demangle_component_type 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A name, with a length and a pointer to a string. */ 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_NAME, 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A qualified name. The left subtree is a class or namespace or 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown some such thing, and the right subtree is a name qualified by 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown that class. */ 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_QUAL_NAME, 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A local name. The left subtree describes a function, and the 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown right subtree is a name which is local to that function. */ 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_LOCAL_NAME, 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A typed name. The left subtree is a name, and the right subtree 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown describes that name as a function. */ 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_TYPED_NAME, 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A template. The left subtree is a template name, and the right 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown subtree is a template argument list. */ 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_TEMPLATE, 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A template parameter. This holds a number, which is the template 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown parameter index. */ 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_TEMPLATE_PARAM, 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A constructor. This holds a name and the kind of 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown constructor. */ 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_CTOR, 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A destructor. This holds a name and the kind of destructor. */ 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_DTOR, 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A vtable. This has one subtree, the type for which this is a 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vtable. */ 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_VTABLE, 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A VTT structure. This has one subtree, the type for which this 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is a VTT. */ 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_VTT, 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A construction vtable. The left subtree is the type for which 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this is a vtable, and the right subtree is the derived type for 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown which this vtable is built. */ 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE, 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A typeinfo structure. This has one subtree, the type for which 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this is the tpeinfo structure. */ 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_TYPEINFO, 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A typeinfo name. This has one subtree, the type for which this 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is the typeinfo name. */ 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_TYPEINFO_NAME, 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A typeinfo function. This has one subtree, the type for which 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this is the tpyeinfo function. */ 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_TYPEINFO_FN, 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A thunk. This has one subtree, the name for which this is a 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown thunk. */ 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_THUNK, 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A virtual thunk. This has one subtree, the name for which this 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is a virtual thunk. */ 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_VIRTUAL_THUNK, 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A covariant thunk. This has one subtree, the name for which this 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is a covariant thunk. */ 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_COVARIANT_THUNK, 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A Java class. This has one subtree, the type. */ 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_JAVA_CLASS, 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A guard variable. This has one subtree, the name for which this 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is a guard variable. */ 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_GUARD, 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A reference temporary. This has one subtree, the name for which 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this is a temporary. */ 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_REFTEMP, 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A hidden alias. This has one subtree, the encoding for which it 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is providing alternative linkage. */ 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_HIDDEN_ALIAS, 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A standard substitution. This holds the name of the 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown substitution. */ 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_SUB_STD, 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* The restrict qualifier. The one subtree is the type which is 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown being qualified. */ 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_RESTRICT, 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* The volatile qualifier. The one subtree is the type which is 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown being qualified. */ 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_VOLATILE, 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* The const qualifier. The one subtree is the type which is being 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown qualified. */ 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_CONST, 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* The restrict qualifier modifying a member function. The one 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown subtree is the type which is being qualified. */ 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_RESTRICT_THIS, 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* The volatile qualifier modifying a member function. The one 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown subtree is the type which is being qualified. */ 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_VOLATILE_THIS, 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* The const qualifier modifying a member function. The one subtree 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is the type which is being qualified. */ 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_CONST_THIS, 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A vendor qualifier. The left subtree is the type which is being 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown qualified, and the right subtree is the name of the 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown qualifier. */ 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL, 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A pointer. The one subtree is the type which is being pointed 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to. */ 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_POINTER, 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A reference. The one subtree is the type which is being 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown referenced. */ 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_REFERENCE, 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* C++0x: An rvalue reference. The one subtree is the type which is 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown being referenced. */ 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_RVALUE_REFERENCE, 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A complex type. The one subtree is the base type. */ 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_COMPLEX, 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* An imaginary type. The one subtree is the base type. */ 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_IMAGINARY, 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A builtin type. This holds the builtin type information. */ 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_BUILTIN_TYPE, 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A vendor's builtin type. This holds the name of the type. */ 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_VENDOR_TYPE, 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A function type. The left subtree is the return type. The right 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown subtree is a list of ARGLIST nodes. Either or both may be 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NULL. */ 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_FUNCTION_TYPE, 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* An array type. The left subtree is the dimension, which may be 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NULL, or a string (represented as DEMANGLE_COMPONENT_NAME), or an 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown expression. The right subtree is the element type. */ 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_ARRAY_TYPE, 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A pointer to member type. The left subtree is the class type, 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and the right subtree is the member type. CV-qualifiers appear 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown on the latter. */ 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_PTRMEM_TYPE, 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* An argument list. The left subtree is the current argument, and 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the right subtree is either NULL or another ARGLIST node. */ 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_ARGLIST, 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A template argument list. The left subtree is the current 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown template argument, and the right subtree is either NULL or 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown another TEMPLATE_ARGLIST node. */ 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* An operator. This holds information about a standard 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown operator. */ 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_OPERATOR, 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* An extended operator. This holds the number of arguments, and 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the name of the extended operator. */ 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_EXTENDED_OPERATOR, 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A typecast, represented as a unary operator. The one subtree is 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the type to which the argument should be cast. */ 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_CAST, 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A unary expression. The left subtree is the operator, and the 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown right subtree is the single argument. */ 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_UNARY, 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A binary expression. The left subtree is the operator, and the 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown right subtree is a BINARY_ARGS. */ 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_BINARY, 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Arguments to a binary expression. The left subtree is the first 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown argument, and the right subtree is the second argument. */ 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_BINARY_ARGS, 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A trinary expression. The left subtree is the operator, and the 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown right subtree is a TRINARY_ARG1. */ 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_TRINARY, 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Arguments to a trinary expression. The left subtree is the first 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown argument, and the right subtree is a TRINARY_ARG2. */ 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_TRINARY_ARG1, 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* More arguments to a trinary expression. The left subtree is the 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown second argument, and the right subtree is the third argument. */ 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_TRINARY_ARG2, 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A literal. The left subtree is the type, and the right subtree 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is the value, represented as a DEMANGLE_COMPONENT_NAME. */ 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_LITERAL, 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A negative literal. Like LITERAL, but the value is negated. 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This is a minor hack: the NAME used for LITERAL points directly 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to the mangled string, but since negative numbers are mangled 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown using 'n' instead of '-', we want a way to indicate a negative 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown number which involves neither modifying the mangled string nor 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown allocating a new copy of the literal in memory. */ 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_LITERAL_NEG, 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A libgcj compiled resource. The left subtree is the name of the 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown resource. */ 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_JAVA_RESOURCE, 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A name formed by the concatenation of two parts. The left 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown subtree is the first part and the right subtree the second. */ 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_COMPOUND_NAME, 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A name formed by a single character. */ 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_CHARACTER, 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A decltype type. */ 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_DECLTYPE, 378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A pack expansion. */ 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown DEMANGLE_COMPONENT_PACK_EXPANSION 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Types which are only used internally. */ 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct demangle_operator_info; 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct demangle_builtin_type_info; 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A node in the tree representation is an instance of a struct 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown demangle_component. Note that the field names of the struct are 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown not well protected against macros defined by the file including 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this one. We can fix this if it ever becomes a problem. */ 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct demangle_component 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* The type of this component. */ 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum demangle_component_type type; 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown union 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For DEMANGLE_COMPONENT_NAME. */ 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* A pointer to the name (which need not NULL terminated) and 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown its length. */ 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *s; 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int len; 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } s_name; 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For DEMANGLE_COMPONENT_OPERATOR. */ 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Operator. */ 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const struct demangle_operator_info *op; 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } s_operator; 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */ 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Number of arguments. */ 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int args; 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Name. */ 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component *name; 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } s_extended_operator; 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For DEMANGLE_COMPONENT_CTOR. */ 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Kind of constructor. */ 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum gnu_v3_ctor_kinds kind; 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Name. */ 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component *name; 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } s_ctor; 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For DEMANGLE_COMPONENT_DTOR. */ 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Kind of destructor. */ 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum gnu_v3_dtor_kinds kind; 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Name. */ 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component *name; 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } s_dtor; 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For DEMANGLE_COMPONENT_BUILTIN_TYPE. */ 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Builtin type. */ 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const struct demangle_builtin_type_info *type; 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } s_builtin; 448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For DEMANGLE_COMPONENT_SUB_STD. */ 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Standard substitution string. */ 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char* string; 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Length of string. */ 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int len; 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } s_string; 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For DEMANGLE_COMPONENT_TEMPLATE_PARAM. */ 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct 460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Template parameter index. */ 462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown long number; 463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } s_number; 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For DEMANGLE_COMPONENT_CHARACTER. */ 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int character; 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } s_character; 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* For other types. */ 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Left (or only) subtree. */ 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component *left; 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Right subtree. */ 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component *right; 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } s_binary; 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } u; 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* People building mangled trees are expected to allocate instances of 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component themselves. They can then call one of 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the following functions to fill them in. */ 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Fill in most component types with a left subtree and a right 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown subtree. Returns non-zero on success, zero on failure, such as an 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unrecognized or inappropriate component type. */ 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_fill_component (struct demangle_component *fill, 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum demangle_component_type, 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component *left, 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component *right); 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Fill in a DEMANGLE_COMPONENT_NAME. Returns non-zero on success, 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown zero for bad arguments. */ 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_fill_name (struct demangle_component *fill, 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *, int); 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Fill in a DEMANGLE_COMPONENT_BUILTIN_TYPE, using the name of the 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown builtin type (e.g., "int", etc.). Returns non-zero on success, 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown zero if the type is not recognized. */ 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_fill_builtin_type (struct demangle_component *fill, 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *type_name); 511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Fill in a DEMANGLE_COMPONENT_OPERATOR, using the name of the 513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown operator and the number of arguments which it takes (the latter is 514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown used to disambiguate operators which can be both binary and unary, 515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown such as '-'). Returns non-zero on success, zero if the operator is 516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown not recognized. */ 517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_fill_operator (struct demangle_component *fill, 520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *opname, int args); 521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR, providing the 523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown number of arguments and the name. Returns non-zero on success, 524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown zero for bad arguments. */ 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_fill_extended_operator (struct demangle_component *fill, 528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int numargs, 529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component *nm); 530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Fill in a DEMANGLE_COMPONENT_CTOR. Returns non-zero on success, 532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown zero for bad arguments. */ 533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_fill_ctor (struct demangle_component *fill, 536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum gnu_v3_ctor_kinds kind, 537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component *name); 538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Fill in a DEMANGLE_COMPONENT_DTOR. Returns non-zero on success, 540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown zero for bad arguments. */ 541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_fill_dtor (struct demangle_component *fill, 544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum gnu_v3_dtor_kinds kind, 545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct demangle_component *name); 546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This function translates a mangled name into a struct 548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown demangle_component tree. The first argument is the mangled name. 549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The second argument is DMGL_* options. This returns a pointer to a 550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tree on success, or NULL on failure. On success, the third 551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown argument is set to a block of memory allocated by malloc. This 552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown block should be passed to free when the tree is no longer 553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown needed. */ 554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern struct demangle_component * 556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_v3_components (const char *mangled, int options, void **mem); 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This function takes a struct demangle_component tree and returns 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the corresponding demangled string. The first argument is DMGL_* 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown options. The second is the tree to demangle. The third is a guess 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown at the length of the demangled string, used to initially allocate 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the return buffer. The fourth is a pointer to a size_t. On 563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown success, this function returns a buffer allocated by malloc(), and 564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown sets the size_t pointed to by the fourth argument to the size of 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the allocated buffer (not the length of the returned string). On 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown failure, this function returns NULL, and sets the size_t pointed to 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown by the fourth argument to 0 for an invalid tree, or to 1 for a 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memory allocation error. */ 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern char * 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_print (int options, 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const struct demangle_component *tree, 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int estimated_length, 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown size_t *p_allocated_size); 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This function takes a struct demangle_component tree and passes back 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown a demangled string in one or more calls to a callback function. 578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The first argument is DMGL_* options. The second is the tree to 579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown demangle. The third is a pointer to a callback function; on each call 580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this receives an element of the demangled string, its length, and an 581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opaque value. The fourth is the opaque value passed to the callback. 582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The callback is called once or more to return the full demangled 583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown string. The demangled element string is always nul-terminated, though 584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown its length is also provided for convenience. In contrast to 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cplus_demangle_print(), this function does not allocate heap memory 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to grow output strings (except perhaps where alloca() is implemented 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown by malloc()), and so is normally safe for use where the heap has been 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown corrupted. On success, this function returns 1; on failure, 0. */ 589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int 591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browncplus_demangle_print_callback (int options, 592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const struct demangle_component *tree, 593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown demangle_callbackref callback, void *opaque); 594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __cplusplus 596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* __cplusplus */ 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* DEMANGLE_H */ 600