mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
llvm-undname: Add a -raw-file flag to pass a raw buffer to microsoftDemangle
The default handling splits input into lines. Since llvm-microsoft-demangle-fuzzer doesn't do this, oss-fuzz produces inputs that only trigger crashes if the input isn't split into lines. This adds a hidden flag -raw-file which passes file contents to microsoftDemangle() in the same way the fuzzer does, for reproducing oss-fuzz reports. Also change llvm-undname to have a non-0 exit code for invalid symbols. Differential Revision: https://reviews.llvm.org/D60771 llvm-svn: 358485
This commit is contained in:
parent
45e3eb1feb
commit
6d297160ec
@ -15,7 +15,9 @@
|
|||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
#include "llvm/Demangle/Demangle.h"
|
#include "llvm/Demangle/Demangle.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
|
#include "llvm/Support/ErrorOr.h"
|
||||||
#include "llvm/Support/InitLLVM.h"
|
#include "llvm/Support/InitLLVM.h"
|
||||||
|
#include "llvm/Support/MemoryBuffer.h"
|
||||||
#include "llvm/Support/Process.h"
|
#include "llvm/Support/Process.h"
|
||||||
#include "llvm/Support/WithColor.h"
|
#include "llvm/Support/WithColor.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
@ -29,10 +31,12 @@ using namespace llvm;
|
|||||||
cl::opt<bool> DumpBackReferences("backrefs", cl::Optional,
|
cl::opt<bool> DumpBackReferences("backrefs", cl::Optional,
|
||||||
cl::desc("dump backreferences"), cl::Hidden,
|
cl::desc("dump backreferences"), cl::Hidden,
|
||||||
cl::init(false));
|
cl::init(false));
|
||||||
|
cl::opt<std::string> RawFile("raw-file", cl::Optional,
|
||||||
|
cl::desc("for fuzzer data"), cl::Hidden);
|
||||||
cl::list<std::string> Symbols(cl::Positional, cl::desc("<input symbols>"),
|
cl::list<std::string> Symbols(cl::Positional, cl::desc("<input symbols>"),
|
||||||
cl::ZeroOrMore);
|
cl::ZeroOrMore);
|
||||||
|
|
||||||
static void msDemangle(const std::string &S) {
|
static bool msDemangle(const std::string &S) {
|
||||||
int Status;
|
int Status;
|
||||||
MSDemangleFlags Flags = MSDF_None;
|
MSDemangleFlags Flags = MSDF_None;
|
||||||
if (DumpBackReferences)
|
if (DumpBackReferences)
|
||||||
@ -47,6 +51,7 @@ static void msDemangle(const std::string &S) {
|
|||||||
WithColor::error() << "Invalid mangled name\n";
|
WithColor::error() << "Invalid mangled name\n";
|
||||||
}
|
}
|
||||||
std::free(ResultBuf);
|
std::free(ResultBuf);
|
||||||
|
return Status == llvm::demangle_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
@ -54,6 +59,18 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
cl::ParseCommandLineOptions(argc, argv, "llvm-undname\n");
|
cl::ParseCommandLineOptions(argc, argv, "llvm-undname\n");
|
||||||
|
|
||||||
|
if (!RawFile.empty()) {
|
||||||
|
ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
|
||||||
|
MemoryBuffer::getFileOrSTDIN(RawFile);
|
||||||
|
if (std::error_code EC = FileOrErr.getError()) {
|
||||||
|
WithColor::error() << "Could not open input file \'" << RawFile
|
||||||
|
<< "\': " << EC.message() << '\n';
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return msDemangle(FileOrErr->get()->getBuffer()) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Success = true;
|
||||||
if (Symbols.empty()) {
|
if (Symbols.empty()) {
|
||||||
while (true) {
|
while (true) {
|
||||||
std::string LineStr;
|
std::string LineStr;
|
||||||
@ -74,17 +91,19 @@ int main(int argc, char **argv) {
|
|||||||
outs() << Line << "\n";
|
outs() << Line << "\n";
|
||||||
outs().flush();
|
outs().flush();
|
||||||
}
|
}
|
||||||
msDemangle(Line);
|
if (!msDemangle(Line))
|
||||||
|
Success = false;
|
||||||
outs() << "\n";
|
outs() << "\n";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (StringRef S : Symbols) {
|
for (StringRef S : Symbols) {
|
||||||
outs() << S << "\n";
|
outs() << S << "\n";
|
||||||
outs().flush();
|
outs().flush();
|
||||||
msDemangle(S);
|
if (!msDemangle(S))
|
||||||
|
Success = false;
|
||||||
outs() << "\n";
|
outs() << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return Success ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user