Skip to content

Commit

Permalink
[mips] Make the MipsAsmParser capable of knowing whether PIC mode is …
Browse files Browse the repository at this point in the history
…enabled or not.

Summary:
This information is needed to decide whether we do the PIC-only JAL expansions or not. It's also needed for an upcoming patch which implements the .cprestore assembler directive (which can only be used effectively in PIC mode).

By making this information available to the MipsAsmParser, we will know when to insert the instructions mandated by the .cprestore assembler directive and we will be able to give some useful warnings when we encounter a potential misuse of this directive.

Patch by Toma Tabacu

Reviewers: dsanders, seanbruno

Subscribers: brooks, seanbruno, rafael, llvm-commits

Differential Revision: http://reviews.llvm.org/D5626

llvm-svn: 245291
  • Loading branch information
dsandersllvm committed Aug 18, 2015
1 parent c1c9f8a commit a699444
Showing 1 changed file with 15 additions and 0 deletions.
15 changes: 15 additions & 0 deletions llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
Expand Up @@ -11,6 +11,7 @@
#include "MCTargetDesc/MipsMCExpr.h"
#include "MCTargetDesc/MipsMCTargetDesc.h"
#include "MipsRegisterInfo.h"
#include "MipsTargetObjectFile.h"
#include "MipsTargetStreamer.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/SmallVector.h"
Expand Down Expand Up @@ -114,6 +115,7 @@ class MipsAsmParser : public MCTargetAsmParser {
// selected. This usually happens after an '.end func'
// directive.
bool IsLittleEndian;
bool IsPicEnabled;

// Print a warning along with its fix-it message at the given range.
void printWarningWithFixIt(const Twine &Msg, const Twine &FixMsg,
Expand Down Expand Up @@ -406,6 +408,9 @@ class MipsAsmParser : public MCTargetAsmParser {

CurrentFn = nullptr;

IsPicEnabled =
(getContext().getObjectFileInfo()->getRelocM() == Reloc::PIC_);

Triple TheTriple(sti.getTargetTriple());
if ((TheTriple.getArch() == Triple::mips) ||
(TheTriple.getArch() == Triple::mips64))
Expand Down Expand Up @@ -475,6 +480,10 @@ class MipsAsmParser : public MCTargetAsmParser {
return (STI.getFeatureBits()[Mips::FeatureCnMips]);
}

bool inPicMode() {
return IsPicEnabled;
}

bool inMips16Mode() const {
return STI.getFeatureBits()[Mips::FeatureMips16];
}
Expand Down Expand Up @@ -4714,6 +4723,9 @@ bool MipsAsmParser::parseDirectiveOption() {
StringRef Option = Tok.getIdentifier();

if (Option == "pic0") {
// MipsAsmParser needs to know if the current PIC mode changes.
IsPicEnabled = false;

getTargetStreamer().emitDirectiveOptionPic0();
Parser.Lex();
if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {
Expand All @@ -4725,6 +4737,9 @@ bool MipsAsmParser::parseDirectiveOption() {
}

if (Option == "pic2") {
// MipsAsmParser needs to know if the current PIC mode changes.
IsPicEnabled = true;

getTargetStreamer().emitDirectiveOptionPic2();
Parser.Lex();
if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {
Expand Down

0 comments on commit a699444

Please sign in to comment.