avr32-gccのAVR32関連マクロ

以前、AT32UC3B0256における定義済みマクロを紹介した。これらは-marhオプションや-mpartオプションにより定義が変わったり、定義されなくなったりする。
今回はgccのソースからAVR32関係のマクロ名を探してみた。当然だがこれらはコンパイル・オプションに従いavr32-gccが定義するマクロであり、ここで紹介したマクロを勝手に定義してもMCUが変身したり、ハードウェア機能が追加されるはずもない。ユーザは勝手に定義すべきでない。
ソースはAtmelのサイトからダウンロードできる。「AVR32 GNU Toolchain 2.2.1 - Linux Source Code」を利用したが、参照するだけなのでこれを利用する(Windows用は見あたらない)。
なお、それらしい記述を抜き出して整形しただけであり、コードまで追いかけていない。
しかしこういう情報はAtemelがドキュメントにまとめて欲しいものだ。APシリーズがAVR32Bだなんて初めて知った(UC3のマニュアルしか見たことがないから)。


avr32_gnu_toolchain_2.2.1_source\gcc-4.3.2\gcc\config\avr32\linux-elf.hおよびavr32-elf.h

にある記述から、マクロ定義情報を探してみた。「TARGET_〜」はC言語マクロである。たぶんCPU製品毎の定義情報をチェックするのだろう。「part名」、「arch名」というのは後述の表を参照のこと。

マクロTARGET_CPU_CPP_BUILTINS()の定義内

条件 マクロ名
無条件 __avr32__
無条件 __AVR32__
LINUX-ELF出力用 __AVR32_LINUX__
ELF出力用 __AVR32_ELF__
無条件 part名
無条件 arch名
avr32_arch->uarch_type == UARCH_TYPE_AVR32A __AVR32_AVR32A__
avr32_arch->uarch_type != UARCH_TYPE_AVR32A __AVR32_AVR32B__
TARGET_UNALIGNED_WORDが真のとき __AVR32_HAS_UNALIGNED_WORD__
TARGET_SIMDが真のとき __AVR32_HAS_SIMD__
TARGET_DSPが真のとき __AVR32_HAS_DSP__
TARGET_RMWが真のとき __AVR32_HAS_RMW__
TARGET_BRANCH_PREDが真のとき __AVR32_HAS_BRANCH_PRED__
TARGET_FAST_FLOATが真のとき __AVR32_FAST_FLOAT__
ELF出力で、TARGET_NO_MUL_INSNSが真のとき __AVR32_NO_MUL__


avr32_gnu_toolchain_2.2.1_source\gcc-4.3.2\gcc\config\avr32\avr32.c

には製品毎のマクロ情報がある。左端のnameは-mpart=オプションの文字列、architecture typeは-marchオプションのアーキテクチャ名(gcc内部用マクロの都合で大文字になっているが指定は小文字)、macroはその製品で定義されるマクロ名である。part_typeはgcc内部で利用されるマクロで、通常は関係ないがavr32-gccのソースを追いかける人用に残した(というほどのものではないが)。

avr32_part_types[]内の定義情報

name part_type architecture type macro
none NONE AP __AVR32__
ap7000 AP7000 AP __AVR32_AP7000__
ap7001 AP7001 AP __AVR32_AP7001__
ap7002 AP7002 AP __AVR32_AP7002__
ap7200 AP7200 AP __AVR32_AP7200__
uc3a0128 UC3A0128 UCR2 __AVR32_UC3A0128__
uc3a0256 UC3A0256 UCR2 __AVR32_UC3A0256__
uc3a0512 UC3A0512 UCR2 __AVR32_UC3A0512__
uc3a0512es UC3A0512ES UCR1 __AVR32_UC3A0512ES__
uc3a1128 UC3A1128 UCR2 __AVR32_UC3A1128__
uc3a1256 UC3A1256 UCR2 __AVR32_UC3A1256__
uc3a1512 UC3A1512 UCR2 __AVR32_UC3A1512__
uc3a1512es UC3A1512ES UCR1 __AVR32_UC3A1512ES__
uc3a3revd UC3A3REVD UCR2NOMUL __AVR32_UC3A3256S__
uc3a364 UC3A364 UCR2 __AVR32_UC3A364__
uc3a364s UC3A364S UCR2 __AVR32_UC3A364S__
uc3a3128 UC3A3128 UCR2 __AVR32_UC3A3128__
uc3a3128s UC3A3128S UCR2 __AVR32_UC3A3128S__
uc3a3256 UC3A3256 UCR2 __AVR32_UC3A3256__
uc3a3256s UC3A3256S UCR2 __AVR32_UC3A3256S__
uc3b064 UC3B064 UCR1 __AVR32_UC3B064__
uc3b0128 UC3B0128 UCR1 __AVR32_UC3B0128__
uc3b0256 UC3B0256 UCR1 __AVR32_UC3B0256__
uc3b0256es UC3B0256ES UCR1 __AVR32_UC3B0256ES__
uc3b164 UC3B164 UCR1 __AVR32_UC3B164__
uc3b1128 UC3B1128 UCR1 __AVR32_UC3B1128__
uc3b1256 UC3B1256 UCR1 __AVR32_UC3B1256__
uc3b1256es UC3B1256ES UCR1 __AVR32_UC3B1256ES__
uc3l064 UC3L064 UCR3 __AVR32_UC3L064__
uc3l032 UC3L032 UCR3 __AVR32_UC3L032__
uc3l016 UC3L016 UCR3 __AVR32_UC3L016__



上記と同じソースにあるアーキテクチャ毎のマクロ情報がある。nameは-march=オプションの文字列、microarchitecture typeがマニュアル等に書かれているアーキテクチャ(という言い方しかないが)で、feature flagsはgccソース内のビットフラグ・マクロでCPU内部機能を表す。macroはそのアーキテクチャで定義されるマクロ名とその値である。architecture typeはgcc内部で利用されるマクロ名である。
feature flagsには、本当はプリフィックス「FLAG_AVR32_」が付いている。表の右端が削れて見えないため、このマクロ名を省略して短くした。
avr32_arch_types[]の定義情報

name archite-
cture
type
micro-
archite-
cture
type
feature
flags
macro
ap AP AVR32B HAS_DSP ¦ HAS_SIMD ¦ HAS_UNALIGNED_WORD ¦ HAS_BRANCH_PRED ¦ HAS_RETURN_STACK ¦ HAS_CACHES __AVR32_AP__
ucr1 UCR1 AVR32A HAS_DSP ¦ HAS_RMW __AVR32_UC__=1
ucr2 UCR2 AVR32A HAS_DSP ¦ HAS_RMW ¦ HAS_V2_INSNS __AVR32_UC__=2
ucr2nomul UCR2NOMUL AVR32A HAS_DSP ¦ HAS_RMW ¦ HAS_V2_INSNS ¦ HAS_NO_MUL_INSNS __AVR32_UC__=2
ucr3 UCR3 AVR32A HAS_DSP ¦ HAS_RMW ¦ HAS_V2_INSNS __AVR32_UC__=3