You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
「グローバル変数のサポート」に関して、以下の2点が考慮されなければならないと考えますが、いかがでしょうか?
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 コードモデル
cf. RISC-V ELF Specification, Code models
には、この二つに (P.314 - 321 で解説している) PICポリシを加えて、コードモデルとして以下の3つが定義されている。
medlow
)medany
)Medium position independent code model では
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 より:
la
)lla
の aliaslga
の aliaslla
)lga
)これらから、表7 は以下となる。
addi rd, rd, delta[11:0]
delta は symbol - pc を示す。
l{w|d} rd, rd, delta[11:0]
delta は GOT[symbol] - pc を示す。
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]
non-local symbol に対しては、lga の alias
P.329
誤
正
P.459 code 例
la
は context により意味が変わるので、ここではを用いる方が適切。
P.460
誤
正
P.461
MYRISCVXExpandPseudoInsts.cpp
isPositionIndependent()
に加えて local address or non-local address の判定の追加が必要。isPositionIndependent()
かつ non-local address の時 MO_GOT_HIGH, else MO_PCREL_HIGHP.486 表3
LA: 上記 P.328 表7 と同様
CALL も同様に non-local, localで GOTの使用の有無が変わる。
cf. ELF Spec, Procedure Calls
P.489 最後のparagraph
上記 P.460 と同様
P.490
LA
の処理上記 P.461 と同様に
isPositionIndependent()
に加えて local address or non-local address の判定の追加が必要。以上
The text was updated successfully, but these errors were encountered: