Index: include/llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h |
diff --git a/include/llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h b/include/llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h |
index 6f8a05a8f29aa93f8dec5e1c796b8b8f2c8f148d..c5cc31187be3765ea56081598cf9ccf83e8fb62b 100644 |
--- a/include/llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h |
+++ b/include/llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h |
@@ -81,6 +81,7 @@ |
namespace llvm { |
+class MemoryBuffer; // Buffer to read bitcode from |
class NaClBitcodeAbbrevRecord; // bitcode record. |
class NaClMungedBitcodeIter; // iterator over edited bitcode records. |
@@ -99,6 +100,10 @@ void readNaClBitcodeRecordList(NaClBitcodeRecordList &RecordList, |
size_t RecordsSize, |
uint64_t RecordTerminator); |
+/// \brief Read in the list of records from bitcode in a memory buffer. |
+void readNaClBitcodeRecordList(NaClBitcodeRecordList &RecordList, |
+ std::unique_ptr<MemoryBuffer> InputBuffer); |
+ |
/// \brief An edited (i.e. munged) list of bitcode records. Edits are |
/// always relative to the initial list of records. |
class NaClMungedBitcode { |
@@ -111,6 +116,9 @@ public: |
/// \brief Iterator over edited records. |
typedef NaClMungedBitcodeIter iterator; |
+ /// \brief Read in initial list of records from bitcode in a memory buffer. |
+ explicit NaClMungedBitcode(std::unique_ptr<MemoryBuffer> InputBuffer); |
+ |
/// \brief Initialize the list of records to be edited. |
explicit NaClMungedBitcode(std::unique_ptr<NaClBitcodeRecordList> BaseRecords) |
: BaseRecords(std::move(BaseRecords)) {} |
@@ -160,6 +168,84 @@ public: |
/// \brief Print out the resulting edited list of records. |
void print(raw_ostream &Out) const; |
+ /// Defines set of possible write flags. |
+ struct WriteFlags { |
+ /// True if error recovery should be applied. |
+ bool getTryToRecover() const { return TryToRecover; } |
+ |
+ /// Define that error recovery should be applied when writing. |
+ void setTryToRecover(bool NewValue) { |
+ TryToRecover = NewValue; |
+ assert(!(TryToRecover && WriteBadAbbrevIndex)); |
+ } |
+ |
+ /// True if a bad abbreviation index should be written (rather than |
+ /// trying error recovery) so that bitcode readers can be tested for |
+ /// this condition. |
+ bool getWriteBadAbbrevIndex() const { return WriteBadAbbrevIndex; } |
+ |
+ /// Define that the first bad abbreviation index should be written, |
+ /// and corresponding minimal context added so that the bitcode can |
+ /// be used to test reading the erroneous written bitcode. |
+ void setWriteBadAbbrevIndex(bool NewValue) { |
+ WriteBadAbbrevIndex = NewValue; |
+ assert(!(TryToRecover && WriteBadAbbrevIndex)); |
+ } |
+ |
+ /// Get the stream to print errors while writing bitcode. |
+ raw_ostream &getErrStream() const { |
+ return ErrStream ? *ErrStream : errs(); |
+ } |
+ |
+ /// Set the stream to print errors to. |
+ void setErrStream(raw_ostream &NewValue) { |
+ ErrStream = &NewValue; |
+ } |
+ |
+ void reset() { |
+ TryToRecover = false; |
+ WriteBadAbbrevIndex = false; |
+ ErrStream = nullptr; |
+ } |
+ |
+ private: |
+ bool TryToRecover = false; |
+ bool WriteBadAbbrevIndex = false; |
+ raw_ostream *ErrStream = nullptr; |
+ }; |
+ |
+ /// Defines the results associated with writing bitcode. |
+ struct WriteResults { |
+ /// Number of errors generated. |
+ size_t NumErrors = 0; |
+ /// Number of repairs (via error recovery) that were applied. |
+ size_t NumRepairs = 0; |
+ /// True if a bad abbreviation index were written. |
+ bool WroteBadAbbrevIndex = false; |
+ }; |
+ |
+ /// \brief Write out the edited list of bitcode records using |
+ /// the given buffer. |
+ /// |
+ /// \param Buffer The buffer to write into. |
+ /// \param AddHeader Add header block when true. |
+ /// \param Flags Write flags to use. |
+ /// |
+ /// \return Returns the results of the write. |
+ WriteResults writeMaybeRepair( |
+ SmallVectorImpl<char> &Buffer, bool AddHeader, |
+ const WriteFlags &Flags) const; |
+ |
+ bool write(SmallVectorImpl<char> &Buffer, bool AddHeader, |
+ const WriteFlags &Flags) const { |
+ return writeMaybeRepair(Buffer, AddHeader, Flags).NumErrors == 0; |
+ } |
+ |
+ bool write(SmallVectorImpl<char> &Buffer, bool AddHeader) const { |
+ WriteFlags Flags; |
+ return write(Buffer, AddHeader, Flags); |
+ } |
+ |
/// \brief The types of editing actions that can be applied. |
enum EditAction { |
AddBefore, // Insert new record before base record at index. |
@@ -190,6 +276,11 @@ public: |
/// set of base records. |
void removeEdits(); |
+ /// Returns the unedited list of bitcode records. |
+ const NaClBitcodeRecordList &getBaseRecords() const { |
+ return *BaseRecords; |
+ } |
+ |
private: |
typedef std::list<NaClBitcodeAbbrevRecord *> RecordListType; |
typedef std::map<size_t, RecordListType *> InsertionsMapType; |
@@ -241,7 +332,7 @@ public: |
/// \param Code The selector code of the record. |
/// \param Values The values associated with the selector code. |
NaClBitcodeAbbrevRecord(unsigned Abbrev, unsigned Code, |
- NaClRecordVector &Values) |
+ const NaClRecordVector &Values) |
: NaClBitcodeRecordData(Code, Values), Abbrev(Abbrev) {} |
/// \brief Creates a copy of the given abbreviated bitcode record. |