[llvm-branch-commits] [llvm] release/23.x: [SPARC] Support the .seg directive (#209001) (PR #212967)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Jul 30 02:19:44 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-sparc

Author: llvmbot

<details>
<summary>Changes</summary>

Backport 98146752c8a6a7b3b3af1f0820f2f530aee5b925

Requested by: @<!-- -->brad0

---
Full diff: https://github.com/llvm/llvm-project/pull/212967.diff


2 Files Affected:

- (modified) llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp (+22) 
- (added) llvm/test/MC/Sparc/Directives/seg.s (+36) 


``````````diff
diff --git a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
index f6b8e0af67150..c6be2489e66ac 100644
--- a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
+++ b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp
@@ -39,6 +39,7 @@
 #include <cassert>
 #include <cstdint>
 #include <memory>
+#include <string>
 
 using namespace llvm;
 
@@ -1044,6 +1045,27 @@ ParseStatus SparcAsmParser::parseDirective(AsmToken DirectiveID) {
     Parser.eatToEndOfStatement();
     return ParseStatus::Success;
   }
+  if (IDVal == ".seg") {
+    std::string Name;
+    if (Parser.parseEscapedString(Name) || Parser.parseEOL())
+      return ParseStatus::Failure;
+
+    MCSection *Section;
+    uint32_t Subsection = 0;
+    const MCObjectFileInfo *MCOFI = getContext().getObjectFileInfo();
+    if (Name == "text") {
+      Section = MCOFI->getTextSection();
+    } else if (Name == "data" || Name == "data1") {
+      Section = MCOFI->getDataSection();
+      Subsection = Name == "data1" ? 1 : 0;
+    } else if (Name == "bss") {
+      Section = MCOFI->getBSSSection();
+    } else {
+      return Error(DirectiveID.getLoc(), "unknown segment type");
+    }
+    getStreamer().switchSection(Section, Subsection);
+    return ParseStatus::Success;
+  }
 
   // Let the MC layer to handle other directives.
   return ParseStatus::NoMatch;
diff --git a/llvm/test/MC/Sparc/Directives/seg.s b/llvm/test/MC/Sparc/Directives/seg.s
new file mode 100644
index 0000000000000..e4ff6e55861fc
--- /dev/null
+++ b/llvm/test/MC/Sparc/Directives/seg.s
@@ -0,0 +1,36 @@
+! RUN: llvm-mc -triple=sparc -filetype=obj %s -o - \
+! RUN:   | llvm-readobj -S --sd - | FileCheck %s
+! RUN: llvm-mc -triple=sparcv9 -filetype=obj %s -o - \
+! RUN:   | llvm-readobj -S --sd - | FileCheck %s
+! RUN: not llvm-mc -triple=sparc --defsym ERR=1 %s -o /dev/null 2>&1 \
+! RUN:   | FileCheck %s --check-prefix=ERR --implicit-check-not=error:
+
+! CHECK:      Name: .text
+! CHECK:      SectionData (
+! CHECK-NEXT:   0000: 01
+
+! CHECK:      Name: .data
+! CHECK:      SectionData (
+! CHECK-NEXT:   0000: 02030405
+
+! CHECK:      Name: .bss
+! CHECK-NEXT: Type: SHT_NOBITS
+! CHECK:      Size: 6
+
+.seg "data1"
+.byte 4
+.seg "data"
+.byte 2
+.seg "text"
+.byte 1
+.seg "data1"
+.byte 5
+.seg "data"
+.byte 3
+.seg "bss"
+.zero 6
+
+.ifdef ERR
+! ERR: :[[#@LINE+1]]:1: error: unknown segment type
+.seg "rodata"
+.endif

``````````

</details>


https://github.com/llvm/llvm-project/pull/212967


More information about the llvm-branch-commits mailing list