summaryrefslogtreecommitdiffstats
path: root/libcxxabi/src
diff options
context:
space:
mode:
authorHoward Hinnant <hhinnant@apple.com>2013-06-19 13:43:18 +0000
committerHoward Hinnant <hhinnant@apple.com>2013-06-19 13:43:18 +0000
commitb0767534542c2b0a65c55ebf418a3b93f395ece5 (patch)
tree0c9957d7ecf4ac35fd5b2cdbd9367ab3f278093c /libcxxabi/src
parent45f96f87c3cf09e757048e186db4f9290f5543b4 (diff)
downloadbcm5719-llvm-b0767534542c2b0a65c55ebf418a3b93f395ece5.tar.gz
bcm5719-llvm-b0767534542c2b0a65c55ebf418a3b93f395ece5.zip
Demangle objc mangling implemented in r184250
llvm-svn: 184301
Diffstat (limited to 'libcxxabi/src')
-rw-r--r--libcxxabi/src/cxa_demangle.cpp35
1 files changed, 32 insertions, 3 deletions
diff --git a/libcxxabi/src/cxa_demangle.cpp b/libcxxabi/src/cxa_demangle.cpp
index 52c80cf2f8b..081892f63b8 100644
--- a/libcxxabi/src/cxa_demangle.cpp
+++ b/libcxxabi/src/cxa_demangle.cpp
@@ -1759,8 +1759,12 @@ parse_vector_type(const char* first, const char* last, C& db)
// ::= G <type> # imaginary (C 2000)
// ::= Dp <type> # pack expansion (C++0x)
// ::= U <source-name> <type> # vendor extended type qualifier
+// extension := U <objc-name> <objc-type> # objc-type<identifier>
// extension := <vector-type> # <vector-type> starts with Dv
+// <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1
+// <objc-type> := <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name>
+
template <class C>
const char*
parse_type(const char* first, const char* last, C& db)
@@ -1924,7 +1928,14 @@ parse_type(const char* first, const char* last, C& db)
db.names[k].first += "(";
db.names[k].second.insert(0, ")");
}
- db.names[k].first.append("*");
+ if (first[1] != 'U' || db.names[k].first.substr(0, 12) != "objc_object<")
+ {
+ db.names[k].first.append("*");
+ }
+ else
+ {
+ db.names[k].first.replace(0, 11, "id");
+ }
db.subs.back().push_back(db.names[k]);
}
first = t;
@@ -1993,9 +2004,26 @@ parse_type(const char* first, const char* last, C& db)
const char* t2 = parse_type(t, last, db);
if (t2 != t)
{
- auto type = std::move(db.names.back().move_full());
+ auto type = db.names.back().move_full();
db.names.pop_back();
- db.names.back() = type + " " + db.names.back().move_full();
+ if (db.names.back().first.substr(0, 9) != "objcproto")
+ {
+ db.names.back() = type + " " + db.names.back().move_full();
+ }
+ else
+ {
+ auto proto = db.names.back().move_full();
+ db.names.pop_back();
+ t = parse_source_name(proto.data() + 9, proto.data() + proto.size(), db);
+ if (t != proto.data() + 9)
+ {
+ db.names.back() = type + "<" + db.names.back().move_full() + ">";
+ }
+ else
+ {
+ db.names.push_back(type + " " + proto);
+ }
+ }
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
first = t2;
}
@@ -4412,6 +4440,7 @@ __cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status)
};
Db db(a);
db.cv = 0;
+ db.ref = 0;
db.parsed_ctor_dtor_cv = false;
db.tag_templates = true;
db.template_param.emplace_back(a);
OpenPOWER on IntegriCloud