From: Peter Collingbourne Date: Tue, 27 Oct 2015 23:01:25 +0000 (+0000) Subject: Bitcode: Fix more unsigned integer overflow bugs. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=913837d5f7b9a3145b29b31f668a59be463bef6f;p=oota-llvm.git Bitcode: Fix more unsigned integer overflow bugs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251464 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Bitcode/BitstreamWriter.h b/include/llvm/Bitcode/BitstreamWriter.h index b13b6045987..4988d5fcad3 100644 --- a/include/llvm/Bitcode/BitstreamWriter.h +++ b/include/llvm/Bitcode/BitstreamWriter.h @@ -47,9 +47,9 @@ class BitstreamWriter { struct Block { unsigned PrevCodeSize; - unsigned StartSizeWord; + size_t StartSizeWord; std::vector> PrevAbbrevs; - Block(unsigned PCS, unsigned SSW) : PrevCodeSize(PCS), StartSizeWord(SSW) {} + Block(unsigned PCS, size_t SSW) : PrevCodeSize(PCS), StartSizeWord(SSW) {} }; /// BlockScope - This tracks the current blocks that we have entered. @@ -73,12 +73,12 @@ class BitstreamWriter { reinterpret_cast(&Value + 1)); } - unsigned GetBufferOffset() const { + size_t GetBufferOffset() const { return Out.size(); } - unsigned GetWordIndex() const { - unsigned Offset = GetBufferOffset(); + size_t GetWordIndex() const { + size_t Offset = GetBufferOffset(); assert((Offset & 3) == 0 && "Not 32-bit aligned"); return Offset / 4; } @@ -211,7 +211,7 @@ public: EmitVBR(CodeLen, bitc::CodeLenWidth); FlushToWord(); - unsigned BlockSizeWordIndex = GetWordIndex(); + size_t BlockSizeWordIndex = GetWordIndex(); unsigned OldCodeSize = CurCodeSize; // Emit a placeholder, which will be replaced when the block is popped. @@ -242,7 +242,7 @@ public: FlushToWord(); // Compute the size of the block, in words, not counting the size field. - unsigned SizeInWords = GetWordIndex() - B.StartSizeWord - 1; + size_t SizeInWords = GetWordIndex() - B.StartSizeWord - 1; uint64_t BitNo = uint64_t(B.StartSizeWord) * 32; // Update the block size field in the header of this sub-block. diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 58b9b4a189a..e23f8176330 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -151,7 +151,7 @@ class BitcodeReader : public GVMaterializer { // Last function offset found in the VST. uint64_t LastFunctionBlockBit = 0; bool SeenValueSymbolTable = false; - unsigned VSTOffset = 0; + uint64_t VSTOffset = 0; // Contains an arbitrary and optional string identifying the bitcode producer std::string ProducerIdentification; @@ -388,7 +388,7 @@ private: ErrorOr recordValue(SmallVectorImpl &Record, unsigned NameIndex, Triple &TT); - std::error_code parseValueSymbolTable(unsigned Offset = 0); + std::error_code parseValueSymbolTable(uint64_t Offset = 0); std::error_code parseConstants(); std::error_code rememberAndSkipFunctionBodies(); std::error_code rememberAndSkipFunctionBody(); @@ -1764,7 +1764,7 @@ ErrorOr BitcodeReader::recordValue(SmallVectorImpl &Record, /// Parse the value symbol table at either the current parsing location or /// at the given bit offset if provided. -std::error_code BitcodeReader::parseValueSymbolTable(unsigned Offset) { +std::error_code BitcodeReader::parseValueSymbolTable(uint64_t Offset) { uint64_t CurrentBit; // Pass in the Offset to distinguish between calling for the module-level // VST (where we want to jump to the VST offset) and the function-level