From 1c1ccc2527a0e1e1e3eb2b3ef4b9743a3c6724ce Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Mon, 27 Jul 2015 20:39:03 +0000 Subject: [PATCH] MIR Serialization: Serialize the '.cfi_def_cfa_register' CFI instruction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243322 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MIRParser/MILexer.cpp | 1 + lib/CodeGen/MIRParser/MILexer.h | 1 + lib/CodeGen/MIRParser/MIParser.cpp | 7 ++++ lib/CodeGen/MIRPrinter.cpp | 6 ++++ test/CodeGen/MIR/X86/cfi-def-cfa-register.mir | 33 +++++++++++++++++++ 5 files changed, 48 insertions(+) create mode 100644 test/CodeGen/MIR/X86/cfi-def-cfa-register.mir diff --git a/lib/CodeGen/MIRParser/MILexer.cpp b/lib/CodeGen/MIRParser/MILexer.cpp index 27d661760cc..2f038ff5684 100644 --- a/lib/CodeGen/MIRParser/MILexer.cpp +++ b/lib/CodeGen/MIRParser/MILexer.cpp @@ -125,6 +125,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .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_register", MIToken::kw_cfi_def_cfa_register) .Case(".cfi_def_cfa_offset", MIToken::kw_cfi_def_cfa_offset) .Default(MIToken::Identifier); } diff --git a/lib/CodeGen/MIRParser/MILexer.h b/lib/CodeGen/MIRParser/MILexer.h index bae9dcd1ebe..b84fb743599 100644 --- a/lib/CodeGen/MIRParser/MILexer.h +++ b/lib/CodeGen/MIRParser/MILexer.h @@ -47,6 +47,7 @@ struct MIToken { kw_frame_setup, kw_debug_location, kw_cfi_offset, + kw_cfi_def_cfa_register, kw_cfi_def_cfa_offset, // Identifier tokens diff --git a/lib/CodeGen/MIRParser/MIParser.cpp b/lib/CodeGen/MIRParser/MIParser.cpp index fbe6377709a..c46adf5c719 100644 --- a/lib/CodeGen/MIRParser/MIParser.cpp +++ b/lib/CodeGen/MIRParser/MIParser.cpp @@ -688,6 +688,12 @@ bool MIParser::parseCFIOperand(MachineOperand &Dest) { CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(nullptr, Reg, Offset)); break; + case MIToken::kw_cfi_def_cfa_register: + if (parseCFIRegister(Reg)) + return true; + CFIIndex = + MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(nullptr, Reg)); + break; case MIToken::kw_cfi_def_cfa_offset: if (parseCFIOffset(Offset)) return true; @@ -736,6 +742,7 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest) { case MIToken::exclaim: return parseMetadataOperand(Dest); case MIToken::kw_cfi_offset: + case MIToken::kw_cfi_def_cfa_register: case MIToken::kw_cfi_def_cfa_offset: return parseCFIOperand(Dest); case MIToken::Error: diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp index 5800db55628..3db6368b94d 100644 --- a/lib/CodeGen/MIRPrinter.cpp +++ b/lib/CodeGen/MIRPrinter.cpp @@ -528,6 +528,12 @@ void MIPrinter::print(const MCCFIInstruction &CFI, printCFIRegister(CFI.getRegister(), OS, TRI); OS << ", " << CFI.getOffset(); break; + case MCCFIInstruction::OpDefCfaRegister: + OS << ".cfi_def_cfa_register "; + if (CFI.getLabel()) + OS << " "; + printCFIRegister(CFI.getRegister(), OS, TRI); + break; case MCCFIInstruction::OpDefCfaOffset: OS << ".cfi_def_cfa_offset "; if (CFI.getLabel()) diff --git a/test/CodeGen/MIR/X86/cfi-def-cfa-register.mir b/test/CodeGen/MIR/X86/cfi-def-cfa-register.mir new file mode 100644 index 00000000000..aad546494d7 --- /dev/null +++ b/test/CodeGen/MIR/X86/cfi-def-cfa-register.mir @@ -0,0 +1,33 @@ +# RUN: llc -march=x86-64 -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_register +# operands correctly. + +--- | + + define void @func() #0 { + entry: + unreachable + } + + attributes #0 = { "no-frame-pointer-elim"="true" } + +... +--- +name: func +tracksRegLiveness: true +frameInfo: + stackSize: 8 +fixedStack: + - { id: 0, type: spill-slot, offset: -16, size: 8, alignment: 16 } +body: + - id: 0 + name: entry + liveins: [ '%rbp' ] + instructions: + - 'PUSH64r killed %rbp, implicit-def %rsp, implicit %rsp' + - 'CFI_INSTRUCTION .cfi_def_cfa_offset 16' + - 'CFI_INSTRUCTION .cfi_offset %rbp, -16' + - '%rbp = MOV64rr %rsp' + # CHECK: CFI_INSTRUCTION .cfi_def_cfa_register %rbp + - 'CFI_INSTRUCTION .cfi_def_cfa_register %rbp' +... -- 2.34.1