CC-RHでは,関数やデータをセクションに割り当てることによって,メモリ上の配置や,アクセス方法を制御します。
|
|
|
|
text
|
.text
|
r0からの32ビット長相対
|
2
|
pctext
|
.pctext
|
PCからの32ビット長相対
|
- | .textセクションがデフォルトで使用するセクションです。 |
PIC機能には使用できません。
- | .pctextがPIC機能で使用するためのセクションです。 |
|
|
|
|
|
zdata
|
.zdata
|
初期値あり変数
|
r0からの16ビット長相対
|
4
|
zbss
|
.zbss
|
初期値なし変数
|
zdata23
|
.zdata23
|
初期値あり変数
|
r0からの23ビット長相対
|
zbss23
|
.zbss23
|
初期値なし変数
|
data
|
.data
|
初期値あり変数
|
r0からの32ビット長相対
|
bss
|
.bss
|
初期値なし変数
|
- | .data,.bssセクションがデフォルトで使用するセクションです。 |
- | .zdata,.zbss,.zdata23,.zbss23が短い命令長でアクセスする場合に使用するセクションです。 |
- | どのR0相対セクションも,PID機能には使用できません。 |
|
|
|
|
|
tdata4
|
.tdata4
|
初期値あり変数
|
r30(EP)からの4ビット長相対
sld,sst命令を使用可能
|
4
|
tbss4
|
.tbss4
|
初期値なし変数
|
tdata5
|
.tdata5
|
初期値あり変数
|
r30(EP)からの5ビット長相対
sld,sst命令を使用可能
|
tbss5
|
.tbss5
|
初期値なし変数
|
tdata7
|
.tdata7
|
初期値あり変数
|
r30(EP)からの7ビット長相対
sld,sst命令を使用可能
|
tbss7
|
.tbss7
|
初期値なし変数
|
tdata8
|
.tdata8
|
初期値あり変数
|
r30(EP)からの8ビット長相対
sld,sst命令を使用可能
|
tbss8
|
.tbss8
|
初期値なし変数
|
edata
|
.edata
|
初期値あり変数
|
r30(EP)からの16ビット長相対
|
ebss
|
.ebss
|
初期値なし変数
|
edata23
|
.edata23
|
初期値あり変数
|
r30(EP)からの23ビット長相対
|
ebss23
|
.ebss23
|
初期値なし変数
|
edata32
|
.edata32
|
初期値あり変数
|
r30(EP)からの32ビット長相対
|
ebss32
|
.ebss32
|
初期値なし変数
|
- | .tdata*,.tbss*セクションは,短い命令長でアクセスする場合に使用するセクションです。 |
より短いsld/sst命令を使用することができます。
PID機能でも使用することができます。
- | .edata,.ebss,.edata23,.ebss23は,短い命令長でアクセスする場合に使用するセクションです。 |
PID機能でも使用することができます。
- | .edata32,.ebss32セクションは,PID機能で使用するためのセクションです。 |
|
|
|
|
|
sdata
|
.sdata
|
初期値あり変数
|
r4(GP)からの16ビット長相対
|
4
|
sbss
|
.sbss
|
初期値なし変数
|
sdata23
|
.sdata23
|
初期値あり変数
|
r4(GP)からの23ビット長相対
|
sbss23
|
.sbss23
|
初期値なし変数
|
sdata32
|
.sdata32
|
初期値あり変数
|
r4(GP)からの32ビット長相対
|
sbss32
|
.sbss32
|
初期値なし変数
|
- | .sdata,.sbss,.sdata23,.sbss23セクションは,短い命令長でアクセスする場合に使用するセクションです。PID機能にも使用することができます。 |
- | .sdata32,.sbss32セクションは,PID機能で使用するためのセクションです。 |
|
|
|
|
|
zconst
|
.zconst
|
const変数
文字列リテラル
自動変数の初期値注1
|
r0からの16ビット長相対
|
4
|
zconst23
|
.zconst23
|
r0からの23ビット長相対
|
const
|
.const
|
r0からの32ビット長相対
|
pcconst16
|
.pcconst16
|
__pc_dataシンボルからの16ビット長相対
|
pcconst23
|
.pcconst23
|
__pc_dataシンボルからの23ビット長相対
|
pcconst32
|
.pcconst32
|
__pc_dataシンボルからの32ビット長相対
|
注 1. | 自動変数の初期値は,PIROD機能を使用しない場合は.constセクション,PIROD機能を使用する場合は.pcconst32セクションであり,変更することはできません。 |
- | .constセクションは,デフォルトで使用するセクションです。 |
PIROD機能には使用できません。
- | .zconst,.zconst23セクションは,短い命令長でアクセスするためのセクションです。 |
PIROD機能には使用できません。
- | .pcconst16,.pcconst23,.pconst32セクションは,PIROD機能で使用するためのセクションです。 |
デフォルトの状態で,CC-RHが関数やデータを割り当てるセクションは,.text,.data,.bss,.constの4つです。
アクセスする時の相対距離が長いほど,長い命令長でのアクセスとなり,コード・サイズが増大します。
拡張機能を使用して,関数やデータを任意のセクションに割り当てることができます。これにより,それぞれのセクション再配置属性の性質を利用したコードを生成することができます。
#pragma section指令は,次の書式で記述します。
#pragma section 属性指定文字 "ユーザ定義名"
|
#pragma section default
または
#pragma section
|
「属性指定文字」でセクション再配置属性を,「ユーザ定義名」でセクション名をそれぞれ指定します。「属性指定文字」は,オプション指定によって使用可能なものが変化します。
指定可能な「属性指定文字」,対応するセクション再配置属性,オプション指定条件の関係を表 4.20に示します。
「属性指定文字」は,アルファベットの大文字,小文字を区別します。
表 4.20 | 属性指定文字とセクション再配置属性の関係 |
|
|
|
text
|
text
|
-pic非指定時
|
pctext 【V1.07.00以降】
|
pctext
|
-pic指定時
|
r0_disp16
|
zdata/zbss
|
-pid非指定時
|
r0_disp23
|
zdata23/zbss23
|
r0_disp32
|
data/bss
|
ep_disp4
|
tdata4/tbss4
|
-Xep=fix指定時
|
ep_disp5
|
tdata5/tbss5
|
ep_disp7
|
tdata7/tbss7
|
ep_disp8
|
tdata8/tbss8
|
ep_disp16
|
edata/ebss
|
ep_disp23
|
edata23/ebss23
|
ep_disp32 【V1.07.00以降】
|
edata32/ebss32
|
-Xep=fixかつ-pid指定時
|
gp_disp16
|
sdata/sbss
|
-r4=fix指定時
|
gp_disp23
|
sdata23/sbss23
|
gp_disp32 【V1.07.00以降】
|
sdata32/sbss32
|
-r4=fixかつ-pid指定時
|
zconst
|
zconst
|
-pirod非指定時
|
zconst23
|
zconst23
|
const
|
const
|
pcconst16 【V1.07.00以降】
|
pcconst16
|
-pirod指定時
|
pcconst23 【V1.07.00以降】
|
pcconst23
|
pcconst32 【V1.07.00以降】
|
pcconst32
|
「ユーザ定義名」に指定可能な文字は次の通りです。
#pragma section指令以降に記述された関数やデータは,次のルールに従って配置先セクションが決定されます。
1. 「属性指定文字」から再配置属性を決定する。
(1) データの場合,初期値があるかどうかによって*data*または*bss*を自動的に選択する。
(2) 「属性指定文字」が無い形式は,関数,データの両方に作用し,コンパイラのデフォルトの再配置属性を使用する。
2. 「ユーザ定義名」の後ろに、再配置属性を示す文字列を連結する注。
(1) 「ユーザ定義名」が0〜9から始まる場合,先頭に”_”を付加する。
(2) 「ユーザ定義名」が無い場合,デフォルト・セクション名をそのまま使用する。
注 異なるセクション再配置属性を持つセクションに,同じセクション名を持たせないためです。
3. #pragma section defaultまたは#pragma sectionの形式を指定した場合は,関数,データの両方に作用し,コンパイラのデフォルトの再配置属性と,デフォルト・セクション名を使用する。
#pragma section指令は,記述された位置から,次の#pragma section指令が現れる位置まで,またはソース・ファイルの終端まで有効です。
#pragma section gp_disp16 "foo"
int a = 1; /* foo.sdata */
int b; /* foo.sbss */
#pragma section zconst23 "bar"
const int c = 2; /* bar.zconst23 */
#pragma section text "123"
void func() {} /* _123.text */
#pragma section baz
int d = 3; /* baz.data */
int e; /* baz.bss */
const int f = 4; /* baz.const */
void func2() {} /* baz.text */
#pragma section default
int g = 3; /* .data */
int h; /* .bss */
const int i = 4; /* .const */
void func3() {} /* .text */
|
#pragma section 指令の効果は変数と関数で異なります。
ある変数に対する宣言,定義が複数存在し,それぞれに異なる#pragma sectionを指定した場合,最初に現れた#pragma section指定が有効になります。
int x = 1; /* 変数xはfoo.dataに配置される */
int y = 2; /* 変数yはbar.dataに配置される */
#pragma section foo
extern int x;
#pragma section bar
extern int x;
extern int y;
|
-picオプションを指定しない場合,#pragma sectionは関数定義に対してのみ有効です。
-picオプションを指定している場合,#pragma sectionは変数の場合と同様に,宣言,定義の両方に対して有効です。