Tags
Существует два типа тэгов для описания блоков памяти на которые ссылается операнд:
- Loc Tag
- Ref Tag
К классу Phx::Alias::Loc тэгов относятся операнды, которые ссылаются на конкретный блок памяти. Например, a[3], будет во внутреннем представлении описан Loc тэгом.
Классом Phx::Alias::Ref тэгов описываются операнды, которые ссылаются на набор блоков памяти. Например, a[i], будет описан Ref тэгом.
Метод | Описание |
---|---|
SymBaseTag | Базовый тэг |
SymBitOffset | Смещение относительно базового тэга |
Example
int main() { int a[10]; int i; int b = 0; a[0] = 1; a[3] = 2; b = a[2]*5; for(i = 2; i < 10; i++) { a[i] = a[i-2]; } return 0; }
Внутреннее представление данного кода:
==== BasicBlock 2 Pred(1) Succ(4) prev 1 next 3 pre 2 post 8 iDom 1 df ()
_main: (refs=1) #12
ENTERFUNC #12
_b<2> = ASSIGN 0 #15
t272 = ADD &_a, 0 #17
[t272] = ASSIGN 1 #17
t273 = ADD &_a, 12(0x0000000c) #18
[t273] = ASSIGN 2 #18
t274 = ADD &_a, 8 #19
t275 = MUL [t274], 5 #19
_b<3> = ASSIGN t275 #19
_i<4> = ASSIGN 2 #21
GOTO $L6 #21
Для каждого операнда создается Tag. Все тэги хранятся в базе данных. Операнды, которые ссылаются на одинаковы адреса памяти, описываются одним тэгом:
Instr 1:
[t273] = ASSIGN 2 #18
Operand [t273] Tag = 154
Loc tag:
Tag 154 maps to resource 268.
Loc info: Loc(154): Layout(90):, 0[sb] + 96[so], (UnmgdArr[Aggr32]320+96).i32
Instr 2:
t275 = MUL [t274], 5 #19
Operand [t274] Tag = 155
Loc tag:
Tag 155 maps to resource 268.
Loc info: Loc(155): Layout(90):, 0[sb] + 64[so], (UnmgdArr[Aggr32]320+64).i32
int main() { int a[10]; int i; int b = 0; a[0] = 1; a[3] = 2; b = a[3]*5; for(i = 2; i < 10; i++) { a[i] = a[i-2]; } return 0; }
==== BasicBlock 2 Pred(1) Succ(4) prev 1 next 3 pre 2 post 8 iDom 1 df ()
_main: (refs=1) #12
ENTERFUNC #12
_b<2> = ASSIGN 0 #15
t272 = ADD &_a, 0 #17
[t272] = ASSIGN 1 #17
t273 = ADD &_a, 12(0x0000000c) #18
[t273] = ASSIGN 2 #18
t274 = ADD &_a, 12(0x0000000c) #19
t275 = MUL [t274], 5 #19
_b<3> = ASSIGN t275 #19
_i<4> = ASSIGN 2 #21
GOTO $L6 #21
Instr 1:
[t273] = ASSIGN 2 #18
Operand [t273] Tag = 154
Loc tag:
Tag 154 maps to resource 268.
Loc info: Loc(154): Layout(90):, 0[sb] + 96[so], (UnmgdArr[Aggr32]320+96).i32
Instr 2:
t275 = MUL [t274], 5 #19
Operand [t274] Tag = 154
Loc tag:
Tag 154 maps to resource 268.
Loc info: Loc(154): Layout(90):, 0[sb] + 96[so], (UnmgdArr[Aggr32]320+96).i32
Тэги у обоих операндов совпадают, значит они ссылаются на один и тот же блок памяти.