[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