Alias

Tags

Существует два типа тэгов для описания блоков памяти на которые ссылается операнд:

  1. Loc Tag
  2. 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

Тэги у обоих операндов совпадают, значит они ссылаются на один и тот же блок памяти.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.