From ae7dd8004eb286039ee1eb1a35ddb1ff4eafe460 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 7 Apr 2009 02:56:46 +0000 Subject: Add an API for the bitstream reader to read blobs and return them by reference, instead of packing each byte into a smallvector. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68486 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Bitcode/BitstreamReader.h | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'include/llvm/Bitcode/BitstreamReader.h') diff --git a/include/llvm/Bitcode/BitstreamReader.h b/include/llvm/Bitcode/BitstreamReader.h index fe51ade4cb..d64c0dc2ac 100644 --- a/include/llvm/Bitcode/BitstreamReader.h +++ b/include/llvm/Bitcode/BitstreamReader.h @@ -371,7 +371,8 @@ public: return CurAbbrevs[AbbrevNo]; } - unsigned ReadRecord(unsigned AbbrevID, SmallVectorImpl &Vals) { + unsigned ReadRecord(unsigned AbbrevID, SmallVectorImpl &Vals, + const char **BlobStart = 0, unsigned *BlobLen = 0) { if (AbbrevID == bitc::UNABBREV_RECORD) { unsigned Code = ReadVBR(6); unsigned NumElts = ReadVBR(6); @@ -413,9 +414,15 @@ public: break; } - // Otherwise, read the number of bytes. - for (; NumElts; ++NextChar, --NumElts) - Vals.push_back(*NextChar); + // Otherwise, read the number of bytes. If we can return a reference to + // the data, do so to avoid copying it. + if (BlobStart) { + *BlobStart = (const char*)NextChar; + *BlobLen = NumElts; + } else { + for (; NumElts; ++NextChar, --NumElts) + Vals.push_back(*NextChar); + } // Skip over tail padding. NextChar = NewEnd; } else { @@ -428,6 +435,12 @@ public: return Code; } + unsigned ReadRecord(unsigned AbbrevID, SmallVectorImpl &Vals, + const char *&BlobStart, unsigned &BlobLen) { + return ReadRecord(AbbrevID, Vals, &BlobStart, &BlobLen); + } + + //===--------------------------------------------------------------------===// // Abbrev Processing //===--------------------------------------------------------------------===// -- cgit v1.2.3