MIR Serialization: Serialize the '.cfi_def_cfa' CFI instruction.
authorAlex Lorenz <arphaman@gmail.com>
Wed, 29 Jul 2015 18:57:23 +0000 (18:57 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Wed, 29 Jul 2015 18:57:23 +0000 (18:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243554 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/AArch64/cfi-def-cfa.mir [new file with mode: 0644]

index f7475a10ba957302587a694a17e365c0831d84ed..3c0dc4c0ded5720a1ccf68bc03f1bddd27ac5781 100644 (file)
@@ -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);
index 7693c1015d82daba8199e4bb3369b257dfa49b38..31c3575bba9b396245c538a40ec953b5c8db336d 100644 (file)
@@ -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,
 
index 6c0cd9d6ef8c9bbf9580df351d6cf1a28ce68ef8..c71eeb99fca5f0ae9c7909010a0d204a851a2d9a 100644 (file)
@@ -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);
index e4395e0f52ab98af0c8cdc807abf38de94e29d18..bdacfb9b4cd9305fab343d962f156d26d4b8d3d3 100644 (file)
@@ -586,6 +586,13 @@ void MIPrinter::print(const MCCFIInstruction &CFI,
       OS << "<mcsymbol> ";
     OS << CFI.getOffset();
     break;
+  case MCCFIInstruction::OpDefCfa:
+    OS << ".cfi_def_cfa ";
+    if (CFI.getLabel())
+      OS << "<mcsymbol> ";
+    printCFIRegister(CFI.getRegister(), OS, TRI);
+    OS << ", " << CFI.getOffset();
+    break;
   default:
     // TODO: Print the other CFI Operations.
     OS << "<unserializable cfi operation>";
diff --git a/test/CodeGen/MIR/AArch64/cfi-def-cfa.mir b/test/CodeGen/MIR/AArch64/cfi-def-cfa.mir
new file mode 100644 (file)
index 0000000..6deff62
--- /dev/null
@@ -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
+...