From fe059c782fbd264ca5807e7823016ddbd3801db6 Mon Sep 17 00:00:00 2001 From: Bob Haarman Date: Thu, 16 Nov 2017 01:22:01 +0000 Subject: [PATCH] [coff] correctly emit safeseh entries for handlers defined in dlls Summary: We previously assumed that all SafeSEH handlers are DefinedRegular symbols. This is not the case for handlers defined in DLLs. As a result, we were failing to emit entries in the SafeSEH table for those handlers. This change fixes that. Fixes PR35324. Reviewers: rnk, ruiu Reviewed By: rnk Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D40102 llvm-svn: 318364 --- lld/COFF/Writer.cpp | 8 +++----- lld/test/COFF/Inputs/except_handler3.lib | Bin 0 -> 1364 bytes lld/test/COFF/safeseh-md.s | 34 +++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 lld/test/COFF/Inputs/except_handler3.lib create mode 100644 lld/test/COFF/safeseh-md.s diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index b398bb6..126a497 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -787,11 +787,9 @@ void Writer::createSEHTable(OutputSection *RData) { if (!File->SEHCompat) return; for (Symbol *B : File->SEHandlers) { - // Make sure the handler is still live. Assume all handlers are regular - // symbols. - auto *D = dyn_cast(B); - if (D && D->getChunk()->isLive()) - Handlers.insert(D); + // Make sure the handler is still live. + if (B->isLive()) + Handlers.insert(cast(B)); } } diff --git a/lld/test/COFF/Inputs/except_handler3.lib b/lld/test/COFF/Inputs/except_handler3.lib new file mode 100644 index 0000000000000000000000000000000000000000..fdc51ed7328555ededd6e03d629840b1bb487a44 GIT binary patch literal 1364 zcmcIk%}&BV5FUPvrt#pxt4U4Nc%smjf`*t9F_DNsu$-4lNg%0)5DwhD@d!SIPr;M; z7+!H^yIb2*Lx^#c*_rwF+wIKGbWdyUY&gDAG&Meo5jU`-v#ORX$rvaAum_Nt1LUqz zz5w!{B#bp5yPclH8h1~(y=K?x^w?-I98KqJ?7n*bXl4Lo?S8AZNrblqGvGP*{q_TE z)SWu+oV-jKOF1#I6SQP}@#Awnk8X>0~_=M27lrHMvM(Q!-8NL7QKTR*m zHsN|(6-#