diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-05-30 04:56:02 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-05-30 04:56:02 +0000 |
commit | 4eecd30d1910ba784e98a7d628f0e2448712725f (patch) | |
tree | 94b5f2352aff7eb8f73b7966f22cedc561f4abf3 /llvm/lib/MC/WinCOFFStreamer.cpp | |
parent | 9cc2516676063f190e04e231284a52cb45fdb273 (diff) | |
download | bcm5719-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.cpp | 15 |
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()); |