https://github.com/tltao updated https://github.com/llvm/llvm-project/pull/169362
>From 7cc2062db8da1160313c5c2afeb81409d76ea7f7 Mon Sep 17 00:00:00 2001 From: Tony Tao <[email protected]> Date: Wed, 14 Jan 2026 14:58:12 -0500 Subject: [PATCH] Implement emitGlobalAlias and lowerConstant --- .../CodeGen/TargetLoweringObjectFileImpl.cpp | 4 + llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp | 87 +++++++++++++++++++ llvm/lib/Target/SystemZ/SystemZAsmPrinter.h | 3 + 3 files changed, 94 insertions(+) diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 5edbc4caf3fae..0e9bea767608b 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -2794,6 +2794,10 @@ void TargetLoweringObjectFileGOFF::getModuleMetadata(Module &M) { TextLD->setWeak(false); TextLD->setADA(ADAPR); TextSection->setBeginSymbol(TextLD); + // Initialize the label for the ADA section. + MCSymbolGOFF *ADASym = static_cast<MCSymbolGOFF *>( + getContext().getOrCreateSymbol(ADAPR->getName())); + ADAPR->setBeginSymbol(ADASym); } MCSection *TargetLoweringObjectFileGOFF::getExplicitSectionGlobal( diff --git a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp index b36605ec54374..2f25dac9cd1ce 100644 --- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp +++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp @@ -1712,6 +1712,93 @@ void SystemZAsmPrinter::emitPPA2(Module &M) { OutStreamer->popSection(); } +void SystemZAsmPrinter::emitGlobalVariable(const GlobalVariable *GV) { + auto *Sym = getSymbol(GV); + // This is currently done in the base emitGlobalVariable implementation + // but is guarded by hasDotTypeDotSizeDirective() which is set to false + // for z/OS + OutStreamer->emitSymbolAttribute(Sym, MCSA_ELF_TypeObject); + AsmPrinter::emitGlobalVariable(GV); +} + +void SystemZAsmPrinter::emitGlobalAlias(const Module &M, const GlobalAlias &GA) { + MCSymbol *Name = getSymbol(&GA); + bool IsFunc = isa<Function>(GA.getAliasee()->stripPointerCasts()); + llvm::dbgs() << "TONY emitting alias for " << Name->getName() << "\n"; + + if (GA.hasExternalLinkage() || !MAI->getWeakRefDirective()) { + llvm::dbgs() << "TONY set global linkage\n"; + OutStreamer->emitSymbolAttribute(Name, MCSA_Global); + } + else if (GA.hasWeakLinkage() || GA.hasLinkOnceLinkage()) { + llvm::dbgs() << "TONY set weak linkage\n"; + 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); + llvm::dbgs() << "TONY create svcon\n"; + } + else + Expr = MCSymbolRefExpr::create(Sym, OutContext); + + OutStreamer->emitAssignment(Name, Expr); +} + +const MCExpr *SystemZAsmPrinter::lowerConstant(const Constant *CV, + const Constant *BaseCV, + uint64_t Offset) { + 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_ELF_TypeFunction); + if (FV->hasExternalLinkage()) { + llvm::dbgs() << "TONY generating lower constant ext func for " << Sym->getName() << "\n"; + 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).second; + llvm::dbgs() << "TONY generating lower constant static func for " << Sym->getName() << "\n"; + return MCBinaryExpr::createAdd( + MCSpecifierExpr::create( + MCSymbolRefExpr::create( + getObjFileLowering().getADASection()->getBeginSymbol(), + OutContext), + SystemZ::S_None, OutContext), + MCConstantExpr::create(Disp, OutContext), OutContext); + } + if (Sym) { + llvm::dbgs() << "TONY generating lower constant sym for " << Sym->getName() << "\n"; + OutStreamer->emitSymbolAttribute(Sym, MCSA_ELF_TypeObject); + 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..ab2a9754cfac1 100644 --- a/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h +++ b/llvm/lib/Target/SystemZ/SystemZAsmPrinter.h @@ -131,6 +131,9 @@ class LLVM_LIBRARY_VISIBILITY SystemZAsmPrinter : public AsmPrinter { void emitFunctionEntryLabel() override; 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: void emitCallInformation(CallType CT); _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
