893 – The profile flag no longer seems to work on Linux x86 64

D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 893 - The profile flag no longer seems to work on Linux x86 64
Summary: The profile flag no longer seems to work on Linux x86 64
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: x86 Linux
: P2 normal
Assignee: Walter Bright
URL:
Keywords: wrong-code
Depends on:
Blocks:
Reported: 2007年01月26日 20:37 UTC by Kevin Bealer
Modified: 2014年02月16日 15:25 UTC (History)
0 users

See Also:


Attachments
Add an attachment (proposed patch, testcase, etc.)

Note You need to log in before you can comment on or make changes to this issue.
Description Kevin Bealer 2007年01月26日 20:37:24 UTC
The -profile flag no longer works for me. I am compiling under 64 bit linux on a dual core machine (the binaries are 32 bit of course). This is broken on 1.0 and 1.003 at least.
If I look at it in gdb, I see this as the crash point.
0x0804a365 in _D6object6Object5opCmpMFC6ObjectZi ()
The insns at this point (I replace the mangled name from each line with "function" to make it easier to read, look for the line marked with <<<.
Dump of assembler code for function _D6object6Object5opCmpMFC6ObjectZi:
0x0804a344 <function+0>: push %ebp
0x0804a345 <function+1>: mov %esp,%ebp
0x0804a347 <function+3>: sub 0ドルxc,%esp
0x0804a34a <function+6>: push %ebx
0x0804a34b <function+7>: push %esi
0x0804a34c <function+8>: mov %eax,0xfffffff8(%ebp)
0x0804a34f <function+11>: mov 0ドルx805e790,%ecx
0x0804a354 <function+16>: push %ecx
0x0804a355 <function+17>: call 0x80555e8 <_d_newclass>
0x0804a35a <function+22>: add 0ドルx4,%esp
0x0804a35d <function+25>: mov %eax,0xfffffffc(%ebp)
0x0804a360 <function+28>: push 0ドルx1
0x0804a362 <function+30>: mov 0xfffffff8(%ebp),%edx
0x0804a365 <function+33>: <<< mov (%edx),%ebx
0x0804a367 <function+35>: mov (%ebx),%esi
0x0804a369 <function+37>: pushl 0x14(%esi)
0x0804a36c <function+40>: pushl 0x10(%esi)
0x0804a36f <function+43>: pushl 0x805afd6
0x0804a375 <function+49>: pushl 0x805afd2
0x0804a37b <function+55>: call 0x80561c4 <_d_arraycat>
0x0804a380 <function+60>: add 0ドルx14,%esp
0x0804a383 <function+63>: push %edx
0x0804a384 <function+64>: push %eax
0x0804a385 <function+65>: mov 0xfffffffc(%ebp),%eax
0x0804a388 <function+68>: call 0x804b404 <_D6object5Error5_ctorMFAaZC6object5Error>
0x0804a38d <function+73>: push %eax
0x0804a38e <function+74>: call 0x8057f5c <_d_throw@4>
0x0804a393 <function+79>: pop %esi
0x0804a394 <function+80>: pop %ebx
0x0804a395 <function+81>: mov %ebp,%esp
0x0804a397 <function+83>: pop %ebp
0x0804a398 <function+84>: ret 0ドルx4
0x0804a39b <function+87>: nop
End of assembler dump.
(gdb) info reg
eax 0x556e4fe0 1433292768
ecx 0x0 0
edx 0x18 24
ebx 0x1 1
esp 0xffffd0fc 0xffffd0fc
ebp 0xffffd114 0xffffd114
esi 0x1 1
edi 0x1 1
eip 0x804a365 0x804a365 <_D6object6Object5opCmpMFC6ObjectZi+33>
eflags 0x10296 66198
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
Just for completeness:
//hello.d
import std.stdio;
int main(char[][] x)
{
 writefln("hello.");
 return 0;
}
$ dmd -ofhello hello.d
$ ./hello
hello.
$ dmd -ofhello hello.d -profile
$ ./hello
Segmentation fault
Comment 1 Henning Hasemann 2007年02月05日 08:24:07 UTC
I could reproduce this on a Turion64 X2 (x86_64 dual core), running completely in 32 Bit mode.
Interestingly the segfault occures in main (not _Dmain) when you have just an empty main function:
$ cat proftst.d 
void main() {
}
$ dmd ./proftst.d
gcc proftst.o -o proftst -m32 -lphobos -lpthread -lm 
$ ./proftst
$
$ dmd -profile ./proftst.d
gcc proftst.o -o proftst -m32 -lphobos -lpthread -lm
$ ./proftst
Segmentation fault
$
With GDB:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1210202432 (LWP 3357)]
0x0804a333 in main ()
(gdb) info reg
eax 0x9 9
ecx 0x1 1
edx 0xfefeff00 -16843008
ebx 0x1 1
esp 0xbfa48ba8 0xbfa48ba8
ebp 0xbfa48ba8 0xbfa48ba8
esi 0x1 1
edi 0x1 1
eip 0x804a333 0x804a333 <main+87>
eflags 0x10216 [ PF AF IF RF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
(gdb) 
Critical row is marked below with ">>>":
Disassembly of section .gnu.linkonce.tmain:
0804a2dc <main>:
 804a2dc: 55 push %ebp
 804a2dd: 8b ec mov %esp,%ebp
 804a2df: 83 ec 14 sub 0ドルx14,%esp
 804a2e2: 53 push %ebx
 804a2e3: 56 push %esi
 804a2e4: 57 push %edi
 804a2e5: 8b 7d 08 mov 0x8(%ebp),%edi
 804a2e8: 8b 5d 0c mov 0xc(%ebp),%ebx
 804a2eb: c7 45 f4 00 00 00 00 movl 0ドルx0,0xfffffff4(%ebp)
 804a2f2: e8 dd fb ff ff call 8049ed4 <_STI_monitor_staticctor>
 804a2f7: e8 3c fb ff ff call 8049e38 <_STI_critical_init>
 804a2fc: e8 53 95 00 00 call 8053854 <gc_init>
 804a301: 8b cf mov %edi,%ecx
 804a303: c1 e1 03 shl 0ドルx3,%ecx
 804a306: 51 push %ecx
 804a307: e8 28 f3 ff ff call 8049634 <malloc@plt>
 804a30c: 89 45 f0 mov %eax,0xfffffff0(%ebp)
 804a30f: 83 c4 04 add 0ドルx4,%esp
 804a312: 80 3d 40 1e 06 08 00 cmpb 0ドルx0,0x8061e40
 804a319: 74 4b je 804a366 <main+0x8a>
 804a31b: e8 0c 01 00 00 call 804a42c <_moduleCtor>
 804a320: e8 cf 02 00 00 call 804a5f4 <_moduleUnitTests>
 804a325: 31 f6 xor %esi,%esi
 804a327: 85 ff test %edi,%edi
 804a329: 7e 1d jle 804a348 <main+0x6c>
 804a32b: ff 34 b3 pushl (%ebx,%esi,4)
 804a32e: e8 11 f4 ff ff call 8049744 <strlen@plt>
 804a333: >>> 8b 14 b3 mov (%ebx,%esi,4),%edx
 804a336: 8b 4d f0 mov 0xfffffff0(%ebp),%ecx
 804a339: 89 04 f1 mov %eax,(%ecx,%esi,8)
 804a33c: 89 54 f1 04 mov %edx,0x4(%ecx,%esi,8)
 804a340: 46 inc %esi
 804a341: 83 c4 04 add 0ドルx4,%esp
 804a344: 39 fe cmp %edi,%esi
 804a346: 7c e3 jl 804a32b <main+0x4f>
Comment 2 Walter Bright 2007年02月12日 03:42:19 UTC
Fixed DMD 1.005


AltStyle によって変換されたページ (->オリジナル) /