Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: include/llvm/Bitcode/NaCl/NaClBitcodeMunge.h

Issue 1113023005: Add abilities to generate bitcode buffers from munged bitcode. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Try to get better patch. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 //===- NaClBitcodeMunge.h - Bitcode Munger ----------------------*- C++ -*-===// 1 //===- NaClBitcodeMunge.h - Bitcode Munger ----------------------*- C++ -*-===//
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 // Test harness for generating a PNaCl bitcode memory buffer from 10 // Test harness for generating a PNaCl bitcode memory buffer from
11 // an array, and parse/objdump/compress the resulting contents. 11 // an array, and parse/objdump/compress the resulting contents.
12 // 12 //
13 // Generates a bitcode memory buffer from an array containing 1 or 13 // Generates a bitcode memory buffer from an array containing 1 or
14 // more PNaCl records. Used to test errors in PNaCl bitcode. 14 // more PNaCl records. Used to test errors in PNaCl bitcode.
15 // 15 //
16 // Bitcode records are modeleled using arrays using the format 16 // Bitcode records are modeled using arrays using the format
17 // specified in NaClBitcodeMungeUtils.h. 17 // specified in NaClBitcodeMungeUtils.h.
18 // 18 //
19 // Note: Since the header record doesn't have any abbreviation indices 19 // Note: Since the header record doesn't have any abbreviation indices
20 // associated with it, one can use any value. The value will simply be 20 // associated with it, one can use any value. The value will simply be
21 // ignored. 21 // ignored.
22 // 22 //
23 // In addition to specifying the sequence of records, one can also 23 // In addition to specifying the sequence of records, one can also
24 // define a sequence of edits to be applied to the original sequence 24 // define a sequence of edits to be applied to the original sequence
25 // of records. This allows the same record sequence to be used in 25 // of records. This allows the same record sequence to be used in
26 // multiple tests. Again, see NaClBitcodeMungeUtils.h for the 26 // multiple tests. Again, see NaClBitcodeMungeUtils.h for the
(...skipping 13 matching lines...) Expand all
40 40
41 #include "llvm/ADT/SmallVector.h" 41 #include "llvm/ADT/SmallVector.h"
42 #include "llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h" 42 #include "llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h"
43 #include "llvm/Support/MemoryBuffer.h" 43 #include "llvm/Support/MemoryBuffer.h"
44 #include "llvm/Support/raw_ostream.h" 44 #include "llvm/Support/raw_ostream.h"
45 45
46 #include <string> 46 #include <string>
47 47
48 namespace llvm { 48 namespace llvm {
49 49
50 class NaClBitstreamWriter;
51 class NaClBitCodeAbbrev; 50 class NaClBitCodeAbbrev;
52 51
53 /// Base class to run tests on munged bitcode files. 52 /// Base class to run tests on munged bitcode files.
54 class NaClBitcodeMunger { 53 class NaClBitcodeMunger {
55 public: 54 public:
56 // TODO(kschimpf) Replace uses in subzero with corresponding 55 // TODO(kschimpf) Replace uses in subzero with corresponding
57 // NaClMungedBitcode::EditAction values, so that following constants 56 // NaClMungedBitcode::EditAction values, so that following constants
58 // can be removed. 57 // can be removed.
59 58
60 /// The types of editing actions that can be applied. 59 /// The types of editing actions that can be applied.
61 typedef NaClMungedBitcode::EditAction EditAction; 60 typedef NaClMungedBitcode::EditAction EditAction;
62 static const EditAction AddBefore = NaClMungedBitcode::AddBefore; 61 static const EditAction AddBefore = NaClMungedBitcode::AddBefore;
63 static const EditAction AddAfter = NaClMungedBitcode::AddAfter; 62 static const EditAction AddAfter = NaClMungedBitcode::AddAfter;
64 static const EditAction Remove = NaClMungedBitcode::Remove; 63 static const EditAction Remove = NaClMungedBitcode::Remove;
65 static const EditAction Replace = NaClMungedBitcode::Replace; 64 static const EditAction Replace = NaClMungedBitcode::Replace;
66 65
66 /// The write flags to use when writing bitcode.
67 NaClMungedBitcode::WriteFlags WriteFlags;
jvoung (off chromium) 2015/05/06 22:08:09 nit: Seems a bit weird for this field to be public
Karl 2015/05/07 20:09:18 Moved to protected and added methods to set. Made
68
67 /// Creates a bitcode munger, based on the given array of values. 69 /// Creates a bitcode munger, based on the given array of values.
68 NaClBitcodeMunger(const uint64_t Records[], size_t RecordsSize, 70 NaClBitcodeMunger(const uint64_t Records[], size_t RecordsSize,
69 uint64_t RecordTerminator) 71 uint64_t RecordTerminator)
70 : MungedBitcode(Records, RecordsSize, RecordTerminator), 72 : MungedBitcode(Records, RecordsSize, RecordTerminator),
71 RecordTerminator(RecordTerminator), WriteBlockID(-1), SetBID(-1), 73 RecordTerminator(RecordTerminator),
72 DumpResults("Error: No previous dump results!\n"), 74 DumpResults("Error: No previous dump results!\n"),
73 DumpStream(nullptr), Writer(nullptr), FoundErrors(false), 75 DumpStream(nullptr), FoundErrors(false) {}
74 FatalBuffer(), FatalStream(FatalBuffer) {}
75 76
76 /// Creates MungedInput and DumpStream for running tests, based on 77 /// Creates MungedInput and DumpStream for running tests, based on
77 /// given Munges. 78 /// given Munges.
78 void setupTest( 79 void setupTest(
79 const char *TestName, const uint64_t Munges[], size_t MungesSize, 80 const char *TestName, const uint64_t Munges[], size_t MungesSize,
80 bool AddHeader); 81 bool AddHeader);
81 82
82 /// Cleans up state after a test. 83 /// Cleans up state after a test.
83 void cleanupTest(); 84 void cleanupTest();
84 85
(...skipping 12 matching lines...) Expand all
97 /// getTestResults(). 98 /// getTestResults().
98 std::string getLinesWithPrefix(const std::string &Prefix) const { 99 std::string getLinesWithPrefix(const std::string &Prefix) const {
99 return getLinesWithTextMatch(Prefix, true); 100 return getLinesWithTextMatch(Prefix, true);
100 } 101 }
101 102
102 protected: 103 protected:
103 // The bitcode records being munged. 104 // The bitcode records being munged.
104 NaClMungedBitcode MungedBitcode; 105 NaClMungedBitcode MungedBitcode;
105 // The value used as record terminator. 106 // The value used as record terminator.
106 uint64_t RecordTerminator; 107 uint64_t RecordTerminator;
107 // The block ID associated with the block being written.
108 int WriteBlockID;
109 // The SetBID for the blockinfo block.
110 int SetBID;
111 // The results buffer of the last dump. 108 // The results buffer of the last dump.
112 std::string DumpResults; 109 std::string DumpResults;
113 // The memory buffer containing the munged input. 110 // The memory buffer containing the munged input.
114 std::unique_ptr<MemoryBuffer> MungedInput; 111 std::unique_ptr<MemoryBuffer> MungedInput;
115 // The stream containing errors and the objdump of the generated bitcode file. 112 // The stream containing errors and the objdump of the generated bitcode file.
116 raw_ostream *DumpStream; 113 raw_ostream *DumpStream;
117 // The bitstream writer to use to generate the bitcode file.
118 NaClBitstreamWriter *Writer;
119 // True if any errors were reported. 114 // True if any errors were reported.
120 bool FoundErrors; 115 bool FoundErrors;
121 // The buffer to hold the generated fatal message.
122 std::string FatalBuffer;
123 // The stream to write the fatal message to.
124 raw_string_ostream FatalStream;
125 // The stack of maximum abbreviation indices allowed by block enter record.
126 SmallVector<uint64_t, 3> AbbrevIndexLimitStack;
127 // The buffer for the contents of the munged input. 116 // The buffer for the contents of the munged input.
128 SmallVector<char, 1024> MungedInputBuffer; 117 SmallVector<char, 1024> MungedInputBuffer;
129 118
130 // Records that an error occurred, and returns stream to print error 119 // Records that an error occurred, and returns stream to print error
131 // message to. 120 // message to.
132 raw_ostream &Error() { 121 raw_ostream &Error() {
133 FoundErrors = true; 122 FoundErrors = true;
134 return *DumpStream << "Error: "; 123 return *DumpStream << "Error: ";
135 } 124 }
136 125
137 // Returns stream to print fatal error message to.
138 // Note: Once the fatal error message has been dumped to the stream,
139 // one must call ReportFatalError to display the error and terminate
140 // execution.
141 raw_ostream &Fatal() {
142 return FatalStream << "Fatal: ";
143 }
144
145 // Displays the fatal error message and exits the program.
146 void ReportFatalError() {
147 report_fatal_error(FatalStream.str());
148 }
149
150 // Returns the lines containing the given Substring, from the string 126 // Returns the lines containing the given Substring, from the string
151 // getTestResults(). If MustBePrefix, then Substring must match at 127 // getTestResults(). If MustBePrefix, then Substring must match at
152 // the beginning of the line. 128 // the beginning of the line.
153 std::string getLinesWithTextMatch(const std::string &Substring, 129 std::string getLinesWithTextMatch(const std::string &Substring,
154 bool MustBePrefix = false) const; 130 bool MustBePrefix = false) const;
155
156 // Writes out munged bitcode records.
157 void writeMungedBitcode(const NaClMungedBitcode &Bitcode, bool AddHeader);
158
159 // Emits the given record to the bitcode file.
160 void emitRecord(const NaClBitcodeAbbrevRecord &Record);
161
162 // Converts the abbreviation record to the corresponding abbreviation.
163 NaClBitCodeAbbrev *buildAbbrev(const NaClBitcodeAbbrevRecord &Record);
164 }; 131 };
165 132
166 /// Class to run tests for function llvm::NaClObjDump. 133 /// Class to run tests for function llvm::NaClObjDump.
167 class NaClObjDumpMunger : public NaClBitcodeMunger { 134 class NaClObjDumpMunger : public NaClBitcodeMunger {
168 public: 135 public:
169 136
170 /// Creates a bitcode munger, based on the given array of values. 137 /// Creates a bitcode munger, based on the given array of values.
171 NaClObjDumpMunger(const uint64_t Records[], size_t RecordsSize, 138 NaClObjDumpMunger(const uint64_t Records[], size_t RecordsSize,
172 uint64_t RecordTerminator) 139 uint64_t RecordTerminator)
173 : NaClBitcodeMunger(Records, RecordsSize, RecordTerminator), 140 : NaClBitcodeMunger(Records, RecordsSize, RecordTerminator),
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 251
285 bool runTest(const char* TestName) { 252 bool runTest(const char* TestName) {
286 uint64_t NoMunges[] = {0}; 253 uint64_t NoMunges[] = {0};
287 return runTest(TestName, NoMunges, 0); 254 return runTest(TestName, NoMunges, 0);
288 } 255 }
289 }; 256 };
290 257
291 } // end namespace llvm. 258 } // end namespace llvm.
292 259
293 #endif // LLVM_BITCODE_NACL_NACLBITCODEMUNGE_H 260 #endif // LLVM_BITCODE_NACL_NACLBITCODEMUNGE_H
OLDNEW
« no previous file with comments | « no previous file | include/llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h » ('j') | include/llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698