summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/WinCOFFStreamer.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-05-30 04:56:02 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-05-30 04:56:02 +0000
commit4eecd30d1910ba784e98a7d628f0e2448712725f (patch)
tree94b5f2352aff7eb8f73b7966f22cedc561f4abf3 /llvm/lib/MC/WinCOFFStreamer.cpp
parent9cc2516676063f190e04e231284a52cb45fdb273 (diff)
downloadbcm5719-llvm-4eecd30d1910ba784e98a7d628f0e2448712725f.tar.gz
bcm5719-llvm-4eecd30d1910ba784e98a7d628f0e2448712725f.zip
[WinCOFF] Add support for the .safeseh directive
.safeseh adds an entry to the .sxdata section to register all the appropriate functions which may handle an exception. This entry is not a relocation to the symbol but instead the symbol table index of the function. llvm-svn: 238641
Diffstat (limited to 'llvm/lib/MC/WinCOFFStreamer.cpp')
-rw-r--r--llvm/lib/MC/WinCOFFStreamer.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/MC/WinCOFFStreamer.cpp b/llvm/lib/MC/WinCOFFStreamer.cpp
index 72c18788068..abbe4164958 100644
--- a/llvm/lib/MC/WinCOFFStreamer.cpp
+++ b/llvm/lib/MC/WinCOFFStreamer.cpp
@@ -158,6 +158,21 @@ void MCWinCOFFStreamer::EndCOFFSymbolDef() {
CurSymbol = nullptr;
}
+void MCWinCOFFStreamer::EmitCOFFSafeSEH(MCSymbol const *Symbol) {
+ if (Symbol->getFlags() & COFF::SF_SafeSEH)
+ return;
+
+ MCSection *SXData = getContext().getObjectFileInfo()->getSXDataSection();
+ getAssembler().registerSection(*SXData);
+ if (SXData->getAlignment() < 4)
+ SXData->setAlignment(4);
+
+ new MCSafeSEHFragment(Symbol, SXData);
+
+ getAssembler().registerSymbol(*Symbol);
+ Symbol->modifyFlags(COFF::SF_SafeSEH, COFF::SF_SafeSEH);
+}
+
void MCWinCOFFStreamer::EmitCOFFSectionIndex(MCSymbol const *Symbol) {
MCDataFragment *DF = getOrCreateDataFragment();
const MCSymbolRefExpr *SRE = MCSymbolRefExpr::create(Symbol, getContext());
OpenPOWER on IntegriCloud