[coff] correctly emit safeseh entries for handlers defined in dlls
authorBob Haarman <llvm@inglorion.net>
Thu, 16 Nov 2017 01:22:01 +0000 (01:22 +0000)
committerBob Haarman <llvm@inglorion.net>
Thu, 16 Nov 2017 01:22:01 +0000 (01:22 +0000)
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
lld/test/COFF/Inputs/except_handler3.lib [new file with mode: 0644]
lld/test/COFF/safeseh-md.s [new file with mode: 0644]

index b398bb6..126a497 100644 (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));
     }
   }
 
diff --git a/lld/test/COFF/Inputs/except_handler3.lib b/lld/test/COFF/Inputs/except_handler3.lib
new file mode 100644 (file)
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 (file)
index 0000000..ae731b5
--- /dev/null
@@ -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