; Harbour LLVM IR - generated from tests/llvm/hello.prg
target triple = "x86_64-pc-linux-gnu"
%HB_SYMB = type { i8*, i64, i8*, i8* }

declare void @hb_vmExecute(i8*, %HB_SYMB*)
declare %HB_SYMB* @hb_vmProcessSymbols(%HB_SYMB*, i16, i8*, i32, i16)
declare i32 @hb_vmsh_pushnil()
declare i32 @hb_vmsh_pushlogical(i32)
declare i32 @hb_vmsh_pushint(i32)
declare i32 @hb_vmsh_pushlong(i64)
declare i32 @hb_vmsh_pushlonglong(i64)
declare i32 @hb_vmsh_pushdouble(double, i32, i32)
declare i32 @hb_vmsh_pushstring(i8*, i64)
declare i32 @hb_vmsh_pushlocal(i32)
declare i32 @hb_vmsh_poplocal(i32)
declare i32 @hb_vmsh_pushstatic(i32)
declare i32 @hb_vmsh_popstatic(i32)
declare i32 @hb_vmsh_pushsymbol(%HB_SYMB*)
declare i32 @hb_vmsh_plus()
declare i32 @hb_vmsh_minus()
declare i32 @hb_vmsh_mult()
declare i32 @hb_vmsh_divide()
declare i32 @hb_vmsh_modulus()
declare i32 @hb_vmsh_power()
declare i32 @hb_vmsh_negate()
declare i32 @hb_vmsh_equal()
declare i32 @hb_vmsh_exactlyequal()
declare i32 @hb_vmsh_notequal()
declare i32 @hb_vmsh_less()
declare i32 @hb_vmsh_lessequal()
declare i32 @hb_vmsh_greater()
declare i32 @hb_vmsh_greaterequal()
declare i32 @hb_vmsh_and()
declare i32 @hb_vmsh_or()
declare i32 @hb_vmsh_not()
declare i32 @hb_vmsh_pop()
declare i32 @hb_vmsh_duplicate()
declare i32 @hb_vmsh_frame(i32, i32)
declare i32 @hb_vmsh_function(i32)
declare i32 @hb_vmsh_do(i32)
declare i32 @hb_vmsh_retvalue()
declare i32 @hb_vmsh_poplogical(i32*)
declare i32 @hb_vmsh_fortest()
declare i32 @hb_vmsh_inc()
declare i32 @hb_vmsh_dec()
declare i32 @hb_vmsh_duplunref()
declare i32 @hb_vmsh_pushunref()
declare i32 @hb_vmsh_pluseqpop()
declare i32 @hb_vmsh_minuseqpop()
declare i32 @hb_vmsh_multeqpop()
declare i32 @hb_vmsh_diveqpop()
declare i32 @hb_vmsh_modeqpop()
declare i32 @hb_vmsh_expeqpop()
declare i32 @hb_vmsh_deceqpop()
declare i32 @hb_vmsh_inceqpop()
declare i32 @hb_vmsh_pluseq()
declare i32 @hb_vmsh_minuseq()
declare i32 @hb_vmsh_multeq()
declare i32 @hb_vmsh_diveq()
declare i32 @hb_vmsh_modeq()
declare i32 @hb_vmsh_expeq()
declare i32 @hb_vmsh_deceq()
declare i32 @hb_vmsh_inceq()
declare i32 @hb_vmsh_pushlocalref(i32)
declare i32 @hb_vmsh_pushstaticref(i32)
declare i32 @hb_vmsh_localinc(i32)
declare i32 @hb_vmsh_localdec(i32)
declare i32 @hb_vmsh_localincpush(i32)
declare i32 @hb_vmsh_localaddint(i32, i32)
declare i32 @hb_vmsh_localnearaddint(i32, i32)
declare i32 @hb_vmsh_arraypush()
declare i32 @hb_vmsh_arraypushref()
declare i32 @hb_vmsh_arraypop()
declare i32 @hb_vmsh_pushaparams()
declare i32 @hb_vmsh_arraydim(i32)
declare i32 @hb_vmsh_arraygen(i32)
declare i32 @hb_vmsh_hashgen(i32)
declare i32 @hb_vmsh_pushalias()
declare i32 @hb_vmsh_popalias()
declare i32 @hb_vmsh_swapalias()
declare i32 @hb_vmsh_pushfield(%HB_SYMB*)
declare i32 @hb_vmsh_popfield(%HB_SYMB*)
declare i32 @hb_vmsh_pushmemvar(%HB_SYMB*)
declare i32 @hb_vmsh_pushmemvarref(%HB_SYMB*)
declare i32 @hb_vmsh_popmemvar(%HB_SYMB*)
declare i32 @hb_vmsh_pushvariable(%HB_SYMB*)
declare i32 @hb_vmsh_popvariable(%HB_SYMB*)
declare i32 @hb_vmsh_pushaliasedfield(%HB_SYMB*)
declare i32 @hb_vmsh_popaliasedfield(%HB_SYMB*)
declare i32 @hb_vmsh_pushaliasedvar(%HB_SYMB*)
declare i32 @hb_vmsh_popaliasedvar(%HB_SYMB*)
declare i32 @hb_vmsh_pushself()
declare i32 @hb_vmsh_pushovarref()
declare i32 @hb_vmsh_withobjectstart()
declare i32 @hb_vmsh_withobjectend()
declare i32 @hb_vmsh_funcptr()
declare i32 @hb_vmsh_message(%HB_SYMB*)
declare i32 @hb_vmsh_withobjectmessage(%HB_SYMB*)
declare i32 @hb_vmsh_send(i32)
declare i32 @hb_vmsh_enumstart(i32, i32)
declare i32 @hb_vmsh_enumnext()
declare i32 @hb_vmsh_enumprev()
declare i32 @hb_vmsh_enumend()
declare i32 @hb_vmsh_switchidx(i8*, i32)
declare i32 @hb_vmsh_pushblock(i8*, %HB_SYMB*)
declare i32 @hb_vmsh_macropushindex()
declare i32 @hb_vmsh_macropushref()
declare i32 @hb_vmsh_macrosymbol()
declare i32 @hb_vmsh_macrotext()
declare i32 @hb_vmsh_macropop(i32)
declare i32 @hb_vmsh_macropopaliased(i32)
declare i32 @hb_vmsh_macropush(i32)
declare i32 @hb_vmsh_macropushlist(i32)
declare i32 @hb_vmsh_macropushpare(i32)
declare i32 @hb_vmsh_macropushaliased(i32)
declare i32 @hb_vmsh_macroarraygen(i32)
declare i32 @hb_vmsh_macrodo(i32)
declare i32 @hb_vmsh_macrofunc(i32)
declare i32 @hb_vmsh_macrosend(i32)
declare i32 @hb_vmsh_seqbegin(i8*)
declare i32 @hb_vmsh_seqend()
declare i32 @hb_vmsh_seqrecover()
declare i32 @hb_vmsh_seqalways(i8*)
declare i32 @hb_vmsh_alwaysbegin(i8*)
declare i32 @hb_vmsh_alwaysend()
declare i32 @hb_vmsh_seqblock()
declare void @hb_INITSTATICS()
declare void @hb_INITLINES()
declare void @HB_FUN_QOUT()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_HELLO = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [28 x i8] c"\24\02\00\B0\02\00\6A\0C\48\65\6C\6C\6F\20\77\6F\72\6C\64\00\14\01\24\03\00\64\6E\07"

@.sym.0 = private constant [6 x i8] c"\48\45\4C\4C\4F\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [5 x i8] c"\51\4F\55\54\00"

@.modname = private constant [21 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\68\65\6C\6C\6F\2E\70\72\67\00"

@symbols_table = internal global [3 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([6 x i8], [6 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_HELLO to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.1, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_MAIN to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.2, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null }
]

@.sl.str.0 = private constant [12 x i8] c"\48\65\6C\6C\6F\20\77\6F\72\6C\64\00"

define void @HB_FUN_HELLO() {
entry:
  br label %i0
i0:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  br label %i3
i3:
  %r3 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c3 = icmp ne i32 %r3, 0
  br i1 %c3, label %epilogue, label %ipfs3a
ipfs3a:
  %r3b = call i32 @hb_vmsh_pushnil()
  %c3b = icmp ne i32 %r3b, 0
  br i1 %c3b, label %epilogue, label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([12 x i8], [12 x i8]* @.sl.str.0, i32 0, i32 0), i64 11)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i20
i20:
  %r20 = call i32 @hb_vmsh_do(i32 1)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i22
i22:
  br label %i25
i25:
  %r25 = call i32 @hb_vmsh_pushnil()
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_retvalue()
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i27
i27:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 3,
    i8* getelementptr([21 x i8], [21 x i8]* @.modname, i32 0, i32 0),
    i32 0, i16 3)
  store %HB_SYMB* %r, %HB_SYMB** @symbols
  ret void
}

@__hb_init_ptr = global [1 x void()*] [void()* @hb_vm_SymbolInit], section ".init_array", align 8
@llvm.used = appending global [1 x i8*] [i8* bitcast([1 x void()*]* @__hb_init_ptr to i8*)], section "llvm.metadata"
