あんどーなつさん
コメントいただきありがとうございます.
今回の環境では最低限のライブラリしかありませんので,リンクエラーは気にしないことにします.
本スレッドの目的はmainではエラーが出ないのに,testではエラーが出る原因の追究です.
あんどーなつさんのアドバイスを参考に再考しましたところ,一応結論が出ました.
sample.cとsample.sの対応を記載します.
※アセンブリの方は読む必要ないです.スキップして下のコメントに飛んでください.
sample1.c
コード:
int main(){
int i;
int three = 3;
for(i=0; i<10; i++){
int j=i/three;
}
}
int test(int n, int m){
return (n/m);
}
sample1.s
コード:
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 16
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {fp, lr}
add fp, sp, #4
sub sp, sp, #16
mov r3, #3
str r3, [fp, #-12]
mov r3, #0
str r3, [fp, #-8]
b .L2
.L3:
ldr r0, [fp, #-8]
ldr r1, [fp, #-12]
bl __aeabi_idiv ←ココ!!
mov r3, r0
str r3, [fp, #-16]
ldr r3, [fp, #-8]
add r3, r3, #1
str r3, [fp, #-8]
.L2:
ldr r3, [fp, #-8]
cmp r3, #9
ble .L3
mov r0, r3
sub sp, fp, #4
@ sp needed
ldmfd sp!, {fp, lr}
bx lr
.size main, .-main
.align 2
.global test
.type test, %function
test:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {fp, lr}
add fp, sp, #4
sub sp, sp, #8
str r0, [fp, #-8]
str r1, [fp, #-12]
ldr r0, [fp, #-8]
ldr r1, [fp, #-12]
bl __aeabi_idiv ←ココ!!
mov r3, r0
mov r0, r3
sub sp, fp, #4
@ sp needed
ldmfd sp!, {fp, lr}
bx lr
.size test, .-test
.ident "GCC: (devkitARM release 44) 4.9.2"
sample2.c
コード:
int main(){
int i;
int three = 3;
for(i=0; i<10; i++){
int j=i/3;
}
}
int test(int n, int m){
return (n/m);
}
sample2.s
コード:
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 16
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!
add fp, sp, #0
sub sp, sp, #20
mov r3, #3
str r3, [fp, #-12]
mov r3, #0
str r3, [fp, #-8]
b .L2
.L3:
ldr r3, [fp, #-8]
ldr r2, .L4
smull r1, r2, r3, r2
mov r3, r3, asr #31
rsb r3, r3, r2
str r3, [fp, #-16]
ldr r3, [fp, #-8]
add r3, r3, #1
str r3, [fp, #-8]
.L2:
ldr r3, [fp, #-8]
cmp r3, #9
ble .L3
mov r0, r3
sub sp, fp, #0
@ sp needed
ldr fp, [sp], #4
bx lr
.L5:
.align 2
.L4:
.word 1431655766
.size main, .-main
.global __aeabi_idiv
.align 2
.global test
.type test, %function
test:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {fp, lr}
add fp, sp, #4
sub sp, sp, #8
str r0, [fp, #-8]
str r1, [fp, #-12]
ldr r0, [fp, #-8]
ldr r1, [fp, #-12]
bl __aeabi_idiv ←ココ!!
mov r3, r0
mov r0, r3
sub sp, fp, #4
@ sp needed
ldmfd sp!, {fp, lr}
bx lr
.size test, .-test
.ident "GCC: (devkitARM release 44) 4.9.2"
アセンブリ言語をがんばって読みましたところ,以下のコードが問題ということがわかりました.(sample.sにコメントを入れてあります)
結論的には「変数/変数」をした場合に,コンパイラが「 bl __aeabi_idiv」の命令を作り出すようです.
「変数/数字」の場合は,「 bl __aeabi_idiv」の命令は作らず,コンパイラは別の方法で解決するようです.
あんどーなつさんのコードのvalatileを消しても,mainでエラーが出ました.
コンパイルオプションで最適化を無効にしてみましたが,効果がなかったので,
今回は最適化はあまりかんけいなかったようです.
以上です.
この疑問に対してお時間を割いていただいた方々に感謝いたします.
本当にありがとうございました.