コンピュータ サイエンス、特にコンパイラとアセンブラの設計において、リテラル プールは、アセンブリおよび実行中にリテラルを保持するために使用される参照テーブルです。
複数の(ローカル)リテラルプールは、通常、長いジャンプ用の分岐命令が存在しない、または短いジャンプに最適化された命令セットを持つコンピュータアーキテクチャでのみ使用されます。このようなアーキテクチャの例としては、12ビットのアドレスオフセットを取る命令を多数備えたIBM System/360とその後継機が挙げられます。この場合、コンパイラは4Kページごとにリテラルテーブルを作成します。ターゲットが4Kバイト未満である分岐は即座に実行されますが、長い分岐はリテラルテーブルを介したアドレス検索を必要とします。リテラルプールのエントリは、アセンブリ中にオブジェクト再配置テーブルに配置され、リンク編集時に解決されます。
ARMアーキテクチャも複数のローカルプールを使用します[1]。これは、オリジナルのARMの64ビット拡張であるAArch64でも同様です[2] 。
複数のローカルプールを利用する別のアーキテクチャは、組み込みSoC向けに設計された32ビットアーキテクチャであるC-SKYです。[3] [4]
ある意味では、リテラル プールは TOC またはグローバル オフセット テーブル(GOT) に似ていますが、実装がかなり単純で、オブジェクトごとに複数のリテラル テーブルが存在する可能性がある点が異なります。
おそらく最も一般的なタイプのリテラルプールは、LDR Rd,=constARMアセンブリ言語[5] [6]の疑似命令
やIBM System/360アセンブリ言語[7]の同様の命令で使用されるリテラルプールであり、 PC相対アドレス指定モード
のLOADにコンパイルされ、定数がリテラルプールに格納されます。
IBM S/390およびzSeriesアーキテクチャでは、GNUアセンブラ「as」( gccビルドプロセス中に呼び出される)は、汎用レジスタR13を使用してリテラルプールへのポインタを格納します。[8] [9]
特定の定数値はプログラム内で複数回使用されることがよくあります。多くのリンカーはデフォルトで、各定数を単一の結合リテラルプールに一度だけ格納します。これによりコードサイズが削減されます。[10]
Java仮想マシンには「文字列リテラルプール」と「クラス定数プール」がある。 [11]
参考文献
- ^ 「as の使用、セクション 9.4 (ARM 依存機能)」。
- ^ 「as の使用、セクション 9.1 (AArch64 依存機能)」。
- ^ 「as の使用、セクション 9.10.1 (C-SKY 依存機能: オプション)」。
- ^ Larabel, Michael. 「C-SKY 32ビットCPU、Linux 4.20~5.0での初期サポートを目指す」。2022年8月22日時点のオリジナルよりアーカイブ。 2022年8月22日閲覧。
- ^ “ARMアセンブリ言語の記述 > リテラルプール”. 2022年8月19日時点のオリジナルよりアーカイブ。
- ^ 「Arm Limited の ARM コア (AARM-12) 向け IAR アセンブラ ユーザーガイド」(PDF) 。 2022年1月19日時点のオリジナルよりアーカイブ(PDF) 。 2022年8月22日閲覧。2022年8月22日archive.todayにアーカイブ
- ^ 「High Level Assembler for z/OS & z/VM & z/VSE V1R6 (HLASM V1R6) Language Reference: Literal pool」。IBM . 2022年8月19日時点のオリジナルよりアーカイブ。
- ^ Geiselhart, Gregory; Grahn, Andrea; Handoko, Frans; Hundertmark, Jörg; Krzymowski, Albert; Pomar, Eliuth (2002年7月). Linux on IBM zSeries and S/390: Application Development (PDF) . IBM Redbooks. IBM . 2021年7月22日時点のオリジナルよりアーカイブ(PDF) .2022年8月19日archive.todayにアーカイブ
- ^ “Using as (section 9.41.3.8)”. 2022年8月19日時点のオリジナルよりアーカイブ。
- ^ William von Hagen. 「GCC 決定版ガイド」
- ^ Jacquie Barker. 「Javaオブジェクト入門:概念からコードまで」:「リテラルプール」