| OLD | NEW |
| 1 //===--- Bitcode/NaCl/TestUtils/NaClBitcodeMunge.cpp - Bitcode Munger -----===// | 1 //===--- Bitcode/NaCl/TestUtils/NaClBitcodeMunge.cpp - Bitcode Munger -----===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // Bitcode writer/munger implementation for testing. | 10 // Bitcode writer/munger implementation for testing. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "llvm/Support/ErrorHandling.h" | 22 #include "llvm/Support/ErrorHandling.h" |
| 23 #include "llvm/Support/MemoryBuffer.h" | 23 #include "llvm/Support/MemoryBuffer.h" |
| 24 | 24 |
| 25 #include <memory> | 25 #include <memory> |
| 26 | 26 |
| 27 using namespace llvm; | 27 using namespace llvm; |
| 28 | 28 |
| 29 // For debugging. When true, shows each test being run. | 29 // For debugging. When true, shows each test being run. |
| 30 static bool TraceTestRuns = false; | 30 static bool TraceTestRuns = false; |
| 31 | 31 |
| 32 bool NaClBitcodeMunger::setupTest( | 32 bool NaClBitcodeMunger::setupTest(const uint64_t Munges[], size_t MungesSize, |
| 33 const char *TestName, const uint64_t Munges[], size_t MungesSize, | 33 bool AddHeader) { |
| 34 bool AddHeader) { | |
| 35 assert(DumpStream == nullptr && "Test run with DumpStream already defined"); | 34 assert(DumpStream == nullptr && "Test run with DumpStream already defined"); |
| 36 assert(MungedInput.get() == nullptr | 35 assert(MungedInput.get() == nullptr |
| 37 && "Test run with MungedInput already defined"); | 36 && "Test run with MungedInput already defined"); |
| 38 FoundErrors = false; | 37 FoundErrors = false; |
| 39 DumpResults.clear(); // Throw away any previous results. | 38 DumpResults.clear(); // Throw away any previous results. |
| 40 std::string DumpBuffer; | 39 std::string DumpBuffer; |
| 41 DumpStream = new raw_string_ostream(DumpResults); | 40 DumpStream = new raw_string_ostream(DumpResults); |
| 42 MungedInputBuffer.clear(); | 41 MungedInputBuffer.clear(); |
| 43 | 42 |
| 44 if (TraceTestRuns) { | 43 if (TraceTestRuns) { |
| 45 errs() << "*** Run test: " << TestName << "\n"; | 44 errs() << "*** Run test:\n"; |
| 46 } | 45 } |
| 47 | 46 |
| 48 MungedBitcode.munge(Munges, MungesSize, RecordTerminator); | 47 MungedBitcode.munge(Munges, MungesSize, RecordTerminator); |
| 49 WriteFlags.setErrStream(getDumpStream()); | 48 WriteFlags.setErrStream(getDumpStream()); |
| 50 NaClMungedBitcode::WriteResults Results = | 49 NaClMungedBitcode::WriteResults Results = |
| 51 MungedBitcode.writeMaybeRepair(MungedInputBuffer, AddHeader, WriteFlags); | 50 MungedBitcode.writeMaybeRepair(MungedInputBuffer, AddHeader, WriteFlags); |
| 52 if (Results.NumErrors != 0 | 51 if (Results.NumErrors != 0 |
| 53 && !(WriteFlags.getTryToRecover() | 52 && !(WriteFlags.getTryToRecover() |
| 54 && Results.NumRepairs == Results.NumErrors) | 53 && Results.NumRepairs == Results.NumErrors) |
| 55 && !(WriteFlags.getWriteBadAbbrevIndex() | 54 && !(WriteFlags.getWriteBadAbbrevIndex() |
| 56 && Results.WroteBadAbbrevIndex && Results.NumErrors == 1)) { | 55 && Results.WroteBadAbbrevIndex && Results.NumErrors == 1)) { |
| 57 Error() << "Unable to generate bitcode file due to write errors\n"; | 56 Error() << "Unable to generate bitcode file due to write errors\n"; |
| 58 return false; | 57 return false; |
| 59 } | 58 } |
| 60 | 59 |
| 61 // Add null terminator, so that we meet the requirements of the | 60 // Add null terminator, so that we meet the requirements of the |
| 62 // MemoryBuffer API. | 61 // MemoryBuffer API. |
| 63 MungedInputBuffer.push_back('\0'); | 62 MungedInputBuffer.push_back('\0'); |
| 64 | 63 |
| 65 MungedInput = MemoryBuffer::getMemBuffer( | 64 MungedInput = MemoryBuffer::getMemBuffer( |
| 66 StringRef(MungedInputBuffer.data(), MungedInputBuffer.size()-1), | 65 StringRef(MungedInputBuffer.data(), MungedInputBuffer.size()-1)); |
| 67 TestName); | |
| 68 return true; | 66 return true; |
| 69 } | 67 } |
| 70 | 68 |
| 71 bool NaClBitcodeMunger::cleanupTest() { | 69 bool NaClBitcodeMunger::cleanupTest() { |
| 72 RunAsDeathTest = false; | 70 RunAsDeathTest = false; |
| 73 WriteFlags.reset(); | 71 WriteFlags.reset(); |
| 74 MungedBitcode.removeEdits(); | 72 MungedBitcode.removeEdits(); |
| 75 MungedInput.reset(); | 73 MungedInput.reset(); |
| 76 assert(DumpStream && "Dump stream removed before cleanup!"); | 74 assert(DumpStream && "Dump stream removed before cleanup!"); |
| 77 DumpStream->flush(); | 75 DumpStream->flush(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 107 std::string Line = getLine(DumpResults, LastLinePos); | 105 std::string Line = getLine(DumpResults, LastLinePos); |
| 108 if (LastLinePos == std::string::npos) break; | 106 if (LastLinePos == std::string::npos) break; |
| 109 size_t Pos = Line.find(Substring); | 107 size_t Pos = Line.find(Substring); |
| 110 if (Pos != std::string::npos && (!MustBePrefix || Pos == 0)) { | 108 if (Pos != std::string::npos && (!MustBePrefix || Pos == 0)) { |
| 111 Messages.append(Line); | 109 Messages.append(Line); |
| 112 } | 110 } |
| 113 } | 111 } |
| 114 return Messages; | 112 return Messages; |
| 115 } | 113 } |
| 116 | 114 |
| 117 bool NaClWriteMunger::runTest(const char* Name, const uint64_t Munges[], | 115 bool NaClWriteMunger::runTest(const uint64_t Munges[], size_t MungesSize) { |
| 118 size_t MungesSize) { | |
| 119 bool AddHeader = true; | 116 bool AddHeader = true; |
| 120 if (!setupTest(Name, Munges, MungesSize, AddHeader)) | 117 if (!setupTest(Munges, MungesSize, AddHeader)) |
| 121 return cleanupTest(); | 118 return cleanupTest(); |
| 122 MemoryBufferRef InputRef(MungedInput->getMemBufferRef()); | 119 MemoryBufferRef InputRef(MungedInput->getMemBufferRef()); |
| 123 NaClMungedBitcode WrittenBitcode(MemoryBuffer::getMemBuffer(InputRef)); | 120 NaClMungedBitcode WrittenBitcode(MemoryBuffer::getMemBuffer(InputRef)); |
| 124 WrittenBitcode.print(WriteFlags.getErrStream()); | 121 WrittenBitcode.print(WriteFlags.getErrStream()); |
| 125 return cleanupTest(); | 122 return cleanupTest(); |
| 126 } | 123 } |
| 127 | 124 |
| 128 bool NaClObjDumpMunger::runTestWithFlags( | 125 bool NaClObjDumpMunger::runTestWithFlags( |
| 129 const char *Name, const uint64_t Munges[], size_t MungesSize, | 126 const uint64_t Munges[], size_t MungesSize, bool AddHeader, |
| 130 bool AddHeader, bool NoRecords, bool NoAssembly) { | 127 bool NoRecords, bool NoAssembly) { |
| 131 if (!setupTest(Name, Munges, MungesSize, AddHeader)) | 128 if (!setupTest(Munges, MungesSize, AddHeader)) |
| 132 return cleanupTest(); | 129 return cleanupTest(); |
| 133 | 130 |
| 134 if (NaClObjDump(MungedInput.get()->getMemBufferRef(), | 131 if (NaClObjDump(MungedInput.get()->getMemBufferRef(), |
| 135 getDumpStream(), NoRecords, NoAssembly)) | 132 getDumpStream(), NoRecords, NoAssembly)) |
| 136 FoundErrors = true; | 133 FoundErrors = true; |
| 137 return cleanupTest(); | 134 return cleanupTest(); |
| 138 } | 135 } |
| 139 | 136 |
| 140 bool NaClParseBitcodeMunger::runTest( | 137 bool NaClParseBitcodeMunger::runTest(const uint64_t Munges[], size_t MungesSize, |
| 141 const char *Name, const uint64_t Munges[], size_t MungesSize, | 138 bool VerboseErrors) { |
| 142 bool VerboseErrors) { | |
| 143 bool AddHeader = true; | 139 bool AddHeader = true; |
| 144 if (!setupTest(Name, Munges, MungesSize, AddHeader)) | 140 if (!setupTest(Munges, MungesSize, AddHeader)) |
| 145 return cleanupTest(); | 141 return cleanupTest(); |
| 146 | 142 |
| 147 LLVMContext &Context = getGlobalContext(); | 143 LLVMContext &Context = getGlobalContext(); |
| 148 | 144 |
| 149 raw_ostream *VerboseStrm = VerboseErrors ? &getDumpStream() : nullptr; | 145 raw_ostream *VerboseStrm = VerboseErrors ? &getDumpStream() : nullptr; |
| 150 ErrorOr<Module *> ModuleOrError = | 146 ErrorOr<Module *> ModuleOrError = |
| 151 NaClParseBitcodeFile(MungedInput->getMemBufferRef(), Context, | 147 NaClParseBitcodeFile(MungedInput->getMemBufferRef(), Context, |
| 152 VerboseStrm); | 148 VerboseStrm); |
| 153 if (ModuleOrError) { | 149 if (ModuleOrError) { |
| 154 if (VerboseErrors) | 150 if (VerboseErrors) |
| 155 getDumpStream() << "Successful parse!\n"; | 151 getDumpStream() << "Successful parse!\n"; |
| 156 delete ModuleOrError.get(); | 152 delete ModuleOrError.get(); |
| 157 } else { | 153 } else { |
| 158 Error() << ModuleOrError.getError().message() << "\n"; | 154 Error() << ModuleOrError.getError().message() << "\n"; |
| 159 } | 155 } |
| 160 return cleanupTest(); | 156 return cleanupTest(); |
| 161 } | 157 } |
| 162 | 158 |
| 163 bool NaClCompressMunger::runTest(const char* Name, const uint64_t Munges[], | 159 bool NaClCompressMunger::runTest(const uint64_t Munges[], size_t MungesSize) { |
| 164 size_t MungesSize) { | |
| 165 bool AddHeader = true; | 160 bool AddHeader = true; |
| 166 if (!setupTest(Name, Munges, MungesSize, AddHeader)) | 161 if (!setupTest(Munges, MungesSize, AddHeader)) |
| 167 return cleanupTest(); | 162 return cleanupTest(); |
| 168 | 163 |
| 169 NaClBitcodeCompressor Compressor; | 164 NaClBitcodeCompressor Compressor; |
| 170 if (!Compressor.compress(MungedInput.get(), getDumpStream())) | 165 if (!Compressor.compress(MungedInput.get(), getDumpStream())) |
| 171 Error() << "Unable to compress\n"; | 166 Error() << "Unable to compress\n"; |
| 172 return cleanupTest(); | 167 return cleanupTest(); |
| 173 } | 168 } |
| OLD | NEW |