[clang] [clang][bytecode] Create dummy pointers for ObjCStringLiterals (PR #109520)

Timm Baeder via cfe-commits cfe-commits at lists.llvm.org
Sat Sep 21 00:59:12 PDT 2024


https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/109520

We need to have the final APValue point to the ObjCStringLiteral expression, not the StringLiteral itself.

>From ca2960bcb2307c415547ef12fa3628aec4d4d702 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Sat, 21 Sep 2024 09:56:44 +0200
Subject: [PATCH] [clang][bytecode] Create dummy pointers for
 ObjCStringLiterals

We need to have the final APValue point to the ObjCStringLiteral
expression, not the StringLiteral itself.
---
 clang/lib/AST/ByteCode/Compiler.cpp |  4 +++-
 clang/test/AST/ByteCode/codegen.m   | 12 ++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/AST/ByteCode/codegen.m

diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 7e0775a51aee61..161b6a9bb36ec7 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -2134,7 +2134,9 @@ bool Compiler<Emitter>::VisitStringLiteral(const StringLiteral *E) {
 
 template <class Emitter>
 bool Compiler<Emitter>::VisitObjCStringLiteral(const ObjCStringLiteral *E) {
-  return this->delegate(E->getString());
+  if (std::optional<unsigned> I = P.getOrCreateDummy(E))
+    return this->emitGetPtrGlobal(*I, E);
+  return false;
 }
 
 template <class Emitter>
diff --git a/clang/test/AST/ByteCode/codegen.m b/clang/test/AST/ByteCode/codegen.m
new file mode 100644
index 00000000000000..08c3d9a70b36d7
--- /dev/null
+++ b/clang/test/AST/ByteCode/codegen.m
@@ -0,0 +1,12 @@
+// REQUIRES: x86-registered-target
+
+/// See test/CodeGenObjC/constant-strings.m
+/// Test that we let the APValue we create for ObjCStringLiterals point to the right expression.
+
+// RUN: %clang_cc1 -triple x86_64-macho -emit-llvm -o %t %s -fexperimental-new-constant-interpreter
+// RUN: FileCheck --check-prefix=CHECK-NEXT < %t %s
+
+// Check that we set alignment 1 on the string.
+//
+// CHECK-NEXT: @.str = {{.*}}constant [13 x i8] c"Hello World!\00", section "__TEXT,__cstring,cstring_literals", align 1
+id a = @"Hello World!";



More information about the cfe-commits mailing list