Index: lib/Bitcode/NaCl/TestUtils/NaClBitcodeMunge.cpp |
diff --git a/lib/Bitcode/NaCl/TestUtils/NaClBitcodeMunge.cpp b/lib/Bitcode/NaCl/TestUtils/NaClBitcodeMunge.cpp |
index f4882b83af0cfdad13f1788f7af21006446ee835..76c78726491f2dbd856eea0a54fb69c4b4425eed 100644 |
--- a/lib/Bitcode/NaCl/TestUtils/NaClBitcodeMunge.cpp |
+++ b/lib/Bitcode/NaCl/TestUtils/NaClBitcodeMunge.cpp |
@@ -17,6 +17,8 @@ |
#include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" |
#include "llvm/Bitcode/NaCl/NaClBitstreamWriter.h" |
#include "llvm/Bitcode/NaCl/NaClReaderWriter.h" |
+#include "llvm/IR/LLVMContext.h" |
+#include "llvm/IR/Module.h" |
#include "llvm/Support/ErrorHandling.h" |
#include "llvm/Support/MemoryBuffer.h" |
@@ -28,22 +30,22 @@ using namespace llvm; |
// emitted to the bitcode file. |
static bool DebugEmitRecord = false; |
-bool NaClBitcodeMunger::runTestWithFlags( |
- const char *Name, const uint64_t Munges[], size_t MungesSize, |
- bool AddHeader, bool NoRecords, bool NoAssembly) { |
- assert(DumpStream == NULL && "Test run with DumpStream already defined"); |
+void NaClBitcodeMunger::setupTest( |
+ const char *TestName, const uint64_t Munges[], size_t MungesSize, |
+ bool AddHeader) { |
+ assert(DumpStream == nullptr && "Test run with DumpStream already defined"); |
+ assert(MungedInput == nullptr && "Test run with MungedInput already defined"); |
FoundErrors = false; |
DumpResults.clear(); // Throw away any previous results. |
std::string DumpBuffer; |
- raw_string_ostream MungedDumpStream(DumpResults); |
- DumpStream = &MungedDumpStream; |
+ DumpStream = new raw_string_ostream(DumpResults); |
SmallVector<char, 0> StreamBuffer; |
StreamBuffer.reserve(256*1024); |
NaClBitstreamWriter OutStream(StreamBuffer); |
Writer = &OutStream; |
if (DebugEmitRecord) { |
- errs() << "*** Run test: " << Name << "\n"; |
+ errs() << "*** Run test: " << TestName << "\n"; |
} |
WriteBlockID = -1; |
@@ -57,15 +59,17 @@ bool NaClBitcodeMunger::runTestWithFlags( |
Iter != IterEnd; ++Iter) { |
BitcodeStrm << *Iter; |
} |
+ MungedInput = MemoryBuffer::getMemBufferCopy(BitcodeStrm.str(), TestName); |
+} |
- std::unique_ptr<MemoryBuffer> Input( |
- MemoryBuffer::getMemBufferCopy(BitcodeStrm.str(), Name)); |
- if (NaClObjDump(Input.get(), *DumpStream, NoRecords, NoAssembly)) |
- FoundErrors = true; |
- DumpStream = NULL; |
- Writer = NULL; |
- MungedDumpStream.flush(); |
- return !FoundErrors; |
+void NaClBitcodeMunger::cleanupTest() { |
+ delete MungedInput; |
+ MungedInput = nullptr; |
+ assert(DumpStream && "Dump stream removed before cleanup!"); |
+ DumpStream->flush(); |
+ delete DumpStream; |
+ DumpStream = nullptr; |
+ Writer = nullptr; |
} |
// Return the next line of input (including eoln), starting from |
@@ -338,3 +342,37 @@ NaClBitCodeAbbrev *NaClBitcodeMunger::buildAbbrev( |
} |
return Abbrev; |
} |
+ |
+bool NaClObjDumpMunger::runTestWithFlags( |
+ const char *Name, const uint64_t Munges[], size_t MungesSize, |
+ bool AddHeader, bool NoRecords, bool NoAssembly) { |
+ setupTest(Name, Munges, MungesSize, AddHeader); |
+ if (NaClObjDump(MungedInput, *DumpStream, NoRecords, NoAssembly)) |
+ FoundErrors = true; |
+ cleanupTest(); |
+ return !FoundErrors; |
+} |
+ |
+bool NaClParseBitcodeMunger::runTest( |
+ const char *Name, const uint64_t Munges[], size_t MungesSize, |
+ bool VerboseErrors) { |
+ bool AddHeader = true; |
+ setupTest(Name, Munges, MungesSize, AddHeader); |
+ LLVMContext &Context = getGlobalContext(); |
+ raw_ostream *VerboseStrm = VerboseErrors ? DumpStream : nullptr; |
+ ErrorOr<Module *> ModuleOrError = |
+ NaClParseBitcodeFile(MungedInput, Context, VerboseStrm); |
+ if (ModuleOrError) { |
+ delete ModuleOrError.get(); |
+ if (VerboseErrors) |
+ *DumpStream << "Successful parse!\n"; |
+ // If there was a successful parse, MungedInput was deleted by the |
+ // parser. Hence, we null it out here so that cleanupTest doesn't |
+ // double delete it. |
+ MungedInput = nullptr; |
+ } else { |
+ Error() << ModuleOrError.getError().message() << "\n"; |
+ } |
+ cleanupTest(); |
+ return !FoundErrors; |
+} |