llvm-project/llvm/tools/llvm-undname/llvm-undname.cpp
Zachary Turner c93b870c54 [llvm-undname] Flush output before demangling.
If an error occurs and we write it to stderr, it could appear
before we wrote the mangled name which we're undecorating.
By flushing stdout first, we ensure that the messages are always
sequenced in the correct order.

llvm-svn: 337645
2018-07-21 15:39:05 +00:00

83 lines
2.3 KiB
C++

//===-- llvm-undname.cpp - Microsoft ABI name undecorator
//------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This utility works like the windows undname utility. It converts mangled
// Microsoft symbol names into pretty C/C++ human-readable names.
//
//===----------------------------------------------------------------------===//
#include "llvm/ADT/StringRef.h"
#include "llvm/Demangle/Demangle.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/Process.h"
#include "llvm/Support/raw_ostream.h"
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace llvm;
cl::list<std::string> Symbols(cl::Positional, cl::desc("<input symbols>"),
cl::ZeroOrMore);
static void demangle(const std::string &S) {
int Status;
char *ResultBuf = microsoftDemangle(S.c_str(), nullptr, nullptr, &Status);
if (Status == llvm::demangle_success) {
outs() << ResultBuf << "\n";
outs().flush();
} else {
errs() << "Error: Invalid mangled name\n";
}
std::free(ResultBuf);
}
int main(int argc, char **argv) {
InitLLVM X(argc, argv);
cl::ParseCommandLineOptions(argc, argv, "llvm-undname\n");
if (Symbols.empty()) {
while (true) {
std::string LineStr;
std::getline(std::cin, LineStr);
if (std::cin.eof())
break;
StringRef Line(LineStr);
Line = Line.trim();
if (Line.empty() || Line.startswith("#") || Line.startswith(";"))
continue;
// If the user is manually typing in these decorated names, don't echo
// them to the terminal a second time. If they're coming from redirected
// input, however, then we should display the input line so that the
// mangled and demangled name can be easily correlated in the output.
if (!sys::Process::StandardInIsUserInput()) {
outs() << Line << "\n";
outs().flush();
}
demangle(Line);
outs() << "\n";
}
} else {
for (StringRef S : Symbols) {
outs() << S << "\n";
outs().flush();
demangle(S);
outs() << "\n";
}
}
return 0;
}