[llvm] b28db57 - [SystemZ][z/OS] Support emitting common symbols in HLASM (#215278)

via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 24 06:13:03 PDT 2026


Author: Kai Nacke
Date: 2026-08-24T09:12:58-04:00
New Revision: b28db577d7d30ab969942c5ab274c62fc9e774cf

URL: https://github.com/llvm/llvm-project/commit/b28db577d7d30ab969942c5ab274c62fc9e774cf
DIFF: https://github.com/llvm/llvm-project/commit/b28db577d7d30ab969942c5ab274c62fc9e774cf.diff

LOG: [SystemZ][z/OS] Support emitting common symbols in HLASM (#215278)

This is a follow-up to #210179. It reuses the logic to emit common
symbols in HLASM, too.

Added: 
    

Modified: 
    llvm/include/llvm/MC/MCSymbolGOFF.h
    llvm/lib/MC/MCGOFFStreamer.cpp
    llvm/lib/MC/MCSymbolGOFF.cpp
    llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.cpp
    llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h
    llvm/test/CodeGen/SystemZ/zos-common-global.ll

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/MC/MCSymbolGOFF.h b/llvm/include/llvm/MC/MCSymbolGOFF.h
index 24732578cf323..30b14987714a1 100644
--- a/llvm/include/llvm/MC/MCSymbolGOFF.h
+++ b/llvm/include/llvm/MC/MCSymbolGOFF.h
@@ -19,9 +19,12 @@
 #include "llvm/MC/MCSectionGOFF.h"
 #include "llvm/MC/MCSymbol.h"
 #include "llvm/MC/MCSymbolTableEntry.h"
+#include "llvm/Support/Alignment.h"
 
 namespace llvm {
 
+class MCContext;
+
 class MCSymbolGOFF : public MCSymbol {
 
   StringRef ExternalName; // Alternate external name.
@@ -92,6 +95,10 @@ class MCSymbolGOFF : public MCSymbol {
 
   LLVM_ABI bool setSymbolAttribute(MCSymbolAttr Attribute);
 
+  /// Return the PR section to use when emitting this symbol as a common symbol.
+  LLVM_ABI MCSectionGOFF *getSectionForCommonSymbol(MCContext &Ctx,
+                                                    Align ByteAlignment);
+
   bool isInEDSection() const {
     return isInSection() && static_cast<MCSectionGOFF &>(getSection()).isED();
   }

diff  --git a/llvm/lib/MC/MCGOFFStreamer.cpp b/llvm/lib/MC/MCGOFFStreamer.cpp
index ebe8bc0a0207d..46cad50890b3c 100644
--- a/llvm/lib/MC/MCGOFFStreamer.cpp
+++ b/llvm/lib/MC/MCGOFFStreamer.cpp
@@ -11,7 +11,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/MC/MCGOFFStreamer.h"
-#include "llvm/BinaryFormat/GOFF.h"
 #include "llvm/MC/MCAsmBackend.h"
 #include "llvm/MC/MCAssembler.h"
 #include "llvm/MC/MCCodeEmitter.h"
@@ -76,25 +75,8 @@ bool MCGOFFStreamer::emitSymbolAttribute(MCSymbol *Sym,
 void MCGOFFStreamer::emitCommonSymbol(MCSymbol *S, uint64_t Size,
                                       Align ByteAlignment) {
   auto *Symbol = static_cast<MCSymbolGOFF *>(S);
-
-  MCSectionGOFF *SD = getContext().getGOFFSection(
-      SectionKind::getMetadata(), Symbol->getName(),
-      GOFF::SDAttr{GOFF::ESD_TA_Unspecified, GOFF::ESD_BSC_Unspecified});
-
-  MCSectionGOFF *ED = getContext().getGOFFSection(
-      SectionKind::getMetadata(), GOFF::CLASS_WSA,
-      GOFF::EDAttr{false, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
-                   GOFF::ESD_TS_ByteOriented, GOFF::ESD_BA_Merge,
-                   GOFF::ESD_LB_Deferred, GOFF::ESD_RQ_0, 0},
-      SD);
-  ED->setAlignment(ByteAlignment);
-
-  MCSectionGOFF *Section = getContext().getGOFFSection(
-      SectionKind::getBSS(), Symbol->getName(),
-      GOFF::PRAttr{false, GOFF::ESD_EXE_DATA, GOFF::ESD_LT_XPLink,
-                   Symbol->getBindingScope(), 0},
-      ED);
-
+  MCSectionGOFF *Section =
+      Symbol->getSectionForCommonSymbol(getContext(), ByteAlignment);
   pushSection();
   switchSection(Section);
   emitLabel(Symbol);

diff  --git a/llvm/lib/MC/MCSymbolGOFF.cpp b/llvm/lib/MC/MCSymbolGOFF.cpp
index b6a25c3a24d94..31ec70cc74c2a 100644
--- a/llvm/lib/MC/MCSymbolGOFF.cpp
+++ b/llvm/lib/MC/MCSymbolGOFF.cpp
@@ -8,10 +8,33 @@
 
 #include "llvm/MC/MCSymbolGOFF.h"
 #include "llvm/BinaryFormat/GOFF.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/Support/Alignment.h"
 #include "llvm/Support/ErrorHandling.h"
 
 using namespace llvm;
 
+MCSectionGOFF *MCSymbolGOFF::getSectionForCommonSymbol(MCContext &Ctx,
+                                                       Align ByteAlignment) {
+  MCSectionGOFF *SD = Ctx.getGOFFSection(
+      SectionKind::getMetadata(), getName(),
+      GOFF::SDAttr{GOFF::ESD_TA_Unspecified, GOFF::ESD_BSC_Unspecified});
+
+  MCSectionGOFF *ED = Ctx.getGOFFSection(
+      SectionKind::getMetadata(), GOFF::CLASS_WSA,
+      GOFF::EDAttr{false, GOFF::ESD_RMODE_64, GOFF::ESD_NS_Parts,
+                   GOFF::ESD_TS_ByteOriented, GOFF::ESD_BA_Merge,
+                   GOFF::ESD_LB_Deferred, GOFF::ESD_RQ_0, 0},
+      SD);
+  ED->setAlignment(ByteAlignment);
+
+  return Ctx.getGOFFSection(SectionKind::getBSS(), getName(),
+                            GOFF::PRAttr{false, GOFF::ESD_EXE_DATA,
+                                         GOFF::ESD_LT_XPLink, getBindingScope(),
+                                         0},
+                            ED);
+}
+
 bool MCSymbolGOFF::setSymbolAttribute(MCSymbolAttr Attribute) {
   switch (Attribute) {
   case MCSA_Invalid:

diff  --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.cpp
index 4f3db1a962ede..df1b45c381023 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.cpp
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.cpp
@@ -10,8 +10,6 @@
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/BinaryFormat/GOFF.h"
 #include "llvm/MC/MCExpr.h"
-#include "llvm/MC/MCGOFFAttributes.h"
-#include "llvm/MC/MCGOFFStreamer.h"
 #include "llvm/MC/MCSectionGOFF.h"
 #include "llvm/MC/MCSymbolGOFF.h"
 #include "llvm/Support/Casting.h"
@@ -491,6 +489,18 @@ bool SystemZHLASMAsmStreamer::emitSymbolAttribute(MCSymbol *Sym,
   return static_cast<MCSymbolGOFF *>(Sym)->setSymbolAttribute(Attribute);
 }
 
+void SystemZHLASMAsmStreamer::emitCommonSymbol(MCSymbol *S, uint64_t Size,
+                                               Align ByteAlignment) {
+  auto *Symbol = static_cast<MCSymbolGOFF *>(S);
+  MCSectionGOFF *Section =
+      Symbol->getSectionForCommonSymbol(getContext(), ByteAlignment);
+  pushSection();
+  switchSection(Section);
+  emitLabel(Symbol, SMLoc());
+  emitZeros(Size);
+  popSection();
+}
+
 void SystemZHLASMAsmStreamer::emitRawTextImpl(StringRef String) {
   String.consume_back("\n");
   OS << String;

diff  --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h
index ccfb77f34b484..70f8fb0aede70 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h
@@ -101,7 +101,7 @@ class SystemZHLASMAsmStreamer final : public MCAsmBaseStreamer {
   bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
 
   void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
-                        Align ByteAlignment) override {}
+                        Align ByteAlignment) override;
 
   void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,
                     uint64_t Size = 0, Align ByteAlignment = Align(1),

diff  --git a/llvm/test/CodeGen/SystemZ/zos-common-global.ll b/llvm/test/CodeGen/SystemZ/zos-common-global.ll
index 98d3c357964c5..a169181f3d631 100644
--- a/llvm/test/CodeGen/SystemZ/zos-common-global.ll
+++ b/llvm/test/CodeGen/SystemZ/zos-common-global.ll
@@ -1,8 +1,13 @@
 ; RUN: llc <%s --mtriple s390x-ibm-zos --filetype=obj | \
 ; RUN:   od -Ax -tx1 -v | FileCheck --ignore-case %s
+; RUN: llc <%s --mtriple s390x-ibm-zos | FileCheck --check-prefix CHECK-ASM %s
 
 @x = common global i32 0, align 4
 
+; CHECK-ASM: x CSECT
+; CHECK-ASM: C_WSA64 CATTR ALIGN(2),FILL(0),DEFLOAD,NOTEXECUTABLE,RMODE(64),PART(x)
+; CHECK-ASM: x XATTR LINKAGE(XPLINK),REFERENCE(DATA),SCOPE(EXPORT)
+
 ; ESD record, type SD.
 ; The name is x.
 ; CHECK:      0001e0 03 00 00 00 [[X:00 00 00 05]] 00 00 00 00 00 00 00 00


        


More information about the llvm-commits mailing list