mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2024-11-21 19:42:14 +00:00
GP-3577 - Demangler - Updated the Gnu Demangler to version 2.41
This commit is contained in:
parent
0fb2014df1
commit
d20ccc377f
@ -17,9 +17,9 @@ apply plugin: 'eclipse'
|
|||||||
eclipse.project.name = 'GPL DemanglerGnu'
|
eclipse.project.name = 'GPL DemanglerGnu'
|
||||||
|
|
||||||
|
|
||||||
def v33_1 = "demangler_gnu_v2_33_1"
|
def v41 = "demangler_gnu_v2_41"
|
||||||
def v24 = "demangler_gnu_v2_24"
|
def v24 = "demangler_gnu_v2_24"
|
||||||
def srcVersion33_1 = "src/demangler_gnu_v2_33_1"
|
def srcVersion41 = "src/demangler_gnu_v2_41"
|
||||||
def srcVersion24 = "src/demangler_gnu_v2_24"
|
def srcVersion24 = "src/demangler_gnu_v2_24"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -39,21 +39,20 @@ task zipBuildableSource(type:Zip) {
|
|||||||
description "Collects the source files needed to build this module."
|
description "Collects the source files needed to build this module."
|
||||||
archiveBaseName = project.name + "-src-for-build"
|
archiveBaseName = project.name + "-src-for-build"
|
||||||
archiveExtension = 'zip'
|
archiveExtension = 'zip'
|
||||||
|
|
||||||
//
|
//
|
||||||
// Version 2.33.1
|
// Version 2.41
|
||||||
//
|
//
|
||||||
from (project.projectDir.toString() + "/" + srcVersion33_1 + "c") {
|
from (project.projectDir.toString() + "/" + srcVersion41 + "c") {
|
||||||
into "/" + srcVersion33_1
|
into "/" + srcVersion41
|
||||||
}
|
}
|
||||||
from (project.projectDir.toString() + "/" + srcVersion33_1 + "/headers") {
|
from (project.projectDir.toString() + "/" + srcVersion41 + "/headers") {
|
||||||
into "/" + srcVersion33_1
|
into "/" + srcVersion41
|
||||||
}
|
}
|
||||||
from (project.projectDir.toString() + "/" + srcVersion33_1 + "/build") {
|
from (project.projectDir.toString() + "/" + srcVersion41 + "/build") {
|
||||||
into "/" + srcVersion33_1
|
into "/" + srcVersion41
|
||||||
}
|
}
|
||||||
from (project.projectDir.toString() + "/" + srcVersion33_1 + "/README.txt")
|
from (project.projectDir.toString() + "/" + srcVersion41 + "/README.txt")
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Version 2.24
|
// Version 2.24
|
||||||
@ -72,11 +71,11 @@ task zipBuildableSource(type:Zip) {
|
|||||||
|
|
||||||
model {
|
model {
|
||||||
|
|
||||||
//
|
|
||||||
// Version 2.33.1
|
|
||||||
//
|
|
||||||
components {
|
components {
|
||||||
demangler_gnu_v2_33_1(NativeExecutableSpec) {
|
//
|
||||||
|
// Version 2.41
|
||||||
|
//
|
||||||
|
demangler_gnu_v2_41(NativeExecutableSpec) {
|
||||||
targetPlatform "win_x86_64"
|
targetPlatform "win_x86_64"
|
||||||
targetPlatform "linux_x86_64"
|
targetPlatform "linux_x86_64"
|
||||||
targetPlatform "linux_arm_64"
|
targetPlatform "linux_arm_64"
|
||||||
@ -85,10 +84,10 @@ model {
|
|||||||
sources {
|
sources {
|
||||||
c {
|
c {
|
||||||
source {
|
source {
|
||||||
srcDir srcVersion33_1 + "/c"
|
srcDir srcVersion41 + "/c"
|
||||||
}
|
}
|
||||||
exportedHeaders {
|
exportedHeaders {
|
||||||
srcDir srcVersion33_1 + "/headers"
|
srcDir srcVersion41 + "/headers"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,8 +126,8 @@ model {
|
|||||||
|
|
||||||
def version = b.getApplication().getName()
|
def version = b.getApplication().getName()
|
||||||
|
|
||||||
if (version.equals(v33_1)) {
|
if (version.equals(v41)) {
|
||||||
if (toolChain in Gcc) {
|
if (toolChain in Gcc) {
|
||||||
//cCompiler.args "-DCP_DEMANGLE_DEBUG"
|
//cCompiler.args "-DCP_DEMANGLE_DEBUG"
|
||||||
cCompiler.args "-DHAVE_STDLIB_H"
|
cCompiler.args "-DHAVE_STDLIB_H"
|
||||||
cCompiler.args "-DHAVE_STRING_H"
|
cCompiler.args "-DHAVE_STRING_H"
|
||||||
|
@ -1,81 +0,0 @@
|
|||||||
PURPOSE
|
|
||||||
|
|
||||||
This is a readme file to note the changes made to the binutils-2.33.1 source
|
|
||||||
code in to build its GNU demangler. The files in this directory are used to create a demangling
|
|
||||||
utility during the full build process.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
COPIED SOURCE CODE / BUILDING RESTRICTIONS
|
|
||||||
|
|
||||||
Most of the files used to build the Ghidra GNU demangler are copied from binutils and have
|
|
||||||
not been changed. Further, the files in this directory are a small subset of the files used to
|
|
||||||
build the binutils suite. By copying specific files we are able to use Make and Visual Studio
|
|
||||||
to build a stand alone demangler without having to perform the more complicated build needed
|
|
||||||
to build binutils. Specifically, we do not have to run the configure utility that is
|
|
||||||
provided by binutils. This is critical, as we are using Visual Studio to build on Windows,
|
|
||||||
which does not have the configure utility support. If we ever wished to build the entire
|
|
||||||
binutils suite on Windows, then we would most likely need to use a GNU environment made for
|
|
||||||
Windows, such as MinGW.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CHANGES TO BINUTILS SOURCE
|
|
||||||
|
|
||||||
cp-demangle.c
|
|
||||||
|
|
||||||
This file contains a small, one-line change to flush to the standard output stream. Without
|
|
||||||
this change, the program, when called repeatedly from Java would hang as it attempts to read
|
|
||||||
characters that are buffered on the native side.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
UPDATING
|
|
||||||
|
|
||||||
If we ever wish to update to a newer version of binutils, then we will need to re-copy the files
|
|
||||||
in this directory. That is, unless at least one of the following changes happens:
|
|
||||||
|
|
||||||
1) building a stand alone c++filt is simple enough that we can do it on each platform, or
|
|
||||||
2) we decide to build the entire binutils suite and use the full c++filt binary.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE FILES
|
|
||||||
|
|
||||||
binutils/libiberty/alloca.c
|
|
||||||
binutils/libiberty/argv.c
|
|
||||||
binutils/libiberty/cp-demangle.c
|
|
||||||
binutils/libiberty/cplus-dem.c
|
|
||||||
binutils/libiberty/d-demangle.c
|
|
||||||
binutils/libiberty/dyn-string.c
|
|
||||||
binutils/libiberty/getopt.c
|
|
||||||
binutils/libiberty/getopt1.c
|
|
||||||
binutils/libiberty/rust-demangle.c
|
|
||||||
binutils/libiberty/safe-ctype.c
|
|
||||||
binutils/libiberty/xexit.c
|
|
||||||
binutils/libiberty/xstrdup.c
|
|
||||||
binutils/include/ansidecl.h
|
|
||||||
binutils/libiberty/cp-demangle.h
|
|
||||||
binutils/include/demangle.h
|
|
||||||
binutils/include/dyn-string.h
|
|
||||||
binutils/include/getopt.h
|
|
||||||
binutils/include/libiberty.h
|
|
||||||
binutils/libiberty/rust-demangle.h
|
|
||||||
binutils/include/safe-ctype.h
|
|
||||||
|
|
||||||
|
|
||||||
This file is created to add minor missing dependencies.
|
|
||||||
|
|
||||||
missing.c
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LICENSE
|
|
||||||
|
|
||||||
The files listed above are licensed by using the file header or the COPYING or COPYING.LIB file
|
|
||||||
listed in the original source directory of binutils.
|
|
@ -1,353 +0,0 @@
|
|||||||
/* ###
|
|
||||||
* IP: LGPL 2.1
|
|
||||||
* NOTE: See binutils/libiberty/COPYING.LIB
|
|
||||||
*/
|
|
||||||
/* Demangler for the Rust programming language
|
|
||||||
Copyright (C) 2016-2019 Free Software Foundation, Inc.
|
|
||||||
Written by David Tolnay (dtolnay@gmail.com).
|
|
||||||
|
|
||||||
This file is part of the libiberty library.
|
|
||||||
Libiberty is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Library General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
In addition to the permissions in the GNU Library General Public
|
|
||||||
License, the Free Software Foundation gives you unlimited permission
|
|
||||||
to link the compiled version of this file into combinations with other
|
|
||||||
programs, and to distribute those combinations without any restriction
|
|
||||||
coming from the use of this file. (The Library Public License
|
|
||||||
restrictions do apply in other respects; for example, they cover
|
|
||||||
modification of the file, and distribution when not linked into a
|
|
||||||
combined executable.)
|
|
||||||
|
|
||||||
Libiberty is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Library General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
|
||||||
License along with libiberty; see the file COPYING.LIB.
|
|
||||||
If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "safe-ctype.h"
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_STRING_H
|
|
||||||
#include <string.h>
|
|
||||||
#else
|
|
||||||
extern size_t strlen(const char *s);
|
|
||||||
extern int strncmp(const char *s1, const char *s2, size_t n);
|
|
||||||
extern void *memset(void *s, int c, size_t n);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <demangle.h>
|
|
||||||
#include "libiberty.h"
|
|
||||||
#include "rust-demangle.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Mangled Rust symbols look like this:
|
|
||||||
_$LT$std..sys..fd..FileDesc$u20$as$u20$core..ops..Drop$GT$::drop::hc68340e1baa4987a
|
|
||||||
|
|
||||||
The original symbol is:
|
|
||||||
<std::sys::fd::FileDesc as core::ops::Drop>::drop
|
|
||||||
|
|
||||||
The last component of the path is a 64-bit hash in lowercase hex,
|
|
||||||
prefixed with "h". Rust does not have a global namespace between
|
|
||||||
crates, an illusion which Rust maintains by using the hash to
|
|
||||||
distinguish things that would otherwise have the same symbol.
|
|
||||||
|
|
||||||
Any path component not starting with a XID_Start character is
|
|
||||||
prefixed with "_".
|
|
||||||
|
|
||||||
The following escape sequences are used:
|
|
||||||
|
|
||||||
"," => $C$
|
|
||||||
"@" => $SP$
|
|
||||||
"*" => $BP$
|
|
||||||
"&" => $RF$
|
|
||||||
"<" => $LT$
|
|
||||||
">" => $GT$
|
|
||||||
"(" => $LP$
|
|
||||||
")" => $RP$
|
|
||||||
" " => $u20$
|
|
||||||
"\"" => $u22$
|
|
||||||
"'" => $u27$
|
|
||||||
"+" => $u2b$
|
|
||||||
";" => $u3b$
|
|
||||||
"[" => $u5b$
|
|
||||||
"]" => $u5d$
|
|
||||||
"{" => $u7b$
|
|
||||||
"}" => $u7d$
|
|
||||||
"~" => $u7e$
|
|
||||||
|
|
||||||
A double ".." means "::" and a single "." means "-".
|
|
||||||
|
|
||||||
The only characters allowed in the mangled symbol are a-zA-Z0-9 and _.:$ */
|
|
||||||
|
|
||||||
static const char *hash_prefix = "::h";
|
|
||||||
static const size_t hash_prefix_len = 3;
|
|
||||||
static const size_t hash_len = 16;
|
|
||||||
|
|
||||||
static int is_prefixed_hash (const char *start);
|
|
||||||
static int looks_like_rust (const char *sym, size_t len);
|
|
||||||
static int unescape (const char **in, char **out, const char *seq, char value);
|
|
||||||
|
|
||||||
/* INPUT: sym: symbol that has been through C++ (gnu v3) demangling
|
|
||||||
|
|
||||||
This function looks for the following indicators:
|
|
||||||
|
|
||||||
1. The hash must consist of "h" followed by 16 lowercase hex digits.
|
|
||||||
|
|
||||||
2. As a sanity check, the hash must use between 5 and 15 of the 16
|
|
||||||
possible hex digits. This is true of 99.9998% of hashes so once
|
|
||||||
in your life you may see a false negative. The point is to
|
|
||||||
notice path components that could be Rust hashes but are
|
|
||||||
probably not, like "haaaaaaaaaaaaaaaa". In this case a false
|
|
||||||
positive (non-Rust symbol has an important path component
|
|
||||||
removed because it looks like a Rust hash) is worse than a false
|
|
||||||
negative (the rare Rust symbol is not demangled) so this sets
|
|
||||||
the balance in favor of false negatives.
|
|
||||||
|
|
||||||
3. There must be no characters other than a-zA-Z0-9 and _.:$
|
|
||||||
|
|
||||||
4. There must be no unrecognized $-sign sequences.
|
|
||||||
|
|
||||||
5. There must be no sequence of three or more dots in a row ("..."). */
|
|
||||||
|
|
||||||
int
|
|
||||||
rust_is_mangled (const char *sym)
|
|
||||||
{
|
|
||||||
size_t len, len_without_hash;
|
|
||||||
|
|
||||||
if (!sym)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
len = strlen (sym);
|
|
||||||
if (len <= hash_prefix_len + hash_len)
|
|
||||||
/* Not long enough to contain "::h" + hash + something else */
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
len_without_hash = len - (hash_prefix_len + hash_len);
|
|
||||||
if (!is_prefixed_hash (sym + len_without_hash))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return looks_like_rust (sym, len_without_hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* A hash is the prefix "::h" followed by 16 lowercase hex digits. The
|
|
||||||
hex digits must comprise between 5 and 15 (inclusive) distinct
|
|
||||||
digits. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
is_prefixed_hash (const char *str)
|
|
||||||
{
|
|
||||||
const char *end;
|
|
||||||
char seen[16];
|
|
||||||
size_t i;
|
|
||||||
int count;
|
|
||||||
|
|
||||||
if (strncmp (str, hash_prefix, hash_prefix_len))
|
|
||||||
return 0;
|
|
||||||
str += hash_prefix_len;
|
|
||||||
|
|
||||||
memset (seen, 0, sizeof(seen));
|
|
||||||
for (end = str + hash_len; str < end; str++)
|
|
||||||
if (*str >= '0' && *str <= '9')
|
|
||||||
seen[*str - '0'] = 1;
|
|
||||||
else if (*str >= 'a' && *str <= 'f')
|
|
||||||
seen[*str - 'a' + 10] = 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Count how many distinct digits seen */
|
|
||||||
count = 0;
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
if (seen[i])
|
|
||||||
count++;
|
|
||||||
|
|
||||||
return count >= 5 && count <= 15;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
looks_like_rust (const char *str, size_t len)
|
|
||||||
{
|
|
||||||
const char *end = str + len;
|
|
||||||
|
|
||||||
while (str < end)
|
|
||||||
switch (*str)
|
|
||||||
{
|
|
||||||
case '$':
|
|
||||||
if (!strncmp (str, "$C$", 3))
|
|
||||||
str += 3;
|
|
||||||
else if (!strncmp (str, "$SP$", 4)
|
|
||||||
|| !strncmp (str, "$BP$", 4)
|
|
||||||
|| !strncmp (str, "$RF$", 4)
|
|
||||||
|| !strncmp (str, "$LT$", 4)
|
|
||||||
|| !strncmp (str, "$GT$", 4)
|
|
||||||
|| !strncmp (str, "$LP$", 4)
|
|
||||||
|| !strncmp (str, "$RP$", 4))
|
|
||||||
str += 4;
|
|
||||||
else if (!strncmp (str, "$u20$", 5)
|
|
||||||
|| !strncmp (str, "$u22$", 5)
|
|
||||||
|| !strncmp (str, "$u27$", 5)
|
|
||||||
|| !strncmp (str, "$u2b$", 5)
|
|
||||||
|| !strncmp (str, "$u3b$", 5)
|
|
||||||
|| !strncmp (str, "$u5b$", 5)
|
|
||||||
|| !strncmp (str, "$u5d$", 5)
|
|
||||||
|| !strncmp (str, "$u7b$", 5)
|
|
||||||
|| !strncmp (str, "$u7d$", 5)
|
|
||||||
|| !strncmp (str, "$u7e$", 5))
|
|
||||||
str += 5;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case '.':
|
|
||||||
/* Do not allow three or more consecutive dots */
|
|
||||||
if (!strncmp (str, "...", 3))
|
|
||||||
return 0;
|
|
||||||
/* Fall through */
|
|
||||||
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
|
|
||||||
case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
|
|
||||||
case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
|
|
||||||
case 's': case 't': case 'u': case 'v': case 'w': case 'x':
|
|
||||||
case 'y': case 'z':
|
|
||||||
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
|
|
||||||
case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
|
|
||||||
case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
|
|
||||||
case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
|
|
||||||
case 'Y': case 'Z':
|
|
||||||
case '0': case '1': case '2': case '3': case '4': case '5':
|
|
||||||
case '6': case '7': case '8': case '9':
|
|
||||||
case '_':
|
|
||||||
case ':':
|
|
||||||
str++;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
INPUT: sym: symbol for which rust_is_mangled(sym) returned 1.
|
|
||||||
|
|
||||||
The input is demangled in-place because the mangled name is always
|
|
||||||
longer than the demangled one. */
|
|
||||||
|
|
||||||
void
|
|
||||||
rust_demangle_sym (char *sym)
|
|
||||||
{
|
|
||||||
const char *in;
|
|
||||||
char *out;
|
|
||||||
const char *end;
|
|
||||||
|
|
||||||
if (!sym)
|
|
||||||
return;
|
|
||||||
|
|
||||||
in = sym;
|
|
||||||
out = sym;
|
|
||||||
end = sym + strlen (sym) - (hash_prefix_len + hash_len);
|
|
||||||
|
|
||||||
while (in < end)
|
|
||||||
switch (*in)
|
|
||||||
{
|
|
||||||
case '$':
|
|
||||||
if (!(unescape (&in, &out, "$C$", ',')
|
|
||||||
|| unescape (&in, &out, "$SP$", '@')
|
|
||||||
|| unescape (&in, &out, "$BP$", '*')
|
|
||||||
|| unescape (&in, &out, "$RF$", '&')
|
|
||||||
|| unescape (&in, &out, "$LT$", '<')
|
|
||||||
|| unescape (&in, &out, "$GT$", '>')
|
|
||||||
|| unescape (&in, &out, "$LP$", '(')
|
|
||||||
|| unescape (&in, &out, "$RP$", ')')
|
|
||||||
|| unescape (&in, &out, "$u20$", ' ')
|
|
||||||
|| unescape (&in, &out, "$u22$", '\"')
|
|
||||||
|| unescape (&in, &out, "$u27$", '\'')
|
|
||||||
|| unescape (&in, &out, "$u2b$", '+')
|
|
||||||
|| unescape (&in, &out, "$u3b$", ';')
|
|
||||||
|| unescape (&in, &out, "$u5b$", '[')
|
|
||||||
|| unescape (&in, &out, "$u5d$", ']')
|
|
||||||
|| unescape (&in, &out, "$u7b$", '{')
|
|
||||||
|| unescape (&in, &out, "$u7d$", '}')
|
|
||||||
|| unescape (&in, &out, "$u7e$", '~'))) {
|
|
||||||
/* unexpected escape sequence, not looks_like_rust. */
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case '_':
|
|
||||||
/* If this is the start of a path component and the next
|
|
||||||
character is an escape sequence, ignore the underscore. The
|
|
||||||
mangler inserts an underscore to make sure the path
|
|
||||||
component begins with a XID_Start character. */
|
|
||||||
if ((in == sym || in[-1] == ':') && in[1] == '$')
|
|
||||||
in++;
|
|
||||||
else
|
|
||||||
*out++ = *in++;
|
|
||||||
break;
|
|
||||||
case '.':
|
|
||||||
if (in[1] == '.')
|
|
||||||
{
|
|
||||||
/* ".." becomes "::" */
|
|
||||||
*out++ = ':';
|
|
||||||
*out++ = ':';
|
|
||||||
in += 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* "." becomes "-" */
|
|
||||||
*out++ = '-';
|
|
||||||
in++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
|
|
||||||
case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
|
|
||||||
case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
|
|
||||||
case 's': case 't': case 'u': case 'v': case 'w': case 'x':
|
|
||||||
case 'y': case 'z':
|
|
||||||
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
|
|
||||||
case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
|
|
||||||
case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
|
|
||||||
case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
|
|
||||||
case 'Y': case 'Z':
|
|
||||||
case '0': case '1': case '2': case '3': case '4': case '5':
|
|
||||||
case '6': case '7': case '8': case '9':
|
|
||||||
case ':':
|
|
||||||
*out++ = *in++;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* unexpected character in symbol, not looks_like_rust. */
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
*out++ = '?'; /* This is pretty lame, but it's hard to do better. */
|
|
||||||
done:
|
|
||||||
*out = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
unescape (const char **in, char **out, const char *seq, char value)
|
|
||||||
{
|
|
||||||
size_t len = strlen (seq);
|
|
||||||
|
|
||||||
if (strncmp (*in, seq, len))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
**out = value;
|
|
||||||
|
|
||||||
*in += len;
|
|
||||||
*out += 1;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
/* ###
|
|
||||||
* IP: LGPL 2.1
|
|
||||||
* NOTE: See binutils/libiberty/COPYING.LIB
|
|
||||||
*/
|
|
||||||
/* Internal demangler interface for the Rust programming language.
|
|
||||||
Copyright (C) 2016-2019 Free Software Foundation, Inc.
|
|
||||||
Written by David Tolnay (dtolnay@gmail.com).
|
|
||||||
|
|
||||||
This file is part of the libiberty library.
|
|
||||||
Libiberty is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Library General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
In addition to the permissions in the GNU Library General Public
|
|
||||||
License, the Free Software Foundation gives you unlimited permission
|
|
||||||
to link the compiled version of this file into combinations with other
|
|
||||||
programs, and to distribute those combinations without any restriction
|
|
||||||
coming from the use of this file. (The Library Public License
|
|
||||||
restrictions do apply in other respects; for example, they cover
|
|
||||||
modification of the file, and distribution when not linked into a
|
|
||||||
combined executable.)
|
|
||||||
|
|
||||||
Libiberty is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Library General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
|
||||||
License along with libiberty; see the file COPYING.LIB.
|
|
||||||
If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
/* This file provides some definitions shared by cplus-dem.c and
|
|
||||||
rust-demangle.c. It should not be included by any other files. */
|
|
||||||
|
|
||||||
/* Returns non-zero iff MANGLED is a rust mangled symbol. MANGLED must
|
|
||||||
already have been demangled through cplus_demangle_v3. If this function
|
|
||||||
returns non-zero then MANGLED can be demangled (in-place) using
|
|
||||||
RUST_DEMANGLE_SYM. */
|
|
||||||
extern int
|
|
||||||
rust_is_mangled (const char *mangled);
|
|
||||||
|
|
||||||
/* Demangles SYM (in-place) if RUST_IS_MANGLED returned non-zero for SYM.
|
|
||||||
If RUST_IS_MANGLED returned zero for SYM then RUST_DEMANGLE_SYM might
|
|
||||||
replace characters that cannot be demangled with '?' and might truncate
|
|
||||||
SYM. After calling RUST_DEMANGLE_SYM SYM might be shorter, but never
|
|
||||||
larger. */
|
|
||||||
extern void
|
|
||||||
rust_demangle_sym (char *sym);
|
|
@ -1,6 +1,6 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: LGPL 2.1
|
* IP: LGPL 2.1
|
||||||
* NOTE: license is not in file, but in the directory from whence it came: binutils-2.24/libiberty/COPYING.LIB
|
* NOTE: See binutils/libiberty/COPYING.LIB
|
||||||
*/
|
*/
|
||||||
/* alloca.c -- allocate automatically reclaimed memory
|
/* alloca.c -- allocate automatically reclaimed memory
|
||||||
(Mostly) portable public-domain implementation -- D A Gwyn
|
(Mostly) portable public-domain implementation -- D A Gwyn
|
||||||
@ -162,7 +162,7 @@ static header *last_alloca_header = NULL; /* -> last alloca header. */
|
|||||||
|
|
||||||
/* @undocumented C_alloca */
|
/* @undocumented C_alloca */
|
||||||
|
|
||||||
PTR
|
void *
|
||||||
C_alloca (size_t size)
|
C_alloca (size_t size)
|
||||||
{
|
{
|
||||||
auto char probe; /* Probes stack depth: */
|
auto char probe; /* Probes stack depth: */
|
||||||
@ -185,7 +185,7 @@ C_alloca (size_t size)
|
|||||||
{
|
{
|
||||||
register header *np = hp->h.next;
|
register header *np = hp->h.next;
|
||||||
|
|
||||||
free ((PTR) hp); /* Collect garbage. */
|
free ((void *) hp); /* Collect garbage. */
|
||||||
|
|
||||||
hp = np; /* -> next header. */
|
hp = np; /* -> next header. */
|
||||||
}
|
}
|
||||||
@ -214,7 +214,7 @@ C_alloca (size_t size)
|
|||||||
|
|
||||||
/* User storage begins just after header. */
|
/* User storage begins just after header. */
|
||||||
|
|
||||||
return (PTR) ((char *) new_storage + sizeof (header));
|
return (void *) ((char *) new_storage + sizeof (header));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3,7 +3,7 @@
|
|||||||
* NOTE: See binutils/libiberty/COPYING.LIB
|
* NOTE: See binutils/libiberty/COPYING.LIB
|
||||||
*/
|
*/
|
||||||
/* Create and destroy argument vectors (argv's)
|
/* Create and destroy argument vectors (argv's)
|
||||||
Copyright (C) 1992-2019 Free Software Foundation, Inc.
|
Copyright (C) 1992-2023 Free Software Foundation, Inc.
|
||||||
Written by Fred Fish @ Cygnus Support
|
Written by Fred Fish @ Cygnus Support
|
||||||
|
|
||||||
This file is part of the libiberty library.
|
This file is part of the libiberty library.
|
||||||
@ -293,8 +293,8 @@ char **buildargv (const char *input)
|
|||||||
@deftypefn Extension int writeargv (char * const *@var{argv}, FILE *@var{file})
|
@deftypefn Extension int writeargv (char * const *@var{argv}, FILE *@var{file})
|
||||||
|
|
||||||
Write each member of ARGV, handling all necessary quoting, to the file
|
Write each member of ARGV, handling all necessary quoting, to the file
|
||||||
named by FILE, separated by whitespace. Return 0 on success, non-zero
|
associated with FILE, separated by whitespace. Return 0 on success,
|
||||||
if an error occurred while writing to FILE.
|
non-zero if an error occurred while writing to FILE.
|
||||||
|
|
||||||
@end deftypefn
|
@end deftypefn
|
||||||
|
|
||||||
@ -303,8 +303,6 @@ if an error occurred while writing to FILE.
|
|||||||
int
|
int
|
||||||
writeargv (char * const *argv, FILE *f)
|
writeargv (char * const *argv, FILE *f)
|
||||||
{
|
{
|
||||||
int status = 0;
|
|
||||||
|
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@ -318,29 +316,26 @@ writeargv (char * const *argv, FILE *f)
|
|||||||
|
|
||||||
if (ISSPACE(c) || c == '\\' || c == '\'' || c == '"')
|
if (ISSPACE(c) || c == '\\' || c == '\'' || c == '"')
|
||||||
if (EOF == fputc ('\\', f))
|
if (EOF == fputc ('\\', f))
|
||||||
{
|
return 1;
|
||||||
status = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (EOF == fputc (c, f))
|
if (EOF == fputc (c, f))
|
||||||
{
|
return 1;
|
||||||
status = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
arg++;
|
arg++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Write out a pair of quotes for an empty argument. */
|
||||||
|
if (arg == *argv)
|
||||||
|
if (EOF == fputs ("\"\"", f))
|
||||||
|
return 1;
|
||||||
|
|
||||||
if (EOF == fputc ('\n', f))
|
if (EOF == fputc ('\n', f))
|
||||||
{
|
return 1;
|
||||||
status = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
argv++;
|
argv++;
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
return 0;
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -438,7 +433,10 @@ expandargv (int *argcp, char ***argvp)
|
|||||||
due to CR/LF->CR translation when reading text files.
|
due to CR/LF->CR translation when reading text files.
|
||||||
That does not in-and-of itself indicate failure. */
|
That does not in-and-of itself indicate failure. */
|
||||||
&& ferror (f))
|
&& ferror (f))
|
||||||
goto error;
|
{
|
||||||
|
free (buffer);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* Add a NUL terminator. */
|
/* Add a NUL terminator. */
|
||||||
buffer[len] = '\0';
|
buffer[len] = '\0';
|
||||||
/* If the file is empty or contains only whitespace, buildargv would
|
/* If the file is empty or contains only whitespace, buildargv would
|
File diff suppressed because it is too large
Load Diff
@ -3,7 +3,7 @@
|
|||||||
* NOTE: See binutils/libiberty/COPYING.LIB
|
* NOTE: See binutils/libiberty/COPYING.LIB
|
||||||
*/
|
*/
|
||||||
/* Demangler for GNU C++
|
/* Demangler for GNU C++
|
||||||
Copyright (C) 1989-2019 Free Software Foundation, Inc.
|
Copyright (C) 1989-2023 Free Software Foundation, Inc.
|
||||||
Written by James Clark (jjc@jclark.uucp)
|
Written by James Clark (jjc@jclark.uucp)
|
||||||
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
|
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
|
||||||
Modified by Satish Pai (pai@apollo.hp.com) for HP demangling
|
Modified by Satish Pai (pai@apollo.hp.com) for HP demangling
|
||||||
@ -56,7 +56,6 @@ void * realloc ();
|
|||||||
#define CURRENT_DEMANGLING_STYLE options
|
#define CURRENT_DEMANGLING_STYLE options
|
||||||
|
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "rust-demangle.h"
|
|
||||||
|
|
||||||
enum demangling_styles current_demangling_style = auto_demangling;
|
enum demangling_styles current_demangling_style = auto_demangling;
|
||||||
|
|
||||||
@ -164,27 +163,20 @@ cplus_demangle (const char *mangled, int options)
|
|||||||
if ((options & DMGL_STYLE_MASK) == 0)
|
if ((options & DMGL_STYLE_MASK) == 0)
|
||||||
options |= (int) current_demangling_style & DMGL_STYLE_MASK;
|
options |= (int) current_demangling_style & DMGL_STYLE_MASK;
|
||||||
|
|
||||||
|
/* The Rust demangling is implemented elsewhere.
|
||||||
|
Legacy Rust symbols overlap with GNU_V3, so try Rust first. */
|
||||||
|
if (RUST_DEMANGLING || AUTO_DEMANGLING)
|
||||||
|
{
|
||||||
|
ret = rust_demangle (mangled, options);
|
||||||
|
if (ret || RUST_DEMANGLING)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* The V3 ABI demangling is implemented elsewhere. */
|
/* The V3 ABI demangling is implemented elsewhere. */
|
||||||
if (GNU_V3_DEMANGLING || RUST_DEMANGLING || AUTO_DEMANGLING)
|
if (GNU_V3_DEMANGLING || AUTO_DEMANGLING)
|
||||||
{
|
{
|
||||||
ret = cplus_demangle_v3 (mangled, options);
|
ret = cplus_demangle_v3 (mangled, options);
|
||||||
if (GNU_V3_DEMANGLING)
|
if (ret || GNU_V3_DEMANGLING)
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (ret)
|
|
||||||
{
|
|
||||||
/* Rust symbols are GNU_V3 mangled plus some extra subtitutions.
|
|
||||||
The subtitutions are always smaller, so do in place changes. */
|
|
||||||
if (rust_is_mangled (ret))
|
|
||||||
rust_demangle_sym (ret);
|
|
||||||
else if (RUST_DEMANGLING)
|
|
||||||
{
|
|
||||||
free (ret);
|
|
||||||
ret = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret || RUST_DEMANGLING)
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,27 +200,6 @@ cplus_demangle (const char *mangled, int options)
|
|||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
|
||||||
rust_demangle (const char *mangled, int options)
|
|
||||||
{
|
|
||||||
/* Rust symbols are GNU_V3 mangled plus some extra subtitutions. */
|
|
||||||
char *ret = cplus_demangle_v3 (mangled, options);
|
|
||||||
|
|
||||||
/* The Rust subtitutions are always smaller, so do in place changes. */
|
|
||||||
if (ret != NULL)
|
|
||||||
{
|
|
||||||
if (rust_is_mangled (ret))
|
|
||||||
rust_demangle_sym (ret);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
free (ret);
|
|
||||||
ret = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Demangle ada names. The encoding is documented in gcc/ada/exp_dbug.ads. */
|
/* Demangle ada names. The encoding is documented in gcc/ada/exp_dbug.ads. */
|
||||||
|
|
||||||
char *
|
char *
|
@ -2,7 +2,7 @@
|
|||||||
* IP: GPL 3
|
* IP: GPL 3
|
||||||
*/
|
*/
|
||||||
/* Demangler for GNU C++ - main program
|
/* Demangler for GNU C++ - main program
|
||||||
Copyright (C) 1989-2019 Free Software Foundation, Inc.
|
Copyright (C) 1989-2023 Free Software Foundation, Inc.
|
||||||
Written by James Clark (jjc@jclark.uucp)
|
Written by James Clark (jjc@jclark.uucp)
|
||||||
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
|
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
|
||||||
Modified by Satish Pai (pai@apollo.hp.com) for HP demangling
|
Modified by Satish Pai (pai@apollo.hp.com) for HP demangling
|
||||||
@ -23,23 +23,34 @@
|
|||||||
along with GCC; see the file COPYING. If not, write to the Free
|
along with GCC; see the file COPYING. If not, write to the Free
|
||||||
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
|
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
|
||||||
02110-1301, USA.
|
02110-1301, USA.
|
||||||
|
|
||||||
CHANGE NOTICE:
|
|
||||||
This file was changed on July 22nd, 2020.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
CHANGE NOTICE:
|
||||||
|
This file was changed on October 31st, 2023.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
// #include "sysdep.h" // Changed 10/31/23
|
||||||
#include <string.h>
|
// error reporting front end
|
||||||
|
// #include "bfd.h" // Changed 10/31/23
|
||||||
|
|
||||||
|
#include <stdlib.h> // Changed 10/31/23
|
||||||
|
#include <string.h> // Changed 10/31/23
|
||||||
|
|
||||||
#include "libiberty.h"
|
#include "libiberty.h"
|
||||||
#include "demangle.h"
|
#include "demangle.h"
|
||||||
#include "getopt.h"
|
#include "getopt.h"
|
||||||
#include "safe-ctype.h"
|
#include "safe-ctype.h"
|
||||||
|
|
||||||
|
// bfd code
|
||||||
|
// #include "bucomm.h" // Changed 10/31/23
|
||||||
|
|
||||||
static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
|
static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
|
||||||
static int strip_underscore = 0; // TARGET_PREPENDS_UNDERSCORE; // Changed Jan 22, 2020
|
static int strip_underscore = 0; // TARGET_PREPENDS_UNDERSCORE; // Changed 10/31/23
|
||||||
static const char *program_name; // Changed Jan 22, 2020
|
|
||||||
|
// declared in bucomm.c
|
||||||
|
static const char *program_name; // Changed 10/31/23
|
||||||
|
|
||||||
|
|
||||||
static const struct option long_options[] =
|
static const struct option long_options[] =
|
||||||
{
|
{
|
||||||
@ -108,10 +119,12 @@ Usage: %s [options] [mangled names]\n", program_name);
|
|||||||
fprintf (stream, "\
|
fprintf (stream, "\
|
||||||
Options are:\n\
|
Options are:\n\
|
||||||
[-_|--strip-underscore] Ignore first leading underscore%s\n",
|
[-_|--strip-underscore] Ignore first leading underscore%s\n",
|
||||||
strip_underscore ? " (default)" : ""); // Changed Jan 22, 2020
|
// TARGET_PREPENDS_UNDERSCORE ? " (default)" : ""); // Changed 10/31/23
|
||||||
|
strip_underscore ? " (default)" : ""); // Changed 10/31/23
|
||||||
fprintf (stream, "\
|
fprintf (stream, "\
|
||||||
[-n|--no-strip-underscore] Do not ignore a leading underscore%s\n",
|
[-n|--no-strip-underscore] Do not ignore a leading underscore%s\n",
|
||||||
strip_underscore ? "" : " (default)"); // Changed Jan 22, 2020
|
// TARGET_PREPENDS_UNDERSCORE ? "" : " (default)"); // Changed 10/31/23
|
||||||
|
strip_underscore ? "" : " (default)"); // Changed 10/31/23
|
||||||
fprintf (stream, "\
|
fprintf (stream, "\
|
||||||
[-p|--no-params] Do not display function arguments\n\
|
[-p|--no-params] Do not display function arguments\n\
|
||||||
[-i|--no-verbose] Do not show implementation details (if any)\n\
|
[-i|--no-verbose] Do not show implementation details (if any)\n\
|
||||||
@ -130,11 +143,11 @@ Demangled names are displayed to stdout.\n\
|
|||||||
If a name cannot be demangled it is just echoed to stdout.\n\
|
If a name cannot be demangled it is just echoed to stdout.\n\
|
||||||
If no names are provided on the command line, stdin is read.\n");
|
If no names are provided on the command line, stdin is read.\n");
|
||||||
|
|
||||||
/* Changed Jan 22, 2020
|
/* Changed 10/31/23
|
||||||
|
// defined in version.h
|
||||||
if (REPORT_BUGS_TO[0] && status == 0)
|
if (REPORT_BUGS_TO[0] && status == 0)
|
||||||
fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
|
fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
exit (status);
|
exit (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,8 +171,8 @@ main (int argc, char **argv)
|
|||||||
enum demangling_styles style = auto_demangling;
|
enum demangling_styles style = auto_demangling;
|
||||||
|
|
||||||
program_name = argv[0];
|
program_name = argv[0];
|
||||||
// xmalloc_set_program_name (program_name); // Changed Jan 22, 2020
|
// xmalloc_set_program_name (program_name); // Changed 10/31/23
|
||||||
// bfd_set_error_program_name (program_name); // Changed Jan 22, 2020
|
// bfd_set_error_program_name (program_name); // Changed 10/31/23
|
||||||
|
|
||||||
expandargv (&argc, &argv);
|
expandargv (&argc, &argv);
|
||||||
|
|
||||||
@ -191,7 +204,8 @@ main (int argc, char **argv)
|
|||||||
flags &= ~ DMGL_VERBOSE;
|
flags &= ~ DMGL_VERBOSE;
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
printf ("(GNU Binutils) c++filt 2.33.1\n"); // Changed Jan 22, 2020
|
// print_version ("c++filt"); // Changed 10/31/23
|
||||||
|
printf ("c++filt 2.41\n"); // Changed 10/31/23
|
||||||
return 0;
|
return 0;
|
||||||
case '_':
|
case '_':
|
||||||
strip_underscore = 1;
|
strip_underscore = 1;
|
||||||
@ -230,13 +244,14 @@ main (int argc, char **argv)
|
|||||||
case rust_demangling:
|
case rust_demangling:
|
||||||
valid_symbols = standard_symbol_characters ();
|
valid_symbols = standard_symbol_characters ();
|
||||||
break;
|
break;
|
||||||
default: {
|
default:
|
||||||
/* Folks should explicitly indicate the appropriate alphabet for
|
/* Folks should explicitly indicate the appropriate alphabet for
|
||||||
each demangling. Providing a default would allow the
|
each demangling. Providing a default would allow the
|
||||||
question to go unconsidered. */
|
question to go unconsidered. */
|
||||||
fprintf (stderr, "Internal error: no symbol alphabet for current style\n"); // Changed Jan 22, 2020
|
// fatal ("Internal error: no symbol alphabet for current style"); // Changed 10/31/23
|
||||||
exit (1); // Changed Jan 22, 2020
|
fprintf (stderr, "Internal error: no symbol alphabet for current style\n"); // Changed 10/31/23
|
||||||
}
|
exit (1); // Changed 10/31/23
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
File diff suppressed because it is too large
Load Diff
@ -3,7 +3,7 @@
|
|||||||
* NOTE: See binutils/include/COPYING3
|
* NOTE: See binutils/include/COPYING3
|
||||||
*/
|
*/
|
||||||
/* An abstract string datatype.
|
/* An abstract string datatype.
|
||||||
Copyright (C) 1998-2019 Free Software Foundation, Inc.
|
Copyright (C) 1998-2023 Free Software Foundation, Inc.
|
||||||
Contributed by Mark Mitchell (mark@markmitchell.com).
|
Contributed by Mark Mitchell (mark@markmitchell.com).
|
||||||
|
|
||||||
This file is part of GNU CC.
|
This file is part of GNU CC.
|
||||||
@ -281,7 +281,7 @@ dyn_string_insert_cstr (dyn_string_t dest, int pos, const char *src)
|
|||||||
for (i = dest->length; i >= pos; --i)
|
for (i = dest->length; i >= pos; --i)
|
||||||
dest->s[i + length] = dest->s[i];
|
dest->s[i + length] = dest->s[i];
|
||||||
/* Splice in the new stuff. */
|
/* Splice in the new stuff. */
|
||||||
strncpy (dest->s + pos, src, length);
|
memcpy (dest->s + pos, src, length);
|
||||||
/* Compute the new length. */
|
/* Compute the new length. */
|
||||||
dest->length += length;
|
dest->length += length;
|
||||||
return 1;
|
return 1;
|
@ -1,5 +1,5 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GPL 3
|
* IP: GPL 3 Linking Permitted
|
||||||
* NOTE: See binutils/include/COPYING3
|
* NOTE: See binutils/include/COPYING3
|
||||||
*/
|
*/
|
||||||
/* Getopt for GNU.
|
/* Getopt for GNU.
|
||||||
@ -7,7 +7,7 @@
|
|||||||
"Keep this file name-space clean" means, talk to drepper@gnu.org
|
"Keep this file name-space clean" means, talk to drepper@gnu.org
|
||||||
before changing it!
|
before changing it!
|
||||||
|
|
||||||
Copyright (C) 1987-2019 Free Software Foundation, Inc.
|
Copyright (C) 1987-2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
NOTE: This source is derived from an old version taken from the GNU C
|
NOTE: This source is derived from an old version taken from the GNU C
|
||||||
Library (glibc).
|
Library (glibc).
|
@ -1,9 +1,9 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GPL 3
|
* IP: GPL 3 Linking Permitted
|
||||||
* NOTE: See binutils/include/COPYING3
|
* NOTE: See binutils/include/COPYING3
|
||||||
*/
|
*/
|
||||||
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||||
Copyright (C) 1987-2019 Free Software Foundation, Inc.
|
Copyright (C) 1987-2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
NOTE: This source is derived from an old version taken from the GNU C
|
NOTE: This source is derived from an old version taken from the GNU C
|
||||||
Library (glibc).
|
Library (glibc).
|
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
|
|
||||||
CHANGE NOTICE:
|
CHANGE NOTICE:
|
||||||
This file was created on January 22nd, 2020:
|
This file was created on October 31st, 2023:
|
||||||
-This code was copied and modified from a previous version of libiberty
|
-This code was copied and modified from a previous version of libiberty
|
||||||
|
|
||||||
*/
|
*/
|
1608
GPL/DemanglerGnu/src/demangler_gnu_v2_41/c/rust-demangle.c
Normal file
1608
GPL/DemanglerGnu/src/demangler_gnu_v2_41/c/rust-demangle.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,10 +1,10 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: LGPL 2.1
|
* IP: LGPL 2.1
|
||||||
* NOTE: See binutils/include/COPYING
|
* NOTE: See binutils/libiberty/COPYING.LIB
|
||||||
*/
|
*/
|
||||||
/* <ctype.h> replacement macros.
|
/* <ctype.h> replacement macros.
|
||||||
|
|
||||||
Copyright (C) 2000-2019 Free Software Foundation, Inc.
|
Copyright (C) 2000-2023 Free Software Foundation, Inc.
|
||||||
Contributed by Zack Weinberg <zackw@stanford.edu>.
|
Contributed by Zack Weinberg <zackw@stanford.edu>.
|
||||||
|
|
||||||
This file is part of the libiberty library.
|
This file is part of the libiberty library.
|
@ -3,7 +3,7 @@
|
|||||||
* NOTE: See binutils/libiberty/COPYING.LIB
|
* NOTE: See binutils/libiberty/COPYING.LIB
|
||||||
*/
|
*/
|
||||||
/* xexit.c -- Run any exit handlers, then exit.
|
/* xexit.c -- Run any exit handlers, then exit.
|
||||||
Copyright (C) 1994-2019 Free Software Foundation, Inc.
|
Copyright (C) 1994-2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the libiberty library.
|
This file is part of the libiberty library.
|
||||||
Libiberty is free software; you can redistribute it and/or
|
Libiberty is free software; you can redistribute it and/or
|
@ -2,8 +2,8 @@
|
|||||||
* IP: LGPL 2.1
|
* IP: LGPL 2.1
|
||||||
* NOTE: See binutils/include/COPYING
|
* NOTE: See binutils/include/COPYING
|
||||||
*/
|
*/
|
||||||
/* ANSI and traditional C compatability macros
|
/* Compiler compatibility macros
|
||||||
Copyright (C) 1991-2019 Free Software Foundation, Inc.
|
Copyright (C) 1991-2023 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
@ -20,18 +20,7 @@ You should have received a copy of the GNU General Public License
|
|||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
/* ANSI and traditional C compatibility macros
|
/* For ease of writing code which uses GCC extensions but needs to be
|
||||||
|
|
||||||
ANSI C is assumed if __STDC__ is #defined.
|
|
||||||
|
|
||||||
Macro ANSI C definition Traditional C definition
|
|
||||||
----- ---- - ---------- ----------- - ----------
|
|
||||||
PTR `void *' `char *'
|
|
||||||
const not defined `'
|
|
||||||
volatile not defined `'
|
|
||||||
signed not defined `'
|
|
||||||
|
|
||||||
For ease of writing code which uses GCC extensions but needs to be
|
|
||||||
portable to other compilers, we provide the GCC_VERSION macro that
|
portable to other compilers, we provide the GCC_VERSION macro that
|
||||||
simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various
|
simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various
|
||||||
wrappers around __attribute__. Also, __extension__ will be #defined
|
wrappers around __attribute__. Also, __extension__ will be #defined
|
||||||
@ -66,24 +55,10 @@ So instead we use the macro below and test it against specific values. */
|
|||||||
#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
|
#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
|
||||||
#endif /* GCC_VERSION */
|
#endif /* GCC_VERSION */
|
||||||
|
|
||||||
#if defined (__STDC__) || defined(__cplusplus) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32)
|
|
||||||
/* All known AIX compilers implement these things (but don't always
|
|
||||||
define __STDC__). The RISC/OS MIPS compiler defines these things
|
|
||||||
in SVR4 mode, but does not define __STDC__. */
|
|
||||||
/* eraxxon@alumni.rice.edu: The Compaq C++ compiler, unlike many other
|
|
||||||
C++ compilers, does not define __STDC__, though it acts as if this
|
|
||||||
was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */
|
|
||||||
|
|
||||||
#define PTR void *
|
|
||||||
|
|
||||||
#undef const
|
|
||||||
#undef volatile
|
|
||||||
#undef signed
|
|
||||||
|
|
||||||
/* inline requires special treatment; it's in C99, and GCC >=2.7 supports
|
/* inline requires special treatment; it's in C99, and GCC >=2.7 supports
|
||||||
it too, but it's not in C89. */
|
it too, but it's not in C89. */
|
||||||
#undef inline
|
#undef inline
|
||||||
#if __STDC_VERSION__ >= 199901L || defined(__cplusplus) || (defined(__SUNPRO_C) && defined(__C99FEATURES__))
|
#if (!defined(__cplusplus) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) || (defined(__SUNPRO_C) && defined(__C99FEATURES__))
|
||||||
/* it's a keyword */
|
/* it's a keyword */
|
||||||
#else
|
#else
|
||||||
# if GCC_VERSION >= 2007
|
# if GCC_VERSION >= 2007
|
||||||
@ -93,22 +68,6 @@ So instead we use the macro below and test it against specific values. */
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else /* Not ANSI C. */
|
|
||||||
|
|
||||||
#define PTR char *
|
|
||||||
|
|
||||||
/* some systems define these in header files for non-ansi mode */
|
|
||||||
#undef const
|
|
||||||
#undef volatile
|
|
||||||
#undef signed
|
|
||||||
#undef inline
|
|
||||||
#define const
|
|
||||||
#define volatile
|
|
||||||
#define signed
|
|
||||||
#define inline
|
|
||||||
|
|
||||||
#endif /* ANSI C. */
|
|
||||||
|
|
||||||
/* Define macros for some gcc attributes. This permits us to use the
|
/* Define macros for some gcc attributes. This permits us to use the
|
||||||
macros freely, and know that they will come into play for the
|
macros freely, and know that they will come into play for the
|
||||||
version of gcc in which they are supported. */
|
version of gcc in which they are supported. */
|
||||||
@ -296,6 +255,40 @@ So instead we use the macro below and test it against specific values. */
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Attribute `alloc_size' was valid as of gcc 4.3. */
|
||||||
|
#ifndef ATTRIBUTE_RESULT_SIZE_1
|
||||||
|
# if (GCC_VERSION >= 4003)
|
||||||
|
# define ATTRIBUTE_RESULT_SIZE_1 __attribute__ ((alloc_size (1)))
|
||||||
|
# else
|
||||||
|
# define ATTRIBUTE_RESULT_SIZE_1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ATTRIBUTE_RESULT_SIZE_2
|
||||||
|
# if (GCC_VERSION >= 4003)
|
||||||
|
# define ATTRIBUTE_RESULT_SIZE_2 __attribute__ ((alloc_size (2)))
|
||||||
|
# else
|
||||||
|
# define ATTRIBUTE_RESULT_SIZE_2
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ATTRIBUTE_RESULT_SIZE_1_2
|
||||||
|
# if (GCC_VERSION >= 4003)
|
||||||
|
# define ATTRIBUTE_RESULT_SIZE_1_2 __attribute__ ((alloc_size (1, 2)))
|
||||||
|
# else
|
||||||
|
# define ATTRIBUTE_RESULT_SIZE_1_2
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Attribute `warn_unused_result' was valid as of gcc 3.3. */
|
||||||
|
#ifndef ATTRIBUTE_WARN_UNUSED_RESULT
|
||||||
|
# if GCC_VERSION >= 3003
|
||||||
|
# define ATTRIBUTE_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result))
|
||||||
|
# else
|
||||||
|
# define ATTRIBUTE_WARN_UNUSED_RESULT
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* We use __extension__ in some places to suppress -pedantic warnings
|
/* We use __extension__ in some places to suppress -pedantic warnings
|
||||||
about GCC extensions. This feature didn't work properly before
|
about GCC extensions. This feature didn't work properly before
|
||||||
gcc 2.8. */
|
gcc 2.8. */
|
||||||
@ -326,53 +319,12 @@ So instead we use the macro below and test it against specific values. */
|
|||||||
#define ENUM_BITFIELD(TYPE) unsigned int
|
#define ENUM_BITFIELD(TYPE) unsigned int
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __cpp_constexpr >= 200704
|
#if defined(__cplusplus) && __cpp_constexpr >= 200704
|
||||||
#define CONSTEXPR constexpr
|
#define CONSTEXPR constexpr
|
||||||
#else
|
#else
|
||||||
#define CONSTEXPR
|
#define CONSTEXPR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* C++11 adds the ability to add "override" after an implementation of a
|
|
||||||
virtual function in a subclass, to:
|
|
||||||
(A) document that this is an override of a virtual function
|
|
||||||
(B) allow the compiler to issue a warning if it isn't (e.g. a mismatch
|
|
||||||
of the type signature).
|
|
||||||
|
|
||||||
Similarly, it allows us to add a "final" to indicate that no subclass
|
|
||||||
may subsequently override the vfunc.
|
|
||||||
|
|
||||||
Provide OVERRIDE and FINAL as macros, allowing us to get these benefits
|
|
||||||
when compiling with C++11 support, but without requiring C++11.
|
|
||||||
|
|
||||||
For gcc, use "-std=c++11" to enable C++11 support; gcc 6 onwards enables
|
|
||||||
this by default (actually GNU++14). */
|
|
||||||
|
|
||||||
#if defined __cplusplus
|
|
||||||
# if __cplusplus >= 201103
|
|
||||||
/* C++11 claims to be available: use it. Final/override were only
|
|
||||||
implemented in 4.7, though. */
|
|
||||||
# if GCC_VERSION < 4007
|
|
||||||
# define OVERRIDE
|
|
||||||
# define FINAL
|
|
||||||
# else
|
|
||||||
# define OVERRIDE override
|
|
||||||
# define FINAL final
|
|
||||||
# endif
|
|
||||||
# elif GCC_VERSION >= 4007
|
|
||||||
/* G++ 4.7 supports __final in C++98. */
|
|
||||||
# define OVERRIDE
|
|
||||||
# define FINAL __final
|
|
||||||
# else
|
|
||||||
/* No C++11 support; leave the macros empty. */
|
|
||||||
# define OVERRIDE
|
|
||||||
# define FINAL
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
/* No C++11 support; leave the macros empty. */
|
|
||||||
# define OVERRIDE
|
|
||||||
# define FINAL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A macro to disable the copy constructor and assignment operator.
|
/* A macro to disable the copy constructor and assignment operator.
|
||||||
When building with C++11 and above, the methods are explicitly
|
When building with C++11 and above, the methods are explicitly
|
||||||
deleted, causing a compile-time error if something tries to copy.
|
deleted, causing a compile-time error if something tries to copy.
|
||||||
@ -389,7 +341,7 @@ So instead we use the macro below and test it against specific values. */
|
|||||||
|
|
||||||
so that most attempts at copy are caught at compile-time. */
|
so that most attempts at copy are caught at compile-time. */
|
||||||
|
|
||||||
#if __cplusplus >= 201103
|
#if defined(__cplusplus) && __cplusplus >= 201103
|
||||||
#define DISABLE_COPY_AND_ASSIGN(TYPE) \
|
#define DISABLE_COPY_AND_ASSIGN(TYPE) \
|
||||||
TYPE (const TYPE&) = delete; \
|
TYPE (const TYPE&) = delete; \
|
||||||
void operator= (const TYPE &) = delete
|
void operator= (const TYPE &) = delete
|
@ -1,9 +1,9 @@
|
|||||||
/* ###
|
/* ###
|
||||||
* IP: GPL 3 Linking Permitted
|
* IP: LGPL 2.1
|
||||||
* NOTE: See binutils/libiberty/COPYING.LIB; Used GPL 3 from this file's header
|
* NOTE: See binutils/include/COPYING
|
||||||
*/
|
*/
|
||||||
/* Internal demangler interface for g++ V3 ABI.
|
/* Internal demangler interface for g++ V3 ABI.
|
||||||
Copyright (C) 2003-2019 Free Software Foundation, Inc.
|
Copyright (C) 2003-2023 Free Software Foundation, Inc.
|
||||||
Written by Ian Lance Taylor <ian@wasabisystems.com>.
|
Written by Ian Lance Taylor <ian@wasabisystems.com>.
|
||||||
|
|
||||||
This file is part of the libiberty library, which is part of GCC.
|
This file is part of the libiberty library, which is part of GCC.
|
||||||
@ -126,6 +126,10 @@ struct d_info
|
|||||||
/* Non-zero if we are parsing the type operand of a conversion
|
/* Non-zero if we are parsing the type operand of a conversion
|
||||||
operator, but not when in an expression. */
|
operator, but not when in an expression. */
|
||||||
int is_conversion;
|
int is_conversion;
|
||||||
|
/* 1: using new unresolved-name grammar.
|
||||||
|
-1: using new unresolved-name grammar and saw an unresolved-name.
|
||||||
|
0: using old unresolved-name grammar. */
|
||||||
|
int unresolved_name_state;
|
||||||
/* If DMGL_NO_RECURSE_LIMIT is not active then this is set to
|
/* If DMGL_NO_RECURSE_LIMIT is not active then this is set to
|
||||||
the current recursion level. */
|
the current recursion level. */
|
||||||
unsigned int recursion_level;
|
unsigned int recursion_level;
|
||||||
@ -180,7 +184,7 @@ d_advance (struct d_info *di, int i)
|
|||||||
extern const struct demangle_operator_info cplus_demangle_operators[];
|
extern const struct demangle_operator_info cplus_demangle_operators[];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define D_BUILTIN_TYPE_COUNT (34)
|
#define D_BUILTIN_TYPE_COUNT (36)
|
||||||
|
|
||||||
CP_STATIC_IF_GLIBCPP_V3
|
CP_STATIC_IF_GLIBCPP_V3
|
||||||
const struct demangle_builtin_type_info
|
const struct demangle_builtin_type_info
|
@ -3,7 +3,7 @@
|
|||||||
* NOTE: See binutils/include/COPYING
|
* NOTE: See binutils/include/COPYING
|
||||||
*/
|
*/
|
||||||
/* Defs for interface to demanglers.
|
/* Defs for interface to demanglers.
|
||||||
Copyright (C) 1992-2019 Free Software Foundation, Inc.
|
Copyright (C) 1992-2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License
|
modify it under the terms of the GNU Library General Public License
|
||||||
@ -163,24 +163,11 @@ ada_demangle (const char *mangled, int options);
|
|||||||
extern char *
|
extern char *
|
||||||
dlang_demangle (const char *mangled, int options);
|
dlang_demangle (const char *mangled, int options);
|
||||||
|
|
||||||
/* Returns non-zero iff MANGLED is a rust mangled symbol. MANGLED must
|
|
||||||
already have been demangled through cplus_demangle_v3. If this function
|
|
||||||
returns non-zero then MANGLED can be demangled (in-place) using
|
|
||||||
RUST_DEMANGLE_SYM. */
|
|
||||||
extern int
|
extern int
|
||||||
rust_is_mangled (const char *mangled);
|
rust_demangle_callback (const char *mangled, int options,
|
||||||
|
demangle_callbackref callback, void *opaque);
|
||||||
|
|
||||||
/* Demangles SYM (in-place) if RUST_IS_MANGLED returned non-zero for SYM.
|
|
||||||
If RUST_IS_MANGLED returned zero for SYM then RUST_DEMANGLE_SYM might
|
|
||||||
replace characters that cannot be demangled with '?' and might truncate
|
|
||||||
SYM. After calling RUST_DEMANGLE_SYM SYM might be shorter, but never
|
|
||||||
larger. */
|
|
||||||
extern void
|
|
||||||
rust_demangle_sym (char *sym);
|
|
||||||
|
|
||||||
/* Demangles MANGLED if it was GNU_V3 and then RUST mangled, otherwise
|
|
||||||
returns NULL. Uses CPLUS_DEMANGLE_V3, RUST_IS_MANGLED and
|
|
||||||
RUST_DEMANGLE_SYM. Returns a new string that is owned by the caller. */
|
|
||||||
extern char *
|
extern char *
|
||||||
rust_demangle (const char *mangled, int options);
|
rust_demangle (const char *mangled, int options);
|
||||||
|
|
||||||
@ -425,6 +412,9 @@ enum demangle_component_type
|
|||||||
number which involves neither modifying the mangled string nor
|
number which involves neither modifying the mangled string nor
|
||||||
allocating a new copy of the literal in memory. */
|
allocating a new copy of the literal in memory. */
|
||||||
DEMANGLE_COMPONENT_LITERAL_NEG,
|
DEMANGLE_COMPONENT_LITERAL_NEG,
|
||||||
|
/* A vendor's builtin expression. The left subtree holds the
|
||||||
|
expression's name, and the right subtree is a argument list. */
|
||||||
|
DEMANGLE_COMPONENT_VENDOR_EXPR,
|
||||||
/* A libgcj compiled resource. The left subtree is the name of the
|
/* A libgcj compiled resource. The left subtree is the name of the
|
||||||
resource. */
|
resource. */
|
||||||
DEMANGLE_COMPONENT_JAVA_RESOURCE,
|
DEMANGLE_COMPONENT_JAVA_RESOURCE,
|
||||||
@ -463,7 +453,25 @@ enum demangle_component_type
|
|||||||
/* A cloned function. */
|
/* A cloned function. */
|
||||||
DEMANGLE_COMPONENT_CLONE,
|
DEMANGLE_COMPONENT_CLONE,
|
||||||
DEMANGLE_COMPONENT_NOEXCEPT,
|
DEMANGLE_COMPONENT_NOEXCEPT,
|
||||||
DEMANGLE_COMPONENT_THROW_SPEC
|
DEMANGLE_COMPONENT_THROW_SPEC,
|
||||||
|
|
||||||
|
DEMANGLE_COMPONENT_STRUCTURED_BINDING,
|
||||||
|
|
||||||
|
DEMANGLE_COMPONENT_MODULE_NAME,
|
||||||
|
DEMANGLE_COMPONENT_MODULE_PARTITION,
|
||||||
|
DEMANGLE_COMPONENT_MODULE_ENTITY,
|
||||||
|
DEMANGLE_COMPONENT_MODULE_INIT,
|
||||||
|
|
||||||
|
DEMANGLE_COMPONENT_TEMPLATE_HEAD,
|
||||||
|
DEMANGLE_COMPONENT_TEMPLATE_TYPE_PARM,
|
||||||
|
DEMANGLE_COMPONENT_TEMPLATE_NON_TYPE_PARM,
|
||||||
|
DEMANGLE_COMPONENT_TEMPLATE_TEMPLATE_PARM,
|
||||||
|
DEMANGLE_COMPONENT_TEMPLATE_PACK_PARM,
|
||||||
|
|
||||||
|
/* A builtin type with argument. This holds the builtin type
|
||||||
|
information. */
|
||||||
|
DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Types which are only used internally. */
|
/* Types which are only used internally. */
|
||||||
@ -485,6 +493,7 @@ struct demangle_component
|
|||||||
Initialize to zero. Private to d_print_comp.
|
Initialize to zero. Private to d_print_comp.
|
||||||
All other fields are final after initialization. */
|
All other fields are final after initialization. */
|
||||||
int d_printing;
|
int d_printing;
|
||||||
|
int d_counting;
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
@ -549,6 +558,15 @@ struct demangle_component
|
|||||||
const struct demangle_builtin_type_info *type;
|
const struct demangle_builtin_type_info *type;
|
||||||
} s_builtin;
|
} s_builtin;
|
||||||
|
|
||||||
|
/* For DEMANGLE_COMPONENT_EXTENDED_BUILTIN_TYPE. */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/* Builtin type. */
|
||||||
|
const struct demangle_builtin_type_info *type;
|
||||||
|
short arg;
|
||||||
|
char suffix;
|
||||||
|
} s_extended_builtin;
|
||||||
|
|
||||||
/* For DEMANGLE_COMPONENT_SUB_STD. */
|
/* For DEMANGLE_COMPONENT_SUB_STD. */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
@ -3,7 +3,7 @@
|
|||||||
* NOTE: See binutils/include/COPYING3
|
* NOTE: See binutils/include/COPYING3
|
||||||
*/
|
*/
|
||||||
/* An abstract string datatype.
|
/* An abstract string datatype.
|
||||||
Copyright (C) 1998-2019 Free Software Foundation, Inc.
|
Copyright (C) 1998-2023 Free Software Foundation, Inc.
|
||||||
Contributed by Mark Mitchell (mark@markmitchell.com).
|
Contributed by Mark Mitchell (mark@markmitchell.com).
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
@ -3,7 +3,7 @@
|
|||||||
* NOTE: See binutils/include/COPYING3
|
* NOTE: See binutils/include/COPYING3
|
||||||
*/
|
*/
|
||||||
/* Declarations for getopt.
|
/* Declarations for getopt.
|
||||||
Copyright (C) 1989-2019 Free Software Foundation, Inc.
|
Copyright (C) 1989-2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||||
Bugs can be reported to bug-glibc@gnu.org.
|
Bugs can be reported to bug-glibc@gnu.org.
|
@ -4,7 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
/* Function declarations for libiberty.
|
/* Function declarations for libiberty.
|
||||||
|
|
||||||
Copyright (C) 1997-2019 Free Software Foundation, Inc.
|
Copyright (C) 1997-2023 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Note - certain prototypes declared in this header file are for
|
Note - certain prototypes declared in this header file are for
|
||||||
functions whoes implementation copyright does not belong to the
|
functions whoes implementation copyright does not belong to the
|
||||||
@ -141,6 +141,10 @@ extern const char *unix_lbasename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRI
|
|||||||
|
|
||||||
extern char *lrealpath (const char *);
|
extern char *lrealpath (const char *);
|
||||||
|
|
||||||
|
/* Return true when FD file descriptor exists. */
|
||||||
|
|
||||||
|
extern int is_valid_fd (int fd);
|
||||||
|
|
||||||
/* Concatenate an arbitrary number of strings. You must pass NULL as
|
/* Concatenate an arbitrary number of strings. You must pass NULL as
|
||||||
the last argument of this function, to terminate the list of
|
the last argument of this function, to terminate the list of
|
||||||
strings. Allocates memory using xmalloc. */
|
strings. Allocates memory using xmalloc. */
|
||||||
@ -314,30 +318,30 @@ extern void xmalloc_failed (size_t) ATTRIBUTE_NORETURN;
|
|||||||
message to stderr (using the name set by xmalloc_set_program_name,
|
message to stderr (using the name set by xmalloc_set_program_name,
|
||||||
if any) and then call xexit. */
|
if any) and then call xexit. */
|
||||||
|
|
||||||
extern void *xmalloc (size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
|
extern void *xmalloc (size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_RESULT_SIZE_1 ATTRIBUTE_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
/* Reallocate memory without fail. This works like xmalloc. Note,
|
/* Reallocate memory without fail. This works like xmalloc. Note,
|
||||||
realloc type functions are not suitable for attribute malloc since
|
realloc type functions are not suitable for attribute malloc since
|
||||||
they may return the same address across multiple calls. */
|
they may return the same address across multiple calls. */
|
||||||
|
|
||||||
extern void *xrealloc (void *, size_t) ATTRIBUTE_RETURNS_NONNULL;
|
extern void *xrealloc (void *, size_t) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_RESULT_SIZE_2 ATTRIBUTE_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
/* Allocate memory without fail and set it to zero. This works like
|
/* Allocate memory without fail and set it to zero. This works like
|
||||||
xmalloc. */
|
xmalloc. */
|
||||||
|
|
||||||
extern void *xcalloc (size_t, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
|
extern void *xcalloc (size_t, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_RESULT_SIZE_1_2 ATTRIBUTE_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
/* Copy a string into a memory buffer without fail. */
|
/* Copy a string into a memory buffer without fail. */
|
||||||
|
|
||||||
extern char *xstrdup (const char *) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
|
extern char *xstrdup (const char *) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
/* Copy at most N characters from string into a buffer without fail. */
|
/* Copy at most N characters from string into a buffer without fail. */
|
||||||
|
|
||||||
extern char *xstrndup (const char *, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
|
extern char *xstrndup (const char *, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
/* Copy an existing memory buffer to a new memory buffer without fail. */
|
/* Copy an existing memory buffer to a new memory buffer without fail. */
|
||||||
|
|
||||||
extern void *xmemdup (const void *, size_t, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
|
extern void *xmemdup (const void *, size_t, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
/* Physical memory routines. Return values are in BYTES. */
|
/* Physical memory routines. Return values are in BYTES. */
|
||||||
extern double physmem_total (void);
|
extern double physmem_total (void);
|
||||||
@ -641,6 +645,13 @@ extern int pexecute (const char *, char * const *, const char *,
|
|||||||
|
|
||||||
extern int pwait (int, int *, int);
|
extern int pwait (int, int *, int);
|
||||||
|
|
||||||
|
/* Like bsearch, but takes and passes on an argument like qsort_r. */
|
||||||
|
|
||||||
|
extern void *bsearch_r (const void *, const void *,
|
||||||
|
size_t, size_t,
|
||||||
|
int (*)(const void *, const void *, void *),
|
||||||
|
void *);
|
||||||
|
|
||||||
#if defined(HAVE_DECL_ASPRINTF) && !HAVE_DECL_ASPRINTF
|
#if defined(HAVE_DECL_ASPRINTF) && !HAVE_DECL_ASPRINTF
|
||||||
/* Like sprintf but provides a pointer to malloc'd storage, which must
|
/* Like sprintf but provides a pointer to malloc'd storage, which must
|
||||||
be freed by the caller. */
|
be freed by the caller. */
|
||||||
@ -653,7 +664,7 @@ extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
|
|||||||
|
|
||||||
extern char *xasprintf (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_PRINTF_1;
|
extern char *xasprintf (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_PRINTF_1;
|
||||||
|
|
||||||
#if !HAVE_DECL_VASPRINTF
|
#if defined(HAVE_DECL_VASPRINTF) && !HAVE_DECL_VASPRINTF
|
||||||
/* Like vsprintf but provides a pointer to malloc'd storage, which
|
/* Like vsprintf but provides a pointer to malloc'd storage, which
|
||||||
must be freed by the caller. */
|
must be freed by the caller. */
|
||||||
|
|
||||||
@ -706,11 +717,6 @@ extern unsigned long long int strtoull (const char *nptr,
|
|||||||
char **endptr, int base);
|
char **endptr, int base);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_DECL_STRVERSCMP) && !HAVE_DECL_STRVERSCMP
|
|
||||||
/* Compare version strings. */
|
|
||||||
extern int strverscmp (const char *, const char *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Set the title of a process */
|
/* Set the title of a process */
|
||||||
extern void setproctitle (const char *name, ...);
|
extern void setproctitle (const char *name, ...);
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
/* <ctype.h> replacement macros.
|
/* <ctype.h> replacement macros.
|
||||||
|
|
||||||
Copyright (C) 2000-2019 Free Software Foundation, Inc.
|
Copyright (C) 2000-2023 Free Software Foundation, Inc.
|
||||||
Contributed by Zack Weinberg <zackw@stanford.edu>.
|
Contributed by Zack Weinberg <zackw@stanford.edu>.
|
||||||
|
|
||||||
This file is part of the libiberty library.
|
This file is part of the libiberty library.
|
@ -441,7 +441,7 @@
|
|||||||
<P>
|
<P>
|
||||||
<U><B>Use Deprecated Demangler</B></U> -
|
<U><B>Use Deprecated Demangler</B></U> -
|
||||||
By default, GCC symbols will be demangled using the most up-to-date demangler
|
By default, GCC symbols will be demangled using the most up-to-date demangler
|
||||||
that Ghidra contains (<B>version 2.33.1</B> as of this writing). Turning this
|
that Ghidra contains (<B>version 2.41</B> as of this writing). Turning this
|
||||||
option on will invoke the now deprecated version of the demangler (<B>version 2.24</B>).
|
option on will invoke the now deprecated version of the demangler (<B>version 2.24</B>).
|
||||||
</P>
|
</P>
|
||||||
<P>
|
<P>
|
||||||
@ -457,7 +457,7 @@
|
|||||||
<UL>
|
<UL>
|
||||||
<LI><CODE CLASS="path">
|
<LI><CODE CLASS="path">
|
||||||
<GHIDRA_INSTALL_DIR>/GPL/DemanglerGnu/os/<OS>/
|
<GHIDRA_INSTALL_DIR>/GPL/DemanglerGnu/os/<OS>/
|
||||||
</CODE><CODE>demangler_gnu_v2_33_1</CODE></LI>
|
</CODE><CODE>demangler_gnu_v2_41</CODE></LI>
|
||||||
<LI><CODE CLASS="path">
|
<LI><CODE CLASS="path">
|
||||||
<GHIDRA_INSTALL_DIR>/GPL/DemanglerGnu/os/<OS>/
|
<GHIDRA_INSTALL_DIR>/GPL/DemanglerGnu/os/<OS>/
|
||||||
</CODE><CODE>demangler_gnu_v2_24</CODE></LI>
|
</CODE><CODE>demangler_gnu_v2_24</CODE></LI>
|
||||||
|
@ -34,14 +34,15 @@ public class GnuDemanglerOptions extends DemanglerOptions {
|
|||||||
public static final String GNU_DEMANGLER_V2_24 = "demangler_gnu_v2_24";
|
public static final String GNU_DEMANGLER_V2_24 = "demangler_gnu_v2_24";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Version 2.33.1 of the GNU demangler. This version supports less formats than older versions.
|
* Version 2.41 of the GNU demangler. This version supports less formats than
|
||||||
|
* {@link #GNU_DEMANGLER_V2_24}.
|
||||||
*/
|
*/
|
||||||
public static final String GNU_DEMANGLER_V2_33_1 = "demangler_gnu_v2_33_1";
|
public static final String GNU_DEMANGLER_V2_41 = "demangler_gnu_v2_41";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default version to use of the GNU demangler
|
* The default version to use of the GNU demangler
|
||||||
*/
|
*/
|
||||||
public static final String GNU_DEMANGLER_DEFAULT = GNU_DEMANGLER_V2_33_1;
|
public static final String GNU_DEMANGLER_DEFAULT = GNU_DEMANGLER_V2_41;
|
||||||
|
|
||||||
private final GnuDemanglerFormat format;
|
private final GnuDemanglerFormat format;
|
||||||
private final boolean isDeprecated;
|
private final boolean isDeprecated;
|
||||||
@ -112,7 +113,7 @@ public class GnuDemanglerOptions extends DemanglerOptions {
|
|||||||
* @return the name
|
* @return the name
|
||||||
*/
|
*/
|
||||||
public String getDemanglerName() {
|
public String getDemanglerName() {
|
||||||
return isDeprecated ? GNU_DEMANGLER_V2_24 : GNU_DEMANGLER_V2_33_1;
|
return isDeprecated ? GNU_DEMANGLER_V2_24 : GNU_DEMANGLER_V2_41;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -320,6 +320,22 @@ public class GnuDemanglerParser {
|
|||||||
*/
|
*/
|
||||||
private static final Pattern LITERAL_NUMBER_PATTERN = Pattern.compile("-*\\d+[ul]{0,1}");
|
private static final Pattern LITERAL_NUMBER_PATTERN = Pattern.compile("-*\\d+[ul]{0,1}");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pattern to identify a legacy rust string that contains its hash id suffix and capture the
|
||||||
|
* non-hash portion.
|
||||||
|
*
|
||||||
|
* Legacy mangled rust symbols:
|
||||||
|
* - start with _ZN
|
||||||
|
* - end withe E or E.
|
||||||
|
* - have a 16 digit hash that starts with 17h
|
||||||
|
*
|
||||||
|
* The demangled string has the leading '17' and trailing 'E|E.' removed.
|
||||||
|
*
|
||||||
|
* Sample: std::io::Read::read_to_end::hb85a0f6802e14499
|
||||||
|
*/
|
||||||
|
private static final Pattern RUST_LEGACY_SUFFIX_PATTERN =
|
||||||
|
Pattern.compile("(.*)::h[0-9a-f]{16}");
|
||||||
|
|
||||||
private String mangledSource;
|
private String mangledSource;
|
||||||
private String demangledSource;
|
private String demangledSource;
|
||||||
|
|
||||||
@ -333,6 +349,8 @@ public class GnuDemanglerParser {
|
|||||||
*/
|
*/
|
||||||
public DemangledObject parse(String mangled, String demangled) throws DemanglerParseException {
|
public DemangledObject parse(String mangled, String demangled) throws DemanglerParseException {
|
||||||
|
|
||||||
|
demangled = cleanupRustLegacySymbol(demangled);
|
||||||
|
|
||||||
this.mangledSource = mangled;
|
this.mangledSource = mangled;
|
||||||
this.demangledSource = demangled;
|
this.demangledSource = demangled;
|
||||||
|
|
||||||
@ -465,6 +483,14 @@ public class GnuDemanglerParser {
|
|||||||
return function;
|
return function;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String cleanupRustLegacySymbol(String demangled) {
|
||||||
|
Matcher m = RUST_LEGACY_SUFFIX_PATTERN.matcher(demangled);
|
||||||
|
if (m.matches()) {
|
||||||
|
return m.group(1);
|
||||||
|
}
|
||||||
|
return demangled;
|
||||||
|
}
|
||||||
|
|
||||||
private void setReturnType(String demangled, DemangledFunction function, String returnType) {
|
private void setReturnType(String demangled, DemangledFunction function, String returnType) {
|
||||||
|
|
||||||
String updatedReturnType = returnType;
|
String updatedReturnType = returnType;
|
||||||
|
@ -33,7 +33,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
process = GnuDemanglerNativeProcess
|
process = GnuDemanglerNativeProcess
|
||||||
.getDemanglerNativeProcess(GnuDemanglerOptions.GNU_DEMANGLER_V2_33_1);
|
.getDemanglerNativeProcess(GnuDemanglerOptions.GNU_DEMANGLER_V2_41);
|
||||||
parser = new GnuDemanglerParser();
|
parser = new GnuDemanglerParser();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1025,12 +1025,11 @@ public class GnuDemanglerParserTest extends AbstractGenericTest {
|
|||||||
String demangled = process.demangle(mangled);
|
String demangled = process.demangle(mangled);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
typeinfo for
|
typeinfo for
|
||||||
std::__ndk1::__function::__func<
|
std::__ndk1::__function::__func<
|
||||||
dummy::it::other::Namespace::function(float)::$_2::operator()(dummy::it::other::Namespace*) const::{lambda(dummy::it::other::Namespace*)#1},
|
dummy::it::other::Namespace::function(float)::$_2::operator()(dummy::it::other::Namespace*) const::{lambda(dummy::it::other::Namespace*)#1},
|
||||||
std::__ndk1::allocator<{lambda(dummy::it::other::Namespace*)#1}>,
|
std::__ndk1::allocator<dummy::it::other::Namespace::function(float)::$_2::operator()(dummy::it::other::Namespace*) const::{lambda(dummy::it::other::Namespace*)#1}>,
|
||||||
int (dummy::it::other::Namespace*)
|
int (dummy::it::other::Namespace*)>
|
||||||
>
|
|
||||||
|
|
||||||
'__func' has 3 template parameters, the operator and the allocator
|
'__func' has 3 template parameters, the operator and the allocator
|
||||||
|
|
||||||
@ -1042,7 +1041,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest {
|
|||||||
|
|
||||||
String lambdaOperator =
|
String lambdaOperator =
|
||||||
dummyNs + "::function(float)::$_2::operator()(" + dummyNsP + ")const::" + lambda;
|
dummyNs + "::function(float)::$_2::operator()(" + dummyNsP + ")const::" + lambda;
|
||||||
String lambdaAllocator = "std::__ndk1::allocator<" + lambda + ">";
|
String lambdaAllocator = "std::__ndk1::allocator<" + lambdaOperator + ">";
|
||||||
String thirdParam = "int(" + dummyNsP + ")";
|
String thirdParam = "int(" + dummyNsP + ")";
|
||||||
|
|
||||||
String infoNs = "std::__ndk1::__function::";
|
String infoNs = "std::__ndk1::__function::";
|
||||||
@ -1092,7 +1091,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest {
|
|||||||
|
|
||||||
String signature = object.getSignature(false);
|
String signature = object.getSignature(false);
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"undefined std::__array_traits<LayerDetails::RandomProviderT<LayerDetails::LayerBase::initRandom(long,long)const::{lambda(long&,unsigned_int)#1}>,4ul>::_S_ref(LayerDetails::LayerBase::initRandom(long,long) const::{lambda(long&, unsigned int)#1} const &[],unsigned long)",
|
"undefined std::__array_traits<LayerDetails::RandomProviderT<LayerDetails::LayerBase::initRandom(long,long)const::{lambda(long&,unsigned_int)#1}>,4ul>::_S_ref(LayerDetails::RandomProviderT<LayerDetails::LayerBase::initRandom(long, long) const::{lambda(long&, unsigned int)#1}> const &[],unsigned long)",
|
||||||
signature);
|
signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1163,6 +1162,8 @@ public class GnuDemanglerParserTest extends AbstractGenericTest {
|
|||||||
|
|
||||||
lambda contents - lambdas in templates and as a parameter
|
lambda contents - lambdas in templates and as a parameter
|
||||||
|
|
||||||
|
Note: the demangled string makes use of the 'auto' parameter keyword
|
||||||
|
|
||||||
bool (***
|
bool (***
|
||||||
const* std::
|
const* std::
|
||||||
__addressof<
|
__addressof<
|
||||||
@ -1196,7 +1197,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest {
|
|||||||
|
|
||||||
String signature = object.getSignature(false);
|
String signature = object.getSignature(false);
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"undefined Bedrock::Threading::TLSDetail::DefaultConstructor<bool(**)(AssertHandlerContext_const&),void>::create()::{lambda(bool(***const*std::__addressof<Bedrock::Threading::TLSDetail::DefaultConstructor<bool(**)(AssertHandlerContext_const&),void>::create()::{lambda(bool(***const)(AssertHandlerContext_const&))#1}>(Bedrock::Threading::TLSDetail::DefaultConstructor<bool(**)(AssertHandlerContext_const&),void>::create()::{lambda(bool(***const&)(AssertHandlerContext_const&))#1}))(AssertHandlerContext_const&))#1}",
|
"undefined Bedrock::Threading::TLSDetail::DefaultConstructor<bool(**)(AssertHandlerContext_const&),void>::create()::{lambda(bool(***const*std::__addressof<Bedrock::Threading::TLSDetail::DefaultConstructor<bool(**)(AssertHandlerContext_const&),void>::create()::{lambda(bool(***const)(AssertHandlerContext_const&))#1}>(auto:1&))(AssertHandlerContext_const&))#1}",
|
||||||
signature);
|
signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1997,7 +1998,7 @@ public class GnuDemanglerParserTest extends AbstractGenericTest {
|
|||||||
|
|
||||||
String signature = object.getSignature(false);
|
String signature = object.getSignature(false);
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"int LayerDetails::RandomProviderT<LayerDetails::LayerBase::initRandom(long,long)const::{lambda(long&,unsigned_int)#1}>::operator()<int,2ul>(LayerDetails::RandomProviderT<LayerDetails::LayerBase::initRandom(long,long)const::{lambda(long&,unsigned_int)#1}>::operator() const &[])",
|
"int LayerDetails::RandomProviderT<LayerDetails::LayerBase::initRandom(long,long)const::{lambda(long&,unsigned_int)#1}>::operator()<int,2ul>(int const &[])",
|
||||||
signature);
|
signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2140,6 +2141,34 @@ public class GnuDemanglerParserTest extends AbstractGenericTest {
|
|||||||
new DemangledDataType("fake", "fake", DemangledDataType.LONG_LONG).getDataType(null));
|
new DemangledDataType("fake", "fake", DemangledDataType.LONG_LONG).getDataType(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRustLegacyHashIsIgnored() throws Exception {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Mangled: _ZN3std2io4Read11read_to_end17hb85a0f6802e14499E
|
||||||
|
//
|
||||||
|
// Demangled: std::io::Read::read_to_end::hb85a0f6802e14499
|
||||||
|
//
|
||||||
|
// Parsed: std::io::Read::read_to_end
|
||||||
|
//
|
||||||
|
// Legacy mangled rust symbols:
|
||||||
|
// - start with _ZN
|
||||||
|
// - end withe E or E.
|
||||||
|
// - have a 16 digit hash that starts with 17h
|
||||||
|
//
|
||||||
|
String mangled = "_ZN3std2io4Read11read_to_end17hb85a0f6802e14499E";
|
||||||
|
String demangled = process.demangle(mangled);
|
||||||
|
|
||||||
|
assertEquals(demangled, "std::io::Read::read_to_end::hb85a0f6802e14499");
|
||||||
|
|
||||||
|
DemangledObject object = parser.parse(mangled, demangled);
|
||||||
|
assertNotNull(object);
|
||||||
|
assertType(object, DemangledVariable.class);
|
||||||
|
|
||||||
|
String signature = object.getSignature(false);
|
||||||
|
assertEquals("std::io::Read::read_to_end", signature);
|
||||||
|
}
|
||||||
|
|
||||||
private void assertType(Demangled o, Class<?> c) {
|
private void assertType(Demangled o, Class<?> c) {
|
||||||
assertTrue("Wrong demangled type. " + "\nExpected " + c + "; " + "\nfound " + o.getClass(),
|
assertTrue("Wrong demangled type. " + "\nExpected " + c + "; " + "\nfound " + o.getClass(),
|
||||||
c.isInstance(o));
|
c.isInstance(o));
|
||||||
|
Loading…
Reference in New Issue
Block a user