SOURCES: hmake-no_spaces.patch (NEW) - patch to remove spaces and ...

Jakub Bogusz qboosh w pld-linux.org
Śro, 14 Gru 2005, 16:29:59 CET


On Wed, Dec 14, 2005 at 08:49:32AM +0100, Arkadiusz Miskiewicz wrote:
> On Wednesday 14 December 2005 00:02, Jakub Bogusz wrote:
> > PS. jak skompilować (i zlinkować potem) .c wygenerowane przez ghc -C [-O2]?
> > Można by ustalić, czy błąd powstaje na etapie hs->c, czy c->o.
> > I ew. znaleźć cokolwiek - to .c jest mało czytelne, ale i tak dużo
> > bardziej, niż powstający z tego asembler.
> 
> Bawiłem się tylko tym:
> http://www.haskell.org/ghc/docs/latest/html/users_guide/separate-compilation.html#keeping-intermediates
> 
> ghc -v bodaj pokazuje w jaki sposób odpala asemblera, może coś tam ciekawego 
> będzie widać.

Właśnie o to -v chodziło.
Wychodzi na to, że błąd jest w gcc 3.3.x na sparcu.
Kod C generowany przez ghc -O2 ujawnia błąd[1] w gcc przy -O (tak ghc
wywołuje gcc); błąd nie występuje przy gcc -O[023], ani na kodzie
C generowanym przez ghc bez optymalizacji.

[1] wykonuje się jeden "delay slot" za dużo.

Fragment kodu w C (printfy dodałem do odpluskwiania):

_s2cZ = R1.p[1];
printf("R1.p=%d\n", _s2cZ);
if (_s2cZ < 0xcU) goto _c2di;
if (_s2cZ < 0x20U) goto _c2dj;
if (_s2cZ < 0xa0U) goto _c2dk;
if (_s2cZ != 0xa0U) goto _c2dl;
printf("ret True\n");
R1.p = (P_)(W_)&GHCziBase_True_closure;
Sp=Sp+1;
JMP_(*((P_)((W_)&stg_upd_frame_info+20)));
_c2dl:
printf("ret False\n");
R1.p = (P_)(W_)&GHCziBase_False_closure;
Sp=Sp+1;
JMP_(*((P_)((W_)&stg_upd_frame_info+16)));
[...]
_c2do:
//printf("_c2do\n"); /* włączenie tego "znika" błąd */
if (_s2cZ != 0x9U) goto _c2dl;
printf("ret True\n");
R1.p = (P_)(W_)&GHCziBase_True_closure;
Sp=Sp+1;
JMP_(*((P_)((W_)&stg_upd_frame_info+20)));
_c2di:
printf("_c2di\n");
if (_s2cZ < 0xaU) goto _c2do;
if (_s2cZ < 0xbU) goto _c2dn;
if (_s2cZ != 0xbU) goto _c2dl;
printf("ret True\n");
R1.p = (P_)(W_)&GHCziBase_True_closure;
Sp=Sp+1;
JMP_(*((P_)((W_)&stg_upd_frame_info+20)));

Fragment kodu w asemblerze od _c2di:

.LL3:
        sethi   %hi(.LLC3), %o0
        call    puts, 0
        or      %o0, %lo(.LLC3), %o0
        cmp     %i0, 9
        bleu    .LL24
        cmp     %i0, 10
        bgu,a   .LL24
        cmp     %i0, 11
.LL24:
        bne,a   .LL9
        sethi   %hi(.LLC2), %o0
        sethi   %hi(.LLC1), %o0
        call    puts, 0
        or      %o0, %lo(.LLC1), %o0
        sethi   %hi(MainCapability+8), %g2
        or      %g2, %lo(MainCapability+8), %g3
        sethi   %hi(GHCziBase_True_closure), %g1
        or      %g1, %lo(GHCziBase_True_closure), %g1
        st      %g1, [%g2+%lo(MainCapability+8)]

"cmp ...,10" po "bleu .LL24" w przypadku wystąpienia skoku się wykonuje
(jako "delay slot"), a "bne,a .LL9" powinno dotyczyć poprzedniego
porównania (z 9, nie 10).


-- 
Jakub Bogusz    http://qboosh.cs.net.pl/



Więcej informacji o liście dyskusyjnej pld-devel-pl