[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
This commit is contained in:
Simon Atanasyan 2016-02-11 06:45:54 +00:00
parent 88db760e4b
commit be18620432
3 changed files with 53 additions and 24 deletions

View File

@ -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;
}

View File

@ -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: ]

View File

@ -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: ]