Понимание bitcast в LLVM IR - PullRequest
       11

Понимание bitcast в LLVM IR

0 голосов
/ 28 августа 2018

Я пытаюсь понять IR LLVM, сгенерированный из программы на C ++

int add(int *x);
int func()
{
        int T;
        T=25;
        return add(&T);    
}

Сгенерированный IR:

define i32 @_Z4funcv() local_unnamed_addr #0 {
entry:
  %T = alloca i32, align 4
  %0 = bitcast i32* %T to i8*
  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0) #3
  store i32 25, i32* %T, align 4, !tbaa !2
  %call = call i32 @_Z3addPi(i32* nonnull %T)
  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0) #3
  ret i32 %call
}

Я не понимаю эту строку %0 = bitcast i32* %T to i8*. Какова цель преобразования %T из i32 в i8?

1 Ответ

0 голосов
/ 29 августа 2018

Предполагая, что вы знаете о внутренностях

llvm.lifetime.start / llvm.lifetime.end

и его использование в качестве памяти использует маркер для MemoryDependenceAnalysis.

О выборе указателя (адреса переменной) в качестве i8 было сделано, чтобы сделать его более универсальным в качестве области памяти с байтовой адресацией с первыми аргументами в качестве числа байтов, такого же, как мы используем в malloc.

Таким образом, чтобы сгенерировать внутренний вызов, нам нужен адрес байта в памяти и количество байтов, равное sizeof (T). вот почему нам нужно конвертировать i32 * в i8 *.

кстати, подпись, если в ваших примерах используются встроенные функции времени жизни

объявить void @ llvm.lifetime.start (i64, i8 * nocapture)

объявить void @ llvm.lifetime.end (i64, i8 * nocapture)

Для получения дополнительной информации пройдите Lang ref .

...