https://github.com/cooperp created 
https://github.com/llvm/llvm-project/pull/174705

Currently the layout bitmap is emitted as a "class name" but its not actually a 
name at all.  This moves the bitmap to the regular cstring section for now.

In Apple, our linker and other tools try to optimize sections such as objc 
strings.  As layout bitmaps aren't really strings at all, they block some 
optimizations.  We don't currently try to optimize sections such as cstring, 
which is why that is the section i used here for now.

>From 7c760d821b4fe17874f8a9d6ad23185a193d4d04 Mon Sep 17 00:00:00 2001
From: Peter Cooper <[email protected]>
Date: Tue, 6 Jan 2026 22:55:39 -0800
Subject: [PATCH] Move the ObjC layout bitmap to the cstring section.

Currently the layout bitmap is emitted as a "class name" but its not actually
a name at all.  This moves the bitmap to the regular cstring section for now.
---
 clang/lib/CodeGen/CGObjCMac.cpp               |  9 ++++++-
 clang/test/CodeGenObjC/fragile-arc.m          |  8 +++----
 clang/test/CodeGenObjC/ivar-layout-64.m       | 24 +++++++++----------
 .../CodeGenObjC/ivar-layout-array0-struct.m   |  2 +-
 .../CodeGenObjC/ivar-layout-no-optimize.m     |  2 +-
 clang/test/CodeGenObjC/mrc-weak.m             |  8 +++----
 clang/test/CodeGenObjCXX/mrc-weak.mm          |  4 ++--
 7 files changed, 32 insertions(+), 25 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index cb5bb403bb53b..db71af79c49f4 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -730,6 +730,7 @@ enum class ObjCLabelType {
   MethodVarName,
   MethodVarType,
   PropertyName,
+  LayoutBitMap,
 };
 
 class CGObjCCommonMac : public CodeGen::CGObjCRuntime {
@@ -4048,6 +4049,9 @@ CGObjCCommonMac::CreateCStringLiteral(StringRef Name, 
ObjCLabelType Type,
   case ObjCLabelType::PropertyName:
     Label = "OBJC_PROP_NAME_ATTR_";
     break;
+  case ObjCLabelType::LayoutBitMap:
+    Label = "OBJC_LAYOUT_BITMAP_";
+    break;
   }
 
   bool NonFragile = ForceNonFragileABI || isNonFragileABI();
@@ -4070,6 +4074,9 @@ CGObjCCommonMac::CreateCStringLiteral(StringRef Name, 
ObjCLabelType Type,
     Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals"
                          : "__TEXT,__cstring,cstring_literals";
     break;
+  case ObjCLabelType::LayoutBitMap:
+    Section = "__TEXT,__cstring,cstring_literals";
+    break;
   }
 
   llvm::Constant *Value =
@@ -5421,7 +5428,7 @@ IvarLayoutBuilder::buildBitmap(CGObjCCommonMac &CGObjC,
   buffer.push_back(0);
 
   auto *Entry = CGObjC.CreateCStringLiteral(
-      reinterpret_cast<char *>(buffer.data()), ObjCLabelType::ClassName);
+      reinterpret_cast<char *>(buffer.data()), ObjCLabelType::LayoutBitMap);
   return getConstantGEP(CGM.getLLVMContext(), Entry, 0, 0);
 }
 
diff --git a/clang/test/CodeGenObjC/fragile-arc.m 
b/clang/test/CodeGenObjC/fragile-arc.m
index 7afa08bcf685b..1014d558f002b 100644
--- a/clang/test/CodeGenObjC/fragile-arc.m
+++ b/clang/test/CodeGenObjC/fragile-arc.m
@@ -16,9 +16,9 @@ @interface A : Root {
 
 // GLOBALS-LABEL: @OBJC_METACLASS_A
 //  Strong layout: scan the first word.
-// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant [2 x i8] 
c"\01\00"
+// GLOBALS: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant [2 x 
i8] c"\01\00"
 //  Weak layout: skip the first word, scan the second word.
-// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant [2 x i8] 
c"\11\00"
+// GLOBALS: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant [2 x 
i8] c"\11\00"
 
 //  0x04002001
 //     ^ is compiled by ARC (controls interpretation of layouts)
