summaryrefslogtreecommitdiff
path: root/lib/CodeGen/PrologEpilogInserter.cpp
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@google.com>2013-06-14 16:15:29 +0000
committerDerek Schuff <dschuff@google.com>2013-06-14 16:15:29 +0000
commit8a0d41e1a649c32e1f0e22c6c201a2e0d8463e30 (patch)
treea7de62d1e90c8cec19f2fdd9378ebc25ce9f5ce7 /lib/CodeGen/PrologEpilogInserter.cpp
parent80cecc8c6091b03905cdd35c4c374c20ad0702c1 (diff)
downloadllvm-8a0d41e1a649c32e1f0e22c6c201a2e0d8463e30.tar.gz
llvm-8a0d41e1a649c32e1f0e22c6c201a2e0d8463e30.tar.bz2
llvm-8a0d41e1a649c32e1f0e22c6c201a2e0d8463e30.tar.xz
Make PrologEpilogInserter save/restore all callee saved registers
in functions which call __builtin_unwind_init() __builtin_unwind_init() is an undocumented gcc intrinsic which has this effect, and is used in libgcc_eh. Goes part of the way toward fixing PR8541. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183984 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/PrologEpilogInserter.cpp')
-rw-r--r--lib/CodeGen/PrologEpilogInserter.cpp4
1 files changed, 3 insertions, 1 deletions
diff --git a/lib/CodeGen/PrologEpilogInserter.cpp b/lib/CodeGen/PrologEpilogInserter.cpp
index 4b301d84ca..9f2cba2195 100644
--- a/lib/CodeGen/PrologEpilogInserter.cpp
+++ b/lib/CodeGen/PrologEpilogInserter.cpp
@@ -29,6 +29,7 @@
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
+#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/RegisterScavenging.h"
#include "llvm/IR/InlineAsm.h"
@@ -227,7 +228,8 @@ void PEI::calculateCalleeSavedRegisters(MachineFunction &F) {
std::vector<CalleeSavedInfo> CSI;
for (unsigned i = 0; CSRegs[i]; ++i) {
unsigned Reg = CSRegs[i];
- if (F.getRegInfo().isPhysRegUsed(Reg)) {
+ // Functions which call __builtin_unwind_init get all their registers saved.
+ if (F.getRegInfo().isPhysRegUsed(Reg) || F.getMMI().callsUnwindInit()) {
// If the reg is modified, save it!
CSI.push_back(CalleeSavedInfo(Reg));
}