vi forloop.ll llvm-as -f forloop.ll llc -f forloop.bc gcc -c forloop.s # or as -o mul_add.o mul_add.s gcc main.c t.o forloop.o ./a.out
forloop.ll
declare i32 @puts(i8 *) declare i32 @printf(i8 *, ...) @s = internal constant [2 x i8] c"f\00" @ps = internal constant [6 x i8] c"i %d\0A\00" define void @loop() { LoopHeader: br label %Loop Loop: ; Infinite loop that counts from 0 on up... %indvar = phi i32 [ 0, %LoopHeader ], [ %nextindvar, %Loop ] %nextindvar = add i32 %indvar, 1 %ptr = getelementptr [2 x i8]* @s, i64 0, i64 0 call i32 (i8*)* @puts(i8* %ptr); %psptr = getelementptr [6 x i8]* @ps, i64 0, i64 0 call i32 (i8 *, ...)* @printf(i8* %psptr, i32 %indvar) %cond = icmp eq i32 %indvar, 10 br i1 %cond, label %Exit, label %Loop Exit: ret void }
t.ll
define i32 @mul_add(i32 %x, i32 %y, i32 %z) {
entry:
%tmp = mul i32 %x, %y
%tmp2 = add i32 %tmp, %z
ret i32 %tmp2
}
"main.c"
#include <stdio.h> extern int mul_add(int,int,int); extern void loop(); int main(int argc, char *argv[]) { int r = mul_add(5, 10, 20); printf("r = %d\n", r); loop(); }
Add Comment