[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