diff options
| author | Simon Atanasyan <simon@atanasyan.com> | 2016-02-11 06:45:54 +0000 |
|---|---|---|
| committer | Simon Atanasyan <simon@atanasyan.com> | 2016-02-11 06:45:54 +0000 |
| commit | be186204323aa35996dce2d36b45a230ad44db38 (patch) | |
| tree | 4eff6200e00ebdfef4fb0b136ec7b67ae521b13f | |
| parent | 88db760e4b6dc781273f6ee6a263bf6e81691873 (diff) | |
| download | bcm5719-llvm-be186204323aa35996dce2d36b45a230ad44db38.tar.gz bcm5719-llvm-be186204323aa35996dce2d36b45a230ad44db38.zip | |
[MC][ELF] Handle MIPS specific .sdata and .sbss directives
MIPS specific .sdata and .sbss directives create corresponding sections
with proper initialized ELF flags including ELF::SHF_MIPS_GPREL.
Differential Revision: http://reviews.llvm.org/D17001
llvm-svn: 260498
| -rw-r--r-- | llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 26 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Mips/mips-shf-gprel.ll | 24 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Mips/mips-shf-gprel.s | 27 |
3 files changed, 53 insertions, 24 deletions
diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index fb6a0712d9d..6b812d2f16f 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/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 @@ class MipsAsmParser : public MCTargetAsmParser { bool parseDirectiveSet(); bool parseDirectiveOption(); bool parseInsnDirective(); + bool parseSSectionDirective(StringRef Section, unsigned Type); bool parseSetAtDirective(); bool parseSetNoAtDirective(); @@ -5734,6 +5737,24 @@ bool MipsAsmParser::parseInsnDirective() { 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 @@ bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) { 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; } diff --git a/llvm/test/CodeGen/Mips/mips-shf-gprel.ll b/llvm/test/CodeGen/Mips/mips-shf-gprel.ll deleted file mode 100644 index 8b5fbaa939e..00000000000 --- a/llvm/test/CodeGen/Mips/mips-shf-gprel.ll +++ /dev/null @@ -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: ] diff --git a/llvm/test/CodeGen/Mips/mips-shf-gprel.s b/llvm/test/CodeGen/Mips/mips-shf-gprel.s new file mode 100644 index 00000000000..9caaf00394a --- /dev/null +++ b/llvm/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: ] |

