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 | 1804b5795a36f6eea1a254109cb834efe6f6ed40 (patch) | |
tree | 308d80e6b11fcdd68c69f100666c80e41c1cbe61 /llvm/lib | |
parent | 5492d613f5a38d88e5c61b84a14a4a2e65d0fd5f (diff) | |
download | bcm5719-llvm-1804b5795a36f6eea1a254109cb834efe6f6ed40.tar.gz bcm5719-llvm-1804b5795a36f6eea1a254109cb834efe6f6ed40.zip |
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.
llvm-svn: 183984
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index 4b301d84ca4..9f2cba2195f 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/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)); } |