[clang] [llvm] [GOFF] Implement lowerConstant/emitGlobalVariables/emitGlobalAlias for z/OS (PR #169362)
Tony Tao via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 6 12:46:51 PST 2026
https://github.com/tltao updated https://github.com/llvm/llvm-project/pull/169362
>From c7f24718e30e42c036fc51414ff850dea14d445a Mon Sep 17 00:00:00 2001
From: Amy Kwan <amy.kwan1 at ibm.com>
Date: Tue, 6 Jan 2026 00:40:04 -0500
Subject: [PATCH 1/7] [NFC][SystemZ] Update insert() API of the
AssociatedDataAreaTable class
This patch updates the insert() calls of the AssociatedDataAreaTable class
to return a pair of <const MCSymbol *, uint32_t> instead of just a uint32_t.
This API change of including the MCSymbol is needed in subsequent patches
to come.
---
llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp | 28 ++++++++++++-------
llvm/lib/Target/SystemZ/SystemZAsmPrinter.h | 9 +++---
2 files changed, 23 insertions(+), 14 deletions(-)
diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
index 444bc578a3fab..b36605ec54374 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
@@ -170,13 +170,14 @@ void SystemZAsmPrinter::emitCallInformation(CallType CT) {
.addReg(SystemZMC::GR64Regs[static_cast<unsigned>(CT)]));
}
-uint32_t SystemZAsmPrinter::AssociatedDataAreaTable::insert(const MCSymbol *Sym,
- unsigned SlotKind) {
+std::pair<const MCSymbol *, uint32_t>
+SystemZAsmPrinter::AssociatedDataAreaTable::insert(const MCSymbol *Sym,
+ unsigned SlotKind) {
auto Key = std::make_pair(Sym, SlotKind);
- auto It = Displacements.find(Key);
+ auto *It = Displacements.find(Key);
if (It != Displacements.end())
- return (*It).second;
+ return std::pair(Sym, (*It).second);
// Determine length of descriptor.
uint32_t Length;
@@ -193,14 +194,15 @@ uint32_t SystemZAsmPrinter::AssociatedDataAreaTable::insert(const MCSymbol *Sym,
Displacements[std::make_pair(Sym, SlotKind)] = NextDisplacement;
NextDisplacement += Length;
- return Displacement;
+ return std::pair(Sym, Displacement);
}
-uint32_t
+std::pair<const MCSymbol *, uint32_t>
SystemZAsmPrinter::AssociatedDataAreaTable::insert(const MachineOperand MO) {
MCSymbol *Sym;
if (MO.getType() == MachineOperand::MO_GlobalAddress) {
const GlobalValue *GV = MO.getGlobal();
+ assert(GV->hasName() && "Cannot put unnamed value in ADA");
Sym = MO.getParent()->getMF()->getTarget().getSymbol(GV);
assert(Sym && "No symbol");
} else if (MO.getType() == MachineOperand::MO_ExternalSymbol) {
@@ -347,7 +349,9 @@ void SystemZAsmPrinter::emitInstruction(const MachineInstr *MI) {
case SystemZ::ADA_ENTRY: {
const SystemZSubtarget &Subtarget = MF->getSubtarget<SystemZSubtarget>();
const SystemZInstrInfo *TII = Subtarget.getInstrInfo();
- uint32_t Disp = ADATable.insert(MI->getOperand(1));
+ const MCSymbol *Sym;
+ uint32_t Disp;
+ std::tie(Sym, Disp) = ADATable.insert(MI->getOperand(1));
Register TargetReg = MI->getOperand(0).getReg();
Register ADAReg = MI->getOperand(2).getReg();
@@ -1562,13 +1566,17 @@ void SystemZAsmPrinter::emitPPA1(MCSymbol *FnEndSym) {
OutStreamer->AddComment("Flags");
OutStreamer->emitInt32(0); // LSDA field is a WAS offset
OutStreamer->AddComment("Personality routine");
- OutStreamer->emitInt64(ADATable.insert(
- PersonalityRoutine, SystemZII::MO_ADA_INDIRECT_FUNC_DESC));
+ // Store only offset of function descriptor
+ OutStreamer->emitInt64(
+ ADATable
+ .insert(PersonalityRoutine, SystemZII::MO_ADA_INDIRECT_FUNC_DESC)
+ .second);
+ // Store only offset of LSDA
OutStreamer->AddComment("LSDA location");
MCSymbol *GCCEH = MF->getContext().getOrCreateSymbol(
Twine("GCC_except_table") + Twine(MF->getFunctionNumber()));
OutStreamer->emitInt64(
- ADATable.insert(GCCEH, SystemZII::MO_ADA_DATA_SYMBOL_ADDR));
+ ADATable.insert(GCCEH, SystemZII::MO_ADA_DATA_SYMBOL_ADDR).second);
}
// Emit name length and name optional section (0x01 of flags 4)
diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
index cb101e472824f..0611179ee7262 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
@@ -73,16 +73,17 @@ class LLVM_LIBRARY_VISIBILITY SystemZAsmPrinter : public AsmPrinter {
/// @brief Add a function descriptor to the ADA.
/// @param MI Pointer to an ADA_ENTRY instruction.
- /// @return The displacement of the descriptor into the ADA.
- uint32_t insert(const MachineOperand MO);
+ /// @return The symbol and displacement of the descriptor into the ADA.
+ std::pair<const MCSymbol *, uint32_t> insert(const MachineOperand MO);
/// @brief Get the displacement into associated data area (ADA) for a name.
/// If no displacement is already associated with the name, assign one and
/// return it.
/// @param Sym The symbol for which the displacement should be returned.
/// @param SlotKind The ADA type.
- /// @return The displacement of the descriptor into the ADA.
- uint32_t insert(const MCSymbol *Sym, unsigned SlotKind);
+ /// @return The symbol and displacement of the descriptor into the ADA.
+ std::pair<const MCSymbol *, uint32_t> insert(const MCSymbol *Sym,
+ unsigned SlotKind);
/// Get the table of GOFF displacements. This is 'const' since it should
/// never be modified by anything except the APIs on this class.
>From 231ff105f4ae91f3d0c94180ffae15f9a8922252 Mon Sep 17 00:00:00 2001
From: Tony Tao <tonytao at ca.ibm.com>
Date: Wed, 19 Nov 2025 19:55:35 +0000
Subject: [PATCH 2/7] Implement emitGlobalVariable and lowerConstant
---
clang/lib/Lex/HeaderMap.cpp | 1 +
llvm/lib/Support/VirtualOutputBackends.cpp | 1 +
llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp | 73 +++++++++++++++++++
llvm/lib/Target/SystemZ/SystemZAsmPrinter.h | 2 +
4 files changed, 77 insertions(+)
diff --git a/clang/lib/Lex/HeaderMap.cpp b/clang/lib/Lex/HeaderMap.cpp
index a7b670f00ac6e..588b32ee9ca8e 100644
--- a/clang/lib/Lex/HeaderMap.cpp
+++ b/clang/lib/Lex/HeaderMap.cpp
@@ -18,6 +18,7 @@
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/SystemZ/zOSSupport.h"
#include <cstring>
#include <memory>
#include <optional>
diff --git a/llvm/lib/Support/VirtualOutputBackends.cpp b/llvm/lib/Support/VirtualOutputBackends.cpp
index d7a91dfa1471f..30cd42aa72558 100644
--- a/llvm/lib/Support/VirtualOutputBackends.cpp
+++ b/llvm/lib/Support/VirtualOutputBackends.cpp
@@ -285,6 +285,7 @@ Error OnDiskOutputFile::tryToCreateTemporary(std::optional<int> &FD) {
return createDirectoriesOnDemand(OutputPath, Config, [&]() -> Error {
int NewFD;
+ sys::fs::OpenFlags OF = generateFlagsFromConfig(Config);
SmallString<128> UniquePath;
sys::fs::OpenFlags OF = generateFlagsFromConfig(Config);
if (std::error_code EC =
diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
index b36605ec54374..e50d4933c0e83 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
@@ -1117,6 +1117,24 @@ void SystemZAsmPrinter::emitEndOfAsmFile(Module &M) {
if (TT.isOSzOS()) {
emitADASection();
emitIDRLSection(M);
+ // Emit EXTRN declarations.
+ OutStreamer->pushSection();
+ for (auto &GO : M.global_objects()) {
+ if (GO.isDeclaration()) {
+ MCSymbol *Sym = TM.getSymbol(&GO);
+ OutStreamer->emitSymbolAttribute(Sym, GO.hasExternalWeakLinkage()
+ ? MCSA_WeakReference
+ : MCSA_Global);
+ OutStreamer->emitSymbolAttribute(Sym, isa<Function>(GO) ? MCSA_Code
+ : MCSA_Data);
+ llvm::dbgs() << "TONY emitting " << Sym->getName() << "\n";
+ }
+ }
+ OutStreamer->switchSection(
+ static_cast<MCSectionGOFF *>(getObjFileLowering().getTextSection())
+ ->getParent());
+ getTargetStreamer()->emitExterns();
+ OutStreamer->popSection();
}
emitAttributes(M);
}
@@ -1712,6 +1730,61 @@ void SystemZAsmPrinter::emitPPA2(Module &M) {
OutStreamer->popSection();
}
+void SystemZAsmPrinter::emitGlobalVariable(const GlobalVariable *GV) {
+ if (TM.getTargetTriple().isOSzOS()) {
+ auto *Sym = getSymbol(GV);
+ OutStreamer->emitSymbolAttribute(Sym, MCSA_Data);
+ }
+
+ AsmPrinter::emitGlobalVariable(GV);
+}
+
+const MCExpr *SystemZAsmPrinter::lowerConstant(const Constant *CV,
+ const Constant *BaseCV,
+ uint64_t Offset) {
+ const Triple &TargetTriple = TM.getTargetTriple();
+
+ if (TargetTriple.isOSzOS()) {
+ const GlobalAlias *GA = dyn_cast<GlobalAlias>(CV);
+ const GlobalVariable *GV = dyn_cast<GlobalVariable>(CV);
+ const Function *FV = dyn_cast<Function>(CV);
+ bool IsFunc = !GV && (FV || (GA && isa<Function>(GA->getAliaseeObject())));
+
+ MCSymbol *Sym = NULL;
+
+ if (GA)
+ Sym = getSymbol(GA);
+ else if (IsFunc)
+ Sym = getSymbol(FV);
+ else if (GV)
+ Sym = getSymbol(GV);
+
+ if (IsFunc) {
+ OutStreamer->emitSymbolAttribute(Sym, MCSA_Code);
+ if (FV->hasExternalLinkage()) {
+ return MCSpecifierExpr::create(MCSymbolRefExpr::create(Sym, OutContext),
+ SystemZ::S_VCon, OutContext);
+ }
+ // Trigger creation of function descriptor in ADA for internal
+ // functions.
+ unsigned Disp = ADATable.insert(Sym, SystemZII::MO_ADA_DIRECT_FUNC_DESC);
+ return MCBinaryExpr::createAdd(
+ MCSpecifierExpr::create(
+ MCSymbolRefExpr::create(
+ getObjFileLowering().getADASection()->getBeginSymbol(),
+ OutContext),
+ SystemZ::S_None, OutContext),
+ MCConstantExpr::create(Disp, OutContext), OutContext);
+ }
+ if (Sym) {
+ OutStreamer->emitSymbolAttribute(Sym, MCSA_Data);
+ return MCSymbolRefExpr::create(Sym, OutContext);
+ }
+ }
+
+ return AsmPrinter::lowerConstant(CV);
+}
+
void SystemZAsmPrinter::emitFunctionEntryLabel() {
const SystemZSubtarget &Subtarget = MF->getSubtarget<SystemZSubtarget>();
diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
index 0611179ee7262..31a9402df51a3 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
@@ -131,6 +131,8 @@ class LLVM_LIBRARY_VISIBILITY SystemZAsmPrinter : public AsmPrinter {
void emitFunctionEntryLabel() override;
void emitFunctionBodyEnd() override;
void emitStartOfAsmFile(Module &M) override;
+ void emitGlobalVariable(const GlobalVariable *GV) override;
+ const MCExpr *lowerConstant(const Constant *CV, const Constant *BaseCV = nullptr, uint64_t Offset = 0) override;
private:
void emitCallInformation(CallType CT);
>From cda080610f47b121d785835935760eb9de3facd6 Mon Sep 17 00:00:00 2001
From: Tony Tao <tonytao at ca.ibm.com>
Date: Wed, 19 Nov 2025 19:57:30 +0000
Subject: [PATCH 3/7] undo accdiental commit
---
llvm/lib/Support/VirtualOutputBackends.cpp | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Support/VirtualOutputBackends.cpp b/llvm/lib/Support/VirtualOutputBackends.cpp
index 30cd42aa72558..a4701cd79dfce 100644
--- a/llvm/lib/Support/VirtualOutputBackends.cpp
+++ b/llvm/lib/Support/VirtualOutputBackends.cpp
@@ -285,11 +285,10 @@ Error OnDiskOutputFile::tryToCreateTemporary(std::optional<int> &FD) {
return createDirectoriesOnDemand(OutputPath, Config, [&]() -> Error {
int NewFD;
- sys::fs::OpenFlags OF = generateFlagsFromConfig(Config);
SmallString<128> UniquePath;
sys::fs::OpenFlags OF = generateFlagsFromConfig(Config);
if (std::error_code EC =
- sys::fs::createUniqueFile(ModelPath, NewFD, UniquePath, OF))
+ sys::fs::createUniqueFile(ModelPath, NewFD, UniquePath))
return make_error<TempFileOutputError>(ModelPath, OutputPath, EC);
if (Config.getDiscardOnSignal())
@@ -333,7 +332,13 @@ Error OnDiskOutputFile::initializeFile(std::optional<int> &FD) {
// Not using a temporary file. Open the final output file.
return createDirectoriesOnDemand(OutputPath, Config, [&]() -> Error {
int NewFD;
- sys::fs::OpenFlags OF = generateFlagsFromConfig(Config);
+ sys::fs::OpenFlags OF = sys::fs::OF_None;
+ if (Config.getTextWithCRLF())
+ OF |= sys::fs::OF_TextWithCRLF;
+ else if (Config.getText())
+ OF |= sys::fs::OF_Text;
+ if (Config.getAppend())
+ OF |= sys::fs::OF_Append;
if (std::error_code EC = sys::fs::openFileForWrite(
OutputPath, NewFD, sys::fs::CD_CreateAlways, OF))
return convertToOutputError(OutputPath, EC);
>From 8a3a7e050a9f052abca2ef9d245a51e106cf5cb5 Mon Sep 17 00:00:00 2001
From: Tony Tao <tonytao at ca.ibm.com>
Date: Fri, 21 Nov 2025 13:58:15 -0500
Subject: [PATCH 4/7] implement more features
---
llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp | 34 +++++++++++++++++++
llvm/lib/Target/SystemZ/SystemZAsmPrinter.h | 1 +
2 files changed, 35 insertions(+)
diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
index e50d4933c0e83..f84d8554f7adf 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
@@ -377,6 +377,8 @@ void SystemZAsmPrinter::emitInstruction(const MachineInstr *MI) {
Disp = 0;
Op = Op0;
}
+ OutStreamer->AddComment(Twine("Loading from ADA at offset ")
+ .concat(utostr(Disp)));
EmitToStreamer(*OutStreamer, MCInstBuilder(Op)
.addReg(TargetReg)
.addReg(ADAReg)
@@ -1785,6 +1787,38 @@ const MCExpr *SystemZAsmPrinter::lowerConstant(const Constant *CV,
return AsmPrinter::lowerConstant(CV);
}
+void SystemZAsmPrinter::emitGlobalAlias(const Module &M, const GlobalAlias &GA) {
+ if (!TM.getTargetTriple().isOSzOS()) {
+ AsmPrinter::emitGlobalAlias(M, GA);
+ return;
+ }
+
+ MCSymbol *Name = getSymbol(&GA);
+ bool IsFunc = isa<Function>(GA.getAliasee()->stripPointerCasts());
+
+ if (GA.hasExternalLinkage() || !MAI->getWeakRefDirective())
+ OutStreamer->emitSymbolAttribute(Name, MCSA_Global);
+ else if (GA.hasWeakLinkage() || GA.hasLinkOnceLinkage())
+ OutStreamer->emitSymbolAttribute(Name, MCSA_WeakReference);
+ else
+ assert(GA.hasLocalLinkage() && "Invalid alias linkage");
+
+ emitVisibility(Name, GA.getVisibility());
+
+ const MCExpr *Expr;
+
+ // For XPLINK, create a VCON relocation in case of a function, and
+ // a direct reference else.
+ MCSymbol *Sym = getSymbol(GA.getAliaseeObject());
+ if (IsFunc)
+ Expr = MCSpecifierExpr::create(MCSymbolRefExpr::create(Sym, OutContext),
+ SystemZ::S_VCon, OutContext);
+ else
+ Expr = MCSymbolRefExpr::create(Sym, OutContext);
+
+ OutStreamer->emitAssignment(Name, Expr);
+}
+
void SystemZAsmPrinter::emitFunctionEntryLabel() {
const SystemZSubtarget &Subtarget = MF->getSubtarget<SystemZSubtarget>();
diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
index 31a9402df51a3..ab2a9754cfac1 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
@@ -132,6 +132,7 @@ class LLVM_LIBRARY_VISIBILITY SystemZAsmPrinter : public AsmPrinter {
void emitFunctionBodyEnd() override;
void emitStartOfAsmFile(Module &M) override;
void emitGlobalVariable(const GlobalVariable *GV) override;
+ void emitGlobalAlias(const Module &M, const GlobalAlias &GA) override;
const MCExpr *lowerConstant(const Constant *CV, const Constant *BaseCV = nullptr, uint64_t Offset = 0) override;
private:
>From fc589d236c1acd11b5642d50bcf35d7c6dbcb028 Mon Sep 17 00:00:00 2001
From: Tony Tao <tonytao at ca.ibm.com>
Date: Mon, 24 Nov 2025 11:52:05 -0500
Subject: [PATCH 5/7] Syntax fix and remove comment
---
llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
index f84d8554f7adf..ce6905ecf8563 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
@@ -1129,7 +1129,6 @@ void SystemZAsmPrinter::emitEndOfAsmFile(Module &M) {
: MCSA_Global);
OutStreamer->emitSymbolAttribute(Sym, isa<Function>(GO) ? MCSA_Code
: MCSA_Data);
- llvm::dbgs() << "TONY emitting " << Sym->getName() << "\n";
}
}
OutStreamer->switchSection(
>From 4de4d1506adb3572df963c1b1d0144cda999f76a Mon Sep 17 00:00:00 2001
From: Tony Tao <tonytao at ca.ibm.com>
Date: Mon, 5 Jan 2026 14:52:43 -0500
Subject: [PATCH 6/7] undo commit fix
---
clang/lib/Lex/HeaderMap.cpp | 1 -
llvm/lib/Support/VirtualOutputBackends.cpp | 10 ++--------
2 files changed, 2 insertions(+), 9 deletions(-)
diff --git a/clang/lib/Lex/HeaderMap.cpp b/clang/lib/Lex/HeaderMap.cpp
index 588b32ee9ca8e..a7b670f00ac6e 100644
--- a/clang/lib/Lex/HeaderMap.cpp
+++ b/clang/lib/Lex/HeaderMap.cpp
@@ -18,7 +18,6 @@
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/Support/SystemZ/zOSSupport.h"
#include <cstring>
#include <memory>
#include <optional>
diff --git a/llvm/lib/Support/VirtualOutputBackends.cpp b/llvm/lib/Support/VirtualOutputBackends.cpp
index a4701cd79dfce..d7a91dfa1471f 100644
--- a/llvm/lib/Support/VirtualOutputBackends.cpp
+++ b/llvm/lib/Support/VirtualOutputBackends.cpp
@@ -288,7 +288,7 @@ Error OnDiskOutputFile::tryToCreateTemporary(std::optional<int> &FD) {
SmallString<128> UniquePath;
sys::fs::OpenFlags OF = generateFlagsFromConfig(Config);
if (std::error_code EC =
- sys::fs::createUniqueFile(ModelPath, NewFD, UniquePath))
+ sys::fs::createUniqueFile(ModelPath, NewFD, UniquePath, OF))
return make_error<TempFileOutputError>(ModelPath, OutputPath, EC);
if (Config.getDiscardOnSignal())
@@ -332,13 +332,7 @@ Error OnDiskOutputFile::initializeFile(std::optional<int> &FD) {
// Not using a temporary file. Open the final output file.
return createDirectoriesOnDemand(OutputPath, Config, [&]() -> Error {
int NewFD;
- sys::fs::OpenFlags OF = sys::fs::OF_None;
- if (Config.getTextWithCRLF())
- OF |= sys::fs::OF_TextWithCRLF;
- else if (Config.getText())
- OF |= sys::fs::OF_Text;
- if (Config.getAppend())
- OF |= sys::fs::OF_Append;
+ sys::fs::OpenFlags OF = generateFlagsFromConfig(Config);
if (std::error_code EC = sys::fs::openFileForWrite(
OutputPath, NewFD, sys::fs::CD_CreateAlways, OF))
return convertToOutputError(OutputPath, EC);
>From 29e544a8f6a46a4b922eaf9b2773c2675e76fed5 Mon Sep 17 00:00:00 2001
From: Tony Tao <tonytao at ca.ibm.com>
Date: Tue, 6 Jan 2026 15:40:12 -0500
Subject: [PATCH 7/7] Update MCSymbolAttr enum
---
llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
index ce6905ecf8563..da637e0b7434b 100644
--- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
@@ -1127,14 +1127,13 @@ void SystemZAsmPrinter::emitEndOfAsmFile(Module &M) {
OutStreamer->emitSymbolAttribute(Sym, GO.hasExternalWeakLinkage()
? MCSA_WeakReference
: MCSA_Global);
- OutStreamer->emitSymbolAttribute(Sym, isa<Function>(GO) ? MCSA_Code
- : MCSA_Data);
+ OutStreamer->emitSymbolAttribute(Sym, isa<Function>(GO) ? MCSA_ELF_TypeFunction
+ : MCSA_ELF_TypeObject);
}
}
OutStreamer->switchSection(
static_cast<MCSectionGOFF *>(getObjFileLowering().getTextSection())
->getParent());
- getTargetStreamer()->emitExterns();
OutStreamer->popSection();
}
emitAttributes(M);
@@ -1734,7 +1733,7 @@ void SystemZAsmPrinter::emitPPA2(Module &M) {
void SystemZAsmPrinter::emitGlobalVariable(const GlobalVariable *GV) {
if (TM.getTargetTriple().isOSzOS()) {
auto *Sym = getSymbol(GV);
- OutStreamer->emitSymbolAttribute(Sym, MCSA_Data);
+ OutStreamer->emitSymbolAttribute(Sym, MCSA_ELF_TypeObject);
}
AsmPrinter::emitGlobalVariable(GV);
@@ -1761,7 +1760,7 @@ const MCExpr *SystemZAsmPrinter::lowerConstant(const Constant *CV,
Sym = getSymbol(GV);
if (IsFunc) {
- OutStreamer->emitSymbolAttribute(Sym, MCSA_Code);
+ OutStreamer->emitSymbolAttribute(Sym, MCSA_ELF_TypeFunction);
if (FV->hasExternalLinkage()) {
return MCSpecifierExpr::create(MCSymbolRefExpr::create(Sym, OutContext),
SystemZ::S_VCon, OutContext);
@@ -1778,7 +1777,7 @@ const MCExpr *SystemZAsmPrinter::lowerConstant(const Constant *CV,
MCConstantExpr::create(Disp, OutContext), OutContext);
}
if (Sym) {
- OutStreamer->emitSymbolAttribute(Sym, MCSA_Data);
+ OutStreamer->emitSymbolAttribute(Sym, MCSA_ELF_TypeObject);
return MCSymbolRefExpr::create(Sym, OutContext);
}
}
More information about the cfe-commits
mailing list