Author: Timm Baeder Date: 2024-09-12T17:25:40+02:00 New Revision: bd8d432d7bd0891132ae69daa70e18ba387df43f
URL: https://github.com/llvm/llvm-project/commit/bd8d432d7bd0891132ae69daa70e18ba387df43f DIFF: https://github.com/llvm/llvm-project/commit/bd8d432d7bd0891132ae69daa70e18ba387df43f.diff LOG: [clang][bytecode] Add support for creating dummies for expressions (#108394) And use that to fix VisitObjCBoxedExprs. Added: Modified: clang/lib/AST/ByteCode/Compiler.cpp clang/lib/AST/ByteCode/Program.cpp clang/lib/AST/ByteCode/Program.h clang/test/CodeGenObjC/boxing.m Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 3ba9732a979244..265350e44d95b9 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -3335,7 +3335,11 @@ bool Compiler<Emitter>::VisitObjCBoxedExpr(const ObjCBoxedExpr *E) { if (!E->isExpressibleAsConstantInitializer()) return this->discard(SubExpr) && this->emitInvalid(E); - return this->delegate(SubExpr); + assert(classifyPrim(E) == PT_Ptr); + if (std::optional<unsigned> I = P.getOrCreateDummy(E)) + return this->emitGetPtrGlobal(*I, E); + + return false; } template <class Emitter> @@ -4118,7 +4122,7 @@ bool Compiler<Emitter>::VisitBuiltinCallExpr(const CallExpr *E, BuiltinID == Builtin::BI__builtin___NSStringMakeConstantString || BuiltinID == Builtin::BI__builtin_ptrauth_sign_constant || BuiltinID == Builtin::BI__builtin_function_start) { - if (std::optional<unsigned> GlobalOffset = P.createGlobal(E)) { + if (std::optional<unsigned> GlobalOffset = P.getOrCreateDummy(E)) { if (!this->emitGetPtrGlobal(*GlobalOffset, E)) return false; diff --git a/clang/lib/AST/ByteCode/Program.cpp b/clang/lib/AST/ByteCode/Program.cpp index a4f0df8bf6462e..bd5860beabaecd 100644 --- a/clang/lib/AST/ByteCode/Program.cpp +++ b/clang/lib/AST/ByteCode/Program.cpp @@ -144,22 +144,33 @@ std::optional<unsigned> Program::getOrCreateGlobal(const ValueDecl *VD, return std::nullopt; } -std::optional<unsigned> Program::getOrCreateDummy(const ValueDecl *VD) { +std::optional<unsigned> Program::getOrCreateDummy(const DeclTy &D) { + assert(D); // Dedup blocks since they are immutable and pointers cannot be compared. - if (auto It = DummyVariables.find(VD); It != DummyVariables.end()) + if (auto It = DummyVariables.find(D.getOpaqueValue()); + It != DummyVariables.end()) return It->second; - QualType QT = VD->getType(); - if (const auto *RT = QT->getAs<ReferenceType>()) - QT = RT->getPointeeType(); + QualType QT; + if (const auto *E = D.dyn_cast<const Expr *>()) { + QT = E->getType(); + } else { + const ValueDecl *VD = cast<ValueDecl>(D.get<const Decl *>()); + QT = VD->getType(); + if (const auto *RT = QT->getAs<ReferenceType>()) + QT = RT->getPointeeType(); + } + assert(!QT.isNull()); Descriptor *Desc; if (std::optional<PrimType> T = Ctx.classify(QT)) - Desc = createDescriptor(VD, *T, std::nullopt, true, false); + Desc = createDescriptor(D, *T, std::nullopt, /*IsTemporary=*/true, + /*IsMutable=*/false); else - Desc = createDescriptor(VD, QT.getTypePtr(), std::nullopt, true, false); + Desc = createDescriptor(D, QT.getTypePtr(), std::nullopt, + /*IsTemporary=*/true, /*IsMutable=*/false); if (!Desc) - Desc = allocateDescriptor(VD); + Desc = allocateDescriptor(D); assert(Desc); Desc->makeDummy(); @@ -175,7 +186,7 @@ std::optional<unsigned> Program::getOrCreateDummy(const ValueDecl *VD) { G->block()->invokeCtor(); Globals.push_back(G); - DummyVariables[VD] = I; + DummyVariables[D.getOpaqueValue()] = I; return I; } diff --git a/clang/lib/AST/ByteCode/Program.h b/clang/lib/AST/ByteCode/Program.h index 7f69d9790fc79a..bd2672a762b82a 100644 --- a/clang/lib/AST/ByteCode/Program.h +++ b/clang/lib/AST/ByteCode/Program.h @@ -84,7 +84,7 @@ class Program final { const Expr *Init = nullptr); /// Returns or creates a dummy value for unknown declarations. - std::optional<unsigned> getOrCreateDummy(const ValueDecl *VD); + std::optional<unsigned> getOrCreateDummy(const DeclTy &D); /// Creates a global and returns its index. std::optional<unsigned> createGlobal(const ValueDecl *VD, const Expr *Init); @@ -209,7 +209,7 @@ class Program final { llvm::DenseMap<const RecordDecl *, Record *> Records; /// Dummy parameter to generate pointers from. - llvm::DenseMap<const ValueDecl *, unsigned> DummyVariables; + llvm::DenseMap<const void *, unsigned> DummyVariables; /// Creates a new descriptor. template <typename... Ts> Descriptor *allocateDescriptor(Ts &&...Args) { diff --git a/clang/test/CodeGenObjC/boxing.m b/clang/test/CodeGenObjC/boxing.m index 3f857e089ded73..c124f172fd37fe 100644 --- a/clang/test/CodeGenObjC/boxing.m +++ b/clang/test/CodeGenObjC/boxing.m @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fexperimental-new-constant-interpreter | FileCheck %s typedef long NSInteger; typedef unsigned long NSUInteger; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits