@@ -45,6 +45,10 @@ static llvm::cl::opt<bool>
4545TreeOnly (" tree-only" ,
4646 llvm::cl::desc (" Tree-only mode (do not show the demangled string)" ));
4747
48+ static llvm::cl::opt<bool >
49+ DemangleType (" type" ,
50+ llvm::cl::desc (" Demangle a runtime type string" ));
51+
4852static llvm::cl::opt<bool >
4953StripSpecialization (" strip-specialization" ,
5054 llvm::cl::desc (" Remangle the origin of a specialized function" ));
@@ -141,7 +145,17 @@ static void demangle(llvm::raw_ostream &os, llvm::StringRef name,
141145 hadLeadingUnderscore = true ;
142146 name = name.substr (1 );
143147 }
144- swift::Demangle::NodePointer pointer = DCtx.demangleSymbolAsNode (name);
148+ swift::Demangle::NodePointer pointer;
149+ if (DemangleType) {
150+ pointer = DCtx.demangleTypeAsNode (name);
151+ if (!pointer) {
152+ os << " <<invalid type>>" ;
153+ return ;
154+ }
155+ } else {
156+ pointer = DCtx.demangleSymbolAsNode (name);
157+ }
158+
145159 if (ExpandMode || TreeOnly) {
146160 os << " Demangling for " << name << ' \n ' ;
147161 os << getNodeTreeAsString (pointer);
@@ -399,6 +413,10 @@ int main(int argc, char **argv) {
399413
400414 if (InputNames.empty ()) {
401415 CompactMode = true ;
416+ if (DemangleType) {
417+ llvm::errs () << " The option -type cannot be used to demangle stdin.\n " ;
418+ return EXIT_FAILURE;
419+ }
402420 return demangleSTDIN (options);
403421 } else {
404422 swift::Demangle::Context DCtx;
@@ -415,7 +433,7 @@ int main(int argc, char **argv) {
415433 " is quoted or escaped.\n " ;
416434 continue ;
417435 }
418- if (name.starts_with (" S" ) || name.starts_with (" s" ) ) {
436+ if (!DemangleType && ( name.starts_with (" S" ) || name.starts_with (" s" )) ) {
419437 std::string correctedName = std::string (" $" ) + name.str ();
420438 demangle (llvm::outs (), correctedName, DCtx, options);
421439 } else {
0 commit comments