summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-12-22 22:10:08 +0000
committerReid Kleckner <reid@kleckner.net>2014-12-22 22:10:08 +0000
commit5aabc06c16391fda6424f99fd9a0dad74b1187b4 (patch)
tree7077ada7c7f63bb329cc04ddce484316a9dca42d /llvm/test
parentb430f6e17a2734013ec01da56072d789b9412036 (diff)
downloadbcm5719-llvm-5aabc06c16391fda6424f99fd9a0dad74b1187b4.tar.gz
bcm5719-llvm-5aabc06c16391fda6424f99fd9a0dad74b1187b4.zip
Fix Windows unwind info for functions in sections other than .text
Previously we assumed the section name had the form .text$foo, which is what we used to do for inline functions. If the dollar wasn't present, we'd put unwind data in the .pdata and .xdata sections for the main .text section, which is incorrect. Fixes PR22001. llvm-svn: 224738
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/MC/COFF/seh-section.s74
1 files changed, 72 insertions, 2 deletions
diff --git a/llvm/test/MC/COFF/seh-section.s b/llvm/test/MC/COFF/seh-section.s
index 026c0d73348..c95eece800b 100644
--- a/llvm/test/MC/COFF/seh-section.s
+++ b/llvm/test/MC/COFF/seh-section.s
@@ -1,5 +1,7 @@
-// This test ensures that, if the section containing a function has a suffix
-// (e.g. .text$foo), its unwind info section also has a suffix (.xdata$foo).
+// This test ensures functions in custom sections get unwind info emitted in a
+// distinct .xdata section. Ideally we'd just emit a second .xdata section with
+// the same name and characteristics, but MC uniques sections by name and
+// characteristics, so that is not possible.
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s | llvm-readobj -s -sd | FileCheck %s
// CHECK: Name: .xdata$foo
@@ -20,6 +22,44 @@
// CHECK-NEXT: 0000: 01050200 05500402
// CHECK-NEXT: )
+// CHECK: Name: .xdata$.mytext
+// CHECK-NEXT: VirtualSize
+// CHECK-NEXT: VirtualAddress
+// CHECK-NEXT: RawDataSize: 8
+// CHECK-NEXT: PointerToRawData
+// CHECK-NEXT: PointerToRelocations
+// CHECK-NEXT: PointerToLineNumbers
+// CHECK-NEXT: RelocationCount: 0
+// CHECK-NEXT: LineNumberCount: 0
+// CHECK-NEXT: Characteristics [
+// CHECK-NEXT: IMAGE_SCN_ALIGN_4BYTES
+// CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
+// CHECK-NEXT: IMAGE_SCN_MEM_READ
+// CHECK-NEXT: ]
+// CHECK-NEXT: SectionData (
+// CHECK-NEXT: 0000: 01050200 05500402
+// CHECK-NEXT: )
+
+// CHECK: Name: .xdata
+// CHECK-NEXT: VirtualSize
+// CHECK-NEXT: VirtualAddress
+// CHECK-NEXT: RawDataSize: 8
+// CHECK-NEXT: PointerToRawData
+// CHECK-NEXT: PointerToRelocations
+// CHECK-NEXT: PointerToLineNumbers
+// CHECK-NEXT: RelocationCount: 0
+// CHECK-NEXT: LineNumberCount: 0
+// CHECK-NEXT: Characteristics [
+// CHECK-NEXT: IMAGE_SCN_ALIGN_4BYTES
+// CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
+// CHECK-NEXT: IMAGE_SCN_MEM_READ
+// CHECK-NEXT: ]
+// CHECK-NEXT: SectionData (
+// CHECK-NEXT: 0000: 01050200 05500402
+// CHECK-NEXT: )
+
+
+
.section .text$foo,"x"
.globl foo
.def foo; .scl 2; .type 32; .endef
@@ -35,3 +75,33 @@ foo:
ret
.seh_endproc
+ .section .mytext,"x"
+ .globl bar
+ .def bar; .scl 2; .type 32; .endef
+ .seh_proc bar
+bar:
+ subq $8, %rsp
+ .seh_stackalloc 8
+ pushq %rbp
+ .seh_pushreg %rbp
+ .seh_endprologue
+ popq %rbp
+ addq $8, %rsp
+ ret
+ .seh_endproc
+
+ .section .text
+ .globl baz
+ .def baz; .scl 2; .type 32; .endef
+ .seh_proc baz
+baz:
+ subq $8, %rsp
+ .seh_stackalloc 8
+ pushq %rbp
+ .seh_pushreg %rbp
+ .seh_endprologue
+ popq %rbp
+ addq $8, %rsp
+ ret
+ .seh_endproc
+
OpenPOWER on IntegriCloud