[GHC] #8974: 64 bit windows executable built with ghc-7.9.20140405+LLVM segfaults
GHC
ghc-devs at haskell.org
Mon Apr 21 11:43:32 UTC 2014
#8974: 64 bit windows executable built with ghc-7.9.20140405+LLVM segfaults
------------------------------------+----------------------------------
Reporter: awson | Owner:
Type: bug | Status: new
Priority: high | Milestone: 7.8.3
Component: Compiler (LLVM) | Version: 7.9
Resolution: | Keywords:
Operating System: Windows | Architecture: x86_64 (amd64)
Type of failure: Runtime crash | Difficulty: Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets:
------------------------------------+----------------------------------
Comment (by awson):
Well, I've found the source of this bug. It turned out, windows does not
like 64-bit offsets, perhaps, this is PE32+'s painful legacy.
Here is the difference between segfaulting and working (manually created)
code:
{{{
--- T8947.s 2014-04-21 14:02:47.240488500 +0400
+++ T8947m.s 2014-04-21 15:22:41.951320900 +0400
@@ -85,7 +85,8 @@
.globl T8947_t1_info_itable # @T8947_t1_info_itable
.align 8
T8947_t1_info_itable:
- .quad S1i6_srt-T8947_t1_info
+ .long S1i6_srt-T8947_t1_info
+ .long 0
.quad 4294967299 # 0x100000003
.quad 0 # 0x0
.quad 64424509455 # 0xf0000000f
@@ -145,7 +146,8 @@
.text
.align 8 # @c1hV_info_itable
c1hV_info_itable:
- .quad S1i6_srt-c1hV_info
+ .long S1i6_srt-c1hV_info
+ .long 0
.quad 0 # 0x0
.quad 47244640288 # 0xb00000020
@@ -167,7 +169,8 @@
.globl T8947_t8947_info_itable # @T8947_t8947_info_itable
.align 8
T8947_t8947_info_itable:
- .quad (S1i6_srt-T8947_t8947_info)+16
+ .long (S1i6_srt-T8947_t8947_info)+16
+ .long 0
.quad 4294967299 # 0x100000003
.quad 0 # 0x0
.quad 4294967311 # 0x10000000f
}}}
Bad data are generated by the following llvm code:
{{{
...
@T8947_t1_info_itable = constant %T8947_t1_entry_struct<{i64 add (i64 sub
(i64 ptrtoint (i8* @S1i6_srt$alias to i64),i64 ptrtoint (void (i64*, i64*,
i64*, i64, i64, i64, i64, i64, i64, i64)* @T8947_t1_info to i64)),i64 0),
i64 4294967299, i64 0, i64 64424509455}>, section "X98A__STRIP,__me3",
align 8
...
@c1hV_info_itable = internal constant %c1hV_entry_struct<{i64 add (i64 sub
(i64 ptrtoint (i8* @S1i6_srt$alias to i64),i64 ptrtoint (void (i64*, i64*,
i64*, i64, i64, i64, i64, i64, i64, i64)* @c1hV_info to i64)),i64 0), i64
0, i64 47244640288}>, section "X98A__STRIP,__me5", align 8
...
@T8947_t8947_info_itable = constant %T8947_t8947_entry_struct<{i64 add
(i64 sub (i64 ptrtoint (i8* @S1i6_srt$alias to i64),i64 ptrtoint (void
(i64*, i64*, i64*, i64, i64, i64, i64, i64, i64, i64)* @T8947_t8947_info
to i64)),i64 16), i64 4294967299, i64 0, i64 4294967311}>, section
"X98A__STRIP,__me7", align 8
...
}}}
But don't quite understand where in the GHC code shall I intervene
precisely to fix it.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8974#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list