A.1.2 配置領域を変更する

デフォルトの配置セクションは,次のとおりになります

-

初期値なし変数:.bssセクション

-

初期値あり変数:.dataセクション

-

const変数:.constセクション

 

配置する領域(セクション)を変更するには,#pragma section指令で属性指定文字を指定します。

 

属性指定文字と生成されるセクションの関係は次のとおりです。

属性指定文字

初期値あり・なし

デフォルト・セクション名

セクション名変更

ベース・レジスタ

アクセス命令

r0_disp16

あり

.zdata

r0

ld/st 1命令

なし

.zbss

r0

ld/st 1命令

r0_disp23

あり

.zdata23

r0

ld23/st23 1命令

なし

.zbss23

r0

ld23/st23 1命令

r0_disp32

あり

.data

r0

movhi+ld/st 2命令

なし

.bss

r0

movhi+ld/st 2命令

ep_auto

あり/なし

.tdata4/.tdata5/.tdata7/.tdata8から自動選択

不可

ep

sld/sst 1命令

ep_disp4

あり

.tdata4

ep

sld/sst 1命令

なし

.tbss4

ep

sld/sst 1命令

ep_disp5

あり

.tdata5

ep

sld/sst 1命令

なし

.tbss5

ep

sld/sst 1命令

ep_disp7

あり

.tdata7

ep

sld/sst 1命令

なし

.tbss7

ep

sld/sst 1命令

ep_disp8

あり

.tdata8

ep

sld/sst 1命令

なし

.tbss8

ep

sld/sst 1命令

ep_disp16

あり

.edata

ep

ld/st 1命令

なし

.ebss

ep

ld/st 1命令

ep_disp23

あり

.edata23

ep

ld23/st23 1命令

なし

.ebss23

ep

ld23/st23 1命令

gp_disp16

あり

.sdata

gp

ld/st 1命令

なし

.sbss

gp

ld/st 1命令

gp_disp23

あり

.sdata23

gp

ld23/st23 1命令

なし

.sbss23

gp

ld23/st23 1命令

const

あり

.const

r0

movhi+ld/st 2命令

zconst

あり

.zconst

r0

ld/st 1命令

zconst23

あり

.zconst23

r0

ld23/st23 1命令

default

これ以降,#pragma section指定がなかったものとみなし,デフォルトの配置を行います。

 

#pragma section指令記述

#pragma section gp_disp16 "mysdata"
int a = 1;              /*mysdata.sdataセクションに配置する*/
int b;                  /*mysdata.sbssセクションに配置する*/
#pragma section default

 

なお,#pragma section指令を使った変数に別ファイル(参照ファイル)の関数から参照する場合には,参照ファイルにも#pragma section指令を記述し,該当変数をextern宣言する必要があります。

定義と宣言で指定が異なり,指定したセクション属性ではアクセスできない場合に,以下のエラーを出力します。

E0562330 : Relocation size overflow : "ファイル"-"セクション"-"オフセット"

 

例 1.

変数を定義しているファイル

#pragma section zconst
const unsigned char table_data[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
                                                /*.zconstセクションに配置する*/
#pragma section default

 

例 2.

変数を参照するファイル

#pragma section zconst
extern  const unsigned char  table_data[];      /*.zconstセクションに配置する*/
#pragma section default

 

なお, SHファミリ用コンパイラのCソース移植性を考慮して,以下のような表記も記述可能です。

#pragma section指令記述

#pragma section mydata
int a = 1;              /*mydata.dataセクションに配置する*/
int b;                  /*mydata.bssセクションに配置する*/
#pragma section default