[MC] [Win64EH] Wrap the epilog instructions in a struct. NFC.

For ARM SEH, the epilogs will need a little more associated data than
just the plain list of opcodes.

This is a preparatory refactoring for D125645.

Differential Revision: https://reviews.llvm.org/D125879
This commit is contained in:
Martin Storsjö 2022-05-18 10:32:47 +03:00
parent a159128811
commit e71b07e468
3 changed files with 12 additions and 9 deletions

View File

@ -54,7 +54,10 @@ struct FrameInfo {
int LastFrameInst = -1;
const FrameInfo *ChainedParent = nullptr;
std::vector<Instruction> Instructions;
MapVector<MCSymbol*, std::vector<Instruction>> EpilogMap;
struct Epilog {
std::vector<Instruction> Instructions;
};
MapVector<MCSymbol *, Epilog> EpilogMap;
FrameInfo() = default;
FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel)
@ -68,7 +71,7 @@ struct FrameInfo {
if (!Instructions.empty())
return false;
for (const auto &E : EpilogMap)
if (!E.second.empty())
if (!E.second.Instructions.empty())
return false;
return true;
}

View File

@ -525,7 +525,7 @@ FindMatchingEpilog(const std::vector<WinEH::Instruction>& EpilogInstrs,
auto InstrsIter = info->EpilogMap.find(EpilogStart);
assert(InstrsIter != info->EpilogMap.end() &&
"Epilog not found in EpilogMap");
const auto &Instrs = InstrsIter->second;
const auto &Instrs = InstrsIter->second.Instructions;
if (Instrs.size() != EpilogInstrs.size())
continue;
@ -633,7 +633,7 @@ static int checkPackedEpilog(MCStreamer &streamer, WinEH::FrameInfo *info,
return -1;
const std::vector<WinEH::Instruction> &Epilog =
info->EpilogMap.begin()->second;
info->EpilogMap.begin()->second.Instructions;
// Check that the epilog actually is at the very end of the function,
// otherwise it can't be packed.
@ -931,7 +931,7 @@ static void ARM64EmitUnwindInfo(MCStreamer &streamer, WinEH::FrameInfo *info,
simplifyOpcodes(info->Instructions, false);
for (auto &I : info->EpilogMap)
simplifyOpcodes(I.second, true);
simplifyOpcodes(I.second.Instructions, true);
MCContext &context = streamer.getContext();
MCSymbol *Label = context.createTempSymbol();
@ -1003,7 +1003,7 @@ static void ARM64EmitUnwindInfo(MCStreamer &streamer, WinEH::FrameInfo *info,
for (auto &I : info->EpilogMap) {
MCSymbol *EpilogStart = I.first;
auto &EpilogInstrs = I.second;
auto &EpilogInstrs = I.second.Instructions;
uint32_t CodeBytes = ARM64CountOfUnwindCodes(EpilogInstrs);
MCSymbol* MatchingEpilog =
@ -1085,7 +1085,7 @@ static void ARM64EmitUnwindInfo(MCStreamer &streamer, WinEH::FrameInfo *info,
// Emit epilog unwind instructions
for (auto &I : info->EpilogMap) {
auto &EpilogInstrs = I.second;
auto &EpilogInstrs = I.second.Instructions;
for (const WinEH::Instruction &inst : EpilogInstrs)
ARM64EmitUnwindCode(streamer, inst);
}

View File

@ -74,7 +74,7 @@ void AArch64TargetWinCOFFStreamer::emitARM64WinUnwindCode(unsigned UnwindCode,
return;
auto Inst = WinEH::Instruction(UnwindCode, /*Label=*/nullptr, Reg, Offset);
if (InEpilogCFI)
CurFrame->EpilogMap[CurrentEpilog].push_back(Inst);
CurFrame->EpilogMap[CurrentEpilog].Instructions.push_back(Inst);
else
CurFrame->Instructions.push_back(Inst);
}
@ -201,7 +201,7 @@ void AArch64TargetWinCOFFStreamer::emitARM64WinCFIEpilogEnd() {
InEpilogCFI = false;
WinEH::Instruction Inst =
WinEH::Instruction(Win64EH::UOP_End, /*Label=*/nullptr, -1, 0);
CurFrame->EpilogMap[CurrentEpilog].push_back(Inst);
CurFrame->EpilogMap[CurrentEpilog].Instructions.push_back(Inst);
CurrentEpilog = nullptr;
}