コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2021年4月2日 >>> 2021年4月2日
link もっと後

2021年4月2日

GCCを調べる - GCC 8.3のfoldingバグ - 発生条件

目次: GCC

GCC 8.3のバグを追った記録です。来月になったら絶対に忘れて、説明できなくなるので、できる限り詳細にメモしておきたいと思います。

再現条件: コード

再現は簡単で、下記のコードをコンパイルするとinternal compile errorになります。

エラーになるコード

float cargf(float _Complex z);
float atan2f(float y, float x);

void func(float _Complex cval, float val)
{
	__builtin_cargf(cval);
	__builtin_atan2f(val, 1.0f);
}
エラーメッセージ
$ x86_64-unknown-elf-gcc -Wall -O2 -g a.c

a.c: In function 'func':
a.c:7:2: warning: statement with no effect [-Wunused-value]
  __builtin_cargf(cval);
  ^~~~~~~~~~~~~~~~~~~~~
during GIMPLE pass: forwprop
a.c:9:1: internal compiler error: tree check: expected ssa_name, have var_decl in simplify_builtin_call, at tree-ssa-forwprop.c:1246
 }
 ^
0x1331604 tree_check_failed(tree_node const*, char const*, int, char const*, ...)
        ../../gcc/tree.c:9338
0x7ca7f2 tree_check(tree_node*, char const*, int, char const*, tree_code)
        ../../gcc/tree.h:3142
0x1135fb9 simplify_builtin_call
        ../../gcc/tree-ssa-forwprop.c:1246
0x113b55f execute
        ../../gcc/tree-ssa-forwprop.c:2527
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.

再現にあたり重要なポイントは2点です。

  • carg, atan2を関数宣言する
  • carg, atan2の順に呼ぶ(単独、逆だとエラーにならない)

なぜこの2点が重要か?については、追々説明します。この条件だけで原因が「ああ、あれか」と見当がつく人は超凄いです。GCCマスターか天才ですね。この記事は一切読む必要がないです。ちなみに私は解析に1週間近く掛かりました。辛かったです……。

再現条件: コンパイラ

このエラーはディストリビューションが配布するGCC 8.3のバイナリでは発生しません。x86_64向けのGCCでも発生させるには、下記に示すように特殊なビルド条件にする必要があります。

  • Target triplet(※)のoperatingsystem = elfになっていること(ディストリビューションが配布するバイナリはlinux-gnuなので該当しない)
  • enable-checking=yesでビルドする(ディストリビューションが配布するバイナリはenable-checking=releaseのことが多いので該当しない)

(※)GNUのビルドシステムが使うシステム名の表し方です。machine-vendor-operatingsystemの順で表します。

PC向けでは特殊なビルド条件ですが、ベアメタル向けのクロスコンパイラだと、割とこの条件に当てはまるものは多いです。

ビルドコンフィグ例
$ ../configure \
  --target=x86_64-unknown-elf \
  --prefix=/path/to/gcc/build/_install \
  --disable-bootstrap \
  --disable-libsanitizer \
  --enable-checking=yes \
  --enable-languages="c,c++" \
  CFLAGS="-g -O0 -fno-inline" \
  CXXFLAGS="-g -O0 -fno-inline"

$ make -j8 all-gcc
$ make install-gcc

ビルドコンフィグの一例を示しました。disable-bootstrapはデバッグ用ビルドオプション(CFLAGS, CXXFLAGS)を指定するために使っています(詳しくは 2021年3月30日の日記参照)。disable-libsanitizerは私の環境でビルドエラーになったので、仕方なくビルド対象から外しています。enable-languagesはFortranなどの今回使わない言語を削ってビルド時間を短縮するためです。

デバッグ

デバッグする対象はおなじみcc1です。なぜcc1なのかは以前書いた(2019年5月17日の日記参照)とおりです。

デバッグの例
#### gdbでデバッグするなら

$ gdb /path/to/build/_install/libexec/gcc/x86_64-unknown-elf/8.3.0/cc1

(gdb) run -quiet a.c -mtune=generic -march=x86-64 \
  -g -O2 -Wall -std=c99 -o zzzzzzzz.s


#### gdbserverを使うなら

$ gdbserver --multi localhost:1234 \
  -quiet a.c -mtune=generic -march=x86-64 \
  -g -O2 -Wall -std=c99 -o zzzzzzzz.s

問題の再現と、GCCのコードを追う準備ができました。

編集者:すずき(2023/09/24 11:54)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2021年4月2日 >>> 2021年4月2日
link もっと後

管理用メニュー

link 記事を新規作成

<2021>
<<<04>>>
----123
45678910
11121314151617
18192021222324
252627282930-

最近のコメント5件

  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」
  • link 24年10月1日
    hdkさん (10/03 08:30)
    「おー、面白いですね。xrdpはすでに立ち...」
  • link 14年6月13日
    2048player...さん (09/26 01:04)
    「最後に、この式を出すのに紙4枚(A4)も...」

最近の記事3件

  • link 24年10月28日
    すずき (10/30 23:49)
    「[Linuxからリモートデスクトップ] 目次: Linux開発用のLinuxマシンの画面を見るにはいろいろな手段がありますが、...」
  • link 23年4月10日
    すずき (10/30 23:46)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年10月24日
    すずき (10/25 02:35)
    「[ONKYOからM-AUDIOのUSB DACへ] 目次: PCかれこれ10年以上(2013年3月16日の日記参照)活躍してく...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www2.katsuster.net
RDFファイル RSS 1.0

最終更新: 10/30 23:49