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