Support: Implement StreamingMemoryObject::getPointer
The implementation is fairly obvious. This is preparation for using
some blobs in bitcode.
For clarity (and perhaps future-proofing?), I moved the call to
JumpToBit in BitstreamCursor::readRecord ahead of calling
MemoryObject::getPointer, since JumpToBit can theoretically (a) read
bytes, which (b) invalidates the blob pointer.
This isn't strictly necessary the two memory objects we have:
- The return of RawMemoryObject::getPointer is valid until the memory
object is destroyed.
- StreamingMemoryObject::getPointer is valid until the next chunk is
read from the stream. Since the JumpToBit call is only going ahead
to a word boundary, we'll never load another chunk.
However, reordering makes it clear by inspection that the blob returned
by BitstreamCursor::readRecord will be valid.
I added some tests for StreamingMemoryObject::getPointer and
BitstreamCursor::readRecord.
llvm-svn: 264549
This commit is contained in:
@@ -260,7 +260,10 @@ unsigned BitstreamCursor::readRecord(unsigned AbbrevID,
|
||||
break;
|
||||
}
|
||||
|
||||
// Otherwise, inform the streamer that we need these bytes in memory.
|
||||
// Otherwise, inform the streamer that we need these bytes in memory. Skip
|
||||
// over tail padding first, in case jumping to NewEnd invalidates the Blob
|
||||
// pointer.
|
||||
JumpToBit(NewEnd);
|
||||
const char *Ptr = (const char *)getPointerToBit(CurBitPos, NumElts);
|
||||
|
||||
// If we can return a reference to the data, do so to avoid copying it.
|
||||
@@ -271,8 +274,6 @@ unsigned BitstreamCursor::readRecord(unsigned AbbrevID,
|
||||
for (; NumElts; --NumElts)
|
||||
Vals.push_back((unsigned char)*Ptr++);
|
||||
}
|
||||
// Skip over tail padding.
|
||||
JumpToBit(NewEnd);
|
||||
}
|
||||
|
||||
return Code;
|
||||
|
||||
Reference in New Issue
Block a user