Index: llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -23,10 +23,12 @@ #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" @@ -266,6 +268,7 @@ bool parseDirectiveSet(); bool parseDirectiveOption(); bool parseInsnDirective(); + bool parseSSectionDirective(StringRef Section, unsigned Type); bool parseSetAtDirective(); bool parseSetNoAtDirective(); @@ -5734,6 +5737,24 @@ 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 @@ -6224,6 +6245,11 @@ 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; } Index: llvm/trunk/test/CodeGen/Mips/mips-shf-gprel.ll =================================================================== --- llvm/trunk/test/CodeGen/Mips/mips-shf-gprel.ll +++ llvm/trunk/test/CodeGen/Mips/mips-shf-gprel.ll @@ -1,24 +0,0 @@ -; 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: ] Index: llvm/trunk/test/CodeGen/Mips/mips-shf-gprel.s =================================================================== --- llvm/trunk/test/CodeGen/Mips/mips-shf-gprel.s +++ llvm/trunk/test/CodeGen/Mips/mips-shf-gprel.s @@ -0,0 +1,27 @@ +# 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: ]