=============================================================================== How to use new compiler(gcc6.4.0) Nov. 15, 2018 Copyright (C) 2018 Seiko Epson Corp. =============================================================================== 目次 -------------- 1. 概要 2. 使用方法 3. 制限事項 1. 概要 -------------- 新コンパイラ(以下gcc6)はgcc6.4.0に対応しています。 既存コンパイラであるgcc4に比べ、コード効率の向上、最適化が期待できます。 2. 使用方法 -------------- gcc6を使用するために、Project->Propertiesから以下を変更します。 1) C/C++ Build->Environment->GCC17-LOC->Valueを[Edit...]から変更 <変更前> <変更後> ${GNU17_LOC}\gcc4 ${GNU17_LOC}\gcc6 2) C/C++ Build->Environment->PATH->Valueを[Edit...]から変更 <変更前> <変更後> C:\EPSON\GNU17V3\gcc4 C:\EPSON\GNU17V3\gcc6 3) C/C++ Build->Settings->Tool Settings->Cross Settings->Pathを[Browse...]から変更 <変更前> <変更後> C:\EPSON\GNU17V3\gcc4 C:\EPSON\GNU17V3\gcc6 4) C/C++ Build->Settings->Tool Settings->Cross GCC Compiler->Optimization->Optimization Levelを変更 gcc6は、最適化オプションの-O2/-O3はサポート外です。 最適化オプションは、-O0/-O1/-Osを使用してください。 5) C/C++ Build->Settings->Tool Settings->Cross GCC Compiler->Debugging->Other debugging flagsを変更 <変更前> <変更後> -gstabs -g 3. 制限事項 -------------- gcc6を使用にあたり、以下にご注意ください。 3-1) 最適化オプションに-O0/-O1/-Osを使用してください。 最適化オプションの-O2/-O3は未評価のためサポート外です。 3-2) デバッグオプションに'-g'を使用してください。 現象: デバッグオプション'-gstabs'を使用した場合、unsigned long/long longの値をデバッガが認識出来ない。 原因: gcc6では基本的な情報の扱いが64bitとなったため、unsigned long/long longの最大値がデバッガと一致しない。 対策: デバッグオプション'-g'を使用する。 3-3) objdumpオプションの'-g'が使用出来ません。 現象: デバッグオプション'-g'でコンパイルした結果に対し、 objdumpオプションの'-g'を使用した場合、エラーが発生し、デバッグ情報が出力されない。 原因: objdumpが__int24を受け付けないため。 対策: objdumpオプションの'-g'を使用しない。 3-4) 特定のコードを含む場合、Internal errorが発生します。 現象: 以下のコードを含む場合、Internal errorが発生します。 ・volatileかつスタック領域に配列を持つ ・最適化されるループで、問題となる配列をアクセスする。 ループ数が固定かつ2回以上ループする場合、ループが最適化される。 [例] int printf( const char *, ... ); int sub( int e, int *p ) { if ( e == *p ) { return( 0 ) ; } else { return( 1 ) ; } } int main( void ) { volatile int ary[] = { 0, 1, 2 } ; int i, flg = 0 ; for( i = 0 ; i < (3) ; i++ ) { flg += sub( (int)ary[i], (int *)&ary[i] ) ; } printf("OK\n"); return( flg ) ; } 原因: ローカルなvolatile配列のループの最適化に問題があるため。 対策: 以下のいずれかを対応してください。 ・volatileを使わない。 ・配列を関数外に出す。 ・ループを使用しない。