================ @@ -1551,6 +1567,58 @@ bool Preprocessor::isPPInSafeBufferOptOutRegion(SourceLocation &StartLoc) { return InSafeBufferOptOutRegion; } +SmallVector<SourceLocation, 64> +Preprocessor::serializeSafeBufferOptOutMap() const { + assert(!InSafeBufferOptOutRegion && + "Attempt to serialize safe buffer opt-out regions before file being " + "completely preprocessed"); + + SmallVector<SourceLocation, 64> SrcSeq; + + for (const auto &[begin, end] : SafeBufferOptOutMap) { + SrcSeq.push_back(begin); + SrcSeq.push_back(end); + } + // Only `SafeBufferOptOutMap` gets serialized. No need to serialize + // `LoadedSafeBufferOptOutMap` because if this TU loads a pch/module, every + // pch/module in the pch-chain/module-DAG will be loaded one by one in order. + // It means that for each loading pch/module m, it just needs to load m's own + // `SafeBufferOptOutMap`. + return SrcSeq; +} + +void Preprocessor::setDeserializedSafeBufferOptOutMap( + const SmallVectorImpl<SourceLocation> &SourceLocations) { + auto It = SourceLocations.begin(); + + assert(SourceLocations.size() % 2 == 0 && + "ill-formed SourceLocation sequence"); + while (It != SourceLocations.end()) { + SourceLocation begin = *It++; + SourceLocation end = *It++; + SourceLocation FileLoc = SourceMgr.getFileLoc(begin); + FileID FID = SourceMgr.getDecomposedLoc(FileLoc).first; + + if (FID.isInvalid()) { + // I suppose this should not happen: + assert(false && "Attempted to read a safe buffer opt-out region whose " + "begin location is associated to an invalid File ID."); + break; + } + assert(!SourceMgr.isLocalFileID(FID) && "Expected a pch/module file"); + // Here we assume that + // `SourceMgr.getFileLoc(begin) == SourceMgr.getFileLoc(end)`. + // Though it may not hold in very rare and strange cases, i.e., a pair of ---------------- haoNoQ wrote:
If it may happen it shouldn't be an assert. If we really don't support this scenario it should probably be a compilation error, even if it only says "we don't support this yet sorry". (Can we emit compilation errors from here?) https://github.com/llvm/llvm-project/pull/92031 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits