tbaeder created this revision. tbaeder added reviewers: aaron.ballman, erichkeane, shafik, tahonermann. Herald added a project: All. tbaeder requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This is of course in preparation of https://reviews.llvm.org/D133753. I think this patch is needed no matter how the array filler approach ends up. Pass the initializer of the variable through when creating variables. This way we can later inspect the initializer in `Program::createDescriptor()` for the array size. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D133856 Files: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/Program.cpp clang/lib/AST/Interp/Program.h
Index: clang/lib/AST/Interp/Program.h =================================================================== --- clang/lib/AST/Interp/Program.h +++ clang/lib/AST/Interp/Program.h @@ -69,7 +69,7 @@ llvm::Optional<unsigned> getOrCreateDummy(const ParmVarDecl *PD); /// Creates a global and returns its index. - llvm::Optional<unsigned> createGlobal(const ValueDecl *VD); + llvm::Optional<unsigned> createGlobal(const ValueDecl *VD, const Expr *E); /// Creates a global from a lifetime-extended temporary. llvm::Optional<unsigned> createGlobal(const Expr *E); @@ -111,7 +111,8 @@ /// Creates a descriptor for a composite type. Descriptor *createDescriptor(const DeclTy &D, const Type *Ty, bool IsConst = false, bool IsTemporary = false, - bool IsMutable = false); + bool IsMutable = false, + const Expr *Init = nullptr); /// Context to manage declaration lifetimes. class DeclScope { @@ -134,7 +135,8 @@ friend class DeclScope; llvm::Optional<unsigned> createGlobal(const DeclTy &D, QualType Ty, - bool IsStatic, bool IsExtern); + bool IsStatic, bool IsExtern, + const Expr *Init = nullptr); /// Reference to the VM context. Context &Ctx; Index: clang/lib/AST/Interp/Program.cpp =================================================================== --- clang/lib/AST/Interp/Program.cpp +++ clang/lib/AST/Interp/Program.cpp @@ -127,7 +127,7 @@ if (auto Idx = getGlobal(VD)) return Idx; - if (auto Idx = createGlobal(VD)) { + if (auto Idx = createGlobal(VD, nullptr)) { GlobalIndices[VD] = *Idx; return Idx; } @@ -153,7 +153,8 @@ return {}; } -llvm::Optional<unsigned> Program::createGlobal(const ValueDecl *VD) { +llvm::Optional<unsigned> Program::createGlobal(const ValueDecl *VD, + const Expr *Init) { bool IsStatic, IsExtern; if (auto *Var = dyn_cast<VarDecl>(VD)) { IsStatic = !Var->hasLocalStorage(); @@ -162,7 +163,7 @@ IsStatic = false; IsExtern = true; } - if (auto Idx = createGlobal(VD, VD->getType(), IsStatic, IsExtern)) { + if (auto Idx = createGlobal(VD, VD->getType(), IsStatic, IsExtern, Init)) { for (const Decl *P = VD; P; P = P->getPreviousDecl()) GlobalIndices[P] = *Idx; return *Idx; @@ -175,7 +176,8 @@ } llvm::Optional<unsigned> Program::createGlobal(const DeclTy &D, QualType Ty, - bool IsStatic, bool IsExtern) { + bool IsStatic, bool IsExtern, + const Expr *Init) { // Create a descriptor for the global. Descriptor *Desc; const bool IsConst = Ty.isConstQualified(); @@ -310,7 +312,7 @@ Descriptor *Program::createDescriptor(const DeclTy &D, const Type *Ty, bool IsConst, bool IsTemporary, - bool IsMutable) { + bool IsMutable, const Expr *Init) { // Classes and structures. if (auto *RT = Ty->getAs<RecordType>()) { if (auto *Record = getOrCreateRecord(RT->getDecl())) Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -513,18 +513,23 @@ QualType Ty; const ValueDecl *Key = nullptr; + const Expr *Init = nullptr; bool IsTemporary = false; - if (auto *VD = dyn_cast_or_null<ValueDecl>(Src.dyn_cast<const Decl *>())) { + if (auto *VD = dyn_cast_if_present<ValueDecl>(Src.dyn_cast<const Decl *>())) { Key = VD; Ty = VD->getType(); + + if (const auto *VarD = dyn_cast<VarDecl>(VD)) + Init = VarD->getInit(); } if (auto *E = Src.dyn_cast<const Expr *>()) { IsTemporary = true; Ty = E->getType(); } - Descriptor *D = P.createDescriptor(Src, Ty.getTypePtr(), - Ty.isConstQualified(), IsTemporary); + Descriptor *D = + P.createDescriptor(Src, Ty.getTypePtr(), Ty.isConstQualified(), + IsTemporary, /*IsMutable=*/false, Init); if (!D) return {}; @@ -657,7 +662,7 @@ bool ByteCodeExprGen<Emitter>::visitDecl(const VarDecl *VD) { const Expr *Init = VD->getInit(); - if (Optional<unsigned> I = P.createGlobal(VD)) { + if (Optional<unsigned> I = P.createGlobal(VD, Init)) { if (Optional<PrimType> T = classify(VD->getType())) { { // Primitive declarations - compute the value and set it.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits