[clang] bd8d432 - [clang][bytecode] Add support for creating dummies for expressions (#108394)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 12 08:25:43 PDT 2024
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;
More information about the cfe-commits
mailing list