summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Haarman <llvm@inglorion.net>2017-11-16 01:22:01 +0000
committerBob Haarman <llvm@inglorion.net>2017-11-16 01:22:01 +0000
commitfe059c782fbd264ca5807e7823016ddbd3801db6 (patch)
tree0fa5911db532030bbe237a82b9b3dd3fec7dd6a6
parent847a77ffb38dd1ec3ea101dca85afad7efc208fd (diff)
downloadbcm5719-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.cpp8
-rw-r--r--lld/test/COFF/Inputs/except_handler3.libbin0 -> 1364 bytes
-rw-r--r--lld/test/COFF/safeseh-md.s34
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
new file mode 100644
index 00000000000..fdc51ed7328
--- /dev/null
+++ b/lld/test/COFF/Inputs/except_handler3.lib
Binary files differ
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
OpenPOWER on IntegriCloud