Как сохранить имя переменной при использовании clang для генерации llvm ir? - PullRequest
0 голосов
/ 20 мая 2018

Я генерирую ir, используя 'clang -S -emit-llvm test.c'.

int main(int argc, char **argv)
{
    int* a=0;
    a=(int *)malloc(sizeof(int));
    printf("hello world\n");
    return 0;
}

, а это ir:

define i32 @main(i32, i8**) #0 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i8**, align 8
  %6 = alloca i32*, align 8
  store i32 0, i32* %3, align 4
  store i32 %0, i32* %4, align 4
  store i8** %1, i8*** %5, align 8
  store i32* null, i32** %6, align 8
  %7 = call noalias i8* @malloc(i64 4) #3
  %8 = bitcast i8* %7 to i32*
  store i32* %8, i32** %6, align 8
  %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0))
  ret i32 0
}

как мне сделатьимя переменной остается неизменным , как неподвижный% a , не% 3?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

На самом деле удаление имен переменных - это функция, которую необходимо активировать с помощью -discard-value-names.Clang в сборке релиза делает это самостоятельно (самоскомпилированный лязг в режиме отладки - нет).

Вы можете обойти его с помощью

clang <your-command-line> -###

Затем скопируйте вывод и пропустите -discard-value-names.

Более новая версия clang (начиная с 7) предоставляет флаг для нормальной командной строки:

clang -fno-discard-value-names <your-command-line>

Source

0 голосов
/ 20 мая 2018

Нет такого пути.Имена переменных в LLVM IR предназначены только для отладки, и, конечно же, нет способа сохранить их при преобразовании кода в полную форму SSA.

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

...