[llvm] [GOFF] Emit symbols for functions. (PR #144437)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 19 22:50:48 PST 2025
================
@@ -183,17 +190,138 @@ void SystemZHLASMAsmStreamer::emitInstruction(const MCInst &Inst,
EmitEOL();
}
+static void emitXATTR(raw_ostream &OS, StringRef Name,
+ GOFF::ESDLinkageType Linkage,
+ GOFF::ESDExecutable Executable,
+ GOFF::ESDBindingScope BindingScope) {
+ llvm::ListSeparator Sep(",");
+ OS << Name << " XATTR ";
+ OS << Sep << "LINKAGE(" << (Linkage == GOFF::ESD_LT_OS ? "OS" : "XPLINK")
+ << ")";
+ if (Executable != GOFF::ESD_EXE_Unspecified)
+ OS << Sep << "REFERENCE("
+ << (Executable == GOFF::ESD_EXE_CODE ? "CODE" : "DATA") << ")";
+ if (BindingScope != GOFF::ESD_BSC_Unspecified) {
+ OS << Sep << "SCOPE(";
+ switch (BindingScope) {
+ case GOFF::ESD_BSC_Section:
+ OS << "SECTION";
+ break;
+ case GOFF::ESD_BSC_Module:
+ OS << "MODULE";
+ break;
+ case GOFF::ESD_BSC_Library:
+ OS << "LIBRARY";
+ break;
+ case GOFF::ESD_BSC_ImportExport:
+ OS << "EXPORT";
+ break;
+ default:
+ break;
+ }
+ OS << ')';
+ }
+ OS << '\n';
+}
+
+static bool sameNameAsCSECT(MCSymbolGOFF *Sym) {
+ if (Sym->hasLDAttributes() && Sym->isInSection()) {
+ MCSectionGOFF &ED = static_cast<MCSectionGOFF &>(Sym->getSection());
+ return Sym->getName() == ED.getParent()->getName();
+ }
+ return false;
+}
+
void SystemZHLASMAsmStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) {
+ MCSymbolGOFF *Sym = static_cast<MCSymbolGOFF *>(Symbol);
+
+ MCStreamer::emitLabel(Sym, Loc);
+ Sym->initAttributes();
+
+ // Emit ENTRY statement only if not implied by CSECT.
+ bool EmitEntry = !sameNameAsCSECT(Sym);
+
+ if (!Sym->isTemporary() && Sym->hasLDAttributes()) {
+ GOFF::LDAttr &LD = Sym->getLDAttributes();
+ if (EmitEntry) {
+ OS << " ENTRY " << Sym->getName();
+ EmitEOL();
+ }
- MCStreamer::emitLabel(Symbol, Loc);
+ emitXATTR(OS, Sym->getName(), LD.Linkage, LD.Executable, LD.BindingScope);
+ EmitEOL();
+ }
- Symbol->print(OS, MAI);
// TODO Need to adjust this based on Label type
- OS << " DS 0H";
- // TODO Update LabelSuffix in SystemZMCAsmInfoGOFF once tests have been
- // moved to HLASM syntax.
- // OS << MAI->getLabelSuffix();
- EmitEOL();
+ if (EmitEntry) {
+ OS << Sym->getName() << " DS 0H";
+ // TODO Update LabelSuffix in SystemZMCAsmInfoGOFF once tests have been
+ // moved to HLASM syntax.
+ // OS << MAI->getLabelSuffix();
+ EmitEOL();
+ }
+}
+
+bool SystemZHLASMAsmStreamer::emitSymbolAttribute(MCSymbol *Sym,
+ MCSymbolAttr Attribute) {
----------------
MaskRay wrote:
If the AsmStreamer doesn't do anything, you can remove these symbol property adjustment - making this function a no-op.
https://github.com/llvm/llvm-project/pull/144437
More information about the llvm-commits
mailing list