Everything
4.2.6.1 関数とデータのセクション割り当て

CC-RHでは,関数やデータをセクションに割り当てることによって,メモリ上の配置や,アクセス方法を制御します。

-

関数用セクション

表 4.11

関数用セクションの種類

セクション

再配置属性

デフォルト・

セクション名

アクセス方法

整列

条件

text

.text

r0からの32ビット長相対

2

pctext

.pctext

PCからの32ビット長相対

-

.textセクションがデフォルトで使用するセクションです。

PIC機能には使用できません。

-

.pctextがPIC機能で使用するためのセクションです。

 

-

データ用R0相対セクション

表 4.12

データ用R0相対セクションの種類

セクション

再配置属性

デフォルト・

セクション名

割り当てる対象

アクセス方法

整列

条件

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機能には使用できません。

 

-

データ用EP相対セクション

表 4.13

データ用EP相対セクションの種類

セクション

再配置属性

デフォルト・

セクション名

割り当てる対象

アクセス方法

整列

条件

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機能で使用するためのセクションです。

 

-

データ用GP相対セクション

表 4.14

データ用GP相対セクションの種類

セクション

再配置属性

デフォルト・

セクション名

割り当てる対象

アクセス方法

整列

条件

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機能で使用するためのセクションです。

 

-

定数データ用セクション

表 4.15

定数データ用セクションの種類

セクション

再配置属性

デフォルト・

セクション名

割り当てる対象

アクセス方法

整列

条件

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つです。

アクセスする時の相対距離が長いほど,長い命令長でのアクセスとなり,コード・サイズが増大します。

 

拡張機能を使用して,関数やデータを任意のセクションに割り当てることができます。これにより,それぞれのセクション再配置属性の性質を利用したコードを生成することができます。

 

(1)

#pragma section指令

#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 ユーザ定義名

-

関数,データ,定数データの再配置属性をデフォルトに変更し,セクション名をユーザ定義名に従って変更します。

 

#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

 

「ユーザ定義名」に指定可能な文字は次の通りです。

-

0 ~ 9

-

a~z, A~Z

-

_

-

@

-

.

 

#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 */