#include "llvm/MC/MCParser/MCAsmLexer.h"
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
#include "llvm/MC/MCParser/MCTargetAsmParser.h"
+#include "llvm/MC/MCSectionELF.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/Debug.h"
+#include "llvm/Support/ELF.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/TargetRegistry.h"
bool parseDirectiveSet();
bool parseDirectiveOption();
bool parseInsnDirective();
+ bool parseSSectionDirective(StringRef Section, unsigned Type);
bool parseSetAtDirective();
bool parseSetNoAtDirective();
return false;
}
+/// parseSSectionDirective
+/// ::= .sbss
+/// ::= .sdata
+bool MipsAsmParser::parseSSectionDirective(StringRef Section, unsigned Type) {
+ // If this is not the end of the statement, report an error.
+ if (getLexer().isNot(AsmToken::EndOfStatement)) {
+ reportParseError("unexpected token, expected end of statement");
+ return false;
+ }
+
+ MCSection *ELFSection = getContext().getELFSection(
+ Section, Type, ELF::SHF_WRITE | ELF::SHF_ALLOC | ELF::SHF_MIPS_GPREL);
+ getParser().getStreamer().SwitchSection(ELFSection);
+
+ getParser().Lex(); // Eat EndOfStatement token.
+ return false;
+}
+
/// parseDirectiveModule
/// ::= .module oddspreg
/// ::= .module nooddspreg
if (IDVal == ".insn")
return parseInsnDirective();
+ if (IDVal == ".sbss")
+ return parseSSectionDirective(IDVal, ELF::SHT_NOBITS);
+ if (IDVal == ".sdata")
+ return parseSSectionDirective(IDVal, ELF::SHT_PROGBITS);
+
return true;
}
+++ /dev/null
-; Check that .sdata section has SHF_MIPS_GPREL flag.
-
-; RUN: llc -mips-ssection-threshold=16 -mgpopt -mattr=noabicalls \
-; RUN: -relocation-model=static -march=mips -o - %s -filetype=obj \
-; RUN: | llvm-readobj -s | FileCheck %s
-
-@data1 = global [4 x i32] [i32 1, i32 2, i32 3, i32 4], align 4
-@date2 = global [4 x i32] zeroinitializer, align 4
-
-; CHECK: Name: .sdata
-; CHECK-NEXT: Type: SHT_PROGBITS
-; CHECK-NEXT: Flags [ (0x10000003)
-; CHECK-NEXT: SHF_ALLOC
-; CHECK-NEXT: SHF_MIPS_GPREL
-; CHECK-NEXT: SHF_WRITE
-; CHECK-NEXT: ]
-
-; CHECK: Name: .sbss
-; CHECK-NEXT: Type: SHT_NOBITS
-; CHECK-NEXT: Flags [ (0x10000003)
-; CHECK-NEXT: SHF_ALLOC
-; CHECK-NEXT: SHF_MIPS_GPREL
-; CHECK-NEXT: SHF_WRITE
-; CHECK-NEXT: ]
--- /dev/null
+# Check that .sdata and .sbss sections have SHF_MIPS_GPREL flags
+# and proper section types.
+
+# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o - \
+# RUN: | llvm-readobj -s | FileCheck %s
+
+ .sdata
+ .word 0
+
+ .sbss
+ .zero 4
+
+# CHECK: Name: .sdata
+# CHECK-NEXT: Type: SHT_PROGBITS
+# CHECK-NEXT: Flags [ (0x10000003)
+# CHECK-NEXT: SHF_ALLOC
+# CHECK-NEXT: SHF_MIPS_GPREL
+# CHECK-NEXT: SHF_WRITE
+# CHECK-NEXT: ]
+
+# CHECK: Name: .sbss
+# CHECK-NEXT: Type: SHT_NOBITS
+# CHECK-NEXT: Flags [ (0x10000003)
+# CHECK-NEXT: SHF_ALLOC
+# CHECK-NEXT: SHF_MIPS_GPREL
+# CHECK-NEXT: SHF_WRITE
+# CHECK-NEXT: ]