From da62ed6ceb12031992d863ce272bc4863505b84b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Wed, 14 Sep 2022 15:03:04 +0200 Subject: [PATCH] [clang][Interp] Pass initializer when creating globals This is dead code right now but will be used for implementing array fillers, where we need some information from the initializer when allocaing the Descriptors. Differential Revision: https://reviews.llvm.org/D133856 --- clang/lib/AST/Interp/ByteCodeExprGen.cpp | 12 ++++++++---- clang/lib/AST/Interp/Program.cpp | 12 +++++++----- clang/lib/AST/Interp/Program.h | 8 +++++--- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index 0abd3ff..f86a7b1 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -513,18 +513,22 @@ ByteCodeExprGen::allocateLocal(DeclTy &&Src, bool IsExtended) { QualType Ty; const ValueDecl *Key = nullptr; + const Expr *Init = nullptr; bool IsTemporary = false; - if (auto *VD = dyn_cast_or_null(Src.dyn_cast())) { + if (auto *VD = dyn_cast_if_present(Src.dyn_cast())) { Key = VD; Ty = VD->getType(); + + if (const auto *VarD = dyn_cast(VD)) + Init = VarD->getInit(); } if (auto *E = Src.dyn_cast()) { 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, false, Init); if (!D) return {}; @@ -657,7 +661,7 @@ template bool ByteCodeExprGen::visitDecl(const VarDecl *VD) { const Expr *Init = VD->getInit(); - if (Optional I = P.createGlobal(VD)) { + if (Optional I = P.createGlobal(VD, Init)) { if (Optional T = classify(VD->getType())) { { // Primitive declarations - compute the value and set it. diff --git a/clang/lib/AST/Interp/Program.cpp b/clang/lib/AST/Interp/Program.cpp index 0d4d84e..aa700a1 100644 --- a/clang/lib/AST/Interp/Program.cpp +++ b/clang/lib/AST/Interp/Program.cpp @@ -127,7 +127,7 @@ llvm::Optional Program::getOrCreateGlobal(const ValueDecl *VD) { 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 @@ llvm::Optional Program::getOrCreateDummy(const ParmVarDecl *PD) { return {}; } -llvm::Optional Program::createGlobal(const ValueDecl *VD) { +llvm::Optional Program::createGlobal(const ValueDecl *VD, + const Expr *Init) { bool IsStatic, IsExtern; if (auto *Var = dyn_cast(VD)) { IsStatic = !Var->hasLocalStorage(); @@ -162,7 +163,7 @@ llvm::Optional Program::createGlobal(const ValueDecl *VD) { 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 Program::createGlobal(const Expr *E) { } llvm::Optional 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 @@ Record *Program::getOrCreateRecord(const RecordDecl *RD) { 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()) { if (auto *Record = getOrCreateRecord(RT->getDecl())) diff --git a/clang/lib/AST/Interp/Program.h b/clang/lib/AST/Interp/Program.h index ca985af..b711bd2 100644 --- a/clang/lib/AST/Interp/Program.h +++ b/clang/lib/AST/Interp/Program.h @@ -69,7 +69,7 @@ public: llvm::Optional getOrCreateDummy(const ParmVarDecl *PD); /// Creates a global and returns its index. - llvm::Optional createGlobal(const ValueDecl *VD); + llvm::Optional createGlobal(const ValueDecl *VD, const Expr *E); /// Creates a global from a lifetime-extended temporary. llvm::Optional createGlobal(const Expr *E); @@ -111,7 +111,8 @@ public: /// 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 @@ private: friend class DeclScope; llvm::Optional 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; -- 2.7.4