From b139323f217ac3414950454047a9057801dc096f Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Wed, 29 Jul 2015 18:57:23 +0000 Subject: [PATCH] MIR Serialization: Serialize the '.cfi_def_cfa' CFI instruction. llvm-svn: 243554 --- llvm/lib/CodeGen/MIRParser/MILexer.cpp | 1 + llvm/lib/CodeGen/MIRParser/MILexer.h | 1 + llvm/lib/CodeGen/MIRParser/MIParser.cpp | 9 ++++++++ llvm/lib/CodeGen/MIRPrinter.cpp | 7 ++++++ llvm/test/CodeGen/MIR/AArch64/cfi-def-cfa.mir | 32 +++++++++++++++++++++++++++ 5 files changed, 50 insertions(+) create mode 100644 llvm/test/CodeGen/MIR/AArch64/cfi-def-cfa.mir diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index f7475a1..3c0dc4c 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -147,6 +147,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .Case(".cfi_offset", MIToken::kw_cfi_offset) .Case(".cfi_def_cfa_register", MIToken::kw_cfi_def_cfa_register) .Case(".cfi_def_cfa_offset", MIToken::kw_cfi_def_cfa_offset) + .Case(".cfi_def_cfa", MIToken::kw_cfi_def_cfa) .Case("blockaddress", MIToken::kw_blockaddress) .Case("target-index", MIToken::kw_target_index) .Default(MIToken::Identifier); diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h index 7693c10..31c3575 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.h +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -51,6 +51,7 @@ struct MIToken { kw_cfi_offset, kw_cfi_def_cfa_register, kw_cfi_def_cfa_offset, + kw_cfi_def_cfa, kw_blockaddress, kw_target_index, diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index 6c0cd9d..c71eeb9 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -754,6 +754,14 @@ bool MIParser::parseCFIOperand(MachineOperand &Dest) { CFIIndex = MMI.addFrameInst( MCCFIInstruction::createDefCfaOffset(nullptr, -Offset)); break; + case MIToken::kw_cfi_def_cfa: + if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) || + parseCFIOffset(Offset)) + return true; + // NB: MCCFIInstruction::createDefCfa negates the offset. + CFIIndex = + MMI.addFrameInst(MCCFIInstruction::createDefCfa(nullptr, Reg, -Offset)); + break; default: // TODO: Parse the other CFI operands. llvm_unreachable("The current token should be a cfi operand"); @@ -874,6 +882,7 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest) { case MIToken::kw_cfi_offset: case MIToken::kw_cfi_def_cfa_register: case MIToken::kw_cfi_def_cfa_offset: + case MIToken::kw_cfi_def_cfa: return parseCFIOperand(Dest); case MIToken::kw_blockaddress: return parseBlockAddressOperand(Dest); diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp index e4395e0..bdacfb9 100644 --- a/llvm/lib/CodeGen/MIRPrinter.cpp +++ b/llvm/lib/CodeGen/MIRPrinter.cpp @@ -586,6 +586,13 @@ void MIPrinter::print(const MCCFIInstruction &CFI, OS << " "; OS << CFI.getOffset(); break; + case MCCFIInstruction::OpDefCfa: + OS << ".cfi_def_cfa "; + if (CFI.getLabel()) + OS << " "; + printCFIRegister(CFI.getRegister(), OS, TRI); + OS << ", " << CFI.getOffset(); + break; default: // TODO: Print the other CFI Operations. OS << ""; diff --git a/llvm/test/CodeGen/MIR/AArch64/cfi-def-cfa.mir b/llvm/test/CodeGen/MIR/AArch64/cfi-def-cfa.mir new file mode 100644 index 0000000..6deff62 --- /dev/null +++ b/llvm/test/CodeGen/MIR/AArch64/cfi-def-cfa.mir @@ -0,0 +1,32 @@ +# RUN: llc -mtriple=aarch64-none-linux-gnu -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s +# This test ensures that the MIR parser parses the .cfi_def_cfa operands +# correctly. + +--- | + + declare void @foo() + + define void @trivial_fp_func() { + entry: + call void @foo() + ret void + } + +... +--- +name: trivial_fp_func +body: + - id: 0 + name: entry + liveins: [ '%lr', '%fp', '%lr', '%fp' ] + instructions: + - '%sp = frame-setup STPXpre killed %fp, killed %lr, %sp, -2' + - '%fp = frame-setup ADDXri %sp, 0, 0' + # CHECK: CFI_INSTRUCTION .cfi_def_cfa %w29, 16 + - 'frame-setup CFI_INSTRUCTION .cfi_def_cfa %w29, 16' + - 'frame-setup CFI_INSTRUCTION .cfi_offset %w30, -8' + - 'frame-setup CFI_INSTRUCTION .cfi_offset %w29, -16' + - 'BL @foo, csr_aarch64_aapcs, implicit-def dead %lr, implicit %sp, implicit-def %sp' + - '%sp, %fp, %lr = LDPXpost %sp, 2' + - RET_ReallyLR +... -- 2.7.4