MIR Serialization: Serialize the '.cfi_same_value' CFI directive.
authorAlex Lorenz <arphaman@gmail.com>
Fri, 14 Aug 2015 21:55:58 +0000 (21:55 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Fri, 14 Aug 2015 21:55:58 +0000 (21:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245103 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/ARM/cfi-same-value.mir [new file with mode: 0644]

index e15a4d1e753cab94a22348694aa05ab688e41eb6..f607edddecc6ac5d79f7b901f7681c564ab871aa 100644 (file)
@@ -196,6 +196,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) {
       .Case("debug-use", MIToken::kw_debug_use)
       .Case("frame-setup", MIToken::kw_frame_setup)
       .Case("debug-location", MIToken::kw_debug_location)
+      .Case(".cfi_same_value", MIToken::kw_cfi_same_value)
       .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)
index e7abbb2dd8916246d8546365290ab5cf600860ed..747e6523e4b63485ec2052e093013d778c1e4c4f 100644 (file)
@@ -57,6 +57,7 @@ struct MIToken {
     kw_debug_use,
     kw_frame_setup,
     kw_debug_location,
+    kw_cfi_same_value,
     kw_cfi_offset,
     kw_cfi_def_cfa_register,
     kw_cfi_def_cfa_offset,
index b27a55b705d66051bdc260bfd23d60045c743083..c6383720e23df455845d257d38e17230e7a55262 100644 (file)
@@ -1093,6 +1093,12 @@ bool MIParser::parseCFIOperand(MachineOperand &Dest) {
   unsigned Reg;
   unsigned CFIIndex;
   switch (Kind) {
+  case MIToken::kw_cfi_same_value:
+    if (parseCFIRegister(Reg))
+      return true;
+    CFIIndex =
+        MMI.addFrameInst(MCCFIInstruction::createSameValue(nullptr, Reg));
+    break;
   case MIToken::kw_cfi_offset:
     if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
         parseCFIOffset(Offset))
@@ -1273,6 +1279,7 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest) {
     return parseExternalSymbolOperand(Dest);
   case MIToken::exclaim:
     return parseMetadataOperand(Dest);
+  case MIToken::kw_cfi_same_value:
   case MIToken::kw_cfi_offset:
   case MIToken::kw_cfi_def_cfa_register:
   case MIToken::kw_cfi_def_cfa_offset:
index d70b5c412f167cde8da294344e1076069087f84f..248db52790e93bc53764785381fead939f6d765b 100644 (file)
@@ -794,6 +794,12 @@ static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS,
 void MIPrinter::print(const MCCFIInstruction &CFI,
                       const TargetRegisterInfo *TRI) {
   switch (CFI.getOperation()) {
+  case MCCFIInstruction::OpSameValue:
+    OS << ".cfi_same_value ";
+    if (CFI.getLabel())
+      OS << "<mcsymbol> ";
+    printCFIRegister(CFI.getRegister(), OS, TRI);
+    break;
   case MCCFIInstruction::OpOffset:
     OS << ".cfi_offset ";
     if (CFI.getLabel())
diff --git a/test/CodeGen/MIR/ARM/cfi-same-value.mir b/test/CodeGen/MIR/ARM/cfi-same-value.mir
new file mode 100644 (file)
index 0000000..f9850ab
--- /dev/null
@@ -0,0 +1,80 @@
+# RUN: llc -mtriple=arm-linux-unknown-gnueabi -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s
+
+--- |
+  declare void @dummy_use(i32*, i32)
+
+  define void @test_basic() #0 {
+  entry:
+    %mem = alloca i32, i32 10
+    call void @dummy_use(i32* %mem, i32 10)
+    ret void
+  }
+
+  attributes #0 = { "split-stack" }
+...
+---
+name:            test_basic
+tracksRegLiveness: true
+frameInfo:
+  stackSize:       48
+  maxAlignment:    4
+  adjustsStack:    true
+  hasCalls:        true
+stack:
+  - { id: 0, name: mem, offset: -48, size: 40, alignment: 4 }
+  - { id: 1, type: spill-slot, offset: -4, size: 4, alignment: 4,
+      callee-saved-register: '%lr' }
+  - { id: 2, type: spill-slot, offset: -8, size: 4, alignment: 4,
+      callee-saved-register: '%r11' }
+body: |
+  bb.0:
+    successors: %bb.2, %bb.1
+    liveins: %r11, %lr
+
+    %sp = STMDB_UPD %sp, 14, _, %r4, %r5
+    CFI_INSTRUCTION .cfi_def_cfa_offset 8
+    CFI_INSTRUCTION .cfi_offset %r5, -4
+    CFI_INSTRUCTION .cfi_offset %r4, -8
+    %r5 = MOVr %sp, 14, _, _
+    %r4 = MRC 15, 0, 13, 0, 3, 14, _
+    %r4 = LDRi12 %r4, 4, 14, _
+    CMPrr %r4, %r5, 14, _, implicit-def %cpsr
+    Bcc %bb.2, 3, %cpsr
+
+  bb.1:
+    successors: %bb.2
+    liveins: %r11, %lr
+
+    %r4 = MOVi 48, 14, _, _
+    %r5 = MOVi 0, 14, _, _
+    %sp = STMDB_UPD %sp, 14, _, %lr
+    CFI_INSTRUCTION .cfi_def_cfa_offset 12
+    CFI_INSTRUCTION .cfi_offset %lr, -12
+    BL $__morestack, implicit-def %lr, implicit %sp
+    %sp = LDMIA_UPD %sp, 14, _, %lr
+    %sp = LDMIA_UPD %sp, 14, _, %r4, %r5
+    CFI_INSTRUCTION .cfi_def_cfa_offset 0
+    BX_RET 14, _
+
+  bb.2:
+    liveins: %r11, %lr
+
+    %sp = LDMIA_UPD %sp, 14, _, %r4, %r5
+    CFI_INSTRUCTION .cfi_def_cfa_offset 0
+  ; CHECK:      CFI_INSTRUCTION .cfi_same_value %r4
+  ; CHECK-NEXT: CFI_INSTRUCTION .cfi_same_value %r5
+    CFI_INSTRUCTION .cfi_same_value %r4
+    CFI_INSTRUCTION .cfi_same_value %r5
+    %sp = frame-setup STMDB_UPD %sp, 14, _, killed %r11, killed %lr
+    frame-setup CFI_INSTRUCTION .cfi_def_cfa_offset 8
+    frame-setup CFI_INSTRUCTION .cfi_offset %lr, -4
+    frame-setup CFI_INSTRUCTION .cfi_offset %r11, -8
+    %sp = frame-setup SUBri killed %sp, 40, 14, _, _
+    frame-setup CFI_INSTRUCTION .cfi_def_cfa_offset 48
+    %r0 = MOVr %sp, 14, _, _
+    %r1 = MOVi 10, 14, _, _
+    BL @dummy_use, csr_aapcs, implicit-def dead %lr, implicit %sp, implicit %r0, implicit killed %r1, implicit-def %sp
+    %sp = ADDri killed %sp, 40, 14, _, _
+    %sp = LDMIA_UPD %sp, 14, _, %r4, %r5
+    MOVPCLR 14, _
+...