diff options
author | Alex Lorenz <arphaman@gmail.com> | 2015-07-23 23:09:07 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2015-07-23 23:09:07 +0000 |
commit | 8cfc68677cd69c52ac9af50bac90410a98e1972e (patch) | |
tree | 006c3a8493c788dc1275a611ded859e54203d47f /llvm/lib | |
parent | 8abca7e7294352390af75a6a24d264a4a9c8643f (diff) | |
download | bcm5719-llvm-8cfc68677cd69c52ac9af50bac90410a98e1972e.tar.gz bcm5719-llvm-8cfc68677cd69c52ac9af50bac90410a98e1972e.zip |
MIR Serialization: Serialize the '.cfi_offset' CFI instruction.
Reviewers: Duncan P. N. Exon Smith
llvm-svn: 243062
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.h | 1 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 69 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRPrinter.cpp | 24 |
4 files changed, 85 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index 1b483330e54..27d661760cc 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -124,6 +124,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .Case("undef", MIToken::kw_undef) .Case("frame-setup", MIToken::kw_frame_setup) .Case("debug-location", MIToken::kw_debug_location) + .Case(".cfi_offset", MIToken::kw_cfi_offset) .Case(".cfi_def_cfa_offset", MIToken::kw_cfi_def_cfa_offset) .Default(MIToken::Identifier); } diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h index 71356e37971..bae9dcd1ebe 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.h +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -46,6 +46,7 @@ struct MIToken { kw_undef, kw_frame_setup, kw_debug_location, + kw_cfi_offset, kw_cfi_def_cfa_offset, // Identifier tokens diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index de2f6158b45..656f2314315 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -115,6 +115,7 @@ public: bool parseMDNode(MDNode *&Node); bool parseMetadataOperand(MachineOperand &Dest); bool parseCFIOffset(int &Offset); + bool parseCFIRegister(unsigned &Reg); bool parseCFIOperand(MachineOperand &Dest); bool parseMachineOperand(MachineOperand &Dest); @@ -124,6 +125,10 @@ private: /// Return true if an error occurred. bool getUnsigned(unsigned &Result); + /// If the current token is of the given kind, consume it and return false. + /// Otherwise report an error and return true. + bool expectAndConsume(MIToken::TokenKind TokenKind); + void initNames2InstrOpCodes(); /// Try to convert an instruction name to an opcode. Return true if the @@ -181,6 +186,22 @@ bool MIParser::error(StringRef::iterator Loc, const Twine &Msg) { return true; } +static const char *toString(MIToken::TokenKind TokenKind) { + switch (TokenKind) { + case MIToken::comma: + return "','"; + default: + return "<unknown token>"; + } +} + +bool MIParser::expectAndConsume(MIToken::TokenKind TokenKind) { + if (Token.isNot(TokenKind)) + return error(Twine("expected ") + toString(TokenKind)); + lex(); + return false; +} + bool MIParser::parse(MachineInstr *&MI) { lex(); @@ -623,16 +644,49 @@ bool MIParser::parseCFIOffset(int &Offset) { return false; } +bool MIParser::parseCFIRegister(unsigned &Reg) { + if (Token.isNot(MIToken::NamedRegister)) + return error("expected a cfi register"); + unsigned LLVMReg; + if (parseRegister(LLVMReg)) + return true; + const auto *TRI = MF.getSubtarget().getRegisterInfo(); + assert(TRI && "Expected target register info"); + int DwarfReg = TRI->getDwarfRegNum(LLVMReg, true); + if (DwarfReg < 0) + return error("invalid DWARF register"); + Reg = (unsigned)DwarfReg; + lex(); + return false; +} + bool MIParser::parseCFIOperand(MachineOperand &Dest) { - // TODO: Parse the other CFI operands. - assert(Token.is(MIToken::kw_cfi_def_cfa_offset)); + auto Kind = Token.kind(); lex(); + auto &MMI = MF.getMMI(); int Offset; - if (parseCFIOffset(Offset)) - return true; - // NB: MCCFIInstruction::createDefCfaOffset negates the offset. - Dest = MachineOperand::CreateCFIIndex(MF.getMMI().addFrameInst( - MCCFIInstruction::createDefCfaOffset(nullptr, -Offset))); + unsigned Reg; + unsigned CFIIndex; + switch (Kind) { + case MIToken::kw_cfi_offset: + if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) || + parseCFIOffset(Offset)) + return true; + CFIIndex = + MMI.addFrameInst(MCCFIInstruction::createOffset(nullptr, Reg, Offset)); + break; + case MIToken::kw_cfi_def_cfa_offset: + if (parseCFIOffset(Offset)) + return true; + // NB: MCCFIInstruction::createDefCfaOffset negates the offset. + CFIIndex = MMI.addFrameInst( + MCCFIInstruction::createDefCfaOffset(nullptr, -Offset)); + break; + default: + // TODO: Parse the other CFI operands. + llvm_unreachable("The current token should be a cfi operand"); + } + Dest = MachineOperand::CreateCFIIndex(CFIIndex); return false; } @@ -668,6 +722,7 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest) { return parseExternalSymbolOperand(Dest); case MIToken::exclaim: return parseMetadataOperand(Dest); + case MIToken::kw_cfi_offset: case MIToken::kw_cfi_def_cfa_offset: return parseCFIOperand(Dest); case MIToken::Error: diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp index da1ebe15c8b..2ae5466392f 100644 --- a/llvm/lib/CodeGen/MIRPrinter.cpp +++ b/llvm/lib/CodeGen/MIRPrinter.cpp @@ -105,7 +105,7 @@ public: void printStackObjectReference(int FrameIndex); void print(const MachineOperand &Op, const TargetRegisterInfo *TRI); - void print(const MCCFIInstruction &CFI); + void print(const MCCFIInstruction &CFI, const TargetRegisterInfo *TRI); }; } // end anonymous namespace @@ -465,7 +465,7 @@ void MIPrinter::print(const MachineOperand &Op, const TargetRegisterInfo *TRI) { break; case MachineOperand::MO_CFIIndex: { const auto &MMI = Op.getParent()->getParent()->getParent()->getMMI(); - print(MMI.getFrameInstructions()[Op.getCFIIndex()]); + print(MMI.getFrameInstructions()[Op.getCFIIndex()], TRI); break; } default: @@ -474,8 +474,26 @@ void MIPrinter::print(const MachineOperand &Op, const TargetRegisterInfo *TRI) { } } -void MIPrinter::print(const MCCFIInstruction &CFI) { +static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS, + const TargetRegisterInfo *TRI) { + int Reg = TRI->getLLVMRegNum(DwarfReg, true); + if (Reg == -1) { + OS << "<badreg>"; + return; + } + printReg(Reg, OS, TRI); +} + +void MIPrinter::print(const MCCFIInstruction &CFI, + const TargetRegisterInfo *TRI) { switch (CFI.getOperation()) { + case MCCFIInstruction::OpOffset: + OS << ".cfi_offset "; + if (CFI.getLabel()) + OS << "<mcsymbol> "; + printCFIRegister(CFI.getRegister(), OS, TRI); + OS << ", " << CFI.getOffset(); + break; case MCCFIInstruction::OpDefCfaOffset: OS << ".cfi_def_cfa_offset "; if (CFI.getLabel()) |