diff options
author | Bob Haarman <llvm@inglorion.net> | 2017-11-16 01:22:01 +0000 |
---|---|---|
committer | Bob Haarman <llvm@inglorion.net> | 2017-11-16 01:22:01 +0000 |
commit | fe059c782fbd264ca5807e7823016ddbd3801db6 (patch) | |
tree | 0fa5911db532030bbe237a82b9b3dd3fec7dd6a6 | |
parent | 847a77ffb38dd1ec3ea101dca85afad7efc208fd (diff) | |
download | bcm5719-llvm-fe059c782fbd264ca5807e7823016ddbd3801db6.tar.gz bcm5719-llvm-fe059c782fbd264ca5807e7823016ddbd3801db6.zip |
[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
-rw-r--r-- | lld/COFF/Writer.cpp | 8 | ||||
-rw-r--r-- | lld/test/COFF/Inputs/except_handler3.lib | bin | 0 -> 1364 bytes | |||
-rw-r--r-- | lld/test/COFF/safeseh-md.s | 34 |
3 files changed, 37 insertions, 5 deletions
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index b398bb627e3..126a497a4ed 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<DefinedRegular>(B); - if (D && D->getChunk()->isLive()) - Handlers.insert(D); + // Make sure the handler is still live. + if (B->isLive()) + Handlers.insert(cast<Defined>(B)); } } diff --git a/lld/test/COFF/Inputs/except_handler3.lib b/lld/test/COFF/Inputs/except_handler3.lib Binary files differnew file mode 100644 index 00000000000..fdc51ed7328 --- /dev/null +++ b/lld/test/COFF/Inputs/except_handler3.lib diff --git a/lld/test/COFF/safeseh-md.s b/lld/test/COFF/safeseh-md.s new file mode 100644 index 00000000000..ae731b5211d --- /dev/null +++ b/lld/test/COFF/safeseh-md.s @@ -0,0 +1,34 @@ +# RUN: llvm-mc -triple i686-windows-msvc %s -filetype=obj -o %t.obj +# RUN: lld-link %t.obj %S/Inputs/except_handler3.lib -safeseh -out:%t.exe -opt:noref -entry:main +# RUN: llvm-readobj -coff-load-config %t.exe | FileCheck %s + +# CHECK: SEHTable [ +# CHECK-NEXT: 0x +# CHECK-NEXT: ] + + .def @feat.00; + .scl 3; + .type 0; + .endef + .globl @feat.00 +@feat.00 = 1 + + .def _main; + .scl 2; + .type 32; + .endef + .section .text,"xr",one_only,_main + .globl _main +_main: + movl $42, %eax + ret + +.safeseh __except_handler3 + + .section .rdata,"dr" +.globl __load_config_used +__load_config_used: + .long 72 + .fill 60, 1, 0 + .long ___safe_se_handler_table + .long ___safe_se_handler_count |