From: Joel Soete <soete.joel@tiscali.be>
To: John David Anglin <dave@hiauly1.hia.nrc.ca>,
Carlos O'Donell <carlos@baldric.uwo.ca>
Cc: parisc-linux@lists.parisc-linux.org
Subject: [parisc-linux] Re: stay the same with gcc-3.4.2 :( [was: back to glibc-2.3.3 & gcc-3.4.1 pb]
Date: Sun, 12 Sep 2004 20:21:01 +0000 [thread overview]
Message-ID: <4144AFAD.9050804@tiscali.be> (raw)
In-Reply-To: <41434248.7070009@tiscali.be>
Hello all,
Continuing investigation:
>> Hello Dave,
>>
>> John David Anglin wrote:
>>
>>>> 0x411cc740 <_dl_make_fptr+112>: ldw,s r7(,r6),ret0
>>>> in:
>>>> r7 == 0x7c4
>>>> r6 == 0x0
>>>
>>>
>>>
>>>
>>> r6 is wrong. Find out why it is zero.
>>>
>> Far from being an expert, with help of ddd it seems that:
>> ElfW(Addr)
>> _dl_make_fptr (struct link_map *map, const ElfW(Sym) *sym,
>> ElfW(Addr) ip)
>> {
>> ElfW(Addr) *ftab = map->l_mach.fptr_table; <====[2]
>>
[...]
>> the weird stuff his in fact here:
>>
>> if (__builtin_expect (ftab == NULL, 0))
>> ftab = make_fptr_table (map); <================[3]
>>
>> symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]);
>> symidx = sym - symtab; <=========================[1]
>>
>> if (symidx >= map->l_mach.fptr_table_len)
>> _dl_signal_error (0, NULL, NULL,
>> N_("internal error: symidx out of range of fptr table"));
>>
>> while (ftab[symidx] == 0) <========================[4]
Finaly it seems that two things hapened wronly in gcc-3.4 at those tags [3] & [4]:
comparing side by side the asm form of this chunk:
gcc-3.3 | gcc-3.4
======= | =======
ldw 1fc(,r26),r7 | ldw 1fc(,r26),r6 <====[2]
ftab == r7 == 0x0 | ftab == r6 == 0x0
|
copy r26,r8 |
cmpib,= 0,r7,0x412631a0 <_dl_make_fptr+252> | cmpib,= 0,r6,0x412858f4 <_dl_make_fptr+548> <====[3]'call' make_fptr_table()
r7 == 0x40001000 | r6 == 0x0
|
copy r25,r3 | copy r25,r3
ldw 30(,r8),r20 | ldw 1f8(,r26),ret1
ldw 1f8(,r8),r22 | ldw 30(,r10),r21
ldw 4(,r20),r21 | ldw 4(,r21),r20
|
r3 == 0x4026d1c4 (== sym) | r3 == 0x40037cdc (== sym);
r21 == 0x40265164 (== symtab) | r20 == 0x4003009c (== symtab)
sub r3,r21,r21 | sub r3,r20,r20 <====[1]
r21 == 0x8060 | r20 == 0x7c40
|
extrw,s r21,27,28,r21 | extrw,s r20,27,28,r7
[== r21 >> 4] | [r7 = r20 >> 4]
r21 == 0x806 | r7 == 0x7c4
|
r22 == 0x813 | ret1 (aka r29) == 0x7d1 (== map->l_mach.fptr_table_len)
(r22 == map->l_mach.fptr_table_len) | (ret1 == map->l_mach.fptr_table_len)
cmpb,<<= r22,r21,0x41263184 <_dl_make_fptr+224> | cmpb,>>=,n r7,ret1,0x412859d0 <_dl_make_fptr+768>
depw,z r21,29,30,r9 |
[r9 = r21 << 2] |
r9 == 0x2018 |
|
add,l r9,r7,r21 |
r21 == 0x40003018 |
|
ldw 0(,r21),r20 | ldw,s r7(,r6),ret0 <====[4] (i.e. ftab[symidx])
cmpib,<> 0,r20,0x41263150 <_dl_make_fptr+172> | cmpib,<> 0,ret0,0x4104aa38 <_dl_make_fptr+248>
Here I agreed that the code could be (assuming that r6 == fatb) ldw,s r7(,r6),ret0 but need at least 'depw,z r7,29,30,r7' before
[...]
ldw 2c(,r26),r21 | ldw 30(,r26),r20 <==== make_fptr_table()
ldw 30(,r26),r20 | ldw 4(,r20),r21
addil 0,r19,%r1 | addil 0,r19,%r1
copy r19,r4 | copy r1,r22
ldw 4(,r20),r22 | ldw 2c(,r26),r20
ldw 4(,r21),r26 | ldw 4(,r20),r26
ldi 3,r24 | sub r26,r21,r26
ldi 12,r23 | ldw 44(,r10),r20
ldw 44(,r8),r21 | ldw 4(,r20),r25
sub r26,r22,r26 | b,l 0x41287d60 <$$divU>,r31
ldw 654(,r1),r1 | copy r19,r4
ldw 4(,r21),r25 | ldi -1,r20
ldw 4(,r1),r20 | stw r20,-34(,sp)
ldi -1,r21 | ldi 0,r26
b,l 0x41265570 <$$divU>,r31 | ldw 638(,r22),r20
sub r0,r20,r22 | ldw 4(,r20),r25
stw r21,-34(,sp) | depw,z ret1,29,30,r5
ldi 0,r26 | ldi 3,r24
depw,z ret1,29,30,r5 | sub r0,r25,r20
stw r0,-38(,sp) | copy ret1,r6
copy ret1,r6 | stw r0,-38(,sp)
add,l r5,r20,r20 | add,l r5,r25,r25
add,l r20,r21,r20 | ldi 12,r23
and r20,r22,r20 | ldo -1(r25),r25
b,l 0x412641bc <__mmap>,rp | b,l 0x412869a8 <__mmap>,rp
copy r20,r25 | and r25,r20,r25
copy r4,r19 | copy r4,r19
cmpib,= -1,ret0,0x4126323c <_dl_make_fptr+408> | cmpib,= -1,ret0,0x412859e0 <_dl_make_fptr+784>
copy ret0,r26 | copy ret0,r26
| (ret0 == 0x40001000)
ldw 1fc(,r8),r20 | ldw 1fc(,r10),r20
cmpib,<>,n 0,r20,0x4126322c <_dl_make_fptr+392> | cmpib,<>,n 0,r20,0x412859a0 <_dl_make_fptr+720>
| copy r6,ret1
| (ret1 == 0x815)
stw ret0,1fc(,r8) (a) | stw r6,1f8(,r10) (d)
stw r6,1f8(,r8) (b) | ldw 1fc(,r10),r6 (e) <==== ????
b,l 0x412630e0 <_dl_make_fptr+60>,r0 | b,l 0x4128572c <_dl_make_fptr+92>,r0
ldw 1fc(,r8),r7 (c) | stw ret0,1fc(,r10) (f) <==== make_fptr_table()'s return
hmmm here I have the feeling that (d) (e) and (f) were wrongly re-ordered;
if they have the similar order as (f) (d) and (e), r6 == ftab would be loaded by the right value 0x40001000?
That said I didn't reach to produce a test case reporducing that fact :(
Do you think that if I transmit those explanations (may be a bit completed for gcc-3.3 example) with the precompile (-E) code, it
could be enough to fill in a br near gcc team?
TIA,
Joel
_______________________________________________
parisc-linux mailing list
parisc-linux@lists.parisc-linux.org
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux
prev parent reply other threads:[~2004-09-12 20:21 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <413B3845.1050302@tiscali.be>
[not found] ` <200409060239.i862dAh2001466@hiauly1.hia.nrc.ca>
2004-09-06 19:58 ` [parisc-linux] Re: back to glibc-2.3.3 & gcc-3.4.1 pb Carlos O'Donell
2004-09-06 21:49 ` Joel Soete
2004-09-11 18:22 ` [parisc-linux] stay the same with gcc-3.4.2 :( [was: back to glibc-2.3.3 & gcc-3.4.1 pb] Joel Soete
2004-09-12 20:21 ` Joel Soete [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4144AFAD.9050804@tiscali.be \
--to=soete.joel@tiscali.be \
--cc=carlos@baldric.uwo.ca \
--cc=dave@hiauly1.hia.nrc.ca \
--cc=parisc-linux@lists.parisc-linux.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.