ターゲットのコンパイルオプションに-fomit-frame-pointerをつけて
やってみたら、またもや、ビルドがコケた。
../../../../../../gcc-4.7.2/libstdc++-v3/libsupc++/pmem_type_info.cc:47:1: エラー: 認識できない命令:
(insn 96 9 97 2 (parallel [
(set/f (mem:SI (plus:SI (reg/f:SI 7 sp)
(const_int -4 [0xfffffffffffffffc])) [0 S4 A32])
(reg:SI 5 r5))
(set/f (mem:SI (plus:SI (reg/f:SI 7 sp)
(const_int -8 [0xfffffffffffffff8])) [0 S4 A32])
(reg:SI 6 r6))
(set/f (reg/f:SI 7 sp)
(plus:SI (reg/f:SI 7 sp)
(const_int -8 [0xfffffffffffffff8])))
]) ../../../../../../gcc-4.7.2/libstdc++-v3/libsupc++/pmem_type_info.cc:37 -1
(expr_list:REG_DEAD (reg:SI 6 r6)
(expr_list:REG_DEAD (reg:SI 5 r5)
(nil))))
../../../../../../gcc-4.7.2/libstdc++-v3/libsupc++/pmem_type_info.cc:47:1: コンパイラ内部エラー: extract_insn 内、位置 recog.c:2123
完全なバグ報告を送って下さい。
適切ならば前処理後のソースをつけてください。
<http://gcc.gnu.org/bugs.html> を見れば方法が書いてあります。
バグ報告してね、って書いてあるけど、ここは自力で何とかしてみましょう。
スタックにレジスタの退避をしてるようなので
(define_insn "*stm_h8300s"
[(set (mem:SI (plus:SI (reg:SI SP_REG)
(const_int -4)))
(reg:SI 5))
(set (mem:SI (plus:SI (reg:SI SP_REG)
(const_int -8)))
(reg:SI 6))
(set (reg:SI SP_REG)
(plus:SI (reg:SI SP_REG)
(const_int -8)))]
"TARGET_H8300S"
"mov.l\ter5,@-er7\n\tmov.l\ter6,@-er7\t!gcc push bug"
[(set_attr "cc" "none")
(set_attr "length" "4")])
これをgcc/config/h8300/h8300.mdにスタック操作している場所に突っ込んでみました。
これで合ってるのかはわかりませんが、アセブンルリストを眺めた限りでは大丈夫そうでした。
(この修正は前に作ったものなのです。)
と思って、よくよくソースを見直してたら、間違いらしきところを見つけました。
gcc/config/h8300/h8300.c
--- h8300.c.push_bug 2012-08-06 23:34:27.000000000 +0900
+++ h8300.c 2012-12-16 21:55:57.345816636 +0900
@@ -817,15 +817,14 @@ h8300_expand_prologue (void)
if (TARGET_H8300S)
{
/* See how many registers we can push at the same time. */
- if ((!TARGET_H8300SX || (regno & 3) == 0)
+ if ((TARGET_H8300SX || (regno & 3) == 0)
&& ((saved_regs >> regno) & 0x0f) == 0x0f)
n_regs = 4;
- else if ((!TARGET_H8300SX || (regno & 3) == 0)
+ else if ((TARGET_H8300SX || (regno & 3) == 0)
&& ((saved_regs >> regno) & 0x07) == 0x07)
n_regs = 3;
-
- else if ((!TARGET_H8300SX || (regno & 1) == 0)
+ else if ((TARGET_H8300SX || (regno & 1) == 0)
&& ((saved_regs >> regno) & 0x03) == 0x03)
n_regs = 2;
}
!TARGET_8300SXの!が余計だったという。逆のことをやってるところでは!はついていないので大丈夫だったようです。
[0回]
PR