diff options
author | Derek Schuff <dschuff@google.com> | 2013-06-14 16:15:29 +0000 |
---|---|---|
committer | Derek Schuff <dschuff@google.com> | 2013-06-14 16:15:29 +0000 |
commit | 8a0d41e1a649c32e1f0e22c6c201a2e0d8463e30 (patch) | |
tree | a7de62d1e90c8cec19f2fdd9378ebc25ce9f5ce7 /lib/CodeGen/PrologEpilogInserter.cpp | |
parent | 80cecc8c6091b03905cdd35c4c374c20ad0702c1 (diff) | |
download | llvm-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.cpp | 4 |
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)); } |