diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/CFIInstrInserter.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/CFIInstrInserter.cpp | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/CFIInstrInserter.cpp b/contrib/llvm-project/llvm/lib/CodeGen/CFIInstrInserter.cpp index 23c7fea01f28..1c2e3f998449 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/CFIInstrInserter.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/CFIInstrInserter.cpp @@ -157,7 +157,7 @@ void CFIInstrInserter::calculateCFAInfo(MachineFunction &MF) { // Initialize MBBMap. for (MachineBasicBlock &MBB : MF) { - MBBCFAInfo MBBInfo; + MBBCFAInfo &MBBInfo = MBBVector[MBB.getNumber()]; MBBInfo.MBB = &MBB; MBBInfo.IncomingCFAOffset = InitialOffset; MBBInfo.OutgoingCFAOffset = InitialOffset; @@ -165,7 +165,6 @@ void CFIInstrInserter::calculateCFAInfo(MachineFunction &MF) { MBBInfo.OutgoingCFARegister = InitialRegister; MBBInfo.IncomingCSRSaved.resize(NumRegs); MBBInfo.OutgoingCSRSaved.resize(NumRegs); - MBBVector[MBB.getNumber()] = MBBInfo; } CSRLocMap.clear(); @@ -220,6 +219,14 @@ void CFIInstrInserter::calculateOutgoingCFAInfo(MBBCFAInfo &MBBInfo) { case MCCFIInstruction::OpRestore: CSRRestored.set(CFI.getRegister()); break; + case MCCFIInstruction::OpLLVMDefAspaceCfa: + // TODO: Add support for handling cfi_def_aspace_cfa. +#ifndef NDEBUG + report_fatal_error( + "Support for cfi_llvm_def_aspace_cfa not implemented! Value of CFA " + "may be incorrect!\n"); +#endif + break; case MCCFIInstruction::OpRememberState: // TODO: Add support for handling cfi_remember_state. #ifndef NDEBUG @@ -265,9 +272,9 @@ void CFIInstrInserter::calculateOutgoingCFAInfo(MBBCFAInfo &MBBInfo) { MBBInfo.OutgoingCFARegister = SetRegister; // Update outgoing CSR info. - MBBInfo.OutgoingCSRSaved = MBBInfo.IncomingCSRSaved; - MBBInfo.OutgoingCSRSaved |= CSRSaved; - MBBInfo.OutgoingCSRSaved.reset(CSRRestored); + BitVector::apply([](auto x, auto y, auto z) { return (x | y) & ~z; }, + MBBInfo.OutgoingCSRSaved, MBBInfo.IncomingCSRSaved, CSRSaved, + CSRRestored); } void CFIInstrInserter::updateSuccCFAInfo(MBBCFAInfo &MBBInfo) { @@ -295,6 +302,7 @@ bool CFIInstrInserter::insertCFIInstrs(MachineFunction &MF) { const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo(); bool InsertedCFIInstr = false; + BitVector SetDifference; for (MachineBasicBlock &MBB : MF) { // Skip the first MBB in a function if (MBB.getNumber() == MF.front().getNumber()) continue; @@ -346,8 +354,8 @@ bool CFIInstrInserter::insertCFIInstrs(MachineFunction &MF) { continue; } - BitVector SetDifference = PrevMBBInfo->OutgoingCSRSaved; - SetDifference.reset(MBBInfo.IncomingCSRSaved); + BitVector::apply([](auto x, auto y) { return x & ~y; }, SetDifference, + PrevMBBInfo->OutgoingCSRSaved, MBBInfo.IncomingCSRSaved); for (int Reg : SetDifference.set_bits()) { unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createRestore(nullptr, Reg)); @@ -356,8 +364,8 @@ bool CFIInstrInserter::insertCFIInstrs(MachineFunction &MF) { InsertedCFIInstr = true; } - SetDifference = MBBInfo.IncomingCSRSaved; - SetDifference.reset(PrevMBBInfo->OutgoingCSRSaved); + BitVector::apply([](auto x, auto y) { return x & ~y; }, SetDifference, + MBBInfo.IncomingCSRSaved, PrevMBBInfo->OutgoingCSRSaved); for (int Reg : SetDifference.set_bits()) { auto it = CSRLocMap.find(Reg); assert(it != CSRLocMap.end() && "Reg should have an entry in CSRLocMap"); |
