1
    次のコードは、linux-x86、darwin-x86 では正常に動作しますが、ios-armv7 では動作しません。

    正しい出力は次のようになります。
        m[0]: 0.500000、v: 0.500000
        m[1]: 0.500000、v: 0.500000
        m[2]: 0.500000、v: 0.500000
        m[3]: 0.500000、v: 0.500000
        m[4]: 0.500000、v: 0.500000

    しかし、間違った出力が見つかりました:
        m[0]: 0.500000、v: 0.500000
        m[1]: 0.500000、v: 0.000000
        m[2]: 0.500000、v: 0.000000
        m[3]: 0.500000、v: 0.000000
        m[4]: 0.500000、v: 0.000000

    また、ios-armv7 用にビルドされたときの状況もわかりました。

    [a] 関数「func」を削除し、関数本体を「main」関数に移動すると、正常に動作します
    [b] 配列 'm[5]' を 'double m[5]' として宣言すると、正常に動作します
    [c] 変数 'v' を 'v = 0.5 または v = sqrt(2.0f/8)' に設定すると、問題なく動作します
    [d] gcc 最適化オプションが「-O0」の場合は正常に動作しますが、「-O1 または -O2」の場合は間違った出力が発生します。


    私の iPad1 はクラックされたので、MacBook Air で実行可能ファイルをクロスコンパイルし、その実行可能ファイルを iPad1 に「scp」して実行できます。詳細は次のとおりです。

    1. Mac で実行可能ファイルをクロスコンパイルします。
    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc -O1 -Wall -arch armv7 -mcpu=cortex-a8 -isysroot /Applications/Xcode.app/Contents/ Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include - D__IPHONE_OS__ -miphoneos-version-min=4.0 foo.c

    2.実行可能ファイルをiPadに「scp」します
    scp a.out mobile@192.168.1.106:~

    3.iPadに「ssh」
    ssh mobile@192.168.1.106 #デフォルトのパスワードは「alpine」

    4. iPad で a.out を実行する
    ./a.out
#include <stdio.h>
#include <math.h>

int
func(int n) /* [a] */
{
    int i;
    float m[5]; /* [b] */
    double v;

    v = sqrt(2.0f/n); /* [c] */

    for(i=0;i<5;++i) {
        m[i]=v;
        printf("m[%d]: %f, v: %f\n", i, m[i], v);
    }

    return 0;
}


int
main(int argc, char **argv)
{
    return func(8);
}

https://gist.github.com/ashun/5992120でもコード全体を見つけることができます

以下が組み立てです。コマンド「vim -d」の助けを借りて違いを見つけることができます

  1. 前のコードのアセンブリでは、配列 'm[5]' を 'double m[5]' として宣言します。
        .section __TEXT,__text,regular,pure_instructions
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
        .section __TEXT,__const_coal,coalesced
        .section __TEXT,__picsymbolstub4,symbol_stubs,none,16
        .section __TEXT,__StaticInit,regular,pure_instructions
        .syntax 統一
        .section __TEXT,__text,regular,pure_instructions
        .globl _func
        .align 2
        .コード 16
        .thumb_func _func
    _関数:
        push {r4, r5, r6, r7, lr}
        r7、sp、#12 を追加
        str r8, [sp, #-4]!
        サブ sp #8
        vmov.f32 s0、#2.000000e+00
        movw r8, :lower16:(L_.str-(LPC0_0+4))
        vmov s2、r0
        movt r8, :upper16:(L_.str-(LPC0_0+4))
        vcvt.f32.s32 d1、d1
    LPC0_0:
        r8、pcを追加
        movs r4、#0
        vdiv.f32 s0、s0、s2
        vsqrt.f32 s0、s0
        vcvt.f64.f32 d16、s0
        vmov r5、r6、d16
    LBB0_1:
        移動r1、r4
        移動r0、r8
        移動r2、r5
        移動r3、r6
        vstr.64 d16、[sp]
        r4、#1 を追加
        blx_printf
        cmp r4、#5
        bne LBB0_1
        移動 r0、#0
        spを追加、#8
        ldr r8、[sp]、#4
        ポップ{r4、r5、r6、r7、pc}

        .globl _main
        .align 2
        .コード 16
        .thumb_func _main
    _主要:
        {r7, lr} を押す
        mov r7、sp
        movs r0、#8
        bl_func
        移動 r0、#0
        ポップ{r7、pc}

        .section __TEXT,__cstring,cstring_literals
    L_.str:
        .asciz "m[%d]: %f, v: %f\n"


    .subsections_via_symbols
  1. 前のコードのアセンブリでは、配列 'm[5]' を 'double m[5]' として宣言します。
        .section __TEXT,__text,regular,pure_instructions
        .section __TEXT,__textcoal_nt,coalesced,pure_instructions
        .section __TEXT,__const_coal,coalesced
        .section __TEXT,__picsymbolstub4,symbol_stubs,none,16
        .section __TEXT,__StaticInit,regular,pure_instructions
        .syntax 統一
        .section __TEXT,__text,regular,pure_instructions
        .globl _func
        .align 2
        .コード 16
        .thumb_func _func
    _関数:
        push {r4, r5, r6, r7, lr}
        r7、sp、#12 を追加
        str r8, [sp, #-4]!
        **vpush {d8}**
        サブ sp #8
        vmov.f32 s0、#2.000000e+00
        movw r8, :lower16:(L_.str-(LPC0_0+4))
        vmov s2、r0
        movt r8, :upper16:(L_.str-(LPC0_0+4))
        vcvt.f32.s32 d1、d1
    LPC0_0:
        r8、pcを追加
        movs r4、#0
        vdiv.f32 s0、s0、s2
        vcvt.f64.f32 d16、s0
        vsqrt.f64 d8、d16
        vmov r5、r6、d8
    LBB0_1:
        移動r1、r4
        移動r0、r8
        移動r2、r5
        移動r3、r6
        vstr.64 d8、[sp]
        r4、#1 を追加
        blx_printf
        cmp r4、#5
        bne LBB0_1
        移動 r0、#0
        spを追加、#8
        vpop {d8}
        ldr r8、[sp]、#4
        ポップ{r4、r5、r6、r7、pc}

        .globl _main
        .align 2
        .コード 16
        .thumb_func _main
    _主要:
        {r7, lr} を押す
        mov r7、sp
        movs r0、#8
        bl_func
        移動 r0、#0
        ポップ{r7、pc}

        .section __TEXT,__cstring,cstring_literals
    L_.str:
        .asciz "m[%d]: %f, v: %f\n"


    .subsections_via_symbols
4

1 に答える 1