mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
[mips] Add support for '.option pic2'.
The directive '.option pic2' enables PIC from assembly source. At the moment none of the macros/directives check the PIC bit but that's going to be fixed relatively soon. For example, the expansion of macros like 'la' depend on the relocation model. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204803 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c4b058f9e7
commit
0de31d52d5
@ -2596,6 +2596,17 @@ bool MipsAsmParser::parseDirectiveOption() {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Option == "pic2") {
|
||||
getTargetStreamer().emitDirectiveOptionPic2();
|
||||
Parser.Lex();
|
||||
if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {
|
||||
Error(Parser.getTok().getLoc(),
|
||||
"unexpected token in .option pic2 directive");
|
||||
Parser.eatToEndOfStatement();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Unknown option.
|
||||
Warning(Parser.getTok().getLoc(), "unknown option in .option directive");
|
||||
Parser.eatToEndOfStatement();
|
||||
|
@ -89,6 +89,10 @@ void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
|
||||
OS << "\t.option\tpic0\n";
|
||||
}
|
||||
|
||||
void MipsTargetAsmStreamer::emitDirectiveOptionPic2() {
|
||||
OS << "\t.option\tpic2\n";
|
||||
}
|
||||
|
||||
void MipsTargetAsmStreamer::emitFrame(unsigned StackReg, unsigned StackSize,
|
||||
unsigned ReturnReg) {
|
||||
OS << "\t.frame\t$"
|
||||
@ -132,6 +136,9 @@ MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S,
|
||||
MCAssembler &MCA = getStreamer().getAssembler();
|
||||
uint64_t Features = STI.getFeatureBits();
|
||||
Triple T(STI.getTargetTriple());
|
||||
Pic = (MCA.getContext().getObjectFileInfo()->getRelocM() == Reloc::PIC_)
|
||||
? true
|
||||
: false;
|
||||
|
||||
// Update e_header flags
|
||||
unsigned EFlags = 0;
|
||||
@ -311,10 +318,24 @@ void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
|
||||
void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
|
||||
MCAssembler &MCA = getStreamer().getAssembler();
|
||||
unsigned Flags = MCA.getELFHeaderEFlags();
|
||||
// This option overrides other PIC options like -KPIC.
|
||||
Pic = false;
|
||||
Flags &= ~ELF::EF_MIPS_PIC;
|
||||
MCA.setELFHeaderEFlags(Flags);
|
||||
}
|
||||
|
||||
void MipsTargetELFStreamer::emitDirectiveOptionPic2() {
|
||||
MCAssembler &MCA = getStreamer().getAssembler();
|
||||
unsigned Flags = MCA.getELFHeaderEFlags();
|
||||
Pic = true;
|
||||
// NOTE: We are following the GAS behaviour here which means the directive
|
||||
// 'pic2' also sets the CPIC bit in the ELF header. This is different from
|
||||
// what is stated in the SYSV ABI which consider the bits EF_MIPS_PIC and
|
||||
// EF_MIPS_CPIC to be mutually exclusive.
|
||||
Flags |= ELF::EF_MIPS_PIC | ELF::EF_MIPS_CPIC;
|
||||
MCA.setELFHeaderEFlags(Flags);
|
||||
}
|
||||
|
||||
void MipsTargetELFStreamer::emitFrame(unsigned StackReg, unsigned StackSize,
|
||||
unsigned ReturnReg) {
|
||||
// FIXME: implement.
|
||||
|
@ -35,6 +35,7 @@ public:
|
||||
virtual void emitDirectiveEnt(const MCSymbol &Symbol) = 0;
|
||||
virtual void emitDirectiveAbiCalls() = 0;
|
||||
virtual void emitDirectiveOptionPic0() = 0;
|
||||
virtual void emitDirectiveOptionPic2() = 0;
|
||||
virtual void emitFrame(unsigned StackReg, unsigned StackSize,
|
||||
unsigned ReturnReg) = 0;
|
||||
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) = 0;
|
||||
@ -66,6 +67,7 @@ public:
|
||||
virtual void emitDirectiveEnt(const MCSymbol &Symbol);
|
||||
virtual void emitDirectiveAbiCalls();
|
||||
virtual void emitDirectiveOptionPic0();
|
||||
virtual void emitDirectiveOptionPic2();
|
||||
virtual void emitFrame(unsigned StackReg, unsigned StackSize,
|
||||
unsigned ReturnReg);
|
||||
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
|
||||
@ -79,6 +81,7 @@ public:
|
||||
class MipsTargetELFStreamer : public MipsTargetStreamer {
|
||||
bool MicroMipsEnabled;
|
||||
const MCSubtargetInfo &STI;
|
||||
bool Pic;
|
||||
|
||||
public:
|
||||
bool isMicroMipsEnabled() const { return MicroMipsEnabled; }
|
||||
@ -105,6 +108,7 @@ public:
|
||||
virtual void emitDirectiveEnt(const MCSymbol &Symbol);
|
||||
virtual void emitDirectiveAbiCalls();
|
||||
virtual void emitDirectiveOptionPic0();
|
||||
virtual void emitDirectiveOptionPic2();
|
||||
virtual void emitFrame(unsigned StackReg, unsigned StackSize,
|
||||
unsigned ReturnReg);
|
||||
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
|
||||
|
6
test/MC/Mips/elf_eflags_pic2.s
Normal file
6
test/MC/Mips/elf_eflags_pic2.s
Normal file
@ -0,0 +1,6 @@
|
||||
# RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux -mcpu=mips32 %s -o -| llvm-readobj -h | FileCheck %s
|
||||
|
||||
# This *MUST* match the output of gas compiled with the same triple.
|
||||
# CHECK: Flags [ (0x50001006)
|
||||
|
||||
.option pic2
|
@ -46,4 +46,14 @@
|
||||
.option pic0 pic2
|
||||
# CHECK-NEXT: :{{[0-9]+}}:{{[0-9]+}}: error: unexpected token in .option pic0 directive
|
||||
# CHECK-NEXT: .option pic0 pic2
|
||||
# CHECK-NEXT: ^
|
||||
|
||||
.option pic2,
|
||||
# CHECK-NEXT: :{{[0-9]+}}:{{[0-9]+}}: error: unexpected token in .option pic2 directive
|
||||
# CHECK-NEXT: .option pic2,
|
||||
# CHECK-NEXT: ^
|
||||
|
||||
.option pic2 pic3
|
||||
# CHECK-NEXT: :{{[0-9]+}}:{{[0-9]+}}: error: unexpected token in .option pic2 directive
|
||||
# CHECK-NEXT: .option pic2 pic3
|
||||
# CHECK-NEXT: ^
|
||||
|
Loading…
Reference in New Issue
Block a user