2012-03-19 2 views
4

Иногда я нашел идентификатор метки в LLVM IR начинается с запятой «;» такие, как ; <label> 6 однако, как I Kown, запятая используется для комментариев. Итак, как можно llvm получить информацию о лейбле в комментариях? Я что-то упускаю?
Простой тест.
исходный файл С:выражение метки в LLVM IR код

#include <stdio.h> 

int main() 
{ 
int a; 
scanf("%d", &a); 
if (a > 3) 
    a *= 2; 
return 0; 
} 

ИК-код LLVM, порожденный http://llvm.org/demo/index.cgi (такой же, как лязг -c -emit-LLVM main.c) имеет следующий вид:

; ModuleID = '/tmp/webcompile/_13654_0.bc' 

@.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1 

define i32 @main() nounwind uwtable { 
    %a = alloca i32, align 4 
    %1 = call i32 (i8*, ...)* @__isoc99_scanf(i8* getelementptr inbounds ([3 x i8]* @.str, i64 0, i64 0), i32* %a) nounwind 
    %2 = load i32* %a, align 4, !tbaa !0 
    %3 = icmp sgt i32 %2, 3 
    br i1 %3, label %4, label %6 

; <label>:4          ; preds = %0 
    %5 = shl nsw i32 %2, 1 
    store i32 %5, i32* %a, align 4, !tbaa !0 
    br label %6 

; <label>:6          ; preds = %4, %0 
    ret i32 0 
} 

ответ

2

В LLVM IR A блоку не требуется явная метка. Инструкции аналогичны тем, которые приводят к% 1,% 2,% 3. LLVM присваивает номера неназванным инструкциям и блокам в порядке возрастания. br i1 %3... завершает первый блок, а последняя используемая метка числа равна 3, поэтому следующий блок получает обозначение 4. Этот блок заканчивается следующей командой br, а последний использованный номер равен 5, поэтому следующий и последний блок помечены как 6. На сначала может показаться странным, что блоки и инструкции разделяют одно и то же пространство имен, но помните, что блоки также являются значениями.

+0

Спасибо за помощь. Кажется немного странным. Не могли бы вы дать мне несколько советов для меня, чтобы узнать LLVM? – bluesea

1

Несмотря на формулировку, %4 в label %4 НЕ является меткой, это всего лишь ссылка на блок. Вы правы, это очень запутанно, см. this issue для обсуждения.

0

Что-то, что вы можете попробовать, это запустить пропуск instnamer на вашем IR, который даст явное имя для всего, поэтому вам не нужно беспокоиться о поиске неявных имен.

Смежные вопросы