[llvm] 4c6e578 - [SystemZ][z/OS] Show instruction encoding in HLASM output (#181904)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 6 06:37:25 PDT 2026


Author: Kai Nacke
Date: 2026-07-06T09:37:20-04:00
New Revision: 4c6e5788851421e9382452e147a9427cb77b23d9

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

LOG: [SystemZ][z/OS] Show instruction encoding in HLASM output (#181904)

This change adds the support to show instruction encoding as a comment
when emitting HLASM text. With this, the last 2 LIT tests migrate to
HLASM syntax.

Added: 
    

Modified: 
    llvm/include/llvm/MC/MCAsmStreamer.h
    llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.cpp
    llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h
    llvm/test/CodeGen/SystemZ/call-zos-02.ll
    llvm/test/MC/SystemZ/insn-good-zos-pcrel.s

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/MC/MCAsmStreamer.h b/llvm/include/llvm/MC/MCAsmStreamer.h
index 942e9e40b1274..4780c7892bc12 100644
--- a/llvm/include/llvm/MC/MCAsmStreamer.h
+++ b/llvm/include/llvm/MC/MCAsmStreamer.h
@@ -14,6 +14,9 @@
 #ifndef LLVM_MC_MCASMSTREAMER_H
 #define LLVM_MC_MCASMSTREAMER_H
 
+#include "llvm/MC/MCAsmBackend.h"
+#include "llvm/MC/MCAssembler.h"
+#include "llvm/MC/MCCodeEmitter.h"
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/Support/raw_ostream.h"
 #include <memory>

diff  --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.cpp
index 9e7c35b5c3ce9..3999534fac1b8 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.cpp
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.cpp
@@ -188,6 +188,9 @@ void SystemZHLASMAsmStreamer::emitBytes(StringRef Data) {
 
 void SystemZHLASMAsmStreamer::emitInstruction(const MCInst &Inst,
                                               const MCSubtargetInfo &STI) {
+  // Show the encoding in a comment if we have a code emitter.
+  addEncodingComment(Inst, STI);
+  EmitEOL();
 
   InstPrinter->printInst(&Inst, 0, "", STI, OS);
   EmitEOL();

diff  --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h
index d3fe8d791dd0f..7a0eab9b940c3 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZHLASMAsmStreamer.h
@@ -17,6 +17,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/MC/MCAsmBackend.h"
 #include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCAsmStreamer.h"
 #include "llvm/MC/MCAssembler.h"
 #include "llvm/MC/MCCodeEmitter.h"
 #include "llvm/MC/MCContext.h"
@@ -30,7 +31,7 @@
 namespace llvm {
 class MCSymbolGOFF;
 
-class SystemZHLASMAsmStreamer final : public MCStreamer {
+class SystemZHLASMAsmStreamer final : public MCAsmBaseStreamer {
   constexpr static size_t InstLimit = 80;
   constexpr static size_t ContIndicatorColumn = 72;
   constexpr static size_t ContStartColumn = 15;
@@ -41,25 +42,17 @@ class SystemZHLASMAsmStreamer final : public MCStreamer {
   raw_string_ostream OS;
   const MCAsmInfo *MAI;
   std::unique_ptr<MCInstPrinter> InstPrinter;
-  std::unique_ptr<MCAssembler> Assembler;
-  SmallString<128> CommentToEmit;
-  raw_svector_ostream CommentStream;
-  raw_null_ostream NullStream;
   bool IsVerboseAsm = false;
 
 public:
   SystemZHLASMAsmStreamer(MCContext &Context,
-                          std::unique_ptr<formatted_raw_ostream> os,
-                          std::unique_ptr<MCInstPrinter> printer,
-                          std::unique_ptr<MCCodeEmitter> emitter,
-                          std::unique_ptr<MCAsmBackend> asmbackend)
-      : MCStreamer(Context), FOSOwner(std::move(os)), FOS(*FOSOwner), OS(Str),
-        MAI(&Context.getAsmInfo()), InstPrinter(std::move(printer)),
-        Assembler(std::make_unique<MCAssembler>(
-            Context, std::move(asmbackend), std::move(emitter),
-            (asmbackend) ? asmbackend->createObjectWriter(NullStream)
-                         : nullptr)),
-        CommentStream(CommentToEmit) {
+                          std::unique_ptr<formatted_raw_ostream> OS,
+                          std::unique_ptr<MCInstPrinter> Printer,
+                          std::unique_ptr<MCCodeEmitter> Emitter,
+                          std::unique_ptr<MCAsmBackend> AsmBackend)
+      : MCAsmBaseStreamer(Context, std::move(Emitter), std::move(AsmBackend)),
+        FOSOwner(std::move(OS)), FOS(*FOSOwner), OS(Str),
+        MAI(&Context.getAsmInfo()), InstPrinter(std::move(Printer)) {
     assert(InstPrinter);
     if (Assembler->getBackendPtr())
       setAllowAutoPadding(Assembler->getBackend().allowAutoPadding());
@@ -70,8 +63,6 @@ class SystemZHLASMAsmStreamer final : public MCStreamer {
       InstPrinter->setCommentStream(CommentStream);
   }
 
-  MCAssembler &getAssembler() { return *Assembler; }
-
   void EmitEOL();
   void EmitComment();
 

diff  --git a/llvm/test/CodeGen/SystemZ/call-zos-02.ll b/llvm/test/CodeGen/SystemZ/call-zos-02.ll
index 4f1013fc8974d..7ddfda84ef4f6 100644
--- a/llvm/test/CodeGen/SystemZ/call-zos-02.ll
+++ b/llvm/test/CodeGen/SystemZ/call-zos-02.ll
@@ -1,4 +1,4 @@
-; RUN: llc --mtriple=s390x-ibm-zos --show-mc-encoding -emit-gnuas-syntax-on-zos=1 < %s | FileCheck %s
+; RUN: llc --mtriple=s390x-ibm-zos --show-mc-encoding < %s | FileCheck %s
 
 define internal signext i32 @caller() {
 entry:
@@ -8,10 +8,12 @@ entry:
 
 define hidden signext i32 @caller2() {
 entry:
-; CHECK-LABEL:   caller2:
-; CHECK:         brasl 7,caller       * encoding: [0xc0,0x75,A,A,A,A]
-; CHECK-NEXT:    * fixup A - offset: 2, value: caller+2, kind: FK_390_PC32DBL
-; CHECK-NEXT:    bcr     0,3          * encoding: [0x07,0x03]
+; CHECK-LABEL:   caller2 DS 0H
+; CHECK:      * encoding: [0xc0,0x75,A,A,A,A]
+; CHECK-NEXT: * fixup A - offset: 2, value: caller+2, kind: FK_390_PC32DBL
+; CHECK-NEXT:     brasl 7,caller
+; CHECK-NEXT: * encoding: [0x07,0x03]
+; CHECK-NEXT:    bcr     0,3
   %call = call signext i32 @caller()
   ret i32 %call
 }

diff  --git a/llvm/test/MC/SystemZ/insn-good-zos-pcrel.s b/llvm/test/MC/SystemZ/insn-good-zos-pcrel.s
index ce3b7b5e6d410..d769f6e6e3b4b 100644
--- a/llvm/test/MC/SystemZ/insn-good-zos-pcrel.s
+++ b/llvm/test/MC/SystemZ/insn-good-zos-pcrel.s
@@ -1,102 +1,130 @@
 * For z10 and above.
-* RUN: llvm-mc -triple s390x-ibm-zos -show-encoding -emit-gnuas-syntax-on-zos=1 --output-asm-variant=0 %s | FileCheck %s
-
-*CHECK: brcl	0, FOO                  * encoding: [0xc0,0x04,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgnop	FOO                     * encoding: [0xc0,0x04,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+* RUN: llvm-mc -triple s390x-ibm-zos -show-encoding %s | FileCheck %s
+
+*CHECK: * encoding: [0xc0,0x04,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: brcl	0,FOO
+*CHECK: * encoding: [0xc0,0x04,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnop	FOO
 	brcl	0,FOO
 	jlnop	FOO
 
-*CHECK: jge	FOO                     * encoding: [0xc0,0x84,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jge	FOO                     * encoding: [0xc0,0x84,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0x84,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jle	FOO
+*CHECK: * encoding: [0xc0,0x84,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jle	FOO
 	jle	FOO
 	brel	FOO
 
-*CHECK: jgne	FOO                     * encoding: [0xc0,0x74,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgne	FOO                     * encoding: [0xc0,0x74,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0x74,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlne	FOO
+*CHECK: * encoding: [0xc0,0x74,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlne	FOO
 	jlne	FOO
 	brnel	FOO
 
-*CHECK: jgh	FOO                     * encoding: [0xc0,0x24,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgh	FOO                     * encoding: [0xc0,0x24,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0x24,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlh	FOO
+*CHECK: * encoding: [0xc0,0x24,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlh	FOO
 	jlh	FOO
 	brhl	FOO
 
-*CHECK: jgnh	FOO                     * encoding: [0xc0,0xd4,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgnh	FOO                     * encoding: [0xc0,0xd4,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0xd4,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnh	FOO
+*CHECK: * encoding: [0xc0,0xd4,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnh	FOO
 	jlnh	FOO
 	brnhl	FOO
 
-*CHECK: jgl	FOO                     * encoding: [0xc0,0x44,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgl	FOO                     * encoding: [0xc0,0x44,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0x44,A,A,A,A]
+*CHECK: fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jll	FOO
+*CHECK: * encoding: [0xc0,0x44,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jll	FOO
 	jll	FOO
 	brll	FOO
 
-*CHECK: jgnl	FOO                     * encoding: [0xc0,0xb4,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgnl	FOO                     * encoding: [0xc0,0xb4,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0xb4,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnl	FOO
+*CHECK: * encoding: [0xc0,0xb4,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnl	FOO
 	jlnl	FOO
 	brnll	FOO
 
-*CHECK: jgz	FOO                     * encoding: [0xc0,0x84,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgz	FOO                     * encoding: [0xc0,0x84,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0x84,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlz	FOO
+*CHECK: * encoding: [0xc0,0x84,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlz	FOO
 	jlz	FOO
 	brzl	FOO
 
-*CHECK: jgnz	FOO                     * encoding: [0xc0,0x74,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgnz	FOO                     * encoding: [0xc0,0x74,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0x74,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnz	FOO
+*CHECK: * encoding: [0xc0,0x74,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnz	FOO
 	jlnz	FOO
 	brnzl	FOO
 
-*CHECK: jgp	FOO                     * encoding: [0xc0,0x24,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgp	FOO                     * encoding: [0xc0,0x24,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0x24,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlp	FOO
+*CHECK: * encoding: [0xc0,0x24,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlp	FOO
 	jlp	FOO
 	brpl	FOO
 
-*CHECK: jgnp	FOO                     * encoding: [0xc0,0xd4,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgnp	FOO                     * encoding: [0xc0,0xd4,A,A,A,A]
+*CHECK: * encoding: [0xc0,0xd4,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnp	FOO
+*CHECK: * encoding: [0xc0,0xd4,A,A,A,A]
 *CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnp	FOO
 	jlnp	FOO
 	brnpl	FOO
 
-*CHECK: jgm	FOO                     * encoding: [0xc0,0x44,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgm	FOO                     * encoding: [0xc0,0x44,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0x44,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlm	FOO
+*CHECK: * encoding: [0xc0,0x44,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlm	FOO
 	jlm	FOO
 	brml	FOO
 
 
-*CHECK: jgnm	FOO                     * encoding: [0xc0,0xb4,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jgnm	FOO                     * encoding: [0xc0,0xb4,A,A,A,A]
+*CHECK: * encoding: [0xc0,0xb4,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnm	FOO
+*CHECK: * encoding: [0xc0,0xb4,A,A,A,A]
 *CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlnm	FOO
 	jlnm	FOO
 	brnml	FOO
 
-*CHECK: jg	FOO                     * encoding: [0xc0,0xf4,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
-*CHECK: jg	FOO                     * encoding: [0xc0,0xf4,A,A,A,A]
-*CHECK:  fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: * encoding: [0xc0,0xf4,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlu	FOO
+*CHECK: * encoding: [0xc0,0xf4,A,A,A,A]
+*CHECK: * fixup A - offset: 2, value: FOO+2, kind: FK_390_PC32DBL
+*CHECK: jlu	FOO
 	jlu	FOO
 	brul	FOO
 


        


More information about the llvm-commits mailing list