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 data データ用属性指定文字 "ユーザ定義名" 【V2.03.00以降】
または
#pragma section data データ用属性指定文字 【V2.03.00以降】
|
- | データの配置先セクションを変更します。関数,定数データは影響を受けません。 |
#pragma section const 定数データ用属性指定文字 "ユーザ定義名" 【V2.03.00以降】
または
#pragma section const 定数データ用属性指定文字 【V2.03.00以降】
|
- | 定数データの配置先セクションを変更します。関数,データは影響を受けません。 |
- | 関数の配置先セクションを変更するには,次の書式で記述します。 |
#pragma section 属性指定文字 "ユーザ定義名"
または
#pragma section 属性指定文字
|
- | 関数,またはデータ,定数データの配置先セクションを変更します。 |
- | データ用の属性指定文字を指定した場合は,定数データの配置先をデフォルト・セクションの.constに変更します。 |
- | 定数データ用の属性指定文字を指定した場合は,データの配置先をデフォルト・セクションの.data, .bssに変更します。 |
- | 関数,データ,定数データの再配置属性をデフォルトに変更し,セクション名をユーザ定義名に従って変更します。 |
#pragma section text default 【V2.03.00以降】
|
- | 関数の配置先をデフォルト・セクションの.textに変更します。データ,定数データは影響を受けません。 |
#pragma section data default 【V2.03.00以降】
|
- | データの配置先をデフォルト・セクションの.data, .bssに変更します。関数,定数データは影響を受けません。 |
#pragma section const default 【V2.03.00以降】
|
- | 定数データの配置先をデフォルト・セクションの.constに変更します。関数,データは影響を受けません。 |
#pragma section default
または
#pragma section
|
- | 関数,データ,定数データの配置先をデフォルト・セクションの.text,.data,.bss,.constに変更します。 |
「属性指定文字」でセクション再配置属性を,「ユーザ定義名」でセクション名をそれぞれ指定します。「属性指定文字」は,オプション指定によって使用可能なものが変化します。
指定可能な「属性指定文字」,対応するセクション再配置属性,オプション指定条件の関係を表 4.16,表 4.17,表 4.18に示します。
「属性指定文字」は,アルファベットの大文字,小文字を区別します。
表 4.16 | 関数用属性指定文字とセクション再配置属性の関係 |
|
|
|
text
|
text
|
-pic非指定時
|
pctext 【V1.07.00以降】
|
pctext
|
-pic指定時
|
表 4.17 | データ用属性指定文字とセクション再配置属性の関係 |
|
|
|
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指定時
|
表 4.18 | 定数データ用属性指定文字とセクション再配置属性の関係 |
|
|
|
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は変数の場合と同様に,宣言,定義の両方に対して有効です。
【V2.02.00以降】#pragma sectionを関数内にも記述できます。
このため,V2.01.00以前ではW0520609を出力して無視していた関数内の#pragma sectionが有効になります。
この仕様変更により,関数内static変数や文字列リテラルが複数ある場合に,それぞれを別のセクションに割り当てることなどが可能になります。
void func() {
#pragma section AAA
static int aaa; /* AAA.bss */
#pragma section BBB
static int bbb; /* BBB.bss */
#pragma section
;
}
static int ccc; /* .bss */
|