CubeSuite アップデート情報
CA850
V3.45 からV3.47 の変更点
マクロ識別子数の上限拡張
マクロ識別子数の上限を拡張しました。Ver.3.45 以下では32,767 まで指定可能でしたが,V3.47 では999,999 まで指定可能です。
マクロ識別子数の上限は,CA850オプション”-Xmnum” のnum にて指定します。このオプションを省略した場合,2,047 とします。
制限事項の解除
以下の2件の制限事項を解除しました。
- No. 111 キャストを伴う比較演算が不正に最適化される制限
-
【内 容】
下記の1.~5. の条件を全て満たす場合に,1.の比較演算を不正に最適化します。
【条件】
1. 整数型同士の比較演算(<, <=, >, >=, ==, !=)を行っている
2. 比較の一方が下記のいずれかのキャストを行っている
・signed char -> unsigned char
・signed char -> unsigned short
・unsigned char -> signed char
・signed short -> unsigned short
・unsigned short -> signed short
・unsigend short -> signed char
3. キャスト後の型が,比較のもう一方の型に等しい
4. キャストを行っていないもう一方が,最適化の影響で定数として扱われる
5. 4.の定数と2.のキャストを無効とした場合の1.の比較が,常に真または偽となる
- No. 112 代入文に対する不正移動の制限
-
【内 容】
下記の1.~2. の条件を全て満たす場合に,基本ブロック1内の変数Xへの代入文を,基本ブロック2内の変数Xへの代入文の後に不正に移動します。
【条件】
1. 最適化レベルとして"-Og" "-O" "-Os" "-Ot"のいずれかを指定している
2. 関数の制御フローが(a)~(e)のような基本ブロックから構成される
(a) volatile指定されていない自動変数,あるいはvolatile指定されていない引数Xに対して,
基本ブロック1と基本ブロック2で値を代入し,基本ブロック3で参照する
(b) 基本ブロック2のXへの代入値は,volatile指定された変数式,あるいは周辺I/Oレジスタ名を使用した式である
(c) 基本ブロック2に合流するのは,基本ブロック1に限定される
(d) 基本ブロック2の後に,基本ブロック3に合流するパスと合流しないパスが存在する
(e) 基本ブロック1から基本ブロック3の間にXへの間接アクセスが無い
(注意) 「基本ブロック」とは,一つの入り口(すなわち、内部のコードが他のコードの分岐先になっていない)と一つの出口を持ち、内部に分岐を含まないコードを指します。
V3.43 からV3.45 の変更点
警告メッセージW3029, W3030, W3031 抑制アセンブラオプションの追加
警告メッセージ W3029, W3030, W3031 の出力を抑制するアセンブラオプション“-woff=string”を追加しました。string には3029,3030,3031 のいずれかが指定できます。string は省略できません。
V3.41 からV3.43 の変更点
V850ES コア mul,mulu 命令の制限事項への対応
V850ES コア mul,mulu 命令の制限事項に対応しました。制限事項に該当する可能性がある場合,下記のいずれかのワーニングメッセージを出力します。
W3029: can not use r0 as destination in mul/mulu in V850ES core. replaced to r1.
W3030: can not use r0 as destination in mul/mulu in V850ES core.
W3031: can not use mul/mulu X,Y,Y format in V850ES core.
V3.31 からV3.41 の変更点
制限事項の解除
以下の7件の制限事項を解除しました。
- No. 104 ループの実行回数が不正になる制限
-
【内 容】
下記の1~5の条件を全て満たす場合に,ループの実行回数が不正になる場合があります。
【条件】
1. 最適化オプションとして"-Og" "-O" "-Os" "-Ot"のいずれかを指定している
2. 帰納変数がvolatile未指定である
3. ループの終了条件が帰納変数と定数との比較である
4. ループ内で帰納変数に対して定数の加減算を行っている
5. ループ内で帰納変数を(ア)または(イ)のように使用している
(ア) a.からe.の全てを満たす
a. 帰納変数を配列のインデックスとして使用
b. a.の配列の要素が構造体・共用体・配列のいずれか
c. a.の配列の要素サイズが2のべき乗以外
d. a.の配列の要素サイズが65534バイトの範囲内
e. ループの終了条件として指定している3. の定数とa. の配列の要素サイズの積が32bit整数を超過
(イ) f.からi.の全てを満たす
f. 帰納変数を定数との乗算の一方のみに使用
g. f.の定数が2のべき乗以外
h. f.の定数が-65534~65534の範囲内
i. ループの終了条件として指定している3. の定数とf. の定数との積が32bit整数を超過
(注意) 帰納変数とは,ループの終了条件を制御する変数です。
- No. 105 文字列定数の内容が不正になる制限
-
【内 容】
下記の1. ~ 2. の条件を全て満たす場合,文字列定数の内容が不正になります。
【条件】
1. 文字列定数中に ASCIIコードの 0x00 を使用している
2. 1.に対してASCIIコードの 0x30~0x37 のいずれかが連続する
- No. 106 sscanf,fscanf,scanf 関数の型指定に関する制限
-
【内 容】
下記の1.~3.の条件を全て満たす場合,3.の型指定に対応する引数の内容が書き換わります。
【条件】
1. sscanf,fscanf,scanf 関数のいずれかを使用している
2. 型指定の数より入力フィールドが少ない
3. 余った最初の型指定文字がs,e,f,g,E,F,G,[ ] のいずれかである
また下記の4.~5.の条件を全て満たす場合,5.の型指定に対応する引数の内容が書き換わります。
【 条 件 】
4. sscanf, fscanf, scanf 関数のいずれかを使用している
5. 型指定文字として[ ] を使用し,[ ]で囲まれた文字パターンが入力フィールドにない
- No. 107 atoi,atol,strtol,strtoul 関数の引数文字列に関する制限
-
【内 容】
下記の1.~5.の条件を全て満たす場合,戻り値が不正になります。またstrtol,strtoul 関数の場合は,グローバル変数errno にマクロ ERANGE が設定されません。
【条件】
1. atoi,atol,strtol,strtoul 関数のいずれかを使用している
2. atoi, atol 関数の場合は,引数文字列を10進数値として表現すると,32ビットを超過するstrtol, trtoul
関数の場合は,第一引数の文字列を,第三引数により指定した基数の値で表現すると,32 ビ ットを超過す
る
3. 2.の引数文字列の先頭からある文字までを変換した数値と,先頭からある文字の次の文字までを変換した
数値の絶対値の下位32ビット同士を比較して,後者の値が前者の値以上である
4. 3.の比較が文字列の先頭から末尾まで成立する
5. atoi,atol,strtol 関数の場合は,2.の変換数値の下位32ビットに符号を付加した値が
LONG_MIN ~LONG_MAXの範囲内である
- No. 108 ビットフィールドをメンバに持つ構造体型変数の初期化の制限
-
【内 容】
下記の1.~2.の条件を全て満たす場合,ビットフィールドが正しく初期化されません。
【条件】
1. ビットフィールド,構造体(または共用体)の順番で連続しているメンバを持つ構造体型変数を使用している
2. 1.の構造体型変数のメンバを両方とも初期値を利用して初期化している
また下記の3.~5.の条件を全て満たす場合もビットフィールドが正しく初期化されない場合があります。
【 条 件 】
3. 構造体型自動変数の配列を使用している
4. 3.の構造体のメンバに,ビットフィールドと125バイト以上の要素を含む
5. 125バイト以上の要素に対する初期化子を省略し,暗黙の0初期化をしている
- No. 109 条件アセンブル擬似命令のネストの制限
-
【内 容】
下記の1.~4.の条件を全て満たす場合,エラーメッセージ(F3510)を出力します。
【条件】
1. .elseif,または.elseifn擬似命令を使用している
2. 1.の擬似命令で指定した式が真である
3. 1.の擬似命令に対応する擬似命令が.elseif,または.else擬似命令である
4. 1.の擬似命令に対応するブロック間に条件アセンブル疑似命令をネストしている
- No. 110 switch,if文内での代入の制限
-
【内 容】
下記の1.~2.の条件を全て満たす場合,その後のca850の最適化により,switch文あるいはif文内の処理が不正となる場合があります。
【条件】
1. Cソース上において(ア)~(ウ)の条件を全て満たす
(ア) Ver.2.50未満の場合,コンパイラの最適化オプションとして"-Os" "-Ot" のいずれかと”-Ol”を指定して
おり,”-Wi,-O4” は未指定である
Ver.2.50以上の場合,コンパイラの最適化オプションとして"-Os" "-Ot" のいずれかを指定しており,
<>”-Wi,-O4” は未指定である
(イ) switch文,あるいはif文内で同じ変数に値を代入する処理が並列している (ウ) (イ)の代入後,同じ位置
に分岐する
2. 1.のCソース記述により出力されたアセンブラが(エ)~(ク)の条件を全て満たす
(エ) 2つ以上の基本ブロック(A)の末尾で,同じレジスタへmov命令またはld命令で転送する
(オ) (A)のブロックが全て1つのブロック(B)へ合流する
(カ) (B)のブロックに命令がなく,出力コードとはならないコンパイラが使用する情報が1つ以上含まれる
(キ) (B)の次のブロック(C)で,(A)で転送したレジスタを他のレジスタへ転送する
(ク) ブロック(C)に直接合流するブロックの内,(A)と同様のレジスタへ転送を行っているブロック(D)が存在す
る
(注意) 「基本ブロック」とは,必ず先頭の命令から入り,分岐命令までの命令並びです。
ワーニングメッセージの追加
以下のワーニングメッセージを追加しました。
(1) 未定義のエスケープ文字が使用された場合に,ワーニングメッセージW2181を出力します。
W2181: undefined escape character (code)
未定義のエスケープ文字です。
(2) シフト演算において,右オペランドの値が0から31の範囲を超えた場合に,ワーニングメッセージ
W5301を出力します。
W5301: shift count(num) in function 'func' is out of range 関数func のある式のシフト数(num)が0 から31 の範囲を超えました。
(3) 除算,及び剰余算において,第二オペランドが 0 であるとき,ワーニングメッセージW5302を出力します。
W5302: division by zero in function 'func' 関数func のある式で0 除算がありました
ワーニングメッセージ出力規則の変更
V3.31では -wcast_type+ オプション指定時に,変数を,サイズが小さい型の変数に代入した場合にワーニングメッセージW2784を出力していました。
V3.41では -wcast_type+ オプション指定時に,ポインタを,サイズが小さい型の変数に代入した場合にもワーニングメッセージW2784を出力するようにメッセージ出力規則を追加変更しました。
W2784: Conversion may lose significant digitデータが失われている可能性があります。