[PATCH] Save the link register for uwtable.

Logan Chien tzuhsiang.chien at gmail.com
Sat Feb 22 04:12:34 PST 2014


Hi qcolombet,

The function with uwtable attribute might be visited by the
stack unwinder, thus we should not optimize out the instructions
to save the link register if the caller function has uwtable
attribute.

http://llvm-reviews.chandlerc.com/D2863

Files:
  lib/CodeGen/VirtRegMap.cpp
  test/CodeGen/ARM/noreturn.ll

Index: lib/CodeGen/VirtRegMap.cpp
===================================================================
--- lib/CodeGen/VirtRegMap.cpp
+++ lib/CodeGen/VirtRegMap.cpp
@@ -278,6 +278,11 @@
   PhysRegs.clear();
   PhysRegs.setUniverse(TRI->getNumRegs());
 
+  // The function with uwtable should guarantee that the stack unwinder
+  // can unwind the stack to the previous frame.  Thus, we can't apply the
+  // noreturn optimization if the caller function has uwtable attribute.
+  bool HasUWTable = MF->getFunction()->hasFnAttribute(Attribute::UWTable);
+
   for (MachineFunction::iterator MBBI = MF->begin(), MBBE = MF->end();
        MBBI != MBBE; ++MBBI) {
     DEBUG(MBBI->print(dbgs(), Indexes));
@@ -287,9 +292,12 @@
       MachineInstr *MI = MII;
       ++MII;
 
-      // Check if this instruction is a call to a noreturn function.
-      // If so, all the definitions set by this instruction can be ignored.
-      if (IsExitBB && MI->isCall())
+      // Check if this instruction is a call to a noreturn function.  If this
+      // is a call to noreturn function and we don't need the stack unwinding
+      // functionality (i.e. this function does not have uwtable attribute and
+      // the callee function has the nounwind attribute), then we can ignore
+      // the definitions set by this instruction.
+      if (!HasUWTable && IsExitBB && MI->isCall())
         for (MachineInstr::mop_iterator MOI = MI->operands_begin(),
                MOE = MI->operands_end(); MOI != MOE; ++MOI) {
           MachineOperand &MO = *MOI;
Index: test/CodeGen/ARM/noreturn.ll
===================================================================
--- test/CodeGen/ARM/noreturn.ll
+++ test/CodeGen/ARM/noreturn.ll
@@ -43,6 +43,23 @@
   unreachable
 }
 
+; Test case for uwtable
+define i32 @test4() uwtable {
+; CHECK-LABEL: @test4
+; CHECK: push
+entry:
+  tail call void @overflow() #0
+  unreachable
+}
+
+define i32 @test5() uwtable {
+; CHECK-LABEL: @test5
+; CHECK: push
+entry:
+  tail call void @overflow_with_unwind() #1
+  unreachable
+}
+
 ; Function Attrs: noreturn
 declare void @overflow_with_unwind() #1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2863.1.patch
Type: text/x-patch
Size: 2117 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140222/a28c4ee7/attachment.bin>


More information about the llvm-commits mailing list