MIR Serialization: Serialize the '.cfi_def_cfa_register' CFI instruction.
authorAlex Lorenz <arphaman@gmail.com>
Mon, 27 Jul 2015 20:39:03 +0000 (20:39 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Mon, 27 Jul 2015 20:39:03 +0000 (20:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243322 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MIRParser/MILexer.cpp
lib/CodeGen/MIRParser/MILexer.h
lib/CodeGen/MIRParser/MIParser.cpp
lib/CodeGen/MIRPrinter.cpp
test/CodeGen/MIR/X86/cfi-def-cfa-register.mir [new file with mode: 0644]

index 27d661760cca2ef53d0f24cb39cf4dc0fe5bb4dd..2f038ff56845e5cb265e37466c71561bb7dd85a0 100644 (file)
@@ -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);
 }
index bae9dcd1ebe64fa79cf42c6a2e7e9e4e17226081..b84fb7435991e74387d6aca508157edbccb47572 100644 (file)
@@ -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
index fbe6377709a9879ebfe03ed9a73b79ada34006ca..c46adf5c7190145e9ba6f4732ba86e62c665535e 100644 (file)
@@ -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:
index 5800db556285883e72018a5bfc1a09e1f976d123..3db6368b94d090328db1839c678475565bbeb869 100644 (file)
@@ -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 << "<mcsymbol> ";
+    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 (file)
index 0000000..aad5464
--- /dev/null
@@ -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'
+...