forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDemangleWrappers.cpp
108 lines (96 loc) · 3.7 KB
/
DemangleWrappers.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//===--- DemangleWrappers.cpp - Swift Name Demangling --------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===---------------------------------------------------------------------===//
#include "swift/Basic/DemangleWrappers.h"
#include "swift/Basic/PrettyStackTrace.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/ErrorHandling.h"
using namespace swift;
using namespace demangle_wrappers;
static StringRef getNodeKindString(swift::Demangle::Node::Kind k) {
switch (k) {
#define NODE(ID) \
case Node::Kind::ID: \
return #ID;
#include "swift/Basic/DemangleNodes.def"
}
llvm_unreachable("bad node kind");
}
static void printNode(llvm::raw_ostream &Out, const Node *node,
unsigned depth) {
// Indent two spaces per depth.
Out.indent(depth * 2);
if (!node) {
Out << "<<NULL>>";
return;
}
Out << "kind=" << getNodeKindString(node->getKind());
if (node->hasText()) {
Out << ", text=\"" << node->getText() << '\"';
}
if (node->hasIndex()) {
Out << ", index=" << node->getIndex();
}
Out << '\n';
for (auto &child : *node) {
printNode(Out, child.get(), depth + 1);
}
}
void NodeDumper::dump() const { print(llvm::errs()); }
void NodeDumper::print(llvm::raw_ostream &Out) const {
printNode(Out, Root.get(), 0);
}
namespace {
/// A pretty-stack-trace node for demangling trees.
class PrettyStackTraceNode : public llvm::PrettyStackTraceEntry {
const char *Action;
Node *TheNode;
public:
PrettyStackTraceNode(const char *action, Node *node)
: Action(action), TheNode(node) {}
void print(llvm::raw_ostream &out) const override {
out << "While " << Action << ' ';
if (!TheNode) {
out << "<<null demangling node>>\n";
} else {
out << "demangling tree:\n";
printNode(out, TheNode, 4);
}
}
};
} // end unnamed namespace
NodePointer
swift::demangle_wrappers::demangleSymbolAsNode(llvm::StringRef MangledName,
const DemangleOptions &Options) {
PrettyStackTraceStringAction prettyStackTrace("demangling string",
MangledName);
return swift::Demangle::demangleSymbolAsNode(MangledName.data(),
MangledName.size(), Options);
}
std::string nodeToString(NodePointer Root,
const DemangleOptions &Options) {
PrettyStackTraceNode trace("printing", Root.get());
return swift::Demangle::nodeToString(Root, Options);
}
std::string swift::demangle_wrappers::demangleSymbolAsString(
llvm::StringRef MangledName, const DemangleOptions &Options) {
PrettyStackTraceStringAction prettyStackTrace("demangling string",
MangledName);
return swift::Demangle::demangleSymbolAsString(MangledName.data(),
MangledName.size(), Options);
}
std::string swift::demangle_wrappers::demangleTypeAsString(
llvm::StringRef MangledName, const DemangleOptions &Options) {
PrettyStackTraceStringAction prettyStackTrace("demangling type string",
MangledName);
return swift::Demangle::demangleTypeAsString(MangledName.data(),
MangledName.size(), Options);
}