File: demangle.h

package info (click to toggle)
edb-debugger 1.3.0-2.2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,124 kB
  • sloc: cpp: 46,241; xml: 4,998; ansic: 3,088; sh: 52; asm: 33; makefile: 5
file content (40 lines) | stat: -rw-r--r-- 856 bytes parent folder | download | duplicates (4)
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

#ifndef EDB_DEMANGLE_H_20151113_
#define EDB_DEMANGLE_H_20151113_

#include <QString>
#include <QStringList>

#ifdef __GNUG__
#include <cxxabi.h>
#include <memory>

#define DEMANGLING_SUPPORTED

inline QString demangle(const QString &mangled) {
	if (!mangled.startsWith("_Z")) {
		return mangled; // otherwise we'll try to demangle C functions coinciding with types like "f" as "float", which is bad
	}

	int failed        = 0;
	QStringList split = mangled.split("@"); // for cases like funcName@plt

	std::unique_ptr<char, decltype(std::free) *> demangled(abi::__cxa_demangle(split.front().toStdString().c_str(), nullptr, nullptr, &failed), std::free);

	if (failed) {
		return mangled;
	}

	split.front() = QString(demangled.get());
	return split.join("@");
}

#else

inline QString demangle(const QString &mangled) {
	return mangled;
}

#endif

#endif