=?utf-8?q?Balázs_Kéri?= <balazs.k...@ericsson.com> Message-ID: In-Reply-To: <llvm.org/llvm/llvm-project/pull/147...@github.com>
================ @@ -1054,10 +1054,26 @@ const VarRegion *MemRegionManager::getVarRegion(const VarDecl *D, assert(!Ty.isNull()); if (Ty.isConstQualified()) { sReg = getGlobalsRegion(MemRegion::GlobalImmutableSpaceRegionKind); - } else if (Ctx.getSourceManager().isInSystemHeader(D->getLocation())) { - sReg = getGlobalsRegion(MemRegion::GlobalSystemSpaceRegionKind); } else { - sReg = getGlobalsRegion(MemRegion::GlobalInternalSpaceRegionKind); + StringRef N = D->getNameAsString(); + QualType FILETy = D->getASTContext().getFILEType(); + if (!FILETy.isNull()) + FILETy = FILETy.getCanonicalType(); + Ty = Ty.getCanonicalType(); + bool IsStdStreamVar = Ty->isPointerType() && + Ty->getPointeeType() == FILETy && + (N == "stdin" || N == "stdout" || N == "stderr"); + // Pointer value of C standard streams is usually not modified by calls + // to functions declared in system headers. This means that they should + // not get invalidated by calls to functions declared in system headers, + // so they are placed in the global internal space, which is not + // invalidated by calls to functions declared in system headers. + if (Ctx.getSourceManager().isInSystemHeader(D->getLocation()) && + !IsStdStreamVar) { + sReg = getGlobalsRegion(MemRegion::GlobalSystemSpaceRegionKind); + } else { + sReg = getGlobalsRegion(MemRegion::GlobalInternalSpaceRegionKind); + } ---------------- steakhal wrote: So, if I understand this code correctly, we want to bless `std` streams to not get invalidated even on calls to fns of system headers, right? https://github.com/llvm/llvm-project/pull/147766 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits