Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

「グローバル変数のサポート」に関して #37

Open
hirooih opened this issue Apr 13, 2023 · 0 comments
Open

「グローバル変数のサポート」に関して #37

hirooih opened this issue Apr 13, 2023 · 0 comments

Comments

@hirooih
Copy link

hirooih commented Apr 13, 2023

「グローバル変数のサポート」に関して、以下の2点が考慮されなければならないと考えますが、いかがでしょうか?

  • static 変数 (local symbol)
  • la 擬似命令が、 lla 擬似命令もしくは lga 疑似命令の alias であること

以下に具体的に、私の理解を記載します。


P.299 グローバル変数のサポート

P.299では、「ローカル変数 (local variable)」を関数内部でのみアクセスできる変数、「グローバル変数 (global variable)」をそれ以外の変数と定義している。ここで static 変数はどうなるのかが気になり、調べた結果の私の理解が以下。

RISC-V ELF Spec
にあるように PIC ポリシの場合、グローバル変数のうち、(GOTを使う必要のない) static 変数か否かで処理を変える必要がある。
ここで static 変数にも触れて、(RISC-V ELF Spec での) "local symbol" と "non-local symbol" という言葉をそのまま使うか、もしくは相当する言葉を定義することが必要。


P.314 ~ 321 PICポリシ

(上記の繰り返しになるが) PICポリシではグローバル変数は全て GOT を使用するように書かれているが、
RISC-V ELF Specification, Code models の (本書での PICポリシに相当する) Medium position independent code model では "local symbol" と "non-local symbol" とで処理が使い分けられている。


P.321 - 323 コードモデル

RISC-Vにはグローバル変数のアドレスを作成する方法が2種類定義されており、これらは「コードモデル」と呼ばれます。

cf. RISC-V ELF Specification, Code models

には、この二つに (P.314 - 321 で解説している) PICポリシを加えて、コードモデルとして以下の3つが定義されている。

  • medium low code model (medlow)
  • medium any code model (medany)
  • medium position independent code model

Medium position independent code model では

  • "local symbol" と "non-local symbol" と使い分けられている。
  • "local symbol" にはアドレス生成に lla 擬似命令の、"non-local symbol" にはアドレス生成に lga 擬似命令の命令列がそれぞれ用いられる。
  • la 擬似命令を用いることで、 lla もしくは lga が適切に選択される。

cf. RISC-V Assembly Programmer's Manual

一方 medlow, medany は local symbol も non-local symbol も同じaddressingになるので、単に "symbol" と表現されている。


P.328 表7 アドレスを生成する擬似命令

RISC-V Assembly Programmer's Manual より:

  • Load Address (la)
    • for non-PIC (staticポリシ) では lla の alias
    • for PIC (PICポリシ) では lga の alias

The la pseudoinstruction is the preferred way for getting the address of variables in assembly unless explicit control over PC-relative or GOT-indirect addressing is required.

  • Load Local Address (lla)
  • Load Global Address (lga)

これらから、表7 は以下となる。

疑似命令 命令の実態 意味
lla rd, symbol auipc rd, delta[31:12] + delta[11]
addi rd, rd, delta[11:0]
symbol の絶対アドレスを rd に格納する。
delta は symbol - pc を示す。
lga rd, symbol auipc rd, delta[31:12] + delta[11]
l{w|d} rd, rd, delta[11:0]
symbol の絶対アドレスを GOT からロードして rd に格納する。
delta は GOT[symbol] - pc を示す。
la rd, symbol For non-PIC (local symbol):
auipc rd, delta[31:12] + delta[11]
addi rd, rd, delta[11:0]

For PIC (non-local symbol):
auipc rd, delta[31:12] + delta[11]
l{w|d} rd, rd, delta[11:0]
local symbol に対しては、lla の alias
non-local symbol に対しては、lga の alias

P.329

PICポリシの場合: GOTテーブルを使ってアドレスを生成する。LA擬似命令に置き換えることができる。

PICポリシの場合: GOTテーブルもしくはAUIPCとADDI命令を使ってアドレスを生成する。LA擬似命令に置き換えることができる。


P.459 code 例

la rd, symbol

la は context により意味が変わるので、ここでは

lla rd, symbol

を用いる方が適切。


P.460

...LA はstatic モードと PIC モード (...) で挙動が異なりますので、

...LA は local address と non-local address (global address) (...) で挙動が異なりますので、


P.461 MYRISCVXExpandPseudoInsts.cpp

isPositionIndependent() に加えて local address or non-local address の判定の追加が必要。

isPositionIndependent() かつ non-local address の時 MO_GOT_HIGH, else MO_PCREL_HIGH


P.486 表3

LA: 上記 P.328 表7 と同様

CALL も同様に non-local, localで GOTの使用の有無が変わる。

cf. ELF Spec, Procedure Calls


P.489 最後のparagraph

... LA 命令の場合は...

上記 P.460 と同様


P.490 LA の処理

上記 P.461 と同様に isPositionIndependent() に加えて local address or non-local address の判定の追加が必要。

以上

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant