[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
This commit is contained in:
Bob Haarman 2017-11-16 01:22:01 +00:00
parent 847a77ffb3
commit fe059c782f
3 changed files with 37 additions and 5 deletions

View File

@ -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));
}
}

Binary file not shown.

View File

@ -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