@@ -95,9 +95,9 @@ @implementation C @end
 // GLOBALS-LABEL: @OBJC_METACLASS_C
 //  Strong layout: skip five, scan four, skip three, scan seven
 //    'T' == 0x54, '7' == 0x37
-// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant [3 x i8] 
c"T7\00"
+// GLOBALS: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant [3 x 
i8] c"T7\00"
 //  Weak layout: skip nine, scan three
-// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant [2 x i8] 
c"\93\00"
+// GLOBALS: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant [2 x 
i8] c"\93\00"
 
 extern void useBlock(void (^block)(void));
 
diff --git a/clang/test/CodeGenObjC/ivar-layout-64.m 
b/clang/test/CodeGenObjC/ivar-layout-64.m
index 409434ca3bef3..c105a170297ac 100644
--- a/clang/test/CodeGenObjC/ivar-layout-64.m
+++ b/clang/test/CodeGenObjC/ivar-layout-64.m
@@ -34,8 +34,8 @@ @interface C : A
 @end
 
 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"C\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"\11p\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"!`\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"\11p\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"!`\00"
 
 
 @implementation C
@@ -49,8 +49,8 @@ @interface A()
 @end
 
 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"A\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"\11q\10\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"!q\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"\11q\10\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"!q\00"
 
 @implementation A
 @synthesize p0 = _p0;
@@ -63,8 +63,8 @@ @interface D : A
 @end
 
 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"D\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"\11\A0\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"!\90\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"\11\A0\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"!\90\00"
 
 @implementation D
 @synthesize p3 = _p3;
