hokein created this revision. hokein added a reviewer: sammccall. Herald added a project: clang.
I was surprised to see the LocalOffset can exceed uint32_t, but it does happen and lead to crashes in one of our internal huge TU with a large preamble. with this patch, the crash is gone. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D79397 Files: clang/include/clang/Serialization/ASTReader.h clang/include/clang/Serialization/ASTRecordReader.h clang/lib/Serialization/ASTReaderDecl.cpp Index: clang/lib/Serialization/ASTReaderDecl.cpp =================================================================== --- clang/lib/Serialization/ASTReaderDecl.cpp +++ clang/lib/Serialization/ASTReaderDecl.cpp @@ -2879,7 +2879,7 @@ return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset); } -uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint32_t LocalOffset) { +uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) { return LocalOffset + M.GlobalBitOffset; } Index: clang/include/clang/Serialization/ASTRecordReader.h =================================================================== --- clang/include/clang/Serialization/ASTRecordReader.h +++ clang/include/clang/Serialization/ASTRecordReader.h @@ -119,7 +119,7 @@ //readExceptionSpecInfo(SmallVectorImpl<QualType> &ExceptionStorage); /// Get the global offset corresponding to a local offset. - uint64_t getGlobalBitOffset(uint32_t LocalOffset) { + uint64_t getGlobalBitOffset(uint64_t LocalOffset) { return Reader->getGlobalBitOffset(*F, LocalOffset); } Index: clang/include/clang/Serialization/ASTReader.h =================================================================== --- clang/include/clang/Serialization/ASTReader.h +++ clang/include/clang/Serialization/ASTReader.h @@ -1355,7 +1355,7 @@ unsigned PreviousGeneration = 0); RecordLocation getLocalBitOffset(uint64_t GlobalOffset); - uint64_t getGlobalBitOffset(ModuleFile &M, uint32_t LocalOffset); + uint64_t getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset); /// Returns the first preprocessed entity ID that begins or ends after /// \arg Loc.
Index: clang/lib/Serialization/ASTReaderDecl.cpp =================================================================== --- clang/lib/Serialization/ASTReaderDecl.cpp +++ clang/lib/Serialization/ASTReaderDecl.cpp @@ -2879,7 +2879,7 @@ return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset); } -uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint32_t LocalOffset) { +uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) { return LocalOffset + M.GlobalBitOffset; } Index: clang/include/clang/Serialization/ASTRecordReader.h =================================================================== --- clang/include/clang/Serialization/ASTRecordReader.h +++ clang/include/clang/Serialization/ASTRecordReader.h @@ -119,7 +119,7 @@ //readExceptionSpecInfo(SmallVectorImpl<QualType> &ExceptionStorage); /// Get the global offset corresponding to a local offset. - uint64_t getGlobalBitOffset(uint32_t LocalOffset) { + uint64_t getGlobalBitOffset(uint64_t LocalOffset) { return Reader->getGlobalBitOffset(*F, LocalOffset); } Index: clang/include/clang/Serialization/ASTReader.h =================================================================== --- clang/include/clang/Serialization/ASTReader.h +++ clang/include/clang/Serialization/ASTReader.h @@ -1355,7 +1355,7 @@ unsigned PreviousGeneration = 0); RecordLocation getLocalBitOffset(uint64_t GlobalOffset); - uint64_t getGlobalBitOffset(ModuleFile &M, uint32_t LocalOffset); + uint64_t getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset); /// Returns the first preprocessed entity ID that begins or ends after /// \arg Loc.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits