Generating machine executable binaries with LLVM

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();
}
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.