mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-05 19:29:54 +00:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260498 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d581c66591
commit
9fab895e0b
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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: ]
|
27
test/CodeGen/Mips/mips-shf-gprel.s
Normal file
27
test/CodeGen/Mips/mips-shf-gprel.s
Normal 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: ]
|
Loading…
Reference in New Issue
Block a user