aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/WinException.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/WinException.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/WinException.cpp b/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
index 3a9c9df..b30d9cc1 100644
--- a/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/WinException.cpp
@@ -55,6 +55,14 @@ void WinException::endModule() {
for (const Function &F : *M)
if (F.hasFnAttribute("safeseh"))
OS.EmitCOFFSafeSEH(Asm->getSymbol(&F));
+
+ if (M->getModuleFlag("ehcontguard") && !EHContTargets.empty()) {
+ // Emit the symbol index of each ehcont target.
+ OS.SwitchSection(Asm->OutContext.getObjectFileInfo()->getGEHContSection());
+ for (const MCSymbol *S : EHContTargets) {
+ OS.EmitCOFFSymbolIndex(S);
+ }
+ }
}
void WinException::beginFunction(const MachineFunction *MF) {
@@ -164,6 +172,12 @@ void WinException::endFunction(const MachineFunction *MF) {
Asm->OutStreamer->PopSection();
}
+
+ if (!MF->getCatchretTargets().empty()) {
+ // Copy the function's catchret targets to a module-level list.
+ EHContTargets.insert(EHContTargets.end(), MF->getCatchretTargets().begin(),
+ MF->getCatchretTargets().end());
+ }
}
/// Retrieve the MCSymbol for a GlobalValue or MachineBasicBlock.