Sometimes I found the label identifier in llvm IR is started with comma ';', such as
; <label> 6
however as I kown, the comma is used for comments. So how can llvm retrive the label info in comments? Am I missing something?
One simple test is followed.
the C source file:
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
if ( a > 3)
a *= 2;
return 0;
}
the llvm IR code generated by http://llvm.org/demo/index.cgi (same as clang -c -emit-llvm main.c) is following:
; 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
}
In LLVM IR a block does not need an explicit label. Instructions are the same way which leads to the %1, %2, %3. LLVM assigns numbers to unnamed instructions and blocks in increasing order. The br i1 %3...
terminates the first block and the last used number label is 3 so the next block gets labelled as 4. That block ends with the next br
instruction and the last used number is 5 so the next and final block is labelled with 6. At first it might seem weird that blocks and instructions share the same namespace, but remember that blocks are values too.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With