summaryrefslogtreecommitdiff
path: root/lib/Bitcode
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2013-01-21 18:24:49 +0000
committerChris Lattner <sabre@nondot.org>2013-01-21 18:24:49 +0000
commit69582cf6c46456ad542df5aa09c47700c9525645 (patch)
tree9cbf35947385101c7c8f9d9586f3bf6b1f7ad86b /lib/Bitcode
parentafe77f33b2a361ed0d001596dcdde0e16d57abee (diff)
Fix a heinous inefficiency introduced in r149918, wherein reading each byte of a
BLOB (i.e., large, performance intensive data) in a bitcode file was switched to invoking one virtual method call per byte read. Now we do one virtual call per BLOB. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173065 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode')
-rw-r--r--lib/Bitcode/Reader/BitstreamReader.cpp17
1 files changed, 8 insertions, 9 deletions
diff --git a/lib/Bitcode/Reader/BitstreamReader.cpp b/lib/Bitcode/Reader/BitstreamReader.cpp
index 92133bb969c..7984512b4b2 100644
--- a/lib/Bitcode/Reader/BitstreamReader.cpp
+++ b/lib/Bitcode/Reader/BitstreamReader.cpp
@@ -255,18 +255,17 @@ unsigned BitstreamCursor::readRecord(unsigned AbbrevID,
break;
}
- // Otherwise, read the number of bytes. If we can return a reference to
- // the data, do so to avoid copying it.
+ // Otherwise, inform the streamer that we need these bytes in memory.
+ const char *Ptr = (const char*)
+ BitStream->getBitcodeBytes().getPointer(CurBitPos/8, NumElts);
+
+ // If we can return a reference to the data, do so to avoid copying it.
if (Blob) {
- *Blob =
- StringRef((const char*)BitStream->getBitcodeBytes().getPointer(
- CurBitPos/8, NumElts),
- NumElts);
+ *Blob = StringRef(Ptr, NumElts);
} else {
- // FIXME: This is a brutally inefficient way to do this. Why isn't this
- // just using getPointer?
+ // Otherwise, unpack into Vals with zero extension.
for (; NumElts; --NumElts)
- Vals.push_back(Read(8));
+ Vals.push_back((unsigned char)*Ptr++);
}
// Skip over tail padding.
JumpToBit(NewEnd);