From: Bob Haarman Date: Thu, 16 Nov 2017 01:22:01 +0000 (+0000) Subject: [coff] correctly emit safeseh entries for handlers defined in dlls X-Git-Tag: llvmorg-6.0.0-rc1~3279 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fe059c782fbd264ca5807e7823016ddbd3801db6;p=platform%2Fupstream%2Fllvm.git [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 --- 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 0000000..fdc51ed Binary files /dev/null and b/lld/test/COFF/Inputs/except_handler3.lib differ diff --git a/lld/test/COFF/safeseh-md.s b/lld/test/COFF/safeseh-md.s new file mode 100644 index 0000000..ae731b5 --- /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