@@ -90,7 +90,7 @@ @interface NSFileLocationComponent {
 @end
 
 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"NSFileLocationComponent\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"\01\14\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"\01\14\00"
 
 @implementation NSFileLocationComponent @end
 
@@ -109,7 +109,7 @@ @interface Foo : NSObject {
 @end
 
 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"Foo\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"\02\10\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"\02\10\00"
 
 @implementation Foo @end
 
@@ -125,7 +125,7 @@ @interface Packed : NSObject {
 @end
 @implementation Packed @end
 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"Packed\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\01 
\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"\01 \00"
 //  ' ' == 0x20
 
 // Ensure that layout descends into anonymous unions and structs.
@@ -143,7 +143,7 @@ @interface AnonymousUnion : NSObject {
 @end
 @implementation AnonymousUnion @end
 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"AnonymousUnion\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"\02\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"\02\00"
 
 @interface AnonymousStruct : NSObject {
   struct {
@@ -156,6 +156,6 @@ @interface AnonymousStruct : NSObject {
 @end
 @implementation AnonymousStruct @end
 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"AnonymousStruct\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"\02\10\00"
-// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} 
c"!\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"\02\10\00"
+// CHECK: @OBJC_LAYOUT_BITMAP_{{.*}} = private unnamed_addr constant {{.*}} 
c"!\00"
 //  '!' == 0x21
diff --git a/clang/test/CodeGenObjC/ivar-layout-array0-struct.m 
b/clang/test/CodeGenObjC/ivar-layout-array0-struct.m
index 95c1695030a0e..c1fd98826299a 100644
--- a/clang/test/CodeGenObjC/ivar-layout-array0-struct.m
+++ b/clang/test/CodeGenObjC/ivar-layout-array0-struct.m
@@ -18,5 +18,5 @@ @interface Test : NSObject {
 @end
 
 @implementation Test @end
-// CHECK-LP64: L_OBJC_CLASS_NAME_.4:
+// CHECK-LP64: L_OBJC_LAYOUT_BITMAP_:
 // CHECK-LP64-NEXT: .asciz      "\001\020"
diff --git a/clang/test/CodeGenObjC/ivar-layout-no-optimize.m 
b/clang/test/CodeGenObjC/ivar-layout-no-optimize.m
index 099bf6847434b..8135f022a9871 100644
--- a/clang/test/CodeGenObjC/ivar-layout-no-optimize.m
+++ b/clang/test/CodeGenObjC/ivar-layout-no-optimize.m
@@ -16,5 +16,5 @@ @interface AllPointers : NSObject {
 @implementation AllPointers
 @end
 
-// CHECK-LP64: L_OBJC_CLASS_NAME_.6:
+// CHECK-LP64: OBJC_LAYOUT_BITMAP_:
 // CHECK-LP64-NEXT: .asciz     "\004"
diff --git a/clang/test/CodeGenObjC/mrc-weak.m 
b/clang/test/CodeGenObjC/mrc-weak.m
index 499a41a510ec5..6fc0b34b5799d 100644
--- a/clang/test/CodeGenObjC/mrc-weak.m
+++ b/clang/test/CodeGenObjC/mrc-weak.m
@@ -14,10 +14,10 @@ @interface HighlyAligned : Object {
 @end
 // CHECK-MODERN: @"OBJC_IVAR_$_HighlyAlignedSubclass.ivar2" ={{.*}} global i64 
24,
 // CHECK-MODERN: @"OBJC_IVAR_$_HighlyAlignedSubclass.ivar" ={{.*}} global i64 
16,
-// CHECK-MODERN: @OBJC_CLASS_NAME_{{.*}} = {{.*}} c"\02\00"
+// CHECK-MODERN: @OBJC_LAYOUT_BITMAP_{{.*}} = {{.*}} c"\02\00"
 // CHECK-MODERN: @"_OBJC_CLASS_RO_$_HighlyAlignedSubclass" = {{.*}} {
 // CHECK-FRAGILE: @OBJC_INSTANCE_VARIABLES_HighlyAlignedSubclass = {{.*}}, i32 
8 }, {{.*}}, i32 12 }]
-// CHECK-FRAGILE: @OBJC_CLASS_NAME_{{.*}} = {{.*}} c"\02\00"
+// CHECK-FRAGILE: @OBJC_LAYOUT_BITMAP_{{.*}} = {{.*}} c"\02\00"
 // CHECK-FRAGILE: @OBJC_CLASS_HighlyAlignedSubclass
 @interface HighlyAlignedSubclass : HighlyAligned {
   __weak id ivar;
@@ -26,14 +26,14 @@ @interface HighlyAlignedSubclass : HighlyAligned {
 @end
 @implementation HighlyAlignedSubclass @end
 
-// CHECK-MODERN: @OBJC_CLASS_NAME_{{.*}} = {{.*}} c"\01\00"
+// CHECK-MODERN: @OBJC_LAYOUT_BITMAP_{{.*}} = {{.*}} c"\01\00"
 // CHECK-MODERN: @"_OBJC_CLASS_RO_$_Foo" = {{.*}} { i32 772
 //   772 == 0x304
 //            ^ HasMRCWeakIvars
 //            ^ HasCXXDestructorOnly
 //              ^ HasCXXStructors
 
-// CHECK-FRAGILE: @OBJC_CLASS_NAME_{{.*}} = {{.*}} c"\01\00"
+// CHECK-FRAGILE: @OBJC_LAYOUT_BITMAP_{{.*}} = {{.*}} c"\01\00"
 // CHECK-FRAGILE: @OBJC_CLASS_Foo = {{.*}} i32 134225921,
 //   134225921 == 0x08002001
 //                   ^ HasMRCWeakIvars
diff --git a/clang/test/CodeGenObjCXX/mrc-weak.mm 
b/clang/test/CodeGenObjCXX/mrc-weak.mm
index 9e22885541c64..47c1d7623c323 100644
--- a/clang/test/CodeGenObjCXX/mrc-weak.mm
+++ b/clang/test/CodeGenObjCXX/mrc-weak.mm
@@ -6,14 +6,14 @@ - (instancetype) retain;
 - (void) run;
 @end
 
-// CHECK-MODERN: @OBJC_CLASS_NAME_{{.*}} = {{.*}} c"\01\00"
+// CHECK-MODERN: @OBJC_LAYOUT_BITMAP_{{.*}} = {{.*}} c"\01\00"
 // CHECK-MODERN: @"_OBJC_CLASS_RO_$_Foo" = {{.*}} { i32 772
 //   772 == 0x304
 //            ^ HasMRCWeakIvars
 //            ^ HasCXXDestructorOnly
 //              ^ HasCXXStructors
 
-// CHECK-FRAGILE: @OBJC_CLASS_NAME_{{.*}} = {{.*}} c"\01\00"
+// CHECK-FRAGILE: @OBJC_LAYOUT_BITMAP_{{.*}} = {{.*}} c"\01\00"
 // CHECK-FRAGILE: @OBJC_CLASS_Foo = {{.*}} i32 134225921,
 //   134225921 == 0x08002001
 //                   ^ HasMRCWeakIvars

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to